Logo Search packages:      
Sourcecode: abuse-sdl version File versions  Download package

newlight.cpp

#include "light.hpp"
#include <stdlib.h>
#include "image.hpp"
#include "macs.hpp"
#include "video.hpp"
#include "palette.hpp"
#include "timing.hpp"
#include "specs.hpp"
#include "dprint.hpp"
#include "filter.hpp"
#include "video.hpp"

light_source *first_light_source=NULL;
unsigned char *white_light,*green_light;
unsigned short min_light_level=0;
extern int vmode;

int light_detail=MEDIUM_DETAIL;

long light_to_number(light_source *l)
{
      if( !l ) return 0;
      int x = 1;
      light_source *s;
      for (s = first_light_source; s; s = s->next, x++)
            if (s == l) return x;
      return 0;
}


light_source *number_to_light(long x)
{
      if (x == 0) return NULL;
      x--;
      light_source *s;
      for (s = first_light_source; x && s; x--, s = s->next);
      return s;
}

light_source *light_source::copy()
{
      next = new light_source(type,x,y,inner_radius,outer_radius,xshift,yshift,next);
      return next;
}

void delete_all_lights()
{
      while (first_light_source)
      {
            light_source *p = first_light_source;
            first_light_source = first_light_source->next;
            delete p;
      }
}

void delete_light(light_source *which)
{
  if (which==first_light_source)
  {
    first_light_source=first_light_source->next;
    delete which;
  }
  else
  {
    for (light_source *f=first_light_source;f->next!=which && f;f=f->next);
    if (f)
    {
      f->next=which->next;
      delete which;
    }
  }
}

void light_source::calc_range()
{
  switch (type)
  {
    case 0 :
    { x1=x-(outer_radius>>xshift); y1=y-(outer_radius>>yshift);
      x2=x+(outer_radius>>xshift); y2=y+(outer_radius>>yshift);
    } break;
    case 1 :
    { x1=x-(outer_radius>>xshift); y1=y-(outer_radius>>yshift);
      x2=x+(outer_radius>>xshift); y2=y;
    } break;
    case 2 :
    { x1=x-(outer_radius>>xshift); y1=y;
      x2=x+(outer_radius>>xshift); y2=y+(outer_radius>>yshift);
    } break;
    case 3 :
    { x1=x; y1=y-(outer_radius>>yshift);
      x2=x+(outer_radius>>xshift); y2=y+(outer_radius>>yshift);
    } break;
    case 4 :
    { x1=x-(outer_radius>>xshift); y1=y-(outer_radius>>yshift);
      x2=x; y2=y+(outer_radius>>yshift);
    } break;


    case 5 :
    { x1=x; y1=y-(outer_radius>>yshift);
      x2=x+(outer_radius>>xshift); y2=y;
    } break;
    case 6 :
    { x1=x-(outer_radius>>xshift); y1=y-(outer_radius>>yshift);
      x2=x; y2=y;
    } break;
    case 7 :
    { x1=x-(outer_radius>>xshift); y1=y;
      x2=x; y2=y+(outer_radius>>yshift);
    } break;
    case 8 :
    { x1=x; y1=y;
      x2=x+(outer_radius>>xshift); y2=y+(outer_radius>>yshift);
    } break;
    case 9 :
    {
      x1=x;
      y1=y;
      x2=x+xshift;
      y2=y+yshift;
    } break;

  }
  mul_div=(1<<16)/(outer_radius-inner_radius)*64;
}

light_source::light_source(char Type, long X, long Y, long Inner_radius, 
                     long Outer_radius, long Xshift,  long Yshift, light_source *Next)
{ 
  type=Type; 
  x=X; y=Y; 
  inner_radius=Inner_radius;  
  outer_radius=Outer_radius; 
  next=Next; 
  known=0;
  xshift=Xshift;
  yshift=Yshift;
  calc_range(); 
}

light_source *add_light_source(char type, long x, long y, 
                         long inner, long outer, long xshift, long yshift)
{
      first_light_source = new light_source(type,x,y,inner,outer,xshift,yshift,first_light_source);
      return first_light_source;
}


#define TTINTS 9
uchar *tints[TTINTS];

void calc_tint(uchar *tint, int rs, int gs, int bs, int ra, int ga, int ba, palette *pal)
{
  palette npal;
  memset(npal.addr(),0,256);

  for (int i=0;i<256;i++)
  {
    npal.set(i,(int)rs,(int)gs,(int)bs);
    rs+=ra; if (rs>255) rs=255; if (rs<0) rs=0;
    gs+=ga; if (gs>255) gs=255; if (gs<0) gs=0;
    bs+=ba; if (bs>255) bs=255; if (bs<0) bs=0;
  }
  filter f(pal,&npal);
  filter f2(&npal,pal);

  for (i=0;i<256;i++,tint++)
    *tint=f2.get_mapping(f.get_mapping(i));
}


void calc_light_table(palette *pal)
{
  white_light=(unsigned char *)jmalloc(256*64,"light table");
  green_light=(unsigned char *)jmalloc(256*64,"green light");
  for (int i=0;i<TTINTS;i++)
      tints[i]=(uchar *)jmalloc(256,"color tint");

  jFILE fp("light.tbl","rb");
  int recalc=0;
  if (fp.open_failure()) recalc=1;
  else
  {
    if (fp.read_short()!=calc_crc((unsigned char *)pal->addr(),768))
      recalc=1;
    else
    {
      fp.read(white_light,256*64);
      fp.read(green_light,256*64);
      for (i=0;i<TTINTS;i++)
        fp.read(tints[i],256);
    }
  }

  if (recalc)
  {  
    fprintf(stderr,"Palette has changed, recalculating light table...\n");
    fprintf(stderr,"white : ");
    for (int color=0;color<256;color++)
    {
      unsigned char r,g,b;
      pal->get(color,r,g,b);
      if (color%16==0)
        fprintf(stderr,"%d ",color);
      for (int intensity=63;intensity>=0;intensity--)
      {
      if (r>0 || g>0 || b>0)
          white_light[intensity*256+color]=pal->find_closest(r,g,b);
      else
          white_light[intensity*256+color]=0;
      if (r) r--;  if (g) g--;  if (b) b--;     
      }
    }

    fprintf(stderr,"green : ");
    for (color=0;color<256;color++)
    {
      unsigned char r,g,b;
      pal->get(color,r,g,b);
      r=r*3/5; b=b*3/5; g+=7; if (g>255) g=255;
      if (color%16==0)
        fprintf(stderr,"%d ",color);
      for (int intensity=63;intensity>=0;intensity--)
      {
      if (r>0 || g>0 || b>0)
          green_light[intensity*256+color]=pal->find_closest(r,g,b);
      else
          green_light[intensity*256+color]=0;
      if (r) r--;  
      if ((intensity&1)==1)
        if (g) g--;  
      if (b) b--;       
      }
    }

    dprintf("\ncalculating tints : \n");
    uchar t[TTINTS*6]={0,0,0,0,0,0, // normal
                   0,0,0,1,0,0,     // red
               0,0,0,1,1,0,     // yellow
               0,0,0,1,0,1,     // purple
               0,0,0,1,1,1,     // gray
               0,0,0,0,1,0,     // green
               0,0,0,0,0,1,     // blue
               0,0,0,0,1,1,     // cyan 






               0,0,0,0,0,0   // reverse green  (night vision effect)
             } ;
    uchar *ti=t+6;
    uchar *c;
    for (i=0,c=tints[0];i<256;i++,c++) *c=i;  // make the normal tint (maps everthing to itself)
    for (i=0,c=tints[TTINTS-1];i<256;i++,c++)  // reverse green
    {
      int r=pal->red(i)/2,g=255-pal->green(i)-30,b=pal->blue(i)*3/5+50;
      if (g<0) g=0;
      if (b>255) b=0;
      *c=pal->find_closest(r,g,b);
    }

    // make the colored tints
    for (i=1;i<TTINTS-1;i++)
    {
      calc_tint(tints[i],ti[0],ti[1],ti[2],ti[3],ti[4],ti[5],pal);
      ti+=6;
    }

   

    jFILE f("light.tbl","wb");
    f.write_short(calc_crc((unsigned char *)pal->addr(),768));
    f.write(white_light,256*64);
    f.write(green_light,256*64);
    for (int i=0;i<TTINTS;i++)
      f.write(tints[i],256);
  }
}


light_patch *light_patch::copy(light_patch *Next)
{ 
  light_patch *p=new light_patch(x1,y1,x2,y2,Next); 
  p->total=total;
  if (total)    
  {
    p->lights=(light_source **)jmalloc(total*sizeof(light_source *),"light patches");
    memcpy(p->lights,lights,total*(sizeof(light_source *)));
  }
  else 
    p->lights=NULL; 
  return p;
}

#define MAX_LP 10


void add_light(light_patch *&first, long x1, long y1, long x2, long y2, 
                      light_source *who)
{  
  light_patch *last=NULL;
  for (light_patch *p=first;p;p=p->next)
  {
    // first see if light patch we are adding is enclosed entirely by another patch
    if (x1>=p->x1 && y1>=p->y1 && x2<=p->x2 && y2<=p->y2)
    {
      if (p->total==MAX_LP) return ;

      if (x1>p->x1)
      {
      first=p->copy(first);
      first->x2=x1-1;
      }
      if (x2<p->x2)
      {
      first=p->copy(first);
      first->x1=x2+1;
      }
      if (y1>p->y1)
      {
      first=p->copy(first);
      first->x1=x1;
      first->x2=x2;
      first->y2=y1-1;
      }
      if (y2<p->y2)
      {
      first=p->copy(first);
      first->x1=x1;
      first->x2=x2;
      first->y1=y2+1;
      }
      p->x1=x1; p->y1=y1; p->x2=x2; p->y2=y2;
      p->total++;     
      p->lights=(light_source **)jrealloc(p->lights,sizeof(light_source *)*p->total,"patch_list");
      p->lights[p->total-1]=who;
      return ;
    }

    // see if the patch completly covers another patch.
    if (x1<=p->x1 && y1<=p->y1 && x2>=p->x2 && y2>=p->y2)
    {
      if (x1<p->x1)
        add_light(first,x1,y1,p->x1-1,y2,who);
      if (x2>p->x2)
        add_light(first,p->x2+1,y1,x2,y2,who);
      if (y1<p->y1)
        add_light(first,p->x1,y1,p->x2,p->y1-1,who);
      if (y2>p->y2)
        add_light(first,p->x1,p->y2+1,p->x2,y2,who);
      if (p->total==MAX_LP)  return ;
      p->total++;     
      p->lights=(light_source **)jrealloc(p->lights,sizeof(light_source *)*p->total,"patch_list");
      p->lights[p->total-1]=who;
      return ;
    }

    // see if we intersect another rect
    if (!(x2<p->x1 || y2<p->y1 || x1>p->x2 || y1>p->y2))  
    {
      int ax1,ay1,ax2,ay2;
      if (x1<p->x1)
      {
        add_light(first,x1,max(y1,p->y1),p->x1-1,min(y2,p->y2),who);
      ax1=p->x1;
      } else
      ax1=x1;

      if (x2>p->x2)
      {
        add_light(first,p->x2+1,max(y1,p->y1),x2,min(y2,p->y2),who);
      ax2=p->x2;
      } 
      else
      ax2=x2;

      if (y1<p->y1)
      {       
        add_light(first,x1,y1,x2,p->y1-1,who);
      ay1=p->y1;
      } else 
      ay1=y1;

      if (y2>p->y2)
      {
        add_light(first,x1,p->y2+1,x2,y2,who);
      ay2=p->y2;
      } else 
      ay2=y2;

       
      add_light(first,ax1,ay1,ax2,ay2,who);      

      return ;    
    }
  }
}
 
light_patch *find_patch(int screenx, int screeny, light_patch *list)
{
  for (;list;list=list->next)
  {
    if (screenx>=list->x1 && screenx<=list->x2 && screeny>=list->y1 && screeny<=list->y2)
      return list;
  }
  return NULL;
}

int calc_light_value(long x, long y, light_patch *which)
{
  int lv=0;
  int t=which->total;
  for (register int i=t-1;i>=0;i--)
  {    
    light_source *fn=which->lights[i];
    if (fn->type==9)
    {
      lv=fn->inner_radius;
      i=0;
    }
    else
    {
      long dx=abs(fn->x-x)<<fn->xshift;
      long dy=abs(fn->y-y)<<fn->yshift;
      long  r2;
      if (dx<dy)
        r2=dx+dy-(dx>>1);
      else r2=dx+dy-(dy>>1);
    
      if (r2>=fn->inner_radius)
      {
      if (r2<fn->outer_radius)
      {
        lv+=((fn->outer_radius-r2)*fn->mul_div)>>16;
      }
      } else lv=63;       
    }
  }
  if (lv>63) return 63; 
  else
    return lv;
}


void reduce_patches(light_patch *f)   // find constant valued patches
{
  
}

light_patch *make_patch_list(int cx1,int cy1,int cx2,int cy2, long screenx, long screeny)
{
  light_patch *first=new light_patch(cx1,cy1,cx2,cy2,NULL);

  for (light_source *f=first_light_source;f;f=f->next)   // determine which lights will have effect
  {
    long x1=f->x1-screenx,y1=f->y1-screeny,x2=f->x2-screenx,y2=f->y2-screeny;
    if (x1<cx1) x1=cx1;
    if (y1<cy1) y1=cy1;
    if (x2>cx2) x2=cx2;
    if (y2>cy2) y2=cy2;

    if (x1<=x2 && y1<=y2)
      add_light(first,x1,y1,x2,y2,f);
  }
  reduce_patches(first);

  return first;
}

void delete_patch_list(light_patch *first)
{
  while (first)
  {
    light_patch *p=first;
    first=first->next;
    delete p;
  }
}


#ifdef __WATCOMC__
extern "C" {
extern long MAP_PUT(long pad, long screen_addr, long remap, long w);
extern long MAP_PUT2(long dest, long screen_addr, long remap, long w);
} ;
#else
inline long MAP_PUT(long pad, long screen_addr, long remap, long w)
{ while (w--) 
  { 
    *((uchar *)(screen_addr))=*((uchar *)remap+*((uchar *)screen_addr)); 
    screen_addr++; 
  } 
  return screen_addr;
}

inline long MAP_PUT2(long dest_addr, long screen_addr, long remap, long w)
{ while (w--) 
  { 
    *((uchar *)(dest_addr))=*((uchar *)remap+*((uchar *)screen_addr)); 
    screen_addr++; 
    dest_addr++;
  } 
  return dest_addr;
}

#endif


inline long calc_lv(light_patch *lp, long sx, long sy)
{
  light_source **lon_p=lp->lights;
  long lv=min_light_level;
  int light_on;
  for (light_on=lp->total-1;light_on>=0;light_on--)
  {
    light_source *fn=*lon_p;
    long *dt=&(*lon_p)->type;
    if (*dt==9)
    {
      lv=fn->inner_radius;
      light_on=0;      
    } else
    {
      dt++;
      int dx=abs(*dt-sx); dt++;
      dx<<=*dt;  dt++;

      int dy=abs(*dt-sy); dt++;
      dy<<=*dt;  dt++;

      int r2;
      if (dx<dy)
      r2=dx+dy-(dx>>1);
      else r2=dx+dy-(dy>>1);
      
      if (r2<*dt)
      {           
      int v=*dt-r2; dt++;           
      lv+=v*(*dt)>>16;
      }
    }
    lon_p++;
  }
  if (lv>63) return 63;
  else return lv;

}


void light_screen(image *sc, long screenx, long screeny, uchar *light_lookup)
{
  int lx_run,ly_run;
  switch (light_detail) 
  {
    case HIGH_DETAIL : 
    { lx_run=2; ly_run=1; } break;
    case MEDIUM_DETAIL :
    { lx_run=3; ly_run=2; } break;
    case LOW_DETAIL :
    { lx_run=4; ly_run=3; } break;
    case POOR_DETAIL :                   // low detail lighting alread taken care of.
    return ;
  }

  short cx1,cy1,cx2,cy2;
  sc->get_clip(cx1,cy1,cx2,cy2);
//  sc->add_dirty(cx1,cy1,cx2,cy2);
  unsigned char *mint=light_lookup+min_light_level*256;
  screenx-=cx1;
  screeny-=cy1;


  light_patch *first=make_patch_list(cx1,cy1,cx2,cy2,screenx,screeny);


  int ytry=(1<<ly_run),xtry=(1<<lx_run);
  int calcx_mask=(0xefffffff-(xtry-1));
  int calcy_mask=(0xefffffff-(ytry-1));
  int scr_w=screen->width();

  for (light_patch *lp=first;lp;lp=lp->next)
  {
    register int x2=lp->x2;
    if (lp->total==0)  // do dark patches really fast.
    {
      unsigned char *sl=screen->scan_line(lp->y1)+lp->x1,*dest;
#ifdef __WATCOMC__
      if (get_vmode()==19) dest=(uchar *)0xa0000+lp->y1*320+lp->x1;
      else dest=sl;
#else
      dest=sl;
#endif
      
      int y2=lp->y2;
      for (int y=lp->y1;y<=y2;y++,sl+=scr_w,dest+=scr_w)
      {
      int w=lp->x2-lp->x1+1;
        MAP_PUT2((long)dest,(long)sl,(long)mint,w);
      }
    }
    else
    {
      int todoy;
      int y2=lp->y2;

      int xmask=(xtry-1);
      int ymask=(ytry-1);

      uchar *yaddr=screen->scan_line(lp->y1)+lp->x1,*dyaddr;
#ifdef __WATCOMC__
      if (get_vmode()==19) dyaddr=((uchar *)0xa0000)+lp->y1*320+lp->x1;
      else dyaddr=yaddr;
#else
      dyaddr=yaddr;
#endif

      for (int y=lp->y1;y<=y2;)
      {
      long sy=(screeny+y);
      if (y+ytry>lp->y2)        // see how many y lines to do for this block
        todoy=lp->y2-y+1;
      else todoy=ytry;
      int maxy=ytry-(sy&ymask);
      if (todoy>maxy)
        todoy=maxy;
      
      uchar *xaddr=yaddr,*dxaddr=dyaddr;
      for (register int x=lp->x1;x<=x2;)
      {
        long lv=min_light_level;
        unsigned char *ct;
        light_source *f;
        int todox;
        if (x+xtry>lp->x2)
          todox=lp->x2-x+1;
        else todox=xtry;
        int sx=(screenx+x);
        int max=xtry-(sx&xmask);
        if (todox>max)
          todox=max;


        ct=light_lookup+calc_lv(lp,sx,sy)*256;
        switch (todox)
        {
          case 8 :
          {
            x+=8;
            switch (todoy)
            {
            case 4 :
            {
              uchar *addr=xaddr,*daddr=dxaddr;
              dxaddr=(uchar *)MAP_PUT2((long)daddr,(long)addr,(long)ct,8); 
              xaddr+=8;

              addr+=scr_w; daddr+=scr_w;
              MAP_PUT2((long)daddr,(long)addr,(long)ct,8);   addr+=scr_w; daddr+=scr_w;
              MAP_PUT2((long)daddr,(long)addr,(long)ct,8);   addr+=scr_w; daddr+=scr_w;
              MAP_PUT2((long)daddr,(long)addr,(long)ct,8);
            } break;
            case 3 :
            {
              uchar *addr=xaddr,*daddr=dxaddr;
              dxaddr=(uchar *)MAP_PUT2((long)daddr,(long)addr,(long)ct,8); 
              xaddr+=8;

              addr+=scr_w; daddr+=scr_w;
              MAP_PUT2((long)daddr,(long)addr,(long)ct,8);   addr+=scr_w; daddr+=scr_w;
              MAP_PUT2((long)daddr,(long)addr,(long)ct,8);


            } break;         
            case 2 :
            {
              uchar *addr=xaddr,*daddr=dxaddr;
              dxaddr=(uchar *)MAP_PUT2((long)daddr,(long)addr,(long)ct,8); 
              xaddr+=8;

              addr+=scr_w; daddr+=scr_w;
              MAP_PUT2((long)daddr,(long)addr,(long)ct,8);

            } break;
            case 1 : 
            { dxaddr=(uchar *)MAP_PUT((long)dxaddr,(long)xaddr,(long)ct,8); 
              xaddr+=8;        
            } break;
            }
          } break;
/*        case 4 :
          {
            x+=4;
            switch (todoy)
            {
            case 4 :
            {
              uchar *addr=xaddr;
              xaddr=(uchar *)MAP_PUT(0,(long)addr,(long)ct,4); addr+=scr_w; daddr+=scr_w;
              MAP_PUT(0,(long)addr,(long)ct,4);                addr+=scr_w; daddr+=scr_w;
              MAP_PUT(0,(long)addr,(long)ct,4);                addr+=scr_w; daddr+=scr_w;
              MAP_PUT(0,(long)addr,(long)ct,4);
            } break;
            case 3 :
            {
              uchar *addr=xaddr;
              xaddr=(uchar *)MAP_PUT(0,(long)addr,(long)ct,4); addr+=scr_w;  daddr+=scr_w;
              MAP_PUT(0,(long)addr,(long)ct,4);                addr+=scr_w;  daddr+=scr_w;
              MAP_PUT(0,(long)addr,(long)ct,4);
            } break;         
            case 2 :
            {
              uchar *addr=xaddr;
              xaddr=(uchar *)MAP_PUT(0,(long)addr,(long)ct,4); addr+=scr_w; daddr+=scr_w;
              MAP_PUT(0,(long)addr,(long)ct,4);
            } break;
            case 1 : xaddr=(uchar *)MAP_PUT(0,(long)xaddr,(long)ct,4); break;
            }
          } break; */
          default :
          {
            x+=todox;
            if (todoy==1)
            {
              dxaddr=(uchar *)MAP_PUT2((long)dxaddr,(long)xaddr,(long)ct,todox);
            xaddr+=todox;
            }
            else
            {
            uchar *addr=xaddr,*daddr=dxaddr;
            dxaddr=(uchar *)MAP_PUT2((long)dxaddr,(long)xaddr,(long)ct,todox); 
            xaddr+=todox;

            addr+=scr_w;
            daddr+=scr_w;

            int cc=todoy-1;
            while (cc--)
            {
              MAP_PUT2((long)daddr,(long)addr,(long)ct,todox); 
              addr+=scr_w;
              daddr+=scr_w;
            }                       
            }
          }
        }
      }
              
      int yadd=scr_w*todoy;
      yaddr+=yadd;
      dyaddr+=yadd;

      y+=todoy;
      }
    }
  }
  while (first)
  {
    light_patch *p=first;
    first=first->next;
    delete p;
  }
}




void add_light_spec(spec_directory *sd, char *level_name)
{
  long size=4+4;  // number of lights and minimum light levels
  for (light_source *f=first_light_source;f;f=f->next)
    size+=6*4+1;
  sd->add(new spec_entry(SPEC_LIGHT_LIST,"lights",NULL,size,0));  
}

void write_lights(jFILE *fp)
{
  int t=0;
  for (light_source *f=first_light_source;f;f=f->next) t++;
  fp->write_long(t);
  fp->write_long(min_light_level);
  for (f=first_light_source;f;f=f->next)
  {
    fp->write_long(f->x);
    fp->write_long(f->y);
    fp->write_long(f->xshift);
    fp->write_long(f->yshift);
    fp->write_long(f->inner_radius);
    fp->write_long(f->outer_radius);
    fp->write_byte(f->type);
  }
}


int send_lights(net_descriptor *os)
{
  packet pk;
  int t=0;
  for (light_source *f=first_light_source;f;f=f->next) t++;
  pk.write_long(t);
  pk.write_short(min_light_level);
  if (!os->send(pk)) return 0;
  for (f=first_light_source;f;f=f->next)
  {
    pk.reset();
    pk.write_long(f->x);
    pk.write_long(f->y);
    pk.write_long(f->xshift);
    pk.write_long(f->yshift);
    pk.write_long(f->inner_radius);
    pk.write_long(f->outer_radius);
    pk.write_long(f->type);
    if (!os->send(pk)) return 0;   
  }
  return 1;
}


void read_lights(spec_directory *sd, jFILE *fp, char *level_name)
{
  delete_all_lights();
  spec_entry *se=sd->find("lights");
  if (se)
  {
    fp->seek(se->offset,SEEK_SET);
    long t=fp->read_long();
    min_light_level=fp->read_long();
    light_source *last;
    while (t)
    {
      t--;
      long x=fp->read_long();
      long y=fp->read_long();
      long xshift=fp->read_long();
      long yshift=fp->read_long();
      long ir=fp->read_long();
      long ora=fp->read_long();
      long ty=fp->read_byte();

      light_source *p=new light_source(ty,x,y,ir,ora,xshift,yshift,NULL);
      
      if (first_light_source)
        last->next=p;
      else first_light_source=p;
      last=p;
    }
  }
}


int receive_lights(net_descriptor *os)
{
  packet pk;
  if (!os->get(pk)) { printf("net error : light total\n"); return 0; }
  long t; 
  if (pk.read((uchar *)&t,4)!=4)
  { printf("net error : (t) packet incomplete\n"); return 0; }
  t=lltl(t);

  if (pk.read((uchar *)&min_light_level,2)!=2)
  { printf("net error : (minl) packet incomplete\n"); return 0; }
  min_light_level=lstl(min_light_level);

  light_source *last;
  printf("Reading %d lights\n",t); 
  while (t)
  {
    if (!os->get(pk)) {printf("net error : read light\n"); return 0; }
    t--;
    long dt[7];
    if (pk.read((uchar *)dt,7*4)!=7*4) return 0;


    light_source *p=new light_source(lltl(dt[6]),
                               lltl(dt[0]),lltl(dt[1]),
                               lltl(dt[4]),lltl(dt[5]),
                               lltl(dt[2]),lltl(dt[3]),NULL);
      
    if (first_light_source)
      last->next=p;
    else first_light_source=p;
      last=p;
  }
  return 1;
}




Generated by  Doxygen 1.6.0   Back to index