2008-07-31 10:47:15 +00:00
|
|
|
/* 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$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2009-03-04 11:53:25 +00:00
|
|
|
#ifdef ENABLE_LOL
|
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
#include "kyra/lol.h"
|
|
|
|
#include "kyra/screen_lol.h"
|
|
|
|
#include "kyra/resource.h"
|
|
|
|
#include "kyra/sound.h"
|
2009-02-21 23:20:14 +00:00
|
|
|
#include "kyra/timer.h"
|
2008-12-26 11:04:45 +00:00
|
|
|
#include "kyra/util.h"
|
2008-07-31 10:47:15 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
#include "sound/voc.h"
|
|
|
|
#include "sound/audiostream.h"
|
|
|
|
|
2009-03-03 22:32:39 +00:00
|
|
|
#include "common/config-manager.h"
|
2008-07-31 10:47:15 +00:00
|
|
|
#include "common/endian.h"
|
2008-12-29 14:37:51 +00:00
|
|
|
#include "base/version.h"
|
2008-07-31 10:47:15 +00:00
|
|
|
|
|
|
|
namespace Kyra {
|
|
|
|
|
|
|
|
LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(system, flags) {
|
|
|
|
_screen = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_gui = 0;
|
2009-02-14 00:51:07 +00:00
|
|
|
_txt = 0;
|
2009-02-02 23:20:55 +00:00
|
|
|
_tim = 0;
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
switch (_flags.lang) {
|
|
|
|
case Common::EN_ANY:
|
|
|
|
case Common::EN_USA:
|
|
|
|
case Common::EN_GRB:
|
|
|
|
_lang = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Common::FR_FRA:
|
|
|
|
_lang = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Common::DE_DEU:
|
|
|
|
_lang = 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
warning("unsupported language, switching back to English");
|
|
|
|
_lang = 0;
|
|
|
|
break;
|
|
|
|
}
|
2008-12-26 11:04:45 +00:00
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
_chargenWSA = 0;
|
2008-12-26 11:04:45 +00:00
|
|
|
_lastUsedStringBuffer = 0;
|
2008-12-26 11:05:47 +00:00
|
|
|
_landsFile = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_levelLangFile = 0;
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
_lastMusicTrack = -1;
|
2009-01-18 17:04:24 +00:00
|
|
|
_lastSfxTrack = -1;
|
2009-01-19 23:35:27 +00:00
|
|
|
_curTlkFile = -1;
|
2009-02-01 19:27:01 +00:00
|
|
|
_lastSpeaker = _lastSpeechId = -1;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
memset(_moneyColumnHeight, 0, 5);
|
|
|
|
_credits = 0;
|
|
|
|
|
|
|
|
_itemsInPlay = 0;
|
|
|
|
_itemProperties = 0;
|
|
|
|
_itemInHand = 0;
|
2009-03-08 13:32:27 +00:00
|
|
|
memset(_inventory, 0, sizeof(_inventory));
|
2009-01-18 17:04:24 +00:00
|
|
|
_inventoryCurItem = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_hideControls = 0;
|
2009-02-21 17:24:50 +00:00
|
|
|
_lastCharInventory = -1;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
_itemIconShapes = _itemShapes = _gameShapes = _thrownShapes = _iceShapes = _fireballShapes = 0;
|
|
|
|
_levelShpList = _levelDatList = 0;
|
|
|
|
_monsterShapes = _monsterPalettes = 0;
|
2009-03-01 14:45:30 +00:00
|
|
|
_monsterShapesEx = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_gameShapeMap = 0;
|
|
|
|
memset(_monsterUnk, 0, 3);
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_ingameMT32SoundIndex = _ingameGMSoundIndex = /*_ingameADLSoundIndex =*/ 0;
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
_charSelection = -1;
|
|
|
|
_characters = 0;
|
|
|
|
_spellProperties = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_updateFlags = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_selectedSpell = 0;
|
2009-02-23 20:17:53 +00:00
|
|
|
_updateCharNum = _updatePortraitSpeechAnimDuration = _portraitSpeechAnimMode = _updateCharV3 = _textColourFlag = _hideInventory = 0;
|
2009-02-14 00:51:07 +00:00
|
|
|
_fadeText = false;
|
2009-02-01 19:27:01 +00:00
|
|
|
_palUpdateTimer = _updatePortraitNext = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_lampStatusTimer = 0xffffffff;
|
|
|
|
|
|
|
|
_weaponsDisabled = false;
|
2009-02-21 17:24:50 +00:00
|
|
|
_charInventoryUnk = 0;
|
2009-02-14 00:51:07 +00:00
|
|
|
_lastButtonShape = 0;
|
|
|
|
_buttonPressTimer = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_selectedCharacter = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_unkFlag = 0;
|
2009-03-01 14:45:30 +00:00
|
|
|
_suspendScript = _sceneUpdateRequired = false;
|
2009-02-14 00:51:07 +00:00
|
|
|
_scriptDirection = 0;
|
2009-01-18 23:50:31 +00:00
|
|
|
_currentDirection = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_currentBlock = 0;
|
2009-03-08 13:32:27 +00:00
|
|
|
memset(_currentBlockPropertyIndex, 0, sizeof(_currentBlockPropertyIndex));
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_scrollSceneBuffer = 0;
|
|
|
|
_smoothScrollModeNormal = 1;
|
2009-01-19 07:31:34 +00:00
|
|
|
_wllVmpMap = _wllBuffer3 = _wllBuffer4 = _wllWallFlags = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_wllShapeMap = 0;
|
|
|
|
_lvlShapeTop = _lvlShapeBottom = _lvlShapeLeftRight = 0;
|
2009-01-19 07:31:34 +00:00
|
|
|
_levelBlockProperties = 0;
|
2009-02-23 20:17:53 +00:00
|
|
|
_monsters = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_monsterProperties = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_lvlBlockIndex = _lvlShapeIndex = 0;
|
|
|
|
_unkDrawLevelBool = true;
|
|
|
|
_vcnBlocks = 0;
|
|
|
|
_vcnShift = 0;
|
|
|
|
_vcnExpTable = 0;
|
|
|
|
_vmpPtr = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_trueLightTable2 = 0;
|
|
|
|
_trueLightTable1 = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_levelShapeProperties = 0;
|
|
|
|
_levelShapes = 0;
|
2009-02-14 00:51:07 +00:00
|
|
|
_scriptAssignedLevelShape = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_blockDrawingBuffer = 0;
|
|
|
|
_sceneWindowBuffer = 0;
|
2009-03-08 13:32:27 +00:00
|
|
|
memset(_doorShapes, 0, sizeof(_doorShapes));
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
_lampOilStatus = _brightness = _lampStatusUnk = 0;
|
2009-02-16 21:46:02 +00:00
|
|
|
_lampStatusSuspended = false;
|
2009-01-18 17:04:24 +00:00
|
|
|
_tempBuffer5120 = 0;
|
2009-01-19 23:35:27 +00:00
|
|
|
_tmpData136 = 0;
|
2009-02-23 20:17:53 +00:00
|
|
|
_monsters = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_unkGameFlag = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_lastMouseRegion = 0;
|
2009-03-08 02:17:14 +00:00
|
|
|
_monsterLastWalkDirection = _monsterCountUnk = _monsterShiftAlt = 0;
|
2009-03-03 22:32:39 +00:00
|
|
|
_monsterCurBlock = 0;
|
2009-02-14 00:51:07 +00:00
|
|
|
//_preSeq_X1 = _preSeq_Y1 = _preSeq_X2 = _preSeq_Y2 = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
_dscUnk1 = 0;
|
|
|
|
_dscShapeIndex = 0;
|
2009-02-14 13:55:00 +00:00
|
|
|
_dscOvlMap = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_dscShapeScaleW = 0;
|
|
|
|
_dscShapeScaleH = 0;
|
|
|
|
_dscShapeX = 0;
|
|
|
|
_dscShapeY = 0;
|
2009-02-14 13:55:00 +00:00
|
|
|
_dscTileIndex = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_dscUnk2 = 0;
|
|
|
|
_dscDoorShpIndex = 0;
|
|
|
|
_dscDim1 = 0;
|
|
|
|
_dscDim2 = 0;
|
2009-01-18 18:20:33 +00:00
|
|
|
_dscBlockMap = _dscDoor1 = _dscShapeOvlIndex = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_dscBlockIndex = 0;
|
|
|
|
_dscDimMap = 0;
|
2009-01-18 23:50:31 +00:00
|
|
|
_dscDoorMonsterX = _dscDoorMonsterY = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_dscDoor4 = 0;
|
|
|
|
|
|
|
|
_ingameSoundList = 0;
|
2009-01-18 23:50:31 +00:00
|
|
|
_ingameSoundIndex = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
_ingameSoundListSize = 0;
|
2009-01-18 23:50:31 +00:00
|
|
|
_musicTrackMap = 0;
|
|
|
|
_curMusicTheme = -1;
|
|
|
|
_curMusicFileExt = 0;
|
2009-01-19 23:35:27 +00:00
|
|
|
_curMusicFileIndex = -1;
|
2009-03-03 22:32:39 +00:00
|
|
|
_environmentSfx = _environmentSfxVol = _environmentSfxDistThreshold = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
_sceneDrawVar1 = _sceneDrawVar2 = _sceneDrawVar3 = _wllProcessFlag = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_partyPosX = _partyPosY = 0;
|
2009-01-18 23:50:31 +00:00
|
|
|
_shpDmX = _shpDmY = _dmScaleW = _dmScaleH = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
_floatingMouseArrowControl = 0;
|
|
|
|
|
2009-03-08 14:33:18 +00:00
|
|
|
memset(_activeTim, 0, sizeof(_activeTim));
|
2009-02-01 19:27:01 +00:00
|
|
|
memset(_activeVoiceFile, 0, sizeof(_activeVoiceFile));
|
2009-03-08 13:28:22 +00:00
|
|
|
memset(_openDoorState, 0, sizeof(_openDoorState));
|
2009-03-08 23:28:19 +00:00
|
|
|
|
|
|
|
_activeVoiceFileTotalTime = 0;
|
2009-02-21 17:24:50 +00:00
|
|
|
_pageBuffer1 = _pageBuffer2 = 0;
|
|
|
|
|
2009-03-08 13:32:27 +00:00
|
|
|
memset(_charStatsTemp, 0, sizeof(_charStatsTemp));
|
2009-03-07 15:46:21 +00:00
|
|
|
|
|
|
|
_unkBt1 = _unkBt2 = 0;
|
2009-03-08 03:26:21 +00:00
|
|
|
_dialogueField = false;
|
2009-03-07 15:46:21 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_buttonData = 0;
|
|
|
|
_activeButtons = 0;
|
2009-02-16 17:17:15 +00:00
|
|
|
_preserveEvents = false;
|
2009-02-14 00:51:07 +00:00
|
|
|
_buttonList1 = _buttonList2 = _buttonList3 = _buttonList4 = _buttonList5 = _buttonList6 = _buttonList7 = _buttonList8 = 0;
|
2008-07-31 10:47:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
LoLEngine::~LoLEngine() {
|
|
|
|
setupPrologueData(false);
|
2009-02-16 21:46:02 +00:00
|
|
|
gui_resetButtonList();
|
2008-07-31 10:47:15 +00:00
|
|
|
|
2008-12-26 11:05:47 +00:00
|
|
|
delete[] _landsFile;
|
2009-01-18 17:04:24 +00:00
|
|
|
delete[] _levelLangFile;
|
2008-12-26 11:04:45 +00:00
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
delete _screen;
|
2009-02-16 21:46:02 +00:00
|
|
|
_screen = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
delete _gui;
|
2009-02-16 21:46:02 +00:00
|
|
|
_gui = 0;
|
2008-07-31 10:47:15 +00:00
|
|
|
delete _tim;
|
2009-03-06 22:53:08 +00:00
|
|
|
_tim = 0;
|
|
|
|
delete _txt;
|
2009-02-16 21:46:02 +00:00
|
|
|
_txt = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-16 21:46:02 +00:00
|
|
|
delete[] _itemsInPlay;
|
|
|
|
delete[] _itemProperties;
|
|
|
|
delete[] _characters;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-21 17:24:50 +00:00
|
|
|
delete[] _pageBuffer1;
|
|
|
|
delete[] _pageBuffer2;
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
if (_itemIconShapes) {
|
|
|
|
for (int i = 0; i < _numItemIconShapes; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _itemIconShapes[i];
|
|
|
|
delete[] _itemIconShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
if (_itemShapes) {
|
|
|
|
for (int i = 0; i < _numItemShapes; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _itemShapes[i];
|
|
|
|
delete[] _itemShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
if (_gameShapes) {
|
|
|
|
for (int i = 0; i < _numGameShapes; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _gameShapes[i];
|
|
|
|
delete[] _gameShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
if (_thrownShapes) {
|
|
|
|
for (int i = 0; i < _numThrownShapes; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _thrownShapes[i];
|
|
|
|
delete[] _thrownShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
if (_iceShapes) {
|
|
|
|
for (int i = 0; i < _numIceShapes; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _iceShapes[i];
|
|
|
|
delete[] _iceShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
if (_fireballShapes) {
|
|
|
|
for (int i = 0; i < _numFireballShapes; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _fireballShapes[i];
|
|
|
|
delete[] _fireballShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (_monsterShapes) {
|
|
|
|
for (int i = 0; i < 48; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _monsterShapes[i];
|
|
|
|
delete[] _monsterShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
if (_monsterPalettes) {
|
|
|
|
for (int i = 0; i < 48; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _monsterPalettes[i];
|
|
|
|
delete[] _monsterPalettes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
2009-03-01 14:45:30 +00:00
|
|
|
if (_monsterShapesEx) {
|
|
|
|
for (int i = 0; i < 576; i++)
|
|
|
|
delete[] _monsterShapesEx[i];
|
|
|
|
delete[] _monsterShapesEx;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
for (Common::Array<const TIMOpcode*>::iterator i = _timIntroOpcodes.begin(); i != _timIntroOpcodes.end(); ++i)
|
|
|
|
delete *i;
|
|
|
|
_timIntroOpcodes.clear();
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
for (Common::Array<const TIMOpcode*>::iterator i = _timIngameOpcodes.begin(); i != _timIngameOpcodes.end(); ++i)
|
|
|
|
delete *i;
|
|
|
|
_timIngameOpcodes.clear();
|
|
|
|
|
|
|
|
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _wllVmpMap;
|
|
|
|
delete[] _wllShapeMap;
|
|
|
|
delete[] _wllBuffer3;
|
|
|
|
delete[] _wllBuffer4;
|
2009-01-19 07:31:34 +00:00
|
|
|
delete[] _wllWallFlags;
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _lvlShapeTop;
|
|
|
|
delete[] _lvlShapeBottom;
|
|
|
|
delete[] _lvlShapeLeftRight;
|
|
|
|
delete[] _tempBuffer5120;
|
2009-01-19 23:35:27 +00:00
|
|
|
delete[] _tmpData136;
|
2009-02-23 20:17:53 +00:00
|
|
|
delete[] _monsters;
|
2009-01-19 07:31:34 +00:00
|
|
|
delete[] _levelBlockProperties;
|
2009-02-01 19:27:01 +00:00
|
|
|
delete[] _monsterProperties;
|
2009-02-14 00:51:07 +00:00
|
|
|
delete[] _scrollSceneBuffer;
|
|
|
|
delete[] _scriptAssignedLevelShape;
|
2009-01-18 17:38:29 +00:00
|
|
|
|
|
|
|
delete[] _levelFileData;
|
|
|
|
delete[] _vcnExpTable;
|
|
|
|
delete[] _vcnBlocks;
|
|
|
|
delete[] _vcnShift;
|
|
|
|
delete[] _vmpPtr;
|
2009-02-01 19:27:01 +00:00
|
|
|
delete[] _trueLightTable2;
|
|
|
|
delete[] _trueLightTable1;
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _levelShapeProperties;
|
|
|
|
delete[] _blockDrawingBuffer;
|
|
|
|
delete[] _sceneWindowBuffer;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
if (_levelShapes) {
|
|
|
|
for (int i = 0; i < 400; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _levelShapes[i];
|
|
|
|
delete[] _levelShapes;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < 2; i++)
|
2009-01-18 17:36:25 +00:00
|
|
|
delete[] _doorShapes[i];
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
delete _lvlShpFileHandle;
|
|
|
|
|
|
|
|
if (_ingameSoundList) {
|
|
|
|
for (int i = 0; i < _ingameSoundListSize; i++)
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] _ingameSoundList[i];
|
2009-02-14 13:55:00 +00:00
|
|
|
delete[] _ingameSoundList;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
2008-07-31 10:47:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Screen *LoLEngine::screen() {
|
|
|
|
return _screen;
|
|
|
|
}
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
GUI *LoLEngine::gui() const {
|
|
|
|
return _gui;
|
|
|
|
}
|
|
|
|
|
2008-11-06 17:05:54 +00:00
|
|
|
Common::Error LoLEngine::init() {
|
2008-07-31 10:47:15 +00:00
|
|
|
_screen = new Screen_LoL(this, _system);
|
|
|
|
assert(_screen);
|
|
|
|
_screen->setResolution();
|
|
|
|
|
|
|
|
KyraEngine_v1::init();
|
2009-01-18 17:04:24 +00:00
|
|
|
initStaticResource();
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2009-03-03 22:32:39 +00:00
|
|
|
_environmentSfxDistThreshold = (MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB) == MD_ADLIB || ConfMan.getBool("multi_midi")) ? 15 : 3;
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
_gui = new GUI_LoL(this);
|
|
|
|
assert(_gui);
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_txt = new TextDisplayer_LoL(this, _screen);
|
2009-02-01 19:27:01 +00:00
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
_screen->setAnimBlockPtr(10000);
|
|
|
|
_screen->setScreenDim(0);
|
|
|
|
|
2009-02-21 17:24:50 +00:00
|
|
|
_pageBuffer1 = new uint8[0xfa00];
|
|
|
|
memset(_pageBuffer1, 0, 0xfa00);
|
|
|
|
_pageBuffer2 = new uint8[0xfa00];
|
|
|
|
memset(_pageBuffer2, 0, 0xfa00);
|
2009-03-08 13:32:27 +00:00
|
|
|
|
2009-03-08 23:28:19 +00:00
|
|
|
_itemsInPlay = new ItemInPlay[400];
|
2009-01-18 17:04:24 +00:00
|
|
|
memset(_itemsInPlay, 0, sizeof(ItemInPlay) * 400);
|
|
|
|
|
|
|
|
_characters = new LoLCharacter[4];
|
2009-03-06 22:53:08 +00:00
|
|
|
memset(_characters, 0, sizeof(LoLCharacter) * 4);
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2008-08-07 13:36:02 +00:00
|
|
|
if (!_sound->init())
|
|
|
|
error("Couldn't init sound");
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
_speechFlag = speechEnabled() ? 0x48 : 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
_wllVmpMap = new uint8[80];
|
|
|
|
memset(_wllVmpMap, 0, 80);
|
|
|
|
_wllShapeMap = new int8[80];
|
|
|
|
memset(_wllShapeMap, 0, 80);
|
|
|
|
_wllBuffer3 = new uint8[80];
|
|
|
|
memset(_wllBuffer3, 0, 80);
|
|
|
|
_wllBuffer4 = new uint8[80];
|
|
|
|
memset(_wllBuffer4, 0, 80);
|
2009-01-19 07:31:34 +00:00
|
|
|
_wllWallFlags = new uint8[80];
|
|
|
|
memset(_wllWallFlags, 0, 80);
|
2009-01-18 17:04:24 +00:00
|
|
|
_lvlShapeTop = new int16[18];
|
|
|
|
memset(_lvlShapeTop, 0, 18 * sizeof(int16));
|
|
|
|
_lvlShapeBottom = new int16[18];
|
|
|
|
memset(_lvlShapeBottom, 0, 18 * sizeof(int16));
|
|
|
|
_lvlShapeLeftRight = new int16[36];
|
|
|
|
memset(_lvlShapeLeftRight, 0, 36 * sizeof(int16));
|
|
|
|
_levelShapeProperties = new LevelShapeProperty[100];
|
|
|
|
memset(_levelShapeProperties, 0, 100 * sizeof(LevelShapeProperty));
|
|
|
|
_levelShapes = new uint8*[400];
|
|
|
|
memset(_levelShapes, 0, 400 * sizeof(uint8*));
|
|
|
|
_blockDrawingBuffer = new uint16[1320];
|
|
|
|
memset(_blockDrawingBuffer, 0, 1320 * sizeof(uint16));
|
|
|
|
_sceneWindowBuffer = new uint8[21120];
|
|
|
|
memset(_sceneWindowBuffer, 0, 21120);
|
|
|
|
|
2009-01-19 07:31:34 +00:00
|
|
|
_levelBlockProperties = new LevelBlockProperty[1025];
|
|
|
|
memset(_levelBlockProperties, 0, 1025 * sizeof(LevelBlockProperty));
|
2009-02-23 20:17:53 +00:00
|
|
|
_monsters = new MonsterInPlay[30];
|
|
|
|
memset(_monsters, 0, 30 * sizeof(MonsterInPlay));
|
2009-02-01 19:27:01 +00:00
|
|
|
_monsterProperties = new MonsterProperty[5];
|
|
|
|
memset(_monsterProperties, 0, 5 * sizeof(MonsterProperty));
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_scrollSceneBuffer = new uint8[21120];
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
_vcnExpTable = new uint8[128];
|
|
|
|
for (int i = 0; i < 128; i++)
|
|
|
|
_vcnExpTable[i] = i & 0x0f;
|
|
|
|
|
|
|
|
_tempBuffer5120 = new uint8[5120];
|
|
|
|
memset(_tempBuffer5120, 0, 5120);
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
_tmpData136 = new uint8[136];
|
|
|
|
memset(_tmpData136, 0, 136);
|
|
|
|
|
2009-03-09 00:54:27 +00:00
|
|
|
memset(_gameFlags, 0, sizeof(_gameFlags));
|
|
|
|
memset(_globalScriptVars, 0, sizeof(_globalScriptVars));
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
_levelFileData = 0;
|
|
|
|
_lvlShpFileHandle = 0;
|
|
|
|
|
|
|
|
_sceneDrawPage1 = 2;
|
|
|
|
_sceneDrawPage2 = 6;
|
|
|
|
|
|
|
|
_monsterShapes = new uint8*[48];
|
|
|
|
memset(_monsterShapes, 0, 48 * sizeof(uint8*));
|
|
|
|
_monsterPalettes = new uint8*[48];
|
|
|
|
memset(_monsterPalettes, 0, 48 * sizeof(uint8*));
|
|
|
|
|
2009-03-01 14:45:30 +00:00
|
|
|
_monsterShapesEx = new uint8*[576];
|
|
|
|
memset(_monsterShapesEx, 0, 576 * sizeof(uint8*));
|
2009-01-18 17:04:24 +00:00
|
|
|
memset(&_scriptData, 0, sizeof(EMCData));
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
_levelFlagUnk = 0;
|
2009-02-14 00:51:07 +00:00
|
|
|
_unkCharNum = -1;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2008-11-06 17:05:54 +00:00
|
|
|
return Common::kNoError;
|
2008-07-31 10:47:15 +00:00
|
|
|
}
|
|
|
|
|
2008-11-06 17:05:54 +00:00
|
|
|
Common::Error LoLEngine::go() {
|
2009-02-01 19:27:01 +00:00
|
|
|
setupPrologueData(true);
|
|
|
|
|
|
|
|
if (!saveFileLoadable(0))
|
2008-12-26 11:04:45 +00:00
|
|
|
showIntro();
|
|
|
|
|
|
|
|
preInit();
|
|
|
|
|
|
|
|
int processSelection = -1;
|
|
|
|
while (!shouldQuit() && processSelection == -1) {
|
|
|
|
_screen->loadBitmap("TITLE.CPS", 2, 2, _screen->getPalette(0));
|
|
|
|
_screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
|
2008-12-29 14:37:51 +00:00
|
|
|
|
|
|
|
_screen->setFont(Screen::FID_6_FNT);
|
|
|
|
// Original version: (260|193) "V CD1.02 D"
|
|
|
|
_screen->fprintString("SVM %s", 255, 193, 0x67, 0x00, 0x04, gScummVMVersion);
|
|
|
|
_screen->setFont(Screen::FID_9_FNT);
|
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
_screen->fadePalette(_screen->getPalette(0), 0x1E);
|
2008-12-29 14:37:51 +00:00
|
|
|
_screen->updateScreen();
|
2008-12-26 11:04:45 +00:00
|
|
|
|
2008-12-29 13:59:35 +00:00
|
|
|
_eventList.clear();
|
2008-12-26 11:04:45 +00:00
|
|
|
int selection = mainMenu();
|
2008-12-29 14:37:51 +00:00
|
|
|
_screen->hideMouse();
|
|
|
|
|
|
|
|
// Unlike the original, we add a nice fade to black
|
|
|
|
memset(_screen->getPalette(0), 0, 768);
|
|
|
|
_screen->fadePalette(_screen->getPalette(0), 0x54);
|
2008-12-26 11:04:45 +00:00
|
|
|
|
|
|
|
switch (selection) {
|
|
|
|
case 0: // New game
|
|
|
|
processSelection = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1: // Show intro
|
|
|
|
showIntro();
|
|
|
|
break;
|
|
|
|
|
2008-12-29 14:06:31 +00:00
|
|
|
case 2: // "Lore of the Lands" (only CD version)
|
2008-12-26 11:04:45 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 3: // Load game
|
|
|
|
// For now fall through
|
|
|
|
//processSelection = 3;
|
|
|
|
//break;
|
|
|
|
|
|
|
|
case 4: // Quit game
|
|
|
|
default:
|
|
|
|
quitGame();
|
2008-12-29 14:37:51 +00:00
|
|
|
updateInput();
|
2008-12-26 11:04:45 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (processSelection == -1)
|
|
|
|
return Common::kNoError;
|
|
|
|
|
|
|
|
if (processSelection == 0) {
|
|
|
|
_sound->loadSoundFile("LOREINTR");
|
2009-02-14 13:55:00 +00:00
|
|
|
_sound->playTrack(6);
|
2009-02-16 17:17:15 +00:00
|
|
|
chooseCharacter();
|
2008-12-26 11:04:45 +00:00
|
|
|
_sound->playTrack(1);
|
|
|
|
_screen->fadeToBlack();
|
|
|
|
}
|
2008-07-31 10:47:15 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
setupPrologueData(false);
|
|
|
|
|
2009-02-02 23:20:55 +00:00
|
|
|
_tim = new TIMInterpreter_LoL(this, _screen, _system);
|
2009-02-16 17:17:15 +00:00
|
|
|
assert(_tim);
|
2009-02-02 23:20:55 +00:00
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
if (!shouldQuit() && (processSelection == 0 || processSelection == 3))
|
|
|
|
startup();
|
|
|
|
|
|
|
|
if (!shouldQuit() && processSelection == 0)
|
|
|
|
startupNew();
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
if (!shouldQuit() && (processSelection == 0 || processSelection == 3)) {
|
|
|
|
_screen->_fadeFlag = 3;
|
|
|
|
_sceneUpdateRequired = true;
|
2009-03-03 22:32:39 +00:00
|
|
|
enableSysTimer(1);
|
2009-01-18 17:04:24 +00:00
|
|
|
runLoop();
|
2009-02-01 19:27:01 +00:00
|
|
|
}
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-02 23:20:55 +00:00
|
|
|
delete _tim;
|
|
|
|
_tim = 0;
|
|
|
|
|
|
|
|
// TODO: outro
|
2008-11-06 17:05:54 +00:00
|
|
|
return Common::kNoError;
|
2008-07-31 10:47:15 +00:00
|
|
|
}
|
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
#pragma mark - Initialization
|
|
|
|
|
|
|
|
void LoLEngine::preInit() {
|
|
|
|
debugC(9, kDebugLevelMain, "LoLEngine::preInit()");
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
_res->loadPakFile("GENERAL.PAK");
|
|
|
|
if (_flags.isTalkie)
|
|
|
|
_res->loadPakFile("STARTUP.PAK");
|
2008-12-29 13:59:35 +00:00
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
_screen->loadFont(Screen::FID_9_FNT, "FONT9P.FNT");
|
|
|
|
_screen->loadFont(Screen::FID_6_FNT, "FONT6P.FNT");
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
loadTalkFile(0);
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
char filename[32];
|
2009-01-01 15:06:43 +00:00
|
|
|
snprintf(filename, sizeof(filename), "LANDS.%s", _languageExt[_lang]);
|
2008-12-29 14:37:51 +00:00
|
|
|
_res->exists(filename, true);
|
2008-12-26 11:04:45 +00:00
|
|
|
_landsFile = _res->fileData(filename, 0);
|
2009-02-01 19:27:01 +00:00
|
|
|
loadItemIconShapes();
|
2008-12-26 11:04:45 +00:00
|
|
|
}
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
void LoLEngine::loadItemIconShapes() {
|
|
|
|
debugC(9, kDebugLevelMain, "LoLEngine::loadItemIconShapes()");
|
|
|
|
|
|
|
|
if (_itemIconShapes) {
|
|
|
|
for (int i = 0; i < _numItemIconShapes; i++)
|
|
|
|
delete[] _itemIconShapes[i];
|
|
|
|
delete[] _itemIconShapes;
|
|
|
|
}
|
2008-12-26 11:04:45 +00:00
|
|
|
|
|
|
|
_screen->loadBitmap("ITEMICN.SHP", 3, 3, 0);
|
2009-01-18 17:04:24 +00:00
|
|
|
const uint8 *shp = _screen->getCPagePtr(3);
|
|
|
|
_numItemIconShapes = READ_LE_UINT16(shp);
|
|
|
|
_itemIconShapes = new uint8*[_numItemIconShapes];
|
|
|
|
for (int i = 0; i < _numItemIconShapes; i++)
|
|
|
|
_itemIconShapes[i] = _screen->makeShapeCopy(shp, i);
|
|
|
|
|
|
|
|
_screen->setMouseCursor(0, 0, _itemIconShapes[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::setMouseCursorToIcon(int icon) {
|
2009-03-08 02:17:14 +00:00
|
|
|
_gameFlags[15] |= 0x200;
|
2009-01-18 17:04:24 +00:00
|
|
|
int i = _itemProperties[_itemsInPlay[_itemInHand].itemPropertyIndex].shpIndex;
|
|
|
|
if (i == icon)
|
|
|
|
return;
|
|
|
|
_screen->setMouseCursor(0, 0, _itemIconShapes[icon]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::setMouseCursorToItemInHand() {
|
2009-03-08 02:17:14 +00:00
|
|
|
_gameFlags[15] &= 0xFDFF;
|
2009-01-18 17:04:24 +00:00
|
|
|
int o = (_itemInHand == 0) ? 0 : 10;
|
|
|
|
_screen->setMouseCursor(o, o, getItemIconShapePtr(_itemInHand));
|
|
|
|
}
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
bool LoLEngine::posWithinRect(int mouseX, int mouseY, int x1, int y1, int x2, int y2) {
|
|
|
|
if (mouseX < x1 || mouseX > x2 || mouseY < y1 || mouseY > y2)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
uint8 *LoLEngine::getItemIconShapePtr(int index) {
|
|
|
|
int ix = _itemProperties[_itemsInPlay[index].itemPropertyIndex].shpIndex;
|
|
|
|
if (_itemProperties[_itemsInPlay[index].itemPropertyIndex].flags & 0x200)
|
|
|
|
ix += (_itemsInPlay[index].shpCurFrame_flg & 0x1fff) - 1;
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
return _itemIconShapes[ix];
|
2008-12-26 11:04:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int LoLEngine::mainMenu() {
|
|
|
|
debugC(9, kDebugLevelMain, "LoLEngine::mainMenu()");
|
|
|
|
|
|
|
|
bool hasSave = saveFileLoadable(0);
|
|
|
|
|
|
|
|
MainMenu::StaticData data = {
|
2009-01-01 15:06:43 +00:00
|
|
|
{ 0, 0, 0, 0, 0 },
|
2008-12-26 11:04:45 +00:00
|
|
|
{ 0x01, 0x04, 0x0C, 0x04, 0x00, 0x3D, 0x9F },
|
|
|
|
{ 0x2C, 0x19, 0x48, 0x2C },
|
|
|
|
Screen::FID_9_FNT, 1
|
|
|
|
};
|
|
|
|
|
|
|
|
if (hasSave)
|
|
|
|
++data.menuTable[3];
|
|
|
|
|
2008-12-28 22:09:31 +00:00
|
|
|
static const uint16 mainMenuStrings[4][5] = {
|
2008-12-26 11:04:45 +00:00
|
|
|
{ 0x4248, 0x4249, 0x42DD, 0x424A, 0x0000 },
|
2008-12-28 22:09:31 +00:00
|
|
|
{ 0x4248, 0x4249, 0x42DD, 0x4001, 0x424A },
|
|
|
|
{ 0x4248, 0x4249, 0x424A, 0x0000, 0x0000 },
|
|
|
|
{ 0x4248, 0x4249, 0x4001, 0x424A, 0x0000 }
|
2008-12-26 11:04:45 +00:00
|
|
|
};
|
|
|
|
|
2008-12-28 22:09:31 +00:00
|
|
|
int tableOffs = _flags.isTalkie ? 0 : 2;
|
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
for (int i = 0; i < 5; ++i) {
|
|
|
|
if (hasSave)
|
2009-01-01 15:06:43 +00:00
|
|
|
data.strings[i] = getLangString(mainMenuStrings[1 + tableOffs][i]);
|
2008-12-26 11:04:45 +00:00
|
|
|
else
|
2009-01-01 15:06:43 +00:00
|
|
|
data.strings[i] = getLangString(mainMenuStrings[tableOffs][i]);
|
2008-12-26 11:04:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MainMenu *menu = new MainMenu(this);
|
|
|
|
assert(menu);
|
|
|
|
menu->init(data, MainMenu::Animation());
|
|
|
|
|
2008-12-29 14:06:31 +00:00
|
|
|
int selection = menu->handle(_flags.isTalkie ? (hasSave ? 12 : 6) : (hasSave ? 6 : 13));
|
2008-12-26 11:04:45 +00:00
|
|
|
delete menu;
|
2008-12-29 14:44:06 +00:00
|
|
|
_screen->setScreenDim(0);
|
2008-12-26 11:04:45 +00:00
|
|
|
|
2008-12-28 22:09:31 +00:00
|
|
|
if (!_flags.isTalkie && selection >= 2)
|
|
|
|
selection++;
|
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
if (!hasSave && selection == 3)
|
|
|
|
selection = 4;
|
|
|
|
|
|
|
|
return selection;
|
|
|
|
}
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
void LoLEngine::startup() {
|
|
|
|
_screen->clearPage(0);
|
|
|
|
_screen->loadBitmap("PLAYFLD.CPS", 3, 3, _screen->_currentPalette);
|
|
|
|
|
|
|
|
uint8 *tmpPal = new uint8[0x300];
|
|
|
|
memcpy(tmpPal, _screen->_currentPalette, 0x300);
|
|
|
|
memset(_screen->_currentPalette, 0x3f, 0x180);
|
|
|
|
memcpy(_screen->_currentPalette + 3, tmpPal + 3, 3);
|
|
|
|
memset(_screen->_currentPalette + 0x240, 0x3f, 12);
|
2009-02-14 00:51:07 +00:00
|
|
|
_screen->generateOverlay(_screen->_currentPalette, _screen->_paletteOverlay1, 1, 96);
|
|
|
|
_screen->generateOverlay(_screen->_currentPalette, _screen->_paletteOverlay2, 144, 65);
|
2009-01-18 17:04:24 +00:00
|
|
|
memcpy(_screen->_currentPalette, tmpPal, 0x300);
|
2009-01-18 17:38:29 +00:00
|
|
|
delete[] tmpPal;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
memset(_screen->getPalette(1), 0, 0x300);
|
|
|
|
memset(_screen->getPalette(2), 0, 0x300);
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
loadItemIconShapes();
|
2009-01-18 17:04:24 +00:00
|
|
|
_screen->setMouseCursor(0, 0, _itemIconShapes[0x85]);
|
|
|
|
|
|
|
|
_screen->loadBitmap("ITEMSHP.SHP", 3, 3, 0);
|
|
|
|
const uint8 *shp = _screen->getCPagePtr(3);
|
|
|
|
_numItemShapes = READ_LE_UINT16(shp);
|
|
|
|
_itemShapes = new uint8*[_numItemShapes];
|
|
|
|
for (int i = 0; i < _numItemShapes; i++)
|
|
|
|
_itemShapes[i] = _screen->makeShapeCopy(shp, i);
|
|
|
|
|
|
|
|
_screen->loadBitmap("GAMESHP.SHP", 3, 3, 0);
|
|
|
|
shp = _screen->getCPagePtr(3);
|
|
|
|
_numGameShapes = READ_LE_UINT16(shp);
|
|
|
|
_gameShapes = new uint8*[_numGameShapes];
|
|
|
|
for (int i = 0; i < _numGameShapes; i++)
|
|
|
|
_gameShapes[i] = _screen->makeShapeCopy(shp, i);
|
|
|
|
|
|
|
|
_screen->loadBitmap("THROWN.SHP", 3, 3, 0);
|
|
|
|
shp = _screen->getCPagePtr(3);
|
|
|
|
_numThrownShapes = READ_LE_UINT16(shp);
|
|
|
|
_thrownShapes = new uint8*[_numThrownShapes];
|
|
|
|
for (int i = 0; i < _numThrownShapes; i++)
|
|
|
|
_thrownShapes[i] = _screen->makeShapeCopy(shp, i);
|
|
|
|
|
|
|
|
_screen->loadBitmap("ICE.SHP", 3, 3, 0);
|
|
|
|
shp = _screen->getCPagePtr(3);
|
|
|
|
_numIceShapes = READ_LE_UINT16(shp);
|
|
|
|
_iceShapes = new uint8*[_numIceShapes];
|
|
|
|
for (int i = 0; i < _numIceShapes; i++)
|
|
|
|
_iceShapes[i] = _screen->makeShapeCopy(shp, i);
|
|
|
|
|
|
|
|
_screen->loadBitmap("FIREBALL.SHP", 3, 3, 0);
|
|
|
|
shp = _screen->getCPagePtr(3);
|
|
|
|
_numFireballShapes = READ_LE_UINT16(shp);
|
|
|
|
_fireballShapes = new uint8*[_numFireballShapes];
|
|
|
|
for (int i = 0; i < _numFireballShapes; i++)
|
|
|
|
_fireballShapes[i] = _screen->makeShapeCopy(shp, i);
|
|
|
|
|
|
|
|
memset(_itemsInPlay, 0, 400 * sizeof(ItemInPlay));
|
|
|
|
for (int i = 0; i < 400; i++)
|
|
|
|
_itemsInPlay[i].shpCurFrame_flg |= 0x8000;
|
|
|
|
|
|
|
|
runInitScript("ONETIME.INF", 0);
|
|
|
|
_emc->load("ITEM.INF", &_itemScript, &_opcodes);
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
_trueLightTable1 = new uint8[256];
|
|
|
|
_trueLightTable2 = new uint8[5120];
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
_loadSuppFilesFlag = 1;
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_txt->setAnimParameters("<MORE>", 10, 31, 0);
|
|
|
|
_txt->setAnimFlag(true);
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
_screen->_dimLineCount = 0;
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_sound->loadSfxFile("LORESFX");
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
setMouseCursorToItemInHand();
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::startupNew() {
|
|
|
|
_selectedSpell = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
_compassUnk = 0;
|
|
|
|
_compassDirection = _compassDirectionIndex = -1;
|
|
|
|
|
|
|
|
_lastMouseRegion = -1;
|
2009-01-18 17:04:24 +00:00
|
|
|
_unkGameFlag |= 0x1B;
|
|
|
|
/*
|
|
|
|
_unk5 = 1;
|
|
|
|
_unk6 = 1;
|
|
|
|
_unk7 = 1
|
|
|
|
_unk8 = 1*/
|
|
|
|
_currentLevel = 1;
|
|
|
|
|
|
|
|
giveCredits(41, 0);
|
2009-02-21 17:24:50 +00:00
|
|
|
_inventory[0] = makeItem(216, 0, 0);
|
|
|
|
_inventory[1] = makeItem(217, 0, 0);
|
|
|
|
_inventory[2] = makeItem(218, 0, 0);
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
memset(_availableSpells, -1, 7);
|
2009-02-01 19:27:01 +00:00
|
|
|
_availableSpells[0] = 0;
|
2009-01-18 17:04:24 +00:00
|
|
|
setupScreenDims();
|
|
|
|
|
2009-03-07 15:46:21 +00:00
|
|
|
memset(_unkWordArraySize8, 0x100, 8);
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
static int selectIds[] = { -9, -1, -8, -5 };
|
|
|
|
addCharacter(selectIds[_charSelection]);
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
gui_enableDefaultPlayfieldButtons();
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
loadLevel(1);
|
|
|
|
|
|
|
|
_screen->showMouse();
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::runLoop() {
|
2009-03-03 22:32:39 +00:00
|
|
|
enableSysTimer(2);
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
bool _runFlag = true;
|
2009-02-01 19:27:01 +00:00
|
|
|
_unkFlag |= 0x800;
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
while (!shouldQuit() && _runFlag) {
|
2009-02-01 19:27:01 +00:00
|
|
|
if (_nextScriptFunc) {
|
2009-02-21 23:20:14 +00:00
|
|
|
runLevelScript(_nextScriptFunc, 2);
|
2009-02-01 19:27:01 +00:00
|
|
|
_nextScriptFunc = 0;
|
|
|
|
}
|
|
|
|
|
2009-02-21 23:20:14 +00:00
|
|
|
_timer->update();
|
2009-02-21 17:24:50 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
//checkFloatingPointerRegions();
|
2009-02-14 00:51:07 +00:00
|
|
|
gui_updateInput();
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
update();
|
|
|
|
|
|
|
|
if (_sceneUpdateRequired)
|
|
|
|
gui_drawScene(0);
|
|
|
|
else
|
2009-03-03 22:32:39 +00:00
|
|
|
updateEnvironmentalSfx(0);
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
/*if (_partyDeathFlag != -1) {
|
|
|
|
checkForPartyDeath(_partyDeathFlag);
|
|
|
|
_partyDeathFlag = -1;
|
|
|
|
}*/
|
2009-03-06 22:53:08 +00:00
|
|
|
|
2009-02-21 17:24:50 +00:00
|
|
|
delay(_tickLength);
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
void LoLEngine::update() {
|
|
|
|
updateWsaAnimations();
|
|
|
|
|
|
|
|
if (_updateCharNum != -1 && _system->getMillis() > _updatePortraitNext)
|
2009-02-16 17:17:15 +00:00
|
|
|
updatePortraitSpeechAnim();
|
2009-02-01 19:27:01 +00:00
|
|
|
|
2009-03-08 02:17:14 +00:00
|
|
|
if (_gameFlags[15] & 0x800 || !(_updateFlags & 4))
|
2009-02-01 19:27:01 +00:00
|
|
|
updateLampStatus();
|
|
|
|
|
2009-03-08 02:17:14 +00:00
|
|
|
if (_gameFlags[15] & 0x4000 && !(_updateFlags & 4) && (_compassDirection == -1 || (_currentDirection << 6) != _compassDirection || _compassUnk))
|
2009-02-01 19:27:01 +00:00
|
|
|
updateCompass();
|
|
|
|
|
|
|
|
snd_characterSpeaking();
|
2009-02-14 00:51:07 +00:00
|
|
|
fadeText();
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
_screen->updateScreen();
|
|
|
|
}
|
|
|
|
|
2008-12-26 11:04:45 +00:00
|
|
|
#pragma mark - Localization
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
char *LoLEngine::getLangString(uint16 id) {
|
2008-12-26 11:04:45 +00:00
|
|
|
debugC(9, kDebugLevelMain, "LoLEngine::getLangString(0x%.04X)", id);
|
|
|
|
|
|
|
|
if (id == 0xFFFF)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
uint16 realId = id & 0x3FFF;
|
|
|
|
uint8 *buffer = 0;
|
|
|
|
|
|
|
|
if (id & 0x4000)
|
|
|
|
buffer = _landsFile;
|
|
|
|
else
|
2009-01-18 23:50:31 +00:00
|
|
|
buffer = _levelLangFile;
|
2008-12-26 11:04:45 +00:00
|
|
|
|
|
|
|
if (!buffer)
|
|
|
|
return 0;
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
char *string = (char *)getTableEntry(buffer, realId);
|
2008-12-26 11:04:45 +00:00
|
|
|
|
|
|
|
char *srcBuffer = _stringBuffer[_lastUsedStringBuffer];
|
|
|
|
Util::decodeString1(string, srcBuffer);
|
|
|
|
Util::decodeString2(srcBuffer, srcBuffer);
|
|
|
|
|
|
|
|
++_lastUsedStringBuffer;
|
|
|
|
_lastUsedStringBuffer %= ARRAYSIZE(_stringBuffer);
|
|
|
|
|
|
|
|
return srcBuffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8 *LoLEngine::getTableEntry(uint8 *buffer, uint16 id) {
|
|
|
|
debugC(9, kDebugLevelMain, "LoLEngine::getTableEntry(%p, %d)", (const void *)buffer, id);
|
|
|
|
if (!buffer)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return buffer + READ_LE_UINT16(buffer + (id<<1));
|
|
|
|
}
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
bool LoLEngine::addCharacter(int id) {
|
2009-02-21 17:24:50 +00:00
|
|
|
const uint16 *cdf[] = { _charDefsMan, _charDefsMan, _charDefsMan, _charDefsWoman,
|
|
|
|
_charDefsMan, _charDefsMan, _charDefsWoman, _charDefsKieran, _charDefsAkshel };
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
int numChars = countActiveCharacters();
|
|
|
|
if (numChars == 4)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
for (; i < _charDefaultsSize; i++) {
|
|
|
|
if (_charDefaults[i].id == id) {
|
|
|
|
memcpy(&_characters[numChars], &_charDefaults[i], sizeof(LoLCharacter));
|
2009-02-21 17:24:50 +00:00
|
|
|
_characters[numChars].defaultModifiers = cdf[i];
|
2009-01-18 17:04:24 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i == _charDefaultsSize)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
loadCharFaceShapes(numChars, id);
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
_characters[numChars].nextAnimUpdateCountdown = (int16) _rnd.getRandomNumberRng(1, 12) + 6;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
2009-02-21 17:24:50 +00:00
|
|
|
for (i = 0; i < 11; i++) {
|
2009-02-01 19:27:01 +00:00
|
|
|
if (_characters[numChars].items[i]) {
|
|
|
|
_characters[numChars].items[i] = makeItem(_characters[numChars].items[i], 0, 0);
|
|
|
|
runItemScript(numChars, _characters[numChars].items[i], 0x80, 0, 0);
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
calcCharPortraitXpos();
|
|
|
|
if (numChars > 0)
|
|
|
|
initCharacter(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);
|
|
|
|
if (redraw)
|
|
|
|
gui_drawCharPortraitWithStats(charNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3) {
|
|
|
|
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
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int LoLEngine::countActiveCharacters() {
|
|
|
|
int i = 0;
|
|
|
|
while (_characters[i].flags & 1)
|
|
|
|
i++;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::loadCharFaceShapes(int charNum, int id) {
|
|
|
|
if (id < 0)
|
|
|
|
id = -id;
|
|
|
|
|
2009-01-20 09:38:55 +00:00
|
|
|
char file[13];
|
|
|
|
snprintf(file, sizeof(file), "FACE%02d.SHP", id);
|
2009-01-18 17:04:24 +00:00
|
|
|
_screen->loadBitmap(file, 3, 3, 0);
|
|
|
|
|
|
|
|
const uint8 *p = _screen->getCPagePtr(3);
|
|
|
|
for (int i = 0; i < 40; i++)
|
|
|
|
_characterFaceShapes[i][charNum] = _screen->makeShapeCopy(p, i);
|
|
|
|
}
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
void LoLEngine::updatePortraitSpeechAnim() {
|
2009-01-18 17:04:24 +00:00
|
|
|
int x = 0;
|
|
|
|
int y = 0;
|
|
|
|
bool redraw = false;
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
if (_portraitSpeechAnimMode == 0) {
|
2009-01-18 17:04:24 +00:00
|
|
|
x = _activeCharsXpos[_updateCharNum];
|
|
|
|
y = 144;
|
|
|
|
redraw = true;
|
2009-02-23 20:17:53 +00:00
|
|
|
} else if (_portraitSpeechAnimMode == 1) {
|
2009-02-01 19:27:01 +00:00
|
|
|
if (textEnabled()) {
|
2009-01-18 17:04:24 +00:00
|
|
|
x = 90;
|
|
|
|
y = 130;
|
|
|
|
} else {
|
|
|
|
x = _activeCharsXpos[_updateCharNum];
|
|
|
|
y = 144;
|
|
|
|
}
|
2009-02-23 20:17:53 +00:00
|
|
|
} else if (_portraitSpeechAnimMode == 2) {
|
2009-02-01 19:27:01 +00:00
|
|
|
if (textEnabled()) {
|
2009-01-18 17:04:24 +00:00
|
|
|
x = 16;
|
|
|
|
y = 134;
|
|
|
|
} else {
|
|
|
|
x = _activeCharsXpos[_updateCharNum] + 10;
|
|
|
|
y = 145;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int f = _rnd.getRandomNumberRng(1, 6) - 1;
|
|
|
|
if (f == _characters[_updateCharNum].curFaceFrame)
|
|
|
|
f++;
|
|
|
|
if (f > 5)
|
|
|
|
f -= 5;
|
|
|
|
f += 7;
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
if (_speechFlag) {
|
|
|
|
if (snd_characterSpeaking() == 2)
|
2009-02-23 20:17:53 +00:00
|
|
|
_updatePortraitSpeechAnimDuration = 2;
|
2009-02-01 19:27:01 +00:00
|
|
|
else
|
2009-02-23 20:17:53 +00:00
|
|
|
_updatePortraitSpeechAnimDuration = 1;
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
_updatePortraitSpeechAnimDuration--;
|
2009-02-16 17:17:15 +00:00
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
if (_updatePortraitSpeechAnimDuration) {
|
2009-01-18 17:04:24 +00:00
|
|
|
setCharFaceFrame(_updateCharNum, f);
|
|
|
|
if (redraw)
|
|
|
|
gui_drawCharPortraitWithStats(_updateCharNum);
|
|
|
|
else
|
|
|
|
gui_drawCharFaceShape(_updateCharNum, x, y, 0);
|
|
|
|
_updatePortraitNext = _system->getMillis() + 10 * _tickLength;
|
2009-02-16 17:17:15 +00:00
|
|
|
} else if (_updateCharV3 != 0) {
|
2009-01-18 17:04:24 +00:00
|
|
|
faceFrameRefresh(_updateCharNum);
|
|
|
|
if (redraw) {
|
|
|
|
gui_drawCharPortraitWithStats(_updateCharNum);
|
2009-02-14 13:55:00 +00:00
|
|
|
initTextFading(0, 0);
|
2009-01-18 17:04:24 +00:00
|
|
|
} else {
|
|
|
|
gui_drawCharFaceShape(_updateCharNum, x, y, 0);
|
|
|
|
}
|
|
|
|
_updateCharNum = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::updatePortraits() {
|
|
|
|
if (_updateCharNum == -1)
|
|
|
|
return;
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
_updatePortraitSpeechAnimDuration = _updateCharV3 = 1;
|
2009-02-16 17:17:15 +00:00
|
|
|
updatePortraitSpeechAnim();
|
2009-02-23 20:17:53 +00:00
|
|
|
_updatePortraitSpeechAnimDuration = 1;
|
2009-01-18 17:04:24 +00:00
|
|
|
_updateCharNum = -1;
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
if (!_portraitSpeechAnimMode)
|
2009-02-14 13:55:00 +00:00
|
|
|
initTextFading(0, 0);
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
2009-02-14 13:55:00 +00:00
|
|
|
void LoLEngine::initTextFading(int textType, int clearField) {
|
|
|
|
if (_textColourFlag == textType || !textType) {
|
2009-02-14 00:51:07 +00:00
|
|
|
_fadeText = true;
|
2009-02-01 19:27:01 +00:00
|
|
|
_palUpdateTimer = _system->getMillis();
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
2009-02-14 13:55:00 +00:00
|
|
|
if (!clearField)
|
2009-01-18 17:04:24 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
updatePortraits();
|
2009-02-14 13:55:00 +00:00
|
|
|
if (_hideInventory)
|
2009-01-18 17:04:24 +00:00
|
|
|
_screen->clearDim(3);
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_fadeText = false;
|
2009-02-21 23:20:14 +00:00
|
|
|
_timer->disable(11);
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::setCharFaceFrame(int charNum, int frameNum) {
|
|
|
|
_characters[charNum].curFaceFrame = frameNum;
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::faceFrameRefresh(int charNum) {
|
|
|
|
if (_characters[charNum].curFaceFrame == 1)
|
|
|
|
initCharacter(charNum, 0, 0, 0);
|
|
|
|
else if (_characters[charNum].curFaceFrame == 6)
|
|
|
|
if (_characters[charNum].nextFaceFrame != 5)
|
|
|
|
initCharacter(charNum, 0, 0, 0);
|
|
|
|
else
|
|
|
|
_characters[charNum].curFaceFrame = 5;
|
|
|
|
else
|
|
|
|
_characters[charNum].curFaceFrame = 0;
|
|
|
|
}
|
|
|
|
|
2009-02-21 17:24:50 +00:00
|
|
|
void LoLEngine::recalcCharacterStats(int charNum) {
|
|
|
|
for (int i = 0; i < 5; i++)
|
|
|
|
_charStatsTemp[i] = calculateCharacterStats(charNum, i);
|
|
|
|
}
|
|
|
|
|
|
|
|
int LoLEngine::calculateCharacterStats(int charNum, int index) {
|
|
|
|
if (index == 0) {
|
|
|
|
// Might
|
|
|
|
int c = 0;
|
|
|
|
for (int i = 0; i < 8; i++)
|
|
|
|
c += _characters[charNum].itemsMight[i];
|
|
|
|
if (c)
|
2009-02-23 20:17:53 +00:00
|
|
|
c += _characters[charNum].might;
|
2009-02-21 17:24:50 +00:00
|
|
|
else
|
|
|
|
c = _characters[charNum].defaultModifiers[8];
|
|
|
|
|
|
|
|
c = (c * _characters[charNum].defaultModifiers[1]) >> 8;
|
2009-02-23 20:17:53 +00:00
|
|
|
c = (c * _characters[charNum].totalMightModifier) >> 8;
|
2009-02-21 17:24:50 +00:00
|
|
|
|
|
|
|
return c;
|
|
|
|
|
|
|
|
} else if (index == 1) {
|
|
|
|
// Protection
|
|
|
|
return calculateProtection(charNum);
|
|
|
|
|
|
|
|
} else if (index > 4) {
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// Fighter
|
|
|
|
// Rogue
|
|
|
|
// Mage
|
|
|
|
index -= 2;
|
|
|
|
return _characters[charNum].skillLevels[index] + _characters[charNum].skillModifiers[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int LoLEngine::calculateProtection(int index) {
|
|
|
|
int c = 0;
|
|
|
|
if (index & 0x8000) {
|
|
|
|
// Monster
|
|
|
|
index &= 0x7fff;
|
2009-02-23 20:17:53 +00:00
|
|
|
c = (_monsters[index].properties->itemProtection * _monsters[index].properties->protection) >> 8;
|
2009-02-21 17:24:50 +00:00
|
|
|
} else {
|
|
|
|
// Character
|
2009-02-23 20:17:53 +00:00
|
|
|
c = _characters[index].itemsProtection + _characters[index].protection;
|
2009-02-21 17:24:50 +00:00
|
|
|
c = (c * _characters[index].defaultModifiers[2]) >> 8;
|
2009-02-23 20:17:53 +00:00
|
|
|
c = (c * _characters[index].totalProtectionModifier) >> 8;
|
2009-02-21 17:24:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
void LoLEngine::setupScreenDims() {
|
2009-02-01 19:27:01 +00:00
|
|
|
if (textEnabled()) {
|
2009-01-18 17:04:24 +00:00
|
|
|
_screen->modifyScreenDim(4, 11, 124, 28, 45);
|
2009-02-01 19:27:01 +00:00
|
|
|
_screen->modifyScreenDim(5, 85, 123, 233, 54);
|
|
|
|
} else {
|
2009-01-18 17:04:24 +00:00
|
|
|
_screen->modifyScreenDim(4, 11, 124, 28, 9);
|
2009-02-01 19:27:01 +00:00
|
|
|
_screen->modifyScreenDim(5, 85, 123, 233, 18);
|
2009-02-14 13:55:00 +00:00
|
|
|
}
|
2009-02-01 19:27:01 +00:00
|
|
|
}
|
|
|
|
|
2009-03-08 03:26:21 +00:00
|
|
|
void LoLEngine::initAnimatedDialogue(int controlMode) {
|
2009-02-23 20:17:53 +00:00
|
|
|
resetPortraitsArea();
|
2009-02-01 19:27:01 +00:00
|
|
|
gui_prepareForSequence(112, 0, 176, 120, controlMode);
|
|
|
|
|
|
|
|
_updateFlags |= 3;
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_txt->setupField(true);
|
|
|
|
_txt->expandField();
|
2009-02-01 19:27:01 +00:00
|
|
|
setupScreenDims();
|
|
|
|
gui_disableControls(controlMode);
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::toggleSelectedCharacterFrame(bool mode) {
|
|
|
|
if (countActiveCharacters() == 1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int col = mode ? 212 : 1;
|
|
|
|
|
|
|
|
int cp = _screen->setCurPage(0);
|
|
|
|
int x = _activeCharsXpos[_selectedCharacter];
|
|
|
|
|
|
|
|
_screen->drawBox(x, 143, x + 65, 176, col);
|
|
|
|
_screen->setCurPage(cp);
|
|
|
|
}
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags) {
|
|
|
|
setSequenceGui(x, y, w, h, buttonFlags);
|
2009-02-01 19:27:01 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
/*_preSeq_X1 = x;
|
2009-02-01 19:27:01 +00:00
|
|
|
_preSeq_Y1 = y;
|
|
|
|
_preSeq_X2 = x + w;
|
2009-02-14 00:51:07 +00:00
|
|
|
_preSeq_Y2 = y + h;*/
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
int mouseOffs = _itemInHand ? 10 : 0;
|
|
|
|
_screen->setMouseCursor(mouseOffs, mouseOffs, getItemIconShapePtr(_itemInHand));
|
|
|
|
|
|
|
|
_lastMouseRegion = -1;
|
|
|
|
|
|
|
|
if (w == 320) {
|
|
|
|
setLampMode(0);
|
|
|
|
_lampStatusSuspended = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-03-08 03:26:21 +00:00
|
|
|
void LoLEngine::restoreAfterAnimatedDialogue(int redraw) {
|
2009-02-01 19:27:01 +00:00
|
|
|
gui_enableControls();
|
2009-02-14 00:51:07 +00:00
|
|
|
_txt->setupField(false);
|
2009-02-01 19:27:01 +00:00
|
|
|
_updateFlags &= 0xffdf;
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
restoreDefaultGui();
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < 6; i++)
|
|
|
|
_tim->freeAnimStruct(i);
|
|
|
|
|
|
|
|
_updateFlags = 0;
|
|
|
|
|
|
|
|
if (redraw) {
|
|
|
|
if (_screen->_fadeFlag != 2)
|
|
|
|
_screen->fadeClearSceneWindow(10);
|
|
|
|
gui_drawPlayField();
|
2009-03-08 02:17:14 +00:00
|
|
|
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
2009-02-01 19:27:01 +00:00
|
|
|
_screen->_fadeFlag = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
_hideInventory = 0;
|
2009-03-06 22:53:08 +00:00
|
|
|
enableSysTimer(2);
|
2009-02-01 19:27:01 +00:00
|
|
|
}
|
|
|
|
|
2009-03-08 03:26:21 +00:00
|
|
|
void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) {
|
2009-03-08 23:28:19 +00:00
|
|
|
if (controlMode) {
|
|
|
|
_timer->disable(11);
|
|
|
|
_fadeText = false;
|
|
|
|
int cp = _screen->setCurPage(pageNum);
|
|
|
|
|
|
|
|
_screen->fillRect(0, 128, 319, 199, 1);
|
|
|
|
gui_drawBox(0, 129, 320, 71, 136, 251, -1);
|
|
|
|
gui_drawBox(1, 130, 318, 69, 136, 251, 252);
|
|
|
|
|
|
|
|
_screen->modifyScreenDim(5, 8, 131, 304, 66);
|
|
|
|
_screen->modifyScreenDim(4, 1, 133, 38, 60);
|
|
|
|
_screen->clearDim(4);
|
|
|
|
|
|
|
|
_updateFlags |= 2;
|
|
|
|
_hideControls = controlMode;
|
|
|
|
calcCharPortraitXpos();
|
|
|
|
|
|
|
|
if (!textEnabled() && (!(controlMode & 2))) {
|
|
|
|
int nc = countActiveCharacters();
|
|
|
|
for (int i = 0; i < nc; i++) {
|
|
|
|
_portraitSpeechAnimMode = 2;
|
|
|
|
_updateCharNum = i;
|
|
|
|
_screen->drawShape(0, _gameShapes[88], _activeCharsXpos[_updateCharNum] + 8, 142, 0, 0);
|
|
|
|
updatePortraits();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_screen->setCurPage(cp);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
_txt->setupField(true);
|
|
|
|
_txt->expandField();
|
|
|
|
setupScreenDims();
|
|
|
|
_screen->clearDim(4);
|
|
|
|
}
|
2009-03-08 03:26:21 +00:00
|
|
|
|
2009-03-08 23:28:19 +00:00
|
|
|
_hideControls = controlMode;
|
|
|
|
_dialogueField = true;
|
2009-03-08 03:26:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::restoreAfterNonAnimatedDialogue(int controlMode) {
|
|
|
|
if (!_dialogueField)
|
|
|
|
return;
|
|
|
|
|
|
|
|
updatePortraits();
|
|
|
|
_hideControls = controlMode;
|
|
|
|
calcCharPortraitXpos();
|
|
|
|
|
|
|
|
if (_hideControls) {
|
|
|
|
_screen->modifyScreenDim(4, 11, 124, 28, 45);
|
|
|
|
_screen->modifyScreenDim(5, 85, 123, 233, 54);
|
|
|
|
_updateFlags &= 0xfffd;
|
|
|
|
} else {
|
|
|
|
const ScreenDim *d = _screen->getScreenDim(5);
|
|
|
|
_screen->fillRect(d->sx, d->sy, d->sx + d->w - 2, d->sy + d->h - 2, d->unkA);
|
|
|
|
_screen->clearDim(4);
|
|
|
|
_screen->setScreenDim(4);
|
|
|
|
_txt->setupField(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
_dialogueField = false;
|
|
|
|
}
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
void LoLEngine::resetPortraitsArea() {
|
|
|
|
_hideInventory = 1;
|
|
|
|
if (!textEnabled() || (!(_hideControls & 2)))
|
|
|
|
timerUpdatePortraitAnimations(1);
|
|
|
|
|
2009-03-06 22:53:08 +00:00
|
|
|
disableSysTimer(2);
|
2009-02-23 20:17:53 +00:00
|
|
|
}
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
void LoLEngine::fadeText() {
|
|
|
|
if (!_fadeText)
|
2009-02-01 19:27:01 +00:00
|
|
|
return;
|
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
if (_screen->fadeColour(192, 252, _system->getMillis() - _palUpdateTimer, 60 * _tickLength))
|
|
|
|
return;
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
if (_hideInventory)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_screen->clearDim(3);
|
|
|
|
|
2009-02-21 23:20:14 +00:00
|
|
|
_timer->disable(11);
|
2009-02-01 19:27:01 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
_fadeText = false;
|
2009-02-01 19:27:01 +00:00
|
|
|
}
|
|
|
|
|
2009-03-08 02:17:14 +00:00
|
|
|
void LoLEngine::setPaletteBrightness(uint8 *palette, int brightness, int modifier) {
|
|
|
|
generateBrightnessPalette(palette, _screen->getPalette(1), brightness, modifier);
|
|
|
|
_screen->fadePalette(_screen->getPalette(1), 5, 0);
|
|
|
|
_screen->_fadeFlag = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoLEngine::generateBrightnessPalette(uint8 *src, uint8 *dst, int brightness, int modifier) {
|
|
|
|
memcpy(dst, src, 0x300);
|
|
|
|
_screen->loadSpecialColours(dst);
|
|
|
|
brightness = (8 - brightness) << 5;
|
|
|
|
if (modifier >= 0 && modifier < 8 && _gameFlags[15] & 0x800) {
|
|
|
|
brightness = 256 - ((((modifier & 0xfffe) << 5) * (256 - brightness)) >> 8);
|
|
|
|
if (brightness < 0)
|
|
|
|
brightness = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < 384; i++) {
|
|
|
|
uint16 c = (dst[i] * brightness) >> 8;
|
|
|
|
dst[i] = c & 0xff;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
void LoLEngine::updateWsaAnimations() {
|
|
|
|
if (_updateFlags & 8)
|
|
|
|
return;
|
|
|
|
|
|
|
|
//TODO
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
void LoLEngine::loadTalkFile(int index) {
|
|
|
|
char file[8];
|
2009-02-01 19:27:01 +00:00
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
if (index == _curTlkFile)
|
|
|
|
return;
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
if (_curTlkFile > 0 && index > 0) {
|
2009-01-19 23:35:27 +00:00
|
|
|
snprintf(file, sizeof(file), "%02d.TLK", _curTlkFile);
|
|
|
|
_res->unloadPakFile(file);
|
|
|
|
}
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
if (index > 0)
|
|
|
|
_curTlkFile = index;
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
snprintf(file, sizeof(file), "%02d.TLK", index);
|
|
|
|
_res->loadPakFile(file);
|
2009-02-01 19:27:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool LoLEngine::snd_playCharacterSpeech(int id, int8 speaker, int) {
|
|
|
|
if (!_speechFlag)
|
2009-02-16 17:17:15 +00:00
|
|
|
return false;
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
if (speaker < 65) {
|
|
|
|
if (_characters[speaker].flags & 1)
|
|
|
|
speaker = (int) _characters[speaker].name[0];
|
|
|
|
else
|
|
|
|
speaker = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_lastSpeechId == id && speaker == _lastSpeaker)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
_lastSpeechId = id;
|
|
|
|
_lastSpeaker = speaker;
|
|
|
|
|
|
|
|
Common::List<const char*> playList;
|
|
|
|
|
|
|
|
char pattern1[8];
|
|
|
|
char pattern2[5];
|
|
|
|
char file1[13];
|
|
|
|
char file2[13];
|
|
|
|
|
|
|
|
snprintf(pattern2, sizeof(pattern2), "%02d", id & 0x4000 ? 0 : _curTlkFile);
|
|
|
|
|
|
|
|
if (id & 0x4000) {
|
|
|
|
snprintf(pattern1, sizeof(pattern1), "%03X", id & 0x3fff);
|
|
|
|
} else if (id < 1000) {
|
2009-02-14 13:55:00 +00:00
|
|
|
snprintf(pattern1, sizeof(pattern1), "%03d", id);
|
2009-02-01 19:27:01 +00:00
|
|
|
} else {
|
|
|
|
snprintf(pattern1, sizeof(pattern1), "@%04d", id - 1000);
|
|
|
|
}
|
|
|
|
|
2009-02-15 12:11:27 +00:00
|
|
|
for (char i = 0; ; i++) {
|
|
|
|
char symbol = '0' + i;
|
|
|
|
snprintf(file1, sizeof(file1), "%s%c%c.%s", pattern1, (char)speaker, symbol, pattern2);
|
|
|
|
snprintf(file2, sizeof(file2), "%s%c%c.%s", pattern1, '_', symbol, pattern2);
|
2009-02-01 19:27:01 +00:00
|
|
|
if (_res->exists(file1)) {
|
|
|
|
char *f = new char[strlen(file1) + 1];
|
|
|
|
strcpy(f, file1);
|
|
|
|
playList.push_back(f);
|
|
|
|
} else if (_res->exists(file2)) {
|
|
|
|
char *f = new char[strlen(file2) + 1];
|
|
|
|
strcpy(f, file2);
|
|
|
|
playList.push_back(f);
|
|
|
|
} else {
|
2009-02-15 12:11:27 +00:00
|
|
|
break;
|
2009-02-01 19:27:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (playList.empty())
|
|
|
|
return false;
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
while (_sound->voiceIsPlaying(_activeVoiceFile)) {
|
2009-02-01 19:27:01 +00:00
|
|
|
update();
|
2009-02-16 17:17:15 +00:00
|
|
|
delay(_tickLength);
|
|
|
|
};
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
strcpy(_activeVoiceFile, *playList.begin());
|
2009-03-08 23:28:19 +00:00
|
|
|
_activeVoiceFileTotalTime = _sound->voicePlayFromList(playList);
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
for (Common::List<const char*>::iterator i = playList.begin(); i != playList.end(); i++)
|
|
|
|
delete []*i;
|
|
|
|
playList.clear();
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
_tim->_abortFlag = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int LoLEngine::snd_characterSpeaking() {
|
|
|
|
if (_sound->voiceIsPlaying(_activeVoiceFile))
|
|
|
|
return 2;
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
_lastSpeechId = _lastSpeaker = -1;
|
2009-03-08 23:28:19 +00:00
|
|
|
_activeVoiceFileTotalTime = 0;
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
return 1;
|
2009-01-19 23:35:27 +00:00
|
|
|
}
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
void LoLEngine::snd_stopSpeech(bool setFlag) {
|
2009-02-01 19:27:01 +00:00
|
|
|
if (!_sound->voiceIsPlaying(_activeVoiceFile))
|
2009-02-16 17:17:15 +00:00
|
|
|
return;
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
//_dlgTimer = 0;
|
2009-02-16 17:17:15 +00:00
|
|
|
_sound->voiceStop(_activeVoiceFile);
|
2009-03-08 23:28:19 +00:00
|
|
|
_activeVoiceFileTotalTime = 0;
|
2009-01-19 23:35:27 +00:00
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
if (setFlag)
|
|
|
|
_tim->_abortFlag = 1;
|
2009-01-19 23:35:27 +00:00
|
|
|
}
|
|
|
|
|
2009-01-18 17:04:24 +00:00
|
|
|
void LoLEngine::snd_playSoundEffect(int track, int volume) {
|
|
|
|
debugC(9, kDebugLevelMain | kDebugLevelSound, "LoLEngine::snd_playSoundEffect(%d, %d)", track, volume);
|
|
|
|
|
|
|
|
if (track == 1 && (_lastSfxTrack == -1 || _lastSfxTrack == 1))
|
|
|
|
return;
|
|
|
|
|
|
|
|
_lastSfxTrack = track;
|
|
|
|
|
|
|
|
int16 volIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2 + 1]);
|
|
|
|
|
|
|
|
if (volIndex > 0)
|
2009-02-23 20:17:53 +00:00
|
|
|
volume = (volIndex * volume) >> 8;
|
2009-01-18 17:04:24 +00:00
|
|
|
else
|
2009-02-23 20:17:53 +00:00
|
|
|
volume = -volIndex;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
// volume TODO
|
2009-03-03 22:32:39 +00:00
|
|
|
volume = 254 - volume;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
int16 vocIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2]);
|
|
|
|
if (vocIndex != -1) {
|
2009-02-23 20:17:53 +00:00
|
|
|
_sound->voicePlay(_ingameSoundList[vocIndex], volume & 0xff, true);
|
2009-01-18 17:04:24 +00:00
|
|
|
} else if (_flags.platform == Common::kPlatformPC) {
|
|
|
|
if (_sound->getSfxType() == Sound::kMidiMT32)
|
|
|
|
track = track < _ingameMT32SoundIndexSize ? _ingameMT32SoundIndex[track] - 1 : -1;
|
|
|
|
else if (_sound->getSfxType() == Sound::kMidiGM)
|
|
|
|
track = track < _ingameGMSoundIndexSize ? _ingameGMSoundIndex[track] - 1: -1;
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-02-14 00:51:07 +00:00
|
|
|
if (track == 168)
|
|
|
|
track = 167;
|
2009-01-18 17:04:24 +00:00
|
|
|
|
|
|
|
if (track != -1)
|
2009-02-23 20:17:53 +00:00
|
|
|
KyraEngine_v1::snd_playSoundEffect(track, volume);
|
2009-01-18 17:04:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-03-03 22:32:39 +00:00
|
|
|
void LoLEngine::snd_processEnvironmentalSoundEffect(int soundId, int block) {
|
|
|
|
if (!(_unkGameFlag & 1))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (_environmentSfx)
|
|
|
|
snd_playSoundEffect(_environmentSfx, _environmentSfxVol);
|
|
|
|
|
|
|
|
int dist = 0;
|
|
|
|
if (block) {
|
|
|
|
dist = getMonsterDistance(_currentBlock, block);
|
|
|
|
if (dist > _environmentSfxDistThreshold) {
|
|
|
|
_environmentSfx = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_environmentSfx = soundId;
|
|
|
|
_environmentSfxVol = (15 - ((block || dist < 2) ? dist : 0)) << 4;
|
|
|
|
|
|
|
|
if (block != _currentBlock) {
|
|
|
|
static const int8 blockShiftTable[] = { -32, -31, 1, 33, 32, 31, -1, -33 };
|
|
|
|
uint16 cbl = _currentBlock;
|
2009-03-06 22:53:08 +00:00
|
|
|
|
2009-03-03 22:32:39 +00:00
|
|
|
for (int i = 3; i > 0; i--) {
|
|
|
|
int dir = calcMonsterDirection(cbl & 0x1f, cbl >> 5, block & 0x1f, block >> 5);
|
|
|
|
cbl += blockShiftTable[dir];
|
|
|
|
if (cbl != block) {
|
|
|
|
if (testWallFlag(cbl, 0, 1))
|
|
|
|
_environmentSfxVol >>= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!soundId || _sceneUpdateRequired)
|
|
|
|
return;
|
|
|
|
|
|
|
|
snd_processEnvironmentalSoundEffect(0, 0);
|
|
|
|
}
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
void LoLEngine::snd_loadSoundFile(int track) {
|
2009-01-18 23:50:31 +00:00
|
|
|
if (_unkGameFlag & 2) {
|
|
|
|
char filename[13];
|
|
|
|
int t = (track - 250) * 3;
|
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
if (_curMusicFileIndex != _musicTrackMap[t] || _curMusicFileExt != (char)_musicTrackMap[t + 1]) {
|
|
|
|
snd_stopMusic();
|
2009-01-18 23:50:31 +00:00
|
|
|
snprintf(filename, sizeof(filename), "LORE%02d%c", _musicTrackMap[t], (char)_musicTrackMap[t + 1]);
|
|
|
|
_sound->loadSoundFile(filename);
|
2009-01-19 23:35:27 +00:00
|
|
|
_curMusicFileIndex = _musicTrackMap[t];
|
2009-01-18 23:50:31 +00:00
|
|
|
_curMusicFileExt = (char)_musicTrackMap[t + 1];
|
2009-01-19 23:35:27 +00:00
|
|
|
} else {
|
|
|
|
snd_stopMusic();
|
2009-01-18 23:50:31 +00:00
|
|
|
}
|
|
|
|
} else {
|
2009-01-19 23:35:27 +00:00
|
|
|
//XXX
|
|
|
|
}
|
|
|
|
}
|
2009-01-18 23:50:31 +00:00
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
int LoLEngine::snd_playTrack(int track) {
|
|
|
|
if (track == -1)
|
|
|
|
return _lastMusicTrack;
|
2009-02-14 13:55:00 +00:00
|
|
|
|
2009-01-19 23:35:27 +00:00
|
|
|
int res = _lastMusicTrack;
|
|
|
|
_lastMusicTrack = track;
|
|
|
|
|
|
|
|
if (_unkGameFlag & 2) {
|
|
|
|
snd_loadSoundFile(track);
|
|
|
|
int t = (track - 250) * 3;
|
|
|
|
_sound->playTrack(_musicTrackMap[t + 2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
int LoLEngine::snd_stopMusic() {
|
|
|
|
if (_unkGameFlag & 2) {
|
|
|
|
if (_sound->isPlaying()) {
|
|
|
|
_sound->beginFadeOut();
|
|
|
|
_system->delayMillis(3 * _tickLength);
|
|
|
|
}
|
|
|
|
|
|
|
|
_sound->haltTrack();
|
2009-01-18 23:50:31 +00:00
|
|
|
}
|
2009-01-19 23:35:27 +00:00
|
|
|
return snd_playTrack(-1);
|
2009-01-18 23:50:31 +00:00
|
|
|
}
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
bool LoLEngine::characterSays(int track, int charId, bool redraw) {
|
|
|
|
if (charId == 1) {
|
|
|
|
charId = _selectedCharacter;
|
2009-02-15 03:36:30 +00:00
|
|
|
} else {
|
2009-02-16 17:17:15 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2009-03-06 22:53:08 +00:00
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
bool r = snd_playCharacterSpeech(track, charId, 0);
|
|
|
|
|
|
|
|
if (r && redraw) {
|
|
|
|
updatePortraits();
|
|
|
|
_updateCharNum = charId;
|
2009-02-23 20:17:53 +00:00
|
|
|
_portraitSpeechAnimMode = 0;
|
2009-02-16 17:17:15 +00:00
|
|
|
_updateCharV3 = 1;
|
|
|
|
_fadeText = false;
|
|
|
|
updatePortraitSpeechAnim();
|
2009-02-15 03:36:30 +00:00
|
|
|
}
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
return r ? textEnabled() : 1;
|
2009-02-15 03:36:30 +00:00
|
|
|
}
|
|
|
|
|
2009-03-01 20:37:57 +00:00
|
|
|
int LoLEngine::playCharacterScriptChat(int charId, int mode, int unk1, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
|
2009-02-23 20:17:53 +00:00
|
|
|
int ch = 0;
|
|
|
|
bool skipAnim = false;
|
2009-03-06 22:53:08 +00:00
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
if ((charId == -1) || (!(charId & 0x70)))
|
|
|
|
charId = ch = (charId == 1) ? (_selectedCharacter ? _characters[_selectedCharacter].id : 0) : charId;
|
|
|
|
else
|
|
|
|
charId ^= 0x70;
|
|
|
|
|
|
|
|
updatePortraits();
|
|
|
|
|
|
|
|
if (charId < 0) {
|
|
|
|
charId = ch = (_rnd.getRandomNumber(0x7fff) * countActiveCharacters()) / 0x8000;
|
|
|
|
ch = _rnd.getRandomNumber(countActiveCharacters() - 1);
|
|
|
|
} else if (charId > 0) {
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
for (; i < 4; i++) {
|
|
|
|
if (_characters[i].id != charId || !(_characters[i].flags & 1))
|
|
|
|
continue;
|
|
|
|
if (charId == ch)
|
|
|
|
ch = i;
|
|
|
|
charId = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i == 4) {
|
|
|
|
if (charId == 8)
|
|
|
|
skipAnim = true;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!skipAnim) {
|
|
|
|
_updateCharNum = charId;
|
|
|
|
_portraitSpeechAnimMode = mode;
|
|
|
|
_updatePortraitSpeechAnimDuration = strlen(str) >> 1;
|
|
|
|
_updateCharV3 = unk1;
|
|
|
|
}
|
2009-03-06 22:53:08 +00:00
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
if (script)
|
|
|
|
snd_playCharacterSpeech(script->stack[script->sp + 2], ch, 0);
|
|
|
|
else if (paramList)
|
|
|
|
snd_playCharacterSpeech(paramList[1], ch, 0);
|
|
|
|
|
|
|
|
if (textEnabled()) {
|
|
|
|
if (mode == 0) {
|
|
|
|
_txt->printDialogueText(3, str, script, paramList, paramIndex);
|
|
|
|
|
|
|
|
} else if (mode == 1) {
|
|
|
|
_screen->setScreenDim(4);
|
|
|
|
_screen->clearDim(4);
|
|
|
|
_screen->modifyScreenDim(4, 16, 123, 23, 47);
|
|
|
|
_txt->printDialogueText(4, str, script, paramList, paramIndex);
|
|
|
|
_screen->modifyScreenDim(4, 11, 123, 28, 47);
|
|
|
|
|
2009-03-06 22:53:08 +00:00
|
|
|
} else if (mode == 2) {
|
2009-02-23 20:17:53 +00:00
|
|
|
_screen->setScreenDim(4);
|
|
|
|
_screen->clearDim(4);
|
|
|
|
_screen->modifyScreenDim(4, 9, 133, 30, 60);
|
|
|
|
_txt->printDialogueText(4, str, script, paramList, 3);
|
|
|
|
_screen->modifyScreenDim(4, 1, 133, 37, 60);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_fadeText = 0;
|
|
|
|
if (!skipAnim)
|
|
|
|
updatePortraitSpeechAnim();
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-03-01 14:45:30 +00:00
|
|
|
void LoLEngine::giveItemToMonster(MonsterInPlay *monster, uint16 item) {
|
2009-03-06 22:53:08 +00:00
|
|
|
uint16 *c = &monster->assignedItems;
|
2009-03-01 14:45:30 +00:00
|
|
|
while (*c)
|
|
|
|
c = &_itemsInPlay[*c].next;
|
|
|
|
*c = item;
|
|
|
|
_itemsInPlay[item].next = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const uint16 *LoLEngine::getCharacterOrMonsterStats(int id) {
|
|
|
|
return (id & 0x8000) ? (const uint16*)_monsters[id & 0x7fff].properties->pos : _characters[id].defaultModifiers;
|
|
|
|
}
|
|
|
|
|
2009-02-23 20:17:53 +00:00
|
|
|
void LoLEngine::delay(uint32 millis, bool cUpdate, bool isMainLoop) {
|
|
|
|
uint32 endTime = _system->getMillis() + millis;
|
|
|
|
while (endTime > _system->getMillis()) {
|
|
|
|
if (cUpdate)
|
|
|
|
update();
|
|
|
|
_system->delayMillis(4);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-03-03 22:32:39 +00:00
|
|
|
void LoLEngine::updateEnvironmentalSfx(int soundId) {
|
|
|
|
snd_processEnvironmentalSoundEffect(soundId, _currentBlock);
|
2009-02-23 20:17:53 +00:00
|
|
|
}
|
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
bool LoLEngine::notEnoughMagic(int charNum, int spellNum, int spellLevel) {
|
|
|
|
if (_spellProperties[spellNum].mpRequired[spellLevel] > _characters[charNum].magicPointsCur) {
|
|
|
|
if (characterSays(0x4043, _characters[charNum].id, true))
|
|
|
|
_txt->printMessage(6, getLangString(0x4043), _characters[charNum].name);
|
|
|
|
return true;
|
|
|
|
} else if (_spellProperties[spellNum + 1].unkArr[spellLevel] >= _characters[charNum].hitPointsCur) {
|
|
|
|
_txt->printMessage(2, getLangString(0x4179), _characters[charNum].name);
|
2009-03-06 22:53:08 +00:00
|
|
|
return true;
|
2009-02-16 17:17:15 +00:00
|
|
|
}
|
2009-02-15 03:36:30 +00:00
|
|
|
|
2009-02-16 17:17:15 +00:00
|
|
|
return false;
|
2009-02-15 03:36:30 +00:00
|
|
|
}
|
|
|
|
|
2008-07-31 10:47:15 +00:00
|
|
|
} // end of namespace Kyra
|
|
|
|
|
2009-03-04 11:53:25 +00:00
|
|
|
#endif // ENABLE_LOL
|
|
|
|
|