void KyraEngine_HoF::enterNewSceneUnk2(int unk1) { _savedMouseState = -1; if (_flags.isTalkie) { if (_mainCharX == -1 && _mainCharY == -1 && _mainCharacter.sceneId != 61 && !queryGameFlag(0x1F1) && !queryGameFlag(0x192) && !queryGameFlag(0x193) && _mainCharacter.sceneId != 70 && !queryGameFlag(0x159) && _mainCharacter.sceneId != 37) { _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); refreshAnimObjectsIfNeed(); } } else if (_mainCharX != -1 && _mainCharY != -1) { if (_characterFrameTable[_mainCharacter.facing] == 25) _mainCharacter.facing = 5; _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); refreshAnimObjectsIfNeed(); } if (!unk1) { runSceneScript4(0); zanthSceneStartupChat(); } _unk4 = 0; _savedMouseState = -1; }
int KyraEngine_MR::o3_setCharacterAnimFrameFromFacing(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_setCharacterAnimFrameFromFacing(%p) ()", (const void *)script); updateCharPal(0); _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); refreshAnimObjectsIfNeed(); return 0; }
void KyraEngine_MR::makeCharFacingMouse() { if (_mainCharacter.x1 > _mouseX) _mainCharacter.facing = 5; else _mainCharacter.facing = 3; _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); refreshAnimObjectsIfNeed(); }
void KyraEngine_MR::updateCharAnimFrame(int *table) { ++_mainCharacter.animFrame; int facing = _mainCharacter.facing; if (table) { if (table[0] != table[-1] && table[1] == table[-1]) { facing = getOppositeFacingDirection(table[-1]); table[0] = table[-1]; } } if (facing) { if (facing == 7 || facing == 1) { if (_characterAnimTable[0] > 2) facing = 0; memset(_characterAnimTable, 0, sizeof(_characterAnimTable)); } else if (facing == 4) { ++_characterAnimTable[1]; } else if (facing == 5 || facing == 3) { if (_characterAnimTable[1] > 2) facing = 4; memset(_characterAnimTable, 0, sizeof(_characterAnimTable)); } } else { ++_characterAnimTable[0]; } switch (facing) { case 0: if (_mainCharacter.animFrame < 79 || _mainCharacter.animFrame > 86) _mainCharacter.animFrame = 79; break; case 1: case 2: case 3: if (_mainCharacter.animFrame < 71 || _mainCharacter.animFrame > 78) _mainCharacter.animFrame = 71; break; case 4: if (_mainCharacter.animFrame < 55 || _mainCharacter.animFrame > 62) _mainCharacter.animFrame = 55; break; case 5: case 6: case 7: if (_mainCharacter.animFrame < 63 || _mainCharacter.animFrame > 70) _mainCharacter.animFrame = 63; break; default: break; } updateCharacterAnim(0); }
void KyraEngine_MR::showGoodConscience() { if (_goodConscienceShown) return; _goodConscienceShown = true; ++_goodConscienceAnim; _goodConscienceAnim %= 5; setNextIdleAnimTimer(); _goodConsciencePosition = (_mainCharacter.x1 <= 160); if (_badConscienceShown) _goodConsciencePosition = !_badConsciencePosition; int anim = _goodConscienceAnim + (_goodConsciencePosition ? 0 : 5); TalkObject &talkObject = _talkObjectList[87]; if (_goodConsciencePosition) talkObject.x = 290; else talkObject.x = 30; talkObject.y = 30; static const char *const animFilenames[] = { "STUFL00.WSA", "STUFL02.WSA", "STUFL04.WSA", "STUFL03.WSA", "STUFL01.WSA", "STUFR00.WSA", "STUFR02.WSA", "STUFR04.WSA", "STUFR03.WSA", "STUFR01.WSA" }; setupSceneAnimObject(0x0F, 9, 0, 187, -1, -1, -1, -1, 0, 0, 0, -1, animFilenames[anim]); for (uint i = 0; i <= _goodConscienceFrameTable[_goodConscienceAnim]; ++i) { if (i == 10) snd_playSoundEffect(0x7F, 0xC8); updateSceneAnim(0x0F, i); delay(2*_tickLength, true); } if (_mainCharacter.animFrame < 50 || _mainCharacter.animFrame > 87) return; if (_mainCharacter.y1 == -1 || (_mainCharacter.x1 != -1 && _mainCharacter.animFrame == 87) || _mainCharacter.animFrame == 87) { _mainCharacter.animFrame = 87; } else { if (_goodConsciencePosition) _mainCharacter.facing = 3; else _mainCharacter.facing = 5; _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; } updateCharacterAnim(0); refreshAnimObjectsIfNeed(); }
void KyraEngine_MR::enterNewSceneUnk2(int unk1) { _savedMouseState = -1; if (_mainCharX == -1 && _mainCharY == -1 && !unk1) { _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); refreshAnimObjectsIfNeed(); } if (!unk1) { runSceneScript4(0); malcolmSceneStartupChat(); } _unk4 = 0; _savedMouseState = -1; }
int KyraEngine_MR::o3_enterNewScene(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_enterNewScene(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); _screen->hideMouse(); enterNewScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); _unk5 = 1; if (_mainCharX == -1 || _mainCharY == -1) { _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); } _screen->showMouse(); return 0; }
int KyraEngine_MR::o3_refreshCharacter(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_refreshCharacter(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); const int frame = stackPos(0); const int facing = stackPos(1); const bool updateNeed = stackPos(2) != 0; if (facing >= 0) _mainCharacter.facing = facing; if (frame >= 0 && frame != 87) _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; else _mainCharacter.animFrame = 87; updateCharacterAnim(0); if (updateNeed) refreshAnimObjectsIfNeed(); return 0; }
void KyraEngine_MR::showBadConscience() { if (_badConscienceShown) return; _badConscienceShown = true; _badConscienceAnim = _rnd.getRandomNumberRng(0, 2); if (_currentChapter == 2) _badConscienceAnim = 5; else if (_currentChapter == 3) _badConscienceAnim = 3; else if (_currentChapter == 4 && _rnd.getRandomNumberRng(1, 100) <= 25) _badConscienceAnim = 6; else if (_currentChapter == 5 && _rnd.getRandomNumberRng(1, 100) <= 25) _badConscienceAnim = 7; if (_characterShapeFile == 9) _badConscienceAnim = 4; _badConsciencePosition = (_mainCharacter.x1 <= 160); if (_goodConscienceShown) _badConsciencePosition = !_goodConsciencePosition; int anim = _badConscienceAnim + (_badConsciencePosition ? 0 : 8); TalkObject &talkObject = _talkObjectList[1]; if (_badConsciencePosition) talkObject.x = 290; else talkObject.x = 30; talkObject.y = 30; static const char *const animFilenames[] = { "GUNFL00.WSA", "GUNFL01.WSA", "GUNFL02.WSA", "GUNFL03.WSA", "GUNFL04.WSA", "GUNFL05.WSA", "GUNFL06.WSA", "GUNFL07.WSA", "GUNFR00.WSA", "GUNFR01.WSA", "GUNFR02.WSA", "GUNFR03.WSA", "GUNFR04.WSA", "GUNFR05.WSA", "GUNFR06.WSA", "GUNFR07.WSA" }; setupSceneAnimObject(0x0E, 9, 0, 187, -1, -1, -1, -1, 0, 0, 0, -1, animFilenames[anim]); for (uint i = 0; i <= _badConscienceFrameTable[_badConscienceAnim]; ++i) { if (i == 8) snd_playSoundEffect(0x1B, 0xC8); updateSceneAnim(0x0E, i); delay(3*_tickLength, true); } if (_mainCharacter.animFrame < 50 || _mainCharacter.animFrame > 87) return; if (_mainCharacter.y1 == -1 || (_mainCharacter.x1 != -1 && _mainCharacter.animFrame == 87) || _mainCharacter.animFrame == 87) { _mainCharacter.animFrame = 87; } else { if (_badConsciencePosition) _mainCharacter.facing = 3; else _mainCharacter.facing = 5; _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; } updateCharacterAnim(0); refreshAnimObjectsIfNeed(); }
Common::Error KyraEngine_MR::loadGameState(int slot) { const char *fileName = getSavegameFilename(slot); SaveHeader header; Common::InSaveFile *saveFile = openSaveForReading(fileName, header); if (!saveFile) { showMessageFromCCode(17, 0xB3, 0); snd_playSoundEffect(0x0D, 0xC8); return Common::kUnknownError; } if (header.originalSave) warning("Trying to load savegame from original interpreter, while this is possible, it is not officially supported"); if (_inventoryState) { updateCharacterAnim(0); restorePage3(); drawAnimObjects(); _inventoryState = true; refreshAnimObjects(0); hideInventory(); } _deathHandler = -1; if (!_unkSceneScreenFlag1) _lastMusicCommand = -1; int curShapes = _characterShapeFile; Common::SeekableSubReadStreamEndian in(saveFile, saveFile->pos(), saveFile->size(), !header.originalSave, DisposeAfterUse::YES); _screen->hideMouse(); if (!header.originalSave) { _timer->loadDataFromFile(in, header.version); uint32 flagsSize = in.readUint32BE(); assert(flagsSize <= sizeof(_flagsTable)); in.read(_flagsTable, flagsSize); } _lastMusicCommand = in.readSint16(); _currentChapter = in.readByte(); _characterShapeFile = in.readByte(); if (header.version >= 12 || header.originalSave) _album.curPage = in.readByte(); if (header.originalSave) in.readByte(); _score = in.readSint16(); _scoreMax = in.readSint16(); _malcolmsMood = in.readByte(); if (header.originalSave) in.seek(8, SEEK_CUR); for (int i = 0; i < 30; ++i) in.read(_conversationState[i], 30); if (!header.originalSave) { in.read(_newSceneDlgState, 40); } else { for (int i = 0; i < 40; ++i) _newSceneDlgState[i] = in.readUint16(); } for (int i = 0; i < 100; ++i) _hiddenItems[i] = in.readSint16(); if (header.originalSave) in.read(_flagsTable, 69); in.read(_scoreFlagTable, 26); _mainCharacter.sceneId = in.readUint16(); _mainCharacter.dlgIndex = in.readSint16(); _mainCharacter.height = in.readByte(); _mainCharacter.facing = in.readByte(); _mainCharacter.animFrame = in.readUint16(); if (!header.originalSave) { _mainCharacter.walkspeed = in.readByte(); } else { in.seek(2, SEEK_CUR); _mainCharacter.walkspeed = in.readUint32(); } for (int i = 0; i < 10; ++i) _mainCharacter.inventory[i] = in.readUint16(); _mainCharacter.x1 = in.readSint16(); _mainCharacter.y1 = in.readSint16(); _mainCharacter.x2 = in.readSint16(); _mainCharacter.y2 = in.readSint16(); _mainCharacter.x3 = in.readSint16(); _mainCharacter.y3 = in.readSint16(); for (int i = 0; i < 50; ++i) { _itemList[i].id = in.readSint16(); _itemList[i].sceneId = in.readUint16(); _itemList[i].x = in.readSint16(); _itemList[i].y = in.readSint16(); if (header.version <= 9 || header.originalSave) in.readUint16(); } for (int i = 0; i < 88; ++i) { in.read(_talkObjectList[i].filename, 13); _talkObjectList[i].sceneAnim = in.readByte(); _talkObjectList[i].sceneScript = in.readByte(); _talkObjectList[i].x = in.readSint16(); _talkObjectList[i].y = in.readSint16(); _talkObjectList[i].color = in.readByte(); if (header.version >= 13 || header.originalSave) _talkObjectList[i].sceneId = in.readByte(); } for (int i = 0; i < 98; ++i) { if (!header.originalSave) { in.read(_sceneList[i].filename1, 10); } else { in.read(_sceneList[i].filename1, 9); _sceneList[i].filename1[9] = 0; } if (!header.originalSave) { in.read(_sceneList[i].filename2, 10); } else { in.read(_sceneList[i].filename2, 9); _sceneList[i].filename2[9] = 0; } _sceneList[i].exit1 = in.readUint16(); _sceneList[i].exit2 = in.readUint16(); _sceneList[i].exit3 = in.readUint16(); _sceneList[i].exit4 = in.readUint16(); _sceneList[i].flags = in.readByte(); _sceneList[i].sound = in.readByte(); } _itemInHand = in.readSint16(); if (header.originalSave) { uint32 currentTime = _system->getMillis(); for (int i = 0; i < 6; ++i) _timer->setDelay(i, in.readSint32LE()); for (int i = 0; i < 6; ++i) { if (in.readUint16LE()) _timer->enable(i); else _timer->disable(i); } for (int i = 0; i < 6; ++i) _timer->setNextRun(i, currentTime + (in.readUint32LE() * _tickLength)); _timer->resetNextRun(); } _sceneExit1 = in.readUint16(); _sceneExit2 = in.readUint16(); _sceneExit3 = in.readUint16(); _sceneExit4 = in.readUint16(); if (saveFile->err() || saveFile->eos()) { warning("Load failed ('%s', '%s').", fileName, header.description.c_str()); return Common::kUnknownError; } else { debugC(1, kDebugLevelMain, "Loaded savegame '%s.'", header.description.c_str()); } _loadingState = true; updateCharacterAnim(0); _loadingState = false; if (curShapes != _characterShapeFile) loadCharacterShapes(_characterShapeFile); _mainCharX = _mainCharacter.x2 = _mainCharacter.x1; _mainCharY = _mainCharacter.y2 = _mainCharacter.y1; _mainCharacter.facing = 4; _badConscienceShown = false; _badConsciencePosition = false; _goodConscienceShown = false; _goodConsciencePosition = false; enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); setHandItem(_itemInHand); if (_lastMusicCommand >= 0 && !_unkSceneScreenFlag1) snd_playWanderScoreViaMap(_lastMusicCommand, 1); else if (_lastMusicCommand == -1) snd_playWanderScoreViaMap(28, 1); while (!_screen->isMouseVisible()) _screen->showMouse(); setCommandLineRestoreTimer(7); _shownMessage = " "; _restoreCommandLine = false; // We didn't explicitly set the walk speed, but it's saved as part of // the _timers array, so we need to re-sync it with _configWalkspeed. setWalkspeed(_configWalkspeed); return Common::kNoError; }
int KyraEngine_HoF::trySceneChange(int *moveTable, int unk1, int updateChar) { bool running = true; bool unkFlag = false; int8 updateType = -1; int changedScene = 0; const int *moveTableStart = moveTable; _unk4 = 0; while (running && !shouldQuit()) { if (*moveTable >= 0 && *moveTable <= 7) { _mainCharacter.facing = getOppositeFacingDirection(*moveTable); unkFlag = true; } else { if (*moveTable == 8) { running = false; } else { ++moveTable; unkFlag = false; } } if (checkSceneChange()) { running = false; changedScene = 1; } if (unk1) { if (skipFlag()) { resetSkipFlag(false); running = false; _unk4 = 1; } } if (!unkFlag || !running) continue; int ret = 0; if (moveTable == moveTableStart || moveTable[1] == 8) ret = updateCharPos(0); else ret = updateCharPos(moveTable); if (ret) ++moveTable; ++updateType; if (!updateType) { update(); } else if (updateType == 1) { refreshAnimObjectsIfNeed(); updateType = -1; } delay(10); } if (updateChar) _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); refreshAnimObjectsIfNeed(); return changedScene; }