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.