Exemple #1
0
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);
}
Exemple #2
0
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);
	}
}
Exemple #3
0
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);
	}
}
Exemple #4
0
void ToucheEngine::op_drawInventory() {
	debugC(9, kDebugOpcodes, "ToucheEngine::op_drawInventory()");
	int16 num = _script.readNextWord();
	drawInventory(num, 1);
}
Exemple #5
0
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);
}
Exemple #6
0
void Game::drawStatusGUI() {
	auto director = CCDirector::sharedDirector();
	auto visibleSize = director->getVisibleSize();
	drawStatusBar(visibleSize);
	drawInventory(visibleSize);
}