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)
graphics data name, 12 bytes containing a null terminated string. Points to a .cps file containg wall graphics data.
rectangles data name, 12 bytes containing a null terminated string. Points to a .dat file containing rectangular data that point into the graphics 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.