aboutsummaryrefslogtreecommitdiff
path: root/engines/agos
diff options
context:
space:
mode:
authorTravis Howell2006-10-07 01:10:32 +0000
committerTravis Howell2006-10-07 01:10:32 +0000
commite4c9d0a4e3f3e57ac441eb8a21f1ea1ac142a5cd (patch)
treed7384d666b6a550139bc4ffb041c2cf18d0255f9 /engines/agos
parentdf5be194098e188f9cd3234af2bea34b67d19da2 (diff)
downloadscummvm-rg350-e4c9d0a4e3f3e57ac441eb8a21f1ea1ac142a5cd.tar.gz
scummvm-rg350-e4c9d0a4e3f3e57ac441eb8a21f1ea1ac142a5cd.tar.bz2
scummvm-rg350-e4c9d0a4e3f3e57ac441eb8a21f1ea1ac142a5cd.zip
Add more script opcodes for Elvira 1/2/WW
svn-id: r24154
Diffstat (limited to 'engines/agos')
-rw-r--r--engines/agos/agos.cpp4
-rw-r--r--engines/agos/agos.h12
-rw-r--r--engines/agos/debug.h38
-rw-r--r--engines/agos/intern.h3
-rw-r--r--engines/agos/items.cpp132
5 files changed, 133 insertions, 56 deletions
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());