From 2fc120d4d1f3454bf44116fb4b9d6a9a7f1e1575 Mon Sep 17 00:00:00 2001 From: truebrain Date: Mon, 19 Dec 2011 21:01:12 +0000 Subject: [PATCH] (svn r23628) -Add: ScriptSubsidy::Create, to create subsidies (GameScript only) --- src/command.cpp | 2 + src/command_type.h | 1 + src/script/api/game/game_subsidy.hpp.sq | 1 + src/script/api/script_subsidy.cpp | 14 ++++++ src/script/api/script_subsidy.hpp | 20 +++++++++ src/subsidy.cpp | 58 +++++++++++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/src/command.cpp b/src/command.cpp index 7b32b11509..677b748644 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -147,6 +147,7 @@ CommandProc CmdMoneyCheat; CommandProc CmdBuildCanal; CommandProc CmdBuildLock; +CommandProc CmdCreateSubsidy; CommandProc CmdCompanyCtrl; CommandProc CmdCustomNewsItem; @@ -282,6 +283,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdMoneyCheat, CMD_OFFLINE, CMDT_CHEAT ), // CMD_MONEY_CHEAT DEF_CMD(CmdBuildCanal, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_CANAL + DEF_CMD(CmdCreateSubsidy, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CREATE_SUBSIDY DEF_CMD(CmdCompanyCtrl, CMD_SPECTATOR | CMD_CLIENT_ID, CMDT_SERVER_SETTING ), // CMD_COMPANY_CTRL DEF_CMD(CmdCustomNewsItem, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CUSTOM_NEWS_ITEM diff --git a/src/command_type.h b/src/command_type.h index bf6507bcde..eb1db573e3 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -261,6 +261,7 @@ enum Commands { CMD_MONEY_CHEAT, ///< do the money cheat CMD_BUILD_CANAL, ///< build a canal + CMD_CREATE_SUBSIDY, ///< create a new subsidy CMD_COMPANY_CTRL, ///< used in multiplayer to create a new companies etc. CMD_CUSTOM_NEWS_ITEM, ///< create a custom news message CMD_LEVEL_LAND, ///< level land diff --git a/src/script/api/game/game_subsidy.hpp.sq b/src/script/api/game/game_subsidy.hpp.sq index bba8abce5d..2d636f74dc 100644 --- a/src/script/api/game/game_subsidy.hpp.sq +++ b/src/script/api/game/game_subsidy.hpp.sq @@ -27,6 +27,7 @@ void SQGSSubsidy_Register(Squirrel *engine) SQGSSubsidy.DefSQStaticMethod(engine, &ScriptSubsidy::IsValidSubsidy, "IsValidSubsidy", 2, ".i"); SQGSSubsidy.DefSQStaticMethod(engine, &ScriptSubsidy::IsAwarded, "IsAwarded", 2, ".i"); + SQGSSubsidy.DefSQStaticMethod(engine, &ScriptSubsidy::Create, "Create", 6, ".iiiii"); SQGSSubsidy.DefSQStaticMethod(engine, &ScriptSubsidy::GetAwardedTo, "GetAwardedTo", 2, ".i"); SQGSSubsidy.DefSQStaticMethod(engine, &ScriptSubsidy::GetExpireDate, "GetExpireDate", 2, ".i"); SQGSSubsidy.DefSQStaticMethod(engine, &ScriptSubsidy::GetCargoType, "GetCargoType", 2, ".i"); diff --git a/src/script/api/script_subsidy.cpp b/src/script/api/script_subsidy.cpp index 6bc7ba8b9f..8ec074d4d0 100644 --- a/src/script/api/script_subsidy.cpp +++ b/src/script/api/script_subsidy.cpp @@ -12,6 +12,9 @@ #include "../../stdafx.h" #include "script_subsidy.hpp" #include "script_date.hpp" +#include "script_industry.hpp" +#include "script_town.hpp" +#include "script_error.hpp" #include "../../subsidy_base.h" #include "../../station_base.h" @@ -27,6 +30,17 @@ return ::Subsidy::Get(subsidy_id)->IsAwarded(); } +/* static */ bool ScriptSubsidy::Create(CargoID cargo_type, SubsidyParticipantType from_type, uint16 from_id, SubsidyParticipantType to_type, uint16 to_id) +{ + EnforcePrecondition(false, ScriptCargo::IsValidCargo(cargo_type)); + EnforcePrecondition(false, from_type == SPT_INDUSTRY || from_type == SPT_TOWN); + EnforcePrecondition(false, to_type == SPT_INDUSTRY || to_type == SPT_TOWN); + EnforcePrecondition(false, (from_type == SPT_INDUSTRY && ScriptIndustry::IsValidIndustry(from_id)) || (from_type == SPT_TOWN && ScriptTown::IsValidTown(from_id))); + EnforcePrecondition(false, (to_type == SPT_INDUSTRY && ScriptIndustry::IsValidIndustry(to_id)) || (to_type == SPT_TOWN && ScriptTown::IsValidTown(to_id))); + + return ScriptObject::DoCommand(0, from_type | (from_id << 8) | (cargo_type << 24), to_type | (to_id << 8), CMD_CREATE_SUBSIDY); +} + /* static */ ScriptCompany::CompanyID ScriptSubsidy::GetAwardedTo(SubsidyID subsidy_id) { if (!IsAwarded(subsidy_id)) return ScriptCompany::COMPANY_INVALID; diff --git a/src/script/api/script_subsidy.hpp b/src/script/api/script_subsidy.hpp index b6742ab1c9..bf565056e4 100644 --- a/src/script/api/script_subsidy.hpp +++ b/src/script/api/script_subsidy.hpp @@ -25,6 +25,9 @@ public: * @note The list of values may grow in future. */ enum SubsidyParticipantType { + /* Values are important, as they represent the internal state of the game. + * It is orignally named SourceType. ST_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 SPT_INVALID = 0xFF, ///< Invalid/unknown participant type @@ -45,6 +48,23 @@ public: */ static bool IsAwarded(SubsidyID subsidy_id); + /** + * Create a new subsidy. + * @param cargo_type The type of cargo to cary for the subsidy. + * @param from_type The type of the subsidy on the 'from' side. + * @param from_id The ID of the 'from' side. + * @param to_type The type of the subsidy on the 'to' side. + * @param to_id The ID of the 'to' side. + * @return True if the action succeeded. + * @pre ScriptCargo::IsValidCargo(cargo_type) + * @pre from_type == SPT_INDUSTRY || from_type == SPT_TOWN. + * @pre to_type == SPT_INDUSTRY || to_type == SPT_TOWN. + * @pre (from_type == SPT_INDUSTRY && ScriptIndustry::IsValidIndustry(from_id)) || (from_type == SPT_TOWN && ScriptTown::IsValidTown(from_id)) + * @pre (to_type == SPT_INDUSTRY && ScriptIndustry::IsValidIndustry(to_id)) || (to_type == SPT_TOWN && ScriptTown::IsValidTown(to_id)) + * @api -ai + */ + static bool Create(CargoID cargo_type, SubsidyParticipantType from_type, uint16 from_id, SubsidyParticipantType to_type, uint16 to_id); + /** * Get the company index of the company this subsidy is awarded to. * @param subsidy_id The SubsidyID to check. diff --git a/src/subsidy.cpp b/src/subsidy.cpp index 6e4ee0694f..5183b1d2e5 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -24,6 +24,7 @@ #include "core/pool_func.hpp" #include "core/random_func.hpp" #include "game/game.hpp" +#include "command_func.h" #include "table/strings.h" @@ -205,8 +206,65 @@ void CreateSubsidy(CargoID cid, SourceType src_type, SourceID src, SourceType ds SetPartOfSubsidyFlag(s->dst_type, s->dst, POS_DST); AI::BroadcastNewEvent(new ScriptEventSubsidyOffer(s->index)); Game::NewEvent(new ScriptEventSubsidyOffer(s->index)); + + InvalidateWindowData(WC_SUBSIDIES_LIST, 0); } +/** + * Create a new subsidy. + * @param tile unused. + * @param flags type of operation + * @param p1 various bitstuffed elements + * - p1 = (bit 0 - 7) - SourceType of source. + * - p1 = (bit 8 - 23) - SourceID of source. + * - p1 = (bit 24 - 31) - CargoID of subsidy. + * @param p2 various bitstuffed elements + * - p2 = (bit 0 - 7) - SourceType of destination. + * - p2 = (bit 8 - 23) - SourceID of destionation. + * @param text unused. + * @return the cost of this operation or an error + */ +CommandCost CmdCreateSubsidy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (!Subsidy::CanAllocateItem()) return CMD_ERROR; + + CargoID cid = GB(p1, 24, 8); + SourceType src_type = (SourceType)GB(p1, 0, 8); + SourceID src = GB(p1, 8, 16); + SourceType dst_type = (SourceType)GB(p2, 0, 8); + SourceID dst = GB(p2, 8, 16); + + if (_current_company != OWNER_DEITY) return CMD_ERROR; + + if (cid >= NUM_CARGO || !::CargoSpec::Get(cid)->IsValid()) return CMD_ERROR; + + switch (src_type) { + case ST_TOWN: + if (!Town::IsValidID(src)) return CMD_ERROR; + break; + case ST_INDUSTRY: + if (!Industry::IsValidID(src)) return CMD_ERROR; + break; + default: + return CMD_ERROR; + } + switch (dst_type) { + case ST_TOWN: + if (!Town::IsValidID(dst)) return CMD_ERROR; + break; + case ST_INDUSTRY: + if (!Industry::IsValidID(dst)) return CMD_ERROR; + break; + default: + return CMD_ERROR; + } + + if (flags & DC_EXEC) { + CreateSubsidy(cid, src_type, src, dst_type, dst); + } + + return CommandCost(); +} /** Tries to create a passenger subsidy between two towns. * @return True iff the subsidy was created.