diff options
Diffstat (limited to 'engines')
| -rw-r--r-- | engines/agos/agos.h | 1 | ||||
| -rw-r--r-- | engines/agos/debug.cpp | 111 | 
2 files changed, 86 insertions, 26 deletions
diff --git a/engines/agos/agos.h b/engines/agos/agos.h index d693c96c8b..36e2e5dcbc 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -593,6 +593,7 @@ protected:  	Subroutine *getSubroutineByID(uint subroutine_id);  	/* used in debugger */ +	void dumpAllSubroutines();  	void dumpSubroutines();  	void dumpSubroutine(Subroutine *sub);  	void dumpSubroutineLine(SubroutineLine *sl, Subroutine *sub); diff --git a/engines/agos/debug.cpp b/engines/agos/debug.cpp index c424082d03..cc600f4ff2 100644 --- a/engines/agos/debug.cpp +++ b/engines/agos/debug.cpp @@ -198,6 +198,15 @@ void AGOSEngine::dumpSubroutines() {  	}  } +void AGOSEngine::dumpAllSubroutines() { +	for (int i = 0; i < 65536; i++) { +		Subroutine *sub = getSubroutineByID(i); +		if (sub != NULL) { +			dumpSubroutine(sub); +		} +	} +} +  void AGOSEngine::dumpVideoScript(const byte *src, bool one_opcode_only) {  	uint opcode;  	const char *str, *strn; @@ -278,26 +287,75 @@ void AGOSEngine::dumpVgaFile(const byte *vga) {  	int count;  	pp = vga; -	p = pp + READ_BE_UINT16(pp + 4); -	count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->animationCount); -	p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->animationTable); -	while (--count >= 0) { -		int id = READ_BE_UINT16(&((const AnimationHeader_Simon *) p)->id); - -		dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const AnimationHeader_Simon *) p)->scriptOffs), id / 100, id); -		p += sizeof(AnimationHeader_Simon); +	if (getGameType() == GType_FF || getGameType() == GType_PP) { +		p = pp + READ_LE_UINT16(pp + 2); +		count = READ_LE_UINT16(&((const VgaFileHeader2_Feeble *) p)->animationCount); +		p = pp + READ_LE_UINT16(&((const VgaFileHeader2_Feeble *) p)->animationTable); + +		while (--count >= 0) { +			int id = READ_LE_UINT16(&((const AnimationHeader_Feeble *) p)->id); + +			dumpVgaScriptAlways(vga + READ_LE_UINT16(&((const AnimationHeader_Feeble *) p)->scriptOffs), id / 100, id); +			p += sizeof(AnimationHeader_Feeble); +		} +	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { +		p = pp + READ_BE_UINT16(pp + 4); +		count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->animationCount); +		p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->animationTable); + +		while (--count >= 0) { +			int id = READ_BE_UINT16(&((const AnimationHeader_Simon *) p)->id); + +			dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const AnimationHeader_Simon *) p)->scriptOffs), id / 100, id); +			p += sizeof(AnimationHeader_Simon); +		} +	} else { +		p = pp + READ_BE_UINT16(pp + 10) + 20; +		count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->animationCount); +		p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->animationTable); + +		while (--count >= 0) { +			int id = READ_BE_UINT16(&((const AnimationHeader_WW *) p)->id); + +			dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const AnimationHeader_WW *) p)->scriptOffs), id / 100, id); +			p += sizeof(AnimationHeader_WW); +		}  	}  	pp = vga; -	p = pp + READ_BE_UINT16(pp + 4);; -	count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageCount); -	p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageTable); +	if (getGameType() == GType_FF || getGameType() == GType_PP) { +		p = pp + READ_BE_UINT16(pp + 2);; +		count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageCount); +		p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageTable); -	while (--count >= 0) { -		int id = READ_BE_UINT16(&((const ImageHeader_Simon *) p)->id); +		while (--count >= 0) { +			int id = READ_BE_UINT16(&((const ImageHeader_Feeble *) p)->id); -		dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const ImageHeader_Simon *) p)->scriptOffs), id / 100, id); -		p += sizeof(ImageHeader_Simon); +			dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const ImageHeader_Feeble *) p)->scriptOffs), id / 100, id); +			p += sizeof(ImageHeader_Feeble); +		} +	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { +		p = pp + READ_BE_UINT16(pp + 4);; +		count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageCount); +		p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageTable); + +		while (--count >= 0) { +			int id = READ_BE_UINT16(&((const ImageHeader_Simon *) p)->id); + +			dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const ImageHeader_Simon *) p)->scriptOffs), id / 100, id); +			p += sizeof(ImageHeader_Simon); +		} +	} else { +		p = pp + READ_BE_UINT16(pp + 10) + 20; +		count = READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageCount); +		p = pp + READ_BE_UINT16(&((const VgaFileHeader2_Common *) p)->imageTable); + +		while (--count >= 0) { +			int id = READ_BE_UINT16(&((const ImageHeader_WW *) p)->id); + +			dumpVgaScriptAlways(vga + READ_BE_UINT16(&((const ImageHeader_WW *) p)->scriptOffs), id / 100, id); +			p += sizeof(ImageHeader_WW); +		}  	}  } @@ -376,8 +434,7 @@ void AGOSEngine::dumpBitmap(const char *filename, const byte *offs, int w, int h  		for (i = 0; i != w; i++) {  			byte *c = vc10_depackColumn(&state);  			for (j = 0; j != h; j++) { -				byte pix = c[j]; -				b[j * w + i] = pix; +				b[j * w + i] = c[j];  			}  		}  	} else { @@ -435,7 +492,6 @@ void palLoad(byte *pal, const byte *vga1, int a, int b) {  }  void AGOSEngine::dumpVgaBitmaps(const byte *vga, byte *vga1, int res) { -  	int i;  	uint32 offs;  	const byte *p2; @@ -449,20 +505,24 @@ void AGOSEngine::dumpVgaBitmaps(const byte *vga, byte *vga1, int res) {  	int width, height, flags; -	i = 538; -  	for (i = 1; ; i++) {  		p2 = vga + i * 8; -		offs = READ_BE_UINT32(p2); +		offs = readUint32Wrapper(p2);  		/* try to detect end of images.  		 * assume the end when offset >= 200kb */ -		if (offs >= 200*1024) +		if (offs >= 204800)  			return; -		width = READ_BE_UINT16(p2 + 6); -		height = p2[5]; -		flags = p2[4]; +		if (getGameType() == GType_FF || getGameType() == GType_PP) { +			width = READ_LE_UINT16(p2 + 6); +			height = READ_LE_UINT16(p2 + 4) & 0x7FFF; +			flags = p2[5]; +		} else { +			width = READ_BE_UINT16(p2 + 6) / 16; +			height = p2[5]; +			flags = p2[4]; +		}  		printf("Image %d. Width=%d, Height=%d, Flags=0x%X\n", i, width, height, flags); @@ -475,7 +535,6 @@ void AGOSEngine::dumpVgaBitmaps(const byte *vga, byte *vga1, int res) {  #endif  		dumpBitmap(buf, vga + offs, width, height, flags, pal, 0); -  	}  }  | 
