Smart City Plan mod API documentation
How to create a simple mod
Mod functions
How to debug your mod
API documentation
How to create a simple mod
If you don't know how to create very basic mods, you can take a look at the
Creating mods section of the game manual. You can create basic mods even without programming. This document here is only for programmers.
Requisites:
- You should know a bit of how JavaScript works
- A bit of programming experience is good
If you don't have this, you might want to take a look
on how to create mods without programming instead.
To start:
Download the "Detailed City Report" mod. See using mods for how to do this.
In Windows, right-click the Windows start button in the task bar, and select 'Run'. There, type
%localappdata%
and press ENTER. You should find a folder named "Smart City Plan" and under that, a folder named "mods". A folder named "detailed city report" should be in there, which contains the just downloaded "Detailed City Report" mod.
Copy the "detailed city report" folder and name it how you want your mod to be called, like "my mod".
Go into your new "my mod" folder and take a look at its content. You will find these files:
- icon.jpg - an icon for the mod
- script.js - The actual script file
- mod.json - a text file in JSON format containing all the info about this mod.
Open the script.js file and replace it with your own code, for example with this (which is a very simplified version of the detailed city report script):
new function()
{
this.LastTimeRan = 0; // last time this mod ran
this.run = function() // <- called about ~30 times per second by the game
{
var now = game_get_time();
if (now - this.LastTimeRan < 120) // only run every 120 minutes in game time
return;
this.LastTimeRan = now;
game_send_mail('Population: ' + game_get_city().Population, 'hourly report');
};
}
This code will send a mail every two game hours to the player, with the current population amount of the city. Not very useful, but good as example code.
It works like this: You need to define a function object, which has a method named 'run'. This is being called every game logic step. In there, you can do your game logic and access and manipulate the game.
Mod functions
When you create a mod, it can expose the following functions:
run()
This is called about 30 times per frame by the game. In this function, you can analyze the game state and manipulate it, how you feel like. But be sure that you don't do very heavy calculations every frame, otherwise the game will start running slower. A usual way is to limit the amount of the function to run to about once every game hour (that's about once every 3 seconds). To do this, do it like this:
new function()
{
this.LastTimeRan = 0; // last time this mod ran
this.run = function()
{
var now = game_get_time();
if (now - this.LastTimeRan < 60) // only run every 60 minutes in game time
return;
this.LastTimeRan = now;
// do the things you actually want to do here
};
}
deinit()
This is optional and not needed. This is called when the mod is de-initialized. Like when the game is stopped, the mod is uninstalled, or when the mod is realoaded. You don't have to override this function, but it is useful in case you modify the internals of the game logic or the game data with your mod. In deinit(), you can undo your changes, so that the game runs nicely again.
The following example shows this: It sets the unlock population value of the coal power plant to 0. When uninstalled, it restores the original default value again.
new function()
{
this.Initialized = false; // we only store if we ran already or not
this.run = function()
{
// we only need to run once, in the beginning of the game
if (this.Initialized) return;
this.Initialized = true;
// we set the unlock population count of the coal mine to 0, so that it is unlocked at the start of the game.
getBuildingTypeDataFromType(game_get_city().BT_POWER_PLANT_COAL).UnlockPopulationCount = 0;
};
this.deinit = function()
{
// this is called when the mod is deinitialized. set the default value back again.
getBuildingTypeDataFromType(game_get_city().BT_POWER_PLANT_COAL).UnlockPopulationCount = 8600;
}
}
onCommand()
This is optional and not needed. This is called when you create a mod which adds a button into the user interface, and that button is clicked. Download the "mark all mail as read" mod to see how this works, for example.
To add a new button into the user interface (it will be added in the "Mod" tab in the building palette), add a section like this into your mod.json file:
"scriptCommandButtons":
[
{
"name": "Mark All Emails as Read",
"id": "mark_emails_as_read",
"icon" : "emailread.png"
}
]
And use code like this to react to the command, when it is clicked:
new function()
{
this.run = function()
{
// do nothing. This script is only for testing the mod commands
};
this.onCommand = function(cmd)
{
// a mod command button was pressed
if (cmd == 'mark_emails_as_read') // this is the id as specified for the button in the mod.json file
{
// now mark all mails as read
game_runaction('markallasread'); // this is actually an undocumented feature in the game engine, but it works
}
}
}
How to debug your mod
Once you create a more serious mod, you probably want to be able to debug the mod, and be able to see the content of your variables. Smart City Plan contains a full debugger, complete with breakpoints and similar, as known from most web browsers.
To use it, do it like this:
In the top of your script, even outside of the run() method, store your 'this' variable in a global variable, like 'MyMod'. Also, call the function game_open_dev_console(). So that your code now looks like this:
new function()
{
this.LastTimeRan = 0; // last time this mod ran
// out-comment the following two lines again if you don't need to debug it anymore
MyMod = this;
game_open_dev_console();
this.run = function()
{
// ....
};
}
Then, when Smart City Plan loads your mod (for example when you click the 'update' button in the mod browser, or you start a new game), then it will open the debugger, like in the image shown above.
In the 'Sources' tab, there is a "Watch Expressions" section. Into there, add a variable named like you named the global variable in your script, in our example, this is "MyMod". Then, expand that variable, so that the "run" function is visible and right click on its text "function", and select "Show function definition". There, you can now add breakpoints and other things, and debug your mod.
Note: The game will likely run a lot slower when the debugger is active.
API documentation
Here is a list of most basic functions which are available to you:
- game_get_city()
Returns the city object. Contains everything to get infos about the city and to modify it.
Example:
game_send_mail("City Population:" + game_get_city().Population, );
Another example, to set the money:
game_get_city().Money = 23; // this is 23 thousand $
- game_get_time()
returns game time in minutes (1440 minutes is a day). You can get a displayable day/time by doing this:
var hours = Math.floor(time / 60);
var days = Math.floor(hours / 24);
hours -= (days * 24);
var timeAsString = "Day:" + day + " Hours:" + hours;
- game_open_dev_console()
Opens the debugging developer console. This is useful for inspecting game objects and available functions. (See in the API docs - how to debug a mod)
- game_send_mail(txt, subject)
Sends a mail to the user. Takes text and subject as string. Text can be HTML Code.
Note: Mods are not sandboxed. You are on your own, and you can break stuff easily in the game, so be careful. On the other hand, that way, you can do nearly everthing in the game.
Some functions are a bit obfuscated and named for example "_irr43". Don't use these, they are really only for internal usage.
City
The 'city' object can be obtained using the global
game_get_city() function. It returns the city with a lot of functions and properties. Some of them are listed here:
Properties
- AvgCrimeRate: Average crime rate in the city, a value like 5.7 for 5.7%
- Buildings: Array of BuildingInstanceData, representing all the buildings in the city
- CityWideSpeedLimit: limit in kmh when the city wide speed limit policy is set
- Map: Array representing the content of the map. Each entry contains an object with properties bidx (building index to building array), boverlay, bridge, deco, overlay, pipe, sub, tile and zone. Represending graphics data to show on the map. It's best to not access this map for manipulating it, instead, use the city.CreateNewBuildingAt() function instead.
- MapWidth: width of the map
- MapHeight: height of the map
- Laws: Array of Law objects, prepresending the active/inactive policies in the game.
- Population: current population of the city
- UnlockedBuildingTypes: List of building ids unlocked already. See Building Types.
Methods
- createNewBuildingAt(x,y,buildingtype,keepZoningIntact,time): creates a new building at the given position. See Building Types for building types. Be sure to set time to game_get_time(), and it is also always a good idea to test if the position is correct using canBuildingBePlacedAtPosition(). Example:
var city = game_get_city();
if (city.canBuildingBePlacedAtPosition(10, 10, city.BT_SCHOOL_SMALL))
city.createNewBuildingAt(10,10, city.BT_SCHOOL_SMALL, true, game_get_time());
- canBuildingBePlacedAtPosition(positionX, positionY, buildingtype, dontAllowWhenStreetInWay, mustBeOnThisTypeOfZone): returns if a type of building can be placed that that position.
- correctAllStreetTiles(): corrects all street/tram/hypertube/train tiles so they are linked togehter and look more natural.
- createRandomForests(rndseed): Creates random forests on the map with a random seed value
- deleteBuildingByIndex(buildingindex, keepzoningIntact): Deletes a building from the city.
- getBuildingIndex(buildingInstance): returns the index of a specific building intance
- getBuildingIndexAtPosition(x,y): returns the building instance at the map position of x and y, or null if nothing there
- isWaterTileAt(x,y): returns if there is water at the given position
- setAsNewlyUnlockedItem(buildingType): sets that a building has been unlocked. See Building Types.
BuildingInstanceData
The building instance data represents one building in the city. They are stored in the city.Buildings[] array. Some of their methods are listed here:
Properties
- Name: Name string of the building
- PosX: X position on map.
- PosY: Y position on map
- BuildTime: Game time when this was built
- BuildingId: unique id of this building
- BuildingType: Type of this building, see Building Types
- FireStartTime: If on fire, when the fire was started
- HappinessValue: Happiness value. 100 if everything is fine.
- ResidentCount: people living here
- UsedCapacity: Percentage of used capacity, if this is for example a power plant.
- WorkerCount: Amounf of people working here.
Methods
- getBuildingTypeData(): Returns a building type data object describing the type of this object
- getWaterNeeded(): Returns the amount of water needed for this building.
- hasPower(): Returns if this building has power
- hasWater(): If this building has Water access
- hasDrain(): If this building has a working drain
- hasRoadAccess(): If this building has road access
- isConstructing(time): Returns if this building is currently being constructed (supply the time value for this to work as parameter)
- startBurning(time): starts burning down this building (supply the time value for this to work as parameter).
- stopBurning(): stops burning
- isWaterTileAt(x,y): returns if there is water at the given position
- setAsNewlyUnlockedItem(buildingType): sets that a building has been unlocked. See Building Types.
BuildingTypeData
The building type data represents the type of a building instance. It can be obtained using the
buildingInstance.getBuildingTypeData() function, or the global
getBuildingTypeDataFromType(type) function.
Properties
- Name: Name string of the building type
- BuildingType: Type of this building type, see Building Types
- Category: String categorizing this building, like "power"
- CrimeRadius: Radius influencing the crime (like for police buildings)
- EducationRadius: Radius influencing education (like for school buildings)
- FireRadius: Radius influencing fire safety (like for fire departments)
- HealthRadius: Radius influencing health (like for hospitals)
- LeisureRadius: Radius influencing leisure (like for parks)
- MaxResidents
- MaxWorkers
- MinWishedByPopulation: If set to 0, population will not wish for trams anymore
- NeedsRoadAccess: If this building type needs road access
- NoiseRadius: Noise of this building
- PollutionRadius: Pollution caused by this building
- PowerNeeded: Power needed
- Price: Price
- PublicTransportRadius: Radius influencing transport (like for tram stations)
- ReligionRadius: Radius influencing religion (like for churches)
- UnlockPopulationCount: When this building will become available.
- UpkeepCost: Money needed for upkeep
- WaterNeeded: If it needs to be placed next to water
- WorkingCapacity: For power platns
Methods
- getBuildingTileSize(): Returns an object with properties 'X' and 'Y', specifying the width and height of the building, in tiles. (like 2x2 for a school)
- canBurn(): Returns if the building can burn
Building Types
Building types are the values of BuildingTypeData.BuildingType. It's a unique id which can be used as parameter in various functions, such as city.CreateNewBuildingsAt().
Possible values are the following. Use them like this: game_get_city().BT_BUILDING_HOUSE_08;
Also note that there are pseudo values like BT_PSEUDO_STREET. They can be used for example with city.CreateNewBuildingAt() for building strees which then are automatically linked correctly in the map.
game_get_city().BT_UNKNOWN = 0
game_get_city().BT_BUILDING_AGRICULTURE_01
game_get_city().BT_BUILDING_AGRICULTURE_02
game_get_city().BT_BUILDING_AGRICULTURE_03
game_get_city().BT_BUILDING_AGRICULTURE_04
game_get_city().BT_BUILDING_AGRICULTURE_05
game_get_city().BT_BUILDING_AGRICULTURE_06
game_get_city().BT_BUILDING_AGRICULTURE_07
game_get_city().BT_BUILDING_COMMERCIAL_01
game_get_city().BT_BUILDING_COMMERCIAL_02
game_get_city().BT_BUILDING_COMMERCIAL_03
game_get_city().BT_BUILDING_COMMERCIAL_04
game_get_city().BT_BUILDING_COMMERCIAL_05
game_get_city().BT_BUILDING_COMMERCIAL_06
game_get_city().BT_BUILDING_COMMERCIAL_07
game_get_city().BT_BUILDING_COMMERCIAL_08
game_get_city().BT_BUILDING_COMMERCIAL_09
game_get_city().BT_BUILDING_COMMERCIAL_10
game_get_city().BT_BUILDING_COMMERCIAL_11
game_get_city().BT_BUILDING_COMMERCIAL_12
game_get_city().BT_BUILDING_COMMERCIAL_13
game_get_city().BT_BUILDING_COMMERCIAL_14
game_get_city().BT_BUILDING_COMMERCIAL_15
game_get_city().BT_BUILDING_COMMERCIAL_16
game_get_city().BT_BUILDING_COMMERCIAL_17
game_get_city().BT_BUILDING_COMMERCIAL_18
game_get_city().BT_BUILDING_COMMERCIAL_19
game_get_city().BT_BUILDING_COMMERCIAL_20
game_get_city().BT_BUILDING_COMMERCIAL_21
game_get_city().BT_BUILDING_COMMERCIAL_22
game_get_city().BT_BUILDING_COMMERCIAL_23
game_get_city().BT_BUILDING_COMMERCIAL_24
game_get_city().BT_BUILDING_COMMERCIAL_25
game_get_city().BT_BUILDING_HOUSE_01
game_get_city().BT_BUILDING_HOUSE_02
game_get_city().BT_BUILDING_HOUSE_03
game_get_city().BT_BUILDING_HOUSE_04
game_get_city().BT_BUILDING_HOUSE_05
game_get_city().BT_BUILDING_HOUSE_06
game_get_city().BT_BUILDING_HOUSE_07
game_get_city().BT_BUILDING_HOUSE_08
game_get_city().BT_BUILDING_HOUSE_09
game_get_city().BT_BUILDING_HOUSE_10
game_get_city().BT_BUILDING_HOUSE_11
game_get_city().BT_BUILDING_HOUSE_12
game_get_city().BT_BUILDING_HOUSE_13
game_get_city().BT_BUILDING_HOUSE_14
game_get_city().BT_BUILDING_HOUSE_15
game_get_city().BT_BUILDING_HOUSE_16
game_get_city().BT_BUILDING_HOUSE_17
game_get_city().BT_BUILDING_HOUSE_17_GREEN
game_get_city().BT_BUILDING_HOUSE_18
game_get_city().BT_BUILDING_HOUSE_18_GREEN
game_get_city().BT_BUILDING_HOUSE_19
game_get_city().BT_BUILDING_HOUSE_20
game_get_city().BT_BUILDING_HOUSE_20_GREEN
game_get_city().BT_BUILDING_HOUSE_21
game_get_city().BT_BUILDING_HOUSE_22
game_get_city().BT_BUILDING_HOUSE_23
game_get_city().BT_BUILDING_HOUSE_24
game_get_city().BT_BUILDING_HOUSE_24_GREEN
game_get_city().BT_BUILDING_HOUSE_25
game_get_city().BT_BUILDING_HOUSE_25_GREEN
game_get_city().BT_BUILDING_HOUSE_26
game_get_city().BT_BUILDING_HOUSE_26_GREEN
game_get_city().BT_BUILDING_HOUSE_27
game_get_city().BT_BUILDING_HOUSE_27_GREEN
game_get_city().BT_BUILDING_HOUSE_28
game_get_city().BT_BUILDING_HOUSE_29
game_get_city().BT_BUILDING_HOUSE_30
game_get_city().BT_BUILDING_HOUSE_31
game_get_city().BT_BUILDING_HOUSE_32
game_get_city().BT_BUILDING_HOUSE_33
game_get_city().BT_BUILDING_HOUSE_34
game_get_city().BT_BUILDING_HOUSE_35
game_get_city().BT_BUILDING_HOUSE_36
game_get_city().BT_BUILDING_HOUSE_37
game_get_city().BT_BUILDING_HOUSE_38
game_get_city().BT_BUILDING_HOUSE_39
game_get_city().BT_BUILDING_HOUSE_40
game_get_city().BT_BUILDING_HOUSE_41
game_get_city().BT_BUILDING_HOUSE_42
game_get_city().BT_BUILDING_HOUSE_43
game_get_city().BT_BUILDING_HOUSE_44
game_get_city().BT_BUILDING_HOUSE_45
game_get_city().BT_BUILDING_HOUSE_46
game_get_city().BT_BUILDING_HOUSE_47
game_get_city().BT_BUILDING_HOUSE_47_GREEN
game_get_city().BT_BUILDING_HOUSE_48
game_get_city().BT_BUILDING_HOUSE_49
game_get_city().BT_BUILDING_HOUSE_50
game_get_city().BT_BUILDING_HOUSE_51
game_get_city().BT_BUILDING_HOUSE_52
game_get_city().BT_BUILDING_HOUSE_53
game_get_city().BT_BUILDING_HOUSE_54
game_get_city().BT_BUILDING_HOUSE_55
game_get_city().BT_BUILDING_HOUSE_56
game_get_city().BT_BUILDING_HOUSE_57
game_get_city().BT_BUILDING_HOUSE_58
game_get_city().BT_BUILDING_HOUSE_59
game_get_city().BT_BUILDING_INDUSTRY_01
game_get_city().BT_BUILDING_INDUSTRY_02
game_get_city().BT_BUILDING_INDUSTRY_03
game_get_city().BT_BUILDING_INDUSTRY_04
game_get_city().BT_BUILDING_INDUSTRY_05
game_get_city().BT_BUILDING_INDUSTRY_06
game_get_city().BT_BUILDING_INDUSTRY_07
game_get_city().BT_BUILDING_INDUSTRY_08
game_get_city().BT_BUILDING_INDUSTRY_09
game_get_city().BT_BUILDING_INDUSTRY_10
game_get_city().BT_BUILDING_INDUSTRY_11
game_get_city().BT_BUILDING_INDUSTRY_12
game_get_city().BT_BUILDING_INDUSTRY_13
game_get_city().BT_BUILDING_INDUSTRY_14
game_get_city().BT_BUILDING_INDUSTRY_15
game_get_city().BT_BUILDING_INDUSTRY_16
game_get_city().BT_BUILDING_INDUSTRY_17
game_get_city().BT_BUILDING_INDUSTRY_18
game_get_city().BT_BUILDING_INDUSTRY_19
game_get_city().BT_BUILDING_INDUSTRY_20
game_get_city().BT_BUILDING_INDUSTRY_21
game_get_city().BT_BUILDING_INDUSTRY_22
game_get_city().BT_BUILDING_OFFICE_01
game_get_city().BT_BUILDING_OFFICE_02
game_get_city().BT_BUILDING_OFFICE_03
game_get_city().BT_BUILDING_OFFICE_04
game_get_city().BT_BUILDING_OFFICE_05
game_get_city().BT_BUILDING_OFFICE_07
game_get_city().BT_BUILDING_OFFICE_08
game_get_city().BT_BUILDING_OFFICE_09
game_get_city().BT_BUILDING_OFFICE_09_GREEN
game_get_city().BT_BUILDING_OFFICE_10
game_get_city().BT_BUILDING_OFFICE_10_GREEN
game_get_city().BT_BUILDING_OFFICE_11
game_get_city().BT_BUILDING_OFFICE_11_GREEN
game_get_city().BT_BUILDING_OFFICE_12
game_get_city().BT_BUILDING_OFFICE_13
game_get_city().BT_BUILDING_OFFICE_14
game_get_city().BT_BUILDING_OFFICE_15
game_get_city().BT_BUILDING_OFFICE_16
game_get_city().BT_BUILDING_OFFICE_17
game_get_city().BT_BUILDING_OFFICE_18
game_get_city().BT_BUILDING_OFFICE_19
game_get_city().BT_BUILDING_OFFICE_20
game_get_city().BT_BUILDING_OFFICE_21
game_get_city().BT_BUILDING_OFFICE_22
game_get_city().BT_BUILDING_OFFICE_23
game_get_city().BT_BUILDING_UPPERCLASS_01
game_get_city().BT_BUILDING_UPPERCLASS_02
game_get_city().BT_BUILDING_UPPERCLASS_03
game_get_city().BT_BUILDING_UPPERCLASS_04
game_get_city().BT_BUILDING_UPPERCLASS_05
game_get_city().BT_BUILDING_UPPERCLASS_06
game_get_city().BT_BUILDING_UPPERCLASS_07
game_get_city().BT_BUILDING_UPPERCLASS_08
game_get_city().BT_BUILDING_UPPERCLASS_09
game_get_city().BT_BUS_STATION_1
game_get_city().BT_BUS_STATION_2
game_get_city().BT_BUS_STATION_B_1
game_get_city().BT_BUS_STATION_B_2
game_get_city().BT_CAR_COMPANY
game_get_city().BT_CHEM_FACTORY
game_get_city().BT_CHURCH_1
game_get_city().BT_CHURCH_2
game_get_city().BT_COAL_MINE
game_get_city().BT_FIRE_BIG
game_get_city().BT_FIRE_SMALL
game_get_city().BT_FIRST_MOD_BUILDING
game_get_city().BT_FIRST_SPECIAL
game_get_city().BT_FIRST_ZONE
game_get_city().BT_HOSPITAL_BIG
game_get_city().BT_HOSPITAL_SMALL
game_get_city().BT_HYPER_STATION_1A
game_get_city().BT_HYPER_STATION_1B
game_get_city().BT_LIBRRARY
game_get_city().BT_PARK_1
game_get_city().BT_PARK_2
game_get_city().BT_POLICE_BIG
game_get_city().BT_POLICE_SMALL
game_get_city().BT_POWER_PLANT_COAL
game_get_city().BT_POWER_PLANT_FUSION
game_get_city().BT_POWER_PLANT_NUCLEAR
game_get_city().BT_POWER_PLANT_SOLAR
game_get_city().BT_POWER_PLANT_SOLAR_THERMAL
game_get_city().BT_POWER_PLANT_WIND
game_get_city().BT_PSEUDO_BULLDOZE
game_get_city().BT_PSEUDO_CACTUS
game_get_city().BT_PSEUDO_DESERT
game_get_city().BT_PSEUDO_POWER_LINES
game_get_city().BT_PSEUDO_RAILS_HYPERTUBE
game_get_city().BT_PSEUDO_RAILS_SUBWAY
game_get_city().BT_PSEUDO_RAILS_TRAIN
game_get_city().BT_PSEUDO_RAILS_TRAM
game_get_city().BT_PSEUDO_RAIL_BRIDGE
game_get_city().BT_PSEUDO_STREET
game_get_city().BT_PSEUDO_STREET_ALLEY
game_get_city().BT_PSEUDO_STREET_BRIDGE
game_get_city().BT_PSEUDO_STREET_HIGHWAY
game_get_city().BT_PSEUDO_STREET_LAMPS
game_get_city().BT_PSEUDO_STREET_TRAFFIC_DIVIDER
game_get_city().BT_PSEUDO_STREET_TRAFFIC_SLOW
game_get_city().BT_PSEUDO_STREET_ZEBRACROSSING
game_get_city().BT_PSEUDO_SUBWAY_BULLDOZE
game_get_city().BT_PSEUDO_TRAM_BRIDGE
game_get_city().BT_PSEUDO_TREE
game_get_city().BT_PSEUDO_TREE2
game_get_city().BT_PSEUDO_TREE3
game_get_city().BT_PSEUDO_WATER
game_get_city().BT_PSEUDO_WATER_BULLDOZE
game_get_city().BT_PSEUDO_WATER_DELETE
game_get_city().BT_PSEUDO_WATER_PIPES
game_get_city().BT_PSEUDO_ZONE_AGRICULTURE
game_get_city().BT_PSEUDO_ZONE_COMMERCIAL
game_get_city().BT_PSEUDO_ZONE_INDUSTRY
game_get_city().BT_PSEUDO_ZONE_OFFICES
game_get_city().BT_PSEUDO_ZONE_RESIDENTAL
game_get_city().BT_PSEUDO_ZONE_RESIDENTAL_HD
game_get_city().BT_PSEUDO_ZONE_RESIDENTAL_UPPERCLASS
game_get_city().BT_PUMP_DRAIN_1
game_get_city().BT_PUMP_DRAIN_2
game_get_city().BT_PUMP_DRAIN_3
game_get_city().BT_PUMP_DRAIN_4
game_get_city().BT_PUMP_STATION
game_get_city().BT_PUMP_STATION_2
game_get_city().BT_SCHOOL_BIG
game_get_city().BT_SCHOOL_LARGE
game_get_city().BT_SCHOOL_SMALL
game_get_city().BT_SPECIAL_CAR_SHIPPING_SITE
game_get_city().BT_SPECIAL_LAUNCHPAD
game_get_city().BT_SPECIAL_WATER_SHIPPING_SITE
game_get_city().BT_STADION_1
game_get_city().BT_STADION_2
game_get_city().BT_STADION_3
game_get_city().BT_SUBWAY_STATION
game_get_city().BT_TRAIN_STATION_1A
game_get_city().BT_TRAIN_STATION_1B
game_get_city().BT_TRAIN_STATION_2A
game_get_city().BT_TRAIN_STATION_2B
game_get_city().BT_TRAM_STATION_1
game_get_city().BT_TRAM_STATION_2