diff options
Diffstat (limited to 'queen')
-rw-r--r-- | queen/cutaway.cpp | 17 | ||||
-rw-r--r-- | queen/display.cpp | 14 | ||||
-rw-r--r-- | queen/logic.h | 6 | ||||
-rw-r--r-- | queen/queen.cpp | 90 | ||||
-rw-r--r-- | queen/queen.h | 3 | ||||
-rw-r--r-- | queen/resource.cpp | 2 | ||||
-rw-r--r-- | queen/structs.h | 10 | ||||
-rw-r--r-- | queen/xref.txt | 2 |
8 files changed, 127 insertions, 17 deletions
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index f9be1a57f3..60503b331c 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -187,7 +187,7 @@ void Cutaway::loadStrings(byte *ptr) { ptr = Talk::getString(ptr, _bankNames[j], MAX_FILENAME_LENGTH); if (_bankNames[j][0]) { - debug(0, "Bank name %i = '%s'", _bankNames[j]); + debug(0, "Bank name %i = '%s'", j, _bankNames[j]); j++; } } @@ -244,10 +244,15 @@ void Cutaway::dumpCutawayObject(int index, CutawayObject &object) const char *objectNumberStr; switch (object.objectNumber) { - case -1: objectNumberStr = "MESSAGE"; break; - case 0: objectNumberStr = "Joe"; break; - default: - objectNumberStr = _logic->objectName(_logic->objectData(object.objectNumber)->name); + case -1: + objectNumberStr = "MESSAGE"; break; + case 0: + objectNumberStr = "Joe"; break; + default: + if (object.objectNumber > 0) + objectNumberStr = _logic->objectName(abs(_logic->objectData(object.objectNumber)->name)); + else + objectNumberStr = "Unknown!"; break; } @@ -762,7 +767,7 @@ void Cutaway::run(char *nextFilename) { break; default: - error("Unhandled object type: %i", objectType); + warning("Unhandled object type: %i", objectType); break; } diff --git a/queen/display.cpp b/queen/display.cpp index ee0b37cc14..9e2e85f7e8 100644 --- a/queen/display.cpp +++ b/queen/display.cpp @@ -145,11 +145,15 @@ void Display::dynalumInit(Resource *resource, const char *roomName, uint16 roomN // FIXME: are these tests really needed ? if (roomNum < 90 || ((roomNum > 94) && (roomNum < 114))) { char filename[20]; - sprintf(filename, "%s.msk", roomName); - resource->loadFile(filename, 0, (uint8*)_dynalum.msk); - sprintf(filename, "%s.lum", roomName); - resource->loadFile(filename, 0, (uint8*)_dynalum.lum); - } + + sprintf(filename, "%s.msk", roomName); + if (resource->exists(filename)) + resource->loadFile(filename, 0, (uint8*)_dynalum.msk); + + sprintf(filename, "%s.lum", roomName); + if (resource->exists(filename)) + resource->loadFile(filename, 0, (uint8*)_dynalum.lum); + } } diff --git a/queen/logic.h b/queen/logic.h index d1f28a328c..d3960f53b3 100644 --- a/queen/logic.h +++ b/queen/logic.h @@ -57,7 +57,13 @@ public: uint16 currentRoom(); void currentRoom(uint16 room); + + uint16 oldRoom() { return _oldRoom; } void oldRoom(uint16 room); + + uint16 newRoom() { return _newRoom; } + void newRoom(uint16 room) { _newRoom = room; } + ObjectData* objectData(int index); uint16 roomData(int room); uint16 objMax(int room); diff --git a/queen/queen.cpp b/queen/queen.cpp index a4e91c9c0e..ac9a643be4 100644 --- a/queen/queen.cpp +++ b/queen/queen.cpp @@ -21,6 +21,10 @@ #include "stdafx.h" #include "queen/queen.h" +#include "queen/cutaway.h" +#include "queen/talk.h" +#include "queen/walk.h" +#include "queen/graphics.h" #include "common/config-manager.h" #include "common/file.h" #include "base/gameDetector.h" @@ -85,13 +89,97 @@ void QueenEngine::errorString(const char *buf1, char *buf2) { strcpy(buf2, buf1); } +void QueenEngine::roomChanged() { + // queen.c function SETUP_ROOM, lines 398-428 + + // This function uses lots of variables in logic, but we can't move it to + // logic because that would cause a circular dependency between Cutaway and + // Logic... :-( + + if (_logic->currentRoom() == 7) { + warning("Room 7 not yet handled!"); + // XXX R_MAP(); + // XXX fadeout(0,223); + } + else if (_logic->currentRoom() == 95 && _logic->gameState(117) == 0) { + char nextFilename[20]; + + _logic->roomDisplay(_logic->roomName(_logic->currentRoom()), RDM_FADE_NOJOE, 100, 2, true); + + if (_resource->isDemo()) { + if (_resource->exists("pclogo.cut")) + Cutaway::run("pclogo.cut", nextFilename, _graphics, _logic, _resource); + else + Cutaway::run("clogo.cut", nextFilename, _graphics, _logic, _resource); + } + else { + Cutaway::run("copy.cut", nextFilename, _graphics, _logic, _resource); + Cutaway::run("clogo.cut", nextFilename, _graphics, _logic, _resource); + + // TODO enable talking for talkie version + + Cutaway::run("cdint.cut", nextFilename, _graphics, _logic, _resource); + + // XXX _graphics->panelLoad(); + + Cutaway::run("cred.cut", nextFilename, _graphics, _logic, _resource); + } + + _logic->currentRoom(73); + // XXX _entryObj = 584; + + Cutaway::run("c70d.cut", nextFilename, _graphics, _logic, _resource); + + _logic->gameState(117) == 1; + + // XXX setupItems(); + // XXX inventory(); + } + else { + _logic->roomDisplay(_logic->roomName(_logic->currentRoom()), RDM_FADE_JOE, 100, 1, false); + } + // XXX _drawMouseFlag = 1; +} + + void QueenEngine::go() { if (!_dump_file) _dump_file = stdout; initialise(); - + + _logic->oldRoom(0); + _logic->newRoom(_logic->currentRoom()); + + for (;;) { + // queen.c lines 4080-4104 + if (_logic->newRoom() > 0) { + _graphics->textClear(151, 151); + _graphics->update(); + _logic->oldRoom(_logic->currentRoom()); + _logic->currentRoom(_logic->newRoom()); + roomChanged(); + // XXX _logic->fullScreen(false); + if (_logic->currentRoom() == _logic->newRoom()) + _logic->newRoom(0); + } + else { + if (_logic->joeWalk() == 2) { + _logic->joeWalk(0); + // XXX executeAction(yes); + } + else { + // XXX if (_parse == 1) + // XXX clearCommand(1); + _logic->joeWalk(0); + // XXX checkPlayer(); + } + } + + break; // XXX don't loop yet + } + while (1) { //main loop delay(1000); } diff --git a/queen/queen.h b/queen/queen.h index dee60b953b..68e97ece72 100644 --- a/queen/queen.h +++ b/queen/queen.h @@ -68,6 +68,9 @@ protected: void delay(uint amount); void go(); + //! Called when we go from one room to another + void roomChanged(); // SETUP_ROOM + void initialise(); static int CDECL game_thread_proc(void *param); diff --git a/queen/resource.cpp b/queen/resource.cpp index 0ece5e4d38..cff1d9d331 100644 --- a/queen/resource.cpp +++ b/queen/resource.cpp @@ -117,7 +117,7 @@ int32 Resource::resourceIndex(const char *filename) { high = cur; } - error("Couldn't find file '%s'", entryName); + warning("Couldn't find file '%s'", entryName); return -1; } diff --git a/queen/structs.h b/queen/structs.h index 90c1a62dfe..1d0234d14f 100644 --- a/queen/structs.h +++ b/queen/structs.h @@ -74,10 +74,14 @@ struct Area { uint16 calcScale(int16 y) const { uint16 dy = box.y2 - box.y1; int16 ds = (int16)(topScaleFactor - bottomScaleFactor); - uint16 scale = ((((y - box.y1) * 100) / dy) * ds) / 100 + bottomScaleFactor; - if (scale == 0) { + uint16 scale = 0; + + if (dy) // Prevent division-by-zero + scale = ((((y - box.y1) * 100) / dy) * ds) / 100 + bottomScaleFactor; + + if (scale == 0) scale = 100; - } + return scale; } diff --git a/queen/xref.txt b/queen/xref.txt index fbc90f41ce..15d520a2de 100644 --- a/queen/xref.txt +++ b/queen/xref.txt @@ -167,7 +167,7 @@ SELECT_VERB() SETUP_BOBS() Graphics::bobSetupControl SETUP_FURNITURE() Logic::roomSetupFurniture SETUP_ITEMS() -SETUP_ROOM() +SETUP_ROOM() Logic::roomChanged SETUP_SCRVARS() update() Graphics::update USE_UNDERWEAR() |