You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.0 KiB
139 lines
3.0 KiB
2 years ago
|
|
||
|
Unit dataUnit;
|
||
|
|
||
|
Interface
|
||
|
|
||
|
type
|
||
|
TMoverType = (glider, walker, pusher);
|
||
|
TMoverDir = (up, left, down, right);
|
||
|
|
||
|
Const
|
||
|
maxHeight = 20;
|
||
|
maxWidth = 40;
|
||
|
empty = '.';
|
||
|
man = '&';
|
||
|
gem = '*';
|
||
|
movers : array[TMoverType, TMoverDir] of char =
|
||
|
(
|
||
|
('^','>','v','<'),
|
||
|
('u','r','d','l'),
|
||
|
('U','R','D','L')
|
||
|
);
|
||
|
gliders = ['^','>','v','<'];
|
||
|
walkers = ['u','r','d','l'];
|
||
|
pushers = ['U','R','D','L'];
|
||
|
UpMovers = ['u', 'U', '^'];
|
||
|
DownMovers = ['d', 'D', 'v'];
|
||
|
LeftMovers = ['l', 'L', '<'];
|
||
|
RightMovers = ['r', 'R', '>'];
|
||
|
walkable = [empty,'H',gem];
|
||
|
magnets = ['N','Z'];
|
||
|
pushable = ['M','0','c','a']
|
||
|
+ magnets + gliders + walkers + pushers;
|
||
|
slipery = ['@','0',gem] + gliders;
|
||
|
enemies = ['%'];
|
||
|
|
||
|
|
||
|
|
||
|
Type Position = Record
|
||
|
col: integer;
|
||
|
row: integer;
|
||
|
End;
|
||
|
|
||
|
Type GameState = Record
|
||
|
ID : string;
|
||
|
map : array [1..maxHeight, 1..maxWidth] Of char;
|
||
|
mapHeight : integer;
|
||
|
mapWidth : integer;
|
||
|
manRow : integer;
|
||
|
manCol : integer;
|
||
|
goal : integer;
|
||
|
enemy : array [1..10] Of Position;
|
||
|
numEnemies : integer;
|
||
|
clue : string;
|
||
|
next : string;
|
||
|
End;
|
||
|
|
||
|
function readLevel(levelFile, levelID:String; var succes: Boolean): GameState;
|
||
|
|
||
|
Implementation
|
||
|
|
||
|
Uses sysutils;
|
||
|
|
||
|
function convert(x: Char):Char;
|
||
|
Begin
|
||
|
Case x of
|
||
|
'K': Exit(man);
|
||
|
' ': Exit(empty);
|
||
|
'5': Exit('#');
|
||
|
'1'..'4','6'..'9': Exit('@');
|
||
|
'e': Exit('H');
|
||
|
'b': Exit('M');
|
||
|
's': Exit('Z');
|
||
|
'~','E','C','[': Exit('%');
|
||
|
'B': Exit('0');
|
||
|
else Exit(x);
|
||
|
End;
|
||
|
End;
|
||
|
|
||
|
function readLevel(levelFile, levelID:String; var succes: Boolean): GameState;
|
||
|
|
||
|
Var
|
||
|
aFile: textfile;
|
||
|
thisID: String;
|
||
|
row, col: integer;
|
||
|
x :Char;
|
||
|
Begin
|
||
|
succes := false;
|
||
|
Assign(aFile,levelFile);
|
||
|
Reset(aFile);
|
||
|
readLn(aFile, thisID);
|
||
|
If length(levelID) <> 0 then
|
||
|
repeat
|
||
|
If EOF(aFile) then
|
||
|
Exit;
|
||
|
readLn(aFile, thisID);
|
||
|
until compareStr(thisID,levelID) = 0
|
||
|
else
|
||
|
readLn(aFile, thisID);
|
||
|
readLevel.ID := thisID;
|
||
|
readLn(aFile, readLevel.clue);
|
||
|
readLn(aFile);
|
||
|
readLevel.mapHeight := 20;
|
||
|
readLevel.mapWidth := 30;
|
||
|
readLevel.numEnemies := 0;
|
||
|
readLevel.goal := 0;
|
||
|
For row := 1 To readLevel.mapHeight Do
|
||
|
Begin
|
||
|
For col:= 1 To readLevel.mapWidth Do
|
||
|
Begin
|
||
|
read(aFile, x);
|
||
|
readLevel.map[row,col] := convert(x);
|
||
|
Case readLevel.map[row,col] Of
|
||
|
man:
|
||
|
Begin
|
||
|
readLevel.manRow := row;
|
||
|
readLevel.manCol := col;
|
||
|
End;
|
||
|
'%':
|
||
|
Begin
|
||
|
inc (readLevel.numEnemies);
|
||
|
readLevel.enemy[readLevel.numEnemies].col := col;
|
||
|
readLevel.enemy[readLevel.numEnemies].row := row;
|
||
|
End;
|
||
|
gem: inc(readLevel.goal);
|
||
|
End;
|
||
|
End;
|
||
|
readLn(aFile);
|
||
|
End;
|
||
|
If not EOF(aFile) then
|
||
|
readLn(aFile,readLevel.next)
|
||
|
else
|
||
|
readLevel.next := '';
|
||
|
Close(aFile);
|
||
|
succes := true;
|
||
|
End;
|
||
|
|
||
|
End.
|
||
|
|