Mercurial > rg
view light.pas @ 0:62966dd383ed default tip
initial
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 08 Dec 2013 19:39:15 +0100 |
| parents | |
| children |
line wrap: on
line source
{ Field of vision counting routines. } UNIT Light; INTERFACE PROCEDURE MakeLut; PROCEDURE ApplyFov(cx,cy: INTEGER); IMPLEMENTATION USES Global; CONST LOS_LINES=127; VAR lut: ARRAY[0..MAPXSIZE,0..MAPYSIZE,0..1] OF BYTE; FUNCTION Min(a,b: INTEGER): INTEGER; BEGIN IF a<b THEN Min:=a ELSE Min:=b; END; FUNCTION Max(a,b: INTEGER): INTEGER; BEGIN IF a>b THEN Max:=a ELSE Max:=b; END; PROCEDURE MakeLut; VAR a,d,x,y,lx,ly,dx,dy,ile: INTEGER; s,c,an: REAL; BEGIN FOR x:=0 TO MAPXSIZE DO FOR y:=0 TO MAPYSIZE DO BEGIN lut[x,y][0]:=255; lut[x,y][1]:=0; END; FOR a:=0 TO LOS_LINES DO BEGIN an:=(a*PI)/(los_lines*2); s:=Sin(an)/4; c:=Cos(an)/4; lx:=0; ly:=0; d:=0; REPEAT x:=Trunc(s*d); y:=Trunc(c*d); dx:=(x-lx); dy:=(y-ly); IF (x<=MAPXSIZE) AND (y<=MAPYSIZE) THEN BEGIN lut[x,y][0]:=Min(lut[x,y][0],a); lut[x,y][1]:=Max(lut[x,y][0],a); END; Inc(d); UNTIL (x>MAPXSIZE) OR (y>MAPYSIZE); END; END; PROCEDURE ApplyFov(cx,cy: INTEGER); VAR rays: ARRAY[0..LOS_LINES] OF BOOLEAN; x,y: INTEGER; i,f,t: BYTE; bl: BOOLEAN; pow: BOOLEAN; m: pMap; BEGIN FOR i:=0 TO LOS_LINES DO rays[i]:=TRUE; FOR y:=cy TO MAPYSIZE DO FOR x:=cx TO MAPXSIZE DO BEGIN m:=GetMap(x,y); pow:=FALSE; bl:=(m^.ter^.vis<50); f:=lut[x-cx,y-cy][0]; t:=lut[x-cx,y-cy][1]; FOR i:=f TO t DO IF rays[i] THEN BEGIN pow:=TRUE; IF NOT bl THEN rays[i]:=FALSE; END; IF pow THEN BEGIN m^.flg:=m^.flg+[MAP_VISIBLE]; m^.flg:=m^.flg+[MAP_EXPLORED]; END ELSE m^.flg:=m^.flg-[MAP_VISIBLE]; END; FOR i:=0 TO LOS_LINES DO rays[i]:=TRUE; FOR y:=cy DOWNTO 0 DO FOR x:=cx TO MAPXSIZE DO BEGIN m:=GetMap(x,y); pow:=FALSE; bl:=(m^.ter^.vis<50); f:=lut[x-cx,cy-y][0]; t:=lut[x-cx,cy-y][1]; FOR i:=f TO t DO IF rays[i] THEN BEGIN pow:=TRUE; IF NOT bl THEN rays[i]:=FALSE; END; IF pow THEN BEGIN m^.flg:=m^.flg+[MAP_VISIBLE]; m^.flg:=m^.flg+[MAP_EXPLORED]; END ELSE m^.flg:=m^.flg-[MAP_VISIBLE]; END; FOR i:=0 TO LOS_LINES DO rays[i]:=TRUE; FOR y:=cy TO MAPYSIZE DO FOR x:=cx DOWNTO 0 DO BEGIN m:=GetMap(x,y); pow:=FALSE; bl:=(m^.ter^.vis<50); f:=lut[cx-x,y-cy][0]; t:=lut[cx-x,y-cy][1]; FOR i:=f TO t DO IF rays[i] THEN BEGIN pow:=TRUE; IF NOT bl THEN rays[i]:=FALSE; END; IF pow THEN BEGIN m^.flg:=m^.flg+[MAP_VISIBLE]; m^.flg:=m^.flg+[MAP_EXPLORED]; END ELSE m^.flg:=m^.flg-[MAP_VISIBLE]; END; FOR i:=0 TO LOS_LINES DO rays[i]:=TRUE; FOR y:=cy DOWNTO 0 DO FOR x:=cx DOWNTO 0 DO BEGIN m:=GetMap(x,y); pow:=FALSE; bl:=(m^.ter^.vis<50); f:=lut[cx-x,cy-y][0]; t:=lut[cx-x,cy-y][1]; FOR i:=f TO t DO IF rays[i] THEN BEGIN pow:=TRUE; IF NOT bl THEN rays[i]:=FALSE; END; IF pow THEN BEGIN m^.flg:=m^.flg+[MAP_VISIBLE]; m^.flg:=m^.flg+[MAP_EXPLORED]; END ELSE m^.flg:=m^.flg-[MAP_VISIBLE]; END; END; END.
