2009-01-12 17:11:45 +00:00
|
|
|
/* $Id$ */
|
|
|
|
|
2009-08-21 20:21:05 +00:00
|
|
|
/*
|
|
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2011-11-29 23:07:38 +00:00
|
|
|
/** @file script_town.hpp Everything to query towns. */
|
2009-01-12 17:11:45 +00:00
|
|
|
|
2011-11-29 23:07:38 +00:00
|
|
|
#ifndef SCRIPT_TOWN_HPP
|
|
|
|
#define SCRIPT_TOWN_HPP
|
2009-01-12 17:11:45 +00:00
|
|
|
|
2011-11-29 23:07:38 +00:00
|
|
|
#include "script_cargo.hpp"
|
|
|
|
#include "script_company.hpp"
|
2011-12-15 18:40:15 +00:00
|
|
|
#include "../../town_type.h"
|
2009-01-12 17:11:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Class that handles all town related functions.
|
2011-12-19 20:57:23 +00:00
|
|
|
* @api ai game
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
2011-11-29 23:15:35 +00:00
|
|
|
class ScriptTown : public ScriptObject {
|
2009-01-12 17:11:45 +00:00
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Actions that one can perform on a town.
|
2011-12-19 20:57:23 +00:00
|
|
|
* @api -game
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
|
|
|
enum TownAction {
|
2011-12-15 18:40:15 +00:00
|
|
|
/* Note: these values represent part of the in-game order of the _town_action_proc array */
|
2009-01-12 17:11:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The cargo ratings temporary gains 25% of rating (in
|
|
|
|
* absolute percentage, so 10% becomes 35%, with a max of 99%)
|
|
|
|
* for all stations within 10 tiles.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_ADVERTISE_SMALL = 0,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The cargo ratings temporary gains 44% of rating (in
|
|
|
|
* absolute percentage, so 10% becomes 54%, with a max of 99%)
|
|
|
|
* for all stations within 15 tiles.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_ADVERTISE_MEDIUM = 1,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The cargo ratings temporary gains 63% of rating (in
|
|
|
|
* absolute percentage, so 10% becomes 73%, with a max of 99%)
|
|
|
|
* for all stations within 20 tiles.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_ADVERTISE_LARGE = 2,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Rebuild the roads of this town for 6 months.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_ROAD_REBUILD = 3,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Build a statue in this town.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_BUILD_STATUE = 4,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fund the creation of extra buildings for 3 months.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_FUND_BUILDINGS = 5,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Buy exclusive rights for this town for 12 months.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_BUY_RIGHTS = 6,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Bribe the town in order to get a higher rating.
|
|
|
|
*/
|
|
|
|
TOWN_ACTION_BRIBE = 7,
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Different ratings one could have in a town.
|
|
|
|
*/
|
|
|
|
enum TownRating {
|
2010-08-01 19:36:36 +00:00
|
|
|
TOWN_RATING_NONE, ///< The company got no rating in the town.
|
|
|
|
TOWN_RATING_APPALLING, ///< The company got an appalling rating in the town .
|
|
|
|
TOWN_RATING_VERY_POOR, ///< The company got an very poor rating in the town.
|
|
|
|
TOWN_RATING_POOR, ///< The company got an poor rating in the town.
|
|
|
|
TOWN_RATING_MEDIOCRE, ///< The company got an mediocre rating in the town.
|
|
|
|
TOWN_RATING_GOOD, ///< The company got an good rating in the town.
|
|
|
|
TOWN_RATING_VERY_GOOD, ///< The company got an very good rating in the town.
|
|
|
|
TOWN_RATING_EXCELLENT, ///< The company got an excellent rating in the town.
|
|
|
|
TOWN_RATING_OUTSTANDING, ///< The company got an outstanding rating in the town.
|
|
|
|
TOWN_RATING_INVALID = -1, ///< The town rating for invalid towns/companies.
|
2009-01-12 17:11:45 +00:00
|
|
|
};
|
|
|
|
|
2009-02-04 23:26:21 +00:00
|
|
|
/**
|
|
|
|
* Possible layouts for the roads in a town.
|
|
|
|
*/
|
|
|
|
enum RoadLayout {
|
2011-12-15 18:40:15 +00:00
|
|
|
/* Note: these values represent part of the in-game TownLayout enum */
|
|
|
|
ROAD_LAYOUT_ORIGINAL = ::TL_ORIGINAL, ///< Original algorithm (min. 1 distance between roads).
|
|
|
|
ROAD_LAYOUT_BETTER_ROADS = ::TL_BETTER_ROADS, ///< Extended original algorithm (min. 2 distance between roads).
|
|
|
|
ROAD_LAYOUT_2x2 = ::TL_2X2_GRID, ///< Geometric 2x2 grid algorithm
|
|
|
|
ROAD_LAYOUT_3x3 = ::TL_3X3_GRID, ///< Geometric 3x3 grid algorithm
|
|
|
|
|
|
|
|
/* Custom added value, only valid for this API */
|
|
|
|
ROAD_LAYOUT_INVALID = -1, ///< The layout for invalid towns.
|
2009-02-04 23:26:21 +00:00
|
|
|
};
|
|
|
|
|
2009-01-12 17:11:45 +00:00
|
|
|
/**
|
2009-02-19 09:01:34 +00:00
|
|
|
* Gets the number of towns.
|
2009-01-12 17:11:45 +00:00
|
|
|
* @return The number of towns.
|
|
|
|
*/
|
|
|
|
static int32 GetTownCount();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks whether the given town index is valid.
|
|
|
|
* @param town_id The index to check.
|
|
|
|
* @return True if and only if the town is valid.
|
|
|
|
*/
|
|
|
|
static bool IsValidTown(TownID town_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the name of the town.
|
|
|
|
* @param town_id The town to get the name of.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The name of the town.
|
|
|
|
*/
|
2009-01-17 15:31:30 +00:00
|
|
|
static char *GetName(TownID town_id);
|
2009-01-12 17:11:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the number of inhabitants in the town.
|
|
|
|
* @param town_id The town to get the population of.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The number of inhabitants.
|
|
|
|
*/
|
|
|
|
static int32 GetPopulation(TownID town_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the number of houses in the town.
|
|
|
|
* @param town_id The town to get the number of houses of.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The number of houses.
|
|
|
|
*/
|
|
|
|
static int32 GetHouseCount(TownID town_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the location of the town.
|
|
|
|
* @param town_id The town to get the location of.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The location of the town.
|
|
|
|
*/
|
|
|
|
static TileIndex GetLocation(TownID town_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the total last month's production of the given cargo at a town.
|
|
|
|
* @param town_id The index of the town.
|
|
|
|
* @param cargo_id The index of the cargo.
|
|
|
|
* @pre IsValidTown(town_id).
|
2011-11-29 23:15:35 +00:00
|
|
|
* @pre ScriptCargo::IsValidCargo(cargo_id).
|
2009-01-12 17:11:45 +00:00
|
|
|
* @return The last month's production of the given cargo for this town.
|
|
|
|
*/
|
|
|
|
static int32 GetLastMonthProduction(TownID town_id, CargoID cargo_id);
|
|
|
|
|
|
|
|
/**
|
2011-11-23 16:05:19 +00:00
|
|
|
* Get the total amount of cargo supplied from a town last month.
|
|
|
|
* @param town_id The index of the town.
|
2009-01-12 17:11:45 +00:00
|
|
|
* @param cargo_id The index of the cargo.
|
|
|
|
* @pre IsValidTown(town_id).
|
2011-11-29 23:15:35 +00:00
|
|
|
* @pre ScriptCargo::IsValidCargo(cargo_id).
|
2011-11-23 16:05:19 +00:00
|
|
|
* @return The amount of cargo supplied for transport from this town last month.
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
2011-11-23 16:05:19 +00:00
|
|
|
static int32 GetLastMonthSupplied(TownID town_id, CargoID cargo_id);
|
2009-08-27 13:50:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the percentage of transported production of the given cargo at a town.
|
|
|
|
* @param town_id The index of the town.
|
|
|
|
* @param cargo_id The index of the cargo.
|
|
|
|
* @pre IsValidTown(town_id).
|
2011-11-29 23:15:35 +00:00
|
|
|
* @pre ScriptCargo::IsValidCargo(cargo_id).
|
2009-08-27 13:50:07 +00:00
|
|
|
* @return The percentage of given cargo transported from this town last month.
|
|
|
|
*/
|
|
|
|
static int32 GetLastMonthTransportedPercentage(TownID town_id, CargoID cargo_id);
|
2009-01-12 17:11:45 +00:00
|
|
|
|
2011-11-23 16:05:19 +00:00
|
|
|
/**
|
|
|
|
* Get the total amount of cargo effects received by a town last month.
|
|
|
|
* @param town_id The index of the town.
|
|
|
|
* @param towneffect_id The index of the cargo.
|
|
|
|
* @pre IsValidTown(town_id).
|
2011-11-29 23:15:35 +00:00
|
|
|
* @pre ScriptCargo::IsValidTownEffect(cargo_id).
|
2011-11-23 16:05:19 +00:00
|
|
|
* @return The amount of cargo received by this town last month for this cargo effect.
|
|
|
|
*/
|
2011-11-29 23:15:35 +00:00
|
|
|
static int32 GetLastMonthReceived(TownID town_id, ScriptCargo::TownEffect towneffect_id);
|
2011-11-23 16:05:19 +00:00
|
|
|
|
2011-11-23 16:09:46 +00:00
|
|
|
/**
|
|
|
|
* Get the amount of cargo that needs to be delivered (per TownEffect) for a
|
|
|
|
* town to grow. All goals need to be reached before a town will grow.
|
|
|
|
* @param town_id The index of the town.
|
|
|
|
* @param towneffect_id The index of the towneffect.
|
|
|
|
* @pre IsValidTown(town_id).
|
2011-11-29 23:15:35 +00:00
|
|
|
* @pre ScriptCargo::IsValidTownEffect(cargo_id).
|
2011-11-23 16:09:46 +00:00
|
|
|
* @return The goal of the cargo.
|
|
|
|
* @note Goals can change over time. For example with a changing snowline, or
|
|
|
|
* with a growing town.
|
|
|
|
*/
|
2011-11-29 23:15:35 +00:00
|
|
|
static uint32 GetCargoGoal(TownID town_id, ScriptCargo::TownEffect towneffect_id);
|
2011-11-23 16:09:46 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the amount of days between town growth.
|
|
|
|
* @param town_id The index of the town.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return True if the action succeeded.
|
|
|
|
* @note This function does not indicate when it will grow next. It only tells you the time between growths.
|
|
|
|
*/
|
|
|
|
static int32 GetGrowthRate(TownID town_id);
|
|
|
|
|
2009-01-12 17:11:45 +00:00
|
|
|
/**
|
2011-11-29 23:15:35 +00:00
|
|
|
* Get the manhattan distance from the tile to the ScriptTown::GetLocation()
|
2009-01-12 17:11:45 +00:00
|
|
|
* of the town.
|
|
|
|
* @param town_id The town to get the distance to.
|
|
|
|
* @param tile The tile to get the distance to.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The distance between town and tile.
|
|
|
|
*/
|
|
|
|
static int32 GetDistanceManhattanToTile(TownID town_id, TileIndex tile);
|
|
|
|
|
|
|
|
/**
|
2011-11-29 23:15:35 +00:00
|
|
|
* Get the square distance from the tile to the ScriptTown::GetLocation()
|
2009-01-12 17:11:45 +00:00
|
|
|
* of the town.
|
|
|
|
* @param town_id The town to get the distance to.
|
|
|
|
* @param tile The tile to get the distance to.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The distance between town and tile.
|
|
|
|
*/
|
|
|
|
static int32 GetDistanceSquareToTile(TownID town_id, TileIndex tile);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find out if this tile is within the rating influence of a town.
|
2011-08-19 21:18:32 +00:00
|
|
|
* If a station sign would be on this tile, the servicing quality of the station would
|
|
|
|
* influence the rating of the town.
|
2009-01-12 17:11:45 +00:00
|
|
|
* @param town_id The town to check.
|
|
|
|
* @param tile The tile to check.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return True if the tile is within the rating influence of the town.
|
|
|
|
*/
|
|
|
|
static bool IsWithinTownInfluence(TownID town_id, TileIndex tile);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find out if this town has a statue for the current company.
|
|
|
|
* @param town_id The town to check.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return True if the town has a statue.
|
2011-12-19 20:57:23 +00:00
|
|
|
* @api -game
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
|
|
|
static bool HasStatue(TownID town_id);
|
|
|
|
|
2010-12-29 12:19:33 +00:00
|
|
|
/**
|
|
|
|
* Find out if the town is a city.
|
|
|
|
* @param town_id The town to check.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return True if the town is a city.
|
|
|
|
*/
|
|
|
|
static bool IsCity(TownID town_id);
|
|
|
|
|
2009-01-12 17:11:45 +00:00
|
|
|
/**
|
|
|
|
* Find out how long the town is undergoing road reconstructions.
|
|
|
|
* @param town_id The town to check.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The number of months the road reworks are still going to take.
|
|
|
|
* The value 0 means that there are currently no road reworks.
|
|
|
|
*/
|
|
|
|
static int GetRoadReworkDuration(TownID town_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find out which company currently has the exclusive rights of this town.
|
|
|
|
* @param town_id The town to check.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The company that has the exclusive rights. The value
|
2011-11-29 23:15:35 +00:00
|
|
|
* ScriptCompany::COMPANY_INVALID means that there are currently no
|
2009-01-12 17:11:45 +00:00
|
|
|
* exclusive rights given out to anyone.
|
2011-12-19 20:57:23 +00:00
|
|
|
* @api -game
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
2011-11-29 23:15:35 +00:00
|
|
|
static ScriptCompany::CompanyID GetExclusiveRightsCompany(TownID town_id);
|
2009-01-12 17:11:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Find out how long the town is under influence of the exclusive rights.
|
|
|
|
* @param town_id The town to check.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return The number of months the exclusive rights hold.
|
|
|
|
* The value 0 means that there are currently no exclusive rights
|
|
|
|
* given out to anyone.
|
|
|
|
*/
|
|
|
|
static int32 GetExclusiveRightsDuration(TownID town_id);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find out if an action can currently be performed on the town.
|
|
|
|
* @param town_id The town to perform the action on.
|
|
|
|
* @param town_action The action to perform on the town.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @return True if and only if the action can performed.
|
2011-12-19 20:57:23 +00:00
|
|
|
* @api -game
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
|
|
|
static bool IsActionAvailable(TownID town_id, TownAction town_action);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Perform a town action on this town.
|
|
|
|
* @param town_id The town to perform the action on.
|
|
|
|
* @param town_action The action to perform on the town.
|
|
|
|
* @pre IsValidTown(town_id).
|
|
|
|
* @pre IsActionAvailable(town_id, town_action).
|
|
|
|
* @return True if the action succeeded.
|
2011-12-19 20:57:23 +00:00
|
|
|
* @api -game
|
2009-01-12 17:11:45 +00:00
|
|
|
*/
|
|
|
|
static bool PerformTownAction(TownID town_id, TownAction town_action);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the rating of a company within a town.
|
|
|
|
* @param town_id The town to get the rating for.
|
|
|
|
* @param company_id The company to get the rating for.
|
|
|
|
* @pre IsValidTown(town_id).
|
2011-11-29 23:15:35 +00:00
|
|
|
* @pre ScriptCompany.ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID.
|
2009-01-12 17:11:45 +00:00
|
|
|
* @return The rating as shown to humans.
|
|
|
|
*/
|
2011-11-29 23:15:35 +00:00
|
|
|
static TownRating GetRating(TownID town_id, ScriptCompany::CompanyID company_id);
|
2009-01-12 17:11:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the maximum level of noise that still can be added by airports
|
|
|
|
* before the town start to refuse building a new airport.
|
|
|
|
* @param town_id The town to get the allowed noise from.
|
|
|
|
* @return The noise that still can be added.
|
|
|
|
*/
|
|
|
|
static int GetAllowedNoise(TownID town_id);
|
2009-02-04 23:26:21 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the road layout for a town.
|
|
|
|
* @param town_id The town to get the road layout from.
|
|
|
|
* @return The RoadLayout for the town.
|
|
|
|
*/
|
|
|
|
static RoadLayout GetRoadLayout(TownID town_id);
|
2009-01-12 17:11:45 +00:00
|
|
|
};
|
|
|
|
|
2011-11-29 23:07:38 +00:00
|
|
|
#endif /* SCRIPT_TOWN_HPP */
|