Merge branch 'EGCC'

This commit is contained in:
Tony Christopher
2021-08-03 00:59:54 +01:00
17 changed files with 7437 additions and 2149 deletions
+1773 -1024
View File
File diff suppressed because it is too large Load Diff
+20 -3
View File
@@ -1,4 +1,4 @@
# `RJTT` ACA 3.2.0
# `RJTT` ACA 3.3.0
This is an implementation of the Tokyo ACA (Approach Control Area) for [Endless ATC](https://steamcommunity.com/app/666610) featuring `RJTT` Tokyo International Airport (commonly referred to as Haneda) and `RJAA` Narita International Airport. JSDF-M base `RJTL` Shimofusa is also represented at very high scores (difficulties). The airspace ceiling is FL240.
@@ -9,7 +9,7 @@ The Tokyo ACA is a very large terminal area containing two of Japan's largest ai
STARs are implemented as approach transitions. To activate an approach, an aircraft must be flying direct to an applicable fix, then the APP button can be activated. Multiple approaches may be available from a fix. Pressing the APP button again before issuing the approach clearance (do not long press) will select the next approach available from that fix. If the aircraft is already on an approach from that fix, you will need to cancel the approach clearance first before issuing another approach clearance.
JSDF-M base `RJTE` Tateyama and JSDF-G bases `RJTK` Kisarazu, `RJAK` Kasumigaura are not represented as it appears traffic should mostly be military helicopters, which are difficult to represent in this game.
`RJTO` Oshima/`RJAN` Niijima are not represented as traffic is either helicopters or traffic to `RJTF` Chofu in `RJTY` Yokota ACA. Unfortunately traffic to `RJTY` is difficult to represent as `RJTT` ACA has airspace on top of most of `RJTY` ACA, meaning that within the game, it is not possible to get planes to "spawn" from the appropriate region. However, the runways for `RJTO`, `RJAN`, and `RJTF` are shown on the radar map.
`RJTO` Oshima/`RJAN` Niijima are not represented as traffic is either helicopters or traffic to `RJTF` Chofu in `RJTY` Yokota ACA. Unfortunately traffic to `RJTY` is difficult to represent as `RJTT` ACA has airspace on top of most of `RJTY` ACA, meaning that within the game, it is not possible to get planes to "spawn" from the appropriate region. However, the runways for `RJTO`, `RJAN`, `RJTF`, `RJTE`, and `RJTK` are shown on the radar map.
## Airports
@@ -299,4 +299,21 @@ Note that traffic data (`airlines = `) is expanded by a python script `expand_ai
- Implemented tower frequencies
* 3.2.0 - 2021/07/06
- Add handoff callsign / frequency support for departures
- Additions/corrections to rare traffic.
- Additions/corrections to rare traffic.
* 3.3.0 - 2021/07/18
- Implement different entry altitudes for each entrypoint
- Implement different initial climb altitudes for each departure
- Arrival entrypoints changed for most arrival routes to waypoints along the ACA boundary
- Arrivals are automatically cleared for a relevant STAR
- This is a temporary measure until 4.5.1 releases
- this will be changed so that aircraft will only be cleared to the first fix of the STAR and hold there
- Clearing aircraft via the STAR will then be the responsibility of approach control (you)
- Correct pronunciation for `TETRA` departures from `RJAA`
- Add 200kts restriction at `ARLON` for ILS Z 34L at `RJTT` to prevent certain aircraft such as `B772` from overshooting the GS
- Add inactive `RJTK` Kisarazu and `RJTE` Tateyama
- Add `KZT` Kisarazu and `TET` Tateyama TACANs
- ANA `B737`s retired
- Made some rare traffic unique (no more than one will appear at any one time)
* 3.4.0 - pending release of 4.5.1
- Upon entering the ACA, planes will fly along any airways to the beginning of the STAR and hold
- Approach (you) will be responsible for clearing for the STAR
+19 -2
View File
@@ -1,4 +1,4 @@
# `RJTT` 進入管制区 3.2.0
# `RJTT` 進入管制区 3.3.0
*作者は日本人ではないため、圧倒的語彙力のなさと知識不足によるおかしいまたは間違っている表現があるかもしれません。
@@ -251,4 +251,21 @@ Approaches are available using APP mode from `TOHNE` and `ASEKI`. Arrival routes
- 各空港のタワー周波数を実装
* 3.2.0 - 2021/07/06
- 出発機のハンドオフ先のコールサイン及び周波数を実装
- レア発着機の追加や修正
- レア発着機の追加や修正
* 3.3.0 - 2021/07/06
- 進入管制区の各入口の維持高度を個別に設定
- 各SIDの初期維持高度を個別に設定
- 進入管制区の入口ポイントを進入管制区境界にあるポイントに変更
- 到着機はSTARの飛行が許可された状態でスポーンする
- この仕様はゲームの4.5.1のリリースまでの一時的処置
- 後で仕様をSTARの開始点までの許可に変更する(そこでホールドに入る)
- STARへの許可はアプローチ管制(あなた)の責任になる
- `RJAA``TETRA`SIDの発音を修正
- 一部の飛行機(`B772`など)がGSを超えてしまうのを防止するために`RJTT`ILS Z 34Lに`ARLON`での200kt制限を設ける
- `RJTK`木更津と`RJTE`館山の滑走路を実装(オープンはしない)
- `KZT`木更津と`TET`館山TACANを実装
- ANA`B737`引退
- 一部のレア発着機をユニークに(同じのは同時に2以上出現しない)
* 3.4.0 - 4.5.1リリース待ち
- 到着機は進入管制区に入った後、RNAV経路に沿ってSTAR開始点まで飛行してホールドに入る
- STARの許可を出すのはアプローチ管制(あなた)になる
+1384 -975
View File
File diff suppressed because it is too large Load Diff
+11 -15
View File
@@ -1,4 +1,4 @@
# EDDM v1.3
# EDDM v1.4
# Munich Airport "Franz Josef Strauß" in the south of Germany.
[airspace]
@@ -8,11 +8,15 @@ center = N48.353802, E11.7861
magneticvar = 1.596
floor = 3700
descendaltitude = 11000
ceiling = 13000
ceiling = 12500
above = 19000
transitionaltitude = 6000
usa = false
speedrestriction = 2, 250
name = munich radar, munich radar
handoff =
360, München Radar, munich radar, 128.625
180, München Radar, munich radar, 132.405
boundary =
N48.705608, E11.9316
@@ -158,8 +162,8 @@ line2 =
name = Munich Airport
code = EDDM
runways =
rwyn, 08L, N48.3628, E11.7676, 83.4, 13123, 0, 0, 1467
rwys, 08R, N48.3407, E11.751, 83.4, 13123, 0, 0, 1486
rwyn, 08L, N48.3628, E11.7676, 83.4, 13123, 0, 0, 1467, 3, 0, 3, 0, 0, 0, 0, 0, 118.705
rwys, 08R, N48.3407, E11.751, 83.4, 13123, 0, 0, 1486, 3, 0, 3, 0, 0, 0, 0, 0, 120.505
entrypoints =
40, landu
@@ -342,14 +346,6 @@ route4 =
# DM053, AMPEG, MERSI
route5 =
OBA6S, obaxa six sierra
N48.337669, E11.709431
N48.230222, E11.706375
N48.094592, E11.739131
N48.012222, E11.665556
# DM049, DM068, DM069, OBAXA
route6 =
ROT3S, rotax three sierra
N48.337669, E11.709431
N48.287569, E11.708006
@@ -358,7 +354,7 @@ route6 =
N47.977450, E12.384081
# DM049, DM050, OTT, LAKOL, ROTAX
route7 =
route6 =
TUL3S, tulsi six sierra
N48.337669, E11.709431
N48.287569, E11.708006
@@ -366,7 +362,7 @@ route7 =
N47.701608, E11.788758
# DM049, DM050, OTT, TULSI
route8 =
route7 =
TUR7S, turbu seven sierra
N48.337669, E11.709431
N48.287569, E11.708006
@@ -374,7 +370,7 @@ route8 =
N47.914083, E11.948703
# DM049, DM050, OTT, TURBU
route9 =
route8 =
VAV3S, vavor three sierra
N48.337669, E11.709431
N48.287569, E11.708006
+7 -1
View File
@@ -8,7 +8,7 @@ Second hub of Lufthansa, offering many international and intercontinental routes
- The approaches are meant to help coordination during high traffic. During low traffic, controllers usually skip the transitions completely and vector to final, sometimes giving directs to waypoints.
- Departures are cleared to FL70, meaning that they might have to pass below approaching traffic following the transitions. This is one reason why vectoring arriving planes can be handy, as you can keep more space between arrivals and departures.
- Skill Cap 16 works fine so that some planes can still depart between the arrivals.
- Maximum Skill Cap 16 works fine so that some planes can still depart between the arrivals.
## Already working:
- most SIDs exist
@@ -26,6 +26,12 @@ Second hub of Lufthansa, offering many international and intercontinental routes
## Changelog
### v1.4
- reduce ceiling to make departure diversions less likely
- add radar name for arriving traffic, added handover frequencies for departures and arrivals (tower)
- remove obaxa 6s departure route that is not used for jet aircraft
### v1.3
- fix wrong heading on BETOS arrival
+438
View File
@@ -0,0 +1,438 @@
# Palma de Mallorca (LEPA) Airport East Configuration by asisas2006
# V0.1 Added all Stars, FIXes and VORes
# V0.2 Added real holding headings in the fixes, added Star Lines and also added ILS-Z procedures from ADX and MJV
[airspace]
radius = 100
elevation = 0
floor = 3000
descendaltitude = 10000
ceiling = 10000
above = 18500
transitionaltitude = 6000
usa = false
metric = false
separation = 5
automatic = true
name = approach, departure
center = N39.551700592, E2.73881006241
magneticvar = -0.126
beacons =
#FIX
RUPIT, N039.27.09.700, E002.01.37.100, -071, Rupit
PA400, N039.01.35.140, E002.17.44.950, 0, PA400
PA405, N039.19.30.010, E002.47.49.000, 0, PA405
TOLSO, N040.30.00.000, E002.23.34.400, 0, Tolso
LORES, N040.30.00.000, E002.42.09.300, 0, Lores
KENAS, N040.30.00.000, E003.08.26.600, 0, Kenas
LUNIK, N040.26.22.800, E003.23.32.900, 0, Lunik
RIXOT, N040.23.28.350, E004.40.00.000, 0, Rixot
MORSS, N039.57.24.110, E004.40.00.000, 0, Morss
GODOX, N039.22.21.400, E001.24.38.700, 0, Godox
RUXET, N038.40.07.710, E000.40.30.000, 0, Ruxet
MEBUT, N038.45.03.500, E002.13.41.200, 0, Mebut
LAMPA, N038.48.06.510, E001.55.26.590, 0, Lampa
OSGAL, N039.01.29.100, E002.53.59.400, 0, Osgal
MAMEB, N039.45.46.000, E003.59.31.000, 0, Mameb
NAKOP, N039.37.21.100, E003.14.21.400, 0, Nakop
POSBA, N040.13.11.300, E002.54.18.800, -151, Posba
INPUS, N040.07.02.000, E002.42.18.000, -148, Inpus
NUDSA, N040.02.53.000, E003.01.44.000, 0, Nudsa
NEKUG, N039.56.07.000, E002.51.06.000, 0, Nekug
XOTNU, N039.50.00.000, E002.56.01.000, 0, Xotnu
TAKUS, N039.46.28.000, E002.49.17.000, 0, Takus
EVOLI, N039.42.56.000, E002.42.35.000, 0, Evoli
IBIVU, N039.09.31.090, E002.31.00.270, 052, Ibivu
#VOR
MHN, N039.51.49.000, E004.12.58.700, 0, Menorca
IBA, N038.52.06.000, E001.21.57.300, 0, Ibiza
SSJ, N39.55970, E2.73325, 0, Palma De Mallorca
JOA, N39.56470, E2.74663, 0, Palma De Mallorca
PA, N39.59940, E2.82118, 0, Palma De Mallorca
MJV, N39.43520, E2.75829, -261, Palma De Mallorca
CST, N39.64140, E2.91562, 0, Costix
ADX, N39.54940, E2.39586, 123, Andraitx
PTC, N39.42730, E3.25672, 0, Porto Colom
POS, N39.92740, E3.11458, 0, Pollensa
CDP, N39.69770, E3.43437, -273, Capdepera
boundary =
-100, -60
100, -60
100, 80
-40, 80
-100, 0
#linea de costa
line1 =
N39.75669, E3.24111
N39.79009, E3.14531
N39.83657, E3.15869
N39.86138, E3.19092
N39.88984, E3.19863
N39.90771, E3.16699
N39.92422, E3.16445
N39.96108, E3.19756
N39.97051, E3.15869
N39.90830, E2.90479
N39.85483, E2.78496
N39.61309, E2.37129
N39.57207, E2.37002
N39.54038, E2.39434
N39.53047, E2.45879
N39.47788, E2.49951
N39.53066, E2.57588
N39.55620, E2.63408
N39.54214, E2.70059
N39.51025, E2.74600
N39.41025, E2.76982
N39.38506, E2.79980
N39.36836, E2.90010
N39.30127, E3.07285
N39.33325, E3.15459
N39.38662, E3.24473
N39.47705, E3.29297
N39.55566, E3.34873
N39.62715, E3.41465
N39.69775, E3.46182
N39.76123, E3.44893
N39.77729, E3.39590
N39.78672, E3.34219
N39.75669, E3.24111
[airport1]
name = Palma De Mallorca Airport
code = LEPA
runways =
rwy1, 06L, N39.5471, E2.71073, 58.6, 10728, 0, 230, 15
rwy2, 06R, N39.5413, E2.73174, 58.6, 9842, 1345, 0, 24
climbaltitude = 4000
entrypoints =
340, TOLSO, 15000
348, LORES, 15000
10, KENAS
20, LUNIK
45, RIXOT
70, MORSS
170, OSGAL
200, MEBUT
210, LAMPA
250, RUXET
265, GODOX
80, MAMEB
[configurations]
config1 =
0, rwy1, land
0, rwy2, start
[approach1]
# TOLSO3M
runway = rwy1
beacon = tolso
route1 =
328
N040.30.00.000, E002.23.34.400,
N040.07.02.000, E002.42.18.000,
N039.56.07.000, E002.51.06.000,
N039.46.28.000, E002.49.17.000,
N039.42.56.000, E002.42.35.000,
N39.54940, E2.39586, 5000, 200
end, hold
[approach2]
#LORES3M
runway = rwy1
beacon = LORES
route1 =
331
N040.30.00.000, E002.42.09.300,
N040.13.11.300, E002.54.18.800,
N040.02.53.000, E003.01.44.000,
N039.50.00.000, E002.56.01.000,
N039.46.28.000, E002.49.17.000,
N039.42.56.000, E002.42.35.000,
N39.54940, E2.39586,
end, hold
[approach3]
#KENAS3M
runway = rwy1
beacon = KENAS
route1 =
344
N040.30.00.000, E003.08.26.600
N39.69770, E3.43437
N39.43520, E2.75829
end, hold
[approach4]
#LUNIK3M
runway = rwy1
beacon = LUNIK
route =
177
N040.26.22.800, E003.23.32.900
N39.69770, E3.43437
N39.43520, E2.75829
end, hold
[approach5]
#RIXOT2M
runway = rwy1
beacon = RIXOT
route =
053
N040.23.28.350, E004.40.00.000
N39.69770, E3.43437
N39.43520, E2.75829
end, hold
[approach6]
#MORSS4M
runway = rwy1
beacon = MORSS
route =
074
N039.57.24.110, E004.40.00.000
N039.51.49.000, E004.12.58.700
N039.45.46.000, E003.59.31.000
N39.42730, E3.25672
N39.43520, E2.75829
end, hold
[approach7]
#MAMEB1M
runway = rwy1
beacon = MAMEB
route =
074
N039.45.46.000, E003.59.31.000
N39.42730, E3.25672
N39.43520, E2.75829
end, hold
[approach8]
#GODOX3M
runway = rwy1
beacon = GODOX
route =
080
N039.22.21.400, E001.24.38.700
N039.27.09.700, E002.01.37.100
N39.54940, E2.39586
end, hold
[approach9]
#RUXET2M
runway = rwy1
beacon = RUXET
route =
081
N038.40.07.710, E000.40.30.000
N038.48.06.510, E001.55.26.590
N039.01.35.140, E002.17.44.950
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
end, hold
[approach10]
#LAMPA2M
runway = rwy1
beacon = LAMPA
route =
052
N038.48.06.510, E001.55.26.590
N039.01.35.140, E002.17.44.950
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
end, hold
[approach11]
#MEBUT3M
runway = rwy1
beacon = MEBUT
route =
010
N038.45.03.500, E002.13.41.200
N039.01.35.140, E002.17.44.950
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
end, hold
[approach12]
#OSGAL3M
runway = rwy1
beacon = OSGAL
route =
0345
N039.01.29.100, E002.53.59.400
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
end, hold
[transition1]
##############################################################
# ILS-Z 06L desde ADX
runway = rwy1 ; runway identifier, <reversed use>
beacon = ADX ; selectable beacon to enable NAV mode; define a beacon, or choose a name from beacon list above
route1 =
0
N39.54940, E2.39586
10, 2000, 210
[transition2]
##############################################################
# ILS-Z 06L desde MJV
runway = rwy1 ; runway identifier, <reversed use>
beacon = MJV ; selectable beacon to enable NAV mode; define a beacon, or choose a name from beacon list above
route1 =
0
N39.43520, E2.75829
N039.24.29.000, E002.34.56.800
10, 2000, 210
#TOLSO3M
[area1 ]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N040.30.00.000, E002.23.34.400
N040.07.02.000, E002.42.18.000
N039.56.07.000, E002.51.06.000
N039.46.28.000, E002.49.17.000
N039.42.56.000, E002.42.35.000
N39.54940, E2.39586
#LORES3M
[area2]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N040.30.00.000, E002.42.09.300
N040.13.11.300, E002.54.18.800
N040.02.53.000, E003.01.44.000
N039.50.00.000, E002.56.01.000
N039.46.28.000, E002.49.17.000
N039.42.56.000, E002.42.35.000
N39.54940, E2.39586
#KENAS3M
[area3]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N040.30.00.000, E003.08.26.600
N39.69770, E3.43437
N39.43520, E2.75829
## positions
# the last point will be automatically connected to the first point
#LUNIK3M
[area4]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N040.26.22.800, E003.23.32.900
N39.69770, E3.43437
N39.43520, E2.75829
#RIXOT2M
[area5]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N040.23.28.350, E004.40.00.000
N39.69770, E3.43437
N39.43520, E2.75829
#MORSS4M/MAMEB1M
[area6]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N039.57.24.110, E004.40.00.000
N039.51.49.000, E004.12.58.700
N39.42730, E3.25672
N39.43520, E2.75829
#GODOX3M
[area7]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N039.22.21.400, E001.24.38.700
N039.27.09.700, E002.01.37.100
N39.54940, E2.39586
#RUXET2M/LAMPA2M
[area8]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N038.40.07.710, E000.40.30.000
N038.48.06.510, E001.55.26.590
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
#MEBUT3M
[area9]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N038.45.03.500, E002.13.41.200
N039.01.35.140, E002.17.44.950
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
#OSGAL3M
[area10]
shape = polygon ; circle or polygon
altitude = 0 ; minimum allowed altitude in feet
#name = X ; <name, if omited then planes inbound the main airport may enter this area>
draw = 1 ; <number of invisible lines at the end of the polygon, omit for a full polygon>
labelpos = -3.1, 10.9 ; <position of label>
points =
N039.01.29.100, E002.53.59.400
N039.19.30.010, E002.47.49.000
N39.43520, E2.75829
+536 -56
View File
@@ -11,37 +11,47 @@ center = N53.3536987305, W2.27495002747
usa = false
magneticvar = -2.482
beacons =
MCT, N53.356944, W2.262222, 0, Manchester
MCT, N53.356944, W2.262222, -232, Manchester
AMLET, N53.268611, W1.988333, 0, Amlet
ARTHA, N53.783056, W2.285278, 0, Artha
ASMIM, N53.446111, W2.653056, 0, Asmim
BAROS, N53.24.22, W003.26.43, 0, Baros
# BARTN, N53.28.14, W002.25.41, 0, Barton
BEGAM, N54.156944, W2.120833, 0, Begam
BURNI, N53.727222, W2.517778, 0, Burni
CROFT, N53.37.37, W002.32.20, 0, Croft
DAYNE, N53.238611, W2.029167, 312, Dayne
DESIG, N53.527222, W1.892778, 0, De sig
EKLAD, N53.253889, W2.824722, 0, Eklad
GASKO, N54.224722, W1.955833, 0, Gasko
GOLES, N53.608056, W1.083333, 0, Goles
HONLY, N52.356667, W1.663611, 0, Honiley
IBRAR, N53.531667, W3.686389, 0, Ibrar
IBRAR, N53.531667, W3.686389, 0, Eye brar
KEGUN, N53.11.33, W003.09.01, -004, Kegun
KUXEM, N53.253056, W2.679722, 0, Cooksem
LAKEY, N54.238889, W2.981111, 0, Lakey
LESTA, N52.740833, W1.071944, 0, Leister
LESTA, N52.740833, W1.071944, 0, Lesster
LISTO, N53.143333, W2.199167, 0, Listo
LPL, N53.20.23, W002.43.30, 086, Liverpool
MALUD, N53.413333, W3.608333, 0, Malud
MIRSI, N53.538056, W2.711667, 061, Mirsi
MONTY, N52.892778, W3.173889, 0, Monty
NANTI, N53.08.15, W002.34.01, 0, Naan tea
PEDIG, N52.44.48, W001.43.10, 0, Pedig
PENIL, N53.615833, W3.663611, 0, Penil
POL, N53.743889, W2.103333, 0, Pole Hill
REXAM, N53.066667, W3.160278, 0, Rexam
REXAM, N53.066667, W3.160278, 0, Rexham
ROSUN, N53.668889, W2.349167, 172, Row sun
RUGER, N53.28.58, W003.26.52. 0, Ruger
SANBA, N53.139444, W2.334167, 0, Sanba
SETEL, N54.0125, W2.435833, 0, Setel
SONEX, N53.498056, W2.1725, 0, Sonex
TABLY, N53.271944, W2.450556, 0, Tably
TIPOD, N53.26.08, W003.17.05, 117, Tipod
TNT, N53.053889, W1.67, 0, Trent
UPTON, N53.586944, W1.300833, 0, Upton
WAL, N53.391944, W3.134444, 0, Wallasey
WAL, N53.23.31, W003.08.04, 0, Wallasey
WHI, N53.11.06, W002.37.23, 0, White gate
XOBRO, N53.471389, W2.421667, Xobro
XUMAT, N53.465833, W2.473056, Xumat
@@ -116,8 +126,8 @@ line4 =
[area1]
shape = polygon
altitude = 2800
name = MIN
labelpos = N53.32.44, W002.04.36
name = MVA
labelpos = N53.31.44, W002.04.00
points =
N53.33.51, W002.09.41
N53.34.30, W002.04.00
@@ -128,8 +138,8 @@ points =
[area2]
shape = polygon
altitude = 3100
name = MIN
labelpos = N55.05.01, W001.57.39
name = MVA
labelpos = N53.26.27, W001.56.50
points =
N53.24.06, W002.00.14
N53.25.41, W001.58.38
@@ -141,8 +151,8 @@ points =
[area3]
shape = polygon
altitude = 2900
name = MIN
labelpos = N53.21.23, W002.02.57
name = MVA
labelpos = N53.18.54, W002.02.30
points =
N53.24.06, W002.00.14
N53.22.07, W001.57.35
@@ -153,28 +163,63 @@ points =
[area4]
shape = polygon
altitude = 2400
#name =
labelpos = N53.21.11, W002.16.23
labelpos = N53.25.28, W002.20.10
draw = 4
points =
N53.30.37, W002.37.46
N53.13.58, W002.10.29
N53.11.08, W002.37.44
N53.27.00, W002.37.44
N53.30.05, W002.41.10
N53.31.10, W002.31.00
N53.20.55, W002.31.00
N53.26.25, W002.23.00
N53.33.51, W002.09.41
N53.25.41, W001.58.38
N53.13.58, W002.10.29
N53.09.16, W002.05.58
N53.07.06, W002.07.23
N53.11.08, W002.37.44
[area4]
[area5]
shape = polygon
altitude = 3500
name = MIN
labelpos = N53.21.11, W002.16.23
name = MVA
labelpos = N53.33.59, W001.54.48
points =
N53.34.30, W002.04.00
N53.36.50, W001.52.00
N53.27.28, W001.46.05
N53.27.02, W001.49.50
N53.07.30, W002.01.05
N53.10.43, W002.05.03
N53.27.30, W001.54.00
[area6]
shape = polygon
altitude = 3500
name = CB
labelpos = N53.29.51, W002.23.21
points =
N53.33.51, W002.09.41
N53.26.25, W002.23.00
N53.20.55, W002.31.00
N53.31.10, W002.31.00
[area7]
shape = polygon
altitude = 2100
name = GP
labelpos = N53.22.38, W002.51.22
points =
N53.18.55, W003.16.47
N53.23.09, W003.12.05
N53.27.34, W003.03.10
N53.30.05, W002.41.10
N53.27.00, W002.37.44
N53.11.08, W002.37.44
N53.11.05, W002.54.08
N53.14.27, W003.01.40
N53.16.09, W003.07.23
[airport1]
name = Manchester Airport
@@ -185,6 +230,37 @@ runways =
climbaltitude = 5000
airlines =
EIN, 1, a320/atr72, Shamrock, w
AFR, 3, e170/e190, Airfrans, s
AUR, 1, e195, Ayline, s
BGH, 2, a320, Balkan Holidays, e
SHT, 2, a320/a325, Shuttle, ns
BEL, 1, a319, Bee-line, s
EZY, 8, a320, Easy
EZY, 3, a319/a32n, Easy
UAE, 1, a320/a380, Emirates, s
FIN, 1, a319, Finnair, n
IBE, 1, a320, Iberia, s
IRA, 1, a332, Iranair, s
EXS, 10, b738, Channex, es
EXS, 5, a321/b738/b752, Channex, esw
KLM, 3, b737/b738/e190. KLM, e
LOG, 6, at72/e135/e145, Logan, w
DLH, 5, a320/a321/crj9, Lufthansa, sw
PGT, 1, a320, Sun Turk, s
QTR, 1, b788, Qatari, e
RYR, 5, b738, Ryanair, esw
SAS, 1, crj9, Scandinavian, ne
SWR, 1, a220, Swiss, ne
TAP, 2, a320/e190, Air Portugal, s
TOM, 7, b38m/b767, Tomjet, es
TOM, 4, b738/b788/b789, Tomjet, es
TRK, 1, a333, Turkish Republic, es
VLG, 1, a320, Vueling, s
G-EABC, 2, c162/c172/c182/c25a/c25b/c25c/c560/c680/c750/dh8a/dh8d/e110/e120/e50p/e55p/g280/gl5t/glf4/glf5/glf6/lj35/lj60/p208/p28b
entrypoints =
015, GASKO
065, GOLES
@@ -198,52 +274,71 @@ entrypoints =
338, LAKEY
[airport2]
name = Liverpool John Lennon Airport
code = GP
runways =
rwy3, 09, N53.3329, W2.86602, 87, 7500, 200, 0, 59, 3, 87, 3, 267, 0, 0, 0, 0, 126.355
#[airport2]
#name = Liverpool John Lennon Airport
#code = GP
#runways =
# rwy3, 09, N53.3329, W2.86602, 86.0, 7500, 200, 0, 59
#
#climbaltitude = 5000
#inboundbeacon = WAL
climbaltitude = 4000
# REF MCT Dx - These were roughly eyeballed using Google Earth
# D1.2 - N53.385556, W2.225556
# D2 - N53.378056, W2.219167
# D2.7 - N53.369167, W2.189722
# D3 - N53.327778, W2.33
# D3.2 - N53.322222, W2.33
# D5 - N53.326111, W2.391667
# R052 D7 - N53.425, W2.108056
# R254 D8 - N53.32, W2.476667
# R254 D12 - N53.301389, W2.583611
# R254 D13 - N53.296667, W2.610556
# R254 D15 - N53.2875, W2.663889
# R254 D16 - N53.282778, W2.690556
#
# POL R186 D24 - N53.346389, W2.173333
# POL R219 D36 - N53.276111, W2.734444
airlines =
EZY, 8, a319/a320, Easy
EZY, 1, a32n, Easy
LOG, 3, at46/e135/e145, Logan, w
RYR, 8, b737, Ryanair, esw
RYR, 3, b738, Ryanair, esw
WZZ, 5, a21n/a320/a321, Wizzair, e
WUK, 1, a321, Wizz Go, e
G-EABC, 1, c162/c172/c182/c25a/c25b/c25c/c560/c680/c750/dh8a/dh8d/e110/e120/e50p/e55p/g280/gl5t/glf4/glf5/glf6/lj35/lj60/p208/p28b
entrypoints =
008, CROFT
061, POL
081, DESIG
132, LESTA
166, PEDIG
211, MONTY
232, MONTY
277, MALUD
290, PENIL
330, CROFT
# CONFIG
[configurations]
config1 =
0, rwy1, landrev
0, rwy2, startrev
7, rwy3, landstartrev
# 12, rwy2, landstartrev
config2 =
0, rwy1, start
0, rwy2, land
7, rwy3, landstart
# 12, rwy1, landstart
[departure1]
runway = rwy1, rev
route1 =
SANBA, Sanba 1R
SANBA, Sanba 1 Romeo
N53.327778, W2.33
N53.326111, W2.391667
N53.271944, W2.450556
N53.139444, W2.334167
route2 =
KUXEM, Cooksem 1R
KUXEM, Cooksem 1 Romeo
N53.327778, W2.33
N53.32, W2.476667
N53.301389, W2.583611
N53.253056, W2.679722
route3 =
EKLAD, Eklad 1R
EKLAD, Eklad 1 Romeo
N53.327778, W2.33
N53.32, W2.476667
N53.296667, W2.610556
@@ -251,7 +346,7 @@ route3 =
N53.253889, W2.824722
route4 =
MONTY, Monty 1R
MONTY, Monty 1 Romeo
N53.327778, W2.33
N53.32, W2.476667
N53.296667, W2.610556
@@ -275,21 +370,21 @@ route6 =
[departure2]
runway = rwy2, rev
route1 =
SANBA, Sanba 1Y
SANBA, Sanba 1 Yankee
N53.322222, W2.33
N53.326111, W2.391667
N53.271944, W2.450556
N53.139444, W2.334167
route2 =
KUXEM, Cooksem 1Y
KUXEM, Cooksem 1 Yankee
N53.322222, W2.33
N53.32, W2.476667
N53.301389, W2.583611
N53.253056, W2.679722
route3 =
EKLAD, Eklad 1Y
EKLAD, Eklad 1 Yankee
N53.322222, W2.33
N53.32, W2.476667
N53.296667, W2.610556
@@ -297,7 +392,7 @@ route3 =
N53.253889, W2.824722
route4 =
MONTY, Monty 1Y
MONTY, Monty 1 Yankee
N53.322222, W2.33
N53.32, W2.476667
N53.296667, W2.610556
@@ -334,7 +429,7 @@ route2 =
N53.143333, W2.199167
route3 =
MONTY, Monty 1S
MONTY, Monty 1 Siera
N53.378056, W2.219167
N53.471389, W2.421667
N53.391944, W3.134444
@@ -366,7 +461,7 @@ route2 =
N53.143333, W2.199167
route3 =
MONTY, Monty 1Z
MONTY, Monty 1 Zulu
N53.378056, W2.219167
N53.471389, W2.421667
N53.391944, W3.134444
@@ -382,6 +477,113 @@ route5 =
N53.527222, W1.892778
# EGGP
[departure5]
runway = rwy3
route1 =
BARTN, Barton 1 Victor
# I-LVR R059 D1
N53.20.17, W002.50.02, 4000
# WAL R081 D16
N53.25.58, W002.41.34
# WAL R081 D20
N53.26.34, W002.34.58
# BARTN
N53.28.14, W002.25.41
route2 =
POL, Pole Hill 5 Victor
# I-LVR R059 D1
N53.20.17, W002.50.02, 4000
# POL R242 D26
N53.32.20, W002.44.48
# POL
N53.44.38, W002.06.12
route3 =
REXAM, Rexham 2 Victor
# I-LVR R059 D1
N53.20.17, W002.50.02, 4000
# POL R224 D30
N53.22.59, W002.41.07
# POL R224 D44
N53.12.49, W002.57.12
# POL R224 D50
N53.08.27, W003.04.04
# REXHAM
N53.04.00, W003.09.37
route4 =
WAL, Wallasey 2 Victor
# I-LVR R059 D1
N53.20.17, W002.50.02, 4000
# WAL R095 D11
N53.22.32, W002.49.43
# WAL
N53.23.31, W003.08.04
route5 =
NANTI, Naan tea 2 Victor
# I-LVR R059 D1
N53.20.17, W002.50.02, 4000
# NANTI
N53.08.15, W002.34.01
[departure6]
runway = rwy3, rev
route1 =
BARTN, Barton 1 Tango
# I-LQ R266 D1.5
N53.19.51, W002.53.27, 4000
# WAL R081 D10
N53.25.04, W002.51.30
# WAL R081 D16
N53.25.58, W002.41.34
# WAL R081 D20
N53.26.34, W002.34.58
# BARTN
N53.28.14, W002.25.41
route2 =
POL, Pole Hill 4 Tango
# I-LQ R266 D1.5
N53.19.51, W002.53.27, 4000
# POL R242 D32
N53.29.28, W002.53.40
# POL R242 D26
N53.32.20, W002.44.48
# POL
N53.44.38, W002.06.12
route3 =
REXAM, Rexham 2 Tango
# I-LQ R266 D8
N53.19.23, W003.04.18, 4000
# WAL R184 D6
N53.17.29, W003.08.46
# WAL R184 D15
N53.08.34, W003.09.49
# REXHAM
N53.04.00, W003.09.37
route4 =
WAL, Wallasey 2 Tango
# I-LQ R266 D1.5
N53.19.51, W002.53.27, 4000
# WAL
N53.23.31, W003.08.04
route5 =
NANTI, Naan tea 2 Tango
# I-LQ R266 D1.5
N53.19.51, W002.53.27, 4000
# WAL R128 D17
N53.13.01, W002.45.43
# NANTI
N53.08.15, W002.34.01
# STAR - DAYNE
[approach1]
runway = rwy1
@@ -887,4 +1089,282 @@ route 1 =
N54.238889, W2.981111, 20000
# ROSUN
N53.668889, W2.349167, 7000, 230
end, hold
end, hold
# STAR - KEGUN
[approach33]
runway = rwy3, rev
beacon = MONTY
route 1 =
004
# MONTY
N52.53.34, W003.10.26, 16000
# KEGUN
N53.11.33, W003.09.01, 12000
# TORGO
N53.07.57, W003.15.59, 8000
# KEGUN
N53.11.33, W003.09.01, 7000, 210
end, hold
[approach34]
runway = rwy3, rev
beacon = PEDIG
route 1 =
307
# PEDIG
N52.44.48, W001.43.10, 16000
# NANTI
N53.08.15, W002.34.01, 10000
# KEGUN
N53.11.33, W003.09.01
# TORGO
N53.07.57, W003.15.59, 8000
# KEGUN
N53.11.33, W003.09.01, 7000, 210
end, hold
[approach35]
runway = rwy3, rev
beacon = LESTA
route 1 =
312
# LESTA
N52.44.27, W001.04.19, 20000
# TNT
N53.03.14, W001.40.12, 15000
# NANTI
N53.08.15, W002.34.01, 10000
# KEGUN
N53.11.33, W003.09.01
# TORGO
N53.07.57, W003.15.59, 8000
# KEGUN
N53.11.33, W003.09.01, 7000, 210
end, hold
# STAR - TIPOD
[approach36]
runway = rwy3
beacon = MONTY
route 1 =
004
# MONTY
N52.53.34, W003.10.26, 16000
# KEGUN
N53.11.33, W003.09.01, 13000
# WAL
N53.23.31, W003.08.04, 10000
# BAROS
N53.24.22, W003.26.43, 8000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach37]
runway = rwy3
beacon = PEDIG
route 1 =
307
# PEDIG
N52.44.48, W001.43.10, 16000
# NANTI
N53.08.15, W002.34.01, 10000
# KEGUN
N53.11.33, W003.09.01
# WAL
N53.23.31, W003.08.04
# BAROS
N53.24.22, W003.26.43, 8000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach38]
runway = rwy3
beacon = LESTA
route 1 =
312
# LESTA
N52.44.27, W001.04.19, 20000
# TNT
N53.03.14, W001.40.12, 15000
# NANTI
N53.08.15, W002.34.01, 10000
# KEGUN
N53.11.33, W003.09.01
# WAL
N53.23.31, W003.08.04
# BAROS
N53.24.22, W003.26.43, 8000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach39]
runway = rwy3
beacon = PENIL
route 1 =
137
# PENIL
N53.36.57, W003.39.49, 17000
# RUGER
N53.28.58, W003.26.52, 10000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach40]
runway = rwy3
beacon = MALUD
route 1 =
084
# MALUD
N53.28.58, W003.26.52, 10000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach41]
runway = rwy3
beacon = CROFT
route 1 =
058
# CROFT
N53.37.37, W002.32.20, 15000
# WAL
N53.23.31, W003.08.04, 10000
# BAROS
N53.24.22, W003.26.43, 8000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach42]
runway = rwy3
beacon = POL
route 1 =
061
# POL
N53.44.38, W002.06.12, 17000
# WAL
N53.23.31, W003.08.04, 10000
# BAROS
N53.24.22, W003.26.43, 8000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
[approach43]
runway = rwy3
beacon = DESIG
route 1 =
081
# DESIG
N53.31.38, W001.53.34, 17000
# WAL
N53.23.31, W003.08.04, 10000
# BAROS
N53.24.22, W003.26.43, 8000
# TIPOD
N53.26.08, W003.17.05, 7000, 210
end, hold
# APPROACH - EGGP 27
[approach44]
runway = rwy3, rev
beacon = LPL
route 1 =
086
# LPL
N53.20.23, W002.43.30, 6000, 185
# LPL R059 D9.8
N53.25.25, W002.29.25, 4000
# LPL R086 D9
N53.21.00, W002.28.28, 3500
# Intercept 9.3NM @ 3000'
9.3, 3000, 185
# APPROACH - EGGP 9
[approach45]
runway = rwy3
beacon = LPL
route 1 =
086
# LPL
N53.20.23, W002.43.30, 6000, 220
# LPL R279 D10.7
N53.22.02, W003.01.12, 4000
# LPL R266 D10
N53.19.40, W003.00.12, 3000
# Intercept 7.5NM @ 2500'
7.5, 2500, 220
# APPROACH - EGCC 23R RNAV
[approach46]
runway = rwy1, rev
beacon = TINVA, N53.32.57, W002.04.49, 0, Tinva
route 1 =
142
# TINVA
N53.32.57, W002.04.49, 3500, 185
# C23LI
N53.29.22, W002.00.07
# Intercept C23LF
9.1, 3000, 185
[approach47]
runway = rwy1, rev
beacon = OSNAP, N53.25.12, W001.54.21, 0, Osnap
route 1 =
322
# OSNAP
N53.25.12, W001.54.21, 3500, 185
# C23LI
N53.29.22, W002.00.07
# Intercept C23LF
9.1, 3000, 185
[approach48]
runway = rwy2
beacon = MCT
route 1 =
232
# MCT
N53.21.25, W002.15.44, 3500, 210
# MCT R218 D14
N53.10.23, W002.30.06, 3000
# Intercept 11NM @ 3000'
11, 3000, 210
+18
View File
@@ -0,0 +1,18 @@
# Manchester Airport including Liverpool John Lennon Airport for Endless ATC
This implements Manchester Airport (EGCC) and Liverpool John Lennon Airport (EGGP) into [Endless ATC](https://steamcommunity.com/app/666610).
## Installation
To install this airport you will need to copy the [EGCC.txt](./EGCC.txt) file into your steam directory, which by default for Windows 10 is at `C:\Program Files (x86)\Steam\steamapps\common`. From the common folder you need to put the file into the `Endless ATC\locations` folder.
## Features
This fully implements all published SIDs and STARs according to the charts published by [VatSIM](https://www.vatsim.uk/) on [ChartFox](https://chartfox.org/EGCC). As is normal for the UK, all STARs end in holding patterns. The published approaches have been used as a base for the approaches implemented in game. There have been some minor modifications to get them to work in game without any problems.
There are two configurations, one Easterly and one Westerly, which start with one runway open for landing and one for take off at EGCC. This is the way they normally operate. After you reach a score of 7 EGGP will open its single runway.
Airlines and the aircraft they use have been approximated using data available on [Flightradar24](https://www.flightradar24.com/data/airports/man) and random private traffic has been added in.
## Changelog
* v1.0 - 2021-08-03 - Initial release
File diff suppressed because it is too large Load Diff
+244
View File
@@ -0,0 +1,244 @@
#Made by obamna#9667
#Including PHNL, East config
#DM me on discord if you have any questions, comments, suggestions etc!
[airspace]
radius = 50
elevation = 13
usa = true
transition = 18001
center = N21.32062, W157.924228
magneticvar = 9.595
descendaltitude = 11000
automatic = true
beacons =
HNL, N21.30830, W157.92999, 0, Honolulu
HHI, N21.47790, W158.03400, 0, Wheeler
NGF, N21.45050, W157.76401, 0, Kaneohe
CKH, N21.26520, W157.70300, 0, Koko Head
MKK, N21.13810, W157.16701, 0, Molokai
KAENA, N21.32.27.278, W158.21.45.473, 0, Kayna
KLANI, N21.32.57.082, W158.36.08.759, 0, Klani
BAMBO, N21.24.57.331, W157.30.35.305, 0, Bamboo
MAKAH, N20.57.28.690, W157.34.34.081, 0, Mah kah
line1 =
N21.17729, W156.91719
N21.19971, W156.95234
N21.18794, W157.00229
N21.21538, W157.21362
N21.22979, W157.24995
N21.18057, W157.25381
N21.15234, W157.27949
N21.11260, W157.29033
N21.09780, W157.02090
N21.05635, W156.85986
N21.10356, W156.74790
N21.15508, W156.71216
N21.16353, W156.74219
N21.17729, W156.91719
line2 =
N20.94907, W156.69775
N20.90142, W156.68970
line3 =
N21.47144, W157.82959
N21.51191, W157.85435
N21.55337, W157.85151
N21.70137, W157.96250
N21.69180, W158.02036
N21.60024, W158.12310
N21.58525, W158.27314
N21.53306, W158.23867
N21.48936, W158.23911
N21.37715, W158.13784
N21.31860, W158.11035
N21.31226, W158.07915
N21.31611, W157.98096
N21.36772, W158.01729
N21.37852, W157.97842
N21.36689, W157.96831
N21.32690, W157.95845
N21.34058, W157.90176
N21.29082, W157.84932
N21.26860, W157.79878
N21.27974, W157.69087
N21.30762, W157.63540
N21.33394, W157.65415
N21.37808, W157.70552
N21.45771, W157.72090
N21.45093, W157.76499
N21.45664, W157.79937
N21.47144, W157.82959
line4 =
N20.93003, W156.94180
N20.91245, W157.05059
N20.82568, W156.98843
N20.75752, W156.97339
N20.74448, W156.90889
N20.77266, W156.84961
N20.83115, W156.80937
N20.87778, W156.84829
N20.90483, W156.88057
N20.93003, W156.94180
[airport1]
name = Daniel K Inouye International Airport
code = PHNL
runways =
rwy1, 04L, N21.3183, W157.923, 53.0, 6952, 0, 0, 10
rwy2, 04R, N21.3139, W157.927, 53.0, 9000, 0, 0, 9
rwy3, 08L, N21.3252, W157.943, 90.0, 12300, 0, 0, 12
rwy4, 08R, N21.3068, W157.946, 90.0, 12000, 0, 0, 10
climbaltitude = 5000
sids =
MKK, N21.13810, W157.16701, Molo kai
PALAY, N21.06.12.601, W157.34.12.053, Pal ay
KEOLA, N21.17.45.573, W158.29.24.064, Key ola
entrypoints =
289, KAENA
281, KLANI
065, BAMBO
129, MAKAH
airlines =
hal, 6, b712, hawaiian, sw
hal, 6, a332, hawaiian, ew
hal, 6, a21n, hawaiian, e
aal, 1, b789/a21n/b772/b77w, american, e
ual, 1, b737/b77w/b772/b764/b753/b763, united, e
swa, 1, b38m/b738, southwest, nes
scx, 1, b738, sun country, e
fdy, 1, c208, friendly, nwse
asa, 1, b738/b739, alaska, e
fdx, 1, b77l/md11, fed ex, ew
gti, 1, b763/b744, giant, e
dal, 1, b764/a333/b752/a339, delta, e
aah, 1, b733, aloha, sw
aah, 1, b763, aloha, e
cks, 1, b744, connie, e
nac, 1, b763, yukon, e
ups, 1, b748, u p s, e
ups, 1, b763, u p s, ns
ana, 1, b763, all nee pawn, n
jal, 1, b763, japan air, n
mge, 1, b752, mirage, e
[area1]
# Boundary
shape = polygon
altitude = 0
labelpos = N0.0, W0.0
points =
N21.26.41.148, W157.52.51.202
N21.46.11.036, W158.00.32.877
N21.43.45.789, W158.03.43.680
N21.37.47.422, W158.08.43.941
N21.37.32.682, W158.17.32.901
N21.33.45.813, W158.20.38.926
N21.30.27.968, W158.22.38.454
N21.26.58.730, W158.24.05.324
N21.23.22.301, W158.25.05.952
N21.20.07.024, W158.25.27.871
N21.16.25.659, W158.25.27.061
N21.09.01.126, W158.23.54.640
N21.02.56.676, W158.20.36.194
N20.57.01.225, W158.14.55.774
N20.55.45.255, W158.13.17.660
N20.54.07.042, W158.10.35.689
N20.52.59.079, W158.08.13.996
N20.57.28.311, W158.05.59.756
N20.55.49.832, W158.00.57.311
N20.55.28.620, W157.58.17.355
N20.55.20.858, W157.54.22.588
N20.55.42.501, W157.51.24.098
N20.56.16.711, W157.48.57.459
N20.51.28.994, W157.47.29.298
N20.52.13.138, W157.45.02.651
N20.48.31.260, W157.43.29.148
N20.48.53.301, W157.42.21.119
N20.50.32.239, W157.38.46.794
N20.52.36.826, W157.35.28.856
N20.55.18.661, W157.32.08.131
N20.59.24.906, W157.28.05.956
N21.05.03.459, W157.24.42.269
N21.09.46.498, W157.22.57.210
N21.24.56.322, W157.30.34.903
[approach1]
runway = rwy3
beacon = KAENA
route1 =
199
N21.32.27.278, W158.21.45.473, 7000
N21.20.11.092, W158.14.23.354, 4000
N21.19.29.007, W158.07.11.246, 3200
9.2, 3000, 210
[approach2]
runway = rwy3
beacon = KLANI
route1 =
111
N21.32.57.082, W158.36.08.759, 9000, 250
N21.27.28.198, W158.26.57.705, 8000
N21.21.56.792, W158.17.37.874
15.4, 5000, 210
[approach3]
runway = rwy2
beacon = BAMBO
route1 =
215
N21.24.57.331, W157.30.35.305
N21.19.24.689, W157.44.54.105, 8000
N21.16.53.361, W157.51.28.303, 8000, 230
N21.13.07.724, W157.55.45.211, 7000, 220
N21.06.38.794, W158.05.01.187
N21.10.07.602, W158.07.49.155, 3000
N21.14.05.654, W158.02.11.334, 2500
6.2, 2000
[approach4]
runway = rwy3
beacon = BAMBO
route1 =
215
N21.24.57.331, W157.30.35.305
N21.19.24.689, W157.44.54.105, 8000
N21.16.53.361, W157.51.28.303, 8000, 230
N21.14.09.591, W157.57.30.762
N21.14.09.978, W157.59.40.514, 6000, 210
N21.14.09.130, W158.09.54.778
N21.19.23.846, W158.09.56.813, 4000
9.2, 3000, 210
[approach5]
runway = rwy2
beacon = MAKAH
route1 =
278
N20.57.28.690, W157.34.34.081, 11000, 250
N21.04.24.219, W157.56.19.086, 6000, 210
N21.10.07.602, W158.07.49.155, 3000
N21.14.05.654, W158.02.11.334, 2500
9.2, 3000, 210
[configurations]
#Calm Ops, Land 4R
config1 =
0, rwy2, land
0, rwy3, land
0, rwy4, start, 150, nosid
[configurations]
#Calm Ops, Land 8R
config2 =
0, rwy3, land
0, rwy4, landstart, 150, nosid
+21 -41
View File
@@ -8,6 +8,7 @@ usa = true
transition = 18001
center = N41.9786, W87.9048
name = chicago approach, chicago departure
automatic = true
magneticvar = -3.398
beacons =
ORD, N41.98770, W87.90490, 0, Chicago O'Hare
@@ -64,7 +65,6 @@ beacons =
VULCN, N42.05.30.340, W87.47.39.020, 0, Vulcan
HIMGO, N42.05.27.840, W87.30.31.890, 0, Him Go
# ERNNY Star
MINCE, N42.09.44.370, W87.03.51.080, 0, Mince
CHDRR, N43.20.10.890, W87.52.19.440, 0, Chander
LYNNI, N42.50.04.570, W87.34.53.200, 0, Lennie
PHRLY, N42.43.26.980, W87.31.25.720, 0, For Lee
@@ -267,7 +267,7 @@ airlines = ual, 10, a319/a320/b735/b737/b738/b739/b38m/b39m/b3xm/b744/b752/b753/
awi, 6, crj2, Wisconsin, swe
aal, 5, a319/a320/a321/a21n/a332/a333/b738/b38m/b752/b762/b763/b772/b77w/b788/b789/e190/md81/md82/md83, american, nswe
uca, 4, dh8b/dh8c/e145/e45x, commutair, ew
asq, 3, e145/e45x, acey, sew
asq, 3, e45x, acey, sew
eny, 3, e140/e145/e170/e175, envoy, swe
gjs, 3, crj7, lindbergh, se
pdt, 2, dh8a/dh8c/e145, piedmont, swe
@@ -275,7 +275,7 @@ airlines = ual, 10, a319/a320/b735/b737/b738/b739/b38m/b39m/b3xm/b744/b752/b753/
dal, 2, bcs1/bcs3/a319/a320/a321/b712/b737/b738/b739/b752/b753/md88/md90, delta, swe
edv, 2, crj2/crj7/crj9, endeavor, swe
skw, 1, e175/crj2/crj7/crj9, skywest, swe
ein, 1, a21n/a332/a333/b752, shamrock, e
ein, 1, a21l/a332/a333/b752, shamrock, e
amx, 1, b737/b738/b38m/b39m/b788, aeromexico, s
jza, 1, dh8a/dh8c/dh8d/crj2/crj9, jazz, n
skv, 1, e75s/e75l, maple, n
@@ -317,7 +317,7 @@ airlines = ual, 10, a319/a320/b735/b737/b738/b739/b38m/b39m/b3xm/b744/b752/b753/
nks, 1, a319/a19n/a320/a20n/a321/a21n, spirit wings, swe
scx, 1, b737/b738/b734, sun country, s
swr, 1, a332/a333/a343/b77w, swiss, e
tap, 1, a21n/a332/a333/a339/a343, air portugal, e
tap, 1, a21l/a332/a333/a339/a343, air portugal, e
thy, 1, a332/a333/a343/a359/b77l/b77w/b789, turkish, e
viv, 1, a320/a20n/a21n, aeroenlaces, s
voi, 1, a319/a320/a20n/a321/a21n, volaris, s
@@ -362,7 +362,6 @@ entrypoints =
020, LYNNI
340, ZANDI
141, HANNI
085, MINCE
sids =
DUFEE
@@ -440,18 +439,6 @@ route5 =
N41.42.45.580, W88.21.26.410
end, 360
[approach21]
runway = rwy3
beacon = MINCE
route22 =
099
N42.09.44.370, W87.03.51.080
N42.20.19.390, W87.32.03.060
N42.16.11.900, W87.36.25.930
N42.10.51.310, W87.42.02.890
N42.05.27.500, W88.16.31.340
end, 273
[approach6]
runway = rwy7
beacon = ZANDI
@@ -559,15 +546,7 @@ route18 =
N41.30.11.370, W87.21.32.310
N41.39.17.040, W87.29.41.620
end, 360
[approach22]
runway = rwy3, rev
beacon = MINCE
route23 =
099
N42.09.44.370, W87.03.51.080
N42.20.19.390, W87.32.03.060
end, 180
[airport2]
name = Chicago Midway, Midway
@@ -588,12 +567,12 @@ airlines = swa, 6, b733/b735/b737/b738/b38m/b37m, southwest, swe
edv, 1, crj2/crj7/crj9, endeavor, s
rpa, 1, e170/e75s/e75l, brickyard, s
skw, 1, crj2/crj7/crj9/e175, sky west, s
mtn, 1, at43/at72/at76/c208, mountain, n
fdx, 1, at43/at72/at76, fed ex, n
mtn, 1, at43/at72/at76, mountain, n
bvn, 1, c208, show me, n
usc, 1, c208/lj35, star check, n
n-8244y, 1, fa7x/fa8x/gl5t/gl7t/gl8t/glex, s
n-992xx, 1, g280/galx/glf1/glf2/glf3/glf4/glf5/glf6, n
c-salt, 1, c25c/c25m/c500/c501/c510/c525/c550/c55b/c560/c650/c680/c68a/c700, n
n-992xx, 1, glf4/glf5/glf6, n
# Specials
dpj, 1, c25a/c25b/c560/c56x/c680/c750/cl30/cl35/cl60/e55p/fa7x/glf4/glf5/lj45/lj60/lj75, jet card, s
jdi, 1, gl5t/glex/glf6, jedi, n
@@ -659,7 +638,7 @@ runways =
rwy16, 01L, N42.9313, W87.8975, 7.0, 9690, 0, 0, 704
rwy17, 01R, N42.9394, W87.8924, 7.2, 4183, 0, 0, 677
rwy18, 07L, N42.9527, W87.9053, 71.0, 4800, 0, 0, 672
rwy19, 07R, N42.9395, W87.9158, 72.0, 8012, 0, 0, 723
rwy19, 07R, N42.9395, W87.9158, 72.0, 8012, 0, 0, 723, 3, 72.0, 0, 0, 0, 0, 0, 0, 124.575
rwy20, 13, N42.9581, W87.9034, 132.0, 5868, 0, 0, 670
airlines =
swa, 7, b733/b735/b737/b37m/b738/b38m, southwest, sew
@@ -687,7 +666,7 @@ airlines =
usc, 1, c208/lj35, star check, s
bya, 1, dh8b/e120/sw4, berry, s
abx, 1, b762/b763, abex, ns
fdx, 1, a306/a310/b721/b722/b752/b763/dc10/md10/md11, fed ex, s
fdx, 1, a306/a310/at43/at72/at76/b721/b722/b752/b763/dc10/md10/md11, fed ex, s
mtn, 1, at43/at72/at76/c208, mountain, s
bvn, 1, c208, show me, s
mra, 1, c208, martex, w
@@ -695,7 +674,7 @@ airlines =
ups, 1, a306/b752/b763/dc87/md11, u p s, s
# specials
plm, 1, a332/a333/b744, pullman, n
dpj, 1, c25a/c25b/c560/c56x/c680/c750/cl30/cl35/cl60/e55p/fa7x/glf4/glf5/lj45/lj60/lj75, jet card, s
dpj, 1, c25a/c25b/c560/c56x/c680/c750/cl30/cl35/cl60/e55p/fa7x/glf4/glf5/lj45/lj60/lj75, jet card, sw
jdi, 1, gl5t/glex/glf6, jedi, n
viv, 1, a320/a20n/a21n, aeroenlaces, s
qxe, 1, crj7/dh8b/dh8d/e175, horizon, w
@@ -800,13 +779,14 @@ config5 =
[planetypes]
types =
B721, 4, 160, 250, 2.9, 3.2, 1440, 1560, 131, 144, 1.1, 1.3, Boeing
B722, 4, 160, 250, 2.9, 3.2, 1440, 1560, 131, 144, 1.1, 1.3, Boeing
A124, 2, 170, 250, 2.3, 2.7, 1000, 1440, 150, 170, 1.1, 1.3, Antonov
B721, 4, 160, 300, 2.9, 3.2, 1440, 1560, 131, 144, 1.1, 1.3, Boeing
B722, 4, 160, 300, 2.9, 3.2, 1440, 1560, 131, 144, 1.1, 1.3, Boeing
A124, 2, 170, 300, 2.3, 2.7, 1000, 1440, 150, 170, 1.1, 1.3, Antonov
C402, 6, 100, 230, 2.9, 3.2, 1000, 1400, 60, 90, 1.1, 1.3, Cessna
J328, 5, 160, 250, 2.9, 3.2, 1440, 1560, 122, 132, 1.1, 1.3, Dornier
E45X, 5, 160, 250, 2.9, 3.2, 1440, 1560, 122, 132, 1.1, 1.3, Embraer
A225, 1, 180, 250, 2.2, 2.4, 1000, 1400, 155, 180, 1.1, 1.3, Antonov
DC87, 3, 160, 250, 2.3, 2.7, 1000, 1440, 138, 148, 1.1, 1.3, Douglas
DC10, 2, 160, 250, 2.3, 2.7, 1000, 1440, 145, 160, 1.1, 1.3, Douglas
GALX, 5, 160, 250, 2.9, 3.2, 1440, 1560, 113, 125, 1.1, 1.3, Gulfstream
J328, 5, 160, 300, 2.9, 3.2, 1440, 1560, 120, 132, 1.1, 1.3, Dornier
E45X, 5, 160, 300, 2.9, 3.2, 1440, 1560, 120, 132, 1.1, 1.3, Embraer
A225, 1, 180, 300, 2.2, 2.4, 1000, 1400, 155, 180, 1.1, 1.3, Antonov
DC87, 3, 160, 300, 2.3, 2.7, 1000, 1440, 133, 146, 1.1, 1.3, Douglas
DC10, 2, 160, 300, 2.3, 2.7, 1000, 1440, 145, 160, 1.1, 1.3, Douglas
GALX, 5, 160, 300, 2.9, 3.2, 1440, 1560, 113, 125, 1.1, 1.3, Gulfstream
G150, 5, 160, 300, 2.9, 3.2, 1440, 1560, 113, 125, 1.1, 1.3, Gulfstream
+58
View File
@@ -0,0 +1,58 @@
# KRVL by Lemuria#0685
# General aviation airport
# V0.1 early alpha
#####################
# sources at bottom #
#####################
[airspace]
radius = 27
ceiling = 7500
floor = 2000
elevation = 818
center = N40.40.39, W77.37.37
usa = true
beacons =
#rwy 06 chart beacons
COFAX, N40.18.46.730, W77.58.00.990
STROH, N40.36.56.310, W77.43.09.060
LUCKS, N40.31.21.930, W77.51.27.300
OTUCA, N40.35.23.920, W77.45.26.960
EYOCE, N40.35.07.030, W77.55.47.700
#rwy 24 chart beacons
OCPUC, N40.49.54.310, W77.43.40.920
UZAWI, N40.53.40.470, W77.28.00.920
VEHSY, N40.46.07.980, W77.19.21.410
EZUCE, N40.45.53.290, W77.29.44.150
COMOL, N40.44.00.870, W77.32.33.390
[airport1]
name = Mifflin County Airport
code = KRVL
entrypoints =
045, LUCKS
090, LUCKS
135, LUCKS
180, LUCKS
235, LUCKS
270, LUCKS
315, LUCKS
360, LUCKS
runways =
rwya, 6, 0, 0, 059, 5001
airlines =
# general aviation, common
n-123ab, 100, c172/c175/c162/c120/c140/c180/c182/c185/c188
n-1234a, 40, c172
c-abcd, 10, c175/c162
c-123ab, 7, c162
n-123ab, 1, glf5
# # #
# sources
# rwy 06 chart
# https://aeronav.faa.gov/d-tpp/2107/05979R6.PDF
## miscellaneous ##
# airnav listing
# https://www.airnav.com/airport/KRVL
+136 -2
View File
@@ -1,4 +1,4 @@
# Endless ATC Custom Airport Tools 0.10.1
# Endless ATC Custom Airport Tools 0.11.0
In this directory are a few tools useful for writing Endless ATC airport files. You can see examples of its usage in `RJTT` and `RJBB`.
@@ -35,6 +35,27 @@ Applicable sections:
* `[transition]` (deprecated)
* `route=`
### Header
The build process results in a fairly minimal file with no comments. To add a header, define it in `[meta]` of the source file:
```INI
[meta]
header = RJTT ACA 3.3.0
See RJTT_readme.md
```
A message indicating this file was built using these tools and the location of the source file will be appended after the `header=` message:
```INI
# RJTT ACA 3.3.0
# See RJTT_readme.md
# This file is generated from the source file source\RJTT.txt using expand.py.
# All comments have been stripped, and edits are not made directly to this file.
# If you would like to contribute, or see the author's comments, please refer to the source file.
```
### Fix definitions and references
Fixes defined in `[airspace]` `beacons=` are stored in a database for reference elsewhere in the file.
@@ -65,6 +86,111 @@ Any fixes can be referenced by name later in the following areas using `!<fix_na
The `center=` of the TMA will be made available under the name `_CTR` as a hidden fix.
Example for `handoff=`:
```INI
handoff =
#T13 (Musashi Sector)
!KAGNA, Tokyo Control, Tokyo Control, 132.1
!SEDRI, Tokyo Control, Tokyo Control, 132.1
!MITOP, Tokyo Control, Tokyo Control, 132.1
!DALMA, Tokyo Control, Tokyo Control, 292.4
#T03 (Kanto North Sector)
!KIMIN, Tokyo Control, Tokyo Control, 124.1
!AGRIS, Tokyo Control, Tokyo Control, 124.1
!CLARK, Tokyo Control, Tokyo Control, 124.1
!JD, Tokyo Control, Tokyo Control, 276.1
```
becomes:
```INI
handoff = 259, Tokyo Control, Tokyo Control, 132.1
267, Tokyo Control, Tokyo Control, 132.1
275, Tokyo Control, Tokyo Control, 132.1
261, Tokyo Control, Tokyo Control, 292.4
359, Tokyo Control, Tokyo Control, 124.1
350, Tokyo Control, Tokyo Control, 124.1
336, Tokyo Control, Tokyo Control, 124.1
348, Tokyo Control, Tokyo Control, 276.1
```
### Multiplying entry points
```INI
entrypoints =
#Following line will be repeated 10 times (without the ", *10" at the end)
242, SPENS, 22000, *10
#Following line will be repeated 6 times (without the ", *6" at the end)
223, SELNO, 23000, *6
123, DOLBA, 22000
193, TOPIT, 22000
#Following line will be repeated 7 times (without the ", *7" at the end)
359, TEDIX, 16000, *7
64, LALID, 16000
```
### Airlines
Airlines definitions with a frequency greater than 10 will be split into multiple definitions with frequency 10 or less.
```INI
#The below will result in 30 lines of "ana, 10, b763, ..." and 10 lines of "ana, 10, b77l, w"
#The a124 lines will remain the same as they are less than 10 frequency
airlines =
ana, 300, b763, all nippon, w
ana, 100, b77l, all nippon, w
vda, 5, a124, volga, nswe
adb, 1, a124, antonov, nswe
```
### Auto airlines callsigns
If callsigns is enabled in meta, callsigns can be omitted in `airlines=`. They will be resolved using the list in `common.ini` in the directory where these tools are located.
You can override these callsign definitions (or add local callsigns) in a `common.ini` in the directory of the source file.
```INI
[meta]
header = RJTT ACA 3.3.0
See RJTT_readme.md
callsigns = True
```
common.ini:
```INI
[expand.callsigns]
cygns = cygnus
#if the callsign code portion is less than 2 characters, add an underscore prefix to make it 3 characters
_jf = japan force
```
Then in your source file:
```INI
airlines =
cygns-1, 10, b77w, nswe
#if the callsign code portion is less than 2 characters, add an underscore prefix to make it 3 characters
_jf-1, 10, b77w, nswe
```
Which becomes:
```INI
airlines =
cygns-1, 10, b77w, cygnus, nswe
jf-1, 10, b77w, japan force, nswe
```
### Unique aircraft callsign resolution (requires `callsigns = True`)
You can define callsigns with two dashes, one at the end. This will result in a "unique" aircraft of which only one can appear at a time:
```INI
airlines =
gaf-1-, 1, a343, nw
_jf-1-, 10, b77w, nswe
```
becomes:
```INI
airlines =
gaf1-, 1, a343, german air force one, nw
jf1-, 10, b77w, japan air force one, nswe
```
Note that the only possible aircraft that can spawn with the above definitions are `GAF1` and `JF1`. The game will be unable to spawn any more than two aircraft as only two unique callsigns can be generated.
### Advanced fix definitions (requires PyGeodesy)
If PyGeodesy is available, the below functions are also available. The tool will error if a file being built tries to use advanced fix definitions when PyGeodesy is not available.
@@ -409,4 +535,12 @@ route = *4
- `_CTR` fix will be generated as a hidden fix from `[airspace] center=`.
- Added feature to calculate headings from fixes for `[airspace] handoff=`.
* 0.10.1 - 2021/07/01
- Bugfix: consider magnetic variation when computing `[airspace] handoff=`.
- Bugfix: consider magnetic variation when computing `[airspace] handoff=`.
* 0.11.0 - 2021/07/18
- Entrypoints now support multipliers
- Approaches that end with a hold can link to other approaches
- In preparation for 4.5.1
- To be used to connect to multiple runways
- The approach route is not extended with the linked approach
- Airlines can be defined with two dashes to define unique traffic
- Pronunciation generation added to support this
+41 -3
View File
@@ -207,7 +207,7 @@ ssg = slovak government
jcg = japan coast guard
flc = flight check
vjt = vista jet
ivy0 = ivory coast
ivy = ivory coast
trk = turkish republic
bah = bahrain
orf = oman
@@ -220,7 +220,45 @@ idaf = indonesia air force
sui = swiss air force
esw = w-business
rmf = angkasa
bec00 = bravo echo charlie zero zero
rsd = state aero
[expand.gateways]
* = nswe
* = nswe
[expand.phonetic]
0 = zero
1 = one
2 = two
3 = tree
4 = four
5 = fife
6 = six
7 = seven
8 = eight
9 = niner
a = alpha
b = bravo
c = charlie
d = delta
e = echo
f = foxtrot
g = golf
h = hotel
i = india
j = juliet
k = kilo
l = lima
m = mike
n = november
o = oscar
p = papa
q = quebec
r = romeo
s = sierra
t = tango
u = uniform
v = victor
w = whiskey
x = x-ray
y = yankee
z = zulu
+167 -25
View File
@@ -3,6 +3,7 @@ from collections import deque
import configparser
from copy import deepcopy
from dataclasses import dataclass
from itertools import chain
import os
import re
from typing import ClassVar, Optional
@@ -378,6 +379,12 @@ class Airline:
callsigns = None
use_callsigns = True
test_callsigns = False
phonetic = None
@classmethod
def initialize(cls, callsigns, phonetic):
cls.callsigns = callsigns
cls.phonetic = phonetic
def __init__(self, callsign, frequency, types, *data, gateways=None):
"""Create an airline from an entry in the airlines= list. `data` should be
@@ -395,6 +402,11 @@ class Airline:
if '-' not in callsign:
self.pronunciation = Airline.callsigns[callsign]
else:
if callsign.endswith('-') and callsign.index('-') != callsign.rindex('-'):
unique = True
callsign = callsign[:-1]
else:
unique = False
# if length of key is more than 3, assume it is not registration
key = callsign[:callsign.index('-')]
self.callsign = callsign.strip('_')
@@ -402,6 +414,13 @@ class Airline:
# we strip '_' to allow for mil callsigns with length <= 3
self.pronunciation = Airline.callsigns.get(key, key.strip('_')) if len(key) > 3 \
else Airline.callsigns.get(key, '0')
if unique:
midpoint = self.callsign.index('-')
if self.pronunciation != '0':
number = self.callsign[midpoint + 1:]
self.pronunciation += " " + " ".join([self.phonetic[digit] for digit in number])
self.callsign = self.callsign[:midpoint] + self.callsign[midpoint + 1:] + '-'
if Airline.test_callsigns:
print(f'{self.callsign}: {self.pronunciation}')
if Airline.callsigns is None or not Airline.use_callsigns:
@@ -418,6 +437,9 @@ class Airline:
raise ValueError(f'''Could not create airline from ({callsign}, {frequency}, {types}, {str(data)})
Callsign pronunciation lookup = {Airline.use_callsigns}''') from e
def definition(self, frequency):
return f"{self.callsign}, {frequency}, {self.types}, {self.pronunciation}, {self.directions}"
def process_fix_line(line, fixes):
"""Expands special commands for a fix definition in short format
@@ -459,6 +481,15 @@ def process_fix_list(fix_list, fixes):
yield process_fix_line(line, fixes)
def fix_list_with_altitude(fix_list, altitude):
for line in fix_list:
if altitude is not None:
yield line + ", " + altitude
altitude = None
else:
yield line
def _generate_approach(heading, starting_fix):
return {"heading": heading, "beacon": starting_fix, "route": []}
@@ -534,6 +565,12 @@ def _process_approach_fix_list(fix_list, runway, fixes, tagged_routes,
_process_simple_approach_fix_list(fix_list[:-1], runway, fixes,
tagged_routes[runway], generated_approaches, current_tag, top_level)
terminate = False
if len(fix_list) > 1:
last_fix = fix_list[-2].strip()
terminate = last_fix.startswith('end') and last_fix.endswith('hold')
for generated_approach in generated_approaches[runway or current_tag]:
if 'tag' in generated_approach:
tagged_routes[runway][generated_approach['tag']].append(fix_list[-1])
@@ -573,9 +610,10 @@ The requesting approach route was {fix_list}''')
following_route = tagged_routes[following_tag_runway][following_tag]
if remove_first_fix:
following_route = following_route[1:]
_process_approach_fix_list(tagged_routes[following_tag_runway][following_tag],
following_tag_runway, fixes, tagged_routes, generated_approaches, following_tag,
False, debug=debug)
if not terminate:
_process_approach_fix_list(following_route,
following_tag_runway, fixes, tagged_routes, generated_approaches, following_tag,
False, debug=debug)
else:
_process_simple_approach_fix_list(fix_list, runway, fixes,
tagged_routes[runway], generated_approaches, current_tag, top_level)
@@ -637,7 +675,7 @@ def process_approach_fix_list(fix_list, runway, fixes, tagged_routes,
raise RuntimeError(f"Tried to process an empty approach route {fix_list} for runway {runway}")
def process_departure_fix_list(fix_list, runway, fixes, tagged_routes):
def process_departure_fix_list(fix_list, runway, airport, fixes, tagged_routes, base_runway=None):
"""Processes special commands in a list of departure fixes
in short format and produces an iterable of definitions as the result,
or `None` if there is no result (fix_list was recorded in `tagged_routes`.
@@ -656,42 +694,90 @@ def process_departure_fix_list(fix_list, runway, fixes, tagged_routes):
Args:
`fix_list` (list): A list of fix definitions.
`runway` (str): The runway this departure is for.
`airport` (str): The airport this departure is for.
`fixes` (dict): A lookup of `Fix`es.
`tagged_routes` (dict): A lookup of departure routes."""
`tagged_routes` (dict): A lookup of tagged departure routes.
`base_runway` (str): The runway to reference when looking up tagged routes."""
if fix_list:
if runway not in tagged_routes:
tagged_routes[runway] = {}
if airport not in tagged_routes:
tagged_routes[airport] = {}
if fix_list[0].startswith('@'):
tag = fix_list[0].lstrip('@')
tagged_routes[not tag.startswith('!') and runway or None][tag] = fix_list[1:]
tag_namespace = airport
if tag.startswith('!!'):
tag_namespace = None
elif tag.startswith('!'):
tag_namespace = runway
elif runway:
tag_namespace = runway
else:
raise RuntimeError(f"departure tagged {tag} as a runway-specific route, but no runway was specified")
tagged_routes[tag_namespace][tag] = fix_list[1:]
return None
else:
return _process_departure_fix_list(fix_list, runway, fixes, tagged_routes)
if base_runway is not None:
runway = base_runway
return _process_departure_fix_list(fix_list, runway, airport, fixes, tagged_routes)
def _process_departure_fix_list(fix_list, runway, fixes, tagged_routes, top_level=True):
def _process_departure_fix_list(fix_list, runway, airport, fixes, tagged_routes, top_level=True, altitude=None):
"""Inner worker function for `process_departure_fix_list()`.
This produces the actual generator with the route= lines.
Args:
`fix_list` (list): A list of fix definitions.
`runway` (str): The runway this departure is for.
`airport` (str): The airport this departure is for.
`fixes` (dict): A lookup of `Fix`es.
`tagged_routes` (dict): A lookup of departure routes."""
`tagged_routes` (dict): A lookup of departure routes.
`altitude` (str): An altitude to append to the first departure fix."""
if fix_list:
try:
if top_level:
yield fix_list[0]
fix_list = fix_list[1:]
# climb altitude
if fix_list[0].strip().isdigit():
if altitude is None:
altitude = fix_list[0].strip()
fix_list = fix_list[1:]
if fix_list[0].startswith('@'):
tag = fix_list[0].lstrip('@')
yield from _process_departure_fix_list(
tagged_routes[not tag.startswith('!') and runway or None][fix_list[0].lstrip('@')],
runway, fixes, tagged_routes, top_level=False)
if tag.startswith('!') and tag in tagged_routes[None]:
tagged_route = tagged_routes[None][tag]
elif tag in tagged_routes[runway]:
tagged_route = tagged_routes[runway][tag]
elif tag in tagged_routes[airport]:
tagged_route = tagged_routes[airport][tag]
else:
raise KeyError(f"Unable to find route tagged @{tag}")
yield from _process_departure_fix_list(tagged_route,
runway, airport, fixes, tagged_routes, top_level=False, altitude=altitude)
yield from _process_departure_fix_list(fix_list[1:],
runway, fixes, tagged_routes, top_level=False)
runway, airport, fixes, tagged_routes, top_level=False)
elif fix_list[-1].startswith('@'):
tag = fix_list[-1].lstrip('@')
if tag.startswith('!') and tag in tagged_routes[None]:
tagged_route = tagged_routes[None][tag]
elif tag in tagged_routes[runway]:
tagged_route = tagged_routes[runway][tag]
elif tag in tagged_routes[airport]:
tagged_route = tagged_routes[airport][tag]
else:
raise KeyError(f"Unable to find route tagged @{tag}")
yield from _process_departure_fix_list(fix_list[:-1],
runway, airport, fixes, tagged_routes, top_level=False, altitude=altitude)
yield from _process_departure_fix_list(tagged_route,
runway, airport, fixes, tagged_routes, top_level=False)
else:
if altitude is not None:
fix_list = fix_list_with_altitude(fix_list, altitude)
yield from process_fix_list(fix_list, fixes)
except Exception as e:
raise RuntimeError(
f"Could not process departure route {fix_list} for runway {runway}"
@@ -716,7 +802,26 @@ def process_sids_fix_list(fix_list, fixes):
yield line
def process_repeatable_departure_fix_list(fix_list, runway, fixes, tagged_routes):
def process_entrypoints_list(entrypoints_list):
"""Processes special commands in a list of fixes in minor format
and produces an iterable of definitions as the result.
Substitute any "!<name>[, <extra_data>]" in `fix_list` with
"lat, lon[, <extra_data>]" based on `fixes`.
Args:
`entrypoints_list` (list): A list of entrypoints definitions."""
for line in entrypoints_list:
entrypoint_definition, _, entrypoint_last_parameter = line.rpartition(',')
entrypoint_last_parameter = entrypoint_last_parameter.strip()
if entrypoint_last_parameter.startswith('*'):
for i in range(int(entrypoint_last_parameter.strip('*'))):
yield entrypoint_definition
else:
yield line
def process_repeatable_departure_fix_list(fix_list, runway, airport, fixes, tagged_routes, base_runway=None):
"""`Processes special commands in a list of departure fixes
in short format and produces an iterable of n iterables of
definitions as the result.
@@ -729,16 +834,20 @@ def process_repeatable_departure_fix_list(fix_list, runway, fixes, tagged_routes
Args:
`fix_list` (list): A list of fix definitions.
`runway` (str): The runway this departure is for.
`airport` (str): The airport this departure is for.
`fixes` (dict): A lookup of `Fix`es.
`tagged_routes` (dict): A lookup of departure routes."""
`tagged_routes` (dict): A lookup of tagged departure routes.
`base_runway` (str): The runway to reference when looking up tagged routes."""
if not fix_list[0]:
fix_list = fix_list[1:]
if fix_list[0].startswith('*'):
result = list(process_departure_fix_list(fix_list[1:], runway, fixes, tagged_routes))
result = list(process_departure_fix_list(fix_list[1:], runway, airport,
fixes, tagged_routes, base_runway))
for i in range(int(fix_list[0].removeprefix('*'))):
yield result
else:
yield process_departure_fix_list(fix_list, runway, fixes, tagged_routes)
yield process_departure_fix_list(fix_list, runway, airport,
fixes, tagged_routes, base_runway)
def process_beacons(fixes):
@@ -770,9 +879,9 @@ def process_airlines_list(airline_list):
for airline in airline_list:
n, r = divmod(airline.frequency, 10)
for i in range(n):
yield f"{airline.callsign}, 10, {airline.types}, {airline.pronunciation}, {airline.directions}"
yield airline.definition(10)
if r:
yield f"{airline.callsign}, {r}, {airline.types}, {airline.pronunciation}, {airline.directions}"
yield airline.definition(r)
def enumerate_routes(route_list, start=1):
@@ -803,7 +912,8 @@ def process(args, input_file=None, preprocessed_input=None):
config = configparser.ConfigParser()
config.read("common.ini")
config.read(os.path.join(os.path.dirname(input_file), "common.ini"))
Airline.callsigns = config['expand.callsigns'] if 'expand.callsigns' in config else {}
Airline.initialize(config['expand.callsigns'] if 'expand.callsigns' in config else {},
config['expand.phonetic'])
default_gateways = config['expand.gateways'] if 'expand.gateways' in config else {}
if 'legacy' not in args or not args.legacy:
@@ -878,9 +988,21 @@ def process(args, input_file=None, preprocessed_input=None):
area_data['labelpos'] = Fix.fixes[area_position].short_def
# process airport sections
runway_to_airport = {}
for airport_data in airports.values():
airport_code = airport_data['code']
airport_code, _, airport_code_full = airport_code.partition(',')
if airport_code_full:
airport_data['code'] = airport_code
airport_code = airport_code_full
runways = airport_data['runways'].strip().splitlines()
for runway_definition in runways:
runway_id, _, _ = runway_definition.partition(',')
runway_to_airport[runway_id] = airport_code
gateways = dict((tuple(map(str.strip, gateway.split(","))) for gateway in airport_data['gateways'].strip().splitlines()),
**default_gateways) if 'gateways' in airport_data else None
@@ -893,6 +1015,10 @@ def process(args, input_file=None, preprocessed_input=None):
airport_data['sids'] = "\n".join(
process_sids_fix_list(airport_data['sids'].splitlines(), Fix.fixes))
if 'entrypoints' in airport_data:
airport_data['entrypoints'] = "\n".join(
process_entrypoints_list(airport_data['entrypoints'].splitlines()))
# process approach/transition sections
approaches = {section: source[section] for section in source
if section.startswith('approach') or section.startswith('transition')}
@@ -963,23 +1089,39 @@ Defined beacon was {generated_approach.beacon}, actual beacon was {approach_beac
}
# process departure sections
departures = [source[section] for section in source if section.startswith('departure')]
common_departures = [source[section] for section in sorted(source) if section.startswith('commondeparture')]
departures = [source[section] for section in sorted(source) if section.startswith('departure')]
tagged_departures = {None: {}}
for departure_data in departures:
departure_runway = departure_data['runway']
departure_runway = departure_runway.partition(',')
for departure_data in chain(common_departures, departures):
if 'common' in departure_data:
departure_airport = departure_data['common']
departure_runway = None
departure_base_runway = None
else:
departure_runway = departure_data['runway']
departure_runway = departure_runway.partition(',')
departure_airport = runway_to_airport[departure_runway[0]]
departure_base_runway = departure_data.get('baserunway', fallback=None)
if departure_base_runway is not None:
departure_base_runway = departure_base_runway.partition(',')
del departure_data['baserunway']
routes = {int(option.removeprefix('route')): departure_data[option]
for option in departure_data if option.startswith('route')}
processed_routes = []
for route_index in sorted(routes):
processed_routes.extend("\n".join(route) for route in
process_repeatable_departure_fix_list(
routes[route_index].splitlines(), departure_runway, Fix.fixes, tagged_departures)
routes[route_index].splitlines(), departure_runway, departure_airport,
Fix.fixes, tagged_departures, departure_base_runway)
if route)
del departure_data[f'route{route_index}']
departure_data.update(enumerate_routes(processed_routes, start=1))
common_departures = [section for section in source if section.startswith('commondeparture')]
for section in common_departures:
del source[section]
# write output file
if not args.parse_only:
with open(output_file, 'w', newline='') as airport_file:
+2 -2
View File
@@ -16,9 +16,9 @@ def process(args, file=None):
`args`: An `argparse.Namespace`. The command line args from the invoking module.
`file`: The file to process. Defaults to `input_file` in `args`."""
header_re = re.compile(r"^(?:\[(?P<header>(?:approach)|(?:transition)|(?:departure)|(?:area)|(?:airport))\d*\])|^(?:route\d? *= *)")
header_re = re.compile(r"^(?:\[(?P<header>(?:approach)|(?:transition)|(?:(?:common)?departure)|(?:area)|(?:airport))\d*\])|^(?:route\d? *= *)")
def number_approach(match, indexes={'approach': 0, 'transition': 0, 'departure': 0, 'area': 0, 'route': 0, 'airport': 0}):
def number_approach(match, indexes={'approach': 0, 'transition': 0, 'departure': 0, 'area': 0, 'route': 0, 'airport': 0, 'commondeparture': 0}):
header = match.group("header")
if header:
indexes['route'] = 0