ACCESS: Implemented chapter debug command

This commit is contained in:
Paul Gilbert 2014-11-08 19:16:14 -05:00
parent e7818639af
commit aea906f7d3
8 changed files with 72 additions and 11 deletions

View file

@ -164,7 +164,7 @@ void AccessEngine::initialize() {
_animation = new AnimationManager(this);
_bubbleBox = new BubbleBox(this);
_char = new CharManager(this);
_debugger = new Debugger(this);
_debugger = Debugger::init(this);
_events = new EventsManager(this);
_files = new FileManager(this);
_inventory = new InventoryManager(this);

View file

@ -23,14 +23,10 @@
#include "common/file.h"
#include "access/access.h"
#include "access/debugger.h"
#include "access/amazon/amazon_game.h"
namespace Access {
Debugger::Debugger(AccessEngine *vm) : GUI::Debugger(), _vm(vm) {
registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
registerCmd("scene", WRAP_METHOD(Debugger, Cmd_LoadScene));
}
static int strToInt(const char *s) {
if (!*s)
// No string at all
@ -47,6 +43,22 @@ static int strToInt(const char *s) {
return (int)tmp;
}
Debugger *Debugger::init(AccessEngine *vm) {
switch (vm->getGameID()) {
case GType_Amazon:
return new Amazon::AmazonDebugger(vm);
default:
return new Debugger(vm);
}
}
/*------------------------------------------------------------------------*/
Debugger::Debugger(AccessEngine *vm) : GUI::Debugger(), _vm(vm) {
registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
registerCmd("scene", WRAP_METHOD(Debugger, Cmd_LoadScene));
}
bool Debugger::Cmd_LoadScene(int argc, const char **argv) {
if (argc != 2) {
debugPrintf("Current scene is: %d\n", _vm->_player->_roomNumber);
@ -66,4 +78,32 @@ bool Debugger::Cmd_LoadScene(int argc, const char **argv) {
}
}
/*------------------------------------------------------------------------*/
namespace Amazon {
AmazonDebugger::AmazonDebugger(AccessEngine *vm): Debugger(vm) {
registerCmd("chapter", WRAP_METHOD(AmazonDebugger, Cmd_StartChapter));
}
bool AmazonDebugger::Cmd_StartChapter(int argc, const char **argv) {
if (argc != 2) {
debugPrintf("Usage: %s <chapter number>\n", argv[0]);
return true;
}
// Build up a simple one line script to start the given chapter
byte *chapterScript = (byte *)malloc(5);
chapterScript[0] = SCRIPT_START_BYTE;
chapterScript[1] = ROOM_SCRIPT % 256;
chapterScript[2] = ROOM_SCRIPT / 256;
chapterScript[3] = 0x80 + 75; // cmdChapter
chapterScript[4] = strToInt(argv[1]); // chapter number
_vm->_scripts->setScript(new Resource(chapterScript, 5));
return false;
}
} // End of namespace Amazon
} // End of namespace Access

View file

@ -31,16 +31,29 @@ namespace Access {
class AccessEngine;
class Debugger : public GUI::Debugger {
private:
AccessEngine *_vm;
protected:
AccessEngine *_vm;
bool Cmd_LoadScene(int argc, const char **argv);
public:
static Debugger *init(AccessEngine *vm);
public:
Debugger(AccessEngine *vm);
virtual ~Debugger() {}
};
namespace Amazon {
class AmazonDebugger : public Debugger {
protected:
bool Cmd_StartChapter(int argc, const char **argv);
public:
AmazonDebugger(AccessEngine *vm);
virtual ~AmazonDebugger() {}
};
} // End of namespace Amazon
} // End of namespace Access
#endif /* ACCESS_DEBUGGER_H */

View file

@ -59,6 +59,12 @@ Resource::~Resource() {
delete _stream;
}
Resource::Resource(byte *data, int size) {
_data = data;
_size = size;
_stream = new Common::MemoryReadStream(data, size);
}
byte *Resource::data() {
if (_data == nullptr) {
_data = new byte[_size];

View file

@ -62,6 +62,7 @@ public:
int _size;
Resource();
Resource::Resource(byte *data, int size);
~Resource();
byte *data();
};

View file

@ -235,7 +235,7 @@ void Room::loadRoomData(const byte *roomData) {
}
void Room::roomLoop() {
_vm->_scripts->_sequence = 2000;
_vm->_scripts->_sequence = ROOM_SCRIPT;
_vm->_scripts->searchForSequence();
_vm->_scripts->executeScript();
}

View file

@ -25,8 +25,6 @@
#include "access/resources.h"
#include "access/scripts.h"
#define SCRIPT_START_BYTE 0xE0
namespace Access {
Scripts::Scripts(AccessEngine *vm) : Manager(vm) {

View file

@ -32,6 +32,9 @@ namespace Access {
class AccessEngine;
class Scripts;
#define SCRIPT_START_BYTE 0xE0
#define ROOM_SCRIPT 2000
class Scripts: public Manager {
private:
Resource *_resource;