TRECISION: Move MessageQueues into Scheduler

This commit is contained in:
SupSuper 2021-05-29 07:47:08 +01:00
parent d20b12b608
commit d16fb074e7
11 changed files with 97 additions and 75 deletions

View File

@ -2392,8 +2392,6 @@ Management of "Use with"
#define USED 0
#define WITH 1
#define MAXMESSAGE 128
#define PI 3.1415927f
#define PI2 6.2831853f

View File

@ -3733,7 +3733,7 @@ void LogicManager::doMouseLeftRight() {
_vm->_pathFind->whereIs(pmousex, pmousey);
_vm->_pathFind->findPath();
}
_vm->_characterQueue.initQueue();
_vm->_scheduler->initCharacterQueue();
if (_vm->checkMask(_vm->_mousePos) && !_vm->_flagDialogActive) {
if (_vm->_curRoom == kRoom1D && !_vm->_room[kRoom1D].hasExtra() && (_vm->_curObj != oSCALA1D))
@ -3815,7 +3815,7 @@ void LogicManager::doMouseLeftRight() {
return;
if (_vm->isIconArea(_vm->_mousePos) && _vm->whatIcon(_vm->_mousePos) && (_vm->_inventoryStatus == INV_INACTION)) {
_vm->_characterQueue.initQueue();
_vm->_scheduler->initCharacterQueue();
_vm->_actor->actorStop();
_vm->_pathFind->nextStep();
_vm->_scheduler->doEvent(MC_CHARACTER, ME_CHARACTERGOTOACTION, MP_DEFAULT, _vm->_curMessage->_u16Param1, _vm->_curMessage->_u16Param2, 0, 0);
@ -3869,8 +3869,7 @@ void LogicManager::doSystemChangeRoom(uint16 room) {
_vm->_oldRoom = _vm->_curRoom;
_vm->_curRoom = room;
_vm->_gameQueue.initQueue();
_vm->_characterQueue.initQueue();
_vm->_scheduler->resetQueues();
_vm->closeInventoryImmediately();

View File

@ -139,8 +139,7 @@ bool TrecisionEngine::dataSave() {
_graphicsMgr->clearScreenBufferInventory();
_graphicsMgr->copyToScreen(0, TOP + AREA, MAXX, TOP);
_gameQueue.initQueue();
_characterQueue.initQueue();
_scheduler->resetQueues();
freeKey();
@ -332,8 +331,7 @@ bool TrecisionEngine::dataLoad() {
_graphicsMgr->clearScreenBufferInventory();
_graphicsMgr->copyToScreen(0, TOP + AREA, MAXX, TOP);
_gameQueue.initQueue();
_characterQueue.initQueue();
_scheduler->resetQueues();
freeKey();

View File

@ -31,6 +31,8 @@ Scheduler::Scheduler(TrecisionEngine *vm) : _vm(vm) {
_token = CLASS_CHAR;
_counter = 0;
_idleMsg = {MC_IDLE, 0, MP_DEFAULT, 0, 0, 0, 0, 0};
}
Scheduler::~Scheduler() {
@ -46,17 +48,17 @@ void Scheduler::process() {
if (_counter <= 30) {
++_counter;
_token = CLASS_CHAR;
if (_vm->_gameQueue.getMessage(&_vm->_curMessage))
_vm->_curMessage = &_vm->_idleMsg;
if (_gameQueue.getMessage(&_vm->_curMessage))
_vm->_curMessage = &_idleMsg;
} else {
_counter = 0;
_vm->_curMessage = &_vm->_idleMsg;
_vm->_curMessage = &_idleMsg;
}
break;
case CLASS_CHAR:
_token = CLASS_GAME;
if (_vm->_flagPaintCharacter || _vm->_characterQueue.getMessage(&_vm->_curMessage))
if (_vm->_flagPaintCharacter || _characterQueue.getMessage(&_vm->_curMessage))
retry = true;
break;
@ -72,9 +74,9 @@ void Scheduler::doEvent(uint8 cls, uint8 event, uint8 priority,
MessageQueue *lq;
if (cls <= CLASS_GAME)
lq = &_vm->_gameQueue;
lq = &_gameQueue;
else
lq = &_vm->_characterQueue;
lq = &_characterQueue;
if (lq->_len >= MAXMESSAGE)
return;
@ -94,9 +96,9 @@ void Scheduler::doEvent(uint8 cls, uint8 event, uint8 priority,
lq->_tail = 0;
++lq->_len;
if (lq == &_vm->_gameQueue && lq->_len > _maxMessageGame)
if (lq == &_gameQueue && lq->_len > _maxMessageGame)
_maxMessageGame = lq->_len;
else if (lq == &_vm->_characterQueue && lq->_len > _maxMessageCharacter)
else if (lq == &_characterQueue && lq->_len > _maxMessageCharacter)
_maxMessageCharacter = lq->_len;
lq->orderEvents();
@ -118,6 +120,27 @@ void Scheduler::mouseOperate(uint16 object) {
doEvent(MC_ACTION, ME_MOUSEOPERATE, MP_DEFAULT, 0, 0, 0, object);
}
void Scheduler::init() {
resetQueues();
for (uint8 i = 0; i < MAXMESSAGE; i++) {
_gameQueue._event[i] = &_gameMsg[i];
_characterQueue._event[i] = &_characterMsg[i];
}
}
void Scheduler::resetQueues() {
_gameQueue.initQueue();
_characterQueue.initQueue();
}
void Scheduler::initCharacterQueue() {
_characterQueue.initQueue();
}
bool Scheduler::testEmptyQueues() {
return _characterQueue.testEmptyCharacterQueue4Script() && _gameQueue.testEmptyQueues(MC_DIALOG);
}
uint8 MessageQueue::predEvent(uint8 i) {
return i == 0 ? MAXMESSAGE - 1 : i - 1;
}
@ -150,7 +173,7 @@ void MessageQueue::orderEvents() {
}
}
bool MessageQueue::testEmptyQueue(uint8 cls) {
bool MessageQueue::testEmptyQueues(uint8 cls) {
for (uint8 pos = _head; pos != _tail; pos = (pos + 1) % MAXMESSAGE) {
if (_event[pos]->_class != cls)
return false;

View File

@ -25,9 +25,49 @@
#include "common/scummsys.h"
#define MAXMESSAGE 128
namespace Trecision {
class TrecisionEngine;
struct Message {
uint8 _class; // message class
uint8 _event; // message name
uint8 _priority; // message priority
uint8 _u8Param;
uint16 _u16Param1; // byte parameter 1
uint16 _u16Param2; // byte parameter 2
uint32 _u32Param; // int parameter
uint32 _timestamp;
void set(Message *src) {
_class = src->_class;
_event = src->_event;
_priority = src->_priority;
_u8Param = src->_u8Param;
_u16Param1 = src->_u16Param1;
_u16Param2 = src->_u16Param2;
_u32Param = src->_u32Param;
_timestamp = src->_timestamp;
}
};
struct MessageQueue {
uint8 _head, _tail, _len;
Message *_event[MAXMESSAGE];
void orderEvents();
bool testEmptyQueues(uint8 cls);
bool testEmptyCharacterQueue4Script();
bool getMessage(Message **msg);
void initQueue();
private:
uint8 predEvent(uint8 i);
};
class Scheduler {
private:
TrecisionEngine *_vm;
@ -36,6 +76,13 @@ private:
uint8 _token;
uint8 _counter;
// Message system
Message _gameMsg[MAXMESSAGE];
Message _characterMsg[MAXMESSAGE];
Message _idleMsg;
MessageQueue _gameQueue;
MessageQueue _characterQueue;
public:
Scheduler(TrecisionEngine *vm);
~Scheduler();
@ -46,6 +93,11 @@ public:
void rightClick(uint16 x, uint16 y);
void mouseExamine(uint16 object);
void mouseOperate(uint16 object);
void init();
void resetQueues();
void initCharacterQueue();
bool testEmptyQueues();
};
} // End of namespace Trecision

View File

@ -60,7 +60,7 @@ void TrecisionEngine::playScript(uint16 id) {
}
void TrecisionEngine::evalScript() {
if (_characterQueue.testEmptyCharacterQueue4Script() && _gameQueue.testEmptyQueue(MC_DIALOG)) {
if (_scheduler->testEmptyQueues()) {
++_curScriptFrame[_curStack];
_graphicsMgr->hideCursor();
@ -317,7 +317,7 @@ void TrecisionEngine::doCharacter() {
case ME_CHARACTERACTION:
if (_flagWaitRegen)
reEvent();
_characterQueue.initQueue();
_scheduler->initCharacterQueue();
_inventoryRefreshStartLine = INVENTORY_HIDE;
refreshInventory(_inventoryRefreshStartIcon, INVENTORY_HIDE);
_inventoryStatus = INV_OFF;
@ -340,7 +340,7 @@ void TrecisionEngine::doCharacter() {
_graphicsMgr->showCursor();
_flagShowCharacter = true;
_pathFind->_characterInMovement = false;
_characterQueue.initQueue();
_scheduler->initCharacterQueue();
_animTypeMgr->end(kAnimTypeCharacter);
_flagWaitRegen = true;
_lastObj = 0;

View File

@ -175,43 +175,6 @@ struct SDText {
uint16 calcHeight(TrecisionEngine *vm);
};
struct Message {
uint8 _class; // message class
uint8 _event; // message name
uint8 _priority; // message priority
uint8 _u8Param;
uint16 _u16Param1; // byte parameter 1
uint16 _u16Param2; // byte parameter 2
uint32 _u32Param; // int parameter
uint32 _timestamp;
void set(Message *src) {
_class = src->_class;
_event = src->_event;
_priority = src->_priority;
_u8Param = src->_u8Param;
_u16Param1 = src->_u16Param1;
_u16Param2 = src->_u16Param2;
_u32Param = src->_u32Param;
_timestamp = src->_timestamp;
}
};
struct MessageQueue {
uint8 _head, _tail, _len;
Message *_event[MAXMESSAGE];
void orderEvents();
bool testEmptyQueue(uint8 cls);
bool testEmptyCharacterQueue4Script();
bool getMessage(Message **msg);
void initQueue();
private:
uint8 predEvent(uint8 i);
};
struct STexture {
int16 _dx, _dy, _angle;
uint8 *_texture;

View File

@ -119,7 +119,7 @@ void TextManager::characterTalk(const char *s) {
characterContinueTalk();
_vm->_characterQueue.initQueue();
_vm->_scheduler->initCharacterQueue();
_vm->_actor->actorStop();
}

View File

@ -66,7 +66,6 @@ TrecisionEngine::TrecisionEngine(OSystem *syst, const ADGameDescription *desc) :
_iconBase = 0;
_inventoryRefreshStartIcon = 0;
_inventoryRefreshStartIconOld = 0xFF;
_idleMsg = {MC_IDLE, 0, MP_DEFAULT, 0, 0, 0, 0, 0};
_curObj = 1;
_inventoryRefreshStartLine = INVENTORY_HIDE;
_inventoryRefreshStartLineOld = 0xFF;
@ -290,12 +289,7 @@ void TrecisionEngine::initMain() {
_obj[c]._position = -1;
_curRoom = kRoomIntro;
_gameQueue.initQueue();
_characterQueue.initQueue();
for (uint8 i = 0; i < MAXMESSAGE; i++) {
_gameQueue._event[i] = &_gameMsg[i];
_characterQueue._event[i] = &_characterMsg[i];
}
_scheduler->init();
loadAll();
processTime();
@ -312,7 +306,7 @@ void TrecisionEngine::checkSystem() {
}
void TrecisionEngine::startCharacterAction(uint16 action, uint16 newRoom, uint8 newPos, uint16 sent) {
_characterQueue.initQueue();
_scheduler->initCharacterQueue();
_flagInventoryLocked = false;
if (action > hLAST) {

View File

@ -34,6 +34,7 @@
#include "trecision/defines.h"
#include "trecision/fastfile.h"
#include "trecision/struct.h"
#include "trecision/scheduler.h"
namespace Trecision {
class AnimManager;
@ -270,12 +271,7 @@ public:
const char *_sysText[MAXSYSTEXT];
// Message system
Message _gameMsg[MAXMESSAGE];
Message _characterMsg[MAXMESSAGE];
Message _idleMsg;
Message *_curMessage;
MessageQueue _gameQueue;
MessageQueue _characterQueue;
// Snake management
Message _snake52;

View File

@ -367,8 +367,7 @@ void AnimManager::startFullMotion() {
_vm->_textMgr->clearTextStack();
_vm->_graphicsMgr->clearScreen();
_vm->_gameQueue.initQueue();
_vm->_characterQueue.initQueue();
_vm->_scheduler->resetQueues();
_vm->_actor->actorStop();
_vm->_graphicsMgr->hideCursor();
}