mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge remote-tracking branch 'upstream/develop' into new-save-format
This commit is contained in:
commit
89bbe47211
|
@ -34,55 +34,6 @@ using namespace OpenRCT2;
|
||||||
|
|
||||||
namespace GameActions
|
namespace GameActions
|
||||||
{
|
{
|
||||||
Result::Result(GameActions::Status error, rct_string_id message)
|
|
||||||
{
|
|
||||||
Error = error;
|
|
||||||
ErrorMessage = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
Result::Result(GameActions::Status error, rct_string_id title, rct_string_id message)
|
|
||||||
{
|
|
||||||
Error = error;
|
|
||||||
ErrorTitle = title;
|
|
||||||
ErrorMessage = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
Result::Result(GameActions::Status error, rct_string_id title, rct_string_id message, uint8_t* args)
|
|
||||||
{
|
|
||||||
Error = error;
|
|
||||||
ErrorTitle = title;
|
|
||||||
ErrorMessage = message;
|
|
||||||
std::copy_n(args, ErrorMessageArgs.size(), ErrorMessageArgs.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GameActions::Result::GetErrorTitle() const
|
|
||||||
{
|
|
||||||
std::string title;
|
|
||||||
if (auto error = ErrorTitle.AsString())
|
|
||||||
{
|
|
||||||
title = *error;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
title = format_string(ErrorTitle.GetStringId(), ErrorMessageArgs.data());
|
|
||||||
}
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GameActions::Result::GetErrorMessage() const
|
|
||||||
{
|
|
||||||
std::string message;
|
|
||||||
if (auto error = ErrorMessage.AsString())
|
|
||||||
{
|
|
||||||
message = *error;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
message = format_string(ErrorMessage.GetStringId(), ErrorMessageArgs.data());
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct QueuedGameAction
|
struct QueuedGameAction
|
||||||
{
|
{
|
||||||
uint32_t tick;
|
uint32_t tick;
|
||||||
|
|
|
@ -13,100 +13,15 @@
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
#include "../core/DataSerialiser.h"
|
#include "../core/DataSerialiser.h"
|
||||||
#include "../localisation/StringIds.h"
|
#include "../localisation/StringIds.h"
|
||||||
|
#include "GameActionResult.h"
|
||||||
|
|
||||||
#include <any>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
class StringVariant
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
rct_string_id StringId = STR_NONE;
|
|
||||||
std::string String;
|
|
||||||
|
|
||||||
public:
|
|
||||||
StringVariant() = default;
|
|
||||||
|
|
||||||
StringVariant(rct_string_id stringId)
|
|
||||||
: StringId(stringId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
StringVariant(const std::string& s)
|
|
||||||
: String(s)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
StringVariant(std::string&& s)
|
|
||||||
: String(std::move(s))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
StringVariant(const char* s)
|
|
||||||
: String(s)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string* AsString() const
|
|
||||||
{
|
|
||||||
if (!String.empty())
|
|
||||||
{
|
|
||||||
return &String;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
const rct_string_id* AsStringId() const
|
|
||||||
{
|
|
||||||
if (String.empty())
|
|
||||||
{
|
|
||||||
return &StringId;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
rct_string_id GetStringId() const
|
|
||||||
{
|
|
||||||
return String.empty() ? StringId : STR_NONE;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __WARN_SUGGEST_FINAL_METHODS__
|
|
||||||
# pragma GCC diagnostic push
|
|
||||||
# pragma GCC diagnostic ignored "-Wsuggest-final-methods"
|
|
||||||
# pragma GCC diagnostic ignored "-Wsuggest-final-types"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace GameActions
|
namespace GameActions
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Common error codes for game actions.
|
|
||||||
*/
|
|
||||||
enum class Status : uint16_t
|
|
||||||
{
|
|
||||||
Ok,
|
|
||||||
InvalidParameters,
|
|
||||||
Disallowed,
|
|
||||||
GamePaused,
|
|
||||||
InsufficientFunds,
|
|
||||||
NotInEditorMode,
|
|
||||||
|
|
||||||
NotOwned,
|
|
||||||
TooLow,
|
|
||||||
TooHigh,
|
|
||||||
NoClearance,
|
|
||||||
ItemAlreadyPlaced,
|
|
||||||
|
|
||||||
NotClosed,
|
|
||||||
Broken,
|
|
||||||
|
|
||||||
NoFreeElements,
|
|
||||||
|
|
||||||
Unknown = UINT16_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace Flags
|
namespace Flags
|
||||||
{
|
{
|
||||||
constexpr uint16_t AllowWhilePaused = 1 << 0;
|
constexpr uint16_t AllowWhilePaused = 1 << 0;
|
||||||
|
@ -114,55 +29,14 @@ namespace GameActions
|
||||||
constexpr uint16_t EditorOnly = 1 << 2;
|
constexpr uint16_t EditorOnly = 1 << 2;
|
||||||
} // namespace Flags
|
} // namespace Flags
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the result of a game action query or execution.
|
|
||||||
*/
|
|
||||||
class Result
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using Ptr = std::unique_ptr<GameActions::Result>;
|
|
||||||
|
|
||||||
GameActions::Status Error = GameActions::Status::Ok;
|
|
||||||
StringVariant ErrorTitle;
|
|
||||||
StringVariant ErrorMessage;
|
|
||||||
std::array<uint8_t, 32> ErrorMessageArgs{};
|
|
||||||
CoordsXYZ Position = { LOCATION_NULL, LOCATION_NULL, LOCATION_NULL };
|
|
||||||
money32 Cost = 0;
|
|
||||||
ExpenditureType Expenditure = ExpenditureType::Count;
|
|
||||||
std::any ResultData;
|
|
||||||
|
|
||||||
Result() = default;
|
|
||||||
Result(GameActions::Status error, rct_string_id message);
|
|
||||||
Result(GameActions::Status error, rct_string_id title, rct_string_id message);
|
|
||||||
Result(GameActions::Status error, rct_string_id title, rct_string_id message, uint8_t* args);
|
|
||||||
Result(const GameActions::Result&) = delete;
|
|
||||||
virtual ~Result(){};
|
|
||||||
|
|
||||||
std::string GetErrorTitle() const;
|
|
||||||
std::string GetErrorMessage() const;
|
|
||||||
|
|
||||||
// It is recommended to use strong types since a type alias such as 'using MyType = uint32_t'
|
|
||||||
// is still just uint32_t, this guarantees the data is associated with the correct type.
|
|
||||||
template<typename T> void SetData(const T&& data)
|
|
||||||
{
|
|
||||||
ResultData = std::forward<const T&&>(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function will throw std::bad_any_cast if the type mismatches.
|
|
||||||
template<typename T> T GetData() const
|
|
||||||
{
|
|
||||||
return std::any_cast<T>(ResultData);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class ConstructClearResult final : public Result
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
uint8_t GroundFlags{ 0 };
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace GameActions
|
} // namespace GameActions
|
||||||
|
|
||||||
|
#ifdef __WARN_SUGGEST_FINAL_METHODS__
|
||||||
|
# pragma GCC diagnostic push
|
||||||
|
# pragma GCC diagnostic ignored "-Wsuggest-final-methods"
|
||||||
|
# pragma GCC diagnostic ignored "-Wsuggest-final-types"
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
#include "GameActionResult.h"
|
||||||
|
|
||||||
|
#include "../localisation/Localisation.h"
|
||||||
|
|
||||||
|
namespace GameActions
|
||||||
|
{
|
||||||
|
Result::Result(GameActions::Status error, rct_string_id message)
|
||||||
|
{
|
||||||
|
Error = error;
|
||||||
|
ErrorMessage = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result::Result(GameActions::Status error, rct_string_id title, rct_string_id message)
|
||||||
|
{
|
||||||
|
Error = error;
|
||||||
|
ErrorTitle = title;
|
||||||
|
ErrorMessage = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result::Result(GameActions::Status error, rct_string_id title, rct_string_id message, uint8_t* args)
|
||||||
|
{
|
||||||
|
Error = error;
|
||||||
|
ErrorTitle = title;
|
||||||
|
ErrorMessage = message;
|
||||||
|
std::copy_n(args, ErrorMessageArgs.size(), ErrorMessageArgs.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GameActions::Result::GetErrorTitle() const
|
||||||
|
{
|
||||||
|
std::string title;
|
||||||
|
if (auto error = ErrorTitle.AsString())
|
||||||
|
{
|
||||||
|
title = *error;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
title = format_string(ErrorTitle.GetStringId(), ErrorMessageArgs.data());
|
||||||
|
}
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GameActions::Result::GetErrorMessage() const
|
||||||
|
{
|
||||||
|
std::string message;
|
||||||
|
if (auto error = ErrorMessage.AsString())
|
||||||
|
{
|
||||||
|
message = *error;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message = format_string(ErrorMessage.GetStringId(), ErrorMessageArgs.data());
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace GameActions
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2014-2021 OpenRCT2 developers
|
||||||
|
*
|
||||||
|
* For a complete list of all authors, please refer to contributors.md
|
||||||
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
||||||
|
*
|
||||||
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../localisation/StringIds.h"
|
||||||
|
#include "../management/Finance.h"
|
||||||
|
#include "../world/Location.hpp"
|
||||||
|
|
||||||
|
#include <any>
|
||||||
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <limits>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
class StringVariant
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
rct_string_id StringId = STR_NONE;
|
||||||
|
std::string String;
|
||||||
|
|
||||||
|
public:
|
||||||
|
StringVariant() = default;
|
||||||
|
|
||||||
|
StringVariant(rct_string_id stringId)
|
||||||
|
: StringId(stringId)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
StringVariant(const std::string& s)
|
||||||
|
: String(s)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
StringVariant(std::string&& s)
|
||||||
|
: String(std::move(s))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
StringVariant(const char* s)
|
||||||
|
: String(s)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string* AsString() const
|
||||||
|
{
|
||||||
|
if (!String.empty())
|
||||||
|
{
|
||||||
|
return &String;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const rct_string_id* AsStringId() const
|
||||||
|
{
|
||||||
|
if (String.empty())
|
||||||
|
{
|
||||||
|
return &StringId;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
rct_string_id GetStringId() const
|
||||||
|
{
|
||||||
|
return String.empty() ? StringId : STR_NONE;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace GameActions
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Common error codes for game actions.
|
||||||
|
*/
|
||||||
|
enum class Status : uint16_t
|
||||||
|
{
|
||||||
|
Ok,
|
||||||
|
InvalidParameters,
|
||||||
|
Disallowed,
|
||||||
|
GamePaused,
|
||||||
|
InsufficientFunds,
|
||||||
|
NotInEditorMode,
|
||||||
|
|
||||||
|
NotOwned,
|
||||||
|
TooLow,
|
||||||
|
TooHigh,
|
||||||
|
NoClearance,
|
||||||
|
ItemAlreadyPlaced,
|
||||||
|
|
||||||
|
NotClosed,
|
||||||
|
Broken,
|
||||||
|
|
||||||
|
NoFreeElements,
|
||||||
|
|
||||||
|
Unknown = std::numeric_limits<std::underlying_type_t<Status>>::max(),
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __WARN_SUGGEST_FINAL_METHODS__
|
||||||
|
# pragma GCC diagnostic push
|
||||||
|
# pragma GCC diagnostic ignored "-Wsuggest-final-methods"
|
||||||
|
# pragma GCC diagnostic ignored "-Wsuggest-final-types"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the result of a game action query or execution.
|
||||||
|
*/
|
||||||
|
class Result
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using Ptr = std::unique_ptr<GameActions::Result>;
|
||||||
|
|
||||||
|
GameActions::Status Error = GameActions::Status::Ok;
|
||||||
|
StringVariant ErrorTitle;
|
||||||
|
StringVariant ErrorMessage;
|
||||||
|
std::array<uint8_t, 32> ErrorMessageArgs{};
|
||||||
|
CoordsXYZ Position = { LOCATION_NULL, LOCATION_NULL, LOCATION_NULL };
|
||||||
|
money32 Cost = 0;
|
||||||
|
ExpenditureType Expenditure = ExpenditureType::Count;
|
||||||
|
std::any ResultData;
|
||||||
|
|
||||||
|
Result() = default;
|
||||||
|
Result(GameActions::Status error, rct_string_id message);
|
||||||
|
Result(GameActions::Status error, rct_string_id title, rct_string_id message);
|
||||||
|
Result(GameActions::Status error, rct_string_id title, rct_string_id message, uint8_t* args);
|
||||||
|
Result(const GameActions::Result&) = delete;
|
||||||
|
virtual ~Result(){};
|
||||||
|
|
||||||
|
std::string GetErrorTitle() const;
|
||||||
|
std::string GetErrorMessage() const;
|
||||||
|
|
||||||
|
// It is recommended to use strong types since a type alias such as 'using MyType = uint32_t'
|
||||||
|
// is still just uint32_t, this guarantees the data is associated with the correct type.
|
||||||
|
template<typename T> void SetData(const T&& data)
|
||||||
|
{
|
||||||
|
ResultData = std::forward<const T&&>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function will throw std::bad_any_cast if the type mismatches.
|
||||||
|
template<typename T> T GetData() const
|
||||||
|
{
|
||||||
|
return std::any_cast<T>(ResultData);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __WARN_SUGGEST_FINAL_METHODS__
|
||||||
|
# pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class ConstructClearResult final : public Result
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
uint8_t GroundFlags{ 0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace GameActions
|
|
@ -68,6 +68,7 @@
|
||||||
<ClInclude Include="actions\FootpathAdditionPlaceAction.h" />
|
<ClInclude Include="actions\FootpathAdditionPlaceAction.h" />
|
||||||
<ClInclude Include="actions\FootpathAdditionRemoveAction.h" />
|
<ClInclude Include="actions\FootpathAdditionRemoveAction.h" />
|
||||||
<ClInclude Include="actions\GameAction.h" />
|
<ClInclude Include="actions\GameAction.h" />
|
||||||
|
<ClInclude Include="actions\GameActionResult.h" />
|
||||||
<ClInclude Include="actions\GuestSetFlagsAction.h" />
|
<ClInclude Include="actions\GuestSetFlagsAction.h" />
|
||||||
<ClInclude Include="actions\GuestSetNameAction.h" />
|
<ClInclude Include="actions\GuestSetNameAction.h" />
|
||||||
<ClInclude Include="actions\LandBuyRightsAction.h" />
|
<ClInclude Include="actions\LandBuyRightsAction.h" />
|
||||||
|
@ -519,6 +520,7 @@
|
||||||
<ClCompile Include="actions\GameAction.cpp" />
|
<ClCompile Include="actions\GameAction.cpp" />
|
||||||
<ClCompile Include="actions\GameActionCompat.cpp" />
|
<ClCompile Include="actions\GameActionCompat.cpp" />
|
||||||
<ClCompile Include="actions\GameActionRegistration.cpp" />
|
<ClCompile Include="actions\GameActionRegistration.cpp" />
|
||||||
|
<ClCompile Include="actions\GameActionResult.cpp" />
|
||||||
<ClCompile Include="actions\GuestSetFlagsAction.cpp" />
|
<ClCompile Include="actions\GuestSetFlagsAction.cpp" />
|
||||||
<ClCompile Include="actions\GuestSetNameAction.cpp" />
|
<ClCompile Include="actions\GuestSetNameAction.cpp" />
|
||||||
<ClCompile Include="actions\LandBuyRightsAction.cpp" />
|
<ClCompile Include="actions\LandBuyRightsAction.cpp" />
|
||||||
|
|
Loading…
Reference in New Issue