76 lines
2.2 KiB
Plaintext
76 lines
2.2 KiB
Plaintext
|
{ 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;
|
|||
|
|