void build_remove(int x,int y) { int nr; if (x<0 || x>=MAPX || y<0 || y>=MAPY) return; map[x+y*MAPX].fsprite=0; map[x+y*MAPX].flags&=~(MF_MOVEBLOCK|MF_SIGHTBLOCK); nr=map[x+y*MAPX].it; if (!nr) return; if (it[nr].active) { if (it[nr].light[1]) do_add_light(x,y,-it[nr].light[1]); } else { if (it[nr].light[0]) do_add_light(x,y,-it[nr].light[0]); } it[nr].used=0; map[x+y*MAPX].it=0; xlog("build: remove item from %d,%d",x,y); }
void add_lights(int x,int y) { int xs,ys,xe,ye,in,cn,v,m; unsigned long long prof; prof=prof_start(); xs=max(1,x-LIGHTDIST); ys=max(1,y-LIGHTDIST); xe=min(MAPX-2,x+1+LIGHTDIST); ye=min(MAPY-2,y+1+LIGHTDIST); for (y=ys; y<ye; y++) { m=y*MAPX+xs; for (x=xs; x<xe; x++,m++) { if ((in=map[m].it)!=0) { if (it[in].active) { if ((v=it[in].light[1])!=0) do_add_light(x,y,v); } else { if ((v=it[in].light[0])!=0) do_add_light(x,y,v); } } if ((cn=map[m].ch)!=0) if ((v=ch[cn].light)!=0) do_add_light(x,y,v); if (map[m].flags&MF_INDOORS) compute_dlight(x,y); } } prof_stop(20,prof); }
void init_lights(void) { int x, y, in, m, cnt1 = 0, cnt2 = 0; for (y = m = 0; y<MAPY; y++) { for (x = 0; x<MAPX; x++, m++) { map[m].light = 0; map[m].dlight = 0; } } for (y = m = 0; y<MAPY; y++) { printf("%4d/%4d (%d,%d)\r", y, MAPY, cnt1, cnt2); fflush(stdout); for (x = 0; x<MAPX; x++, m++) { if (map[m].flags & MF_INDOORS) { cnt2++; compute_dlight(x, y); } if ((in = map[m].it)==0) { continue; } if (it[in].active) { if (it[in].light[1]) { do_add_light(x, y, it[in].light[1]); cnt1++; } } else { if (it[in].light[0]) { do_add_light(x, y, it[in].light[0]); cnt1++; } } } } }
void build_drop(int x,int y,int in) { int nr; if (x<0 || x>=MAPX || y<0 || y>=MAPY) return; if (in&0x40000000) { map[x+y*MAPX].flags^=in&0xfffffff; return; } if (in&0x20000000) { nr=in&0xfffffff; if (nr==1003) { // hack for jungle ground nr+=RANDOM(4); if (nr>1003) nr++; } if (nr==542) { // hack for street ground nr+=RANDOM(9); } if (nr==551) { // hack for grass ground nr+=RANDOM(4); } if (nr==133) { // hack for parkett ground nr+=RANDOM(9); } if (nr==142) { // hack for parkett ground nr+=RANDOM(4); } if (nr==170) { // hack for stone ground nr+=RANDOM(6); } if (nr==704) { static int tab[4]={704,659,660,688}; nr=tab[RANDOM(4)]; } if (nr==950) { nr+=RANDOM(9); } if (nr==959) { nr+=(x%3)*3+(y%3); } if (nr==16670) nr+=RANDOM(4); if (nr==16933) { static int tab[4]={16933,16957,16958,16959}; nr=tab[RANDOM(4)]; } map[x+y*MAPX].sprite=nr; return; } nr=build_item(in,x,y); if (!nr) return; if (it[nr].active) { if (it[nr].light[1]) do_add_light(x,y,it[nr].light[1]); } else { if (it[nr].light[0]) do_add_light(x,y,it[nr].light[0]); } }