1
0
vt100-games/LadderTP/LADFIELD.PAS

76 lines
2.2 KiB
Plaintext
Raw Normal View History

{ LoadMap loads one of the playfields/maps into memory and also }
{ returns the coordinates of the initial Lad, and an array of }
{ coordinates where the dispensers are. }
PROCEDURE LoadMap(VAR lad : XYtype; VAR dispensers : DispenserPointerType; VAR numDispensers : INTEGER);
VAR
x, y : INTEGER;
newDispenser : DispenserPointerType;
dispenserPtr : DispenserPointerType;
rock1Ptr,rock2Ptr : RockPointerType;
BEGIN
{ get rid of anay previous rock dispensers }
WHILE dispensers <> NIL DO BEGIN
dispenserPtr := dispensers^.next;
DISPOSE(dispensers);
dispensers := dispenserPtr;
END;
IF m.Level > NumLevels THEN BEGIN
ClrScr;
WriteLN('Level ', m.Level, ' out of range');
CursOn;
Halt;
END;
WITH levels[m.Level] DO BEGIN
m.Name := Name;
m.InitialBonusTime := InitialBonusTime;
m.NumRocks := rocks;
{ dispose of any previous rocks }
WHILE m.Rocks <> NIL DO BEGIN
rock1Ptr := m.Rocks^.Next;
Dispose(m.Rocks);
m.Rocks := rock1Ptr;
END;
{ allocate new rocks }
FOR x := 1 TO Rocks DO BEGIN
rock1Ptr := m.Rocks;
New(rock2Ptr);
m.Rocks := rock2Ptr;
m.Rocks^.Next := rock1Ptr;
END;
m.AnyRocksPending := TRUE;
END;
{ Prepare the field to be loaded with a new level }
FOR y := 1 TO LevelRows DO
FOR x := 1 TO LevelCols DO
m.Field[y][x] := ' ';
dispensers := NIL;
numDispensers := 0;
FOR y := 1 TO LevelRows DO
FOR x := 1 TO LevelCols DO
CASE levels[m.Level].layout[y][x] OF
'p':
BEGIN
{ The lad will be put there by the rendered, so no need to have }
{ it on the map }
lad.x := x;
lad.y := y;
END;
'V':
BEGIN
m.Field[y][x] := 'V';
NEW(newDispenser);
newDispenser^.xy.x := x;
newDispenser^.xy.y := y;
newDispenser^.next := dispensers;
dispensers := newDispenser;
numDispensers := Succ(numDispensers);
END;
'.': { TODO - handle the rubber balls }
m.Field[y][x] := '.'
ELSE
m.Field[y][x] := levels[m.Level].layout[y][x];
END;
END;