TYPE
  Str80Type = STRING[80];
  ScoreType = (ScoreReset, ScoreRock, ScoreStatue, ScoreMoney);

  NameStringType = STRING[20];
  LayoutType = ARRAY[1..LevelRows] OF ARRAY[1..LevelCols] OF CHAR;
  LevelType = RECORD
    Name : NameStringType;
    InitialBonusTime : INTEGER;
    Rocks : INTEGER;
    Layout : LayoutType;
  END;

  { The Action constants define what the Actor currently is, }
  { or is requested to be, doing }
  ActionType = (
    PENDING,
    NONE,
    STOPPED,
    UP,
    UPRIGHT,
    RIGHT,
    DOWNRIGHT,
    DOWN,
    DOWNLEFT,
    LEFT,
    UPLEFT,
    FALLING,
    JUMP, { Generic jump set by keyhandler }
    JUMPRIGHT,
    JUMPUP,
    JUMPLEFT,
    ACTIONEND
  );

  ActionArrayType = ARRAY[1..JumpsLen] OF ActionType;

  KindType = ( ALAD, AROCK );

  RockPointerType = ^ActorType;
  { The Actor struct holds info about an actor ie, the Lad or a Rock }
  ActorType = RECORD
    AType : KindType;
    X,Y : INTEGER;
    Ch : CHAR;
    Dir, DirRequest : ActionType;
    JumpStep : INTEGER;
    Next : RockPointerType;
  END;

  { The MapData hold all info about a map }
  MapDataType = RECORD
    Name : NameStringType;
    Field : LayoutType;
    LadsRemaining : INTEGER;
    NumRocks : INTEGER;
    Rocks : RockPointerType;
    AnyRocksPending : BOOLEAN;
    Level : INTEGER;
    Score : INTEGER;
    InitialBonusTime : INTEGER;
    RemainingBonusTime : INTEGER;
    ScoreText : Str80type;
  END;

  XYtype = RECORD
    x, y : INTEGER;
  END;

  DispenserPointerType = ^DispenserType;
  DispenserType = RECORD
    xy : XYtype;
    next : DispenserPointerType;
  END;

  { layout of LADDER.DAT data file }
  DataFileType = RECORD
    TerminalName : STRING[DataFileStrLength];
    MoveCsrPrefix : STRING[DataFileStrLength];
    MoveCsrSeparator : STRING[DataFileStrLength];
    MoveCsrSuffix : STRING[DataFileStrLength];
    UnkEscSeq : STRING[DataFileStrLength]; { not sure what this is... initialization? }
    ClrScrStr : STRING[DataFileStrLength];
    Flags : ARRAY[0..DataFileStrLength] OF CHAR;
    Keys : ARRAY[0..DataFileStrLength] OF CHAR;
    Highs : ARRAY[1..NumHighScores] OF ARRAY[0..DataFileStrLength] OF BYTE;
    Unused1 : ARRAY[0..DataFileStrLength] OF BYTE;
    Unused2 : ARRAY[0..DataFileStrLength] OF BYTE; { padding to next 128 bytes }
    Unused3 : ARRAY[0..DataFileStrLength] OF BYTE;
  END;

  HighScoreType = RECORD
    Score : INTEGER;
    Name : STRING[DataFileNameLength];
  END;

