void violet::HUD::draw(GameState* gameState, Player* player) { float health = player->getHealth() / player->MaxHealth(); float experience = (float) (player->Xp - player->LastLevelXp) / (player->NextLevelXp - player->LastLevelXp); VideoMode screen = m_videoManager->getVideoMode(); drawMessages(); drawTime(gameState); applyEffects(health, player->LevelPoints); int bottomBasePoint = m_videoManager->getVideoMode().Height - m_videoManager->RegularText->getIndent() * 2; drawHealth(health, bottomBasePoint); drawExperience(experience, player->LevelPoints, bottomBasePoint); drawInventory(player); if (gameState->Lost && !gameState->Paused) drawEndGameScreen(gameState, player->Xp); if (!gameState->Lost) if (Info != "") m_videoManager->RegularText->draw(Info.c_str(), m_videoManager->getVideoMode().Width / 2, m_videoManager->RegularText->getIndent(), TextManager::CENTER, TextManager::TOP); if (gameState->Paused) m_videoManager->RegularText->draw(_("PAUSE"), screen.Width / 2, screen.Height / 2, TextManager::CENTER, TextManager::MIDDLE); }
void ToucheEngine::op_removeItemFromInventory() { debugC(9, kDebugOpcodes, "ToucheEngine::op_removeItemFromInventory()"); int16 keyChar = _script.readNextWord(); int16 item = *_script.stackDataPtr; if (keyChar == 256) { keyChar = _currentKeyCharNum; } removeItemFromInventory(keyChar, item); if (keyChar == _currentKeyCharNum && !_hideInventoryTexts) { drawInventory(_currentKeyCharNum, 1); } }
void ToucheEngine::op_addItemToInventoryAndRedraw() { debugC(9, kDebugOpcodes, "ToucheEngine::op_addItemToInventoryAndRedraw()"); int16 keyChar = _script.readNextWord(); int16 item = *_script.stackDataPtr; if (keyChar == 256) { keyChar = _currentKeyCharNum; } // Workaround for bug #1623356. The original script allows you to either use the // "waxy knife" (object 72) or the dagger (object 7) on the rope. But in both // situations, only the dagger is put back in the inventory. // // [1A35] (1D) ST[0] = FLAGS[119] // [1A38] (06) PUSH // [1A39] (13) ST[0] = 7 // [1A3C] (11) ST[0] = ST[1] == ST[0] // [1A3D] (06) PUSH // [1A3E] (1D) ST[0] = FLAGS[119] // [1A41] (06) PUSH // [1A42] (13) ST[0] = 72 // [1A45] (11) ST[0] = ST[1] == ST[0] // [1A46] (0E) OR // [1A47] (02) JZ 0x1B1B // [xxxx] ... // [1B05] (13) ST[0] = 7 // [1B08] (53) ADD_ITEM_TO_INVENTORY_AND_REDRAW(keychar=1) if (_currentEpisodeNum == 92 && keyChar == 1 && item == 7) { if (_flagsTable[119] == 72) { debug(0, "Workaround waxy knife not re-appearing in the inventory"); item = 72; } } addItemToInventory(keyChar, item); if (_currentKeyCharNum == keyChar && !_hideInventoryTexts) { drawInventory(_currentKeyCharNum, 1); } }
void ToucheEngine::op_drawInventory() { debugC(9, kDebugOpcodes, "ToucheEngine::op_drawInventory()"); int16 num = _script.readNextWord(); drawInventory(num, 1); }
void ToucheEngine::loadGameStateData(Common::ReadStream *stream) { setKeyCharMoney(); clearDirtyRects(); _flagsTable[115] = 0; clearRoomArea(); _currentEpisodeNum = stream->readUint16LE(); _newMusicNum = stream->readUint16LE(); _currentRoomNum = stream->readUint16LE(); res_loadRoom(_currentRoomNum); int16 roomOffsX = _flagsTable[614] = stream->readUint16LE(); int16 roomOffsY = _flagsTable[615] = stream->readUint16LE(); _disabledInputCounter = stream->readUint16LE(); res_loadProgram(_currentEpisodeNum); setupEpisode(-1); saveOrLoadCommonArray(*stream, _programHitBoxTable); saveOrLoadCommonArray(*stream, _programBackgroundTable); saveOrLoadCommonArray(*stream, _programAreaTable); saveOrLoadCommonArray(*stream, _programWalkTable); saveOrLoadCommonArray(*stream, _programPointsTable); stream->read(_updatedRoomAreasTable, 200); for (uint i = 1; i < _updatedRoomAreasTable[0]; ++i) { updateRoomAreas(_updatedRoomAreasTable[i], -1); } saveOrLoadStaticArray(*stream, _sequenceEntryTable, NUM_SEQUENCES); saveOrLoadStaticArray(*stream, _flagsTable, 1024); saveOrLoadStaticArray(*stream, _inventoryList1, 100); saveOrLoadStaticArray(*stream, _inventoryList2, 100); saveOrLoadStaticArray(*stream, _inventoryList3, 6); saveOrLoadStaticArray(*stream, _keyCharsTable, NUM_KEYCHARS); saveOrLoadStaticArray(*stream, _inventoryItemsInfoTable, NUM_INVENTORY_ITEMS); saveOrLoadStaticArray(*stream, _talkTable, NUM_TALK_ENTRIES); _talkListEnd = stream->readUint16LE(); _talkListCurrent = stream->readUint16LE(); if (stream->readUint32LE() != saveLoadEndMarker) { warning("Corrupted gamestate data"); // if that ever happens, exit the game quitGame(); } _flagsTable[614] = roomOffsX; _flagsTable[615] = roomOffsY; for (uint i = 0; i < NUM_SEQUENCES; ++i) { if (_sequenceEntryTable[i].seqNum != -1) { res_loadSequence(_sequenceEntryTable[i].seqNum, i); } if (_sequenceEntryTable[i].sprNum != -1) { res_loadSprite(_sequenceEntryTable[i].sprNum, i); } } _currentKeyCharNum = _flagsTable[104]; _inventoryStateTable[0].displayOffset = 0; _inventoryStateTable[1].displayOffset = 0; _inventoryStateTable[2].displayOffset = 0; drawInventory(_currentKeyCharNum, 1); Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 0, _backdropBuffer, _currentBitmapWidth, _flagsTable[614], _flagsTable[615], kScreenWidth, kRoomHeight); updateRoomRegions(); _fullRedrawCounter = 1; _roomNeedRedraw = false; if (_flagsTable[617] != 0) { res_loadSpeech(_flagsTable[617]); } debug(0, "Loaded state, current episode %d", _currentEpisodeNum); }
void Game::drawStatusGUI() { auto director = CCDirector::sharedDirector(); auto visibleSize = director->getVisibleSize(); drawStatusBar(visibleSize); drawInventory(visibleSize); }