aboutsummaryrefslogtreecommitdiff
path: root/engines/mutationofjb/tasks
diff options
context:
space:
mode:
authorĽubomír Remák2018-07-21 20:29:11 +0200
committerEugene Sandulenko2018-08-25 23:12:01 +0200
commit3306cbfeaa2f1c6fd471daaee054290df7e44280 (patch)
tree56379cb27336281e9ca92b12d6db7ab6d84c31e8 /engines/mutationofjb/tasks
parent2e656e69b3b9416f5164f0963951df203f4978e5 (diff)
downloadscummvm-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.cpp11
-rw-r--r--engines/mutationofjb/tasks/saytask.cpp30
-rw-r--r--engines/mutationofjb/tasks/saytask.h2
-rw-r--r--engines/mutationofjb/tasks/sequentialtask.cpp2
-rw-r--r--engines/mutationofjb/tasks/task.h1
-rw-r--r--engines/mutationofjb/tasks/taskmanager.cpp26
-rw-r--r--engines/mutationofjb/tasks/taskmanager.h26
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; }