diff options
| -rw-r--r-- | engines/kyra/gui_lol.cpp | 16 | ||||
| -rw-r--r-- | engines/kyra/items_lol.cpp | 10 | ||||
| -rw-r--r-- | engines/kyra/lol.cpp | 9 | ||||
| -rw-r--r-- | engines/kyra/lol.h | 36 | ||||
| -rw-r--r-- | engines/kyra/module.mk | 1 | ||||
| -rw-r--r-- | engines/kyra/scene_lol.cpp | 30 | ||||
| -rw-r--r-- | engines/kyra/script_lol.cpp | 30 | ||||
| -rw-r--r-- | engines/kyra/text_lol.cpp | 7 | ||||
| -rw-r--r-- | engines/kyra/timer_lol.cpp | 95 | 
9 files changed, 186 insertions, 48 deletions
| diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index 8581b47d86..3dbf6f826e 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -980,7 +980,7 @@ int LoLEngine::clickedTurnLeftArrow(Button *button) {  	_sceneDefaultUpdate = 1; -	runSceneScript(_currentBlock, 0x4000); +	runLevelScript(_currentBlock, 0x4000);  	initTextFading(2, 0);  	if (!_sceneDefaultUpdate) @@ -989,7 +989,7 @@ int LoLEngine::clickedTurnLeftArrow(Button *button) {  		movePartySmoothScrollTurnLeft(1);  	gui_toggleButtonDisplayMode(79, 0); -	runSceneScript(_currentBlock, 0x10); +	runLevelScript(_currentBlock, 0x10);  	return 1;  } @@ -1002,7 +1002,7 @@ int LoLEngine::clickedTurnRightArrow(Button *button) {  	_sceneDefaultUpdate = 1; -	runSceneScript(_currentBlock, 0x4000); +	runLevelScript(_currentBlock, 0x4000);  	initTextFading(2, 0);  	if (!_sceneDefaultUpdate) @@ -1011,7 +1011,7 @@ int LoLEngine::clickedTurnRightArrow(Button *button) {  		movePartySmoothScrollTurnRight(1);  	gui_toggleButtonDisplayMode(81, 0); -	runSceneScript(_currentBlock, 0x10); +	runLevelScript(_currentBlock, 0x10);  	return 1;  } @@ -1142,7 +1142,7 @@ int LoLEngine::clickedCharInventorySlot(Button *button) {  	int ih = _itemInHand; -	pickupItem(_characters[_selectedCharacter].items[button->data2Val2]); +	setHandItem(_characters[_selectedCharacter].items[button->data2Val2]);  	_characters[_selectedCharacter].items[button->data2Val2] = ih;  	gui_drawCharInventoryItem(button->data2Val2); @@ -1198,6 +1198,8 @@ int LoLEngine::clickedScene1(Button *button) {  		return 0;  	int cp = _screen->setCurPage(_sceneDrawPage1); +	clickSceneSub1(); +  	_screen->setCurPage(cp);  	return 1; @@ -1245,10 +1247,10 @@ int LoLEngine::clickedInventorySlot(Button *button) {  		deleteItem(slotItem);  		deleteItem(hItem); -		pickupItem(0); +		setHandItem(0);  		_inventory[slot] = makeItem(280, 0, 0);  	} else { -		pickupItem(slotItem); +		setHandItem(slotItem);  		_inventory[slot] = hItem;  	} diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp index 7c5267f164..12cdba57ff 100644 --- a/engines/kyra/items_lol.cpp +++ b/engines/kyra/items_lol.cpp @@ -182,7 +182,7 @@ void LoLEngine::runItemScript(int charNum, int item, int reg0, int reg3, int reg  		_emc->run(&scriptState);  } -void LoLEngine::pickupItem(int itemIndex) { +void LoLEngine::setHandItem(uint16 itemIndex) {  	if (itemIndex && _itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].flags & 0x80) {  		runItemScript(-1, itemIndex, 0x400, 0, 0);  		if (_itemsInPlay[itemIndex].shpCurFrame_flg & 0x8000) @@ -201,6 +201,14 @@ void LoLEngine::pickupItem(int itemIndex) {  	_screen->setMouseCursor(mouseOffs, mouseOffs, getItemIconShapePtr(itemIndex));  } +void LoLEngine::clickSceneSub1() { + +} + +void LoLEngine::clickSceneSub1Sub1(int itemX, int itemY, int partyX, int partyY) { + +} +  } // end of namespace Kyra diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 45283e9430..7a2a91d62f 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -27,6 +27,7 @@  #include "kyra/screen_lol.h"  #include "kyra/resource.h"  #include "kyra/sound.h" +#include "kyra/timer.h"  #include "kyra/util.h"  #include "sound/voc.h" @@ -773,11 +774,11 @@ void LoLEngine::runLoop() {  	while (!shouldQuit() && _runFlag) {  		if (_nextScriptFunc) { -			runSceneScript(_nextScriptFunc, 2); +			runLevelScript(_nextScriptFunc, 2);  			_nextScriptFunc = 0;  		} -		//updateTimers(); +		_timer->update();  		//checkFloatingPointerRegions();  		gui_updateInput(); @@ -1022,7 +1023,7 @@ void LoLEngine::initTextFading(int textType, int clearField) {  		_screen->clearDim(3);  	_fadeText = false; -	//initGuiUnk(11); +	_timer->disable(11);  }  void LoLEngine::charCallback4(int redraw) { @@ -1214,7 +1215,7 @@ void LoLEngine::fadeText() {  	_screen->clearDim(3); -	///initGuiUnk(11); +	_timer->disable(11);  	_fadeText = false;  } diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 537a1af9bd..dcadab6e86 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -123,8 +123,8 @@ struct CLevelItem {  	uint8 unk2;  	uint16 unk3;  	uint16 blockPropertyIndex; -	uint16 p_1a; -	uint16 p_1b; +	uint16 x; +	uint16 y;  	int8 level;  	uint16 itemPosX;  	uint16 itemPosY; @@ -161,8 +161,8 @@ struct ItemInPlay {  	uint8 unk2;  	uint16 unk3;  	uint16 blockPropertyIndex; -	uint16 p_1a; -	uint16 p_1b; +	uint16 x; +	uint16 y;  	int8 level;  	uint16 itemPropertyIndex;  	uint16 shpCurFrame_flg; @@ -307,8 +307,19 @@ private:  	static const uint8 _charInfoFrameTable[]; -	// timer -	void setupTimers() {} +	// timers +	void setupTimers(); +	void enableTimer(int id); + +	void timerSub1(int timerNum); +	void timerSub2(int timerNum); +	void timerSub3(int timerNum); +	void timerSub4(int timerNum); +	void timerSub5(int timerNum); +	void timerSub6(int timerNum); +	void timerSub7(int timerNum); +	void timerUpdateLampState(int timerNum); +	void timerFadeMessageText(int timerNum);  	// sound  	void loadTalkFile(int index); @@ -464,8 +475,8 @@ private:  	// emc scripts  	void runInitScript(const char *filename, int func);  	void runInfScript(const char *filename); -	void runSceneScript(int block, int sub); -	void runSceneScriptCustom(int block, int sub, int charNum, int item, int reg3, int reg4); +	void runLevelScript(int block, int sub); +	void runLevelScriptCustom(int block, int sub, int charNum, int item, int reg3, int reg4);  	bool checkScriptUnk(int func);  	EMCData _scriptData; @@ -502,6 +513,7 @@ private:  	int olol_mapShapeToBlock(EMCState *script);  	int olol_resetBlockShapeAssignment(EMCState *script);  	int olol_loadMonsterProperties(EMCState *script); +	int olol_setScriptTimer(EMCState *script);  	int olol_loadTimScript(EMCState *script);  	int olol_runTimScript(EMCState *script);  	int olol_releaseTimScript(EMCState *script); @@ -685,7 +697,7 @@ private:  	void drawLevelModifyScreenDim(int dim, int16 x1, int16 y1, int16 x2, int16 y2);  	void drawDecorations(int index);  	void drawIceShapes(int index, int iceShapeIndex); -	void drawMonstersAndItems(int index); +	void drawMonstersAndItems(int block);  	void drawDoor(uint8 *shape, uint8 *table, int index, int unk2, int w, int h, int flags);  	void drawDoorOrMonsterShape(uint8 *shape, uint8 *table, int x, int y, int flags, const uint8 *ovl);  	void drawScriptShapes(int pageNum); @@ -852,8 +864,9 @@ private:  	void deleteItem(int itemIndex);  	CLevelItem *findItem(uint16 index);  	void runItemScript(int charNum, int item, int reg0, int reg3, int reg4); - -	void pickupItem(int itemIndex); +	void setHandItem(uint16 itemIndex); +	void clickSceneSub1(); +	void clickSceneSub1Sub1(int itemX, int itemY, int partyX, int partyY);  	uint8 _moneyColumnHeight[5];  	uint16 _credits; @@ -897,7 +910,6 @@ private:  	// unneeded  	void setWalkspeed(uint8) {} -	void setHandItem(uint16) {}  	void removeHandItem() {}  	bool lineIsPassable(int, int) { return false; } diff --git a/engines/kyra/module.mk b/engines/kyra/module.mk index fa7fa25ce7..f83b936092 100644 --- a/engines/kyra/module.mk +++ b/engines/kyra/module.mk @@ -71,6 +71,7 @@ MODULE_OBJS := \  	text_mr.o \  	timer.o \  	timer_lok.o \ +	timer_lol.o \  	timer_hof.o \  	timer_mr.o \  	util.o \ diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 48c50738d6..1efd337f19 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -26,6 +26,7 @@  #include "kyra/lol.h"  #include "kyra/screen_lol.h"  #include "kyra/resource.h" +#include "kyra/timer.h"  #include "kyra/sound.h"  #include "common/endian.h" @@ -54,7 +55,8 @@ void LoLEngine::loadLevel(int index) {  	releaseMonsterShapes(0);  	releaseMonsterShapes(1); -	// TODO +	for (int i = 0x50; i < 0x53; i++) +		_timer->disable(i);  	_currentLevel = index;  	_updateFlags = 0; @@ -148,7 +150,7 @@ void LoLEngine::initCMZ1(CLevelItem *l, int a) {  			l->field_15 = 0;  			l->itemPosX = _partyPosX;  			l->itemPosY = _partyPosY; -			cmzS2(l, cmzS1(l->p_1a, l->p_1b, l->itemPosX, l->itemPosY)); +			cmzS2(l, cmzS1(l->x, l->y, l->itemPosX, l->itemPosY));  		}  	} else {  		l->field_14 = a; @@ -160,7 +162,7 @@ void LoLEngine::initCMZ1(CLevelItem *l, int a) {  			cmzS3(l);  			if (_currentLevel != 29)  				initCMZ1(l, 14); -			runSceneScriptCustom(0x404, -1, l->field_16, l->field_16, 0, 0); +			runLevelScriptCustom(0x404, -1, l->field_16, l->field_16, 0, 0);  			checkScriptUnk(l->blockPropertyIndex);  			if (l->field_14 == 14)  				initCMZ2(l, 0, 0); @@ -182,9 +184,9 @@ void LoLEngine::initCMZ2(CLevelItem *l, uint16 a, uint16 b) {  	l->blockPropertyIndex = cmzS5(a, b); -	if (l->p_1a != a || l->p_1b != b) { -		l->p_1a = a; -		l->p_1b = b; +	if (l->x != a || l->y != b) { +		l->x = a; +		l->y = b;  		l->anon9 = (++l->anon9) & 3;  	} @@ -202,7 +204,7 @@ void LoLEngine::initCMZ2(CLevelItem *l, uint16 a, uint16 b) {  		return;  	if (l->blockPropertyIndex != t) -		runSceneScriptCustom(l->blockPropertyIndex, 0x800, -1, l->field_16, 0, 0); +		runLevelScriptCustom(l->blockPropertyIndex, 0x800, -1, l->field_16, 0, 0);  	if (_updateFlags & 1)  		return; @@ -432,7 +434,7 @@ void LoLEngine::loadLevelCmzFile(int index) {  		if (_cLevelItems[i].blockPropertyIndex) {  			_cLevelItems[i].blockPropertyIndex = 0;  			_cLevelItems[i].monsters = _monsterProperties + _cLevelItems[i].field_20; -			initCMZ2(&_cLevelItems[i], _cLevelItems[i].p_1a, _cLevelItems[i].p_1b); +			initCMZ2(&_cLevelItems[i], _cLevelItems[i].x, _cLevelItems[i].y);  		}  	} @@ -873,8 +875,8 @@ void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int buttonShape)  	calcCoordinates(_partyPosX, _partyPosY, _currentBlock, 0x80, 0x80);  	_unkFlag &= 0xfdff; -	runSceneScript(opos, 4); -	runSceneScript(npos, 1); +	runLevelScript(opos, 4); +	runLevelScript(npos, 1);  	if (!(_unkFlag & 0x200)) {  		initTextFading(2, 0); @@ -903,8 +905,8 @@ void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int buttonShape)  		gui_toggleButtonDisplayMode(buttonShape, 0);  		if (npos == _currentBlock) { -			runSceneScript(opos, 8); -			runSceneScript(npos, 2); +			runLevelScript(opos, 8); +			runLevelScript(npos, 2);  			if (_levelBlockProperties[npos].walls[0] == 0x1a)  				memset(_levelBlockProperties[npos].walls, 0, 4); @@ -1785,8 +1787,8 @@ void LoLEngine::drawIceShapes(int index, int iceShapeIndex) {  		return;  } -void LoLEngine::drawMonstersAndItems(int index) { - +void LoLEngine::drawMonstersAndItems(int block) { +	  } diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index 2c4e5cc06a..07645ca508 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -25,6 +25,7 @@  #include "kyra/lol.h"  #include "kyra/screen_lol.h" +#include "kyra/timer.h"  #include "kyra/resource.h"  #include "common/endian.h" @@ -54,14 +55,14 @@ void LoLEngine::runInitScript(const char *filename, int func) {  void LoLEngine::runInfScript(const char *filename) {  	_emc->load(filename, &_scriptData, &_opcodes); -	runSceneScript(0x400, -1); +	runLevelScript(0x400, -1);  } -void LoLEngine::runSceneScript(int block, int sub) { -	runSceneScriptCustom(block, sub, -1, 0, 0, 0); +void LoLEngine::runLevelScript(int block, int sub) { +	runLevelScriptCustom(block, sub, -1, 0, 0, 0);  } -void LoLEngine::runSceneScriptCustom(int block, int sub, int charNum, int item, int reg3, int reg4) { +void LoLEngine::runLevelScriptCustom(int block, int sub, int charNum, int item, int reg3, int reg4) {  	EMCState scriptState;  	memset(&scriptState, 0, sizeof(EMCState)); @@ -182,9 +183,9 @@ int LoLEngine::olol_getItemPara(EMCState *script) {  	case 0:  		return i->blockPropertyIndex;  	case 1: -		return i->p_1a; +		return i->x;  	case 2: -		return i->p_1b; +		return i->y;  	case 3:  		return i->level;  	case 4: @@ -561,6 +562,21 @@ int LoLEngine::olol_loadMonsterProperties(EMCState *script) {  	return 1;  } +int LoLEngine::olol_setScriptTimer(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setScriptTimer(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); +	uint8 id = 0x50 + stackPos(0); + +	if (stackPos(1)) { +		_timer->enable(id); +		_timer->setCountdown(id, stackPos(1)); + +	} else { +		_timer->disable(id); +	} + +	return true; +} +  int LoLEngine::olol_loadTimScript(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_loadTimScript(%p) (%d, %s)", (const void *)script, stackPos(0), stackPosString(1));  	if (_activeTim[stackPos(0)]) @@ -843,7 +859,7 @@ void LoLEngine::setupOpcodeTable() {  	OpcodeUnImpl();  	// 0x48 -	OpcodeUnImpl(); +	Opcode(olol_setScriptTimer);  	OpcodeUnImpl();  	OpcodeUnImpl();  	OpcodeUnImpl(); diff --git a/engines/kyra/text_lol.cpp b/engines/kyra/text_lol.cpp index 9f724b9486..68523d4c82 100644 --- a/engines/kyra/text_lol.cpp +++ b/engines/kyra/text_lol.cpp @@ -25,6 +25,7 @@  #include "kyra/lol.h"  #include "kyra/screen_lol.h" +#include "kyra/timer.h"  #include "kyra/util.h"  namespace Kyra { @@ -94,7 +95,7 @@ void TextDisplayer_LoL::expandField() {  	if (_vm->textEnabled()) {  		_vm->_fadeText = false;  		_vm->_textColourFlag = 0; -		//_vm->toggleGuiUnk(11, 0); +		_vm->_timer->disable(11);  		_screen->clearDim(3);  		_screen->copyRegionToBuffer(3, 0, 0, 320, 200, _vm->_pageBuffer1);  		_screen->copyRegion(83, 140, 0, 0, 235, 3, 0, 2, Screen::CR_NO_P_CHECK); @@ -149,7 +150,7 @@ void TextDisplayer_LoL::playDialogue(int dim, char *str, EMCState *script, int16  			_colour1 = 192;  			_colour1prot = true;  			_screen->copyColour(192, 254); -			//toggleGuiUnk(11, 1); +			_vm->enableTimer(11);  			_vm->_textColourFlag = 0;  			_vm->_fadeText = false;  		} @@ -207,7 +208,7 @@ void TextDisplayer_LoL::printMessage(uint16 type, char *str, ...) {  		_screen->setScreenDim(3);  		_screen->clearCurDim();  		_screen->copyColour(192, col); -		//toggleGuiUnk(11, 1); +		_vm->enableTimer(11);  	}  	_colour1 = 192; diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp new file mode 100644 index 0000000000..594aa1733e --- /dev/null +++ b/engines/kyra/timer_lol.cpp @@ -0,0 +1,95 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "kyra/lol.h" +#include "kyra/screen_lol.h" +#include "kyra/timer.h" + +namespace Kyra { + +#define TimerV2(x) new Common::Functor1Mem<int, void, LoLEngine>(this, &LoLEngine::x) + +void LoLEngine::setupTimers() { +	debugC(9, kDebugLevelMain | kDebugLevelTimer, "LoLEngine::setupTimers()"); +	 +	_timer->addTimer(0, TimerV2(timerSub1), 15, true);	 +	_timer->addTimer(0x10, TimerV2(timerSub2), 6, true); +	_timer->addTimer(0x11, TimerV2(timerSub2), 6, true); +	_timer->setNextRun(0x11, 3); +	_timer->addTimer(3, TimerV2(timerSub3), 15, true); +	_timer->addTimer(4, TimerV2(timerSub4), 1, true); +	_timer->addTimer(0x50, TimerV2(timerSub5), 0, false); +	_timer->addTimer(0x51, TimerV2(timerSub5), 0, false); +	_timer->addTimer(0x52, TimerV2(timerSub5), 0, false); +	_timer->addTimer(8, TimerV2(timerSub6), 1200, true); +	_timer->addTimer(9, TimerV2(timerSub7), 10, true); +	_timer->addTimer(10, TimerV2(timerUpdateLampState), 360, true); +	_timer->addTimer(11, TimerV2(timerFadeMessageText), 360, false); +} + +void LoLEngine::enableTimer(int id) { +	_timer->enable(id); +	_timer->setNextRun(id, _system->getMillis() + _timer->getDelay(id) * _tickLength); +} + +void LoLEngine::timerSub1(int timerNum) { + +} + +void LoLEngine::timerSub2(int timerNum) { + +} + +void LoLEngine::timerSub3(int timerNum) { + +} + +void LoLEngine::timerSub4(int timerNum) { + +} + +void LoLEngine::timerSub5(int timerNum) { +	runLevelScript(0x401 + (timerNum & 0x0f), -1); +} + +void LoLEngine::timerSub6(int timerNum) { + +} + +void LoLEngine::timerSub7(int timerNum) { + +} + +void LoLEngine::timerUpdateLampState(int timerNum) { +	if ((_screen->_drawGuiFlag & 0x800) && (_screen->_drawGuiFlag & 0x400) && _lampStatusUnk) +		_lampStatusUnk--; +} + +void LoLEngine::timerFadeMessageText(int timerNum) { +	_timer->disable(timerNum); +	initTextFading(0, 0); +} + +} // end of namespace Kyra | 
