Mercurial > rg
view 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 source
{ 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.
