bool KyraEngine_MR::updateScore(int scoreId, int strId) { int scoreIndex = (scoreId >> 3); int scoreBit = scoreId & 7; if ((_scoreFlagTable[scoreIndex] & (1 << scoreBit)) != 0) return false; setNextIdleAnimTimer(); _scoreFlagTable[scoreIndex] |= (1 << scoreBit); strcpy(_stringBuffer, (const char *)getTableEntry(_scoreFile, strId)); strcat(_stringBuffer, ": "); assert(scoreId < _scoreTableSize); int count = _scoreTable[scoreId]; if (count > 0) scoreIncrease(count, _stringBuffer); setNextIdleAnimTimer(); return true; }
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::hideBadConscience() { if (!_badConscienceShown) return; _badConscienceShown = false; for (int frame = _badConscienceFrameTable[_badConscienceAnim+8]; frame >= 0; --frame) { if (frame == 15) snd_playSoundEffect(0x31, 0xC8); updateSceneAnim(0x0E, frame); delay(1*_tickLength, true); } updateSceneAnim(0x0E, -1); update(); removeSceneAnimObject(0x0E, 1); setNextIdleAnimTimer(); }
void KyraEngine_MR::uninitAnimationShapes(int count, uint8 *filedata) { for (int i = 0; i < count; ++i) _gameShapes[9+i] = 0; delete[] filedata; setNextIdleAnimTimer(); }
void KyraEngine_HoF::handleInput(int x, int y) { setNextIdleAnimTimer(); if (_unk5) { _unk5 = 0; return; } if (!_screen->isMouseVisible()) return; if (_savedMouseState == -2) { snd_playSoundEffect(13); return; } setNextIdleAnimTimer(); if (x <= 6 || x >= 312 || y <= 6 || y >= 135) { bool exitOk = false; assert(_savedMouseState + 6 >= 0); switch (_savedMouseState + 6) { case 0: if (_sceneExit1 != 0xFFFF) exitOk = true; break; case 1: if (_sceneExit2 != 0xFFFF) exitOk = true; break; case 2: if (_sceneExit3 != 0xFFFF) exitOk = true; break; case 3: if (_sceneExit4 != 0xFFFF) exitOk = true; break; default: break; } if (exitOk) { inputSceneChange(x, y, 1, 1); return; } } if (checkCharCollision(x, y) && _savedMouseState >= -1) { runSceneScript2(); return; } else if (pickUpItem(x, y)) { return; } else { int skipHandling = 0; if (checkItemCollision(x, y) == -1) { resetGameFlag(0x1EF); skipHandling = handleInputUnkSub(x, y) ? 1 : 0; if (queryGameFlag(0x1EF)) { resetGameFlag(0x1EF); return; } if (_unk5) { _unk5 = 0; return; } } if (_deathHandler > -1) skipHandling = 1; if (skipHandling) return; if (checkCharCollision(x, y)) { runSceneScript2(); return; } if (_itemInHand >= 0) { if (y > 136) return; dropItem(0, _itemInHand, x, y, 1); } else { if (_savedMouseState == -2 || y > 135) return; if (!_unk5) { inputSceneChange(x, y, 1, 1); return; } _unk5 = 0; } } }
void KyraEngine_HoF::startup() { _sound->setSoundList(&_soundData[kMusicIngame]); // The track map is exactly the same // for FM-TOWNS and DOS _trackMap = _dosTrackMap; _trackMapSize = _dosTrackMapSize; allocAnimObjects(1, 10, 30); _screen->_curPage = 0; memset(_sceneShapeTable, 0, sizeof(_sceneShapeTable)); _gamePlayBuffer = new uint8[46080]; _unkBuf500Bytes = new uint8[500]; loadMouseShapes(); loadItemShapes(); _screen->setMouseCursor(0, 0, getShapePtr(0)); _screenBuffer = new uint8[64000]; _unkBuf200kByte = new uint8[200000]; loadChapterBuffer(_newChapterFile); loadCCodeBuffer("C_CODE.XXX"); if (_flags.isTalkie) { loadOptionsBuffer("OPTIONS.XXX"); showMessageFromCCode(265, 150, 0); _screen->updateScreen(); openTalkFile(0); _currentTalkFile = 1; openTalkFile(1); } else { _optionsBuffer = _cCodeBuffer; } showMessage(0, 207); _screen->setShapePages(5, 3); _mainCharacter.height = 0x30; _mainCharacter.facing = 4; _mainCharacter.animFrame = 0x12; memset(_sceneAnims, 0, sizeof(_sceneAnims)); for (int i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i) _sceneAnimMovie[i] = new WSAMovie_v2(this); memset(_wsaSlots, 0, sizeof(_wsaSlots)); for (int i = 0; i < ARRAYSIZE(_wsaSlots); ++i) _wsaSlots[i] = new WSAMovie_v2(this); _screen->_curPage = 0; _talkObjectList = new TalkObject[72]; memset(_talkObjectList, 0, sizeof(TalkObject)*72); _shapeDescTable = new ShapeDesc[55]; memset(_shapeDescTable, 0, sizeof(ShapeDesc)*55); for (int i = 9; i <= 32; ++i) { _shapeDescTable[i-9].width = 30; _shapeDescTable[i-9].height = 55; _shapeDescTable[i-9].xAdd = -15; _shapeDescTable[i-9].yAdd = -50; } for (int i = 19; i <= 24; ++i) { _shapeDescTable[i-9].width = 53; _shapeDescTable[i-9].yAdd = -51; } _gfxBackUpRect = new uint8[_screen->getRectSize(32, 32)]; initItemList(30); loadButtonShapes(); resetItemList(); _characterShapeFile = 1; loadCharacterShapes(_characterShapeFile); initInventoryButtonList(); setupLangButtonShapes(); loadInventoryShapes(); _screen->loadPalette("PALETTE.COL", _screen->getPalette(0)); _screen->loadBitmap("_PLAYFLD.CPS", 3, 3, 0); _screen->copyPage(3, 0); _screen->showMouse(); _screen->hideMouse(); clearAnimObjects(); for (int i = 0; i < 19; ++i) memset(_conversationState[i], -1, sizeof(int8)*14); clearCauldronTable(); memset(_inputColorCode, -1, sizeof(_inputColorCode)); memset(_newSceneDlgState, 0, sizeof(_newSceneDlgState)); for (int i = 0; i < 23; ++i) resetCauldronStateTable(i); _sceneList = new SceneDesc[86]; memset(_sceneList, 0, sizeof(SceneDesc)*86); _sceneListSize = 86; runStartScript(1, 0); loadNPCScript(); if (_gameToLoad == -1) { snd_playWanderScoreViaMap(52, 1); enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); saveGameStateIntern(0, "New Game", 0); } else { loadGameStateCheck(_gameToLoad); } _screen->showMouse(); if (_menuDirectlyToLoad) (*_inventoryButtons[0].buttonCallback)(&_inventoryButtons[0]); setNextIdleAnimTimer(); setWalkspeed(_configWalkspeed); }
void KyraEngine_MR::handleInput(int x, int y) { if (_inventoryState) return; setNextIdleAnimTimer(); if (_unk5) { _unk5 = 0; return; } if (!_screen->isMouseVisible()) return; if (_savedMouseState == -3) { snd_playSoundEffect(0x0D, 0x80); return; } setNextIdleAnimTimer(); int skip = 0; if (checkCharCollision(x, y) && _savedMouseState >= -1 && runSceneScript2()) { return; } else if (_itemInHand != 27 && pickUpItem(x, y, 1)) { return; } else if (checkItemCollision(x, y) == -1) { resetGameFlag(1); skip = runSceneScript1(x, y); if (queryGameFlag(1)) { resetGameFlag(1); return; } else if (_unk5) { _unk5 = 0; return; } } if (_deathHandler >= 0) skip = 1; if (skip) return; if (checkCharCollision(x, y)) { if (runSceneScript2()) return; } else if (_itemInHand >= 0 && _savedMouseState >= 0) { if (_itemInHand == 27) { makeCharFacingMouse(); } else if (y <= 187) { if (_itemInHand == 43) removeHandItem(); else dropItem(0, _itemInHand, x, y, 1); } return; } else if (_savedMouseState == -3) { return; } else { if (y > 187 && _savedMouseState > -4) return; if (_unk5) { _unk5 = 0; return; } } inputSceneChange(x, y, 1, 1); }
void KyraEngine_MR::startup() { _album.wsa = new WSAMovie_v2(this); assert(_album.wsa); _album.leftPage.wsa = new WSAMovie_v2(this); assert(_album.leftPage.wsa); _album.rightPage.wsa = new WSAMovie_v2(this); assert(_album.rightPage.wsa); _gamePlayBuffer = new uint8[64000]; _interface = new uint8[17920]; _interfaceCommandLine = new uint8[3840]; _screen->setFont(Screen::FID_8_FNT); _stringBuffer = new char[500]; allocAnimObjects(1, 16, 50); memset(_sceneShapes, 0, sizeof(_sceneShapes)); _screenBuffer = new uint8[64000]; if (!loadLanguageFile("ITEMS.", _itemFile)) error("Couldn't load ITEMS"); if (!loadLanguageFile("SCORE.", _scoreFile)) error("Couldn't load SCORE"); if (!loadLanguageFile("C_CODE.", _cCodeFile)) error("Couldn't load C_CODE"); if (!loadLanguageFile("SCENES.", _scenesFile)) error("Couldn't load SCENES"); if (!loadLanguageFile("OPTIONS.", _optionsFile)) error("Couldn't load OPTIONS"); if (!loadLanguageFile("_ACTOR.", _actorFile)) error("couldn't load _ACTOR"); openTalkFile(0); _currentTalkFile = 0; openTalkFile(1); loadCostPal(); for (int i = 0; i < 16; ++i) { _sceneAnims[i].flags = 0; _sceneAnimMovie[i] = new WSAMovie_v2(this); assert(_sceneAnimMovie[i]); } _screen->_curPage = 0; _talkObjectList = new TalkObject[88]; memset(_talkObjectList, 0, sizeof(TalkObject)*88); for (int i = 0; i < 88; ++i) _talkObjectList[i].sceneId = 0xFF; _gfxBackUpRect = new uint8[_screen->getRectSize(32, 32)]; initItemList(50); resetItemList(); loadShadowShape(); loadExtrasShapes(); _characterShapeFile = 0; loadCharacterShapes(_characterShapeFile); updateMalcolmShapes(); initMainButtonList(true); loadButtonShapes(); loadInterfaceShapes(); _screen->loadPalette("PALETTE.COL", _screen->getPalette(0)); _paletteOverlay = new uint8[256]; _screen->generateOverlay(_screen->getPalette(0), _paletteOverlay, 0xF0, 0x19); loadInterface(); clearAnimObjects(); _scoreMax = 0; for (int i = 0; i < _scoreTableSize; ++i) { if (_scoreTable[i] > 0) _scoreMax += _scoreTable[i]; } memset(_newSceneDlgState, 0, sizeof(_newSceneDlgState)); memset(_conversationState, -1, sizeof(_conversationState)); _sceneList = new SceneDesc[98]; assert(_sceneList); memset(_sceneList, 0, sizeof(SceneDesc)*98); _sceneListSize = 98; runStartupScript(1, 0); _res->exists("MOODOMTR.WSA", true); _invWsa = new WSAMovie_v2(this); assert(_invWsa); _invWsa->open("MOODOMTR.WSA", 1, 0); _invWsaFrame = 6; saveGameStateIntern(0, "New Game", 0); if (_gameToLoad == -1) enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1); else loadGameStateCheck(_gameToLoad); if (_menuDirectlyToLoad) (*_mainButtonData[0].buttonCallback)(&_mainButtonData[0]); _screen->updateScreen(); _screen->showMouse(); setNextIdleAnimTimer(); setWalkspeed(_configWalkspeed); }