[Scummvm-cvs-logs] CVS: scummex akos.cpp,NONE,1.1 akos.h,NONE,1.1 Makefile,1.11,1.12 resource.h,1.29,1.30 scummex.cpp,1.27,1.28 scummex.h,1.16,1.17 wxwindows.cpp,1.37,1.38 wxwindows.h,1.18,1.19

Eugene Sandulenko sev at users.sourceforge.net
Sat Jul 3 07:48:15 CEST 2004


Update of /cvsroot/scummvm/scummex
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21701

Modified Files:
	Makefile resource.h scummex.cpp scummex.h wxwindows.cpp 
	wxwindows.h 
Added Files:
	akos.cpp akos.h 
Log Message:
Preliminary version of AKOS sript decompiler. Doesn't produce correct output
yet.


--- NEW FILE: akos.cpp ---
/* ScummEX - Viewer for Scumm data files
 * Copyright (C) 2004 The ScummVM project
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummex/akos.cpp,v 1.1 2004/07/03 14:47:43 sev Exp $
 *
 */

#include "file.h"
#include "wxwindows.h"
#include "akos.h"

#define GW(o) ((int16)READ_LE_UINT16(curpos+(o)))
#define GUW(o) READ_LE_UINT16(curpos+(o))
#define GB(o) *(curpos+(o))

enum AkosOpcodes {
	AKC_Return = 0xC001,
	AKC_SetVar = 0xC010,
	AKC_CmdQue3 = 0xC015,
	AKC_ComplexChan = 0xC020,
	AKC_Jump = 0xC030,
	AKC_JumpIfSet = 0xC031,
	AKC_AddVar = 0xC040,
	AKC_Ignore = 0xC050,
	AKC_IncVar = 0xC060,
	AKC_CmdQue3Quick = 0xC061,
	AKC_JumpStart = 0xC070,
	AKC_JumpE = 0xC070,
	AKC_JumpNE = 0xC071,
	AKC_JumpL = 0xC072,
	AKC_JumpLE = 0xC073,
	AKC_JumpG = 0xC074,
	AKC_JumpGE = 0xC075,
	AKC_StartAnim = 0xC080,
	AKC_StartVarAnim = 0xC081,
	AKC_Random = 0xC082,
	AKC_SetActorClip = 0xC083,
	AKC_StartAnimInActor = 0xC084,
	AKC_SetVarInActor = 0xC085,
	AKC_HideActor = 0xC086,
	AKC_SetDrawOffs = 0xC087,
	AKC_JumpTable = 0xC088,
	AKC_SoundStuff = 0xC089,
	AKC_Flip = 0xC08A,
	AKC_Cmd3 = 0xC08B,
	AKC_Ignore3 = 0xC08C,
	AKC_Ignore2 = 0xC08D,
	AKC_SkipStart = 0xC090,
	AKC_SkipE = 0xC090,
	AKC_SkipNE = 0xC091,
	AKC_SkipL = 0xC092,
	AKC_SkipLE = 0xC093,
	AKC_SkipG = 0xC094,
	AKC_SkipGE = 0xC095,
	AKC_ClearFlag = 0xC09F,
	AKC_EndSeq = 0xC0FF
};


void Akos::DecompAKSQ(File& _input, int size) {
	byte *mem, *curpos;
	int len;
	byte tmp;
	char buffer[1024];
	
	len = size;
	mem = (byte *)malloc(size);
	_input.read(mem, size);

	curpos = mem + 8;

	_gui->DisplayViewer("AKOS Decompilation", 600, 400, "");

	while (curpos < mem + len) {
		int code = *curpos;

		if (code & 0x80)
			code = (code << 8) | *(curpos + 1);
		/*
		switch (code) {
			case AKC_JumpIfSet:
			case AKC_AddVar:
			case AKC_SetVar:
			case AKC_SkipGE:
			case AKC_SkipG:
			case AKC_SkipLE:
			case AKC_SkipL:

			case AKC_SkipNE:
			case AKC_SkipE:
				curpos += 5;
				break;
			case AKC_JumpTable:
			case AKC_SetActorClip:
			case AKC_Ignore3:
			case AKC_Ignore2:
			case AKC_Ignore:
			case AKC_StartAnim:
			case AKC_StartVarAnim:
			case AKC_CmdQue3:
				curpos += 3;
				break;
			case AKC_SoundStuff:
				//if (_features & GF_HUMONGOUS) 
				//	curpos += 6;
				//else
				//	curpos += 8;
				break;
			case AKC_Cmd3:
			case AKC_SetVarInActor:
			case AKC_SetDrawOffs:
				curpos += 6;
				break;
			case AKC_ClearFlag:
			case AKC_HideActor:
			case AKC_IncVar:
			case AKC_CmdQue3Quick:
			case AKC_Return:
			case AKC_EndSeq:
				curpos += 2;
				break;
			case AKC_JumpGE:
			case AKC_JumpG:
			case AKC_JumpLE:
			case AKC_JumpL:
			case AKC_JumpNE:
			case AKC_JumpE:
			case AKC_Random:
				curpos += 7;
				break;
			case AKC_Flip:
			case AKC_Jump:
			case AKC_StartAnimInActor:
				curpos += 4;
				break;
			case AKC_ComplexChan:
				curpos += 3;
				tmp = *(curpos - 1);
				while (--tmp >= 0) {
					curpos += 4;
					curpos += (*curpos & 0x80) ? 2 : 1;
				}
				break;
			default:
				if ((code & 0xC000) == 0xC000)
					error("akos_increaseAnim: invalid code %x", code);
				curpos += (code & 0x8000) ? 2 : 1;
		}
		*/
		if (curpos != mem + len)
			curpos += (code & 0x8000) ? 2 : 1;
		code = *curpos;

		if (code & 0x80)
			code = (code << 8) | *(curpos + 1);

		switch (code) {
		case AKC_StartAnimInActor:
			sprintf(buffer, "StartAnimActor(animVar[%d], animVar[%d]);\n", GB(2), GB(3));
			break;

		case AKC_Random:
			sprintf(buffer, "Random(animVar[%d], [%d, %d];\n", GB(6), GW(2), GW(4));
			break;

		case AKC_JumpGE:
			sprintf(buffer, "if (animVar[%d} >= %d) goto %d;\n", GB(4), GW(5), GUW(2));
			break;

		case AKC_JumpG:
			sprintf(buffer, "if (animVar[%d} > %d) goto %d;\n", GB(4), GW(5), GUW(2));
			break;

		case AKC_JumpLE:
			sprintf(buffer, "if (animVar[%d} <= %d) goto %d;\n", GB(4), GW(5), GUW(2));
			break;

		case AKC_JumpL:
			sprintf(buffer, "if (animVar[%d} < %d) goto %d;\n", GB(4), GW(5), GUW(2));
			break;

		case AKC_JumpNE:
			sprintf(buffer, "if (animVar[%d} != %d) goto %d;\n", GB(4), GW(5), GUW(2));
			break;

		case AKC_JumpE:
			sprintf(buffer, "if (animVar[%d} == %d) goto %d;\n", GB(4), GW(5), GUW(2));
			break;

		case AKC_IncVar:
			sprintf(buffer, "animVar[0]++;\n");
			break;

		case AKC_SetVar:
			sprintf(buffer, "AnimVar[%d] = %d;\n", GB(4), GW(2));
			break;

		case AKC_AddVar:
			sprintf(buffer, "AnimVar[%d] += %d;\n", GB(4), GW(2));
			break;

		case AKC_Flip:
			sprintf(buffer, "Flip(%d);\n", GW(2));
			break;

		case AKC_CmdQue3:
			sprintf(buffer, "CmdQue3(%d);\n", GB(2));
			break;

		case AKC_CmdQue3Quick:
			sprintf(buffer, "CmdQue3Quick();\n");
			break;

		case AKC_StartAnim:
			sprintf(buffer, "StartAnim(%d);\n", GB(2));
			break;

		case AKC_StartVarAnim:
			sprintf(buffer, "StartVarAnim(animVar(%d));\n", GB(2));
			break;

		case AKC_SetVarInActor:
			sprintf(buffer, "actor[animVar[%d]]->animVar[%d] = %d;\n", GB(2), GB(3), GW(4));
			break;

		case AKC_HideActor:
			sprintf(buffer, "HideActor();\n");
			break;

		case AKC_SetActorClip:
			sprintf(buffer, "SetActorClip(%d);\n", GB(2));
			break;

		case AKC_SoundStuff:
			sprintf(buffer, "SoundStuff(...);\n");
			break;

		case AKC_SetDrawOffs:
			sprintf(buffer, "SetDrawOffs(%d, %d);\n", GW(2), GW(4));
			break;

		case AKC_JumpTable:
			sprintf(buffer, "JumpTable(%d); // See AKFO table\n", GB(2));
			break;

		case AKC_JumpIfSet:
			sprintf(buffer, "if (animVar[%d]) { animVar[%d] = 0; goto %d; }\n", GB(4), GB(4), GUW(2));
			break;

		case AKC_ClearFlag:
			sprintf(buffer, "ClearFlag();\n");
			break;

		case AKC_Jump:
			sprintf(buffer, "goto %d;\n", GUW(2));
			break;

		case AKC_Return:
			sprintf(buffer, "Return();\n");
			break;

		case AKC_EndSeq:
			sprintf(buffer, "EndSeq();\n");
			break;

		case AKC_ComplexChan:
			sprintf(buffer, "ComplexChan(...);\n");
			break;

		case AKC_Cmd3:
			sprintf(buffer, "Cmd3();\n");
			break;

		case AKC_Ignore:
			sprintf(buffer, "Ignore();\n");
			break;

		case AKC_Ignore2:
			sprintf(buffer, "Ingore2();\n");
			break;

		case AKC_Ignore3:
			sprintf(buffer, "Ignore3();\n");
			break;

		case AKC_SkipE:
			sprintf(buffer, "if (animVar[%d] == %d) SetFlag();\n");
			break;

		case AKC_SkipNE:
			sprintf(buffer, "if (animVar[%d] != %d) SetFlag();\n");
			break;

		case AKC_SkipL:
			sprintf(buffer, "if (animVar[%d] < %d) SetFlag();\n");
			break;

		case AKC_SkipLE:
			sprintf(buffer, "if (animVar[%d] <= %d) SetFlag();\n");
			break;

		case AKC_SkipG:
			sprintf(buffer, "if (animVar[%d] > %d) SetFlag();\n");
			break;

		case AKC_SkipGE:
			sprintf(buffer, "if (animVar[%d] >= %d) SetFlag();\n");
			break;

		default:
			sprintf(buffer, "Unknown%x()\n", code);
			break;
		}

		_gui->AppendText(buffer);
	}
}


--- NEW FILE: akos.h ---
/* ScummEX - Viewer for Scumm data files
 * Copyright (C) 2004 The ScummVM project
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header: /cvsroot/scummvm/scummex/akos.h,v 1.1 2004/07/03 14:47:43 sev Exp $
 *
 */

#ifndef _AKOS_H
#define _AKOS_H

class Akos {
 public:
	void DecompAKSQ(File& _input, int size);
};

#endif

Index: Makefile
===================================================================
RCS file: /cvsroot/scummvm/scummex/Makefile,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- Makefile	11 May 2004 02:22:26 -0000	1.11
+++ Makefile	3 Jul 2004 14:47:43 -0000	1.12
@@ -13,7 +13,7 @@
 
 RESSW    := --define __WIN32__ --define __WIN95__ --define __GNUWIN32__
 REZ_CMD  := `wx-config --rezflags`
-OBJS     := file.o scummex.o resource.o image.o wxwindows.o descumm.o descumm6.o codec37.o codec47.o bomp.o scaler.o util.o
+OBJS     := file.o scummex.o resource.o image.o wxwindows.o descumm.o descumm6.o codec37.o codec47.o bomp.o scaler.o util.o akos.o
 CXXFLAGS := -DOSUNIX -g -O -Wall -Wuninitialized -Wshadow -Wno-unused-variable -Wno-long-long -Wno-multichar -Wno-unknown-pragmas
 CXXFLAGS += `wx-config --cxxflags` `sdl-config --cflags`
 LIBS     := `wx-config --libs` `sdl-config --libs`

Index: resource.h
===================================================================
RCS file: /cvsroot/scummvm/scummex/resource.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- resource.h	26 Jun 2004 08:32:27 -0000	1.29
+++ resource.h	3 Jul 2004 14:47:43 -0000	1.30
@@ -160,7 +160,7 @@
 	{93, "AKOF", "AKOS Offset", 0, "", 47},
 	{94, "AKCI", "AKOS Costume Info", 0, "", 47},
 	{95, "AKCD", "", 0, "", 47},
-	{96, "AKSQ", "", 0, "", 47},
+	{96, "AKSQ", "AKOS Script", 0, "", 50},
 	{97, "AKCH", "", 0, "", 47},
 	{98, "ANIM", "SMUSH Animation", 0, "", 55},
 	{99, "AHDR", "SMUSH Animation Header", 0, "", 1},

Index: scummex.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummex/scummex.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- scummex.cpp	29 Sep 2003 09:21:13 -0000	1.27
+++ scummex.cpp	3 Jul 2004 14:47:43 -0000	1.28
@@ -24,6 +24,7 @@
 #include "file.h"
 #include "scummex.h"
 #include "descumm.h"
+#include "akos.h"
 
 static const byte encBytesTable[] = {
 	0x00, 0x69, 0xFF
@@ -33,9 +34,11 @@
 	_image = new Image();
 	_sound = new Sound();
 	_resource = new Resource();
+	_akos = new Akos();
 }
 
 ScummEX::~ScummEX() {
+	delete _akos;
 	delete _resource;
 	delete _sound;
 	delete _image;
@@ -95,6 +98,12 @@
 	}
 }
 
+void ScummEX::DecompileAKSQ(int blockid) {
+	
+	_input.seek(_blockTable[blockid].offset, SEEK_SET);
+	_akos->DecompAKSQ(_input, _blockTable[blockid].blockSize);
+}
+
 void ScummEX::FileDump(int blockid, const char *filename) {
 
 	uint32 size = 0, tot_size = 0;

Index: scummex.h
===================================================================
RCS file: /cvsroot/scummvm/scummex/scummex.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- scummex.h	28 Sep 2003 21:49:25 -0000	1.16
+++ scummex.h	3 Jul 2004 14:47:43 -0000	1.17
@@ -27,6 +27,7 @@
 #include "image.h"
 #include "sound/sound.h"
 #include "wxwindows.h"
+#include "akos.h"
 
 class ScummEX {
 private:
@@ -40,6 +41,7 @@
 	Image *_image;
 	Sound *_sound;
 	Resource *_resource;
+	Akos *_akos;
 
 public:
 	int _scummVersion;
@@ -54,6 +56,7 @@
 	void iMUSEDump(int blockid, const char *filename);
 
 	void Descumm(int blockid);
+	void DecompileAKSQ(int blockid);
 	void iMUSEPlay(int blockid);
 	void SOUPlay(int blockid);
 	void paletteDraw(int blockid);

Index: wxwindows.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummex/wxwindows.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -d -r1.37 -r1.38
--- wxwindows.cpp	14 Feb 2004 20:51:11 -0000	1.37
+++ wxwindows.cpp	3 Jul 2004 14:47:43 -0000	1.38
@@ -518,6 +518,14 @@
 			Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
 				(wxObjectEventFunction) &MainWindow::boxesDraw );
 			break;
+
+		case AKSQ:
+			SpecButton1->SetLabel("Decompile Script");
+			SpecButton1->Show(TRUE);
+			Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
+				(wxObjectEventFunction) &MainWindow::DecompileAKSQ );
+			break;
+
 	}
 
 }
@@ -1057,6 +1065,9 @@
 void MainWindow::Descumm(wxEvent& event) {
 	g_scummex->Descumm(_blockId);
 }
+void MainWindow::DecompileAKSQ(wxEvent& event) {
+	g_scummex->DecompileAKSQ(_blockId);
+}
 void MainWindow::iMUSEPlay(wxEvent& event) {
 	g_scummex->iMUSEPlay(_blockId);
 }

Index: wxwindows.h
===================================================================
RCS file: /cvsroot/scummvm/scummex/wxwindows.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- wxwindows.h	14 Feb 2004 20:51:11 -0000	1.18
+++ wxwindows.h	3 Jul 2004 14:47:43 -0000	1.19
@@ -96,6 +96,7 @@
 	void SmushFrameDraw(wxEvent& event);
 	void objectDraw(wxEvent& event);
 	void boxesDraw(wxEvent& event);
+	void DecompileAKSQ(wxEvent& event);
 
 	void updateLabels(int blockid);
 	void updateLabel(wxStaticText *label[2], const char *title, uint32 text);





More information about the Scummvm-git-logs mailing list