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.
147 lines
3.5 KiB
147 lines
3.5 KiB
|
|
Unit dataUnit;
|
|
|
|
Interface
|
|
|
|
Type
|
|
TMoverType = (glider, walker, pusher);
|
|
TMoverDir = (up, left, down, right);
|
|
|
|
Const
|
|
maxHeight = 20;
|
|
maxWidth = 40;
|
|
empty = '.';
|
|
man = '&';
|
|
gem = '*';
|
|
wall = '#';
|
|
wallSlip = '@';
|
|
earth = 'H';
|
|
boulder = '0';
|
|
block = 'M';
|
|
magnetx = 'N';
|
|
magnety = 'Z';
|
|
turnerRight = 'a';
|
|
turnerLeft = 'c';
|
|
monster = '%';
|
|
walkable = [empty,earth,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', '>'];
|
|
magnets = [magnetx,magnety];
|
|
pushable = [block,boulder,turnerLeft,turnerRight]
|
|
+ magnets + gliders + walkers + pushers;
|
|
slipery = [wallSlip,boulder,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(wall);
|
|
'1'..'4','6'..'9': Exit(wallSlip);
|
|
'e': Exit(earth);
|
|
'b': Exit(block);
|
|
's': Exit(magnety);
|
|
'~','E','C','[': Exit(monster);
|
|
'B': Exit(boulder);
|
|
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;
|
|
monster:
|
|
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.
|
|
|