[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