aboutsummaryrefslogtreecommitdiff
path: root/engines/agos
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agos')
-rw-r--r--engines/agos/agos.h6
-rw-r--r--engines/agos/debug.h8
-rw-r--r--engines/agos/items.cpp26
-rw-r--r--engines/agos/rooms.cpp60
4 files changed, 96 insertions, 4 deletions
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index f582b9aa47..6aef46f76b 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -999,11 +999,14 @@ public:
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 @@ public:
void oe1_printStats();
// Opcodes, Elvira 2 only
+ void oe2_setDoorState1();
+ void oe2_setDoorState2();
+ void oe2_setDoorState3();
void oe2_opcode161();
// Opcodes, Waxworks only
diff --git a/engines/agos/debug.h b/engines/agos/debug.h
index bcb500f89e..82bd8ac959 100644
--- a/engines/agos/debug.h
+++ b/engines/agos/debug.h
@@ -566,10 +566,10 @@ static const char *const ww_opcode_name_table[256] = {
"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,
diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp
index 65e20d9ec5..48e3fc2b66 100644
--- a/engines/agos/items.cpp
+++ b/engines/agos/items.cpp
@@ -330,6 +330,10 @@ void AGOSEngine::setupElvira2Opcodes(OpcodeProc *op) {
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 @@ void AGOSEngine::setupWaxworksOpcodes(OpcodeProc *op) {
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 @@ void AGOSEngine::oe1_printStats() {
// 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:
}
diff --git a/engines/agos/rooms.cpp b/engines/agos/rooms.cpp
index c42180377f..2d9bce0588 100644
--- a/engines/agos/rooms.cpp
+++ b/engines/agos/rooms.cpp
@@ -30,6 +30,19 @@ using Common::File;
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 @@ uint16 AGOSEngine::getExitState(Item *i, uint16 x, uint16 d) {
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;