[Scummvm-cvs-logs] SF.net SVN: scummvm: [24492] scummvm/trunk/engines/agos

kirben at users.sourceforge.net kirben at users.sourceforge.net
Wed Oct 25 10:12:14 CEST 2006


Revision: 24492
          http://svn.sourceforge.net/scummvm/?rev=24492&view=rev
Author:   kirben
Date:     2006-10-25 01:12:05 -0700 (Wed, 25 Oct 2006)

Log Message:
-----------
Add more opcodes for Elvira 1/2

Modified Paths:
--------------
    scummvm/trunk/engines/agos/agos.h
    scummvm/trunk/engines/agos/debug.h
    scummvm/trunk/engines/agos/rooms.cpp
    scummvm/trunk/engines/agos/script_e1.cpp
    scummvm/trunk/engines/agos/script_e2.cpp

Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h	2006-10-25 05:32:15 UTC (rev 24491)
+++ scummvm/trunk/engines/agos/agos.h	2006-10-25 08:12:05 UTC (rev 24492)
@@ -682,15 +682,23 @@
 	void setup_cond_c_helper();
 
 	uint16 getBackExit(int n);
-	uint16 getDoorOf(Item *item, uint16 d);
 	uint16 getDoorState(Item *item, uint16 d);
-	uint16 getExitOf_e1(Item *item, uint16 d);
 	uint16 getExitOf(Item *item, uint16 d);
-	uint16 getExitState(Item *item, uint16 x, uint16 d);
 	void changeDoorState(SubRoom *r, uint16 d, uint16 n);
 	void setDoorState(Item *i, uint16 d, uint16 n);
+
+	// Elvira 1 specific
+	uint16 getDoorOf(Item *item, uint16 d);
+	uint16 getExitOf_e1(Item *item, uint16 d);
 	void moveDirn_e1(Item *i, uint x);
+
+	// Elvira 2 specific
+	int changeExitStates(SubSuperRoom *sr, int n, int d, uint16 s);
+	uint16 getExitState(Item *item, uint16 x, uint16 d);
+	void setExitState(Item *i, uint16 n, uint16 d, uint16 s);
 	void moveDirn_e2(Item *i, uint x);
+
+	// Waxworks specific
 	void moveDirn_ww(Item *i, uint x);
 
 	int canPlace(Item *x, Item *y);
@@ -1106,6 +1114,7 @@
 	void oe1_isNotIn();
 	void oe1_isPlayer();
 	void oe1_canPut();
+	void oe1_create();
 	void oe1_copyof();
 	void oe1_copyfo();
 	void oe1_whatO();
@@ -1113,6 +1122,7 @@
 	void oe1_setFF();
 	void oe1_moveDirn();
 	void oe1_score();
+	void oe1_look();
 	void oe1_doClass();
 	void oe1_pObj();
 	void oe1_pName();
@@ -1123,6 +1133,8 @@
 	void oe1_getUserItem();
 	void oe1_whereTo();
 	void oe1_doorExit();
+	void oe1_saveGame();
+	void oe1_loadGame();
 	void oe1_clearUserItem();
 	void oe1_findMaster();
 	void oe1_nextMaster();
@@ -1142,6 +1154,7 @@
 
 	// Opcodes, Elvira 2 only
 	void oe2_moveDirn();
+	void oe2_doClass();
 	void oe2_pObj();
 	void oe2_loadUserGame();
 	void oe2_drawItem();
@@ -1155,6 +1168,12 @@
 	void oe2_unk162();
 	void oe2_setSuperRoom();
 	void oe2_getSuperRoom();
+	void oe2_setExitOpen();
+	void oe2_setExitClosed();
+	void oe2_setExitLocked();
+	void oe2_ifExitOpen();
+	void oe2_ifExitClosed();
+	void oe2_ifExitLocked();
 	void oe2_unk177();
 	void oe2_unk178();
 

Modified: scummvm/trunk/engines/agos/debug.h
===================================================================
--- scummvm/trunk/engines/agos/debug.h	2006-10-25 05:32:15 UTC (rev 24491)
+++ scummvm/trunk/engines/agos/debug.h	2006-10-25 08:12:05 UTC (rev 24492)
@@ -86,7 +86,7 @@
 	NULL,
 	NULL,
 	NULL,
-	NULL,
+	"I|CREATE",
 	/* 48 */
 	"I|SET_NO_PARENT",
 	NULL,
@@ -148,7 +148,7 @@
 	NULL,
 	NULL,
 	/* 96 */
-	NULL,
+	"|LOOK",
 	"x|END",
 	"x|DONE",
 	NULL,
@@ -279,8 +279,8 @@
 	NULL,
 	/* 200 */
 	NULL,
-	NULL,
-	NULL,
+	"T|SAVE_GAME",
+	"T|LOAD_GAME",
 	"|NOT",
 	/* 204 */
 	NULL,
@@ -476,7 +476,7 @@
 	NULL,
 	"W|START_SUB",
 	/* 72 */
-	NULL,
+	"IBW|DO_CLASS",
 	"I|PRINT_OBJ",
 	"I|PRINT_NAME",
 	"I|PRINT_CNAME",
@@ -593,16 +593,16 @@
 	/* 164 */
 	NULL,
 	"W|SET_SUPER_ROOM",
-	"BV|GET_SUPER_ROOM",
-	NULL,
+	"V|GET_SUPER_ROOM",
+	"IWB|SET_EXIT_OPEN",
 	/* 168 */
-	NULL,
-	NULL,
-	NULL,
-	NULL,
+	"IWB|SET_EXIT_CLOSED",
+	"IWB|SET_EXIT_LOCKED",
+	"IWB|SET_EXIT_CLOSED",
+	"IWBJ|IF_EXIT_OPEN",
 	/* 172 */
-	NULL,
-	NULL,
+	"IWBJ|IF_EXIT_CLOSED",
+	"IWBJ|IF_EXIT_LOCKED",
 	"W|UNK_174",
 	"|getDollar2",
 	/* 176 */

Modified: scummvm/trunk/engines/agos/rooms.cpp
===================================================================
--- scummvm/trunk/engines/agos/rooms.cpp	2006-10-25 05:32:15 UTC (rev 24491)
+++ scummvm/trunk/engines/agos/rooms.cpp	2006-10-25 08:12:05 UTC (rev 24492)
@@ -191,6 +191,72 @@
 }
 
 // Elvira 2 specific
+int AGOSEngine::changeExitStates(SubSuperRoom *sr, int n, int d, uint16 s) {
+	int b, bd;
+	uint16 *c;
+	uint16 mask = 3;
+	uint16 bs = s;
+
+	switch (d) {
+		case 0:
+			b =- (sr->roomX); bd = 2;
+			if (((n % (sr->roomX * sr->roomY)) / sr->roomX) == 0)
+				return(0);
+			else
+				break;
+		case 1: 
+			b = 1; bd = 3;
+			if (((n % (sr->roomX * sr->roomY)) % sr->roomX) == 0)
+				return 0;
+			else
+				break;
+		case 2: 
+			b = sr->roomX; bd = 0;
+			if (((n % (sr->roomX * sr->roomY)) / sr->roomX) == (sr->roomY - 1))
+				return 0;
+			else
+				break;
+		case 3:
+			b =- 1; bd = 1;
+			if (((n % (sr->roomX * sr->roomY)) % sr->roomX) == 1)
+				return 0;
+			else
+				break;
+		case 4:
+			b =- (sr->roomX * sr->roomY); bd = 5;
+			if (n < (sr->roomX * sr->roomY))
+				return 0;
+			else
+				break;
+		case 5:
+			b = sr->roomX * sr->roomY; bd = 4;
+			if (n > (sr->roomX * sr->roomY * (sr->roomZ - 1)))
+				return 0;
+			else
+				break;
+		default:
+			return 0;
+	}
+	n--;
+	c = sr->roomExitStates;
+	c += n;
+	d <<= 1;
+	mask <<= d;
+	s <<= d;
+	*c &= ~mask;
+	*c |= s;
+	mask = 3;
+	n += b;
+	c = sr->roomExitStates;
+	c += n;
+	bd <<= 1;
+	mask <<= bd;
+	bs <<= bd;
+	*c &= ~mask;
+	*c |= bs;
+	return 1;
+}
+
 uint16 AGOSEngine::getExitState(Item *i, uint16 x, uint16 d) {
 	SubSuperRoom *sr;
 	uint16 mask = 3;
@@ -210,6 +276,12 @@
 	return n;
 }
 
+void AGOSEngine::setExitState(Item *i, uint16 n, uint16 d, uint16 s) {
+	SubSuperRoom *sr = (SubSuperRoom *)findChildOfType(i, 4);
+	if (sr)
+		changeExitStates(sr, n, d, s);
+}
+
 void AGOSEngine::moveDirn_e2(Item *i, uint x) {
 	SubSuperRoom *sr;
 	Item *d, *p;

Modified: scummvm/trunk/engines/agos/script_e1.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_e1.cpp	2006-10-25 05:32:15 UTC (rev 24491)
+++ scummvm/trunk/engines/agos/script_e1.cpp	2006-10-25 08:12:05 UTC (rev 24492)
@@ -63,6 +63,7 @@
 	op[36] = &AGOSEngine::o_oflag;
 	op[37] = &AGOSEngine::oe1_canPut;
 
+	op[47] = &AGOSEngine::oe1_create;
 	op[48] = &AGOSEngine::o_destroy;
 
 	op[51] = &AGOSEngine::o_place;
@@ -105,6 +106,7 @@
 	op[91] = &AGOSEngine::o_message;
 	op[92] = &AGOSEngine::o_msg;
 
+	op[96] = &AGOSEngine::oe1_look;
 	op[97] = &AGOSEngine::o_end;
 	op[98] = &AGOSEngine::o_done;
 
@@ -140,6 +142,9 @@
 
 	op[198] = &AGOSEngine::o_comment;
 
+	op[201] = &AGOSEngine::oe1_saveGame;
+	op[202] = &AGOSEngine::oe1_loadGame;
+
 	op[206] = &AGOSEngine::o_getParent;
 	op[207] = &AGOSEngine::o_getNext;
 	op[208] = &AGOSEngine::o_getChildren;
@@ -290,6 +295,11 @@
 	setScriptCondition(canPlace(item1, item2) == 0);
 }
 
+void AGOSEngine::oe1_create() {
+	// 47: create
+	setItemParent(getNextItemPtr(), derefItem(me()->parent));
+}
+
 void AGOSEngine::oe1_copyof() {
 	// 54: copy of
 	Item *item = getNextItemPtr();
@@ -337,6 +347,11 @@
 	showMessageFormat("Your score is %ld.\n", p->score);
 }
 
+void AGOSEngine::oe1_look() {
+	// 96: look
+	debug(0, "oe1_look: stub");
+}
+
 void AGOSEngine::oe1_doClass() {
 	// 106: do class
 	Item *i = getNextItemPtr();
@@ -461,6 +476,16 @@
 	writeVariable(f, 255);
 }
 
+void AGOSEngine::oe1_saveGame() {
+	// 201: save game
+	debug(0, "oe1_saveGame: stub (%s)", getStringPtrByID(getNextStringID()));
+}
+
+void AGOSEngine::oe1_loadGame() {
+	// 202: load game
+	debug(0, "oe1_loadGame: stub (%s)", getStringPtrByID(getNextStringID()));
+}
+
 void AGOSEngine::oe1_clearUserItem() {
 	// 178: clear user item
 	Item *i = getNextItemPtr();

Modified: scummvm/trunk/engines/agos/script_e2.cpp
===================================================================
--- scummvm/trunk/engines/agos/script_e2.cpp	2006-10-25 05:32:15 UTC (rev 24491)
+++ scummvm/trunk/engines/agos/script_e2.cpp	2006-10-25 08:12:05 UTC (rev 24492)
@@ -42,6 +42,7 @@
 	op[37] = &AGOSEngine::oe1_whatO;
 	op[39] = &AGOSEngine::oe1_weigh;
 	op[54] = &AGOSEngine::oe2_moveDirn;
+	op[72] = &AGOSEngine::oe2_doClass;
 	op[73] = &AGOSEngine::oe2_pObj;
 	op[74] = &AGOSEngine::oe1_pName;
 	op[75] = &AGOSEngine::oe1_pcName;
@@ -66,6 +67,13 @@
 	op[162] = &AGOSEngine::oe2_unk162;
 	op[165] = &AGOSEngine::oe2_setSuperRoom;
 	op[166] = &AGOSEngine::oe2_getSuperRoom;
+	op[167] = &AGOSEngine::oe2_setExitOpen;
+	op[168] = &AGOSEngine::oe2_setExitClosed;
+	op[169] = &AGOSEngine::oe2_setExitLocked;
+	op[170] = &AGOSEngine::oe2_setExitClosed;
+	op[171] = &AGOSEngine::oe2_ifExitOpen;
+	op[172] = &AGOSEngine::oe2_ifExitClosed;
+	op[173] = &AGOSEngine::oe2_ifExitLocked;
 	op[175] = &AGOSEngine::o_getDollar2;
 	op[177] = &AGOSEngine::oe2_unk177;
 	op[178] = &AGOSEngine::oe2_unk178;
@@ -86,6 +94,29 @@
 	moveDirn_e2(me(), d);
 }
 
+void AGOSEngine::oe2_doClass() {
+	// 72: do class
+	Item *i = getNextItemPtr();
+	byte cm = getByte();
+	int16 num = getVarOrWord();
+
+	_classMask = (cm != 0xFF) ? 1 << cm : 0;
+	_classLine = (SubroutineLine *)((byte *)_currentTable + _currentLine->next);
+	if (num == 1) {
+		_subjectItem = findInByClass(i, (1 << cm));
+		if (_subjectItem)
+			_classMode1 = 1;
+		else
+			_classMode1 = 0;
+	} else {
+		_objectItem = findInByClass(i, (1 << cm));
+		if (_objectItem)
+			_classMode2 = 1;
+		else
+			_classMode2 = 0;
+	}
+}
+
 void AGOSEngine::oe2_pObj() {
 	// 73: print object
 	SubObject *subObject = (SubObject *)findChildOfType(getNextItemPtr(), 2);
@@ -211,6 +242,54 @@
 	writeNextVarContents(_superRoomNumber);
 }
 
+void AGOSEngine::oe2_setExitOpen() {
+	// 167: set exit open
+	Item *i = getNextItemPtr();
+	uint16 n = getVarOrWord();
+	uint16 d = getVarOrByte();
+	setExitState(i, n, d, 1);
+}
+
+void AGOSEngine::oe2_setExitClosed() {
+	// 168: set exit closed
+	Item *i = getNextItemPtr();
+	uint16 n = getVarOrWord();
+	uint16 d = getVarOrByte();
+	setExitState(i, n, d, 2);
+}
+
+void AGOSEngine::oe2_setExitLocked() {
+	// 169: set exit locked
+	Item *i = getNextItemPtr();
+	uint16 n = getVarOrWord();
+	uint16 d = getVarOrByte();
+	setExitState(i, n, d, 3);
+}
+
+void AGOSEngine::oe2_ifExitOpen() {
+	// 171: if exit open
+	Item *i = getNextItemPtr();
+	uint16 n = getVarOrWord();
+	uint16 d = getVarOrByte();
+	setScriptCondition(getExitState(i, n, d) == 1);
+}
+
+void AGOSEngine::oe2_ifExitClosed() {
+	// 172: if exit closed
+	Item *i = getNextItemPtr();
+	uint16 n = getVarOrWord();
+	uint16 d = getVarOrByte();
+	setScriptCondition(getExitState(i, n, d) == 2);
+}
+
+void AGOSEngine::oe2_ifExitLocked() {
+	// 173: if exit locked
+	Item *i = getNextItemPtr();
+	uint16 n = getVarOrWord();
+	uint16 d = getVarOrByte();
+	setScriptCondition(getExitState(i, n, d) == 3);
+}
+
 void AGOSEngine::oe2_unk177() {
 	// 177: set unknown vga event
 	uint a = getVarOrByte();


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