[Scummvm-cvs-logs] SF.net SVN: scummvm: [24142] scummvm/trunk/engines/agos
kirben at users.sourceforge.net
kirben at users.sourceforge.net
Fri Oct 6 17:17:03 CEST 2006
Revision: 24142
http://svn.sourceforge.net/scummvm/?rev=24142&view=rev
Author: kirben
Date: 2006-10-06 08:16:56 -0700 (Fri, 06 Oct 2006)
Log Message:
-----------
Add more code for Elvira 2
Modified Paths:
--------------
scummvm/trunk/engines/agos/agos.h
scummvm/trunk/engines/agos/debug.h
scummvm/trunk/engines/agos/items.cpp
scummvm/trunk/engines/agos/rooms.cpp
Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h 2006-10-06 14:44:39 UTC (rev 24141)
+++ scummvm/trunk/engines/agos/agos.h 2006-10-06 15:16:56 UTC (rev 24142)
@@ -999,11 +999,14 @@
int16 levelOf(Item *item);
int wordMatch(Item *item, int16 a, int16 n);
+ 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);
void moveDirn_e1(Item *i, uint x);
void moveDirn_e2(Item *i, uint x);
void moveDirn_ww(Item *i, uint x);
@@ -1040,6 +1043,9 @@
void oe1_printStats();
// Opcodes, Elvira 2 only
+ void oe2_setDoorState1();
+ void oe2_setDoorState2();
+ void oe2_setDoorState3();
void oe2_opcode161();
// Opcodes, Waxworks only
Modified: scummvm/trunk/engines/agos/debug.h
===================================================================
--- scummvm/trunk/engines/agos/debug.h 2006-10-06 14:44:39 UTC (rev 24141)
+++ scummvm/trunk/engines/agos/debug.h 2006-10-06 15:16:56 UTC (rev 24142)
@@ -566,10 +566,10 @@
"WJ|IS_BOX",
"I|START_ITEM_SUB",
/* 144 */
- NULL,
- NULL,
- NULL,
- NULL,
+ "IB|SET_DOOR_STATE1",
+ "IB|SET_DOOR_STATE2",
+ "IB|SET_DOOR_STATE3",
+ "IB|SET_DOOR_STATE2",
/* 148 */
"IB|IF_DOOR_OPEN",
NULL,
Modified: scummvm/trunk/engines/agos/items.cpp
===================================================================
--- scummvm/trunk/engines/agos/items.cpp 2006-10-06 14:44:39 UTC (rev 24141)
+++ scummvm/trunk/engines/agos/items.cpp 2006-10-06 15:16:56 UTC (rev 24142)
@@ -330,6 +330,10 @@
op[98] = &AGOSEngine::o1_animate;
op[99] = &AGOSEngine::o1_stopAnimate;
op[127] = &AGOSEngine::o1_playTune;
+ op[144] = &AGOSEngine::oe2_setDoorState1;
+ op[145] = &AGOSEngine::oe2_setDoorState2;
+ op[146] = &AGOSEngine::oe2_setDoorState3;
+ op[147] = &AGOSEngine::oe2_setDoorState2;
op[148] = &AGOSEngine::oww_ifDoorOpen;
op[161] = &AGOSEngine::oe2_opcode161;
op[175] = &AGOSEngine::o_getDollar2;
@@ -374,6 +378,10 @@
op[105] = &AGOSEngine::oww_menu;
op[106] = &AGOSEngine::oww_textMenu;
op[127] = &AGOSEngine::o1_playTune;
+ op[144] = &AGOSEngine::oe2_setDoorState1;
+ op[145] = &AGOSEngine::oe2_setDoorState2;
+ op[146] = &AGOSEngine::oe2_setDoorState3;
+ op[147] = &AGOSEngine::oe2_setDoorState2;
op[148] = &AGOSEngine::oww_ifDoorOpen;
op[175] = &AGOSEngine::o_getDollar2;
op[179] = &AGOSEngine::o_isAdjNoun;
@@ -1899,6 +1907,24 @@
// Elvira 2 Opcodes
// -----------------------------------------------------------------------
+void AGOSEngine::oe2_setDoorState1() {
+ // 144:
+ Item *i = getNextItemPtr();
+ setDoorState(i, getVarOrByte(), 1);
+}
+
+void AGOSEngine::oe2_setDoorState2() {
+ // 145:
+ Item *i = getNextItemPtr();
+ setDoorState(i, getVarOrByte(), 2);
+}
+
+void AGOSEngine::oe2_setDoorState3() {
+ // 146:
+ Item *i = getNextItemPtr();
+ setDoorState(i, getVarOrByte(), 3);
+}
+
void AGOSEngine::oe2_opcode161() {
// 161:
}
Modified: scummvm/trunk/engines/agos/rooms.cpp
===================================================================
--- scummvm/trunk/engines/agos/rooms.cpp 2006-10-06 14:44:39 UTC (rev 24141)
+++ scummvm/trunk/engines/agos/rooms.cpp 2006-10-06 15:16:56 UTC (rev 24142)
@@ -30,6 +30,19 @@
namespace AGOS {
+uint16 AGOSEngine::getBackExit(int n) {
+ switch (n) {
+ case 0:return 2;
+ case 1:return 3;
+ case 2:return 0;
+ case 3:return 1;
+ case 4:return 5;
+ case 5:return 4;
+ }
+
+ return 0;
+}
+
uint16 AGOSEngine::getDoorOf(Item *i, uint16 d) {
SubGenExit *g;
Item *x;
@@ -116,6 +129,53 @@
return n;
}
+void AGOSEngine::changeDoorState(SubRoom *r, uint16 d, uint16 n) {
+ uint16 mask=3;
+ d <<= 1;
+ mask <<= d;
+ n <<= d;
+ r->roomExitStates &= ~mask;
+ r->roomExitStates|= n;
+}
+
+void AGOSEngine::setDoorState(Item *i, uint16 d, uint16 n) {
+ Item *j;
+ SubRoom *r, *r1;
+ uint16 d1;
+ uint16 y = 0;
+
+ r = (SubRoom *)findChildOfType(i, 1);
+ if (r == NULL)
+ return;
+ d1 = d;
+ while (d > y) {
+ if (getDoorState(i, y) == 0)
+ d1--;
+ y++;
+ }
+ changeDoorState(r, d, n);
+
+ j = derefItem(r->roomExit[d1]);
+ if (j == NULL)
+ return;
+ r1 = (SubRoom *)findChildOfType(j, 1);
+ if (r1 == NULL)
+ return;
+ d = getBackExit(d);
+ d1 = d;
+ y = 0;
+ while(d > y) {
+ if (getDoorState(j, y) == 0)
+ d1--;
+ y++;
+ }
+ /* Check are a complete exit pair */
+ if (derefItem(r1->roomExit[d1]) != i)
+ return;
+ /* Change state of exit coming back */
+ changeDoorState(r1, d, n);
+}
+
void AGOSEngine::moveDirn_e1(Item *i, uint x) {
Item *d, *p;
uint16 n;
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