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.