diff options
-rw-r--r-- | engines/teenagent/callbacks.cpp | 2 | ||||
-rw-r--r-- | engines/teenagent/scene.cpp | 70 | ||||
-rw-r--r-- | engines/teenagent/scene.h | 6 | ||||
-rw-r--r-- | engines/teenagent/teenagent.cpp | 12 | ||||
-rw-r--r-- | engines/teenagent/teenagent.h | 2 |
5 files changed, 61 insertions, 31 deletions
diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp index 073abfbc12..4304c14aa4 100644 --- a/engines/teenagent/callbacks.cpp +++ b/engines/teenagent/callbacks.cpp @@ -89,6 +89,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { switch(addr) { case 0x024c: //intro + hideActor(); loadScene(41, 139, 156, 3); playSound(41, 12); playAnimation(912, 1); @@ -135,6 +136,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { playAnimation(928, 1); setOns(0, 112); Dialog::show(scene, 0x78e1, 929, 0, 0xd1); //he's coming + showActor(); moveTo(319, 150, 1, true); moveTo(63, 150, 1); displayMessage(0x5da8); //fixme: with delay! diff --git a/engines/teenagent/scene.cpp b/engines/teenagent/scene.cpp index 8234944243..b72b0d54a2 100644 --- a/engines/teenagent/scene.cpp +++ b/engines/teenagent/scene.cpp @@ -37,7 +37,7 @@ Scene::Scene() : intro(false), _engine(NULL), _system(NULL), _id(0), ons(0), walkboxes(0), orientation(Object::ActorRight), - current_event(SceneEvent::None) {} + current_event(SceneEvent::None), hide_actor(false) {} void Scene::warp(const Common::Point & _point, byte o) { Common::Point point(_point); @@ -278,6 +278,8 @@ bool Scene::processEvent(const Common::Event &event) { events.clear(); sounds.clear(); current_event.clear(); + for(int i = 0; i < 4; ++i) + custom_animations[i].free(); _engine->playMusic(4); init(10, Common::Point(136, 153)); } @@ -322,7 +324,7 @@ bool Scene::render(OSystem * system) { bool got_any_animation = false; - for (int i = 3; i >= 0; --i) { + for (int i = 0; i < 4; ++i) { Animation *a = custom_animations + i; Surface *s = a->currentFrame(); if (s != NULL) { @@ -352,35 +354,37 @@ bool Scene::render(OSystem * system) { } } - Surface * mark = actor_animation.currentFrame(); - if (mark == NULL) { - actor_animation.free(); - - if (destination != position) { - Common::Point dp(destination.x - position0.x, destination.y - position0.y); - int o; - if (ABS(dp.x) > ABS(dp.y)) - o = dp.x > 0? Object::ActorRight: Object::ActorLeft; - else - o = dp.y > 0? Object::ActorDown: Object::ActorUp; + if (!hide_actor) { + Surface * mark = actor_animation.currentFrame(); + if (mark == NULL) { + actor_animation.free(); + + if (destination != position) { + Common::Point dp(destination.x - position0.x, destination.y - position0.y); + int o; + if (ABS(dp.x) > ABS(dp.y)) + o = dp.x > 0? Object::ActorRight: Object::ActorLeft; + else + o = dp.y > 0? Object::ActorDown: Object::ActorUp; - position.x = position0.x + dp.x * progress / progress_total; - position.y = position0.y + dp.y * progress / progress_total; - teenagent.render(surface, position, o, 1); - ++progress; - if (progress >= progress_total) { - position = destination; - if (orientation == 0) - orientation = o; //save last orientation - nextEvent(); + position.x = position0.x + dp.x * progress / progress_total; + position.y = position0.y + dp.y * progress / progress_total; + teenagent.render(surface, position, o, 1); + ++progress; + if (progress >= progress_total) { + position = destination; + if (orientation == 0) + orientation = o; //save last orientation + nextEvent(); + } else + busy = true; } else - busy = true; - } else - teenagent.render(surface, position, orientation, 0); - } else { - mark->render(surface); - busy = true; - got_any_animation = true; + teenagent.render(surface, position, orientation, 0); + } else { + mark->render(surface); + busy = true; + got_any_animation = true; + } } if (current_event.type == SceneEvent::WaitForAnimation && !got_any_animation) { @@ -507,6 +511,11 @@ bool Scene::processEventQueue() { current_event.clear(); } break; + case SceneEvent::HideActor: { + hide_actor = current_event.color != 0; + current_event.clear(); + } break; + case SceneEvent::WaitForAnimation: debug(0, "waiting for the animation"); break; @@ -520,6 +529,9 @@ bool Scene::processEventQueue() { error("empty/unhandler event[%d]", (int)current_event.type); } } + if (events.empty()) { + hide_actor = false; + } return !current_event.empty(); } diff --git a/engines/teenagent/scene.h b/engines/teenagent/scene.h index 5749901fa1..48a9fe35fc 100644 --- a/engines/teenagent/scene.h +++ b/engines/teenagent/scene.h @@ -42,8 +42,9 @@ struct SceneEvent { enum Type { None, Message, Walk, PlayAnimation, PlayActorAnimation, LoadScene, SetOn, SetLan, PlayMusic, - PlaySound, EnableObject, WaitForAnimation, - CreditsMessage, Quit + PlaySound, EnableObject, HideActor, + WaitForAnimation, CreditsMessage, + Quit } type; Common::String message; @@ -161,6 +162,7 @@ private: typedef Common::List<SceneEvent> EventList; EventList events; SceneEvent current_event; + bool hide_actor; struct Sound { byte id, delay; diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index 7e45cf13f5..60e7dec39a 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -499,6 +499,18 @@ void TeenAgentEngine::disableObject(byte id, byte scene_id) { scene->push(event); } +void TeenAgentEngine::hideActor() { + SceneEvent event(SceneEvent::HideActor); + event.color = 1; + scene->push(event); +} + +void TeenAgentEngine::showActor() { + SceneEvent event(SceneEvent::HideActor); + event.color = 0; + scene->push(event); +} + void TeenAgentEngine::waitAnimation() { SceneEvent event(SceneEvent::WaitForAnimation); scene->push(event); diff --git a/engines/teenagent/teenagent.h b/engines/teenagent/teenagent.h index 1c10b9e556..2adafabdcd 100644 --- a/engines/teenagent/teenagent.h +++ b/engines/teenagent/teenagent.h @@ -88,6 +88,8 @@ public: void playSoundNow(byte id); void enableObject(byte id, byte scene_id = 0); void disableObject(byte id, byte scene_id = 0); + void hideActor(); + void showActor(); void waitAnimation(); Common::RandomSource random; |