diff options
| -rw-r--r-- | engines/agos/agos.cpp | 4 | ||||
| -rw-r--r-- | engines/agos/agos.h | 12 | ||||
| -rw-r--r-- | engines/agos/debug.h | 38 | ||||
| -rw-r--r-- | engines/agos/intern.h | 3 | ||||
| -rw-r--r-- | engines/agos/items.cpp | 132 | 
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()); | 
