Locations
Every mission happens somewhere. A mission lists the places it can appear, and the game picks one of them each time the mission is created. This page explains how that choice works, what the location flags mean, lists every place that ships with the game, with its coordinates, and shows how a mod adds places of its own.
How a location is chosen
When a mission is created, the game draws one entry from the mission's list of locations (_potentialLocations in the mission JSON). If that spot is already used by another mission on the map, it draws again, up to five more times. If every draw comes up taken, it keeps the last one, so two missions can end up sharing a location.
If a mission lists no locations at all, the game falls back to a random place from the full list: the places that ship with the game plus any that enabled mods add (see Adding locations with a mod).
Distance is not decoration: the fuel a flight costs is worked out from the great-circle distance (the shortest distance over the globe) between the location and the loaded map's own coordinates, multiplied by FuelConsumptionPerKilometer from the Variables table (see CSV tables). A mission over Berlin is far more expensive to fly than one over the Channel.
Using a location
In the Mission Editor, open the Locations section, pick a place from the dropdown and add it. Add as many as you like; the same place cannot be added twice.
In a mission .json, each entry of _potentialLocations names a place by its ID:
{
"_locationId": "dover"
}
| Field | Meaning |
|---|---|
_locationId |
Required, and the only field the game reads from the entry. It must be the ID of a place from the list below or of one that an enabled mod adds (see Adding locations with a mod). |
The place's coordinates, flags and display name come from that list, not from the mission file. A _locationName, _coordinates or _flags left on the entry is ignored.
An entry whose ID is missing, empty or unknown is never found. When the drawn entry cannot be found, the game falls back to a random location.
The ID is also what the game uses to tell whether a spot is already taken, so it avoids placing two live missions on the same ID where it can (see How a location is chosen).
A list with several places lets the same mission turn up in different spots:
"_potentialLocations": [
{ "_locationId": "dover_strait" },
{ "_locationId": "english_channel" },
{ "_locationId": "seine_bay" }
]
From a script, a script-only mission (one without a .json) is placed with missions_api.SetMissionLocation(mission_entity_id, location_id), usually from initialize_mission. It accepts only the ID of a place from the list below or of one that an enabled mod adds (see Adding locations with a mod), never coordinates of your own, and returns False for an unknown ID. Without a location, a script-only mission sits at the map origin. See Reference.
Location flags
| Value | Name | Meaning |
|---|---|---|
| 0 | None |
none |
| 1 | Land |
over land |
| 2 | Sea |
over the sea |
| 4 | OwnTerritory |
over friendly territory |
| 8 | EnemyTerritory |
over enemy territory |
They add up, so 10 is Sea + Enemy territory (2 + 8) - the most common value for a coastal target on the far side of the Channel. Some combinations:
| Value | Flags |
|---|---|
| 3 | Land + Sea |
| 5 | Land + OwnTerritory |
| 6 | Sea + OwnTerritory |
| 9 | Land + EnemyTerritory |
| 10 | Sea + EnemyTerritory |
| 12 | OwnTerritory + EnemyTerritory |
A place with several flags passes a quest condition for each of them: a 10 place counts for both location,sea and location,enemyterritory.
In the shipped game, location flags are used only to unlock the built-in airplane skins: hidden skin quests such as "fly 20 missions over the sea with a Beaufighter" use location,sea, location,ownterritory and location,enemyterritory. No other shipped quest checks them.
Flags come from the location list, not from your mission file
A mission's location entry carries only the ID; a _flags value left on it is ignored. Quest steps such as "fly a mission over the sea" look the mission's location ID up in the location list - the places below plus any that enabled mods add - and use the flags recorded there. The quest step writes the flag name, not the number: location,sea, location,ownterritory, location,enemyterritory (see Quests).
Because no shipped location carries Land, a location,land condition can never be met unless a mod adds a place with that flag.
The locations that ship with the game
82 places are predefined. Reuse them rather than inventing coordinates: they are positioned to line up with the war map, and the player will recognise them. They run from latitude 44.87 to 60.38 and longitude -9.00 to 14.55.
In the table, Own is OwnTerritory (4), Enemy is EnemyTerritory (8), Sea is Sea (2); combined entries add up (Sea + Enemy = 10).
| ID | Latitude | Longitude | Flags |
|---|---|---|---|
aarhus |
56.1509 | 10.1799 | Enemy |
amiens |
49.8980 | 2.3286 | Enemy |
amsterdam |
52.3713 | 4.8995 | Sea + Enemy |
arras |
50.2933 | 2.7758 | Enemy |
atlantic_ocean |
56.5000 | -9.0000 | Sea |
bergen |
60.3829 | 5.3042 | Sea + Enemy |
berlin |
52.5217 | 13.3958 | Enemy |
birmingham |
52.4907 | -1.8466 | Own |
bordeaux |
44.8695 | -0.5592 | Sea + Enemy |
boulogne-sur-mer |
50.7246 | 1.6019 | Sea + Enemy |
bremen |
53.0869 | 8.7973 | Enemy |
bremerhaven |
53.5352 | 8.5838 | Sea + Enemy |
brest |
48.3912 | -4.4851 | Sea + Enemy |
bristol_channel |
51.3681 | -4.2301 | Sea |
brussels |
50.8552 | 4.3559 | Enemy |
caen |
49.1857 | -0.3894 | Sea + Enemy |
calais |
50.9587 | 1.8552 | Sea + Enemy |
cambridge |
52.1925 | 0.1337 | Own |
canterbury |
51.2733 | 1.0855 | Own |
cardigan_bay |
52.5000 | -4.6000 | Sea |
celtic_sea |
50.8000 | -7.5000 | Sea |
chelmsford |
51.7352 | 0.4673 | Own |
cologne |
50.9375 | 6.9517 | Enemy |
compiegne |
49.3991 | 2.8277 | Enemy |
dedham_vale |
51.9878 | 0.9096 | Own |
dieppe |
49.9189 | 1.0747 | Sea + Enemy |
dogger_bank |
54.9952 | 3.0143 | Sea |
dorchester |
50.7106 | -2.4410 | Own |
dover |
51.1351 | 1.3128 | Own |
dover_strait |
51.0598 | 1.5825 | Sea |
dunkirk |
51.0370 | 2.3788 | Sea + Enemy |
dunkirk_bay |
51.3082 | 2.1831 | Sea |
eastbourne_bay |
50.6432 | 0.4435 | Sea |
eindhoven |
51.4497 | 5.3770 | Enemy |
english_channel |
50.1660 | -1.7013 | Sea |
essen |
51.4535 | 7.0060 | Enemy |
frankfurt |
50.1028 | 8.6791 | Enemy |
great_yarmouth_bay |
52.5492 | 2.2980 | Sea |
guernsey |
49.4438 | -2.5571 | Sea |
hamburg |
53.5381 | 9.9669 | Sea + Enemy |
hanover |
52.3736 | 9.7400 | Enemy |
hardangervidda |
60.0327 | 7.4297 | Enemy |
high_weald |
51.0563 | 0.4398 | Own |
ipswich |
52.0524 | 1.1532 | Own |
irish_sea |
53.5000 | -4.8000 | Sea |
kassel |
51.3127 | 9.4948 | Enemy |
krefeld |
51.3394 | 6.5521 | Enemy |
kristiansand |
58.1581 | 7.9766 | Sea + Enemy |
la_rochelle |
46.1597 | -1.1592 | Sea + Enemy |
lannion |
48.7372 | -3.4625 | Sea + Enemy |
le_havre |
49.5003 | 0.1352 | Sea + Enemy |
leeuwarden |
53.2037 | 5.7917 | Sea + Enemy |
liege |
50.6413 | 5.5752 | Enemy |
lille |
50.6252 | 3.0551 | Enemy |
london |
51.5090 | -0.1280 | Own |
maastricht |
50.8474 | 5.6870 | Enemy |
maidstone |
51.2707 | 0.5203 | Own |
malvern_hills |
52.1034 | -2.3512 | Own |
metz |
48.9610 | 6.1310 | Enemy |
munster |
51.9645 | 7.6099 | Enemy |
nancy |
48.6921 | 6.1844 | Enemy |
nantes |
47.2216 | -1.5501 | Enemy |
north_channel |
55.1000 | -5.6000 | Sea |
north_sea |
56.5000 | 3.5000 | Sea |
north_wessex |
51.4482 | -1.4938 | Own |
outer_silver_pit |
54.0262 | 2.0864 | Sea |
paris |
48.8535 | 2.3188 | Enemy |
raf_duxford |
52.0933 | 0.1311 | Own |
raf_filton |
51.5218 | -2.5746 | Own |
raf_manston |
51.3461 | 1.3490 | Own |
raf_tangmere |
50.8464 | -0.7095 | Own |
reims |
49.2570 | 4.0438 | Enemy |
rotterdam |
51.9302 | 4.4752 | Sea + Enemy |
rotterdam_bay |
51.9939 | 3.1666 | Sea |
rouen |
49.4381 | 1.0937 | Enemy |
seine_bay |
49.7154 | -0.6720 | Sea |
south_downs |
50.9450 | -0.6643 | Own |
st_georges_channel |
52.0000 | -5.8000 | Sea |
stettin |
53.4282 | 14.5511 | Sea + Enemy |
telemark |
59.3766 | 8.3060 | Enemy |
the_wash |
52.9159 | 0.2530 | Sea |
tours |
47.3933 | 0.6825 | Enemy |
Two further entries exist in the game's list but are development leftovers - do not use them: test1 and ireland. Neither carries any flag, and ireland is not in Ireland.
Adding locations with a mod
A mod can add its own places to the list, so its missions - and anyone else's - can use them by ID. Put one or more .json files into a Locations folder inside your mod's Missions/ folder:
Mods/
my_mod/
Missions/
Locations/
mymod_locations.json
Only files directly inside Missions/Locations/ are read. A file looks like this:
{
"Locations": [
{
"_locationId": "mymod_scapa_flow",
"_locationName": "mymod_scapa_flow",
"_coordinates": { "x": 58.9, "y": -3.1 },
"_flags": 2
}
]
}
The Locations list holds as many places as you like. Each entry has four fields:
| Field | Meaning |
|---|---|
_locationId |
Required. The ID missions and scripts use to refer to the place. |
_locationName |
The name the player sees (see below). |
_coordinates |
x is latitude, y is longitude, in degrees. Used for the marker on the war map and for the distance (and so the fuel cost). |
_flags |
A number describing the place (Location flags). Must be a number - "Sea" is not accepted. |
- While your mod is enabled, its places are on the list, and they leave it when the mod is switched off or removed. Switching a mod on or off updates the list without restarting the game.
- A place from a mod behaves like a shipped one. It is offered in the Mission Editor's dropdown, works with
missions_api.SetMissionLocation, can be drawn for a mission that lists no locations, and its flags are what quest location conditions see. _locationIdis the lookup key, so it has to be unique. Shipped IDs always win. If your place uses an ID the game already has, the shipped one is used. If two mods add the same ID, the game uses one of them and does not tell you. So give every place your mod's prefix, as inmymod_scapa_flow.- An entry without an ID can never be found, neither by a mission nor by
missions_api.SetMissionLocation. - The player sees
_locationNameexactly as written, underscores and all. Shipped places come with translations; yours has none until you register a term calledmission_location/<name>- see Location names. - A file the game cannot read is skipped, with a warning in
Player.log. Your other location files still load. - Keep the coordinates inside the war map (see the next section).
Using your own coordinates
A mission file cannot carry coordinates of its own: it only names a place by ID, and the coordinates and flags come from the location list (the shipped places and any added by a mod). An ID that is not on the list is never found, and the mission goes to a random location instead. To put a mission somewhere new, add the place with a mod and refer to it by its ID - from a mission file and from missions_api.SetMissionLocation alike.
The war map shows latitude 40.75 to 61.25 and longitude -11.75 to 21.64 (a Mercator projection, the usual flat world map). The range of the shipped places above is simply where they happen to be, not the map's limit. A location outside the map's box still works - distance and fuel are just maths - but its marker is pushed to the nearest edge of the map, so the player sees it at the border rather than where it really is. It stays clickable.
Tip
Give your own places an ID with your mod's prefix (mymod_scapa_flow). An ID the game already has is not yours to define: the shipped place wins.