1 (* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
2 Free Software Foundation, Inc. *)
3 (* This file is part of GNU Modula-2.
5 GNU Modula-2 is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 3, or (at your option) any later
10 GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License along
16 with gm2; see the file COPYING. If not, write to the Free Software
17 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
21 FROM SYSTEM IMPORT ADR ;
22 FROM libc IMPORT exit, system ;
23 FROM StrLib IMPORT StrCopy, StrConCat ;
24 FROM StrIO IMPORT WriteString, WriteLn ;
25 FROM NumberIO IMPORT WriteCard ;
26 FROM Args IMPORT GetArg ;
27 FROM libc IMPORT system ;
29 FROM FIO IMPORT File, OpenToWrite, Close, Exists, ReportError, WriteShort,
30 WriteChar, IsNoError ;
32 FROM FIO IMPORT File, OpenToWrite, Close, Exists, WriteChar, IsNoError ;
34 FROM AdvMap IMPORT ReadAdvMap, Rooms, DoorStatus, ActualNoOfRooms,
35 MaxNoOfTreasures, Treasure ;
41 ErrorInRoom: BOOLEAN ;
44 PROCEDURE GetOppositeDoor (r, x1, y1, x2, y2: CARDINAL ;
45 VAR doorno: CARDINAL ; VAR ok: BOOLEAN) ;
52 WHILE (NOT ok) AND (doorno<=NoOfDoors) DO
53 xok := (x1=Doors[doorno].Position.X1) AND
54 (x2=Doors[doorno].Position.X2) ;
55 yok := (y1=Doors[doorno].Position.Y1) AND
56 (y2=Doors[doorno].Position.Y2) ;
68 PROCEDURE GetWallOnDoor (r, x1, y1, x2, y2: CARDINAL ;
76 WHILE (NOT ok) AND (wallno<=NoOfWalls) DO
78 IF (Walls[wallno].X1=x1) AND (Walls[wallno].X2=x2)
80 IF (Walls[wallno].Y1<=y1) AND (Walls[wallno].Y2>=y2)
85 IF (Walls[wallno].Y1=y1) AND (Walls[wallno].Y2=y2)
87 IF (Walls[wallno].X1<=x1) AND (Walls[wallno].X2>=x2)
99 PROCEDURE HorizWallOnDoor (r, x1, y1: CARDINAL ;
107 WHILE (NOT ok) AND (wallno<=NoOfWalls) DO
108 WITH Walls[wallno] DO
109 IF (Walls[wallno].X1=Walls[wallno].X2) AND (x1=Walls[wallno].X1)
111 IF (Walls[wallno].Y1<=y1) AND (Walls[wallno].Y2>=y1)
120 END HorizWallOnDoor ;
123 PROCEDURE VertWallOnDoor (r, x1, y1: CARDINAL ;
131 WHILE (NOT ok) AND (wallno<=NoOfWalls) DO
132 WITH Walls[wallno] DO
133 IF (Walls[wallno].Y1=Walls[wallno].Y2) AND (y1=Walls[wallno].Y1)
135 IF (Walls[wallno].X1<=x1) AND (Walls[wallno].X2>=x1)
151 PROCEDURE AnalyzeSemantic ;
155 FOR room := 1 TO ActualNoOfRooms DO
158 END AnalyzeSemantic ;
165 PROCEDURE AnalyzeRoom (room: CARDINAL) ;
172 FOR door := 1 TO NoOfDoors DO
173 AnalyzeDoor(room, door)
184 PROCEDURE AnalyzeDoor (room, door: CARDINAL) ;
194 GetOppositeDoor( LeadsTo, Position.X1, Position.Y1,
195 Position.X2, Position.Y2 ,OtherDoor, ok ) ;
198 IF StateOfDoor#Rooms[LeadsTo].Doors[OtherDoor].StateOfDoor
200 WriteString('Inconsistant Door STATUS in room') ;
201 WriteCard( room, 6 ) ; WriteString('Door NO.') ;
202 WriteCard( door, 6 ) ; WriteLn ;
206 WriteString('Inconsistant Door LEADSTO in room') ;
207 WriteCard( room, 6 ) ; WriteString(' Door NO.') ;
208 WriteCard( door, 6 ) ; WriteString(' - OR -') ;WriteLn ;
209 WriteString('Inconsistant Door COORDS in room') ;
210 WriteCard( room, 6 ) ; WriteString(' Door NO.') ;
211 WriteCard( door, 6 ) ; WriteLn ;
214 GetWallOnDoor( room, Position.X1, Position.Y1,
215 Position.X2, Position.Y2, ok ) ;
218 WriteString('Door NOT ON WALL in room') ;
219 WriteCard( room, 6 ) ; WriteString(' Door NO.') ;
220 WriteCard( door, 6 ) ; WriteLn ;
223 IF Position.X1=Position.X2
227 VertWallOnDoor( LeadsTo, Position.X1, i, ok ) ;
229 UNTIL ok OR (i>Position.Y2)
233 HorizWallOnDoor( LeadsTo, i, Position.Y1, ok ) ;
235 UNTIL ok OR (i>Position.X2)
239 WriteString('Adjacent Room CONFLICT with DOOR in ROOM') ;
240 WriteCard( room, 6 ) ; WriteString(' Door NO.') ;
241 WriteCard( door, 6 ) ; WriteLn ;
242 WriteString('Adjacent Room is') ; WriteCard( LeadsTo, 6 ) ;
257 PROCEDURE CrunchRooms (f: File) ;
261 WriteShort(f, ActualNoOfRooms) ;
262 FOR room := 1 TO ActualNoOfRooms DO
272 PROCEDURE CrunchRoom (f: File; room: CARDINAL) ;
277 WriteShort(f, NoOfWalls) ;
278 FOR i := 1 TO NoOfWalls DO
279 CrunchWall(f, room, i)
281 WriteShort(f, NoOfDoors) ;
282 FOR i := 1 TO NoOfDoors DO
283 CrunchDoor(f, room, i)
293 PROCEDURE CrunchDoor (f: File; room: CARDINAL; doorno: CARDINAL) ;
295 WITH Rooms[room].Doors[doorno] DO
296 WriteShort(f, Position.X1) ;
297 WriteShort(f, Position.Y1) ;
298 WriteShort(f, Position.X2) ;
299 WriteShort(f, Position.Y2) ;
300 WriteShort(f, LeadsTo) ;
301 WriteChar(f, VAL(CHAR, StateOfDoor))
310 PROCEDURE CrunchWall (f: File; room: CARDINAL; wallno: CARDINAL) ;
312 WITH Rooms[room].Walls[wallno] DO
325 PROCEDURE CrunchTreasures (f: File) ;
329 FOR i := 1 TO MaxNoOfTreasures DO
331 WriteShort(f, Xpos) ;
332 WriteShort(f, Ypos) ;
336 END CrunchTreasures ;
343 PROCEDURE CrunchMap (a: ARRAY OF CHAR) ;
346 c: ARRAY [0..MaxFileName] OF CHAR ;
348 StrConCat(a, '.bin', a) ;
351 StrCopy('/bin/rm -f ', c) ;
355 WriteString('failed to ') ; WriteString(c) ; WriteLn ;
359 f := OpenToWrite(a) ;
366 WriteString('error when opening ') ; WriteString(a) ;
367 WriteString(' for writing: ') ; ReportError(f) ; WriteLn
373 FileName: ARRAY [0..MaxFileName] OF CHAR ;
375 IF GetArg(FileName, 1)
377 IF ReadAdvMap(FileName)
379 ErrorInRoom := FALSE ;