Eye of the Beholder INF File Format

General

Each maze consist of a .maz file and an accompaning .inf file. This document describes the .inf file and how it relates to the .maz files.

The .inf files are standard CPS files. However the german and spanish versions are uncompressed. This document assumes that you've depacked the .inf files using for instance uncps.exe.


Header

struct Monster

{

    unsigned char  index;

    unsigned char  levelType;

    unsigned short pos;

    unsigned char  subpos;

    unsigned char  direction;

    unsigned char  type;

    unsigned char  picture;

    unsigned char  phase;

    unsigned char  pause;

    unsigned short weapon;

    unsigned short pocket_item;

}


Position gives the x and y values. It's lower 5 bits are the y coordinate value and the next 5 bits are the x coordinate value.

   x_pos = (pos >> 5) & 0x1F;

    y_pos = pos & 0x1F;


Values sign must be confirmed.


struct Inf

{

    unsigned short triggersOffset;

    char           mazeName[12];

    char           vmpVcnName[12];

    char           paletteName[12];

    unsigned char  unknown[4];

    unsigned char  TypeOfCallingCommand1; /* 00 - off; 01 - by ticks, 02 - by steps */

    unsigned short Command1GenerationFrequencyInTicks;

    unsigned short Command1GenerationFrequencyInSteps;

    unsigned char  monster1CompressionMethod;

    unsigned char  monster1Name[12];

    unsigned char  monster2CompressionMethod;

    unsigned char  monster2Name[12];

    unsigned char  unknown[5];

    Monster        monsters[30];

    unsigned short nbrDecCommands;

    DecCommand     commands[nbrDecCommands];

}



Decoration data=

After the header comes the decoration data. It's loaded as a command sequence. The first unsigned short determines number of commands to execute. After that follows the first command code. Each command code is one byte.


Command codes

0xec (Load overlay image picture + overlay image rectangle data)


0xfb (Define wall mapping)

struct WallMapping

{

   unsigned char wallMappingIndex; /* This is the index used by the .maz file. */

   unsigned char wallID; /* Index to what backdrop wall image that is being used. */

   unsigned char decorationID; /* Index to and optional overlay decoration image in

                                  the DecorationData.decorations array in the

                                  [[eob.dat|.dat]] files. */

   unsigned char wallType;

   unsigned char wallPassabilityType;

};


Event data

After the decoration data comes a sequence of event data. It's also loaded as a command sequence. Each command code is one byte.


struct Inf

{

    ActSubroutine  subroutines[undefined];

    ActCommand     commands[undefined]; /* Usually equal nbrActCommands */

    unsigned short nbrActCommands;

    CommandCoordAct CoordsAndTypeOfActs[nbrActCommands];

}


Command codes

0xff (Set wall)

0xfe (Change wall)

0xfd (Open door)

0xfc (Close coor)

0xfb (Create monster)

0xfa (Teleport)

0xf9 (Steal small item)

0xf8 (Message)

0xf7 (Set flag)

0xf6 (Sound)

0xf5 (Clear flag)

0xf4 (Heal)

0xf3 (Damage)

0xf2 (Jump)

0xf1 (End code)

0xf0 (Return)

0xef (Call)

0xee (Conditions)

0xed (Item consume)

0xec (Change level)

0xeb (Give experience)

0xea (New item)

0xe9 (Launcher)

0xe8 (Turn)

0xe7 (Identify all items)

0xe6 (Encounters)

0xe5 (Wait)

0xe4 (Update screen)

0xe3 (Text menu)

0xe2 (Special window pictures)


Each command code is executed using a parsing function for that specific code. Number of bytes following each code is very specific to what command it is.


0xff (Set wall)

unsigned char subcode=nextUnsignedChar();

 

switch (subcode)

{

   case 0xf7: // Set complete maze block (all four walls)

      unsigned short position=nextUnsignedShort();

      unsigned char wallMappingIndex=nextUnsignedChar();

      for (int i=0; i<4; i++)

         maze[position][i]=wallMappingIndex;

   break;

 

   case 0xe9; // Change one wall

      unsigned short position=nextUnsignedShort();

      unsigned char wallMappingIndex=nextUnsignedChar();

      unsigned char direction=nextUnsignedChar();

      maze[position][direction]=wallMappingIndex;

   break;

 

   case 0xed; // Turn party

      Party.facing = nextUnsignedChar();

};


0xfe (Change wall)

unsigned char subcode=nextUnsignedChar();

 

switch (subcode)

{

   case 0xf7: //Flip four sides

      unsigned short position=nextUnsignedShort();

      unsigned char sourceWallMappingIndex=nextUnsignedChar();

      unsigned char destinationWallMappingIndex=nextUnsignedChar();

      for (int i=0; i<4; i++)

      {

         if (maze[position][i] == sourceWallMappingIndex)

            maze[position][i] = destinationWallMappingIndex;

      }

   break;

 

   case 0xe9;// Change one wall

      unsigned short position=nextUnsignedShort();

      unsigned char direction=nextUnsignedChar();

      unsigned char sourceWallMappingIndex=nextUnsignedChar();

      unsigned char destinationWallMappingIndex=nextUnsignedChar();

      if (maze[position][direction] == sourceWallMappingIndex)

         maze[position][direction] = destinationWallMappingIndex;

   break;

 

   case 0xea; // Unknown

      unsigned short unknown=nextUnsigndShort();

   break;

};


0xfb (Monster Creation)

char MoNo;

char MoTime;

short int position;

char subpos;

char facing;

char type;

char pic;

char phase;

char pause;

short int weapon; /* Item Number */

short int pocket; /* Dropped on Monster killed */

0xf6 (Sound)

char SoundId;

short int position;

0xf6 (Sound) in the demo version of the EOB1

char SoundId;

All other commands, except 0xf6, are identical in all EOB1 versions.


Far from all command codes have been documented here, however most of it have already been reverse engineered. Feel free to check the source code for the script decompiler: Script Decompiler 2 at the tools section.


.inf dump with comments

EOB1 INF file resourced for assembler 68000 (To See here for all the INF files EOB-InfFile-Asm.lha

BOPT uo+

 BOPT ue-

 BOPT ua+

 OUTPUT LEVEL1.INF.dec

 ;Source Created by "EOB Langage File ReSourcerINF" Beta

 ;A Tool done by CFou! on June 2006

Start

Hunk0:

 dc.b Hunk3-Start,(Hunk3-Start)/$100 ; dc.w $B10A

 ; Maze name

 dc.b 'level1.maz',0,0

 ; VCN/VMP name

 dc.b 'brick',0,'.maz',0,0

 ; Palette name

 dc.b 'brick',0,'.maz',0,0

_0026:

 ; Nb of doors and doorknobs

 dc.w $0000,$FF03

_002A:

 ; Max monster / tdiff etc

 dc.b $00,$00,$00,$00,$00

_002F:

 ; Number of procedure for extraction of monster picture

 dc.b $01

 ; Name Of Monster pic CPS file

 dc.b 'kobold',0,'maz',0,0

_003C:

 ; Number of procedure for extraction of monster picture

 dc.b $00

 ; Name Of Monster pic CPS file

 dc.b 'leech',0,0,'maz',0,0

_0049:

 ; Timer0 | Timer 1| Timerdiff (in Ticks)

 dc.b $00,$19

 ; Timer0 | Timer 1| Timerdiff

 dc.b $01,$23

 ; End of Timer

 dc.b $FF

_004E:

 ; Monster Description X 30: Start point and so on

 dc.b $01,$00,$14,$01,$04,$02,$00,$00,$06,$00,$04,$00,$00,$00

 dc.b $02,$00,$F4,$00,$04,$02,$00,$00,$06,$00,$00,$00,$04,$00

 dc.b $03,$00,$15,$01,$04,$02,$00,$00,$06,$00,$04,$00,$00,$00

 dc.b $04,$00,$F5,$00,$04,$02,$00,$00,$06,$00,$04,$00,$37,$00

 dc.b $05,$00,$B4,$01,$00,$00,$00,$00,$04,$00,$04,$00,$00,$00

 dc.b $06,$00,$B4,$01,$01,$00,$00,$00,$04,$00,$00,$00,$04,$00

 dc.b $07,$00,$B4,$01,$02,$00,$00,$00,$04,$00,$04,$00,$00,$00

 dc.b $08,$00,$B4,$01,$03,$00,$00,$00,$04,$00,$04,$00,$00,$00

 dc.b $09,$00,$4A,$02,$04,$01,$00,$00,$05,$00,$00,$00,$04,$00

 dc.b $0A,$00,$4B,$02,$04,$03,$00,$00,$05,$00,$04,$00,$00,$00

 dc.b $0B,$00,$4C,$02,$04,$01,$00,$00,$05,$00,$04,$00,$00,$00

 dc.b $0C,$00,$2C,$03,$02,$02,$00,$00,$04,$00,$04,$00,$00,$00

 dc.b $0D,$00,$2C,$03,$03,$02,$00,$00,$04,$00,$04,$00,$00,$00

 dc.b $0E,$00,$59,$02,$02,$02,$00,$00,$04,$00,$00,$00,$04,$00

 dc.b $0F,$00,$59,$02,$03,$02,$00,$00,$04,$00,$04,$00,$00,$00

 dc.b $10,$00,$6B,$02,$04,$01,$00,$00,$06,$00,$04,$00,$3B,$00

 dc.b $11,$00,$2C,$02,$04,$02,$00,$00,$06,$00,$00,$00,$00,$00

 dc.b $12,$00,$8F,$01,$04,$02,$00,$00,$01,$00,$00,$00,$00,$00

 dc.b $13,$01,$86,$03,$04,$00,$01,$01,$01,$00,$00,$00,$00,$00

 dc.b $14,$01,$66,$03,$04,$00,$01,$01,$01,$00,$00,$00,$00,$00

 dc.b $15,$01,$45,$03,$04,$01,$01,$01,$05,$00,$00,$00,$00,$00

 dc.b $16,$01,$2A,$03,$04,$00,$01,$01,$01,$00,$00,$00,$00,$00

 dc.b $17,$01,$E8,$02,$04,$01,$01,$01,$01,$00,$00,$00,$00,$00

 dc.b $18,$01,$EF,$02,$04,$03,$01,$01,$01,$00,$00,$00,$00,$00

 dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

 dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

 dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

 dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

 dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

 dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

_01F2:

Hunk1:

 ; Nb of $EC & $FB command Hunk 1

 dc.w $1B00

 ; Command $EC & $FB

 dc.b $EC

 dc.b 'brick1',0,'maz',0,0

 dc.b 'brick.dat',0,0,0

 dc.b $FB,$27,$01,$00,$03,$04

 dc.b $FB,$28,$01,$01,$04,$04

 dc.b $FB,$3E,$01,$17,$02,$04

 dc.b $FB,$2B,$01,$28,$02,$04

 dc.b $FB,$3F,$01,$16,$02,$04

 dc.b $FB,$32,$01,$04,$02,$04

 dc.b $FB,$41,$01,$1A,$02,$04

 dc.b $FB,$2F,$01,$30,$02,$04

 dc.b $FB,$2C,$01,$2F,$02,$04

 dc.b $FB,$2A,$01,$31,$02,$04

 dc.b $EC

 dc.b 'brick2',0,'at',0,0,0

 dc.b 'brick.dat',0,0,0

 dc.b $FB,$1A,$00,$1C,$00,$03

 dc.b $FB,$17,$04,$21,$00,$05

 dc.b $FB,$18,$05,$22,$00,$05

 dc.b $FB,$1C,$00,$1D,$00,$03

 dc.b $FB,$19,$00,$FF,$00,$07

 dc.b $FB,$3C,$01,$24,$03,$04

 dc.b $FB,$3D,$01,$25,$04,$04

 dc.b $FB,$37,$01,$1E,$03,$04

 dc.b $FB,$38,$01,$1F,$04,$04

 dc.b $FB,$1D,$01,$20,$0A,$84

 dc.b $FB,$33,$01,$26,$02,$04

 dc.b $FB,$3A,$01,$23,$00,$04

 dc.b $EC

 dc.b 'brick3',0,'at',0,0,0

 dc.b 'brick.dat',0,0,0

 dc.b $FB,$45,$00,$27,$02,$04

 dc.b $FB,$31,$00,$2D,$02,$04

 ;$1B Command Resourced

Hunk2:

 ; New Section

_02CF: dc.b $EE,$E0,$01

_02D2: dc.b $FF,$EE,_035A-Start,(_035A-Start)/$100 ; dc.b $5A,$03

_02D6: dc.b $EE,$ED,$01

_02D9: dc.b $FF,$EE,_0308-Start,(_0308-Start)/$100 ; dc.b $08,$03

_02DD: dc.b $EE,$EF,$1F,$00

_02E1: dc.b $FF,$EE,_02EA-Start,(_02EA-Start)/$100 ; dc.b $EA,$02

_02E5: dc.b $E6,$0A

_02E7: dc.b $F7,$EF,$1F

_02EA: dc.b $F8,"going down...",0,$05,$00

_02FB: dc.b $F6,$4F,$00,$00

_02FF: dc.b $EC,$E5,$02,$F3,$02,$01

_0305: dc.b $F2,_035A-Start,(_035A-Start)/$100 ; dc.b $5A,$03

_0308: dc.b $F8,"you can't go that way.",0,$0F,$00

_0322: dc.b $F6,$1D,$00,$00

_0326: dc.b $EE,$01,$00

_0329: dc.b $FF,$EE,_0333-Start,(_0333-Start)/$100 ; dc.b $33,$03

_032D: dc.b $FA,$E8,$00,$00,$12,$03

_0333: dc.b $EE,$01,$01

_0336: dc.b $FF,$EE,_0340-Start,(_0340-Start)/$100 ; dc.b $40,$03

_033A: dc.b $FA,$E8,$00,$00,$F1,$02

_0340: dc.b $EE,$01,$02

_0343: dc.b $FF,$EE,_034D-Start,(_034D-Start)/$100 ; dc.b $4D,$03

_0347: dc.b $FA,$E8,$00,$00,$D2,$02

_034D: dc.b $EE,$01,$03

_0350: dc.b $FF,$EE,_035A-Start,(_035A-Start)/$100 ; dc.b $5A,$03

_0354: dc.b $FA,$E8,$00,$00,$F3,$02

_035A: dc.b $EE,$E0,$04

_035D: dc.b $FF,$EE,_0395-Start,(_0395-Start)/$100 ; dc.b $95,$03

_0361: dc.b $EE,$01,$00

_0364: dc.b $FF,$EE,_036E-Start,(_036E-Start)/$100 ; dc.b $6E,$03

_0368: dc.b $FA,$F5,$F2,$02,$12,$03

_036E: dc.b $EE,$01,$01

_0371: dc.b $FF,$EE,_037B-Start,(_037B-Start)/$100 ; dc.b $7B,$03

_0375: dc.b $FA,$F5,$F2,$02,$F1,$02

_037B: dc.b $EE,$01,$02

_037E: dc.b $FF,$EE,_0388-Start,(_0388-Start)/$100 ; dc.b $88,$03

_0382: dc.b $FA,$F5,$F2,$02,$D2,$02

_0388: dc.b $EE,$01,$03

_038B: dc.b $FF,$EE,_0395-Start,(_0395-Start)/$100 ; dc.b $95,$03

_038F: dc.b $FA,$F5,$F2,$02,$F3,$02

_0395:

 dc.b $F1

_0396: dc.b $EE,$EF,$0A,$00

_039A: dc.b $FF,$EE,_03A5-Start,(_03A5-Start)/$100 ; dc.b $A5,$03

_039E: dc.b $EB,$E2,$40,$06

_03A2: dc.b $F7,$EF,$0A

_03A5:

 dc.b $F1

_03A6: dc.b $EB,$E2,$10,$27

_03AA:

 dc.b $F1

_03AB: dc.b $EE,$EF,$08,$00

_03AF: dc.b $FF,$EE,_03BA-Start,(_03BA-Start)/$100 ; dc.b $BA,$03

_03B3: dc.b $EB,$E2,$40,$06

_03B7: dc.b $F7,$EF,$08

_03BA:

 dc.b $F1

_03BB: dc.b $EE,$EF,$04,$00

_03BF: dc.b $FF,$EE,_03CA-Start,(_03CA-Start)/$100 ; dc.b $CA,$03

_03C3: dc.b $EB,$E2,$90,$01

_03C7: dc.b $F7,$EF,$04

_03CA:

 dc.b $F1

_03CB: dc.b $F6,$01,$AD,$01

_03CF: dc.b $FE,$EA,$AE,$01

_03D3: dc.b $EE,$EF,$01,$00

_03D7: dc.b $FF,$EE,_03E2-Start,(_03E2-Start)/$100 ; dc.b $E2,$03

_03DB: dc.b $EB,$E2,$20,$03

_03DF: dc.b $F7,$EF,$01

_03E2:

 dc.b $F1

_03E3: dc.b $EE,$F7,$75,$01,$01

_03E8: dc.b $FE,$EE,_03F6-Start,(_03F6-Start)/$100 ; dc.b $F6,$03

_03EC: dc.b $FF,$F7,$11,$02,$01

_03F1: dc.b $FF,$F7,$2E,$03,$01

_03F6: dc.b $EE,$EF,$02,$00

_03FA: dc.b $FF,$EE,_0405-Start,(_0405-Start)/$100 ; dc.b $05,$04

_03FE: dc.b $EB,$E2,$90,$01

_0402: dc.b $F7,$EF,$02

_0405:

 dc.b $F1

_0406: dc.b $EE,$F7,$11,$02,$01

_040B: dc.b $FE,$EE,_041F-Start,(_041F-Start)/$100 ; dc.b $1F,$04

_040F: dc.b $FF,$E9,$C9,$02,$00,$01

_0415: dc.b $FF,$F7,$75,$01,$01

_041A: dc.b $FF,$F7,$4D,$03,$01

_041F: dc.b $F7,$EF,$02

_0422:

 dc.b $F1

_0423: dc.b $EE,$E9,$00,$B7,$01,$01

_0429: dc.b $FE,$EE,_0444-Start,(_0444-Start)/$100 ; dc.b $44,$04

_042D: dc.b $F6,$07,$B7,$01

_0431: dc.b $FE,$EA,$B6,$01

_0435: dc.b $EE,$EF,$05,$00

_0439: dc.b $FF,$EE,_0444-Start,(_0444-Start)/$100 ; dc.b $44,$04

_043D: dc.b $EB,$E2,$20,$03

_0441: dc.b $F7,$EF,$05

_0444:

 dc.b $F1

_0445: dc.b $EE,$F7,$D6,$01,$1C

_044A: dc.b $FF,$EE,_0465-Start,(_0465-Start)/$100 ; dc.b $65,$04

_044E: dc.b $F6,$0C,$D6,$01

_0452: dc.b $FE,$EA,$B6,$01

_0456: dc.b $EE,$EF,$07,$00

_045A: dc.b $FF,$EE,_0465-Start,(_0465-Start)/$100 ; dc.b $65,$04

_045E: dc.b $EB,$E2,$20,$03

_0462: dc.b $F7,$EF,$07

_0465:

 dc.b $F1

_0466: dc.b $EE,$E0,$01

_0469: dc.b $FF,$F5,$FF,$36,$02,$00

_046F: dc.b $FF,$F9,$E0,$04,$FF

_0474: dc.b $F5,$FF,$36,$02,$01

_0479: dc.b $FF,$F9,$F1,$36,$02,$00

_047F: dc.b $FF,$F9,$F8,$EE,_048C-Start,(_048C-Start)/$100 ; dc.b $8C,$04

_0485: dc.b $F6,$0C,$36,$02

_0489: dc.b $FD,$76,$02

_048C: dc.b $EE,$E0,$02

_048F: dc.b $FF,$F5,$FF,$36,$02,$00

_0495: dc.b $FF,$F9,$E0,$08,$FF

_049A: dc.b $F5,$FF,$36,$02,$00

_049F: dc.b $FF,$F9,$F1,$36,$02,$00

_04A5: dc.b $FF,$F9,$F8,$EE,_04B2-Start,(_04B2-Start)/$100 ; dc.b $B2,$04

_04AB: dc.b $F6,$0C,$36,$02

_04AF: dc.b $FC,$76,$02

_04B2:

 dc.b $F1

_04B3: dc.b $F6,$01,$52,$02

_04B7: dc.b $FE,$EA,$53,$02

_04BB:

 dc.b $F1

_04BC: dc.b $EE,$E9,$01,$6E,$02,$01

_04C2: dc.b $FE,$EE,_04DD-Start,(_04DD-Start)/$100 ; dc.b $DD,$04

_04C6: dc.b $F6,$07,$6E,$02

_04CA: dc.b $FE,$EA,$4E,$02

_04CE: dc.b $EE,$EF,$05,$00

_04D2: dc.b $FF,$EE,_04DD-Start,(_04DD-Start)/$100 ; dc.b $DD,$04

_04D6: dc.b $EB,$E2,$20,$03

_04DA: dc.b $F7,$EF,$05

_04DD:

 dc.b $F1

_04DE: dc.b $EE,$F7,$4D,$02,$1C

_04E3: dc.b $FF,$EE,_04FE-Start,(_04FE-Start)/$100 ; dc.b $FE,$04

_04E7: dc.b $F6,$0C,$4D,$02

_04EB: dc.b $FE,$EA,$4E,$02

_04EF: dc.b $EE,$EF,$07,$00

_04F3: dc.b $FF,$EE,_04FE-Start,(_04FE-Start)/$100 ; dc.b $FE,$04

_04F7: dc.b $EB,$E2,$20,$03

_04FB: dc.b $F7,$EF,$07

_04FE:

 dc.b $F1

_04FF: dc.b $F6,$07,$B2,$02

_0503: dc.b $F6,$0D,$93,$02

_0507: dc.b $FE,$F7,$93,$02,$00,$01

_050D: dc.b $FA,$F3,$93,$02,$73,$02

_0513: dc.b $EE,$EF,$06,$00

_0517: dc.b $FF,$EE,_0522-Start,(_0522-Start)/$100 ; dc.b $22,$05

_051B: dc.b $EB,$E2,$40,$06

_051F: dc.b $F7,$EF,$06

_0522:

 dc.b $F1

_0523: dc.b $F6,$07,$BA,$02

_0527: dc.b $FA,$F3,$99,$02,$79,$02

_052D: dc.b $F6,$0D,$99,$02

_0531: dc.b $FE,$F7,$99,$02,$00,$01

_0537: dc.b $EE,$EF,$06,$00

_053B: dc.b $FF,$EE,_0546-Start,(_0546-Start)/$100 ; dc.b $46,$05

_053F: dc.b $EB,$E2,$40,$06

_0543: dc.b $F7,$EF,$06

_0546:

 dc.b $F1

_0547: dc.b $EE,$E9,$01,$E7,$02,$01

_054D: dc.b $FE,$EE,_0568-Start,(_0568-Start)/$100 ; dc.b $68,$05

_0551: dc.b $F6,$07,$E7,$02

_0555: dc.b $FE,$EA,$C8,$02

_0559: dc.b $EE,$EF,$05,$00

_055D: dc.b $FF,$EE,_0568-Start,(_0568-Start)/$100 ; dc.b $68,$05

_0561: dc.b $EB,$E2,$20,$03

_0565: dc.b $F7,$EF,$05

_0568:

 dc.b $F1

_0569: dc.b $F6,$07,$C9,$02

_056D: dc.b $EE,$E9,$00,$C9,$02,$01

_0573: dc.b $FE,$EE,_0590-Start,(_0590-Start)/$100 ; dc.b $90,$05

_0577: dc.b $FE,$EA,$C8,$02

_057B: dc.b $FF,$E9,$E7,$02,$01,$01

_0581: dc.b $EE,$EF,$05,$00

_0585: dc.b $FF,$EE,_0590-Start,(_0590-Start)/$100 ; dc.b $90,$05

_0589: dc.b $EB,$E2,$20,$03

_058D: dc.b $F7,$EF,$05

_0590:

 dc.b $F1

_0591: dc.b $F6,$0C,$11,$03

_0595: dc.b $FD,$F1,$02

_0598:

 dc.b $F1

_0599: dc.b $EE,$E0,$01

_059C: dc.b $FF,$F5,$FF,$F0,$02,$00

_05A2: dc.b $FF,$F9,$EE,_05AE-Start,(_05AE-Start)/$100 ; dc.b $AE,$05

_05A7: dc.b $F6,$0C,$F0,$02

_05AB: dc.b $FC,$F1,$02

_05AE: dc.b $EE,$E0,$04

_05B1: dc.b $FF,$F1,$F0,$02,$00

_05B6: dc.b $FF,$F5,$FF,$F0,$02,$02

_05BC: dc.b $FD,$F9,$F9,$EE,_05C9-Start,(_05C9-Start)/$100 ; dc.b $C9,$05

_05C2: dc.b $F6,$0C,$F0,$02

_05C6: dc.b $FC,$F1,$02

_05C9:

 dc.b $F1

_05CA: dc.b $EE,$EF,$00,$00

_05CE: dc.b $FF,$EE,_05F1-Start,(_05F1-Start)/$100 ; dc.b $F1,$05

_05D2: dc.b $F8,"it smells terrible here.",0,$02,$00

_05EE: dc.b $F7,$EF,$00

_05F1:

 dc.b $F1

_05F2: dc.b $F8,"this slimy, smelly drain pipe reveals nothing.",0,$02,$00

_0624: dc.b $EE,$EF,$03,$00

_0628: dc.b $FF,$EE,_0633-Start,(_0633-Start)/$100 ; dc.b $33,$06

_062C: dc.b $EB,$E2,$20,$03

_0630: dc.b $F7,$EF,$03

_0633:

 dc.b $F1

_0634: dc.b $F8,"there is a drainage grate here.",0,$02,$00

_0657: dc.b $EE,$EF,$03,$00

_065B: dc.b $FF,$EE,_0666-Start,(_0666-Start)/$100 ; dc.b $66,$06

_065F: dc.b $EB,$E2,$20,$03

_0663: dc.b $F7,$EF,$03

_0666: dc.b $EE,$E7,$F5,$00

_066A: dc.b $FF,$EF,$01,$00

_066E: dc.b $FF,$F9,$EE,_067C-Start,(_067C-Start)/$100 ; dc.b $7C,$06

_0673: dc.b $EA,$3A,$00,$FF,$FF,$00

_0679: dc.b $F7,$EF,$01

_067C:

 dc.b $F1

_067D: dc.b $F8,"this slimy, smelly drain pipe reveals nothing.",0,$02,$00

_06AF: dc.b $EE,$EF,$03,$00

_06B3: dc.b $FF,$EE,_06BE-Start,(_06BE-Start)/$100 ; dc.b $BE,$06

_06B7: dc.b $EB,$E2,$20,$03

_06BB: dc.b $F7,$EF,$03

_06BE:

 dc.b $F1

_06BF: dc.b $F8,"there is a drainage grate here.",0,$02,$00

_06E2: dc.b $EE,$EF,$03,$00

_06E6: dc.b $FF,$EE,_06F1-Start,(_06F1-Start)/$100 ; dc.b $F1,$06

_06EA: dc.b $EB,$E2,$20,$03

_06EE: dc.b $F7,$EF,$03

_06F1:

 dc.b $F1

_06F2: dc.b $F8,"there is a drainage grate here.",0,$02,$00

_0715: dc.b $EE,$EF,$03,$00

_0719: dc.b $FF,$EE,_0724-Start,(_0724-Start)/$100 ; dc.b $24,$07

_071D: dc.b $EB,$E2,$20,$03

_0721: dc.b $F7,$EF,$03

_0724:

 dc.b $F1

_0725: dc.b $EE,$EF,$03,$00

_0729: dc.b $FF,$EE,_0734-Start,(_0734-Start)/$100 ; dc.b $34,$07

_072D: dc.b $EB,$E2,$20,$03

_0731: dc.b $F7,$EF,$03

_0734: dc.b $EE,$F1,$CE,$01,$01

_0739: dc.b $FF,$EE,_07AF-Start,(_07AF-Start)/$100 ; dc.b $AF,$07

_073D: dc.b $EE,$E9,$03,$CF,$01,$2C

_0743: dc.b $FF,$EE,_0789-Start,(_0789-Start)/$100 ; dc.b $89,$07

_0747: dc.b $F8,"something scurries deeper into the floor drain.",0,$02,$00

_077A: dc.b $FF,$E9,$CF,$01,$03,$3E

_0780: dc.b $FF,$E9,$CF,$01,$01,$2C

_0786: dc.b $F2,_07AC-Start,(_07AC-Start)/$100 ; dc.b $AC,$07

_0789: dc.b $F8,"there is a drainage grate here.",0,$02,$00

_07AC: dc.b $F2,_081E-Start,(_081E-Start)/$100 ; dc.b $1E,$08

_07AF: dc.b $EE,$E9,$01,$CF,$01,$2C

_07B5: dc.b $FF,$EE,_07FB-Start,(_07FB-Start)/$100 ; dc.b $FB,$07

_07B9: dc.b $F8,"something scurries deeper into the floor drain.",0,$02,$00

_07EC: dc.b $FF,$E9,$CF,$01,$01,$3E

_07F2: dc.b $FF,$E9,$CF,$01,$03,$2C

_07F8: dc.b $F2,_081E-Start,(_081E-Start)/$100 ; dc.b $1E,$08

_07FB: dc.b $F8,"there is a drainage grate here.",0,$02,$00

_081E:

 dc.b $F1

_081F: dc.b $FF,$E9,$CF,$01,$03,$2C

_0825: dc.b $FF,$E9,$CF,$01,$01,$2C

_082B:

 dc.b $F1

_082C: dc.b $F8,"this slimy, smelly drain pipe reveals nothing.",0,$02,$00

_085E: dc.b $EE,$EF,$03,$00

_0862: dc.b $FF,$EE,_086D-Start,(_086D-Start)/$100 ; dc.b $6D,$08

_0866: dc.b $EB,$E2,$20,$03

_086A: dc.b $F7,$EF,$03

_086D:

 dc.b $F1

_086E: dc.b $EE,$EF,$03,$00

_0872: dc.b $FF,$EE,_087D-Start,(_087D-Start)/$100 ; dc.b $7D,$08

_0876: dc.b $EB,$E2,$20,$03

_087A: dc.b $F7,$EF,$03

_087D: dc.b $EE,$DD,$04,$01

_0881: dc.b $FF,$EE,_08A7-Start,(_08A7-Start)/$100 ; dc.b $A7,$08

_0885: dc.b $F8,"kobold rune for 'entrance'.",0,$02,$00

_08A4: dc.b $F2,_08C5-Start,(_08C5-Start)/$100 ; dc.b $C5,$08

_08A7: dc.b $F8,"this rune is unrecognized.",0,$02,$00

_08C5:

 dc.b $F1

_08C6: dc.b $EE,$EF,$03,$00

_08CA: dc.b $FF,$EE,_08D5-Start,(_08D5-Start)/$100 ; dc.b $D5,$08

_08CE: dc.b $EB,$E2,$20,$03

_08D2: dc.b $F7,$EF,$03

_08D5: dc.b $EE,$DD,$04,$01

_08D9: dc.b $FF,$EE,_08FF-Start,(_08FF-Start)/$100 ; dc.b $FF,$08

_08DD: dc.b $F8,"kobold rune for 'entrance'.",0,$02,$00

_08FC: dc.b $F2,_091D-Start,(_091D-Start)/$100 ; dc.b $1D,$09

_08FF: dc.b $F8,"this rune is unrecognized.",0,$02,$00

_091D:

 dc.b $F1

_091E: dc.b $EE,$F5,$05,$0C,$03,$00

_0924: dc.b $FB,$F0,$01,$00

_0928: dc.b $FF,$F9,$EE,_0962-Start,(_0962-Start)/$100 ; dc.b $62,$09

_092D: dc.b $F8,"special quest for this level!",0,$03,$00

_094E: dc.b $F6,$1C,$00,$00

_0952: dc.b $F7,$F0,$01

_0955: dc.b $ED,$05,$0C,$03

_0959: dc.b $EA,$31,$00,$0C,$03,$08

_095F: dc.b $F7,$F0,$01

_0962: dc.b $EE,$EF,$09,$00

_0966: dc.b $FF,$EE,_0971-Start,(_0971-Start)/$100 ; dc.b $71,$09

_096A: dc.b $EB,$E2,$90,$01

_096E: dc.b $F7,$EF,$09

_0971:

 dc.b $F1

_0972: dc.b $F8,"fallen rocks block the way.",0,$02,$00

_0991:

 dc.b $F1

_0992: dc.b $FF,$E9,$CA,$01,$02,$31

_0998:

 dc.b $F1

_0999: dc.b $FF,$E9,$CA,$01,$02,$45

_099F:

 dc.b $F1

_09A0: dc.b $EE,$E9,$03,$62,$00,$08

_09A6: dc.b $FF,$EE,_0A86-Start,(_0A86-Start)/$100 ; dc.b $86,$0A

_09AA: dc.b $EE,$E7,$E1,$26

_09AE: dc.b $FF,$E7,$F6,$01

_09B2: dc.b $FF,$F9,$EE,_09C3-Start,(_09C3-Start)/$100 ; dc.b $C3,$09

_09B7: dc.b $F6,$0E,$81,$00

_09BB: dc.b $FD,$62,$00

_09BE: dc.b $ED,$FF

_09C0: dc.b $F2,_0A83-Start,(_0A83-Start)/$100 ; dc.b $83,$0A

_09C3: dc.b $EE,$E7,$E1,$26

_09C7: dc.b $FF,$EE,_09E5-Start,(_09E5-Start)/$100 ; dc.b $E5,$09

_09CB: dc.b $F8,"it doesn't fit.",0,$06,$00

_09DE: dc.b $F6,$51,$81,$00

_09E2: dc.b $F2,_0A83-Start,(_0A83-Start)/$100 ; dc.b $83,$0A

_09E5: dc.b $EE,$E7,$E1,$1C

_09E9: dc.b $FF,$EE,_0A66-Start,(_0A66-Start)/$100 ; dc.b $66,$0A

_09ED: dc.b $EE,$DC,$08,$01

_09F1: dc.b $FF,$EE,_0A43-Start,(_0A43-Start)/$100 ; dc.b $43,$0A

_09F5: dc.b $F6,$51,$81,$00

_09F9: dc.b $F8,"failed lock pick attempt.",0,$05,$00

_0A16: dc.b $EE,$DB,$01,$64,$00,$01

_0A1C: dc.b $FF,$EE,_0A40-Start,(_0A40-Start)/$100 ; dc.b $40,$0A

_0A20: dc.b $F6,$52,$00,$00

_0A24: dc.b $F8,"the lock picks break!.",0,$06,$00

_0A3E: dc.b $ED,$FF

_0A40: dc.b $F2,_0A63-Start,(_0A63-Start)/$100 ; dc.b $63,$0A

_0A43: dc.b $F8,"only a thief can pick locks.",0,$06,$00

_0A63: dc.b $F2,_0A83-Start,(_0A83-Start)/$100 ; dc.b $83,$0A

_0A66: dc.b $F8,"this lock requires a key.",0,$0F,$00

_0A83: dc.b $F2,_0AA2-Start,(_0AA2-Start)/$100 ; dc.b $A2,$0A

_0A86: dc.b $F8,"the lock appears jammed.",0,$06,$00

_0AA2:

 dc.b $F1

_0AA3: dc.b $FF,$E9,$22,$00,$03,$31

_0AA9:

 dc.b $F1

_0AAA: dc.b $FF,$E9,$22,$00,$03,$45

_0AB0:

 dc.b $F1

_0AB1:

Hunk3:

 ; Nb reloc info

 dc.b $26,$00

 dc.b $F2,$02,$A8,_02CF-Start,(_02CF-Start)/$100 ; dc.b $CF,$02

 dc.b $F1,$02,$08,_0396-Start,(_0396-Start)/$100 ; dc.b $96,$03

 dc.b $AA,$01,$08,_03A6-Start,(_03A6-Start)/$100 ; dc.b $A6,$03

 dc.b $96,$02,$08,_03AB-Start,(_03AB-Start)/$100 ; dc.b $AB,$03

 dc.b $CE,$01,$60,_03BB-Start,(_03BB-Start)/$100 ; dc.b $BB,$03

 dc.b $AD,$01,$00,_03CB-Start,(_03CB-Start)/$100 ; dc.b $CB,$03

 dc.b $50,$01,$08,_03E3-Start,(_03E3-Start)/$100 ; dc.b $E3,$03

 dc.b $91,$01,$08,_0406-Start,(_0406-Start)/$100 ; dc.b $06,$04

 dc.b $B7,$01,$00,_0423-Start,(_0423-Start)/$100 ; dc.b $23,$04

 dc.b $D6,$01,$08,_0445-Start,(_0445-Start)/$100 ; dc.b $45,$04

 dc.b $36,$02,$78,_0466-Start,(_0466-Start)/$100 ; dc.b $66,$04

 dc.b $52,$02,$00,_04B3-Start,(_04B3-Start)/$100 ; dc.b $B3,$04

 dc.b $6E,$02,$00,_04BC-Start,(_04BC-Start)/$100 ; dc.b $BC,$04

 dc.b $4D,$02,$08,_04DE-Start,(_04DE-Start)/$100 ; dc.b $DE,$04

 dc.b $B2,$02,$00,_04FF-Start,(_04FF-Start)/$100 ; dc.b $FF,$04

 dc.b $BA,$02,$00,_0523-Start,(_0523-Start)/$100 ; dc.b $23,$05

 dc.b $E7,$02,$00,_0547-Start,(_0547-Start)/$100 ; dc.b $47,$05

 dc.b $C9,$02,$00,_0569-Start,(_0569-Start)/$100 ; dc.b $69,$05

 dc.b $11,$03,$00,_0591-Start,(_0591-Start)/$100 ; dc.b $91,$05

 dc.b $F0,$02,$28,_0599-Start,(_0599-Start)/$100 ; dc.b $99,$05

 dc.b $79,$02,$08,_05CA-Start,(_05CA-Start)/$100 ; dc.b $CA,$05

 dc.b $07,$03,$00,_05F2-Start,(_05F2-Start)/$100 ; dc.b $F2,$05

 dc.b $CD,$02,$00,_0634-Start,(_0634-Start)/$100 ; dc.b $34,$06

 dc.b $14,$03,$00,_067D-Start,(_067D-Start)/$100 ; dc.b $7D,$06

 dc.b $B8,$02,$00,_06BF-Start,(_06BF-Start)/$100 ; dc.b $BF,$06

 dc.b $32,$02,$00,_06F2-Start,(_06F2-Start)/$100 ; dc.b $F2,$06

 dc.b $CF,$01,$00,_0725-Start,(_0725-Start)/$100 ; dc.b $25,$07

 dc.b $8E,$01,$08,_081F-Start,(_081F-Start)/$100 ; dc.b $1F,$08

 dc.b $94,$01,$00,_082C-Start,(_082C-Start)/$100 ; dc.b $2C,$08

 dc.b $93,$01,$00,_086E-Start,(_086E-Start)/$100 ; dc.b $6E,$08

 dc.b $CF,$02,$00,_08C6-Start,(_08C6-Start)/$100 ; dc.b $C6,$08

 dc.b $0C,$03,$60,_091E-Start,(_091E-Start)/$100 ; dc.b $1E,$09

 dc.b $CA,$01,$00,_0972-Start,(_0972-Start)/$100 ; dc.b $72,$09

 dc.b $EB,$01,$08,_0992-Start,(_0992-Start)/$100 ; dc.b $92,$09

 dc.b $EA,$01,$08,_0999-Start,(_0999-Start)/$100 ; dc.b $99,$09

 dc.b $81,$00,$00,_09A0-Start,(_09A0-Start)/$100 ; dc.b $A0,$09

 dc.b $41,$00,$08,_0AA3-Start,(_0AA3-Start)/$100 ; dc.b $A3,$0A

 dc.b $21,$00,$08,_0AAA-Start,(_0AAA-Start)/$100 ; dc.b $AA,$0A

 END


Eye of the Beholder 2


The .inf file structure and data is somewhat different from its predecessor.


All offsets here are 16bit. All strings are null terminated c-strings. Filenames have usually 13 byte (8 letters + dot + 3 letters + null)


There are different data blocks:

Beginning of .inf file:

#x0000 offset to block_B

#x0002 block_A

 

block_A:

{

   subblocks belong to different sublevels:

   sub_block_A1:

   {

      #x0000 offset (relative to start of block_A) to sub_block_A2

      #x0002 control byte, when = #xEC then this block follows:

      #x0003:

      {

         #x0000: maze file name string usually "levelx.maz"; length: 13 byte

         #x000D: file name string without extention: used to load .vmp .pal; length: 13 byte

         #x001A: usually 0xFF, if not then the next 13 byte are again a string

                 without extention and used to load .pal

      }

      next: file name string without extention for sound file .adl or .snd

            -> depends on game configuration;length: 13 byte

      next: 2 bytes -> each my have the value #xEC or #xEA

 

      more to follow here (monster and decoration data)

   }

   the following blocks are optional: [

      sub_block_A2:

      {

         #x0000 offset to sub_block_A3

         ...

      }

 

      sub_block_A3

      {

         ...

      } ]

} end of block_A

 

block_B:

{

   #x0000 offset to block_C after the scripting data

   #x0002 control byte, if #xEC then this block follows:

   {

      (control byte | data byte) sequence;

      first control byte = #xFF is already next data structure

   }

   here follows: 30*monster data structure, each with length 30 byte

   after that: scripting data block:

   {

      #x0000 offset (relative to scripting data block) of the first string

      next: events

      next: strings

   }

} end of block_B

 

block_C:

{

   #x0000 number of special blocks wich follow; these link maze

          fields to scripting data and contain flags; each 6 bytes long

   #x0002 maze special 1

   #x0008 maze special 2

   #x000E maze special 3

   ...

} end of block_C

 

----

 

a maze special block has the following structure:

{

   uint16: number of block in maze (0...1023)

   uint16: flag

   uint16: offset to scripting data (relative to scripting data block)

}

 


More Eye of the beholder 2 info, nothing new here. but nice to show the data storage.

struct sMonsterGFX

{

    bool used;

    int loadProg;

    int unk0;

    u8 unk1;

    char* label;

};

struct sDice

{

    u8 count;

    u8 dice;

    u8 plus;

};

 

struct sMonsterType

{

    u8 idx; // 0

    u8 unk0; //1

    u8 THAC0; //2

    u8 unk1; //3

 

    sDice HPDice; //4

    u8 numberOfAttacks; // 7

    sDice attackDice[3]; // 16

    unsigned short specialAttackFlag; //18

    unsigned short AbilitiesFlag; // 20

    unsigned short unk2;        //22

    unsigned short EXPGain; //24

 

    u8 size;

    u8 attackSound;

    u8 moveSound;

    u8 unk3;

    // optional

        bool isAttack2;

        u8 distantAttack;

        u8 MaxAttkCnt;

        u8 attackList[4];

 

    u8 turnUndead;

    u8 unk4;

    u8 unk5[3];

 

};

 

struct sMonster

{

    u8 MoNo;

    u8 MoTime;

    short position;

    u8 subpos;

    u8 facing;

    u8 type;

    u8 pic;

    u8 phase;

    u8 pause;

    short weapon; /* Item Number */

    short pocket; /* Dropped on Monster killed */

};

 

struct sWallMapping

{

  u8 idx;

  u8 WallType;

  u8 DecorationID;

  u8 FileIndex;      // index number in DecorationFNames

  u8 unk0;

  u8 unk1;

};

 

 struct sDecorationFName

 {

  char GFXName[13];

  char DECName[13];

 };

 

 

 

struct sRectangle

{

    short x;

    short y;

    short w;

    short h;

};

 

 

struct sDoorInfo

{

    u8 cmd;

    u8 idx;

    u8 typ;

    u8 knob;

    char GFXfile[13];

 

    sRectangle doorRect[3];

    sRectangle buttionRect[2];

    u8 buttonPos[2][2];

 

};



.inf EOB2 dump with comments

EOB2 INF resourced fro assembler 68000 (To See here for all the INF files EOB2-GB-FilesToTranslate.lha

BOPT uo+

BOPT ue-

BOPT ua+

OUTPUT LEVEL10.INF.dec

;Source Created by "EOB2 Language File ReSourcerINF V2" Beta

;A Tool done by CFou! on Nov 2006

Start

Hunk0:

dc.b Hunk1-Start,(Hunk1-Start)/$100 ; dc.b $E9,$00

SubHunk0:

dc.b SubHunk1-Start-2,(SubHunk1-Start-2)/$100 ; dc.b $E7,$00

dc.b $EC

;Maze name

dc.b 'level10.maz',0,0

;VCN/VMP File name

dc.b 'mezz',0,'10.maz',0,0

;Palette File name

dc.b $01

dc.b 'azure',0,'0.maz',0,0

;Sound File name

dc.b 'azure',0,'0.maz',0,0

;Door name & Positions + offset

dc.b $EC

dc.b 'door2',0,'0.maz',0,0

dc.b $00,$00,$00,$14,$00,$47,$00,$09,$00,$46,$00,$09,$00,$8F,$00,$07

dc.b $00,$2F,$00,$10,$00,$58,$00,$04,$00,$1D,$00,$10,$00,$B3,$00,$01

dc.b $00,$0A,$00,$7E,$00,$28,$00,$11,$00,$B3,$00,$01,$00,$06,$00,$72

dc.b $00,$2A,$00

;Door name & Positions + offset

dc.b $FF

 

;Max nb Monster ????

dc.b $00,$00

;Monster file name

dc.b $FF

;Monster file name

dc.b $FF

;Monster Struct

dc.b $FF

;Decorate Structure

dc.b $EC

; Nb Decorate Block

dc.b $0C,$00

dc.b $EC

; Decorate file name

dc.b 'azure1',0,'.maz',0,0

; Decorate file name

dc.b 'azure.dec',0,'z',0,0

; Decorate Positions/offsets

dc.b $FB,$1B,$01,$11,$03,$04

dc.b $FB,$1C,$01,$12,$04,$04

dc.b $FB,$23,$00,$07,$00,$03

dc.b $FB,$24,$00,$09,$00,$03

dc.b $FB,$25,$00,$0D,$00,$03

dc.b $FB,$29,$01,$05,$00,$04

dc.b $FB,$28,$01,$03,$02,$04

dc.b $FB,$2C,$00,$FF,$00,$07

dc.b $FB,$2D,$01,$0B,$0A,$84

dc.b $FB,$2E,$01,$FF,$00,$07

dc.b $FB,$4A,$00,$FF,$00,$04

dc.b $01,$00

dc.b $03,$00

dc.b $FF,$FF,$FF,$FF

SubHunk1:

Hunk1:

dc.b Hunk3-Start,(Hunk3-Start)/$100 ; dc.b $F5,$03

dc.b $FF

Hunk2:

;TextBank Offset

dc.b TextBank-Hunk2,(TextBank-Hunk2)/$100 ; dc.b $89,$02

;Game script

_0002: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_0007: dc.b $FF,$EE,_0077-Hunk2,(_0077-Hunk2)/$100 ; ->Condition branch/case

_000B: dc.b $EE,$ED,$D2,$02,$00 ; -> Condition Test

_0010: dc.b $FF,$EE,_0027-Hunk2,(_0027-Hunk2)/$100 ; ->Condition branch/case

_0014: dc.b $F8,$00,$00,$05,$00 ; FCT: Display Message

_0019: dc.b $F6,$4F,$00,$00 ; FCT: Sound

_001D: dc.b $EC,$E5,$06,$00,$16,$02,$02 ; FCT: Change Level

_0024: dc.b $F2,_0074-Hunk2,(_0074-Hunk2)/$100 ; FCT: Jump Code

_0027: dc.b $F8,$01,$00,$0F,$00 ; FCT: Display Message

_002C: dc.b $F6,$1D,$00,$00 ; FCT: Sound

_0030: dc.b $EE,$D2,$02,$00,$D2,$00,$00 ; -> Condition Test

_0037: dc.b $FF,$EE,_0041-Hunk2,(_0041-Hunk2)/$100 ; ->Condition branch/case

_003B: dc.b $FA,$E8,$00,$00,$16,$02 ; FCT: Teleport????

_0041: dc.b $EE,$D2,$02,$00,$D2,$01,$00 ; -> Condition Test

_0048: dc.b $FF,$EE,_0052-Hunk2,(_0052-Hunk2)/$100 ; ->Condition branch/case

_004C: dc.b $FA,$E8,$00,$00,$F5,$01 ; FCT: Teleport????

_0052: dc.b $EE,$D2,$02,$00,$D2,$02,$00 ; -> Condition Test

_0059: dc.b $FF,$EE,_0063-Hunk2,(_0063-Hunk2)/$100 ; ->Condition branch/case

_005D: dc.b $FA,$E8,$00,$00,$D6,$01 ; FCT: Teleport????

_0063: dc.b $EE,$D2,$02,$00,$D2,$03,$00 ; -> Condition Test

_006A: dc.b $FF,$EE,_0074-Hunk2,(_0074-Hunk2)/$100 ; ->Condition branch/case

_006E: dc.b $FA,$E8,$00,$00,$F7,$01 ; FCT: Teleport????

_0074: dc.b $F2,_0080-Hunk2,(_0080-Hunk2)/$100 ; FCT: Jump Code

_0077: dc.b $FA,$F5 ; FCT: Teleport????

_0079: dc.b $EB,$F6,$01 ; FCT: Give Experience

_007C: dc.b $E5,$06,$16,$02 ; FCT: Wait

_0080: dc.b $F1 ; FCT: End Code

_0081: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_0086: dc.b $FF,$EE,_00F6-Hunk2,(_00F6-Hunk2)/$100 ; ->Condition branch/case

_008A: dc.b $EE,$ED,$D2,$03,$00 ; -> Condition Test

_008F: dc.b $FF,$EE,_00A6-Hunk2,(_00A6-Hunk2)/$100 ; ->Condition branch/case

_0093: dc.b $F8,$02,$00,$05,$00 ; FCT: Display Message

_0098: dc.b $F6,$4F,$00,$00 ; FCT: Sound

_009C: dc.b $EC,$E5,$0B,$00,$D1,$03,$03 ; FCT: Change Level

_00A3: dc.b $F2,_00F3-Hunk2,(_00F3-Hunk2)/$100 ; FCT: Jump Code

_00A6: dc.b $F8,$01,$00,$0F,$00 ; FCT: Display Message

_00AB: dc.b $F6,$1D,$00,$00 ; FCT: Sound

_00AF: dc.b $EE,$D2,$03,$00,$D2,$00,$00 ; -> Condition Test

_00B6: dc.b $FF,$EE,_00C0-Hunk2,(_00C0-Hunk2)/$100 ; ->Condition branch/case

_00BA: dc.b $FA,$E8,$00,$00,$F2,$03 ; FCT: Teleport????

_00C0: dc.b $EE,$D2,$03,$00,$D2,$01,$00 ; -> Condition Test

_00C7: dc.b $FF,$EE,_00D1-Hunk2,(_00D1-Hunk2)/$100 ; ->Condition branch/case

_00CB: dc.b $FA,$E8,$00,$00,$D1,$03 ; FCT: Teleport????

_00D1: dc.b $EE,$D2,$03,$00,$D2,$02,$00 ; -> Condition Test

_00D8: dc.b $FF,$EE,_00E2-Hunk2,(_00E2-Hunk2)/$100 ; ->Condition branch/case

_00DC: dc.b $FA,$E8,$00,$00,$B2,$03 ; FCT: Teleport????

_00E2: dc.b $EE,$D2,$03,$00,$D2,$03,$00 ; -> Condition Test

_00E9: dc.b $FF,$EE,_00F3-Hunk2,(_00F3-Hunk2)/$100 ; ->Condition branch/case

_00ED: dc.b $FA,$E8,$00,$00,$D3,$03 ; FCT: Teleport????

_00F3: dc.b $F2,_00FF-Hunk2,(_00FF-Hunk2)/$100 ; FCT: Jump Code

_00F6: dc.b $FA,$F5 ; FCT: Teleport????

_00F8: dc.b $EB,$D2,$03 ; FCT: Give Experience

_00FB: dc.b $E5,$0B,$D1,$03 ; FCT: Wait

_00FF: dc.b $F1 ; FCT: End Code

_0100: dc.b $EE,$E7,$F6,$D2,$FF,$FF ; -> Condition Test

_0106: dc.b $FF,$EE,_010D-Hunk2,(_010D-Hunk2)/$100 ; ->Condition branch/case

_010A: dc.b $FF,$ED,$03 ; ->Condition branch/case

_010D: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_0112: dc.b $FF,$EE,_0126-Hunk2,(_0126-Hunk2)/$100 ; ->Condition branch/case

_0116: dc.b $F6,$0F,$11,$03 ; FCT: Sound

_011A: dc.b $FF,$ED,$01 ; ->Condition branch/case

_011D: dc.b $FA,$E8,$00,$00,$01,$03 ; FCT: Teleport????

_0123: dc.b $F2,_012E-Hunk2,(_012E-Hunk2)/$100 ; FCT: Jump Code

_0126: dc.b $FA,$F5 ; FCT: Teleport????

_0128: dc.b $EB,$11,$03 ; FCT: Give Experience

_012B: dc.b $EB,$01,$03 ; FCT: Give Experience

_012E: dc.b $F1 ; FCT: End Code

_012F: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_0134: dc.b $FF,$EE,_0148-Hunk2,(_0148-Hunk2)/$100 ; ->Condition branch/case

_0138: dc.b $F6,$0F,$C5,$03 ; FCT: Sound

_013C: dc.b $FF,$ED,$01 ; ->Condition branch/case

_013F: dc.b $FA,$E8,$00,$00,$CC,$02 ; FCT: Teleport????

_0145: dc.b $F2,_0150-Hunk2,(_0150-Hunk2)/$100 ; FCT: Jump Code

_0148: dc.b $FA,$F5 ; FCT: Teleport????

_014A: dc.b $EB,$C5,$03 ; FCT: Give Experience

_014D: dc.b $EB,$CC,$02 ; FCT: Give Experience

_0150: dc.b $F1 ; FCT: End Code

_0151: dc.b $F8,$03,$00,$01,$00 ; FCT: Display Message

_0156: dc.b $F1 ; FCT: End Code

_0157: dc.b $F8,$04,$00,$01,$00 ; FCT: Display Message

_015C: dc.b $F1 ; FCT: End Code

_015D: dc.b $EE,$E9,$03,$43,$02,$D2,$08,$00 ; -> Condition Test

_0165: dc.b $FF,$F5,$01,$FF,$62,$02,$D2,$00,$00 ; ->Condition branch/case

_016E: dc.b $FB,$F9,$EE,$84,$01

_0173: dc.b $ED,$FE,$62,$02 ; FCT: Item Consume

_0177: dc.b $FD,$43,$02 ; FCT:Open Door

_017A: dc.b $E4 ; FCT: Update Screen

_017B: dc.b $E5,$01,$00 ; FCT: Wait

_017E: dc.b $FF,$E9,$41,$02,$01,$1B ; ->Condition branch/case

_0184: dc.b $F1 ; FCT: End Code

_0185: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_018A: dc.b $FF,$EE,_019F-Hunk2,(_019F-Hunk2)/$100 ; ->Condition branch/case

_018E: dc.b $F6,$0F,$65,$02 ; FCT: Sound

_0192: dc.b $FC,$43,$02 ; FCT: Close Door

_0195: dc.b $FF,$ED,$01 ; ->Condition branch/case

_0198: dc.b $FA,$E8,$00,$00,$2C,$03 ; FCT: Teleport????

_019E: dc.b $F0 ; FCT: Return

_019F: dc.b $FA,$F5 ; FCT: Teleport????

_01A1: dc.b $EB,$65,$02 ; FCT: Give Experience

_01A4: dc.b $EB,$2C,$03 ; FCT: Give Experience

_01A7: dc.b $F1 ; FCT: End Code

_01A8: dc.b $F6,$01,$0F,$01 ; FCT: Sound

_01AC: dc.b $E4 ; FCT: Update Screen

_01AD: dc.b $E5,$01,$00 ; FCT: Wait

_01B0: dc.b $FF,$E9,$0F,$01,$00,$1B ; ->Condition branch/case

_01B6: dc.b $FF,$F7,$4F,$00,$2C ; ->Condition branch/case

_01BB: dc.b $F7,$EF,$01 ; FCT: Set Flag

_01BE: dc.b $F1 ; FCT: End Code

_01BF: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_01C4: dc.b $FF,$F5,$00,$FF,$4D,$00,$D2,$00,$00 ; ->Condition branch/case

_01CD: dc.b $FF,$F9,$E0,$D2,$04,$00 ; ->Condition branch/case

_01D3: dc.b $FF,$F5,$00,$FF,$4D,$00,$D2,$01,$00 ; ->Condition branch/case

_01DC: dc.b $FF,$F9,$F1,$F1,$4D,$00,$D2,$00,$00 ; ->Condition branch/case

_01E5: dc.b $FF,$F9,$F8,$EE,_01FA-Hunk2,(_01FA-Hunk2)/$100 ; ->Condition branch/case

_01EB: dc.b $FF,$F7,$4D,$00,$24 ; ->Condition branch/case

_01F0: dc.b $F6,$0C,$4D,$00 ; FCT: Sound

_01F4: dc.b $FF,$E9,$0F,$01,$00,$1B ; ->Condition branch/case

_01FA: dc.b $EE,$E0,$D2,$02,$00 ; -> Condition Test

_01FF: dc.b $FF,$F5,$00,$FF,$4D,$00,$D2,$00,$00 ; ->Condition branch/case

_0208: dc.b $FF,$F9,$E0,$D2,$08,$00 ; ->Condition branch/case

_020E: dc.b $FF,$F5,$00,$FF,$4D,$00,$D2,$00,$00 ; ->Condition branch/case

_0217: dc.b $FF,$F9,$F1,$F1,$4D,$00,$D2,$00,$00 ; ->Condition branch/case

_0220: dc.b $FF,$F9,$F8,$EE,_0235-Hunk2,(_0235-Hunk2)/$100 ; ->Condition branch/case

_0226: dc.b $FF,$F7,$4D,$00,$23 ; ->Condition branch/case

_022B: dc.b $F6,$0C,$4D,$00 ; FCT: Sound

_022F: dc.b $FF,$E9,$0F,$01,$00,$01 ; ->Condition branch/case

_0235: dc.b $F1 ; FCT: End Code

_0236: dc.b $EE,$EF,$01,$D2,$01,$00 ; -> Condition Test

_023C: dc.b $FF,$EE,_025B-Hunk2,(_025B-Hunk2)/$100 ; ->Condition branch/case

_0240: dc.b $EE,$EF,$02,$D2,$01,$00 ; -> Condition Test

_0246: dc.b $FF,$EE,_0258-Hunk2,(_0258-Hunk2)/$100 ; ->Condition branch/case

_024A: dc.b $FF,$F7,$4F,$00,$00 ; ->Condition branch/case

_024F: dc.b $F5,$EF,$01 ; FCT: Clear Flag

_0252: dc.b $F5,$EF,$02 ; FCT: Clear Flag

_0255: dc.b $F2,_025B-Hunk2,(_025B-Hunk2)/$100 ; FCT: Jump Code

_0258: dc.b $F7,$EF,$02 ; FCT: Set Flag

_025B: dc.b $F1 ; FCT: End Code

_025C: dc.b $EE,$F7,$4F,$00,$D2,$2C,$00 ; -> Condition Test

_0263: dc.b $FF,$EE,_0288-Hunk2,(_0288-Hunk2)/$100 ; ->Condition branch/case

_0267: dc.b $EE,$E0,$D2,$01,$00 ; -> Condition Test

_026C: dc.b $FF,$EE,_0280-Hunk2,(_0280-Hunk2)/$100 ; ->Condition branch/case

_0270: dc.b $F6,$0F,$4F,$00 ; FCT: Sound

_0274: dc.b $FF,$ED,$01 ; ->Condition branch/case

_0277: dc.b $FA,$E8,$00,$00,$2C,$03 ; FCT: Teleport????

_027D: dc.b $F2,_0288-Hunk2,(_0288-Hunk2)/$100 ; FCT: Jump Code

_0280: dc.b $FA,$F5 ; FCT: Teleport????

_0282: dc.b $EB,$6F,$02 ; FCT: Give Experience

_0285: dc.b $EB,$2C,$03 ; FCT: Give Experience

_0288: dc.b $F1 ; FCT: End Code

 

;TextBank

TextBank:

dc.b 'going down...',0

dc.b 'you can',"'",'t go that way.',0

dc.b 'going up...',0

dc.b 'the plaque reads: you will pay for your freedom...',0

dc.b 'the plaque reads: one item.',0

Hunk3:

;Special Maze Blocks Bank (offset)

; Nb Special Maze Blocks

dc.b $0C,$00

; Special Maze Blocks List:

dc.b $F6,$01,$A8,$00,_0002-Hunk2,(_0002-Hunk2)/$100 ; dc.b $02,$00

dc.b $D2,$03,$A8,$00,_0081-Hunk2,(_0081-Hunk2)/$100 ; dc.b $81,$00

dc.b $11,$03,$A8,$00,_0100-Hunk2,(_0100-Hunk2)/$100 ; dc.b $00,$01

dc.b $C5,$03,$A8,$00,_012F-Hunk2,(_012F-Hunk2)/$100 ; dc.b $2F,$01

dc.b $A4,$01,$00,$00,_0151-Hunk2,(_0151-Hunk2)/$100 ; dc.b $51,$01

dc.b $21,$02,$00,$00,_0157-Hunk2,(_0157-Hunk2)/$100 ; dc.b $57,$01

dc.b $41,$02,$00,$00,_015D-Hunk2,(_015D-Hunk2)/$100 ; dc.b $5D,$01

dc.b $65,$02,$A8,$00,_0185-Hunk2,(_0185-Hunk2)/$100 ; dc.b $85,$01

dc.b $0F,$01,$00,$00,_01A8-Hunk2,(_01A8-Hunk2)/$100 ; dc.b $A8,$01

dc.b $4D,$00,$78,$00,_01BF-Hunk2,(_01BF-Hunk2)/$100 ; dc.b $BF,$01

dc.b $01,$00,$00,$00,_0236-Hunk2,(_0236-Hunk2)/$100 ; dc.b $36,$02

dc.b $4F,$00,$A8,$00,_025C-Hunk2,(_025C-Hunk2)/$100 ; dc.b $5C,$02

END

There is some sample source code for reading the inf file of EOB2 available here: Eob2InfReading.

Discussions

Zetr0

inf structures

Zetr0 15 July 2006 12:14:27

Theres a lot of differnet structures within an INF file, with this in mind when depicting (graphicaly or code / explination) would it be benifical to have .inf( wall struct ), .inf( monster struct ) or .inf( command code )

I could put some docs together that can be referenced from the INF page. what you you think?

Xyquaatu

Xyquaatu 15 July 2006 19:45:20

seems to be a good idea.

Zetr0

command code 0xfb confusion

Zetr0 16 July 2006 22:19:40

Within the body the statement of 0xFB is the code for the remaining wall data/structure, but lower down within the command code(s) snippet 0xfb = monster data code.

is this a version / platform occurance or just a little typo crazyness lol ?

bitnapper

bitnapper 17 July 2006 19:40:36

It's just by chance. Negative Numbers seem to be taken as 'sign' code - for reading in inf-File data as well as for Event-Code.

DK2

0xfb - Monster Creation

DK2 21 July 2006 13:40:38

If someone can check this event and put the spec better :) (like other events)

JackAsser

JackAsser 21 July 2006 20:04:06

I will! :D

DK2

Length of this page

DK2 21 July 2006 13:47:12

I think it's better to split and reduce this page.
The partially inf decompile can be putted into a file to download, and maybe split all events in a separate page.

JackAsser

JackAsser 21 July 2006 20:03:39

Yup, I agree. I'll continue reverse engineer the byte code interpreter for the events after my vacation.

LaZiR

xanatha maz?

LaZiR 26 September 2008 09:23:26

What does
brick1,0,maz
xanatha,0,maz mean?

The Filename which it should refer to should be brick1.cps or xanatha.cps

The .DAT file is stored correctly as brick.dat or xanatha.dat

i am a little confused right now.

I will hope, that you can help me with that.

JackAsser

JackAsser 29 September 2008 09:33:27

What exactly are you asking? And from where are you quoting the info? Please refine the question. :D

LaZiR

Door Rectangles (EOB1 PC)

LaZiR 02 October 2008 08:41:25

Does anyone know where the door rectangles are stored in the pc version?

JackAsser

JackAsser 02 October 2008 10:56:23

Same as the Amiga version. In the corresponding .dat files.

LaZiR

WallMapping unknownFlags2

LaZiR 06 October 2008 14:14:21

I assume Bit 2 in unknownFlags2 is set if a wallmapping is passable.

JackAsser

JackAsser 07 October 2008 08:58:31

From the JAD-sources (which are highly incomplete but at least the author used the disassembly as source) I have:



/* Wall-Types: Who can pass */
#define WF_PASSALL 0x07 /* Can be passed by all */
#define WF_PARTYPASS 0x01 /* Can be passed by the player, big item */
#define WF_SMALLPASS 0x02 /* Can be passed by a small item */
#define WF_MONSTERPASS 0x04 /* Can be passed by a monster */
#define WF_ISDOOR 0x08 /* Is a door */
#define WF_DOOROPEN 0x10 /* The door is open */
#define WF_DOORCLOSED 0x20 /* The door is closed */
#define WF_DOORKNOB 0x40 /* The door has a knob */
#define WF_ONLYDEC 0x80 /* No wall, only decoration, items visi */
#define WF_PASSNONE 0x00 /* Can be passed by no one */


/* Wall-Types: Kind */
#define WT_SOLID 0x01 /* Is a solid wall, draw top */
#define WT_SELFDRAW 0x02 /* Is a stair, for example, no bottom */
#define WT_DOORSTUCK 0x04 /* The door is stuck */
#define WT_DOORMOVES 0x08 /* The door is open */
#define WT_DOOROPEN 0x10 /* The door is open */
#define WT_DOORCLOSED 0x20 /* The door is closed */

inigomartinez

Updated INF page

inigomartinez 26 December 2009 16:19:47

I have been looking JackAsser's library and I have updated the inf file with things he has figured out.

Some notes:
- Position shouldn't have any bit active after the 10th bit. (5 for y + 5 for x).- Values sign as noted in the updated page.
- Is monster struct saved in the save file like items, so that's why some fields should be signed.
- Why are there 30 monster structs ? Couldn't be this value hardcoded in the unknown fields ?
- What about monster compression ? How does it work ? Against what data ?
- Where does point triggers offset ? And offset after some text fields ?

I have been reading, and trying these new discoveries but I have to do more tests.

Anyway, thank you very much JackAsser!

JackAsser

JackAsser 27 December 2009 12:15:20

Thank you very much! :D

Agree about positions, however I've seen position at 0xffff, but only for items. This seems to be template items that are copied into free item slots when items are spawned by the command codes in the scripts.

I don't know how monsters are saved, I only guessed.

The 30 monster structs are just hard coded, all .inf-files always have 30 monsters. Maybe it is dynamic but apparantly the original creators made the array static.

The monster compression value info I grabbed from another source who tried to reverse engineer the game, I don't know the meaning of that value, but my initial guess is that it is not compression but how the monsters are layouted in the .cps-files. There seems to be two different kind of layouts. Maybe you could correlate and see if my assumption is correct.

Point triggers? You mean the trigger list at the end of the .inf file. This is a list with event mask bits. The event mask bits are tested for each position depeding on item dropped, item taken, party enter tile, party leave tile etc. If the event trigger is correct the script at the offset it points to will get executed.

frankie_xo

unsigned char unknown[5];

frankie_xo 05 February 2014 22:07:30

I still have no idea about this part. But it looks to my like set of two 3-state flags. See the table below.

lvl PC&Amiga Sega
1 00 19 01 23 FF 00 01 01 00 FF
2 00 23 01 19 FF 00 00 01 01 FF
3 00 23 01 19 FF 00 00 01 01 FF
4 00 0F 01 19 FF 00 00 01 01 FF
5 00 19 01 0F FF 00 01 01 02 FF
6 00 19 01 19 FF 00 01 01 01 FF
7 00 19 01 19 FF 00 01 01 01 FF
8 00 19 01 0F FF 00 01 01 02 FF
9 00 23 01 0F FF 00 00 01 01 FF
10 00 19 01 0F FF 00 01 01 01 FF
11 00 23 01 19 FF 00 00 01 01 FF
12 00 0F 01 23 FF 00 01 01 00 FF

Sega version uses another values for 3 states of the flag. But there is one interesting fact: Levels 1,2,3,5,6,7,8,11 have the same states on PC and Sega but flag for levels 4,9,10,12 are different (one flag is in different state)

There are two monster types and the record is in moster section of inf file. Therefore I think that the flags are connected with moster type.

frankie_xo

frankie_xo 06 February 2014 11:14:57

If the theory with monster flag is correct then there are three intial groups:

State 1 (0F/02):
spider (lvl4/lvl5), hellhnd, disbeast, mantis, xanath
- On Sega CD it is only spider (lvl5) and hellhoud. Disbeast, mantis, xanath goes into group 2 and spider (lvl4) into group 3

State 2 (19/01):
kobold, skeleton, flind, dwarf, kenku, mage, drawelf, skelwar, drider, shindia, mflayer

State 3 (23/00):
leech, zombie, kuotoa, rust, xorn, golem

Note: 2nd Flag in lvl4 has no meaning as there are only spiders

Surrano

MonsterType refinements

Surrano 27 June 2017 11:10:40

I'm guessing the second byte called "unk0" in MonsterType is the AC of the monster. I only checked level 7 (mantis:5 and wasp:4) and they match the monstrous manual.
Also, I'm interested in specialAttacksFlags and AttributesFlags if someone decoded them. I'm guessing the latter consists of the following bits:
00 aa bb cc
where aa, bb, cc are the flags for attacks 1, 2, and 3, respectively, 10 meaning paralysis, 11 meaning poison (or possibly: poison *and* paralysis).
The second byte is either unused or used if there's an attack2 for the creature.
I will check more monsters to refine these guesses.