From e4c9d0a4e3f3e57ac441eb8a21f1ea1ac142a5cd Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sat, 7 Oct 2006 01:10:32 +0000 Subject: Add more script opcodes for Elvira 1/2/WW svn-id: r24154 --- engines/agos/agos.cpp | 4 ++ engines/agos/agos.h | 12 +++-- engines/agos/debug.h | 38 +++++++------- engines/agos/intern.h | 3 +- engines/agos/items.cpp | 132 ++++++++++++++++++++++++++++++++++++------------- 5 files changed, 133 insertions(+), 56 deletions(-) (limited to 'engines/agos') diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 44c307c06a..978c0b9adb 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -841,6 +841,10 @@ bool AGOSEngine::isObject(Item *item) { return findChildOfType(item, 2) != NULL; } +bool AGOSEngine::isPlayer(Item *item) { + return findChildOfType(item, 3) != NULL; +} + uint AGOSEngine::getOffsetOfChild2Param(SubObject *child, uint prop) { uint m = 1; uint offset = 0; diff --git a/engines/agos/agos.h b/engines/agos/agos.h index 5d14ba9840..dbcbc947c4 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -600,6 +600,7 @@ protected: bool isRoom(Item *item); bool isObject(Item *item); + bool isPlayer(Item *item); void itemChildrenChanged(Item *item); void unlinkItem(Item *item); @@ -886,8 +887,6 @@ public: void o_oflag(); void o_destroy(); void o_place(); - void o_copyof(); - void o_copyfo(); void o_copyff(); void o_clear(); void o_let(); @@ -1030,9 +1029,17 @@ public: void oe1_isNotAt(); void oe1_sibling(); void oe1_notSibling(); + void oe1_isPlayer(); + void oe1_canPut(); + void oe1_copyof(); + void oe1_copyfo(); + void oe1_whatO(); void oe1_setFF(); void oe1_score(); void oe1_doClass(); + void oe1_pobj(); + void oe1_pName(); + void oe1_pcName(); void oe1_setUserItem(); void oe1_getUserItem(); void oe1_clearUserItem(); @@ -1043,7 +1050,6 @@ public: void oe1_printStats(); // Opcodes, Elvira 2 only - void oe2_pobj(); void oe2_loadUserGame(); void oe2_setDoorOpen(); void oe2_setDoorClosed(); diff --git a/engines/agos/debug.h b/engines/agos/debug.h index 053d5c511d..99e38399e6 100644 --- a/engines/agos/debug.h +++ b/engines/agos/debug.h @@ -30,11 +30,11 @@ static const char *const elvira1_opcode_name_table[300] = { /* 0 */ "IJ|AT", "IJ|NOT_AT", - NULL, - NULL, + "IJ|PRESENT", + "IJ|NOT_PRESENT", /* 4 */ - NULL, - NULL, + "IJ|WORN", + "IJ|NOT_WORN", "IJ|CARRIED", "IJ|NOT_CARRIED", /* 8 */ @@ -65,7 +65,7 @@ static const char *const elvira1_opcode_name_table[300] = { /* 28 */ NULL, NULL, - NULL, + "IJ|IS_PLAYER", NULL, /* 32 */ "IJ|IS_ROOM", @@ -74,7 +74,7 @@ static const char *const elvira1_opcode_name_table[300] = { NULL, /* 36 */ "IWJ|OBJECT_HAS_FLAG", - NULL, + "IIJ|CAN_PUT", NULL, NULL, /* 40 */ @@ -95,11 +95,11 @@ static const char *const elvira1_opcode_name_table[300] = { /* 52 */ NULL, NULL, - NULL, - NULL, + "IWV|COPY_OF", + "WIW|COPY_FO", /* 56 */ "WW|MOVE", - NULL, + "W|WHAT_O", NULL, NULL, /* 60 */ @@ -168,10 +168,10 @@ static const char *const elvira1_opcode_name_table[300] = { NULL, NULL, /* 112 */ + "I|PRINT_OBJ", NULL, - NULL, - NULL, - NULL, + "I|PRINT_NAME", + "I|PRINT_CNAME", /* 116 */ NULL, NULL, @@ -416,23 +416,23 @@ static const char *const ww_opcode_name_table[256] = { NULL, "WJ|CHANCE", /* 24 */ - NULL, + "IJ|IS_PLAYER", "IJ|IS_ROOM", "IJ|IS_OBJECT", "IWJ|ITEM_STATE_IS", /* 28 */ "IBJ|OBJECT_HAS_FLAG", - NULL, + "IIJ|CAN_PUT", NULL, "I|SET_NO_PARENT", /* 32 */ NULL, "II|SET_PARENT", - NULL, - NULL, + "IBV|COPY_OF", + "VIB|COPY_FO", /* 36 */ "VV|MOVE", - NULL, + "W|WHAT_O", NULL, NULL, /* 40 */ @@ -478,8 +478,8 @@ static const char *const ww_opcode_name_table[256] = { /* 72 */ NULL, "I|PRINT_OBJ", - NULL, - NULL, + "I|PRINT_NAME", + "I|PRINT_CNAME", /* 76 */ "WW|ADD_TIMEOUT", "J|IS_M1_EMPTY", diff --git a/engines/agos/intern.h b/engines/agos/intern.h index dd5768742e..e23bdf1ba2 100644 --- a/engines/agos/intern.h +++ b/engines/agos/intern.h @@ -192,7 +192,8 @@ enum BoxFlags { enum SubObjectFlags { kOFText = 0x1, kOFSize = 0x2, - kOFWeight = 0x4, + kOFWorn = 0x4, // Elvira 1 + kOFWeight = 0x4, // Others kOFVolume = 0x8, kOFIcon = 0x10, kOFKeyColor1 = 0x20, diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp index 7129cc2dc7..458e48d77e 100644 --- a/engines/agos/items.cpp +++ b/engines/agos/items.cpp @@ -190,19 +190,24 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) { op[20] = &AGOSEngine::o_ltf; op[21] = &AGOSEngine::o_gtf; + op[29] = &AGOSEngine::o_chance; + op[30] = &AGOSEngine::oe1_isPlayer; + op[32] = &AGOSEngine::o_isRoom; op[33] = &AGOSEngine::o_isObject; op[34] = &AGOSEngine::o_state; op[36] = &AGOSEngine::o_oflag; + op[37] = &AGOSEngine::oe1_canPut; op[48] = &AGOSEngine::o_destroy; op[51] = &AGOSEngine::o_place; - op[54] = &AGOSEngine::o_copyof; - op[55] = &AGOSEngine::o_copyfo; + op[54] = &AGOSEngine::oe1_copyof; + op[55] = &AGOSEngine::oe1_copyfo; op[56] = &AGOSEngine::o_copyff; + op[57] = &AGOSEngine::oe1_whatO; op[60] = &AGOSEngine::oe1_setFF; op[61] = &AGOSEngine::o_clear; @@ -242,6 +247,9 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) { op[105] = &AGOSEngine::o_process; op[106] = &AGOSEngine::oe1_doClass; + op[114] = &AGOSEngine::oe1_pName; + op[115] = &AGOSEngine::oe1_pcName; + op[119] = &AGOSEngine::o_when; op[128] = &AGOSEngine::o_if1; @@ -323,10 +331,15 @@ void AGOSEngine::setupElvira1Opcodes(OpcodeProc *op) { void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) { setupCommonOpcodes(op); - op[34] = &AGOSEngine::o_copyof; - op[35] = &AGOSEngine::o_copyfo; + op[24] = &AGOSEngine::oe1_isPlayer; + op[29] = &AGOSEngine::oe1_canPut; + op[34] = &AGOSEngine::oe1_copyof; + op[35] = &AGOSEngine::oe1_copyfo; + op[37] = &AGOSEngine::oe1_whatO; op[54] = &AGOSEngine::o_moveDirn; - op[73] = &AGOSEngine::oe2_pobj; + op[73] = &AGOSEngine::oe1_pobj; + op[74] = &AGOSEngine::oe1_pName; + op[75] = &AGOSEngine::oe1_pcName; op[83] = &AGOSEngine::o1_rescan; op[89] = &AGOSEngine::oe2_loadUserGame; op[98] = &AGOSEngine::o1_animate; @@ -370,12 +383,17 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) { setupCommonOpcodes(op); // Confirmed - op[34] = &AGOSEngine::o_copyof; - op[35] = &AGOSEngine::o_copyfo; + op[24] = &AGOSEngine::oe1_isPlayer; + op[29] = &AGOSEngine::oe1_canPut; + op[34] = &AGOSEngine::oe1_copyof; + op[37] = &AGOSEngine::oe1_whatO; + op[35] = &AGOSEngine::oe1_copyfo; op[54] = &AGOSEngine::o_moveDirn; op[55] = &AGOSEngine::oww_goto; op[70] = &AGOSEngine::o1_printLongText; - op[73] = &AGOSEngine::oe2_pobj; + op[73] = &AGOSEngine::oe1_pobj; + op[74] = &AGOSEngine::oe1_pName; + op[75] = &AGOSEngine::oe1_pcName; op[83] = &AGOSEngine::o1_rescan; op[98] = &AGOSEngine::o1_animate; op[99] = &AGOSEngine::o1_stopAnimate; @@ -758,20 +776,6 @@ void AGOSEngine::o_place() { setItemParent(item, getNextItemPtr()); } -void AGOSEngine::o_copyof() { - // 34: - Item *item = getNextItemPtr(); - uint tmp = getVarOrByte(); - writeNextVarContents(getUserFlag(item, tmp)); -} - -void AGOSEngine::o_copyfo() { - // 35: - uint tmp = getNextVarContents(); - Item *item = getNextItemPtr(); - setUserFlag(item, getVarOrByte(), tmp); -} - void AGOSEngine::o_copyff() { // 36: copy var uint value = getNextVarContents(); @@ -1774,12 +1778,24 @@ void AGOSEngine::oe1_notPresent() { void AGOSEngine::oe1_worn() { // 4: worn - getNextItemPtr(); + Item *item = getNextItemPtr(); + SubObject *subObject = (SubObject *)findChildOfType(item, 2); + + if (item->parent != getItem1ID() || subObject == NULL) + setScriptCondition(false); + else + setScriptCondition((subObject->objectFlags & kOFWorn) != 0); } void AGOSEngine::oe1_notWorn() { // 5: not worn - getNextItemPtr(); + Item *item = getNextItemPtr(); + SubObject *subObject = (SubObject *)findChildOfType(item, 2); + + if (item->parent != getItem1ID() || subObject == NULL) + setScriptCondition(false); + else + setScriptCondition((subObject->objectFlags & kOFWorn) == 0); } void AGOSEngine::oe1_isNotAt() { @@ -1802,8 +1818,44 @@ void AGOSEngine::oe1_notSibling() { setScriptCondition(item1->parent != item2->parent); } +void AGOSEngine::oe1_isPlayer() { + // 30: is player + setScriptCondition(isPlayer(getNextItemPtr())); +} + +void AGOSEngine::oe1_canPut() { + // 37: can put + Item *item1 = getNextItemPtr(); + Item *item2 = getNextItemPtr(); + setScriptCondition(canPlace(item1, item2) == 0); +} + +void AGOSEngine::oe1_copyof() { + // 54: copy of + Item *item = getNextItemPtr(); + uint tmp = getVarOrByte(); + writeNextVarContents(getUserFlag(item, tmp)); +} + +void AGOSEngine::oe1_copyfo() { + // 55: copy fo + uint tmp = getNextVarContents(); + Item *item = getNextItemPtr(); + setUserFlag(item, getVarOrByte(), tmp); +} + +void AGOSEngine::oe1_whatO() { + // 57: what o + int a = getVarOrWord(); + + if (a == 1) + _subjectItem = findMaster(levelOf(me()), _scriptAdj1,_scriptNoun1); + else + _objectItem = findMaster(levelOf(me()), _scriptAdj2, _scriptNoun2); +} + void AGOSEngine::oe1_setFF() { - // 60 + // 60: set FF writeNextVarContents(0xFF); } @@ -1837,6 +1889,28 @@ void AGOSEngine::oe1_doClass() { } } +void AGOSEngine::oe1_pobj() { + // 112: print object + SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2); + + if (subObject != NULL && subObject->objectFlags & kOFText) + showMessageFormat("%s", (const char *)getStringPtrByID(subObject->objectFlagValue[0])); +} + +void AGOSEngine::oe1_pName() { + // 114: + Item *i = getNextItemPtr(); + showMessageFormat("%s", (const char *)getStringPtrByID(i->itemName)); +} + +void AGOSEngine::oe1_pcName() { + // 115: + Item *i = getNextItemPtr(); + Common::String name = (const char *)getStringPtrByID(i->itemName); + name.toUppercase(); + showMessageFormat("%s", name.c_str()); +} + void AGOSEngine::oe1_setUserItem() { // 176: set user item Item *i = getNextItemPtr(); @@ -1915,14 +1989,6 @@ void AGOSEngine::oe1_printStats() { // Elvira 2 Opcodes // ----------------------------------------------------------------------- -void AGOSEngine::oe2_pobj() { - // 73: print object - SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2); - - if (subObject != NULL && subObject->objectFlags & kOFText) - showMessageFormat("%s", (const char *)getStringPtrByID(subObject->objectFlagValue[0])); -} - void AGOSEngine::oe2_loadUserGame() { // 89: load user game getStringPtrByID(getNextStringID()); -- cgit v1.2.3