mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-04 16:26:53 +00:00
LOL: - Level temp data now get stored in memory so you can now return to a level without everything being broken. Temp data isn't saved to disk. Since total memory requirement for storing this data won't exceed ~100kb I'd rather save memory in other places (like removing some screen page buffers)
- Implemented some more opcodes and fixed some bugs (You can now safely pick up coin pouches. The lamp seems to work fine, too). svn-id: r39719
This commit is contained in:
parent
97abfc9181
commit
8875fdcded
@ -56,6 +56,7 @@ void LoLEngine::gui_drawPlayField() {
|
||||
if (_gameFlags[15] & 0x800)
|
||||
resetLampStatus();
|
||||
|
||||
updateDrawPage2();
|
||||
gui_drawScene(2);
|
||||
|
||||
gui_drawAllCharPortraitsWithStats();
|
||||
@ -63,9 +64,8 @@ void LoLEngine::gui_drawPlayField() {
|
||||
gui_drawMoneyBox(_screen->_curPage);
|
||||
|
||||
_screen->setCurPage(cp);
|
||||
_screen->hideMouse();
|
||||
_screen->copyPage(2, 0);
|
||||
_screen->showMouse();
|
||||
updateDrawPage2();
|
||||
}
|
||||
|
||||
void LoLEngine::gui_drawScene(int pageNum) {
|
||||
@ -74,7 +74,7 @@ void LoLEngine::gui_drawScene(int pageNum) {
|
||||
}
|
||||
|
||||
void LoLEngine::gui_drawInventory() {
|
||||
if (!_currentControlMode || !_hideInventory) {
|
||||
if (!_currentControlMode || !_needSceneRestore) {
|
||||
for (int i = 0; i < 9; i++)
|
||||
gui_drawInventoryItem(i);
|
||||
}
|
||||
@ -603,7 +603,7 @@ void LoLEngine::gui_toggleButtonDisplayMode(int shapeIndex, int mode) {
|
||||
if (shapeIndex == 78 && !(_gameFlags[15] & 0x1000))
|
||||
return;
|
||||
|
||||
if (_currentControlMode && _hideInventory)
|
||||
if (_currentControlMode && _needSceneRestore)
|
||||
return;
|
||||
|
||||
if (mode == 0)
|
||||
@ -1198,7 +1198,7 @@ int LoLEngine::clickedExitCharInventory(Button *button) {
|
||||
_screen->copyBlockToPage(2, 0, 0, 320, 200, _pageBuffer2);
|
||||
|
||||
_lastCharInventory = -1;
|
||||
updateSceneWindow();
|
||||
updateDrawPage2();
|
||||
enableSysTimer(2);
|
||||
|
||||
return 1;
|
||||
@ -1356,11 +1356,11 @@ int LoLEngine::clickedWall(Button *button) {
|
||||
break;
|
||||
|
||||
case 2:
|
||||
res = clickedLever(block, dir);
|
||||
res = clickedLeverOn(block, dir);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
res = clicked3(block, dir);
|
||||
res = clickedLeverOff(block, dir);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
@ -1454,11 +1454,36 @@ int LoLEngine::clickedAutomap(Button *button) {
|
||||
// displayAutopmap();
|
||||
|
||||
gui_drawPlayField();
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LoLEngine::clickedLamp(Button *button) {
|
||||
if (!(_gameFlags[15] & 0x800))
|
||||
return 0;
|
||||
|
||||
if (_itemsInPlay[_itemInHand].itemPropertyIndex == 248) {
|
||||
if (_lampOilStatus >= 100) {
|
||||
_txt->printMessage(0, getLangString(0x4061));
|
||||
return 1;
|
||||
}
|
||||
|
||||
_txt->printMessage(0, getLangString(0x4062));
|
||||
|
||||
deleteItem(_itemInHand);
|
||||
snd_playSoundEffect(181, -1);
|
||||
setHandItem(0);
|
||||
|
||||
_lampOilStatus += 100;
|
||||
|
||||
} else {
|
||||
uint16 s = (_lampOilStatus >= 100) ? 0x4060 : ((!_lampOilStatus) ? 0x405c : (_lampOilStatus / 33) + 0x405d);
|
||||
_txt->printMessage(0, getLangString(0x405b), getLangString(s));
|
||||
}
|
||||
|
||||
if (_brightness)
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy
|
||||
_spellProperties = 0;
|
||||
_updateFlags = 0;
|
||||
_selectedSpell = 0;
|
||||
_updateCharNum = _updatePortraitSpeechAnimDuration = _portraitSpeechAnimMode = _updateCharV3 = _textColourFlag = _hideInventory = 0;
|
||||
_updateCharNum = _updatePortraitSpeechAnimDuration = _portraitSpeechAnimMode = _updateCharV3 = _textColourFlag = _needSceneRestore = 0;
|
||||
_fadeText = false;
|
||||
_palUpdateTimer = _updatePortraitNext = 0;
|
||||
_lampStatusTimer = 0xffffffff;
|
||||
@ -122,7 +122,6 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy
|
||||
_currentBlock = 0;
|
||||
memset(_visibleBlockIndex, 0, sizeof(_visibleBlockIndex));
|
||||
|
||||
_scrollSceneBuffer = 0;
|
||||
_smoothScrollModeNormal = 1;
|
||||
_wllVmpMap = _wllBuffer3 = _wllBuffer4 = _wllWallFlags = 0;
|
||||
_wllShapeMap = 0;
|
||||
@ -145,7 +144,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy
|
||||
_sceneWindowBuffer = 0;
|
||||
memset(_doorShapes, 0, sizeof(_doorShapes));
|
||||
|
||||
_lampOilStatus = _brightness = _lampStatusUnk = 0;
|
||||
_lampEffect = _brightness = _lampOilStatus = 0;
|
||||
_lampStatusSuspended = false;
|
||||
_tempBuffer5120 = 0;
|
||||
_flyingObjects = 0;
|
||||
@ -212,6 +211,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy
|
||||
_smoothScrollingEnabled = true;
|
||||
_floatingCursorsEnabled = false;
|
||||
|
||||
memset (_lvlTempData, 0, sizeof(LevelTempData) * 28);
|
||||
_unkIceSHpFlag = 0;
|
||||
}
|
||||
|
||||
@ -307,7 +307,6 @@ LoLEngine::~LoLEngine() {
|
||||
delete[] _monsters;
|
||||
delete[] _levelBlockProperties;
|
||||
delete[] _monsterProperties;
|
||||
delete[] _scrollSceneBuffer;
|
||||
delete[] _scriptAssignedLevelShape;
|
||||
|
||||
delete[] _levelFileData;
|
||||
@ -337,6 +336,16 @@ LoLEngine::~LoLEngine() {
|
||||
delete[] _ingameSoundList[i];
|
||||
delete[] _ingameSoundList;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 28; i++) {
|
||||
if (_lvlTempData[i]) {
|
||||
delete[] _lvlTempData[i]->wallsXorData;
|
||||
delete[] _lvlTempData[i]->flags;
|
||||
delete[] _lvlTempData[i]->monsters;
|
||||
delete[] _lvlTempData[i]->flyingObjects;
|
||||
delete _lvlTempData[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Screen *LoLEngine::screen() {
|
||||
@ -413,8 +422,6 @@ Common::Error LoLEngine::init() {
|
||||
_monsterProperties = new MonsterProperty[5];
|
||||
memset(_monsterProperties, 0, 5 * sizeof(MonsterProperty));
|
||||
|
||||
_scrollSceneBuffer = new uint8[21120];
|
||||
|
||||
_vcnExpTable = new uint8[128];
|
||||
for (int i = 0; i < 128; i++)
|
||||
_vcnExpTable[i] = i & 0x0f;
|
||||
@ -443,7 +450,7 @@ Common::Error LoLEngine::init() {
|
||||
memset(_monsterShapesEx, 0, 576 * sizeof(uint8*));
|
||||
memset(&_scriptData, 0, sizeof(EMCData));
|
||||
|
||||
_levelFlagUnk = 0;
|
||||
_hasTempDataFlags = 0;
|
||||
_unkCharNum = -1;
|
||||
|
||||
return Common::kNoError;
|
||||
@ -1020,7 +1027,7 @@ void LoLEngine::initTextFading(int textType, int clearField) {
|
||||
return;
|
||||
|
||||
updatePortraits();
|
||||
if (_hideInventory)
|
||||
if (_needSceneRestore)
|
||||
_screen->setScreenDim(_txt->clearDim(3));
|
||||
|
||||
_fadeText = false;
|
||||
@ -1242,11 +1249,11 @@ void LoLEngine::restoreAfterSceneWindowDialogue(int redraw) {
|
||||
if (_screen->_fadeFlag != 2)
|
||||
_screen->fadeClearSceneWindow(10);
|
||||
gui_drawPlayField();
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
_screen->_fadeFlag = 0;
|
||||
}
|
||||
|
||||
_hideInventory = 0;
|
||||
_needSceneRestore = 0;
|
||||
enableSysTimer(2);
|
||||
}
|
||||
|
||||
@ -1314,7 +1321,7 @@ void LoLEngine::restoreAfterDialogueSequence(int controlMode) {
|
||||
}
|
||||
|
||||
void LoLEngine::resetPortraitsAndDisableSysTimer() {
|
||||
_hideInventory = 1;
|
||||
_needSceneRestore = 1;
|
||||
if (!textEnabled() || (!(_currentControlMode & 2)))
|
||||
timerUpdatePortraitAnimations(1);
|
||||
|
||||
@ -1328,7 +1335,7 @@ void LoLEngine::fadeText() {
|
||||
if (_screen->fadeColour(192, 252, _system->getMillis() - _palUpdateTimer, 60 * _tickLength))
|
||||
return;
|
||||
|
||||
if (_hideInventory)
|
||||
if (_needSceneRestore)
|
||||
return;
|
||||
|
||||
_screen->setScreenDim(_txt->clearDim(3));
|
||||
@ -1533,7 +1540,8 @@ void LoLEngine::snd_playSoundEffect(int track, int volume) {
|
||||
volume = 254 - volume;
|
||||
|
||||
int16 vocIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2]);
|
||||
if (vocIndex != -1) {
|
||||
if (vocIndex != -1
|
||||
) {
|
||||
_sound->voicePlay(_ingameSoundList[vocIndex], volume & 0xff, true);
|
||||
} else if (_flags.platform == Common::kPlatformPC) {
|
||||
if (_sound->getSfxType() == Sound::kMidiMT32)
|
||||
@ -1635,7 +1643,7 @@ int LoLEngine::snd_stopMusic() {
|
||||
return snd_playTrack(-1);
|
||||
}
|
||||
|
||||
bool LoLEngine::characterSays(int track, int charId, bool redraw) {
|
||||
int LoLEngine::characterSays(int track, int charId, bool redraw) {
|
||||
if (charId == 1) {
|
||||
charId = _selectedCharacter;
|
||||
} else {
|
||||
@ -1648,7 +1656,7 @@ bool LoLEngine::characterSays(int track, int charId, bool redraw) {
|
||||
}
|
||||
|
||||
if (i == 4)
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool r = snd_playCharacterSpeech(track, charId, 0);
|
||||
@ -1662,7 +1670,7 @@ bool LoLEngine::characterSays(int track, int charId, bool redraw) {
|
||||
updatePortraitSpeechAnim();
|
||||
}
|
||||
|
||||
return r ? textEnabled() : 1;
|
||||
return r ? (textEnabled() ? 1 : 0) : 1;
|
||||
}
|
||||
|
||||
int LoLEngine::playCharacterScriptChat(int charId, int mode, int unk1, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
|
||||
@ -1907,6 +1915,50 @@ uint16 LoLEngine::getClosestPartyMember(int x, int y) {
|
||||
return id;
|
||||
}
|
||||
|
||||
void LoLEngine::generateTempData() {
|
||||
int l = _currentLevel - 1;
|
||||
if (_lvlTempData[l]) {
|
||||
delete[] _lvlTempData[l]->wallsXorData;
|
||||
delete[] _lvlTempData[l]->flags;
|
||||
delete[] _lvlTempData[l]->monsters;
|
||||
delete[] _lvlTempData[l]->flyingObjects;
|
||||
delete _lvlTempData[l];
|
||||
}
|
||||
|
||||
_lvlTempData[l] = new LevelTempData;
|
||||
|
||||
_lvlTempData[l]->wallsXorData = new uint8[4096];
|
||||
_lvlTempData[l]->flags = new uint8[1024];
|
||||
_lvlTempData[l]->monsters = new MonsterInPlay[30];
|
||||
_lvlTempData[l]->flyingObjects = new FlyingObject[8];
|
||||
|
||||
char filename[13];
|
||||
snprintf(filename, sizeof(filename), "LEVEL%d.CMZ", _currentLevel);
|
||||
|
||||
_screen->loadBitmap(filename, 3, 3, 0);
|
||||
const uint8 *p = _screen->getCPagePtr(2);
|
||||
uint16 len = READ_LE_UINT16(p + 4);
|
||||
p += 6;
|
||||
|
||||
memset(_lvlTempData[l]->wallsXorData, 0, 4096);
|
||||
memset(_lvlTempData[l]->flags, 0, 1024);
|
||||
uint8 *d = _lvlTempData[l]->wallsXorData;
|
||||
uint8 *df = _lvlTempData[l]->flags;
|
||||
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
for (int ii = 0; ii < 4; ii++)
|
||||
*d++ = p[i * len + ii] ^ _levelBlockProperties[i].walls[ii];
|
||||
*df++ = _levelBlockProperties[i].flags;
|
||||
}
|
||||
|
||||
memcpy(_lvlTempData[l]->monsters, _monsters, sizeof(MonsterInPlay) * 30);
|
||||
memcpy(_lvlTempData[l]->flyingObjects, _flyingObjects, sizeof(FlyingObject) * 8);
|
||||
|
||||
_lvlTempData[l]->monsterDifficulty =_monsterDifficulty;
|
||||
|
||||
_hasTempDataFlags |= (1 << l);
|
||||
}
|
||||
|
||||
} // end of namespace Kyra
|
||||
|
||||
#endif // ENABLE_LOL
|
||||
|
@ -235,6 +235,14 @@ struct FlyingObjectShape {
|
||||
uint8 flipFlags;
|
||||
};
|
||||
|
||||
struct LevelTempData {
|
||||
uint8 *wallsXorData;
|
||||
uint8 *flags;
|
||||
MonsterInPlay *monsters;
|
||||
FlyingObject *flyingObjects;
|
||||
uint8 monsterDifficulty;
|
||||
};
|
||||
|
||||
class LoLEngine : public KyraEngine_v1 {
|
||||
friend class GUI_LoL;
|
||||
friend class TextDisplayer_LoL;
|
||||
@ -509,7 +517,7 @@ private:
|
||||
int _buttonList8Size;
|
||||
|
||||
// text
|
||||
bool characterSays(int track, int charId, bool redraw);
|
||||
int characterSays(int track, int charId, bool redraw);
|
||||
int playCharacterScriptChat(int charId, int mode, int unk1, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
|
||||
|
||||
TextDisplayer_LoL *_txt;
|
||||
@ -612,6 +620,7 @@ private:
|
||||
int olol_stopCharacterSpeech(EMCState *script);
|
||||
int olol_setPaletteBrightness(EMCState *script);
|
||||
int olol_printMessage(EMCState *script);
|
||||
int olol_deleteLevelItem(EMCState *script);
|
||||
int olol_playDialogueTalkText(EMCState *script);
|
||||
int olol_checkMonsterTypeHostility(EMCState *script);
|
||||
int olol_setNextFunc(EMCState *script);
|
||||
@ -630,7 +639,8 @@ private:
|
||||
int olol_resetPortraitsAndDisableSysTimer(EMCState *script);
|
||||
int olol_enableSysTimer(EMCState *script);
|
||||
int olol_disableControls(EMCState *script);
|
||||
int olol_enableControls(EMCState *script);
|
||||
int olol_enableControls(EMCState *script);
|
||||
int olol_characterSays(EMCState *script);
|
||||
int olol_queueSpeech(EMCState *script);
|
||||
int olol_getItemPrice(EMCState *script);
|
||||
int olol_getLanguage(EMCState *script);
|
||||
@ -745,12 +755,12 @@ private:
|
||||
int _updateCharV3;
|
||||
int _textColourFlag;
|
||||
bool _fadeText;
|
||||
int _hideInventory;
|
||||
int _needSceneRestore;
|
||||
uint32 _palUpdateTimer;
|
||||
uint32 _updatePortraitNext;
|
||||
|
||||
int _loadLevelFlag;
|
||||
int _levelFlagUnk;
|
||||
int _hasTempDataFlags;
|
||||
int _unkCharNum;
|
||||
int _charStatsTemp[5];
|
||||
|
||||
@ -773,9 +783,9 @@ private:
|
||||
void setLampMode(bool lampOn);
|
||||
void updateLampStatus();
|
||||
|
||||
int _lampOilStatus;
|
||||
int _lampEffect;
|
||||
int _brightness;
|
||||
int _lampStatusUnk;
|
||||
int _lampOilStatus;
|
||||
uint32 _lampStatusTimer;
|
||||
bool _lampStatusSuspended;
|
||||
|
||||
@ -786,8 +796,8 @@ private:
|
||||
void assignBlockObject(uint16 *cmzItemIndex, uint16 item);
|
||||
int assignLevelShapes(int index);
|
||||
uint8 *getLevelShapes(int index);
|
||||
void loadLevelCmzFile(int index);
|
||||
void loadCMZ_Sub(int index1, int index2);
|
||||
void restoreBlockTempData(int index);
|
||||
void restoreTempDataAdjustMonsterStrength(int index);
|
||||
void loadCmzFile(const char *file);
|
||||
void loadLevelShpDat(const char *shpFile, const char *datFile, bool flag);
|
||||
void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile);
|
||||
@ -815,7 +825,7 @@ private:
|
||||
void drawBlockEffects(int index, int type);
|
||||
void drawScriptShapes(int pageNum);
|
||||
void setWallType(int block, int wall, int val);
|
||||
void updateSceneWindow();
|
||||
void updateDrawPage2();
|
||||
|
||||
void prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag);
|
||||
int restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode);
|
||||
@ -837,8 +847,8 @@ private:
|
||||
void calcCoordinatesAddDirectionOffset(int16 &x, int16 &y, int direction);
|
||||
|
||||
int clickedWallShape(uint16 block, uint16 direction);
|
||||
int clickedLever(uint16 block, uint16 direction);
|
||||
int clicked3(uint16 block, uint16 direction);
|
||||
int clickedLeverOn(uint16 block, uint16 direction);
|
||||
int clickedLeverOff(uint16 block, uint16 direction);
|
||||
int clickedWallOnlyScript(uint16 block);
|
||||
int clickedDoorSwitch(uint16 block, uint16 direction);
|
||||
int clicked6(uint16 block, uint16 direction);
|
||||
@ -846,7 +856,7 @@ private:
|
||||
bool clickedShape(int shapeIndex);
|
||||
void processDoorSwitch(uint16 block, int unk);
|
||||
void openCloseDoor(uint16 block, int openClose);
|
||||
void resetDoors();
|
||||
void completeDoorOperations();
|
||||
|
||||
void movePartySmoothScrollBlocked(int speed);
|
||||
void movePartySmoothScrollUp(int speed);
|
||||
@ -862,7 +872,6 @@ private:
|
||||
OpenDoorState _openDoorState[3];
|
||||
int _emcDoorState;
|
||||
|
||||
uint8 *_scrollSceneBuffer;
|
||||
uint32 _smoothScrollTimer;
|
||||
int _smoothScrollModeNormal;
|
||||
|
||||
@ -1158,6 +1167,9 @@ private:
|
||||
// save
|
||||
Common::Error loadGameState(int slot) { return Common::kNoError; }
|
||||
Common::Error saveGameState(int slot, const char *saveName, const Graphics::Surface *thumbnail) { return Common::kNoError; }
|
||||
|
||||
void generateTempData();
|
||||
LevelTempData *_lvlTempData[28];
|
||||
};
|
||||
|
||||
} // end of namespace Kyra
|
||||
|
@ -73,12 +73,12 @@ void LoLEngine::loadLevel(int index) {
|
||||
char filename[13];
|
||||
snprintf(filename, sizeof(filename), "LEVEL%d.INI", index);
|
||||
|
||||
int f = _levelFlagUnk & (1 << (index - 1));
|
||||
int f = _hasTempDataFlags & (1 << (index - 1));
|
||||
|
||||
runInitScript(filename, f ? 0 : 1);
|
||||
|
||||
if (f)
|
||||
loadLevelCmzFile(index);
|
||||
restoreBlockTempData(index);
|
||||
|
||||
snprintf(filename, sizeof(filename), "LEVEL%d.INF", index);
|
||||
runInfScript(filename);
|
||||
@ -94,7 +94,7 @@ void LoLEngine::loadLevel(int index) {
|
||||
|
||||
gui_drawPlayField();
|
||||
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
setMouseCursorToItemInHand();
|
||||
|
||||
snd_playTrack(_curMusicTheme);
|
||||
@ -232,13 +232,12 @@ uint8 *LoLEngine::getLevelShapes(int shapeIndex) {
|
||||
return res;
|
||||
}
|
||||
|
||||
void LoLEngine::loadLevelCmzFile(int index) {
|
||||
//char filename[13];
|
||||
//snprintf(filename, sizeof(filename), "_LEVEL%d.TMP", index);
|
||||
// TODO ???
|
||||
void LoLEngine::restoreBlockTempData(int index) {
|
||||
memset(_tempBuffer5120, 0, 5120);
|
||||
uint16 tmpLvlVal = 0;
|
||||
int l = index - 1;
|
||||
|
||||
memcpy(_monsters, _lvlTempData[l]->monsters, sizeof(MonsterInPlay) * 30);
|
||||
memcpy(_flyingObjects, _lvlTempData[l]->flyingObjects, sizeof(FlyingObject) * 8);
|
||||
|
||||
char filename[13];
|
||||
snprintf(filename, sizeof(filename), "LEVEL%d.CMZ", index);
|
||||
@ -246,25 +245,19 @@ void LoLEngine::loadLevelCmzFile(int index) {
|
||||
_screen->loadBitmap(filename, 3, 3, 0);
|
||||
const uint8 *p = _screen->getCPagePtr(2);
|
||||
uint16 len = READ_LE_UINT16(p + 4);
|
||||
|
||||
uint8 *cmzdata = new uint8[0x1000];
|
||||
|
||||
for (int i = 0; i < 1024; i++)
|
||||
memcpy(&cmzdata[i << 2], &p[i * len + 6], 4);
|
||||
p += 6;
|
||||
|
||||
memset(_levelBlockProperties, 0, 1024 * sizeof(LevelBlockProperty));
|
||||
|
||||
uint8 *c = cmzdata;
|
||||
uint8 *t = _tempBuffer5120;
|
||||
uint8 *t = _lvlTempData[l]->wallsXorData;
|
||||
uint8 *t2 = _lvlTempData[l]->flags;
|
||||
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
for (int ii = 0; ii < 4; ii++)
|
||||
_levelBlockProperties[i].walls[ii] = *c++ ^ *t++;
|
||||
_levelBlockProperties[i].walls[ii] = p[i * len + ii] ^ *t++;
|
||||
_levelBlockProperties[i].flags = *t2++;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 1024; i++)
|
||||
_levelBlockProperties[i].flags = *t++;
|
||||
|
||||
for (int i = 0; i < 30; i++) {
|
||||
if (_monsters[i].blockPropertyIndex) {
|
||||
_monsters[i].blockPropertyIndex = 0;
|
||||
@ -273,24 +266,21 @@ void LoLEngine::loadLevelCmzFile(int index) {
|
||||
}
|
||||
}
|
||||
|
||||
loadCMZ_Sub(tmpLvlVal, _monsterDifficulty);
|
||||
|
||||
delete[] cmzdata;
|
||||
restoreTempDataAdjustMonsterStrength(l);
|
||||
}
|
||||
|
||||
void LoLEngine::loadCMZ_Sub(int index1, int index2) {
|
||||
static const int table[] = { 0x66, 0x100, 0x180, 0x100, 0x100, 0xC0, 0x140, 0x100, 0x80, 0x80, 0x100, 0x100 };
|
||||
int val = (table[index2] << 8) / table[index1];
|
||||
void LoLEngine::restoreTempDataAdjustMonsterStrength(int index) {
|
||||
if (_lvlTempData[index]->monsterDifficulty == _monsterDifficulty)
|
||||
return;
|
||||
|
||||
//int r = 0;
|
||||
uint16 d = (_monsterModifiers[_lvlTempData[index]->monsterDifficulty] << 8) / _monsterModifiers[_monsterDifficulty];
|
||||
|
||||
for (int i = 0; i < 30; i++) {
|
||||
if (_monsters[i].mode >= 14 || _monsters[i].blockPropertyIndex == 0 || _monsters[i].might <= 0)
|
||||
continue;
|
||||
|
||||
int t = (val * _monsters[i].might) >> 8;
|
||||
_monsters[i].might = t;
|
||||
if (index2 < index1)
|
||||
_monsters[i].might = (d * _monsters[i].might) >> 8;
|
||||
if (_monsterDifficulty < _lvlTempData[index]->monsterDifficulty)
|
||||
_monsters[i].might++;
|
||||
if (_monsters[i].might == 0)
|
||||
_monsters[i].might = 1;
|
||||
@ -452,7 +442,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight
|
||||
_screen->getLevelOverlay(7)[i] = i & 0xff;
|
||||
|
||||
_loadSuppFilesFlag = 0;
|
||||
generateBrightnessPalette(_screen->_currentPalette, _screen->getPalette(1), _brightness, _lampOilStatus);
|
||||
generateBrightnessPalette(_screen->_currentPalette, _screen->getPalette(1), _brightness, _lampEffect);
|
||||
|
||||
char tname[13];
|
||||
snprintf(tname, sizeof(tname), "LEVEL%.02d.TLC", _currentLevel);
|
||||
@ -535,7 +525,7 @@ bool LoLEngine::testWallInvisibility(int block, int direction) {
|
||||
|
||||
void LoLEngine::resetLampStatus() {
|
||||
_gameFlags[15] |= 0x400;
|
||||
_lampOilStatus = 255;
|
||||
_lampEffect = 255;
|
||||
updateLampStatus();
|
||||
}
|
||||
|
||||
@ -545,7 +535,7 @@ void LoLEngine::setLampMode(bool lampOn) {
|
||||
return;
|
||||
|
||||
_screen->drawShape(0, _gameShapes[43], 291, 56, 0, 0);
|
||||
_lampOilStatus = 8;
|
||||
_lampEffect = 8;
|
||||
}
|
||||
|
||||
void LoLEngine::updateLampStatus() {
|
||||
@ -555,34 +545,34 @@ void LoLEngine::updateLampStatus() {
|
||||
if ((_updateFlags & 4) || !(_gameFlags[15] & 0x800))
|
||||
return;
|
||||
|
||||
if (!_brightness || !_lampStatusUnk) {
|
||||
if (!_brightness || !_lampOilStatus) {
|
||||
newLampOilStatus = 8;
|
||||
if (newLampOilStatus != _lampOilStatus && _screen->_fadeFlag == 0)
|
||||
setPaletteBrightness(_screen->_currentPalette, _lampOilStatus, newLampOilStatus);
|
||||
if (newLampOilStatus != _lampEffect && _screen->_fadeFlag == 0)
|
||||
setPaletteBrightness(_screen->_currentPalette, _lampEffect, newLampOilStatus);
|
||||
} else {
|
||||
tmp2 = (_lampStatusUnk < 100) ? _lampStatusUnk : 100;
|
||||
tmp2 = (_lampOilStatus < 100) ? _lampOilStatus : 100;
|
||||
newLampOilStatus = (3 - (tmp2 - 1) / 25) << 1;
|
||||
|
||||
if (_lampOilStatus == 255) {
|
||||
if (_lampEffect == 255) {
|
||||
if (_screen->_fadeFlag == 0)
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, newLampOilStatus);
|
||||
_lampStatusTimer = _system->getMillis() + (10 + _rnd.getRandomNumberRng(1, 30)) * _tickLength;
|
||||
} else {
|
||||
if ((_lampOilStatus & 0xfe) == (newLampOilStatus & 0xfe)) {
|
||||
if ((_lampEffect & 0xfe) == (newLampOilStatus & 0xfe)) {
|
||||
if (_system->getMillis() <= _lampStatusTimer) {
|
||||
newLampOilStatus = _lampOilStatus;
|
||||
newLampOilStatus = _lampEffect;
|
||||
} else {
|
||||
newLampOilStatus = _lampOilStatus ^ 1;
|
||||
newLampOilStatus = _lampEffect ^ 1;
|
||||
_lampStatusTimer = _system->getMillis() + (10 + _rnd.getRandomNumberRng(1, 30)) * _tickLength;
|
||||
}
|
||||
} else {
|
||||
if (_screen->_fadeFlag == 0)
|
||||
setPaletteBrightness(_screen->_currentPalette, _lampOilStatus, newLampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _lampEffect, newLampOilStatus);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newLampOilStatus == _lampOilStatus)
|
||||
if (newLampOilStatus == _lampEffect)
|
||||
return;
|
||||
|
||||
_screen->hideMouse();
|
||||
@ -590,7 +580,7 @@ void LoLEngine::updateLampStatus() {
|
||||
_screen->drawShape(_screen->_curPage, _gameShapes[35 + newLampOilStatus], 291, 56, 0, 0);
|
||||
_screen->showMouse();
|
||||
|
||||
_lampOilStatus = newLampOilStatus;
|
||||
_lampEffect = newLampOilStatus;
|
||||
}
|
||||
|
||||
void LoLEngine::updateCompass() {
|
||||
@ -739,11 +729,32 @@ int LoLEngine::clickedWallShape(uint16 block, uint16 direction) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LoLEngine::clickedLever(uint16 block, uint16 direction) {
|
||||
int LoLEngine::clickedLeverOn(uint16 block, uint16 direction) {
|
||||
uint8 v = _wllShapeMap[_levelBlockProperties[block].walls[direction]];
|
||||
if (!clickedShape(v))
|
||||
return 0;
|
||||
|
||||
_levelBlockProperties[block].walls[direction]++;
|
||||
_sceneUpdateRequired = true;
|
||||
|
||||
snd_playSoundEffect(30, -1);
|
||||
|
||||
runLevelScript(block, 0x40);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LoLEngine::clicked3(uint16 block, uint16 direction) {
|
||||
int LoLEngine::clickedLeverOff(uint16 block, uint16 direction) {
|
||||
uint8 v = _wllShapeMap[_levelBlockProperties[block].walls[direction]];
|
||||
if (!clickedShape(v))
|
||||
return 0;
|
||||
|
||||
_levelBlockProperties[block].walls[direction]--;
|
||||
_sceneUpdateRequired = true;
|
||||
|
||||
snd_playSoundEffect(29, -1);
|
||||
|
||||
runLevelScript(block, 0x40);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -869,7 +880,7 @@ void LoLEngine::openCloseDoor(uint16 block, int openClose) {
|
||||
}
|
||||
}
|
||||
|
||||
void LoLEngine::resetDoors() {
|
||||
void LoLEngine::completeDoorOperations() {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (!_openDoorState[i].block)
|
||||
continue;
|
||||
@ -886,7 +897,7 @@ void LoLEngine::resetDoors() {
|
||||
}
|
||||
|
||||
void LoLEngine::movePartySmoothScrollBlocked(int speed) {
|
||||
if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _hideInventory))
|
||||
if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _needSceneRestore))
|
||||
return;
|
||||
|
||||
_screen->backupSceneWindow(_sceneDrawPage2 == 2 ? 2 : 6, 6);
|
||||
@ -920,11 +931,11 @@ void LoLEngine::movePartySmoothScrollBlocked(int speed) {
|
||||
_screen->updateScreen();
|
||||
}
|
||||
|
||||
updateSceneWindow();
|
||||
updateDrawPage2();
|
||||
}
|
||||
|
||||
void LoLEngine::movePartySmoothScrollUp(int speed) {
|
||||
if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _hideInventory))
|
||||
if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _needSceneRestore))
|
||||
return;
|
||||
|
||||
int d = 0;
|
||||
@ -932,12 +943,12 @@ void LoLEngine::movePartySmoothScrollUp(int speed) {
|
||||
if (_sceneDrawPage2 == 2) {
|
||||
d = smoothScrollDrawSpecialShape(6);
|
||||
gui_drawScene(6);
|
||||
_screen->copyRegionToBuffer(6, 112, 0, 176, 120, _scrollSceneBuffer);
|
||||
_screen->backupSceneWindow(6, 12);
|
||||
_screen->backupSceneWindow(2, 6);
|
||||
} else {
|
||||
d = smoothScrollDrawSpecialShape(2);
|
||||
gui_drawScene(2);
|
||||
_screen->copyRegionToBuffer(2, 112, 0, 176, 120, _scrollSceneBuffer);
|
||||
_screen->backupSceneWindow(2, 12);
|
||||
_screen->backupSceneWindow(6, 6);
|
||||
}
|
||||
|
||||
@ -961,11 +972,11 @@ void LoLEngine::movePartySmoothScrollUp(int speed) {
|
||||
// unk(_tempBuffer5120, _scrollSceneBuffer);
|
||||
|
||||
if (_sceneDefaultUpdate != 2) {
|
||||
_screen->copyBlockToPage(0, 112, 0, 176, 120, _scrollSceneBuffer);
|
||||
_screen->restoreSceneWindow(12, 0);
|
||||
_screen->updateScreen();
|
||||
}
|
||||
|
||||
updateSceneWindow();
|
||||
updateDrawPage2();
|
||||
}
|
||||
|
||||
void LoLEngine::movePartySmoothScrollDown(int speed) {
|
||||
@ -1000,7 +1011,7 @@ void LoLEngine::movePartySmoothScrollDown(int speed) {
|
||||
_screen->updateScreen();
|
||||
}
|
||||
|
||||
updateSceneWindow();
|
||||
updateDrawPage2();
|
||||
}
|
||||
|
||||
void LoLEngine::movePartySmoothScrollLeft(int speed) {
|
||||
@ -1173,12 +1184,12 @@ void LoLEngine::updateAutoMap(int block) {
|
||||
void LoLEngine::drawScene(int pageNum) {
|
||||
if (pageNum && pageNum != _sceneDrawPage1) {
|
||||
SWAP(_sceneDrawPage1, _sceneDrawPage2);
|
||||
updateSceneWindow();
|
||||
updateDrawPage2();
|
||||
}
|
||||
|
||||
if (pageNum && pageNum != _sceneDrawPage1) {
|
||||
SWAP(_sceneDrawPage1, _sceneDrawPage2);
|
||||
updateSceneWindow();
|
||||
updateDrawPage2();
|
||||
}
|
||||
|
||||
generateBlockDrawingBuffer();
|
||||
@ -1215,10 +1226,8 @@ void LoLEngine::setWallType(int block, int wall, int val) {
|
||||
checkSceneUpdateNeed(block);
|
||||
}
|
||||
|
||||
void LoLEngine::updateSceneWindow() {
|
||||
_screen->hideMouse();
|
||||
void LoLEngine::updateDrawPage2() {
|
||||
_screen->copyRegion(112, 0, 112, 0, 176, 120, 0, _sceneDrawPage2, Screen::CR_NO_P_CHECK);
|
||||
_screen->showMouse();
|
||||
}
|
||||
|
||||
void LoLEngine::prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag) {
|
||||
@ -1264,10 +1273,10 @@ void LoLEngine::prepareSpecialScene(int fieldType, int hasDialogue, int suspendG
|
||||
}
|
||||
|
||||
int LoLEngine::restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode) {
|
||||
if (!_hideInventory)
|
||||
if (!_needSceneRestore)
|
||||
return 0;
|
||||
|
||||
_hideInventory = 0;
|
||||
_needSceneRestore = 0;
|
||||
enableSysTimer(2);
|
||||
|
||||
if (_dialogueField)
|
||||
@ -1308,7 +1317,7 @@ int LoLEngine::restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int r
|
||||
if (redrawPlayField)
|
||||
gui_drawPlayField();
|
||||
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
|
||||
} else {
|
||||
_currentControlMode = 0;
|
||||
|
@ -571,7 +571,7 @@ int LoLEngine::olol_getGlobalVar(EMCState *script) {
|
||||
case 8:
|
||||
return _updateFlags;
|
||||
case 9:
|
||||
return _lampStatusUnk;
|
||||
return _lampOilStatus;
|
||||
case 10:
|
||||
return _sceneDefaultUpdate;
|
||||
case 11:
|
||||
@ -638,7 +638,7 @@ int LoLEngine::olol_setGlobalVar(EMCState *script) {
|
||||
break;
|
||||
|
||||
case 9:
|
||||
_lampStatusUnk = b & 0xff;
|
||||
_lampOilStatus = b & 0xff;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
@ -767,7 +767,7 @@ int LoLEngine::olol_redrawPlayfield(EMCState *script) {
|
||||
if (_screen->_fadeFlag != 2)
|
||||
_screen->fadeClearSceneWindow(10);
|
||||
gui_drawPlayField();
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
_screen->_fadeFlag = 0;
|
||||
return 1;
|
||||
}
|
||||
@ -784,10 +784,9 @@ int LoLEngine::olol_loadNewLevel(EMCState *script) {
|
||||
endObjectFlight(&_flyingObjects[i], _flyingObjects[i].x, _flyingObjects[i].y, 1);
|
||||
}
|
||||
|
||||
resetDoors();
|
||||
completeDoorOperations();
|
||||
|
||||
///////////////////////
|
||||
// TODO: generate temp files
|
||||
generateTempData();
|
||||
|
||||
_currentBlock = stackPos(1);
|
||||
_currentDirection = stackPos(2);
|
||||
@ -1147,7 +1146,7 @@ int LoLEngine::olol_setPaletteBrightness(EMCState *script) {
|
||||
uint16 old = _brightness;
|
||||
_brightness = stackPos(0);
|
||||
if (stackPos(1) == 1)
|
||||
setPaletteBrightness(_screen->_currentPalette, stackPos(0), _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, stackPos(0), _lampEffect);
|
||||
return old;
|
||||
}
|
||||
|
||||
@ -1156,8 +1155,18 @@ int LoLEngine::olol_printMessage(EMCState *script) {
|
||||
int snd = stackPos(2);
|
||||
_txt->printMessage(stackPos(0), getLangString(stackPos(1)), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8), stackPos(9));
|
||||
|
||||
if (snd)
|
||||
snd_playSoundEffect(snd, 255);
|
||||
if (snd >= 0)
|
||||
snd_playSoundEffect(snd, -1);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LoLEngine::olol_deleteLevelItem(EMCState *script) {
|
||||
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_deleteLevelItem(%p) (%d)", (const void *)script, stackPos(0));
|
||||
if (_itemsInPlay[stackPos(0)].blockPropertyIndex)
|
||||
removeLevelItem(stackPos(0), _itemsInPlay[stackPos(0)].blockPropertyIndex);
|
||||
|
||||
deleteItem(stackPos(0));
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -1281,7 +1290,7 @@ int LoLEngine::olol_resetPortraitsAndDisableSysTimer(EMCState *script) {
|
||||
|
||||
int LoLEngine::olol_enableSysTimer(EMCState *script) {
|
||||
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableSysTimer(%p)", (const void *)script);
|
||||
_hideInventory = 0;
|
||||
_needSceneRestore = 0;
|
||||
enableSysTimer(2);
|
||||
return 1;
|
||||
}
|
||||
@ -1296,6 +1305,19 @@ int LoLEngine::olol_enableControls(EMCState *script) {
|
||||
return gui_enableControls();
|
||||
}
|
||||
|
||||
int LoLEngine::olol_characterSays(EMCState *script) {
|
||||
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterSays(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
|
||||
if (stackPos(0) == -1) {
|
||||
snd_stopSpeech(true);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (stackPos(0) != -1)
|
||||
return characterSays(stackPos(0), stackPos(1), stackPos(2));
|
||||
else
|
||||
return snd_characterSpeaking();
|
||||
}
|
||||
|
||||
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)) {
|
||||
@ -1455,7 +1477,7 @@ int LoLEngine::tlol_fadeClearWindow(const TIM *tim, const uint16 *param) {
|
||||
if (_screen->_fadeFlag != 2)
|
||||
_screen->fadeClearSceneWindow(10);
|
||||
gui_drawPlayField();
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus);
|
||||
setPaletteBrightness(_screen->_currentPalette, _brightness, _lampEffect);
|
||||
_screen->_fadeFlag = 0;
|
||||
break;
|
||||
|
||||
@ -1721,7 +1743,7 @@ void LoLEngine::setupOpcodeTable() {
|
||||
Opcode(olol_printMessage);
|
||||
|
||||
// 0x70
|
||||
OpcodeUnImpl();
|
||||
Opcode(olol_deleteLevelItem);
|
||||
OpcodeUnImpl();
|
||||
OpcodeUnImpl();
|
||||
OpcodeUnImpl();
|
||||
@ -1832,7 +1854,7 @@ void LoLEngine::setupOpcodeTable() {
|
||||
OpcodeUnImpl();
|
||||
OpcodeUnImpl();
|
||||
OpcodeUnImpl();
|
||||
OpcodeUnImpl();
|
||||
Opcode(olol_characterSays);
|
||||
|
||||
// 0xBC
|
||||
Opcode(olol_queueSpeech);
|
||||
|
@ -223,8 +223,10 @@ void TextDisplayer_LoL::printMessage(uint16 type, char *str, ...) {
|
||||
|
||||
_screen->setScreenDim(od);
|
||||
|
||||
if (!(type & 0x8000) && soundEffect[type])
|
||||
_vm->sound()->playSoundEffect(soundEffect[type]);
|
||||
if (!(type & 0x8000)) {
|
||||
if (soundEffect[type])
|
||||
_vm->sound()->playSoundEffect(soundEffect[type]);
|
||||
}
|
||||
|
||||
_vm->_textColourFlag = type & 0x7fff;
|
||||
_vm->_fadeText = false;
|
||||
@ -606,7 +608,7 @@ void TextDisplayer_LoL::textPageBreak() {
|
||||
int x = ((dim->sx + dim->w) << 3) - 77;
|
||||
int y = 0;
|
||||
|
||||
if (_vm->_hideInventory && (_vm->_updateFlags & 2)) {
|
||||
if (_vm->_needSceneRestore && (_vm->_updateFlags & 2)) {
|
||||
if (_vm->_currentControlMode || !(_vm->_updateFlags & 2)) {
|
||||
y = dim->sy + dim->h - 5;
|
||||
} else {
|
||||
|
@ -154,8 +154,8 @@ void LoLEngine::timerUpdatePortraitAnimations(int skipUpdate) {
|
||||
}
|
||||
|
||||
void LoLEngine::timerUpdateLampState(int timerNum) {
|
||||
if ((_gameFlags[15] & 0x800) && (_gameFlags[15] & 0x400) && _lampStatusUnk)
|
||||
_lampStatusUnk--;
|
||||
if ((_gameFlags[15] & 0x800) && (_gameFlags[15] & 0x400) && _lampOilStatus)
|
||||
_lampOilStatus--;
|
||||
}
|
||||
|
||||
void LoLEngine::timerFadeMessageText(int timerNum) {
|
||||
|
Loading…
Reference in New Issue
Block a user