diff options
| -rw-r--r-- | engines/mohawk/livingbooks.cpp | 63 | ||||
| -rw-r--r-- | engines/mohawk/livingbooks.h | 26 | ||||
| -rw-r--r-- | engines/mohawk/livingbooks_code.cpp | 13 | ||||
| -rw-r--r-- | engines/mohawk/livingbooks_code.h | 1 | 
4 files changed, 102 insertions, 1 deletions
| diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index bcc13e2707..08f3b86c7c 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -107,6 +107,11 @@ void LBPage::open(Archive *mhk, uint16 baseId) {  		_items[i]->startPhase(kLBPhaseLoad);  } +void LBPage::addClonedItem(LBItem *item) { +	_vm->addItem(item); +	_items.push_back(item); +} +  void LBPage::itemDestroyed(LBItem *item) {  	for (uint i = 0; i < _items.size(); i++)  		if (item == _items[i]) { @@ -2670,6 +2675,24 @@ void LBItem::moveTo(const Common::Point &pos) {  	_rect.moveTo(pos);  } +LBItem *LBItem::clone(uint16 newId, const Common::String &newName) { +	LBItem *item = createClone(); + +	item->_itemId = newId; +	item->_desc = newName; + +	item->_resourceId = _resourceId; +	// FIXME: the rest + +	_page->addClonedItem(item); +	// FIXME: zorder? +	return item; +} + +LBItem *LBItem::createClone() { +	return new LBItem(_vm, _page, _rect); +} +  void LBItem::runScript(uint event, uint16 data, uint16 from) {  	for (uint i = 0; i < _scriptEntries.size(); i++) {  		LBScriptEntry *entry = _scriptEntries[i]; @@ -3075,6 +3098,10 @@ void LBSoundItem::stop() {  	LBItem::stop();  } +LBItem *LBSoundItem::createClone() { +	return new LBSoundItem(_vm, _page, _rect); +} +  LBGroupItem::LBGroupItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	debug(3, "new LBGroupItem");  	_starting = false; @@ -3222,6 +3249,12 @@ void LBGroupItem::moveTo(const Common::Point &pos) {  	}  } +LBItem *LBGroupItem::createClone() { +	// TODO: needed? +	error("LBGroupItem::createClone unimplemented"); +	return new LBGroupItem(_vm, _page, _rect); +} +  LBPaletteItem::LBPaletteItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	debug(3, "new LBPaletteItem"); @@ -3307,6 +3340,10 @@ void LBPaletteItem::update() {  	LBItem::update();  } +LBItem *LBPaletteItem::createClone() { +	error("can't clone LBPaletteItem"); +} +  LBLiveTextItem::LBLiveTextItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	_currentPhrase = 0xFFFF;  	_currentWord = 0xFFFF; @@ -3554,6 +3591,10 @@ void LBLiveTextItem::notify(uint16 data, uint16 from) {  	LBItem::notify(data, from);  } +LBItem *LBLiveTextItem::createClone() { +	error("can't clone LBLiveTextItem"); +} +  LBPictureItem::LBPictureItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	debug(3, "new LBPictureItem");  } @@ -3599,6 +3640,10 @@ void LBPictureItem::draw() {  	_vm->_gfx->copyAnimImageToScreen(_resourceId, _rect.left, _rect.top);  } +LBItem *LBPictureItem::createClone() { +	return new LBPictureItem(_vm, _page, _rect); +} +  LBAnimationItem::LBAnimationItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	_anim = NULL;  	_running = false; @@ -3704,6 +3749,12 @@ void LBAnimationItem::draw() {  	_anim->draw();  } +LBItem *LBAnimationItem::createClone() { +	LBAnimationItem *item = new LBAnimationItem(_vm, _page, _rect); +	item->_anim = new LBAnimation(_vm, item, _resourceId); +	return item; +} +  LBMovieItem::LBMovieItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	debug(3, "new LBMovieItem");  } @@ -3733,6 +3784,10 @@ bool LBMovieItem::togglePlaying(bool playing, bool restart) {  	return LBItem::togglePlaying(playing, restart);  } +LBItem *LBMovieItem::createClone() { +	return new LBMovieItem(_vm, _page, _rect); +} +  LBMiniGameItem::LBMiniGameItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	debug(3, "new LBMiniGameItem");  } @@ -3768,6 +3823,10 @@ bool LBMiniGameItem::togglePlaying(bool playing, bool restart) {  	return false;  } +LBItem *LBMiniGameItem::createClone() { +	error("can't clone LBMiniGameItem"); +} +  LBProxyItem::LBProxyItem(MohawkEngine_LivingBooks *vm, LBPage *page, Common::Rect rect) : LBItem(vm, page, rect) {  	debug(3, "new LBProxyItem"); @@ -3811,4 +3870,8 @@ void LBProxyItem::unload() {  	LBItem::unload();  } +LBItem *LBProxyItem::createClone() { +	return new LBProxyItem(_vm, _page, _rect); +} +  } // End of namespace Mohawk diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h index cde6357788..23ab0acfb1 100644 --- a/engines/mohawk/livingbooks.h +++ b/engines/mohawk/livingbooks.h @@ -415,6 +415,8 @@ public:  	virtual void moveBy(const Common::Point &pos);  	virtual void moveTo(const Common::Point &pos); +	LBItem *clone(uint16 newId, const Common::String &newName); +  	uint16 getId() { return _itemId; }  	const Common::String &getName() { return _desc; }  	const Common::Rect &getRect() { return _rect; } @@ -452,6 +454,8 @@ protected:  	bool _isAmbient;  	bool _doHitTest; +	virtual LBItem *createClone(); +  	Common::Array<LBScriptEntry *> _scriptEntries;  	void runScript(uint event, uint16 data = 0, uint16 from = 0);  	int runScriptEntry(LBScriptEntry *entry); @@ -472,6 +476,8 @@ public:  	void stop();  protected: +	LBItem *createClone(); +  	bool _running;  }; @@ -503,6 +509,8 @@ public:  	void moveTo(const Common::Point &pos);  protected: +	LBItem *createClone(); +  	bool _starting;  	Common::Array<GroupEntry> _groupEntries; @@ -519,6 +527,8 @@ public:  	void update();  protected: +	LBItem *createClone(); +  	uint16 _fadeInPeriod, _fadeInStep, _drawStart, _drawCount;  	uint32 _fadeInStart, _fadeInCurrent;  	byte *_palette; @@ -550,6 +560,8 @@ public:  	void notify(uint16 data, uint16 from);  protected: +	LBItem *createClone(); +  	void paletteUpdate(uint16 word, bool on);  	void drawWord(uint word, uint yPos); @@ -573,6 +585,9 @@ public:  	bool contains(Common::Point point);  	void draw();  	void init(); + +protected: +	LBItem *createClone();  };  class LBAnimationItem : public LBItem { @@ -593,6 +608,8 @@ public:  	void stop();  protected: +	LBItem *createClone(); +  	LBAnimation *_anim;  	bool _running;  }; @@ -604,6 +621,9 @@ public:  	void update();  	bool togglePlaying(bool playing, bool restart); + +protected: +	LBItem *createClone();  };  class LBMiniGameItem : public LBItem { @@ -612,6 +632,9 @@ public:  	~LBMiniGameItem();  	bool togglePlaying(bool playing, bool restart); + +protected: +	LBItem *createClone();  };  class LBProxyItem : public LBItem { @@ -623,6 +646,8 @@ public:  	void unload();  protected: +	LBItem *createClone(); +  	class LBPage *_page;  }; @@ -659,6 +684,7 @@ public:  	void open(Archive *mhk, uint16 baseId);  	uint16 getResourceVersion(); +	void addClonedItem(LBItem *item);  	void itemDestroyed(LBItem *item);  	LBCode *_code; diff --git a/engines/mohawk/livingbooks_code.cpp b/engines/mohawk/livingbooks_code.cpp index 0cb99f709e..41acea19c4 100644 --- a/engines/mohawk/livingbooks_code.cpp +++ b/engines/mohawk/livingbooks_code.cpp @@ -1336,7 +1336,7 @@ void LBCode::cmdKey(const Common::Array<LBValue> ¶ms) {  #define NUM_ITEM_COMMANDS 34  CodeCommandInfo itemCommandInfo[NUM_ITEM_COMMANDS] = { -	{ "clone", 0 }, +	{ "clone", &LBCode::itemClone },  	{ "destroy", 0 },  	{ "dragBeginFrom", 0 },  	{ "dragEnd", 0 }, @@ -1389,6 +1389,17 @@ void LBCode::runItemCommand() {  	(this->*(info.func))(params);  } +void LBCode::itemClone(const Common::Array<LBValue> ¶ms) { +	// TODO: first param can be target? +	if (params.size() != 2) +		error("incorrect number of parameters (%d) to setParent", params.size()); + +	uint id = params[0].toInt(); +	const Common::String &name = params[1].toString(); + +	_currSource->clone(id, name); +} +  void LBCode::itemIsPlaying(const Common::Array<LBValue> ¶ms) {  	// TODO  	warning("ignoring isPlaying"); diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h index a8d5e2d2dc..47dd90f814 100644 --- a/engines/mohawk/livingbooks_code.h +++ b/engines/mohawk/livingbooks_code.h @@ -281,6 +281,7 @@ public:  	void cmdLBXFunc(const Common::Array<LBValue> ¶ms);  	void cmdKey(const Common::Array<LBValue> ¶ms); +	void itemClone(const Common::Array<LBValue> ¶ms);  	void itemIsPlaying(const Common::Array<LBValue> ¶ms);  	void itemIsLoaded(const Common::Array<LBValue> ¶ms);  	void itemMoveTo(const Common::Array<LBValue> ¶ms); | 
