/*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
*/
/** @file misc.cpp Misc functions that shouldn't be here. */
#include "stdafx.h"
#include "landscape.h"
#include "news_func.h"
#include "ai/ai.hpp"
#include "script/script_gui.h"
#include "newgrf.h"
#include "newgrf_house.h"
#include "economy_func.h"
#include "date_func.h"
#include "texteff.hpp"
#include "gfx_func.h"
#include "gamelog.h"
#include "animated_tile_func.h"
#include "tilehighlight_func.h"
#include "network/network_func.h"
#include "window_func.h"
#include "core/pool_type.hpp"
#include "game/game.hpp"
#include "linkgraph/linkgraphschedule.h"
#include "station_kdtree.h"
#include "town_kdtree.h"
#include "viewport_kdtree.h"
#include "newgrf_profiling.h"
#include "tracerestrict.h"
#include "programmable_signals.h"
#include "viewport_func.h"
#include "bridge_signal_map.h"
#include "command_func.h"
#include "command_log.h"
#include "zoning.h"
#include "cargopacket.h"
#include "tbtr_template_vehicle_func.h"
#include "event_logs.h"
#include "string_func.h"
#include "plans_func.h"
#include "core/format.hpp"
#include "3rdparty/monocypher/monocypher.h"
#include "safeguards.h"
extern TileIndex _cur_tileloop_tile;
extern TileIndex _aux_tileloop_tile;
extern void ClearAllSignalSpeedRestrictions();
extern void MakeNewgameSettingsLive();
extern uint64_t _station_tile_cache_hash;
void InitializeSound();
void InitializeMusic();
void InitializeVehicles();
void InitializeRailGui();
void InitializeRoadGui();
void InitializeAirportGui();
void InitializeDockGui();
void InitializeGraphGui();
void InitializeObjectGui();
void InitializeTownGui();
void InitializeIndustries();
void InitializeObjects();
void InitializeTrees();
void InitializeCompanies();
void InitializeCheats();
void InitializeNPF();
void InitializeOldNames();
/**
* Generate a unique ID.
*
* It isn't as much of an unique ID but more a hashed digest of a random
* string and a time. It is very likely to be unique, but it does not follow
* any UUID standard.
*/
std::string GenerateUid(std::string_view subject)
{
std::array random_bytes;
RandomBytesWithFallback(random_bytes);
auto current_time = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count();
std::string coding_string = fmt::format("{}{}", current_time, subject);
std::array digest;
crypto_blake2b_ctx ctx;
crypto_blake2b_init(&ctx, digest.size());
crypto_blake2b_update(&ctx, random_bytes.data(), random_bytes.size());
crypto_blake2b_update(&ctx, reinterpret_cast(coding_string.data()), coding_string.size());
crypto_blake2b_final(&ctx, digest.data());
return FormatArrayAsHex(digest);
}
/**
* Generate a unique savegame ID.
*/
void GenerateSavegameId()
{
_game_session_stats.savegame_id = GenerateUid("OpenTTD Savegame ID");
}
void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settings)
{
/* Make sure there isn't any window that can influence anything
* related to the new game we're about to start/load. */
UnInitWindowSystem();
/* Clear link graph schedule and stop any link graph threads before
* changing the map size. This avoids data races on the map size variables. */
LinkGraphSchedule::Clear();
AllocateMap(size_x, size_y);
ViewportMapClearTunnelCache();
ResetDisasterVehicleTargeting();
ClearCommandLog();
ClearCommandQueue();
ClearSpecialEventsLog();
ClearDesyncMsgLog();
_pause_mode = PM_UNPAUSED;
_pause_countdown = 0;
_game_speed = 100;
CalTime::Detail::now.sub_date_fract = 0;
EconTime::Detail::years_elapsed = 0;
_tick_counter = 0;
DateDetail::_tick_skip_counter = 0;
_scaled_tick_counter = 0;
_state_ticks = INITIAL_STATE_TICKS_VALUE;
DateDetail::_state_ticks_offset = 0;
_cur_tileloop_tile = 1;
_aux_tileloop_tile = 1;
_thd.redsq = INVALID_TILE;
_road_layout_change_counter = 0;
_loaded_local_company = COMPANY_SPECTATOR;
_game_events_since_load = (GameEventFlags) 0;
_game_events_overall = (GameEventFlags) 0;
_game_load_cur_date_ymd = { 0, 0, 0 };
_game_load_date_fract = 0;
_game_load_tick_skip_counter = 0;
_game_load_state_ticks = 0;
_game_load_time = 0;
_extra_aspects = 0;
_aspect_cfg_hash = 0;
_station_tile_cache_hash = 0;
InitGRFGlobalVars();
_loadgame_DBGL_data.clear();
if (reset_settings) {
MakeNewgameSettingsLive();
} else {
UpdateEffectiveDayLengthFactor();
SetupTickRate();
}
_newgrf_profilers.clear();
if (reset_date) {
CalTime::Detail::SetDate(CalTime::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
if (EconTime::UsingWallclockUnits()) {
EconTime::Detail::SetDate(EconTime::DAYS_TILL_ORIGINAL_BASE_YEAR_WALLCLOCK_MODE, 0);
} else {
EconTime::Detail::SetDate(CalTime::CurDate().base(), 0);
}
EconTime::Detail::period_display_offset = 1 - EconTime::CurYear();
InitializeOldNames();
} else {
RecalculateStateTicksOffset();
}
UpdateCachedSnowLine();
UpdateCachedSnowLineBounds();
ClearTraceRestrictMapping();
ClearBridgeSimulatedSignalMapping();
ClearBridgeSignalStyleMapping();
ClearCargoPacketDeferredPayments();
PoolBase::Clean(PT_NORMAL);
extern void ClearNewSignalStyleMapping();
ClearNewSignalStyleMapping();
RebuildStationKdtree();
RebuildTownKdtree();
RebuildViewportKdtree();
FreeSignalPrograms();
FreeSignalDependencies();
ClearAllSignalSpeedRestrictions();
ClearZoningCaches();
InvalidatePlanCaches();
IntialiseOrderDestinationRefcountMap();
ResetPersistentNewGRFData();
InitializeSound();
InitializeMusic();
InitializeVehicles();
InitNewsItemStructs();
InitializeLandscape();
InitializeRailGui();
InitializeRoadGui();
InitializeAirportGui();
InitializeDockGui();
InitializeGraphGui();
InitializeObjectGui();
InitializeTownGui();
InitializeScriptGui();
InitializeTrees();
InitializeIndustries();
InitializeObjects();
InitializeBuildingCounts();
InitializeNPF();
InitializeCompanies();
AI::Initialize();
Game::Initialize();
InitializeCheats();
InitTextEffects();
NetworkInitChatMessage();
InitializeAnimatedTiles();
InitializeEconomy();
InvalidateVehicleTickCaches();
ClearVehicleTickCaches();
InvalidateTemplateReplacementImages();
ResetObjectToPlace();
ResetRailPlacementSnapping();
GamelogReset();
GamelogStartAction(GLAT_START);
GamelogRevision();
GamelogMode();
GamelogGRFAddList(_grfconfig);
GamelogStopAction();
}