aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruruk2014-05-13 09:51:22 +0200
committeruruk2014-05-13 09:51:22 +0200
commit2f404690e79377eb960d0acba36f09441c4693fd (patch)
tree617aea25bafac873598cdd5143599a8c09d6cf09
parent86c4e8336d1e84f53c6a4ec4dcbb57274ae662ec (diff)
downloadscummvm-rg350-2f404690e79377eb960d0acba36f09441c4693fd.tar.gz
scummvm-rg350-2f404690e79377eb960d0acba36f09441c4693fd.tar.bz2
scummvm-rg350-2f404690e79377eb960d0acba36f09441c4693fd.zip
CGE2: Rename Snail to CommandHandler, expand it.
-rw-r--r--engines/cge2/cge2.h4
-rw-r--r--engines/cge2/cge2_main.cpp2
-rw-r--r--engines/cge2/snail.cpp33
-rw-r--r--engines/cge2/snail.h172
4 files changed, 133 insertions, 78 deletions
diff --git a/engines/cge2/cge2.h b/engines/cge2/cge2.h
index 82f0faff04..cfa783ef44 100644
--- a/engines/cge2/cge2.h
+++ b/engines/cge2/cge2.h
@@ -58,6 +58,10 @@ class Spare;
#define kPocketMax 4
#define kCaveMax 100
+enum CallbackType {
+ kNullCB = 0, kQGame, kMiniStep, kXScene, kSoundSetVolume
+};
+
class CGE2Engine : public Engine {
public:
CGE2Engine(OSystem *syst, const ADGameDescription *gameDescription);
diff --git a/engines/cge2/cge2_main.cpp b/engines/cge2/cge2_main.cpp
index dbf9afef99..be503275d1 100644
--- a/engines/cge2/cge2_main.cpp
+++ b/engines/cge2/cge2_main.cpp
@@ -131,7 +131,7 @@ void CGE2Engine::loadSprite(const char *fname, int ref, int scene, V3D &pos) {
case kIdNear:
case kIdMTake:
case kIdFTake:
- if (Snail::com(p) >= 0)
+ if (CommandHandler::com(p) >= 0)
++cnt[section];
else
error("Bad line %d [%s]", sprf.getLineCount(), tmpStr);
diff --git a/engines/cge2/snail.cpp b/engines/cge2/snail.cpp
index 245da9972a..68cccea5dc 100644
--- a/engines/cge2/snail.cpp
+++ b/engines/cge2/snail.cpp
@@ -30,7 +30,7 @@
namespace CGE2 {
-const char *Snail::comTxt[] = {
+const char *CommandHandler::_commandText[] = {
"NOP", "USE", "PAUSE", "INF", "CAVE",
"SLAVE", "FOCUS", "SETX", "SETY", "SETZ",
"ADD", "SUB", "MUL", "DIV", "IF", "FLAG",
@@ -52,9 +52,34 @@ const char *Snail::comTxt[] = {
"WALKTO", "REACH", "COVER", "UNCOVER",
NULL };
-int Snail::com(const char *com) {
- int i = EncryptedStream::takeEnum(comTxt, com);
- return (i < 0) ? i : i + kSNCom0 + 1;
+void CommandHandler::runCommand() {
+ warning("STUB: CommandHandler::runCommand()");
+}
+
+void CommandHandler::addCommand(CommandType com, int ref, int val, void *ptr) {
+ warning("STUB: CommandHandler::addCommand()");
+}
+
+void CommandHandler::addCallback(CommandType com, int ref, int val, CallbackType cbType) {
+ warning("STUB: CommandHandler::addCallback()");
+}
+
+void CommandHandler::insertCommand(CommandType com, int ref, int val, void *ptr) {
+ warning("STUB: CommandHandler::insertCommand()");
+}
+
+bool CommandHandler::idle() {
+ warning("STUB: CommandHandler::idle()");
+ return false;
+}
+
+void CommandHandler::reset() {
+ warning("STUB: CommandHandler::reset()");
+}
+
+int CommandHandler::com(const char *com) {
+ int i = EncryptedStream::takeEnum(_commandText, com);
+ return (i < 0) ? i : i + kCmdCom0 + 1;
}
} // End of namespace CGE2.
diff --git a/engines/cge2/snail.h b/engines/cge2/snail.h
index 80aa33f5d5..c8dea19b02 100644
--- a/engines/cge2/snail.h
+++ b/engines/cge2/snail.h
@@ -28,93 +28,119 @@
#ifndef CGE2_SNAIL_H
#define CGE2_SNAIL_H
+#include "cge2/cge2.h"
#include "cge2/cge2_main.h"
namespace CGE2 {
enum Action { kNear, kMTake, kFTake, kActions };
-enum SNCom {
- kSNCom0 = 128,
- kSNNop, // NOP :: do nothing
- kSNUse, // USE <spr> <cav>|<lab> :: hint for using
- kSNPause, // PAUSE -1 <dly> :: delay <dly>/72 seconds
- kSNInf, // INF -1 <ref> :: show text referrenced by <ref>
- kSNCave, // CAVE -1 <cav> :: go to board <cav>
- kSNSlave, // SLAVE
- kSNFocus, // FOCUS :: change active hero
- kSNSetX, // SETX <x> <idx> :: set sprite shift in x axis
- kSNSetY, // SETX <y> <idx> :: set sprite shift in y axis
- kSNSetZ, // SETX <z> <idx> :: set sprite shift in z axis
- kSNAdd, // ADD <idx1> <idx2> :: sum vectors
- kSNSub, // SUB <idx1> <idx2> :: subtract vectors
- kSNMul, // MUL <idx> <nr> :: multiply vector by number
- kSNDiv, // DIV <idx> <nr> :: divide vector by number
- kSNIf, // IF
- kSNFlag, // FLAG <nr> <val> :: set flag <nr> to <val>
- kSNFlash, // FLASH -1 0|1 :: lighten whole image (on/off)
- kSNLight, // LIGHT
- kSNCycle, // CYCLE <cnt> :: rotate <cnt> colors from 1
- kSNClear, // CLEAR -1 0 :: clear kSNAIL queue
- kSNTalk, // TALK -1 0|1 :: enable speach (on/off)
- kSNMouse, // MOUSE -1 0|1 :: enable mouse (on/off)
- kSNMap, // MAP 0|1 0 :: temporarily turn off map for hero
- kSNCount, // COUNT
- kSNMidi, // MIDI -1 <midi> :: play MIDI referenced by <midi> (-1 = off)
- kSNSetDlg, // SETDLG 0..3 0..3 :: switch of speach mode
- kSNMskDlg, // MSKDLG 0..3 0..3 :: switch of speach mode mask
+enum CommandType {
+ kCmdCom0 = 128,
+ kCmdNop, // NOP :: do nothing
+ kCmdUse, // USE <spr> <cav>|<lab> :: hint for using
+ kCmdPause, // PAUSE -1 <dly> :: delay <dly>/72 seconds
+ kCmdInf, // INF -1 <ref> :: show text referrenced by <ref>
+ kCmdCave, // CAVE -1 <cav> :: go to board <cav>
+ kCmdSlave, // SLAVE
+ kCmdFocus, // FOCUS :: change active hero
+ kCmdSetX, // SETX <x> <idx> :: set sprite shift in x axis
+ kCmdSetY, // SETX <y> <idx> :: set sprite shift in y axis
+ kCmdSetZ, // SETX <z> <idx> :: set sprite shift in z axis
+ kCmdAdd, // ADD <idx1> <idx2> :: sum vectors
+ kCmdSub, // SUB <idx1> <idx2> :: subtract vectors
+ kCmdMul, // MUL <idx> <nr> :: multiply vector by number
+ kCmdDiv, // DIV <idx> <nr> :: divide vector by number
+ kCmdIf, // IF
+ kCmdFlag, // FLAG <nr> <val> :: set flag <nr> to <val>
+ kCmdFlash, // FLASH -1 0|1 :: lighten whole image (on/off)
+ kCmdLight, // LIGHT
+ kCmdCycle, // CYCLE <cnt> :: rotate <cnt> colors from 1
+ kCmdClear, // CLEAR -1 0 :: clear kCmdAIL queue
+ kCmdTalk, // TALK -1 0|1 :: enable speach (on/off)
+ kCmdMouse, // MOUSE -1 0|1 :: enable mouse (on/off)
+ kCmdMap, // MAP 0|1 0 :: temporarily turn off map for hero
+ kCmdCount, // COUNT
+ kCmdMidi, // MIDI -1 <midi> :: play MIDI referenced by <midi> (-1 = off)
+ kCmdSetDlg, // SETDLG 0..3 0..3 :: switch of speach mode
+ kCmdMskDlg, // MSKDLG 0..3 0..3 :: switch of speach mode mask
- kSNSpr,
+ kCmdSpr,
- kSNWait, // WAIT <spr> <seq>|-1 :: wait for SEQ <seq> (-1 = freeze)
- kSNHide, // HIDE <spr> 0|1 :: visibility of sprite
- kSNRoom, // ROOM <hero> 0|1 :: additional room in pocket (no/yes)
- kSNSay, // SAY <spr> <ref> :: say text referenced by <ref>
- kSNSound, // SOUND <spr> <ref> :: play sound effect referenced by <ref>
- kSNTime, // TIME <spr> 0 :: say current time
- kSNKill, // KILL <spr> 0 :: remove sprite
- kSNRSeq, // RSEQ <spr> <nr> :: relative jump SEQ <nr> lines
- kSNSeq, // SEQ <spr> <seq> :: jump to certain SEQ
- kSNSend, // SEND <spr> <cav> :: move sprite to board <cav>
- kSNSwap, // SWAP <spr1> spr2> :: sprite exchange
- kSNKeep, // KEEP <spr> <seq> :: take sprite into pocket and jump to <seq>
- kSNGive, // GIVE <spr> <seq> :: remove sprite from pocket and jump to <seq>
- kSNGetPos, // GETPOS <spr> <idx> :: take sprite's position
- kSNGoto, // GOTO <spr> <idx> :: move sprite to position
- kSNMoveX, // MOVEX <spr> <dx> :: relative move along X axis
- kSNMoveY, // MOVEY <spr> <dy> :: relative move along Y axis
- kSNMoveZ, // MOVEZ <spr> <dz> :: relative move along Z axis
- kSNTrans, // TRANS <spr> 0|1 :: clear/set logical transparency
- kSNPort, // PORT <spr> 0|1 :: clear/set "takeability" of sprite
- kSNNext, // NEXT <spr> <nr> :: jump to <nr> - NEAR or TAKE
- kSNNNext, // NNEXT <spr> <nr> :: jump to <nr> - NEAR
- kSNMTNext, // MTNEXT <spr> <nr> :: jump to <nr> - TAKE
- kSNFTNext, // FTNEXT <spr> <nr> :: jump to <nr> - TAKE
- kSNRNNext, // RNNEXT <spr> <nr> :: relative jump to <nr> - NEAR
- kSNRMTNext, // RMTNEXT <spr> <nr> :: relative jump to <nr> - TAKE
- kSNRFTNext, // RFTNEXT <spr> <nr> :: relative jump to <nr> - TAKE
- kSNRMNear, // RMNEAR <spr> 0 :: remove NEAR list
- kSNRMMTake, // RMMTAKE <spr> 0 :: remove TAKE list
- kSNRMFTake, // RMFTAKE <spr> 0 :: remove TAKE list
- kSNSetRef, // RETREF <spr> <ref> :: change reference of sprite <spr> to <ref>
- kSNBackPt, // BACKPT <spr> 0 :: paint sprite onto the background
- kSNWalk, // WALK <hero> <ref>|<point> :: go close to the sprite or point
- kSNReach, // REACH <hero> <ref>|<m> :: reach the sprite or point with <m> method
- kSNCover, // COVER <sp1> <sp2> :: cover sprite <sp1> with sprite <sp2>
- kSNUncover, // UNCOVER <sp1> <sp2> :: restore the state before COVER
+ kCmdWait, // WAIT <spr> <seq>|-1 :: wait for SEQ <seq> (-1 = freeze)
+ kCmdHide, // HIDE <spr> 0|1 :: visibility of sprite
+ kCmdRoom, // ROOM <hero> 0|1 :: additional room in pocket (no/yes)
+ kCmdSay, // SAY <spr> <ref> :: say text referenced by <ref>
+ kCmdSound, // SOUND <spr> <ref> :: play sound effect referenced by <ref>
+ kCmdTime, // TIME <spr> 0 :: say current time
+ kCmdKill, // KILL <spr> 0 :: remove sprite
+ kCmdRSeq, // RSEQ <spr> <nr> :: relative jump SEQ <nr> lines
+ kCmdSeq, // SEQ <spr> <seq> :: jump to certain SEQ
+ kCmdSend, // SEND <spr> <cav> :: move sprite to board <cav>
+ kCmdSwap, // SWAP <spr1> spr2> :: sprite exchange
+ kCmdKeep, // KEEP <spr> <seq> :: take sprite into pocket and jump to <seq>
+ kCmdGive, // GIVE <spr> <seq> :: remove sprite from pocket and jump to <seq>
+ kCmdGetPos, // GETPOS <spr> <idx> :: take sprite's position
+ kCmdGoto, // GOTO <spr> <idx> :: move sprite to position
+ kCmdMoveX, // MOVEX <spr> <dx> :: relative move along X axis
+ kCmdMoveY, // MOVEY <spr> <dy> :: relative move along Y axis
+ kCmdMoveZ, // MOVEZ <spr> <dz> :: relative move along Z axis
+ kCmdTrans, // TRANS <spr> 0|1 :: clear/set logical transparency
+ kCmdPort, // PORT <spr> 0|1 :: clear/set "takeability" of sprite
+ kCmdNext, // NEXT <spr> <nr> :: jump to <nr> - NEAR or TAKE
+ kCmdNNext, // NNEXT <spr> <nr> :: jump to <nr> - NEAR
+ kCmdMTNext, // MTNEXT <spr> <nr> :: jump to <nr> - TAKE
+ kCmdFTNext, // FTNEXT <spr> <nr> :: jump to <nr> - TAKE
+ kCmdRNNext, // RNNEXT <spr> <nr> :: relative jump to <nr> - NEAR
+ kCmdRMTNext, // RMTNEXT <spr> <nr> :: relative jump to <nr> - TAKE
+ kCmdRFTNext, // RFTNEXT <spr> <nr> :: relative jump to <nr> - TAKE
+ kCmdRMNear, // RMNEAR <spr> 0 :: remove NEAR list
+ kCmdRMMTake, // RMMTAKE <spr> 0 :: remove TAKE list
+ kCmdRMFTake, // RMFTAKE <spr> 0 :: remove TAKE list
+ kCmdSetRef, // RETREF <spr> <ref> :: change reference of sprite <spr> to <ref>
+ kCmdBackPt, // BACKPT <spr> 0 :: paint sprite onto the background
+ kCmdWalk, // WALK <hero> <ref>|<point> :: go close to the sprite or point
+ kCmdReach, // REACH <hero> <ref>|<m> :: reach the sprite or point with <m> method
+ kCmdCover, // COVER <sp1> <sp2> :: cover sprite <sp1> with sprite <sp2>
+ kCmdUncover, // UNCOVER <sp1> <sp2> :: restore the state before COVER
- kSNDim,
- kSNExec,
- kSNStep,
- kSNGhost,
+ kCmdDim,
+ kCmdExec,
+ kCmdStep,
+ kCmdGhost,
- kSNNOne = kNoByte
+ kCmdNOne = kNoByte
};
-class Snail {
- static const char *comTxt[];
+class CommandHandler {
public:
+ struct Command {
+ CommandType _commandType;
+ int _ref;
+ int _val;
+ void *_spritePtr;
+ CallbackType _cbType;
+ } *_commandList;
+ static const char *_commandText[];
+ bool _talkEnable;
+
+ CommandHandler(CGE2Engine *vm, bool turbo);
+ ~CommandHandler();
+ void runCommand();
+ void addCommand(CommandType com, int ref, int val, void *ptr);
+ void addCallback(CommandType com, int ref, int val, CallbackType cbType);
+ void insertCommand(CommandType com, int ref, int val, void *ptr);
+ bool idle();
+ void reset();
static int com(const char *com);
+private:
+ CGE2Engine *_vm;
+ bool _turbo;
+ uint8 _head;
+ uint8 _tail;
+ bool _busy;
+ bool _textDelay;
+ uint32 _timerExpiry;
};
} // End of namespace CGE2