Mercurial > rg
diff maps.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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/maps.pas Sun Dec 08 19:39:15 2013 +0100 @@ -0,0 +1,118 @@ +{ Map scrolling and display routines. } + +{$Q+R+} + +UNIT Maps; + +INTERFACE +USES Global; + +VAR xMapShift, yMapShift: INTEGER; +PROCEDURE Refresh; +PROCEDURE CenterMap(x,y:INTEGER); +PROCEDURE ReLight(px,py: INTEGER); +PROCEDURE ShowPlayer(x,y: INTEGER); +PROCEDURE Demolish(m: pMap); +FUNCTION FreeToMove(m: pMap): BOOLEAN; + +IMPLEMENTATION + +USES Console, Items, Light; + +FUNCTION FreeToMove(m: pMap): BOOLEAN; +BEGIN + FreeToMove:=FALSE; + + IF m=NIL THEN Exit; + IF m^.crt<>NIL THEN Exit; + IF m^.ter^.mov>=100 THEN Exit; + + FreeToMove:=TRUE; +END; + +PROCEDURE ShowMap(x,y:INTEGER); +VAR a:BYTE; + c:CHAR; + m:pMap; +BEGIN + IF NOT InMap(x,y) THEN BEGIN + PutChr(x-xMapShift,y-yMapShift,' ',$07); + Exit; + END; + m:=GetMap(x,y); + + IF (x-xMapShift<0) OR (x-xMapShift>49) OR (y-yMapShift<0) OR (y-yMapShift>24) THEN Exit; + + a:=m^.ter^.atr; + c:=m^.ter^.chr; + + IF (TILE_SMARTDOOR IN m^.ter^.flg) THEN + IF (x=0) OR (x=MAPXSIZE) OR + (GetMap(x-1,y)^.ter^.mov>=100) OR + (GetMap(x+1,y)^.ter^.mov>=100) THEN c:='-'; + + IF (m^.ter^.vis<30) AND (y>0)AND + (GetMap(x,y-1)^.ter^.vis>=30) THEN BEGIN + CASE a OF + 15: a:=7; + 13: a:=14; + 8: a:=8; + 7: a:=8; + ELSE a:=a AND $F7; + END; + END; + + + IF NOT(MAP_EXPLORED IN m^.flg) THEN c:=' '; + + IF NOT(MAP_VISIBLE IN m^.flg) THEN a:=shadecolor ELSE BEGIN + IF (m^.slt<>NIL) + {AND (TILE_ITEM IN m^.ter^.flg)} + THEN GetItemLooks(a,c,@(m^.slt)); + IF (m^.crt<>NIL) THEN BEGIN + a:=m^.crt^.def^.atr; + c:=m^.crt^.def^.chr; + END; + END; + + + PutChr(x-xMapShift,y-yMapShift,c,a); +END; + +PROCEDURE Demolish(m: pMap); +BEGIN + IF m^.ter^.dst=0 THEN Exit; + IF (m^.ter^.drp>0) AND (m^.slt=NIL) THEN BEGIN + m^.slt:=GenerateItem(m^.ter^.drp); + END; + m^.ter:=FindTile(m^.ter^.dst); +END; + +PROCEDURE Refresh; +VAR x,y: INTEGER; +BEGIN + FOR y:=0 TO 24 DO + FOR x:=0 TO 49 DO ShowMap(x+xMapShift,y+yMapShift); +END; + +PROCEDURE CenterMap(x,y:INTEGER); +BEGIN + xMapShift:=x-25; + yMapShift:=y-12; + Refresh; +END; + +PROCEDURE ShowPlayer(x,y: INTEGER); +BEGIN + IF NOT InMap(x,y) THEN Exit; + IF (x-xMapShift<MARGIN) OR (x-xMapShift>49-MARGIN) OR (y-yMapShift<MARGIN) OR (y-yMapShift>24-MARGIN) THEN CenterMap(x,y); + Cursor(x-xMapShift,y-yMapShift); +END; + +PROCEDURE ReLight(px,py: INTEGER); +BEGIN + ApplyFov(px,py); + Refresh; +END; + +END. \ No newline at end of file
