diff options
-rw-r--r-- | engines/mohawk/livingbooks_code.cpp | 31 | ||||
-rw-r--r-- | engines/mohawk/livingbooks_code.h | 12 | ||||
-rw-r--r-- | engines/mohawk/livingbooks_lbx.cpp | 141 | ||||
-rw-r--r-- | engines/mohawk/livingbooks_lbx.h | 47 | ||||
-rw-r--r-- | engines/mohawk/module.mk | 1 |
5 files changed, 230 insertions, 2 deletions
diff --git a/engines/mohawk/livingbooks_code.cpp b/engines/mohawk/livingbooks_code.cpp index 59b0510123..c18f49171c 100644 --- a/engines/mohawk/livingbooks_code.cpp +++ b/engines/mohawk/livingbooks_code.cpp @@ -21,6 +21,7 @@ */ #include "mohawk/livingbooks.h" +#include "mohawk/livingbooks_lbx.h" #include "mohawk/resource.h" #include "common/system.h" @@ -830,8 +831,8 @@ CodeCommandInfo generalCommandInfo[NUM_GENERAL_COMMANDS] = { { "setDisplay", &LBCode::cmdUnimplemented }, { "getDisplay", 0 }, { 0, 0 }, - { "lbxCreate", 0 }, - { "lbxFunc", 0 }, + { "lbxCreate", &LBCode::cmdLBXCreate }, + { "lbxFunc", &LBCode::cmdLBXFunc }, { "waitCursor", 0 }, { "debugBreak", 0 }, { "menuItemEnable", 0 }, @@ -1086,6 +1087,32 @@ void LBCode::cmdSetHitTest(const Common::Array<LBValue> ¶ms) { warning("ignoring setHitTest"); } +void LBCode::cmdLBXCreate(const Common::Array<LBValue> ¶ms) { + if (params.size() != 1) + error("incorrect number of parameters (%d) to lbxCreate", params.size()); + + _stack.push(createLBXObject(_vm, params[0].toInt())); +} + +void LBCode::cmdLBXFunc(const Common::Array<LBValue> ¶ms) { + if (params.size() < 2) + error("incorrect number of parameters (%d) to lbxFunc", params.size()); + + if (params[0].type != kLBValueLBX || !params[0].lbx) + error("invalid lbx object passed to lbxFunc"); + + Common::SharedPtr<LBXObject> lbx = params[0].lbx; + uint callId = params[1].toInt(); + + Common::Array<LBValue> callParams; + for (uint i = 0; i < params.size() - 2; i++) + callParams.push_back(params[i + 2]); + + LBValue result; + if (lbx->call(callId, callParams, result)) + _stack.push(result); +} + void LBCode::cmdKey(const Common::Array<LBValue> ¶ms) { _stack.push(0); // FIXME warning("ignoring Key"); diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h index 552a5f4cc0..ce5910559c 100644 --- a/engines/mohawk/livingbooks_code.h +++ b/engines/mohawk/livingbooks_code.h @@ -32,6 +32,7 @@ namespace Mohawk { class MohawkEngine_LivingBooks; class LBItem; +class LBXObject; struct LBList; enum LBValueType { @@ -41,6 +42,7 @@ enum LBValueType { kLBValuePoint, kLBValueRect, kLBValueItemPtr, + kLBValueLBX, kLBValueList }; @@ -69,6 +71,10 @@ struct LBValue { type = kLBValueItemPtr; item = itm; } + LBValue(Common::SharedPtr<LBXObject> l) { + type = kLBValueLBX; + lbx = l; + } LBValue(Common::SharedPtr<LBList> l) { type = kLBValueList; list = l; @@ -94,6 +100,9 @@ struct LBValue { case kLBValueItemPtr: item = val.item; break; + case kLBValueLBX: + lbx = val.lbx; + break; case kLBValueList: list = val.list; break; @@ -107,6 +116,7 @@ struct LBValue { Common::Point point; Common::Rect rect; LBItem *item; + Common::SharedPtr<LBXObject> lbx; Common::SharedPtr<LBList> list; bool operator==(const LBValue &x) const; @@ -255,6 +265,8 @@ public: void cmdSetPlayParams(const Common::Array<LBValue> ¶ms); void cmdSetKeyEvent(const Common::Array<LBValue> ¶ms); void cmdSetHitTest(const Common::Array<LBValue> ¶ms); + void cmdLBXCreate(const Common::Array<LBValue> ¶ms); + void cmdLBXFunc(const Common::Array<LBValue> ¶ms); void cmdKey(const Common::Array<LBValue> ¶ms); void itemIsPlaying(const Common::Array<LBValue> ¶ms); diff --git a/engines/mohawk/livingbooks_lbx.cpp b/engines/mohawk/livingbooks_lbx.cpp new file mode 100644 index 0000000000..9628e06294 --- /dev/null +++ b/engines/mohawk/livingbooks_lbx.cpp @@ -0,0 +1,141 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "engines/mohawk/livingbooks.h" +#include "engines/mohawk/livingbooks_lbx.h" + +namespace Mohawk { + +class LBXDataFile : public LBXObject { +public: + LBXDataFile(MohawkEngine_LivingBooks *vm); + ~LBXDataFile(); + + bool call(uint callId, const Common::Array<LBValue> ¶ms, LBValue &result); + +protected: + Common::ConfigFile _dataFile; + Common::String _curSection; + + void open(const Common::String &filename); + bool sectionExists(const Common::String §ion); +}; + +LBXDataFile::LBXDataFile(MohawkEngine_LivingBooks *vm) : LBXObject(vm) { +} + +LBXDataFile::~LBXDataFile() { +} + +enum { + kLBXDataFileOpen = 1, + kLBXDataFileGetSectionList = 4, + kLBXDataFileSetCurSection = 5, + kLBXDataFileLoadCurSectionVars = 8, + kLBXDataFileDeleteCurSection = 10, + kLBXDataFileSectionExists = 14 +}; + +bool LBXDataFile::call(uint callId, const Common::Array<LBValue> ¶ms, LBValue &result) { + switch (callId) { + case kLBXDataFileOpen: + if (params.size() != 1) + error("incorrect number of parameters (%d) to LBXDataFile::open", params.size()); + + open(params[0].toString()); + return false; + + case kLBXDataFileGetSectionList: + { + Common::SharedPtr<LBList> list = Common::SharedPtr<LBList>(new LBList); + Common::ConfigFile::SectionList sections = _dataFile.getSections(); + for (Common::List<Common::ConfigFile::Section>::const_iterator i = sections.begin(); i != sections.end(); ++i) + list->array.push_back(LBValue(i->name)); + result = LBValue(list); + } + return true; + + case kLBXDataFileSetCurSection: + if (params.size() != 1) + error("incorrect number of parameters (%d) to LBXDataFile::setCurSection", params.size()); + + _curSection = params[0].toString(); + return false; + + case kLBXDataFileLoadCurSectionVars: + if (params.size() != 0) + error("incorrect number of parameters (%d) to LBXDataFile::loadCurSectionVars", params.size()); + + { + const Common::ConfigFile::SectionKeyList globals = _dataFile.getKeys(_curSection); + for (Common::ConfigFile::SectionKeyList::const_iterator i = globals.begin(); i != globals.end(); i++) { + Common::String command = Common::String::format("%s = %s", i->key.c_str(), i->value.c_str()); + LBCode tempCode(_vm, 0); + uint offset = tempCode.parseCode(command); + tempCode.runCode(NULL, offset); + } + } + return false; + + case kLBXDataFileDeleteCurSection: + if (params.size() != 0) + error("incorrect number of parameters (%d) to LBXDataFile::deleteCurSection", params.size()); + + _dataFile.removeSection(_curSection); + return false; + + case kLBXDataFileSectionExists: + if (params.size() != 1) + error("incorrect number of parameters (%d) to LBXDataFile::sectionExists", params.size()); + if (_dataFile.hasSection(params[0].toString())) + result = 1; + else + result = 0; + return true; + + default: + error("LBXDataFile call %d is unknown", callId); + } +} + +void LBXDataFile::open(const Common::String &filename) { + _dataFile.clear(); + + if (_dataFile.loadFromFile(filename)) + return; + + // FIXME: try savegames + + error("LBXDataFile::open: couldn't open '%s'", filename.c_str()); +} + +Common::SharedPtr<LBXObject> createLBXObject(MohawkEngine_LivingBooks *vm, uint16 type) { + switch (type) { + case 1001: + return Common::SharedPtr<LBXObject>(new LBXDataFile(vm)); + + default: + error("unknown LBX object type %d", type); + } +} + +} // End of namespace Mohawk diff --git a/engines/mohawk/livingbooks_lbx.h b/engines/mohawk/livingbooks_lbx.h new file mode 100644 index 0000000000..3cca0a8e82 --- /dev/null +++ b/engines/mohawk/livingbooks_lbx.h @@ -0,0 +1,47 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MOHAWK_LIVINGBOOKS_LBX_H +#define MOHAWK_LIVINGBOOKS_LBX_H + +#include "engines/mohawk/livingbooks_code.h" + +#include "common/ptr.h" + +namespace Mohawk { + +class LBXObject { +public: + LBXObject(MohawkEngine_LivingBooks *vm) : _vm(vm) { } + virtual ~LBXObject() { } + + virtual bool call(uint callId, const Common::Array<LBValue> ¶ms, LBValue &result) = 0; + +protected: + MohawkEngine_LivingBooks *_vm; +}; + +Common::SharedPtr<LBXObject> createLBXObject(MohawkEngine_LivingBooks *vm, uint16 type); + +} // End of namespace Mohawk + +#endif diff --git a/engines/mohawk/module.mk b/engines/mohawk/module.mk index 30f1d40fdb..882f3966b2 100644 --- a/engines/mohawk/module.mk +++ b/engines/mohawk/module.mk @@ -10,6 +10,7 @@ MODULE_OBJS = \ installer_archive.o \ livingbooks.o \ livingbooks_code.o \ + livingbooks_lbx.o \ mohawk.o \ resource.o \ sound.o \ |