diff --git a/bin/ai/compat_14.nut b/bin/ai/compat_14.nut
index 012a8d070c..b27cbfb6aa 100644
--- a/bin/ai/compat_14.nut
+++ b/bin/ai/compat_14.nut
@@ -7,6 +7,19 @@
/* This file contains code to downgrade the API from 15 to 14. */
+AIDate <- AIEconomyDate;
+AIDate.IsValidDate <- function(date) { return AIDate(date).IsValid(); }
+AIDate.GetCurrentDateCompat14 <- AIDate.GetCurrentDate;
+AIDate.GetCurrentDate <- function() { return AIDate.GetCurrentDateCompat14().date(); }
+AIDate.GetYearCompat14 <- AIDate.GetYear;
+AIDate.GetYear <- function(date) { return AIDate(date).GetYearCompat14(); }
+AIDate.GetMonthCompat14 <- AIDate.GetMonth;
+AIDate.GetMonth <- function(date) { return AIDate(date).GetMonthCompat14(); }
+AIDate.GetDayOfMonthCompat14 <- AIDate.GetDayOfMonth;
+AIDate.GetDayOfMonth <- function(date) { return AIDate(date).GetDayOfMonthCompat14(); }
+AIDate.GetDateCompat14 <- AIDate.GetDate;
+AIDate.GetDate <- function(year, month, day) { return AIDate.GetDateCompat14(year, month, day).date(); }
+
AIBridge.GetBridgeID <- AIBridge.GetBridgeType;
class AICompat14 {
@@ -17,6 +30,8 @@ class AICompat14 {
}
}
+AIBaseStation.GetConstructionDateCompat14 <- AIBaseStation.GetConstructionDate;
+AIBaseStation.GetConstructionDate <- function(station_id) { return AIBaseStation.GetConstructionDateCompat14(station_id).date(); }
AIBaseStation.SetNameCompat14 <- AIBaseStation.SetName;
AIBaseStation.SetName <- function(id, name) { return AIBaseStation.SetNameCompat14(id, AICompat14.Text(name)); }
@@ -25,12 +40,18 @@ AICompany.SetName <- function(name) { return AICompany.SetNameCompat14(AICompat1
AICompany.SetPresidentNameCompat14 <- AICompany.SetPresidentName;
AICompany.SetPresidentName <- function(name) { return AICompany.SetPresidentNameCompat14(AICompat14.Text(name)); }
+AIEngine.GetDesignDateCompat14 <- AIEngine.GetDesignDate;
+AIEngine.GetDesignDate <- function(engine_id) { return AIEngine.GetDesignDateCompat14(engine_id).date(); }
+
AIGroup.SetNameCompat14 <- AIGroup.SetName;
AIGroup.SetName <- function(id, name) { return AIGroup.SetNameCompat14(id, AICompat14.Text(name)); }
AISign.BuildSignCompat14 <- AISign.BuildSign;
AISign.BuildSign <- function(id, name) { return AISign.BuildSignCompat14(id, AICompat14.Text(name)); }
+AISubsidy.GetExpireDateCompat14 <- AISubsidy.GetExpireDate;
+AISubsidy.GetExpireDate <- function(subsidy_id) { return AISubsidy.GetExpireDateCompat14(subsidy_id).date(); }
+
AITown.FoundTownCompat14 <- AITown.FoundTown;
AITown.FoundTown <- function(tile, size, city, layout, name) { return AITown.FoundTownCompat14(tile, size, city, layout, AICompat14.Text(name)); }
diff --git a/bin/game/compat_14.nut b/bin/game/compat_14.nut
index 757e2496f4..dc5afc5bee 100644
--- a/bin/game/compat_14.nut
+++ b/bin/game/compat_14.nut
@@ -7,6 +7,19 @@
/* This file contains code to downgrade the API from 15 to 14. */
+GSDate <- GSEconomyDate;
+GSDate.IsValidDate <- function(date) { return GSDate(date).IsValid(); }
+GSDate.GetCurrentDateCompat14 <- GSDate.GetCurrentDate;
+GSDate.GetCurrentDate <- function() { return GSDate.GetCurrentDateCompat14().date(); }
+GSDate.GetYearCompat14 <- GSDate.GetYear;
+GSDate.GetYear <- function(date) { return GSDate(date).GetYearCompat14(); }
+GSDate.GetMonthCompat14 <- GSDate.GetMonth;
+GSDate.GetMonth <- function(date) { return GSDate(date).GetMonthCompat14(); }
+GSDate.GetDayOfMonthCompat14 <- GSDate.GetDayOfMonth;
+GSDate.GetDayOfMonth <- function(date) { return GSDate(date).GetDayOfMonthCompat14(); }
+GSDate.GetDateCompat14 <- GSDate.GetDate;
+GSDate.GetDate <- function(year, month, day) { return GSDate.GetDateCompat14(year, month, day).date(); }
+
GSBridge.GetBridgeID <- GSBridge.GetBridgeType;
/* Emulate old GSText parameter padding behaviour */
@@ -21,6 +34,8 @@ class GSCompat14 {
}
}
+GSBaseStation.GetConstructionDateCompat14 <- GSBaseStation.GetConstructionDate;
+GSBaseStation.GetConstructionDate <- function(station_id) { return GSBaseStation.GetConstructionDateCompat14(station_id).date(); }
GSBaseStation.SetNameCompat14 <- GSBaseStation.SetName;
GSBaseStation.SetName <- function(id, name) { return GSBaseStation.SetNameCompat14(id, GSCompat14.Text(name)); }
@@ -29,6 +44,9 @@ GSCompany.SetName <- function(name) { return GSCompany.SetNameCompat14(GSCompat1
GSCompany.SetPresidentNameCompat14 <- GSCompany.SetPresidentName;
GSCompany.SetPresidentName <- function(name) { return GSCompany.SetPresidentNameCompat14(GSCompat14.Text(name)); }
+GSEngine.GetDesignDateCompat14 <- GSEngine.GetDesignDate;
+GSEngine.GetDesignDate <- function(engine_id) { return GSEngine.GetDesignDateCompat14(engine_id).date(); }
+
GSGoal.NewCompat14 <- GSGoal.New;
GSGoal.New <- function(company, goal, type, dest) { return GSGoal.NewCompat14(company, GSCompat14.Text(goal), type, dest); }
GSGoal.SetTextCompat14 <- GSGoal.SetText;
@@ -43,6 +61,10 @@ GSGoal.QuestionClient <- function(id, target, is_client, question, type, buttons
GSGroup.SetNameCompat14 <- GSGroup.SetName;
GSGroup.SetName <- function(id, name) { return GSGroup.SetNameCompat14(id, GSCompat14.Text(name)); }
+GSIndustry.GetConstructionDateCompat14 <- GSIndustry.GetConstructionDate;
+GSIndustry.GetConstructionDate <- function(industry_id) { return GSIndustry.GetConstructionDateCompat14(industry_id).date(); }
+GSIndustry.GetCargoLastAcceptedDateCompat14 <- GSIndustry.GetCargoLastAcceptedDate;
+GSIndustry.GetCargoLastAcceptedDate <- function(industry_id, cargo_type) { return GSIndustry.GetCargoLastAcceptedDateCompat14(industry_id, cargo_type).date(); }
GSIndustry.SetTextCompat14 <- GSIndustry.SetText;
GSIndustry.SetText <- function(id, text) { return GSIndustry.SetTextCompat14(id, GSCompat14.Text(text)); }
GSIndustry.SetProductionLevelCompat14 <- GSIndustry.SetProductionLevel;
@@ -63,15 +85,22 @@ GSNews.Create <- function(type, text, company, ref_type, ref) { return GSNews.Cr
GSSign.BuildSignCompat14 <- GSSign.BuildSign;
GSSign.BuildSign <- function(id, name) { return GSSign.BuildSignCompat14(id, GSCompat14.Text(name)); }
+GSStoryPage.GetDateCompat14 <- GSStoryPage.GetDate;
+GSStoryPage.GetDate <- function(story_page_id) { return GSStoryPage.GetDateCompat14(story_page_id).date(); }
GSStoryPage.NewCompat14 <- GSStoryPage.New;
GSStoryPage.New <- function(company, title) { return GSStoryPage.NewCompat14(company, GSCompat14.Text(title)); }
GSStoryPage.NewElementCompat14 <- GSStoryPage.NewElement;
GSStoryPage.NewElement <- function(page, type, ref, text) { return GSStoryPage.NewElementCompat14(page, type, ref, GSCompat14.Text(text)); }
GSStoryPage.UpdateElementCompat14 <- GSStoryPage.UpdateElement;
GSStoryPage.UpdateElement <- function(id, ref, text) { return GSStoryPage.UpdateElementCompat14(id, ref, GSCompat14.Text(text)); }
+GSStoryPage.SetDateCompat14 <- GSStoryPage.SetDate;
+GSStoryPage.SetDate <- function(story_page_id, date) { return GSStoryPage.SetDateCompat14(story_page_id, GSCalendarDate(date)); }
GSStoryPage.SetTitleCompat14 <- GSStoryPage.SetTitle;
GSStoryPage.SetTitle <- function(page, tile) { return GSStoryPage.SetTitleCompat14(page, GSCompat14.Text(title)); }
+GSSubsidy.GetExpireDateCompat14 <- GSSubsidy.GetExpireDate;
+GSSubsidy.GetExpireDate <- function(subsidy_id) { return GSSubsidy.GetExpireDateCompat14(subsidy_id).date(); }
+
GSTown.SetNameCompat14 <- GSTown.SetName;
GSTown.SetName <- function(id, name) { return GSTown.SetNameCompat14(id, GSCompat14.Text(name)); }
GSTown.SetTextCompat14 <- GSTown.SetText;
diff --git a/src/script/api/CMakeLists.txt b/src/script/api/CMakeLists.txt
index 28fd71128a..1c1f7d55fe 100644
--- a/src/script/api/CMakeLists.txt
+++ b/src/script/api/CMakeLists.txt
@@ -40,13 +40,15 @@ foreach(API "ai;AI" "game;GS" "template;Template")
list(GET API 1 APIUC)
foreach(SCRIPT_API_FILE IN LISTS SCRIPT_API_FILES)
- if("${SCRIPT_API_FILE}" MATCHES ".*script_controller.*")
- continue()
- endif()
get_filename_component(SCRIPT_API_FILE_NAME "${SCRIPT_API_FILE}" NAME_WE)
string(REPLACE "script_" "${APILC}_" SCRIPT_API_FILE_NAME "${SCRIPT_API_FILE_NAME}")
set(SCRIPT_API_BINARY_FILE "${CMAKE_BINARY_DIR}/generated/script/api/${APILC}/${SCRIPT_API_FILE_NAME}.sq.hpp")
+ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${APILC}/${SCRIPT_API_FILE_NAME}.sq.hpp")
+ file(REMOVE "${SCRIPT_API_BINARY_FILE}")
+ continue()
+ endif()
+
add_custom_command_timestamp(OUTPUT ${SCRIPT_API_BINARY_FILE}
COMMAND ${CMAKE_COMMAND}
-DSCRIPT_API_SOURCE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/squirrel_export.sq.hpp.in
@@ -74,6 +76,7 @@ foreach(API "ai;AI" "game;GS" "template;Template")
if(NOT "${APILC}" STREQUAL "template")
list(APPEND SCRIPT_${APIUC}_BINARY_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${APILC}/${APILC}_controller.sq.hpp")
+ list(APPEND SCRIPT_${APIUC}_BINARY_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${APILC}/${APILC}_date.sq.hpp")
set(INCLUDES_BINARY_FILE "${CMAKE_BINARY_DIR}/generated/script/api/${APILC}/${APILC}_includes.hpp")
set(API_FILES "${CMAKE_CURRENT_BINARY_DIR}/${APILC}.files")
file(GENERATE OUTPUT ${API_FILES} CONTENT "${SCRIPT_${APIUC}_BINARY_FILES}")
@@ -120,6 +123,7 @@ foreach(API "ai;AI" "game;GS" "template;Template")
)
endif()
else()
+ list(APPEND SCRIPT_Template_BINARY_FILES "${CMAKE_CURRENT_SOURCE_DIR}/template/template_date.sq.hpp")
add_dependencies(script_api
script_${APILC}
)
@@ -233,7 +237,6 @@ add_files(
script_company.cpp
script_companymode.cpp
script_controller.cpp
- script_date.cpp
script_depotlist.cpp
script_engine.cpp
script_enginelist.cpp
diff --git a/src/script/api/ai/ai_date.sq.hpp b/src/script/api/ai/ai_date.sq.hpp
new file mode 100644
index 0000000000..8b7d83ff95
--- /dev/null
+++ b/src/script/api/ai/ai_date.sq.hpp
@@ -0,0 +1,62 @@
+/*
+ * 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 .
+ */
+
+#include "../script_date.hpp"
+#include "../template/template_date.sq.hpp"
+
+
+template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "AIEconomyDate"); return 1; }
+template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "AICalendarDate"); return 1; }
+
+void SQAIDate_Register(Squirrel &engine)
+{
+ DefSQClass SQAIEconomyDate("AIEconomyDate");
+ SQAIEconomyDate.PreRegister(engine, "AIObject");
+ SQAIEconomyDate.AddSQAdvancedConstructor(engine);
+
+ SQAIEconomyDate.DefSQConst(engine, ScriptEconomyDate::DATE_INVALID, "DATE_INVALID");
+
+ SQAIEconomyDate.DefSQStaticMethod(engine, &ScriptEconomyDate::GetCurrentDate, "GetCurrentDate", ".");
+ SQAIEconomyDate.DefSQStaticMethod(engine, &ScriptEconomyDate::GetDate, "GetDate", ".iii");
+
+ SQAIEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::IsValid, "IsValid", ".");
+ SQAIEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::GetYear, "GetYear", ".");
+ SQAIEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::GetMonth, "GetMonth", ".");
+ SQAIEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::GetDayOfMonth, "GetDayOfMonth", ".");
+ SQAIEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::date, "date", ".");
+
+ SQAIEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_tostring, "_tostring");
+ SQAIEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_add, "_add");
+ SQAIEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_sub, "_sub");
+ SQAIEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_cmp, "_cmp");
+
+ SQAIEconomyDate.PostRegister(engine);
+
+
+ DefSQClass SQAICalendarDate("AICalendarDate");
+ SQAICalendarDate.PreRegister(engine, "AIObject");
+ SQAICalendarDate.AddSQAdvancedConstructor(engine);
+
+ SQAICalendarDate.DefSQConst(engine, ScriptCalendarDate::DATE_INVALID, "DATE_INVALID");
+
+ SQAICalendarDate.DefSQStaticMethod(engine, &ScriptCalendarDate::GetCurrentDate, "GetCurrentDate", ".");
+ SQAICalendarDate.DefSQStaticMethod(engine, &ScriptCalendarDate::GetDate, "GetDate", ".iii");
+
+ SQAICalendarDate.DefSQMethod(engine, &ScriptCalendarDate::IsValid, "IsValid", ".");
+ SQAICalendarDate.DefSQMethod(engine, &ScriptCalendarDate::GetYear, "GetYear", ".");
+ SQAICalendarDate.DefSQMethod(engine, &ScriptCalendarDate::GetMonth, "GetMonth", ".");
+ SQAICalendarDate.DefSQMethod(engine, &ScriptCalendarDate::GetDayOfMonth, "GetDayOfMonth", ".");
+ SQAICalendarDate.DefSQMethod(engine, &ScriptCalendarDate::date, "date", ".");
+
+ SQAICalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_tostring, "_tostring");
+ SQAICalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_add, "_add");
+ SQAICalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_sub, "_sub");
+ SQAICalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_cmp, "_cmp");
+
+ SQAICalendarDate.PostRegister(engine);
+
+}
diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp
index d359902418..5074d87dad 100644
--- a/src/script/api/ai_changelog.hpp
+++ b/src/script/api/ai_changelog.hpp
@@ -28,6 +28,11 @@
* \li AICargo::CC_POTABLE
* \li AICargo::CC_NON_POTABLE
* \li AIVehicleList_Waypoint
+ * \li AIEconomyDate
+ * \li AICalendarDate
+ *
+ * API removals:
+ * \li AIDate
*
* Other changes:
* \li AIBridge::GetBridgeID renamed to AIBridge::GetBridgeType
diff --git a/src/script/api/game/game_date.sq.hpp b/src/script/api/game/game_date.sq.hpp
new file mode 100644
index 0000000000..71b46ff9bb
--- /dev/null
+++ b/src/script/api/game/game_date.sq.hpp
@@ -0,0 +1,62 @@
+/*
+ * 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 .
+ */
+
+#include "../script_date.hpp"
+#include "../template/template_date.sq.hpp"
+
+template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "GSEconomyDate"); return 1; }
+template <> SQInteger PushClassName(HSQUIRRELVM vm) { sq_pushstring(vm, "GSCalendarDate"); return 1; }
+
+void SQGSDate_Register(Squirrel &engine)
+{
+ DefSQClass SQGSEconomyDate("GSEconomyDate");
+ SQGSEconomyDate.PreRegister(engine, "GSObject");
+ SQGSEconomyDate.AddSQAdvancedConstructor(engine);
+
+ SQGSEconomyDate.DefSQConst(engine, ScriptEconomyDate::DATE_INVALID, "DATE_INVALID");
+
+ SQGSEconomyDate.DefSQStaticMethod(engine, &ScriptEconomyDate::GetCurrentDate, "GetCurrentDate", ".");
+ SQGSEconomyDate.DefSQStaticMethod(engine, &ScriptEconomyDate::GetDate, "GetDate", ".iii");
+ SQGSEconomyDate.DefSQStaticMethod(engine, &ScriptEconomyDate::GetSystemTime, "GetSystemTime", ".");
+
+ SQGSEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::IsValid, "IsValid", ".");
+ SQGSEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::GetYear, "GetYear", ".");
+ SQGSEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::GetMonth, "GetMonth", ".");
+ SQGSEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::GetDayOfMonth, "GetDayOfMonth", ".");
+ SQGSEconomyDate.DefSQMethod(engine, &ScriptEconomyDate::date, "date", ".");
+
+ SQGSEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_tostring, "_tostring");
+ SQGSEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_add, "_add");
+ SQGSEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_sub, "_sub");
+ SQGSEconomyDate.DefSQAdvancedMethod(engine, &ScriptEconomyDate::_cmp, "_cmp");
+
+ SQGSEconomyDate.PostRegister(engine);
+
+
+ DefSQClass SQGSCalendarDate("GSCalendarDate");
+ SQGSCalendarDate.PreRegister(engine, "GSObject");
+ SQGSCalendarDate.AddSQAdvancedConstructor(engine);
+
+ SQGSCalendarDate.DefSQConst(engine, ScriptCalendarDate::DATE_INVALID, "DATE_INVALID");
+
+ SQGSCalendarDate.DefSQStaticMethod(engine, &ScriptCalendarDate::GetCurrentDate, "GetCurrentDate", ".");
+ SQGSCalendarDate.DefSQStaticMethod(engine, &ScriptCalendarDate::GetDate, "GetDate", ".iii");
+ SQGSCalendarDate.DefSQStaticMethod(engine, &ScriptCalendarDate::GetSystemTime, "GetSystemTime", ".");
+
+ SQGSCalendarDate.DefSQMethod(engine, &ScriptCalendarDate::IsValid, "IsValid", ".");
+ SQGSCalendarDate.DefSQMethod(engine, &ScriptCalendarDate::GetYear, "GetYear", ".");
+ SQGSCalendarDate.DefSQMethod(engine, &ScriptCalendarDate::GetMonth, "GetMonth", ".");
+ SQGSCalendarDate.DefSQMethod(engine, &ScriptCalendarDate::GetDayOfMonth, "GetDayOfMonth", ".");
+ SQGSCalendarDate.DefSQMethod(engine, &ScriptCalendarDate::date, "date", ".");
+
+ SQGSCalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_tostring, "_tostring");
+ SQGSCalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_add, "_add");
+ SQGSCalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_sub, "_sub");
+ SQGSCalendarDate.DefSQAdvancedMethod(engine, &ScriptCalendarDate::_cmp, "_cmp");
+
+ SQGSCalendarDate.PostRegister(engine);
+}
diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp
index e57e873a14..18e7dbb9e6 100644
--- a/src/script/api/game_changelog.hpp
+++ b/src/script/api/game_changelog.hpp
@@ -29,6 +29,11 @@
* \li GSCargo::CC_NON_POTABLE
* \li GSVehicleList_Waypoint
* \li GSBaseStation::GetOwner
+ * \li GSEconomyDate
+ * \li GSCalendarDate
+ *
+ * API removals:
+ * \li GSDate
*
* Other changes:
* \li GSBridge::GetBridgeID renamed to GSBridge::GetBridgeType
diff --git a/src/script/api/script_basestation.cpp b/src/script/api/script_basestation.cpp
index e7bea4ec29..9c500e0e56 100644
--- a/src/script/api/script_basestation.cpp
+++ b/src/script/api/script_basestation.cpp
@@ -66,9 +66,9 @@
return ::BaseStation::Get(station_id)->xy;
}
-/* static */ ScriptDate::Date ScriptBaseStation::GetConstructionDate(StationID station_id)
+/* static */ ScriptCalendarDate *ScriptBaseStation::GetConstructionDate(StationID station_id)
{
- if (!IsValidBaseStation(station_id)) return ScriptDate::DATE_INVALID;
+ if (!IsValidBaseStation(station_id)) return new ScriptCalendarDate();
- return (ScriptDate::Date)::BaseStation::Get(station_id)->build_date.base();
+ return new ScriptCalendarDate(static_cast(::BaseStation::Get(station_id)->build_date.base()));
}
diff --git a/src/script/api/script_basestation.hpp b/src/script/api/script_basestation.hpp
index 646bec13ab..01b85e732d 100644
--- a/src/script/api/script_basestation.hpp
+++ b/src/script/api/script_basestation.hpp
@@ -78,7 +78,7 @@ public:
* @return The last calendar-date some part of this station was build.
* @see \ref ScriptCalendarTime
*/
- static ScriptDate::Date GetConstructionDate(StationID station_id);
+ static ScriptCalendarDate *GetConstructionDate(StationID station_id);
};
#endif /* SCRIPT_BASESTATION_HPP */
diff --git a/src/script/api/script_client.cpp b/src/script/api/script_client.cpp
index 10e3c73f2a..5f69be5af3 100644
--- a/src/script/api/script_client.cpp
+++ b/src/script/api/script_client.cpp
@@ -46,9 +46,9 @@ static NetworkClientInfo *FindClientInfo(ScriptClient::ClientID client)
return ScriptCompany::ToScriptCompanyID(ci->client_playas);
}
-/* static */ ScriptDate::Date ScriptClient::GetJoinDate(ScriptClient::ClientID client)
+/* static */ ScriptEconomyDate *ScriptClient::GetJoinDate(ScriptClient::ClientID client)
{
NetworkClientInfo *ci = FindClientInfo(client);
- if (ci == nullptr) return ScriptDate::DATE_INVALID;
- return (ScriptDate::Date)ci->join_date.base();
+ if (ci == nullptr) return new ScriptEconomyDate();
+ return new ScriptEconomyDate(static_cast(ci->join_date.base()));
}
diff --git a/src/script/api/script_client.hpp b/src/script/api/script_client.hpp
index 7e463e4f94..a837f6f774 100644
--- a/src/script/api/script_client.hpp
+++ b/src/script/api/script_client.hpp
@@ -62,7 +62,7 @@ public:
* @return The economy-date when client has joined.
* @see \ref ScriptEconomyTime
*/
- static ScriptDate::Date GetJoinDate(ClientID client);
+ static ScriptEconomyDate *GetJoinDate(ClientID client);
};
diff --git a/src/script/api/script_date.cpp b/src/script/api/script_date.cpp
deleted file mode 100644
index 3ff39b6232..0000000000
--- a/src/script/api/script_date.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 script_date.cpp Implementation of ScriptDate. */
-
-#include "../../stdafx.h"
-#include "script_date.hpp"
-#include "../../timer/timer_game_economy.h"
-
-#include
-
-#include "../../safeguards.h"
-
-/* static */ bool ScriptDate::IsValidDate(Date date)
-{
- return date >= 0;
-}
-
-/* static */ ScriptDate::Date ScriptDate::GetCurrentDate()
-{
- return (ScriptDate::Date)TimerGameEconomy::date.base();
-}
-
-/* static */ SQInteger ScriptDate::GetYear(ScriptDate::Date date)
-{
- if (date < 0) return DATE_INVALID;
-
- ::TimerGameEconomy::YearMonthDay ymd = ::TimerGameEconomy::ConvertDateToYMD(::TimerGameEconomy::Date{date});
- return ymd.year.base();
-}
-
-/* static */ SQInteger ScriptDate::GetMonth(ScriptDate::Date date)
-{
- if (date < 0) return DATE_INVALID;
-
- ::TimerGameEconomy::YearMonthDay ymd = ::TimerGameEconomy::ConvertDateToYMD(::TimerGameEconomy::Date{date});
- return ymd.month + 1;
-}
-
-/* static */ SQInteger ScriptDate::GetDayOfMonth(ScriptDate::Date date)
-{
- if (date < 0) return DATE_INVALID;
-
- ::TimerGameEconomy::YearMonthDay ymd = ::TimerGameEconomy::ConvertDateToYMD(::TimerGameEconomy::Date{date});
- return ymd.day;
-}
-
-/* static */ ScriptDate::Date ScriptDate::GetDate(SQInteger year, SQInteger month, SQInteger day_of_month)
-{
- if (month < 1 || month > 12) return DATE_INVALID;
- if (day_of_month < 1 || day_of_month > 31) return DATE_INVALID;
-
- ::TimerGameEconomy::Year timer_year{ClampTo(year)};
- if (timer_year < EconomyTime::MIN_YEAR || timer_year > EconomyTime::MAX_YEAR) return DATE_INVALID;
-
- return static_cast(::TimerGameEconomy::ConvertYMDToDate(timer_year, month - 1, day_of_month).base());
-}
-
-/* static */ SQInteger ScriptDate::GetSystemTime()
-{
- time_t t;
- time(&t);
- return t;
-}
diff --git a/src/script/api/script_date.hpp b/src/script/api/script_date.hpp
index 44f609d80b..f59628efcb 100644
--- a/src/script/api/script_date.hpp
+++ b/src/script/api/script_date.hpp
@@ -12,7 +12,175 @@
#include "script_object.hpp"
#include "../../timer/timer_game_economy.h"
+#include "../squirrel_helper.hpp"
+#ifndef DOXYGEN_API
+template
+struct StringLiteral {
+ constexpr StringLiteral(const char (&str)[N])
+ {
+ std::copy_n(str, N, this->value);
+ }
+
+ char value[N];
+};
+
+template
+class ScriptDateBase : public ScriptObject {
+public:
+ using YearMonthDay = Timer::YearMonthDay;
+ using Year = Timer::Year;
+
+ enum Date {
+ DATE_INVALID = Time::INVALID_DATE.base(),
+ };
+
+ ScriptDateBase(Date date = DATE_INVALID) : _date(date) {}
+ ScriptDateBase(HSQUIRRELVM vm) : _date(DATE_INVALID)
+ {
+ int nparam = sq_gettop(vm) - 1;
+ if (nparam >= 1) {
+ SQInteger date;
+ if (SQ_FAILED(sq_getinteger(vm, 2, &date))) {
+ throw sq_throwerror(vm, "Argument must be an integer");
+ }
+ this->_date = static_cast(date);
+ }
+ }
+
+ bool IsValid()
+ {
+ return this->_date > 0;
+ }
+
+ static ScriptDateBase *GetCurrentDate()
+ {
+ return new ScriptDateBase(static_cast(Timer::date.base()));
+ }
+
+ SQInteger GetYear()
+ {
+ if (!this->IsValid()) return DATE_INVALID;
+
+ YearMonthDay ymd = Timer::ConvertDateToYMD(static_cast(this->_date));
+ return ymd.year.base();
+ }
+
+ SQInteger GetMonth()
+ {
+ if (!this->IsValid()) return DATE_INVALID;
+
+ YearMonthDay ymd = Timer::ConvertDateToYMD(static_cast(this->_date));
+ return ymd.month + 1;
+ }
+
+ SQInteger GetDayOfMonth()
+ {
+ if (!this->IsValid()) return DATE_INVALID;
+
+ YearMonthDay ymd = Timer::ConvertDateToYMD(static_cast(this->_date));
+ return ymd.day;
+ }
+
+ static ScriptDateBase *GetDate(SQInteger year, SQInteger month, SQInteger day_of_month)
+ {
+ if (month < 1 || month > 12) return new ScriptDateBase();
+ if (day_of_month < 1 || day_of_month > 31) return new ScriptDateBase();
+
+ Year timer_year{ClampTo(year)};
+ if (timer_year < Time::MIN_YEAR || timer_year > Time::MAX_YEAR) return new ScriptDateBase();
+
+ return new ScriptDateBase(static_cast(Timer::ConvertYMDToDate(timer_year, month - 1, day_of_month).base()));
+ }
+
+ static SQInteger GetSystemTime()
+ {
+ time_t t;
+ time(&t);
+ return t;
+ }
+
+ Date date() { return this->_date; }
+
+ SQInteger _tostring(HSQUIRRELVM vm)
+ {
+ sq_pushstring(vm, fmt::format("{}", this->_date));
+ return 1;
+ }
+
+ SQInteger _add(HSQUIRRELVM vm)
+ {
+ SQInteger days = 0;
+ switch (sq_gettype(vm, 2)) {
+ case OT_INTEGER:
+ sq_getinteger(vm, 2, &days);
+ break;
+ case OT_INSTANCE: {
+ ScriptDateBase *other = static_cast(Squirrel::GetRealInstance(vm, 2, Tag.value));
+ if (other == nullptr) return SQ_ERROR;
+ days = other->_date;
+ break;
+ }
+ default: return SQ_ERROR;
+ }
+ ScriptDateBase *res = new ScriptDateBase(static_cast(this->_date + days));
+ res->AddRef();
+ Squirrel::CreateClassInstanceVM(vm, Tag.value, res, nullptr, SQConvert::DefSQDestructorCallback, true);
+ return 1;
+ }
+
+ SQInteger _sub(HSQUIRRELVM vm)
+ {
+ SQInteger days = 0;
+ switch (sq_gettype(vm, 2)) {
+ case OT_INTEGER:
+ sq_getinteger(vm, 2, &days);
+ break;
+ case OT_INSTANCE: {
+ ScriptDateBase *other = static_cast(Squirrel::GetRealInstance(vm, 2, Tag.value));
+ if (other == nullptr) return SQ_ERROR;
+ days = other->_date;
+ break;
+ }
+ default: return SQ_ERROR;
+ }
+ ScriptDateBase *res = new ScriptDateBase(static_cast(this->_date - days));
+ res->AddRef();
+ Squirrel::CreateClassInstanceVM(vm, Tag.value, res, nullptr, SQConvert::DefSQDestructorCallback, true);
+ return 1;
+ }
+
+ SQInteger _cmp(HSQUIRRELVM vm)
+ {
+ ScriptDateBase *other = static_cast(Squirrel::GetRealInstance(vm, 2, Tag.value));
+ if (other == nullptr) return SQ_ERROR;
+ sq_pushinteger(vm, this->_date - other->_date);
+ return 1;
+ }
+
+ bool SaveObject(HSQUIRRELVM vm) override
+ {
+ sq_pushstring(vm, Tag.value);
+ sq_pushinteger(vm, this->_date);
+ return true;
+ }
+
+ bool LoadObject(HSQUIRRELVM vm) override
+ {
+ if (sq_gettype(vm, -1) != OT_INTEGER) return false;
+ SQInteger val;
+ sq_getinteger(vm, -1, &val);
+ this->_date = static_cast(val);
+ return true;
+ }
+
+protected:
+ Date _date = DATE_INVALID;
+};
+
+using ScriptEconomyDate = ScriptDateBase;
+using ScriptCalendarDate = ScriptDateBase;
+#else
/**
* Class that handles all date related (calculation) functions.
* @api ai game
@@ -48,22 +216,23 @@
* Economy-time will use a 360 day calendar (12 months with 30 days each), which runs at a constant speed of one economy-month per realtime-minute.
* Calendar-time will use a Gregorian calendar, which can be slowed to stopped via game settings.
*/
-class ScriptDate : public ScriptObject {
+class ScriptEconomyDate : public ScriptObject {
public:
/**
- * Date data type is an integer value. Use ScriptDate::GetDate to
+ * Date data type is an integer value. Use ScriptEconomyDate::GetDate to
* compose valid date values for a known year, month and day.
*/
enum Date {
- DATE_INVALID = ::EconomyTime::INVALID_DATE.base(), ///< A value representing an invalid date.
+ DATE_INVALID, ///< A value representing an invalid date.
};
+ ScriptEconomyDate(Date date = DATE_INVALID);
+
/**
* Validates if a date value represent a valid date.
- * @param date The date to validate.
* @return True if the date is valid, otherwise false
*/
- static bool IsValidDate(Date date);
+ bool IsValid();
/**
* Get the current date.
@@ -72,28 +241,25 @@ public:
* 100 but not by 400.
* @return The current date.
*/
- static Date GetCurrentDate();
+ static ScriptEconomyDate GetCurrentDate();
/**
* Get the year of the given date.
- * @param date The date to get the year of.
* @return The year.
*/
- static SQInteger GetYear(Date date);
+ SQInteger GetYear();
/**
* Get the month of the given date.
- * @param date The date to get the month of.
* @return The month.
*/
- static SQInteger GetMonth(Date date);
+ SQInteger GetMonth();
/**
* Get the day (of the month) of the given date.
- * @param date The date to get the day of.
* @return The day.
*/
- static SQInteger GetDayOfMonth(Date date);
+ SQInteger GetDayOfMonth();
/**
* Get the date given a year, month and day of month.
@@ -102,7 +268,7 @@ public:
* @param day_of_month The day of month of the to-be determined date.
* @return The date.
*/
- static Date GetDate(SQInteger year, SQInteger month, SQInteger day_of_month);
+ static ScriptEconomyDate GetDate(SQInteger year, SQInteger month, SQInteger day_of_month);
/**
* Get the time of the host system.
@@ -111,6 +277,84 @@ public:
* @note This uses the clock of the host system, which can skew or be set back. Use with caution.
*/
static SQInteger GetSystemTime();
+
+ /**
+ * Get the date.
+ * @return The date.
+ */
+ Date date();
};
+
+
+class ScriptCalendarDate : public ScriptObject {
+public:
+ /**
+ * Date data type is an integer value. Use ScriptCalendarDate::GetDate to
+ * compose valid date values for a known year, month and day.
+ */
+ enum Date {
+ DATE_INVALID, ///< A value representing an invalid date.
+ };
+
+ ScriptCalendarDate(Date date = DATE_INVALID);
+
+ /**
+ * Validates if a date value represent a valid date.
+ * @return True if the date is valid, otherwise false
+ */
+ bool IsValid();
+
+ /**
+ * Get the current date.
+ * This is the number of days since epoch under the assumption that
+ * there is a leap year every 4 years, except when dividable by
+ * 100 but not by 400.
+ * @return The current date.
+ */
+ static ScriptCalendarDate GetCurrentDate();
+
+ /**
+ * Get the year of the given date.
+ * @return The year.
+ */
+ SQInteger GetYear();
+
+ /**
+ * Get the month of the given date.
+ * @return The month.
+ */
+ SQInteger GetMonth();
+
+ /**
+ * Get the day (of the month) of the given date.
+ * @return The day.
+ */
+ SQInteger GetDayOfMonth();
+
+ /**
+ * Get the date given a year, month and day of month.
+ * @param year The year of the to-be determined date.
+ * @param month The month of the to-be determined date.
+ * @param day_of_month The day of month of the to-be determined date.
+ * @return The date.
+ */
+ static ScriptCalendarDate GetDate(SQInteger year, SQInteger month, SQInteger day_of_month);
+
+ /**
+ * Get the time of the host system.
+ * @return The amount of seconds passed since 1 Jan 1970.
+ * @api -ai
+ * @note This uses the clock of the host system, which can skew or be set back. Use with caution.
+ */
+ static SQInteger GetSystemTime();
+
+ /**
+ * Get the date.
+ * @return The date.
+ */
+ Date date();
+};
+#endif /* DOXYGEN_API */
+
#endif /* SCRIPT_DATE_HPP */
diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp
index e7cf0a025a..d61a120bd9 100644
--- a/src/script/api/script_engine.cpp
+++ b/src/script/api/script_engine.cpp
@@ -169,11 +169,11 @@
return ::Engine::Get(engine_id)->GetDisplayMaxTractiveEffort() / 1000;
}
-/* static */ ScriptDate::Date ScriptEngine::GetDesignDate(EngineID engine_id)
+/* static */ ScriptCalendarDate *ScriptEngine::GetDesignDate(EngineID engine_id)
{
- if (!IsValidEngine(engine_id)) return ScriptDate::DATE_INVALID;
+ if (!IsValidEngine(engine_id)) return new ScriptCalendarDate();
- return (ScriptDate::Date)::Engine::Get(engine_id)->intro_date.base();
+ return new ScriptCalendarDate(static_cast(::Engine::Get(engine_id)->intro_date.base()));
}
/* static */ ScriptVehicle::VehicleType ScriptEngine::GetVehicleType(EngineID engine_id)
diff --git a/src/script/api/script_engine.hpp b/src/script/api/script_engine.hpp
index b1dd9141ad..5b24a3096b 100644
--- a/src/script/api/script_engine.hpp
+++ b/src/script/api/script_engine.hpp
@@ -173,7 +173,7 @@ public:
* @return The calendar-date this engine was designed.
* @see \ref ScriptCalendarTime
*/
- static ScriptDate::Date GetDesignDate(EngineID engine_id);
+ static ScriptCalendarDate *GetDesignDate(EngineID engine_id);
/**
* Get the type of an engine.
diff --git a/src/script/api/script_industry.cpp b/src/script/api/script_industry.cpp
index dfaccb8b40..486293d243 100644
--- a/src/script/api/script_industry.cpp
+++ b/src/script/api/script_industry.cpp
@@ -49,11 +49,11 @@
return ::StrMakeValid(::GetString(STR_INDUSTRY_NAME, industry_id), {});
}
-/* static */ ScriptDate::Date ScriptIndustry::GetConstructionDate(IndustryID industry_id)
+/* static */ ScriptCalendarDate *ScriptIndustry::GetConstructionDate(IndustryID industry_id)
{
const Industry *i = Industry::GetIfValid(industry_id);
- if (i == nullptr) return ScriptDate::DATE_INVALID;
- return (ScriptDate::Date)i->construction_date.base();
+ if (i == nullptr) return new ScriptCalendarDate();
+ return new ScriptCalendarDate(static_cast(i->construction_date.base()));
}
/* static */ bool ScriptIndustry::SetText(IndustryID industry_id, Text *text)
@@ -226,18 +226,18 @@
return i->last_prod_year.base();
}
-/* static */ ScriptDate::Date ScriptIndustry::GetCargoLastAcceptedDate(IndustryID industry_id, CargoType cargo_type)
+/* static */ ScriptEconomyDate *ScriptIndustry::GetCargoLastAcceptedDate(IndustryID industry_id, CargoType cargo_type)
{
const Industry *i = Industry::GetIfValid(industry_id);
- if (i == nullptr) return ScriptDate::DATE_INVALID;
+ if (i == nullptr) return new ScriptEconomyDate();
if (!::IsValidCargoType(cargo_type)) {
auto it = std::max_element(std::begin(i->accepted), std::end(i->accepted), [](const auto &a, const auto &b) { return a.last_accepted < b.last_accepted; });
- return (ScriptDate::Date)it->last_accepted.base();
+ return new ScriptEconomyDate(static_cast(it->last_accepted.base()));
} else {
auto it = i->GetCargoAccepted(cargo_type);
- if (it == std::end(i->accepted)) return ScriptDate::DATE_INVALID;
- return (ScriptDate::Date)it->last_accepted.base();
+ if (it == std::end(i->accepted)) return new ScriptEconomyDate();
+ return new ScriptEconomyDate(static_cast(it->last_accepted.base()));
}
}
diff --git a/src/script/api/script_industry.hpp b/src/script/api/script_industry.hpp
index e35667fcf6..5d4dd9d929 100644
--- a/src/script/api/script_industry.hpp
+++ b/src/script/api/script_industry.hpp
@@ -93,7 +93,7 @@ public:
* @see \ref ScriptCalendarTime
* @api -ai
*/
- static ScriptDate::Date GetConstructionDate(IndustryID industry_id);
+ static ScriptCalendarDate *GetConstructionDate(IndustryID industry_id);
/**
* Set the custom text of an industry, shown in the GUI.
@@ -265,11 +265,11 @@ public:
* @param cargo_type The cargo to query, or INVALID_CARGO to query latest of all accepted cargoes.
* @pre IsValidIndustry(industry_id).
* @pre IsValidCargo(cargo_type) || cargo_type == INVALID_CARGO.
- * @return Economy-date the industry last received cargo from a delivery, or ScriptDate::DATE_INVALID on error.
+ * @return Economy-date the industry last received cargo from a delivery, ScriptEconomyDate::IsValid() returns false on error.
* @see \ref ScriptEconomyTime
* @api -ai
*/
- static ScriptDate::Date GetCargoLastAcceptedDate(IndustryID industry_id, CargoType cargo_type);
+ static ScriptEconomyDate *GetCargoLastAcceptedDate(IndustryID industry_id, CargoType cargo_type);
/**
* Get the current control flags for an industry.
diff --git a/src/script/api/script_story_page.cpp b/src/script/api/script_story_page.cpp
index 3a5fb911a5..903bcf028c 100644
--- a/src/script/api/script_story_page.cpp
+++ b/src/script/api/script_story_page.cpp
@@ -179,20 +179,21 @@ static inline bool StoryPageElementTypeRequiresText(StoryPageElementType type)
return ScriptCompany::ToScriptCompanyID(StoryPage::Get(story_page_id)->company);
}
-/* static */ ScriptDate::Date ScriptStoryPage::GetDate(StoryPageID story_page_id)
+/* static */ ScriptCalendarDate *ScriptStoryPage::GetDate(StoryPageID story_page_id)
{
- EnforcePrecondition(ScriptDate::DATE_INVALID, IsValidStoryPage(story_page_id));
- EnforceDeityMode(ScriptDate::DATE_INVALID);
+ EnforcePrecondition(new ScriptCalendarDate(), IsValidStoryPage(story_page_id));
+ EnforceDeityMode(new ScriptCalendarDate());
- return (ScriptDate::Date)StoryPage::Get(story_page_id)->date.base();
+ return new ScriptCalendarDate(static_cast(StoryPage::Get(story_page_id)->date.base()));
}
-/* static */ bool ScriptStoryPage::SetDate(StoryPageID story_page_id, ScriptDate::Date date)
+/* static */ bool ScriptStoryPage::SetDate(StoryPageID story_page_id, ScriptCalendarDate *date)
{
EnforcePrecondition(false, IsValidStoryPage(story_page_id));
EnforceDeityMode(false);
+ if (date == nullptr) date = new ScriptCalendarDate();
- return ScriptObject::Command::Do(story_page_id, ::TimerGameCalendar::Date{date});
+ return ScriptObject::Command::Do(story_page_id, ::TimerGameCalendar::Date{date->date()});
}
diff --git a/src/script/api/script_story_page.hpp b/src/script/api/script_story_page.hpp
index 2a6391a711..fdbc0af6d5 100644
--- a/src/script/api/script_story_page.hpp
+++ b/src/script/api/script_story_page.hpp
@@ -256,18 +256,18 @@ public:
* @pre IsValidStoryPage(story_page_id).
* @see \ref ScriptCalendarTime
*/
- static ScriptDate::Date GetDate(StoryPageID story_page_id);
+ static ScriptCalendarDate *GetDate(StoryPageID story_page_id);
/**
* Update date of a story page. The date is shown in the top left of the page
* @param story_page_id The story page to set the date for.
- * @param date Calendar-date to display at the top of story page or ScriptDate::DATE_INVALID to disable showing date on this page. (also, @see ScriptDate)
+ * @param date Calendar-date to display at the top of story page or null to disable showing date on this page. (also, @see ScriptCalendarDate)
* @return True if the action succeeded.
* @pre ScriptCompanyMode::IsDeity().
* @pre IsValidStoryPage(story_page_id).
* @see \ref ScriptCalendarTime
*/
- static bool SetDate(StoryPageID story_page_id, ScriptDate::Date date);
+ static bool SetDate(StoryPageID story_page_id, ScriptCalendarDate *date);
/**
* Update title of a story page. The title is shown in the page selector drop down.
diff --git a/src/script/api/script_subsidy.cpp b/src/script/api/script_subsidy.cpp
index 586c436655..8bd448426c 100644
--- a/src/script/api/script_subsidy.cpp
+++ b/src/script/api/script_subsidy.cpp
@@ -53,9 +53,9 @@
return ScriptCompany::ToScriptCompanyID(::Subsidy::Get(subsidy_id)->awarded);
}
-/* static */ ScriptDate::Date ScriptSubsidy::GetExpireDate(SubsidyID subsidy_id)
+/* static */ ScriptEconomyDate *ScriptSubsidy::GetExpireDate(SubsidyID subsidy_id)
{
- if (!IsValidSubsidy(subsidy_id)) return ScriptDate::DATE_INVALID;
+ if (!IsValidSubsidy(subsidy_id)) return new ScriptEconomyDate();
TimerGameEconomy::YearMonthDay ymd = TimerGameEconomy::ConvertDateToYMD(TimerGameEconomy::date);
ymd.day = 1;
@@ -63,7 +63,7 @@
ymd.month = m % 12;
ymd.year += TimerGameEconomy::Year{m / 12};
- return (ScriptDate::Date)TimerGameEconomy::ConvertYMDToDate(ymd.year, ymd.month, ymd.day).base();
+ return ScriptEconomyDate::GetDate(ymd.year.base(), ymd.month + 1, ymd.day);
}
/* static */ CargoType ScriptSubsidy::GetCargoType(SubsidyID subsidy_id)
diff --git a/src/script/api/script_subsidy.hpp b/src/script/api/script_subsidy.hpp
index 6483f01d82..a7c004578b 100644
--- a/src/script/api/script_subsidy.hpp
+++ b/src/script/api/script_subsidy.hpp
@@ -85,7 +85,7 @@ public:
* awarded.
* @see \ref ScriptEconomyTime
*/
- static ScriptDate::Date GetExpireDate(SubsidyID subsidy_id);
+ static ScriptEconomyDate *GetExpireDate(SubsidyID subsidy_id);
/**
* Get the cargo type that has to be transported in order to be awarded this
diff --git a/src/script/api/template/template_date.sq.hpp b/src/script/api/template/template_date.sq.hpp
new file mode 100644
index 0000000000..67a4d9f925
--- /dev/null
+++ b/src/script/api/template/template_date.sq.hpp
@@ -0,0 +1,24 @@
+/*
+ * 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 .
+ */
+
+#include "../script_date.hpp"
+
+namespace SQConvert {
+ /* Allow ScriptEconomyDate to be used as Squirrel parameter */
+ template <> struct Param { static inline ScriptEconomyDate *Get(HSQUIRRELVM vm, int index) { return static_cast(sq_gettype(vm, index) == OT_NULL ? nullptr : Squirrel::GetRealInstance(vm, index, "EconomyDate")); } };
+ template <> struct Param { static inline ScriptEconomyDate &Get(HSQUIRRELVM vm, int index) { return *static_cast(Squirrel::GetRealInstance(vm, index, "EconomyDate")); } };
+ template <> struct Param { static inline const ScriptEconomyDate *Get(HSQUIRRELVM vm, int index) { return static_cast(sq_gettype(vm, index) == OT_NULL ? nullptr : Squirrel::GetRealInstance(vm, index, "EconomyDate")); } };
+ template <> struct Param { static inline const ScriptEconomyDate &Get(HSQUIRRELVM vm, int index) { return *static_cast(Squirrel::GetRealInstance(vm, index, "EconomyDate")); } };
+ template <> struct Return { static inline int Set(HSQUIRRELVM vm, ScriptEconomyDate *res) { if (res == nullptr) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "EconomyDate", res, nullptr, DefSQDestructorCallback, true); return 1; } };
+
+ /* Allow ScriptCalendarDate to be used as Squirrel parameter */
+ template <> struct Param { static inline ScriptCalendarDate *Get(HSQUIRRELVM vm, int index) { return static_cast(sq_gettype(vm, index) == OT_NULL ? nullptr : Squirrel::GetRealInstance(vm, index, "CalendarDate")); } };
+ template <> struct Param { static inline ScriptCalendarDate &Get(HSQUIRRELVM vm, int index) { return *static_cast(Squirrel::GetRealInstance(vm, index, "CalendarDate")); } };
+ template <> struct Param { static inline const ScriptCalendarDate *Get(HSQUIRRELVM vm, int index) { return static_cast(sq_gettype(vm, index) == OT_NULL ? nullptr : Squirrel::GetRealInstance(vm, index, "CalendarDate")); } };
+ template <> struct Param { static inline const ScriptCalendarDate &Get(HSQUIRRELVM vm, int index) { return *static_cast(Squirrel::GetRealInstance(vm, index, "CalendarDate")); } };
+ template <> struct Return { static inline int Set(HSQUIRRELVM vm, ScriptCalendarDate *res) { if (res == nullptr) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "CalendarDate", res, nullptr, DefSQDestructorCallback, true); return 1; } };
+} // namespace SQConvert