(root)/
gcc-13.2.0/
gcc/
testsuite/
gm2/
examples/
map/
pass/
WriteMap.mod
(* 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.