diff options
author | Ľubomír Remák | 2018-07-21 20:29:11 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-25 23:12:01 +0200 |
commit | 3306cbfeaa2f1c6fd471daaee054290df7e44280 (patch) | |
tree | 56379cb27336281e9ca92b12d6db7ab6d84c31e8 /engines/mutationofjb/tasks | |
parent | 2e656e69b3b9416f5164f0963951df203f4978e5 (diff) | |
download | scummvm-rg350-3306cbfeaa2f1c6fd471daaee054290df7e44280.tar.gz scummvm-rg350-3306cbfeaa2f1c6fd471daaee054290df7e44280.tar.bz2 scummvm-rg350-3306cbfeaa2f1c6fd471daaee054290df7e44280.zip |
MUTATIONOFJB: Implement SayCommand::execute.
Diffstat (limited to 'engines/mutationofjb/tasks')
-rw-r--r-- | engines/mutationofjb/tasks/conversationtask.cpp | 11 | ||||
-rw-r--r-- | engines/mutationofjb/tasks/saytask.cpp | 30 | ||||
-rw-r--r-- | engines/mutationofjb/tasks/saytask.h | 2 | ||||
-rw-r--r-- | engines/mutationofjb/tasks/sequentialtask.cpp | 2 | ||||
-rw-r--r-- | engines/mutationofjb/tasks/task.h | 1 | ||||
-rw-r--r-- | engines/mutationofjb/tasks/taskmanager.cpp | 26 | ||||
-rw-r--r-- | engines/mutationofjb/tasks/taskmanager.h | 26 |
7 files changed, 80 insertions, 18 deletions
diff --git a/engines/mutationofjb/tasks/conversationtask.cpp b/engines/mutationofjb/tasks/conversationtask.cpp index a2a0a73bf0..d4fab56dc3 100644 --- a/engines/mutationofjb/tasks/conversationtask.cpp +++ b/engines/mutationofjb/tasks/conversationtask.cpp @@ -54,7 +54,6 @@ void ConversationTask::start() { void ConversationTask::update() { if (_sayTask) { if (_sayTask->getState() == Task::FINISHED) { - getTaskManager()->removeTask(_sayTask); _sayTask.reset(); switch (_substate) { @@ -67,7 +66,7 @@ void ConversationTask::update() { _substate = SAYING_RESPONSE; createSayTasks(line); - getTaskManager()->addTask(_sayTask); + getTaskManager()->startTask(_sayTask); break; } case SAYING_RESPONSE: { @@ -105,7 +104,7 @@ void ConversationTask::onChoiceClicked(ConversationWidget *convWidget, int, uint _substate = SAYING_CHOICE; createSayTasks(line); - getTaskManager()->addTask(_sayTask); + getTaskManager()->startTask(_sayTask); _currentItem = &item; if (!line->_speeches[0].isRepeating()) { @@ -177,7 +176,7 @@ void ConversationTask::showChoicesOrPick() { _substate = SAYING_CHOICE; createSayTasks(line); - getTaskManager()->addTask(_sayTask); + getTaskManager()->startTask(_sayTask); _currentItem = &item; if (!line->_speeches[0].isRepeating()) { @@ -192,7 +191,7 @@ void ConversationTask::showChoicesOrPick() { _substate = SAYING_RESPONSE; createSayTasks(line); - getTaskManager()->addTask(_sayTask); + getTaskManager()->startTask(_sayTask); _currentItem = &item; _haveChoices = true; @@ -204,7 +203,7 @@ void ConversationTask::showChoicesOrPick() { finish(); } else { _sayTask = TaskPtr(new SayTask("Nothing to talk about.", _convInfo._color)); // TODO: This is hardcoded in executable. Load it. - getTaskManager()->addTask(_sayTask); + getTaskManager()->startTask(_sayTask); _substate = SAYING_NO_CHOICES; _currentItem = nullptr; } diff --git a/engines/mutationofjb/tasks/saytask.cpp b/engines/mutationofjb/tasks/saytask.cpp index bd89805c68..cfa412b3b1 100644 --- a/engines/mutationofjb/tasks/saytask.cpp +++ b/engines/mutationofjb/tasks/saytask.cpp @@ -34,21 +34,31 @@ namespace MutationOfJB { -SayTask::SayTask(const Common::String &toSay, uint8 color) : _toSay(toSay), _color(color), _timer(1000) {} +SayTask::SayTask(const Common::String &toSay, uint8 color) : _toSay(toSay), _color(color), _timer(50 * toSay.size()) {} void SayTask::start() { + Game &game = getTaskManager()->getGame(); + if (game.getActiveSayTask()) { + getTaskManager()->stopTask(game.getActiveSayTask()); + } + game.setActiveSayTask(getTaskManager()->getTask(this)); + + setState(RUNNING); drawSubtitle(_toSay, 160, 0, _color); // TODO: Respect PTALK and LTALK commands. _timer.start(); - setState(RUNNING); } void SayTask::update() { _timer.update(); if (_timer.isFinished()) { - getTaskManager()->getGame().getRoom().redraw(); // TODO: Only redraw the area occupied by the text. - setState(FINISHED); - return; + finish(); + } +} + +void SayTask::stop() { + if (getState() == RUNNING) { + finish(); } } @@ -89,4 +99,14 @@ void SayTask::drawSubtitle(const Common::String &text, int16 talkX, int16 talkY, _boundingBox.setHeight(lines.size() * font.getLineHeight()); } +void SayTask::finish() { + getTaskManager()->getGame().getRoom().redraw(); // TODO: Only redraw the area occupied by the text. + setState(FINISHED); + + Game &game = getTaskManager()->getGame(); + if (game.getActiveSayTask().get() == this) { + game.setActiveSayTask(Common::SharedPtr<SayTask>()); + } +} + } diff --git a/engines/mutationofjb/tasks/saytask.h b/engines/mutationofjb/tasks/saytask.h index 17e773defc..2200436b86 100644 --- a/engines/mutationofjb/tasks/saytask.h +++ b/engines/mutationofjb/tasks/saytask.h @@ -38,9 +38,11 @@ public: virtual void start() override; virtual void update() override; + virtual void stop() override; private: void drawSubtitle(const Common::String &text, int16 talkX, int16 talkY, uint8 color); + void finish(); Common::String _toSay; uint8 _color; diff --git a/engines/mutationofjb/tasks/sequentialtask.cpp b/engines/mutationofjb/tasks/sequentialtask.cpp index 57efbb50d2..20b5290d5d 100644 --- a/engines/mutationofjb/tasks/sequentialtask.cpp +++ b/engines/mutationofjb/tasks/sequentialtask.cpp @@ -48,7 +48,7 @@ void SequentialTask::runTasks() { const TaskPtr &task = _tasks.front(); switch (task->getState()) { case IDLE: - getTaskManager()->addTask(task); + getTaskManager()->startTask(task); break; case RUNNING: return; diff --git a/engines/mutationofjb/tasks/task.h b/engines/mutationofjb/tasks/task.h index 9f2acb3d6b..8c9c0e85b4 100644 --- a/engines/mutationofjb/tasks/task.h +++ b/engines/mutationofjb/tasks/task.h @@ -44,6 +44,7 @@ public: virtual void start() = 0; virtual void update() = 0; + virtual void stop() { assert(false); } // Assert by default - stopping might not be safe for all tasks. void setTaskManager(TaskManager *taskMan) { _taskManager = taskMan; } TaskManager *getTaskManager() { return _taskManager; } diff --git a/engines/mutationofjb/tasks/taskmanager.cpp b/engines/mutationofjb/tasks/taskmanager.cpp index 11675007db..a6d4dc1e84 100644 --- a/engines/mutationofjb/tasks/taskmanager.cpp +++ b/engines/mutationofjb/tasks/taskmanager.cpp @@ -21,21 +21,39 @@ */ #include "mutationofjb/tasks/taskmanager.h" + #include "mutationofjb/tasks/task.h" +#include "common/translation.h" + namespace MutationOfJB { -void TaskManager::addTask(const TaskPtr &task) { +void TaskManager::startTask(const TaskPtr &task) { _tasks.push_back(task); task->setTaskManager(this); task->start(); } -void TaskManager::removeTask(const TaskPtr &task) { +void TaskManager::stopTask(const TaskPtr &task) { TaskPtrs::iterator it = Common::find(_tasks.begin(), _tasks.end(), task); - if (it != _tasks.end()) { - _tasks.erase(it); + if (it == _tasks.end()) { + warning(_("Task is not registered in TaskManager.")); + return; + } + + task->stop(); + assert(task->getState() != Task::RUNNING); + _tasks.erase(it); +} + +TaskPtr TaskManager::getTask(Task *const task) { + for (TaskPtrs::iterator it = _tasks.begin(); it != _tasks.end(); ++it) { + if (it->get() == task) { + return *it; + } } + + return TaskPtr(); } void TaskManager::update() { diff --git a/engines/mutationofjb/tasks/taskmanager.h b/engines/mutationofjb/tasks/taskmanager.h index 299a271711..29e854a313 100644 --- a/engines/mutationofjb/tasks/taskmanager.h +++ b/engines/mutationofjb/tasks/taskmanager.h @@ -35,8 +35,30 @@ class TaskManager { public: TaskManager(Game &game) : _game(game) {} - void addTask(const TaskPtr &task); - void removeTask(const TaskPtr &task); + /** + * Adds the task to the internal list and starts it. + * + * When the task is finished, it is automatically removed from the list. + * stopTask does not need to be called for that. + */ + void startTask(const TaskPtr &task); + + /** + * Stops the task and removes it from the internal list. + * + * Call this only if you need to explicitly stop the task (usually before it's finished). + */ + void stopTask(const TaskPtr &task); + + /** + * Gets task shared pointer from raw pointer. + * + * Since task lifetime is under control of SharedPtr, raw pointers shouldn't be used. + * However, if only a raw pointer is available (e.g. this), + * the method can be used to obtain a SharedPtr. + */ + TaskPtr getTask(Task* task); + void update(); Game &getGame() { return _game; } |