aboutsummaryrefslogtreecommitdiff
path: root/engines/agos/rooms.cpp
diff options
context:
space:
mode:
authorTravis Howell2006-10-25 08:12:05 +0000
committerTravis Howell2006-10-25 08:12:05 +0000
commit7dd6b31aef45b4cef6009f1968491ba46507c2c8 (patch)
tree27d73bf44e81636e4d583c019d17ea320533261b /engines/agos/rooms.cpp
parent869243142ad4e42c23c52617414fe737c3eead86 (diff)
downloadscummvm-rg350-7dd6b31aef45b4cef6009f1968491ba46507c2c8.tar.gz
scummvm-rg350-7dd6b31aef45b4cef6009f1968491ba46507c2c8.tar.bz2
scummvm-rg350-7dd6b31aef45b4cef6009f1968491ba46507c2c8.zip
Add more opcodes for Elvira 1/2
svn-id: r24492
Diffstat (limited to 'engines/agos/rooms.cpp')
-rw-r--r--engines/agos/rooms.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/engines/agos/rooms.cpp b/engines/agos/rooms.cpp
index 9977e66ea4..8154596562 100644
--- a/engines/agos/rooms.cpp
+++ b/engines/agos/rooms.cpp
@@ -191,6 +191,72 @@ void AGOSEngine::moveDirn_e1(Item *i, uint x) {
}
// 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 @@ uint16 AGOSEngine::getExitState(Item *i, uint16 x, uint16 d) {
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;