From d033899a0595d6a371ca9c2861b85ce5604f6ba6 Mon Sep 17 00:00:00 2001 From: Vladimir Menshakov Date: Sat, 31 Oct 2009 18:49:47 +0000 Subject: added cutscenes where needed, fixed invalid skipping of fullscreen messages. svn-id: r45575 --- engines/teenagent/callbacks.cpp | 8 ++++---- engines/teenagent/font.cpp | 4 ++++ engines/teenagent/scene.cpp | 29 ++++++++++++++++++----------- engines/teenagent/scene.h | 10 +++++----- engines/teenagent/teenagent.cpp | 13 +++++++++++++ engines/teenagent/teenagent.h | 1 + 6 files changed, 45 insertions(+), 20 deletions(-) diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp index 87d75da3cc..681ef94dde 100644 --- a/engines/teenagent/callbacks.cpp +++ b/engines/teenagent/callbacks.cpp @@ -2096,7 +2096,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { SET_FLAG(0xDBE6, 1); setOns(1, 0x66); moveTo(224, 194, 0, true); - debug(0, "FIXME: add cut message: 57DF at 30423"); + displayCutsceneMessage(0x57df, 30423); inventory->remove(0x59); } else { displayMessage(0x5de2); @@ -3623,7 +3623,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { for (uint i = 0; i < 8; ++i) playSound(26, 30 + i * 11); playActorAnimation(661); - //cutscene 3c80 at 30484 + displayCutsceneMessage(0x3c80, 30484); playSound(56, 10); playSound(56, 21); @@ -3637,7 +3637,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { waitAnimation(); setOns(1, 49); - //cutscene 0x3c9a at 30453 + displayCutsceneMessage(0x3c9a, 30453); moveTo(162, 184, 0, true); playSound(26, 6); playSound(26, 17); @@ -3708,7 +3708,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { byte id = scene->getId(); playMusic(11); - debug(0, "FIXME: cutscene: meanwhile in a mansion #%u, %04x", tries, ptr); + displayCutsceneMessage(0x580a, 30484); processCallback(ptr); playMusic(6); if (scene->getId() == 11 && CHECK_FLAG(0xDBEC, 1)) diff --git a/engines/teenagent/font.cpp b/engines/teenagent/font.cpp index e18c4f5904..da50469e62 100644 --- a/engines/teenagent/font.cpp +++ b/engines/teenagent/font.cpp @@ -63,12 +63,16 @@ uint Font::render(Graphics::Surface *surface, int x, int y, char c) { for (uint j = 0; j < w; ++j) { byte v = *glyph++; switch (v) { + case 0: + break; case 1: dst[j] = shadow_color; break; case 2: dst[j] = color; break; + default: + dst[j] = v; } } dst += surface->pitch; diff --git a/engines/teenagent/scene.cpp b/engines/teenagent/scene.cpp index b96bb603f0..af37a6d011 100644 --- a/engines/teenagent/scene.cpp +++ b/engines/teenagent/scene.cpp @@ -316,12 +316,13 @@ bool Scene::processEvent(const Common::Event &event) { sounds.clear(); current_event.clear(); message_color = 0xd1; + Resources::instance()->font7.color = 0xd1; for (int i = 0; i < 4; ++i) custom_animation[i].free(); _engine->playMusic(4); init(10, Common::Point(136, 153)); } - return false; + return true; default: return false; @@ -331,22 +332,28 @@ bool Scene::processEvent(const Common::Event &event) { bool Scene::render(OSystem *system) { //render background Resources *res = Resources::instance(); - if (current_event.type == SceneEvent::kCreditsMessage) { - system->fillScreen(0); - Graphics::Surface *surface = system->lockScreen(); - res->font8.color = current_event.color; - res->font8.shadow_color = current_event.orientation; - res->font8.render(surface, current_event.dst.x, current_event.dst.y, message); - system->unlockScreen(); - return true; - } - bool busy; bool restart; do { restart = false; busy = processEventQueue(); + + if (current_event.type == SceneEvent::kCreditsMessage) { + system->fillScreen(0); + Graphics::Surface *surface = system->lockScreen(); + if (current_event.lan == 8) { + res->font8.color = current_event.color; + res->font8.shadow_color = current_event.orientation; + res->font8.render(surface, current_event.dst.x, current_event.dst.y, message); + } else { + res->font7.color = 0xd1; + res->font7.render(surface, current_event.dst.x, current_event.dst.y, message); + } + system->unlockScreen(); + return true; + } + system->copyRectToScreen((const byte *)background.pixels, background.pitch, 0, 0, background.w, background.h); Graphics::Surface *surface = system->lockScreen(); diff --git a/engines/teenagent/scene.h b/engines/teenagent/scene.h index 849b27f2c1..683e5c8042 100644 --- a/engines/teenagent/scene.h +++ b/engines/teenagent/scene.h @@ -38,23 +38,23 @@ class Dialog; struct SceneEvent { enum Type { - kNone, + kNone, //0 kMessage, kWalk, kPlayAnimation, - kPlayActorAnimation, + kPlayActorAnimation, //4 kPauseAnimation, kClearAnimations, kLoadScene, - kSetOn, + kSetOn, //8 kSetLan, kPlayMusic, kPlaySound, - kEnableObject, + kEnableObject, //12 kHideActor, kWaitForAnimation, kCreditsMessage, - kQuit + kQuit //16 } type; Common::String message; diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index b8a4c059ed..17242d677e 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -377,6 +377,7 @@ void TeenAgentEngine::displayCredits(uint16 addr) { const byte *src = Resources::instance()->dseg.ptr(addr); event.orientation = *src++; event.color = *src++; + event.lan = 8; event.dst.y = *src; while (true) { @@ -393,6 +394,18 @@ void TeenAgentEngine::displayCredits(uint16 addr) { scene->push(event); } +void TeenAgentEngine::displayCutsceneMessage(uint16 addr, uint16 position) { + SceneEvent event(SceneEvent::kCreditsMessage); + + event.message = parseMessage(addr); + event.dst.x = position % 320; + event.dst.y = position / 320; + event.lan = 7; + + scene->push(event); +} + + void TeenAgentEngine::moveTo(const Common::Point &dst, byte o, bool warp) { moveTo(dst.x, dst.y, o, warp); } diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h index 36bbb815e5..d9e8731ce5 100644 --- a/engines/teenagent/teenagent.h +++ b/engines/teenagent/teenagent.h @@ -68,6 +68,7 @@ public: void displayMessage(uint16 addr, byte color = 0xd1); void displayMessage(const Common::String &str, byte color = 0xd1); void displayCredits(uint16 addr); + void displayCutsceneMessage(uint16 addr, uint16 position); void moveTo(const Common::Point &dst, byte o, bool warp = false); void moveTo(uint16 x, uint16 y, byte o, bool warp = false); void moveTo(Object *obj); -- cgit v1.2.3