Merge branch 'master' into jgrpp

# Conflicts:
#	src/animated_tile.cpp
#	src/cargopacket.h
#	src/cheat_gui.cpp
#	src/company_cmd.cpp
#	src/company_gui.cpp
#	src/date.cpp
#	src/disaster_vehicle.cpp
#	src/dock_gui.cpp
#	src/economy.cpp
#	src/engine.cpp
#	src/error_gui.cpp
#	src/fontcache/spritefontcache.cpp
#	src/game/game_gui.cpp
#	src/game/game_text.cpp
#	src/gfx.cpp
#	src/graph_gui.cpp
#	src/highscore_gui.cpp
#	src/industry_cmd.cpp
#	src/lang/dutch.txt
#	src/lang/english_AU.txt
#	src/lang/english_US.txt
#	src/lang/finnish.txt
#	src/lang/french.txt
#	src/lang/italian.txt
#	src/lang/portuguese.txt
#	src/lang/russian.txt
#	src/lang/turkish.txt
#	src/lang/vietnamese.txt
#	src/main_gui.cpp
#	src/misc_gui.cpp
#	src/network/network_gui.cpp
#	src/network/network_server.cpp
#	src/newgrf.cpp
#	src/newgrf.h
#	src/newgrf_generic.cpp
#	src/news_gui.cpp
#	src/openttd.cpp
#	src/os/unix/unix.cpp
#	src/os/windows/font_win32.cpp
#	src/os/windows/win32.cpp
#	src/rail_gui.cpp
#	src/road_gui.cpp
#	src/saveload/afterload.cpp
#	src/saveload/misc_sl.cpp
#	src/saveload/oldloader_sl.cpp
#	src/saveload/saveload.cpp
#	src/saveload/saveload.h
#	src/script/script_gui.cpp
#	src/settings_table.cpp
#	src/signs_gui.cpp
#	src/smallmap_gui.cpp
#	src/smallmap_gui.h
#	src/spritecache.cpp
#	src/spritecache.h
#	src/spriteloader/grf.cpp
#	src/station_cmd.cpp
#	src/statusbar_gui.cpp
#	src/stdafx.h
#	src/strgen/strgen_base.cpp
#	src/subsidy.cpp
#	src/table/settings/difficulty_settings.ini
#	src/texteff.cpp
#	src/timetable_cmd.cpp
#	src/timetable_gui.cpp
#	src/toolbar_gui.cpp
#	src/town_cmd.cpp
#	src/town_gui.cpp
#	src/townname.cpp
#	src/vehicle.cpp
#	src/waypoint_cmd.cpp
#	src/widgets/dropdown.cpp
#	src/window.cpp
This commit is contained in:
Jonathan G Rennison
2023-05-26 19:36:48 +01:00
170 changed files with 1526 additions and 1238 deletions

View File

@@ -7,11 +7,11 @@
#include "../script_controller.hpp"
template <> const char *GetClassName<ScriptController, ST_AI>() { return "AIController"; }
template <> const char *GetClassName<ScriptController, ScriptType::AI>() { return "AIController"; }
void SQAIController_Register(Squirrel *engine)
{
DefSQClass<ScriptController, ST_AI> SQAIController("AIController");
DefSQClass<ScriptController, ScriptType::AI> SQAIController("AIController");
SQAIController.PreRegister(engine);
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");

View File

@@ -7,11 +7,11 @@
#include "../script_controller.hpp"
template <> const char *GetClassName<ScriptController, ST_GS>() { return "GSController"; }
template <> const char *GetClassName<ScriptController, ScriptType::GS>() { return "GSController"; }
void SQGSController_Register(Squirrel *engine)
{
DefSQClass<ScriptController, ST_GS> SQGSController("GSController");
DefSQClass<ScriptController, ScriptType::GS> SQGSController("GSController");
SQGSController.PreRegister(engine);
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");

View File

@@ -22,6 +22,58 @@
* \li GSCompanyMode::IsDeity
* \li GSTown::ROAD_LAYOUT_RANDOM
* \li GSVehicle::IsPrimaryVehicle
* \li GSOrder::SetOrderJumpTo
* \li GSOrder::SetOrderCondition
* \li GSOrder::SetOrderCompareFunction
* \li GSOrder::SetOrderCompareValue
* \li GSOrder::SetStopLocation
* \li GSOrder::SetOrderRefit
* \li GSOrder::AppendOrder
* \li GSOrder::AppendConditionalOrder
* \li GSOrder::InsertOrder
* \li GSOrder::InsertConditionalOrder
* \li GSOrder::RemoveOrder
* \li GSOrder::SetOrderFlags
* \li GSOrder::MoveOrder
* \li GSOrder::SkipToOrder
* \li GSOrder::CopyOrders
* \li GSOrder::ShareOrders
* \li GSOrder::UnshareOrders
* \li GSCompany::IsMine
* \li GSCompany::SetPresidentGender
* \li GSCompany::SetAutoRenewStatus
* \li GSCompany::SetAutoRenewMonths
* \li GSCompany::SetAutoRenewMoney
* \li GSGameSettings::IsDisabledVehicleType
* \li GSGroup::GroupID
* \li GSGroup::IsValidGroup
* \li GSGroup::CreateGroup
* \li GSGroup::DeleteGroup
* \li GSGroup::GetVehicleType
* \li GSGroup::SetName
* \li GSGroup::GetName
* \li GSGroup::SetParent
* \li GSGroup::GetParent
* \li GSGroup::EnableAutoReplaceProtection
* \li GSGroup::GetAutoReplaceProtection
* \li GSGroup::GetNumEngines
* \li GSGroup::GetNumVehicles
* \li GSGroup::MoveVehicle
* \li GSGroup::EnableWagonRemoval
* \li GSGroup::HasWagonRemoval
* \li GSGroup::SetAutoReplace
* \li GSGroup::GetEngineReplacement
* \li GSGroup::StopAutoReplace
* \li GSGroup::GetProfitThisYear
* \li GSGroup::GetProfitLastYear
* \li GSGroup::GetCurrentUsage
* \li GSGroup::SetPrimaryColour
* \li GSGroup::SetSecondaryColour
* \li GSGroup::GetPrimaryColour
* \li GSGroup::GetSecondaryColour
* \li GSGroupList
* \li GSVehicleList_Group
* \li GSVehicleList_DefaultGroup
*
* API removals:
* \li GSError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore.

View File

@@ -36,6 +36,7 @@
/* static */ bool ScriptCompany::IsMine(ScriptCompany::CompanyID company)
{
EnforceCompanyModeValid(false);
return ResolveCompanyID(company) == ResolveCompanyID(COMPANY_SELF);
}

View File

@@ -130,8 +130,8 @@ public:
/**
* Check if a CompanyID is your CompanyID, to ease up checks.
* @param company The company index to check.
* @game @pre ScriptCompanyMode::IsValid().
* @return True if and only if this company is your CompanyID.
* @api -game
*/
static bool IsMine(CompanyID company);
@@ -178,7 +178,6 @@ public:
* @game @pre ScriptCompanyMode::IsValid().
* @return True if the gender was changed.
* @note When successful a random face will be created.
* @api -game
*/
static bool SetPresidentGender(Gender gender);
@@ -350,7 +349,6 @@ public:
* @param autorenew The new autorenew status.
* @game @pre ScriptCompanyMode::IsValid().
* @return True if autorenew status has been modified.
* @api -game
*/
static bool SetAutoRenewStatus(bool autorenew);
@@ -368,7 +366,6 @@ public:
* The value will be clamped to MIN(int16) .. MAX(int16).
* @game @pre ScriptCompanyMode::IsValid().
* @return True if autorenew months has been modified.
* @api -game
*/
static bool SetAutoRenewMonths(SQInteger months);
@@ -387,7 +384,6 @@ public:
* @return True if autorenew money has been modified.
* @pre money >= 0
* @pre money < 2**32
* @api -game
*/
static bool SetAutoRenewMoney(Money money);

View File

@@ -55,6 +55,15 @@
#define EnforceCompanyModeValid(returnval) \
EnforcePreconditionCustomError(returnval, ScriptCompanyMode::IsValid(), ScriptError::ERR_PRECONDITION_INVALID_COMPANY)
/**
* Helper to enforce the precondition that the company mode is valid.
*/
#define EnforceCompanyModeValid_Void() \
if (!ScriptCompanyMode::IsValid()) { \
ScriptObject::SetLastError(ScriptError::ERR_PRECONDITION_INVALID_COMPANY); \
return; \
}
/**
* Helper to enforce the precondition that we are in a deity mode.
* @param returnval The value to return on failure.

View File

@@ -75,7 +75,6 @@ public:
* Checks whether the given vehicle-type is disabled for companies.
* @param vehicle_type The vehicle-type to check.
* @return True if the vehicle-type is disabled.
* @api -game
*/
static bool IsDisabledVehicleType(ScriptVehicle::VehicleType vehicle_type);
};

View File

@@ -15,7 +15,7 @@
/**
* Class that handles all group related functions.
* @api ai
* @api ai game
*/
class ScriptGroup : public ScriptObject {
public:

View File

@@ -16,7 +16,7 @@
ScriptGroupList::ScriptGroupList()
{
EnforceDeityOrCompanyModeValid_Void();
EnforceCompanyModeValid_Void();
for (const Group *g : Group::Iterate()) {
if (g->owner == ScriptObject::GetCompany()) this->AddItem(g->index);
}

View File

@@ -15,11 +15,14 @@
/**
* Creates a list of groups of which you are the owner.
* @note Neither ScriptGroup::GROUP_ALL nor ScriptGroup::GROUP_DEFAULT is in this list.
* @api ai
* @api ai game
* @ingroup ScriptList
*/
class ScriptGroupList : public ScriptList {
public:
/**
* @game @pre ScriptCompanyMode::IsValid().
*/
ScriptGroupList();
};

View File

@@ -357,7 +357,7 @@ ScriptObject::ActiveInstance::~ActiveInstance()
bool estimate_only = GetDoCommandMode() != nullptr && !GetDoCommandMode()();
/* Should the command be executed asynchronously? */
bool asynchronous = GetDoCommandAsyncMode() != nullptr && GetDoCommandAsyncMode()() && GetActiveInstance()->GetScriptType() == ST_GS;
bool asynchronous = GetDoCommandAsyncMode() != nullptr && GetDoCommandAsyncMode()() && GetActiveInstance()->GetScriptType() == ScriptType::GS;
/* Only set p2 when the command does not come from the network. */
if (GetCommandFlags(cmd) & CMD_CLIENT_ID && p2 == 0) p2 = UINT32_MAX;
@@ -406,7 +406,7 @@ ScriptObject::ActiveInstance::~ActiveInstance()
} else if (_networking) {
/* Suspend the script till the command is really executed. */
throw Script_Suspend(-(int)GetDoCommandDelay(), callback);
} else if (GetActiveInstance()->GetScriptType() == ST_GS && (_pause_mode & PM_PAUSED_GAME_SCRIPT) != PM_UNPAUSED) {
} else if (GetActiveInstance()->GetScriptType() == ScriptType::GS && (_pause_mode & PM_PAUSED_GAME_SCRIPT) != PM_UNPAUSED) {
/* Game is paused due to GS, just execute as fast as possible */
IncreaseDoCommandCosts(res.GetCost());
ScriptController::DecreaseOps(100);

View File

@@ -358,7 +358,6 @@ public:
* @pre order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position).
* @game @pre ScriptCompanyMode::IsValid().
* @return Whether the order has been/can be changed.
* @api -game
*/
static bool SetOrderJumpTo(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to);
@@ -372,7 +371,6 @@ public:
* @pre condition >= OC_LOAD_PERCENTAGE && condition <= OC_UNCONDITIONALLY.
* @game @pre ScriptCompanyMode::IsValid().
* @return Whether the order has been/can be changed.
* @api -game
*/
static bool SetOrderCondition(VehicleID vehicle_id, OrderPosition order_position, OrderCondition condition);
@@ -386,7 +384,6 @@ public:
* @pre compare >= CF_EQUALS && compare <= CF_IS_FALSE.
* @game @pre ScriptCompanyMode::IsValid().
* @return Whether the order has been/can be changed.
* @api -game
*/
static bool SetOrderCompareFunction(VehicleID vehicle_id, OrderPosition order_position, CompareFunction compare);
@@ -400,7 +397,6 @@ public:
* @pre value >= 0 && value < 2048.
* @game @pre ScriptCompanyMode::IsValid().
* @return Whether the order has been/can be changed.
* @api -game
*/
static bool SetOrderCompareValue(VehicleID vehicle_id, OrderPosition order_position, SQInteger value);
@@ -415,7 +411,6 @@ public:
* @pre stop_location >= STOPLOCATION_NEAR && stop_location <= STOPLOCATION_FAR
* @game @pre ScriptCompanyMode::IsValid().
* @return Whether the order has been/can be changed.
* @api -game
*/
static bool SetStopLocation(VehicleID vehicle_id, OrderPosition order_position, StopLocation stop_location);
@@ -429,7 +424,6 @@ public:
* @pre ScriptCargo::IsValidCargo(refit_cargo) || refit_cargo == CT_AUTO_REFIT || refit_cargo == CT_NO_REFIT
* @game @pre ScriptCompanyMode::IsValid().
* @return Whether the order has been/can be changed.
* @api -game
*/
static bool SetOrderRefit(VehicleID vehicle_id, OrderPosition order_position, CargoID refit_cargo);
@@ -445,7 +439,6 @@ public:
* @exception ScriptOrder::ERR_ORDER_TOO_MANY
* @exception ScriptOrder::ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION
* @return True if and only if the order was appended.
* @api -game
*/
static bool AppendOrder(VehicleID vehicle_id, TileIndex destination, ScriptOrderFlags order_flags);
@@ -459,7 +452,6 @@ public:
* @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY
* @exception ScriptOrder::ERR_ORDER_TOO_MANY
* @return True if and only if the order was appended.
* @api -game
*/
static bool AppendConditionalOrder(VehicleID vehicle_id, OrderPosition jump_to);
@@ -477,7 +469,6 @@ public:
* @exception ScriptOrder::ERR_ORDER_TOO_MANY
* @exception ScriptOrder::ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION
* @return True if and only if the order was inserted.
* @api -game
*/
static bool InsertOrder(VehicleID vehicle_id, OrderPosition order_position, TileIndex destination, ScriptOrderFlags order_flags);
@@ -493,7 +484,6 @@ public:
* @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY
* @exception ScriptOrder::ERR_ORDER_TOO_MANY
* @return True if and only if the order was inserted.
* @api -game
*/
static bool InsertConditionalOrder(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to);
@@ -505,7 +495,6 @@ public:
* @game @pre ScriptCompanyMode::IsValid().
* @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY
* @return True if and only if the order was removed.
* @api -game
*/
static bool RemoveOrder(VehicleID vehicle_id, OrderPosition order_position);
@@ -526,7 +515,6 @@ public:
* @game @pre ScriptCompanyMode::IsValid().
* @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY
* @return True if and only if the order was changed.
* @api -game
*/
static bool SetOrderFlags(VehicleID vehicle_id, OrderPosition order_position, ScriptOrderFlags order_flags);
@@ -545,7 +533,6 @@ public:
* the target order is moved upwards (e.g. 3). If the order is moved
* to a higher place (e.g. from 7 to 9) the target will be moved
* downwards (e.g. 8).
* @api -game
*/
static bool MoveOrder(VehicleID vehicle_id, OrderPosition order_position_move, OrderPosition order_position_target);
@@ -557,7 +544,6 @@ public:
* @game @pre ScriptCompanyMode::IsValid().
* @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY
* @return True if and only the current order was changed.
* @api -game
*/
static bool SkipToOrder(VehicleID vehicle_id, OrderPosition next_order);
@@ -573,7 +559,6 @@ public:
* @exception ScriptOrder::ERR_ORDER_TOO_MANY
* @exception ScriptOrder::ERR_ORDER_AIRCRAFT_NOT_ENOUGH_RANGE
* @return True if and only if the copying succeeded.
* @api -game
*/
static bool CopyOrders(VehicleID vehicle_id, VehicleID main_vehicle_id);
@@ -588,7 +573,6 @@ public:
* @exception ScriptError::ERR_OWNED_BY_ANOTHER_COMPANY
* @exception ScriptOrder::ERR_ORDER_AIRCRAFT_NOT_ENOUGH_RANGE
* @return True if and only if the sharing succeeded.
* @api -game
*/
static bool ShareOrders(VehicleID vehicle_id, VehicleID main_vehicle_id);
@@ -599,7 +583,6 @@ public:
* @pre ScriptVehicle::IsPrimaryVehicle(vehicle_id).
* @game @pre ScriptCompanyMode::IsValid().
* @return True if and only if the unsharing succeeded.
* @api -game
*/
static bool UnshareOrders(VehicleID vehicle_id);

View File

@@ -25,7 +25,7 @@ public:
*/
enum SubsidyParticipantType {
/* Values are important, as they represent the internal state of the game.
* It is originally named SourceType. ST_HEADQUARTERS is intentionally
* It is originally named SourceType. SourceType::Headquarters is intentionally
* left out, as it cannot be used for Subsidies. */
SPT_INDUSTRY = 0, ///< Subsidy participant is an industry
SPT_TOWN = 1, ///< Subsidy participant is a town

View File

@@ -103,7 +103,7 @@ ScriptVehicleList_SharedOrders::ScriptVehicleList_SharedOrders(VehicleID vehicle
ScriptVehicleList_Group::ScriptVehicleList_Group(GroupID group_id)
{
EnforceDeityOrCompanyModeValid_Void();
EnforceCompanyModeValid_Void();
if (!ScriptGroup::IsValidGroup((ScriptGroup::GroupID)group_id)) return;
for (const Vehicle *v : Vehicle::Iterate()) {
@@ -115,7 +115,7 @@ ScriptVehicleList_Group::ScriptVehicleList_Group(GroupID group_id)
ScriptVehicleList_DefaultGroup::ScriptVehicleList_DefaultGroup(ScriptVehicle::VehicleType vehicle_type)
{
EnforceDeityOrCompanyModeValid_Void();
EnforceCompanyModeValid_Void();
if (vehicle_type < ScriptVehicle::VT_RAIL || vehicle_type > ScriptVehicle::VT_AIR) return;
for (const Vehicle *v : Vehicle::Iterate()) {

View File

@@ -69,26 +69,28 @@ public:
/**
* Creates a list of vehicles that are in a group.
* @api ai
* @api ai game
* @ingroup ScriptList
*/
class ScriptVehicleList_Group : public ScriptList {
public:
/**
* @param group_id The ID of the group the vehicles are in.
* @game @pre ScriptCompanyMode::IsValid().
*/
ScriptVehicleList_Group(GroupID group_id);
};
/**
* Creates a list of vehicles that are in the default group.
* @api ai
* @api ai game
* @ingroup ScriptList
*/
class ScriptVehicleList_DefaultGroup : public ScriptList {
public:
/**
* @param vehicle_type The VehicleType to get the list of vehicles for.
* @game @pre ScriptCompanyMode::IsValid().
*/
ScriptVehicleList_DefaultGroup(ScriptVehicle::VehicleType vehicle_type);
};

View File

@@ -26,7 +26,6 @@ void ScriptConfig::Change(const char *name, int version, bool force_exact_match,
this->is_random = is_random;
if (this->config_list != nullptr) delete this->config_list;
this->config_list = (info == nullptr) ? nullptr : new ScriptConfigItemList();
if (this->config_list != nullptr) this->PushExtraConfigList();
this->to_load_data.reset();
this->ClearConfigList();
@@ -79,7 +78,6 @@ const ScriptConfigItemList *ScriptConfig::GetConfigList()
if (this->info != nullptr) return this->info->GetConfigList();
if (this->config_list == nullptr) {
this->config_list = new ScriptConfigItemList();
this->PushExtraConfigList();
}
return this->config_list;
}

View File

@@ -51,8 +51,6 @@ struct ScriptConfigItem {
typedef std::list<ScriptConfigItem> ScriptConfigItemList; ///< List of ScriptConfig items.
extern ScriptConfigItem _start_date_config;
/**
* Script settings.
*/
@@ -127,12 +125,12 @@ public:
* @return The (default) value of the setting, or -1 if the setting was not
* found.
*/
virtual int GetSetting(const char *name) const;
int GetSetting(const char *name) const;
/**
* Set the value of a setting for this config.
*/
virtual void SetSetting(const char *name, int value);
void SetSetting(const char *name, int value);
/**
* Reset all settings to their default value.
@@ -147,7 +145,7 @@ public:
/**
* Randomize all settings the Script requested to be randomized.
*/
virtual void AddRandomDeviation();
void AddRandomDeviation();
/**
* Is this config attached to an Script? In other words, is there a Script
@@ -202,16 +200,10 @@ protected:
bool is_random; ///< True if the AI in this slot was randomly chosen.
std::unique_ptr<ScriptInstance::ScriptData> to_load_data; ///< Data to load after the Script start.
/**
* In case you have mandatory non-Script-definable config entries in your
* list, add them to this function.
*/
virtual void PushExtraConfigList() {};
/**
* Routine that clears the config list.
*/
virtual void ClearConfigList();
void ClearConfigList();
/**
* This function should call back to the Scanner in charge of this Config,

View File

@@ -388,14 +388,8 @@ struct ScriptSettingsWindow : public Window {
TextColour colour;
uint idx = 0;
if (StrEmpty(config_item.description)) {
if (this->slot != OWNER_DEITY && !strcmp(config_item.name, "start_date")) {
/* Build-in translation */
str = STR_AI_SETTINGS_START_DELAY;
colour = TC_LIGHT_BLUE;
} else {
str = STR_JUST_STRING;
colour = TC_ORANGE;
}
str = STR_JUST_STRING;
colour = TC_ORANGE;
} else {
str = STR_AI_SETTINGS_SETTING;
colour = TC_LIGHT_BLUE;

View File

@@ -92,7 +92,7 @@ void ScriptInstance::Initialize(const char *main_script, const char *instance_na
return;
}
if (this->script_type == ST_GS) {
if (this->script_type == ScriptType::GS) {
if (strcmp(instance_name, "BeeRewardClass") == 0) {
this->LoadCompatibilityScripts("brgs", GAME_DIR);
}
@@ -791,7 +791,7 @@ void ScriptInstance::LimitOpsTillSuspend(SQInteger suspend)
uint32 ScriptInstance::GetMaxOpsTillSuspend() const
{
if (this->script_type == ST_GS && (_pause_mode & PM_PAUSED_GAME_SCRIPT) != PM_UNPAUSED) {
if (this->script_type == ScriptType::GS && (_pause_mode & PM_PAUSED_GAME_SCRIPT) != PM_UNPAUSED) {
/* Boost opcodes till suspend when paused due to game script */
return std::min<uint32>(250000, _settings_game.script.script_max_opcode_till_suspend * 10);
}

View File

@@ -13,9 +13,9 @@
#include <squirrel.h>
/** The type of script we're working with, i.e. for who is it? */
enum ScriptType {
ST_AI, ///< The script is for AI scripts.
ST_GS, ///< The script is for Game scripts.
enum class ScriptType {
AI, ///< The script is for AI scripts.
GS, ///< The script is for Game scripts.
};
struct ScriptAllocator;