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.

138 lines
3.0 KiB

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.