From 185ca3a7f5ad93138347c28a1a5f3ffe368f1463 Mon Sep 17 00:00:00 2001 From: glx22 Date: Tue, 18 Feb 2025 17:45:02 +0100 Subject: [PATCH] Change: [Script] Replace ScriptDate with ScriptEconomyDate and ScriptCalendarDate --- bin/ai/compat_14.nut | 21 ++ bin/game/compat_14.nut | 29 ++ src/script/api/CMakeLists.txt | 11 +- src/script/api/ai/ai_date.sq.hpp | 62 +++++ src/script/api/ai_changelog.hpp | 5 + src/script/api/game/game_date.sq.hpp | 62 +++++ src/script/api/game_changelog.hpp | 5 + src/script/api/script_basestation.cpp | 6 +- src/script/api/script_basestation.hpp | 2 +- src/script/api/script_client.cpp | 6 +- src/script/api/script_client.hpp | 2 +- src/script/api/script_date.cpp | 68 ----- src/script/api/script_date.hpp | 270 ++++++++++++++++++- src/script/api/script_engine.cpp | 6 +- src/script/api/script_engine.hpp | 2 +- src/script/api/script_industry.cpp | 16 +- src/script/api/script_industry.hpp | 6 +- src/script/api/script_story_page.cpp | 13 +- src/script/api/script_story_page.hpp | 6 +- src/script/api/script_subsidy.cpp | 6 +- src/script/api/script_subsidy.hpp | 2 +- src/script/api/template/template_date.sq.hpp | 24 ++ 22 files changed, 509 insertions(+), 121 deletions(-) create mode 100644 src/script/api/ai/ai_date.sq.hpp create mode 100644 src/script/api/game/game_date.sq.hpp delete mode 100644 src/script/api/script_date.cpp create mode 100644 src/script/api/template/template_date.sq.hpp 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