diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 541f979d04..ba5f629a8f 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2014-2018 OpenRCT2 developers + * Copyright (c) 2014-2020 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 @@ -755,6 +755,16 @@ std::unique_ptr ScriptEngine::DukToGameActionResult(const DukV result->ErrorTitle = AsOrDefault(d["errorTitle"]); result->ErrorMessage = AsOrDefault(d["errorMessage"]); result->Cost = AsOrDefault(d["cost"]); + + auto expenditureType = AsOrDefault(d["expenditureType"]); + if (!expenditureType.empty()) + { + auto expenditure = StringToExpenditureType(expenditureType); + if (expenditure != ExpenditureType::Count) + { + result->Expenditure = expenditure; + } + } return result; } @@ -772,6 +782,43 @@ DukValue ScriptEngine::PositionToDuk(const CoordsXYZ& position) return DukValue::take_from_stack(ctx); } +constexpr static const char* ExpenditureTypes[] = { + "ride_construction", + "ride_runningcosts", + "land_purchase", + "landscaping", + "park_entrance_tickets", + "park_ride_tickets", + "shop_sales", + "shop_stock", + "food_drink_sales", + "food_drink_stock", + "wages", + "marketing", + "research", + "interest", +}; + +std::string_view ScriptEngine::ExpenditureTypeToString(ExpenditureType expenditureType) +{ + auto index = static_cast(expenditureType); + if (index < std::size(ExpenditureTypes)) + { + return ExpenditureTypes[index]; + } + return {}; +} + +ExpenditureType ScriptEngine::StringToExpenditureType(const std::string_view& expenditureType) +{ + auto it = std::find(std::begin(ExpenditureTypes), std::end(ExpenditureTypes), expenditureType); + if (it != std::end(ExpenditureTypes)) + { + return static_cast(std::distance(std::begin(ExpenditureTypes), it)); + } + return ExpenditureType::Count; +} + DukValue ScriptEngine::GameActionResultToDuk(const GameAction& action, const std::unique_ptr& result) { DukStackFrame frame(_context); @@ -791,6 +838,11 @@ DukValue ScriptEngine::GameActionResultToDuk(const GameAction& action, const std obj.Set("position", PositionToDuk(result->Position)); } + if (result->Expenditure != ExpenditureType::Count) + { + obj.Set("expenditureType", ExpenditureTypeToString(result->Expenditure)); + } + if (action.GetType() == GAME_COMMAND_CREATE_RIDE) { auto& rideCreateResult = static_cast(*result.get()); diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index 0acd6a1329..30466bce06 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -13,6 +13,7 @@ # include "../common.h" # include "../core/FileWatcher.h" +# include "../management/Finance.h" # include "../world/Location.hpp" # include "HookEngine.h" # include "Plugin.h" @@ -201,6 +202,8 @@ namespace OpenRCT2::Scripting std::unique_ptr DukToGameActionResult(const DukValue& d); DukValue GameActionResultToDuk(const GameAction& action, const std::unique_ptr& result); DukValue PositionToDuk(const CoordsXYZ& position); + static std::string_view ExpenditureTypeToString(ExpenditureType expenditureType); + static ExpenditureType StringToExpenditureType(const std::string_view& expenditureType); void InitSharedStorage(); void LoadSharedStorage();