aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/kyra/gui_lol.cpp46
-rw-r--r--engines/kyra/items_lol.cpp28
-rw-r--r--engines/kyra/lol.cpp120
-rw-r--r--engines/kyra/lol.h100
-rw-r--r--engines/kyra/scene_lol.cpp392
-rw-r--r--engines/kyra/script_lol.cpp288
-rw-r--r--engines/kyra/script_tim.cpp12
-rw-r--r--engines/kyra/sprites_lol.cpp14
-rw-r--r--engines/kyra/staticres.cpp2
-rw-r--r--engines/kyra/text_lol.cpp2
-rw-r--r--engines/kyra/timer_lol.cpp4
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]);
}
}