diff options
| author | Florian Kagerer | 2009-03-24 07:18:16 +0000 | 
|---|---|---|
| committer | Florian Kagerer | 2009-03-24 07:18:16 +0000 | 
| commit | e9b4124f1d82f0bfcafdbbb40797c7d767e16c91 (patch) | |
| tree | a3fd0c3b667f853e41462ccab153876a9ebeaf86 | |
| parent | 74a82ef4273aec05cb3fcefa4b77ab8a57cdc863 (diff) | |
| download | scummvm-rg350-e9b4124f1d82f0bfcafdbbb40797c7d767e16c91.tar.gz scummvm-rg350-e9b4124f1d82f0bfcafdbbb40797c7d767e16c91.tar.bz2 scummvm-rg350-e9b4124f1d82f0bfcafdbbb40797c7d767e16c91.zip | |
LOL: - implemented lots of opcodes and fixed a few bugs
- it's now possible to leave the castle
svn-id: r39653
| -rw-r--r-- | engines/kyra/gui_lol.cpp | 46 | ||||
| -rw-r--r-- | engines/kyra/items_lol.cpp | 28 | ||||
| -rw-r--r-- | engines/kyra/lol.cpp | 120 | ||||
| -rw-r--r-- | engines/kyra/lol.h | 100 | ||||
| -rw-r--r-- | engines/kyra/scene_lol.cpp | 392 | ||||
| -rw-r--r-- | engines/kyra/script_lol.cpp | 288 | ||||
| -rw-r--r-- | engines/kyra/script_tim.cpp | 12 | ||||
| -rw-r--r-- | engines/kyra/sprites_lol.cpp | 14 | ||||
| -rw-r--r-- | engines/kyra/staticres.cpp | 2 | ||||
| -rw-r--r-- | engines/kyra/text_lol.cpp | 2 | ||||
| -rw-r--r-- | engines/kyra/timer_lol.cpp | 4 | 
11 files changed, 718 insertions, 290 deletions
| diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index de531a8c66..e7c3d6f138 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -74,7 +74,7 @@ void LoLEngine::gui_drawScene(int pageNum) {  }  void LoLEngine::gui_drawInventory() { -	if (!_hideControls || !_hideInventory) { +	if (!_currentControlMode || !_hideInventory) {  		for (int i = 0; i < 9; i++)  			gui_drawInventoryItem(i);  	} @@ -342,7 +342,7 @@ void LoLEngine::gui_drawCharPortraitWithStats(int charNum) {  	int cp = _screen->setCurPage(6);  	gui_drawBox(0, 0, 66, 34, 1, 1, -1); -	gui_drawCharFaceShape(0, 0, 1, _screen->_curPage); +	gui_drawCharFaceShape(charNum, 0, 1, _screen->_curPage);  	gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 162, 1, 0);  	gui_drawLiveMagicBar(39, 32, _characters[charNum].hitPointsCur, 0, _characters[charNum].hitPointsMax, 5, 32, 154, 1, 1); @@ -427,11 +427,11 @@ void LoLEngine::gui_drawBox(int x, int y, int w, int h, int frameColor1, int fra  }  void LoLEngine::gui_drawCharFaceShape(int charNum, int x, int y, int pageNum) { -	if (_characters[charNum].curFaceFrame < 7 && _characters[charNum].nextFaceFrame) -		_characters[charNum].curFaceFrame = _characters[charNum].nextFaceFrame; +	if (_characters[charNum].curFaceFrame < 7 && _characters[charNum].defaultFaceFrame) +		_characters[charNum].curFaceFrame = _characters[charNum].defaultFaceFrame; -	if (_characters[charNum].nextFaceFrame == 0 && _characters[charNum].curFaceFrame > 1 && _characters[charNum].curFaceFrame < 7) -		_characters[charNum].curFaceFrame = _characters[charNum].nextFaceFrame; +	if (_characters[charNum].defaultFaceFrame == 0 && _characters[charNum].curFaceFrame > 1 && _characters[charNum].curFaceFrame < 7) +		_characters[charNum].curFaceFrame = _characters[charNum].defaultFaceFrame;  	int frm = (_characters[charNum].flags & 0x1108 && _characters[charNum].curFaceFrame < 7) ? 1 : _characters[charNum].curFaceFrame; @@ -573,7 +573,7 @@ void LoLEngine::gui_drawCompass() {  int LoLEngine::gui_enableControls() {  	_floatingMouseArrowControl = 0; -	if (!_hideControls) { +	if (!_currentControlMode) {  		for (int i = 76; i < 85; i++)  			gui_toggleButtonDisplayMode(i, 2);  	} @@ -583,7 +583,7 @@ int LoLEngine::gui_enableControls() {  }  int LoLEngine::gui_disableControls(int controlMode) { -	if (_hideControls) +	if (_currentControlMode)  		return 0;  	_floatingMouseArrowControl = (controlMode & 2) ? 2 : 1; @@ -603,7 +603,7 @@ void LoLEngine::gui_toggleButtonDisplayMode(int shapeIndex, int mode) {  	if (shapeIndex == 78 && !(_gameFlags[15] & 0x1000))  		return; -	if (_hideControls && _hideInventory) +	if (_currentControlMode && _hideInventory)  		return;  	if (mode == 0) @@ -807,11 +807,11 @@ void LoLEngine::gui_triggerEvent(int eventType) {  void LoLEngine::gui_enableDefaultPlayfieldButtons() {  	gui_resetButtonList();  	gui_initButtonsFromList(_buttonList1); -	gui_initCharacterControlButtons(7, 44); -	gui_initCharacterControlButtons(11, 44); -	gui_initCharacterControlButtons(17, 0); -	gui_initCharacterControlButtons(29, 0); -	gui_initCharacterControlButtons(25, 33); +	gui_setFaceFramesControlButtons(7, 44); +	gui_setFaceFramesControlButtons(11, 44); +	gui_setFaceFramesControlButtons(17, 0); +	gui_setFaceFramesControlButtons(29, 0); +	gui_setFaceFramesControlButtons(25, 33);  	if (_gameFlags[15] & 0x2000)  		gui_initMagicScrollButtons(); @@ -834,11 +834,19 @@ void LoLEngine::gui_enableSequenceButtons(int x, int y, int w, int h, int enable  		gui_initButtonsFromList(_buttonList5);  } +void LoLEngine::gui_specialSceneRestoreButtons() { +	if (!_spsWindowW && !_spsWindowH) +		return; + +	gui_enableDefaultPlayfieldButtons(); +	_spsWindowX = _spsWindowY = _spsWindowW = _spsWindowH = _seqTrigger = 0; +} +  void LoLEngine::gui_enableCharInventoryButtons(int charNum) {  	gui_resetButtonList();  	gui_initButtonsFromList(_buttonList2);  	gui_initCharInventorySpecialButtons(charNum); -	gui_initCharacterControlButtons(21, 0); +	gui_setFaceFramesControlButtons(21, 0);  }  void LoLEngine::gui_resetButtonList() { @@ -857,7 +865,7 @@ void LoLEngine::gui_initButtonsFromList(const int16 *list) {  		gui_initButton(*list++);  } -void LoLEngine::gui_initCharacterControlButtons(int index, int xOffs) { +void LoLEngine::gui_setFaceFramesControlButtons(int index, int xOffs) {  	int c = countActiveCharacters();  	for (int i = 0; i < c; i++)  		gui_initButton(index + i, _activeCharsXpos[i] + xOffs); @@ -1061,7 +1069,7 @@ int LoLEngine::clickedMagicSubmenu(Button *button) {  		// TODO  		///  		/*if (processSpellcast(c, _availableSpells[_selectedSpell], spellLevel)) { -			initCharacterUnkSub(c, 1, 8, 1); +			setFaceFramesUnkArrays(c, 1, 8, 1);  			sub_718F(c, 2, spellLevel * spellLevel);  		} else {*/  			_characters[c].flags &= 0xfffb; @@ -1252,7 +1260,7 @@ int LoLEngine::clickedScenePickupItem(Button *button) {  	int found = checkSceneForItems(&_levelBlockProperties[block].drawObjects, p & 0x7f);  	if (found != -1) { -		pickupItem(found, block); +		removeLevelItem(found, block);  		setHandItem(found);  	} @@ -1348,7 +1356,7 @@ int LoLEngine::clickedWall(Button *button) {  			break;  		case 2: -			res = clicked2(block, dir); +			res = clickedLever(block, dir);  			break;  		case 3: diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp index 1977ba9a60..64a6850fcb 100644 --- a/engines/kyra/items_lol.cpp +++ b/engines/kyra/items_lol.cpp @@ -110,7 +110,7 @@ void LoLEngine::takeCredits(int credits, int redraw) {  	}  } -int LoLEngine::makeItem(int itemIndex, int curFrame, int flags) { +int LoLEngine::makeItem(int itemType, int curFrame, int flags) {  	int cnt = 0;  	int r = 0;  	int i = 1; @@ -171,13 +171,29 @@ int LoLEngine::makeItem(int itemIndex, int curFrame, int flags) {  	memset(&_itemsInPlay[slot], 0, sizeof(ItemInPlay)); -	_itemsInPlay[slot].itemPropertyIndex = itemIndex; +	_itemsInPlay[slot].itemPropertyIndex = itemType;  	_itemsInPlay[slot].shpCurFrame_flg = (curFrame & 0x1fff) | flags;  	_itemsInPlay[slot].level = -1;  	return slot;  } +void LoLEngine::placeMoveLevelItem(int itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight) { +	calcCoordinates(_itemsInPlay[itemIndex].x, _itemsInPlay[itemIndex].y, block, xOffs, yOffs); + +	if (_itemsInPlay[itemIndex].blockPropertyIndex) +		removeLevelItem(itemIndex, _itemsInPlay[itemIndex].blockPropertyIndex); + +	if (_currentLevel == level) { +		setItemPosition(itemIndex, _itemsInPlay[itemIndex].x, _itemsInPlay[itemIndex].y, flyingHeight, 1); +	} else { +		_itemsInPlay[itemIndex].level = level; +		_itemsInPlay[itemIndex].blockPropertyIndex = block; +		_itemsInPlay[itemIndex].flyingHeight = flyingHeight; +		_itemsInPlay[itemIndex].shpCurFrame_flg |= 0x4000; +	} +} +  bool LoLEngine::addItemToInventory(int itemIndex) {  	int pos = 0;  	int i = 0; @@ -265,7 +281,7 @@ void LoLEngine::setHandItem(uint16 itemIndex) {  	if (itemIndex && !(_gameFlags[15] & 0x200)) {  		mouseOffs = 10; -		if (!_hideControls || textEnabled()) +		if (!_currentControlMode || textEnabled())  			_txt->printMessage(0, getLangString(0x403E), getLangString(_itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].nameStringId));  	} @@ -300,7 +316,7 @@ void LoLEngine::setItemPosition(int item, uint16 x, uint16 y, int flyingHeight,  	checkSceneUpdateNeed(block);  } -void LoLEngine::pickupItem(int item, int block) { +void LoLEngine::removeLevelItem(int item, int block) {  	removeAssignedObjectFromBlock(&_levelBlockProperties[block], item);  	removeDrawObjectFromBlock(&_levelBlockProperties[block], item);  	runLevelScriptCustom(block, 0x100, -1, item, 0, 0); @@ -310,7 +326,7 @@ void LoLEngine::pickupItem(int item, int block) {  bool LoLEngine::throwItem(int a, int item, int x, int y, int flyingHeight, int direction, int, int charNum, int c) {  	int sp = checkDrawObjectSpace(_partyPosX, _partyPosX, x, y); -	FlyingObject *t = _flyingItems; +	FlyingObject *t = _flyingObjects;  	int slot = -1;  	int i = 0; @@ -331,7 +347,7 @@ bool LoLEngine::throwItem(int a, int item, int x, int y, int flyingHeight, int d  	if (sp != -1 && slot != -1) {  		i = slot; -		t = &_flyingItems[i]; +		t = &_flyingObjects[i];  		endObjectFlight(t, x, y, 8);  	} diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 526cfc01ac..34ee0891ac 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -86,7 +86,8 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy  	_itemInHand = 0;  	memset(_inventory, 0, sizeof(_inventory));  	_inventoryCurItem = 0; -	_hideControls = 0; +	_currentControlMode = 0; +	_specialSceneFlag = 0;  	_lastCharInventory = -1;  	_itemIconShapes = _itemShapes = _gameShapes = _thrownShapes = _effectShapes = _fireballShapes = 0; @@ -119,7 +120,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy  	_scriptDirection = 0;  	_currentDirection = 0;  	_currentBlock = 0; -	memset(_currentBlockPropertyIndex, 0, sizeof(_currentBlockPropertyIndex)); +	memset(_visibleBlockIndex, 0, sizeof(_visibleBlockIndex));  	_scrollSceneBuffer = 0;  	_smoothScrollModeNormal = 1; @@ -147,12 +148,13 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy  	_lampOilStatus = _brightness = _lampStatusUnk = 0;  	_lampStatusSuspended = false;  	_tempBuffer5120 = 0; -	_flyingItems = 0; +	_flyingObjects = 0;  	_monsters = 0;  	_lastMouseRegion = 0;  	_monsterLastWalkDirection = _monsterCountUnk = _monsterShiftAlt = 0;  	_monsterCurBlock = 0;  	_seqWindowX1 = _seqWindowY1 = _seqWindowX2 = _seqWindowY2 = _seqTrigger = 0; +	_spsWindowX = _spsWindowY = _spsWindowW = _spsWindowH = 0;  	_dscUnk1 = 0;  	_dscShapeIndex = 0; @@ -181,7 +183,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy  	_curMusicFileIndex = -1;  	_environmentSfx = _environmentSfxVol = _environmentSfxDistThreshold = 0; -	_sceneDrawVar1 = _sceneDrawVar2 = _sceneDrawVar3 = _wllProcessFlag = 0; +	_sceneDrawVarDown = _sceneDrawVarRight = _sceneDrawVarLeft = _wllProcessFlag = 0;  	_partyPosX = _partyPosY = 0;  	_shpDmX = _shpDmY = _dmScaleW = _dmScaleH = 0; @@ -209,6 +211,8 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy  	_monsterDifficulty = 1;  	_smoothScrollingEnabled = true;  	_floatingCursorsEnabled = false; + +	_unkIceSHpFlag = 0;  }  LoLEngine::~LoLEngine() { @@ -299,7 +303,7 @@ LoLEngine::~LoLEngine() {  	delete[] _lvlShapeBottom;  	delete[] _lvlShapeLeftRight;  	delete[] _tempBuffer5120; -	delete[] _flyingItems; +	delete[] _flyingObjects;  	delete[] _monsters;  	delete[] _levelBlockProperties;  	delete[] _monsterProperties; @@ -418,8 +422,8 @@ Common::Error LoLEngine::init() {  	_tempBuffer5120 = new uint8[5120];  	memset(_tempBuffer5120, 0, 5120); -	_flyingItems = new FlyingObject[8]; -	memset(_flyingItems, 0, 8 * sizeof(FlyingObject)); +	_flyingObjects = new FlyingObject[8]; +	memset(_flyingObjects, 0, 8 * sizeof(FlyingObject));  	memset(_gameFlags, 0, sizeof(_gameFlags));  	memset(_globalScriptVars, 0, sizeof(_globalScriptVars)); @@ -757,7 +761,7 @@ void LoLEngine::startupNew() {  	gui_enableDefaultPlayfieldButtons(); -	loadLevel(1); +	loadLevel(_currentLevel);  	_screen->showMouse();  } @@ -885,29 +889,29 @@ bool LoLEngine::addCharacter(int id) {  	calcCharPortraitXpos();  	if (numChars > 0) -		initCharacter(numChars, 2, 6, 0); +		setFaceFrames(numChars, 2, 6, 0);  	return true;  } -void LoLEngine::initCharacter(int charNum, int firstFaceFrame, int unk2, int redraw) { -	_characters[charNum].nextFaceFrame = firstFaceFrame; -	if (firstFaceFrame || unk2) -		initCharacterUnkSub(charNum, 6, unk2, 1); +void LoLEngine::setFaceFrames(int charNum, int defaultFrame, int unk2, int redraw) { +	_characters[charNum].defaultFaceFrame = defaultFrame; +	if (defaultFrame || unk2) +		setFaceFramesUnkArrays(charNum, 6, unk2, 1);  	if (redraw)  		gui_drawCharPortraitWithStats(charNum);  } -void LoLEngine::initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3) { +void LoLEngine::setFaceFramesUnkArrays(int charNum, int unk1, int unk2, int unk3) { +	LoLCharacter *l = &_characters[charNum];  	for (int i = 0; i < 5; i++) { -		if (_characters[charNum].arrayUnk1[i] == 0 || (unk3 && _characters[charNum].arrayUnk1[i] == unk1)) { -			_characters[charNum].arrayUnk1[i] = unk1; -			_characters[charNum].arrayUnk2[i] = unk2; - -			// TODO +		if (l->arrayUnk2[i] && (!unk3 || l->arrayUnk2[i] != unk1)) +			continue; -			break; -		} +		l->arrayUnk2[i] = unk1; +		l->arrayUnk1[i] = unk2; +		_timer->setNextRun(3, _system->getMillis()); +		_timer->enable(3);		  	}  } @@ -1029,10 +1033,10 @@ void LoLEngine::setCharFaceFrame(int charNum, int frameNum) {  void LoLEngine::faceFrameRefresh(int charNum) {  	if (_characters[charNum].curFaceFrame == 1) -		initCharacter(charNum, 0, 0, 0); +		setFaceFrames(charNum, 0, 0, 0);  	else if (_characters[charNum].curFaceFrame == 6) -		if (_characters[charNum].nextFaceFrame != 5) -			initCharacter(charNum, 0, 0, 0); +		if (_characters[charNum].defaultFaceFrame != 5) +			setFaceFrames(charNum, 0, 0, 0);  		else  			_characters[charNum].curFaceFrame = 5;  	else @@ -1156,8 +1160,8 @@ void LoLEngine::setupScreenDims() {  	}  } -void LoLEngine::initAnimatedDialogue(int controlMode) { -	resetPortraitsArea(); +void LoLEngine::initSceneWindowDialogue(int controlMode) { +	resetPortraitsAndDisableSysTimer();  	gui_prepareForSequence(112, 0, 176, 120, controlMode);  	_updateFlags |= 3; @@ -1182,7 +1186,7 @@ void LoLEngine::toggleSelectedCharacterFrame(bool mode) {  }  void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags) { -	setSequenceGui(x, y, w, h, buttonFlags); +	setSequenceButtons(x, y, w, h, buttonFlags);  	_seqWindowX1 = x;  	_seqWindowY1 = y; @@ -1200,12 +1204,34 @@ void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFla  	}  } -void LoLEngine::restoreAfterAnimatedDialogue(int redraw) { +void LoLEngine::gui_specialSceneSuspendControls(int controlMode) { +	if (controlMode) { +		_updateFlags |= 4; +		setLampMode(false); +	} +	_updateFlags |= 1; +	_specialSceneFlag = 1; +	_currentControlMode = controlMode; +	calcCharPortraitXpos(); +	//checkMouseRegions(); +} + +void LoLEngine::gui_specialSceneRestoreControls(int restoreLamp) { +	if (restoreLamp) { +		_updateFlags &= 0xfffa; +		resetLampStatus(); +	} +	_updateFlags &= 0xfffe; +	_specialSceneFlag = 0; +	//checkMouseRegions(); +} + +void LoLEngine::restoreAfterSceneWindowDialogue(int redraw) {  	gui_enableControls();  	_txt->setupField(false);  	_updateFlags &= 0xffdf; -	restoreDefaultGui(); +	setDefaultButtonState();  	for (int i = 0; i < 6; i++)  		_tim->freeAnimStruct(i); @@ -1224,7 +1250,7 @@ void LoLEngine::restoreAfterAnimatedDialogue(int redraw) {  	enableSysTimer(2);  } -void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) { +void LoLEngine::initDialogueSequence(int controlMode, int pageNum) {  	if (controlMode) {  		_timer->disable(11);  		_fadeText = false; @@ -1239,7 +1265,7 @@ void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) {  		_txt->clearDim(4);  		_updateFlags |= 2; -		_hideControls = controlMode; +		_currentControlMode = controlMode;  		calcCharPortraitXpos();  		if (!textEnabled() && (!(controlMode & 2))) { @@ -1261,19 +1287,19 @@ void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) {  		_txt->clearDim(4);  	} -	_hideControls = controlMode; +	_currentControlMode = controlMode;  	_dialogueField = true;	  } -void LoLEngine::restoreAfterNonAnimatedDialogue(int controlMode) { +void LoLEngine::restoreAfterDialogueSequence(int controlMode) {  	if (!_dialogueField)  		return;  	updatePortraits(); -	_hideControls = controlMode; +	_currentControlMode = controlMode;  	calcCharPortraitXpos(); -	if (_hideControls) { +	if (_currentControlMode) {  		_screen->modifyScreenDim(4, 11, 124, 28, 45);  		_screen->modifyScreenDim(5, 85, 123, 233, 54);  		_updateFlags &= 0xfffd; @@ -1287,9 +1313,9 @@ void LoLEngine::restoreAfterNonAnimatedDialogue(int controlMode) {  	_dialogueField = false;  } -void LoLEngine::resetPortraitsArea() { +void LoLEngine::resetPortraitsAndDisableSysTimer() {  	_hideInventory = 1; -	if (!textEnabled() || (!(_hideControls & 2))) +	if (!textEnabled() || (!(_currentControlMode & 2)))  		timerUpdatePortraitAnimations(1);  	disableSysTimer(2); @@ -1613,16 +1639,16 @@ bool LoLEngine::characterSays(int track, int charId, bool redraw) {  	if (charId == 1) {  		charId = _selectedCharacter;  	} else { -		if (charId < 0) { -			for (int i = 0; i < 4; i++) { -				if (charId != _characters[i].id || !(_characters[i].flags & 1)) -					continue; -				charId = i; -				break; -			} -		} else { -			charId = 0; +		int i = 0; +		for (;i < 4; i++) { +			if (charId != _characters[i].id || !(_characters[i].flags & 1)) +				continue; +			charId = i; +			break;  		} + +		if (i == 4) +			return false;  	}  	bool r = snd_playCharacterSpeech(track, charId, 0); @@ -1683,7 +1709,7 @@ int LoLEngine::playCharacterScriptChat(int charId, int mode, int unk1, char *str  	if (script)  		snd_playCharacterSpeech(script->stack[script->sp + 2], ch, 0);  	else if (paramList) -		snd_playCharacterSpeech(paramList[1], ch, 0); +		snd_playCharacterSpeech(paramList[2], ch, 0);  	if (textEnabled()) {  		if (mode == 0) { diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 593b04c01b..e117239ef0 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -49,7 +49,7 @@ struct LoLCharacter {  	uint8 raceClassSex;  	int16 id;  	uint8 curFaceFrame; -	uint8 nextFaceFrame; +	uint8 defaultFaceFrame;  	uint8 field_12;  	const uint16 *defaultModifiers;  	uint16 itemsMight[8]; @@ -180,8 +180,8 @@ struct ItemProperty {  struct LevelShapeProperty {  	uint16 shapeIndex[10];  	uint8 scaleFlag[10]; -	uint16 shapeX[10]; -	uint16 shapeY[10]; +	int16 shapeX[10]; +	int16 shapeY[10];  	int8 next;  	uint8 flags;  }; @@ -420,6 +420,8 @@ private:  	void gui_toggleButtonDisplayMode(int shapeIndex, int mode);  	void gui_toggleFightButtons(bool disable);  	void gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags); +	void gui_specialSceneSuspendControls(int controlMode); +	void gui_specialSceneRestoreControls(int restoreLamp);  	bool _weaponsDisabled;  	int _lastButtonShape; @@ -437,11 +439,12 @@ private:  	void gui_triggerEvent(int eventType);  	void gui_enableDefaultPlayfieldButtons();  	void gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags); +	void gui_specialSceneRestoreButtons();  	void gui_enableCharInventoryButtons(int charNum);  	void gui_resetButtonList();  	void gui_initButtonsFromList(const int16 *list); -	void gui_initCharacterControlButtons(int index, int xOffs); +	void gui_setFaceFramesControlButtons(int index, int xOffs);  	void gui_initCharInventorySpecialButtons(int charNum);  	void gui_initMagicScrollButtons();  	void gui_initMagicSubmenu(int charNum); @@ -524,7 +527,7 @@ private:  	uint16 _currentDirection;  	uint16 _currentBlock;  	bool _sceneUpdateRequired; -	int16 _currentBlockPropertyIndex[18]; +	int16 _visibleBlockIndex[18];  	uint16 _gameFlags[16];  	uint16 _globalScriptVars[16]; @@ -542,6 +545,7 @@ private:  	int olol_allocItemPropertiesBuffer(EMCState *script);  	int olol_setItemProperty(EMCState *script);  	int olol_makeItem(EMCState *script); +	int olol_createLevelItem(EMCState *script);  	int olol_getItemPara(EMCState *script);  	int olol_getCharacterStat(EMCState *script);  	int olol_setCharacterStat(EMCState *script); @@ -553,10 +557,13 @@ private:  	int olol_freeAnimStruct(EMCState *script);  	int olol_getDirection(EMCState *script);  	int olol_setMusicTrack(EMCState *script); +	int olol_setSequenceButtons(EMCState *script); +	int olol_setDefaultButtonState(EMCState *script);  	int olol_checkRectForMousePointer(EMCState *script);  	int olol_clearDialogueField(EMCState *script);  	int olol_setupBackgroundAnimationPart(EMCState *script);  	int olol_startBackgroundAnimation(EMCState *script); +	int olol_fadeToBlack(EMCState *script);	  	int olol_fadePalette(EMCState *script);  	int olol_loadBitmap(EMCState *script);  	int olol_stopBackgroundAnimation(EMCState *script); @@ -572,6 +579,8 @@ private:  	int olol_initMonster(EMCState *script);  	int olol_fadeClearSceneWindow(EMCState *script);  	int olol_fadeSequencePalette(EMCState *script); +	int olol_redrawPlayfield(EMCState *script); +	int olol_loadNewLevel(EMCState *script);  	int olol_dummy0(EMCState *script);  	int olol_loadMonsterProperties(EMCState *script);  	int olol_battleHitSkillTest(EMCState *script); @@ -581,11 +590,12 @@ private:  	int olol_checkMoney(EMCState *script);  	int olol_setScriptTimer(EMCState *script);  	int olol_createHandItem(EMCState *script); +	int olol_characterJoinsParty(EMCState *script);  	int olol_loadTimScript(EMCState *script);  	int olol_runTimScript(EMCState *script);  	int olol_releaseTimScript(EMCState *script); -	int olol_initAnimatedDialogue(EMCState *script); -	int olol_restoreAfterAnimatedDialogue(EMCState *script); +	int olol_initSceneWindowDialogue(EMCState *script); +	int olol_restoreAfterSceneWindowDialogue(EMCState *script);  	int olol_getItemInHand(EMCState *script);  	int olol_giveItemToMonster(EMCState *script);  	int olol_loadLangFile(EMCState *script); @@ -593,6 +603,7 @@ private:  	int olol_processDialogue(EMCState *script);  	int olol_stopTimScript(EMCState *script);  	int olol_getWallFlags(EMCState *script); +	int olol_changeMonsterSettings(EMCState *script);  	int olol_playCharacterScriptChat(EMCState *script);  	int olol_update(EMCState *script);  	int olol_drawExitButton(EMCState *script); @@ -604,17 +615,25 @@ private:  	int olol_playDialogueTalkText(EMCState *script);  	int olol_checkMonsterTypeHostility(EMCState *script);  	int olol_setNextFunc(EMCState *script); +	int olol_dummy1(EMCState *script); +	int olol_suspendMonster(EMCState *script);	  	int olol_setDoorState(EMCState *script);  	int olol_processButtonClick(EMCState *script);  	int olol_savePage5(EMCState *script);  	int olol_restorePage5(EMCState *script); -	int olol_initNonAnimatedDialogue(EMCState *script); -	int olol_restoreAfterNonAnimatedDialogue(EMCState *script); +	int olol_initDialogueSequence(EMCState *script); +	int olol_restoreAfterDialogueSequence(EMCState *script); +	int olol_setSpecialSceneButtons(EMCState *script); +	int olol_prepareSpecialScene(EMCState *script); +	int olol_restoreAfterSpecialScene(EMCState *script);  	int olol_assignCustomSfx(EMCState *script); -	int olol_resetPortraitsArea(EMCState *script); +	int olol_resetPortraitsAndDisableSysTimer(EMCState *script);  	int olol_enableSysTimer(EMCState *script); +	int olol_disableControls(EMCState *script); +	int olol_enableControls(EMCState *script);	  	int olol_queueSpeech(EMCState *script);  	int olol_getItemPrice(EMCState *script); +	int olol_getLanguage(EMCState *script);  	// tim scripts  	TIM *_activeTim[10]; @@ -629,8 +648,8 @@ private:  	int tlol_processWsaFrame(const TIM *tim, const uint16 *param);  	int tlol_displayText(const TIM *tim, const uint16 *param); -	int tlol_initAnimatedDialogue(const TIM *tim, const uint16 *param); -	int tlol_restoreAfterAnimatedDialogue(const TIM *tim, const uint16 *param); +	int tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param); +	int tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param);  	int tlol_giveItem(const TIM *tim, const uint16 *param);  	int tlol_setPartyPosition(const TIM *tim, const uint16 *param);  	int tlol_fadeClearWindow(const TIM *tim, const uint16 *param); @@ -663,11 +682,11 @@ private:  	// graphics  	void setupScreenDims(); -	void initAnimatedDialogue(int controlMode); -	void restoreAfterAnimatedDialogue(int redraw); -	void initNonAnimatedDialogue(int controlMode, int pageNum); -	void restoreAfterNonAnimatedDialogue(int controlMode); -	void resetPortraitsArea(); +	void initSceneWindowDialogue(int controlMode); +	void restoreAfterSceneWindowDialogue(int redraw); +	void initDialogueSequence(int controlMode, int pageNum); +	void restoreAfterDialogueSequence(int controlMode); +	void resetPortraitsAndDisableSysTimer();  	void toggleSelectedCharacterFrame(bool mode);  	void fadeText();  	void setPaletteBrightness(uint8 *palette, int brightness, int modifier); @@ -699,8 +718,8 @@ private:  	// characters  	bool addCharacter(int id); -	void initCharacter(int charNum, int firstFaceFrame, int unk2, int redraw); -	void initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3); +	void setFaceFrames(int charNum, int defaultFrame, int unk2, int redraw); +	void setFaceFramesUnkArrays(int charNum, int unk1, int unk2, int unk3);  	int countActiveCharacters();  	void loadCharFaceShapes(int charNum, int id);  	void calcCharPortraitXpos(); @@ -774,20 +793,20 @@ private:  	void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile);  	void resetItems(int flag); -	void resetLvlBuffer(); +	void disableMonsters();  	void resetBlockProperties();  	bool testWallFlag(int block, int direction, int flag);  	bool testWallInvisibility(int block, int direction);  	void drawScene(int pageNum); -	void generateBlockDrawingBuffer(int block, int direction); -	void generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries); -	void generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries); +	void generateBlockDrawingBuffer(); +	void generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY); +	void generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY);  	bool hasWall(int index); -	void assignBlockCaps(int block, int direction); +	void assignVisibleBlocks(int block, int direction); -	void drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint8 *vcnShift, int pageNum); +	void drawVcnBlocks();  	void drawSceneShapes();  	void setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim);  	void scaleLevelShapesDim(int index, int16 &y1, int16 &y2, int dim); @@ -798,8 +817,12 @@ private:  	void setWallType(int block, int wall, int val);  	void updateSceneWindow(); -	void setSequenceGui(int x, int y, int w, int h, int enableFlags); -	void restoreDefaultGui(); +	void prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag); +	int restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode); + +	void setSequenceButtons(int x, int y, int w, int h, int enableFlags); +	void setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags); +	void setDefaultButtonState();  	void updateCompass(); @@ -814,7 +837,7 @@ private:  	void calcCoordinatesAddDirectionOffset(int16 &x, int16 &y, int direction);  	int clickedWallShape(uint16 block, uint16 direction); -	int clicked2(uint16 block, uint16 direction); +	int clickedLever(uint16 block, uint16 direction);  	int clicked3(uint16 block, uint16 direction);  	int clickedWallOnlyScript(uint16 block);  	int clickedDoorSwitch(uint16 block, uint16 direction); @@ -823,6 +846,7 @@ private:  	bool clickedShape(int shapeIndex);  	void processDoorSwitch(uint16 block, int unk);  	void openCloseDoor(uint16 block, int openClose); +	void resetDoors();  	void movePartySmoothScrollBlocked(int speed);  	void movePartySmoothScrollUp(int speed); @@ -874,9 +898,9 @@ private:  	int _lastSpecialColor;  	int _lastSpecialColorWeight; -	int _sceneDrawVar1; -	int _sceneDrawVar2; -	int _sceneDrawVar3; +	int _sceneDrawVarDown; +	int _sceneDrawVarRight; +	int _sceneDrawVarLeft;  	int _wllProcessFlag;  	uint8 *_trueLightTable2; @@ -895,7 +919,7 @@ private:  	int16 *_lvlShapeLeftRight;  	LevelBlockProperty *_levelBlockProperties; -	LevelBlockProperty *_curBlockCaps[18]; +	LevelBlockProperty *_visibleBlocks[18];  	uint16 _partyPosX;  	uint16 _partyPosY; @@ -913,6 +937,7 @@ private:  	int _lastMouseRegion;  	int _seqWindowX1, _seqWindowY1,	_seqWindowX2, _seqWindowY2, _seqTrigger; +	int _spsWindowX, _spsWindowY,	_spsWindowW, _spsWindowH;  	uint8 *_tempBuffer5120; @@ -970,7 +995,8 @@ private:  	// items  	void giveCredits(int credits, int redraw);  	void takeCredits(int credits, int redraw); -	int makeItem(int itemIndex, int curFrame, int flags); +	int makeItem(int itemType, int curFrame, int flags); +	void placeMoveLevelItem(int itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight);  	bool addItemToInventory(int itemIndex);  	bool testUnkItemFlags(int itemIndex);  	void deleteItem(int itemIndex); @@ -979,7 +1005,7 @@ private:  	void setHandItem(uint16 itemIndex);  	void setItemPosition(int item, uint16 x, uint16 y, int flyingHeight, int b); -	void pickupItem(int item, int block); +	void removeLevelItem(int item, int block);  	bool throwItem(int a, int item, int x, int y, int flyingHeight, int direction, int, int charNum, int c);  	void endObjectFlight(FlyingObject *t, int x, int y, int objectOnNextBlock);  	void processObjectFlight(FlyingObject *t, int x, int y); @@ -1000,10 +1026,11 @@ private:  	int _itemInHand;  	uint16 _inventory[48];  	int _inventoryCurItem; -	int _hideControls; +	int _currentControlMode; +	int _specialSceneFlag;  	int _lastCharInventory; -	FlyingObject *_flyingItems; +	FlyingObject *_flyingObjects;  	EMCData _itemScript; @@ -1121,6 +1148,7 @@ private:  	const SpellProperty *_spellProperties;  	int _spellPropertiesSize;  	int _subMenuIndex; +	uint16 _unkIceSHpFlag;  	// unneeded  	void setWalkspeed(uint8) {} diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 429223101e..ae868ea8ea 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -51,7 +51,7 @@ void LoLEngine::loadLevel(int index) {  	_emc->unload(&_scriptData);  	resetItems(1); -	resetLvlBuffer(); +	disableMonsters();  	resetBlockProperties();  	releaseMonsterShapes(0); @@ -63,7 +63,7 @@ void LoLEngine::loadLevel(int index) {  	_currentLevel = index;  	_updateFlags = 0; -	restoreDefaultGui(); +	setDefaultButtonState();  	loadTalkFile(index); @@ -335,9 +335,9 @@ void LoLEngine::loadLevelShpDat(const char *shpFile, const char *datFile, bool f  		for (int ii = 0; ii < 10; ii++)  			l->scaleFlag[ii] = s->readByte();  		for (int ii = 0; ii < 10; ii++) -			l->shapeX[ii] = s->readUint16LE(); +			l->shapeX[ii] = s->readSint16LE();  		for (int ii = 0; ii < 10; ii++) -			l->shapeY[ii] = s->readUint16LE(); +			l->shapeY[ii] = s->readSint16LE();  		l->next = s->readByte();  		l->flags = s->readByte();  	} @@ -402,7 +402,19 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  	memset(_screen->_currentPalette + 384, 0xff, 384);  	memcpy(_screen->_currentPalette + 384, tmpPal, 384);*/ -	//loadSwampIceCol(); +	if (_currentLevel == 11) { +		uint8 *swampPal = _res->fileData("SWAMPICE.COL", 0); +		memcpy(_screen->getPalette(2), swampPal, 384); +		memcpy(_screen->getPalette(2) + 0x180, _screen->_currentPalette, 384); +		delete[] swampPal; + +		if (_unkIceSHpFlag & 4) { +			uint8 *pal0 = _screen->_currentPalette; +			uint8 *pal2 = _screen->getPalette(2); +			for (int i = 1; i < 768; i++) +				SWAP(pal0[i], pal2[i]); +		}		 +	}  	memcpy(_vcnBlocks, v, vcnLen);  	v += vcnLen; @@ -469,14 +481,15 @@ void LoLEngine::resetItems(int flag) {  		ItemInPlay *it = &_itemsInPlay[id];  		it->level = _currentLevel;  		it->blockPropertyIndex = i; -		r->nextAssignedObject = 0; +		if (r) +			r->nextAssignedObject = 0;  	}  	if (flag) -		memset(_flyingItems, 0, 8 * sizeof(FlyingObject)); +		memset(_flyingObjects, 0, 8 * sizeof(FlyingObject));  } -void LoLEngine::resetLvlBuffer() { +void LoLEngine::disableMonsters() {  	memset(_monsters, 0, 30 * sizeof(MonsterInPlay));  	for (int i = 0; i < 30; i++)  		_monsters[i].mode = 0x10; @@ -726,7 +739,7 @@ int LoLEngine::clickedWallShape(uint16 block, uint16 direction) {  	return 1;  } -int LoLEngine::clicked2(uint16 block, uint16 direction) { +int LoLEngine::clickedLever(uint16 block, uint16 direction) {  	return 1;  } @@ -856,6 +869,22 @@ void LoLEngine::openCloseDoor(uint16 block, int openClose) {  	}  } +void LoLEngine::resetDoors() { +	for (int i = 0; i < 3; i++) { +		if (!_openDoorState[i].block) +			continue; + +		uint16 b = _openDoorState[i].block; +		 +		do { +			_levelBlockProperties[b].walls[_openDoorState[i].wall] += _openDoorState[i].state; +			_levelBlockProperties[b].walls[_openDoorState[i].wall ^ 2] += _openDoorState[i].state; +		} while	(!(_wllWallFlags[_levelBlockProperties[b].walls[_openDoorState[i].wall]] & 0x30)); + +		_openDoorState[i].block = 0; +	} +} +  void LoLEngine::movePartySmoothScrollBlocked(int speed) {  	if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _hideInventory))  		return; @@ -1152,8 +1181,8 @@ void LoLEngine::drawScene(int pageNum) {  		updateSceneWindow();  	} -	generateBlockDrawingBuffer(_currentBlock, _currentDirection); -	drawVcnBlocks(_vcnBlocks, _blockDrawingBuffer, _vcnShift, _sceneDrawPage1); +	generateBlockDrawingBuffer(); +	drawVcnBlocks();  	drawSceneShapes();  	if (!pageNum) { @@ -1192,7 +1221,108 @@ void LoLEngine::updateSceneWindow() {  	_screen->showMouse();  } -void LoLEngine::setSequenceGui(int x, int y, int w, int h, int enableFlags) { +void LoLEngine::prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag) { +	resetPortraitsAndDisableSysTimer(); +	if (fieldType) { +		if (suspendGui) +			gui_specialSceneSuspendControls(1); + +		if (!allowSceneUpdate) +			_sceneDefaultUpdate = 0; + +		if (hasDialogue) +			initDialogueSequence(fieldType, 0); + +		if (fadeFlag) { +			_screen->fadePalette(_screen->getPalette(3), 10); +			_screen->_fadeFlag = 0; +		} +		 +		setSpecialSceneButtons(0, 0, 320, 130, controlMode); + +	} else { +		if (suspendGui) +			gui_specialSceneSuspendControls(0); + +		if (!allowSceneUpdate) +			_sceneDefaultUpdate = 0; + +		gui_disableControls(controlMode); + +		if (fadeFlag) { +			memcpy(_screen->getPalette(3) + 384, _screen->_currentPalette + 384, 384); +			_screen->loadSpecialColours(_screen->getPalette(3)); +			_screen->fadePalette(_screen->getPalette(3), 10); +			_screen->_fadeFlag = 0; +		} + +		if (hasDialogue) +			initDialogueSequence(fieldType, 0); + +		setSpecialSceneButtons(112, 0, 176, 120, controlMode); +	} +} + +int LoLEngine::restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode) { +	if (!_hideInventory) +		return 0; + +	_hideInventory = 0; +	enableSysTimer(2); + +	if (_dialogueField) +		restoreAfterDialogueSequence(_currentControlMode); + +	if (_specialSceneFlag) +		gui_specialSceneRestoreControls(_currentControlMode); + +	int l = _currentControlMode; +	_currentControlMode = 0; + +	gui_specialSceneRestoreButtons(); +	calcCharPortraitXpos(); + +	_currentControlMode = l; + +	if (releaseTimScripts) { +		for (int i = 0; i < TIM::kWSASlots; i++) +			_tim->freeAnimStruct(i); +		 +		for (int i = 0; i < 10; i++) +			_tim->unload(_activeTim[i]); +	} + +	gui_enableControls(); + +	if (fadeFlag) { +		if ((_screen->_fadeFlag != 1 && _screen->_fadeFlag != 2) || (_screen->_fadeFlag == 1 && _currentControlMode)) { +			if (_currentControlMode) +				_screen->fadeToBlack(10); +			else +				_screen->fadeClearSceneWindow(10); +		}  +		 +		_currentControlMode = 0; +		calcCharPortraitXpos(); + +		if (redrawPlayField) +			gui_drawPlayField(); + +		setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus); + +	} else { +		_currentControlMode = 0; +		calcCharPortraitXpos(); + +		if (redrawPlayField)			 +			gui_drawPlayField(); +	} + +	_sceneDefaultUpdate = sceneUpdateMode; +	return 1; +} + +void LoLEngine::setSequenceButtons(int x, int y, int w, int h, int enableFlags) {  	gui_enableSequenceButtons(x, y, w, h, enableFlags);  	_seqWindowX1 = x;  	_seqWindowY1 = y; @@ -1204,7 +1334,15 @@ void LoLEngine::setSequenceGui(int x, int y, int w, int h, int enableFlags) {  	_lampStatusSuspended = true;  } -void LoLEngine::restoreDefaultGui() { +void LoLEngine::setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags) { +	gui_enableSequenceButtons(x, y, w, h, enableFlags); +	_spsWindowX = x; +	_spsWindowY = y; +	_spsWindowW = w; +	_spsWindowH = h; +} + +void LoLEngine::setDefaultButtonState() {  	gui_enableDefaultPlayfieldButtons();  	_seqWindowX1 = _seqWindowY1 = _seqWindowX2 = _seqWindowY2 = _seqTrigger = 0;  	if (_lampStatusSuspended) @@ -1212,140 +1350,157 @@ void LoLEngine::restoreDefaultGui() {  	_lampStatusSuspended = false;  } -void LoLEngine::generateBlockDrawingBuffer(int block, int direction) { -	_sceneDrawVar1 = _dscBlockMap[_currentDirection]; -	_sceneDrawVar2 = _dscBlockMap[_currentDirection + 4]; -	_sceneDrawVar3 = _dscBlockMap[_currentDirection + 8]; +void LoLEngine::generateBlockDrawingBuffer() { +	_sceneDrawVarDown = _dscBlockMap[_currentDirection]; +	_sceneDrawVarRight = _dscBlockMap[_currentDirection + 4]; +	_sceneDrawVarLeft = _dscBlockMap[_currentDirection + 8]; + +	/******************************************* +    *             _visibleBlocks map           * +	*                                          * +	*     |     |     |     |     |     |      * +	*  00 |  01 |  02 |  03 |  04 |  05 |  06  * +	* ____|_____|_____|_____|_____|_____|_____ * +	*     |     |     |     |     |     |      * +	*     |  07 |  08 |  09 |  10 |  11 |      * +	*     |_____|_____|_____|_____|_____|      * +	*           |     |     |     |            * +	*           |  12 |  13 |  14 |            * +	*           |_____|_____|_____|            * +	*                 |     |                  * +	*              15 |  16 |  17              * +	*                 | (P) |                  * +	********************************************/  	memset(_blockDrawingBuffer, 0, 660 * sizeof(uint16)); -	_wllProcessFlag = ((block >> 5) + (block & 0x1f) + _currentDirection) & 1; +	_wllProcessFlag = ((_currentBlock >> 5) + (_currentBlock & 0x1f) + _currentDirection) & 1;  	if (_wllProcessFlag) // floor and ceiling -		generateBlockDrawingBufferF1(0, 15, 1, -330, 22, 15); +		generateVmpTileDataFlipped(0, 15, 1, -330, 22, 15);  	else -		generateBlockDrawingBufferF0(0, 15, 1, -330, 22, 15); +		generateVmpTileData(0, 15, 1, -330, 22, 15); -	assignBlockCaps(block, direction); +	assignVisibleBlocks(_currentBlock, _currentDirection); -	uint8 t = _curBlockCaps[0]->walls[_sceneDrawVar2]; +	uint8 t = _visibleBlocks[0]->walls[_sceneDrawVarRight];  	if (t) -		generateBlockDrawingBufferF0(-2, 3, t, 102, 3, 5); +		generateVmpTileData(-2, 3, t, 102, 3, 5); -	t = _curBlockCaps[6]->walls[_sceneDrawVar3]; +	t = _visibleBlocks[6]->walls[_sceneDrawVarLeft];  	if (t) -		generateBlockDrawingBufferF1(21, 3, t, 102, 3, 5); +		generateVmpTileDataFlipped(21, 3, t, 102, 3, 5); -	t = _curBlockCaps[1]->walls[_sceneDrawVar2]; -	uint8 t2 = _curBlockCaps[2]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[1]->walls[_sceneDrawVarRight]; +	uint8 t2 = _visibleBlocks[2]->walls[_sceneDrawVarDown];  	if (hasWall(t) && !(_wllWallFlags[t2] & 8)) -		generateBlockDrawingBufferF0(2, 3, t, 102, 3, 5); +		generateVmpTileData(2, 3, t, 102, 3, 5);  	else if (t && (_wllWallFlags[t2] & 8)) -		generateBlockDrawingBufferF0(2, 3, t2, 102, 3, 5); +		generateVmpTileData(2, 3, t2, 102, 3, 5); -	t = _curBlockCaps[5]->walls[_sceneDrawVar3]; -	t2 = _curBlockCaps[4]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[5]->walls[_sceneDrawVarLeft]; +	t2 = _visibleBlocks[4]->walls[_sceneDrawVarDown];  	if (hasWall(t) && !(_wllWallFlags[t2] & 8)) -		generateBlockDrawingBufferF1(17, 3, t, 102, 3, 5); +		generateVmpTileDataFlipped(17, 3, t, 102, 3, 5);  	else if (t && (_wllWallFlags[t2] & 8)) -		generateBlockDrawingBufferF1(17, 3, t2, 102, 3, 5); +		generateVmpTileDataFlipped(17, 3, t2, 102, 3, 5); -	t = _curBlockCaps[2]->walls[_sceneDrawVar2]; +	t = _visibleBlocks[2]->walls[_sceneDrawVarRight];  	if (t) -		generateBlockDrawingBufferF0(8, 3, t, 97, 1, 5); +		generateVmpTileData(8, 3, t, 97, 1, 5); -	t = _curBlockCaps[4]->walls[_sceneDrawVar3]; +	t = _visibleBlocks[4]->walls[_sceneDrawVarLeft];  	if (t) -		generateBlockDrawingBufferF1(13, 3, t, 97, 1, 5); +		generateVmpTileDataFlipped(13, 3, t, 97, 1, 5); -	t = _curBlockCaps[1]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[1]->walls[_sceneDrawVarDown];  	if (hasWall(t)) -		generateBlockDrawingBufferF0(-4, 3, t, 129, 6, 5); +		generateVmpTileData(-4, 3, t, 129, 6, 5); -	t = _curBlockCaps[5]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[5]->walls[_sceneDrawVarDown];  	if (hasWall(t)) -		generateBlockDrawingBufferF0(20, 3, t, 129, 6, 5); +		generateVmpTileData(20, 3, t, 129, 6, 5); -	t = _curBlockCaps[2]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[2]->walls[_sceneDrawVarDown];  	if (hasWall(t)) -		generateBlockDrawingBufferF0(2, 3, t, 129, 6, 5); +		generateVmpTileData(2, 3, t, 129, 6, 5); -	t = _curBlockCaps[4]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[4]->walls[_sceneDrawVarDown];  	if (hasWall(t)) -		generateBlockDrawingBufferF0(14, 3, t, 129, 6, 5); +		generateVmpTileData(14, 3, t, 129, 6, 5); -	t = _curBlockCaps[3]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[3]->walls[_sceneDrawVarDown];  	if (t) -		generateBlockDrawingBufferF0(8, 3, t, 129, 6, 5); +		generateVmpTileData(8, 3, t, 129, 6, 5); -	t = _curBlockCaps[7]->walls[_sceneDrawVar2]; +	t = _visibleBlocks[7]->walls[_sceneDrawVarRight];  	if (t) -		generateBlockDrawingBufferF0(0, 3, t, 117, 2, 6); +		generateVmpTileData(0, 3, t, 117, 2, 6); -	t = _curBlockCaps[11]->walls[_sceneDrawVar3]; +	t = _visibleBlocks[11]->walls[_sceneDrawVarLeft];  	if (t) -		generateBlockDrawingBufferF1(20, 3, t, 117, 2, 6); +		generateVmpTileDataFlipped(20, 3, t, 117, 2, 6); -	t = _curBlockCaps[8]->walls[_sceneDrawVar2]; +	t = _visibleBlocks[8]->walls[_sceneDrawVarRight];  	if (t) -		generateBlockDrawingBufferF0(6, 2, t, 81, 2, 8); +		generateVmpTileData(6, 2, t, 81, 2, 8); -	t = _curBlockCaps[10]->walls[_sceneDrawVar3]; +	t = _visibleBlocks[10]->walls[_sceneDrawVarLeft];  	if (t) -		generateBlockDrawingBufferF1(14, 2, t, 81, 2, 8); +		generateVmpTileDataFlipped(14, 2, t, 81, 2, 8); -	t = _curBlockCaps[8]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[8]->walls[_sceneDrawVarDown];  	if (hasWall(t)) -		generateBlockDrawingBufferF0(-4, 2, t, 159, 10, 8); +		generateVmpTileData(-4, 2, t, 159, 10, 8); -	t = _curBlockCaps[10]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[10]->walls[_sceneDrawVarDown];  	if (hasWall(t)) -		generateBlockDrawingBufferF0(16, 2, t, 159, 10, 8); +		generateVmpTileData(16, 2, t, 159, 10, 8); -	t = _curBlockCaps[9]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[9]->walls[_sceneDrawVarDown];  	if (t) -		generateBlockDrawingBufferF0(6, 2, t, 159, 10, 8); +		generateVmpTileData(6, 2, t, 159, 10, 8); -	t = _curBlockCaps[12]->walls[_sceneDrawVar2]; +	t = _visibleBlocks[12]->walls[_sceneDrawVarRight];  	if (t) -		generateBlockDrawingBufferF0(3, 1, t, 45, 3, 12); +		generateVmpTileData(3, 1, t, 45, 3, 12); -	t = _curBlockCaps[14]->walls[_sceneDrawVar3]; +	t = _visibleBlocks[14]->walls[_sceneDrawVarLeft];  	if (t) -		generateBlockDrawingBufferF1(16, 1, t, 45, 3, 12); +		generateVmpTileDataFlipped(16, 1, t, 45, 3, 12); -	t = _curBlockCaps[12]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[12]->walls[_sceneDrawVarDown];  	if (!(_wllWallFlags[t] & 8)) -		generateBlockDrawingBufferF0(-13, 1, t, 239, 16, 12); +		generateVmpTileData(-13, 1, t, 239, 16, 12); -	t = _curBlockCaps[14]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[14]->walls[_sceneDrawVarDown];  	if (!(_wllWallFlags[t] & 8)) -		generateBlockDrawingBufferF0(19, 1, t, 239, 16, 12); +		generateVmpTileData(19, 1, t, 239, 16, 12); -	t = _curBlockCaps[13]->walls[_sceneDrawVar1]; +	t = _visibleBlocks[13]->walls[_sceneDrawVarDown];  	if (t) -		generateBlockDrawingBufferF0(3, 1, t, 239, 16, 12); +		generateVmpTileData(3, 1, t, 239, 16, 12); -	t = _curBlockCaps[15]->walls[_sceneDrawVar2]; -	t2 = _curBlockCaps[17]->walls[_sceneDrawVar3]; -	if (t)	// wall to the immediate left -		generateBlockDrawingBufferF0(0, 0, t, 0, 3, 15); -	if (t2) // wall to the immediate right -		generateBlockDrawingBufferF1(19, 0, t2, 0, 3, 15); +	t = _visibleBlocks[15]->walls[_sceneDrawVarRight]; +	t2 = _visibleBlocks[17]->walls[_sceneDrawVarLeft]; +	if (t) +		generateVmpTileData(0, 0, t, 0, 3, 15); +	if (t2) +		generateVmpTileDataFlipped(19, 0, t2, 0, 3, 15);  } -void LoLEngine::generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) { -	if (!_wllVmpMap[wllVmpIndex]) +void LoLEngine::generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 vmpMapIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY) { +	if (!_wllVmpMap[vmpMapIndex])  		return; -	uint16 *vmp = &_vmpPtr[(_wllVmpMap[wllVmpIndex] - 1) * 431 + vmpOffset + 330]; +	uint16 *vmp = &_vmpPtr[(_wllVmpMap[vmpMapIndex] - 1) * 431 + vmpOffset + 330]; -	for (int i = 0; i < numEntries; i++) { -		uint16 *bl = &_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset]; -		for (int ii = 0; ii < len; ii++) { -			if ((wllOffset + ii >= 0) && (wllOffset + ii < 22) && *vmp) +	for (int i = 0; i < numBlocksY; i++) { +		uint16 *bl = &_blockDrawingBuffer[(startBlockY + i) * 22 + startBlockX]; +		for (int ii = 0; ii < numBlocksX; ii++) { +			if ((startBlockX + ii >= 0) && (startBlockX + ii < 22) && *vmp)  				*bl = *vmp;  			bl++;  			vmp++; @@ -1353,18 +1508,18 @@ void LoLEngine::generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, ui  	}  } -void LoLEngine::generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) { -	if (!_wllVmpMap[wllVmpIndex]) +void LoLEngine::generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 vmpMapIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY) { +	if (!_wllVmpMap[vmpMapIndex])  		return; -	uint16 *vmp = &_vmpPtr[(_wllVmpMap[wllVmpIndex] - 1) * 431 + vmpOffset + 330]; +	uint16 *vmp = &_vmpPtr[(_wllVmpMap[vmpMapIndex] - 1) * 431 + vmpOffset + 330]; -	for (int i = 0; i < numEntries; i++) { -		for (int ii = 0; ii < len; ii++) { -			if ((wllOffset + ii) < 0 || (wllOffset + ii) > 21) +	for (int i = 0; i < numBlocksY; i++) { +		for (int ii = 0; ii < numBlocksX; ii++) { +			if ((startBlockX + ii) < 0 || (startBlockX + ii) > 21)  				continue; -			uint16 v = vmp[i * len + (len - 1 - ii)]; +			uint16 v = vmp[i * numBlocksX + (numBlocksX - 1 - ii)];  			if (!v)  				continue; @@ -1373,7 +1528,7 @@ void LoLEngine::generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, ui  			else  				v |= 0x4000; -			_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset + ii] = v; +			_blockDrawingBuffer[(startBlockY + i) * 22 + startBlockX + ii] = v;  		}  	}  } @@ -1384,48 +1539,51 @@ bool LoLEngine::hasWall(int index) {  	return true;  } -void LoLEngine::assignBlockCaps(int block, int direction) { +void LoLEngine::assignVisibleBlocks(int block, int direction) {  	for (int i = 0; i < 18; i++) {  		uint16 t = (block + _dscBlockIndex[direction * 18 + i]) & 0x3ff; -		_currentBlockPropertyIndex[i] = t; +		_visibleBlockIndex[i] = t; -		_curBlockCaps[i] = &_levelBlockProperties[t]; +		_visibleBlocks[i] = &_levelBlockProperties[t];  		_lvlShapeLeftRight[i] = _lvlShapeLeftRight[18 + i] = -1;  	}  } -void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint8 *vcnShift, int pageNum) { +void LoLEngine::drawVcnBlocks() {  	uint8 *d = _sceneWindowBuffer; +	uint16 *bdb = _blockDrawingBuffer;  	for (int y = 0; y < 15; y++) {  		for (int x = 0; x < 22; x++) { -			bool flag = false; +			bool horizontalFlip = false;  			int remainder = 0; -			uint16 vcnOffset = *blockDrawingBuffer++; +			uint16 vcnOffset = *bdb++;  			if (vcnOffset & 0x8000) { +				// this renders a wall block over the transparent pixels of a floor/ceiling block   				remainder = vcnOffset - 0x8000;  				vcnOffset = 0;  			}  			if (vcnOffset & 0x4000) { -				flag = true; +				horizontalFlip = true;  				vcnOffset &= 0x3fff;  			}  			if (!vcnOffset) { -				vcnOffset = blockDrawingBuffer[329]; +				// floor/ceiling blocks +				vcnOffset = bdb[329];  				if (vcnOffset & 0x4000) { -					flag = true; +					horizontalFlip = true;  					vcnOffset &= 0x3fff;  				}  			} -			uint8 shift = vcnShift[vcnOffset]; -			uint8 *src = &vcnBlocks[vcnOffset << 5]; +			uint8 shift = _vcnShift[vcnOffset]; +			uint8 *src = &_vcnBlocks[vcnOffset << 5]; -			if (flag) { +			if (horizontalFlip) {  				for (int blockY = 0; blockY < 8; blockY++) {  					src += 3;  					for (int blockX = 0; blockX < 4; blockX++) { @@ -1450,17 +1608,17 @@ void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint  			if (remainder) {  				d -= 8; -				flag = false; +				horizontalFlip = false;  				if (remainder & 0x4000) {  					remainder &= 0x3fff; -					flag = true; +					horizontalFlip = true;  				} -				shift = vcnShift[remainder]; -				src = &vcnBlocks[remainder << 5]; +				shift = _vcnShift[remainder]; +				src = &_vcnBlocks[remainder << 5]; -				if (flag) { +				if (horizontalFlip) {  					for (int blockY = 0; blockY < 8; blockY++) {  						src += 3;  						for (int blockX = 0; blockX < 4; blockX++) { @@ -1499,13 +1657,13 @@ void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint  		d += 1232;  	} -	_screen->copyBlockToPage(pageNum, 112, 0, 176, 120, _sceneWindowBuffer); +	_screen->copyBlockToPage(_sceneDrawPage1, 112, 0, 176, 120, _sceneWindowBuffer);  }  void LoLEngine::drawSceneShapes() {  	for (int i = 0; i < 18; i++) {  		uint8 t = _dscTileIndex[i]; -		uint8 s = _curBlockCaps[t]->walls[_sceneDrawVar1]; +		uint8 s = _visibleBlocks[t]->walls[_sceneDrawVarDown];  		int16 x1 = 0;  		int16 x2 = 0; @@ -1527,7 +1685,7 @@ void LoLEngine::drawSceneShapes() {  		drawBlockEffects(t, 0); -		if (_curBlockCaps[t]->assignedObjects && (w & 0x80)) +		if (_visibleBlocks[t]->assignedObjects && (w & 0x80))  			drawBlockObjects(t);  		drawBlockEffects(t, 1); @@ -1554,7 +1712,7 @@ void LoLEngine::setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim) {  		int m = index * 18;  		for (int i = 0; i < 18; i++) { -			uint8 d = _curBlockCaps[i]->walls[_sceneDrawVar1]; +			uint8 d = _visibleBlocks[i]->walls[_sceneDrawVarDown];  			uint8 a = _wllWallFlags[d];  			if (a & 8) { @@ -1650,7 +1808,7 @@ void LoLEngine::drawDecorations(int index) {  			continue;  		uint8 d = (_currentDirection + _dscUnk1[s]) & 3; -		int8 l = _wllShapeMap[_curBlockCaps[index]->walls[d]]; +		int8 l = _wllShapeMap[_visibleBlocks[index]->walls[d]];  		uint8 *shapeData = 0; @@ -1716,7 +1874,7 @@ void LoLEngine::drawDecorations(int index) {  void LoLEngine::drawBlockEffects(int index, int type) {  	static const int16 yOffs[] = { 0xff, 0xff, 0x80, 0x80 }; -	uint8 flg = _curBlockCaps[index]->flags; +	uint8 flg = _visibleBlocks[index]->flags;  	// flags: 0x10 = ice wall, 0x20 = teleporter, 0x40 = blue slime spot, 0x80 = blood spot  	if (!(flg & 0xf0))  		return; @@ -1734,8 +1892,8 @@ void LoLEngine::drawBlockEffects(int index, int type) {  		calcCoordinatesAddDirectionOffset(x, y, _currentDirection); -		x |= ((_currentBlockPropertyIndex[index] & 0x1f) << 8); -		y |= ((_currentBlockPropertyIndex[index] & 0xffe0) << 3); +		x |= ((_visibleBlockIndex[index] & 0x1f) << 8); +		y |= ((_visibleBlockIndex[index] & 0xffe0) << 3);  		drawItemOrMonster(_effectShapes[type], ovl, x, y, 0, (type == 1) ? -20 : 0, drawFlag, -1, false);  	} diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index dce08e6462..c706ce4741 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -98,7 +98,7 @@ bool LoLEngine::checkSceneUpdateNeed(int func) {  		return true;  	for (int i = 0; i < 15; i++) { -		if (_currentBlockPropertyIndex[i] == func) { +		if (_visibleBlockIndex[i] == func) {  			_sceneUpdateRequired = true;  			return true;  		} @@ -212,6 +212,15 @@ int LoLEngine::olol_makeItem(EMCState *script) {  	return makeItem(stackPos(0), stackPos(1), stackPos(2));  } +int LoLEngine::olol_createLevelItem(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setItemProperty(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7)); +	int item = makeItem(stackPos(0), stackPos(1), stackPos(2)); +	if (item == -1) +		return item; +	placeMoveLevelItem(item, stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7)); +	return item; +} +  int LoLEngine::olol_getItemPara(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getItemPara(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));  	if (!stackPos(0)) @@ -458,6 +467,18 @@ int LoLEngine::olol_setMusicTrack(EMCState *script) {  	return 1;  } +int LoLEngine::olol_setSequenceButtons(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setSequenceButtons(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); +	setSequenceButtons(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); +	return 1; +} + +int LoLEngine::olol_setDefaultButtonState(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDefaultButtonState(%p)", (const void *)script); +	setDefaultButtonState(); +	return 1; +} +  int LoLEngine::olol_checkRectForMousePointer(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_checkRectForMousePointer(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));  	return posWithinRect(_mouseX, _mouseY, stackPos(0), stackPos(1), stackPos(2), stackPos(3)) ? 1 : 0; @@ -465,7 +486,7 @@ int LoLEngine::olol_checkRectForMousePointer(EMCState *script) {  int LoLEngine::olol_clearDialogueField(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_clearDialogueField(%p) (%d)", (const void *)script, stackPos(0)); -	if (_hideControls && (!textEnabled())) +	if (_currentControlMode && (!textEnabled()))  		return 1;  	_screen->setScreenDim(5); @@ -489,6 +510,12 @@ int LoLEngine::olol_startBackgroundAnimation(EMCState *script) {  	return 1;  } +int LoLEngine::olol_fadeToBlack(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_fadeToBlack(%p) (%d)", (const void *)script, stackPos(0)); +	_screen->fadeToBlack(10); +	return 1; +} +  int LoLEngine::olol_fadePalette(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_fadePalette(%p)", (const void *)script);  	_screen->fadePalette(_screen->getPalette(3), 10); @@ -602,7 +629,7 @@ int LoLEngine::olol_setGlobalVar(EMCState *script) {  	case 8:  		_updateFlags = b;  		if (b == 1) { -			if (!textEnabled() || (!(_hideControls & 2))) +			if (!textEnabled() || (!(_currentControlMode & 2)))  				timerUpdatePortraitAnimations(1);  			disableSysTimer(2);  		} else { @@ -735,6 +762,45 @@ int LoLEngine::olol_fadeSequencePalette(EMCState *script) {  	return 1;  } +int LoLEngine::olol_redrawPlayfield(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_redrawPlayfield(%p)", (const void *)script); +	if (_screen->_fadeFlag != 2) +		_screen->fadeClearSceneWindow(10); +	gui_drawPlayField(); +	setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus); +	_screen->_fadeFlag = 0; +	return 1; +} + +int LoLEngine::olol_loadNewLevel(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_loadNewLevel(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); +	_screen->fadeClearSceneWindow(10); +	_screen->fillRect(112, 0, 288, 120, 0); +	disableSysTimer(2); +	 +	for (int i = 0; i < 8; i++) { +		if (!_flyingObjects[i].enable || _flyingObjects[i].a) +			continue; +		endObjectFlight(&_flyingObjects[i], _flyingObjects[i].x, _flyingObjects[i].y, 1); +	} + +	resetDoors(); + +	/////////////////////// +	// TODO: generate temp files + +	_currentBlock = stackPos(1); +	_currentDirection = stackPos(2); +	calcCoordinates(_partyPosX, _partyPosY, _currentBlock, 0x80, 0x80); + +	loadLevel(stackPos(0)); + +	enableSysTimer(2); + +	script->ip = 0; +	return 1; +} +  int LoLEngine::olol_dummy0(EMCState *script) {  	return 0;  } @@ -865,6 +931,41 @@ int LoLEngine::olol_createHandItem(EMCState *script) {  	return 1;  } +int LoLEngine::olol_characterJoinsParty(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterJoinsParty(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); + +	int16 id = stackPos(0); +	if (id < 0) +		id = -id; + +	for (int i = 0; i < 4; i++) { +		if (!(_characters[i].flags & 1) || _characters[i].id != id) +			continue; + +		_characters[i].flags &= 0xfffe; +		calcCharPortraitXpos(); +		 +		if (!_updateFlags) { +			gui_enableDefaultPlayfieldButtons(); +			gui_drawPlayField(); +		} + +		if (_selectedCharacter == i) +			_selectedCharacter = 0; + +		return 1; +	} + +	addCharacter(id); + +	if (!_updateFlags) { +		gui_enableDefaultPlayfieldButtons(); +		gui_drawPlayField(); +	} + +	return 1; +} +  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)]) @@ -886,15 +987,15 @@ int LoLEngine::olol_releaseTimScript(EMCState *script) {  	return 1;  } -int LoLEngine::olol_initAnimatedDialogue(EMCState *script) { -	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0)); -	initAnimatedDialogue(stackPos(0)); +int LoLEngine::olol_initSceneWindowDialogue(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initSceneWindowDialogue(%p) (%d)", (const void *)script, stackPos(0)); +	initSceneWindowDialogue(stackPos(0));  	return 1;  } -int LoLEngine::olol_restoreAfterAnimatedDialogue(EMCState *script) { -	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0)); -	restoreAfterAnimatedDialogue(stackPos(0)); +int LoLEngine::olol_restoreAfterSceneWindowDialogue(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterSceneWindowDialogue(%p) (%d)", (const void *)script, stackPos(0)); +	restoreAfterSceneWindowDialogue(stackPos(0));  	return 1;  } @@ -943,6 +1044,48 @@ int LoLEngine::olol_getWallFlags(EMCState *script) {  	return _wllWallFlags[_levelBlockProperties[stackPos(0)].walls[stackPos(1) & 3]];  } +int LoLEngine::olol_changeMonsterSettings(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_changeMonsterSettings(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); +	if (stackPos(0) == -1) +		return 1; + +	MonsterInPlay *m = &_monsters[stackPos(0) & 0x7fff]; + +	int16 d = stackPos(2); +	uint16 x = 0; +	uint16 y = 0; + +	switch (stackPos(1)) { +		case 0: +			setMonsterMode(m, d); +			break; + +		case 1: +			m->might = d; +			break; + +		case 2: +			calcCoordinates(x, y, d, m->x & 0xff, m->y & 0xff); +			if (!walkMonsterCheckDest(x, y, m, 7)) +				placeMonster(m, x, y); +			break; + +		case 3: +			setMonsterDirection(m, d << 1); +			break; + +		case 6: +			m->flags |= d; +			break; + +		default: +			break; +	} + +	return 1; +} + +  int LoLEngine::olol_playCharacterScriptChat(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_playCharacterScriptChat(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));  	snd_stopSpeech(1); @@ -1047,6 +1190,19 @@ int LoLEngine::olol_setNextFunc(EMCState *script) {  	return 1;  } +int LoLEngine::olol_dummy1(EMCState *script) { +	return 1; +} + +int LoLEngine::olol_suspendMonster(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_suspendMonster(%p) (%d)", (const void *)script, stackPos(0)); +	MonsterInPlay *m = &_monsters[stackPos(0) & 0x7fff]; +	setMonsterMode(m, 14); +	checkSceneUpdateNeed(m->blockPropertyIndex); +	placeMonster(m, 0, 0); +	return 1; +} +  int LoLEngine::olol_setDoorState(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDoorState(%p) (%d)", (const void *)script, stackPos(0));  	_emcDoorState = stackPos(0); @@ -1071,18 +1227,35 @@ int LoLEngine::olol_restorePage5(EMCState *script) {  	return 1;  } -int LoLEngine::olol_initNonAnimatedDialogue(EMCState *script) { -	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initNonAnimatedDialogue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); -	initNonAnimatedDialogue(stackPos(0), stackPos(1)); +int LoLEngine::olol_initDialogueSequence(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initDialogueSequence(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); +	initDialogueSequence(stackPos(0), stackPos(1)); +	return 1; +} + +int LoLEngine::olol_restoreAfterDialogueSequence(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterDialogueSequence(%p) (%d)", (const void *)script, stackPos(0)); +	restoreAfterDialogueSequence(stackPos(0)); +	return 1; +} + +int LoLEngine::olol_setSpecialSceneButtons(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setSpecialSceneButtons(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); +	setSpecialSceneButtons(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));  	return 1;  } -int LoLEngine::olol_restoreAfterNonAnimatedDialogue(EMCState *script) { -	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterNonAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0)); -	restoreAfterNonAnimatedDialogue(stackPos(0)); +int LoLEngine::olol_prepareSpecialScene(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_prepareSpecialScene(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); +	prepareSpecialScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));  	return 1;  } +int LoLEngine::olol_restoreAfterSpecialScene(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterSpecialScene(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3)); +	return restoreAfterSpecialScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3)); +} +  int LoLEngine::olol_assignCustomSfx(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_assignCustomSfx(%p) (%s, %d)", (const void *)script, stackPosString(0), stackPos(1));  	const char *c = stackPosString(0); @@ -1100,17 +1273,29 @@ int LoLEngine::olol_assignCustomSfx(EMCState *script) {  	return 0;  } -int LoLEngine::olol_resetPortraitsArea(EMCState *script) { -	resetPortraitsArea(); +int LoLEngine::olol_resetPortraitsAndDisableSysTimer(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_resetPortraitsAndDisableSysTimer(%p)", (const void *)script); +	resetPortraitsAndDisableSysTimer();  	return 1;  }  int LoLEngine::olol_enableSysTimer(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableSysTimer(%p)", (const void *)script);  	_hideInventory = 0;  	enableSysTimer(2);  	return 1;  } +int LoLEngine::olol_disableControls(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_disableControls(%p) (%d)", (const void *)script, stackPos(0)); +	return gui_disableControls(stackPos(0)); +} + +int LoLEngine::olol_enableControls(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableControls(%p)", (const void *)script); +	return gui_enableControls(); +} +  int LoLEngine::olol_queueSpeech(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_queueSpeech(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));  	if (stackPos(0) && stackPos(1)) { @@ -1140,6 +1325,11 @@ int LoLEngine::olol_getItemPrice(EMCState *script) {  	return 0;  } +int LoLEngine::olol_getLanguage(EMCState *script) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getLanguage(%p)", (const void *)script); +	return _lang; +} +  #pragma mark -  int LoLEngine::tlol_setupPaletteFade(const TIM *tim, const uint16 *param) { @@ -1199,15 +1389,15 @@ int LoLEngine::tlol_displayText(const TIM *tim, const uint16 *param) {  	return 1;  } -int LoLEngine::tlol_initAnimatedDialogue(const TIM *tim, const uint16 *param) { -	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_initAnimatedDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); -	initAnimatedDialogue(param[0]); +int LoLEngine::tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_initSceneWindowDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); +	initSceneWindowDialogue(param[0]);  	return 1;  } -int LoLEngine::tlol_restoreAfterAnimatedDialogue(const TIM *tim, const uint16 *param) { -	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_restoreAfterAnimatedDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); -	restoreAfterAnimatedDialogue(param[0]); +int LoLEngine::tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param) { +	debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_restoreAfterSceneWindowDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); +	restoreAfterSceneWindowDialogue(param[0]);  	return 1;  } @@ -1388,7 +1578,7 @@ void LoLEngine::setupOpcodeTable() {  	// 0x10  	OpcodeUnImpl(); -	OpcodeUnImpl(); +	Opcode(olol_createLevelItem);  	Opcode(olol_getItemPara);  	Opcode(olol_getCharacterStat); @@ -1408,19 +1598,19 @@ void LoLEngine::setupOpcodeTable() {  	Opcode(olol_getDirection);  	OpcodeUnImpl();  	Opcode(olol_setMusicTrack); -	OpcodeUnImpl(); +	Opcode(olol_setSequenceButtons);  	// 0x20 -	OpcodeUnImpl(); +	Opcode(olol_setDefaultButtonState);  	Opcode(olol_checkRectForMousePointer);  	Opcode(olol_clearDialogueField);  	Opcode(olol_setupBackgroundAnimationPart);  	// 0x24  	Opcode(olol_startBackgroundAnimation); -	OpcodeUnImpl(); -	OpcodeUnImpl(); -	OpcodeUnImpl(); +	Opcode(o1_hideMouse); +	Opcode(o1_showMouse); +	Opcode(olol_fadeToBlack);  	// 0x28  	Opcode(olol_fadePalette); @@ -1450,10 +1640,10 @@ void LoLEngine::setupOpcodeTable() {  	Opcode(olol_initMonster);  	Opcode(olol_fadeClearSceneWindow);  	Opcode(olol_fadeSequencePalette); -	OpcodeUnImpl(); +	Opcode(olol_redrawPlayfield);  	// 0x3C -	OpcodeUnImpl(); +	Opcode(olol_loadNewLevel);  	OpcodeUnImpl();  	Opcode(olol_dummy0);  	Opcode(olol_loadMonsterProperties); @@ -1474,7 +1664,7 @@ void LoLEngine::setupOpcodeTable() {  	Opcode(olol_setScriptTimer);  	Opcode(olol_createHandItem);  	OpcodeUnImpl(); -	OpcodeUnImpl(); +	Opcode(olol_characterJoinsParty);  	// 0x4C  	OpcodeUnImpl(); @@ -1484,8 +1674,8 @@ void LoLEngine::setupOpcodeTable() {  	// 0x50  	Opcode(olol_releaseTimScript); -	Opcode(olol_initAnimatedDialogue); -	Opcode(olol_restoreAfterAnimatedDialogue); +	Opcode(olol_initSceneWindowDialogue); +	Opcode(olol_restoreAfterSceneWindowDialogue);  	Opcode(olol_getItemInHand);  	// 0x54 @@ -1498,7 +1688,7 @@ void LoLEngine::setupOpcodeTable() {  	Opcode(olol_processDialogue);  	Opcode(olol_stopTimScript);  	Opcode(olol_getWallFlags); -	OpcodeUnImpl(); +	Opcode(olol_changeMonsterSettings);  	// 0x5C  	OpcodeUnImpl(); @@ -1550,9 +1740,9 @@ void LoLEngine::setupOpcodeTable() {  	// 0x7C  	Opcode(olol_setNextFunc); +	Opcode(olol_dummy1);  	OpcodeUnImpl(); -	OpcodeUnImpl(); -	OpcodeUnImpl(); +	Opcode(olol_suspendMonster);  	// 0x80  	OpcodeUnImpl(); @@ -1573,16 +1763,16 @@ void LoLEngine::setupOpcodeTable() {  	Opcode(olol_restorePage5);  	// 0x8C -	Opcode(olol_initNonAnimatedDialogue); -	Opcode(olol_restoreAfterNonAnimatedDialogue); -	OpcodeUnImpl(); +	Opcode(olol_initDialogueSequence); +	Opcode(olol_restoreAfterDialogueSequence); +	Opcode(olol_setSpecialSceneButtons);  	OpcodeUnImpl();  	// 0x90  	OpcodeUnImpl();  	OpcodeUnImpl(); -	OpcodeUnImpl(); -	OpcodeUnImpl(); +	Opcode(olol_prepareSpecialScene); +	Opcode(olol_restoreAfterSpecialScene);  	// 0x94  	Opcode(olol_assignCustomSfx); @@ -1593,7 +1783,7 @@ void LoLEngine::setupOpcodeTable() {  	// 0x98  	OpcodeUnImpl();  	OpcodeUnImpl(); -	Opcode(olol_resetPortraitsArea); +	Opcode(olol_resetPortraitsAndDisableSysTimer);  	Opcode(olol_enableSysTimer);  	// 0x9C @@ -1629,11 +1819,11 @@ void LoLEngine::setupOpcodeTable() {  	// 0xB0  	OpcodeUnImpl();  	OpcodeUnImpl(); -	OpcodeUnImpl(); -	OpcodeUnImpl(); +	Opcode(olol_dummy1); // anim buffer select? +	Opcode(olol_disableControls);  	// 0xB4 -	OpcodeUnImpl(); +	Opcode(olol_enableControls);  	OpcodeUnImpl();  	OpcodeUnImpl();  	OpcodeUnImpl(); @@ -1647,7 +1837,7 @@ void LoLEngine::setupOpcodeTable() {  	// 0xBC  	Opcode(olol_queueSpeech);  	Opcode(olol_getItemPrice); -	OpcodeUnImpl(); +	Opcode(olol_getLanguage);  	OpcodeUnImpl();  	Common::Array<const TIMOpcode*> *timTable = 0; @@ -1668,8 +1858,8 @@ void LoLEngine::setupOpcodeTable() {  	SetTimOpcodeTable(_timIngameOpcodes);  	// 0x00 -	OpcodeTim(tlol_initAnimatedDialogue); -	OpcodeTim(tlol_restoreAfterAnimatedDialogue); +	OpcodeTim(tlol_initSceneWindowDialogue); +	OpcodeTim(tlol_restoreAfterSceneWindowDialogue);  	OpcodeTimUnImpl();  	OpcodeTim(tlol_giveItem); diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp index 8333d4c612..2a6811f8b1 100644 --- a/engines/kyra/script_tim.cpp +++ b/engines/kyra/script_tim.cpp @@ -936,10 +936,12 @@ void TIMInterpreter_LoL::startBackgroundAnimation(int animIndex, int part) {  	anim->curFrame = p->firstFrame;  	anim->cyclesCompleted = 0; -	anim->wsa->setX(anim->x); -	anim->wsa->setY(anim->y); -	anim->wsa->setDrawPage(0); -	anim->wsa->displayFrame(anim->curFrame - 1, 0, 0); +	if (anim->wsa) { +		anim->wsa->setX(anim->x); +		anim->wsa->setY(anim->y); +		anim->wsa->setDrawPage(0); +		anim->wsa->displayFrame(anim->curFrame - 1, 0, 0); +	}  }  void TIMInterpreter_LoL::stopBackgroundAnimation(int animIndex) { @@ -1128,7 +1130,7 @@ uint16 TIMInterpreter_LoL::processDialogue() {  	_vm->updatePortraits(); -	if (!_vm->textEnabled() && _vm->_hideControls) { +	if (!_vm->textEnabled() && _vm->_currentControlMode) {  		_screen->setScreenDim(5);  		const ScreenDim *d = _screen->getScreenDim(5);  		_screen->fillRect(d->sx, d->sy + d->h - 9, d->sx + d->w - 1, d->sy + d->h - 1, d->unkA); diff --git a/engines/kyra/sprites_lol.cpp b/engines/kyra/sprites_lol.cpp index c7cbe98bfb..c5f269a5ee 100644 --- a/engines/kyra/sprites_lol.cpp +++ b/engines/kyra/sprites_lol.cpp @@ -228,7 +228,7 @@ bool LoLEngine::updateMonsterAdjustBlocks(MonsterInPlay *monster) {  		return false;  	for (int i = 0; i < 18; i++) -		_curBlockCaps[i] = &_levelBlockProperties[(monster->blockPropertyIndex + _dscBlockIndex[dir + i]) & 0x3ff]; +		_visibleBlocks[i] = &_levelBlockProperties[(monster->blockPropertyIndex + _dscBlockIndex[dir + i]) & 0x3ff];  	int16 fx1 = 0;  	int16 fx2 = 0; @@ -523,7 +523,7 @@ bool LoLEngine::checkBlockOccupiedByParty(int x, int y, int testFlag) {  }  void LoLEngine::drawBlockObjects(int blockArrayIndex) { -	LevelBlockProperty *l = _curBlockCaps[blockArrayIndex]; +	LevelBlockProperty *l = _visibleBlocks[blockArrayIndex];  	uint16 s = l->assignedObjects;  	ItemInPlay *i = findObject(s); @@ -565,10 +565,10 @@ void LoLEngine::drawBlockObjects(int blockArrayIndex) {  				int shpIndex = _itemProperties[i->itemPropertyIndex].flags & 0x800 ? 7 : _itemProperties[i->itemPropertyIndex].shpIndex;  				int ii = 0;  				for (; ii < 8; ii++) { -					if (!_flyingItems[ii].enable) +					if (!_flyingObjects[ii].enable)  						continue; -					if (_flyingItems[ii].item == s) +					if (_flyingObjects[ii].item == s)  						break;  				} @@ -578,7 +578,7 @@ void LoLEngine::drawBlockObjects(int blockArrayIndex) {  				flg |= _flyingItemShapes[shpIndex].drawFlags;  				if (ii != 8) { -					switch (_currentDirection - (_flyingItems[ii].direction >> 1) + 3) { +					switch (_currentDirection - (_flyingObjects[ii].direction >> 1) + 3) {  						case 1:  						case 5:  							shpIndex = _flyingItemShapes[shpIndex].shapeFront; @@ -764,7 +764,7 @@ void LoLEngine::reassignDrawObjects(uint16 direction, uint16 itemIndex, LevelBlo  }  void LoLEngine::redrawSceneItem() { -	assignBlockCaps(_currentBlock, _currentDirection); +	assignVisibleBlocks(_currentBlock, _currentDirection);  	_screen->fillRect(112, 0, 287, 119, 0);  	static const uint8 sceneClickTileIndex[] = { 13, 16}; @@ -775,7 +775,7 @@ void LoLEngine::redrawSceneItem() {  	for (int i = 0; i < 2; i++) {  		uint8 tile = sceneClickTileIndex[i];  		setLevelShapesDim(tile, x1, x2, 13); -		uint16 s = _curBlockCaps[tile]->drawObjects; +		uint16 s = _visibleBlocks[tile]->drawObjects;  		int t = (i << 7) + 1;		  		while (s) { diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 5d2fda8c53..40920eb007 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -986,7 +986,7 @@ bool StaticResource::loadCharData(const char *filename, void *&ptr, int &size) {  		t->raceClassSex = file->readByte();  		t->id = file->readSint16LE();  		t->curFaceFrame = file->readByte(); -		t->nextFaceFrame = file->readByte(); +		t->defaultFaceFrame = file->readByte();  		t->field_12 = file->readByte();  		file->readUint32LE();  		for (int ii = 0; ii < 8; ii++) diff --git a/engines/kyra/text_lol.cpp b/engines/kyra/text_lol.cpp index 656f4b44c3..f7087cd846 100644 --- a/engines/kyra/text_lol.cpp +++ b/engines/kyra/text_lol.cpp @@ -607,7 +607,7 @@ void TextDisplayer_LoL::textPageBreak() {  	int y = 0;  	if (_vm->_hideInventory && (_vm->_updateFlags & 2)) { -		if (_vm->_hideControls || !(_vm->_updateFlags & 2)) { +		if (_vm->_currentControlMode || !(_vm->_updateFlags & 2)) {  			y = dim->sy + dim->h - 5;  		} else {  			x += 6; diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp index 96344b0472..c6ed885a29 100644 --- a/engines/kyra/timer_lol.cpp +++ b/engines/kyra/timer_lol.cpp @@ -117,9 +117,9 @@ void LoLEngine::timerSub3(int timerNum) {  void LoLEngine::timerProcessFlyingObjects(int timerNum) {  	for (int i = 0; i < 8; i++) { -		if (!_flyingItems[i].enable) +		if (!_flyingObjects[i].enable)  			continue; -		updateFlyingObjects(&_flyingItems[i]); +		updateFlyingObjects(&_flyingObjects[i]);  	}  } | 
