(* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc. *)
(* This file is part of GNU Modula-2.
GNU Modula-2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with gm2; see the file COPYING. If not, write to the Free Software
Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
IMPLEMENTATION MODULE WriteMap ;
IMPORT Break ;
FROM StrIO IMPORT WriteLn, WriteString ;
FROM NumberIO IMPORT WriteCard ;
FROM RoomMap IMPORT NoOfRooms, Rooms, DoorStatus ;
(*
WriteMapText - writes out the map in textual form.
*)
PROCEDURE WriteMapText ;
VAR
i: CARDINAL ;
BEGIN
MakeRoomNumbers ;
FOR i := 1 TO NoOfRooms DO
IF RoomExists(i)
THEN
WriteRoom(i)
END
END ;
WriteString('END.') ; WriteLn
END WriteMapText ;
(*
MakeRoomNumbers - makes room numbers for the rooms that exist.
*)
PROCEDURE MakeRoomNumbers ;
VAR
i, j: CARDINAL ;
BEGIN
j := 1 ;
FOR i := 1 TO NoOfRooms DO
IF RoomExists(i)
THEN
Rooms[i].RoomNo := j ;
INC(j)
END
END
END MakeRoomNumbers ;
(*
WriteRoom - writes out the room coordinates.
*)
PROCEDURE WriteRoom (r: CARDINAL) ;
VAR
i: CARDINAL ;
BEGIN
WITH Rooms[r] DO
WriteString('ROOM') ; WriteCard(RoomNo, 4) ; WriteLn ;
WriteString('WALL') ; WriteLn ;
FOR i := 1 TO NoOfWalls DO
WITH Walls[i] DO
WriteCard(X1, 8) ; WriteCard(Y1, 4) ;
WriteCard(X2, 4) ; WriteCard(Y2, 4) ; WriteLn
END
END ;
FOR i := 1 TO NoOfDoors DO
WriteString('DOOR') ;
WITH Doors[i] DO
WITH Position DO
WriteCard(X1, 4) ; WriteCard(Y1, 4) ;
WriteCard(X2, 4) ; WriteCard(Y2, 4)
END ;
WriteString(' STATUS ') ;
WriteStatus(StateOfDoor) ;
WriteString(' LEADS TO') ;
WriteCard(Rooms[LeadsTo].RoomNo, 4) ; WriteLn
END
END ;
WriteString('END') ; WriteLn
END
END WriteRoom ;
(*
WriteStatus - writes the status of a door.
*)
PROCEDURE WriteStatus (s: DoorStatus) ;
BEGIN
CASE s OF
Open : WriteString('OPEN ') |
Closed : WriteString('CLOSED') |
Secret : WriteString('SECRET')
ELSE
HALT
END
END WriteStatus ;
(*
RoomExists - returns true if a room exists.
*)
PROCEDURE RoomExists (r: CARDINAL) : BOOLEAN ;
BEGIN
RETURN( Rooms[r].RoomNo#0 )
END RoomExists ;
END WriteMap.