mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 17:57:14 +00:00
TRECISION: Move MessageQueues into Scheduler
This commit is contained in:
parent
d20b12b608
commit
d16fb074e7
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -119,7 +119,7 @@ void TextManager::characterTalk(const char *s) {
|
||||
|
||||
characterContinueTalk();
|
||||
|
||||
_vm->_characterQueue.initQueue();
|
||||
_vm->_scheduler->initCharacterQueue();
|
||||
_vm->_actor->actorStop();
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user