mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-21 05:53:02 +01:00
Create new GameState class for updating the game
This commit is contained in:
committed by
Aaron van Geffen
parent
2127a0170e
commit
4d4e7ba4b1
@@ -38,6 +38,7 @@
|
||||
#include "drawing/IDrawingEngine.h"
|
||||
#include "localisation/Localisation.h"
|
||||
#include "FileClassifier.h"
|
||||
#include "GameState.h"
|
||||
#include "network/network.h"
|
||||
#include "object/ObjectManager.h"
|
||||
#include "object/ObjectRepository.h"
|
||||
@@ -106,6 +107,7 @@ namespace OpenRCT2
|
||||
// Game states
|
||||
std::unique_ptr<TitleScreen> _titleScreen;
|
||||
std::unique_ptr<Park> _park;
|
||||
std::unique_ptr<GameState> _gameState;
|
||||
|
||||
sint32 _drawingEngineType = DRAWING_ENGINE_SOFTWARE;
|
||||
std::unique_ptr<IDrawingEngine> _drawingEngine;
|
||||
@@ -166,6 +168,11 @@ namespace OpenRCT2
|
||||
return _uiContext;
|
||||
}
|
||||
|
||||
GameState * GetGameState() override
|
||||
{
|
||||
return _gameState.get();
|
||||
}
|
||||
|
||||
Park * GetPark() override
|
||||
{
|
||||
return _park.get();
|
||||
@@ -450,7 +457,8 @@ namespace OpenRCT2
|
||||
viewport_init_all();
|
||||
game_init_all(150);
|
||||
|
||||
_titleScreen = std::make_unique<TitleScreen>();
|
||||
_gameState = std::make_unique<GameState>();
|
||||
_titleScreen = std::make_unique<TitleScreen>(_gameState.get());
|
||||
_park = std::make_unique<Park>();
|
||||
return true;
|
||||
}
|
||||
@@ -975,7 +983,7 @@ namespace OpenRCT2
|
||||
}
|
||||
else
|
||||
{
|
||||
game_update();
|
||||
_gameState->Update();
|
||||
}
|
||||
|
||||
#ifdef __ENABLE_DISCORD__
|
||||
|
||||
@@ -71,6 +71,7 @@ enum
|
||||
namespace OpenRCT2
|
||||
{
|
||||
interface IPlatformEnvironment;
|
||||
class GameState;
|
||||
class Park;
|
||||
|
||||
namespace Audio
|
||||
@@ -102,6 +103,7 @@ namespace OpenRCT2
|
||||
|
||||
virtual std::shared_ptr<Audio::IAudioContext> GetAudioContext() abstract;
|
||||
virtual std::shared_ptr<Ui::IUiContext> GetUiContext() abstract;
|
||||
virtual GameState * GetGameState() abstract;
|
||||
virtual Park * GetPark() abstract;
|
||||
virtual std::shared_ptr<IPlatformEnvironment> GetPlatformEnvironment() abstract;
|
||||
virtual Localisation::LocalisationService& GetLocalisationService() abstract;
|
||||
|
||||
@@ -331,211 +331,6 @@ void update_palette_effects()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void game_update()
|
||||
{
|
||||
gInUpdateCode = true;
|
||||
|
||||
uint32 numUpdates;
|
||||
|
||||
// 0x006E3AEC // screen_game_process_mouse_input();
|
||||
screenshot_check();
|
||||
game_handle_keyboard_input();
|
||||
|
||||
if (game_is_not_paused() && gPreviewingTitleSequenceInGame)
|
||||
{
|
||||
title_sequence_player_update((ITitleSequencePlayer *) title_get_sequence_player());
|
||||
}
|
||||
|
||||
// Determine how many times we need to update the game
|
||||
if (gGameSpeed > 1)
|
||||
{
|
||||
numUpdates = 1 << (gGameSpeed - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
numUpdates = gTicksSinceLastUpdate / GAME_UPDATE_TIME_MS;
|
||||
numUpdates = Math::Clamp(1u, numUpdates, (uint32) GAME_MAX_UPDATES);
|
||||
}
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED && network_get_authstatus() == NETWORK_AUTH_OK)
|
||||
{
|
||||
if (network_get_server_tick() - gCurrentTicks >= 10)
|
||||
{
|
||||
// Make sure client doesn't fall behind the server too much
|
||||
numUpdates += 10;
|
||||
}
|
||||
}
|
||||
|
||||
if (game_is_paused())
|
||||
{
|
||||
numUpdates = 0;
|
||||
// Update the animation list. Note this does not
|
||||
// increment the map animation.
|
||||
map_animation_invalidate_all();
|
||||
|
||||
// Special case because we set numUpdates to 0, otherwise in game_logic_update.
|
||||
network_update();
|
||||
|
||||
network_process_game_commands();
|
||||
}
|
||||
|
||||
// Update the game one or more times
|
||||
for (uint32 i = 0; i < numUpdates; i++)
|
||||
{
|
||||
game_logic_update();
|
||||
|
||||
if (gGameSpeed > 1)
|
||||
continue;
|
||||
|
||||
if (input_get_state() == INPUT_STATE_RESET ||
|
||||
input_get_state() == INPUT_STATE_NORMAL
|
||||
)
|
||||
{
|
||||
if (input_test_flag(INPUT_FLAG_VIEWPORT_SCROLLING))
|
||||
{
|
||||
input_set_flag(INPUT_FLAG_VIEWPORT_SCROLLING, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gOpenRCT2Headless)
|
||||
{
|
||||
input_set_flag(INPUT_FLAG_VIEWPORT_SCROLLING, false);
|
||||
|
||||
// the flickering frequency is reduced by 4, compared to the original
|
||||
// it was done due to inability to reproduce original frequency
|
||||
// and decision that the original one looks too fast
|
||||
if (gCurrentTicks % 4 == 0)
|
||||
gWindowMapFlashingFlags ^= (1 << 15);
|
||||
|
||||
// Handle guest map flashing
|
||||
gWindowMapFlashingFlags &= ~(1 << 1);
|
||||
if (gWindowMapFlashingFlags & (1 << 0))
|
||||
gWindowMapFlashingFlags |= (1 << 1);
|
||||
gWindowMapFlashingFlags &= ~(1 << 0);
|
||||
|
||||
// Handle staff map flashing
|
||||
gWindowMapFlashingFlags &= ~(1 << 3);
|
||||
if (gWindowMapFlashingFlags & (1 << 2))
|
||||
gWindowMapFlashingFlags |= (1 << 3);
|
||||
gWindowMapFlashingFlags &= ~(1 << 2);
|
||||
|
||||
context_update_map_tooltip();
|
||||
|
||||
// Input
|
||||
gUnk141F568 = gUnk13CA740;
|
||||
|
||||
context_handle_input();
|
||||
}
|
||||
|
||||
// Always perform autosave check, even when paused
|
||||
if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) &&
|
||||
!(gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) &&
|
||||
!(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)
|
||||
)
|
||||
{
|
||||
scenario_autosave_check();
|
||||
}
|
||||
|
||||
window_dispatch_update_all();
|
||||
|
||||
gGameCommandNestLevel = 0;
|
||||
gInUpdateCode = false;
|
||||
}
|
||||
|
||||
void game_logic_update()
|
||||
{
|
||||
gScreenAge++;
|
||||
if (gScreenAge == 0)
|
||||
gScreenAge--;
|
||||
|
||||
network_update();
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED && network_get_authstatus() == NETWORK_AUTH_OK)
|
||||
{
|
||||
// Can't be in sync with server, round trips won't work if we are at same level.
|
||||
if (gCurrentTicks >= network_get_server_tick())
|
||||
{
|
||||
// Don't run past the server
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_SERVER)
|
||||
{
|
||||
// Send current tick out.
|
||||
network_send_tick();
|
||||
}
|
||||
else if (network_get_mode() == NETWORK_MODE_CLIENT)
|
||||
{
|
||||
// Check desync.
|
||||
network_check_desynchronization();
|
||||
}
|
||||
|
||||
sub_68B089();
|
||||
scenario_update();
|
||||
climate_update();
|
||||
map_update_tiles();
|
||||
// Temporarily remove provisional paths to prevent peep from interacting with them
|
||||
map_remove_provisional_elements();
|
||||
map_update_path_wide_flags();
|
||||
peep_update_all();
|
||||
map_restore_provisional_elements();
|
||||
vehicle_update_all();
|
||||
sprite_misc_update_all();
|
||||
ride_update_all();
|
||||
GetContext()->GetPark()->Update();
|
||||
research_update();
|
||||
ride_ratings_update_all();
|
||||
ride_measurements_update();
|
||||
news_item_update_current();
|
||||
|
||||
map_animation_invalidate_all();
|
||||
vehicle_sounds_update();
|
||||
peep_update_crowd_noise();
|
||||
climate_update_sound();
|
||||
editor_open_windows_for_current_step();
|
||||
|
||||
// Update windows
|
||||
//window_dispatch_update_all();
|
||||
|
||||
if (gErrorType != ERROR_TYPE_NONE)
|
||||
{
|
||||
rct_string_id title_text = STR_UNABLE_TO_LOAD_FILE;
|
||||
rct_string_id body_text = gErrorStringId;
|
||||
if (gErrorType == ERROR_TYPE_GENERIC)
|
||||
{
|
||||
title_text = gErrorStringId;
|
||||
body_text = 0xFFFF;
|
||||
}
|
||||
gErrorType = ERROR_TYPE_NONE;
|
||||
|
||||
context_show_error(title_text, body_text);
|
||||
}
|
||||
|
||||
// Start autosave timer after update
|
||||
if (gLastAutoSaveUpdate == AUTOSAVE_PAUSE)
|
||||
{
|
||||
gLastAutoSaveUpdate = platform_get_ticks();
|
||||
}
|
||||
|
||||
// Separated out processing commands in network_update which could call scenario_rand where gInUpdateCode is false.
|
||||
// All commands that are received are first queued and then executed where gInUpdateCode is set to true.
|
||||
network_process_game_commands();
|
||||
|
||||
network_flush();
|
||||
|
||||
gCurrentTicks++;
|
||||
gScenarioTicks++;
|
||||
gSavedAge++;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0069C62C
|
||||
|
||||
@@ -161,8 +161,6 @@ void game_increase_game_speed();
|
||||
void game_reduce_game_speed();
|
||||
|
||||
void game_create_windows();
|
||||
void game_update();
|
||||
void game_logic_update();
|
||||
void reset_all_sprite_quadrant_placements();
|
||||
void update_palette_effects();
|
||||
|
||||
|
||||
237
src/openrct2/GameState.cpp
Normal file
237
src/openrct2/GameState.cpp
Normal file
@@ -0,0 +1,237 @@
|
||||
#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers
|
||||
/*****************************************************************************
|
||||
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
||||
*
|
||||
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
||||
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
|
||||
*
|
||||
* OpenRCT2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* A full copy of the GNU General Public License can be found in licence.txt
|
||||
*****************************************************************************/
|
||||
#pragma endregion
|
||||
|
||||
#include "GameState.h"
|
||||
#include "Context.h"
|
||||
#include "core/Math.hpp"
|
||||
#include "Editor.h"
|
||||
#include "Input.h"
|
||||
#include "interface/Screenshot.h"
|
||||
#include "management/NewsItem.h"
|
||||
#include "network/network.h"
|
||||
#include "OpenRCT2.h"
|
||||
#include "platform/Platform2.h"
|
||||
#include "scenario/Scenario.h"
|
||||
#include "title/TitleScreen.h"
|
||||
#include "title/TitleSequencePlayer.h"
|
||||
#include "world/Climate.h"
|
||||
#include "world/MapAnimation.h"
|
||||
#include "world/Park.h"
|
||||
|
||||
using namespace OpenRCT2;
|
||||
|
||||
void GameState::Update()
|
||||
{
|
||||
gInUpdateCode = true;
|
||||
|
||||
uint32 numUpdates;
|
||||
|
||||
// 0x006E3AEC // screen_game_process_mouse_input();
|
||||
screenshot_check();
|
||||
game_handle_keyboard_input();
|
||||
|
||||
if (game_is_not_paused() && gPreviewingTitleSequenceInGame)
|
||||
{
|
||||
title_sequence_player_update((ITitleSequencePlayer *) title_get_sequence_player());
|
||||
}
|
||||
|
||||
// Determine how many times we need to update the game
|
||||
if (gGameSpeed > 1)
|
||||
{
|
||||
numUpdates = 1 << (gGameSpeed - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
numUpdates = gTicksSinceLastUpdate / GAME_UPDATE_TIME_MS;
|
||||
numUpdates = Math::Clamp<uint32>(1, numUpdates, GAME_MAX_UPDATES);
|
||||
}
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_CLIENT && network_get_status() == NETWORK_STATUS_CONNECTED && network_get_authstatus() == NETWORK_AUTH_OK)
|
||||
{
|
||||
if (network_get_server_tick() - gCurrentTicks >= 10)
|
||||
{
|
||||
// Make sure client doesn't fall behind the server too much
|
||||
numUpdates += 10;
|
||||
}
|
||||
}
|
||||
|
||||
if (game_is_paused())
|
||||
{
|
||||
numUpdates = 0;
|
||||
// Update the animation list. Note this does not
|
||||
// increment the map animation.
|
||||
map_animation_invalidate_all();
|
||||
|
||||
// Special case because we set numUpdates to 0, otherwise in game_logic_update.
|
||||
network_update();
|
||||
|
||||
network_process_game_commands();
|
||||
}
|
||||
|
||||
// Update the game one or more times
|
||||
for (uint32 i = 0; i < numUpdates; i++)
|
||||
{
|
||||
UpdateLogic();
|
||||
if (gGameSpeed == 1)
|
||||
{
|
||||
if (input_get_state() == INPUT_STATE_RESET ||
|
||||
input_get_state() == INPUT_STATE_NORMAL)
|
||||
{
|
||||
if (input_test_flag(INPUT_FLAG_VIEWPORT_SCROLLING))
|
||||
{
|
||||
input_set_flag(INPUT_FLAG_VIEWPORT_SCROLLING, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!gOpenRCT2Headless)
|
||||
{
|
||||
input_set_flag(INPUT_FLAG_VIEWPORT_SCROLLING, false);
|
||||
|
||||
// the flickering frequency is reduced by 4, compared to the original
|
||||
// it was done due to inability to reproduce original frequency
|
||||
// and decision that the original one looks too fast
|
||||
if (gCurrentTicks % 4 == 0)
|
||||
gWindowMapFlashingFlags ^= (1 << 15);
|
||||
|
||||
// Handle guest map flashing
|
||||
gWindowMapFlashingFlags &= ~(1 << 1);
|
||||
if (gWindowMapFlashingFlags & (1 << 0))
|
||||
gWindowMapFlashingFlags |= (1 << 1);
|
||||
gWindowMapFlashingFlags &= ~(1 << 0);
|
||||
|
||||
// Handle staff map flashing
|
||||
gWindowMapFlashingFlags &= ~(1 << 3);
|
||||
if (gWindowMapFlashingFlags & (1 << 2))
|
||||
gWindowMapFlashingFlags |= (1 << 3);
|
||||
gWindowMapFlashingFlags &= ~(1 << 2);
|
||||
|
||||
context_update_map_tooltip();
|
||||
|
||||
// Input
|
||||
gUnk141F568 = gUnk13CA740;
|
||||
|
||||
context_handle_input();
|
||||
}
|
||||
|
||||
// Always perform autosave check, even when paused
|
||||
if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) &&
|
||||
!(gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) &&
|
||||
!(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER))
|
||||
{
|
||||
scenario_autosave_check();
|
||||
}
|
||||
|
||||
window_dispatch_update_all();
|
||||
|
||||
gGameCommandNestLevel = 0;
|
||||
gInUpdateCode = false;
|
||||
}
|
||||
|
||||
void GameState::UpdateLogic()
|
||||
{
|
||||
gScreenAge++;
|
||||
if (gScreenAge == 0)
|
||||
gScreenAge--;
|
||||
|
||||
network_update();
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_CLIENT &&
|
||||
network_get_status() == NETWORK_STATUS_CONNECTED &&
|
||||
network_get_authstatus() == NETWORK_AUTH_OK)
|
||||
{
|
||||
// Can't be in sync with server, round trips won't work if we are at same level.
|
||||
if (gCurrentTicks >= network_get_server_tick())
|
||||
{
|
||||
// Don't run past the server
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_SERVER)
|
||||
{
|
||||
// Send current tick out.
|
||||
network_send_tick();
|
||||
}
|
||||
else if (network_get_mode() == NETWORK_MODE_CLIENT)
|
||||
{
|
||||
// Check desync.
|
||||
network_check_desynchronization();
|
||||
}
|
||||
|
||||
sub_68B089();
|
||||
scenario_update();
|
||||
climate_update();
|
||||
map_update_tiles();
|
||||
// Temporarily remove provisional paths to prevent peep from interacting with them
|
||||
map_remove_provisional_elements();
|
||||
map_update_path_wide_flags();
|
||||
peep_update_all();
|
||||
map_restore_provisional_elements();
|
||||
vehicle_update_all();
|
||||
sprite_misc_update_all();
|
||||
ride_update_all();
|
||||
GetContext()->GetPark()->Update();
|
||||
research_update();
|
||||
ride_ratings_update_all();
|
||||
ride_measurements_update();
|
||||
news_item_update_current();
|
||||
|
||||
map_animation_invalidate_all();
|
||||
vehicle_sounds_update();
|
||||
peep_update_crowd_noise();
|
||||
climate_update_sound();
|
||||
editor_open_windows_for_current_step();
|
||||
|
||||
// Update windows
|
||||
//window_dispatch_update_all();
|
||||
|
||||
if (gErrorType != ERROR_TYPE_NONE)
|
||||
{
|
||||
rct_string_id title_text = STR_UNABLE_TO_LOAD_FILE;
|
||||
rct_string_id body_text = gErrorStringId;
|
||||
if (gErrorType == ERROR_TYPE_GENERIC)
|
||||
{
|
||||
title_text = gErrorStringId;
|
||||
body_text = 0xFFFF;
|
||||
}
|
||||
gErrorType = ERROR_TYPE_NONE;
|
||||
|
||||
context_show_error(title_text, body_text);
|
||||
}
|
||||
|
||||
// Start autosave timer after update
|
||||
if (gLastAutoSaveUpdate == AUTOSAVE_PAUSE)
|
||||
{
|
||||
gLastAutoSaveUpdate = Platform::GetTicks();
|
||||
}
|
||||
|
||||
// Separated out processing commands in network_update which could call scenario_rand where gInUpdateCode is false.
|
||||
// All commands that are received are first queued and then executed where gInUpdateCode is set to true.
|
||||
network_process_game_commands();
|
||||
|
||||
network_flush();
|
||||
|
||||
gCurrentTicks++;
|
||||
gScenarioTicks++;
|
||||
gSavedAge++;
|
||||
}
|
||||
32
src/openrct2/GameState.h
Normal file
32
src/openrct2/GameState.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers
|
||||
/*****************************************************************************
|
||||
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
||||
*
|
||||
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
||||
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
|
||||
*
|
||||
* OpenRCT2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* A full copy of the GNU General Public License can be found in licence.txt
|
||||
*****************************************************************************/
|
||||
#pragma endregion
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace OpenRCT2
|
||||
{
|
||||
/**
|
||||
* Class to update the state of the map and park.
|
||||
*/
|
||||
class GameState
|
||||
{
|
||||
private:
|
||||
|
||||
public:
|
||||
void Update();
|
||||
void UpdateLogic();
|
||||
};
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "../config/Config.h"
|
||||
#include "../Context.h"
|
||||
#include "../core/Console.hpp"
|
||||
#include "../GameState.h"
|
||||
#include "../interface/Screenshot.h"
|
||||
#include "../network/network.h"
|
||||
#include "../OpenRCT2.h"
|
||||
@@ -35,10 +36,13 @@
|
||||
#include "../interface/Window.h"
|
||||
#include "../localisation/Localisation.h"
|
||||
|
||||
using namespace OpenRCT2;
|
||||
|
||||
// TODO Remove when no longer required.
|
||||
static TitleScreen * _singleton = nullptr;
|
||||
|
||||
TitleScreen::TitleScreen()
|
||||
TitleScreen::TitleScreen(GameState * gameState)
|
||||
: _gameState(gameState)
|
||||
{
|
||||
_singleton = this;
|
||||
}
|
||||
@@ -170,7 +174,7 @@ void TitleScreen::Update()
|
||||
}
|
||||
for (sint32 i = 0; i < numUpdates; i++)
|
||||
{
|
||||
game_logic_update();
|
||||
_gameState->UpdateLogic();
|
||||
}
|
||||
update_palette_effects();
|
||||
// update_rain_animation();
|
||||
@@ -224,7 +228,7 @@ void TitleScreen::TitleInitialise()
|
||||
if (_sequencePlayer == nullptr)
|
||||
{
|
||||
IScenarioRepository * scenarioRepository = GetScenarioRepository();
|
||||
_sequencePlayer = CreateTitleSequencePlayer(scenarioRepository);
|
||||
_sequencePlayer = CreateTitleSequencePlayer(scenarioRepository, _gameState);
|
||||
}
|
||||
size_t seqId = title_get_config_sequence();
|
||||
if (seqId == SIZE_MAX)
|
||||
|
||||
@@ -22,35 +22,42 @@
|
||||
|
||||
interface ITitleSequencePlayer;
|
||||
|
||||
class TitleScreen final
|
||||
namespace OpenRCT2
|
||||
{
|
||||
public:
|
||||
ITitleSequencePlayer * GetSequencePlayer();
|
||||
size_t GetCurrentSequence();
|
||||
bool PreviewSequence(size_t value);
|
||||
void StopPreviewingSequence();
|
||||
bool IsPreviewingSequence();
|
||||
bool ShouldHideVersionInfo();
|
||||
void SetHideVersionInfo(bool value);
|
||||
class GameState;
|
||||
|
||||
TitleScreen();
|
||||
~TitleScreen();
|
||||
class TitleScreen final
|
||||
{
|
||||
public:
|
||||
TitleScreen(GameState * gameState);
|
||||
~TitleScreen();
|
||||
|
||||
void Load();
|
||||
void Update();
|
||||
void CreateWindows();
|
||||
void ChangePresetSequence(size_t preset);
|
||||
ITitleSequencePlayer * GetSequencePlayer();
|
||||
size_t GetCurrentSequence();
|
||||
bool PreviewSequence(size_t value);
|
||||
void StopPreviewingSequence();
|
||||
bool IsPreviewingSequence();
|
||||
bool ShouldHideVersionInfo();
|
||||
void SetHideVersionInfo(bool value);
|
||||
|
||||
private:
|
||||
ITitleSequencePlayer * _sequencePlayer = nullptr;
|
||||
size_t _loadedTitleSequenceId = SIZE_MAX;
|
||||
size_t _currentSequence = SIZE_MAX;
|
||||
bool _hideVersionInfo = false;
|
||||
bool _previewingSequence = false;
|
||||
void Load();
|
||||
void Update();
|
||||
void CreateWindows();
|
||||
void ChangePresetSequence(size_t preset);
|
||||
|
||||
void TitleInitialise();
|
||||
bool TryLoadSequence(bool loadPreview = false);
|
||||
};
|
||||
private:
|
||||
GameState * const _gameState;
|
||||
|
||||
ITitleSequencePlayer * _sequencePlayer = nullptr;
|
||||
size_t _loadedTitleSequenceId = SIZE_MAX;
|
||||
size_t _currentSequence = SIZE_MAX;
|
||||
bool _hideVersionInfo = false;
|
||||
bool _previewingSequence = false;
|
||||
|
||||
void TitleInitialise();
|
||||
bool TryLoadSequence(bool loadPreview = false);
|
||||
};
|
||||
}
|
||||
|
||||
void title_load();
|
||||
void title_create_windows();
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "../core/String.hpp"
|
||||
#include "../object/ObjectManager.h"
|
||||
#include "../OpenRCT2.h"
|
||||
#include "../GameState.h"
|
||||
#include "../ParkImporter.h"
|
||||
#include "../scenario/ScenarioRepository.h"
|
||||
#include "../scenario/ScenarioSources.h"
|
||||
@@ -49,7 +50,8 @@ class TitleSequencePlayer final : public ITitleSequencePlayer
|
||||
private:
|
||||
static constexpr const char * SFMM_FILENAME = "Six Flags Magic Mountain.SC6";
|
||||
|
||||
IScenarioRepository * _scenarioRepository = nullptr;
|
||||
IScenarioRepository * const _scenarioRepository;
|
||||
GameState * const _gameState;
|
||||
|
||||
size_t _sequenceId = 0;
|
||||
TitleSequence * _sequence = nullptr;
|
||||
@@ -61,11 +63,12 @@ private:
|
||||
CoordsXY _viewCentreLocation = { 0 };
|
||||
|
||||
public:
|
||||
explicit TitleSequencePlayer(IScenarioRepository * scenarioRepository)
|
||||
explicit TitleSequencePlayer(IScenarioRepository * scenarioRepository, GameState * gameState)
|
||||
: _scenarioRepository(scenarioRepository),
|
||||
_gameState(gameState)
|
||||
{
|
||||
Guard::ArgumentNotNull(scenarioRepository);
|
||||
|
||||
_scenarioRepository = scenarioRepository;
|
||||
Guard::ArgumentNotNull(gameState);
|
||||
}
|
||||
|
||||
~TitleSequencePlayer() override
|
||||
@@ -213,7 +216,7 @@ public:
|
||||
{
|
||||
if (Update())
|
||||
{
|
||||
game_logic_update();
|
||||
_gameState->UpdateLogic();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -588,9 +591,9 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
ITitleSequencePlayer * CreateTitleSequencePlayer(IScenarioRepository * scenarioRepository)
|
||||
ITitleSequencePlayer * CreateTitleSequencePlayer(IScenarioRepository * scenarioRepository, GameState * gameState)
|
||||
{
|
||||
return new TitleSequencePlayer(scenarioRepository);
|
||||
return new TitleSequencePlayer(scenarioRepository, gameState);
|
||||
}
|
||||
|
||||
bool gPreviewingTitleSequenceInGame = false;
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
namespace OpenRCT2
|
||||
{
|
||||
class GameState;
|
||||
}
|
||||
|
||||
interface IScenarioRepository;
|
||||
|
||||
interface ITitleSequencePlayer
|
||||
@@ -33,7 +38,7 @@ interface ITitleSequencePlayer
|
||||
virtual void Eject() abstract;
|
||||
};
|
||||
|
||||
ITitleSequencePlayer * CreateTitleSequencePlayer(IScenarioRepository * scenarioRepository);
|
||||
ITitleSequencePlayer * CreateTitleSequencePlayer(IScenarioRepository * scenarioRepository, OpenRCT2::GameState * gameState);
|
||||
|
||||
// When testing title sequences within a normal game
|
||||
extern bool gPreviewingTitleSequenceInGame;
|
||||
|
||||
Reference in New Issue
Block a user