diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj
index b67b150cf5..dd3f6892d1 100644
--- a/src/openrct2/libopenrct2.vcxproj
+++ b/src/openrct2/libopenrct2.vcxproj
@@ -868,6 +868,7 @@
+
diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp
new file mode 100644
index 0000000000..0ff6063fa3
--- /dev/null
+++ b/src/openrct2/scripting/bindings/world/ScPark.cpp
@@ -0,0 +1,418 @@
+/*****************************************************************************
+ * 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.
+ *****************************************************************************/
+
+#ifdef ENABLE_SCRIPTING
+
+# include "ScPark.hpp"
+
+# include "../../../Context.h"
+# include "../../../GameState.h"
+# include "../../../common.h"
+# include "../../../core/String.hpp"
+# include "../../../management/Finance.h"
+# include "../../../management/NewsItem.h"
+# include "../../../peep/Peep.h"
+# include "../../../windows/Intent.h"
+# include "../../../world/Park.h"
+# include "../../Duktape.hpp"
+# include "../../ScriptEngine.h"
+# include "ScParkMessage.hpp"
+
+# include
+
+namespace OpenRCT2::Scripting
+{
+ static const DukEnumMap ParkFlagMap({
+ { "open", PARK_FLAGS_PARK_OPEN },
+ { "scenarioCompleteNameInput", PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT },
+ { "forbidLandscapeChanges", PARK_FLAGS_FORBID_LANDSCAPE_CHANGES },
+ { "forbidTreeRemoval", PARK_FLAGS_FORBID_TREE_REMOVAL },
+ { "forbidHighConstruction", PARK_FLAGS_FORBID_HIGH_CONSTRUCTION },
+ { "preferLessIntenseRides", PARK_FLAGS_PREF_LESS_INTENSE_RIDES },
+ { "forbidMarketingCampaigns", PARK_FLAGS_FORBID_MARKETING_CAMPAIGN },
+ { "preferMoreIntenseRides", PARK_FLAGS_PREF_MORE_INTENSE_RIDES },
+ { "noMoney", PARK_FLAGS_NO_MONEY },
+ { "difficultGuestGeneration", PARK_FLAGS_DIFFICULT_GUEST_GENERATION },
+ { "freeParkEntry", PARK_FLAGS_PARK_FREE_ENTRY },
+ { "difficultParkRating", PARK_FLAGS_DIFFICULT_PARK_RATING },
+ { "noMoney", PARK_FLAGS_NO_MONEY_SCENARIO },
+ { "unlockAllPrices", PARK_FLAGS_UNLOCK_ALL_PRICES },
+ });
+
+ money64 ScPark::cash_get() const
+ {
+ return gCash;
+ }
+ void ScPark::cash_set(money64 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gCash != value)
+ {
+ gCash = value;
+ auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
+ context_broadcast_intent(&intent);
+ }
+ }
+
+ int32_t ScPark::rating_get() const
+ {
+ return gParkRating;
+ }
+ void ScPark::rating_set(int32_t value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ auto valueClamped = std::min(std::max(0, value), 999);
+ if (gParkRating != valueClamped)
+ {
+ gParkRating = std::min(std::max(0, value), 999);
+ auto intent = Intent(INTENT_ACTION_UPDATE_PARK_RATING);
+ context_broadcast_intent(&intent);
+ }
+ }
+
+ money64 ScPark::bankLoan_get() const
+ {
+ return gBankLoan;
+ }
+ void ScPark::bankLoan_set(money64 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gBankLoan != value)
+ {
+ gBankLoan = value;
+ auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
+ context_broadcast_intent(&intent);
+ }
+ }
+
+ money64 ScPark::maxBankLoan_get() const
+ {
+ return gMaxBankLoan;
+ }
+ void ScPark::maxBankLoan_set(money64 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gMaxBankLoan != value)
+ {
+ gMaxBankLoan = value;
+ auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
+ context_broadcast_intent(&intent);
+ }
+ }
+
+ money16 ScPark::entranceFee_get() const
+ {
+ return gParkEntranceFee;
+ }
+ void ScPark::entranceFee_set(money16 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gParkEntranceFee != value)
+ {
+ gParkEntranceFee = value;
+ window_invalidate_by_class(WC_PARK_INFORMATION);
+ }
+ }
+
+ uint32_t ScPark::guests_get() const
+ {
+ return gNumGuestsInPark;
+ }
+
+ uint32_t ScPark::suggestedGuestMaximum_get() const
+ {
+ return _suggestedGuestMaximum;
+ }
+
+ int32_t ScPark::guestGenerationProbability_get() const
+ {
+ return _guestGenerationProbability;
+ }
+
+ money16 ScPark::guestInitialCash_get() const
+ {
+ return gGuestInitialCash;
+ }
+
+ uint8_t ScPark::guestInitialHappiness_get() const
+ {
+ return gGuestInitialHappiness;
+ }
+
+ uint8_t ScPark::guestInitialHunger_get() const
+ {
+ return gGuestInitialHunger;
+ }
+
+ uint8_t ScPark::guestInitialThirst_get() const
+ {
+ return gGuestInitialThirst;
+ }
+
+ money64 ScPark::value_get() const
+ {
+ return gParkValue;
+ }
+ void ScPark::value_set(money64 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gParkValue != value)
+ {
+ gParkValue = value;
+ auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
+ context_broadcast_intent(&intent);
+ }
+ }
+
+ money64 ScPark::companyValue_get() const
+ {
+ return gCompanyValue;
+ }
+ void ScPark::companyValue_set(money64 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gCompanyValue != value)
+ {
+ gCompanyValue = value;
+ auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
+ context_broadcast_intent(&intent);
+ }
+ }
+
+ money16 ScPark::totalRideValueForMoney_get() const
+ {
+ return gTotalRideValueForMoney;
+ }
+
+ uint32_t ScPark::totalAdmissions_get() const
+ {
+ return gTotalAdmissions;
+ }
+ void ScPark::totalAdmissions_set(uint32_t value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gTotalAdmissions != value)
+ {
+ gTotalAdmissions = value;
+ window_invalidate_by_class(WC_PARK_INFORMATION);
+ }
+ }
+
+ money64 ScPark::totalIncomeFromAdmissions_get() const
+ {
+ return gTotalIncomeFromAdmissions;
+ }
+ void ScPark::totalIncomeFromAdmissions_set(money64 value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ if (gTotalIncomeFromAdmissions != value)
+ {
+ gTotalIncomeFromAdmissions = value;
+ window_invalidate_by_class(WC_PARK_INFORMATION);
+ }
+ }
+
+ money32 ScPark::landPrice_get() const
+ {
+ return gLandPrice;
+ }
+ void ScPark::landPrice_set(money32 value)
+ {
+ ThrowIfGameStateNotMutable();
+ gLandPrice = value;
+ }
+
+ money32 ScPark::constructionRightsPrice_get() const
+ {
+ return gConstructionRightsPrice;
+ }
+ void ScPark::constructionRightsPrice_set(money32 value)
+ {
+ ThrowIfGameStateNotMutable();
+ gConstructionRightsPrice = value;
+ }
+
+ int16_t ScPark::casualtyPenalty_get() const
+ {
+ return gParkRatingCasualtyPenalty;
+ }
+ void ScPark::casualtyPenalty_set(int16_t value)
+ {
+ ThrowIfGameStateNotMutable();
+ gParkRatingCasualtyPenalty = value;
+ }
+
+ uint16_t ScPark::parkSize_get() const
+ {
+ return gParkSize;
+ }
+
+ std::string ScPark::name_get() const
+ {
+ return GetContext()->GetGameState()->GetPark().Name;
+ }
+ void ScPark::name_set(std::string value)
+ {
+ ThrowIfGameStateNotMutable();
+
+ auto& park = GetContext()->GetGameState()->GetPark();
+ if (park.Name != value)
+ {
+ park.Name = value;
+ gfx_invalidate_screen();
+ }
+ }
+
+ bool ScPark::getFlag(const std::string& key) const
+ {
+ auto mask = ParkFlagMap[key];
+ return (gParkFlags & mask) != 0;
+ }
+
+ void ScPark::setFlag(const std::string& key, bool value)
+ {
+ ThrowIfGameStateNotMutable();
+ auto mask = ParkFlagMap[key];
+ if (value)
+ gParkFlags |= mask;
+ else
+ gParkFlags &= ~mask;
+ gfx_invalidate_screen();
+ }
+
+ std::vector> ScPark::messages_get() const
+ {
+ std::vector> result;
+ for (size_t i = 0, newsSize = gNewsItems.GetRecent().size(); i < newsSize; i++)
+ {
+ result.push_back(std::make_shared(i));
+ }
+ for (size_t i = 0, newsSize = gNewsItems.GetArchived().size(); i < newsSize; i++)
+ {
+ result.push_back(std::make_shared(i + News::ItemHistoryStart));
+ }
+ return result;
+ }
+
+ void ScPark::messages_set(const std::vector& value)
+ {
+ int32_t index = 0;
+ int32_t archiveIndex = News::ItemHistoryStart;
+ for (const auto& item : value)
+ {
+ auto isArchived = item["isArchived"].as_bool();
+ auto newsItem = FromDuk(item);
+ if (isArchived)
+ {
+ if (archiveIndex < News::MaxItems)
+ {
+ gNewsItems[archiveIndex] = newsItem;
+ archiveIndex++;
+ }
+ }
+ else
+ {
+ if (index < News::ItemHistoryStart)
+ {
+ gNewsItems[index] = newsItem;
+ index++;
+ }
+ }
+ }
+
+ // End the lists by setting next item to null
+ if (index < News::ItemHistoryStart)
+ {
+ gNewsItems[index].Type = News::ItemType::Null;
+ }
+ if (archiveIndex < News::MaxItems)
+ {
+ gNewsItems[archiveIndex].Type = News::ItemType::Null;
+ }
+ }
+
+ void ScPark::postMessage(DukValue message)
+ {
+ ThrowIfGameStateNotMutable();
+ try
+ {
+ uint32_t assoc = std::numeric_limits::max();
+ auto type = News::ItemType::Blank;
+ std::string text;
+ if (message.type() == DukValue::Type::STRING)
+ {
+ text = message.as_string();
+ }
+ else
+ {
+ type = GetParkMessageType(message["type"].as_string());
+ text = message["text"].as_string();
+ if (type == News::ItemType::Blank)
+ {
+ assoc = static_cast(((COORDS_NULL & 0xFFFF) << 16) | (COORDS_NULL & 0xFFFF));
+ }
+
+ auto dukSubject = message["subject"];
+ if (dukSubject.type() == DukValue::Type::NUMBER)
+ {
+ assoc = static_cast(dukSubject.as_int());
+ }
+ }
+ News::AddItemToQueue(type, text.c_str(), assoc);
+ }
+ catch (const DukException&)
+ {
+ duk_error(message.context(), DUK_ERR_ERROR, "Invalid message argument.");
+ }
+ }
+
+ void ScPark::Register(duk_context* ctx)
+ {
+ dukglue_register_property(ctx, &ScPark::cash_get, &ScPark::cash_set, "cash");
+ dukglue_register_property(ctx, &ScPark::rating_get, &ScPark::rating_set, "rating");
+ dukglue_register_property(ctx, &ScPark::bankLoan_get, &ScPark::bankLoan_set, "bankLoan");
+ dukglue_register_property(ctx, &ScPark::maxBankLoan_get, &ScPark::maxBankLoan_set, "maxBankLoan");
+ dukglue_register_property(ctx, &ScPark::entranceFee_get, &ScPark::entranceFee_set, "entranceFee");
+ dukglue_register_property(ctx, &ScPark::guests_get, nullptr, "guests");
+ dukglue_register_property(ctx, &ScPark::suggestedGuestMaximum_get, nullptr, "suggestedGuestMaximum");
+ dukglue_register_property(ctx, &ScPark::guestGenerationProbability_get, nullptr, "guestGenerationProbability");
+ dukglue_register_property(ctx, &ScPark::guestInitialCash_get, nullptr, "guestInitialCash");
+ dukglue_register_property(ctx, &ScPark::guestInitialHappiness_get, nullptr, "guestInitialHappiness");
+ dukglue_register_property(ctx, &ScPark::guestInitialHunger_get, nullptr, "guestInitialHunger");
+ dukglue_register_property(ctx, &ScPark::guestInitialThirst_get, nullptr, "guestInitialThirst");
+ dukglue_register_property(ctx, &ScPark::value_get, &ScPark::value_set, "value");
+ dukglue_register_property(ctx, &ScPark::companyValue_get, &ScPark::companyValue_set, "companyValue");
+ dukglue_register_property(ctx, &ScPark::totalRideValueForMoney_get, nullptr, "totalRideValueForMoney");
+ dukglue_register_property(ctx, &ScPark::totalAdmissions_get, &ScPark::totalAdmissions_set, "totalAdmissions");
+ dukglue_register_property(
+ ctx, &ScPark::totalIncomeFromAdmissions_get, &ScPark::totalIncomeFromAdmissions_set, "totalIncomeFromAdmissions");
+ dukglue_register_property(ctx, &ScPark::landPrice_get, &ScPark::landPrice_set, "landPrice");
+ dukglue_register_property(
+ ctx, &ScPark::constructionRightsPrice_get, &ScPark::constructionRightsPrice_set, "constructionRightsPrice");
+ dukglue_register_property(ctx, &ScPark::parkSize_get, nullptr, "parkSize");
+ dukglue_register_property(ctx, &ScPark::name_get, &ScPark::name_set, "name");
+ dukglue_register_property(ctx, &ScPark::messages_get, &ScPark::messages_set, "messages");
+ dukglue_register_property(ctx, &ScPark::casualtyPenalty_get, &ScPark::casualtyPenalty_set, "casualtyPenalty");
+ dukglue_register_method(ctx, &ScPark::getFlag, "getFlag");
+ dukglue_register_method(ctx, &ScPark::setFlag, "setFlag");
+ dukglue_register_method(ctx, &ScPark::postMessage, "postMessage");
+ }
+
+} // namespace OpenRCT2::Scripting
+
+#endif
diff --git a/src/openrct2/scripting/bindings/world/ScPark.hpp b/src/openrct2/scripting/bindings/world/ScPark.hpp
index 9a6784abdf..10fb765abb 100644
--- a/src/openrct2/scripting/bindings/world/ScPark.hpp
+++ b/src/openrct2/scripting/bindings/world/ScPark.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2020 OpenRCT2 developers
+ * 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
@@ -12,410 +12,86 @@
#ifdef ENABLE_SCRIPTING
# include "../../../Context.h"
-# include "../../../GameState.h"
# include "../../../common.h"
-# include "../../../core/String.hpp"
-# include "../../../management/Finance.h"
-# include "../../../management/NewsItem.h"
-# include "../../../peep/Peep.h"
-# include "../../../windows/Intent.h"
-# include "../../../world/Park.h"
# include "../../Duktape.hpp"
-# include "../../ScriptEngine.h"
# include "ScParkMessage.hpp"
# include
+# include
namespace OpenRCT2::Scripting
{
- static const DukEnumMap ParkFlagMap({
- { "open", PARK_FLAGS_PARK_OPEN },
- { "scenarioCompleteNameInput", PARK_FLAGS_SCENARIO_COMPLETE_NAME_INPUT },
- { "forbidLandscapeChanges", PARK_FLAGS_FORBID_LANDSCAPE_CHANGES },
- { "forbidTreeRemoval", PARK_FLAGS_FORBID_TREE_REMOVAL },
- { "forbidHighConstruction", PARK_FLAGS_FORBID_HIGH_CONSTRUCTION },
- { "preferLessIntenseRides", PARK_FLAGS_PREF_LESS_INTENSE_RIDES },
- { "forbidMarketingCampaigns", PARK_FLAGS_FORBID_MARKETING_CAMPAIGN },
- { "preferMoreIntenseRides", PARK_FLAGS_PREF_MORE_INTENSE_RIDES },
- { "noMoney", PARK_FLAGS_NO_MONEY },
- { "difficultGuestGeneration", PARK_FLAGS_DIFFICULT_GUEST_GENERATION },
- { "freeParkEntry", PARK_FLAGS_PARK_FREE_ENTRY },
- { "difficultParkRating", PARK_FLAGS_DIFFICULT_PARK_RATING },
- { "noMoney", PARK_FLAGS_NO_MONEY_SCENARIO },
- { "unlockAllPrices", PARK_FLAGS_UNLOCK_ALL_PRICES },
- });
-
class ScPark
{
public:
- money64 cash_get() const
- {
- return gCash;
- }
- void cash_set(money64 value)
- {
- ThrowIfGameStateNotMutable();
+ money64 cash_get() const;
+ void cash_set(money64 value);
- if (gCash != value)
- {
- gCash = value;
- auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
- context_broadcast_intent(&intent);
- }
- }
+ int32_t rating_get() const;
+ void rating_set(int32_t value);
- int32_t rating_get() const
- {
- return gParkRating;
- }
- void rating_set(int32_t value)
- {
- ThrowIfGameStateNotMutable();
+ money64 bankLoan_get() const;
+ void bankLoan_set(money64 value);
- auto valueClamped = std::min(std::max(0, value), 999);
- if (gParkRating != valueClamped)
- {
- gParkRating = std::min(std::max(0, value), 999);
- auto intent = Intent(INTENT_ACTION_UPDATE_PARK_RATING);
- context_broadcast_intent(&intent);
- }
- }
+ money64 maxBankLoan_get() const;
+ void maxBankLoan_set(money64 value);
- money64 bankLoan_get() const
- {
- return gBankLoan;
- }
- void bankLoan_set(money64 value)
- {
- ThrowIfGameStateNotMutable();
+ money16 entranceFee_get() const;
+ void entranceFee_set(money16 value);
- if (gBankLoan != value)
- {
- gBankLoan = value;
- auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
- context_broadcast_intent(&intent);
- }
- }
+ uint32_t guests_get() const;
- money64 maxBankLoan_get() const
- {
- return gMaxBankLoan;
- }
- void maxBankLoan_set(money64 value)
- {
- ThrowIfGameStateNotMutable();
+ uint32_t suggestedGuestMaximum_get() const;
- if (gMaxBankLoan != value)
- {
- gMaxBankLoan = value;
- auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
- context_broadcast_intent(&intent);
- }
- }
+ int32_t guestGenerationProbability_get() const;
- money16 entranceFee_get() const
- {
- return gParkEntranceFee;
- }
- void entranceFee_set(money16 value)
- {
- ThrowIfGameStateNotMutable();
+ money16 guestInitialCash_get() const;
- if (gParkEntranceFee != value)
- {
- gParkEntranceFee = value;
- window_invalidate_by_class(WC_PARK_INFORMATION);
- }
- }
+ uint8_t guestInitialHappiness_get() const;
- uint32_t guests_get() const
- {
- return gNumGuestsInPark;
- }
+ uint8_t guestInitialHunger_get() const;
- uint32_t suggestedGuestMaximum_get() const
- {
- return _suggestedGuestMaximum;
- }
+ uint8_t guestInitialThirst_get() const;
- int32_t guestGenerationProbability_get() const
- {
- return _guestGenerationProbability;
- }
+ money64 value_get() const;
+ void value_set(money64 value);
- money16 guestInitialCash_get() const
- {
- return gGuestInitialCash;
- }
+ money64 companyValue_get() const;
+ void companyValue_set(money64 value);
- uint8_t guestInitialHappiness_get() const
- {
- return gGuestInitialHappiness;
- }
+ money16 totalRideValueForMoney_get() const;
- uint8_t guestInitialHunger_get() const
- {
- return gGuestInitialHunger;
- }
+ uint32_t totalAdmissions_get() const;
+ void totalAdmissions_set(uint32_t value);
- uint8_t guestInitialThirst_get() const
- {
- return gGuestInitialThirst;
- }
+ money64 totalIncomeFromAdmissions_get() const;
+ void totalIncomeFromAdmissions_set(money64 value);
- money64 value_get() const
- {
- return gParkValue;
- }
- void value_set(money64 value)
- {
- ThrowIfGameStateNotMutable();
+ money32 landPrice_get() const;
+ void landPrice_set(money32 value);
- if (gParkValue != value)
- {
- gParkValue = value;
- auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
- context_broadcast_intent(&intent);
- }
- }
+ money32 constructionRightsPrice_get() const;
+ void constructionRightsPrice_set(money32 value);
- money64 companyValue_get() const
- {
- return gCompanyValue;
- }
- void companyValue_set(money64 value)
- {
- ThrowIfGameStateNotMutable();
+ int16_t casualtyPenalty_get() const;
+ void casualtyPenalty_set(int16_t value);
- if (gCompanyValue != value)
- {
- gCompanyValue = value;
- auto intent = Intent(INTENT_ACTION_UPDATE_CASH);
- context_broadcast_intent(&intent);
- }
- }
+ uint16_t parkSize_get() const;
- money16 totalRideValueForMoney_get() const
- {
- return gTotalRideValueForMoney;
- }
+ std::string name_get() const;
+ void name_set(std::string value);
- uint32_t totalAdmissions_get() const
- {
- return gTotalAdmissions;
- }
- void totalAdmissions_set(uint32_t value)
- {
- ThrowIfGameStateNotMutable();
+ bool getFlag(const std::string& key) const;
- if (gTotalAdmissions != value)
- {
- gTotalAdmissions = value;
- window_invalidate_by_class(WC_PARK_INFORMATION);
- }
- }
+ void setFlag(const std::string& key, bool value);
- money64 totalIncomeFromAdmissions_get() const
- {
- return gTotalIncomeFromAdmissions;
- }
- void totalIncomeFromAdmissions_set(money64 value)
- {
- ThrowIfGameStateNotMutable();
+ std::vector> messages_get() const;
- if (gTotalIncomeFromAdmissions != value)
- {
- gTotalIncomeFromAdmissions = value;
- window_invalidate_by_class(WC_PARK_INFORMATION);
- }
- }
+ void messages_set(const std::vector& value);
- money32 landPrice_get() const
- {
- return gLandPrice;
- }
- void landPrice_set(money32 value)
- {
- ThrowIfGameStateNotMutable();
- gLandPrice = value;
- }
+ void postMessage(DukValue message);
- money32 constructionRightsPrice_get() const
- {
- return gConstructionRightsPrice;
- }
- void constructionRightsPrice_set(money32 value)
- {
- ThrowIfGameStateNotMutable();
- gConstructionRightsPrice = value;
- }
-
- int16_t casualtyPenalty_get() const
- {
- return gParkRatingCasualtyPenalty;
- }
- void casualtyPenalty_set(int16_t value)
- {
- ThrowIfGameStateNotMutable();
- gParkRatingCasualtyPenalty = value;
- }
-
- uint16_t parkSize_get() const
- {
- return gParkSize;
- }
-
- std::string name_get() const
- {
- return GetContext()->GetGameState()->GetPark().Name;
- }
- void name_set(std::string value)
- {
- ThrowIfGameStateNotMutable();
-
- auto& park = GetContext()->GetGameState()->GetPark();
- if (park.Name != value)
- {
- park.Name = value;
- gfx_invalidate_screen();
- }
- }
-
- bool getFlag(const std::string& key) const
- {
- auto mask = ParkFlagMap[key];
- return (gParkFlags & mask) != 0;
- }
-
- void setFlag(const std::string& key, bool value)
- {
- ThrowIfGameStateNotMutable();
- auto mask = ParkFlagMap[key];
- if (value)
- gParkFlags |= mask;
- else
- gParkFlags &= ~mask;
- gfx_invalidate_screen();
- }
-
- std::vector> messages_get() const
- {
- std::vector> result;
- for (size_t i = 0, newsSize = gNewsItems.GetRecent().size(); i < newsSize; i++)
- {
- result.push_back(std::make_shared(i));
- }
- for (size_t i = 0, newsSize = gNewsItems.GetArchived().size(); i < newsSize; i++)
- {
- result.push_back(std::make_shared(i + News::ItemHistoryStart));
- }
- return result;
- }
-
- void messages_set(const std::vector& value)
- {
- int32_t index = 0;
- int32_t archiveIndex = News::ItemHistoryStart;
- for (const auto& item : value)
- {
- auto isArchived = item["isArchived"].as_bool();
- auto newsItem = FromDuk(item);
- if (isArchived)
- {
- if (archiveIndex < News::MaxItems)
- {
- gNewsItems[archiveIndex] = newsItem;
- archiveIndex++;
- }
- }
- else
- {
- if (index < News::ItemHistoryStart)
- {
- gNewsItems[index] = newsItem;
- index++;
- }
- }
- }
-
- // End the lists by setting next item to null
- if (index < News::ItemHistoryStart)
- {
- gNewsItems[index].Type = News::ItemType::Null;
- }
- if (archiveIndex < News::MaxItems)
- {
- gNewsItems[archiveIndex].Type = News::ItemType::Null;
- }
- }
-
- void postMessage(DukValue message)
- {
- ThrowIfGameStateNotMutable();
- try
- {
- uint32_t assoc = std::numeric_limits::max();
- auto type = News::ItemType::Blank;
- std::string text;
- if (message.type() == DukValue::Type::STRING)
- {
- text = message.as_string();
- }
- else
- {
- type = GetParkMessageType(message["type"].as_string());
- text = message["text"].as_string();
- if (type == News::ItemType::Blank)
- {
- assoc = static_cast(((COORDS_NULL & 0xFFFF) << 16) | (COORDS_NULL & 0xFFFF));
- }
-
- auto dukSubject = message["subject"];
- if (dukSubject.type() == DukValue::Type::NUMBER)
- {
- assoc = static_cast(dukSubject.as_int());
- }
- }
- News::AddItemToQueue(type, text.c_str(), assoc);
- }
- catch (const DukException&)
- {
- duk_error(message.context(), DUK_ERR_ERROR, "Invalid message argument.");
- }
- }
-
- static void Register(duk_context* ctx)
- {
- dukglue_register_property(ctx, &ScPark::cash_get, &ScPark::cash_set, "cash");
- dukglue_register_property(ctx, &ScPark::rating_get, &ScPark::rating_set, "rating");
- dukglue_register_property(ctx, &ScPark::bankLoan_get, &ScPark::bankLoan_set, "bankLoan");
- dukglue_register_property(ctx, &ScPark::maxBankLoan_get, &ScPark::maxBankLoan_set, "maxBankLoan");
- dukglue_register_property(ctx, &ScPark::entranceFee_get, &ScPark::entranceFee_set, "entranceFee");
- dukglue_register_property(ctx, &ScPark::guests_get, nullptr, "guests");
- dukglue_register_property(ctx, &ScPark::suggestedGuestMaximum_get, nullptr, "suggestedGuestMaximum");
- dukglue_register_property(ctx, &ScPark::guestGenerationProbability_get, nullptr, "guestGenerationProbability");
- dukglue_register_property(ctx, &ScPark::guestInitialCash_get, nullptr, "guestInitialCash");
- dukglue_register_property(ctx, &ScPark::guestInitialHappiness_get, nullptr, "guestInitialHappiness");
- dukglue_register_property(ctx, &ScPark::guestInitialHunger_get, nullptr, "guestInitialHunger");
- dukglue_register_property(ctx, &ScPark::guestInitialThirst_get, nullptr, "guestInitialThirst");
- dukglue_register_property(ctx, &ScPark::value_get, &ScPark::value_set, "value");
- dukglue_register_property(ctx, &ScPark::companyValue_get, &ScPark::companyValue_set, "companyValue");
- dukglue_register_property(ctx, &ScPark::totalRideValueForMoney_get, nullptr, "totalRideValueForMoney");
- dukglue_register_property(ctx, &ScPark::totalAdmissions_get, &ScPark::totalAdmissions_set, "totalAdmissions");
- dukglue_register_property(
- ctx, &ScPark::totalIncomeFromAdmissions_get, &ScPark::totalIncomeFromAdmissions_set,
- "totalIncomeFromAdmissions");
- dukglue_register_property(ctx, &ScPark::landPrice_get, &ScPark::landPrice_set, "landPrice");
- dukglue_register_property(
- ctx, &ScPark::constructionRightsPrice_get, &ScPark::constructionRightsPrice_set, "constructionRightsPrice");
- dukglue_register_property(ctx, &ScPark::parkSize_get, nullptr, "parkSize");
- dukglue_register_property(ctx, &ScPark::name_get, &ScPark::name_set, "name");
- dukglue_register_property(ctx, &ScPark::messages_get, &ScPark::messages_set, "messages");
- dukglue_register_property(ctx, &ScPark::casualtyPenalty_get, &ScPark::casualtyPenalty_set, "casualtyPenalty");
- dukglue_register_method(ctx, &ScPark::getFlag, "getFlag");
- dukglue_register_method(ctx, &ScPark::setFlag, "setFlag");
- dukglue_register_method(ctx, &ScPark::postMessage, "postMessage");
- }
+ static void Register(duk_context* ctx);
};
} // namespace OpenRCT2::Scripting
diff --git a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp
index 58f124520f..48801a50a3 100644
--- a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp
+++ b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp
@@ -18,6 +18,7 @@
# include "../../ScriptEngine.h"
# include
+# include
namespace OpenRCT2::Scripting
{