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