aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorFilippos Karapetis2008-06-05 13:23:57 +0000
committerFilippos Karapetis2008-06-05 13:23:57 +0000
commitbfd4fc910e76161cf088c2b9683414de7b32e3f4 (patch)
treeb254265e77209c9b980f78314a85d9dad5a6bd07 /engines
parentcae527c7037dff1ef6371cc149a400bf9c564587 (diff)
downloadscummvm-rg350-bfd4fc910e76161cf088c2b9683414de7b32e3f4.tar.gz
scummvm-rg350-bfd4fc910e76161cf088c2b9683414de7b32e3f4.tar.bz2
scummvm-rg350-bfd4fc910e76161cf088c2b9683414de7b32e3f4.zip
- Rewrote the way room updaters, preupdaters and room parsers are called and added debug output when they're called
- Simplified calls to converse() - Removed the useless para_codificar buffers - Renamed checkFlag -> checkAction svn-id: r32554
Diffstat (limited to 'engines')
-rw-r--r--engines/drascula/animation.cpp16
-rw-r--r--engines/drascula/drascula.cpp16
-rw-r--r--engines/drascula/drascula.h7
-rw-r--r--engines/drascula/rooms.cpp389
4 files changed, 203 insertions, 225 deletions
diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp
index ed4ccde4e4..91920df920 100644
--- a/engines/drascula/animation.cpp
+++ b/engines/drascula/animation.cpp
@@ -1519,7 +1519,7 @@ void DrasculaEngine::animation_1_5() {
}
trackProtagonist = 1;
- converse("op_8.cal");
+ converse(8);
}
void DrasculaEngine::animation_2_5() {
@@ -1886,7 +1886,7 @@ void DrasculaEngine::animation_1_6() {
talk_drascula(22, 1);
talk(249);
talk_drascula(23, 1);
- converse("op_11.cal");
+ converse(11);
talk_drascula(26, 1);
animate("fum.bin", 15);
@@ -2173,7 +2173,7 @@ void DrasculaEngine::animation_12_2() {
flags[11] = 1;
talk_pianist(5);
- converse("op_1.cal");
+ converse(1);
if (_lang == kSpanish)
textSurface = extraSurface;
@@ -2282,7 +2282,7 @@ void DrasculaEngine::animation_13_2() {
talk_drunk(7);
flags[41] = 1;
}
- converse("op_2.cal");
+ converse(2);
loadPic(964, frontSurface);
}
@@ -2290,7 +2290,7 @@ void DrasculaEngine::animation_13_2() {
void DrasculaEngine::animation_18_2() {
talk(378);
talk_vbpuerta(4);
- converse("op_3.cal");
+ converse(3);
}
void DrasculaEngine::animation_22_2() {
@@ -2331,9 +2331,9 @@ void DrasculaEngine::animation_24_2() {
talk_vb(22);
if (flags[22] == 0)
- converse("op_4.cal");
+ converse(4);
else
- converse("op_5.cal");
+ converse(5);
exitRoom(0);
flags[21] = 0;
@@ -2653,7 +2653,7 @@ void DrasculaEngine::animation_1_4() {
talk_igor(6, kIgorSeated);
}
- converse("op_6.cal");
+ converse(6);
flags[20] = 0;
flags[18] = 0;
}
diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp
index b5924d6c7b..23b04a2e60 100644
--- a/engines/drascula/drascula.cpp
+++ b/engines/drascula/drascula.cpp
@@ -100,6 +100,7 @@ int DrasculaEngine::init() {
_lang = 0;
}
+ setupRoomsTable();
loadArchives();
return 0;
@@ -788,13 +789,11 @@ void DrasculaEngine::enterRoom(int roomIndex) {
int soc, l, martin = 0, objIsExit = 0;
float chiquez = 0, pequegnez = 0;
char pant1[20], pant2[20], pant3[20], pant4[20];
- char para_codificar[20];
char buffer[256];
int palLevel = 0;
hasName = 0;
- strcpy(para_codificar, fileName);
strcpy(currentData, fileName);
_arj.open(fileName);
@@ -1166,7 +1165,7 @@ bool DrasculaEngine::verify2() {
return true;
} else {
if (!strcmp(textName, "hacker") && hasName == 1) {
- if (checkFlag(50))
+ if (checkAction(50))
return true;
} else {
for (l = 0; l < numRoomObjs; l++) {
@@ -1175,7 +1174,7 @@ bool DrasculaEngine::verify2() {
trackFinal = trackObj[l];
walkToObject = 1;
gotoObject(roomObjX[l], roomObjY[l]);
- if (checkFlag(objectNum[l]))
+ if (checkAction(objectNum[l]))
return true;
if (currentChapter == 4)
break;
@@ -3028,7 +3027,7 @@ bool DrasculaEngine::checkMenuFlags() {
if (whichObject() == n) {
h = inventoryObjects[n];
if (h != 0)
- if (checkFlag(h))
+ if (checkAction(h))
return true;
}
}
@@ -3036,14 +3035,15 @@ bool DrasculaEngine::checkMenuFlags() {
return false;
}
-void DrasculaEngine::converse(const char *fileName) {
+void DrasculaEngine::converse(int index) {
+ char fileName[20];
+ sprintf(fileName, "op_%d.cal", index);
int h;
int game1 = 1, game2 = 1, game3 = 1, game4 = 1;
char phrase1[78];
char phrase2[78];
char phrase3[87];
char phrase4[78];
- char para_codificar[13];
char sound1[13];
char sound2[13];
char sound3[13];
@@ -3059,8 +3059,6 @@ void DrasculaEngine::converse(const char *fileName) {
breakOut = 0;
- strcpy(para_codificar, fileName);
-
if (currentChapter == 5)
withoutVerb();
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index 364bcadbc2..f125bb399d 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -400,7 +400,7 @@ public:
void removeObject();
bool exitRoom(int);
bool pickupObject();
- bool checkFlag(int);
+ bool checkAction(int);
void setCursorTable();
void enterName();
bool soundIsActive();
@@ -440,8 +440,9 @@ public:
void increaseFrameNum();
int whichObject();
bool checkMenuFlags();
+ void setupRoomsTable();
bool roomParse(RoomTalkAction*, int, int);
- void converse(const char *);
+ void converse(int);
void print_abc_opc(const char *, int, int, int);
void response(int);
void room_pendulum(int);
@@ -635,9 +636,9 @@ public:
void update_31();
void update_34();
void update_35();
+ void update_49_pre();
void update_53_pre();
void update_54_pre();
- void update_49_pre();
void update_56_pre();
void update_50();
void update_57();
diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp
index e318dccf27..c1100c1115 100644
--- a/engines/drascula/rooms.cpp
+++ b/engines/drascula/rooms.cpp
@@ -23,11 +23,134 @@
*
*/
+#include "common/array.h"
+
#include "drascula/drascula.h"
#include "drascula/staticdata.h"
namespace Drascula {
+typedef void (DrasculaEngine::*RoomParser)(int args);
+
+struct DrasculaRoomParser {
+ DrasculaRoomParser(const char* d, RoomParser p) : desc(d), proc(p) {}
+ const char* desc;
+ RoomParser proc;
+};
+
+typedef void (DrasculaEngine::*Updater)();
+
+struct DrasculaUpdater {
+ DrasculaUpdater(const char* d, Updater p) : desc(d), proc(p) {}
+ const char* desc;
+ Updater proc;
+};
+
+Common::Array<DrasculaRoomParser*> _roomParsers;
+Common::Array<DrasculaUpdater*> _roomPreupdaters;
+Common::Array<DrasculaUpdater*> _roomUpdaters;
+
+#define ROOM(x) _roomParsers.push_back(new DrasculaRoomParser(#x, &DrasculaEngine::x))
+#define PREUPDATEROOM(x) _roomPreupdaters.push_back(new DrasculaUpdater(#x, &DrasculaEngine::x))
+#define UPDATEROOM(x) _roomUpdaters.push_back(new DrasculaUpdater(#x, &DrasculaEngine::x))
+
+void DrasculaEngine::setupRoomsTable() {
+ //ROOM(room_0); // default
+ ROOM(room_1);
+ ROOM(room_3);
+ ROOM(room_4);
+ ROOM(room_5);
+ ROOM(room_6);
+ ROOM(room_7);
+ ROOM(room_8);
+ ROOM(room_9);
+ ROOM(room_12);
+ //ROOM(room_13); // returns bool
+ ROOM(room_14);
+ ROOM(room_15);
+ ROOM(room_16);
+ ROOM(room_17);
+ ROOM(room_18);
+ ROOM(room_19);
+ //ROOM(room_21); // returns bool
+ ROOM(room_22);
+ ROOM(room_23);
+ ROOM(room_24);
+ ROOM(room_26);
+ ROOM(room_27);
+ ROOM(room_29);
+ ROOM(room_30);
+ ROOM(room_31);
+ ROOM(room_34);
+ ROOM(room_35);
+ ROOM(room_44);
+ ROOM(room_49);
+ ROOM(room_53);
+ ROOM(room_54);
+ ROOM(room_55);
+ //ROOM(room_56); // returns bool
+ ROOM(room_58);
+ ROOM(room_59);
+ //ROOM(room_60); // returns bool
+ ROOM(room_61);
+ ROOM(room_62);
+ ROOM(room_63);
+
+ PREUPDATEROOM(update_1_pre);
+ PREUPDATEROOM(update_3_pre);
+ PREUPDATEROOM(update_5_pre);
+ PREUPDATEROOM(update_6_pre);
+ PREUPDATEROOM(update_7_pre);
+ PREUPDATEROOM(update_9_pre);
+ PREUPDATEROOM(update_12_pre);
+ PREUPDATEROOM(update_14_pre);
+ PREUPDATEROOM(update_16_pre);
+ PREUPDATEROOM(update_17_pre);
+ PREUPDATEROOM(update_18_pre);
+ PREUPDATEROOM(update_21_pre);
+ PREUPDATEROOM(update_22_pre);
+ PREUPDATEROOM(update_23_pre);
+ PREUPDATEROOM(update_24_pre);
+ PREUPDATEROOM(update_26_pre);
+ PREUPDATEROOM(update_27_pre);
+ PREUPDATEROOM(update_29_pre);
+ PREUPDATEROOM(update_30_pre);
+ PREUPDATEROOM(update_31_pre);
+ PREUPDATEROOM(update_34_pre);
+ PREUPDATEROOM(update_35_pre);
+ PREUPDATEROOM(update_49_pre);
+ PREUPDATEROOM(update_53_pre);
+ PREUPDATEROOM(update_54_pre);
+ PREUPDATEROOM(update_56_pre);
+ PREUPDATEROOM(update_58_pre);
+ PREUPDATEROOM(update_59_pre);
+ PREUPDATEROOM(update_60_pre);
+ PREUPDATEROOM(update_62_pre);
+
+ UPDATEROOM(update_2);
+ UPDATEROOM(update_3);
+ UPDATEROOM(update_4);
+ UPDATEROOM(update_5);
+ UPDATEROOM(update_13);
+ UPDATEROOM(update_15);
+ UPDATEROOM(update_17);
+ UPDATEROOM(update_18);
+ UPDATEROOM(update_20);
+ UPDATEROOM(update_26);
+ UPDATEROOM(update_27);
+ UPDATEROOM(update_29);
+ UPDATEROOM(update_31);
+ UPDATEROOM(update_34);
+ UPDATEROOM(update_35);
+ UPDATEROOM(update_50);
+ UPDATEROOM(update_57);
+ UPDATEROOM(update_58);
+ UPDATEROOM(update_60);
+ UPDATEROOM(update_61);
+ UPDATEROOM(update_62);
+ UPDATEROOM(update_63);
+}
+
bool DrasculaEngine::roomParse(RoomTalkAction* roomActions, int actionCount, int fl) {
for (int i = 0; i < actionCount; i++) {
if (roomActions[i].chapter == currentChapter ||
@@ -37,6 +160,7 @@ bool DrasculaEngine::roomParse(RoomTalkAction* roomActions, int actionCount, int
if (roomActions[i].objectID == fl ||
roomActions[i].objectID == -1) {
talk(roomActions[i].speechID);
+ hasAnswer = 1;
return true;
}
}
@@ -275,7 +399,7 @@ bool DrasculaEngine::room_13(int fl) {
talk(412);
strcpy(objName[1], "yoda");
} else if (pickedObject == kVerbTalk && fl == 51)
- converse("op_7.cal");
+ converse(7);
else if (pickedObject == 19 && fl == 51)
animation_1_3();
else if (pickedObject == 9 && fl == 51) {
@@ -722,7 +846,7 @@ void DrasculaEngine::room_49(int fl){
return;
if (pickedObject == kVerbTalk && fl ==51)
- converse("op_9.cal");
+ converse(9);
else if ((pickedObject == 8 && fl == 51) || (pickedObject == 8 && fl == 203))
animation_5_5();
else
@@ -770,7 +894,7 @@ void DrasculaEngine::room_54(int fl) {
talk(289);
talk_mus(2);
talk_mus(3);
- converse("op_10.cal");
+ converse(10);
flags[12] = 0;
flags[14] = 1;
} else if (pickedObject == kVerbTalk && fl == 53 && flags[14] == 1)
@@ -904,7 +1028,7 @@ bool DrasculaEngine::room_60(int fl) {
else if (pickedObject == kVerbTalk && fl == 52) {
talk(266);
talk_bartender(1, 1);
- converse("op_12.cal");
+ converse(12);
withoutVerb();
pickedObject = 0;
} else if (pickedObject == 21 && fl == 56)
@@ -933,7 +1057,7 @@ void DrasculaEngine::room_62(int fl) {
return;
if (pickedObject == kVerbTalk && fl == 53)
- converse("op_13.cal");
+ converse(13);
else if (pickedObject == kVerbTalk && fl == 52 && flags[0] == 0)
animation_3_1();
else if (pickedObject == kVerbTalk && fl == 52 && flags[0] == 1)
@@ -966,136 +1090,39 @@ void DrasculaEngine::room_pendulum(int fl) {
}
void DrasculaEngine::updateRefresh() {
- if (currentChapter == 1) {
- if (roomNumber == 63)
- update_63();
- else if (roomNumber == 62)
- update_62();
- } else if (currentChapter == 2) {
- if (roomNumber == 3)
- update_3();
- else if (roomNumber == 2)
- update_2();
- else if (roomNumber == 4)
- update_4();
- else if (roomNumber == 5)
- update_5();
- else if (roomNumber == 15)
- update_15();
- else if (roomNumber == 17)
- update_17();
- else if (roomNumber == 18)
- update_18();
- else if (roomNumber == 10)
- showMap();
- } else if (currentChapter == 3) {
- if (roomNumber == 20)
- update_20();
- else if (roomNumber == 13)
- update_13();
- } else if (currentChapter == 4) {
- if (roomNumber == 29)
- update_29();
- else if (roomNumber == 26)
- update_26();
- else if (roomNumber == 27)
- update_27();
- else if (roomNumber == 31)
- update_31();
- else if (roomNumber == 34)
- update_34();
- else if (roomNumber == 35)
- update_35();
- } else if (currentChapter == 5) {
- if (roomNumber == 45)
- showMap();
- else if (roomNumber == 50)
- update_50();
- else if (roomNumber == 57)
- update_57();
- } else if (currentChapter == 6) {
- if (roomNumber == 60)
- update_60();
- else if (roomNumber == 61)
- update_61();
- else if (roomNumber == 58)
- update_58();
+ // Call room-specific updater
+ char rm[20];
+ sprintf(rm, "update_%d", roomNumber);
+ for (uint i = 0; i < _roomUpdaters.size(); i++) {
+ if (!strcmp(rm, _roomUpdaters[i]->desc)) {
+ debug(4, "Calling room updater %d", roomNumber);
+ (this->*(_roomUpdaters[i]->proc))();
+ break;
+ }
}
+
+ if (roomNumber == 10)
+ showMap();
+ else if (roomNumber == 45)
+ showMap();
}
void DrasculaEngine::updateRefresh_pre() {
- if (currentChapter == 1) {
- if (roomNumber == 62)
- update_62_pre();
- else if (roomNumber == 16)
- placeBJ();
- } else if (currentChapter == 2) {
- if (roomNumber == 1)
- update_1_pre();
- else if (roomNumber == 3)
- update_3_pre();
- else if (roomNumber == 5)
- update_5_pre();
- else if (roomNumber == 6)
- update_6_pre();
- else if (roomNumber == 7)
- update_7_pre();
- else if (roomNumber == 9)
- update_9_pre();
- else if (roomNumber == 12)
- update_12_pre();
- else if (roomNumber == 14)
- update_14_pre();
- else if (roomNumber == 16)
- update_16_pre();
- else if (roomNumber == 17)
- update_17_pre();
- else if (roomNumber == 18)
- update_18_pre();
- } else if (currentChapter == 3) {
- // nothing
- } else if (currentChapter == 4) {
- if (roomNumber == 21)
- update_21_pre();
- else if (roomNumber == 22)
- update_22_pre();
- else if (roomNumber == 23)
- update_23_pre();
- else if (roomNumber == 24)
- update_24_pre();
- else if (roomNumber == 26)
- update_26_pre();
- else if (roomNumber == 27)
- update_27_pre();
- else if (roomNumber == 29)
- update_29_pre();
- else if (roomNumber == 30)
- update_30_pre();
- else if (roomNumber == 31)
- update_31_pre();
- else if (roomNumber == 34)
- update_34_pre();
- else if (roomNumber == 35)
- update_35_pre();
- } else if (currentChapter == 5) {
- if (roomNumber == 49)
- update_49_pre();
- else if (roomNumber == 53)
- update_53_pre();
- else if (roomNumber == 54)
- update_54_pre();
- else if (roomNumber == 56)
- update_56_pre();
- } else if (currentChapter == 6) {
- if (roomNumber == 102)
- update_pendulum();
- else if (roomNumber == 58)
- update_58_pre();
- else if (roomNumber == 59)
- update_59_pre();
- else if (roomNumber == 60)
- update_60_pre();
+ // Call room-specific preupdater
+ char rm[20];
+ sprintf(rm, "update_%d_pre", roomNumber);
+ for (uint i = 0; i < _roomPreupdaters.size(); i++) {
+ if (!strcmp(rm, _roomPreupdaters[i]->desc)) {
+ debug(4, "Calling room preupdater %d", roomNumber);
+ (this->*(_roomPreupdaters[i]->proc))();
+ break;
+ }
}
+
+ if (currentChapter == 1 && roomNumber == 16)
+ placeBJ();
+ else if (roomNumber == 102)
+ update_pendulum();
}
void DrasculaEngine::update_1_pre() {
@@ -1297,6 +1324,11 @@ void DrasculaEngine::update_15() {
}
void DrasculaEngine::update_16_pre() {
+ if (currentChapter != 2) {
+ debug(4, "update_16_pre: Special case, current chapter is not 2, not performing update");
+ return;
+ }
+
if (flags[17] == 0)
copyBackground(1, 103, 24, 72, 33, 95, drawSurface3, screenSurface);
if (flags[19] == 1)
@@ -1677,7 +1709,7 @@ void DrasculaEngine::update_pendulum() {
}
}
-bool DrasculaEngine::checkFlag(int fl) {
+bool DrasculaEngine::checkAction(int fl) {
characterMoved = 0;
updateRoom();
updateScreen();
@@ -1688,6 +1720,8 @@ bool DrasculaEngine::checkFlag(int fl) {
if (currentChapter == 1) {
if (pickedObject == kVerbLook && fl == 28)
talk(328);
+ else
+ hasAnswer = 0;
} else if (currentChapter == 2) {
if ((pickedObject == kVerbLook && fl == 22 && flags[23] == 0)
|| (pickedObject == kVerbOpen && fl == 22 && flags[23] == 0)) {
@@ -1890,10 +1924,6 @@ bool DrasculaEngine::checkFlag(int fl) {
talk(313);
else if (pickedObject == kVerbTalk && fl == 50)
talk(314);
- else if (roomNumber == 62)
- room_62(fl);
- else if (roomNumber == 63)
- room_63(fl);
else
hasAnswer = 0;
} else if (currentChapter == 2) {
@@ -1916,36 +1946,6 @@ bool DrasculaEngine::checkFlag(int fl) {
talk(156);
else if (pickedObject == 20 && fl == 50)
talk(163);
- else if (roomNumber == 1)
- room_1(fl);
- else if (roomNumber == 3)
- room_3(fl);
- else if (roomNumber == 4)
- room_4(fl);
- else if (roomNumber == 5)
- room_5(fl);
- else if (roomNumber == 6)
- room_6(fl);
- else if (roomNumber == 7)
- room_7(fl);
- else if (roomNumber == 8)
- room_8(fl);
- else if (roomNumber == 9)
- room_9(fl);
- else if (roomNumber == 12)
- room_12(fl);
- else if (roomNumber == 14)
- room_14(fl);
- else if (roomNumber == 15)
- room_15(fl);
- else if (roomNumber == 16)
- room_16(fl);
- else if (roomNumber == 17)
- room_17(fl);
- else if (roomNumber == 18)
- room_18(fl);
- else if (roomNumber == 19)
- room_19(fl);
else
hasAnswer = 0;
} else if (currentChapter == 3) {
@@ -1992,29 +1992,7 @@ bool DrasculaEngine::checkFlag(int fl) {
else if (roomNumber == 21) {
if (room_21(fl))
return true;
- } else if (roomNumber == 22)
- room_22(fl);
- else if (roomNumber == 23)
- room_23(fl);
- else if (roomNumber == 24)
- room_24(fl);
- else if (roomNumber == 26)
- room_26(fl);
- else if (roomNumber == 27)
- room_27(fl);
- else if (roomNumber == 29)
- room_29(fl);
- else if (roomNumber == 30)
- room_30(fl);
- else if (roomNumber == 31)
- room_31(fl);
- else if (roomNumber == 34)
- room_34(fl);
- else if (roomNumber == 35)
- room_35(fl);
- else if (roomNumber == 44)
- room_44(fl);
- else
+ } else
hasAnswer = 0;
} else if (currentChapter == 5) {
// TODO: These are not translated
@@ -2032,14 +2010,6 @@ bool DrasculaEngine::checkFlag(int fl) {
talk("hola yo", "16.als");
else if (pickedObject == 20 && fl == 50)
talk(487);
- else if (roomNumber == 49)
- room_49(fl);
- else if (roomNumber == 53)
- room_53(fl);
- else if (roomNumber == 54)
- room_54(fl);
- else if (roomNumber == 55)
- room_55(fl);
else if (roomNumber == 56) {
if (room_56(fl))
return true;
@@ -2062,22 +2032,31 @@ bool DrasculaEngine::checkFlag(int fl) {
talk(314);
else if (roomNumber == 102)
room_pendulum(fl);
- else if (roomNumber == 58)
- room_58(fl);
- else if (roomNumber == 59)
- room_59(fl);
else if (roomNumber == 60) {
if (room_60(fl))
return true;
- } else if (roomNumber == 61)
- room_61(fl);
+ }
else
hasAnswer = 0;
}
}
- if (hasAnswer == 0 && hasName == 1)
- room_0();
- else if (hasAnswer == 0 && menuScreen == 1)
+
+ if (hasAnswer == 0) {
+ hasAnswer = 1;
+
+ // Call room-specific parser
+ char rm[20];
+ sprintf(rm, "room_%d", roomNumber);
+ for (uint i = 0; i < _roomParsers.size(); i++) {
+ if (!strcmp(rm, _roomParsers[i]->desc)) {
+ debug(4, "Calling room parser %d", roomNumber);
+ (this->*(_roomParsers[i]->proc))(fl);
+ break;
+ }
+ }
+ }
+
+ if (hasAnswer == 0 && (hasName == 1 || menuScreen == 1))
room_0();
return false;