diff options
author | Travis Howell | 2006-10-06 15:16:56 +0000 |
---|---|---|
committer | Travis Howell | 2006-10-06 15:16:56 +0000 |
commit | 4b900edfeb984518d910bd46d85db4adc2061921 (patch) | |
tree | b8effee061ed035a43d98e7858d738e1a2ec41d9 /engines/agos/rooms.cpp | |
parent | 38195077d4b9fa8a3a0a73c8e60d193dc7f87f6b (diff) | |
download | scummvm-rg350-4b900edfeb984518d910bd46d85db4adc2061921.tar.gz scummvm-rg350-4b900edfeb984518d910bd46d85db4adc2061921.tar.bz2 scummvm-rg350-4b900edfeb984518d910bd46d85db4adc2061921.zip |
Add more code for Elvira 2
svn-id: r24142
Diffstat (limited to 'engines/agos/rooms.cpp')
-rw-r--r-- | engines/agos/rooms.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
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; |