[Scummvm-cvs-logs] SF.net SVN: scummvm:[39108] scummvm/trunk/engines/sci
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Wed Mar 4 06:25:31 CET 2009
Revision: 39108
http://scummvm.svn.sourceforge.net/scummvm/?rev=39108&view=rev
Author: fingolfin
Date: 2009-03-04 05:25:31 +0000 (Wed, 04 Mar 2009)
Log Message:
-----------
SCI: Moved script.cpp from scicore/ to engine/ (because its header file is there, and it seems its funcs are only called from stuff in engine/)
Modified Paths:
--------------
scummvm/trunk/engines/sci/module.mk
Added Paths:
-----------
scummvm/trunk/engines/sci/engine/script.cpp
Removed Paths:
-------------
scummvm/trunk/engines/sci/scicore/script.cpp
Copied: scummvm/trunk/engines/sci/engine/script.cpp (from rev 39105, scummvm/trunk/engines/sci/scicore/script.cpp)
===================================================================
--- scummvm/trunk/engines/sci/engine/script.cpp (rev 0)
+++ scummvm/trunk/engines/sci/engine/script.cpp 2009-03-04 05:25:31 UTC (rev 39108)
@@ -0,0 +1,482 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "sci/scicore/resource.h"
+#include "sci/engine/state.h"
+#include "common/util.h"
+
+namespace Sci {
+
+// #define SCRIPT_DEBUG
+
+#define END Script_None
+
+opcode_format formats[128][4] = {
+ /*00*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*04*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*08*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*0C*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*10*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*14*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END},
+ /*18*/
+ {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None},
+ /*1C*/
+ {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END},
+ /*20*/
+ {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END},
+ /*24 (24=ret)*/
+ {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid},
+ /*28*/
+ {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END},
+ /*2C*/
+ {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid},
+ /*30*/
+ {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
+ /*34*/
+ {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
+ /*38*/
+ {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None},
+ /*3C*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_Invalid},
+ /*40-4F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ /*50-5F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ /*60-6F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ /*70-7F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}
+};
+#undef END
+
+void script_adjust_opcode_formats(int res_version) {
+ switch (res_version) {
+ case SCI_VERSION_0:
+ case SCI_VERSION_01:
+ break;
+ case SCI_VERSION_01_VGA:
+ case SCI_VERSION_01_VGA_ODD:
+ case SCI_VERSION_1_EARLY:
+ case SCI_VERSION_1_LATE:
+ case SCI_VERSION_1_1:
+ formats[op_lofsa][0] = Script_Offset;
+ formats[op_lofss][0] = Script_Offset;
+ break;
+ default:
+ sciprintf("script_adjust_opcode_formats(): Unknown script version %d\n", res_version);
+ }
+}
+
+int script_find_selector(EngineState *s, const char *selectorname) {
+ for (uint pos = 0; pos < s->_selectorNames.size(); ++pos) {
+ if (s->_selectorNames[pos] == selectorname)
+ return pos;
+ }
+
+ warning("Could not map '%s' to any selector!", selectorname);
+
+ return -1;
+}
+
+#define FIND_SELECTOR(_slc_) map->_slc_ = script_find_selector(s, #_slc_)
+#define FIND_SELECTOR2(_slc_, _slcstr_) map->_slc_ = script_find_selector(s, _slcstr_)
+
+void script_map_selectors(EngineState *s, selector_map_t *map) {
+ FIND_SELECTOR(init);
+ FIND_SELECTOR(play);
+ FIND_SELECTOR(replay);
+ FIND_SELECTOR(x);
+ FIND_SELECTOR(y);
+ FIND_SELECTOR(z);
+ FIND_SELECTOR(priority);
+ FIND_SELECTOR(view);
+ FIND_SELECTOR(loop);
+ FIND_SELECTOR(cel);
+ FIND_SELECTOR(brLeft);
+ FIND_SELECTOR(brRight);
+ FIND_SELECTOR(brTop);
+ FIND_SELECTOR(brBottom);
+ FIND_SELECTOR(xStep);
+ FIND_SELECTOR(yStep);
+ FIND_SELECTOR(nsBottom);
+ FIND_SELECTOR(nsTop);
+ FIND_SELECTOR(nsLeft);
+ FIND_SELECTOR(nsRight);
+ FIND_SELECTOR(font);
+ FIND_SELECTOR(text);
+ FIND_SELECTOR(type);
+ FIND_SELECTOR(state);
+ FIND_SELECTOR(doit);
+ FIND_SELECTOR2(delete_, "delete");
+ FIND_SELECTOR(signal);
+ FIND_SELECTOR(underBits);
+ FIND_SELECTOR(canBeHere);
+ FIND_SELECTOR(client);
+ FIND_SELECTOR(dx);
+ FIND_SELECTOR(dy);
+ FIND_SELECTOR(xStep);
+ FIND_SELECTOR(yStep);
+ FIND_SELECTOR2(b_movCnt, "b-moveCnt");
+ FIND_SELECTOR2(b_i1, "b-i1");
+ FIND_SELECTOR2(b_i2, "b-i2");
+ FIND_SELECTOR2(b_di, "b-di");
+ FIND_SELECTOR2(b_xAxis, "b-xAxis");
+ FIND_SELECTOR2(b_incr, "b-incr");
+ FIND_SELECTOR(completed);
+ FIND_SELECTOR(illegalBits);
+ FIND_SELECTOR(dispose);
+ FIND_SELECTOR(prevSignal);
+ FIND_SELECTOR(message);
+ FIND_SELECTOR(modifiers);
+ FIND_SELECTOR(cue);
+ FIND_SELECTOR(owner);
+ FIND_SELECTOR(handle);
+ FIND_SELECTOR(number);
+ FIND_SELECTOR(max);
+ FIND_SELECTOR(cursor);
+ FIND_SELECTOR(claimed);
+ FIND_SELECTOR(edgeHit);
+ FIND_SELECTOR(wordFail);
+ FIND_SELECTOR(syntaxFail);
+ FIND_SELECTOR(semanticFail);
+ FIND_SELECTOR(cycler);
+ FIND_SELECTOR(elements);
+ FIND_SELECTOR(lsTop);
+ FIND_SELECTOR(lsBottom);
+ FIND_SELECTOR(lsLeft);
+ FIND_SELECTOR(lsRight);
+ FIND_SELECTOR(baseSetter);
+ FIND_SELECTOR(who);
+ FIND_SELECTOR(distance);
+ FIND_SELECTOR(mover);
+ FIND_SELECTOR(looper);
+ FIND_SELECTOR(isBlocked);
+ FIND_SELECTOR(heading);
+ FIND_SELECTOR(mode);
+ FIND_SELECTOR(caller);
+ FIND_SELECTOR(moveDone);
+ FIND_SELECTOR(vol);
+ FIND_SELECTOR(pri);
+ FIND_SELECTOR(min);
+ FIND_SELECTOR(sec);
+ FIND_SELECTOR(frame);
+ FIND_SELECTOR(dataInc);
+ FIND_SELECTOR(size);
+ FIND_SELECTOR(palette);
+ FIND_SELECTOR(moveSpeed);
+ FIND_SELECTOR(cantBeHere);
+ FIND_SELECTOR(nodePtr);
+ FIND_SELECTOR(flags);
+ FIND_SELECTOR(points);
+}
+
+int sci_hexdump(byte *data, int length, int offsetplus) {
+ char tempstr[40];
+ int i;
+
+ for (i = 0; i < length; i += 8) {
+ int j;
+
+ sprintf(tempstr, "%04x: ", i + offsetplus);
+ for (j = 0; j < MIN(8, length - i); j++)
+ sprintf(tempstr + 6 + (j*3) + (j > 3), "%02x ", data[i+j]);
+ for (j = 0; j < MIN(8, length - i); j++) {
+ int thechar;
+ thechar = data[i+j];
+ sprintf(tempstr + 31 + j, "%c", ((thechar < ' ') || (thechar > 127)) ? '.' : thechar);
+ }
+
+ for (j = 0; j < 38; j++)
+ if (!tempstr[j])
+ tempstr[j] = ' '; // get rid of sprintf's \0s
+
+ sciprintf("%s\n", tempstr);
+ }
+
+ return 0;
+}
+
+static void script_dump_object(char *data, int seeker, int objsize, const Common::StringList &selectorNames) {
+ int selectors, overloads, selectorsize;
+ int species = getInt16((unsigned char *) data + 8 + seeker);
+ int superclass = getInt16((unsigned char *) data + 10 + seeker);
+ int namepos = getInt16((unsigned char *) data + 14 + seeker);
+ int i = 0;
+
+ sciprintf("Object\n");
+
+ sci_hexdump((unsigned char *) data + seeker, objsize - 4, seeker);
+ //-4 because the size includes the two-word header
+
+ sciprintf("Name: %s\n", namepos ? ((char *)(data + namepos)) : "<unknown>");
+ sciprintf("Superclass: %x\n", superclass);
+ sciprintf("Species: %x\n", species);
+ sciprintf("-info-:%x\n", getInt16((unsigned char *) data + 12 + seeker) & 0xffff);
+
+ sciprintf("Function area offset: %x\n", getInt16((unsigned char *) data + seeker + 4));
+ sciprintf("Selectors [%x]:\n", selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)));
+
+ seeker += 8;
+
+ while (selectors--) {
+ sciprintf(" [#%03x] = 0x%x\n", i++, getInt16((unsigned char *)data + seeker) & 0xffff);
+
+ seeker += 2;
+ }
+
+ sciprintf("Overridden functions: %x\n", selectors = overloads = getInt16((unsigned char *)data + seeker));
+
+ seeker += 2;
+
+ if (overloads < 100)
+ while (overloads--) {
+ int selector = getInt16((unsigned char *) data + (seeker));
+
+ sciprintf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)selectorNames.size()) ? selectorNames[selector].c_str() : "<?>");
+ sciprintf("%04x\n", getInt16((unsigned char *)data + seeker + selectors*2 + 2) & 0xffff);
+
+ seeker += 2;
+ }
+}
+
+static void script_dump_class(char *data, int seeker, int objsize, const Common::StringList &selectorNames) {
+ int selectors, overloads, selectorsize;
+ int species = getInt16((unsigned char *) data + 8 + seeker);
+ int superclass = getInt16((unsigned char *) data + 10 + seeker);
+ int namepos = getInt16((unsigned char *) data + 14 + seeker);
+
+ sciprintf("Class\n");
+
+ sci_hexdump((unsigned char *) data + seeker, objsize - 4, seeker);
+
+ sciprintf("Name: %s\n", namepos ? ((char *)data + namepos) : "<unknown>");
+ sciprintf("Superclass: %x\n", superclass);
+ sciprintf("Species: %x\n", species);
+ sciprintf("-info-:%x\n", getInt16((unsigned char *)data + 12 + seeker) & 0xffff);
+
+ sciprintf("Function area offset: %x\n", getInt16((unsigned char *)data + seeker + 4));
+ sciprintf("Selectors [%x]:\n", selectors = (selectorsize = getInt16((unsigned char *)data + seeker + 6)));
+
+ seeker += 8;
+ selectorsize <<= 1;
+
+ while (selectors--) {
+ int selector = getInt16((unsigned char *) data + (seeker) + selectorsize);
+
+ sciprintf(" [%03x] %s = 0x%x\n", 0xffff & selector, (selector >= 0 && selector < (int)selectorNames.size()) ? selectorNames[selector].c_str() : "<?>",
+ getInt16((unsigned char *)data + seeker) & 0xffff);
+
+ seeker += 2;
+ }
+
+ seeker += selectorsize;
+
+ sciprintf("Overloaded functions: %x\n", selectors = overloads = getInt16((unsigned char *)data + seeker));
+
+ seeker += 2;
+
+ while (overloads--) {
+ int selector = getInt16((unsigned char *)data + (seeker));
+ fprintf(stderr, "selector=%d; selectorNames.size() =%d\n", selector, selectorNames.size());
+ sciprintf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)selectorNames.size()) ?
+ selectorNames[selector].c_str() : "<?>");
+ sciprintf("%04x\n", getInt16((unsigned char *)data + seeker + selectors * 2 + 2) & 0xffff);
+
+ seeker += 2;
+ }
+}
+
+void script_dissect(ResourceManager *resmgr, int res_no, const Common::StringList &selectorNames) {
+ int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ unsigned int _seeker = 0;
+ Resource *script = resmgr->findResource(kResourceTypeScript, res_no, 0);
+ word_t **words;
+ int word_count;
+
+ if (!script) {
+ sciprintf("Script not found!\n");
+ return;
+ }
+
+ words = vocab_get_words(resmgr, &word_count);
+
+ while (_seeker < script->size) {
+ int objtype = getInt16(script->data + _seeker);
+ int objsize;
+ unsigned int seeker = _seeker + 4;
+
+ if (!objtype) {
+ sciprintf("End of script object (#0) encountered.\n");
+ sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
+ objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
+ vocab_free_words(words, word_count);
+ return;
+ }
+
+ sciprintf("\n");
+
+ objsize = getInt16(script->data + _seeker + 2);
+
+ sciprintf("Obj type #%x, size 0x%x: ", objtype, objsize);
+
+ _seeker += objsize;
+
+ objectctr[objtype]++;
+
+ switch (objtype) {
+ case sci_obj_object:
+ script_dump_object((char *)script->data, seeker, objsize, selectorNames);
+ break;
+
+ case sci_obj_code: {
+ sciprintf("Code\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case 3: {
+ sciprintf("<unknown>\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case sci_obj_said: {
+ sciprintf("Said\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+
+ sciprintf("%04x: ", seeker);
+ while (seeker < _seeker) {
+ unsigned char nextitem = script->data [seeker++];
+ if (nextitem == 0xFF)
+ sciprintf("\n%04x: ", seeker);
+ else if (nextitem >= 0xF0) {
+ switch (nextitem) {
+ case 0xf0:
+ sciprintf(", ");
+ break;
+ case 0xf1:
+ sciprintf("& ");
+ break;
+ case 0xf2:
+ sciprintf("/ ");
+ break;
+ case 0xf3:
+ sciprintf("( ");
+ break;
+ case 0xf4:
+ sciprintf(") ");
+ break;
+ case 0xf5:
+ sciprintf("[ ");
+ break;
+ case 0xf6:
+ sciprintf("] ");
+ break;
+ case 0xf7:
+ sciprintf("# ");
+ break;
+ case 0xf8:
+ sciprintf("< ");
+ break;
+ case 0xf9:
+ sciprintf("> ");
+ break;
+ }
+ } else {
+ nextitem = nextitem << 8 | script->data [seeker++];
+ sciprintf("%s[%03x] ", vocab_get_any_group_word(nextitem, words, word_count), nextitem);
+ }
+ }
+ sciprintf("\n");
+ }
+ break;
+
+ case sci_obj_strings: {
+ sciprintf("Strings\n");
+ while (script->data [seeker]) {
+ sciprintf("%04x: %s\n", seeker, script->data + seeker);
+ seeker += strlen((char *)script->data + seeker) + 1;
+ }
+ seeker++; // the ending zero byte
+ };
+ break;
+
+ case sci_obj_class:
+ script_dump_class((char *)script->data, seeker, objsize, selectorNames);
+ break;
+
+ case sci_obj_exports: {
+ sciprintf("Exports\n");
+ sci_hexdump((unsigned char *)script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case sci_obj_pointers: {
+ sciprintf("Pointers\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case 9: {
+ sciprintf("<unknown>\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case sci_obj_localvars: {
+ sciprintf("Local vars\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ default:
+ sciprintf("Unsupported!\n");
+ return;
+ }
+
+ }
+
+ sciprintf("Script ends without terminator\n");
+}
+
+} // End of namespace Sci
Modified: scummvm/trunk/engines/sci/module.mk
===================================================================
--- scummvm/trunk/engines/sci/module.mk 2009-03-04 05:22:29 UTC (rev 39107)
+++ scummvm/trunk/engines/sci/module.mk 2009-03-04 05:25:31 UTC (rev 39108)
@@ -28,6 +28,7 @@
engine/message.o \
engine/said.o \
engine/savegame.o \
+ engine/script.o \
engine/scriptconsole.o \
engine/scriptdebug.o \
engine/seg_manager.o \
@@ -60,7 +61,6 @@
scicore/resource.o \
scicore/resource_map.o \
scicore/resource_patch.o \
- scicore/script.o \
scicore/versions.o \
scicore/vocab.o \
scicore/vocab_debug.o \
Deleted: scummvm/trunk/engines/sci/scicore/script.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/script.cpp 2009-03-04 05:22:29 UTC (rev 39107)
+++ scummvm/trunk/engines/sci/scicore/script.cpp 2009-03-04 05:25:31 UTC (rev 39108)
@@ -1,482 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "sci/scicore/resource.h"
-#include "sci/engine/state.h"
-#include "common/util.h"
-
-namespace Sci {
-
-// #define SCRIPT_DEBUG
-
-#define END Script_None
-
-opcode_format formats[128][4] = {
- /*00*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*04*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*08*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*0C*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*10*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*14*/
- {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END},
- /*18*/
- {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None},
- /*1C*/
- {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END},
- /*20*/
- {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END},
- /*24 (24=ret)*/
- {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid},
- /*28*/
- {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END},
- /*2C*/
- {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid},
- /*30*/
- {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
- /*34*/
- {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
- /*38*/
- {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None},
- /*3C*/
- {Script_None}, {Script_None}, {Script_None}, {Script_Invalid},
- /*40-4F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- /*50-5F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- /*60-6F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- /*70-7F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}
-};
-#undef END
-
-void script_adjust_opcode_formats(int res_version) {
- switch (res_version) {
- case SCI_VERSION_0:
- case SCI_VERSION_01:
- break;
- case SCI_VERSION_01_VGA:
- case SCI_VERSION_01_VGA_ODD:
- case SCI_VERSION_1_EARLY:
- case SCI_VERSION_1_LATE:
- case SCI_VERSION_1_1:
- formats[op_lofsa][0] = Script_Offset;
- formats[op_lofss][0] = Script_Offset;
- break;
- default:
- sciprintf("script_adjust_opcode_formats(): Unknown script version %d\n", res_version);
- }
-}
-
-int script_find_selector(EngineState *s, const char *selectorname) {
- for (uint pos = 0; pos < s->_selectorNames.size(); ++pos) {
- if (s->_selectorNames[pos] == selectorname)
- return pos;
- }
-
- warning("Could not map '%s' to any selector!", selectorname);
-
- return -1;
-}
-
-#define FIND_SELECTOR(_slc_) map->_slc_ = script_find_selector(s, #_slc_)
-#define FIND_SELECTOR2(_slc_, _slcstr_) map->_slc_ = script_find_selector(s, _slcstr_)
-
-void script_map_selectors(EngineState *s, selector_map_t *map) {
- FIND_SELECTOR(init);
- FIND_SELECTOR(play);
- FIND_SELECTOR(replay);
- FIND_SELECTOR(x);
- FIND_SELECTOR(y);
- FIND_SELECTOR(z);
- FIND_SELECTOR(priority);
- FIND_SELECTOR(view);
- FIND_SELECTOR(loop);
- FIND_SELECTOR(cel);
- FIND_SELECTOR(brLeft);
- FIND_SELECTOR(brRight);
- FIND_SELECTOR(brTop);
- FIND_SELECTOR(brBottom);
- FIND_SELECTOR(xStep);
- FIND_SELECTOR(yStep);
- FIND_SELECTOR(nsBottom);
- FIND_SELECTOR(nsTop);
- FIND_SELECTOR(nsLeft);
- FIND_SELECTOR(nsRight);
- FIND_SELECTOR(font);
- FIND_SELECTOR(text);
- FIND_SELECTOR(type);
- FIND_SELECTOR(state);
- FIND_SELECTOR(doit);
- FIND_SELECTOR2(delete_, "delete");
- FIND_SELECTOR(signal);
- FIND_SELECTOR(underBits);
- FIND_SELECTOR(canBeHere);
- FIND_SELECTOR(client);
- FIND_SELECTOR(dx);
- FIND_SELECTOR(dy);
- FIND_SELECTOR(xStep);
- FIND_SELECTOR(yStep);
- FIND_SELECTOR2(b_movCnt, "b-moveCnt");
- FIND_SELECTOR2(b_i1, "b-i1");
- FIND_SELECTOR2(b_i2, "b-i2");
- FIND_SELECTOR2(b_di, "b-di");
- FIND_SELECTOR2(b_xAxis, "b-xAxis");
- FIND_SELECTOR2(b_incr, "b-incr");
- FIND_SELECTOR(completed);
- FIND_SELECTOR(illegalBits);
- FIND_SELECTOR(dispose);
- FIND_SELECTOR(prevSignal);
- FIND_SELECTOR(message);
- FIND_SELECTOR(modifiers);
- FIND_SELECTOR(cue);
- FIND_SELECTOR(owner);
- FIND_SELECTOR(handle);
- FIND_SELECTOR(number);
- FIND_SELECTOR(max);
- FIND_SELECTOR(cursor);
- FIND_SELECTOR(claimed);
- FIND_SELECTOR(edgeHit);
- FIND_SELECTOR(wordFail);
- FIND_SELECTOR(syntaxFail);
- FIND_SELECTOR(semanticFail);
- FIND_SELECTOR(cycler);
- FIND_SELECTOR(elements);
- FIND_SELECTOR(lsTop);
- FIND_SELECTOR(lsBottom);
- FIND_SELECTOR(lsLeft);
- FIND_SELECTOR(lsRight);
- FIND_SELECTOR(baseSetter);
- FIND_SELECTOR(who);
- FIND_SELECTOR(distance);
- FIND_SELECTOR(mover);
- FIND_SELECTOR(looper);
- FIND_SELECTOR(isBlocked);
- FIND_SELECTOR(heading);
- FIND_SELECTOR(mode);
- FIND_SELECTOR(caller);
- FIND_SELECTOR(moveDone);
- FIND_SELECTOR(vol);
- FIND_SELECTOR(pri);
- FIND_SELECTOR(min);
- FIND_SELECTOR(sec);
- FIND_SELECTOR(frame);
- FIND_SELECTOR(dataInc);
- FIND_SELECTOR(size);
- FIND_SELECTOR(palette);
- FIND_SELECTOR(moveSpeed);
- FIND_SELECTOR(cantBeHere);
- FIND_SELECTOR(nodePtr);
- FIND_SELECTOR(flags);
- FIND_SELECTOR(points);
-}
-
-int sci_hexdump(byte *data, int length, int offsetplus) {
- char tempstr[40];
- int i;
-
- for (i = 0; i < length; i += 8) {
- int j;
-
- sprintf(tempstr, "%04x: ", i + offsetplus);
- for (j = 0; j < MIN(8, length - i); j++)
- sprintf(tempstr + 6 + (j*3) + (j > 3), "%02x ", data[i+j]);
- for (j = 0; j < MIN(8, length - i); j++) {
- int thechar;
- thechar = data[i+j];
- sprintf(tempstr + 31 + j, "%c", ((thechar < ' ') || (thechar > 127)) ? '.' : thechar);
- }
-
- for (j = 0; j < 38; j++)
- if (!tempstr[j])
- tempstr[j] = ' '; // get rid of sprintf's \0s
-
- sciprintf("%s\n", tempstr);
- }
-
- return 0;
-}
-
-static void script_dump_object(char *data, int seeker, int objsize, const Common::StringList &selectorNames) {
- int selectors, overloads, selectorsize;
- int species = getInt16((unsigned char *) data + 8 + seeker);
- int superclass = getInt16((unsigned char *) data + 10 + seeker);
- int namepos = getInt16((unsigned char *) data + 14 + seeker);
- int i = 0;
-
- sciprintf("Object\n");
-
- sci_hexdump((unsigned char *) data + seeker, objsize - 4, seeker);
- //-4 because the size includes the two-word header
-
- sciprintf("Name: %s\n", namepos ? ((char *)(data + namepos)) : "<unknown>");
- sciprintf("Superclass: %x\n", superclass);
- sciprintf("Species: %x\n", species);
- sciprintf("-info-:%x\n", getInt16((unsigned char *) data + 12 + seeker) & 0xffff);
-
- sciprintf("Function area offset: %x\n", getInt16((unsigned char *) data + seeker + 4));
- sciprintf("Selectors [%x]:\n", selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)));
-
- seeker += 8;
-
- while (selectors--) {
- sciprintf(" [#%03x] = 0x%x\n", i++, getInt16((unsigned char *)data + seeker) & 0xffff);
-
- seeker += 2;
- }
-
- sciprintf("Overridden functions: %x\n", selectors = overloads = getInt16((unsigned char *)data + seeker));
-
- seeker += 2;
-
- if (overloads < 100)
- while (overloads--) {
- int selector = getInt16((unsigned char *) data + (seeker));
-
- sciprintf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)selectorNames.size()) ? selectorNames[selector].c_str() : "<?>");
- sciprintf("%04x\n", getInt16((unsigned char *)data + seeker + selectors*2 + 2) & 0xffff);
-
- seeker += 2;
- }
-}
-
-static void script_dump_class(char *data, int seeker, int objsize, const Common::StringList &selectorNames) {
- int selectors, overloads, selectorsize;
- int species = getInt16((unsigned char *) data + 8 + seeker);
- int superclass = getInt16((unsigned char *) data + 10 + seeker);
- int namepos = getInt16((unsigned char *) data + 14 + seeker);
-
- sciprintf("Class\n");
-
- sci_hexdump((unsigned char *) data + seeker, objsize - 4, seeker);
-
- sciprintf("Name: %s\n", namepos ? ((char *)data + namepos) : "<unknown>");
- sciprintf("Superclass: %x\n", superclass);
- sciprintf("Species: %x\n", species);
- sciprintf("-info-:%x\n", getInt16((unsigned char *)data + 12 + seeker) & 0xffff);
-
- sciprintf("Function area offset: %x\n", getInt16((unsigned char *)data + seeker + 4));
- sciprintf("Selectors [%x]:\n", selectors = (selectorsize = getInt16((unsigned char *)data + seeker + 6)));
-
- seeker += 8;
- selectorsize <<= 1;
-
- while (selectors--) {
- int selector = getInt16((unsigned char *) data + (seeker) + selectorsize);
-
- sciprintf(" [%03x] %s = 0x%x\n", 0xffff & selector, (selector >= 0 && selector < (int)selectorNames.size()) ? selectorNames[selector].c_str() : "<?>",
- getInt16((unsigned char *)data + seeker) & 0xffff);
-
- seeker += 2;
- }
-
- seeker += selectorsize;
-
- sciprintf("Overloaded functions: %x\n", selectors = overloads = getInt16((unsigned char *)data + seeker));
-
- seeker += 2;
-
- while (overloads--) {
- int selector = getInt16((unsigned char *)data + (seeker));
- fprintf(stderr, "selector=%d; selectorNames.size() =%d\n", selector, selectorNames.size());
- sciprintf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)selectorNames.size()) ?
- selectorNames[selector].c_str() : "<?>");
- sciprintf("%04x\n", getInt16((unsigned char *)data + seeker + selectors * 2 + 2) & 0xffff);
-
- seeker += 2;
- }
-}
-
-void script_dissect(ResourceManager *resmgr, int res_no, const Common::StringList &selectorNames) {
- int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- unsigned int _seeker = 0;
- Resource *script = resmgr->findResource(kResourceTypeScript, res_no, 0);
- word_t **words;
- int word_count;
-
- if (!script) {
- sciprintf("Script not found!\n");
- return;
- }
-
- words = vocab_get_words(resmgr, &word_count);
-
- while (_seeker < script->size) {
- int objtype = getInt16(script->data + _seeker);
- int objsize;
- unsigned int seeker = _seeker + 4;
-
- if (!objtype) {
- sciprintf("End of script object (#0) encountered.\n");
- sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
- objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
- vocab_free_words(words, word_count);
- return;
- }
-
- sciprintf("\n");
-
- objsize = getInt16(script->data + _seeker + 2);
-
- sciprintf("Obj type #%x, size 0x%x: ", objtype, objsize);
-
- _seeker += objsize;
-
- objectctr[objtype]++;
-
- switch (objtype) {
- case sci_obj_object:
- script_dump_object((char *)script->data, seeker, objsize, selectorNames);
- break;
-
- case sci_obj_code: {
- sciprintf("Code\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- case 3: {
- sciprintf("<unknown>\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- case sci_obj_said: {
- sciprintf("Said\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
-
- sciprintf("%04x: ", seeker);
- while (seeker < _seeker) {
- unsigned char nextitem = script->data [seeker++];
- if (nextitem == 0xFF)
- sciprintf("\n%04x: ", seeker);
- else if (nextitem >= 0xF0) {
- switch (nextitem) {
- case 0xf0:
- sciprintf(", ");
- break;
- case 0xf1:
- sciprintf("& ");
- break;
- case 0xf2:
- sciprintf("/ ");
- break;
- case 0xf3:
- sciprintf("( ");
- break;
- case 0xf4:
- sciprintf(") ");
- break;
- case 0xf5:
- sciprintf("[ ");
- break;
- case 0xf6:
- sciprintf("] ");
- break;
- case 0xf7:
- sciprintf("# ");
- break;
- case 0xf8:
- sciprintf("< ");
- break;
- case 0xf9:
- sciprintf("> ");
- break;
- }
- } else {
- nextitem = nextitem << 8 | script->data [seeker++];
- sciprintf("%s[%03x] ", vocab_get_any_group_word(nextitem, words, word_count), nextitem);
- }
- }
- sciprintf("\n");
- }
- break;
-
- case sci_obj_strings: {
- sciprintf("Strings\n");
- while (script->data [seeker]) {
- sciprintf("%04x: %s\n", seeker, script->data + seeker);
- seeker += strlen((char *)script->data + seeker) + 1;
- }
- seeker++; // the ending zero byte
- };
- break;
-
- case sci_obj_class:
- script_dump_class((char *)script->data, seeker, objsize, selectorNames);
- break;
-
- case sci_obj_exports: {
- sciprintf("Exports\n");
- sci_hexdump((unsigned char *)script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- case sci_obj_pointers: {
- sciprintf("Pointers\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- case 9: {
- sciprintf("<unknown>\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- case sci_obj_localvars: {
- sciprintf("Local vars\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- default:
- sciprintf("Unsupported!\n");
- return;
- }
-
- }
-
- sciprintf("Script ends without terminator\n");
-}
-
-} // End of namespace Sci
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list