<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PlayeRom</id>
	<title>FlightGear wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PlayeRom"/>
	<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/Special:Contributions/PlayeRom"/>
	<updated>2026-06-21T09:12:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/SimpleTime&amp;diff=145147</id>
		<title>Pl/SimpleTime</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/SimpleTime&amp;diff=145147"/>
		<updated>2026-06-18T12:17:33Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Więcej informacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Przegląd ==&lt;br /&gt;
&lt;br /&gt;
Funkcja &amp;quot;simple time&amp;quot; stara się zapewnić, aby połączone sesje multiplayer FlightGeara miały spójne i płynnie zmieniające się animacje, niezależnie od liczby klatek na sekundę czy opóźnień sieciowych między nimi.&lt;br /&gt;
&lt;br /&gt;
Na przykład podczas tankowania w trybie multiplayer, każdy pilot będzie widział tę samą względną pozycję obydwu samolotów.&lt;br /&gt;
&lt;br /&gt;
Funkcja ta jest dostępna od wersji 2024.1.&lt;br /&gt;
&lt;br /&gt;
== Używanie &amp;quot;simple time&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Simple time&amp;quot; można włączyć w oknie dialogowym &amp;quot;Tryb czasu&amp;quot; z menu '''Plik''' -&amp;gt; '''Tryb czasu''' lub z wiersza poleceń za pomocą: &amp;lt;code&amp;gt;--prop:bool:/sim/time/simple-time/enabled=true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Opcja ta nie ma żadnych ustawień konfiguracyjnych.&lt;br /&gt;
&lt;br /&gt;
== Jak to działa? ==&lt;br /&gt;
&lt;br /&gt;
Gdy używany jest &amp;quot;simple time&amp;quot;, FlightGear zawsze dołącza do pakietów sieciowych czas UTC danego komputera. Znaczniki czasu otrzymanych pakietów zawsze będą nieco w przeszłości z powodu opóźnień w sieci, więc samoloty w trybie multiplayer są pozycjonowane przy użyciu ekstrapolacji, czyli przewidywania, gdzie będą &amp;quot;teraz&amp;quot; na podstawie tego, gdzie były jakiś czas temu, używając informacji o prędkości samolotu, także zawartej w pakietach sieciowych.&lt;br /&gt;
&lt;br /&gt;
Tak więc przy uruchomionych wielu instancjach FlightGeara, tak długo jak ich zegary są zsynchronizowane z dokładnością do kilku dziesiątych sekundy (zazwyczaj za pomocą protokołu NTP (''Network Time Protocol''), który jest standardowym sposobem ustawiania przez komputery zegarów zgodnie z globalnym standardem), a opóźnienia sieciowe nie przekraczają kilku dziesiątych sekundy, każdy pilot będzie widział spójny widok wszystkich samolotów.&lt;br /&gt;
&lt;br /&gt;
== Radzenie sobie z pakietami multiplayer, które nie używają &amp;quot;simple time&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Jeśli korzystamy z &amp;quot;simple time&amp;quot;, ale czasy pakietów danego samolotu multiplayer nie mieszczą się w granicach sekundy lub dwóch od naszego czasu UTC, zakładamy, że samolot nie używa &amp;quot;simple time&amp;quot;. Wówczas stosujemy wygładzoną wersję różnicy czasu jako kompensacji (zakładając w zasadzie zerowe opóźnienie sieci). W ten sposób samolot innego pilota sesji multiplayer, będzie się nam wydawał poruszać płynnie, ale obaj piloci prawdopodobnie nie będą widzieć samolotów w takich samych położeniach.&lt;br /&gt;
&lt;br /&gt;
== Rejestrator lotu ==&lt;br /&gt;
&lt;br /&gt;
Jeśli używany jest &amp;quot;simple time&amp;quot;, to nagrania lotu również będą zawierać czas UTC, zarówno dla samolotu użytkownika, jak i innych samolotów multiplayer, o ile nagranie zostało wykonane za pomocą menu '''Plik''' -&amp;gt; '''Rejestrator lotu'''. W ten sposób nagranie może odtworzyć oryginalną pozycję słońca itd.&lt;br /&gt;
&lt;br /&gt;
== Testowanie ==&lt;br /&gt;
&lt;br /&gt;
Funkcję &amp;quot;simple time&amp;quot; można przetestować za pomocą skryptu &amp;lt;code&amp;gt;flightgear/scripts/python/recordreplay.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Więcej informacji ==&lt;br /&gt;
&lt;br /&gt;
Szczegóły można znaleźć w: {{flightgear source |path=docs-mini/README-simple-time.md}}&lt;br /&gt;
&lt;br /&gt;
Zobacz także instrukcję dla funkcji [[Real Time manual|&amp;quot;Real time&amp;quot;]], która jest bardziej konfigurowalnym systemem, rozwiązującym niektóre z tych samych problemów.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:SimpleTime]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/SimpleTime&amp;diff=145146</id>
		<title>Pl/SimpleTime</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/SimpleTime&amp;diff=145146"/>
		<updated>2026-06-18T12:16:08Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Przegląd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Przegląd ==&lt;br /&gt;
&lt;br /&gt;
Funkcja &amp;quot;simple time&amp;quot; stara się zapewnić, aby połączone sesje multiplayer FlightGeara miały spójne i płynnie zmieniające się animacje, niezależnie od liczby klatek na sekundę czy opóźnień sieciowych między nimi.&lt;br /&gt;
&lt;br /&gt;
Na przykład podczas tankowania w trybie multiplayer, każdy pilot będzie widział tę samą względną pozycję obydwu samolotów.&lt;br /&gt;
&lt;br /&gt;
Funkcja ta jest dostępna od wersji 2024.1.&lt;br /&gt;
&lt;br /&gt;
== Używanie &amp;quot;simple time&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Simple time&amp;quot; można włączyć w oknie dialogowym &amp;quot;Tryb czasu&amp;quot; z menu '''Plik''' -&amp;gt; '''Tryb czasu''' lub z wiersza poleceń za pomocą: &amp;lt;code&amp;gt;--prop:bool:/sim/time/simple-time/enabled=true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Opcja ta nie ma żadnych ustawień konfiguracyjnych.&lt;br /&gt;
&lt;br /&gt;
== Jak to działa? ==&lt;br /&gt;
&lt;br /&gt;
Gdy używany jest &amp;quot;simple time&amp;quot;, FlightGear zawsze dołącza do pakietów sieciowych czas UTC danego komputera. Znaczniki czasu otrzymanych pakietów zawsze będą nieco w przeszłości z powodu opóźnień w sieci, więc samoloty w trybie multiplayer są pozycjonowane przy użyciu ekstrapolacji, czyli przewidywania, gdzie będą &amp;quot;teraz&amp;quot; na podstawie tego, gdzie były jakiś czas temu, używając informacji o prędkości samolotu, także zawartej w pakietach sieciowych.&lt;br /&gt;
&lt;br /&gt;
Tak więc przy uruchomionych wielu instancjach FlightGeara, tak długo jak ich zegary są zsynchronizowane z dokładnością do kilku dziesiątych sekundy (zazwyczaj za pomocą protokołu NTP (''Network Time Protocol''), który jest standardowym sposobem ustawiania przez komputery zegarów zgodnie z globalnym standardem), a opóźnienia sieciowe nie przekraczają kilku dziesiątych sekundy, każdy pilot będzie widział spójny widok wszystkich samolotów.&lt;br /&gt;
&lt;br /&gt;
== Radzenie sobie z pakietami multiplayer, które nie używają &amp;quot;simple time&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Jeśli korzystamy z &amp;quot;simple time&amp;quot;, ale czasy pakietów danego samolotu multiplayer nie mieszczą się w granicach sekundy lub dwóch od naszego czasu UTC, zakładamy, że samolot nie używa &amp;quot;simple time&amp;quot;. Wówczas stosujemy wygładzoną wersję różnicy czasu jako kompensacji (zakładając w zasadzie zerowe opóźnienie sieci). W ten sposób samolot innego pilota sesji multiplayer, będzie się nam wydawał poruszać płynnie, ale obaj piloci prawdopodobnie nie będą widzieć samolotów w takich samych położeniach.&lt;br /&gt;
&lt;br /&gt;
== Rejestrator lotu ==&lt;br /&gt;
&lt;br /&gt;
Jeśli używany jest &amp;quot;simple time&amp;quot;, to nagrania lotu również będą zawierać czas UTC, zarówno dla samolotu użytkownika, jak i innych samolotów multiplayer, o ile nagranie zostało wykonane za pomocą menu '''Plik''' -&amp;gt; '''Rejestrator lotu'''. W ten sposób nagranie może odtworzyć oryginalną pozycję słońca itd.&lt;br /&gt;
&lt;br /&gt;
== Testowanie ==&lt;br /&gt;
&lt;br /&gt;
Funkcję &amp;quot;simple time&amp;quot; można przetestować za pomocą skryptu &amp;lt;code&amp;gt;flightgear/scripts/python/recordreplay.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Więcej informacji ==&lt;br /&gt;
&lt;br /&gt;
Szczegóły można znaleźć w: {{flightgear file|docs-mini/README-simple-time.md}}&lt;br /&gt;
&lt;br /&gt;
Zobacz także instrukcję dla funkcji [[Real Time manual|&amp;quot;Real time&amp;quot;]], która jest bardziej konfigurowalnym systemem, rozwiązującym niektóre z tych samych problemów.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:SimpleTime]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145102</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145102"/>
		<updated>2026-06-17T17:19:40Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Latanie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Postaramy się pomóc Ci wzbić się w wirtualne powietrze w najkrótszym możliwym czasie. Przedstawimy Ci również niektóre funkcje tego symulatora lotu oraz kilka informacji o jego społeczności.&lt;br /&gt;
&lt;br /&gt;
== Instalacja i konfiguracja ==&lt;br /&gt;
=== Wymagania sprzętowe ===&lt;br /&gt;
Aby FlightGear działał płynnie, wymaga karty graficznej ze sterownikami OpenGL 4.0 lub nowszymi. Zwykle nie stanowi to problemu, ale zapoznaj się z [[Pl/Wymagania_sprzętowe|zaleceniami sprzętowymi]], aby lepiej to zrozumieć.&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie FlightGeara ===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze strony [https://www.flightgear.org/download/ Pobieranie FlightGear]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego systemu. Dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuksa dla wersji 2020.3 LTS i nowszych. Większość użytkowników Linuksa odkryje, że większość dystrybucji ma spakowaną wersję FlightGeara (nazwa pakietu może brzmieć &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twoich umiejętności technicznych możesz wybrać deweloperską wersję [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre najnowsze rozwijane statki powietrzne, ale może być niestabilna i jest bardziej skomplikowana do zdobycia dla użytkowników innych niż Windows. Ogólnie rzecz biorąc, wersja deweloperska nie jest zalecana dla przeciętnego użytkownika, ale jeśli chcesz przeprowadzić kilka testów, dostępna jest wersja nocna do [https://www.flightgear.org/download/nightly/ pobrania]. Jeśli używasz kopii FlightGeara kontrolowanej przez system Git, możesz zsynchronizować swoje statki powietrzne za pomocą kontrolowanego przez system repozytorium rozwojowego statków powietrznych [[Pl/FGAddon|FGAddon]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie Windows ===&lt;br /&gt;
Po pobraniu instalatora uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen w systemie Windows może zablokować instalację po prostu dlatego, że plik binarny nie jest podpisany kluczem, który Microsoft uznaje. Oczywiście klucz jest płatny. W takim przypadku musimy kliknąć niepozorny link &amp;quot;Więcej informacji&amp;quot;. Dopiero wtedy pojawi się przycisk &amp;quot;Uruchom mimo to&amp;quot;. Możesz bezpiecznie zaufać, że nie jest to niebezpieczna aplikacja, pod warunkiem, że pobrałeś ją z oficjalnych źródeł.&lt;br /&gt;
&lt;br /&gt;
Jeśli z jakiegoś powodu używasz oprogramowania antywirusowego innej firmy, może ono blokować instalację FlightGeara. Nie jest to coś, na co mamy wpływ, więc to od Ciebie zależy, jak chcesz to rozwiązać.&lt;br /&gt;
&lt;br /&gt;
Za pomocą instalatora Windows możesz wybrać miejsce instalacji FlightGeara. Katalog [[Pl/$FG_ROOT|$FG_ROOT]] będzie miał ścieżkę &amp;lt;code&amp;gt;&amp;amp;lt;wybrany katalog&amp;amp;gt;/fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie macOS ===&lt;br /&gt;
Instalacja FlightGeara w systemie macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGeara do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Gdy uruchamiasz FlightGeara po raz pierwszy, jego ikona w Docku podskakuje przez kilka sekund podczas ładowania informacji o statkach powietrznych i lotniskach. Gdy pojawi się graficzny program uruchamiający, wybierz statek powietrzny i lotnisko, a następnie kliknij &amp;quot;Lećmy!&amp;quot;, aby uruchomić symulator. Możesz skonfigurować więcej opcji za pomocą graficznego programu uruchamiającego. Zobacz [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program oficjalną instrukcję] po więcej szczegółów.&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGeara z wiersza poleceń, uruchom aplikację Terminal i wpisz następujące polecenia.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options.....&lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawione w systemie macOS. Jeśli chcesz samodzielnie określić te zmienne do użycia w wierszu poleceń, uruchom następujące polecenia w aplikacji Terminal:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu graficznego programu uruchamiającego będziesz mieć alias do [[Pl/$FG_ROOT|$FG_ROOT]] w ścieżce &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt;, dzięki czemu możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara użytkownicy komputerów Mac mogą zlokalizować swój folder [[Pl/$FG_ROOT|$FG_ROOT]], otwierając folder Aplikacje w Finderze, klikając prawym przyciskiem myszy FlightGear i wybierając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do wnętrza folderu FlightGear. Masz teraz dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowe statki powietrzne]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja ze źródeł ===&lt;br /&gt;
Główny artykuł: [[Building FlightGear|Kompilacja FlightGeara]]&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie scenerii ===&lt;br /&gt;
Z FlightGearem instalowany jest ograniczony zestaw [[scenery|scenerii]]. Dla FlightGear 2024.1 składa się on z:&lt;br /&gt;
* obszaru wokół wyróżnionego lotniska dla tej wersji, czyli [[Keflavik_Airport|Międzynarodowego Portu Lotniczego Keflavik]] (BIKF)&lt;br /&gt;
* lotniska używanego w samouczku dla [[Pl/Cessna 172P|Cessny 172P]], czyli [[Hilo_International_Airport|Międzynarodowego Portu Lotniczego Hilo]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest zazwyczaj przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i dzieli się na trzy rodzaje danych:&lt;br /&gt;
* '''Airports''' zawiera dane o lotniskach, takie jak wykorzystanie pasów startowych i miejsca postojowe.&lt;br /&gt;
* '''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp., które reprezentują trójwymiarowe struktury.&lt;br /&gt;
* '''Terrain''' reprezentuje kontury, wzniesienia i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Obecnym sposobem &amp;quot;instalowania&amp;quot; nowej scenerii jest włączenie [[TerraSync]], które automatycznie pobierze i zaktualizuje każde odwiedzane miejsce - nawet w locie! Jeśli masz wolne połączenie internetowe i/lub wolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz ręcznie pobrać i zainstalować nowe części scenerii, oficjalną [[World Scenery|scenerię świata]] lub niestandardową scenerię.&lt;br /&gt;
&lt;br /&gt;
Sceneria jest również dostępna na [https://www.flightgear.org/download/mirrors/ stronie mirrorów] witryny FlightGear i można ją zainstalować, postępując zgodnie z instrukcją [[Howto: Install scenery|Jak zainstalować scenerię]]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabymi komputerami!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowa sceneria jest dostępna w wielu miejscach. Na przykład na {{forum link|f=5|text=forum FlightGear}} lub w repozytoriach. Wyszukiwanie w Internecie powinno pozwolić je znaleźć. Zobacz stronę [[Suggested_custom_scenery|sugerowanej niestandardowej scenerii]] po kilka najnowszych wydań.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS i nowsze dodały eksperymentalną obsługę trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz notatki o [[OSM2City 1st Worldbuild|1. światowej kompilacji OSM2City]] (marzec 2021). Ręczne pobieranie struktur 3D dla regionów lub całych krajów jest dostępne na stronie wiki z [[Areas populated with osm2city scenery|pobraniami osm2City]].&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie statków powietrznych ===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|statki powietrzne]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz przejść na stronę internetową FlightGeara i przejść do strony [http://www.flightgear.org/download/ pobierania], a następnie wybrać link do pobrania statków powietrznych pasujący do Twojej wersji FlightGeara. Ponadto istnieje wiele [[hangars|hangarów]] innych firm. Informacje o instalacji znajdziesz w [[Pl/Instalowanie samolotów|Jak zainstalować statek powietrzny]].&lt;br /&gt;
&lt;br /&gt;
== Uruchamianie FlightGeara ==&lt;br /&gt;
=== Uruchamianie FlightGeara ===&lt;br /&gt;
Najłatwiejszym sposobem uruchomienia FlightGeara jest użycie ikony na pulpicie. Uruchamia to interfejs graficzny [[FlightGear Qt launcher|Launchera]], w którym możesz wybrać statek powietrzny, pozycję startową itp. &amp;lt;!-- Poniższe przypomnienie powinno zostać usunięte, gdy program uruchamiający jasno określi, że są dodatkowe rzeczy do załatwienia za pomocą menu w symulatorze, aby skonfigurować FG --&amp;gt; Pamiętaj, że Launcher ma tylko podstawowe opcje, aby Ci pomóc. Wiele opcji dotyczących grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input_device|urządzeń wejściowych]] itp. jest dostępnych z [[menu|menu]] wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników wybiera jednak uruchamianie FlightGeara bezpośrednio z wiersza poleceń. Nazwa pliku wykonywalnego to &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; (lub plik AppImage, np. &amp;quot;flightgear-2024.1.6-linux-amd64.AppImage&amp;quot;) i można go uruchomić bez opcji. Jeśli &amp;quot;nie został znaleziony&amp;quot;, prawdopodobnie nie znajduje się w Twojej [https://en.wikipedia.org/wiki/PATH_(variable) ścieżce]. Lokalizacja zależy od Twojego konkretnego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|parametrów wiersza poleceń]], których należy użyć do zmiany wielu opcji, takich jak wybrany statek powietrzny. Najważniejsze z nich:&lt;br /&gt;
&lt;br /&gt;
 fgfs --launcher                # otwiera Launcher FlightGeara&lt;br /&gt;
 fgfs --show-aircraft           # wyświetla listę zainstalowanych statków powietrznych&lt;br /&gt;
 fgfs --aircraft=c172p          # uruchamia FG z statkiem powietrznym &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Launcher umożliwia również użytkownikom dodawanie parametrów wiersza poleceń dla opcji, które są zwykle zmieniane z poziomu menu wewnątrz symulatora, a także dość zaawansowanych opcji dostępnych tylko z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguracja renderowania i interfejsu użytkownika ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|Okno dialogowe Widok &amp;gt; Opcje renderowania.]]&lt;br /&gt;
Jeśli jakość renderowania lub liczba klatek na sekundę jest zbyt niska, kliknij &amp;quot;Widok &amp;gt; Opcje renderowania&amp;quot;, aby dostosować ustawienia graficzne. Dla nowszego sprzętu zaleca się ustawienie &amp;quot;jakości grafiki&amp;quot; na wysoką i zaznaczenie &amp;quot;użyj miejsca na dysku dla szybszego ładowania&amp;quot;, &amp;quot;animowane rękawy&amp;quot; i &amp;quot;satelitarna fotosceneria&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli tekst menu wydaje się zbyt mały na ekranach o wysokiej rozdzielczości lub dużych ekranach, możesz ręcznie [[Menubar#How to Change the Default Menubar Font Size|zmienić rozmiar czcionki paska menu]], edytując plik danych, lub po prostu kliknąć &amp;quot;Debuguj &amp;gt; Zmień styl GUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Używanie klawiatury i/lub myszy ===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[joystick|joysticka]] lub innych kontrolerów czasami używają klawiatury lub myszy do sterowania swoim statkiem powietrznym. Używanie klawiatury do latania może być trudne, a mysz jest zalecana zamiast klawiatury do latania, jednak nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać pomoc dotyczącą poleceń klawiatury, gdy FlightGear jest uruchomiony, przejdź do menu ''Pomoc'', spójrz w ''Podstawowe klawisze'' (dla poleceń związanych z symulatorem), ''Wspólne klawisze statków powietrznych'' (dla poleceń uniwersalnych dla wszystkich statków powietrznych) i ''Pomoc dla statku powietrznego'' (dla poleceń specyficznych dla Twojego statku). Jeśli główne menu jest ukryte, naciśnij {{key press|F10}}. Jeśli przychodzisz z innych symulatorów, sprawdź [[key commands compared to other simulators|porównanie poleceń klawiatury z innymi symulatorami]], aby uzyskać przegląd różnic między poleceniami klawiatury tego symulatora a FlightGear.&lt;br /&gt;
&lt;br /&gt;
Aby użyć myszy do latania statkiem powietrznym, naciśnij {{key press|Tab}} (kursor powinien zmienić się w krzyżyk) i przesuwaj myszą, aby kierować statkiem powietrznym. Naciśnij ponownie {{key press|Tab}}, aby rozglądać się (kursor powinien pokazywać dwustronną strzałkę), i naciśnij {{key press|Tab}} ponownie, aby wrócić do trybu normalnego, używanego do klikania elementów w kokpicie. Możesz kliknąć &amp;quot;Plik &amp;gt; Urządzenia wejściowe &amp;gt; Konfiguracja myszy&amp;quot;, aby dostosować czułość myszy.&lt;br /&gt;
&lt;br /&gt;
Dla większości użytkowników nieposiadających kontroli osi steru kierunku, trudno jest ręcznie koordynować ruchy [[aileron|lotki]] i [[rudder|steru kierunku]] podczas zakrętu. Aby włączyć autokoordynację i ułatwić latanie, możesz kliknąć &amp;quot;Ustawienia&amp;quot;, następnie kliknąć przycisk &amp;quot;Pokaż więcej&amp;quot; po prawej stronie &amp;quot;Ogólne&amp;quot;, a na końcu kliknąć &amp;quot;Włącz autokoordynację&amp;quot; w Launcherze.&lt;br /&gt;
&lt;br /&gt;
=== Pierwszy raz w kokpicie ===&lt;br /&gt;
Orientacja w kokpicie może być wyzwaniem za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Możesz użyć {{key press|Ctrl|V}}, aby przełączyć się na widok kokpitu. Jeśli tekst na panelu jest zbyt mały, możesz użyć trybu widoku myszy (naciśnij Tab, aż uzyskasz kursor w kształcie podwójnej strzałki), aby przesuwać widok, i kółko myszy, aby przybliżać, lub przesuwać widok za pomocą czapki joysticka i przybliżać za pomocą {{key press|X}} i {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wielu podejmuje po wejściu do nieznanego kokpitu, jest naciśnięcie {{key press|Ctrl|C}} w celu podświetlenia wszystkich &amp;quot;gorących punktów&amp;quot;, czyli elementów sterujących przyrządami, przycisków, pokręteł itp. Wiele statków powietrznych oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik lub iskrowniki, mogą być trudne w użyciu lub po prostu nie mieć klikalnych &amp;quot;gorących punktów&amp;quot;, zwłaszcza w modelach statków powietrznych w fazie rozwoju. W większości przypadków możesz użyć klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu &amp;quot;Pomoc &amp;gt; Pomoc dla statku powietrznego&amp;quot; lub &amp;quot;Pomoc &amp;gt; Wspólne klawisze statków powietrznych&amp;quot;, ale czasami niektóre klawisze są przypisywane ponownie przez statek powietrzny lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
=== Uruchamianie silnika ===&lt;br /&gt;
Chcesz już lecieć, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Większość statków powietrznych ma wpis ''autostart'' w swoim niestandardowym menu, ale oto ogólna procedura, która powinna działać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem tłokowym, potrzebujesz (po upewnieniu się, że gra nie jest wstrzymana {{key press|p}}):&lt;br /&gt;
# Paliwo: niektóre statki powietrzne rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
# Prawidłowa mieszanka paliwowa: zazwyczaj jest ''bogata'', więc wciśnij czerwony pokrętło do samego końca lub użyj klawisza {{key press|m}}, aby wzbogacić ({{key press|Shift|m}} zuboża).&lt;br /&gt;
# Iskrowniki ustawione na ''Both'': obróć kluczyk lub naciśnij {{key press|&amp;amp;#125;}} trzy razy, aby przejść przez ''R'', ''L'' do ''Both''.&lt;br /&gt;
# Przepustnica: niektóre silniki lepiej uruchamiają się przy odrobinie gazu.&lt;br /&gt;
# Uruchom rozrusznik: kliknij pozycję ''Start'' kluczyka na panelu lub naciśnij {{key press|s}}. Przytrzymaj rozrusznik przez wystarczający czas, nawet 10 sekund.&lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w statku powietrznym z wieloma silnikami jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że musisz powtórzyć tę samą sekwencję rozruchu dla każdego silnika. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: naciśnij {{key press|~}} i cała powyższa procedura zadziała dla wszystkich silników. Należy jednak pamiętać, że domyślny panel 2D jest podłączony do ''tylko jednego silnika'' i sztuczka z {{key press|~}} może nie zadziałać. Dodaj też trochę gazu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla odrzutowców, śmigłowców lub innych typów statków powietrznych o złożonych procedurach rozruchu. Sprawdź instrukcje w menu pomocy statku powietrznego (naciśnij {{key press|?}}) i/lub spójrz na [[Aircraft|artykuł o tym statku powietrznym na tej wiki]]. Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem odrzutowym, musisz:&lt;br /&gt;
# Ustawić odcięcie ''ON''&lt;br /&gt;
# Włączyć rozrusznik&lt;br /&gt;
# Gdy silniki osiągną około 5% N1, ustawić odcięcie ''OFF''&lt;br /&gt;
# Wyłączyć rozrusznik, gdy silnik osiągnie prędkość roboczą&lt;br /&gt;
&lt;br /&gt;
== Nauka latania ==&lt;br /&gt;
=== Podręcznik FlightGear ===&lt;br /&gt;
FlightGear ma oficjalny [https://www.flightgear.org/support/manual/ podręcznik], który obejmuje podstawy latania. Jako początkujący, możesz chcieć zacząć od [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/pl/HTML/getstart-plch8.html Rozdziału 8: Podstawowy poradnik symulatora lotu].&lt;br /&gt;
&lt;br /&gt;
=== Samouczki ===&lt;br /&gt;
Wiele statków powietrznych ma własne interaktywne [[tutorials|samouczki]]. Dzięki samouczkom możesz nauczyć się obsługiwać konkretny statek powietrzny, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczków, przechodząc do ''Pomoc'' &amp;amp;gt; ''Samouczek''. Świetnym miejscem na rozpoczęcie jest samouczek dla statku powietrznego [[Cessna 172P]], powszechnie używanego w rzeczywistości do nauki latania statkami powietrznymi o stałych skrzydłach.&lt;br /&gt;
&lt;br /&gt;
Jeśli samouczek zaczyna się bez pasa startowego i w otoczeniu wody, Twoja instalacja FlightGeara nie ma scenerii dla lotniska, na którym samouczek miał się odbyć. Aby uzyskać scenerię, zobacz sekcję [[#Getting scenery|#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
== Twój pierwszy lot ==&lt;br /&gt;
=== Realizm ===&lt;br /&gt;
Jednym z najczęstszych pytań, jakie zadają początkujący piloci na temat każdego symulatora lotu, ale zwłaszcza FlightGeara, jest &amp;quot;Dlaczego mój statek powietrzny cały czas skręca w lewo?&amp;quot; Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobne jest, że wynika to z [[Understanding Propeller Torque and P-Factor|momentu obrotowego śmigła i efektu P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo haseł marketingowych głoszących co innego, niektóre ustawienia są obniżone, aby statek powietrzny był łatwiejszy w pilotażu. Zmniejsza to efekty takie jak powyższy. Realizm we FlightGear jest zawsze podkręcony do maksimum.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre punkty realizmu FlightGeara, które mogą dezorientować początkujących pilotów:&lt;br /&gt;
* &amp;quot;Syndrom skręcania w lewo&amp;quot; z wyżej wymienionych powodów.&lt;br /&gt;
* Błąd skrętu kompasu: Kompas, poddany siłom lotu, ma tendencję do skręcania w przeciwnym kierunku na krótki okres, zanim ustabilizuje się na prawidłowym kursie. Nie jest to usterka (zobacz także artykuł Wikipedii {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* Wskaźnik prędkości pionowej (VSI) również jest obarczony błędem.&lt;br /&gt;
* [[Horizontal Situation Indicator|Wskaźnik sytuacji poziomej]] (HSI) jest napędzany przez żyroskop (dlatego czasami nazywa się go żyroskopem kierunkowym), który podlega ''dryfowi żyroskopowemu''. Wskaźnik będzie odchylać się od aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
* Nie możesz po prostu przerwać skrętu lub wznoszenia poprzez wycentrowanie drążka lub pałki sterowniczej. Musisz skręcić lub popchnąć drążek w drugą stronę, aby wrócić do lotu poziomego. Ale nawet wtedy samolot nie utrzyma samodzielnie swojej wysokości ani kursu. Częstym błędem jest próba znalezienia pozycji drążka, przy której można puścić stery. Chociaż za pomocą trymowania można zostawić samolot na kilka sekund, trzeba użyć autopilota lub stale regulować drążek.&lt;br /&gt;
&lt;br /&gt;
Na statek powietrzny w locie działa wiele sił, a także na [[avionics and instruments|awionikę i przyrządy]] używane do sterowania i nawigacji, co może być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy przyrządów, które istnieją w rzeczywistym świecie''. Jeśli nie chcesz tego, naciśnij {{key press|h}}, aby włączyć HUD.&lt;br /&gt;
&lt;br /&gt;
=== Lotniska i pomoce nawigacyjne ===&lt;br /&gt;
Gdy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z interfejsu Launchera, możesz zastanawiać się, jak określić, jakie lotniska są dostępne. Program uruchamiający wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS|ILS]]. Nie znajdziesz mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Zobacz [[Getting aeronautical charts|Pozyskiwanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
W symulatorze dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;amp;gt; ''Wyposażenie'' &amp;amp;gt; ''Mapa'', która pozwoli Ci zobaczyć dane nawigacyjne oraz pozycję lotnisk i pomocy. Aby uzyskać więcej pomocy dotyczącej nawigacji, zobacz [[Understanding navigation|Zrozumienie nawigacji]].&lt;br /&gt;
&lt;br /&gt;
=== Latanie z autopilotem ===&lt;br /&gt;
Ogólny [[autopilot|autopilot]] jest dostępny w menu ''Autopilot &amp;gt; Ustawienia autopilota'', podczas gdy wiele statków powietrznych ma własny ''specyficzny'' autopilot, często będący modelem rzeczywistego.&lt;br /&gt;
&lt;br /&gt;
W przypadku statków powietrznych, które mają własny autopilot, powinieneś używać elementów sterujących autopilotem dostępnych w wirtualnym kokpicie. Oznacza to klikanie na panelu przyrządów w wirtualnym kokpicie. Menu Autopilot może być wyszarzone i niedostępne, gdy statek powietrzny dostarcza własny autopilot w niektórych statkach powietrznych, w tym Airbuses i [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172 jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilot Bendix/King KAP140]] w swoim wirtualnym kokpicie. Możesz używać zarówno urządzenia autopilota w kokpicie, jak i [[Autopilot#Autopilot Settings|ustawień autopilota]] z menu.&lt;br /&gt;
&lt;br /&gt;
== Zaawansowane ==&lt;br /&gt;
=== Latanie ===&lt;br /&gt;
{{Main article|Pl/Samoloty|Statki powietrzne}}&lt;br /&gt;
&lt;br /&gt;
* Jeśli nadal latasz lekkimi cywilnymi statkami powietrznymi, [[Cessna 182S]], która jest bardziej złożona niż C172P, oraz [[Piper PA28 Warrior II|PA28]] to dobre wybory.&lt;br /&gt;
* Jeśli interesuje Cię latanie liniami lotniczymi, sugeruje się rodziny [[Airbus A320 family|Airbus A320]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] i [[MD-80]].&lt;br /&gt;
* Jeśli fascynują Cię samoloty myśliwskie, wybierz wysoko oceniany wojskowy statek powietrzny (taki jak [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) z [[Aircraft#Modern military aircraft|tej listy]] i włącz obrażenia w trybie wieloosobowym lub zainstaluj [[Bombable]].&lt;br /&gt;
* Jeśli przechodzisz na śmigłowce, zaleca się latanie [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Oprócz zwykłych statków powietrznych dostępne są również szczegółowe [[Space Shuttle|wahadłowce kosmiczne]].&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
Fascynujące jest odkrywanie [[scenery|scenerii]] (lub po prostu testowanie grafiki/szybkości klatek) za pomocą [[UFO|UFO]]. Po pierwsze, [[#Configuring rendering and UI|zwiększ swoją jakość grafiki]]. Jeśli początkowo nie widzisz budynków, pozostaw FG otwarte i odczekaj chwilę, aż [[TerraSync]] zakończy pobieranie i budynki się pojawią.&lt;br /&gt;
Istnieje wiele [[Suggested airports|dobrze rozwiniętych lotnisk]] i obszarów scenerii. Możesz również eksplorować obiekty scenerii na [https://scenery.flightgear.org/map mapie modeli].&lt;br /&gt;
&lt;br /&gt;
=== Tryb wieloosobowy ===&lt;br /&gt;
FlightGear ma kilka serwerów wieloosobowych, które pozwolą Ci latać w bardziej ożywionych przestworzach; zobacz [[Howto: Multiplayer|Tryb wieloosobowy]]. Istnieją również [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Dostępna jest również [[MPMap|mapa wieloosobowa]], która pozwala zobaczyć, kto jest aktualnie online, a nawet jakie [[navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
=== Elementy menu ===&lt;br /&gt;
Aby szybko zapoznać się z użyciem każdej pozycji menu w FlightGear, zobacz [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
FlightGear ma wiele [[Addon|dodatków]] innych firm zawierających ulepszenia. Dla początkujących, [[Logbook Add-on|Dziennik lotów]] i dodatek [[Which Runway Add-on|Który pas]] mogą być najbardziej przydatnymi dodatkami.&lt;br /&gt;
&lt;br /&gt;
== Społeczność FlightGear ==&lt;br /&gt;
=== Uzyskiwanie pomocy ===&lt;br /&gt;
Ta strona została zaprojektowana, aby zapewnić użytkownikowi najważniejsze informacje, które musi wiedzieć o korzystaniu z FlightGeara po raz pierwszy. Oprócz [[Pl/Portal:Użytkownik|portalu użytkownika]] tej wiki, istnieją inne strony, które możesz chcieć przeczytać:&lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...oraz kanały komunikacji, które mogą być używane do uzyskania informacji lub poproszenia o pomoc:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''obowiązkowa lektura'' dla początkujących;&lt;br /&gt;
*{{forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord FlightGear]], najszybszy sposób na uzyskanie pomocy;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa użytkowników FlightGeara]], największa szansa na kontakt z głównymi deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydaniowego.&lt;br /&gt;
&lt;br /&gt;
=== Dostosowywanie FlightGear bez kompilacji ===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje prekompilowane pliki binarne do pobrania i instalacji na Windows, macOS i Linux. Ponadto większość dystrybucji Linuksa udostępnia spakowaną wersję w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGear jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i jesteś zachęcany'' do wprowadzania zmian w modelach lotu statków powietrznych, scenerii, teksturach, [[shader|shaderach]] OpenGL i każdej innej funkcji, którą chcesz zmienić dla własnej satysfakcji lub podzielić się z innymi użytkownikami FlightGeara. Jeśli to zamierzasz zrobić, spójrz na [[Pl/Portal:Developer|portal dewelopera]].&lt;br /&gt;
&lt;br /&gt;
=== Jak możesz pomóc ===&lt;br /&gt;
{{Main article|Volunteer|Wolontariusz}}&lt;br /&gt;
FlightGear to projekt open source, oparty na wolontariacie. Oznacza to, że wszystko, co tu znajdziesz, pochodzi z pasji, wolnego czasu i niczego więcej. Obejmuje to symulator, scenerię, statki powietrzne, wiki, {{forum link|text=forum}} i wszystko inne. Wolontariusze, w istocie ''ludzie, którzy coś robią'', są fundamentalni dla tego projektu. Bez nich nie zrobiłby ani jednego kroku do przodu. Dlatego ważne jest, aby współtwórcy dobrze się bawili tym, co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść wkład w ten projekt, powinieneś zapoznać się z kilkoma artykułami, które dadzą Ci pewne wskazówki:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Jak zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Dziedzin, w których ich pomoc byłaby doceniona, jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Skompiluj]] najnowszy kod Git&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj raporty o błędach]&lt;br /&gt;
*Uruchamianie FlightGeara za pomocą programu valgrind w celu wykrycia wycieków pamięci&lt;br /&gt;
&lt;br /&gt;
;Wsparcie:&lt;br /&gt;
*Pomoc nowym użytkownikom w pobieraniu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara ({{forum link|text=na forum}} lub na [[Discord|Discordzie]])&lt;br /&gt;
*Dostarczanie pomysłów i sugestii, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje / Propozycje / Pomysły]]&lt;br /&gt;
*Pomoc w [[Portal:Wiki|oczyszczeniu tej wiki]]&lt;br /&gt;
*Pomoc w dostarczaniu nowych treści dla brakujących stron wiki&lt;br /&gt;
&lt;br /&gt;
;Rozwój:&lt;br /&gt;
*Podstawowy kod źródłowy:&lt;br /&gt;
**Dostarczanie [[Howto:Start core development|wkładu w kod źródłowy, dane i dokumentację]]&lt;br /&gt;
**Dostarczanie [[Bugs|poprawek błędów]] lub nowych funkcji&lt;br /&gt;
*Rozwój statków powietrznych (modelowanie 3D, tekstury, modele lotu, skrypty)&lt;br /&gt;
*Rozwój scenerii (teren, modele, pogoda)&lt;br /&gt;
*Zaangażowanie w którykolwiek z innych projektów powiązanych z FlightGearem&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145100</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145100"/>
		<updated>2026-06-17T13:01:08Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Pierwszy raz w kokpicie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Postaramy się pomóc Ci wzbić się w wirtualne powietrze w najkrótszym możliwym czasie. Przedstawimy Ci również niektóre funkcje tego symulatora lotu oraz kilka informacji o jego społeczności.&lt;br /&gt;
&lt;br /&gt;
== Instalacja i konfiguracja ==&lt;br /&gt;
=== Wymagania sprzętowe ===&lt;br /&gt;
Aby FlightGear działał płynnie, wymaga karty graficznej ze sterownikami OpenGL 4.0 lub nowszymi. Zwykle nie stanowi to problemu, ale zapoznaj się z [[Pl/Wymagania_sprzętowe|zaleceniami sprzętowymi]], aby lepiej to zrozumieć.&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie FlightGeara ===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze strony [https://www.flightgear.org/download/ Pobieranie FlightGear]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego systemu. Dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuksa dla wersji 2020.3 LTS i nowszych. Większość użytkowników Linuksa odkryje, że większość dystrybucji ma spakowaną wersję FlightGeara (nazwa pakietu może brzmieć &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twoich umiejętności technicznych możesz wybrać deweloperską wersję [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre najnowsze rozwijane statki powietrzne, ale może być niestabilna i jest bardziej skomplikowana do zdobycia dla użytkowników innych niż Windows. Ogólnie rzecz biorąc, wersja deweloperska nie jest zalecana dla przeciętnego użytkownika, ale jeśli chcesz przeprowadzić kilka testów, dostępna jest wersja nocna do [https://www.flightgear.org/download/nightly/ pobrania]. Jeśli używasz kopii FlightGeara kontrolowanej przez system Git, możesz zsynchronizować swoje statki powietrzne za pomocą kontrolowanego przez system repozytorium rozwojowego statków powietrznych [[Pl/FGAddon|FGAddon]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie Windows ===&lt;br /&gt;
Po pobraniu instalatora uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen w systemie Windows może zablokować instalację po prostu dlatego, że plik binarny nie jest podpisany kluczem, który Microsoft uznaje. Oczywiście klucz jest płatny. W takim przypadku musimy kliknąć niepozorny link &amp;quot;Więcej informacji&amp;quot;. Dopiero wtedy pojawi się przycisk &amp;quot;Uruchom mimo to&amp;quot;. Możesz bezpiecznie zaufać, że nie jest to niebezpieczna aplikacja, pod warunkiem, że pobrałeś ją z oficjalnych źródeł.&lt;br /&gt;
&lt;br /&gt;
Jeśli z jakiegoś powodu używasz oprogramowania antywirusowego innej firmy, może ono blokować instalację FlightGeara. Nie jest to coś, na co mamy wpływ, więc to od Ciebie zależy, jak chcesz to rozwiązać.&lt;br /&gt;
&lt;br /&gt;
Za pomocą instalatora Windows możesz wybrać miejsce instalacji FlightGeara. Katalog [[Pl/$FG_ROOT|$FG_ROOT]] będzie miał ścieżkę &amp;lt;code&amp;gt;&amp;amp;lt;wybrany katalog&amp;amp;gt;/fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie macOS ===&lt;br /&gt;
Instalacja FlightGeara w systemie macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGeara do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Gdy uruchamiasz FlightGeara po raz pierwszy, jego ikona w Docku podskakuje przez kilka sekund podczas ładowania informacji o statkach powietrznych i lotniskach. Gdy pojawi się graficzny program uruchamiający, wybierz statek powietrzny i lotnisko, a następnie kliknij &amp;quot;Lećmy!&amp;quot;, aby uruchomić symulator. Możesz skonfigurować więcej opcji za pomocą graficznego programu uruchamiającego. Zobacz [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program oficjalną instrukcję] po więcej szczegółów.&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGeara z wiersza poleceń, uruchom aplikację Terminal i wpisz następujące polecenia.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options.....&lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawione w systemie macOS. Jeśli chcesz samodzielnie określić te zmienne do użycia w wierszu poleceń, uruchom następujące polecenia w aplikacji Terminal:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu graficznego programu uruchamiającego będziesz mieć alias do [[Pl/$FG_ROOT|$FG_ROOT]] w ścieżce &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt;, dzięki czemu możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara użytkownicy komputerów Mac mogą zlokalizować swój folder [[Pl/$FG_ROOT|$FG_ROOT]], otwierając folder Aplikacje w Finderze, klikając prawym przyciskiem myszy FlightGear i wybierając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do wnętrza folderu FlightGear. Masz teraz dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowe statki powietrzne]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja ze źródeł ===&lt;br /&gt;
Główny artykuł: [[Building FlightGear|Kompilacja FlightGeara]]&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie scenerii ===&lt;br /&gt;
Z FlightGearem instalowany jest ograniczony zestaw [[scenery|scenerii]]. Dla FlightGear 2024.1 składa się on z:&lt;br /&gt;
* obszaru wokół wyróżnionego lotniska dla tej wersji, czyli [[Keflavik_Airport|Międzynarodowego Portu Lotniczego Keflavik]] (BIKF)&lt;br /&gt;
* lotniska używanego w samouczku dla [[Pl/Cessna 172P|Cessny 172P]], czyli [[Hilo_International_Airport|Międzynarodowego Portu Lotniczego Hilo]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest zazwyczaj przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i dzieli się na trzy rodzaje danych:&lt;br /&gt;
* '''Airports''' zawiera dane o lotniskach, takie jak wykorzystanie pasów startowych i miejsca postojowe.&lt;br /&gt;
* '''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp., które reprezentują trójwymiarowe struktury.&lt;br /&gt;
* '''Terrain''' reprezentuje kontury, wzniesienia i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Obecnym sposobem &amp;quot;instalowania&amp;quot; nowej scenerii jest włączenie [[TerraSync]], które automatycznie pobierze i zaktualizuje każde odwiedzane miejsce - nawet w locie! Jeśli masz wolne połączenie internetowe i/lub wolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz ręcznie pobrać i zainstalować nowe części scenerii, oficjalną [[World Scenery|scenerię świata]] lub niestandardową scenerię.&lt;br /&gt;
&lt;br /&gt;
Sceneria jest również dostępna na [https://www.flightgear.org/download/mirrors/ stronie mirrorów] witryny FlightGear i można ją zainstalować, postępując zgodnie z instrukcją [[Howto: Install scenery|Jak zainstalować scenerię]]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabymi komputerami!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowa sceneria jest dostępna w wielu miejscach. Na przykład na {{forum link|f=5|text=forum FlightGear}} lub w repozytoriach. Wyszukiwanie w Internecie powinno pozwolić je znaleźć. Zobacz stronę [[Suggested_custom_scenery|sugerowanej niestandardowej scenerii]] po kilka najnowszych wydań.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS i nowsze dodały eksperymentalną obsługę trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz notatki o [[OSM2City 1st Worldbuild|1. światowej kompilacji OSM2City]] (marzec 2021). Ręczne pobieranie struktur 3D dla regionów lub całych krajów jest dostępne na stronie wiki z [[Areas populated with osm2city scenery|pobraniami osm2City]].&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie statków powietrznych ===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|statki powietrzne]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz przejść na stronę internetową FlightGeara i przejść do strony [http://www.flightgear.org/download/ pobierania], a następnie wybrać link do pobrania statków powietrznych pasujący do Twojej wersji FlightGeara. Ponadto istnieje wiele [[hangars|hangarów]] innych firm. Informacje o instalacji znajdziesz w [[Pl/Instalowanie samolotów|Jak zainstalować statek powietrzny]].&lt;br /&gt;
&lt;br /&gt;
== Uruchamianie FlightGeara ==&lt;br /&gt;
=== Uruchamianie FlightGeara ===&lt;br /&gt;
Najłatwiejszym sposobem uruchomienia FlightGeara jest użycie ikony na pulpicie. Uruchamia to interfejs graficzny [[FlightGear Qt launcher|Launchera]], w którym możesz wybrać statek powietrzny, pozycję startową itp. &amp;lt;!-- Poniższe przypomnienie powinno zostać usunięte, gdy program uruchamiający jasno określi, że są dodatkowe rzeczy do załatwienia za pomocą menu w symulatorze, aby skonfigurować FG --&amp;gt; Pamiętaj, że Launcher ma tylko podstawowe opcje, aby Ci pomóc. Wiele opcji dotyczących grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input_device|urządzeń wejściowych]] itp. jest dostępnych z [[menu|menu]] wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników wybiera jednak uruchamianie FlightGeara bezpośrednio z wiersza poleceń. Nazwa pliku wykonywalnego to &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; (lub plik AppImage, np. &amp;quot;flightgear-2024.1.6-linux-amd64.AppImage&amp;quot;) i można go uruchomić bez opcji. Jeśli &amp;quot;nie został znaleziony&amp;quot;, prawdopodobnie nie znajduje się w Twojej [https://en.wikipedia.org/wiki/PATH_(variable) ścieżce]. Lokalizacja zależy od Twojego konkretnego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|parametrów wiersza poleceń]], których należy użyć do zmiany wielu opcji, takich jak wybrany statek powietrzny. Najważniejsze z nich:&lt;br /&gt;
&lt;br /&gt;
 fgfs --launcher                # otwiera Launcher FlightGeara&lt;br /&gt;
 fgfs --show-aircraft           # wyświetla listę zainstalowanych statków powietrznych&lt;br /&gt;
 fgfs --aircraft=c172p          # uruchamia FG z statkiem powietrznym &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Launcher umożliwia również użytkownikom dodawanie parametrów wiersza poleceń dla opcji, które są zwykle zmieniane z poziomu menu wewnątrz symulatora, a także dość zaawansowanych opcji dostępnych tylko z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguracja renderowania i interfejsu użytkownika ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|Okno dialogowe Widok &amp;gt; Opcje renderowania.]]&lt;br /&gt;
Jeśli jakość renderowania lub liczba klatek na sekundę jest zbyt niska, kliknij &amp;quot;Widok &amp;gt; Opcje renderowania&amp;quot;, aby dostosować ustawienia graficzne. Dla nowszego sprzętu zaleca się ustawienie &amp;quot;jakości grafiki&amp;quot; na wysoką i zaznaczenie &amp;quot;użyj miejsca na dysku dla szybszego ładowania&amp;quot;, &amp;quot;animowane rękawy&amp;quot; i &amp;quot;satelitarna fotosceneria&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli tekst menu wydaje się zbyt mały na ekranach o wysokiej rozdzielczości lub dużych ekranach, możesz ręcznie [[Menubar#How to Change the Default Menubar Font Size|zmienić rozmiar czcionki paska menu]], edytując plik danych, lub po prostu kliknąć &amp;quot;Debuguj &amp;gt; Zmień styl GUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Używanie klawiatury i/lub myszy ===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[joystick|joysticka]] lub innych kontrolerów czasami używają klawiatury lub myszy do sterowania swoim statkiem powietrznym. Używanie klawiatury do latania może być trudne, a mysz jest zalecana zamiast klawiatury do latania, jednak nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać pomoc dotyczącą poleceń klawiatury, gdy FlightGear jest uruchomiony, przejdź do menu ''Pomoc'', spójrz w ''Podstawowe klawisze'' (dla poleceń związanych z symulatorem), ''Wspólne klawisze statków powietrznych'' (dla poleceń uniwersalnych dla wszystkich statków powietrznych) i ''Pomoc dla statku powietrznego'' (dla poleceń specyficznych dla Twojego statku). Jeśli główne menu jest ukryte, naciśnij {{key press|F10}}. Jeśli przychodzisz z innych symulatorów, sprawdź [[key commands compared to other simulators|porównanie poleceń klawiatury z innymi symulatorami]], aby uzyskać przegląd różnic między poleceniami klawiatury tego symulatora a FlightGear.&lt;br /&gt;
&lt;br /&gt;
Aby użyć myszy do latania statkiem powietrznym, naciśnij {{key press|Tab}} (kursor powinien zmienić się w krzyżyk) i przesuwaj myszą, aby kierować statkiem powietrznym. Naciśnij ponownie {{key press|Tab}}, aby rozglądać się (kursor powinien pokazywać dwustronną strzałkę), i naciśnij {{key press|Tab}} ponownie, aby wrócić do trybu normalnego, używanego do klikania elementów w kokpicie. Możesz kliknąć &amp;quot;Plik &amp;gt; Urządzenia wejściowe &amp;gt; Konfiguracja myszy&amp;quot;, aby dostosować czułość myszy.&lt;br /&gt;
&lt;br /&gt;
Dla większości użytkowników nieposiadających kontroli osi steru kierunku, trudno jest ręcznie koordynować ruchy [[aileron|lotki]] i [[rudder|steru kierunku]] podczas zakrętu. Aby włączyć autokoordynację i ułatwić latanie, możesz kliknąć &amp;quot;Ustawienia&amp;quot;, następnie kliknąć przycisk &amp;quot;Pokaż więcej&amp;quot; po prawej stronie &amp;quot;Ogólne&amp;quot;, a na końcu kliknąć &amp;quot;Włącz autokoordynację&amp;quot; w Launcherze.&lt;br /&gt;
&lt;br /&gt;
=== Pierwszy raz w kokpicie ===&lt;br /&gt;
Orientacja w kokpicie może być wyzwaniem za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Możesz użyć {{key press|Ctrl|V}}, aby przełączyć się na widok kokpitu. Jeśli tekst na panelu jest zbyt mały, możesz użyć trybu widoku myszy (naciśnij Tab, aż uzyskasz kursor w kształcie podwójnej strzałki), aby przesuwać widok, i kółko myszy, aby przybliżać, lub przesuwać widok za pomocą czapki joysticka i przybliżać za pomocą {{key press|X}} i {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wielu podejmuje po wejściu do nieznanego kokpitu, jest naciśnięcie {{key press|Ctrl|C}} w celu podświetlenia wszystkich &amp;quot;gorących punktów&amp;quot;, czyli elementów sterujących przyrządami, przycisków, pokręteł itp. Wiele statków powietrznych oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik lub iskrowniki, mogą być trudne w użyciu lub po prostu nie mieć klikalnych &amp;quot;gorących punktów&amp;quot;, zwłaszcza w modelach statków powietrznych w fazie rozwoju. W większości przypadków możesz użyć klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu &amp;quot;Pomoc &amp;gt; Pomoc dla statku powietrznego&amp;quot; lub &amp;quot;Pomoc &amp;gt; Wspólne klawisze statków powietrznych&amp;quot;, ale czasami niektóre klawisze są przypisywane ponownie przez statek powietrzny lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
=== Uruchamianie silnika ===&lt;br /&gt;
Chcesz już lecieć, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Większość statków powietrznych ma wpis ''autostart'' w swoim niestandardowym menu, ale oto ogólna procedura, która powinna działać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem tłokowym, potrzebujesz (po upewnieniu się, że gra nie jest wstrzymana {{key press|p}}):&lt;br /&gt;
# Paliwo: niektóre statki powietrzne rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
# Prawidłowa mieszanka paliwowa: zazwyczaj jest ''bogata'', więc wciśnij czerwony pokrętło do samego końca lub użyj klawisza {{key press|m}}, aby wzbogacić ({{key press|Shift|m}} zuboża).&lt;br /&gt;
# Iskrowniki ustawione na ''Both'': obróć kluczyk lub naciśnij {{key press|&amp;amp;#125;}} trzy razy, aby przejść przez ''R'', ''L'' do ''Both''.&lt;br /&gt;
# Przepustnica: niektóre silniki lepiej uruchamiają się przy odrobinie gazu.&lt;br /&gt;
# Uruchom rozrusznik: kliknij pozycję ''Start'' kluczyka na panelu lub naciśnij {{key press|s}}. Przytrzymaj rozrusznik przez wystarczający czas, nawet 10 sekund.&lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w statku powietrznym z wieloma silnikami jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że musisz powtórzyć tę samą sekwencję rozruchu dla każdego silnika. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: naciśnij {{key press|~}} i cała powyższa procedura zadziała dla wszystkich silników. Należy jednak pamiętać, że domyślny panel 2D jest podłączony do ''tylko jednego silnika'' i sztuczka z {{key press|~}} może nie zadziałać. Dodaj też trochę gazu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla odrzutowców, śmigłowców lub innych typów statków powietrznych o złożonych procedurach rozruchu. Sprawdź instrukcje w menu pomocy statku powietrznego (naciśnij {{key press|?}}) i/lub spójrz na [[Aircraft|artykuł o tym statku powietrznym na tej wiki]]. Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem odrzutowym, musisz:&lt;br /&gt;
# Ustawić odcięcie ''ON''&lt;br /&gt;
# Włączyć rozrusznik&lt;br /&gt;
# Gdy silniki osiągną około 5% N1, ustawić odcięcie ''OFF''&lt;br /&gt;
# Wyłączyć rozrusznik, gdy silnik osiągnie prędkość roboczą&lt;br /&gt;
&lt;br /&gt;
== Nauka latania ==&lt;br /&gt;
=== Podręcznik FlightGear ===&lt;br /&gt;
FlightGear ma oficjalny [https://www.flightgear.org/support/manual/ podręcznik], który obejmuje podstawy latania. Jako początkujący, możesz chcieć zacząć od [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/pl/HTML/getstart-plch8.html Rozdziału 8: Podstawowy poradnik symulatora lotu].&lt;br /&gt;
&lt;br /&gt;
=== Samouczki ===&lt;br /&gt;
Wiele statków powietrznych ma własne interaktywne [[tutorials|samouczki]]. Dzięki samouczkom możesz nauczyć się obsługiwać konkretny statek powietrzny, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczków, przechodząc do ''Pomoc'' &amp;amp;gt; ''Samouczek''. Świetnym miejscem na rozpoczęcie jest samouczek dla statku powietrznego [[Cessna 172P]], powszechnie używanego w rzeczywistości do nauki latania statkami powietrznymi o stałych skrzydłach.&lt;br /&gt;
&lt;br /&gt;
Jeśli samouczek zaczyna się bez pasa startowego i w otoczeniu wody, Twoja instalacja FlightGeara nie ma scenerii dla lotniska, na którym samouczek miał się odbyć. Aby uzyskać scenerię, zobacz sekcję [[#Getting scenery|#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
== Twój pierwszy lot ==&lt;br /&gt;
=== Realizm ===&lt;br /&gt;
Jednym z najczęstszych pytań, jakie zadają początkujący piloci na temat każdego symulatora lotu, ale zwłaszcza FlightGeara, jest &amp;quot;Dlaczego mój statek powietrzny cały czas skręca w lewo?&amp;quot; Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobne jest, że wynika to z [[Understanding Propeller Torque and P-Factor|momentu obrotowego śmigła i efektu P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo haseł marketingowych głoszących co innego, niektóre ustawienia są obniżone, aby statek powietrzny był łatwiejszy w pilotażu. Zmniejsza to efekty takie jak powyższy. Realizm we FlightGear jest zawsze podkręcony do maksimum.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre punkty realizmu FlightGeara, które mogą dezorientować początkujących pilotów:&lt;br /&gt;
* &amp;quot;Syndrom skręcania w lewo&amp;quot; z wyżej wymienionych powodów.&lt;br /&gt;
* Błąd skrętu kompasu: Kompas, poddany siłom lotu, ma tendencję do skręcania w przeciwnym kierunku na krótki okres, zanim ustabilizuje się na prawidłowym kursie. Nie jest to usterka (zobacz także artykuł Wikipedii {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* Wskaźnik prędkości pionowej (VSI) również jest obarczony błędem.&lt;br /&gt;
* [[Horizontal Situation Indicator|Wskaźnik sytuacji poziomej]] (HSI) jest napędzany przez żyroskop (dlatego czasami nazywa się go żyroskopem kierunkowym), który podlega ''dryfowi żyroskopowemu''. Wskaźnik będzie odchylać się od aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
* Nie możesz po prostu przerwać skrętu lub wznoszenia poprzez wycentrowanie drążka lub pałki sterowniczej. Musisz skręcić lub popchnąć drążek w drugą stronę, aby wrócić do lotu poziomego. Ale nawet wtedy samolot nie utrzyma samodzielnie swojej wysokości ani kursu. Częstym błędem jest próba znalezienia pozycji drążka, przy której można puścić stery. Chociaż za pomocą trymowania można zostawić samolot na kilka sekund, trzeba użyć autopilota lub stale regulować drążek.&lt;br /&gt;
&lt;br /&gt;
Na statek powietrzny w locie działa wiele sił, a także na [[avionics and instruments|awionikę i przyrządy]] używane do sterowania i nawigacji, co może być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy przyrządów, które istnieją w rzeczywistym świecie''. Jeśli nie chcesz tego, naciśnij {{key press|h}}, aby włączyć HUD.&lt;br /&gt;
&lt;br /&gt;
=== Lotniska i pomoce nawigacyjne ===&lt;br /&gt;
Gdy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z interfejsu Launchera, możesz zastanawiać się, jak określić, jakie lotniska są dostępne. Program uruchamiający wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS|ILS]]. Nie znajdziesz mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Zobacz [[Getting aeronautical charts|Pozyskiwanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
W symulatorze dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;amp;gt; ''Wyposażenie'' &amp;amp;gt; ''Mapa'', która pozwoli Ci zobaczyć dane nawigacyjne oraz pozycję lotnisk i pomocy. Aby uzyskać więcej pomocy dotyczącej nawigacji, zobacz [[Understanding navigation|Zrozumienie nawigacji]].&lt;br /&gt;
&lt;br /&gt;
=== Latanie z autopilotem ===&lt;br /&gt;
Ogólny [[autopilot|autopilot]] jest dostępny w menu ''Autopilot &amp;gt; Ustawienia autopilota'', podczas gdy wiele statków powietrznych ma własny ''specyficzny'' autopilot, często będący modelem rzeczywistego.&lt;br /&gt;
&lt;br /&gt;
W przypadku statków powietrznych, które mają własny autopilot, powinieneś używać elementów sterujących autopilotem dostępnych w wirtualnym kokpicie. Oznacza to klikanie na panelu przyrządów w wirtualnym kokpicie. Menu Autopilot może być wyszarzone i niedostępne, gdy statek powietrzny dostarcza własny autopilot w niektórych statkach powietrznych, w tym Airbuses i [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172 jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilot Bendix/King KAP140]] w swoim wirtualnym kokpicie. Możesz używać zarówno urządzenia autopilota w kokpicie, jak i [[Autopilot#Autopilot Settings|ustawień autopilota]] z menu.&lt;br /&gt;
&lt;br /&gt;
== Zaawansowane ==&lt;br /&gt;
=== Latanie ===&lt;br /&gt;
{{Main article|Aircraft|Statki powietrzne}}&lt;br /&gt;
&lt;br /&gt;
* Jeśli nadal latasz lekkimi cywilnymi statkami powietrznymi, [[Cessna 182S]], która jest bardziej złożona niż C172P, oraz [[Piper PA28 Warrior II|PA28]] to dobre wybory.&lt;br /&gt;
* Jeśli interesuje Cię latanie liniami lotniczymi, sugeruje się rodziny [[Airbus A320 family|Airbus A320]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] i [[MD-80]].&lt;br /&gt;
* Jeśli fascynują Cię samoloty myśliwskie, wybierz wysoko oceniany wojskowy statek powietrzny (taki jak [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) z [[Aircraft#Modern military aircraft|tej listy]] i włącz obrażenia w trybie wieloosobowym lub zainstaluj [[Bombable]].&lt;br /&gt;
* Jeśli przechodzisz na śmigłowce, zaleca się latanie [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Oprócz zwykłych statków powietrznych dostępne są również szczegółowe [[Space Shuttle|wahadłowce kosmiczne]].&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
Fascynujące jest odkrywanie [[scenery|scenerii]] (lub po prostu testowanie grafiki/szybkości klatek) za pomocą [[UFO|UFO]]. Po pierwsze, [[#Configuring rendering and UI|zwiększ swoją jakość grafiki]]. Jeśli początkowo nie widzisz budynków, pozostaw FG otwarte i odczekaj chwilę, aż [[TerraSync]] zakończy pobieranie i budynki się pojawią.&lt;br /&gt;
Istnieje wiele [[Suggested airports|dobrze rozwiniętych lotnisk]] i obszarów scenerii. Możesz również eksplorować obiekty scenerii na [https://scenery.flightgear.org/map mapie modeli].&lt;br /&gt;
&lt;br /&gt;
=== Tryb wieloosobowy ===&lt;br /&gt;
FlightGear ma kilka serwerów wieloosobowych, które pozwolą Ci latać w bardziej ożywionych przestworzach; zobacz [[Howto: Multiplayer|Tryb wieloosobowy]]. Istnieją również [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Dostępna jest również [[MPMap|mapa wieloosobowa]], która pozwala zobaczyć, kto jest aktualnie online, a nawet jakie [[navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
=== Elementy menu ===&lt;br /&gt;
Aby szybko zapoznać się z użyciem każdej pozycji menu w FlightGear, zobacz [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
FlightGear ma wiele [[Addon|dodatków]] innych firm zawierających ulepszenia. Dla początkujących, [[Logbook Add-on|Dziennik lotów]] i dodatek [[Which Runway Add-on|Który pas]] mogą być najbardziej przydatnymi dodatkami.&lt;br /&gt;
&lt;br /&gt;
== Społeczność FlightGear ==&lt;br /&gt;
=== Uzyskiwanie pomocy ===&lt;br /&gt;
Ta strona została zaprojektowana, aby zapewnić użytkownikowi najważniejsze informacje, które musi wiedzieć o korzystaniu z FlightGeara po raz pierwszy. Oprócz [[Pl/Portal:Użytkownik|portalu użytkownika]] tej wiki, istnieją inne strony, które możesz chcieć przeczytać:&lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...oraz kanały komunikacji, które mogą być używane do uzyskania informacji lub poproszenia o pomoc:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''obowiązkowa lektura'' dla początkujących;&lt;br /&gt;
*{{forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord FlightGear]], najszybszy sposób na uzyskanie pomocy;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa użytkowników FlightGeara]], największa szansa na kontakt z głównymi deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydaniowego.&lt;br /&gt;
&lt;br /&gt;
=== Dostosowywanie FlightGear bez kompilacji ===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje prekompilowane pliki binarne do pobrania i instalacji na Windows, macOS i Linux. Ponadto większość dystrybucji Linuksa udostępnia spakowaną wersję w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGear jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i jesteś zachęcany'' do wprowadzania zmian w modelach lotu statków powietrznych, scenerii, teksturach, [[shader|shaderach]] OpenGL i każdej innej funkcji, którą chcesz zmienić dla własnej satysfakcji lub podzielić się z innymi użytkownikami FlightGeara. Jeśli to zamierzasz zrobić, spójrz na [[Pl/Portal:Developer|portal dewelopera]].&lt;br /&gt;
&lt;br /&gt;
=== Jak możesz pomóc ===&lt;br /&gt;
{{Main article|Volunteer|Wolontariusz}}&lt;br /&gt;
FlightGear to projekt open source, oparty na wolontariacie. Oznacza to, że wszystko, co tu znajdziesz, pochodzi z pasji, wolnego czasu i niczego więcej. Obejmuje to symulator, scenerię, statki powietrzne, wiki, {{forum link|text=forum}} i wszystko inne. Wolontariusze, w istocie ''ludzie, którzy coś robią'', są fundamentalni dla tego projektu. Bez nich nie zrobiłby ani jednego kroku do przodu. Dlatego ważne jest, aby współtwórcy dobrze się bawili tym, co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść wkład w ten projekt, powinieneś zapoznać się z kilkoma artykułami, które dadzą Ci pewne wskazówki:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Jak zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Dziedzin, w których ich pomoc byłaby doceniona, jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Skompiluj]] najnowszy kod Git&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj raporty o błędach]&lt;br /&gt;
*Uruchamianie FlightGeara za pomocą programu valgrind w celu wykrycia wycieków pamięci&lt;br /&gt;
&lt;br /&gt;
;Wsparcie:&lt;br /&gt;
*Pomoc nowym użytkownikom w pobieraniu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara ({{forum link|text=na forum}} lub na [[Discord|Discordzie]])&lt;br /&gt;
*Dostarczanie pomysłów i sugestii, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje / Propozycje / Pomysły]]&lt;br /&gt;
*Pomoc w [[Portal:Wiki|oczyszczeniu tej wiki]]&lt;br /&gt;
*Pomoc w dostarczaniu nowych treści dla brakujących stron wiki&lt;br /&gt;
&lt;br /&gt;
;Rozwój:&lt;br /&gt;
*Podstawowy kod źródłowy:&lt;br /&gt;
**Dostarczanie [[Howto:Start core development|wkładu w kod źródłowy, dane i dokumentację]]&lt;br /&gt;
**Dostarczanie [[Bugs|poprawek błędów]] lub nowych funkcji&lt;br /&gt;
*Rozwój statków powietrznych (modelowanie 3D, tekstury, modele lotu, skrypty)&lt;br /&gt;
*Rozwój scenerii (teren, modele, pogoda)&lt;br /&gt;
*Zaangażowanie w którykolwiek z innych projektów powiązanych z FlightGearem&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145099</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145099"/>
		<updated>2026-06-17T12:58:12Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Uruchamianie silnika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Postaramy się pomóc Ci wzbić się w wirtualne powietrze w najkrótszym możliwym czasie. Przedstawimy Ci również niektóre funkcje tego symulatora lotu oraz kilka informacji o jego społeczności.&lt;br /&gt;
&lt;br /&gt;
== Instalacja i konfiguracja ==&lt;br /&gt;
=== Wymagania sprzętowe ===&lt;br /&gt;
Aby FlightGear działał płynnie, wymaga karty graficznej ze sterownikami OpenGL 4.0 lub nowszymi. Zwykle nie stanowi to problemu, ale zapoznaj się z [[Pl/Wymagania_sprzętowe|zaleceniami sprzętowymi]], aby lepiej to zrozumieć.&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie FlightGeara ===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze strony [https://www.flightgear.org/download/ Pobieranie FlightGear]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego systemu. Dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuksa dla wersji 2020.3 LTS i nowszych. Większość użytkowników Linuksa odkryje, że większość dystrybucji ma spakowaną wersję FlightGeara (nazwa pakietu może brzmieć &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twoich umiejętności technicznych możesz wybrać deweloperską wersję [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre najnowsze rozwijane statki powietrzne, ale może być niestabilna i jest bardziej skomplikowana do zdobycia dla użytkowników innych niż Windows. Ogólnie rzecz biorąc, wersja deweloperska nie jest zalecana dla przeciętnego użytkownika, ale jeśli chcesz przeprowadzić kilka testów, dostępna jest wersja nocna do [https://www.flightgear.org/download/nightly/ pobrania]. Jeśli używasz kopii FlightGeara kontrolowanej przez system Git, możesz zsynchronizować swoje statki powietrzne za pomocą kontrolowanego przez system repozytorium rozwojowego statków powietrznych [[Pl/FGAddon|FGAddon]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie Windows ===&lt;br /&gt;
Po pobraniu instalatora uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen w systemie Windows może zablokować instalację po prostu dlatego, że plik binarny nie jest podpisany kluczem, który Microsoft uznaje. Oczywiście klucz jest płatny. W takim przypadku musimy kliknąć niepozorny link &amp;quot;Więcej informacji&amp;quot;. Dopiero wtedy pojawi się przycisk &amp;quot;Uruchom mimo to&amp;quot;. Możesz bezpiecznie zaufać, że nie jest to niebezpieczna aplikacja, pod warunkiem, że pobrałeś ją z oficjalnych źródeł.&lt;br /&gt;
&lt;br /&gt;
Jeśli z jakiegoś powodu używasz oprogramowania antywirusowego innej firmy, może ono blokować instalację FlightGeara. Nie jest to coś, na co mamy wpływ, więc to od Ciebie zależy, jak chcesz to rozwiązać.&lt;br /&gt;
&lt;br /&gt;
Za pomocą instalatora Windows możesz wybrać miejsce instalacji FlightGeara. Katalog [[Pl/$FG_ROOT|$FG_ROOT]] będzie miał ścieżkę &amp;lt;code&amp;gt;&amp;amp;lt;wybrany katalog&amp;amp;gt;/fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie macOS ===&lt;br /&gt;
Instalacja FlightGeara w systemie macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGeara do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Gdy uruchamiasz FlightGeara po raz pierwszy, jego ikona w Docku podskakuje przez kilka sekund podczas ładowania informacji o statkach powietrznych i lotniskach. Gdy pojawi się graficzny program uruchamiający, wybierz statek powietrzny i lotnisko, a następnie kliknij &amp;quot;Lećmy!&amp;quot;, aby uruchomić symulator. Możesz skonfigurować więcej opcji za pomocą graficznego programu uruchamiającego. Zobacz [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program oficjalną instrukcję] po więcej szczegółów.&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGeara z wiersza poleceń, uruchom aplikację Terminal i wpisz następujące polecenia.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options.....&lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawione w systemie macOS. Jeśli chcesz samodzielnie określić te zmienne do użycia w wierszu poleceń, uruchom następujące polecenia w aplikacji Terminal:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu graficznego programu uruchamiającego będziesz mieć alias do [[Pl/$FG_ROOT|$FG_ROOT]] w ścieżce &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt;, dzięki czemu możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara użytkownicy komputerów Mac mogą zlokalizować swój folder [[Pl/$FG_ROOT|$FG_ROOT]], otwierając folder Aplikacje w Finderze, klikając prawym przyciskiem myszy FlightGear i wybierając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do wnętrza folderu FlightGear. Masz teraz dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowe statki powietrzne]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja ze źródeł ===&lt;br /&gt;
Główny artykuł: [[Building FlightGear|Kompilacja FlightGeara]]&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie scenerii ===&lt;br /&gt;
Z FlightGearem instalowany jest ograniczony zestaw [[scenery|scenerii]]. Dla FlightGear 2024.1 składa się on z:&lt;br /&gt;
* obszaru wokół wyróżnionego lotniska dla tej wersji, czyli [[Keflavik_Airport|Międzynarodowego Portu Lotniczego Keflavik]] (BIKF)&lt;br /&gt;
* lotniska używanego w samouczku dla [[Pl/Cessna 172P|Cessny 172P]], czyli [[Hilo_International_Airport|Międzynarodowego Portu Lotniczego Hilo]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest zazwyczaj przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i dzieli się na trzy rodzaje danych:&lt;br /&gt;
* '''Airports''' zawiera dane o lotniskach, takie jak wykorzystanie pasów startowych i miejsca postojowe.&lt;br /&gt;
* '''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp., które reprezentują trójwymiarowe struktury.&lt;br /&gt;
* '''Terrain''' reprezentuje kontury, wzniesienia i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Obecnym sposobem &amp;quot;instalowania&amp;quot; nowej scenerii jest włączenie [[TerraSync]], które automatycznie pobierze i zaktualizuje każde odwiedzane miejsce - nawet w locie! Jeśli masz wolne połączenie internetowe i/lub wolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz ręcznie pobrać i zainstalować nowe części scenerii, oficjalną [[World Scenery|scenerię świata]] lub niestandardową scenerię.&lt;br /&gt;
&lt;br /&gt;
Sceneria jest również dostępna na [https://www.flightgear.org/download/mirrors/ stronie mirrorów] witryny FlightGear i można ją zainstalować, postępując zgodnie z instrukcją [[Howto: Install scenery|Jak zainstalować scenerię]]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabymi komputerami!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowa sceneria jest dostępna w wielu miejscach. Na przykład na {{forum link|f=5|text=forum FlightGear}} lub w repozytoriach. Wyszukiwanie w Internecie powinno pozwolić je znaleźć. Zobacz stronę [[Suggested_custom_scenery|sugerowanej niestandardowej scenerii]] po kilka najnowszych wydań.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS i nowsze dodały eksperymentalną obsługę trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz notatki o [[OSM2City 1st Worldbuild|1. światowej kompilacji OSM2City]] (marzec 2021). Ręczne pobieranie struktur 3D dla regionów lub całych krajów jest dostępne na stronie wiki z [[Areas populated with osm2city scenery|pobraniami osm2City]].&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie statków powietrznych ===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|statki powietrzne]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz przejść na stronę internetową FlightGeara i przejść do strony [http://www.flightgear.org/download/ pobierania], a następnie wybrać link do pobrania statków powietrznych pasujący do Twojej wersji FlightGeara. Ponadto istnieje wiele [[hangars|hangarów]] innych firm. Informacje o instalacji znajdziesz w [[Pl/Instalowanie samolotów|Jak zainstalować statek powietrzny]].&lt;br /&gt;
&lt;br /&gt;
== Uruchamianie FlightGeara ==&lt;br /&gt;
=== Uruchamianie FlightGeara ===&lt;br /&gt;
Najłatwiejszym sposobem uruchomienia FlightGeara jest użycie ikony na pulpicie. Uruchamia to interfejs graficzny [[FlightGear Qt launcher|Launchera]], w którym możesz wybrać statek powietrzny, pozycję startową itp. &amp;lt;!-- Poniższe przypomnienie powinno zostać usunięte, gdy program uruchamiający jasno określi, że są dodatkowe rzeczy do załatwienia za pomocą menu w symulatorze, aby skonfigurować FG --&amp;gt; Pamiętaj, że Launcher ma tylko podstawowe opcje, aby Ci pomóc. Wiele opcji dotyczących grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input_device|urządzeń wejściowych]] itp. jest dostępnych z [[menu|menu]] wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników wybiera jednak uruchamianie FlightGeara bezpośrednio z wiersza poleceń. Nazwa pliku wykonywalnego to &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; (lub plik AppImage, np. &amp;quot;flightgear-2024.1.6-linux-amd64.AppImage&amp;quot;) i można go uruchomić bez opcji. Jeśli &amp;quot;nie został znaleziony&amp;quot;, prawdopodobnie nie znajduje się w Twojej [https://en.wikipedia.org/wiki/PATH_(variable) ścieżce]. Lokalizacja zależy od Twojego konkretnego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|parametrów wiersza poleceń]], których należy użyć do zmiany wielu opcji, takich jak wybrany statek powietrzny. Najważniejsze z nich:&lt;br /&gt;
&lt;br /&gt;
 fgfs --launcher                # otwiera Launcher FlightGeara&lt;br /&gt;
 fgfs --show-aircraft           # wyświetla listę zainstalowanych statków powietrznych&lt;br /&gt;
 fgfs --aircraft=c172p          # uruchamia FG z statkiem powietrznym &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Launcher umożliwia również użytkownikom dodawanie parametrów wiersza poleceń dla opcji, które są zwykle zmieniane z poziomu menu wewnątrz symulatora, a także dość zaawansowanych opcji dostępnych tylko z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguracja renderowania i interfejsu użytkownika ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|Okno dialogowe Widok &amp;gt; Opcje renderowania.]]&lt;br /&gt;
Jeśli jakość renderowania lub liczba klatek na sekundę jest zbyt niska, kliknij &amp;quot;Widok &amp;gt; Opcje renderowania&amp;quot;, aby dostosować ustawienia graficzne. Dla nowszego sprzętu zaleca się ustawienie &amp;quot;jakości grafiki&amp;quot; na wysoką i zaznaczenie &amp;quot;użyj miejsca na dysku dla szybszego ładowania&amp;quot;, &amp;quot;animowane rękawy&amp;quot; i &amp;quot;satelitarna fotosceneria&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli tekst menu wydaje się zbyt mały na ekranach o wysokiej rozdzielczości lub dużych ekranach, możesz ręcznie [[Menubar#How to Change the Default Menubar Font Size|zmienić rozmiar czcionki paska menu]], edytując plik danych, lub po prostu kliknąć &amp;quot;Debuguj &amp;gt; Zmień styl GUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Używanie klawiatury i/lub myszy ===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[joystick|joysticka]] lub innych kontrolerów czasami używają klawiatury lub myszy do sterowania swoim statkiem powietrznym. Używanie klawiatury do latania może być trudne, a mysz jest zalecana zamiast klawiatury do latania, jednak nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać pomoc dotyczącą poleceń klawiatury, gdy FlightGear jest uruchomiony, przejdź do menu ''Pomoc'', spójrz w ''Podstawowe klawisze'' (dla poleceń związanych z symulatorem), ''Wspólne klawisze statków powietrznych'' (dla poleceń uniwersalnych dla wszystkich statków powietrznych) i ''Pomoc dla statku powietrznego'' (dla poleceń specyficznych dla Twojego statku). Jeśli główne menu jest ukryte, naciśnij {{key press|F10}}. Jeśli przychodzisz z innych symulatorów, sprawdź [[key commands compared to other simulators|porównanie poleceń klawiatury z innymi symulatorami]], aby uzyskać przegląd różnic między poleceniami klawiatury tego symulatora a FlightGear.&lt;br /&gt;
&lt;br /&gt;
Aby użyć myszy do latania statkiem powietrznym, naciśnij {{key press|Tab}} (kursor powinien zmienić się w krzyżyk) i przesuwaj myszą, aby kierować statkiem powietrznym. Naciśnij ponownie {{key press|Tab}}, aby rozglądać się (kursor powinien pokazywać dwustronną strzałkę), i naciśnij {{key press|Tab}} ponownie, aby wrócić do trybu normalnego, używanego do klikania elementów w kokpicie. Możesz kliknąć &amp;quot;Plik &amp;gt; Urządzenia wejściowe &amp;gt; Konfiguracja myszy&amp;quot;, aby dostosować czułość myszy.&lt;br /&gt;
&lt;br /&gt;
Dla większości użytkowników nieposiadających kontroli osi steru kierunku, trudno jest ręcznie koordynować ruchy [[aileron|lotki]] i [[rudder|steru kierunku]] podczas zakrętu. Aby włączyć autokoordynację i ułatwić latanie, możesz kliknąć &amp;quot;Ustawienia&amp;quot;, następnie kliknąć przycisk &amp;quot;Pokaż więcej&amp;quot; po prawej stronie &amp;quot;Ogólne&amp;quot;, a na końcu kliknąć &amp;quot;Włącz autokoordynację&amp;quot; w Launcherze.&lt;br /&gt;
&lt;br /&gt;
=== Pierwszy raz w kokpicie ===&lt;br /&gt;
Orientacja w kokpicie może być wyzwaniem za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Możesz użyć {{key press|Ctrl|V}}, aby przełączyć się na widok kokpitu. Jeśli tekst na panelu jest zbyt mały, możesz użyć trybu widoku myszy (naciśnij Tab, aż uzyskasz kursor w kształcie podwójnej strzałki), aby przesuwać widok, i kółko myszy, aby przybliżać, lub przesuwać widok za pomocą czapki joysticka i przybliżać za pomocą {{key press|X}} i {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wielu podejmuje po wejściu do nieznanego kokpitu, jest naciśnięcie {{key press|Ctrl|C}} w celu podświetlenia wszystkich &amp;quot;gorących punktów&amp;quot;, czyli elementów sterujących przyrządami, przycisków, pokręteł itp. Wiele statków powietrznych oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik lub magneto, mogą być trudne w użyciu lub po prostu nie mieć klikalnych &amp;quot;gorących punktów&amp;quot;, zwłaszcza w modelach statków powietrznych w fazie rozwoju. W większości przypadków możesz użyć klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu &amp;quot;Pomoc &amp;gt; Pomoc dla statku powietrznego&amp;quot; lub &amp;quot;Pomoc &amp;gt; Wspólne klawisze statków powietrznych&amp;quot;, ale czasami niektóre klawisze są przypisywane ponownie przez statek powietrzny lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
=== Uruchamianie silnika ===&lt;br /&gt;
Chcesz już lecieć, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Większość statków powietrznych ma wpis ''autostart'' w swoim niestandardowym menu, ale oto ogólna procedura, która powinna działać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem tłokowym, potrzebujesz (po upewnieniu się, że gra nie jest wstrzymana {{key press|p}}):&lt;br /&gt;
# Paliwo: niektóre statki powietrzne rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
# Prawidłowa mieszanka paliwowa: zazwyczaj jest ''bogata'', więc wciśnij czerwony pokrętło do samego końca lub użyj klawisza {{key press|m}}, aby wzbogacić ({{key press|Shift|m}} zuboża).&lt;br /&gt;
# Iskrowniki ustawione na ''Both'': obróć kluczyk lub naciśnij {{key press|&amp;amp;#125;}} trzy razy, aby przejść przez ''R'', ''L'' do ''Both''.&lt;br /&gt;
# Przepustnica: niektóre silniki lepiej uruchamiają się przy odrobinie gazu.&lt;br /&gt;
# Uruchom rozrusznik: kliknij pozycję ''Start'' kluczyka na panelu lub naciśnij {{key press|s}}. Przytrzymaj rozrusznik przez wystarczający czas, nawet 10 sekund.&lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w statku powietrznym z wieloma silnikami jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że musisz powtórzyć tę samą sekwencję rozruchu dla każdego silnika. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: naciśnij {{key press|~}} i cała powyższa procedura zadziała dla wszystkich silników. Należy jednak pamiętać, że domyślny panel 2D jest podłączony do ''tylko jednego silnika'' i sztuczka z {{key press|~}} może nie zadziałać. Dodaj też trochę gazu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla odrzutowców, śmigłowców lub innych typów statków powietrznych o złożonych procedurach rozruchu. Sprawdź instrukcje w menu pomocy statku powietrznego (naciśnij {{key press|?}}) i/lub spójrz na [[Aircraft|artykuł o tym statku powietrznym na tej wiki]]. Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem odrzutowym, musisz:&lt;br /&gt;
# Ustawić odcięcie ''ON''&lt;br /&gt;
# Włączyć rozrusznik&lt;br /&gt;
# Gdy silniki osiągną około 5% N1, ustawić odcięcie ''OFF''&lt;br /&gt;
# Wyłączyć rozrusznik, gdy silnik osiągnie prędkość roboczą&lt;br /&gt;
&lt;br /&gt;
== Nauka latania ==&lt;br /&gt;
=== Podręcznik FlightGear ===&lt;br /&gt;
FlightGear ma oficjalny [https://www.flightgear.org/support/manual/ podręcznik], który obejmuje podstawy latania. Jako początkujący, możesz chcieć zacząć od [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/pl/HTML/getstart-plch8.html Rozdziału 8: Podstawowy poradnik symulatora lotu].&lt;br /&gt;
&lt;br /&gt;
=== Samouczki ===&lt;br /&gt;
Wiele statków powietrznych ma własne interaktywne [[tutorials|samouczki]]. Dzięki samouczkom możesz nauczyć się obsługiwać konkretny statek powietrzny, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczków, przechodząc do ''Pomoc'' &amp;amp;gt; ''Samouczek''. Świetnym miejscem na rozpoczęcie jest samouczek dla statku powietrznego [[Cessna 172P]], powszechnie używanego w rzeczywistości do nauki latania statkami powietrznymi o stałych skrzydłach.&lt;br /&gt;
&lt;br /&gt;
Jeśli samouczek zaczyna się bez pasa startowego i w otoczeniu wody, Twoja instalacja FlightGeara nie ma scenerii dla lotniska, na którym samouczek miał się odbyć. Aby uzyskać scenerię, zobacz sekcję [[#Getting scenery|#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
== Twój pierwszy lot ==&lt;br /&gt;
=== Realizm ===&lt;br /&gt;
Jednym z najczęstszych pytań, jakie zadają początkujący piloci na temat każdego symulatora lotu, ale zwłaszcza FlightGeara, jest &amp;quot;Dlaczego mój statek powietrzny cały czas skręca w lewo?&amp;quot; Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobne jest, że wynika to z [[Understanding Propeller Torque and P-Factor|momentu obrotowego śmigła i efektu P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo haseł marketingowych głoszących co innego, niektóre ustawienia są obniżone, aby statek powietrzny był łatwiejszy w pilotażu. Zmniejsza to efekty takie jak powyższy. Realizm we FlightGear jest zawsze podkręcony do maksimum.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre punkty realizmu FlightGeara, które mogą dezorientować początkujących pilotów:&lt;br /&gt;
* &amp;quot;Syndrom skręcania w lewo&amp;quot; z wyżej wymienionych powodów.&lt;br /&gt;
* Błąd skrętu kompasu: Kompas, poddany siłom lotu, ma tendencję do skręcania w przeciwnym kierunku na krótki okres, zanim ustabilizuje się na prawidłowym kursie. Nie jest to usterka (zobacz także artykuł Wikipedii {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* Wskaźnik prędkości pionowej (VSI) również jest obarczony błędem.&lt;br /&gt;
* [[Horizontal Situation Indicator|Wskaźnik sytuacji poziomej]] (HSI) jest napędzany przez żyroskop (dlatego czasami nazywa się go żyroskopem kierunkowym), który podlega ''dryfowi żyroskopowemu''. Wskaźnik będzie odchylać się od aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
* Nie możesz po prostu przerwać skrętu lub wznoszenia poprzez wycentrowanie drążka lub pałki sterowniczej. Musisz skręcić lub popchnąć drążek w drugą stronę, aby wrócić do lotu poziomego. Ale nawet wtedy samolot nie utrzyma samodzielnie swojej wysokości ani kursu. Częstym błędem jest próba znalezienia pozycji drążka, przy której można puścić stery. Chociaż za pomocą trymowania można zostawić samolot na kilka sekund, trzeba użyć autopilota lub stale regulować drążek.&lt;br /&gt;
&lt;br /&gt;
Na statek powietrzny w locie działa wiele sił, a także na [[avionics and instruments|awionikę i przyrządy]] używane do sterowania i nawigacji, co może być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy przyrządów, które istnieją w rzeczywistym świecie''. Jeśli nie chcesz tego, naciśnij {{key press|h}}, aby włączyć HUD.&lt;br /&gt;
&lt;br /&gt;
=== Lotniska i pomoce nawigacyjne ===&lt;br /&gt;
Gdy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z interfejsu Launchera, możesz zastanawiać się, jak określić, jakie lotniska są dostępne. Program uruchamiający wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS|ILS]]. Nie znajdziesz mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Zobacz [[Getting aeronautical charts|Pozyskiwanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
W symulatorze dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;amp;gt; ''Wyposażenie'' &amp;amp;gt; ''Mapa'', która pozwoli Ci zobaczyć dane nawigacyjne oraz pozycję lotnisk i pomocy. Aby uzyskać więcej pomocy dotyczącej nawigacji, zobacz [[Understanding navigation|Zrozumienie nawigacji]].&lt;br /&gt;
&lt;br /&gt;
=== Latanie z autopilotem ===&lt;br /&gt;
Ogólny [[autopilot|autopilot]] jest dostępny w menu ''Autopilot &amp;gt; Ustawienia autopilota'', podczas gdy wiele statków powietrznych ma własny ''specyficzny'' autopilot, często będący modelem rzeczywistego.&lt;br /&gt;
&lt;br /&gt;
W przypadku statków powietrznych, które mają własny autopilot, powinieneś używać elementów sterujących autopilotem dostępnych w wirtualnym kokpicie. Oznacza to klikanie na panelu przyrządów w wirtualnym kokpicie. Menu Autopilot może być wyszarzone i niedostępne, gdy statek powietrzny dostarcza własny autopilot w niektórych statkach powietrznych, w tym Airbuses i [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172 jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilot Bendix/King KAP140]] w swoim wirtualnym kokpicie. Możesz używać zarówno urządzenia autopilota w kokpicie, jak i [[Autopilot#Autopilot Settings|ustawień autopilota]] z menu.&lt;br /&gt;
&lt;br /&gt;
== Zaawansowane ==&lt;br /&gt;
=== Latanie ===&lt;br /&gt;
{{Main article|Aircraft|Statki powietrzne}}&lt;br /&gt;
&lt;br /&gt;
* Jeśli nadal latasz lekkimi cywilnymi statkami powietrznymi, [[Cessna 182S]], która jest bardziej złożona niż C172P, oraz [[Piper PA28 Warrior II|PA28]] to dobre wybory.&lt;br /&gt;
* Jeśli interesuje Cię latanie liniami lotniczymi, sugeruje się rodziny [[Airbus A320 family|Airbus A320]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] i [[MD-80]].&lt;br /&gt;
* Jeśli fascynują Cię samoloty myśliwskie, wybierz wysoko oceniany wojskowy statek powietrzny (taki jak [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) z [[Aircraft#Modern military aircraft|tej listy]] i włącz obrażenia w trybie wieloosobowym lub zainstaluj [[Bombable]].&lt;br /&gt;
* Jeśli przechodzisz na śmigłowce, zaleca się latanie [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Oprócz zwykłych statków powietrznych dostępne są również szczegółowe [[Space Shuttle|wahadłowce kosmiczne]].&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
Fascynujące jest odkrywanie [[scenery|scenerii]] (lub po prostu testowanie grafiki/szybkości klatek) za pomocą [[UFO|UFO]]. Po pierwsze, [[#Configuring rendering and UI|zwiększ swoją jakość grafiki]]. Jeśli początkowo nie widzisz budynków, pozostaw FG otwarte i odczekaj chwilę, aż [[TerraSync]] zakończy pobieranie i budynki się pojawią.&lt;br /&gt;
Istnieje wiele [[Suggested airports|dobrze rozwiniętych lotnisk]] i obszarów scenerii. Możesz również eksplorować obiekty scenerii na [https://scenery.flightgear.org/map mapie modeli].&lt;br /&gt;
&lt;br /&gt;
=== Tryb wieloosobowy ===&lt;br /&gt;
FlightGear ma kilka serwerów wieloosobowych, które pozwolą Ci latać w bardziej ożywionych przestworzach; zobacz [[Howto: Multiplayer|Tryb wieloosobowy]]. Istnieją również [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Dostępna jest również [[MPMap|mapa wieloosobowa]], która pozwala zobaczyć, kto jest aktualnie online, a nawet jakie [[navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
=== Elementy menu ===&lt;br /&gt;
Aby szybko zapoznać się z użyciem każdej pozycji menu w FlightGear, zobacz [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
FlightGear ma wiele [[Addon|dodatków]] innych firm zawierających ulepszenia. Dla początkujących, [[Logbook Add-on|Dziennik lotów]] i dodatek [[Which Runway Add-on|Który pas]] mogą być najbardziej przydatnymi dodatkami.&lt;br /&gt;
&lt;br /&gt;
== Społeczność FlightGear ==&lt;br /&gt;
=== Uzyskiwanie pomocy ===&lt;br /&gt;
Ta strona została zaprojektowana, aby zapewnić użytkownikowi najważniejsze informacje, które musi wiedzieć o korzystaniu z FlightGeara po raz pierwszy. Oprócz [[Pl/Portal:Użytkownik|portalu użytkownika]] tej wiki, istnieją inne strony, które możesz chcieć przeczytać:&lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...oraz kanały komunikacji, które mogą być używane do uzyskania informacji lub poproszenia o pomoc:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''obowiązkowa lektura'' dla początkujących;&lt;br /&gt;
*{{forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord FlightGear]], najszybszy sposób na uzyskanie pomocy;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa użytkowników FlightGeara]], największa szansa na kontakt z głównymi deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydaniowego.&lt;br /&gt;
&lt;br /&gt;
=== Dostosowywanie FlightGear bez kompilacji ===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje prekompilowane pliki binarne do pobrania i instalacji na Windows, macOS i Linux. Ponadto większość dystrybucji Linuksa udostępnia spakowaną wersję w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGear jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i jesteś zachęcany'' do wprowadzania zmian w modelach lotu statków powietrznych, scenerii, teksturach, [[shader|shaderach]] OpenGL i każdej innej funkcji, którą chcesz zmienić dla własnej satysfakcji lub podzielić się z innymi użytkownikami FlightGeara. Jeśli to zamierzasz zrobić, spójrz na [[Pl/Portal:Developer|portal dewelopera]].&lt;br /&gt;
&lt;br /&gt;
=== Jak możesz pomóc ===&lt;br /&gt;
{{Main article|Volunteer|Wolontariusz}}&lt;br /&gt;
FlightGear to projekt open source, oparty na wolontariacie. Oznacza to, że wszystko, co tu znajdziesz, pochodzi z pasji, wolnego czasu i niczego więcej. Obejmuje to symulator, scenerię, statki powietrzne, wiki, {{forum link|text=forum}} i wszystko inne. Wolontariusze, w istocie ''ludzie, którzy coś robią'', są fundamentalni dla tego projektu. Bez nich nie zrobiłby ani jednego kroku do przodu. Dlatego ważne jest, aby współtwórcy dobrze się bawili tym, co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść wkład w ten projekt, powinieneś zapoznać się z kilkoma artykułami, które dadzą Ci pewne wskazówki:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Jak zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Dziedzin, w których ich pomoc byłaby doceniona, jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Skompiluj]] najnowszy kod Git&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj raporty o błędach]&lt;br /&gt;
*Uruchamianie FlightGeara za pomocą programu valgrind w celu wykrycia wycieków pamięci&lt;br /&gt;
&lt;br /&gt;
;Wsparcie:&lt;br /&gt;
*Pomoc nowym użytkownikom w pobieraniu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara ({{forum link|text=na forum}} lub na [[Discord|Discordzie]])&lt;br /&gt;
*Dostarczanie pomysłów i sugestii, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje / Propozycje / Pomysły]]&lt;br /&gt;
*Pomoc w [[Portal:Wiki|oczyszczeniu tej wiki]]&lt;br /&gt;
*Pomoc w dostarczaniu nowych treści dla brakujących stron wiki&lt;br /&gt;
&lt;br /&gt;
;Rozwój:&lt;br /&gt;
*Podstawowy kod źródłowy:&lt;br /&gt;
**Dostarczanie [[Howto:Start core development|wkładu w kod źródłowy, dane i dokumentację]]&lt;br /&gt;
**Dostarczanie [[Bugs|poprawek błędów]] lub nowych funkcji&lt;br /&gt;
*Rozwój statków powietrznych (modelowanie 3D, tekstury, modele lotu, skrypty)&lt;br /&gt;
*Rozwój scenerii (teren, modele, pogoda)&lt;br /&gt;
*Zaangażowanie w którykolwiek z innych projektów powiązanych z FlightGearem&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145098</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145098"/>
		<updated>2026-06-17T12:53:22Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Uruchamianie silnika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Postaramy się pomóc Ci wzbić się w wirtualne powietrze w najkrótszym możliwym czasie. Przedstawimy Ci również niektóre funkcje tego symulatora lotu oraz kilka informacji o jego społeczności.&lt;br /&gt;
&lt;br /&gt;
== Instalacja i konfiguracja ==&lt;br /&gt;
=== Wymagania sprzętowe ===&lt;br /&gt;
Aby FlightGear działał płynnie, wymaga karty graficznej ze sterownikami OpenGL 4.0 lub nowszymi. Zwykle nie stanowi to problemu, ale zapoznaj się z [[Pl/Wymagania_sprzętowe|zaleceniami sprzętowymi]], aby lepiej to zrozumieć.&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie FlightGeara ===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze strony [https://www.flightgear.org/download/ Pobieranie FlightGear]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego systemu. Dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuksa dla wersji 2020.3 LTS i nowszych. Większość użytkowników Linuksa odkryje, że większość dystrybucji ma spakowaną wersję FlightGeara (nazwa pakietu może brzmieć &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twoich umiejętności technicznych możesz wybrać deweloperską wersję [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre najnowsze rozwijane statki powietrzne, ale może być niestabilna i jest bardziej skomplikowana do zdobycia dla użytkowników innych niż Windows. Ogólnie rzecz biorąc, wersja deweloperska nie jest zalecana dla przeciętnego użytkownika, ale jeśli chcesz przeprowadzić kilka testów, dostępna jest wersja nocna do [https://www.flightgear.org/download/nightly/ pobrania]. Jeśli używasz kopii FlightGeara kontrolowanej przez system Git, możesz zsynchronizować swoje statki powietrzne za pomocą kontrolowanego przez system repozytorium rozwojowego statków powietrznych [[Pl/FGAddon|FGAddon]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie Windows ===&lt;br /&gt;
Po pobraniu instalatora uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen w systemie Windows może zablokować instalację po prostu dlatego, że plik binarny nie jest podpisany kluczem, który Microsoft uznaje. Oczywiście klucz jest płatny. W takim przypadku musimy kliknąć niepozorny link &amp;quot;Więcej informacji&amp;quot;. Dopiero wtedy pojawi się przycisk &amp;quot;Uruchom mimo to&amp;quot;. Możesz bezpiecznie zaufać, że nie jest to niebezpieczna aplikacja, pod warunkiem, że pobrałeś ją z oficjalnych źródeł.&lt;br /&gt;
&lt;br /&gt;
Jeśli z jakiegoś powodu używasz oprogramowania antywirusowego innej firmy, może ono blokować instalację FlightGeara. Nie jest to coś, na co mamy wpływ, więc to od Ciebie zależy, jak chcesz to rozwiązać.&lt;br /&gt;
&lt;br /&gt;
Za pomocą instalatora Windows możesz wybrać miejsce instalacji FlightGeara. Katalog [[Pl/$FG_ROOT|$FG_ROOT]] będzie miał ścieżkę &amp;lt;code&amp;gt;&amp;amp;lt;wybrany katalog&amp;amp;gt;/fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie macOS ===&lt;br /&gt;
Instalacja FlightGeara w systemie macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGeara do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Gdy uruchamiasz FlightGeara po raz pierwszy, jego ikona w Docku podskakuje przez kilka sekund podczas ładowania informacji o statkach powietrznych i lotniskach. Gdy pojawi się graficzny program uruchamiający, wybierz statek powietrzny i lotnisko, a następnie kliknij &amp;quot;Lećmy!&amp;quot;, aby uruchomić symulator. Możesz skonfigurować więcej opcji za pomocą graficznego programu uruchamiającego. Zobacz [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program oficjalną instrukcję] po więcej szczegółów.&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGeara z wiersza poleceń, uruchom aplikację Terminal i wpisz następujące polecenia.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options.....&lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawione w systemie macOS. Jeśli chcesz samodzielnie określić te zmienne do użycia w wierszu poleceń, uruchom następujące polecenia w aplikacji Terminal:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu graficznego programu uruchamiającego będziesz mieć alias do [[Pl/$FG_ROOT|$FG_ROOT]] w ścieżce &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt;, dzięki czemu możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara użytkownicy komputerów Mac mogą zlokalizować swój folder [[Pl/$FG_ROOT|$FG_ROOT]], otwierając folder Aplikacje w Finderze, klikając prawym przyciskiem myszy FlightGear i wybierając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do wnętrza folderu FlightGear. Masz teraz dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowe statki powietrzne]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja ze źródeł ===&lt;br /&gt;
Główny artykuł: [[Building FlightGear|Kompilacja FlightGeara]]&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie scenerii ===&lt;br /&gt;
Z FlightGearem instalowany jest ograniczony zestaw [[scenery|scenerii]]. Dla FlightGear 2024.1 składa się on z:&lt;br /&gt;
* obszaru wokół wyróżnionego lotniska dla tej wersji, czyli [[Keflavik_Airport|Międzynarodowego Portu Lotniczego Keflavik]] (BIKF)&lt;br /&gt;
* lotniska używanego w samouczku dla [[Pl/Cessna 172P|Cessny 172P]], czyli [[Hilo_International_Airport|Międzynarodowego Portu Lotniczego Hilo]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest zazwyczaj przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i dzieli się na trzy rodzaje danych:&lt;br /&gt;
* '''Airports''' zawiera dane o lotniskach, takie jak wykorzystanie pasów startowych i miejsca postojowe.&lt;br /&gt;
* '''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp., które reprezentują trójwymiarowe struktury.&lt;br /&gt;
* '''Terrain''' reprezentuje kontury, wzniesienia i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Obecnym sposobem &amp;quot;instalowania&amp;quot; nowej scenerii jest włączenie [[TerraSync]], które automatycznie pobierze i zaktualizuje każde odwiedzane miejsce - nawet w locie! Jeśli masz wolne połączenie internetowe i/lub wolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz ręcznie pobrać i zainstalować nowe części scenerii, oficjalną [[World Scenery|scenerię świata]] lub niestandardową scenerię.&lt;br /&gt;
&lt;br /&gt;
Sceneria jest również dostępna na [https://www.flightgear.org/download/mirrors/ stronie mirrorów] witryny FlightGear i można ją zainstalować, postępując zgodnie z instrukcją [[Howto: Install scenery|Jak zainstalować scenerię]]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabymi komputerami!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowa sceneria jest dostępna w wielu miejscach. Na przykład na {{forum link|f=5|text=forum FlightGear}} lub w repozytoriach. Wyszukiwanie w Internecie powinno pozwolić je znaleźć. Zobacz stronę [[Suggested_custom_scenery|sugerowanej niestandardowej scenerii]] po kilka najnowszych wydań.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS i nowsze dodały eksperymentalną obsługę trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz notatki o [[OSM2City 1st Worldbuild|1. światowej kompilacji OSM2City]] (marzec 2021). Ręczne pobieranie struktur 3D dla regionów lub całych krajów jest dostępne na stronie wiki z [[Areas populated with osm2city scenery|pobraniami osm2City]].&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie statków powietrznych ===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|statki powietrzne]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz przejść na stronę internetową FlightGeara i przejść do strony [http://www.flightgear.org/download/ pobierania], a następnie wybrać link do pobrania statków powietrznych pasujący do Twojej wersji FlightGeara. Ponadto istnieje wiele [[hangars|hangarów]] innych firm. Informacje o instalacji znajdziesz w [[Pl/Instalowanie samolotów|Jak zainstalować statek powietrzny]].&lt;br /&gt;
&lt;br /&gt;
== Uruchamianie FlightGeara ==&lt;br /&gt;
=== Uruchamianie FlightGeara ===&lt;br /&gt;
Najłatwiejszym sposobem uruchomienia FlightGeara jest użycie ikony na pulpicie. Uruchamia to interfejs graficzny [[FlightGear Qt launcher|Launchera]], w którym możesz wybrać statek powietrzny, pozycję startową itp. &amp;lt;!-- Poniższe przypomnienie powinno zostać usunięte, gdy program uruchamiający jasno określi, że są dodatkowe rzeczy do załatwienia za pomocą menu w symulatorze, aby skonfigurować FG --&amp;gt; Pamiętaj, że Launcher ma tylko podstawowe opcje, aby Ci pomóc. Wiele opcji dotyczących grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input_device|urządzeń wejściowych]] itp. jest dostępnych z [[menu|menu]] wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników wybiera jednak uruchamianie FlightGeara bezpośrednio z wiersza poleceń. Nazwa pliku wykonywalnego to &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; (lub plik AppImage, np. &amp;quot;flightgear-2024.1.6-linux-amd64.AppImage&amp;quot;) i można go uruchomić bez opcji. Jeśli &amp;quot;nie został znaleziony&amp;quot;, prawdopodobnie nie znajduje się w Twojej [https://en.wikipedia.org/wiki/PATH_(variable) ścieżce]. Lokalizacja zależy od Twojego konkretnego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|parametrów wiersza poleceń]], których należy użyć do zmiany wielu opcji, takich jak wybrany statek powietrzny. Najważniejsze z nich:&lt;br /&gt;
&lt;br /&gt;
 fgfs --launcher                # otwiera Launcher FlightGeara&lt;br /&gt;
 fgfs --show-aircraft           # wyświetla listę zainstalowanych statków powietrznych&lt;br /&gt;
 fgfs --aircraft=c172p          # uruchamia FG z statkiem powietrznym &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Launcher umożliwia również użytkownikom dodawanie parametrów wiersza poleceń dla opcji, które są zwykle zmieniane z poziomu menu wewnątrz symulatora, a także dość zaawansowanych opcji dostępnych tylko z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguracja renderowania i interfejsu użytkownika ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|Okno dialogowe Widok &amp;gt; Opcje renderowania.]]&lt;br /&gt;
Jeśli jakość renderowania lub liczba klatek na sekundę jest zbyt niska, kliknij &amp;quot;Widok &amp;gt; Opcje renderowania&amp;quot;, aby dostosować ustawienia graficzne. Dla nowszego sprzętu zaleca się ustawienie &amp;quot;jakości grafiki&amp;quot; na wysoką i zaznaczenie &amp;quot;użyj miejsca na dysku dla szybszego ładowania&amp;quot;, &amp;quot;animowane rękawy&amp;quot; i &amp;quot;satelitarna fotosceneria&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli tekst menu wydaje się zbyt mały na ekranach o wysokiej rozdzielczości lub dużych ekranach, możesz ręcznie [[Menubar#How to Change the Default Menubar Font Size|zmienić rozmiar czcionki paska menu]], edytując plik danych, lub po prostu kliknąć &amp;quot;Debuguj &amp;gt; Zmień styl GUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Używanie klawiatury i/lub myszy ===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[joystick|joysticka]] lub innych kontrolerów czasami używają klawiatury lub myszy do sterowania swoim statkiem powietrznym. Używanie klawiatury do latania może być trudne, a mysz jest zalecana zamiast klawiatury do latania, jednak nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać pomoc dotyczącą poleceń klawiatury, gdy FlightGear jest uruchomiony, przejdź do menu ''Pomoc'', spójrz w ''Podstawowe klawisze'' (dla poleceń związanych z symulatorem), ''Wspólne klawisze statków powietrznych'' (dla poleceń uniwersalnych dla wszystkich statków powietrznych) i ''Pomoc dla statku powietrznego'' (dla poleceń specyficznych dla Twojego statku). Jeśli główne menu jest ukryte, naciśnij {{key press|F10}}. Jeśli przychodzisz z innych symulatorów, sprawdź [[key commands compared to other simulators|porównanie poleceń klawiatury z innymi symulatorami]], aby uzyskać przegląd różnic między poleceniami klawiatury tego symulatora a FlightGear.&lt;br /&gt;
&lt;br /&gt;
Aby użyć myszy do latania statkiem powietrznym, naciśnij {{key press|Tab}} (kursor powinien zmienić się w krzyżyk) i przesuwaj myszą, aby kierować statkiem powietrznym. Naciśnij ponownie {{key press|Tab}}, aby rozglądać się (kursor powinien pokazywać dwustronną strzałkę), i naciśnij {{key press|Tab}} ponownie, aby wrócić do trybu normalnego, używanego do klikania elementów w kokpicie. Możesz kliknąć &amp;quot;Plik &amp;gt; Urządzenia wejściowe &amp;gt; Konfiguracja myszy&amp;quot;, aby dostosować czułość myszy.&lt;br /&gt;
&lt;br /&gt;
Dla większości użytkowników nieposiadających kontroli osi steru kierunku, trudno jest ręcznie koordynować ruchy [[aileron|lotki]] i [[rudder|steru kierunku]] podczas zakrętu. Aby włączyć autokoordynację i ułatwić latanie, możesz kliknąć &amp;quot;Ustawienia&amp;quot;, następnie kliknąć przycisk &amp;quot;Pokaż więcej&amp;quot; po prawej stronie &amp;quot;Ogólne&amp;quot;, a na końcu kliknąć &amp;quot;Włącz autokoordynację&amp;quot; w Launcherze.&lt;br /&gt;
&lt;br /&gt;
=== Pierwszy raz w kokpicie ===&lt;br /&gt;
Orientacja w kokpicie może być wyzwaniem za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Możesz użyć {{key press|Ctrl|V}}, aby przełączyć się na widok kokpitu. Jeśli tekst na panelu jest zbyt mały, możesz użyć trybu widoku myszy (naciśnij Tab, aż uzyskasz kursor w kształcie podwójnej strzałki), aby przesuwać widok, i kółko myszy, aby przybliżać, lub przesuwać widok za pomocą czapki joysticka i przybliżać za pomocą {{key press|X}} i {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wielu podejmuje po wejściu do nieznanego kokpitu, jest naciśnięcie {{key press|Ctrl|C}} w celu podświetlenia wszystkich &amp;quot;gorących punktów&amp;quot;, czyli elementów sterujących przyrządami, przycisków, pokręteł itp. Wiele statków powietrznych oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik lub magneto, mogą być trudne w użyciu lub po prostu nie mieć klikalnych &amp;quot;gorących punktów&amp;quot;, zwłaszcza w modelach statków powietrznych w fazie rozwoju. W większości przypadków możesz użyć klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu &amp;quot;Pomoc &amp;gt; Pomoc dla statku powietrznego&amp;quot; lub &amp;quot;Pomoc &amp;gt; Wspólne klawisze statków powietrznych&amp;quot;, ale czasami niektóre klawisze są przypisywane ponownie przez statek powietrzny lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
=== Uruchamianie silnika ===&lt;br /&gt;
Chcesz już lecieć, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Większość statków powietrznych ma wpis ''autostart'' w swoim niestandardowym menu, ale oto ogólna procedura, która powinna działać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem tłokowym, potrzebujesz (po upewnieniu się, że gra nie jest wstrzymana {{key press|p}}):&lt;br /&gt;
# Paliwo: niektóre statki powietrzne rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
# Prawidłowa mieszanka paliwowa: zazwyczaj jest ''bogata'', więc wciśnij czerwony pokrętło do samego końca lub użyj klawisza {{key press|m}}, aby wzbogacić ({{key press|Shift|m}} zuboża).&lt;br /&gt;
# Iskrowniki ustawione na ''Both'': obróć kluczyk lub naciśnij {{key press|&amp;amp;#125;}} ''trzy razy'', aby przejść przez ''R'', ''L'', ''Both''.&lt;br /&gt;
# Przepustnica: niektóre silniki lepiej uruchamiają się przy odrobinie gazu.&lt;br /&gt;
# Uruchom rozrusznik: kliknij pozycję ''Start'' kluczyka na panelu lub naciśnij {{key press|s}}. Przytrzymaj rozrusznik przez wystarczający czas, nawet 10 sekund.&lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w statku powietrznym z wieloma silnikami jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że musisz powtórzyć tę samą sekwencję rozruchu dla każdego silnika. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: naciśnij {{key press|~}} i cała powyższa procedura zadziała dla wszystkich silników. Należy jednak pamiętać, że domyślny panel 2D jest podłączony do ''tylko jednego silnika'' i sztuczka z {{key press|~}} może nie zadziałać. Dodaj też trochę gazu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla odrzutowców, śmigłowców lub innych typów statków powietrznych o złożonych procedurach rozruchu. Sprawdź instrukcje w menu pomocy statku powietrznego (naciśnij {{key press|?}}) i/lub spójrz na [[Aircraft|artykuł o tym statku powietrznym na tej wiki]]. Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem odrzutowym, musisz:&lt;br /&gt;
# Ustawić odcięcie ''ON''&lt;br /&gt;
# Włączyć rozrusznik&lt;br /&gt;
# Gdy silniki osiągną około 5% N1, ustawić odcięcie ''OFF''&lt;br /&gt;
# Wyłączyć rozrusznik, gdy silnik osiągnie prędkość roboczą&lt;br /&gt;
&lt;br /&gt;
== Nauka latania ==&lt;br /&gt;
=== Podręcznik FlightGear ===&lt;br /&gt;
FlightGear ma oficjalny [https://www.flightgear.org/support/manual/ podręcznik], który obejmuje podstawy latania. Jako początkujący, możesz chcieć zacząć od [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/pl/HTML/getstart-plch8.html Rozdziału 8: Podstawowy poradnik symulatora lotu].&lt;br /&gt;
&lt;br /&gt;
=== Samouczki ===&lt;br /&gt;
Wiele statków powietrznych ma własne interaktywne [[tutorials|samouczki]]. Dzięki samouczkom możesz nauczyć się obsługiwać konkretny statek powietrzny, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczków, przechodząc do ''Pomoc'' &amp;amp;gt; ''Samouczek''. Świetnym miejscem na rozpoczęcie jest samouczek dla statku powietrznego [[Cessna 172P]], powszechnie używanego w rzeczywistości do nauki latania statkami powietrznymi o stałych skrzydłach.&lt;br /&gt;
&lt;br /&gt;
Jeśli samouczek zaczyna się bez pasa startowego i w otoczeniu wody, Twoja instalacja FlightGeara nie ma scenerii dla lotniska, na którym samouczek miał się odbyć. Aby uzyskać scenerię, zobacz sekcję [[#Getting scenery|#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
== Twój pierwszy lot ==&lt;br /&gt;
=== Realizm ===&lt;br /&gt;
Jednym z najczęstszych pytań, jakie zadają początkujący piloci na temat każdego symulatora lotu, ale zwłaszcza FlightGeara, jest &amp;quot;Dlaczego mój statek powietrzny cały czas skręca w lewo?&amp;quot; Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobne jest, że wynika to z [[Understanding Propeller Torque and P-Factor|momentu obrotowego śmigła i efektu P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo haseł marketingowych głoszących co innego, niektóre ustawienia są obniżone, aby statek powietrzny był łatwiejszy w pilotażu. Zmniejsza to efekty takie jak powyższy. Realizm we FlightGear jest zawsze podkręcony do maksimum.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre punkty realizmu FlightGeara, które mogą dezorientować początkujących pilotów:&lt;br /&gt;
* &amp;quot;Syndrom skręcania w lewo&amp;quot; z wyżej wymienionych powodów.&lt;br /&gt;
* Błąd skrętu kompasu: Kompas, poddany siłom lotu, ma tendencję do skręcania w przeciwnym kierunku na krótki okres, zanim ustabilizuje się na prawidłowym kursie. Nie jest to usterka (zobacz także artykuł Wikipedii {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* Wskaźnik prędkości pionowej (VSI) również jest obarczony błędem.&lt;br /&gt;
* [[Horizontal Situation Indicator|Wskaźnik sytuacji poziomej]] (HSI) jest napędzany przez żyroskop (dlatego czasami nazywa się go żyroskopem kierunkowym), który podlega ''dryfowi żyroskopowemu''. Wskaźnik będzie odchylać się od aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
* Nie możesz po prostu przerwać skrętu lub wznoszenia poprzez wycentrowanie drążka lub pałki sterowniczej. Musisz skręcić lub popchnąć drążek w drugą stronę, aby wrócić do lotu poziomego. Ale nawet wtedy samolot nie utrzyma samodzielnie swojej wysokości ani kursu. Częstym błędem jest próba znalezienia pozycji drążka, przy której można puścić stery. Chociaż za pomocą trymowania można zostawić samolot na kilka sekund, trzeba użyć autopilota lub stale regulować drążek.&lt;br /&gt;
&lt;br /&gt;
Na statek powietrzny w locie działa wiele sił, a także na [[avionics and instruments|awionikę i przyrządy]] używane do sterowania i nawigacji, co może być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy przyrządów, które istnieją w rzeczywistym świecie''. Jeśli nie chcesz tego, naciśnij {{key press|h}}, aby włączyć HUD.&lt;br /&gt;
&lt;br /&gt;
=== Lotniska i pomoce nawigacyjne ===&lt;br /&gt;
Gdy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z interfejsu Launchera, możesz zastanawiać się, jak określić, jakie lotniska są dostępne. Program uruchamiający wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS|ILS]]. Nie znajdziesz mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Zobacz [[Getting aeronautical charts|Pozyskiwanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
W symulatorze dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;amp;gt; ''Wyposażenie'' &amp;amp;gt; ''Mapa'', która pozwoli Ci zobaczyć dane nawigacyjne oraz pozycję lotnisk i pomocy. Aby uzyskać więcej pomocy dotyczącej nawigacji, zobacz [[Understanding navigation|Zrozumienie nawigacji]].&lt;br /&gt;
&lt;br /&gt;
=== Latanie z autopilotem ===&lt;br /&gt;
Ogólny [[autopilot|autopilot]] jest dostępny w menu ''Autopilot &amp;gt; Ustawienia autopilota'', podczas gdy wiele statków powietrznych ma własny ''specyficzny'' autopilot, często będący modelem rzeczywistego.&lt;br /&gt;
&lt;br /&gt;
W przypadku statków powietrznych, które mają własny autopilot, powinieneś używać elementów sterujących autopilotem dostępnych w wirtualnym kokpicie. Oznacza to klikanie na panelu przyrządów w wirtualnym kokpicie. Menu Autopilot może być wyszarzone i niedostępne, gdy statek powietrzny dostarcza własny autopilot w niektórych statkach powietrznych, w tym Airbuses i [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172 jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilot Bendix/King KAP140]] w swoim wirtualnym kokpicie. Możesz używać zarówno urządzenia autopilota w kokpicie, jak i [[Autopilot#Autopilot Settings|ustawień autopilota]] z menu.&lt;br /&gt;
&lt;br /&gt;
== Zaawansowane ==&lt;br /&gt;
=== Latanie ===&lt;br /&gt;
{{Main article|Aircraft|Statki powietrzne}}&lt;br /&gt;
&lt;br /&gt;
* Jeśli nadal latasz lekkimi cywilnymi statkami powietrznymi, [[Cessna 182S]], która jest bardziej złożona niż C172P, oraz [[Piper PA28 Warrior II|PA28]] to dobre wybory.&lt;br /&gt;
* Jeśli interesuje Cię latanie liniami lotniczymi, sugeruje się rodziny [[Airbus A320 family|Airbus A320]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] i [[MD-80]].&lt;br /&gt;
* Jeśli fascynują Cię samoloty myśliwskie, wybierz wysoko oceniany wojskowy statek powietrzny (taki jak [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) z [[Aircraft#Modern military aircraft|tej listy]] i włącz obrażenia w trybie wieloosobowym lub zainstaluj [[Bombable]].&lt;br /&gt;
* Jeśli przechodzisz na śmigłowce, zaleca się latanie [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Oprócz zwykłych statków powietrznych dostępne są również szczegółowe [[Space Shuttle|wahadłowce kosmiczne]].&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
Fascynujące jest odkrywanie [[scenery|scenerii]] (lub po prostu testowanie grafiki/szybkości klatek) za pomocą [[UFO|UFO]]. Po pierwsze, [[#Configuring rendering and UI|zwiększ swoją jakość grafiki]]. Jeśli początkowo nie widzisz budynków, pozostaw FG otwarte i odczekaj chwilę, aż [[TerraSync]] zakończy pobieranie i budynki się pojawią.&lt;br /&gt;
Istnieje wiele [[Suggested airports|dobrze rozwiniętych lotnisk]] i obszarów scenerii. Możesz również eksplorować obiekty scenerii na [https://scenery.flightgear.org/map mapie modeli].&lt;br /&gt;
&lt;br /&gt;
=== Tryb wieloosobowy ===&lt;br /&gt;
FlightGear ma kilka serwerów wieloosobowych, które pozwolą Ci latać w bardziej ożywionych przestworzach; zobacz [[Howto: Multiplayer|Tryb wieloosobowy]]. Istnieją również [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Dostępna jest również [[MPMap|mapa wieloosobowa]], która pozwala zobaczyć, kto jest aktualnie online, a nawet jakie [[navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
=== Elementy menu ===&lt;br /&gt;
Aby szybko zapoznać się z użyciem każdej pozycji menu w FlightGear, zobacz [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
FlightGear ma wiele [[Addon|dodatków]] innych firm zawierających ulepszenia. Dla początkujących, [[Logbook Add-on|Dziennik lotów]] i dodatek [[Which Runway Add-on|Który pas]] mogą być najbardziej przydatnymi dodatkami.&lt;br /&gt;
&lt;br /&gt;
== Społeczność FlightGear ==&lt;br /&gt;
=== Uzyskiwanie pomocy ===&lt;br /&gt;
Ta strona została zaprojektowana, aby zapewnić użytkownikowi najważniejsze informacje, które musi wiedzieć o korzystaniu z FlightGeara po raz pierwszy. Oprócz [[Pl/Portal:Użytkownik|portalu użytkownika]] tej wiki, istnieją inne strony, które możesz chcieć przeczytać:&lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...oraz kanały komunikacji, które mogą być używane do uzyskania informacji lub poproszenia o pomoc:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''obowiązkowa lektura'' dla początkujących;&lt;br /&gt;
*{{forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord FlightGear]], najszybszy sposób na uzyskanie pomocy;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa użytkowników FlightGeara]], największa szansa na kontakt z głównymi deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydaniowego.&lt;br /&gt;
&lt;br /&gt;
=== Dostosowywanie FlightGear bez kompilacji ===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje prekompilowane pliki binarne do pobrania i instalacji na Windows, macOS i Linux. Ponadto większość dystrybucji Linuksa udostępnia spakowaną wersję w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGear jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i jesteś zachęcany'' do wprowadzania zmian w modelach lotu statków powietrznych, scenerii, teksturach, [[shader|shaderach]] OpenGL i każdej innej funkcji, którą chcesz zmienić dla własnej satysfakcji lub podzielić się z innymi użytkownikami FlightGeara. Jeśli to zamierzasz zrobić, spójrz na [[Pl/Portal:Developer|portal dewelopera]].&lt;br /&gt;
&lt;br /&gt;
=== Jak możesz pomóc ===&lt;br /&gt;
{{Main article|Volunteer|Wolontariusz}}&lt;br /&gt;
FlightGear to projekt open source, oparty na wolontariacie. Oznacza to, że wszystko, co tu znajdziesz, pochodzi z pasji, wolnego czasu i niczego więcej. Obejmuje to symulator, scenerię, statki powietrzne, wiki, {{forum link|text=forum}} i wszystko inne. Wolontariusze, w istocie ''ludzie, którzy coś robią'', są fundamentalni dla tego projektu. Bez nich nie zrobiłby ani jednego kroku do przodu. Dlatego ważne jest, aby współtwórcy dobrze się bawili tym, co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść wkład w ten projekt, powinieneś zapoznać się z kilkoma artykułami, które dadzą Ci pewne wskazówki:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Jak zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Dziedzin, w których ich pomoc byłaby doceniona, jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Skompiluj]] najnowszy kod Git&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj raporty o błędach]&lt;br /&gt;
*Uruchamianie FlightGeara za pomocą programu valgrind w celu wykrycia wycieków pamięci&lt;br /&gt;
&lt;br /&gt;
;Wsparcie:&lt;br /&gt;
*Pomoc nowym użytkownikom w pobieraniu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara ({{forum link|text=na forum}} lub na [[Discord|Discordzie]])&lt;br /&gt;
*Dostarczanie pomysłów i sugestii, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje / Propozycje / Pomysły]]&lt;br /&gt;
*Pomoc w [[Portal:Wiki|oczyszczeniu tej wiki]]&lt;br /&gt;
*Pomoc w dostarczaniu nowych treści dla brakujących stron wiki&lt;br /&gt;
&lt;br /&gt;
;Rozwój:&lt;br /&gt;
*Podstawowy kod źródłowy:&lt;br /&gt;
**Dostarczanie [[Howto:Start core development|wkładu w kod źródłowy, dane i dokumentację]]&lt;br /&gt;
**Dostarczanie [[Bugs|poprawek błędów]] lub nowych funkcji&lt;br /&gt;
*Rozwój statków powietrznych (modelowanie 3D, tekstury, modele lotu, skrypty)&lt;br /&gt;
*Rozwój scenerii (teren, modele, pogoda)&lt;br /&gt;
*Zaangażowanie w którykolwiek z innych projektów powiązanych z FlightGearem&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145097</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145097"/>
		<updated>2026-06-17T12:47:54Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Dostosowywanie FlightGear bez kompilacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Postaramy się pomóc Ci wzbić się w wirtualne powietrze w najkrótszym możliwym czasie. Przedstawimy Ci również niektóre funkcje tego symulatora lotu oraz kilka informacji o jego społeczności.&lt;br /&gt;
&lt;br /&gt;
== Instalacja i konfiguracja ==&lt;br /&gt;
=== Wymagania sprzętowe ===&lt;br /&gt;
Aby FlightGear działał płynnie, wymaga karty graficznej ze sterownikami OpenGL 4.0 lub nowszymi. Zwykle nie stanowi to problemu, ale zapoznaj się z [[Pl/Wymagania_sprzętowe|zaleceniami sprzętowymi]], aby lepiej to zrozumieć.&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie FlightGeara ===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze strony [https://www.flightgear.org/download/ Pobieranie FlightGear]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego systemu. Dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuksa dla wersji 2020.3 LTS i nowszych. Większość użytkowników Linuksa odkryje, że większość dystrybucji ma spakowaną wersję FlightGeara (nazwa pakietu może brzmieć &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twoich umiejętności technicznych możesz wybrać deweloperską wersję [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre najnowsze rozwijane statki powietrzne, ale może być niestabilna i jest bardziej skomplikowana do zdobycia dla użytkowników innych niż Windows. Ogólnie rzecz biorąc, wersja deweloperska nie jest zalecana dla przeciętnego użytkownika, ale jeśli chcesz przeprowadzić kilka testów, dostępna jest wersja nocna do [https://www.flightgear.org/download/nightly/ pobrania]. Jeśli używasz kopii FlightGeara kontrolowanej przez system Git, możesz zsynchronizować swoje statki powietrzne za pomocą kontrolowanego przez system repozytorium rozwojowego statków powietrznych [[Pl/FGAddon|FGAddon]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie Windows ===&lt;br /&gt;
Po pobraniu instalatora uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen w systemie Windows może zablokować instalację po prostu dlatego, że plik binarny nie jest podpisany kluczem, który Microsoft uznaje. Oczywiście klucz jest płatny. W takim przypadku musimy kliknąć niepozorny link &amp;quot;Więcej informacji&amp;quot;. Dopiero wtedy pojawi się przycisk &amp;quot;Uruchom mimo to&amp;quot;. Możesz bezpiecznie zaufać, że nie jest to niebezpieczna aplikacja, pod warunkiem, że pobrałeś ją z oficjalnych źródeł.&lt;br /&gt;
&lt;br /&gt;
Jeśli z jakiegoś powodu używasz oprogramowania antywirusowego innej firmy, może ono blokować instalację FlightGeara. Nie jest to coś, na co mamy wpływ, więc to od Ciebie zależy, jak chcesz to rozwiązać.&lt;br /&gt;
&lt;br /&gt;
Za pomocą instalatora Windows możesz wybrać miejsce instalacji FlightGeara. Katalog [[Pl/$FG_ROOT|$FG_ROOT]] będzie miał ścieżkę &amp;lt;code&amp;gt;&amp;amp;lt;wybrany katalog&amp;amp;gt;/fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie macOS ===&lt;br /&gt;
Instalacja FlightGeara w systemie macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGeara do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Gdy uruchamiasz FlightGeara po raz pierwszy, jego ikona w Docku podskakuje przez kilka sekund podczas ładowania informacji o statkach powietrznych i lotniskach. Gdy pojawi się graficzny program uruchamiający, wybierz statek powietrzny i lotnisko, a następnie kliknij &amp;quot;Lećmy!&amp;quot;, aby uruchomić symulator. Możesz skonfigurować więcej opcji za pomocą graficznego programu uruchamiającego. Zobacz [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program oficjalną instrukcję] po więcej szczegółów.&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGeara z wiersza poleceń, uruchom aplikację Terminal i wpisz następujące polecenia.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options.....&lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawione w systemie macOS. Jeśli chcesz samodzielnie określić te zmienne do użycia w wierszu poleceń, uruchom następujące polecenia w aplikacji Terminal:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu graficznego programu uruchamiającego będziesz mieć alias do [[Pl/$FG_ROOT|$FG_ROOT]] w ścieżce &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt;, dzięki czemu możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara użytkownicy komputerów Mac mogą zlokalizować swój folder [[Pl/$FG_ROOT|$FG_ROOT]], otwierając folder Aplikacje w Finderze, klikając prawym przyciskiem myszy FlightGear i wybierając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do wnętrza folderu FlightGear. Masz teraz dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowe statki powietrzne]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja ze źródeł ===&lt;br /&gt;
Główny artykuł: [[Building FlightGear|Kompilacja FlightGeara]]&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie scenerii ===&lt;br /&gt;
Z FlightGearem instalowany jest ograniczony zestaw [[scenery|scenerii]]. Dla FlightGear 2024.1 składa się on z:&lt;br /&gt;
* obszaru wokół wyróżnionego lotniska dla tej wersji, czyli [[Keflavik_Airport|Międzynarodowego Portu Lotniczego Keflavik]] (BIKF)&lt;br /&gt;
* lotniska używanego w samouczku dla [[Pl/Cessna 172P|Cessny 172P]], czyli [[Hilo_International_Airport|Międzynarodowego Portu Lotniczego Hilo]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest zazwyczaj przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i dzieli się na trzy rodzaje danych:&lt;br /&gt;
* '''Airports''' zawiera dane o lotniskach, takie jak wykorzystanie pasów startowych i miejsca postojowe.&lt;br /&gt;
* '''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp., które reprezentują trójwymiarowe struktury.&lt;br /&gt;
* '''Terrain''' reprezentuje kontury, wzniesienia i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Obecnym sposobem &amp;quot;instalowania&amp;quot; nowej scenerii jest włączenie [[TerraSync]], które automatycznie pobierze i zaktualizuje każde odwiedzane miejsce - nawet w locie! Jeśli masz wolne połączenie internetowe i/lub wolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz ręcznie pobrać i zainstalować nowe części scenerii, oficjalną [[World Scenery|scenerię świata]] lub niestandardową scenerię.&lt;br /&gt;
&lt;br /&gt;
Sceneria jest również dostępna na [https://www.flightgear.org/download/mirrors/ stronie mirrorów] witryny FlightGear i można ją zainstalować, postępując zgodnie z instrukcją [[Howto: Install scenery|Jak zainstalować scenerię]]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabymi komputerami!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowa sceneria jest dostępna w wielu miejscach. Na przykład na {{forum link|f=5|text=forum FlightGear}} lub w repozytoriach. Wyszukiwanie w Internecie powinno pozwolić je znaleźć. Zobacz stronę [[Suggested_custom_scenery|sugerowanej niestandardowej scenerii]] po kilka najnowszych wydań.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS i nowsze dodały eksperymentalną obsługę trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz notatki o [[OSM2City 1st Worldbuild|1. światowej kompilacji OSM2City]] (marzec 2021). Ręczne pobieranie struktur 3D dla regionów lub całych krajów jest dostępne na stronie wiki z [[Areas populated with osm2city scenery|pobraniami osm2City]].&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie statków powietrznych ===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|statki powietrzne]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz przejść na stronę internetową FlightGeara i przejść do strony [http://www.flightgear.org/download/ pobierania], a następnie wybrać link do pobrania statków powietrznych pasujący do Twojej wersji FlightGeara. Ponadto istnieje wiele [[hangars|hangarów]] innych firm. Informacje o instalacji znajdziesz w [[Pl/Instalowanie samolotów|Jak zainstalować statek powietrzny]].&lt;br /&gt;
&lt;br /&gt;
== Uruchamianie FlightGeara ==&lt;br /&gt;
=== Uruchamianie FlightGeara ===&lt;br /&gt;
Najłatwiejszym sposobem uruchomienia FlightGeara jest użycie ikony na pulpicie. Uruchamia to interfejs graficzny [[FlightGear Qt launcher|Launchera]], w którym możesz wybrać statek powietrzny, pozycję startową itp. &amp;lt;!-- Poniższe przypomnienie powinno zostać usunięte, gdy program uruchamiający jasno określi, że są dodatkowe rzeczy do załatwienia za pomocą menu w symulatorze, aby skonfigurować FG --&amp;gt; Pamiętaj, że Launcher ma tylko podstawowe opcje, aby Ci pomóc. Wiele opcji dotyczących grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input_device|urządzeń wejściowych]] itp. jest dostępnych z [[menu|menu]] wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników wybiera jednak uruchamianie FlightGeara bezpośrednio z wiersza poleceń. Nazwa pliku wykonywalnego to &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; (lub plik AppImage, np. &amp;quot;flightgear-2024.1.6-linux-amd64.AppImage&amp;quot;) i można go uruchomić bez opcji. Jeśli &amp;quot;nie został znaleziony&amp;quot;, prawdopodobnie nie znajduje się w Twojej [https://en.wikipedia.org/wiki/PATH_(variable) ścieżce]. Lokalizacja zależy od Twojego konkretnego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|parametrów wiersza poleceń]], których należy użyć do zmiany wielu opcji, takich jak wybrany statek powietrzny. Najważniejsze z nich:&lt;br /&gt;
&lt;br /&gt;
 fgfs --launcher                # otwiera Launcher FlightGeara&lt;br /&gt;
 fgfs --show-aircraft           # wyświetla listę zainstalowanych statków powietrznych&lt;br /&gt;
 fgfs --aircraft=c172p          # uruchamia FG z statkiem powietrznym &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Launcher umożliwia również użytkownikom dodawanie parametrów wiersza poleceń dla opcji, które są zwykle zmieniane z poziomu menu wewnątrz symulatora, a także dość zaawansowanych opcji dostępnych tylko z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguracja renderowania i interfejsu użytkownika ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|Okno dialogowe Widok &amp;gt; Opcje renderowania.]]&lt;br /&gt;
Jeśli jakość renderowania lub liczba klatek na sekundę jest zbyt niska, kliknij &amp;quot;Widok &amp;gt; Opcje renderowania&amp;quot;, aby dostosować ustawienia graficzne. Dla nowszego sprzętu zaleca się ustawienie &amp;quot;jakości grafiki&amp;quot; na wysoką i zaznaczenie &amp;quot;użyj miejsca na dysku dla szybszego ładowania&amp;quot;, &amp;quot;animowane rękawy&amp;quot; i &amp;quot;satelitarna fotosceneria&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli tekst menu wydaje się zbyt mały na ekranach o wysokiej rozdzielczości lub dużych ekranach, możesz ręcznie [[Menubar#How to Change the Default Menubar Font Size|zmienić rozmiar czcionki paska menu]], edytując plik danych, lub po prostu kliknąć &amp;quot;Debuguj &amp;gt; Zmień styl GUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Używanie klawiatury i/lub myszy ===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[joystick|joysticka]] lub innych kontrolerów czasami używają klawiatury lub myszy do sterowania swoim statkiem powietrznym. Używanie klawiatury do latania może być trudne, a mysz jest zalecana zamiast klawiatury do latania, jednak nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać pomoc dotyczącą poleceń klawiatury, gdy FlightGear jest uruchomiony, przejdź do menu ''Pomoc'', spójrz w ''Podstawowe klawisze'' (dla poleceń związanych z symulatorem), ''Wspólne klawisze statków powietrznych'' (dla poleceń uniwersalnych dla wszystkich statków powietrznych) i ''Pomoc dla statku powietrznego'' (dla poleceń specyficznych dla Twojego statku). Jeśli główne menu jest ukryte, naciśnij {{key press|F10}}. Jeśli przychodzisz z innych symulatorów, sprawdź [[key commands compared to other simulators|porównanie poleceń klawiatury z innymi symulatorami]], aby uzyskać przegląd różnic między poleceniami klawiatury tego symulatora a FlightGear.&lt;br /&gt;
&lt;br /&gt;
Aby użyć myszy do latania statkiem powietrznym, naciśnij {{key press|Tab}} (kursor powinien zmienić się w krzyżyk) i przesuwaj myszą, aby kierować statkiem powietrznym. Naciśnij ponownie {{key press|Tab}}, aby rozglądać się (kursor powinien pokazywać dwustronną strzałkę), i naciśnij {{key press|Tab}} ponownie, aby wrócić do trybu normalnego, używanego do klikania elementów w kokpicie. Możesz kliknąć &amp;quot;Plik &amp;gt; Urządzenia wejściowe &amp;gt; Konfiguracja myszy&amp;quot;, aby dostosować czułość myszy.&lt;br /&gt;
&lt;br /&gt;
Dla większości użytkowników nieposiadających kontroli osi steru kierunku, trudno jest ręcznie koordynować ruchy [[aileron|lotki]] i [[rudder|steru kierunku]] podczas zakrętu. Aby włączyć autokoordynację i ułatwić latanie, możesz kliknąć &amp;quot;Ustawienia&amp;quot;, następnie kliknąć przycisk &amp;quot;Pokaż więcej&amp;quot; po prawej stronie &amp;quot;Ogólne&amp;quot;, a na końcu kliknąć &amp;quot;Włącz autokoordynację&amp;quot; w Launcherze.&lt;br /&gt;
&lt;br /&gt;
=== Pierwszy raz w kokpicie ===&lt;br /&gt;
Orientacja w kokpicie może być wyzwaniem za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Możesz użyć {{key press|Ctrl|V}}, aby przełączyć się na widok kokpitu. Jeśli tekst na panelu jest zbyt mały, możesz użyć trybu widoku myszy (naciśnij Tab, aż uzyskasz kursor w kształcie podwójnej strzałki), aby przesuwać widok, i kółko myszy, aby przybliżać, lub przesuwać widok za pomocą czapki joysticka i przybliżać za pomocą {{key press|X}} i {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wielu podejmuje po wejściu do nieznanego kokpitu, jest naciśnięcie {{key press|Ctrl|C}} w celu podświetlenia wszystkich &amp;quot;gorących punktów&amp;quot;, czyli elementów sterujących przyrządami, przycisków, pokręteł itp. Wiele statków powietrznych oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik lub magneto, mogą być trudne w użyciu lub po prostu nie mieć klikalnych &amp;quot;gorących punktów&amp;quot;, zwłaszcza w modelach statków powietrznych w fazie rozwoju. W większości przypadków możesz użyć klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu &amp;quot;Pomoc &amp;gt; Pomoc dla statku powietrznego&amp;quot; lub &amp;quot;Pomoc &amp;gt; Wspólne klawisze statków powietrznych&amp;quot;, ale czasami niektóre klawisze są przypisywane ponownie przez statek powietrzny lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
=== Uruchamianie silnika ===&lt;br /&gt;
Chcesz już lecieć, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Większość statków powietrznych ma wpis ''autostart'' w swoim niestandardowym menu, ale oto ogólna procedura, która powinna działać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem tłokowym, potrzebujesz (po upewnieniu się, że gra nie jest wstrzymana {{key press|p}}):&lt;br /&gt;
# Paliwo: Niektóre statki powietrzne rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
# Prawidłowa mieszanka paliwowa: Zazwyczaj jest ''bogata'', więc wciśnij czerwony pokrętło do samego końca lub użyj klawisza {{key press|m}}, aby wzbogacić ({{key press|Shift|m}} zuboża).&lt;br /&gt;
# Magneto ustawione na ''obie'': Obróć kluczyk lub naciśnij {{key press|&amp;amp;#125;}} ''trzy razy'', aby przejść przez ''R'', ''L'', ''Obie''.&lt;br /&gt;
# Przepustnica: Niektóre silniki lepiej uruchamiają się przy odrobinie gazu.&lt;br /&gt;
# Uruchom rozrusznik: Kliknij pozycję ''Start'' kluczyka na panelu lub naciśnij {{key press|s}}. Przytrzymaj rozrusznik przez wystarczający czas, nawet 10 sekund.&lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w statku powietrznym z wieloma silnikami jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że musisz powtórzyć tę samą sekwencję rozruchu dla każdego silnika. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: naciśnij {{key press|~}} i cała powyższa procedura zadziała dla wszystkich silników. Należy jednak pamiętać, że domyślny panel 2D jest podłączony do ''tylko jednego silnika'' i sztuczka z {{key press|~}} może nie zadziałać. Dodaj też trochę gazu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla odrzutowców, śmigłowców lub innych typów statków powietrznych o złożonych procedurach rozruchu. Sprawdź instrukcje w menu pomocy statku powietrznego (naciśnij {{key press|?}}) i/lub spójrz na [[Aircraft|artykuł o tym statku powietrznym na tej wiki]]. Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem odrzutowym, musisz:&lt;br /&gt;
# Ustawić odcięcie ''ON''&lt;br /&gt;
# Włączyć rozrusznik&lt;br /&gt;
# Gdy silniki osiągną około 5% N1, ustawić odcięcie ''OFF''&lt;br /&gt;
# Wyłączyć rozrusznik, gdy silnik osiągnie prędkość roboczą&lt;br /&gt;
&lt;br /&gt;
== Nauka latania ==&lt;br /&gt;
=== Podręcznik FlightGear ===&lt;br /&gt;
FlightGear ma oficjalny [https://www.flightgear.org/support/manual/ podręcznik], który obejmuje podstawy latania. Jako początkujący, możesz chcieć zacząć od [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/pl/HTML/getstart-plch8.html Rozdziału 8: Podstawowy poradnik symulatora lotu].&lt;br /&gt;
&lt;br /&gt;
=== Samouczki ===&lt;br /&gt;
Wiele statków powietrznych ma własne interaktywne [[tutorials|samouczki]]. Dzięki samouczkom możesz nauczyć się obsługiwać konkretny statek powietrzny, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczków, przechodząc do ''Pomoc'' &amp;amp;gt; ''Samouczek''. Świetnym miejscem na rozpoczęcie jest samouczek dla statku powietrznego [[Cessna 172P]], powszechnie używanego w rzeczywistości do nauki latania statkami powietrznymi o stałych skrzydłach.&lt;br /&gt;
&lt;br /&gt;
Jeśli samouczek zaczyna się bez pasa startowego i w otoczeniu wody, Twoja instalacja FlightGeara nie ma scenerii dla lotniska, na którym samouczek miał się odbyć. Aby uzyskać scenerię, zobacz sekcję [[#Getting scenery|#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
== Twój pierwszy lot ==&lt;br /&gt;
=== Realizm ===&lt;br /&gt;
Jednym z najczęstszych pytań, jakie zadają początkujący piloci na temat każdego symulatora lotu, ale zwłaszcza FlightGeara, jest &amp;quot;Dlaczego mój statek powietrzny cały czas skręca w lewo?&amp;quot; Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobne jest, że wynika to z [[Understanding Propeller Torque and P-Factor|momentu obrotowego śmigła i efektu P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo haseł marketingowych głoszących co innego, niektóre ustawienia są obniżone, aby statek powietrzny był łatwiejszy w pilotażu. Zmniejsza to efekty takie jak powyższy. Realizm we FlightGear jest zawsze podkręcony do maksimum.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre punkty realizmu FlightGeara, które mogą dezorientować początkujących pilotów:&lt;br /&gt;
* &amp;quot;Syndrom skręcania w lewo&amp;quot; z wyżej wymienionych powodów.&lt;br /&gt;
* Błąd skrętu kompasu: Kompas, poddany siłom lotu, ma tendencję do skręcania w przeciwnym kierunku na krótki okres, zanim ustabilizuje się na prawidłowym kursie. Nie jest to usterka (zobacz także artykuł Wikipedii {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* Wskaźnik prędkości pionowej (VSI) również jest obarczony błędem.&lt;br /&gt;
* [[Horizontal Situation Indicator|Wskaźnik sytuacji poziomej]] (HSI) jest napędzany przez żyroskop (dlatego czasami nazywa się go żyroskopem kierunkowym), który podlega ''dryfowi żyroskopowemu''. Wskaźnik będzie odchylać się od aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
* Nie możesz po prostu przerwać skrętu lub wznoszenia poprzez wycentrowanie drążka lub pałki sterowniczej. Musisz skręcić lub popchnąć drążek w drugą stronę, aby wrócić do lotu poziomego. Ale nawet wtedy samolot nie utrzyma samodzielnie swojej wysokości ani kursu. Częstym błędem jest próba znalezienia pozycji drążka, przy której można puścić stery. Chociaż za pomocą trymowania można zostawić samolot na kilka sekund, trzeba użyć autopilota lub stale regulować drążek.&lt;br /&gt;
&lt;br /&gt;
Na statek powietrzny w locie działa wiele sił, a także na [[avionics and instruments|awionikę i przyrządy]] używane do sterowania i nawigacji, co może być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy przyrządów, które istnieją w rzeczywistym świecie''. Jeśli nie chcesz tego, naciśnij {{key press|h}}, aby włączyć HUD.&lt;br /&gt;
&lt;br /&gt;
=== Lotniska i pomoce nawigacyjne ===&lt;br /&gt;
Gdy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z interfejsu Launchera, możesz zastanawiać się, jak określić, jakie lotniska są dostępne. Program uruchamiający wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS|ILS]]. Nie znajdziesz mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Zobacz [[Getting aeronautical charts|Pozyskiwanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
W symulatorze dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;amp;gt; ''Wyposażenie'' &amp;amp;gt; ''Mapa'', która pozwoli Ci zobaczyć dane nawigacyjne oraz pozycję lotnisk i pomocy. Aby uzyskać więcej pomocy dotyczącej nawigacji, zobacz [[Understanding navigation|Zrozumienie nawigacji]].&lt;br /&gt;
&lt;br /&gt;
=== Latanie z autopilotem ===&lt;br /&gt;
Ogólny [[autopilot|autopilot]] jest dostępny w menu ''Autopilot &amp;gt; Ustawienia autopilota'', podczas gdy wiele statków powietrznych ma własny ''specyficzny'' autopilot, często będący modelem rzeczywistego.&lt;br /&gt;
&lt;br /&gt;
W przypadku statków powietrznych, które mają własny autopilot, powinieneś używać elementów sterujących autopilotem dostępnych w wirtualnym kokpicie. Oznacza to klikanie na panelu przyrządów w wirtualnym kokpicie. Menu Autopilot może być wyszarzone i niedostępne, gdy statek powietrzny dostarcza własny autopilot w niektórych statkach powietrznych, w tym Airbuses i [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172 jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilot Bendix/King KAP140]] w swoim wirtualnym kokpicie. Możesz używać zarówno urządzenia autopilota w kokpicie, jak i [[Autopilot#Autopilot Settings|ustawień autopilota]] z menu.&lt;br /&gt;
&lt;br /&gt;
== Zaawansowane ==&lt;br /&gt;
=== Latanie ===&lt;br /&gt;
{{Main article|Aircraft|Statki powietrzne}}&lt;br /&gt;
&lt;br /&gt;
* Jeśli nadal latasz lekkimi cywilnymi statkami powietrznymi, [[Cessna 182S]], która jest bardziej złożona niż C172P, oraz [[Piper PA28 Warrior II|PA28]] to dobre wybory.&lt;br /&gt;
* Jeśli interesuje Cię latanie liniami lotniczymi, sugeruje się rodziny [[Airbus A320 family|Airbus A320]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] i [[MD-80]].&lt;br /&gt;
* Jeśli fascynują Cię samoloty myśliwskie, wybierz wysoko oceniany wojskowy statek powietrzny (taki jak [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) z [[Aircraft#Modern military aircraft|tej listy]] i włącz obrażenia w trybie wieloosobowym lub zainstaluj [[Bombable]].&lt;br /&gt;
* Jeśli przechodzisz na śmigłowce, zaleca się latanie [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Oprócz zwykłych statków powietrznych dostępne są również szczegółowe [[Space Shuttle|wahadłowce kosmiczne]].&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
Fascynujące jest odkrywanie [[scenery|scenerii]] (lub po prostu testowanie grafiki/szybkości klatek) za pomocą [[UFO|UFO]]. Po pierwsze, [[#Configuring rendering and UI|zwiększ swoją jakość grafiki]]. Jeśli początkowo nie widzisz budynków, pozostaw FG otwarte i odczekaj chwilę, aż [[TerraSync]] zakończy pobieranie i budynki się pojawią.&lt;br /&gt;
Istnieje wiele [[Suggested airports|dobrze rozwiniętych lotnisk]] i obszarów scenerii. Możesz również eksplorować obiekty scenerii na [https://scenery.flightgear.org/map mapie modeli].&lt;br /&gt;
&lt;br /&gt;
=== Tryb wieloosobowy ===&lt;br /&gt;
FlightGear ma kilka serwerów wieloosobowych, które pozwolą Ci latać w bardziej ożywionych przestworzach; zobacz [[Howto: Multiplayer|Tryb wieloosobowy]]. Istnieją również [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Dostępna jest również [[MPMap|mapa wieloosobowa]], która pozwala zobaczyć, kto jest aktualnie online, a nawet jakie [[navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
=== Elementy menu ===&lt;br /&gt;
Aby szybko zapoznać się z użyciem każdej pozycji menu w FlightGear, zobacz [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
FlightGear ma wiele [[Addon|dodatków]] innych firm zawierających ulepszenia. Dla początkujących, [[Logbook Add-on|Dziennik lotów]] i dodatek [[Which Runway Add-on|Który pas]] mogą być najbardziej przydatnymi dodatkami.&lt;br /&gt;
&lt;br /&gt;
== Społeczność FlightGear ==&lt;br /&gt;
=== Uzyskiwanie pomocy ===&lt;br /&gt;
Ta strona została zaprojektowana, aby zapewnić użytkownikowi najważniejsze informacje, które musi wiedzieć o korzystaniu z FlightGeara po raz pierwszy. Oprócz [[Pl/Portal:Użytkownik|portalu użytkownika]] tej wiki, istnieją inne strony, które możesz chcieć przeczytać:&lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...oraz kanały komunikacji, które mogą być używane do uzyskania informacji lub poproszenia o pomoc:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''obowiązkowa lektura'' dla początkujących;&lt;br /&gt;
*{{forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord FlightGear]], najszybszy sposób na uzyskanie pomocy;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa użytkowników FlightGeara]], największa szansa na kontakt z głównymi deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydaniowego.&lt;br /&gt;
&lt;br /&gt;
=== Dostosowywanie FlightGear bez kompilacji ===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje prekompilowane pliki binarne do pobrania i instalacji na Windows, macOS i Linux. Ponadto większość dystrybucji Linuksa udostępnia spakowaną wersję w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGear jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i jesteś zachęcany'' do wprowadzania zmian w modelach lotu statków powietrznych, scenerii, teksturach, [[shader|shaderach]] OpenGL i każdej innej funkcji, którą chcesz zmienić dla własnej satysfakcji lub podzielić się z innymi użytkownikami FlightGeara. Jeśli to zamierzasz zrobić, spójrz na [[Pl/Portal:Developer|portal dewelopera]].&lt;br /&gt;
&lt;br /&gt;
=== Jak możesz pomóc ===&lt;br /&gt;
{{Main article|Volunteer|Wolontariusz}}&lt;br /&gt;
FlightGear to projekt open source, oparty na wolontariacie. Oznacza to, że wszystko, co tu znajdziesz, pochodzi z pasji, wolnego czasu i niczego więcej. Obejmuje to symulator, scenerię, statki powietrzne, wiki, {{forum link|text=forum}} i wszystko inne. Wolontariusze, w istocie ''ludzie, którzy coś robią'', są fundamentalni dla tego projektu. Bez nich nie zrobiłby ani jednego kroku do przodu. Dlatego ważne jest, aby współtwórcy dobrze się bawili tym, co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść wkład w ten projekt, powinieneś zapoznać się z kilkoma artykułami, które dadzą Ci pewne wskazówki:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Jak zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Dziedzin, w których ich pomoc byłaby doceniona, jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Skompiluj]] najnowszy kod Git&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj raporty o błędach]&lt;br /&gt;
*Uruchamianie FlightGeara za pomocą programu valgrind w celu wykrycia wycieków pamięci&lt;br /&gt;
&lt;br /&gt;
;Wsparcie:&lt;br /&gt;
*Pomoc nowym użytkownikom w pobieraniu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara ({{forum link|text=na forum}} lub na [[Discord|Discordzie]])&lt;br /&gt;
*Dostarczanie pomysłów i sugestii, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje / Propozycje / Pomysły]]&lt;br /&gt;
*Pomoc w [[Portal:Wiki|oczyszczeniu tej wiki]]&lt;br /&gt;
*Pomoc w dostarczaniu nowych treści dla brakujących stron wiki&lt;br /&gt;
&lt;br /&gt;
;Rozwój:&lt;br /&gt;
*Podstawowy kod źródłowy:&lt;br /&gt;
**Dostarczanie [[Howto:Start core development|wkładu w kod źródłowy, dane i dokumentację]]&lt;br /&gt;
**Dostarczanie [[Bugs|poprawek błędów]] lub nowych funkcji&lt;br /&gt;
*Rozwój statków powietrznych (modelowanie 3D, tekstury, modele lotu, skrypty)&lt;br /&gt;
*Rozwój scenerii (teren, modele, pogoda)&lt;br /&gt;
*Zaangażowanie w którykolwiek z innych projektów powiązanych z FlightGearem&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User_talk:Celesta&amp;diff=145094</id>
		<title>User talk:Celesta</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User_talk:Celesta&amp;diff=145094"/>
		<updated>2026-06-17T12:01:34Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Tłumaczenie Pl/Nowy we FlightGear */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Welcome to the wiki|realName=|name=Celesta}}&lt;br /&gt;
&lt;br /&gt;
-- [[User:New user message|New user message]] ([[User talk:New user message|talk]]) 21:42, 14 May 2026 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Tłumaczenie Pl/Nowy we FlightGear ==&lt;br /&gt;
&lt;br /&gt;
Mam kilka uwag do Twojego tłumaczenia Pl/Nowy we FlightGear:&lt;br /&gt;
&lt;br /&gt;
1. Odmiana nazw własnych: w języku polskim zagraniczne nazwy oprogramowania podlegają normalnej odmianie. Tak jak mówimy „uruchamianie Facebooka” czy &amp;quot;wyszukiwanie w Google'u&amp;quot;, analogicznie poprawną formą jest np. „uruchamianie FlightGeara”.&lt;br /&gt;
&lt;br /&gt;
2. Wymowa i przyimek: piszemy &amp;quot;We FlightGear&amp;quot;, a nie &amp;quot;W FlightGear&amp;quot;. Zastosowanie ma tu ta sama zasada fonetyczna co w przypadku słów &amp;quot;we Francji&amp;quot;, &amp;quot;we Wrocławiu&amp;quot; czy &amp;quot;we flocie&amp;quot; (wokalizacja przyimka ułatwiająca wymowę).&lt;br /&gt;
&lt;br /&gt;
3. Linki wewnętrzne: zauważyłem, że zmieniłeś/aś polskie linki na angielskie. Uważam za zasadę, że polskie Wiki jest linkowanie do polskich wersji artykułów, aby utrzymać czytelnika w tym samym środowisku językowym. Jeśli danej strony jeszcze nie ma po polsku, to wtedy używamy angielskiej.&lt;br /&gt;
&lt;br /&gt;
4. Nazewnictwo Launchera: zamiast rozwlekłych opisów typu &amp;quot;program uruchomieniowy QT FlightGear&amp;quot;, konsekwentnie stosuję po prostu &amp;quot;Launcher&amp;quot;. Zdaję sobie sprawę, że to zapożyczenie, ale chciałem jednej prostej nazwy zamiast pisać rozwlekłe opisy utrudniające czytelność oraz stosuję ją wszędzie, np. w podręczniku i tutaj na wiki.&lt;br /&gt;
&lt;br /&gt;
Poprawiłem już to, ale proszę o trzymanie się tych zasad na przyszłość, bo przysparzasz mi pracy :)&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145092</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=145092"/>
		<updated>2026-06-17T11:37:20Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Postaramy się pomóc Ci wzbić się w wirtualne powietrze w najkrótszym możliwym czasie. Przedstawimy Ci również niektóre funkcje tego symulatora lotu oraz kilka informacji o jego społeczności.&lt;br /&gt;
&lt;br /&gt;
== Instalacja i konfiguracja ==&lt;br /&gt;
=== Wymagania sprzętowe ===&lt;br /&gt;
Aby FlightGear działał płynnie, wymaga karty graficznej ze sterownikami OpenGL 4.0 lub nowszymi. Zwykle nie stanowi to problemu, ale zapoznaj się z [[Pl/Wymagania_sprzętowe|zaleceniami sprzętowymi]], aby lepiej to zrozumieć.&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie FlightGeara ===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze strony [https://www.flightgear.org/download/ Pobieranie FlightGear]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego systemu. Dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuksa dla wersji 2020.3 LTS i nowszych. Większość użytkowników Linuksa odkryje, że większość dystrybucji ma spakowaną wersję FlightGeara (nazwa pakietu może brzmieć &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twoich umiejętności technicznych możesz wybrać deweloperską wersję [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre najnowsze rozwijane statki powietrzne, ale może być niestabilna i jest bardziej skomplikowana do zdobycia dla użytkowników innych niż Windows. Ogólnie rzecz biorąc, wersja deweloperska nie jest zalecana dla przeciętnego użytkownika, ale jeśli chcesz przeprowadzić kilka testów, dostępna jest wersja nocna do [https://www.flightgear.org/download/nightly/ pobrania]. Jeśli używasz kopii FlightGeara kontrolowanej przez system Git, możesz zsynchronizować swoje statki powietrzne za pomocą kontrolowanego przez system repozytorium rozwojowego statków powietrznych [[Pl/FGAddon|FGAddon]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie Windows ===&lt;br /&gt;
Po pobraniu instalatora uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen w systemie Windows może zablokować instalację po prostu dlatego, że plik binarny nie jest podpisany kluczem, który Microsoft uznaje. Oczywiście klucz jest płatny. W takim przypadku musimy kliknąć niepozorny link &amp;quot;Więcej informacji&amp;quot;. Dopiero wtedy pojawi się przycisk &amp;quot;Uruchom mimo to&amp;quot;. Możesz bezpiecznie zaufać, że nie jest to niebezpieczna aplikacja, pod warunkiem, że pobrałeś ją z oficjalnych źródeł.&lt;br /&gt;
&lt;br /&gt;
Jeśli z jakiegoś powodu używasz oprogramowania antywirusowego innej firmy, może ono blokować instalację FlightGeara. Nie jest to coś, na co mamy wpływ, więc to od Ciebie zależy, jak chcesz to rozwiązać.&lt;br /&gt;
&lt;br /&gt;
Za pomocą instalatora Windows możesz wybrać miejsce instalacji FlightGeara. Katalog [[Pl/$FG_ROOT|$FG_ROOT]] będzie miał ścieżkę &amp;lt;code&amp;gt;&amp;amp;lt;wybrany katalog&amp;amp;gt;/fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Instalacja w systemie macOS ===&lt;br /&gt;
Instalacja FlightGeara w systemie macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGeara do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Gdy uruchamiasz FlightGeara po raz pierwszy, jego ikona w Docku podskakuje przez kilka sekund podczas ładowania informacji o statkach powietrznych i lotniskach. Gdy pojawi się graficzny program uruchamiający, wybierz statek powietrzny i lotnisko, a następnie kliknij &amp;quot;Lećmy!&amp;quot;, aby uruchomić symulator. Możesz skonfigurować więcej opcji za pomocą graficznego programu uruchamiającego. Zobacz [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program oficjalną instrukcję] po więcej szczegółów.&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGeara z wiersza poleceń, uruchom aplikację Terminal i wpisz następujące polecenia.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options.....&lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawione w systemie macOS. Jeśli chcesz samodzielnie określić te zmienne do użycia w wierszu poleceń, uruchom następujące polecenia w aplikacji Terminal:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu graficznego programu uruchamiającego będziesz mieć alias do [[Pl/$FG_ROOT|$FG_ROOT]] w ścieżce &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt;, dzięki czemu możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara użytkownicy komputerów Mac mogą zlokalizować swój folder [[Pl/$FG_ROOT|$FG_ROOT]], otwierając folder Aplikacje w Finderze, klikając prawym przyciskiem myszy FlightGear i wybierając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do wnętrza folderu FlightGear. Masz teraz dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowe statki powietrzne]].&lt;br /&gt;
&lt;br /&gt;
=== Instalacja ze źródeł ===&lt;br /&gt;
Główny artykuł: [[Building FlightGear|Kompilacja FlightGeara]]&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie scenerii ===&lt;br /&gt;
Z FlightGearem instalowany jest ograniczony zestaw [[scenery|scenerii]]. Dla FlightGear 2024.1 składa się on z:&lt;br /&gt;
* obszaru wokół wyróżnionego lotniska dla tej wersji, czyli [[Keflavik_Airport|Międzynarodowego Portu Lotniczego Keflavik]] (BIKF)&lt;br /&gt;
* lotniska używanego w samouczku dla [[Pl/Cessna 172P|Cessny 172P]], czyli [[Hilo_International_Airport|Międzynarodowego Portu Lotniczego Hilo]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest zazwyczaj przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i dzieli się na trzy rodzaje danych:&lt;br /&gt;
* '''Airports''' zawiera dane o lotniskach, takie jak wykorzystanie pasów startowych i miejsca postojowe.&lt;br /&gt;
* '''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp., które reprezentują trójwymiarowe struktury.&lt;br /&gt;
* '''Terrain''' reprezentuje kontury, wzniesienia i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Obecnym sposobem &amp;quot;instalowania&amp;quot; nowej scenerii jest włączenie [[TerraSync]], które automatycznie pobierze i zaktualizuje każde odwiedzane miejsce - nawet w locie! Jeśli masz wolne połączenie internetowe i/lub wolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz ręcznie pobrać i zainstalować nowe części scenerii, oficjalną [[World Scenery|scenerię świata]] lub niestandardową scenerię.&lt;br /&gt;
&lt;br /&gt;
Sceneria jest również dostępna na [https://www.flightgear.org/download/mirrors/ stronie mirrorów] witryny FlightGear i można ją zainstalować, postępując zgodnie z instrukcją [[Howto: Install scenery|Jak zainstalować scenerię]]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabymi komputerami!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowa sceneria jest dostępna w wielu miejscach. Na przykład na {{forum link|f=5|text=forum FlightGear}} lub w repozytoriach. Wyszukiwanie w Internecie powinno pozwolić je znaleźć. Zobacz stronę [[Suggested_custom_scenery|sugerowanej niestandardowej scenerii]] po kilka najnowszych wydań.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS i nowsze dodały eksperymentalną obsługę trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz notatki o [[OSM2City 1st Worldbuild|1. światowej kompilacji OSM2City]] (marzec 2021). Ręczne pobieranie struktur 3D dla regionów lub całych krajów jest dostępne na stronie wiki z [[Areas populated with osm2city scenery|pobraniami osm2City]].&lt;br /&gt;
&lt;br /&gt;
=== Pobieranie statków powietrznych ===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|statki powietrzne]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz przejść na stronę internetową FlightGeara i przejść do strony [http://www.flightgear.org/download/ pobierania], a następnie wybrać link do pobrania statków powietrznych pasujący do Twojej wersji FlightGeara. Ponadto istnieje wiele [[hangars|hangarów]] innych firm. Informacje o instalacji znajdziesz w [[Pl/Instalowanie samolotów|Jak zainstalować statek powietrzny]].&lt;br /&gt;
&lt;br /&gt;
== Uruchamianie FlightGeara ==&lt;br /&gt;
=== Uruchamianie FlightGeara ===&lt;br /&gt;
Najłatwiejszym sposobem uruchomienia FlightGeara jest użycie ikony na pulpicie. Uruchamia to interfejs graficzny [[FlightGear Qt launcher|Launchera]], w którym możesz wybrać statek powietrzny, pozycję startową itp. &amp;lt;!-- Poniższe przypomnienie powinno zostać usunięte, gdy program uruchamiający jasno określi, że są dodatkowe rzeczy do załatwienia za pomocą menu w symulatorze, aby skonfigurować FG --&amp;gt; Pamiętaj, że Launcher ma tylko podstawowe opcje, aby Ci pomóc. Wiele opcji dotyczących grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input_device|urządzeń wejściowych]] itp. jest dostępnych z [[menu|menu]] wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników wybiera jednak uruchamianie FlightGeara bezpośrednio z wiersza poleceń. Nazwa pliku wykonywalnego to &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; (lub plik AppImage, np. &amp;quot;flightgear-2024.1.6-linux-amd64.AppImage&amp;quot;) i można go uruchomić bez opcji. Jeśli &amp;quot;nie został znaleziony&amp;quot;, prawdopodobnie nie znajduje się w Twojej [https://en.wikipedia.org/wiki/PATH_(variable) ścieżce]. Lokalizacja zależy od Twojego konkretnego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|parametrów wiersza poleceń]], których należy użyć do zmiany wielu opcji, takich jak wybrany statek powietrzny. Najważniejsze z nich:&lt;br /&gt;
&lt;br /&gt;
 fgfs --launcher                # otwiera Launcher FlightGeara&lt;br /&gt;
 fgfs --show-aircraft           # wyświetla listę zainstalowanych statków powietrznych&lt;br /&gt;
 fgfs --aircraft=c172p          # uruchamia FG z statkiem powietrznym &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Launcher umożliwia również użytkownikom dodawanie parametrów wiersza poleceń dla opcji, które są zwykle zmieniane z poziomu menu wewnątrz symulatora, a także dość zaawansowanych opcji dostępnych tylko z wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguracja renderowania i interfejsu użytkownika ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|Okno dialogowe Widok &amp;gt; Opcje renderowania.]]&lt;br /&gt;
Jeśli jakość renderowania lub liczba klatek na sekundę jest zbyt niska, kliknij &amp;quot;Widok &amp;gt; Opcje renderowania&amp;quot;, aby dostosować ustawienia graficzne. Dla nowszego sprzętu zaleca się ustawienie &amp;quot;jakości grafiki&amp;quot; na wysoką i zaznaczenie &amp;quot;użyj miejsca na dysku dla szybszego ładowania&amp;quot;, &amp;quot;animowane rękawy&amp;quot; i &amp;quot;satelitarna fotosceneria&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli tekst menu wydaje się zbyt mały na ekranach o wysokiej rozdzielczości lub dużych ekranach, możesz ręcznie [[Menubar#How to Change the Default Menubar Font Size|zmienić rozmiar czcionki paska menu]], edytując plik danych, lub po prostu kliknąć &amp;quot;Debuguj &amp;gt; Zmień styl GUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Używanie klawiatury i/lub myszy ===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[joystick|joysticka]] lub innych kontrolerów czasami używają klawiatury lub myszy do sterowania swoim statkiem powietrznym. Używanie klawiatury do latania może być trudne, a mysz jest zalecana zamiast klawiatury do latania, jednak nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby uzyskać pomoc dotyczącą poleceń klawiatury, gdy FlightGear jest uruchomiony, przejdź do menu ''Pomoc'', spójrz w ''Podstawowe klawisze'' (dla poleceń związanych z symulatorem), ''Wspólne klawisze statków powietrznych'' (dla poleceń uniwersalnych dla wszystkich statków powietrznych) i ''Pomoc dla statku powietrznego'' (dla poleceń specyficznych dla Twojego statku). Jeśli główne menu jest ukryte, naciśnij {{key press|F10}}. Jeśli przychodzisz z innych symulatorów, sprawdź [[key commands compared to other simulators|porównanie poleceń klawiatury z innymi symulatorami]], aby uzyskać przegląd różnic między poleceniami klawiatury tego symulatora a FlightGear.&lt;br /&gt;
&lt;br /&gt;
Aby użyć myszy do latania statkiem powietrznym, naciśnij {{key press|Tab}} (kursor powinien zmienić się w krzyżyk) i przesuwaj myszą, aby kierować statkiem powietrznym. Naciśnij ponownie {{key press|Tab}}, aby rozglądać się (kursor powinien pokazywać dwustronną strzałkę), i naciśnij {{key press|Tab}} ponownie, aby wrócić do trybu normalnego, używanego do klikania elementów w kokpicie. Możesz kliknąć &amp;quot;Plik &amp;gt; Urządzenia wejściowe &amp;gt; Konfiguracja myszy&amp;quot;, aby dostosować czułość myszy.&lt;br /&gt;
&lt;br /&gt;
Dla większości użytkowników nieposiadających kontroli osi steru kierunku, trudno jest ręcznie koordynować ruchy [[aileron|lotki]] i [[rudder|steru kierunku]] podczas zakrętu. Aby włączyć autokoordynację i ułatwić latanie, możesz kliknąć &amp;quot;Ustawienia&amp;quot;, następnie kliknąć przycisk &amp;quot;Pokaż więcej&amp;quot; po prawej stronie &amp;quot;Ogólne&amp;quot;, a na końcu kliknąć &amp;quot;Włącz autokoordynację&amp;quot; w Launcherze.&lt;br /&gt;
&lt;br /&gt;
=== Pierwszy raz w kokpicie ===&lt;br /&gt;
Orientacja w kokpicie może być wyzwaniem za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Możesz użyć {{key press|Ctrl|V}}, aby przełączyć się na widok kokpitu. Jeśli tekst na panelu jest zbyt mały, możesz użyć trybu widoku myszy (naciśnij Tab, aż uzyskasz kursor w kształcie podwójnej strzałki), aby przesuwać widok, i kółko myszy, aby przybliżać, lub przesuwać widok za pomocą czapki joysticka i przybliżać za pomocą {{key press|X}} i {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wielu podejmuje po wejściu do nieznanego kokpitu, jest naciśnięcie {{key press|Ctrl|C}} w celu podświetlenia wszystkich &amp;quot;gorących punktów&amp;quot;, czyli elementów sterujących przyrządami, przycisków, pokręteł itp. Wiele statków powietrznych oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik lub magneto, mogą być trudne w użyciu lub po prostu nie mieć klikalnych &amp;quot;gorących punktów&amp;quot;, zwłaszcza w modelach statków powietrznych w fazie rozwoju. W większości przypadków możesz użyć klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu &amp;quot;Pomoc &amp;gt; Pomoc dla statku powietrznego&amp;quot; lub &amp;quot;Pomoc &amp;gt; Wspólne klawisze statków powietrznych&amp;quot;, ale czasami niektóre klawisze są przypisywane ponownie przez statek powietrzny lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
=== Uruchamianie silnika ===&lt;br /&gt;
Chcesz już lecieć, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Większość statków powietrznych ma wpis ''autostart'' w swoim niestandardowym menu, ale oto ogólna procedura, która powinna działać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem tłokowym, potrzebujesz (po upewnieniu się, że gra nie jest wstrzymana {{key press|p}}):&lt;br /&gt;
# Paliwo: Niektóre statki powietrzne rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
# Prawidłowa mieszanka paliwowa: Zazwyczaj jest ''bogata'', więc wciśnij czerwony pokrętło do samego końca lub użyj klawisza {{key press|m}}, aby wzbogacić ({{key press|Shift|m}} zuboża).&lt;br /&gt;
# Magneto ustawione na ''obie'': Obróć kluczyk lub naciśnij {{key press|&amp;amp;#125;}} ''trzy razy'', aby przejść przez ''R'', ''L'', ''Obie''.&lt;br /&gt;
# Przepustnica: Niektóre silniki lepiej uruchamiają się przy odrobinie gazu.&lt;br /&gt;
# Uruchom rozrusznik: Kliknij pozycję ''Start'' kluczyka na panelu lub naciśnij {{key press|s}}. Przytrzymaj rozrusznik przez wystarczający czas, nawet 10 sekund.&lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w statku powietrznym z wieloma silnikami jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że musisz powtórzyć tę samą sekwencję rozruchu dla każdego silnika. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: naciśnij {{key press|~}} i cała powyższa procedura zadziała dla wszystkich silników. Należy jednak pamiętać, że domyślny panel 2D jest podłączony do ''tylko jednego silnika'' i sztuczka z {{key press|~}} może nie zadziałać. Dodaj też trochę gazu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla odrzutowców, śmigłowców lub innych typów statków powietrznych o złożonych procedurach rozruchu. Sprawdź instrukcje w menu pomocy statku powietrznego (naciśnij {{key press|?}}) i/lub spójrz na [[Aircraft|artykuł o tym statku powietrznym na tej wiki]]. Ogólnie, aby uruchomić silnik w statku powietrznym z silnikiem odrzutowym, musisz:&lt;br /&gt;
# Ustawić odcięcie ''ON''&lt;br /&gt;
# Włączyć rozrusznik&lt;br /&gt;
# Gdy silniki osiągną około 5% N1, ustawić odcięcie ''OFF''&lt;br /&gt;
# Wyłączyć rozrusznik, gdy silnik osiągnie prędkość roboczą&lt;br /&gt;
&lt;br /&gt;
== Nauka latania ==&lt;br /&gt;
=== Podręcznik FlightGear ===&lt;br /&gt;
FlightGear ma oficjalny [https://www.flightgear.org/support/manual/ podręcznik], który obejmuje podstawy latania. Jako początkujący, możesz chcieć zacząć od [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/pl/HTML/getstart-plch8.html Rozdziału 8: Podstawowy poradnik symulatora lotu].&lt;br /&gt;
&lt;br /&gt;
=== Samouczki ===&lt;br /&gt;
Wiele statków powietrznych ma własne interaktywne [[tutorials|samouczki]]. Dzięki samouczkom możesz nauczyć się obsługiwać konkretny statek powietrzny, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczków, przechodząc do ''Pomoc'' &amp;amp;gt; ''Samouczek''. Świetnym miejscem na rozpoczęcie jest samouczek dla statku powietrznego [[Cessna 172P]], powszechnie używanego w rzeczywistości do nauki latania statkami powietrznymi o stałych skrzydłach.&lt;br /&gt;
&lt;br /&gt;
Jeśli samouczek zaczyna się bez pasa startowego i w otoczeniu wody, Twoja instalacja FlightGeara nie ma scenerii dla lotniska, na którym samouczek miał się odbyć. Aby uzyskać scenerię, zobacz sekcję [[#Getting scenery|#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
== Twój pierwszy lot ==&lt;br /&gt;
=== Realizm ===&lt;br /&gt;
Jednym z najczęstszych pytań, jakie zadają początkujący piloci na temat każdego symulatora lotu, ale zwłaszcza FlightGeara, jest &amp;quot;Dlaczego mój statek powietrzny cały czas skręca w lewo?&amp;quot; Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobne jest, że wynika to z [[Understanding Propeller Torque and P-Factor|momentu obrotowego śmigła i efektu P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo haseł marketingowych głoszących co innego, niektóre ustawienia są obniżone, aby statek powietrzny był łatwiejszy w pilotażu. Zmniejsza to efekty takie jak powyższy. Realizm we FlightGear jest zawsze podkręcony do maksimum.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre punkty realizmu FlightGeara, które mogą dezorientować początkujących pilotów:&lt;br /&gt;
* &amp;quot;Syndrom skręcania w lewo&amp;quot; z wyżej wymienionych powodów.&lt;br /&gt;
* Błąd skrętu kompasu: Kompas, poddany siłom lotu, ma tendencję do skręcania w przeciwnym kierunku na krótki okres, zanim ustabilizuje się na prawidłowym kursie. Nie jest to usterka (zobacz także artykuł Wikipedii {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* Wskaźnik prędkości pionowej (VSI) również jest obarczony błędem.&lt;br /&gt;
* [[Horizontal Situation Indicator|Wskaźnik sytuacji poziomej]] (HSI) jest napędzany przez żyroskop (dlatego czasami nazywa się go żyroskopem kierunkowym), który podlega ''dryfowi żyroskopowemu''. Wskaźnik będzie odchylać się od aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
* Nie możesz po prostu przerwać skrętu lub wznoszenia poprzez wycentrowanie drążka lub pałki sterowniczej. Musisz skręcić lub popchnąć drążek w drugą stronę, aby wrócić do lotu poziomego. Ale nawet wtedy samolot nie utrzyma samodzielnie swojej wysokości ani kursu. Częstym błędem jest próba znalezienia pozycji drążka, przy której można puścić stery. Chociaż za pomocą trymowania można zostawić samolot na kilka sekund, trzeba użyć autopilota lub stale regulować drążek.&lt;br /&gt;
&lt;br /&gt;
Na statek powietrzny w locie działa wiele sił, a także na [[avionics and instruments|awionikę i przyrządy]] używane do sterowania i nawigacji, co może być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy przyrządów, które istnieją w rzeczywistym świecie''. Jeśli nie chcesz tego, naciśnij {{key press|h}}, aby włączyć HUD.&lt;br /&gt;
&lt;br /&gt;
=== Lotniska i pomoce nawigacyjne ===&lt;br /&gt;
Gdy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z interfejsu Launchera, możesz zastanawiać się, jak określić, jakie lotniska są dostępne. Program uruchamiający wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS|ILS]]. Nie znajdziesz mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Zobacz [[Getting aeronautical charts|Pozyskiwanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
W symulatorze dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;amp;gt; ''Wyposażenie'' &amp;amp;gt; ''Mapa'', która pozwoli Ci zobaczyć dane nawigacyjne oraz pozycję lotnisk i pomocy. Aby uzyskać więcej pomocy dotyczącej nawigacji, zobacz [[Understanding navigation|Zrozumienie nawigacji]].&lt;br /&gt;
&lt;br /&gt;
=== Latanie z autopilotem ===&lt;br /&gt;
Ogólny [[autopilot|autopilot]] jest dostępny w menu ''Autopilot &amp;gt; Ustawienia autopilota'', podczas gdy wiele statków powietrznych ma własny ''specyficzny'' autopilot, często będący modelem rzeczywistego.&lt;br /&gt;
&lt;br /&gt;
W przypadku statków powietrznych, które mają własny autopilot, powinieneś używać elementów sterujących autopilotem dostępnych w wirtualnym kokpicie. Oznacza to klikanie na panelu przyrządów w wirtualnym kokpicie. Menu Autopilot może być wyszarzone i niedostępne, gdy statek powietrzny dostarcza własny autopilot w niektórych statkach powietrznych, w tym Airbuses i [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172 jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilot Bendix/King KAP140]] w swoim wirtualnym kokpicie. Możesz używać zarówno urządzenia autopilota w kokpicie, jak i [[Autopilot#Autopilot Settings|ustawień autopilota]] z menu.&lt;br /&gt;
&lt;br /&gt;
== Zaawansowane ==&lt;br /&gt;
=== Latanie ===&lt;br /&gt;
{{Main article|Aircraft|Statki powietrzne}}&lt;br /&gt;
&lt;br /&gt;
* Jeśli nadal latasz lekkimi cywilnymi statkami powietrznymi, [[Cessna 182S]], która jest bardziej złożona niż C172P, oraz [[Piper PA28 Warrior II|PA28]] to dobre wybory.&lt;br /&gt;
* Jeśli interesuje Cię latanie liniami lotniczymi, sugeruje się rodziny [[Airbus A320 family|Airbus A320]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] i [[MD-80]].&lt;br /&gt;
* Jeśli fascynują Cię samoloty myśliwskie, wybierz wysoko oceniany wojskowy statek powietrzny (taki jak [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) z [[Aircraft#Modern military aircraft|tej listy]] i włącz obrażenia w trybie wieloosobowym lub zainstaluj [[Bombable]].&lt;br /&gt;
* Jeśli przechodzisz na śmigłowce, zaleca się latanie [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Oprócz zwykłych statków powietrznych dostępne są również szczegółowe [[Space Shuttle|wahadłowce kosmiczne]].&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
Fascynujące jest odkrywanie [[scenery|scenerii]] (lub po prostu testowanie grafiki/szybkości klatek) za pomocą [[UFO|UFO]]. Po pierwsze, [[#Configuring rendering and UI|zwiększ swoją jakość grafiki]]. Jeśli początkowo nie widzisz budynków, pozostaw FG otwarte i odczekaj chwilę, aż [[TerraSync]] zakończy pobieranie i budynki się pojawią.&lt;br /&gt;
Istnieje wiele [[Suggested airports|dobrze rozwiniętych lotnisk]] i obszarów scenerii. Możesz również eksplorować obiekty scenerii na [https://scenery.flightgear.org/map mapie modeli].&lt;br /&gt;
&lt;br /&gt;
=== Tryb wieloosobowy ===&lt;br /&gt;
FlightGear ma kilka serwerów wieloosobowych, które pozwolą Ci latać w bardziej ożywionych przestworzach; zobacz [[Howto: Multiplayer|Tryb wieloosobowy]]. Istnieją również [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Dostępna jest również [[MPMap|mapa wieloosobowa]], która pozwala zobaczyć, kto jest aktualnie online, a nawet jakie [[navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
=== Elementy menu ===&lt;br /&gt;
Aby szybko zapoznać się z użyciem każdej pozycji menu w FlightGear, zobacz [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Dodatki ===&lt;br /&gt;
FlightGear ma wiele [[Addon|dodatków]] innych firm zawierających ulepszenia. Dla początkujących, [[Logbook Add-on|Dziennik lotów]] i dodatek [[Which Runway Add-on|Który pas]] mogą być najbardziej przydatnymi dodatkami.&lt;br /&gt;
&lt;br /&gt;
== Społeczność FlightGear ==&lt;br /&gt;
=== Uzyskiwanie pomocy ===&lt;br /&gt;
Ta strona została zaprojektowana, aby zapewnić użytkownikowi najważniejsze informacje, które musi wiedzieć o korzystaniu z FlightGeara po raz pierwszy. Oprócz [[Pl/Portal:Użytkownik|portalu użytkownika]] tej wiki, istnieją inne strony, które możesz chcieć przeczytać:&lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...oraz kanały komunikacji, które mogą być używane do uzyskania informacji lub poproszenia o pomoc:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''obowiązkowa lektura'' dla początkujących;&lt;br /&gt;
*{{forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord FlightGear]], najszybszy sposób na uzyskanie pomocy;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa użytkowników FlightGeara]], największa szansa na kontakt z głównymi deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydaniowego.&lt;br /&gt;
&lt;br /&gt;
=== Dostosowywanie FlightGear bez kompilacji ===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje prekompilowane pliki binarne do pobrania i instalacji na Windows, macOS i Linux. Ponadto większość dystrybucji Linuksa udostępnia spakowaną wersję w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGear jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i jesteś zachęcany'' do wprowadzania zmian w modelach lotu statków powietrznych, scenerii, teksturach, [[shader|shaderach]] OpenGL i każdej innej funkcji, którą chcesz zmienić dla własnej satysfakcji lub podzielić się z innymi użytkownikami FlightGeara. Jeśli to zamierzasz zrobić, spójrz na [[/Pl/Portal:Developer|portal dewelopera]].&lt;br /&gt;
&lt;br /&gt;
=== Jak możesz pomóc ===&lt;br /&gt;
{{Main article|Volunteer|Wolontariusz}}&lt;br /&gt;
FlightGear to projekt open source, oparty na wolontariacie. Oznacza to, że wszystko, co tu znajdziesz, pochodzi z pasji, wolnego czasu i niczego więcej. Obejmuje to symulator, scenerię, statki powietrzne, wiki, {{forum link|text=forum}} i wszystko inne. Wolontariusze, w istocie ''ludzie, którzy coś robią'', są fundamentalni dla tego projektu. Bez nich nie zrobiłby ani jednego kroku do przodu. Dlatego ważne jest, aby współtwórcy dobrze się bawili tym, co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść wkład w ten projekt, powinieneś zapoznać się z kilkoma artykułami, które dadzą Ci pewne wskazówki:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Jak zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Dziedzin, w których ich pomoc byłaby doceniona, jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Skompiluj]] najnowszy kod Git&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj raporty o błędach]&lt;br /&gt;
*Uruchamianie FlightGeara za pomocą programu valgrind w celu wykrycia wycieków pamięci&lt;br /&gt;
&lt;br /&gt;
;Wsparcie:&lt;br /&gt;
*Pomoc nowym użytkownikom w pobieraniu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara ({{forum link|text=na forum}} lub na [[Discord|Discordzie]])&lt;br /&gt;
*Dostarczanie pomysłów i sugestii, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje / Propozycje / Pomysły]]&lt;br /&gt;
*Pomoc w [[Portal:Wiki|oczyszczeniu tej wiki]]&lt;br /&gt;
*Pomoc w dostarczaniu nowych treści dla brakujących stron wiki&lt;br /&gt;
&lt;br /&gt;
;Rozwój:&lt;br /&gt;
*Podstawowy kod źródłowy:&lt;br /&gt;
**Dostarczanie [[Howto:Start core development|wkładu w kod źródłowy, dane i dokumentację]]&lt;br /&gt;
**Dostarczanie [[Bugs|poprawek błędów]] lub nowych funkcji&lt;br /&gt;
*Rozwój statków powietrznych (modelowanie 3D, tekstury, modele lotu, skrypty)&lt;br /&gt;
*Rozwój scenerii (teren, modele, pogoda)&lt;br /&gt;
*Zaangażowanie w którykolwiek z innych projektów powiązanych z FlightGearem&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Instalowanie_samolot%C3%B3w&amp;diff=145088</id>
		<title>Pl/Instalowanie samolotów</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Instalowanie_samolot%C3%B3w&amp;diff=145088"/>
		<updated>2026-06-17T10:30:29Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{installing}}&lt;br /&gt;
&lt;br /&gt;
Preferowaną opcją instalacji najnowszego, oficjalnego [[aircraft|samolotu]] jest zakładka ''Statek powietrzny'' we wbudowanym [[FlightGear Qt launcher|launcherze]], co można zobaczyć na dołączonym filmie. Pozostała część tego artykułu opisuje proces ręczny, który należy wykonać tylko wtedy, gdy nie używamy statków powietrznych z oficjalnego hangaru FGAddon.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|8eaUXFDEltg|480px||Poradnik na kanale SP-ROM, jak zainstalować samoloty z oficjalnego hangaru, z GitHuba, czy po prostu z innych miejsc w internecie.}}&lt;br /&gt;
&lt;br /&gt;
== Ręczny proces instalacji ==&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
(Ubuntu 12.04)&lt;br /&gt;
# Pobierz paczkę ze statkiem powietrznym.&lt;br /&gt;
# Utwórz katalog do przechowywania statków powietrznych, jeśli jeszcze tego nie zrobiłeś. Upewnij się, że ten katalog znajduje się poza &amp;lt;tt&amp;gt;/usr/share/games/flightgear/&amp;lt;/tt&amp;gt;. Na przykład użyj &amp;lt;tt&amp;gt;/home/{NazwaTwojegoUżytkownika}/FlightGear/CustomAircrafts&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Rozpakuj pobrany plik ze statkiem powietrznym do powyższego folderu.&lt;br /&gt;
# Uruchom FlightGear z Launcherem. W Launcherze idź do zakładki ''Dodatki''. W sekcji ''Dodatkowe katalogi statków powietrznych'' kliknij przycisk ''Dodaj'' i wskaż główny folder dodatkowych statków powietrznych (w naszym przypadku &amp;lt;tt&amp;gt;/home/{NazwaTwojegoUżytkownika}/FlightGear/CustomAircrafts&amp;lt;/tt&amp;gt;). Teraz Twój statek powietrzny powinien pojawić się na liście statków powietrznych, jeśli nie to zrestartuj FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Teraz, kolejny pobrany statek powietrzny wystarczy rozpakować w tym samym katalogu i powinien być już widoczny we FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== macOS ===&lt;br /&gt;
Po pierwsze, musimy upewnić się, że aplikacja FG znajduje się w folderze aplikacji, co można zrobić, po prostu przeciągając ją do folderu aplikacji z dowolnego miejsca, w którym się aktualnie znajduje.&lt;br /&gt;
Przejdźmy teraz do faktycznego dodawania statków powietrznych:&lt;br /&gt;
&lt;br /&gt;
# Przejdź do aplikacji w folderze.&lt;br /&gt;
# Control+kliknij FlightGear.&lt;br /&gt;
# Kliknij drugą opcję, która brzmi &amp;quot;Show Package Contents&amp;quot;.&lt;br /&gt;
# Następnie kliknij następujące foldery: &amp;quot;Contents &amp;gt;&amp;gt; Resources &amp;gt;&amp;gt; data &amp;gt;&amp;gt; Aircraft&amp;quot;.&lt;br /&gt;
# Teraz wystarczy kliknąć i przeciągnąć dane statku powietrznego pobrane ze strony internetowej FG do folderu Aircraft.&lt;br /&gt;
&lt;br /&gt;
Sprawdzono na macOS Sierra.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
# Pobierz paczkę ze statkiem powietrznym i rozpakuj ją za pomocą archiwizatora plików, na przykład za pomocą programu [http://www.7-zip.org/ 7-Zip].&lt;br /&gt;
# Utwórz katalog do przechowywania statków powietrznych, jeśli jeszcze tego nie zrobiłeś. Upewnij się, że ten katalog znajduje się poza katalogiem &amp;lt;tt&amp;gt;[[$FG_ROOT]]&amp;lt;/tt&amp;gt;. Na przykład użyj &amp;lt;tt&amp;gt;C:\Users\{NazwaTwojegoUżytkownika}\FlightGear\CustomAircrafts&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Przenieś rozpakowany folder (zwykle z nazwą statku powietrznego) do uprzednio utworzonego katalogu.&lt;br /&gt;
# Uruchom FlightGear z Launcherem. W Launcherze idź do zakładki ''Dodatki''. W sekcji ''Dodatkowe katalogi statków powietrznych'' kliknij przycisk ''Dodaj'' i wskaż główny folder dodatkowych statków powietrznych (w naszym przypadku &amp;lt;tt&amp;gt;C:\Users\{NazwaTwojegoUżytkownika}\FlightGear\CustomAircrafts&amp;lt;/tt&amp;gt;). Teraz Twój statek powietrzny powinien pojawić się na liście statków powietrznych, jeśli nie to zrestartuj FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Teraz, kolejny pobrany statek powietrzny wystarczy rozpakować w tym samym katalogu i powinien być już widoczny we FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Z wiersza poleceń ===&lt;br /&gt;
Uruchamiając FlightGeara z wiersza poleceń, użyć opcji &amp;lt;code&amp;gt;--fg-aircraft=ścieżka&amp;lt;/code&amp;gt;, czyli w naszym przypadku może to być: &amp;lt;code&amp;gt;&lt;br /&gt;
--fg-aircraft=/home/{NazwaUżytkownika}/FlightGear/CustomAircrafts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Gdy instalacja statku powietrznego nie powiedzie się ==&lt;br /&gt;
=== Zmień nazwę folderu statku powietrznego ===&lt;br /&gt;
Jeśli FlightGear nie uruchomi się z nowo zainstalowanym statkiem powietrznym lub jeśli wystartuje, ale statek powietrzny jest niewidoczny, być może będziesz musiał zmienić nazwę folderu, w którym znajdują się pliki statku powietrznego.&lt;br /&gt;
Ten problem najczęściej występuje podczas pobierania pliku .zip z jakiegoś internetowego repozytorium git. W takich przypadkach najprawdopodobniej otrzymasz nazwę folderu w postaci MyZippedRepo-[gałąź]. W takim przypadku powinieneś zmienić nazwę folderu na '''MyZippedRepo'''.&lt;br /&gt;
&lt;br /&gt;
Jeśli powyższe nie działa lub masz inny przypadek, poszukaj pliku readme, możliwe że tam będzie instrukcja instalacji.&lt;br /&gt;
 &lt;br /&gt;
W przeciwnym razie otwórz plik aircraft-set.xml i wyszukaj w nim ścieżki zawierającej '''Aircraft/NazwaKataloguSamolotu'''. Nazwa folderu powinna być zgodna z '''NazwaKataloguSamolotu'''.&lt;br /&gt;
&lt;br /&gt;
Na przykład, jeśli w imaginary-set.xml znajdziesz taką instancję:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;splash-texture&amp;gt;Aircraft/MyCreation/splash1.png&amp;lt;/splash-texture&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oznacza to, że należy zmienić nazwę folderu, w którym znajduje się plik imaginary-set.xml na '''MyCreation'''.&lt;br /&gt;
&lt;br /&gt;
=== Pliki XML z nieprawidłowym kodowaniem ===&lt;br /&gt;
Jeśli uruchamiasz FlightGeara z nowym statkiem powietrznym, który zainstalowałeś i nie ma kokpitu ani elementów zewnętrznych, może to być spowodowane nieprawidłowym kodowaniem plików XML.&lt;br /&gt;
&lt;br /&gt;
Aby to naprawić w systemie Linux, wypróbuj to:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $ cd path/to/aircraft/directory/&lt;br /&gt;
 $ find . -name &amp;quot;*.xml&amp;quot; -print | xargs sed -i 's/&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;/&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;/g'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli którakolwiek z powyższych metod nie działa, zapytaj na [[Howto:Multiplayer#Multiplayer chat|czacie multiplayer]], kanale [[FlightGear IRC channel|IRC]] lub na {{forum link|f=11|text=forum}}.&lt;br /&gt;
&lt;br /&gt;
== Wybór statku powietrznego ==&lt;br /&gt;
Jeśli szukasz informacji, jaki statek powietrzny pobrać, spróbuj:&lt;br /&gt;
* [[Pl/Samoloty|Statki powietrzne]]&lt;br /&gt;
* [[Helicopter|Śmigłowce]]&lt;br /&gt;
* [[Vehicle|Pojazdy]]&lt;br /&gt;
* [[Table of models|Tabela modeli]]&lt;br /&gt;
Zewnętrzne linki do statków powietrznych stron trzecich można znaleźć w [[FlightGear hangars|Hangary FlightGear]]. Pamiętaj, że najnowsze statki powietrzne mogą nie wczytywać się z poprzednimi wersjami FlightGeara. Jeśli używasz starszej wersji FlightGeara, poszukaj starszych statków powietrznych w sekcji z linkami.&lt;br /&gt;
&lt;br /&gt;
== Galeria (2017+) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
File:EC135_Heer.jpeg|[[Eurocopter_EC135|Eurocopter EC135]] z efektem podmuchów z wirnika na trawie (FG 2020).&lt;br /&gt;
&lt;br /&gt;
File:DHC-6_in_Alaska.jpg|[[De_Havilland_Canada_DHC-6_Twin_Otter|de Havilland Canada DHC-6 Twin Otter]] nad Alaską. Warianty: pływaki, amfibia i płozy (FG 2017).&lt;br /&gt;
&lt;br /&gt;
File:Amelia.jpg|[[Alouette-III]] zawiera symulację sztucznej inteligencji (celowo niedoskonałej) [[Alouette-III#Amelia|drugiego pilota]], która może pomóc osobą uczącym się latać helikopterami, aby wystartować i zawisnąć (FG 2018).&lt;br /&gt;
&lt;br /&gt;
File:EC_130_on_the_slope_of_a_shield_volcano_in_Hawaii_-_Flightgear_2018.x.jpg|[[Eurocopter_EC130|Eurocopter EC130]] na zboczu wulkanu tarczowego na Hawajach. EC130 posiada najbardziej szczegółowe systemy śmigłowców, dostępne w FGAddon we Flightgear (FG 2018).&lt;br /&gt;
&lt;br /&gt;
File:Asia.jpg|[[Space_Shuttle|Space Shuttle]]. Flightgear może wyświetlać widok z orbity za pomocą [[Earthview]] - widoczne tutaj tekstury w wysokiej rozdzielczości są dostępne jako osobne pliki do pobrania.&lt;br /&gt;
&lt;br /&gt;
File:ALS_Compositor_pipeline.jpg|[[Piper J-3 Cub|Piper J-3 Cub]] nadaje się również do treningu. J-3 Cub ma wariant szklanego kokpitu [[FG1000|G1000]], a także warianty z pływakami, amfibię, płozy, trójkołowiec, warianty na busz w kilku rozmiarach silnika (FG 2020.x, Compositor).&lt;br /&gt;
&lt;br /&gt;
File:SOTM-Jan19.jpg|[[Robinson_R44|Robinson R44]] jest popularnym helikopterem szkoleniowym, ponieważ jest niedrogi, ale trudno go kontrolować. W symulacjach wydatek nie ma znaczenia. Osoby próbujące po raz pierwszy helikoptera we Flightgear, powinny wypróbować jeden z pozostałych przed R44, chyba że mają ku temu konkretny powód (FG 2019).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Powiązane treści ==&lt;br /&gt;
* [[Pl/Instalowanie_scenerii|Instalowanie scenerii]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Install aircraft]]&lt;br /&gt;
&lt;br /&gt;
[[de:Howto:Flugzeuge Installieren]]&lt;br /&gt;
[[en:Howto:_Install_aircraft]]&lt;br /&gt;
[[es:Cómo:Instalar_aviones]]&lt;br /&gt;
[[fr:Howto Installer un avion]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Volanta&amp;diff=145034</id>
		<title>Volanta</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Volanta&amp;diff=145034"/>
		<updated>2026-06-15T17:39:05Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Volanta can't recognize FlightGear and it doesn't prompt to install the plugin (Ubuntu specific) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://volanta.app/ Volanta] is an easy-to-use smart flight tracker that integrates flight data across all major flight simulators including FlightGear.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
=== Windows ===&lt;br /&gt;
# Download the Volanta installer from [https://api.volanta.app/api/v1/ClientUpdate/Latest here] and run the installer.&lt;br /&gt;
# Open Volanta with administrator permissions (If already open, close Volanta completely by right clicking the Volanta icon on the system tray and pressing exit).&lt;br /&gt;
# Once a Volanta account is created and logged in, Volanta will automatically search for available flight simulators and prompt to install the FlightGear plugin.&lt;br /&gt;
# Press install and follow the prompt shown in Volanta to add the &amp;lt;code&amp;gt;C:\Users\USERNAME\FlightGear\Downloads\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt; folder to your add-on modules in the FlightGear Launcher.&lt;br /&gt;
# Fly!&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
# Download the Volanta AppImage from [https://api.volanta.app/api/v1/ClientUpdate/Latest here].&lt;br /&gt;
# Make the file executable by right clicking on it and selecting &amp;quot;Executable as program&amp;quot;. After that, run the file.&lt;br /&gt;
# Once a Volanta account is created and logged in, Volanta will automatically search for available flight simulators and prompt to install the FlightGear plugin.&lt;br /&gt;
# Press install and follow the prompt shown in Volanta to add a folder to your add-on modules in the FlightGear Launcher.&lt;br /&gt;
# Fly!&lt;br /&gt;
&lt;br /&gt;
== Common issues ==&lt;br /&gt;
&lt;br /&gt;
=== I press Install (plugin) in Volanta and it says installed but ''Settings'' &amp;gt; ''Simulators'' show uninstalled ===&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
You're probably storing your FlightGear data directory in a different location than the default. There are two ways to fix this: you can either manually copy the files to your FlightGear data folder or even better - use a simpler workaround.&lt;br /&gt;
&lt;br /&gt;
===== Option A: The AppData Workaround (Simpler) =====&lt;br /&gt;
FlightGear doesn't actually require you to copy the add-on to the FlightGear data directory. Therefore, there's a simpler solution where you don't even need to know where the FlightGear data is located, and the Volanta add-on files are stored in one place:&lt;br /&gt;
# Go to the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;FGData\Protocol&amp;lt;/code&amp;gt; subdirectories there, i.e., &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\FGData\Protocol\&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\volanta.xml&amp;lt;/code&amp;gt; file to the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\FGData\Protocol\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# In the FlightGear Launcher go to &amp;quot;Add-ons&amp;quot; tab, click &amp;quot;Add&amp;quot; button by &amp;quot;Add-on Module folders&amp;quot; section and select the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins&amp;lt;/code&amp;gt; folder or add the option &amp;lt;code&amp;gt;--addon=C:\Users\USERNAME\AppData\Roaming\Orbx\Volanta\plugins&amp;lt;/code&amp;gt; in the additional settings/command line options. You must change &amp;quot;USERNAME&amp;quot; to the actual username of your system.&lt;br /&gt;
&lt;br /&gt;
This solution means that the FlightGear simulator will mark the plugin as not installed in the Volanta settings, but that doesn't affect anything. You can also uncheck the plugin installation notifications option if you don't want Volanta to nag you about it, as the tracking will work fine for FlightGear anyway.&lt;br /&gt;
&lt;br /&gt;
===== Option B: Manual copy to the FGData directory =====&lt;br /&gt;
If you want Volanta to explicitly show the plugin as &amp;quot;Installed&amp;quot; in its ''Settings'' &amp;gt; ''Simulators'' menu, you must manually copy the files to your FlightGear data directory. By default, FlightGear downloads its data to a specific folder (like &amp;lt;code&amp;gt;fgdata_2024_1&amp;lt;/code&amp;gt;, default: &amp;lt;code&amp;gt;%UserProfile%\FlightGear\Downloads\fgdata_2024_1\&amp;lt;/code&amp;gt;). You can manually copy the Volanta plugin files there:&lt;br /&gt;
# Open File Explorer and navigate to your FlightGear data directory. By default, it is located at: &amp;lt;code&amp;gt;%UserProfile%\FlightGear\Downloads\fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Inside that folder, create a new folder named &amp;lt;code&amp;gt;Addons&amp;lt;/code&amp;gt;, and then inside it, create a subfolder named &amp;lt;code&amp;gt;volanta&amp;lt;/code&amp;gt; (resulting in the path: &amp;lt;code&amp;gt;...\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Open another File Explorer window and go to the Volanta plugins folder: &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all files starting with &amp;lt;code&amp;gt;addon-&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;addon-config.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;addon-main.nas&amp;lt;/code&amp;gt;, etc.) and paste them into the newly created &amp;lt;code&amp;gt;Addons\volanta&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Go back to the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\&amp;lt;/code&amp;gt; folder, copy the &amp;lt;code&amp;gt;volanta.xml&amp;lt;/code&amp;gt; file, and paste it into the &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt; folder inside your FlightGear data directory. (Resulting in the path: &amp;lt;code&amp;gt;...\fgdata_2024_1\Protocol&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Finally, in the FlightGear Launcher go to &amp;quot;Add-ons&amp;quot; tab, click &amp;quot;Add&amp;quot; button by &amp;quot;Add-on Module folders&amp;quot; section and select the &amp;lt;code&amp;gt;C:\Users\USERNAME\FlightGear\Downloads\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt; directory or add the option &amp;lt;code&amp;gt;--addon=C:\Users\USERNAME\FlightGear\Downloads\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt; in the additional settings/command line options. Remember to replace &amp;quot;USERNAME&amp;quot; with your actual Windows username.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
If FlightGear was installed from a repository or from a package, FlightGear files are located in the system directory. Volanta doesn't have permission to change or write here so you have to install the plugin manually. However, FlightGear doesn't require you to copy the add-on to the FlightGear data directory, which Volanta doesn't seem to know about. Therefore, there's a simpler solution, see [[#Volanta_can't_recognize_FlightGear_and_it_doesn't_prompt_to_install_the_plugin_(Ubuntu_specific)]]&lt;br /&gt;
&lt;br /&gt;
However, if you want Volanta to notify you that the plugin is installed, execute the following commands in the Linux console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/games/flightgear/Addons/volanta&lt;br /&gt;
sudo cp ~/.config/Orbx/Volanta/plugins/addon-* /usr/share/games/flightgear/Addons/volanta/&lt;br /&gt;
sudo cp ~/.config/Orbx/Volanta/plugins/volanta.xml /usr/share/games/flightgear/Protocol/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now in the FlightGear launcher, specify the add-on location as &amp;lt;code&amp;gt;/usr/share/games/flightgear/Addons/volanta/&amp;lt;/code&amp;gt; or add the &amp;lt;code&amp;gt;--addon=/usr/share/games/flightgear/Addons/volanta/&amp;lt;/code&amp;gt; option in the additional settings.&lt;br /&gt;
&lt;br /&gt;
=== Volanta plugin is &amp;quot;unable to be installed due to permissions&amp;quot; (Windows specific) ===&lt;br /&gt;
Exit Volanta completely (from taskbar) then reopen the program with administrator permissions.&lt;br /&gt;
&lt;br /&gt;
=== Volanta can't recognize FlightGear and it doesn't prompt to install the plugin (Ubuntu specific) ===&lt;br /&gt;
This issue occurs when FlightGear is run from an AppImage file. Because the simulator doesn't use standard installation paths, Volanta cannot find it automatically and won't prompt you to install the plugin. &lt;br /&gt;
&lt;br /&gt;
Fortunately, FlightGear's flexible add-on system allows us to completely bypass Volanta's default (and somewhat clunky) installation method. You don't actually need to copy any files into FlightGear's internal data directories. Instead, we can set up a minimal add-on structure directly inside Volanta's config folder and simply tell FlightGear to read it from there.&lt;br /&gt;
&lt;br /&gt;
You can set this up using either the terminal or your file manager.&lt;br /&gt;
&lt;br /&gt;
==== Option A: Using the Terminal (Faster) ====&lt;br /&gt;
Open your terminal and paste the following commands to create the directories and copy the file automatically:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/.config/Orbx/Volanta/plugins&lt;br /&gt;
mkdir -p FGData/Protocol&lt;br /&gt;
cp volanta.xml FGData/Protocol/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Option B: Manual Setup ====&lt;br /&gt;
# Open your file manager and go to the &amp;lt;code&amp;gt;~/.config/Orbx/Volanta/plugins&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# Inside it, create a new folder named &amp;lt;code&amp;gt;FGData&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open the &amp;lt;code&amp;gt;FGData&amp;lt;/code&amp;gt; folder and create a subfolder named &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the &amp;lt;code&amp;gt;volanta.xml&amp;lt;/code&amp;gt; file (from the &amp;lt;code&amp;gt;plugins&amp;lt;/code&amp;gt; folder) and paste it into the newly created &amp;lt;code&amp;gt;FGData/Protocol&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
==== Final Step: FlightGear Launcher Setup ====&lt;br /&gt;
Once the files are in place, you must tell FlightGear where the add-on is located. &lt;br /&gt;
&lt;br /&gt;
In the FlightGear launcher, do one of the following (remember to change &amp;quot;USERNAME&amp;quot; to your actual Linux username):&lt;br /&gt;
* go to &amp;quot;Add-ons&amp;quot; tab, click &amp;quot;Add&amp;quot; button by &amp;quot;Add-on Module folders&amp;quot; section and select the &amp;lt;code&amp;gt;/home/USERNAME/.config/Orbx/Volanta/plugins&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
* OR add the following parameter in the additional settings/command line options: &amp;lt;code&amp;gt;--addon=/home/USERNAME/.config/Orbx/Volanta/plugins&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The plugin is now fully installed. Even though it still might not appear in Volanta under ''Settings &amp;gt; Simulators'', the tracking will work correctly once you start your flight.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[FlightGear Tracker]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Volanta&amp;diff=145031</id>
		<title>Volanta</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Volanta&amp;diff=145031"/>
		<updated>2026-06-15T17:32:47Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://volanta.app/ Volanta] is an easy-to-use smart flight tracker that integrates flight data across all major flight simulators including FlightGear.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
=== Windows ===&lt;br /&gt;
# Download the Volanta installer from [https://api.volanta.app/api/v1/ClientUpdate/Latest here] and run the installer.&lt;br /&gt;
# Open Volanta with administrator permissions (If already open, close Volanta completely by right clicking the Volanta icon on the system tray and pressing exit).&lt;br /&gt;
# Once a Volanta account is created and logged in, Volanta will automatically search for available flight simulators and prompt to install the FlightGear plugin.&lt;br /&gt;
# Press install and follow the prompt shown in Volanta to add the &amp;lt;code&amp;gt;C:\Users\USERNAME\FlightGear\Downloads\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt; folder to your add-on modules in the FlightGear Launcher.&lt;br /&gt;
# Fly!&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
# Download the Volanta AppImage from [https://api.volanta.app/api/v1/ClientUpdate/Latest here].&lt;br /&gt;
# Make the file executable by right clicking on it and selecting &amp;quot;Executable as program&amp;quot;. After that, run the file.&lt;br /&gt;
# Once a Volanta account is created and logged in, Volanta will automatically search for available flight simulators and prompt to install the FlightGear plugin.&lt;br /&gt;
# Press install and follow the prompt shown in Volanta to add a folder to your add-on modules in the FlightGear Launcher.&lt;br /&gt;
# Fly!&lt;br /&gt;
&lt;br /&gt;
== Common issues ==&lt;br /&gt;
&lt;br /&gt;
=== I press Install (plugin) in Volanta and it says installed but ''Settings'' &amp;gt; ''Simulators'' show uninstalled ===&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
You're probably storing your FlightGear data directory in a different location than the default. There are two ways to fix this: you can either manually copy the files to your FlightGear data folder or even better - use a simpler workaround.&lt;br /&gt;
&lt;br /&gt;
===== Option A: The AppData Workaround (Simpler) =====&lt;br /&gt;
FlightGear doesn't actually require you to copy the add-on to the FlightGear data directory. Therefore, there's a simpler solution where you don't even need to know where the FlightGear data is located, and the Volanta add-on files are stored in one place:&lt;br /&gt;
# Go to the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# Create the &amp;lt;code&amp;gt;FGData\Protocol&amp;lt;/code&amp;gt; subdirectories there, i.e., &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\FGData\Protocol\&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\volanta.xml&amp;lt;/code&amp;gt; file to the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\FGData\Protocol\&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# In the FlightGear Launcher go to &amp;quot;Add-ons&amp;quot; tab, click &amp;quot;Add&amp;quot; button by &amp;quot;Add-on Module folders&amp;quot; section and select the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins&amp;lt;/code&amp;gt; folder or add the option &amp;lt;code&amp;gt;--addon=C:\Users\USERNAME\AppData\Roaming\Orbx\Volanta\plugins&amp;lt;/code&amp;gt; in the additional settings/command line options. You must change &amp;quot;USERNAME&amp;quot; to the actual username of your system.&lt;br /&gt;
&lt;br /&gt;
This solution means that the FlightGear simulator will mark the plugin as not installed in the Volanta settings, but that doesn't affect anything. You can also uncheck the plugin installation notifications option if you don't want Volanta to nag you about it, as the tracking will work fine for FlightGear anyway.&lt;br /&gt;
&lt;br /&gt;
===== Option B: Manual copy to the FGData directory =====&lt;br /&gt;
If you want Volanta to explicitly show the plugin as &amp;quot;Installed&amp;quot; in its ''Settings'' &amp;gt; ''Simulators'' menu, you must manually copy the files to your FlightGear data directory. By default, FlightGear downloads its data to a specific folder (like &amp;lt;code&amp;gt;fgdata_2024_1&amp;lt;/code&amp;gt;, default: &amp;lt;code&amp;gt;%UserProfile%\FlightGear\Downloads\fgdata_2024_1\&amp;lt;/code&amp;gt;). You can manually copy the Volanta plugin files there:&lt;br /&gt;
# Open File Explorer and navigate to your FlightGear data directory. By default, it is located at: &amp;lt;code&amp;gt;%UserProfile%\FlightGear\Downloads\fgdata_2024_1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Inside that folder, create a new folder named &amp;lt;code&amp;gt;Addons&amp;lt;/code&amp;gt;, and then inside it, create a subfolder named &amp;lt;code&amp;gt;volanta&amp;lt;/code&amp;gt; (resulting in the path: &amp;lt;code&amp;gt;...\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Open another File Explorer window and go to the Volanta plugins folder: &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy all files starting with &amp;lt;code&amp;gt;addon-&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;addon-config.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;addon-main.nas&amp;lt;/code&amp;gt;, etc.) and paste them into the newly created &amp;lt;code&amp;gt;Addons\volanta&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Go back to the &amp;lt;code&amp;gt;%appdata%\Orbx\Volanta\plugins\&amp;lt;/code&amp;gt; folder, copy the &amp;lt;code&amp;gt;volanta.xml&amp;lt;/code&amp;gt; file, and paste it into the &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt; folder inside your FlightGear data directory. (Resulting in the path: &amp;lt;code&amp;gt;...\fgdata_2024_1\Protocol&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Finally, in the FlightGear Launcher go to &amp;quot;Add-ons&amp;quot; tab, click &amp;quot;Add&amp;quot; button by &amp;quot;Add-on Module folders&amp;quot; section and select the &amp;lt;code&amp;gt;C:\Users\USERNAME\FlightGear\Downloads\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt; directory or add the option &amp;lt;code&amp;gt;--addon=C:\Users\USERNAME\FlightGear\Downloads\fgdata_2024_1\Addons\volanta&amp;lt;/code&amp;gt; in the additional settings/command line options. Remember to replace &amp;quot;USERNAME&amp;quot; with your actual Windows username.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
If FlightGear was installed from a repository or from a package, FlightGear files are located in the system directory. Volanta doesn't have permission to change or write here so you have to install the plugin manually. However, FlightGear doesn't require you to copy the add-on to the FlightGear data directory, which Volanta doesn't seem to know about. Therefore, there's a simpler solution, see [[#Volanta_can't_recognize_FlightGear_and_it_doesn't_prompt_to_install_the_plugin_(Ubuntu_specific)]]&lt;br /&gt;
&lt;br /&gt;
However, if you want Volanta to notify you that the plugin is installed, execute the following commands in the Linux console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/games/flightgear/Addons/volanta&lt;br /&gt;
sudo cp ~/.config/Orbx/Volanta/plugins/addon-* /usr/share/games/flightgear/Addons/volanta/&lt;br /&gt;
sudo cp ~/.config/Orbx/Volanta/plugins/volanta.xml /usr/share/games/flightgear/Protocol/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now in the FlightGear launcher, specify the add-on location as &amp;lt;code&amp;gt;/usr/share/games/flightgear/Addons/volanta/&amp;lt;/code&amp;gt; or add the &amp;lt;code&amp;gt;--addon=/usr/share/games/flightgear/Addons/volanta/&amp;lt;/code&amp;gt; option in the additional settings.&lt;br /&gt;
&lt;br /&gt;
=== Volanta plugin is &amp;quot;unable to be installed due to permissions&amp;quot; (Windows specific) ===&lt;br /&gt;
Exit Volanta completely (from taskbar) then reopen the program with administrator permissions.&lt;br /&gt;
&lt;br /&gt;
=== Volanta can't recognize FlightGear and it doesn't prompt to install the plugin (Ubuntu specific) ===&lt;br /&gt;
This issue occurs when FlightGear is run from an AppImage file. Because the simulator doesn't use standard installation paths, Volanta cannot find it automatically and won't prompt you to install the plugin. &lt;br /&gt;
&lt;br /&gt;
To fix this, you need to set up the plugin structure manually. You can do this using either the terminal or your file manager.&lt;br /&gt;
&lt;br /&gt;
==== Option A: Using the Terminal (Faster) ====&lt;br /&gt;
Open your terminal and paste the following commands to create the directories and copy the file automatically:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/.config/Orbx/Volanta/plugins&lt;br /&gt;
mkdir -p FGData/Protocol&lt;br /&gt;
cp volanta.xml FGData/Protocol/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Option B: Manual Setup ====&lt;br /&gt;
# Open your file manager and go to the &amp;lt;code&amp;gt;~/.config/Orbx/Volanta/plugins&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# Inside it, create a new folder named &amp;lt;code&amp;gt;FGData&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open the &amp;lt;code&amp;gt;FGData&amp;lt;/code&amp;gt; folder and create a subfolder named &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Copy the &amp;lt;code&amp;gt;volanta.xml&amp;lt;/code&amp;gt; file (from the &amp;lt;code&amp;gt;plugins&amp;lt;/code&amp;gt; folder) and paste it into the newly created &amp;lt;code&amp;gt;FGData/Protocol&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
==== Final Step: FlightGear Launcher Setup ====&lt;br /&gt;
Once the files are in place, you must tell FlightGear where the add-on is located. &lt;br /&gt;
&lt;br /&gt;
In the FlightGear launcher, do one of the following (remember to change &amp;quot;USERNAME&amp;quot; to your actual Linux username):&lt;br /&gt;
* go to &amp;quot;Add-ons&amp;quot; tab, click &amp;quot;Add&amp;quot; button by &amp;quot;Add-on Module folders&amp;quot; section and select the &amp;lt;code&amp;gt;/home/USERNAME/.config/Orbx/Volanta/plugins&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
* OR add the following parameter in the additional settings/command line options: &amp;lt;code&amp;gt;--addon=/home/USERNAME/.config/Orbx/Volanta/plugins&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The plugin is now fully installed. Even though it still might not appear in Volanta under ''Settings &amp;gt; Simulators'', the tracking will work correctly once you start your flight.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[FlightGear Tracker]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter&amp;diff=144683</id>
		<title>FlightGear Newsletter</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter&amp;diff=144683"/>
		<updated>2026-05-26T12:42:41Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:magagazine.png|right]]&lt;br /&gt;
&lt;br /&gt;
The '''FlightGear Newsletter''' is intended to provide a collection of the latest developments from the worldwide [[FlightGear]] community. With so much development ongoing, it's almost impossible for anyone to keep up. The newsletter was started in July 2009, and is presented on a monthly basis.  It is a collaborative effort that is created, edited and distributed via the [[FlightGear Wiki]], and all FlightGear users, contributors and developers are invited to contribute.&lt;br /&gt;
&lt;br /&gt;
=== Archive ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;noresize&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2026&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2025&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2024&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2023&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2022&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2021&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2020&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2019&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2018&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2017&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2016&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2015&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2014&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2013&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2012&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2011&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2010&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2009&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2026|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2026|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2026|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2026|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2026|May]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2025|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2025|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2025|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2025|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2025|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2025|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2025|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2025|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2025|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2025|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2025|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2025|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2024|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2024|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2024|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2024|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2024|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2024|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2024|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2024|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2024|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2024|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2024|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2024|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2023|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2023|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2023|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2023|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2023|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2023|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2023|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2023|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2023|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2023|October]] &lt;br /&gt;
* [[FlightGear Newsletter November 2023|November]] &lt;br /&gt;
* [[FlightGear Newsletter December 2023|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2022|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2022|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2022|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2022|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2022|May]] &lt;br /&gt;
* June&lt;br /&gt;
* [[FlightGear Newsletter July 2022|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2022|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2022|September]]&lt;br /&gt;
* [[FlightGear Newsletter November 2022|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2022|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2021|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2021|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2021|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2021|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2021|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2021|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2021|July]] &lt;br /&gt;
* [[FlightGear Newsletter August 2021|August]] &lt;br /&gt;
* [[FlightGear Newsletter September 2021|September]] &lt;br /&gt;
* [[FlightGear Newsletter October 2021|October]] &lt;br /&gt;
* [[FlightGear Newsletter November 2021|November]] &lt;br /&gt;
* [[FlightGear Newsletter December 2021|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2020|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2020|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2020|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2020|April]] &lt;br /&gt;
* [[FlightGear Newsletter May 2020|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2020|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2020|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2020|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2020|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2020|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2020|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2020|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2019|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2019|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2019|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2019|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2019|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2019|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2019|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2019|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2019|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2019|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2019|November]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2018|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2018|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2018|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2018|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2018|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2018|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2018|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2018|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2018|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2018|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2018|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2018|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2017|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2017|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2017|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2017|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2017|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2017|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2017|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2017|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2017|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2017|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2017|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2017|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2016|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2016|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2016|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2016|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2016|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2016|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2016|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2016|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2016|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2016|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2016|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2016|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2015|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2015|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2015|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2015|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2015|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2015|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2015|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2015|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2015|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2015|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2015|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2015|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2014|January]] &lt;br /&gt;
* [[FlightGear Newsletter February 2014|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2014|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2014|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2014|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2014|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2014|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2014|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2014|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2014|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2014|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2014|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2013|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2013|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2013|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2013|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2013|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2013|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2013|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2013|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2013|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2013|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2013|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2013|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2012|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2012|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2012|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2012|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2012|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2012|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2012|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2012|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2012|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2012|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2012|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2012|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2011|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2011|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2011|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2011|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2011|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2011|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2011|July]] &lt;br /&gt;
* [[FlightGear Newsletter August 2011|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2011|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2011|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2011|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2011|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2010|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2010|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2010|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2010|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2010|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2010|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2010|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2010|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2010|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2010|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2010|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2010|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter July 2009|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2009|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2009|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2009|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2009|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2009|December]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some newsletter editions have been translated in other languages:&lt;br /&gt;
* [[File:De.gif|16px|link=:De:FlightGear Newsletter]] [[:De:FlightGear Newsletter|Deutsch]]&lt;br /&gt;
* [[File:Es.gif|16px|link=:Es:FlightGear Newsletter]] [[:Es:FlightGear Newsletter|Español]]&lt;br /&gt;
* [[File:Fr.gif|16px|link=:Fr:FlightGear Newsletter]] [[:Fr:FlightGear Newsletter|Français]]&lt;br /&gt;
&lt;br /&gt;
=== You are invited to contribute! ===&lt;br /&gt;
We would like to emphasize that the monthly newsletter can not live without the contributions of FlightGear users and developers. The FlightGear Newsletter is a community-driven newsletter, which means that it is created and edited by people like ''you''. You don't need to be a long-time FlightGear user (or even a developer) to contribute to the newsletter. &lt;br /&gt;
&lt;br /&gt;
In fact, helping write the monthly FlightGear newsletter is an excellent way for getting started contributing to the FlightGear community very quickly and very easily. &lt;br /&gt;
&lt;br /&gt;
Even if you don't have to add anything yourself, just reviewing and improving additions by others is also highly appreciated, as are efforts to help translate newsletters or add screen shots (e.g. taken from the forum or mailing lists) to the newsletter. Screen shots can be uploaded at [[Special:Upload]].&lt;br /&gt;
&lt;br /&gt;
Everyone with a wiki account (free to [[Special:UserLogin|register]]) can edit the newsletter and every contribution is welcome. So if you know about any FlightGear related projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.&lt;br /&gt;
&lt;br /&gt;
A simple template providing a basic structure for each upcoming newsletter can be taken from [[Talk:Next newsletter]]. This template can be copied/pasted into each new newsletter to help users getting started providing contents.&lt;br /&gt;
&lt;br /&gt;
The draft for the upcoming newsletter can always be found at [[Next newsletter]].&lt;br /&gt;
&lt;br /&gt;
If English is not your native language, please don't be concerned about contributing to the newsletter, you can always easily ask fellow FlightGear users to review or proof-read your changes. Also, one of the easiest ways to get started is simply copying/pasting text from forum or mailing list discussions, such as announcements (e.g., new aircraft, new scenery, etc.).&lt;br /&gt;
&lt;br /&gt;
Another neat option to get started is adding links to FlightGear-related YouTube videos. For this, we have a dedicated section in each newsletter: &amp;quot;[[FlightGear Newsletter {{#time: F Y | last month }}#FlightGear on YouTube|FlightGear on YouTube]].&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you want to embed a video, please see {{mediawiki|Extension:EmbedVideo#Usage}}&lt;br /&gt;
&lt;br /&gt;
If you are looking for other ways to get involved, please see [[Volunteer]].&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear Newsletter| ]]&lt;br /&gt;
[[Category:Community|Newsletter]]&lt;br /&gt;
[[Category:Lists|Newsletter]]&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear Newsletter]]&lt;br /&gt;
[[es:FlightGear Newsletter]]&lt;br /&gt;
[[fr:FlightGear Newsletter]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Multi-key_commands&amp;diff=144630</id>
		<title>Multi-key commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Multi-key_commands&amp;diff=144630"/>
		<updated>2026-05-25T12:31:39Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Weather */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:FlightGear vi-like commands on-screen help.png|thumb|The on-screen help for the multi-key commands.]]&lt;br /&gt;
&lt;br /&gt;
FlightGear have a set of useful vi-like '''multi-key commands''' that can be used to change some settings quicker than if going through the menus.&lt;br /&gt;
&lt;br /&gt;
== Basic keys ==&lt;br /&gt;
All multi-key sequence starts with {{Key press|:}}&lt;br /&gt;
&lt;br /&gt;
{{Key press|:}}{{Key press|Tab}} toggles on-screen command help&lt;br /&gt;
&lt;br /&gt;
{{Key press|Enter}} sends the command &lt;br /&gt;
&lt;br /&gt;
{{Key press|Esc}} cancels the command&lt;br /&gt;
&lt;br /&gt;
{{Key press|:}}{{Key press|?}} display help on standard output (console)&lt;br /&gt;
&lt;br /&gt;
== List of commands ==&lt;br /&gt;
=== Dialogs ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|a}}          || Autopilot Settings&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|f}}          || Fuel &amp;amp; Payload&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|g}}          || GPS Settings&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|h}}          || Chat History&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|i}}          || Instrument Settings&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|m}}          || Multiplayer Pilot List&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|p}}{{Key press|a}} || Position aircraft in air&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|p}}{{Key press|g}} || Position aircraft on ground&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|r}}          || Radio Settings&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|s}}          || Sound Configuration&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|t}}          || Time Settings&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|v}}          || View Options&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|w}}          || Weather Conditions&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|D}}{{Key press|Y}}          || Nasal Console&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Environament ===&lt;br /&gt;
==== Weather ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|b}}                                   || Enable Basic Weather&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|d}}                                   || Enable Detailed Weather&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|r}}{{Key press|Enter}} || Weather scenario = Live Data&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|i}}{{Key press|Enter}} || Weather scenario = International Standard Atmosphere&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|H}}{{Key press|Enter}} || Weather scenario = Core high pressure region&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|h}}{{Key press|Enter}} || Weather scenario = High pressure region&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|B}}{{Key press|Enter}} || Weather scenario = Border of a high pressure region&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|b}}{{Key press|Enter}} || Weather scenario = Border of a low pressure region&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|l}}{{Key press|Enter}} || Weather scenario = Low pressure region&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|L}}{{Key press|Enter}} || Weather scenario = Core low pressure region&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|w}}{{Key press|Enter}} || Weather scenario = Warm sector&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|f}}{{Key press|Enter}} || Weather scenario = Fair weather&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|t}}{{Key press|Enter}} || Weather scenario = Thunderstorm&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|s}}{{Key press|Enter}} || Weather scenario = Stormy Monday&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|m}}{{Key press|Enter}} || Weather scenario = Marginal VFR&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|e}}{{Key press|Enter}} || Weather scenario = Early morning fog&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|1}}{{Key press|Enter}} || Weather scenario = CAT I minimum&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|2}}{{Key press|Enter}} || Weather scenario = CAT II minimum&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|w}}{{Key press|s}}{{Key press|3}}{{Key press|Enter}} || Weather scenario = CAT IIIb minimum&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Time ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|c}} || Time of day = Clock time&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|1}} || Time of day = Dawn&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|2}} || Time of day = Morning&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|3}} || Time of day = Noon&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|4}} || Time of day = Afternoon&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|5}} || Time of day = Dusk&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|6}} || Time of day = Evening&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|E}}{{Key press|t}}{{Key press|7}} || Time of day = Midnight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Position ===&lt;br /&gt;
==== on Ground ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|P}}{{Key press|g}}''&amp;lt;ICAO&amp;gt;''{{Key press|space}}''&amp;lt;RWY&amp;gt;''{{Key press|Enter}} || Position aircraft at airport + optional runway number, e.g. {{Key press|:}}{{Key press|P}}{{Key press|g}}{{Key press|b}}{{Key press|i}}{{Key press|k}}{{Key press|f}}{{Key press|space}}{{Key press|1}}{{Key press|1}}{{Key press|Enter}} means go to &amp;lt;code&amp;gt;BIKF&amp;lt;/code&amp;gt; airport, runway &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Development functions ===&lt;br /&gt;
==== Fog ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|f}}{{Key press|/}} || Disable fog&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|f}}{{Key press|f}} || Fog fastest&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|f}}{{Key press|n}} || Fog nicest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== On screen statistics ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|s}}{{Key press|0}} || OSG statistic level = off&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|s}}{{Key press|1}} || OSG statistic level = show FPS&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|s}}{{Key press|2}} || OSG statistic level = 1 + Viewer Graph&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|s}}{{Key press|3}} || OSG statistic level = 2 + Camera&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|s}}{{Key press|4}} || OSG statistic level = 3 + Viewer Scene&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Others dev ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|c}} || Reload tile cache&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|d}} || Toggle FDM data logging&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|l}} || Force lighting update&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|m}} || Dump link to Google Maps of your location on standard output&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|p}} || Reload 2D panel&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|Y}}{{Key press|w}} || Toggle wireframe&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}''&amp;lt;number&amp;gt;''                   || Execute Nasal console tab given by number from 1 to 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Autopilot ===&lt;br /&gt;
==== LNAV ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|/}}{{Key press|Enter}}              || Disable heading control&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|b}}''&amp;lt;degrees&amp;gt;''{{Key press|Enter}} || Set heading bug, e.g. {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|b}}{{Key press|1}}{{Key press|8}}{{Key press|0}}{{Key press|Enter}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|n}}{{Key press|Enter}}              || NAV1 hold&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|t}}''&amp;lt;degrees&amp;gt;''{{Key press|Enter}} || Set true heading, e.g. {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|t}}{{Key press|1}}{{Key press|8}}{{Key press|0}}{{Key press|Enter}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|h}}{{Key press|w}}{{Key press|Enter}}              || Wing level hold&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== VNAV ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|/}}{{Key press|Enter}}              || Disable pitch/altitude control&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|a}}''&amp;lt;feets&amp;gt;''{{Key press|Enter}}   || Altitude hold MSL, e.g. {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|a}}{{Key press|5}}{{Key press|0}}{{Key press|0}}{{Key press|0}}{{Key press|Enter}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|f}}''&amp;lt;degrees&amp;gt;''{{Key press|Enter}} || FPA hold (available in next release)&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|g}}''&amp;lt;feets&amp;gt;''{{Key press|Enter}}   || Altitude hold AGL, e.g. {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|g}}{{Key press|1}}{{Key press|0}}{{Key press|0}}{{Key press|0}}{{Key press|Enter}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|n}}{{Key press|Enter}}              || Enable glideslop (NAV1)&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|o}}''&amp;lt;degrees&amp;gt;''{{Key press|Enter}} || AoA hold (available until version 2020.3)&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|p}}''&amp;lt;degrees&amp;gt;''{{Key press|Enter}} || Pitch hold&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|p}}{{Key press|v}}''&amp;lt;fpm&amp;gt;''{{Key press|Enter}}     || Vertical speed hold&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Velocity ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|v}}{{Key press|/}}{{Key press|Enter}}          || Disable velocity control&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|v}}{{Key press|p}}''&amp;lt;kts&amp;gt;''{{Key press|Enter}} || Hold given speed by pitch&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|v}}{{Key press|t}}''&amp;lt;kts&amp;gt;''{{Key press|Enter}} || Hold given speed by throttle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Route Manager ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|a}}''&amp;lt;ID[@alt]&amp;gt;''{{Key press|Enter}}        || Append given waypoint (optional with altitude), e.g. {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|a}}{{Key press|t}}{{Key press|r}}{{Key press|z}}{{Key press|@}}{{Key press|6}}{{Key press|0}}{{Key press|0}}{{Key press|0}}{{Key press|Enter}} which add VOR TRZ at 6000 ft&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|c}}{{Key press|Enter}}                      || Clear waypoints&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|d}}''&amp;lt;index&amp;gt;''{{Key press|Enter}}           || Delete selected waypoint, counting from 1&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|i}}''&amp;lt;index&amp;gt;&amp;lt;ID[@alt]&amp;gt;''{{Key press|Enter}} || Insert given waypoint (optional with altitude), e.g. {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|i}}{{Key press|2}}{{Key press|t}}{{Key press|r}}{{Key press|z}}{{Key press|@}}{{Key press|6}}{{Key press|0}}{{Key press|0}}{{Key press|0}}{{Key press|Enter}} which insert VOR TRZ at 6000 ft in second position&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|a}}{{Key press|r}}{{Key press|p}}{{Key press|Enter}}                      || Remove first waypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Engines ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|m}}{{Key press|^}}                || Mixture rich gradually&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|m}}{{Key press|_}}                || Mixture lean gradually&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|m}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Set mixture by value from 0.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|p}}{{Key press|^}}                || Propeller pitch up gradually&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|p}}{{Key press|_}}                || Propeller pitch down gradually&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|p}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Set propeller pitch by value from 0.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|t}}{{Key press|^}}                || Throttle up gradually&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|t}}{{Key press|_}}                || Throttle down gradually&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}{{Key press|t}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Set throttle by value from 0.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|m}}{{Key press|^}}    || Mixture rich gradually for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|m}}{{Key press|_}}                || Mixture lean gradually for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|m}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Set mixture by value from 0.0 to 1.0 for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|p}}{{Key press|^}}                || Propeller pitch up gradually for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|p}}{{Key press|_}}                || Propeller pitch down gradually for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|p}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Set propeller pitch by value from 0.0 to 1.0 for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|t}}{{Key press|^}}                || Throttle up gradually for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|t}}{{Key press|_}}                || Throttle down gradually for selected engine&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|e}}''&amp;lt;engine&amp;gt;''{{Key press|t}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Set throttle by value from 0.0 to 1.0 for selected engine&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Flight controls ===&lt;br /&gt;
==== Ailerons ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|a}}{{Key press|t}}{{Key press|&amp;lt;}}                || Ailerons trim adjustment left&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|a}}{{Key press|t}}{{Key press|&amp;gt;}}                || Ailerons trim adjustment right&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|a}}{{Key press|t}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Ailerons trim adjustment by value from -1.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|a}}''&amp;lt;value&amp;gt;''{{Key press|Enter}}                || Ailerons adjustment by value from -1.0 to 1.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Elevator ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|e}}{{Key press|t}}{{Key press|^}}                || Elevator trim adjustment up&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|e}}{{Key press|t}}{{Key press|_}}                || Elevator trim adjustment down&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|e}}{{Key press|t}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Elevator trim adjustment by value from -1.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|e}}''&amp;lt;value&amp;gt;''{{Key press|Enter}}                || Elevator adjustment by value from -1.0 to 1.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rudder ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|r}}{{Key press|t}}{{Key press|&amp;lt;}}                || Rudder trim adjustment left&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|r}}{{Key press|t}}{{Key press|&amp;gt;}}                || Rudder trim adjustment right&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|r}}{{Key press|t}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Rudder trim adjustment by value from -1.0 to 1.0&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|r}}''&amp;lt;value&amp;gt;''{{Key press|Enter}}                || Rudder adjustment by value from -1.0 to 1.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Initialize ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|i}}{{Key press|a}}{{Key press|Enter}} || Initialize all trims&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wings ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|w}}{{Key press|f}}{{Key press|Enter}}            || Toggle wings fold&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|f}}{{Key press|w}}{{Key press|s}}''&amp;lt;value&amp;gt;''{{Key press|Enter}} || Wings sweep by value from 0.0 to 1.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Radio ===&lt;br /&gt;
==== ADF ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|a}}{{Key press|f}}''&amp;lt;kHz&amp;gt;''{{Key press|Enter}} || Set active frequency for ADF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== COMM ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|c}}''&amp;lt;which&amp;gt;''{{Key press|f}}''&amp;lt;MHz&amp;gt;''{{Key press|Enter}} || Set active frequency for selected COMM, e.g. {{Key press|:}}{{Key press|r}}{{Key press|c}}{{Key press|1}}{{Key press|f}}{{Key press|1}}{{Key press|2}}{{Key press|3}}{{Key press|.}}{{Key press|4}}{{Key press|5}}{{Key press|Enter}} will set active frequency for COMM1 on 123.45 MHz.&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|c}}''&amp;lt;which&amp;gt;''{{Key press|s}}''&amp;lt;MHz&amp;gt;''{{Key press|Enter}} || Set standby frequency for selected COMM, e.g. {{Key press|:}}{{Key press|r}}{{Key press|c}}{{Key press|1}}{{Key press|s}}{{Key press|1}}{{Key press|2}}{{Key press|3}}{{Key press|.}}{{Key press|4}}{{Key press|5}}{{Key press|Enter}} will set standby frequency for COMM1 on 123.45 MHz.&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|c}}''&amp;lt;which&amp;gt;''{{Key press|t}}{{Key press|Enter}}          || Toggle active/standby frequency for selected COMM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NAV ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|n}}''&amp;lt;which&amp;gt;''{{Key press|f}}''&amp;lt;MHz&amp;gt;''{{Key press|Enter}} || Set active frequency for selected NAV, e.g. {{Key press|:}}{{Key press|r}}{{Key press|n}}{{Key press|1}}{{Key press|f}}{{Key press|1}}{{Key press|1}}{{Key press|6}}{{Key press|.}}{{Key press|8}}{{Key press|Enter}} will set active frequency for NAV1 on 116.80 MHz.&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|n}}''&amp;lt;which&amp;gt;''{{Key press|s}}''&amp;lt;MHz&amp;gt;''{{Key press|Enter}} || Set standby frequency for selected NAV, e.g. {{Key press|:}}{{Key press|r}}{{Key press|n}}{{Key press|1}}{{Key press|s}}{{Key press|1}}{{Key press|1}}{{Key press|6}}{{Key press|.}}{{Key press|8}}{{Key press|Enter}} will set standby frequency for NAV1 on 116.80 MHz.&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|n}}''&amp;lt;which&amp;gt;''{{Key press|t}}{{Key press|Enter}}          || Toggle active/standby frequency for selected NAV&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TACAN ====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! Sequence     !! Use&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|t}}''&amp;lt;channel&amp;gt;''{{Key press|x}}{{Key press|Enter}} || Set TACAN with given channel X, e.g. {{Key press|:}}{{Key press|r}}{{Key press|t}}{{Key press|1}}{{Key press|2}}{{Key press|3}}{{Key press|x}}{{Key press|Enter}} will set TACAN on 123X.&lt;br /&gt;
|-&lt;br /&gt;
| {{Key press|:}}{{Key press|r}}{{Key press|t}}''&amp;lt;channel&amp;gt;''{{Key press|y}}{{Key press|Enter}} || Set TACAN with given channel Y, e.g. {{Key press|:}}{{Key press|r}}{{Key press|t}}{{Key press|1}}{{Key press|2}}{{Key press|3}}{{Key press|y}}{{Key press|Enter}} will set TACAN on 123Y.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Howto:Add multi-key commands to an aircraft]]&lt;br /&gt;
&lt;br /&gt;
=== Source code ===&lt;br /&gt;
* {{fgdata source|path=Input/Keyboard/multikey.xml|pre=$FG_ROOT}}&lt;br /&gt;
* {{fgdata source|path=Nasal/multikey.nas|pre=$FG_ROOT}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
[[Category:FlightGear keyboard]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Multi-key_commands]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Canvas&amp;diff=144605</id>
		<title>Canvas</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Canvas&amp;diff=144605"/>
		<updated>2026-05-24T15:17:27Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox subsystem&lt;br /&gt;
|image       = Anniversary4.png&lt;br /&gt;
|name        = Canvas Subsystem&lt;br /&gt;
|started     = 05/2012 (Available since [[Changelog 2.8.0|FlightGear 2.8]])&lt;br /&gt;
|description = Dynamic 2D drawing at runtime using the property tree and scripting (for instruments, HUDs, GUIs)&lt;br /&gt;
|status      = Under active development as of 02/2013&lt;br /&gt;
|maintainers = {{usr|TheTom}}&lt;br /&gt;
|developers  = TheTom (since 02/2012)&lt;br /&gt;
|folders = &lt;br /&gt;
* {{flightgear file|src/Canvas}}&lt;br /&gt;
* {{simgear file|simgear/canvas}}&lt;br /&gt;
* {{fgdata file|Nasal/Canvas}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|topic-fgdata = (main repository, master branch; https://gitorious.org/~tomprogs/fg/toms-fgdata/commits/canvas-gui-demo)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|subforum = http://forum.flightgear.org/viewforum.php?f=71&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Canvas Navigation}}&lt;br /&gt;
&lt;br /&gt;
In FlightGear, a '''Canvas''' is a dynamically created image (OpenGL texture) that can be created and modified (drawn to) at runtime by using the [[Property Tree]], i.e. via the built-in scripting language [[Nasal]] and setting a few properties via {{func link|setprop()}} or its object-oriented wrapper props.nas. &lt;br /&gt;
&lt;br /&gt;
Canvas is all about rendering to a texture and updating it dynamically at run-time by modifying a sub-tree in the property tree that represents the texture (RTT) - its primary rendering primitives are:&lt;br /&gt;
* text (via osgText)&lt;br /&gt;
* vector graphics (via shivaVG/OpenVG, subject to change as of 03/2022, see [[Shiva Alternatives]])&lt;br /&gt;
* static raster images (or dynamic images via osg::Image represented as another Canvas)&lt;br /&gt;
* groups/maps - for grouping/nesting elements to arbitrary depths, and selectively controlling/transforming/clipping each sub-tree &lt;br /&gt;
Canvas itself maintains a FBO (frame buffer object ) for each texture, which is also the mechanism in use by [[Rembrandt]]. &lt;br /&gt;
In other words, Canvas is an abstraction mechanism for RTT/FBO management via conventional FlightGear properties. A Canvas texture can optionally also respond to common GUI events to support keyboard/mouse interactions (e.g. drag&amp;amp;drop, hot-keys).&amp;lt;ref&amp;gt;{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=221229#p221229&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Orbital Makes the Sky Black&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Sun Oct 19&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is a good idea to learn more about OOP (object oriented programming) and how to use that in Nasal.&lt;br /&gt;
&lt;br /&gt;
Next, you will probably want to look at some of the existing Canvas sources - i.e. $FG_ROOT/Nasal/canvas/* (especially api.nas)&lt;br /&gt;
&lt;br /&gt;
And then, you need to understand that Canvas works in form of primitives that form the primitives/ &amp;quot;building blocks&amp;quot; for all instruments.&lt;br /&gt;
&lt;br /&gt;
Namely: text handling, raster images, OpenVG Paths&lt;br /&gt;
&lt;br /&gt;
Everything else is built on top of these primitives (well, except for Maps, but that's a different topic).&lt;br /&gt;
For learning purposes, you could play with the examples that can be found in the [[Canvas Snippets]] article on the wiki.&lt;br /&gt;
Note that you need to understand OOP, and especially method chaining, to understand how those examples work  behind the scenes.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=281522#p281522&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: Best way to learn Canvas?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 4th, 2016&lt;br /&gt;
  | added   = Apr 4th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canvas textures can be used for a number of different purposes, such as creating fully-scripted avionics (airliner/bizjet -style/MFD glass cockpits) but also custom HUDs and custom GUI textures, even fully interactive GUI widgets (scheduled for FG 4.2+) and interactive scenery elements (e.g. VDGS).&lt;br /&gt;
&lt;br /&gt;
You can use any arbitrary shape to place a canvas onto. For a HUD you just need to create an arbitrarily shaped polygon with your favorite 3d modeling software and place a canvas onto it. As everything drawn onto the canvas goes to an offscreen texture first, only the parts placed onto the 3d model are shown.&lt;br /&gt;
&lt;br /&gt;
You can also draw transparent paths. With the correct blending mode you can just replace all existing contents. It's not named mask, but you can use every canvas element as a mask:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# replace everything already drawn with the pixels of the path&lt;br /&gt;
path.set(&amp;quot;blend-source&amp;quot;, &amp;quot;one&amp;quot;)&lt;br /&gt;
    .set(&amp;quot;blend-destination&amp;quot;, &amp;quot;zero&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently only rectangular clipping regions are possible (and will be for the next time). You can still get rounded corners if you just draw them in black (or any other background color) on top of the clipped region.&lt;br /&gt;
&lt;br /&gt;
The canvas subsystem is entirely implemented on top of the FlightGear [[Property Tree]], it makes use of property listeners to watch a sub tree of the property tree for canvas-related events (e.g. drawing commands or events to load an image from disk), so that textures can be dynamically instantiated and modified by setting properties in the property tree. This method is not specific to [[Nasal]] scripting, the same system can be used by other subsystems (such as the [[Telnet_usage|Telnet]] or HTTP daemons) to create and modify textures without directly using Nasal. The Canvas makes use of [http://www.khronos.org/openvg/ OpenVG] for 2D rendering.&lt;br /&gt;
&lt;br /&gt;
As of 08/2012, the Canvas system is still under active development and nothing is set in stone yet. See [[Canvas Properties]] for further information.&lt;br /&gt;
&lt;br /&gt;
The first prototype of the canvas system became available in FlightGear 2.8, this lacked some features currently under development (notably the Nasal API, support for raster and vector images)- it is expected that a more feature-rich version will be available in the following release, i.e. FlightGear 3.0+ - possibly replacing the entire existing PUI GUI with a fully Canvas-driven implementation in scripting space (one of the primary long-term goals is to modernize the FlightGear GUI). &lt;br /&gt;
&lt;br /&gt;
Future FlightGear versions will contain reimplementations of currently hard-coded instruments such as the wxradar, tcas or navdisplay using the canvas system, so that these can be easily maintained as part of the base package, and so that the same backend code can be also used for creating sophisticated dialogs using the Canvas system, such as ATC displays like [[ATC-FS]], sharing a single backend - without having to re-implement logic for otherwise identical purposes (currently, we have code that implements a navigational display, while another piece of code renders a conceptually identical [[Map]] dialog).&lt;br /&gt;
&lt;br /&gt;
Among other advantages, this will also provide for an opportunity to run Canvas-based instruments and GUI elements in another process, or even on another computer, analogous to [[FGPanel]] (see [[FGCanvas]]).&lt;br /&gt;
&lt;br /&gt;
The canvas system allows you to use SVG images drawn with Inkscape, and easily use raster images and even commpletely custom drawing commands using OpenVG paths.&lt;br /&gt;
&lt;br /&gt;
However, please do note that the canvas cannot currently be run in a standalone/FGPanel-fashion - there's been some talk about that, but that will at least take another 1-2 releases probably. That being said, you could certainly come up with a canvas instrument panel, and then simply use in a dedicated fgfs instance, which is slaved to a corresonding master instance.&lt;br /&gt;
&lt;br /&gt;
Also, there's currently work ongoing to port the old 2D panel and HUD systems to the new Canvas system, using custom Nasal wrappers reimplementing the old behavior and turning the textures into canvas properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Requirements and Limitations ==&lt;br /&gt;
Beginning with 2.8, up to 2.99+, all FlightGear versions require FBO support for the canvas system to work properly [http://forum.flightgear.org/viewtopic.php?f=68&amp;amp;t=20887]. In particular, this means that very old GPUs such as Intel 910/915 cards are currently not supported (FBO support is obviously also required for [[Rembrandt]] to work), people without FBO support are likely to just get &amp;quot;white&amp;quot; Canvas textures[http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;t=24562]. &lt;br /&gt;
&lt;br /&gt;
Unless render-to-texture (RTT) support can be provided through some form of fallback mode for hardware without FBO support, we we might need to consider officially un-supporting such old hardware from 3.0 (since we can already detect the vendor as Intel). &lt;br /&gt;
&lt;br /&gt;
It seems 940-class chips are okay, and the 2000/3000/4000HD versions seem to work, but the earlier 9xx and before are going to be problematic for the time being [http://forum.flightgear.org/viewtopic.php?f=68&amp;amp;t=20887&amp;amp;p=192091#p192088]. At the moment, it isn't clear if telling the od_gauge/OSG backend code to use pbuffer rendering instead of FBOs would already help solve the problem [http://forum.flightgear.org/viewtopic.php?f=68&amp;amp;t=20887&amp;amp;p=192091#p192091].&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Canvas is just a piece of technology - there are some early adopters/attempts who began using Canvas at a time when things were very much still in flux, which is why we have code snippets/instruments (and aircraft) where Canvas related functionality is significantly contributing to lag - I think this did apply to the m2000 and the extra500. &lt;br /&gt;
I haven't looked at any of those aircraft in months, so I cannot say if those problems have been addressed/fixed meanwhile - but there are a handful of examples for efficient Nasal/Canvas-based features, without them causing/contributing to significant lag. We have provided a bunch of &amp;quot;best practices&amp;quot; in various threads, and also offered 1:1 help to the efforts/people affected by this. &lt;br /&gt;
Some have refused to accept such advice, others simply disappeared over time. So I cannot say much about any particular aircraft. But Nasal and Canvas are just tools that can be misused - and they're &amp;quot;interpreted&amp;quot; tools, both of which are basically using the concept of a &amp;quot;virtual machine&amp;quot; internally, so there's a certain overhead due to all the indirection taking place - which is to say that you don't need to be an experienced C/C++ or OpenGL/OSG programmer to use Nasal and Canvas to create sophisticated avionics - which isn't unlike the YASim/JSBSim FDM engines (or the autopilot system), which also, can be mis-used to create inefficient constructs that end up slowing down the simulator significantly.&lt;br /&gt;
Then again, sometimes, there simply are very real bugs - like those in the property tree/effects code that TorstenD fixed a while ago, or the memory leak that Jabberwocky brought up on the forum, and that sanhoay identified - as long as people can provide actionable bug reports and reproducible test scenarios, there's a fairly good chance for bugs (and performance issues) to get fixed within 1-2 release cycles. But just coming here and saying that feature XYZ is broken or slows down the simulator isn't helping anybody, unless you can provide all the information that is needed that people who understanding the underlying subsystems can nail down the problem and see if there's an actual problem or not.&lt;br /&gt;
This also involves stating exactly what hardware you are on, and what your other startup/runtime settings are - as of now, Canvas doesn't provide native support for shaders, so it will be using OSG/shivaVG for all hardware accelerated graphics, which should usually be sufficiently fast - but there are known constructs/usage patterns that are infamous for triggering unnecessary updates/re-drawing, which should be avoided.&lt;br /&gt;
The other obvious issue is that Canvas does require FBO support.&lt;br /&gt;
People writing Nasal/Canvas code should ideally understand that Canvas is not just a VM but also a state machine to some extent, so even redundant/unnecessary state changes (all of which are going through the property tree usually) will trigger updates/re-drawing under certain circumstances, which is to say that this should be avoided - and which is why I, and a handful of others, have been trying to enforce a framework-centric development philosophy when it comes to Canvas development, so that people don't use Canvas directly, but instead come up with frameworks for functionality that they need, to encapsulate any Canvas specific functionality - that we- can help review/improve over time, without having to touch tons of code files, instruments, aircraft etc&lt;br /&gt;
The underlying idea can be seen in the ND and MapStructure efforts, neither of which needs to be touched by aircraft/GUI developers to add/create an ND or chart/map.&lt;br /&gt;
In summary, Canvas certainly isn't being maintained as actively as it once used to be, but -like Nasal- Canvas is just a technology enabler, and people should introduce abstraction layers to use the system, so that possibly problematic usage patterns can be more easily encapsulated, but also reviewed/edited and optimized over time.&lt;br /&gt;
But please don't expect any of the people involved in Canvas related efforts to answer such broad questions with a single &amp;quot;yes&amp;quot; or &amp;quot;no&amp;quot;, without also providing a proper context.&lt;br /&gt;
&lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=250205#p250205&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: Developing a Canvas Cockpit for the CRJ700&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Jul 7th, 2015&lt;br /&gt;
  | added   = Jul 7th, 2015&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Latest Canvas Efforts ==&lt;br /&gt;
&lt;br /&gt;
{{Canvas Frameworks|mode=by-year|year=2013}}&lt;br /&gt;
&lt;br /&gt;
= Canvas and Nasal =&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |Canvas is not all about Nasal - it's probably safe to say that 95-99% of all Nasal code using Canvas ends up being &amp;quot;just&amp;quot; property I/O i.e. properties being read/written, or updated via timers/listeners. Usually, the idea is to initialize a Canvas texture by setting up all important state early on, and then &amp;quot;update&amp;quot; and &amp;quot;animate&amp;quot; things using timers/listeners - or even property rules later on. That will usually help minimize most Nasal-induced overhead.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237678#p237678&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Fri Apr 03&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  | Canvas can definitely also be used without using Nasal - to see for yourself, just use the property tree browser to create/display canvas textures, or even the telnet/httpd protocols.&lt;br /&gt;
For the time being Nasal merely happens to provide the most abstract interface/mechanism to deal with Canvas - but you could just as well use the Canvas system from C++ by doing the corresponding property I/O using the C++ property interface directly - which would eliminate all Nasal overhead, even timers/listeners could then implemented in C++ space for animation/update logic.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237678#p237678&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Fri Apr 03&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |That being said, this isn't necessarily the smartest/best thing to do - primarily, Canvas is all about exposing hardware-accelerated 2D rendering to fgdata space, so that non-core developers can easily address their 2D rendering needs, without having to rebuild FG from source and without having to be intimately familiar with C++ and OSG/OpenGL. Which is where the performance overhead is coming from, i.e. Canvas APIs being modeled on top of the property tree and wrapped using Nasal bindings - which adds  two fairly massive layers of abstraction in terms of property I/O and Nasal&amp;amp;lt;-&amp;amp;gt;C++ marshalling.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237678#p237678&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Fri Apr 03&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Using the Canvas in non-FG projects =&lt;br /&gt;
The canvas system has been refactored such that it can be more easily re-used in other programs, this included moving the Canvas component from FlightGear to SimGear and releasing the canvas code under SimGear's license (LGPL).&lt;br /&gt;
&lt;br /&gt;
It is now possible to use the Canvas in projects unrelated to FlightGear, but you will obviously benefit from using certain FlightGear-related technologies, such as an * property tree &lt;br /&gt;
* SGSubsystem/Mgr-based main loop&lt;br /&gt;
* an osgviewer-based main window&lt;br /&gt;
* Nasal scripting&lt;br /&gt;
&lt;br /&gt;
Icecode's FGRadar project is such a completely separate code base from FG, which uses SG/FG components to simplify code reuse, without re-inventing the wheel.&lt;br /&gt;
&lt;br /&gt;
For this very purpose, FGRadar uses a custom &amp;quot;SGApplication&amp;quot; framework - so that existing FlightGear subsystems can be more easily reused in different projects. All that's needed is deriving your own class from &amp;quot;SGApplication&amp;quot; and implementing its interface.&lt;br /&gt;
The whole idea behind &amp;quot;SGApplication&amp;quot; is to provide a scriptable framework for OpenGL applications, fully based on 1) OSG, 2) SGSubsystems, 3) Nasal scripting and 4) the Canvas.&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |the whole purpose of SGApplication is to provide a SGSubsystem-based &amp;quot;architecture&amp;quot; so that Nasal + Canvas and the property tree code can be easily reused.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237591#p237591&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |the SGApplication stuff isn't really needed, we just came up with it to simplify working with the SG code. But at least it demonstrates how the whole SGSubsystemMgr stuff works.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237591#p237591&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |you can also use SGSubsystem/SGSubsystemMgr directly - no need for &amp;quot;SGApplication&amp;quot; at all, it's just a convenicence helper.&lt;br /&gt;
&amp;quot;porting&amp;quot; isn't strictly necessary - you would primarily need int main() with a top-level SGSubsystemMgr, where you can then add the property tree, Nasal,  Canvas, events etc (a handful of subsystems). To use Canvas outside FG, you would also need to look at the FGCanvasSystemAdapter in $FG_SRC/Canvas and provide your own wrapper for your own app (trivial).&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237591#p237591&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |&amp;quot;fgpanel&amp;quot; is a code base that is using the &amp;quot;copy &amp;amp;amp; paste&amp;quot; approach - so could serve as another example (beyond fgradar).&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237613#p237613&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
For additional info, see: http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;t=18415&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
[[File:Boeing 747-400 PFD and ND approach EHAM 18R.png|450px]]&lt;br /&gt;
&lt;br /&gt;
A short video demonstrating a possible usecase (C-130J AMU):&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|A7j-B0LgV-A}}&lt;br /&gt;
&lt;br /&gt;
By using alphablending it can also be used to render the contents of a HUD:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|_oRX53JyXmM}}&lt;br /&gt;
&lt;br /&gt;
In my branch there is now also support for using the canvas in a gui widget:&lt;br /&gt;
&lt;br /&gt;
[[File:Canvas GUI Demo.png|thumb|none|400px|Using the Canvas as a GUI widget]]&lt;br /&gt;
&lt;br /&gt;
With the new ''map'' element it is also very easy to draw maps:&lt;br /&gt;
&lt;br /&gt;
[[File:Demonstration of using the Canvas inside a GUI dialog..png|thumb|none|400px|Simple Map of KSFO]]&lt;br /&gt;
&lt;br /&gt;
Using the new [[Howto:Use_SVG_inside_a_Canvas|''canvas.parsesvg'']] function to use an SVG file to simulate an EICAS display:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|43P7xKNJnV4}}&lt;br /&gt;
&lt;br /&gt;
Demonstrating how the new Canvas GUI wrapper can be used to create entirely custom, scripted GUI widgets using XML, SVG and Nasal:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|1a6wtPVPWc4}}&lt;br /&gt;
&lt;br /&gt;
Experimenting with selecting text and positioning a cursor inside the text. The visualization is all done using Nasal.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|CIS8UyuJLgM}}&lt;br /&gt;
&lt;br /&gt;
Since 07/2012, the canvas system also provides support for full window-drawing:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|Qv-uEX42QZY}} &lt;br /&gt;
&lt;br /&gt;
Omega95 has reimplemented the CDU of the ATR72 using the Canvas system:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|sAaVEKuiF5w}}&lt;br /&gt;
&lt;br /&gt;
Another video demonstrating window stacking and nested canvases:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|llVaasTEf44}}&lt;br /&gt;
&lt;br /&gt;
Using Canvas mouse events to create [http://forum.flightgear.org/viewtopic.php?p=183653#p183653 animation of slider, wheel and knob]&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|HELiLjEGno8}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Rewrite]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Canvas&amp;diff=144604</id>
		<title>Canvas</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Canvas&amp;diff=144604"/>
		<updated>2026-05-24T15:14:36Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox subsystem&lt;br /&gt;
|image       = Anniversary4.png&lt;br /&gt;
|name        = Canvas Subsystem&lt;br /&gt;
|started     = 05/2012 (Available since [[Changelog 2.8.0|FlightGear 2.8]])&lt;br /&gt;
|description = Dynamic 2D drawing at runtime using the property tree and scripting (for instruments, HUDs, GUIs)&lt;br /&gt;
|status      = Under active development as of 02/2013&lt;br /&gt;
|maintainers = {{usr|TheTom}}&lt;br /&gt;
|developers  = TheTom (since 02/2012)&lt;br /&gt;
|folders = &lt;br /&gt;
* {{flightgear file|src/Canvas}}&lt;br /&gt;
* {{simgear file|simgear/canvas}}&lt;br /&gt;
* {{fgdata file|Nasal/Canvas}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
|topic-fgdata = (main repository, master branch; https://gitorious.org/~tomprogs/fg/toms-fgdata/commits/canvas-gui-demo)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|subforum = http://forum.flightgear.org/viewforum.php?f=71&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Canvas Navigation}}&lt;br /&gt;
&lt;br /&gt;
In FlightGear, a '''Canvas''' is a dynamically created image (OpenGL texture) that can be created and modified (drawn to) at runtime by using the [[Property Tree]], i.e. via the built-in scripting language [[Nasal]] and setting a few properties via {{func link|setprop()}} or its object-oriented wrapper props.nas. &lt;br /&gt;
&lt;br /&gt;
Canvas is all about rendering to a texture and updating it dynamically at run-time by modifying a sub-tree in the property tree that represents the texture (RTT) - its primary rendering primitives are:&lt;br /&gt;
* text (via osgText)&lt;br /&gt;
* vector graphics (via shivaVG/OpenVG, subject to change as of 03/2022, see [[Shiva Alternatives]])&lt;br /&gt;
* static raster images (or dynamic images via osg::Image represented as another Canvas)&lt;br /&gt;
* groups/maps - for grouping/nesting elements to arbitrary depths, and selectively controlling/transforming/clipping each sub-tree &lt;br /&gt;
Canvas itself maintains a FBO (frame buffer object ) for each texture, which is also the mechanism in use by [[Rembrandt]]. &lt;br /&gt;
In other words, Canvas is an abstraction mechanism for RTT/FBO management via conventional FlightGear properties. A Canvas texture can optionally also respond to common GUI events to support keyboard/mouse interactions (e.g. drag&amp;amp;drop, hot-keys).&amp;lt;ref&amp;gt;{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=221229#p221229&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Orbital Makes the Sky Black&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Sun Oct 19&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is a good idea to learn more about OOP (object oriented programming) and how to use that in Nasal.&lt;br /&gt;
&lt;br /&gt;
Next, you will probably want to look at some of the existing Canvas sources - i.e. $FG_ROOT/Nasal/canvas/* (especially api.nas)&lt;br /&gt;
&lt;br /&gt;
And then, you need to understand that Canvas works in form of primitives that form the primitives/ &amp;quot;building blocks&amp;quot; for all instruments.&lt;br /&gt;
&lt;br /&gt;
Namely: text handling, raster images, OpenVG Paths&lt;br /&gt;
&lt;br /&gt;
Everything else is built on top of these primitives (well, except for Maps, but that's a different topic).&lt;br /&gt;
For learning purposes, you could play with the examples that can be found in the [[Canvas Snippets]] article on the wiki.&lt;br /&gt;
Note that you need to understand OOP, and especially method chaining, to understand how those examples work  behind the scenes.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=281522#p281522&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: Best way to learn Canvas?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 4th, 2016&lt;br /&gt;
  | added   = Apr 4th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Canvas textures can be used for a number of different purposes, such as creating fully-scripted avionics (airliner/bizjet -style/MFD glass cockpits) but also custom HUDs and custom GUI textures, even fully interactive GUI widgets (scheduled for FG 4.2+) and interactive scenery elements (e.g. VDGS).&lt;br /&gt;
&lt;br /&gt;
You can use any arbitrary shape to place a canvas onto. For a HUD you just need to create an arbitrarily shaped polygon with your favorite 3d modeling software and place a canvas onto it. As everything drawn onto the canvas goes to an offscreen texture first, only the parts placed onto the 3d model are shown.&lt;br /&gt;
&lt;br /&gt;
You can also draw transparent paths. With the correct blending mode you can just replace all existing contents. It's not named mask, but you can use every canvas element as a mask:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# replace everything already drawn with the pixels of the path&lt;br /&gt;
path.set(&amp;quot;blend-source&amp;quot;, &amp;quot;one&amp;quot;)&lt;br /&gt;
    .set(&amp;quot;blend-destination&amp;quot;, &amp;quot;zero&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently only rectangular clipping regions are possible (and will be for the next time). You can still get rounded corners if you just draw them in black (or any other background color) on top of the clipped region.&lt;br /&gt;
&lt;br /&gt;
The canvas subsystem is entirely implemented on top of the FlightGear [[Property Tree]], it makes use of property listeners to watch a sub tree of the property tree for canvas-related events (e.g. drawing commands or events to load an image from disk), so that textures can be dynamically instantiated and modified by setting properties in the property tree. This method is not specific to [[Nasal]] scripting, the same system can be used by other subsystems (such as the [[Telnet]] or HTTP daemons) to create and modify textures without directly using Nasal. The Canvas makes use of [http://www.khronos.org/openvg/ OpenVG] for 2D rendering.&lt;br /&gt;
&lt;br /&gt;
As of 08/2012, the Canvas system is still under active development and nothing is set in stone yet. See [[Canvas Properties]] for further information.&lt;br /&gt;
&lt;br /&gt;
The first prototype of the canvas system became available in FlightGear 2.8, this lacked some features currently under development (notably the Nasal API, support for raster and vector images)- it is expected that a more feature-rich version will be available in the following release, i.e. FlightGear 3.0+ - possibly replacing the entire existing PUI GUI with a fully Canvas-driven implementation in scripting space (one of the primary long-term goals is to modernize the FlightGear GUI). &lt;br /&gt;
&lt;br /&gt;
Future FlightGear versions will contain reimplementations of currently hard-coded instruments such as the wxradar, tcas or navdisplay using the canvas system, so that these can be easily maintained as part of the base package, and so that the same backend code can be also used for creating sophisticated dialogs using the Canvas system, such as ATC displays like [[ATC-FS]], sharing a single backend - without having to re-implement logic for otherwise identical purposes (currently, we have code that implements a navigational display, while another piece of code renders a conceptually identical [[Map]] dialog).&lt;br /&gt;
&lt;br /&gt;
Among other advantages, this will also provide for an opportunity to run Canvas-based instruments and GUI elements in another process, or even on another computer, analogous to [[FGPanel]] (see [[FGCanvas]]).&lt;br /&gt;
&lt;br /&gt;
The canvas system allows you to use SVG images drawn with Inkscape, and easily use raster images and even commpletely custom drawing commands using OpenVG paths.&lt;br /&gt;
&lt;br /&gt;
However, please do note that the canvas cannot currently be run in a standalone/FGPanel-fashion - there's been some talk about that, but that will at least take another 1-2 releases probably. That being said, you could certainly come up with a canvas instrument panel, and then simply use in a dedicated fgfs instance, which is slaved to a corresonding master instance.&lt;br /&gt;
&lt;br /&gt;
Also, there's currently work ongoing to port the old 2D panel and HUD systems to the new Canvas system, using custom Nasal wrappers reimplementing the old behavior and turning the textures into canvas properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Requirements and Limitations ==&lt;br /&gt;
Beginning with 2.8, up to 2.99+, all FlightGear versions require FBO support for the canvas system to work properly [http://forum.flightgear.org/viewtopic.php?f=68&amp;amp;t=20887]. In particular, this means that very old GPUs such as Intel 910/915 cards are currently not supported (FBO support is obviously also required for [[Rembrandt]] to work), people without FBO support are likely to just get &amp;quot;white&amp;quot; Canvas textures[http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;t=24562]. &lt;br /&gt;
&lt;br /&gt;
Unless render-to-texture (RTT) support can be provided through some form of fallback mode for hardware without FBO support, we we might need to consider officially un-supporting such old hardware from 3.0 (since we can already detect the vendor as Intel). &lt;br /&gt;
&lt;br /&gt;
It seems 940-class chips are okay, and the 2000/3000/4000HD versions seem to work, but the earlier 9xx and before are going to be problematic for the time being [http://forum.flightgear.org/viewtopic.php?f=68&amp;amp;t=20887&amp;amp;p=192091#p192088]. At the moment, it isn't clear if telling the od_gauge/OSG backend code to use pbuffer rendering instead of FBOs would already help solve the problem [http://forum.flightgear.org/viewtopic.php?f=68&amp;amp;t=20887&amp;amp;p=192091#p192091].&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Canvas is just a piece of technology - there are some early adopters/attempts who began using Canvas at a time when things were very much still in flux, which is why we have code snippets/instruments (and aircraft) where Canvas related functionality is significantly contributing to lag - I think this did apply to the m2000 and the extra500. &lt;br /&gt;
I haven't looked at any of those aircraft in months, so I cannot say if those problems have been addressed/fixed meanwhile - but there are a handful of examples for efficient Nasal/Canvas-based features, without them causing/contributing to significant lag. We have provided a bunch of &amp;quot;best practices&amp;quot; in various threads, and also offered 1:1 help to the efforts/people affected by this. &lt;br /&gt;
Some have refused to accept such advice, others simply disappeared over time. So I cannot say much about any particular aircraft. But Nasal and Canvas are just tools that can be misused - and they're &amp;quot;interpreted&amp;quot; tools, both of which are basically using the concept of a &amp;quot;virtual machine&amp;quot; internally, so there's a certain overhead due to all the indirection taking place - which is to say that you don't need to be an experienced C/C++ or OpenGL/OSG programmer to use Nasal and Canvas to create sophisticated avionics - which isn't unlike the YASim/JSBSim FDM engines (or the autopilot system), which also, can be mis-used to create inefficient constructs that end up slowing down the simulator significantly.&lt;br /&gt;
Then again, sometimes, there simply are very real bugs - like those in the property tree/effects code that TorstenD fixed a while ago, or the memory leak that Jabberwocky brought up on the forum, and that sanhoay identified - as long as people can provide actionable bug reports and reproducible test scenarios, there's a fairly good chance for bugs (and performance issues) to get fixed within 1-2 release cycles. But just coming here and saying that feature XYZ is broken or slows down the simulator isn't helping anybody, unless you can provide all the information that is needed that people who understanding the underlying subsystems can nail down the problem and see if there's an actual problem or not.&lt;br /&gt;
This also involves stating exactly what hardware you are on, and what your other startup/runtime settings are - as of now, Canvas doesn't provide native support for shaders, so it will be using OSG/shivaVG for all hardware accelerated graphics, which should usually be sufficiently fast - but there are known constructs/usage patterns that are infamous for triggering unnecessary updates/re-drawing, which should be avoided.&lt;br /&gt;
The other obvious issue is that Canvas does require FBO support.&lt;br /&gt;
People writing Nasal/Canvas code should ideally understand that Canvas is not just a VM but also a state machine to some extent, so even redundant/unnecessary state changes (all of which are going through the property tree usually) will trigger updates/re-drawing under certain circumstances, which is to say that this should be avoided - and which is why I, and a handful of others, have been trying to enforce a framework-centric development philosophy when it comes to Canvas development, so that people don't use Canvas directly, but instead come up with frameworks for functionality that they need, to encapsulate any Canvas specific functionality - that we- can help review/improve over time, without having to touch tons of code files, instruments, aircraft etc&lt;br /&gt;
The underlying idea can be seen in the ND and MapStructure efforts, neither of which needs to be touched by aircraft/GUI developers to add/create an ND or chart/map.&lt;br /&gt;
In summary, Canvas certainly isn't being maintained as actively as it once used to be, but -like Nasal- Canvas is just a technology enabler, and people should introduce abstraction layers to use the system, so that possibly problematic usage patterns can be more easily encapsulated, but also reviewed/edited and optimized over time.&lt;br /&gt;
But please don't expect any of the people involved in Canvas related efforts to answer such broad questions with a single &amp;quot;yes&amp;quot; or &amp;quot;no&amp;quot;, without also providing a proper context.&lt;br /&gt;
&lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=250205#p250205&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: Developing a Canvas Cockpit for the CRJ700&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Jul 7th, 2015&lt;br /&gt;
  | added   = Jul 7th, 2015&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Latest Canvas Efforts ==&lt;br /&gt;
&lt;br /&gt;
{{Canvas Frameworks|mode=by-year|year=2013}}&lt;br /&gt;
&lt;br /&gt;
= Canvas and Nasal =&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |Canvas is not all about Nasal - it's probably safe to say that 95-99% of all Nasal code using Canvas ends up being &amp;quot;just&amp;quot; property I/O i.e. properties being read/written, or updated via timers/listeners. Usually, the idea is to initialize a Canvas texture by setting up all important state early on, and then &amp;quot;update&amp;quot; and &amp;quot;animate&amp;quot; things using timers/listeners - or even property rules later on. That will usually help minimize most Nasal-induced overhead.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237678#p237678&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Fri Apr 03&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  | Canvas can definitely also be used without using Nasal - to see for yourself, just use the property tree browser to create/display canvas textures, or even the telnet/httpd protocols.&lt;br /&gt;
For the time being Nasal merely happens to provide the most abstract interface/mechanism to deal with Canvas - but you could just as well use the Canvas system from C++ by doing the corresponding property I/O using the C++ property interface directly - which would eliminate all Nasal overhead, even timers/listeners could then implemented in C++ space for animation/update logic.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237678#p237678&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Fri Apr 03&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |That being said, this isn't necessarily the smartest/best thing to do - primarily, Canvas is all about exposing hardware-accelerated 2D rendering to fgdata space, so that non-core developers can easily address their 2D rendering needs, without having to rebuild FG from source and without having to be intimately familiar with C++ and OSG/OpenGL. Which is where the performance overhead is coming from, i.e. Canvas APIs being modeled on top of the property tree and wrapped using Nasal bindings - which adds  two fairly massive layers of abstraction in terms of property I/O and Nasal&amp;amp;lt;-&amp;amp;gt;C++ marshalling.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237678#p237678&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Fri Apr 03&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Using the Canvas in non-FG projects =&lt;br /&gt;
The canvas system has been refactored such that it can be more easily re-used in other programs, this included moving the Canvas component from FlightGear to SimGear and releasing the canvas code under SimGear's license (LGPL).&lt;br /&gt;
&lt;br /&gt;
It is now possible to use the Canvas in projects unrelated to FlightGear, but you will obviously benefit from using certain FlightGear-related technologies, such as an * property tree &lt;br /&gt;
* SGSubsystem/Mgr-based main loop&lt;br /&gt;
* an osgviewer-based main window&lt;br /&gt;
* Nasal scripting&lt;br /&gt;
&lt;br /&gt;
Icecode's FGRadar project is such a completely separate code base from FG, which uses SG/FG components to simplify code reuse, without re-inventing the wheel.&lt;br /&gt;
&lt;br /&gt;
For this very purpose, FGRadar uses a custom &amp;quot;SGApplication&amp;quot; framework - so that existing FlightGear subsystems can be more easily reused in different projects. All that's needed is deriving your own class from &amp;quot;SGApplication&amp;quot; and implementing its interface.&lt;br /&gt;
The whole idea behind &amp;quot;SGApplication&amp;quot; is to provide a scriptable framework for OpenGL applications, fully based on 1) OSG, 2) SGSubsystems, 3) Nasal scripting and 4) the Canvas.&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |the whole purpose of SGApplication is to provide a SGSubsystem-based &amp;quot;architecture&amp;quot; so that Nasal + Canvas and the property tree code can be easily reused.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237591#p237591&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |the SGApplication stuff isn't really needed, we just came up with it to simplify working with the SG code. But at least it demonstrates how the whole SGSubsystemMgr stuff works.&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237591#p237591&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |you can also use SGSubsystem/SGSubsystemMgr directly - no need for &amp;quot;SGApplication&amp;quot; at all, it's just a convenicence helper.&lt;br /&gt;
&amp;quot;porting&amp;quot; isn't strictly necessary - you would primarily need int main() with a top-level SGSubsystemMgr, where you can then add the property tree, Nasal,  Canvas, events etc (a handful of subsystems). To use Canvas outside FG, you would also need to look at the FGCanvasSystemAdapter in $FG_SRC/Canvas and provide your own wrapper for your own app (trivial).&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237591#p237591&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |&amp;quot;fgpanel&amp;quot; is a code base that is using the &amp;quot;copy &amp;amp;amp; paste&amp;quot; approach - so could serve as another example (beyond fgradar).&lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=237613#p237613&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Simgear-based subsystem with Canvas support?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Apr 02&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
For additional info, see: http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;t=18415&lt;br /&gt;
&lt;br /&gt;
== Gallery ==&lt;br /&gt;
&lt;br /&gt;
[[File:Boeing 747-400 PFD and ND approach EHAM 18R.png|450px]]&lt;br /&gt;
&lt;br /&gt;
A short video demonstrating a possible usecase (C-130J AMU):&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|A7j-B0LgV-A}}&lt;br /&gt;
&lt;br /&gt;
By using alphablending it can also be used to render the contents of a HUD:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|_oRX53JyXmM}}&lt;br /&gt;
&lt;br /&gt;
In my branch there is now also support for using the canvas in a gui widget:&lt;br /&gt;
&lt;br /&gt;
[[File:Canvas GUI Demo.png|thumb|none|400px|Using the Canvas as a GUI widget]]&lt;br /&gt;
&lt;br /&gt;
With the new ''map'' element it is also very easy to draw maps:&lt;br /&gt;
&lt;br /&gt;
[[File:Demonstration of using the Canvas inside a GUI dialog..png|thumb|none|400px|Simple Map of KSFO]]&lt;br /&gt;
&lt;br /&gt;
Using the new [[Howto:Use_SVG_inside_a_Canvas|''canvas.parsesvg'']] function to use an SVG file to simulate an EICAS display:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|43P7xKNJnV4}}&lt;br /&gt;
&lt;br /&gt;
Demonstrating how the new Canvas GUI wrapper can be used to create entirely custom, scripted GUI widgets using XML, SVG and Nasal:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|1a6wtPVPWc4}}&lt;br /&gt;
&lt;br /&gt;
Experimenting with selecting text and positioning a cursor inside the text. The visualization is all done using Nasal.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|CIS8UyuJLgM}}&lt;br /&gt;
&lt;br /&gt;
Since 07/2012, the canvas system also provides support for full window-drawing:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|Qv-uEX42QZY}} &lt;br /&gt;
&lt;br /&gt;
Omega95 has reimplemented the CDU of the ATR72 using the Canvas system:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|sAaVEKuiF5w}}&lt;br /&gt;
&lt;br /&gt;
Another video demonstrating window stacking and nested canvases:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|llVaasTEf44}}&lt;br /&gt;
&lt;br /&gt;
Using Canvas mouse events to create [http://forum.flightgear.org/viewtopic.php?p=183653#p183653 animation of slider, wheel and knob]&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|HELiLjEGno8}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Rewrite]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=144337</id>
		<title>Pl/Nowy we FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Nowy_we_FlightGear&amp;diff=144337"/>
		<updated>2026-05-10T11:40:22Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Wymagania sprzętowe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Witaj we [[FlightGear]]!''' Tutaj postaramy się, abyś wzbił się w wirtualne powietrze w jak najkrótszym czasie. Zapoznamy Cię również z niektórymi funkcjami tego symulatora lotu, a także z kilkoma informacjami na temat jego społeczności.&lt;br /&gt;
&lt;br /&gt;
==Instalacja i konfigurowanie==&lt;br /&gt;
===Wymagania sprzętowe===&lt;br /&gt;
Aby FlightGear działał płynnie, wymagana jest karta graficzna ze sterownikami OpenGL w wersji 4.0 lub wyższej. Zazwyczaj nie stanowi to problemu, ale spójrz na [[Pl/Wymagania sprzętowe|zalecenia sprzętowe]], aby mieć lepsze rozeznanie.&lt;br /&gt;
&lt;br /&gt;
Wiele laptopów może mieć problemy z FlightGear, ponieważ ich karty graficzne są zazwyczaj z niższej półki. Zobacz [[Notebooks known to run FlightGear|notebooki na których można uruchomić FlightGear]], aby zapoznać się z recenzjami kilku laptopów.&lt;br /&gt;
&lt;br /&gt;
===Pobieranie FlightGear===&lt;br /&gt;
Możesz pobrać najnowsze pliki ze [https://www.flightgear.org/download/ strony pobierania FlightGeara]. Wybierz pliki źródłowe lub binarne odpowiednie dla Twojego konkretnego systemu. Od wersji 2020.3 LTS, dostępne są również pliki binarne {{Wikipedia|AppImage|AppImage}} dla Linuxa. Większość użytkowników Linuxa znajdzie też FlightGeara w zasobach swojej dystrybucji (pakiet może nazywać się &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
W zależności od Twojej wiedzy technicznej, możesz wybrać wersję rozwojową [[Git]] FlightGeara, która zazwyczaj ma więcej funkcji i może być wymagana przez niektóre z najnowszych samolotów rozwojowych, ale może być niestabilna. Ogólnie rzecz biorąc, wersja rozwojowa nie jest zalecana dla przeciętnego użytkownika, ale jeśli jesteś chętny, aby zrobić kilka testów, istnieje wersja [https://www.flightgear.org/download/nightly/ nightly] dostępna do pobrania. Jeśli używasz wersji Git FlightGeara, możesz zsynchronizować swoje samoloty za pomocą [[FGAddon|repozytorium samolotów FGAddon]].&lt;br /&gt;
&lt;br /&gt;
===Instalacja na Windows===&lt;br /&gt;
Po pobraniu instalatora, uruchom go i postępuj zgodnie z jego instrukcjami, aby zainstalować FlightGeara.&lt;br /&gt;
&lt;br /&gt;
FlightGear jest uważany przez niektóre programy antywirusowe za wirusa. Jeśli tak się stanie, możesz tymczasowo wyłączyć antywirusa podczas instalacji.&lt;br /&gt;
&lt;br /&gt;
W instalatorze Windows, możesz wybrać gdzie chcesz zainstalować FlightGeara. Katalogiem [[Pl/$FG_ROOT|$FG_ROOT]] będzie &amp;lt;code&amp;gt;&amp;lt;wybrany przez Ciebie katalog&amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Instalacja na macOS===&lt;br /&gt;
Instalacja FlightGeara na macOS jest bardzo prosta. Wystarczy przeciągnąć i upuścić ikonę FlightGear do folderu &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt;. To wszystko.&lt;br /&gt;
&lt;br /&gt;
Przy pierwszym uruchomieniu FlightGeara, ikona w Docku będzie podskakiwać przez kilka sekund podczas ładowania informacji o samolotach i lotniskach. Kiedy pojawi się GUI launchera, wybierz samolot i lotnisko, następnie kliknij &amp;quot;Lećmy!&amp;quot; aby uruchomić symulator. Możesz skonfigurować więcej opcji używając launchera GUI. Więcej szczegółów znajdziesz w [http://flightgear.sourceforge.net/manual/next/pl/getstart-plch4.html#start-jak-uruchomic-program Podręczniku Użytkownika].&lt;br /&gt;
&lt;br /&gt;
Jeśli chcesz uruchomić FlightGear za pomocą wiersza poleceń, uruchom /Applications/Utilities/Terminal.app i wpisz następujące polecenie:&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options..... &lt;br /&gt;
&lt;br /&gt;
Zmienne [[Pl/$FG_ROOT|$FG_ROOT]] i [[$FG_SCENERY]] nie są ustawiane na macOS. Jeśli chcesz samemu określić te zmienne do użytku w wierszu poleceń, wykonaj poniższe polecenia w Terminal.app:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[Pl/$FG_ROOT|$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
Po uruchomieniu launchera GUI, będziesz miał alias do [[Pl/$FG_ROOT|$FG_ROOT]] w &amp;lt;code&amp;gt;$HOME/Documents/Flightgear/&amp;lt;wersja&amp;gt;&amp;lt;/code&amp;gt;, więc możesz przeglądać folder danych za pomocą Findera.&lt;br /&gt;
&lt;br /&gt;
Uwaga: Po zainstalowaniu FlightGeara, użytkownicy Mac mogą zlokalizować folder [[Pl/$FG_ROOT|$FG_ROOT]] otwierając folder aplikacji w Finderze, klikając prawym przyciskiem myszy na FlightGear i klikając &amp;quot;Pokaż zawartość pakietu&amp;quot;. To przeniesie Cię do folderu FlightGear. Teraz możesz uzyskać dostęp do wszystkich plików, w tym Data/Aircraft, aby [[Pl/Instalowanie_samolotów#macOS|zainstalować nowy samolot]].&lt;br /&gt;
&lt;br /&gt;
===Konfiguracja OpenGL===&lt;br /&gt;
FlightGear działa najlepiej z aktualnymi sterownikami wideo [[OpenGL]]. Jeśli masz problemy z uruchomieniem FlightGeara, zobacz [[Graphics drivers configuration|Konfiguracja sterowników graficznych]], aby uzyskać więcej informacji.&lt;br /&gt;
&lt;br /&gt;
===Pobieranie scenerii===&lt;br /&gt;
Wraz z FlightGearem instalowany jest ograniczony zestaw [[Scenery|scenerii]]. W przypadku FlightGear 2020.3 LTS jest to: &lt;br /&gt;
*obszar wokół lotniska, które jest głównym lotniskiem dla tego wydania, czyli [[Keflavik Airport|Keflavik International Airport]] (BIKF),&lt;br /&gt;
*lotnisko szkoleniowe dla [[Pl/Cessna 172P|Cessny 172P]], którym jest [[Hilo International Airport]] (PHTO).&lt;br /&gt;
&lt;br /&gt;
We FlightGear sceneria jest przechowywana w katalogu [[Pl/$FG_ROOT|$FG_ROOT]] i jest podzielona na trzy rodzaje danych:&lt;br /&gt;
*'''Airports''' przechowuje dane o lotnisku, takie jak wykorzystanie pasów startowych i miejsc parkingowych.&lt;br /&gt;
*'''Objects''' i '''Models''' to budynki, mosty, wieże radiowe itp. reprezentujące trójwymiarowe struktury.&lt;br /&gt;
*'''Terrain''' reprezentuje kontury, wysokość i rodzaj terenu, nad którym latasz/kołujesz.&lt;br /&gt;
&lt;br /&gt;
Aktualnym sposobem &amp;quot;instalowania&amp;quot; nowych scenerii jest włączenie funkcji [[TerraSync]], która automatycznie pobierze i zaktualizuje każde miejsce, które odwiedzisz - nawet w locie! Jeśli masz wolne łącze internetowe i/lub powolny komputer, możesz zamiast tego użyć menedżera scenerii, na przykład [[TerraMaster]]. Dodatkowo możesz także ręcznie pobrać i zainstalować nowe części scenerii, zarówno oficjalne [[World Scenery|Scenerie Świata]], jak i niestandardowe scenerie.&lt;br /&gt;
&lt;br /&gt;
Oficjalna sceneria, choć przestarzała, jest dostępna w [http://www.flightgear.org/download/scenery/ sekcji pobierania scenerii] na stronie FlightGeara, i może być zainstalowana zgodnie z [[Howto: Install scenery|instrukcją instalowania scenerii]]. Możesz uzyskać dodatkowe i bardziej aktualne obiekty scenerii, gdy staną się dostępne w [http://scenemodels.flightgear.org/ Bazie Danych Scenerii FlightGear]. '''Jest to zalecane dla użytkowników ze słabym połączeniem internetowym lub słabym komputerem!'''&lt;br /&gt;
&lt;br /&gt;
Niestandardowe scenerie są dostępne w wielu miejscach. Na przykład na {{Forum link|text=forum FlightGeara}} lub w repozytoriach. Poszukiwania w internecie aby je znaleźć. Zobacz [[Suggested custom scenery|sugerowaną listę niestandardowych scenerii]] dla kilku ostatnich wydań.&lt;br /&gt;
&lt;br /&gt;
Wersje FlightGeara 2020.3.7 LTS i późniejsze dodały eksperymentalne wdrożenie trójwymiarowych budynków, dróg i obiektów opartych na danych OpenStreetMap dla całego świata do automatycznie pobieranych danych TerraSync - zobacz [[OSM2City 1st Worldbuild|pierwsze wydanie całego świata w OSM2City]] (marzec 2021). Można też samodzielnie [[Areas populated with osm2city scenery|pobrać niektóre obszary scenerii pokryte OSM2City]].&lt;br /&gt;
&lt;br /&gt;
===Pobieranie samolotów===&lt;br /&gt;
Dodatkowe [[Pl/Samoloty|samoloty]] można pobrać i zainstalować za pomocą [[FlightGear Qt launcher|launchera]]. Alternatywnie możesz przejść do [http://www.flightgear.org/download/ strony pobierania], a następnie wybrać link do pobrania samolotu, który pasuje do Twojej wersji FlightGeara. Dodatkowo istnieje wiele [[Hangars|hangarów]] osób trzecich. Po szczegóły jak zainstalować samolot, zobacz [[Pl/Instalowanie samolotów|Instalowanie samolotów]].&lt;br /&gt;
&lt;br /&gt;
==Uruchamianie FlightGeara==&lt;br /&gt;
===Uruchamianie FlightGeara===&lt;br /&gt;
Najprostszym sposobem na uruchomienie FlightGeara jest użycie ikony na pulpicie. To uruchamia graficzny interfejs [[FlightGear Qt launcher]], gdzie można wybrać samolot, pozycję startową itp. Pamiętaj, że Qt launcher ma tylko podstawowe opcje wygodnego uruchomienia. Wiele opcji dla grafiki, scenerii, [[Weather|pogody]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ środowiska], [[Input device|urządzeń wejściowych]] itp. jest dostępnych z menu wewnątrz symulatora.&lt;br /&gt;
&lt;br /&gt;
Wielu użytkowników decyduje się jednak na uruchomienie FlightGeara bezpośrednio z linii poleceń. Nazwa pliku wykonywalnego to fgfs i może on być uruchamiany bez opcji. Jeśli nie zostanie znaleziony, to prawdopodobnie nie masz ustawionej ścieżki w [https://en.wikipedia.org/wiki/PATH_(variable) zmiennej środowiskowej PATH]. Lokalizacja zależy od Twojego systemu i wyborów dokonanych podczas kompilacji i instalacji. Istnieje lista [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]], które mogą być użyte do zmiany konfiguracji, takich jak samolot, którym chcesz lecieć. Najważniejsze z nich:&lt;br /&gt;
 fgfs --launcher             # otwiera FlightGear Qt launcher&lt;br /&gt;
 fgfs --show-aircraft        # wyświetla listę zainstalowanych samolotów&lt;br /&gt;
 fgfs --aircraft=c172p       # uruchamia FG z samolotem &amp;quot;c172p&amp;quot; (z listy)&lt;br /&gt;
&lt;br /&gt;
Qt launcher pozwala również na wpisywanie opcji wiersza poleceń, które są normalnie zmieniane z menu wewnątrz symulatora, jak również dość zaawansowanych opcji, które są dostępne tylko z wiersza poleceń (od sierpnia 2020).&lt;br /&gt;
&lt;br /&gt;
===Używanie klawiatury i/lub myszki===&lt;br /&gt;
Użytkownicy z ograniczonym dostępem do [[Joystick|joysticka]] lub innych kontrolerów, czasami używają klawiatury lub myszy do sterowania samolotem. Używanie klawiatury do latania może być trudne i zaleca się używanie myszy zamiast klawiatury, ale nawet tani joystick znacznie poprawiłby wrażenia.&lt;br /&gt;
&lt;br /&gt;
Aby podejrzeć skróty klawiaturowe, przy uruchomionym FlightGear, przejdź do menu ''Pomoc'' i kliknij na ''Podstawowe klawisze symulatora'' (dla klawiszy związanych z symulatorem) lub ''Klawisze sterowania'' (dla uniwersalnych klawiszy dla wszystkich samolotów) lub ''Dla tego samolotu'' (dla klawiszy specyficznych dla Twojego samolotu). Jeśli menu główne jest ukryte, wciśnij {{Key press|F10}}.&lt;br /&gt;
&lt;br /&gt;
Przyszedłeś z innego symulatora? Sprawdź [[Key commands compared to other simulators|skróty klawiaturowe w porównaniu z innymi symulatorami]], aby dowiedzieć się, jakie są różnice między klawiszami danego symulatora a FlightGearem. Aby użyć myszy do pilotowania samolotu, naciśnij {{Key press|Tab}} (kursor powinien zmienić się na krzyżyk) i poruszaj myszą, aby sterować samolotem. Naciśnij {{Key press|Tab}} ponownie, aby rozejrzeć się dookoła (kursor powinien pokazać dwustronną strzałkę), i naciśnij {{Key press|Tab}} jeszcze raz, aby powrócić do normalnego trybu, używanego do klikania elementów w kokpicie. W niektórych samolotach, takich jak [[A320neo]] i [[Airbus A330|A330]] to niestety nie zadziała, więc będziesz musiał użyć prawego przycisku myszy, aby się rozejrzeć, a tryb myszy jest wyłączony. Na szczęście te samoloty to samoloty pasażerskie, które są naprawdę stabilne i łatwe do pilotowania za pomocą klawiatury.&lt;br /&gt;
[[Category:Menubar|FlightGear dialogs and menu bar]]&lt;br /&gt;
&lt;br /&gt;
===Pierwszy raz w kokpicie===&lt;br /&gt;
Odnalezienie się w kokpicie może być trudne za pierwszym razem.&lt;br /&gt;
&lt;br /&gt;
Gdzie jest &amp;quot;wirtualny kokpit&amp;quot;? Nie wszystkie samoloty we FlightGear posiadają wnętrze, niektóre projekty badawcze mogą nawet nie posiadać modelu zewnętrznego. Panel 2D może być wyświetlany nad kokpitem 3D, jeśli taki istnieje. Możesz to wyłączyć poprzez ''Menu główne'' &amp;gt; ''Widok'' &amp;gt; ''Opcje widoku'' i odznaczenie opcji ''Show 2D Panel'' w sekcji ''Display Options'' lub naciskając {{Key press|Shift|P}}. W przeciwnym razie, powinieneś znajdować się w wirtualnym kokpicie, pod warunkiem, że jest wybrany Widok Kokpitu (jeśli nie, wciśnięcie {{Key press|Ctrl|V}} powinno przenieść Cię do widoku pilota).&lt;br /&gt;
&lt;br /&gt;
Możesz mieć trudności z odczytaniem niektórych wskaźników, tarcz i mierników na tablicy przyrządów. Możesz użyć trybu widoku myszy (naciskaj klawisz {{Key press|Tab}}, aż pojawi się kursor w kształcie podwójnej strzałki) do rozglądania się oraz kółka myszy do przybliżania/oddalania widoku. Ewentualnie możesz rozglądać się za pomocą joysticka i przybliżać/oddalać widok za pomocą {{Key press|X}} i {{Key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
Jednym z pierwszych kroków, które wiele osób wykonuje po wejściu do nieznanego kokpitu, jest wciśnięcie {{Key press|Ctrl|C}} aby podświetlić wszystkie klikalne elementy, czyli kontrolki przyrządów, przyciski, pokrętła itp. Wiele samolotów oferuje również specjalne menu pomocy.&lt;br /&gt;
&lt;br /&gt;
Niektóre funkcje, takie jak rozrusznik czy magneto, mogą być trudne w użyciu lub po prostu nie są klikalne, szczególnie w modelach samolotów, które są w fazie rozwoju. W większości przypadków możesz skorzystać z odpowiedników na panelu 2D lub skorzystać z klawiatury. Klawiatura zawsze działa zgodnie z przypisaniami wymienionymi w menu pomocy, ale czasami są one zmieniane przez samolot lub konfigurację. Ponownie, pamiętaj, aby sprawdzić wszystkie okna dialogowe pomocy.&lt;br /&gt;
&lt;br /&gt;
===Uruchamianie silnika===&lt;br /&gt;
Masz ochotę latać, ale silnik jest wyłączony. Cóż, włączanie silników nie zawsze jest łatwe. Niektóre samoloty mają opcję autostartu w swoim menu, ale poniżej podajemy ogólną procedurę, która powinna zadziałać w wielu przypadkach:&lt;br /&gt;
&lt;br /&gt;
Ogólnie rzecz biorąc, aby uruchomić silnik w samolocie z silnikiem tłokowym, potrzebujesz:&lt;br /&gt;
#Paliwo: niektóre samoloty rozpoczynają symulację bez paliwa. Możesz je dodać w ''Wyposażenie'' &amp;gt; ''Paliwo i ładunek''.&lt;br /&gt;
#Właściwa mieszanka paliwowa: z reguły jest ona ''bogata'', więc wciśnij czerwoną manetkę do końca lub użyj klawisza {{Key press|m}} do wzbogacenia, ({{Key press|Shift|m}} do zubożenia). &lt;br /&gt;
#Magneto ustawione na ''Both'': obróć kluczyk lub naciśnij {{Key press|&amp;amp;#125;}} ''trzy razy'', aby przejść przez ''R'', ''L'' do ''Both''.&lt;br /&gt;
#Przepustnica: niektóre silniki uruchamiają się lepiej z niewielką ilością ciągu.&lt;br /&gt;
#Uruchomić rozrusznik: kliknij i przytrzymaj pozycję ''Start'' rozrusznika (na panelu z kluczykiem) lub przytrzymaj klawisz {{Key press|s}}. Przytrzymaj rozrusznik przez odpowiedni czas, nawet 10 sekund. &lt;br /&gt;
&lt;br /&gt;
Uruchamianie wszystkich silników w samolocie wielosilnikowym jest podobne do uruchamiania pojedynczego silnika - z tą różnicą, że dla każdego silnika należy zachować taką samą sekwencję uruchamiania. FlightGear oferuje wygodny sposób, aby zrobić to dla wszystkich silników jednocześnie: Naciśnij {{Key press|~}} i cała powyższa procedura będzie działać dla wszystkich silników. Zauważ jednak, że domyślny panel 2D jest podłączony tylko do jednego silnika i sztuczka z {{Key press|~}} może nie zadziałać. Dodaj też trochę ciągu, aby upewnić się, że wszystkie silniki są włączone.&lt;br /&gt;
&lt;br /&gt;
Te instrukcje mogą nie działać dla samolotów odrzutowych, helikopterów lub innych typów samolotów ze skomplikowanymi procedurami startowymi. Sprawdź instrukcje w menu pomocy samolotu (wciśnij {{Key press|?}}) i/lub zajrzyj do [[Pl/Samoloty|artykułu o samolotach]]. Ogólnie rzecz biorąc, aby uruchomić silnik w samolocie z silnikiem odrzutowym, musisz:&lt;br /&gt;
#Ustawić ''cutoff'' na ON.&lt;br /&gt;
#Włączyć rozrusznik.&lt;br /&gt;
#Gdy silnik osiągnie około 5% N1, ustawić ''cutoff'' na OFF.&lt;br /&gt;
#Wyłączyć rozrusznik, gdy silnik osiągnie prędkość operacyjną.&lt;br /&gt;
&lt;br /&gt;
===Latanie w trybie online dla wielu graczy===&lt;br /&gt;
FlightGear ma kilka serwerów multiplayer, które pozwolą Ci latać w bardziej ożywionych przestworzach, zobacz [[Howto: Multiplayer]]. Istnieją także [[OpenRadar]] i [[ATC-pie]], samodzielne programy, które pozwolą Ci być [[Air traffic control|kontrolerem ruchu lotniczego]].&lt;br /&gt;
&lt;br /&gt;
Jest też [[MPMap|mapa multiplayer]], która pozwala zobaczyć kto jest online, a nawet jakie [[Navaids|pomoce nawigacyjne]] są w pobliżu.&lt;br /&gt;
&lt;br /&gt;
==Nauka latania==&lt;br /&gt;
===Samouczki===&lt;br /&gt;
Wiele samolotów ma swoje własne samouczki. Dzięki samouczkom możesz nauczyć się obsługiwać dany samolot, ale także nauczyć się latać. Możesz uzyskać dostęp do samouczka poprzez wybranie w menu głównym ''Pomoc'' &amp;gt; ''Samouczki''. Doskonałym miejscem do rozpoczęcia nauki jest samouczek dla samolotu Cessna 172P, powszechnie używanego w prawdziwym życiu do nauki latania samolotami stałopłatowymi.&lt;br /&gt;
&lt;br /&gt;
Jeśli po uruchomieniu samouczka, zamiast na ziemi, rozpoczynasz w wodzie, oznacza to, że w Twojej konfiguracji FlightGeara brakuje scenerii lotniska, na którym miał się rozpocząć samouczek. Aby zdobyć scenerię zobacz sekcję [[#Pobieranie scenerii]] powyżej.&lt;br /&gt;
&lt;br /&gt;
==Pierwszy lot==&lt;br /&gt;
===Realizm===&lt;br /&gt;
Jednym z najczęstszych pytań początkujących pilotów dotyczących każdego symulatora lotu, ale bardziej dotyczących FlightGeara, jest &amp;quot;Dlaczego mój samolot skręca cały czas w lewo?&amp;quot;. Chociaż może to być spowodowane podmuchami wiatru przecinającymi pas startowy, bardziej prawdopodobną przyczyną jest [[Understanding Propeller Torque and P-Factor|moment obrotowy śmigła i współczynnik P]].&lt;br /&gt;
&lt;br /&gt;
W niektórych innych symulatorach lotu, pomimo marketingowych sloganów mówiących coś przeciwnego, niektóre ustawienia są obniżone, aby ułatwić latanie samolotem. Zmniejsza to efekty takie jak powyżej. We FlightGear realizm jest zawsze podkręcony.&lt;br /&gt;
&lt;br /&gt;
Oto niektóre z punktów realizmu we FlightGear, które mogą być mylące dla początkujących pilotów:&lt;br /&gt;
*&amp;quot;Syndrom skrętu w lewo&amp;quot; z wcześniej wymienionych powodów.&lt;br /&gt;
*Błąd skrętu kompasu: Kompas, gdy jest poddany siłom lotu, ma tendencję do obracania się w przeciwnym kierunku przez krótki czas, zanim ustali się na prawidłowym kursie. Nie jest to usterka (patrz również artykuł na Wikipedii {{Wikipedia|Aircraft compass turns}}).&lt;br /&gt;
*Wskaźnik prędkości pionowej (VSI) jest również podatny na błędy.&lt;br /&gt;
*Wskaźnik sytuacji poziomej (HSI) jest napędzany przez żyroskop (dlatego nazywany jest również żyroskopowym wskaźnikiem kursu), który podlega dryfowi żyroskopowemu. Wskaźnik będzie dryfował w stosunku do aktualnego kursu i musi być okresowo (co ~15 minut) kalibrowany, aby zgadzał się z kursem kompasu magnetycznego.&lt;br /&gt;
*Nie możesz po prostu zaniechać zakrętu lub wznoszenia przez wycentrowanie wolantu. Musisz obrócić lub pchnąć wolant w drugą stronę, aby przejść do lotu równego i poziomego. Ale nawet wtedy samolot sam nie utrzyma wysokości ani kursu. Często popełnianym błędem jest próba znalezienia neutralnej pozycji drążka. O ile trymując można opuścić samolot na kilka sekund, o tyle trzeba korzystać z autopilota lub stale regulować pozycję wolantem.&lt;br /&gt;
&lt;br /&gt;
Wiele sił działa na samolot w locie, jak również na [[Avionics and instruments|awionikę i instrumenty]] używane do sterowania i nawigacji, i mogą być sprzeczne z intuicją. Piloci muszą nauczyć się rozpoznawać te zjawiska i kompensować ich skutki. ''FlightGear modeluje błędy instrumentów, które istnieją w świecie rzeczywistym.''&lt;br /&gt;
&lt;br /&gt;
===Lotniska i pomoce nawigacyjne===&lt;br /&gt;
Kiedy po raz pierwszy uruchamiasz FlightGear, czy to z wiersza poleceń, czy z graficznego interfejsu launchera, możesz się zastanawiać, jak określić, jakie lotniska są dostępne. Launcher wyświetla listę lotnisk, ale nie zobaczysz szczegółów, takich jak częstotliwości wieży lub [[ILS]]. Nie znajdziesz też mapy pokazującej [[VOR|VOR-y]] i ich częstotliwości. Co możesz zrobić? Patrz [[Getting aeronautical charts|Uzyskiwanie map lotniczych.]]&lt;br /&gt;
&lt;br /&gt;
W symulacji dostępna jest mapa, której możesz użyć w ''Menu główne'' &amp;gt; ''Wyposażenie'' &amp;gt; ''Mapa'', która pozwoli ci zobaczyć dane nawigacyjne oraz pozycje lotnisk i pomocy. Aby uzyskać więcej pomocy na temat nawigacji zobacz [[Understanding navigation|Zrozumieć nawigację]].&lt;br /&gt;
&lt;br /&gt;
===Latanie z użyciem autopilota===&lt;br /&gt;
Niektóre samoloty wymagają użycia [[Autopilot|autopilota]] dostępnego z menu ''Autopilot'', który jest domyślnym autopilotem we FlightGear. Jest to autopilot ''ogólny'' i w związku z tym wiele samolotów posiada ''własnego'' autopilota, często będącego modelem prawdziwego autopilota.&lt;br /&gt;
&lt;br /&gt;
W przypadku samolotów, które posiadają własnego autopilota, powinieneś używać kontrolek autopilota dostępnych w wirtualnym kokpicie. Oznacza to kliknięcie na tablicę przyrządów w wirtualnym kokpicie. Menu Autopilot będzie wyszarzone i niedostępne, gdy samolot posiada własnego autopilota, jak np. w Airbusach i w [[Pl/Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
Cessna 172P jest wyposażona w [[Bendix/King KAP140 Autopilot|autopilota Bendix/King KAP140]] w wirtualnym kokpicie. Nie możesz użyć okna dialogowego ''Autopilot'' z menu w tym samolocie. Musisz użyć urządzenia autopilota na panelu.&lt;br /&gt;
&lt;br /&gt;
==Społeczność FlightGear==&lt;br /&gt;
===Uzyskiwanie pomocy===&lt;br /&gt;
Ta strona jest stworzona, żeby dać użytkownikowi podstawowe rzeczy, które musi wiedzieć o używaniu FlightGeara po raz pierwszy. Poza [[Portal:User|portalem użytkownika]] w tym wiki, są inne strony, które możesz chcieć przeczytać: &lt;br /&gt;
*[[Troubleshooting problems|Rozwiązywanie problemów]], aby pomóc Ci z najczęstszymi problemami;&lt;br /&gt;
*[[Pl/FAQ|Często zadawane pytania]];&lt;br /&gt;
...i kanały komunikacyjne, które mogą być używane do uzyskania informacji lub pomocy:&lt;br /&gt;
*[[Pl/Podręcznik FlightGear|Podręcznik FlightGear]], ''lektura obowiązkowa'' dla początkujących;&lt;br /&gt;
*{{Forum link|text=Forum FlightGear}} i jego podfora;&lt;br /&gt;
*[[Discord|Serwer Discord]], najszybsza droga, żeby uzyskać pomoc;&lt;br /&gt;
*[[FlightGear IRC channel|Kanał IRC FlightGear]];&lt;br /&gt;
*[[Mailing list|Lista mailingowa]], największa szansa aby skontaktować się z deweloperami;&lt;br /&gt;
*Dokumenty dołączone do pakietu wydania.&lt;br /&gt;
&lt;br /&gt;
===Dostosowywanie FlightGear bez kompilacji kodu źródłowego===&lt;br /&gt;
[https://www.flightgear.org/download/ Nasza strona internetowa] oferuje skompilowane pliki binarne do pobrania i zainstalowania dla systemów Windows, macOS i Linux. Ponadto większość dystrybucji linuksowych dostarcza gotowe pakiety w swoich repozytoriach.&lt;br /&gt;
&lt;br /&gt;
Chociaż instalacja jest binarna, większość systemów FlightGeara jest otwarta na konfigurację poprzez pliki [[XML]] i [[NASAL scripting|skrypty NASAL]]. Masz swobodę ''i zachęcamy'' do wprowadzania zmian w modelach lotu samolotów, scenerii, teksturach, [[Shader|shaderach]] OpenGL i wszelkich innych funkcjach, które chcesz zmienić dla własnej satysfakcji lub podzielenia się nimi z innymi użytkownikami FlightGeara. Jeśli to jest to, co zamierzasz zrobić, spójrz na [[Portal:Developer|portal dla deweloperów]].&lt;br /&gt;
&lt;br /&gt;
===Jak możesz pomóc===&lt;br /&gt;
{{Main article|Volunteer}}&lt;br /&gt;
FlightGear jest projektem open source, opartym na wolontariacie. Oznacza to, że cokolwiek tu znajdziesz, jest wynikiem pasji, wolnego czasu i niczego innego. Dotyczy to symulatora, scenerii, samolotów, wiki, {{Forum link|text=forum}} i wszystkiego innego. Wolontariusze, czyli ludzie robiący przeróżne rzeczy, są podstawą tego projektu. Bez nich ten projekt nie zrobiłby ani jednego kroku naprzód. Jest więc niezwykle ważne, aby współtwórcy mieli radość z tego co robią.&lt;br /&gt;
&lt;br /&gt;
Jeśli planujesz wnieść swój wkład w ten projekt, powinieneś rzucić okiem na parę artykułów, które dadzą Ci kilka wskazówek:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process|Howto:Zrozumieć proces rozwoju FlightGeara]]&lt;br /&gt;
*[[Implementing new features for FlightGear|Wdrażanie nowych funkcji dla FlightGeara]]&lt;br /&gt;
*[[How the FlightGear project works|Jak działa projekt FlightGear]]&lt;br /&gt;
&lt;br /&gt;
Nigdy nie jest dość ludzi, którzy wnoszą swój wkład, a dziedzin, w których ich pomoc byłaby doceniana jest wiele:&lt;br /&gt;
;Testowanie:&lt;br /&gt;
*[[Building FlightGear|Zbuduj]] najnowszy kod Git lub pobierz migawki z [[FlightGear Build Server|Serwera Budowania FlightGeara]].&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues Zgłaszaj błędy].&lt;br /&gt;
*Uruchamiaj FlightGear przez valgrind, aby wyśledzić wycieki pamięci.&lt;br /&gt;
&lt;br /&gt;
;Wsparcie&lt;br /&gt;
*Pomagaj nowym użytkownikom w ściąganiu, kompilowaniu, instalowaniu i uruchamianiu FlightGeara (na {{Forum link|text=forum}} lub na [[Discord|Discordzie]], IRC).&lt;br /&gt;
*Dostarczaj pomysły i sugestie, zobacz: [[Feature Requests / Proposals / Ideas|Prośby o funkcje, propozycje, pomysły]].&lt;br /&gt;
*Pomóż uporządkować wiki.&lt;br /&gt;
*Pomóż dostarczyć nową zawartość dla brakujących stron wiki.&lt;br /&gt;
&lt;br /&gt;
;Rozwój&lt;br /&gt;
*Programowanie w C/C++:&lt;br /&gt;
**Czyszczenie kodu źródłowego (w zasadzie pomoc w procesie migracji zarządzania pamięcią, opartym głównie na inteligentnych wskaźnikach przy użyciu SGSharedPtr).&lt;br /&gt;
**Poprawianie [[Bugs|błędów]] lub dodawanie nowych funkcji.&lt;br /&gt;
**Zaangażuj się w któryś z innych projektów związanych z FlightGearem.&lt;br /&gt;
*Rozwój samolotów (modelowanie 3D, tekstury, model lotu, skrypty).&lt;br /&gt;
*Rozwój scenerii (teren, model, pogoda).&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[en:New to FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;br /&gt;
[[zh:FlightGear新手]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FAQ&amp;diff=144259</id>
		<title>Pl/FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FAQ&amp;diff=144259"/>
		<updated>2026-04-30T17:19:29Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Ochrona treści */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dziękujemy za zainteresowanie [[FlightGear]]! Ten ''FAQ'' zawiera listę najczęściej zadawanych pytań. Jeśli nie możesz znaleźć odpowiedzi na swój problem, proszę utworzyć temat na {{forum link|text=naszym forum}}.&lt;br /&gt;
&lt;br /&gt;
== Dystrybucja ==&lt;br /&gt;
&lt;br /&gt;
=== Skąd wziąć FlightGear? ===&lt;br /&gt;
Oficjalną stroną pobierania jest: {{project infrastructure|website|link=no|urn=download/}}. Znajdziesz tam wersje binarne dla Windows, macOS oraz Linux (AppImage). W większości dystrybucji Linuxa, FlightGear można pobrać bezpośrednio z repozytoriów danej dystrybucji. Szukaj w &amp;quot;Centrum/Menedżer oprogramowania&amp;quot; Twojej dystrybucji.&lt;br /&gt;
&lt;br /&gt;
=== Jak zainstalować FlightGeara na Linuksie? ===&lt;br /&gt;
Wiele dystrybucji zawiera FlightGear w swoich repozytoriach. Ponadto w {{project infrastructure|website|urn=download/|text=Centrum Pobierania}} znajdziesz też wersję skompilowaną do AppImage, którą uruchomisz na niemal każdej współczesnej dystrybucji. Jeśli nie możesz znaleźć wersji pakietowej dla siebie, rozważ pobranie i [[Building FlightGear - Linux|kompilację z kodów źródłowych]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę znaleźć najnowszy kod źródłowy? ===&lt;br /&gt;
Najnowszy kod źródłowy jest dostępny dla każdego za pośrednictwem naszego [[FlightGear Git|repozytorium Git]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę latać i skąd wziąć scenerie? ===&lt;br /&gt;
Latać można wszędzie, po całym świecie. Scenerie można pobrać na wiele sposobów. Obecnie najlepszą opcją jest automatyczne pobieranie scenerii w zależności od tego gdzie się znajdujesz. Służy do tego program TerraSync. Aby go włączyć wystarczy w Launcherze wejść do &amp;quot;Ustawienia&amp;quot; -&amp;gt; &amp;quot;Pobieranie&amp;quot; i tam zaznaczyć opcję &amp;quot;Automatycznie pobieraj scenerię&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Można także pobrać większe rejony świata ręcznie, ze strony {{project infrastructure|website|urn=download/scenery|text=Pobieranie Scenerii}}&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę zdobyć dodatkowe samoloty? ===&lt;br /&gt;
Najnowsze, oficjalne samoloty można pobrać i zainstalować jednym kliknięciem w zakładce samolotów w Launcherze (patrz [[FlightGear Qt launcher|FlightGear Qt Launcher]]). &lt;br /&gt;
&lt;br /&gt;
Możesz także zajrzeć na oficjalną stronę {{project infrastructure|website|urn=download/download-aircraft/|text=Pobierania Samolotów}}. &lt;br /&gt;
&lt;br /&gt;
Inne samoloty w fazie rozwoju możesz znaleźć w oficjalnym repozytorium samolotów [[FGAddon]], a inne w hangarach FlightGear osób trzecich (patrz także [[Pl/Instalowanie_samolotów|Jak zainstalować samoloty]]).&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego samoloty na FlightGear.org są nieaktualne? ===&lt;br /&gt;
Samoloty z oficjalnej {{project infrastructure|website|urn=download/|text=strony pobierania}} są aktualizowane tylko w momencie wydania nowej wersji FlightGeara. Dzieje się tak, ponieważ samoloty, które są obecnie w fazie rozwoju, są zwykle opracowywane dla rozwojowych/nieopublikowanych wersji FlightGeara. Te wersje rozwojowe mają wiele funkcji, które nie są obsługiwane przez starszą, stabilną wersję. Gdybyśmy częściej aktualizowali pobierane samoloty, większość samolotów nie działałaby w stabilnej wersji FlightGeara.&lt;br /&gt;
&lt;br /&gt;
=== Jak aktualne są dane we FlightGear w porównaniu z rzeczywistością? ===&lt;br /&gt;
Korzystamy z tych samych danych nawigacyjnych i baz lotnisk co X-Plane. Aktualne bazy danych można znaleźć w folderach [[$FG ROOT]]/Navaids/ and [[$FG ROOT]]/Airports/.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego nie pobieracie za to pieniędzy? ===&lt;br /&gt;
FlightGear można pobrać bezpłatnie z wielu miejsc, w tym ze strony internetowej FlightGear, ale można go również kupić na płycie CD/DVD. Chociaż oferujemy tę usługę (zobacz oficjalną stronę internetową), zachęcamy inne grupy do redystrybucji dla swoich użytkowników, zwłaszcza w ramach dystrybucji systemu operacyjnego, która sprawia, że instalacja jest jeszcze szybsza i łatwiejsza dla nowych użytkowników.&lt;br /&gt;
&lt;br /&gt;
Czasami możesz znaleźć ofertę kupna FlightGeara na portalach aukcyjnych lub komercyjnych stronach internetowych pod inną nazwą. Można to zrobić całkiem legalnie, o ile warunki licencji są przestrzegane i może być warte kosztów, jeśli uwzględnione zostaną niektóre funkcje o wartości dodanej, takie jak dodatkowa sceneria, samolot lub wsparcie posprzedażowe. Niestety, większość przypadków obserwowanych do tej pory wydaje się być po prostu próbą zarobienia pieniędzy na sprzedaży czegoś, co jest bezpłatne i nie zapewnia prawdziwej wartości dodanej.&lt;br /&gt;
&lt;br /&gt;
=== Jak mogę zacząć korzystać z FlightGear? ===&lt;br /&gt;
FlightGear można pobrać z {{project infrastructure|website|urn=download/|text=Download Central}}. Po uruchomieniu Launchera, możesz doinstalować tam samoloty z oficjalnego hangaru. Włączając automatyczne pobieranie scenerii, FlightGear sam zadba o scenerię. Uważaj na wymagania systemowe! Sprawdź też [[Pl/Nowy we FlightGear|Nowy we FlightGear]].&lt;br /&gt;
&lt;br /&gt;
== Kompilacja ==&lt;br /&gt;
=== Jak skompilować FlightGear z kodów źródłowych? ===&lt;br /&gt;
Zobacz [[Building Flightgear|Budowanie FlightGear]]. Istnieją wyjaśnienia dla kompilacji pod Window, Linuks, a nawet skrypty do automatycznego pobrania i kompilowania całości.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego FlightGear się nie kompiluje? ===&lt;br /&gt;
&lt;br /&gt;
To zależy. Po pierwsze upewnij się że używasz odpowiednich wersji FlightGear, [[SimGear]], plib, zlib. Jeśli którykolwiek z pakietów nie pasuje (wersją) do innych, kompilacja może się nie udać.&lt;br /&gt;
&lt;br /&gt;
Upewnij się też czy masz implementację OpenGL ze wsparciem glut'a z odpowiednimi plikami nagłówkowymi. Użytkownicy Linuksa posiadający karty nVidia powinni się sprawdzić, czy mają najnowsze sterowniki. Inni posiadacze Linuks powinni mieć bibliotekę Mesa3d (http://mesa3d.org/). Sprawdź też czy masz dobrze zainstalowany i skonfigurowany serwer X-ów.&lt;br /&gt;
&lt;br /&gt;
Jeśli dalej masz problemy, zapytaj na {{forum link|text=FlightGear forum}}, na [[IRC]] lub zapisz się na naszą [[mailing list|listę mailingową]] FlightGear-Users i daj nam znać, jaki masz problem.&lt;br /&gt;
&lt;br /&gt;
=== Czym jest SimGear i dlaczego go potrzebuję? ===&lt;br /&gt;
[[SimGear]] jest biblioteką kodu pomocniczego. SimGear jest potrzebny tylko wtedy, gdy planujesz skompilować FlightGear - nie jest potrzebny do uruchamiania prekompilowanych binariów. Więcej informacji znajdziesz na stronie http://www.simgear.org/. Uwaga: Podczas kompilacji FlightGeara bardzo ważne jest posiadanie pasującej wersji SimGeara.&lt;br /&gt;
&lt;br /&gt;
== Konfiguracja i uruchomienie ==&lt;br /&gt;
&lt;br /&gt;
=== Jak uruchomić FlightGear? ===&lt;br /&gt;
Najprostszym sposobem jest użycie [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz go uruchomić z terminala używając [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zainstalować nowe scenerie? ===&lt;br /&gt;
&lt;br /&gt;
Jeśli naprawdę nie chcesz/nie możesz używać [[Terrasync]], pliki archiwum scenerii (np. w100n30.tar.gz) powinny zostać rozpakowane do katalogu Scenery/Terrain w Twoim [[$FG_ROOT]]. Więcej na [[Pl/Instalowanie_scenerii|Instalowanie scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Jak skonfigurować mój joystick? ===&lt;br /&gt;
&lt;br /&gt;
FlightGear obsługuje wiele joysticków/wolantów od razu po podłączeniu. Jeśli jednak masz problemy, zobacz [[Input device|Urządzenie wejściowe]].&lt;br /&gt;
&lt;br /&gt;
=== W jakim formacie powinien być mój osobisty plik .fgfsrc? ===&lt;br /&gt;
&lt;br /&gt;
Twój plik .fgfsrc powinien po prostu być listą [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]], z każdą opcją w osobnej linii. Plik ten nie jest plikiem XML.&lt;br /&gt;
&lt;br /&gt;
Jeśli wolałbyś korzystać z plików konfiguracyjnych XML mógłbyś dodać coś takiego do pliku .fgfsrc lub do wiersza poleceń:&lt;br /&gt;
&lt;br /&gt;
 --config=/ścieżka/do/pliku.xml&lt;br /&gt;
&lt;br /&gt;
Prawie każda opcja odpowiada właściwości, więc możesz wybrać metodę która Ci najlepiej odpowiada.&lt;br /&gt;
&lt;br /&gt;
=== Jak dostać się do opcji, pomocy itp.? ===&lt;br /&gt;
Prawdopodobnie nie widzisz głównego menu. Aby je wyświetlić naciśnij {{Key press|F10}}.&lt;br /&gt;
&lt;br /&gt;
== Latanie ==&lt;br /&gt;
&lt;br /&gt;
=== Jak uruchomić silnik/i? ===&lt;br /&gt;
Samoloty różnią się w swoich procedurach startowych. Niektóre mogą mieć sekwencję automatycznego startu lub instrukcje w menu pomocy samolotu (naciśnij klawisz {{key press|?}}) i/lub na stronie Wiki o [[Aircraft|statkach powietrznych]]. Zapoznaj się z [[Pl/Podręcznik_FlightGear|Podręcznikiem FlightGear]] lub zobacz [[Pl/Nowy_w_FlightGear#Uruchamianie_silnika|szybki przewodnik]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie jest przesuwana mapa? ===&lt;br /&gt;
W symulatorze można wejść w menu &amp;quot;Wyposażenie &amp;gt; [[Map|Mapa]]&amp;quot;, ale nie jest to mapa lotnicza. Popularna ruchoma mapa jest dostępne w ramach osobnego projektu o nazwie Atlas. Jest również [[MPmap]] - mapa online dla multiplayer.&lt;br /&gt;
&lt;br /&gt;
Jeśli lubisz alternatywę dla Atlasa z uaktualnioną grafiką i mapami dostarczanymi przez projekt OpenStreetMap, to sprawdź [[Phi#Map|Phi]] lub [[JMapView]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę się nauczyć latania według wskazań przyrządów i nawigacji? ===&lt;br /&gt;
Jest dobry artykuł [[Understanding navigation]] oraz jest to bardzo dobrze wyjaśnione w [[Pl/Podręcznik_FlightGear|Podręczniku FlightGear]]. Inne zasoby to:&lt;br /&gt;
* [http://www.av8n.com/how/ See How It Flies] - bardzo dobra książka autorstwa Johna S. Denkera, dostępna online.&lt;br /&gt;
&lt;br /&gt;
=== Jaka jest różnica między lotką a sterem kierunku? ===&lt;br /&gt;
W tej samej książce jest trochę informacji o lotkach i sterze kierunku.&lt;br /&gt;
&lt;br /&gt;
=== Czy FlightGear wspiera multiplayer? ===&lt;br /&gt;
Oczywiście. Zobacz [[Howto: Multiplayer]]. Zarówno wersje Windowsowe jak i Unixowe obsługują tryb wieloosobowy na serwerach FlightGear. Również komunikacja głosowa jest obsługiwana dzięki [[FGCom]].&lt;br /&gt;
&lt;br /&gt;
Mapa pokazująca samoloty graczy online w czasie rzeczywistym jest dostępna jako [[MPmap]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie są najlepsze miejsca do latania w FlightGear? ===&lt;br /&gt;
Sceneria FlightGear obejmuje cały świat, ale dzięki społeczności użytkowników FlightGear, niektóre lotniska i obszary są bardziej szczegółowe niż inne: &lt;br /&gt;
* W okolicach Paryża we Francji jest wiele wysokiej jakości modeli scenerii.&lt;br /&gt;
* EHAM Amsterdam Schiphol, EGK Londyn Gatwick i LFPG Paryż Charles de Gaulle są jednymi z najwyższej jakości lotnisk.&lt;br /&gt;
* LOWI Innsbruck jest zarówno rozwinięty w scenerii jak i na lotnisku.&lt;br /&gt;
* TNCM St. Maarten jest popularnym celem podróży, a okoliczne wyspy (Anguilla, St. Eustatius, Saba, St. Barthélemy, St. Kitts i Nevis) są dobrze wymodelowane.&lt;br /&gt;
&lt;br /&gt;
Ponadto zobacz [[Suggested Flights|sugerowane loty]], [[Suggested Airports|sugerowane lotniska]] i [[Suggested custom scenery|sugerowane scenerie niestandardowe]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę znaleźć informacje o lotniskach i mapy lotnicze online? ===&lt;br /&gt;
Lotniska:&lt;br /&gt;
* [http://www.airnav.com/airports/ AirNav.com]&lt;br /&gt;
&lt;br /&gt;
Mapy:&lt;br /&gt;
* [http://skyvector.com/ SkyVector.com]&lt;br /&gt;
&lt;br /&gt;
Zobacz także [[Getting aeronautical charts|pozyskanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
=== Czy we FlightGear jest możliwość prowadzenia działań militarnych np. prowadzenia walk powietrznych lub zrzucania bomb? ===&lt;br /&gt;
Tak. Sprawdź dodatek [[Bombable]] i {{forum link|t=5742|title=Bombable}}. Istnieją również scenariusze bombardowania dla [[A-10]] i innych samolotów z uzbrojeniem, jak [[North American OV-10A Bronco]], [[General Dynamics F-16]] i [[F-117 Nighthawk]].&lt;br /&gt;
&lt;br /&gt;
=== Problemy z lataniem ===&lt;br /&gt;
&lt;br /&gt;
==== Dlaczego moje powierzchnie sterowe wracają do określonej pozycji? ====&lt;br /&gt;
Jest kilka możliwości, które mogą do tego doprowadzać:&lt;br /&gt;
* Jeśli [[autopilot]] twojego samolotu jest włączony, przejmie on (część) twoich elementów sterujących. Wyłącz autopilota, aby odzyskać kontrolę.&lt;br /&gt;
* Niektóre laptopy mają wbudowany czujnik grawitacji, który może zostać wykryty jako [[joystick]]. Zobacz jak to rozwiązać na [[Troubleshooting input devices#Controls returning to a particular position|Rozwiązywanie problemów z urządzeniami wejściowymi]].&lt;br /&gt;
&lt;br /&gt;
==== Dlaczego mój kokpit znika, gdy się rozglądam? ====&lt;br /&gt;
Prawdopodobnie używasz wersji samolotu z panelem 2D. Upewnij się, że wybrałeś ten z kokpitem 3D. Większość samolotów ma go teraz!&lt;br /&gt;
&lt;br /&gt;
==== Wokół lata mnóstwo innych samolotów ====&lt;br /&gt;
FlightGear posiada tak zwany system sztucznego ruchu lotniczego (AI Traffic). System ten generuje sterowane przez komputer samoloty na podstawie prawdziwych planów lotu, aby świat we FlightGear wyglądał bardziej żywo. Aby wyłączyć sztuczny ruch idź do menu &amp;quot;SI&amp;quot; &amp;gt; &amp;quot;Ruch lotniczy oraz scenariusze&amp;quot; i odznacz opcję &amp;quot;Enable AI traffic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli natomiast nie widzisz żadnych samolotów poza swoim, rozważ [[AI Traffic|przyczynienie się do dodania ruchu]] w swoim ulubionym miejscu!&lt;br /&gt;
&lt;br /&gt;
==== Samolot ciągle skręca w lewo, nie mogę lecieć prosto! ====&lt;br /&gt;
Tak, FlightGear jest prawdziwym symulatorem lotu i modeluje te efekty. Dokładnie tak zachowują się prawdziwe samoloty śmigłowe. Zobacz [[Understanding Propeller Torque and P-Factor|zrozumienie momentu obrotowego śmigła i współczynnika P]]. &lt;br /&gt;
&lt;br /&gt;
Sprawdź też rozkład obciążenia samolotu. Spróbuj dodać drugiego pilota o wadze 180 funtów i zobacz, czy efekt zostanie zniwelowany.&lt;br /&gt;
&lt;br /&gt;
== Wkład własny ==&lt;br /&gt;
&lt;br /&gt;
=== W jakim języku napisany jest FlightGear? ===&lt;br /&gt;
Głównie C++ z pewną ilością wspierającego kodu C, który jest głównie zawarty w SimGear. Więcej szczegółów na temat użytych języków:&lt;br /&gt;
* [https://www.openhub.net/p/flightgear/analyses/latest/languages_summary Moduł FlightGear]&lt;br /&gt;
* [https://www.openhub.net/p/simgear/analyses/latest/languages_summary Moduł SimGear]&lt;br /&gt;
* [https://www.openhub.net/p/flightgeardata/analyses/latest/languages_summary Dane FlightGeara] (samoloty, dźwięki itp.)&lt;br /&gt;
&lt;br /&gt;
Ponieważ wydajesz się być zainteresowany rozwojem rdzenia, powinieneś naprawdę sprawdzić [[Howto:Start core development]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zaprojektować model dynamiki lotu do nowego samolotu? ===&lt;br /&gt;
&lt;br /&gt;
FlightGear obsługuje różne [[flight dynamics model|modele dynamiki lotu]] (FDM), ale tylko dwa z nich są powszechnie używane:&lt;br /&gt;
* [[JSBSim]]: patrz http://jsbsim.sf.net/.&lt;br /&gt;
* [[YASim]]: jeśli chcesz pracować z prostszym FDM, spróbuj swoich sił w YASim. Przewodnik dotyczący tworzenia samolotów YASim znajduje się w podstawowym pakiecie FlightGear w pliku &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Docs/README.yasim&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobacz [[Portal:Developer/Aircraft|Portal rozwoju samolotów]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zaprojektować albo zmienić panel? ===&lt;br /&gt;
Zobacz plik &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Docs/README.xmlpanel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Skąd mogę się nauczyć programowania 3D i zaangażować się? ===&lt;br /&gt;
Jeśli chciałbyś stworzyć trójwymiarowy kokpit samolotu do FlightGear lub stworzyć budynki, zewnętrzne modele samolotów itp., Twoja pomoc jest bardzo potrzebna. Postaraj się nie przesadzać ze złożonością siatki. Najczęściej używanymi narzędziami są tutaj [[Blender]], [[AC3D]], [[Gimp]].&lt;br /&gt;
&lt;br /&gt;
Jeśli natomiast naprawdę chcesz wejść w programowanie w C++, będziesz musiał kupić sobie dobrą książkę o [[OpenGL]]. Jednak, FlightGear korzysta z biblioteki wysokiego poziomu [[OSG]], wydajnego zestawu narzędzi do grafiki 3D. Aby rozpocząć pracę z kodowaniem 3D w C++, możesz przejrzeć dokumentację OSG i nauczyć się tylko tyle OpenGL, ile będziesz potrzebować.&lt;br /&gt;
&lt;br /&gt;
=== Jak mogę dodać lotnisko? ===&lt;br /&gt;
&lt;br /&gt;
Proces ten obejmuje stworzenie układu lotniska w [[WorldEditor]], przetestowanie go (możesz chcieć wygenerować część scenerii, ale nie jest to obowiązkowe), a następnie, jeśli twoje źródła danych są zgodne z GPL, użycie [[WorldEditor]] do przesłania go do bramki. Lotnisko będzie dostępne w następnej pełnej przebudowie scenerii, chyba że chcesz wygenerować własną scenerię. Więcej na [[Howto:Make an airport]].&lt;br /&gt;
&lt;br /&gt;
=== Czy mogę stworzyć własną scenerię? ===&lt;br /&gt;
&lt;br /&gt;
Tak, choć może to być trudne zadanie. Generowaniem scenerii dla FlightGeara zajmuje się siostrzany projekt [[TerraGear]]. Dobrą wiadomością jest to, że gdy już wszystko ustawisz, jest to dość łatwe (choć może być czasochłonne), a przede wszystkim, że możesz to łatwo udostępnić.&lt;br /&gt;
&lt;br /&gt;
== Problemy ==&lt;br /&gt;
&lt;br /&gt;
=== Błędy sieciowe lub DNS podczas pobierania terenu ===&lt;br /&gt;
Jeśli wystąpią błędy sieciowe/DNS, wpisz &amp;lt;code&amp;gt;--prop:/sim/terrasync/http-server=twój-serwer&amp;lt;/code&amp;gt; w dodatkowych ustawieniach programu uruchamiającego (np. &amp;lt;code&amp;gt;--prop:/sim/terrasync/http-server=http://flightgear.sourceforge.net/scenery&amp;lt;/code&amp;gt;) lub kliknij przycisk „Pokaż więcej” po prawej stronie i wybierz serwer DNS.&lt;br /&gt;
&lt;br /&gt;
Patrz post na forum: [https://forum.flightgear.org/viewtopic.php?p=438783 Network errors occurred]&lt;br /&gt;
&lt;br /&gt;
=== X-y nie działają / są uszkodzone / złe / nie uruchamiają się ===&lt;br /&gt;
FlightGear jest bardzo skomplikowanym programem. Jeśli potrzebujesz pomocy w ogólnym użytkowaniu symulatora, znajdziesz ją na [[Portal:User|portalu Użytkownika]] oraz na {{forum link|text=forum FlightGeara}}.&lt;br /&gt;
&lt;br /&gt;
Jeśli Twoim problemem jest zawieszanie się oprogramowania, otrzymujesz błędy itp., rozważ zastosowanie się do wskazówek zawartych na stronie [[Troubleshooting problems|rozwiązywania problemów]].&lt;br /&gt;
&lt;br /&gt;
Niektóre z najczęściej występujących problemów są jednak wymienione poniżej. Jeśli nie możesz rozwiązać problemu samodzielnie i potrzebujesz pomocy kogoś, proszę pamiętaj, że jesteśmy ''wszyscy'' tutaj dla zabawy, deweloperzy również, i że każda pomoc ''jest'' aktem hojności. Więc postaraj się być miły, nawet jeśli problem cię frustruje.&lt;br /&gt;
&lt;br /&gt;
=== Co się stało z panelem, klawiaturą itp.? ===&lt;br /&gt;
Problemem jest prawie na pewno to, że Twój pakiet bazowy (FGData) nie jest zsynchronizowany z FlightGearem. Wiele konfigurowalnych części FlightGeara jest zdefiniowanych w plikach [[XML]] zawartych w pakiecie podstawowym.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego FlightGear działa tak wolno? ===&lt;br /&gt;
Jeśli wydaje Ci się, że FlightGear działa zbyt wolno, sprawdź w [[Howto: Improve Framerates]], czy możesz pokombinować z ustawieniami grafiki.&lt;br /&gt;
&lt;br /&gt;
Jeśli wszystko działa skrajnie wolno (np. ~1 klatka na sekundę), być może sprzętowa akceleracja 3D nie jest aktywna. Upewnij się, że masz zainstalowane biblioteki OpenGL i [[Graphics drivers configuration|poprawnie skonfigurowane]] oraz upewnij się, że masz najnowsze sterowniki do swojej karty graficznej. Bądź również świadomy, że niektóre karty graficzne [[Problematic Video Cards|nie są zbyt dobrze wspierane]].&lt;br /&gt;
&lt;br /&gt;
=== Jak sprawdzić liczbę klatek na sekundę? ===&lt;br /&gt;
&lt;br /&gt;
W symulatorze idź do menu &amp;quot;Widok&amp;quot; &amp;gt; &amp;quot;Opcje widoku&amp;quot; i zaznacz tam opcję &amp;quot;Show frame rate&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Jak zmienić ustawienia kokpitu 2D? ===&lt;br /&gt;
&lt;br /&gt;
Aby pokazać/ukryć panel 2D użyj kombinacji klawiszy {{Key press|Shift|P}}. Aby wyświetlić/ukryć HUD, naciskaj klawisz {{Key press|Shift|H}}. Możesz też włączyć alternatywny HUD przez naciśnięcie {{Key press|Shift|I}} (naciśnij {{Key press|I}} aby wrócić do domyślnego). Klawiszem {{Key press|Shift|H}} dostosujesz jasność HUD-a.&lt;br /&gt;
&lt;br /&gt;
=== Utknąłem do góry nogami po rozbiciu się? ===&lt;br /&gt;
&lt;br /&gt;
Szybką odpowiedzią jest zresetowanie symulatora, poprzez menu &amp;quot;Plik&amp;quot; &amp;gt; &amp;quot;Zresetuj&amp;quot;. To ustawi twój samolot z powrotem w pozycji startowej.&lt;br /&gt;
&lt;br /&gt;
Alternatywnie naciśnij {{Key press|Ctrl|U}} (w domyślnej konfiguracji), aby podnieść samolot o 1000 stóp.&lt;br /&gt;
&lt;br /&gt;
Dla upartych: sztuczka do nauki. Aby wrócić do normalnej (nie odwróconej) pozycji, wznieś się o 500 stóp i obróć się przy użyciu lotek o 180*. Pamiętaj, sterowanie działa odwrotnie gdy jesteś do góry nogami i utrzymuj prędkość!&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego najnowsze wersje niektórych samolotów nie działają w mojej (starszej) wersji FlightGeara? ===&lt;br /&gt;
Często rozwój nowych samolotów nadąża za rozwojem kodu FlightGeara. Nowe lub nowo zmodyfikowane samoloty mogą korzystać z plików (takich jak nowe pliki instrumentów) lub funkcji dostępnych tylko w nowszych wersjach FlightGeara. Jeśli utknąłeś w starszej wersji FlightGeara, możesz spróbować pobrać wcześniejszą wersję samolotu z odpowiedniego [[FlightGear_hangars#Official_hangars|oficjalnego hangaru]] FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Kiedy uruchamiam FlightGear widzę błąd wspominający o &amp;quot;SQLite&amp;quot;. Co mam zrobić? ===&lt;br /&gt;
&lt;br /&gt;
Od wersji FlightGear v2.10 (wydanej w lutym 2013) wprowadzono [[navdata cache|pamięć podręczną navdata]], aby poprawić czas uruchamiania FlightGeara. Ta pamięć podręczna to baza danych SQLite, która czasami jest trochę niestabilna. Jeśli baza danych jest uszkodzona, FlightGear nie będzie mógł się uruchomić.&lt;br /&gt;
&lt;br /&gt;
Aby to naprawić musisz po prostu usunąć plik &amp;lt;code&amp;gt;[[$FG_HOME]]/navdata.cache&amp;lt;/code&amp;gt;. Przy pierwszym uruchomieniu FlightGeara, po usunięciu pliku, pamięć podręczna navdata zostanie odbudowana. Ponieważ proces ten jest czasochłonny, uruchomienie FlightGeara zajmie więcej czasu.&lt;br /&gt;
&lt;br /&gt;
Niektórzy uciekają się do usunięcia całego katalogu &amp;lt;code&amp;gt;$FG_HOME&amp;lt;/code&amp;gt; lub nawet ponownej instalacji FlightGeara. Jednak żadne z nich nie jest potrzebne i może spowodować utratę wszelkich skonfigurowanych niestandardowych preferencji.&lt;br /&gt;
&lt;br /&gt;
Kolejnym wskaźnikiem problemu związanego z SQLite jest komunikat o błędzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
   Sqlite error:attempt to write a readonly database (8) while running:&lt;br /&gt;
      INSERT OR REPLACE INTO stat_cache (path, stamp) VALUES (?,?)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W takim przypadku, wcześniej uruchomiona instancja FlightGeara może nadal działać i blokować plik navdata.cache. Sprawdź, czy działa inny proces fgfs i zakończ go.&lt;br /&gt;
&lt;br /&gt;
=== Mój samolot ma szare okna? ===&lt;br /&gt;
Problem nieprzejrzystych szarych okien, prze które nie można nic zobaczyć, jest najczęściej spowodowany niezgodnością wersji programu FlightGear i samolotu. Lub może to być spowodowane efektem okna, który nie jest zgodny z systemami renderowania [[Project Rembrandt|Rembrandt]] lub [[ALS]]. Przyczyną techniczną jest niezgodność renderera i zadeklarowanego efektu dla okna. Niektóre rozwiązania obejmują:&lt;br /&gt;
&lt;br /&gt;
* Jeśli używasz stabilnej wersji FlightGeara, pobierz samolot z [[FlightGear_hangars#Official_hangars|oficjalnego hangaru]] pasującego do Twojej wersji FlightGeara.&lt;br /&gt;
* Jeśli używasz najnowszej wersji z [[FlightGear Build Server|builda nocnego]] lub [[Building FlightGear|samodzielnie skompilowanej wersji FlightGeara]] lub chcesz używać najnowocześniejszego samolotu, zobacz [[FGAddon#Obtaining aircraft|FGAddon - pozyskiwanie samolotu]].&lt;br /&gt;
* Jeśli korzystasz z samolotu z jednego z [[FlightGear_hangars#Unofficial_sites|nieoficjalnych hangarów]], najlepiej skontaktuj się z oryginalnym autorem samolotu lub osobą odpowiedzialną za ten hangar.&lt;br /&gt;
* Jeśli używasz [[Project Rembrandt|Rembrandta]], spróbuj wyłączyć ten system renderowania. Samoloty, które używają &amp;lt;code&amp;gt;model-default.eff&amp;lt;/code&amp;gt; dla okien (prostym kosztem nierobienia niczego) zamiast &amp;lt;code&amp;gt;model-transparent.eff&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;model-combined-transparent .eff&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;glass.eff&amp;lt;/code&amp;gt; (które instruują Rembrandta, aby nie używał odroczonego renderowania dla szyb) będą miały szare okna podczas używania Rembrandta.&lt;br /&gt;
&lt;br /&gt;
=== Mój ekran staje się całkowicie czerwony zaraz po uruchomieniu FlightGear ===&lt;br /&gt;
Czerwony ekran to wizualizacja efektu &amp;quot;redout&amp;quot; (napływ krwi do głowy pilota z powodu zbyt dużych przeciążeń). Jeśli pojawia się zaraz po uruchomieniu FlightGeara, może to być spowodowane problemem z ładowaniem scenerii. FlightGear ładuje scenerię w locie, a jeśli scenerii nie można załadować, np. ze względu na problemy z siecią, może nie być podłoża, na którym można zlokalizować statek powietrzny. W rezultacie samolot spada przez nieistniejący grunt, zaczynając się przewracać doprowadzając do nadmiernych przeciążeń. To z kolei powoduje efekt czerwonej planszy. Aby zweryfikować problem, należy rozpocząć lot w KSFO, którego sceneria jest już zawarta w pakiecie podstawowym.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Z kim się kontaktować w sprawie tego FAQ? ===&lt;br /&gt;
Dodaj komentarz na temat FAQ [[Talk:Frequently asked questions|na tej stronie]].&lt;br /&gt;
&lt;br /&gt;
=== Jak stary jest ten dokument? ===&lt;br /&gt;
Sprawdź jego &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:{{PAGENAME}}|action=history}} historię]&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Jaką inną dokumentację powinienem przeczytać? ===&lt;br /&gt;
* [[Pl/Podręcznik_FlightGear|Podręcznik FlightGear]]&lt;br /&gt;
* [[Pl/Nowy_w_FlightGear|Nowy we FlightGear]]&lt;br /&gt;
* Zobacz także katalog FlightGear/docs-mini/ w dystrybucji źródłowej, aby znaleźć różne inne przydatne dokumenty.&lt;br /&gt;
&lt;br /&gt;
== Wkład własny ==&lt;br /&gt;
&lt;br /&gt;
=== Ochrona treści ===&lt;br /&gt;
{{See also|FlightGear Plugins}} DRM&lt;br /&gt;
{{Cleanup}}&lt;br /&gt;
&lt;br /&gt;
Co jakiś czas pojawia się pytanie, czy dostarczanie do do FlightGeara zamkniętego kodu źródłowego wtyczki (dokładniej wtyczki czytnika plików OSG) jest legalne. Jedyną potrzebą trzymania kodu w pobliżu jest zapobieganie inżynierii wstecznej.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/27996073/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Content protection for modders? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Paul Guhl &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 25th, 2011 &lt;br /&gt;
  |added  =  Aug 25th, 2011 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Soitanen (Aug 28th, 2014). {{forum link|title=Re: Encrypted aircraft dynamics|p=217378}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34559749/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] External FDM to protect propriety data in a GPL&lt;br /&gt;
	eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Alan Teeder &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 21st, 2015 &lt;br /&gt;
  |added  =  Oct 21st, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear w obecnej postaci jest efektem pracy wielu ludzi, którzy dobrowolnie pracują nad wspólnym wysiłkiem stworzenia otwartej i rozszerzalnej platformy symulatora lotu. Sam Twój pomysł wprowadzenia DRM jest wbrew wszelkim zasadom open source.&lt;br /&gt;
&lt;br /&gt;
Możesz swobodnie stworzyć samolot dla FlightGeara na licencji własnościowej - to są dane z perspektywy symulatora i nie powoduję aktywacji licencji. Możesz to sprzedawać, nie pozwalając na ponowną dystrybucję kodu źródłowego. Musisz trzymać się z dala od kilku rzeczy (nie możesz używać ogólnych instrumentów, bibliotek Nasal,...) ale to powinno być do zrobienia. Możesz pobierać opłaty licencyjne za taki samolot i nikt nie może go redystrybuować.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dane są analizowane z XML-a do dynamicznych tabel wyszukiwania (IE. STL). Jedynymi zasobami używanymi poza tym, co jest potrzebne do stworzenia funkcji FDM, jest narzut związany z wyciąganiem danych z pliku XML do pamięci. To musiałoby się zdarzyć bez względu na to, w jakiej formie były dane.&lt;br /&gt;
Chociaż mogą istnieć lepsze sposoby przechowywania danych niż XML-e, jeśli nie przejmujesz się interakcją człowieka z danymi. Myślę, że uczynienie danych czytelnymi/edytowalnymi dla człowieka jest głównym celem używania XML-i. Może być zbyt gadatliwy, ale działa i istnieją standardowe biblioteki do odczytu/parsowania plików XML, dzięki czemu używanie ich do wprowadzania danych jest dość proste. Jest to korzystne zarówno dla FlightGeara, jak i JSBSim pod względem ograniczenia złożoności obsługi danych konfiguracyjnych. Ponadto istnieje ograniczona liczba standardowych formatów dla tego typu rzeczy, takich jak JSON, a wszystkie te, które są czytelne/edytowalne przez człowieka, mają wiele takich samych problemów jak XML.&lt;br /&gt;
W pełni funkcjonalne FDM są złożone, a zrozumienie XML-a używanego do konfiguracji złożonego FDM jest bardzo drobnym problemem, a każdy, kto faktycznie rozumie w pełni funkcjonalny FDM, będzie miał bardzo niewiele problemów z częścią XML.&amp;lt;ref&amp;gt;hvengel (Aug 28th, 2014). {{forum link|title=Re: Encrypted aircraft dynamics|p=217408}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear sam w sobie jest OpenSource, więc niezależnie od tego, w jakim systemie DRM chcemy zakodować dane, każdy może go usunąć (i jest to całkiem legalne). Nie trzeba się zastanawiać, aby wygenerować wersję FlightGear bez ochrony praw autorskich i rozpowszechnić ją, na której Twoja treść działa bez klucza (lub czegokolwiek innego). Biorąc pod uwagę, że ludziom zwykle udaje się złamać schematy DRM przy braku otwartego kodu źródłowego, próba zrobienia tego z kodem źródłowym otwartym dla każdego wydaje się po prostu stratą czasu. Po drugie, jakikolwiek format pliku odczyta OSG, zanim dotrze do renderera, musi być tablicą wierzchołków. Renderer tego potrzebuje, na etapie GLSL nie ma deszyfrowania. Więc są szanse, że skoro działamy na *Open*GL, to znowu każdy, kto naprawdę chce, może wypisać niezaszyfrowany format.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponieważ FlightGear jest open source, niezwykle łatwo jest dodać kod, aby uzyskać dostęp do grafu sceny 3D i wyodrębnić pełny model samolotu (z wyłączeniem skryptów, chociaż można je odtworzyć). Informacje po prostu tam siedzą, w pełni widoczne i gotowe do pobrania z gałęzi OSG jak duża soczysta brzoskwinia. Prawdopodobnie mógłbym napisać ten kod w pół dnia, ale konwersja do formatu AC3D, tekstur PNG itp. w celu odtworzenia nowej kopii samolotu zajęłaby trochę więcej czasu. Gdyby FlightGear miał zamknięty kod źródłowy, napisanie kodu ekstraktora OSG byłoby znacznie trudniejsze, ale mimo to nadal wykonalne.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076297/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Edward d'Auvergne &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Właśnie z tego powodu mamy wsparcie dla katalogów i zewnętrznych hangarów. Oczywiście chcemy zachęcać do tworzenia samolotów na licencji GPL, ale nie każdy twórca samolotów chce lub może udostępniać swoje prace na licencji GPL. FlightGear szanuje i wspiera tę opcję.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076199/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] botom line: if i don't my aircraft to be&lt;br /&gt;
 subject to GPL FGAddon clauses &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Stuart Buchanan &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z pewnością można uruchomić model FDM z zewnątrz i użyć jednej z wielu opcji sieciowych I/O we FlightGear, aby przesyłać dane tam i z powrotem. W przeszłości zrobiono to w kilku projektach badawczych, aby wykorzystać FlightGear jako narzędzie do wizualizacji. Co za tym idzie, możesz zrobić to samo w przypadku skryptów - uruchomić skrypty na zewnątrz i wchodzić w interakcje z FlightGearem za pośrednictwem jednego z tych protokołów.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076187/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Stuart Buchanan &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli faktycznie spróbujesz pobierać opłatę 100$ za samolot dla FlighGear, nie znajdziesz zbyt wielu klientów, ponieważ FG jest popularny głównie w społeczności OpenSource. Jeśli sprawisz, że będzie to zbyt kłopotliwe za pomocą DRM-ów, być może ktoś spróbuje to obejść dla zasady (ludzie robią to dla sportu) - nie jest łatwo sprawić by wieloplatformowy DRM nie był irytujący dla użytkowników.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Należy pamiętać, że bez względu na format źródłowy (dll, zaszyfrowany + podpisany, binarny itp.), ostatecznie siatka modelu, tekstury i struktura logiczna są wczytywane do wewnętrznych struktur klas OSG. Po zakończeniu tego procesu, aby model mógł zostać wyrenderowany na ekranie, osoba może wywołać odpowiednią funkcję write*File() w celu zapisania poddrzewa modelu w dowolnym obsługiwanym formacie. Jedyne, co jest potrzebne, to dostęp do kodu źródłowego FlightGeara, aby wstawić wywołanie funkcji w strategicznym miejscu. W ostatecznym rozrachunku nie możesz całkowicie chronić swojej treści, jeśli nie masz pełnej kontroli nad sytuacją na poziomie kodu źródłowego aplikacji. I jest to klasyczna strategia hakowania ochrony przed kopiowaniem, wstawiaj magię do kodu po uwierzytelnieniu/załadowaniu/dekodowaniu formatu dystrybucji, a następnie zapisz go w &amp;quot;odszyfrowanym&amp;quot; formacie. Ludzie robią to cały czas, nawet z zastrzeżonym kodem. Wartość celu zwykle określa, jak ciężko są skłonni pracować, aby go ukraść.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074534/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.38 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodanie wsparcia dla DRM do FlightGear nie nastąpi - skrypty Nasal są domyślnie dostarczane w formacie zwykłego tekstu (podobnie jak JavaScript), natomiast zaciemnianie jest oczywiście możliwe, jednak nie ma to żadnego sensu w kontekście FlightGear jako projektu otwarto źródłowego.&lt;br /&gt;
&lt;br /&gt;
Ponadto skrypty mogą być łatwo udostępniane i uruchamiane przez użytkowników, po prostu je wymieniając lub kopiując.&lt;br /&gt;
&lt;br /&gt;
Nawet gdybyś zrzucił pośredni kod bajtowy Nasal do pliku obiektowego i wykonał to za pomocą maszyny wirtualnej Nasal, nie byłoby możliwości wyegzekwowania DRM.&lt;br /&gt;
&lt;br /&gt;
Oczywiście, ponieważ FlightGear jest open source, możesz po prostu dodać obsługę DSO/wtyczek do rozwidlenia FlightGear i oprzeć całą swoją pracę na tym rozwidleniu - z drugiej strony, twoje modyfikacje nadal będą musiały być udostępniane.&lt;br /&gt;
&lt;br /&gt;
Istnieje sposób na tworzenie legalnych dodatków z zamkniętym kodem źródłowym: możesz napisać cały &amp;quot;tajny&amp;quot; kod C++ jako zewnętrzną aplikację i pozwolić jej komunikować się z FlightGearem za pośrednictwem gniazd sieciowych. To powinno działać w miarę dobrze. Ale nie oczekuję, że zdobędziesz wielu klientów. Przede wszystkim, przynajmniej w Linuksie, nikt nie chce uruchamiać binarnych blobów, które mogłyby z łatwością wymazać katalog domowy podczas zabawy we FlightGear. A potem dzieje się tyle darmowych samolotów, z dużym rozmachem, że prawdopodobnie zawsze będziesz w tyle. A ci programiści mają bliskie powiązania z (lub są) programistami FlightGeara, więc mają tę zaletę, że mogą w dowolnym momencie zmienić kod FlightGeara według własnych upodobań. Mogą zmieniać interfejs do woli, a ty musisz nadrobić zaległości i zająć się reklamacjami klientów, którzy nagle siadają na zepsutym binarnym blobie, który nie działa z ostatnią wersją FlightGeara. I wreszcie, to podejście do gniazd działa tylko za pośrednictwem systemu właściwości i jest otwarte do wglądu dla każdego (oprócz niedawno dodanej półtajnej właściwości wektora śmieci).&lt;br /&gt;
&lt;br /&gt;
FlightGear nie ma możliwości ładowania samolotów z bibliotek współdzielonych. Możesz rozpowszechniać swój samolot na licencji zastrzeżonej, tak jak robi to Vitos, ale nie jako biblioteka współdzielona. Zmiana we FlightGear, aby mógł ładować samoloty z bibliotek współdzielonych, wymagałaby dużo pracy. Kto miałby to robić i dlaczego ktokolwiek miałby to robić, skoro mógłby poświęcić swój czas na ulepszanie wolnego oprogramowania? I dlaczego główni twórcy FlightGear mieliby akceptować taki wkład?&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073736/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared library, and what  legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Ludovic Brenta &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Realistycznie patrząc, jeśli chcesz sprzedać komercyjny samolot, twoją bazą klientów będzie Flight Sim X, X-Plane, Prepar3D. Po prostu nie uzyskasz żadnej przyczepności w ekosystemie FlightGear. Nie jest on do tego stworzony.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074166/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; geneb &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poza tym obsługa języka skryptowego OSG (lua) nie może uzyskać dostępu do wszystkich wewnętrznych funkcji Nasal, po prostu dlatego, że we FlightGear nie zaimplementowano kodu łączącego. Więc nie ma żadnych właściwości dla ciebie i żadnego dostępu do wewnętrznego wywołania funkcji, które zapewnia Nasal.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074133/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Erik Hofman &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posiadasz prawa autorskie do swojej pracy, nawet jeśli wydasz ją na licencji GPL i możesz dalej rozwijać swoją pracę i wydać bardziej kompletną wersję na licencji komercyjnej, jeśli tylko chcesz (jest to wariant podwójnej licencji). Jedynym sposobem, aby nie zachować praw autorskich do tego, co robisz, jest przeniesienie ich na kogoś innego lub zrzeczenie się ich poprzez udostępnienie swojej pracy jako domeny publicznej. Jeśli stworzysz model 3D dla samolotu FG i nadasz mu licencję GPL, nikt nie zabroni Ci adaptacji i sprzedaży go dla X-Plane. W rzeczywistości możesz go sprzedawać również dla FG (ale inni mogą go redystrybuować, jak im się podoba, gdy go kupią, ponieważ jest to GPL, więc może to nie być zbyt opłacalny model biznesowy).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073832/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Czy inne symulatory oferują szyfrowanie lub ochronę zawartości? Na przykład udało mi się zlokalizować i przetestować wtyczkę blendera, która może otworzyć wiele modeli samolotów MSFS. A jak z X-Plane?  Minął *długi*, *długi* czas, odkąd majstrowałem przy ich pakiecie, ale w tamtym czasie zwracałem uwagę, że wszystkie ich formaty 3D były otwarte i dobrze zdefiniowane. Często komercyjne symulatory przechowują rzeczy we własnych formatach binarnych, ale w większości przypadków nie są one zaszyfrowane, a użytkownicy końcowi dość szybko je odszyfrowują -- więc mogą edytować lub tworzyć nową zawartość w tym samym formacie. Nie uważałbym formatu binarnego za schemat ochrony treści, zwłaszcza w projekcie typu open source, w którym źródło do ładowania i przechowywania formatu binarnego jest łatwo dostępne.  Rozumiem pragnienie twórców treści, aby nie dać się „oszukać”. Ale zrozum też, że jednym z głównych powodów, dla których FlightGear może odnieść sukces, jest to, że cały kod źródłowy i zawartość są otwarte. Gdybyśmy nie otworzyli wszystkiego, nie otrzymalibyśmy prawie takiej samej liczby datków wolontariuszy, a wysokiej jakości wolontariat jest kluczowym powodem, dla którego FlightGear odniósł taki sukces. Gdybyśmy byli zamkniętą organizacją komercyjną, kto chciałby się włączyć i pomóc komuś innemu zarabiać pieniądze? Ale gdy wszystko jest otwarte, wiesz, że wszyscy inni mogą cieszyć się takim samym wkładem, tak samo jak Ty cieszysz się wkładem wszystkich innych. Istnieje kilka oszustów, którzy próbują zarobić na pracy innych ludzi i chętnie kłamią i wprowadzają w błąd, aby wyłudzić jak najwięcej pieniędzy od niczego niepodejrzewających użytkowników końcowych. Prawda jest taka, że ​​ci ludzie zawsze istnieli i zawsze będą istnieć. Są niezwykle skrupulatni i uporczywi w kopiowaniu rzeczy, posuwają się nawet do łamania schematów ochrony przed kopiowaniem, przeprowadzania inżynierii wstecznej projektów sprzętu, kopiowania dokładnego wyglądu produktów (nawet łącznie z logo). To nie jest problem, który jest unikalny dla projektu FlightGear -- i jest to coś, z czym wciąż byśmy się borykali, bez względu na to, jak ciężko pracowaliśmy nad stworzeniem schematów ochrony przed kopiowaniem. Jeśli zaprojektowałeś format zawartości binarnej, ktoś dokona inżynierii wstecznej. Jeśli zaprojektujesz schemat szyfrowania, ktoś po prostu zmodyfikuje kod symulatora, aby zrzucić odszyfrowaną wersję po załadowaniu jej do pamięci przez zastrzeżoną wtyczkę deszyfrującą (o ile nie złamie schematu szyfrowania lub nie ukradnie kluczy szyfrowania). We wszystkich tych przypadkach zawartość nadal można łatwo kopiować, replikować, sprzedawać itp. Najlepszy schemat, jaki widziałem, to taki, który ma klucz blokady węzła, który będzie działał tylko na jednym komputerze (klucz przypisany do adresu mac lub identyfikatora procesora). Oznacza to jednak bardziej skomplikowaną dwuetapową instalację, w której użytkownik musi wrócić do Ciebie po zainstalowaniu produktu, zgłosić swój unikalny identyfikator, uzyskać klucz, a następnie zainstalować ten klucz, zanim będzie mógł działać. Problem z tym wszystkim polega na tym, że w projekcie open source ktoś może po prostu skompilować nową wersję symulatora, która pomija sprawdzanie klucza lub akceptuje trywialny klucz lub dowolny klucz. Zastanawiam się tutaj nad różnymi możliwościami, ale mam nadzieję, że widzisz, że to, co na pierwszy rzut oka wydaje się prostą prośbą, w rzeczywistości jest dość złożone i w dalszym ciągu powoduje różnego rodzaju problemy (zarówno pod względem technicznym, jak i ze wsparciem użytkowników). Ostatecznie złoczyńcy i tak zazwyczaj znajdują obejścia i nie są zbytnio spowalniani. Kiedy rolnicy uprawiają rośliny, muszą znosić chwasty. Możemy spróbować rozsądnych rzeczy, aby zminimalizować chwasty, ale jeśli jesteś zbyt agresywny w zabijaniu chwastów i nie tolerujesz ani jednego, najprawdopodobniej zabijesz również większość swoich upraw. Dlatego uważam, że jest to coś, z czym musimy się po prostu pogodzić. Możemy spróbować podjąć rozsądne kroki, aby zminimalizować problem, ale nie możemy wyeliminować wszystkich złych osób bez szkody dla wszystkich dobrych rzeczy w naszym projekcie.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/27998023/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Content protection for modders? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 25th, 2011 &lt;br /&gt;
  |added  =  Aug 25th, 2011 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kiedy już rozpowszechniłeś kod źródłowy na licencji GPL, wyraźnie zadeklarowałeś, że każdy ma prawo do redystrybucji i modyfikacji - o ile nie rozpowszechnia go na innej licencji. Ale ty, jako właściciel praw autorskich, możesz zmienić licencję dla nowej wersji kodu, której jeszcze nie rozpowszechniałeś na licencji GPL - o ile modyfikacje te nie zostały dokonane przez innych, tj. Ty, jako jedyny posiadacz praw autorskich, możesz również rozpowszechniać go na kilku licencjach jednocześnie, np. GPL i niektórych licencjach własnościowych (czyniąc go wartym pieniędzy, które ludzie mogą za niego zapłacić, dzięki szybszym poprawkom błędów, dystrybuowanym tylko do płacących klientów itp.).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073990/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Jens Thoms Toerring &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną rzeczą do rozważenia jest to, że dystrybucja Twojego statku powietrznego jako .dll lub .so nie ukryła by ani nie zaciemniła by Twojego kodu i tekstur po załadowaniu ich do struktur symulatora w celu renderowania. Reszta FlightGeara jest open source, więc wstawienie wywołania funkcji OSG, aby zapisać samolot (modele i tekstury) w innym popularnym formacie 3D, nie wymagałoby wiele wysiłku.  Spowodowałoby to pewne straty w zakresie organizacji plików źródłowych, ale mimo to dałoby miejsce startu komuś, kto zamierza skopiować lub zmodyfikować pracę. Cała konfiguracja XML także powinna być dostępna za darmo w drzewie właściwości. Licencjonowanie Nasal (jak sądzę) jest napisane w sposób, który utrudnia dystrybucję zastrzeżonego kodu Nasal. Zatem stworzenie samolotu dla FlightGear zabezpieczonego przed modyfikacjami, nie mówiąc już o kopiowaniu, wiązałoby się z pewnymi naprawdę poważnymi wyzwaniami.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073896/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kluczem do projektu open source nie jest to, czy możesz wygrać spór prawny, czy nie. Chodzi raczej o to, aby przede wszystkim unikać wszelkich sporów prawnych i to za wszelką cenę. To znaczy trzymać się z dala od sądu. Aby bezpiecznie użyć czegoś takiego w projekcie open source, sugerowałbym coś w następujący sposób: &lt;br /&gt;
* Upublicznienie swojego produktu pochodnego w całości (ale bez licencji, mówiąc, że jest to materiał chroniony prawem autorskim), &lt;br /&gt;
* Zwrócenie się do właścicieli oryginalnego produktu i przekazanie im linku do produktu pochodnego, &lt;br /&gt;
* Poproszenie ich o publiczne oświadczenie, że produkt pochodny może być licencjonowany przy użyciu licencji „GPLv2 lub nowszej wersji”, &lt;br /&gt;
* Pamiętaj, aby poprosić ich o zidentyfikowanie publicznego produktu pochodnego jako łącza i zidentyfikowanie wszystkich jego części (aby uniknąć późniejszego stwierdzenia, że ​​​​umieściłeś fragmenty chronionego materiału).&lt;br /&gt;
&lt;br /&gt;
Kopię zapasową każdego oświadczenia złożonego w sieci można znaleźć w archiwum internetowym (http://web.archive.org/). Aby uprościć ten proces, możesz sporządzić część oświadczenia opisującą w całości produkt pochodny, ze wszystkimi szczegółami. Dzięki temu nie będzie już żadnych odcieni szarości! Jeśli chętnie to zrobią, to z prawnego punktu widzenia nie będzie problemu z ich użyciem (tj. szara sytuacja zmieniła się w białą). Jeśli nie są zadowoleni z Twojej propozycji, pewnego dnia mogą odwrócić się i pozwać (tj. szara sytuacja zmieniła się w czystą czerń).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34561220/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] External FDM to protect propriety data in a&lt;br /&gt;
 GPL eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Edward d'Auvergne &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 22nd, 2015 &lt;br /&gt;
  |added  =  Oct 22nd, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Świat open source zależy od warunków licencji i praw autorskich oraz współpracy i zaufania w celu ochrony naszej pracy. Znosimy niewielki podzbiór ludzi, którzy chcą nadużywać tych warunków i mamy nadzieję, że presja większej grupy utrzyma złych aktorów w ryzach. Czasami istnieje środek prawny, czasami trudno jest coś z tym zrobić, gdy problemy wykraczają poza granice kraju (lub gdy ktoś po prostu chce złamać zasady dla własnych korzyści). Mam jednak wrażenie, że na dłuższą metę większość ludzi jest uczciwa i chce postępować właściwie, a mała grupa, która naprawdę istnieje, aby powodować problemy lub po prostu służyć sobie kosztem innych, nigdy nie przetrwa tak długo, jak większa grupa ludzi o dobrych intencjach. Ostatecznie musisz samodzielnie określić, ile wysiłku włożyłeś w model, ile pieniędzy możesz zarobić na jego sprzedaży, w porównaniu z ryzykiem, że ktoś go sam skopiuje i rozpowszechni, w porównaniu z kosztami prawnymi, aby spróbować ich powstrzymać.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074534/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.38 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obejścia DRM ===&lt;br /&gt;
&lt;br /&gt;
W jednym z moich poprzednich projektów miałem do czynienia z autorskim modelem dynamiki lotu. Początkowo korzystałem z interfejsu Ethernet, aby mógł działać jako zewnętrzna samodzielna aplikacja. Potem przełączyłem się na dwukierunkowy układ potoków uniksowych, więc mogłem mieć ściślejszą synchronizację z kolejnością wykonania, ale nadal zewnętrzny program był całkowicie niezależny i samodzielny. Chciałbym, aby wszystko było darmowe i otwarte, ale w tym przypadku nie miałem wyboru i było to coś zakupionego od firmy zewnętrznej na surowych warunkach. Czułem, że dwa niezależne, samowystarczalne programy (które mogą ze sobą rozmawiać i wymieniać informacje) stworzyły wystarczającą separację licencji, aby honorować warunki licencji GPL FlightGeara.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34559783/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] External FDM to protect propriety data in a&lt;br /&gt;
 GPL eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 21st, 2015 &lt;br /&gt;
  |added  =  Oct 21st, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na ile to jest warte, FDM „ExternalPipe” został skonfigurowany tak, aby obejmował większość obszarów, których dotknąłeś. Prawdopodobnie nie jest to dokładnie to, czego chcesz, ale oto trochę mojej logiki w tym, jak/dlaczego skonfigurowałem to tak, jak to zrobiłem: &lt;br /&gt;
* Korzystanie z interfejsu sieciowego dodaje trochę indeterminizmu. Czasami pakiety sieciowe są opóźniane lub układają się w stos w zależności od tego, co dzieje się z maszyną, więc nie ma gwarantowanej relacji między symulatorem a dynamiką lotu. &lt;br /&gt;
* Zwykle interfejs sieciowy jest dobry, ale zaobserwowałem czasy, kiedy pakiety docierały tam, gdzie powinny, z dodatkowymi opóźnieniami.  &lt;br /&gt;
* Alternatywnie ustawiam parę „nazwanych potoków”. Potoki są konstrukcją uniksową, dla programu wyglądają jak plik, ale to, co do nich zapisujesz, jest gromadzone i przechowywane do odczytania przez inną aplikację. Niestety nie są one obsługiwane w systemie Windows. Potoki są jednokierunkowe, stąd potrzeba dwóch do komunikacji dwukierunkowej. Potok jest naprawdę prosty: otwierasz go jak każdy inny plik, a jeden proces zapisuje w nim; odczytuje z niego inny proces. W międzyczasie system operacyjny może buforować pewną ilość informacji, dopóki proces odczytujący ich nie złapie. Możesz użyć blokowania odczytów (ostrożnie z tym), aby mieć pewność, że FlightGear i zewnętrzny FDM działają dokładnie tak samo. &lt;br /&gt;
* Potoki oznaczają, że oba procesy będą działać na tej samej maszynie, interfejs sieciowy pozwoliłby procesom działać na oddzielnych maszynach. &lt;br /&gt;
* Interfejs ExternalPipe obsługuje elastyczny interfejs właściwości, więc zewnętrzny proces FDM może wysyłać dowolne pary nazwa/wartość, które chce wysłać, a interfejs sumiennie skopiuje je do drzewa właściwości FlightGeara. Strona FDM może również wysłać listę nazw właściwości, które chciałaby otrzymać w odpowiedzi, a interfejs będzie sumiennie przesyłał je potokiem wychodzącym w każdej klatce. To był miły dodatek, a nazwane potoki mają dużą przepustowość, aby zrobić to czystym tekstem, nawet z wieloma dodatkowymi wartościami właściwości. &lt;br /&gt;
&lt;br /&gt;
Historia: Użyłem tego jako części projektu, który zrobiłem z symulatorem lotu ATC. Mieli własne, zastrzeżone aplikacje do dynamiki lotu, które modelowały konkretny statek powietrzny w samym kodzie. Modele te posiadały całą niezbędną dokumentację źródłową i dane z testów w locie, aby spełnić wymagania testowe certyfikacyjne FAA dotyczące ostatecznego symulatora. Ponadto ten zewnętrzny kod modelował wiele systemów samolotu dla jednej z ich wysokiej klasy symulacji. Wymagało to elastyczności w zakresie wysyłanych tam i z powrotem wartości i umożliwiło mi sterowanie niektórymi wskaźnikami przyrządów bezpośrednio z kodu zewnętrznego.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/31900851/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Feeding FlightGear data through the Protocol&lt;br /&gt;
	Pipe &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 29th, 2014 &lt;br /&gt;
  |added  =  Jan 29th, 2014 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[de:FAQ]]&lt;br /&gt;
[[en:Frequently asked questions]]&lt;br /&gt;
[[es:Preguntas frecuentes]]&lt;br /&gt;
[[fr:Foire aux questions]]&lt;br /&gt;
[[it:Domande frequenti]]&lt;br /&gt;
[[ja:FAQ]]&lt;br /&gt;
[[nl:veel gestelde vragen]]&lt;br /&gt;
[[pt:FAQ]]&lt;br /&gt;
[[pt-br:Perguntas_frequentes]]&lt;br /&gt;
[[sr:FAQ]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FAQ&amp;diff=144258</id>
		<title>Pl/FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FAQ&amp;diff=144258"/>
		<updated>2026-04-30T17:14:09Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Błędy sieciowe lub DNS podczas pobierania terenu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dziękujemy za zainteresowanie [[FlightGear]]! Ten ''FAQ'' zawiera listę najczęściej zadawanych pytań. Jeśli nie możesz znaleźć odpowiedzi na swój problem, proszę utworzyć temat na {{forum link|text=naszym forum}}.&lt;br /&gt;
&lt;br /&gt;
== Dystrybucja ==&lt;br /&gt;
&lt;br /&gt;
=== Skąd wziąć FlightGear? ===&lt;br /&gt;
Oficjalną stroną pobierania jest: {{project infrastructure|website|link=no|urn=download/}}. Znajdziesz tam wersje binarne dla Windows, macOS oraz Linux (AppImage). W większości dystrybucji Linuxa, FlightGear można pobrać bezpośrednio z repozytoriów danej dystrybucji. Szukaj w &amp;quot;Centrum/Menedżer oprogramowania&amp;quot; Twojej dystrybucji.&lt;br /&gt;
&lt;br /&gt;
=== Jak zainstalować FlightGeara na Linuksie? ===&lt;br /&gt;
Wiele dystrybucji zawiera FlightGear w swoich repozytoriach. Ponadto w {{project infrastructure|website|urn=download/|text=Centrum Pobierania}} znajdziesz też wersję skompilowaną do AppImage, którą uruchomisz na niemal każdej współczesnej dystrybucji. Jeśli nie możesz znaleźć wersji pakietowej dla siebie, rozważ pobranie i [[Building FlightGear - Linux|kompilację z kodów źródłowych]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę znaleźć najnowszy kod źródłowy? ===&lt;br /&gt;
Najnowszy kod źródłowy jest dostępny dla każdego za pośrednictwem naszego [[FlightGear Git|repozytorium Git]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę latać i skąd wziąć scenerie? ===&lt;br /&gt;
Latać można wszędzie, po całym świecie. Scenerie można pobrać na wiele sposobów. Obecnie najlepszą opcją jest automatyczne pobieranie scenerii w zależności od tego gdzie się znajdujesz. Służy do tego program TerraSync. Aby go włączyć wystarczy w Launcherze wejść do &amp;quot;Ustawienia&amp;quot; -&amp;gt; &amp;quot;Pobieranie&amp;quot; i tam zaznaczyć opcję &amp;quot;Automatycznie pobieraj scenerię&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Można także pobrać większe rejony świata ręcznie, ze strony {{project infrastructure|website|urn=download/scenery|text=Pobieranie Scenerii}}&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę zdobyć dodatkowe samoloty? ===&lt;br /&gt;
Najnowsze, oficjalne samoloty można pobrać i zainstalować jednym kliknięciem w zakładce samolotów w Launcherze (patrz [[FlightGear Qt launcher|FlightGear Qt Launcher]]). &lt;br /&gt;
&lt;br /&gt;
Możesz także zajrzeć na oficjalną stronę {{project infrastructure|website|urn=download/download-aircraft/|text=Pobierania Samolotów}}. &lt;br /&gt;
&lt;br /&gt;
Inne samoloty w fazie rozwoju możesz znaleźć w oficjalnym repozytorium samolotów [[FGAddon]], a inne w hangarach FlightGear osób trzecich (patrz także [[Pl/Instalowanie_samolotów|Jak zainstalować samoloty]]).&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego samoloty na FlightGear.org są nieaktualne? ===&lt;br /&gt;
Samoloty z oficjalnej {{project infrastructure|website|urn=download/|text=strony pobierania}} są aktualizowane tylko w momencie wydania nowej wersji FlightGeara. Dzieje się tak, ponieważ samoloty, które są obecnie w fazie rozwoju, są zwykle opracowywane dla rozwojowych/nieopublikowanych wersji FlightGeara. Te wersje rozwojowe mają wiele funkcji, które nie są obsługiwane przez starszą, stabilną wersję. Gdybyśmy częściej aktualizowali pobierane samoloty, większość samolotów nie działałaby w stabilnej wersji FlightGeara.&lt;br /&gt;
&lt;br /&gt;
=== Jak aktualne są dane we FlightGear w porównaniu z rzeczywistością? ===&lt;br /&gt;
Korzystamy z tych samych danych nawigacyjnych i baz lotnisk co X-Plane. Aktualne bazy danych można znaleźć w folderach [[$FG ROOT]]/Navaids/ and [[$FG ROOT]]/Airports/.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego nie pobieracie za to pieniędzy? ===&lt;br /&gt;
FlightGear można pobrać bezpłatnie z wielu miejsc, w tym ze strony internetowej FlightGear, ale można go również kupić na płycie CD/DVD. Chociaż oferujemy tę usługę (zobacz oficjalną stronę internetową), zachęcamy inne grupy do redystrybucji dla swoich użytkowników, zwłaszcza w ramach dystrybucji systemu operacyjnego, która sprawia, że instalacja jest jeszcze szybsza i łatwiejsza dla nowych użytkowników.&lt;br /&gt;
&lt;br /&gt;
Czasami możesz znaleźć ofertę kupna FlightGeara na portalach aukcyjnych lub komercyjnych stronach internetowych pod inną nazwą. Można to zrobić całkiem legalnie, o ile warunki licencji są przestrzegane i może być warte kosztów, jeśli uwzględnione zostaną niektóre funkcje o wartości dodanej, takie jak dodatkowa sceneria, samolot lub wsparcie posprzedażowe. Niestety, większość przypadków obserwowanych do tej pory wydaje się być po prostu próbą zarobienia pieniędzy na sprzedaży czegoś, co jest bezpłatne i nie zapewnia prawdziwej wartości dodanej.&lt;br /&gt;
&lt;br /&gt;
=== Jak mogę zacząć korzystać z FlightGear? ===&lt;br /&gt;
FlightGear można pobrać z {{project infrastructure|website|urn=download/|text=Download Central}}. Po uruchomieniu Launchera, możesz doinstalować tam samoloty z oficjalnego hangaru. Włączając automatyczne pobieranie scenerii, FlightGear sam zadba o scenerię. Uważaj na wymagania systemowe! Sprawdź też [[Pl/Nowy we FlightGear|Nowy we FlightGear]].&lt;br /&gt;
&lt;br /&gt;
== Kompilacja ==&lt;br /&gt;
=== Jak skompilować FlightGear z kodów źródłowych? ===&lt;br /&gt;
Zobacz [[Building Flightgear|Budowanie FlightGear]]. Istnieją wyjaśnienia dla kompilacji pod Window, Linuks, a nawet skrypty do automatycznego pobrania i kompilowania całości.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego FlightGear się nie kompiluje? ===&lt;br /&gt;
&lt;br /&gt;
To zależy. Po pierwsze upewnij się że używasz odpowiednich wersji FlightGear, [[SimGear]], plib, zlib. Jeśli którykolwiek z pakietów nie pasuje (wersją) do innych, kompilacja może się nie udać.&lt;br /&gt;
&lt;br /&gt;
Upewnij się też czy masz implementację OpenGL ze wsparciem glut'a z odpowiednimi plikami nagłówkowymi. Użytkownicy Linuksa posiadający karty nVidia powinni się sprawdzić, czy mają najnowsze sterowniki. Inni posiadacze Linuks powinni mieć bibliotekę Mesa3d (http://mesa3d.org/). Sprawdź też czy masz dobrze zainstalowany i skonfigurowany serwer X-ów.&lt;br /&gt;
&lt;br /&gt;
Jeśli dalej masz problemy, zapytaj na {{forum link|text=FlightGear forum}}, na [[IRC]] lub zapisz się na naszą [[mailing list|listę mailingową]] FlightGear-Users i daj nam znać, jaki masz problem.&lt;br /&gt;
&lt;br /&gt;
=== Czym jest SimGear i dlaczego go potrzebuję? ===&lt;br /&gt;
[[SimGear]] jest biblioteką kodu pomocniczego. SimGear jest potrzebny tylko wtedy, gdy planujesz skompilować FlightGear - nie jest potrzebny do uruchamiania prekompilowanych binariów. Więcej informacji znajdziesz na stronie http://www.simgear.org/. Uwaga: Podczas kompilacji FlightGeara bardzo ważne jest posiadanie pasującej wersji SimGeara.&lt;br /&gt;
&lt;br /&gt;
== Konfiguracja i uruchomienie ==&lt;br /&gt;
&lt;br /&gt;
=== Jak uruchomić FlightGear? ===&lt;br /&gt;
Najprostszym sposobem jest użycie [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz go uruchomić z terminala używając [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zainstalować nowe scenerie? ===&lt;br /&gt;
&lt;br /&gt;
Jeśli naprawdę nie chcesz/nie możesz używać [[Terrasync]], pliki archiwum scenerii (np. w100n30.tar.gz) powinny zostać rozpakowane do katalogu Scenery/Terrain w Twoim [[$FG_ROOT]]. Więcej na [[Pl/Instalowanie_scenerii|Instalowanie scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Jak skonfigurować mój joystick? ===&lt;br /&gt;
&lt;br /&gt;
FlightGear obsługuje wiele joysticków/wolantów od razu po podłączeniu. Jeśli jednak masz problemy, zobacz [[Input device|Urządzenie wejściowe]].&lt;br /&gt;
&lt;br /&gt;
=== W jakim formacie powinien być mój osobisty plik .fgfsrc? ===&lt;br /&gt;
&lt;br /&gt;
Twój plik .fgfsrc powinien po prostu być listą [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]], z każdą opcją w osobnej linii. Plik ten nie jest plikiem XML.&lt;br /&gt;
&lt;br /&gt;
Jeśli wolałbyś korzystać z plików konfiguracyjnych XML mógłbyś dodać coś takiego do pliku .fgfsrc lub do wiersza poleceń:&lt;br /&gt;
&lt;br /&gt;
 --config=/ścieżka/do/pliku.xml&lt;br /&gt;
&lt;br /&gt;
Prawie każda opcja odpowiada właściwości, więc możesz wybrać metodę która Ci najlepiej odpowiada.&lt;br /&gt;
&lt;br /&gt;
=== Jak dostać się do opcji, pomocy itp.? ===&lt;br /&gt;
Prawdopodobnie nie widzisz głównego menu. Aby je wyświetlić naciśnij {{Key press|F10}}.&lt;br /&gt;
&lt;br /&gt;
== Latanie ==&lt;br /&gt;
&lt;br /&gt;
=== Jak uruchomić silnik/i? ===&lt;br /&gt;
Samoloty różnią się w swoich procedurach startowych. Niektóre mogą mieć sekwencję automatycznego startu lub instrukcje w menu pomocy samolotu (naciśnij klawisz {{key press|?}}) i/lub na stronie Wiki o [[Aircraft|statkach powietrznych]]. Zapoznaj się z [[Pl/Podręcznik_FlightGear|Podręcznikiem FlightGear]] lub zobacz [[Pl/Nowy_w_FlightGear#Uruchamianie_silnika|szybki przewodnik]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie jest przesuwana mapa? ===&lt;br /&gt;
W symulatorze można wejść w menu &amp;quot;Wyposażenie &amp;gt; [[Map|Mapa]]&amp;quot;, ale nie jest to mapa lotnicza. Popularna ruchoma mapa jest dostępne w ramach osobnego projektu o nazwie Atlas. Jest również [[MPmap]] - mapa online dla multiplayer.&lt;br /&gt;
&lt;br /&gt;
Jeśli lubisz alternatywę dla Atlasa z uaktualnioną grafiką i mapami dostarczanymi przez projekt OpenStreetMap, to sprawdź [[Phi#Map|Phi]] lub [[JMapView]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę się nauczyć latania według wskazań przyrządów i nawigacji? ===&lt;br /&gt;
Jest dobry artykuł [[Understanding navigation]] oraz jest to bardzo dobrze wyjaśnione w [[Pl/Podręcznik_FlightGear|Podręczniku FlightGear]]. Inne zasoby to:&lt;br /&gt;
* [http://www.av8n.com/how/ See How It Flies] - bardzo dobra książka autorstwa Johna S. Denkera, dostępna online.&lt;br /&gt;
&lt;br /&gt;
=== Jaka jest różnica między lotką a sterem kierunku? ===&lt;br /&gt;
W tej samej książce jest trochę informacji o lotkach i sterze kierunku.&lt;br /&gt;
&lt;br /&gt;
=== Czy FlightGear wspiera multiplayer? ===&lt;br /&gt;
Oczywiście. Zobacz [[Howto: Multiplayer]]. Zarówno wersje Windowsowe jak i Unixowe obsługują tryb wieloosobowy na serwerach FlightGear. Również komunikacja głosowa jest obsługiwana dzięki [[FGCom]].&lt;br /&gt;
&lt;br /&gt;
Mapa pokazująca samoloty graczy online w czasie rzeczywistym jest dostępna jako [[MPmap]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie są najlepsze miejsca do latania w FlightGear? ===&lt;br /&gt;
Sceneria FlightGear obejmuje cały świat, ale dzięki społeczności użytkowników FlightGear, niektóre lotniska i obszary są bardziej szczegółowe niż inne: &lt;br /&gt;
* W okolicach Paryża we Francji jest wiele wysokiej jakości modeli scenerii.&lt;br /&gt;
* EHAM Amsterdam Schiphol, EGK Londyn Gatwick i LFPG Paryż Charles de Gaulle są jednymi z najwyższej jakości lotnisk.&lt;br /&gt;
* LOWI Innsbruck jest zarówno rozwinięty w scenerii jak i na lotnisku.&lt;br /&gt;
* TNCM St. Maarten jest popularnym celem podróży, a okoliczne wyspy (Anguilla, St. Eustatius, Saba, St. Barthélemy, St. Kitts i Nevis) są dobrze wymodelowane.&lt;br /&gt;
&lt;br /&gt;
Ponadto zobacz [[Suggested Flights|sugerowane loty]], [[Suggested Airports|sugerowane lotniska]] i [[Suggested custom scenery|sugerowane scenerie niestandardowe]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę znaleźć informacje o lotniskach i mapy lotnicze online? ===&lt;br /&gt;
Lotniska:&lt;br /&gt;
* [http://www.airnav.com/airports/ AirNav.com]&lt;br /&gt;
&lt;br /&gt;
Mapy:&lt;br /&gt;
* [http://skyvector.com/ SkyVector.com]&lt;br /&gt;
&lt;br /&gt;
Zobacz także [[Getting aeronautical charts|pozyskanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
=== Czy we FlightGear jest możliwość prowadzenia działań militarnych np. prowadzenia walk powietrznych lub zrzucania bomb? ===&lt;br /&gt;
Tak. Sprawdź dodatek [[Bombable]] i {{forum link|t=5742|title=Bombable}}. Istnieją również scenariusze bombardowania dla [[A-10]] i innych samolotów z uzbrojeniem, jak [[North American OV-10A Bronco]], [[General Dynamics F-16]] i [[F-117 Nighthawk]].&lt;br /&gt;
&lt;br /&gt;
=== Problemy z lataniem ===&lt;br /&gt;
&lt;br /&gt;
==== Dlaczego moje powierzchnie sterowe wracają do określonej pozycji? ====&lt;br /&gt;
Jest kilka możliwości, które mogą do tego doprowadzać:&lt;br /&gt;
* Jeśli [[autopilot]] twojego samolotu jest włączony, przejmie on (część) twoich elementów sterujących. Wyłącz autopilota, aby odzyskać kontrolę.&lt;br /&gt;
* Niektóre laptopy mają wbudowany czujnik grawitacji, który może zostać wykryty jako [[joystick]]. Zobacz jak to rozwiązać na [[Troubleshooting input devices#Controls returning to a particular position|Rozwiązywanie problemów z urządzeniami wejściowymi]].&lt;br /&gt;
&lt;br /&gt;
==== Dlaczego mój kokpit znika, gdy się rozglądam? ====&lt;br /&gt;
Prawdopodobnie używasz wersji samolotu z panelem 2D. Upewnij się, że wybrałeś ten z kokpitem 3D. Większość samolotów ma go teraz!&lt;br /&gt;
&lt;br /&gt;
==== Wokół lata mnóstwo innych samolotów ====&lt;br /&gt;
FlightGear posiada tak zwany system sztucznego ruchu lotniczego (AI Traffic). System ten generuje sterowane przez komputer samoloty na podstawie prawdziwych planów lotu, aby świat we FlightGear wyglądał bardziej żywo. Aby wyłączyć sztuczny ruch idź do menu &amp;quot;SI&amp;quot; &amp;gt; &amp;quot;Ruch lotniczy oraz scenariusze&amp;quot; i odznacz opcję &amp;quot;Enable AI traffic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli natomiast nie widzisz żadnych samolotów poza swoim, rozważ [[AI Traffic|przyczynienie się do dodania ruchu]] w swoim ulubionym miejscu!&lt;br /&gt;
&lt;br /&gt;
==== Samolot ciągle skręca w lewo, nie mogę lecieć prosto! ====&lt;br /&gt;
Tak, FlightGear jest prawdziwym symulatorem lotu i modeluje te efekty. Dokładnie tak zachowują się prawdziwe samoloty śmigłowe. Zobacz [[Understanding Propeller Torque and P-Factor|zrozumienie momentu obrotowego śmigła i współczynnika P]]. &lt;br /&gt;
&lt;br /&gt;
Sprawdź też rozkład obciążenia samolotu. Spróbuj dodać drugiego pilota o wadze 180 funtów i zobacz, czy efekt zostanie zniwelowany.&lt;br /&gt;
&lt;br /&gt;
== Wkład własny ==&lt;br /&gt;
&lt;br /&gt;
=== W jakim języku napisany jest FlightGear? ===&lt;br /&gt;
Głównie C++ z pewną ilością wspierającego kodu C, który jest głównie zawarty w SimGear. Więcej szczegółów na temat użytych języków:&lt;br /&gt;
* [https://www.openhub.net/p/flightgear/analyses/latest/languages_summary Moduł FlightGear]&lt;br /&gt;
* [https://www.openhub.net/p/simgear/analyses/latest/languages_summary Moduł SimGear]&lt;br /&gt;
* [https://www.openhub.net/p/flightgeardata/analyses/latest/languages_summary Dane FlightGeara] (samoloty, dźwięki itp.)&lt;br /&gt;
&lt;br /&gt;
Ponieważ wydajesz się być zainteresowany rozwojem rdzenia, powinieneś naprawdę sprawdzić [[Howto:Start core development]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zaprojektować model dynamiki lotu do nowego samolotu? ===&lt;br /&gt;
&lt;br /&gt;
FlightGear obsługuje różne [[flight dynamics model|modele dynamiki lotu]] (FDM), ale tylko dwa z nich są powszechnie używane:&lt;br /&gt;
* [[JSBSim]]: patrz http://jsbsim.sf.net/.&lt;br /&gt;
* [[YASim]]: jeśli chcesz pracować z prostszym FDM, spróbuj swoich sił w YASim. Przewodnik dotyczący tworzenia samolotów YASim znajduje się w podstawowym pakiecie FlightGear w pliku &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Docs/README.yasim&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobacz [[Portal:Developer/Aircraft|Portal rozwoju samolotów]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zaprojektować albo zmienić panel? ===&lt;br /&gt;
Zobacz plik &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Docs/README.xmlpanel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Skąd mogę się nauczyć programowania 3D i zaangażować się? ===&lt;br /&gt;
Jeśli chciałbyś stworzyć trójwymiarowy kokpit samolotu do FlightGear lub stworzyć budynki, zewnętrzne modele samolotów itp., Twoja pomoc jest bardzo potrzebna. Postaraj się nie przesadzać ze złożonością siatki. Najczęściej używanymi narzędziami są tutaj [[Blender]], [[AC3D]], [[Gimp]].&lt;br /&gt;
&lt;br /&gt;
Jeśli natomiast naprawdę chcesz wejść w programowanie w C++, będziesz musiał kupić sobie dobrą książkę o [[OpenGL]]. Jednak, FlightGear korzysta z biblioteki wysokiego poziomu [[OSG]], wydajnego zestawu narzędzi do grafiki 3D. Aby rozpocząć pracę z kodowaniem 3D w C++, możesz przejrzeć dokumentację OSG i nauczyć się tylko tyle OpenGL, ile będziesz potrzebować.&lt;br /&gt;
&lt;br /&gt;
=== Jak mogę dodać lotnisko? ===&lt;br /&gt;
&lt;br /&gt;
Proces ten obejmuje stworzenie układu lotniska w [[WorldEditor]], przetestowanie go (możesz chcieć wygenerować część scenerii, ale nie jest to obowiązkowe), a następnie, jeśli twoje źródła danych są zgodne z GPL, użycie [[WorldEditor]] do przesłania go do bramki. Lotnisko będzie dostępne w następnej pełnej przebudowie scenerii, chyba że chcesz wygenerować własną scenerię. Więcej na [[Howto:Make an airport]].&lt;br /&gt;
&lt;br /&gt;
=== Czy mogę stworzyć własną scenerię? ===&lt;br /&gt;
&lt;br /&gt;
Tak, choć może to być trudne zadanie. Generowaniem scenerii dla FlightGeara zajmuje się siostrzany projekt [[TerraGear]]. Dobrą wiadomością jest to, że gdy już wszystko ustawisz, jest to dość łatwe (choć może być czasochłonne), a przede wszystkim, że możesz to łatwo udostępnić.&lt;br /&gt;
&lt;br /&gt;
== Problemy ==&lt;br /&gt;
&lt;br /&gt;
=== Błędy sieciowe lub DNS podczas pobierania terenu ===&lt;br /&gt;
Jeśli wystąpią błędy sieciowe/DNS, wpisz &amp;lt;code&amp;gt;--prop:/sim/terrasync/http-server=twój-serwer&amp;lt;/code&amp;gt; w dodatkowych ustawieniach programu uruchamiającego (np. &amp;lt;code&amp;gt;--prop:/sim/terrasync/http-server=http://flightgear.sourceforge.net/scenery&amp;lt;/code&amp;gt;) lub kliknij przycisk „Pokaż więcej” po prawej stronie i wybierz serwer DNS.&lt;br /&gt;
&lt;br /&gt;
Patrz post na forum: [https://forum.flightgear.org/viewtopic.php?p=438783 Network errors occurred]&lt;br /&gt;
&lt;br /&gt;
=== X-y nie działają / są uszkodzone / złe / nie uruchamiają się ===&lt;br /&gt;
FlightGear jest bardzo skomplikowanym programem. Jeśli potrzebujesz pomocy w ogólnym użytkowaniu symulatora, znajdziesz ją na [[Portal:User|portalu Użytkownika]] oraz na {{forum link|text=forum FlightGeara}}.&lt;br /&gt;
&lt;br /&gt;
Jeśli Twoim problemem jest zawieszanie się oprogramowania, otrzymujesz błędy itp., rozważ zastosowanie się do wskazówek zawartych na stronie [[Troubleshooting problems|rozwiązywania problemów]].&lt;br /&gt;
&lt;br /&gt;
Niektóre z najczęściej występujących problemów są jednak wymienione poniżej. Jeśli nie możesz rozwiązać problemu samodzielnie i potrzebujesz pomocy kogoś, proszę pamiętaj, że jesteśmy ''wszyscy'' tutaj dla zabawy, deweloperzy również, i że każda pomoc ''jest'' aktem hojności. Więc postaraj się być miły, nawet jeśli problem cię frustruje.&lt;br /&gt;
&lt;br /&gt;
=== Co się stało z panelem, klawiaturą itp.? ===&lt;br /&gt;
Problemem jest prawie na pewno to, że Twój pakiet bazowy (FGData) nie jest zsynchronizowany z FlightGearem. Wiele konfigurowalnych części FlightGeara jest zdefiniowanych w plikach [[XML]] zawartych w pakiecie podstawowym.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego FlightGear działa tak wolno? ===&lt;br /&gt;
Jeśli wydaje Ci się, że FlightGear działa zbyt wolno, sprawdź w [[Howto: Improve Framerates]], czy możesz pokombinować z ustawieniami grafiki.&lt;br /&gt;
&lt;br /&gt;
Jeśli wszystko działa skrajnie wolno (np. ~1 klatka na sekundę), być może sprzętowa akceleracja 3D nie jest aktywna. Upewnij się, że masz zainstalowane biblioteki OpenGL i [[Graphics drivers configuration|poprawnie skonfigurowane]] oraz upewnij się, że masz najnowsze sterowniki do swojej karty graficznej. Bądź również świadomy, że niektóre karty graficzne [[Problematic Video Cards|nie są zbyt dobrze wspierane]].&lt;br /&gt;
&lt;br /&gt;
=== Jak sprawdzić liczbę klatek na sekundę? ===&lt;br /&gt;
&lt;br /&gt;
W symulatorze idź do menu &amp;quot;Widok&amp;quot; &amp;gt; &amp;quot;Opcje widoku&amp;quot; i zaznacz tam opcję &amp;quot;Show frame rate&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Jak zmienić ustawienia kokpitu 2D? ===&lt;br /&gt;
&lt;br /&gt;
Aby pokazać/ukryć panel 2D użyj kombinacji klawiszy {{Key press|Shift|P}}. Aby wyświetlić/ukryć HUD, naciskaj klawisz {{Key press|Shift|H}}. Możesz też włączyć alternatywny HUD przez naciśnięcie {{Key press|Shift|I}} (naciśnij {{Key press|I}} aby wrócić do domyślnego). Klawiszem {{Key press|Shift|H}} dostosujesz jasność HUD-a.&lt;br /&gt;
&lt;br /&gt;
=== Utknąłem do góry nogami po rozbiciu się? ===&lt;br /&gt;
&lt;br /&gt;
Szybką odpowiedzią jest zresetowanie symulatora, poprzez menu &amp;quot;Plik&amp;quot; &amp;gt; &amp;quot;Zresetuj&amp;quot;. To ustawi twój samolot z powrotem w pozycji startowej.&lt;br /&gt;
&lt;br /&gt;
Alternatywnie naciśnij {{Key press|Ctrl|U}} (w domyślnej konfiguracji), aby podnieść samolot o 1000 stóp.&lt;br /&gt;
&lt;br /&gt;
Dla upartych: sztuczka do nauki. Aby wrócić do normalnej (nie odwróconej) pozycji, wznieś się o 500 stóp i obróć się przy użyciu lotek o 180*. Pamiętaj, sterowanie działa odwrotnie gdy jesteś do góry nogami i utrzymuj prędkość!&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego najnowsze wersje niektórych samolotów nie działają w mojej (starszej) wersji FlightGeara? ===&lt;br /&gt;
Często rozwój nowych samolotów nadąża za rozwojem kodu FlightGeara. Nowe lub nowo zmodyfikowane samoloty mogą korzystać z plików (takich jak nowe pliki instrumentów) lub funkcji dostępnych tylko w nowszych wersjach FlightGeara. Jeśli utknąłeś w starszej wersji FlightGeara, możesz spróbować pobrać wcześniejszą wersję samolotu z odpowiedniego [[FlightGear_hangars#Official_hangars|oficjalnego hangaru]] FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Kiedy uruchamiam FlightGear widzę błąd wspominający o &amp;quot;SQLite&amp;quot;. Co mam zrobić? ===&lt;br /&gt;
&lt;br /&gt;
Od wersji FlightGear v2.10 (wydanej w lutym 2013) wprowadzono [[navdata cache|pamięć podręczną navdata]], aby poprawić czas uruchamiania FlightGeara. Ta pamięć podręczna to baza danych SQLite, która czasami jest trochę niestabilna. Jeśli baza danych jest uszkodzona, FlightGear nie będzie mógł się uruchomić.&lt;br /&gt;
&lt;br /&gt;
Aby to naprawić musisz po prostu usunąć plik &amp;lt;code&amp;gt;[[$FG_HOME]]/navdata.cache&amp;lt;/code&amp;gt;. Przy pierwszym uruchomieniu FlightGeara, po usunięciu pliku, pamięć podręczna navdata zostanie odbudowana. Ponieważ proces ten jest czasochłonny, uruchomienie FlightGeara zajmie więcej czasu.&lt;br /&gt;
&lt;br /&gt;
Niektórzy uciekają się do usunięcia całego katalogu &amp;lt;code&amp;gt;$FG_HOME&amp;lt;/code&amp;gt; lub nawet ponownej instalacji FlightGeara. Jednak żadne z nich nie jest potrzebne i może spowodować utratę wszelkich skonfigurowanych niestandardowych preferencji.&lt;br /&gt;
&lt;br /&gt;
Kolejnym wskaźnikiem problemu związanego z SQLite jest komunikat o błędzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
   Sqlite error:attempt to write a readonly database (8) while running:&lt;br /&gt;
      INSERT OR REPLACE INTO stat_cache (path, stamp) VALUES (?,?)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W takim przypadku, wcześniej uruchomiona instancja FlightGeara może nadal działać i blokować plik navdata.cache. Sprawdź, czy działa inny proces fgfs i zakończ go.&lt;br /&gt;
&lt;br /&gt;
=== Mój samolot ma szare okna? ===&lt;br /&gt;
Problem nieprzejrzystych szarych okien, prze które nie można nic zobaczyć, jest najczęściej spowodowany niezgodnością wersji programu FlightGear i samolotu. Lub może to być spowodowane efektem okna, który nie jest zgodny z systemami renderowania [[Project Rembrandt|Rembrandt]] lub [[ALS]]. Przyczyną techniczną jest niezgodność renderera i zadeklarowanego efektu dla okna. Niektóre rozwiązania obejmują:&lt;br /&gt;
&lt;br /&gt;
* Jeśli używasz stabilnej wersji FlightGeara, pobierz samolot z [[FlightGear_hangars#Official_hangars|oficjalnego hangaru]] pasującego do Twojej wersji FlightGeara.&lt;br /&gt;
* Jeśli używasz najnowszej wersji z [[FlightGear Build Server|builda nocnego]] lub [[Building FlightGear|samodzielnie skompilowanej wersji FlightGeara]] lub chcesz używać najnowocześniejszego samolotu, zobacz [[FGAddon#Obtaining aircraft|FGAddon - pozyskiwanie samolotu]].&lt;br /&gt;
* Jeśli korzystasz z samolotu z jednego z [[FlightGear_hangars#Unofficial_sites|nieoficjalnych hangarów]], najlepiej skontaktuj się z oryginalnym autorem samolotu lub osobą odpowiedzialną za ten hangar.&lt;br /&gt;
* Jeśli używasz [[Project Rembrandt|Rembrandta]], spróbuj wyłączyć ten system renderowania. Samoloty, które używają &amp;lt;code&amp;gt;model-default.eff&amp;lt;/code&amp;gt; dla okien (prostym kosztem nierobienia niczego) zamiast &amp;lt;code&amp;gt;model-transparent.eff&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;model-combined-transparent .eff&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;glass.eff&amp;lt;/code&amp;gt; (które instruują Rembrandta, aby nie używał odroczonego renderowania dla szyb) będą miały szare okna podczas używania Rembrandta.&lt;br /&gt;
&lt;br /&gt;
=== Mój ekran staje się całkowicie czerwony zaraz po uruchomieniu FlightGear ===&lt;br /&gt;
Czerwony ekran to wizualizacja efektu &amp;quot;redout&amp;quot; (napływ krwi do głowy pilota z powodu zbyt dużych przeciążeń). Jeśli pojawia się zaraz po uruchomieniu FlightGeara, może to być spowodowane problemem z ładowaniem scenerii. FlightGear ładuje scenerię w locie, a jeśli scenerii nie można załadować, np. ze względu na problemy z siecią, może nie być podłoża, na którym można zlokalizować statek powietrzny. W rezultacie samolot spada przez nieistniejący grunt, zaczynając się przewracać doprowadzając do nadmiernych przeciążeń. To z kolei powoduje efekt czerwonej planszy. Aby zweryfikować problem, należy rozpocząć lot w KSFO, którego sceneria jest już zawarta w pakiecie podstawowym.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Z kim się kontaktować w sprawie tego FAQ? ===&lt;br /&gt;
Dodaj komentarz na temat FAQ [[Talk:Frequently asked questions|na tej stronie]].&lt;br /&gt;
&lt;br /&gt;
=== Jak stary jest ten dokument? ===&lt;br /&gt;
Sprawdź jego &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:{{PAGENAME}}|action=history}} historię]&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Jaką inną dokumentację powinienem przeczytać? ===&lt;br /&gt;
* [[Pl/Podręcznik_FlightGear|Podręcznik FlightGear]]&lt;br /&gt;
* [[Pl/Nowy_w_FlightGear|Nowy we FlightGear]]&lt;br /&gt;
* Zobacz także katalog FlightGear/docs-mini/ w dystrybucji źródłowej, aby znaleźć różne inne przydatne dokumenty.&lt;br /&gt;
&lt;br /&gt;
== Wkład własny ==&lt;br /&gt;
&lt;br /&gt;
=== Ochrona treści ===&lt;br /&gt;
{{See also|FlightGear Plugins}} DRM&lt;br /&gt;
{{Cleanup}}&lt;br /&gt;
&lt;br /&gt;
Co jakiś czas pojawia się pytanie, czy dostarczanie do do FlightGeara zamkniętego kodu źródłowego wtyczki (dokładniej wtyczki czytnika plików OSG) jest legalne. Jedyną potrzebą trzymania kodu w pobliżu jest zapobieganie inżynierii wstecznej.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/27996073/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Content protection for modders? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Paul Guhl &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 25th, 2011 &lt;br /&gt;
  |added  =  Aug 25th, 2011 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Soitanen (Aug 28th, 2014). {{forum link|title=Re: Encrypted aircraft dynamics|p=217378}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34559749/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] External FDM to protect propriety data in a GPL&lt;br /&gt;
	eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Alan Teeder &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 21st, 2015 &lt;br /&gt;
  |added  =  Oct 21st, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear w obecnej postaci jest efektem pracy wielu ludzi, którzy dobrowolnie pracują nad wspólnym wysiłkiem stworzenia otwartej i rozszerzalnej platformy symulatora lotu. Sam Twój pomysł wprowadzenia DRM jest wbrew wszelkim zasadom open source.&lt;br /&gt;
&lt;br /&gt;
Możesz swobodnie stworzyć samolot dla FlightGeara na licencji własnościowej - to są dane z perspektywy symulatora i nie uruchamiają licencji. Możesz to sprzedawać, nie pozwalając na ponowną dystrybucję kodu źródłowego. Musisz trzymać się z dala od kilku rzeczy (nie możesz używać ogólnych instrumentów, bibliotek Nasal,...) ale to powinno być do zrobienia. Możesz pobierać opłaty licencyjne za taki samolot i nikt nie może go redystrybuować.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dane są analizowane z XML-a do dynamicznych tabel wyszukiwania (IE. STL). Jedynymi zasobami używanymi poza tym, co jest potrzebne do stworzenia funkcji FDM, jest narzut związany z wyciąganiem danych z pliku XML do pamięci. To musiałoby się zdarzyć bez względu na to, w jakiej formie były dane.&lt;br /&gt;
Chociaż mogą istnieć lepsze sposoby przechowywania danych niż XML-e, jeśli nie przejmujesz się interakcją człowieka z danymi. Myślę, że uczynienie danych czytelnymi/edytowalnymi dla człowieka jest głównym celem używania XML-i. Może być zbyt gadatliwy, ale działa i istnieją standardowe biblioteki do odczytu/parsowania plików XML, dzięki czemu używanie ich do wprowadzania danych jest dość proste. Jest to korzystne zarówno dla FlightGeara, jak i JSBSim pod względem ograniczenia złożoności obsługi danych konfiguracyjnych. Ponadto istnieje ograniczona liczba standardowych formatów dla tego typu rzeczy, takich jak JSON, a wszystkie te, które są czytelne/edytowalne przez człowieka, mają wiele takich samych problemów jak XML.&lt;br /&gt;
W pełni funkcjonalne FDM są złożone, a zrozumienie XML-a używanego do konfiguracji złożonego FDM jest bardzo drobnym problemem, a każdy, kto faktycznie rozumie w pełni funkcjonalny FDM, będzie miał bardzo niewiele problemów z częścią XML.&amp;lt;ref&amp;gt;hvengel (Aug 28th, 2014). {{forum link|title=Re: Encrypted aircraft dynamics|p=217408}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear sam w sobie jest OpenSource, więc niezależnie od tego, w jakim systemie DRM chcemy zakodować dane, każdy może go usunąć (i jest to całkiem legalne). Nie trzeba się zastanawiać, aby wygenerować wersję FlightGear bez ochrony praw autorskich i rozpowszechnić ją, na której Twoja treść działa bez klucza (lub czegokolwiek innego). Biorąc pod uwagę, że ludziom zwykle udaje się złamać schematy DRM przy braku otwartego kodu źródłowego, próba zrobienia tego z kodem źródłowym otwartym dla każdego wydaje się po prostu stratą czasu. Po drugie, jakikolwiek format pliku odczyta OSG, zanim dotrze do renderera, musi być tablicą wierzchołków. Renderer tego potrzebuje, na etapie GLSL nie ma deszyfrowania. Więc są szanse, że skoro działamy na *Open*GL, to znowu każdy, kto naprawdę chce, może wypisać niezaszyfrowany format.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponieważ FlightGear jest open source, niezwykle łatwo jest dodać kod, aby uzyskać dostęp do grafu sceny 3D i wyodrębnić pełny model samolotu (z wyłączeniem skryptów, chociaż można je odtworzyć). Informacje po prostu tam siedzą, w pełni widoczne i gotowe do pobrania z gałęzi OSG jak duża soczysta brzoskwinia. Prawdopodobnie mógłbym napisać ten kod w pół dnia, ale konwersja do formatu AC3D, tekstur PNG itp. w celu odtworzenia nowej kopii samolotu zajęłaby trochę więcej czasu. Gdyby FlightGear miał zamknięty kod źródłowy, napisanie kodu ekstraktora OSG byłoby znacznie trudniejsze, ale mimo to nadal wykonalne.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076297/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Edward d'Auvergne &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Właśnie z tego powodu mamy wsparcie dla katalogów i zewnętrznych hangarów. Oczywiście chcemy zachęcać do tworzenia samolotów na licencji GPL, ale nie każdy twórca samolotów chce lub może udostępniać swoje prace na licencji GPL. FlightGear szanuje i wspiera tę opcję.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076199/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] botom line: if i don't my aircraft to be&lt;br /&gt;
 subject to GPL FGAddon clauses &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Stuart Buchanan &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z pewnością można uruchomić model FDM z zewnątrz i użyć jednej z wielu opcji sieciowych I/O we FlightGear, aby przesyłać dane tam i z powrotem. W przeszłości zrobiono to w kilku projektach badawczych, aby wykorzystać FlightGear jako narzędzie do wizualizacji. Co za tym idzie, możesz zrobić to samo w przypadku skryptów - uruchomić skrypty na zewnątrz i wchodzić w interakcje z FlightGearem za pośrednictwem jednego z tych protokołów.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076187/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Stuart Buchanan &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli faktycznie spróbujesz pobierać opłatę 100$ za samolot dla FlighGear, nie znajdziesz zbyt wielu klientów, ponieważ FG jest popularny głównie w społeczności OpenSource. Jeśli sprawisz, że będzie to zbyt kłopotliwe za pomocą DRM-ów, być może ktoś spróbuje to obejść dla zasady (ludzie robią to dla sportu) - nie jest łatwo sprawić by wieloplatformowy DRM nie był irytujący dla użytkowników.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Należy pamiętać, że bez względu na format źródłowy (dll, zaszyfrowany + podpisany, binarny itp.), ostatecznie siatka modelu, tekstury i struktura logiczna są wczytywane do wewnętrznych struktur klas OSG. Po zakończeniu tego procesu, aby model mógł zostać wyrenderowany na ekranie, osoba może wywołać odpowiednią funkcję write*File() w celu zapisania poddrzewa modelu w dowolnym obsługiwanym formacie. Jedyne, co jest potrzebne, to dostęp do kodu źródłowego FlightGeara, aby wstawić wywołanie funkcji w strategicznym miejscu. W ostatecznym rozrachunku nie możesz całkowicie chronić swojej treści, jeśli nie masz pełnej kontroli nad sytuacją na poziomie kodu źródłowego aplikacji. I jest to klasyczna strategia hakowania ochrony przed kopiowaniem, wstawiaj magię do kodu po uwierzytelnieniu/załadowaniu/dekodowaniu formatu dystrybucji, a następnie zapisz go w &amp;quot;odszyfrowanym&amp;quot; formacie. Ludzie robią to cały czas, nawet z zastrzeżonym kodem. Wartość celu zwykle określa, jak ciężko są skłonni pracować, aby go ukraść.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074534/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.38 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodanie wsparcia dla DRM do FlightGear nie nastąpi - skrypty Nasal są domyślnie dostarczane w formacie zwykłego tekstu (podobnie jak JavaScript), natomiast zaciemnianie jest oczywiście możliwe, jednak nie ma to żadnego sensu w kontekście FlightGear jako projektu otwarto źródłowego.&lt;br /&gt;
&lt;br /&gt;
Ponadto skrypty mogą być łatwo udostępniane i uruchamiane przez użytkowników, po prostu je wymieniając lub kopiując.&lt;br /&gt;
&lt;br /&gt;
Nawet gdybyś zrzucił pośredni kod bajtowy Nasal do pliku obiektowego i wykonał to za pomocą maszyny wirtualnej Nasal, nie byłoby możliwości wyegzekwowania DRM.&lt;br /&gt;
&lt;br /&gt;
Oczywiście, ponieważ FlightGear jest open source, możesz po prostu dodać obsługę DSO/wtyczek do rozwidlenia FlightGear i oprzeć całą swoją pracę na tym rozwidleniu - z drugiej strony, twoje modyfikacje nadal będą musiały być udostępniane.&lt;br /&gt;
&lt;br /&gt;
Istnieje sposób na tworzenie legalnych dodatków z zamkniętym kodem źródłowym: możesz napisać cały &amp;quot;tajny&amp;quot; kod C++ jako zewnętrzną aplikację i pozwolić jej komunikować się z FlightGearem za pośrednictwem gniazd sieciowych. To powinno działać w miarę dobrze. Ale nie oczekuję, że zdobędziesz wielu klientów. Przede wszystkim, przynajmniej w Linuksie, nikt nie chce uruchamiać binarnych blobów, które mogłyby z łatwością wymazać katalog domowy podczas zabawy we FlightGear. A potem dzieje się tyle darmowych samolotów, z dużym rozmachem, że prawdopodobnie zawsze będziesz w tyle. A ci programiści mają bliskie powiązania z (lub są) programistami FlightGeara, więc mają tę zaletę, że mogą w dowolnym momencie zmienić kod FlightGeara według własnych upodobań. Mogą zmieniać interfejs do woli, a ty musisz nadrobić zaległości i zająć się reklamacjami klientów, którzy nagle siadają na zepsutym binarnym blobie, który nie działa z ostatnią wersją FlightGeara. I wreszcie, to podejście do gniazd działa tylko za pośrednictwem systemu właściwości i jest otwarte do wglądu dla każdego (oprócz niedawno dodanej półtajnej właściwości wektora śmieci).&lt;br /&gt;
&lt;br /&gt;
FlightGear nie ma możliwości ładowania samolotów z bibliotek współdzielonych. Możesz rozpowszechniać swój samolot na licencji zastrzeżonej, tak jak robi to Vitos, ale nie jako biblioteka współdzielona. Zmiana we FlightGear, aby mógł ładować samoloty z bibliotek współdzielonych, wymagałaby dużo pracy. Kto miałby to robić i dlaczego ktokolwiek miałby to robić, skoro mógłby poświęcić swój czas na ulepszanie wolnego oprogramowania? I dlaczego główni twórcy FlightGear mieliby akceptować taki wkład?&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073736/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared library, and what  legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Ludovic Brenta &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Realistycznie patrząc, jeśli chcesz sprzedać komercyjny samolot, twoją bazą klientów będzie Flight Sim X, X-Plane, Prepar3D. Po prostu nie uzyskasz żadnej przyczepności w ekosystemie FlightGear. Nie jest on do tego stworzony.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074166/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; geneb &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poza tym obsługa języka skryptowego OSG (lua) nie może uzyskać dostępu do wszystkich wewnętrznych funkcji Nasal, po prostu dlatego, że we FlightGear nie zaimplementowano kodu łączącego. Więc nie ma żadnych właściwości dla ciebie i żadnego dostępu do wewnętrznego wywołania funkcji, które zapewnia Nasal.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074133/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Erik Hofman &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posiadasz prawa autorskie do swojej pracy, nawet jeśli wydasz ją na licencji GPL i możesz dalej rozwijać swoją pracę i wydać bardziej kompletną wersję na licencji komercyjnej, jeśli tylko chcesz (jest to wariant podwójnej licencji). Jedynym sposobem, aby nie zachować praw autorskich do tego, co robisz, jest przeniesienie ich na kogoś innego lub zrzeczenie się ich poprzez udostępnienie swojej pracy jako domeny publicznej. Jeśli stworzysz model 3D dla samolotu FG i nadasz mu licencję GPL, nikt nie zabroni Ci adaptacji i sprzedaży go dla X-Plane. W rzeczywistości możesz go sprzedawać również dla FG (ale inni mogą go redystrybuować, jak im się podoba, gdy go kupią, ponieważ jest to GPL, więc może to nie być zbyt opłacalny model biznesowy).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073832/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Czy inne symulatory oferują szyfrowanie lub ochronę zawartości? Na przykład udało mi się zlokalizować i przetestować wtyczkę blendera, która może otworzyć wiele modeli samolotów MSFS. A jak z X-Plane?  Minął *długi*, *długi* czas, odkąd majstrowałem przy ich pakiecie, ale w tamtym czasie zwracałem uwagę, że wszystkie ich formaty 3D były otwarte i dobrze zdefiniowane. Często komercyjne symulatory przechowują rzeczy we własnych formatach binarnych, ale w większości przypadków nie są one zaszyfrowane, a użytkownicy końcowi dość szybko je odszyfrowują -- więc mogą edytować lub tworzyć nową zawartość w tym samym formacie. Nie uważałbym formatu binarnego za schemat ochrony treści, zwłaszcza w projekcie typu open source, w którym źródło do ładowania i przechowywania formatu binarnego jest łatwo dostępne.  Rozumiem pragnienie twórców treści, aby nie dać się „oszukać”. Ale zrozum też, że jednym z głównych powodów, dla których FlightGear może odnieść sukces, jest to, że cały kod źródłowy i zawartość są otwarte. Gdybyśmy nie otworzyli wszystkiego, nie otrzymalibyśmy prawie takiej samej liczby datków wolontariuszy, a wysokiej jakości wolontariat jest kluczowym powodem, dla którego FlightGear odniósł taki sukces. Gdybyśmy byli zamkniętą organizacją komercyjną, kto chciałby się włączyć i pomóc komuś innemu zarabiać pieniądze? Ale gdy wszystko jest otwarte, wiesz, że wszyscy inni mogą cieszyć się takim samym wkładem, tak samo jak Ty cieszysz się wkładem wszystkich innych. Istnieje kilka oszustów, którzy próbują zarobić na pracy innych ludzi i chętnie kłamią i wprowadzają w błąd, aby wyłudzić jak najwięcej pieniędzy od niczego niepodejrzewających użytkowników końcowych. Prawda jest taka, że ​​ci ludzie zawsze istnieli i zawsze będą istnieć. Są niezwykle skrupulatni i uporczywi w kopiowaniu rzeczy, posuwają się nawet do łamania schematów ochrony przed kopiowaniem, przeprowadzania inżynierii wstecznej projektów sprzętu, kopiowania dokładnego wyglądu produktów (nawet łącznie z logo). To nie jest problem, który jest unikalny dla projektu FlightGear -- i jest to coś, z czym wciąż byśmy się borykali, bez względu na to, jak ciężko pracowaliśmy nad stworzeniem schematów ochrony przed kopiowaniem. Jeśli zaprojektowałeś format zawartości binarnej, ktoś dokona inżynierii wstecznej. Jeśli zaprojektujesz schemat szyfrowania, ktoś po prostu zmodyfikuje kod symulatora, aby zrzucić odszyfrowaną wersję po załadowaniu jej do pamięci przez zastrzeżoną wtyczkę deszyfrującą (o ile nie złamie schematu szyfrowania lub nie ukradnie kluczy szyfrowania). We wszystkich tych przypadkach zawartość nadal można łatwo kopiować, replikować, sprzedawać itp. Najlepszy schemat, jaki widziałem, to taki, który ma klucz blokady węzła, który będzie działał tylko na jednym komputerze (klucz przypisany do adresu mac lub identyfikatora procesora). Oznacza to jednak bardziej skomplikowaną dwuetapową instalację, w której użytkownik musi wrócić do Ciebie po zainstalowaniu produktu, zgłosić swój unikalny identyfikator, uzyskać klucz, a następnie zainstalować ten klucz, zanim będzie mógł działać. Problem z tym wszystkim polega na tym, że w projekcie open source ktoś może po prostu skompilować nową wersję symulatora, która pomija sprawdzanie klucza lub akceptuje trywialny klucz lub dowolny klucz. Zastanawiam się tutaj nad różnymi możliwościami, ale mam nadzieję, że widzisz, że to, co na pierwszy rzut oka wydaje się prostą prośbą, w rzeczywistości jest dość złożone i w dalszym ciągu powoduje różnego rodzaju problemy (zarówno pod względem technicznym, jak i ze wsparciem użytkowników). Ostatecznie złoczyńcy i tak zazwyczaj znajdują obejścia i nie są zbytnio spowalniani. Kiedy rolnicy uprawiają rośliny, muszą znosić chwasty. Możemy spróbować rozsądnych rzeczy, aby zminimalizować chwasty, ale jeśli jesteś zbyt agresywny w zabijaniu chwastów i nie tolerujesz ani jednego, najprawdopodobniej zabijesz również większość swoich upraw. Dlatego uważam, że jest to coś, z czym musimy się po prostu pogodzić. Możemy spróbować podjąć rozsądne kroki, aby zminimalizować problem, ale nie możemy wyeliminować wszystkich złych osób bez szkody dla wszystkich dobrych rzeczy w naszym projekcie.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/27998023/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Content protection for modders? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 25th, 2011 &lt;br /&gt;
  |added  =  Aug 25th, 2011 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kiedy już rozpowszechniłeś kod źródłowy na licencji GPL, wyraźnie zadeklarowałeś, że każdy ma prawo do redystrybucji i modyfikacji - o ile nie rozpowszechnia go na innej licencji. Ale ty, jako właściciel praw autorskich, możesz zmienić licencję dla nowej wersji kodu, której jeszcze nie rozpowszechniałeś na licencji GPL - o ile modyfikacje te nie zostały dokonane przez innych, tj. Ty, jako jedyny posiadacz praw autorskich, możesz również rozpowszechniać go na kilku licencjach jednocześnie, np. GPL i niektórych licencjach własnościowych (czyniąc go wartym pieniędzy, które ludzie mogą za niego zapłacić, dzięki szybszym poprawkom błędów, dystrybuowanym tylko do płacących klientów itp.).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073990/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Jens Thoms Toerring &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną rzeczą do rozważenia jest to, że dystrybucja Twojego statku powietrznego jako .dll lub .so nie ukryła by ani nie zaciemniła by Twojego kodu i tekstur po załadowaniu ich do struktur symulatora w celu renderowania. Reszta FlightGeara jest open source, więc wstawienie wywołania funkcji OSG, aby zapisać samolot (modele i tekstury) w innym popularnym formacie 3D, nie wymagałoby wiele wysiłku.  Spowodowałoby to pewne straty w zakresie organizacji plików źródłowych, ale mimo to dałoby miejsce startu komuś, kto zamierza skopiować lub zmodyfikować pracę. Cała konfiguracja XML także powinna być dostępna za darmo w drzewie właściwości. Licencjonowanie Nasal (jak sądzę) jest napisane w sposób, który utrudnia dystrybucję zastrzeżonego kodu Nasal. Zatem stworzenie samolotu dla FlightGear zabezpieczonego przed modyfikacjami, nie mówiąc już o kopiowaniu, wiązałoby się z pewnymi naprawdę poważnymi wyzwaniami.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073896/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kluczem do projektu open source nie jest to, czy możesz wygrać spór prawny, czy nie. Chodzi raczej o to, aby przede wszystkim unikać wszelkich sporów prawnych i to za wszelką cenę. To znaczy trzymać się z dala od sądu. Aby bezpiecznie użyć czegoś takiego w projekcie open source, sugerowałbym coś w następujący sposób: &lt;br /&gt;
* Upublicznienie swojego produktu pochodnego w całości (ale bez licencji, mówiąc, że jest to materiał chroniony prawem autorskim), &lt;br /&gt;
* Zwrócenie się do właścicieli oryginalnego produktu i przekazanie im linku do produktu pochodnego, &lt;br /&gt;
* Poproszenie ich o publiczne oświadczenie, że produkt pochodny może być licencjonowany przy użyciu licencji „GPLv2 lub nowszej wersji”, &lt;br /&gt;
* Pamiętaj, aby poprosić ich o zidentyfikowanie publicznego produktu pochodnego jako łącza i zidentyfikowanie wszystkich jego części (aby uniknąć późniejszego stwierdzenia, że ​​​​umieściłeś fragmenty chronionego materiału).&lt;br /&gt;
&lt;br /&gt;
Kopię zapasową każdego oświadczenia złożonego w sieci można znaleźć w archiwum internetowym (http://web.archive.org/). Aby uprościć ten proces, możesz sporządzić część oświadczenia opisującą w całości produkt pochodny, ze wszystkimi szczegółami. Dzięki temu nie będzie już żadnych odcieni szarości! Jeśli chętnie to zrobią, to z prawnego punktu widzenia nie będzie problemu z ich użyciem (tj. szara sytuacja zmieniła się w białą). Jeśli nie są zadowoleni z Twojej propozycji, pewnego dnia mogą odwrócić się i pozwać (tj. szara sytuacja zmieniła się w czystą czerń).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34561220/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] External FDM to protect propriety data in a&lt;br /&gt;
 GPL eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Edward d'Auvergne &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 22nd, 2015 &lt;br /&gt;
  |added  =  Oct 22nd, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Świat open source zależy od warunków licencji i praw autorskich oraz współpracy i zaufania w celu ochrony naszej pracy. Znosimy niewielki podzbiór ludzi, którzy chcą nadużywać tych warunków i mamy nadzieję, że presja większej grupy utrzyma złych aktorów w ryzach. Czasami istnieje środek prawny, czasami trudno jest coś z tym zrobić, gdy problemy wykraczają poza granice kraju (lub gdy ktoś po prostu chce złamać zasady dla własnych korzyści). Mam jednak wrażenie, że na dłuższą metę większość ludzi jest uczciwa i chce postępować właściwie, a mała grupa, która naprawdę istnieje, aby powodować problemy lub po prostu służyć sobie kosztem innych, nigdy nie przetrwa tak długo, jak większa grupa ludzi o dobrych intencjach. Ostatecznie musisz samodzielnie określić, ile wysiłku włożyłeś w model, ile pieniędzy możesz zarobić na jego sprzedaży, w porównaniu z ryzykiem, że ktoś go sam skopiuje i rozpowszechni, w porównaniu z kosztami prawnymi, aby spróbować ich powstrzymać.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074534/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.38 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obejścia DRM ===&lt;br /&gt;
&lt;br /&gt;
W jednym z moich poprzednich projektów miałem do czynienia z autorskim modelem dynamiki lotu. Początkowo korzystałem z interfejsu Ethernet, aby mógł działać jako zewnętrzna samodzielna aplikacja. Potem przełączyłem się na dwukierunkowy układ potoków uniksowych, więc mogłem mieć ściślejszą synchronizację z kolejnością wykonania, ale nadal zewnętrzny program był całkowicie niezależny i samodzielny. Chciałbym, aby wszystko było darmowe i otwarte, ale w tym przypadku nie miałem wyboru i było to coś zakupionego od firmy zewnętrznej na surowych warunkach. Czułem, że dwa niezależne, samowystarczalne programy (które mogą ze sobą rozmawiać i wymieniać informacje) stworzyły wystarczającą separację licencji, aby honorować warunki licencji GPL FlightGeara.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34559783/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] External FDM to protect propriety data in a&lt;br /&gt;
 GPL eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 21st, 2015 &lt;br /&gt;
  |added  =  Oct 21st, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na ile to jest warte, FDM „ExternalPipe” został skonfigurowany tak, aby obejmował większość obszarów, których dotknąłeś. Prawdopodobnie nie jest to dokładnie to, czego chcesz, ale oto trochę mojej logiki w tym, jak/dlaczego skonfigurowałem to tak, jak to zrobiłem: &lt;br /&gt;
* Korzystanie z interfejsu sieciowego dodaje trochę indeterminizmu. Czasami pakiety sieciowe są opóźniane lub układają się w stos w zależności od tego, co dzieje się z maszyną, więc nie ma gwarantowanej relacji między symulatorem a dynamiką lotu. &lt;br /&gt;
* Zwykle interfejs sieciowy jest dobry, ale zaobserwowałem czasy, kiedy pakiety docierały tam, gdzie powinny, z dodatkowymi opóźnieniami.  &lt;br /&gt;
* Alternatywnie ustawiam parę „nazwanych potoków”. Potoki są konstrukcją uniksową, dla programu wyglądają jak plik, ale to, co do nich zapisujesz, jest gromadzone i przechowywane do odczytania przez inną aplikację. Niestety nie są one obsługiwane w systemie Windows. Potoki są jednokierunkowe, stąd potrzeba dwóch do komunikacji dwukierunkowej. Potok jest naprawdę prosty: otwierasz go jak każdy inny plik, a jeden proces zapisuje w nim; odczytuje z niego inny proces. W międzyczasie system operacyjny może buforować pewną ilość informacji, dopóki proces odczytujący ich nie złapie. Możesz użyć blokowania odczytów (ostrożnie z tym), aby mieć pewność, że FlightGear i zewnętrzny FDM działają dokładnie tak samo. &lt;br /&gt;
* Potoki oznaczają, że oba procesy będą działać na tej samej maszynie, interfejs sieciowy pozwoliłby procesom działać na oddzielnych maszynach. &lt;br /&gt;
* Interfejs ExternalPipe obsługuje elastyczny interfejs właściwości, więc zewnętrzny proces FDM może wysyłać dowolne pary nazwa/wartość, które chce wysłać, a interfejs sumiennie skopiuje je do drzewa właściwości FlightGeara. Strona FDM może również wysłać listę nazw właściwości, które chciałaby otrzymać w odpowiedzi, a interfejs będzie sumiennie przesyłał je potokiem wychodzącym w każdej klatce. To był miły dodatek, a nazwane potoki mają dużą przepustowość, aby zrobić to czystym tekstem, nawet z wieloma dodatkowymi wartościami właściwości. &lt;br /&gt;
&lt;br /&gt;
Historia: Użyłem tego jako części projektu, który zrobiłem z symulatorem lotu ATC. Mieli własne, zastrzeżone aplikacje do dynamiki lotu, które modelowały konkretny statek powietrzny w samym kodzie. Modele te posiadały całą niezbędną dokumentację źródłową i dane z testów w locie, aby spełnić wymagania testowe certyfikacyjne FAA dotyczące ostatecznego symulatora. Ponadto ten zewnętrzny kod modelował wiele systemów samolotu dla jednej z ich wysokiej klasy symulacji. Wymagało to elastyczności w zakresie wysyłanych tam i z powrotem wartości i umożliwiło mi sterowanie niektórymi wskaźnikami przyrządów bezpośrednio z kodu zewnętrznego.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/31900851/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Feeding FlightGear data through the Protocol&lt;br /&gt;
	Pipe &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 29th, 2014 &lt;br /&gt;
  |added  =  Jan 29th, 2014 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[de:FAQ]]&lt;br /&gt;
[[en:Frequently asked questions]]&lt;br /&gt;
[[es:Preguntas frecuentes]]&lt;br /&gt;
[[fr:Foire aux questions]]&lt;br /&gt;
[[it:Domande frequenti]]&lt;br /&gt;
[[ja:FAQ]]&lt;br /&gt;
[[nl:veel gestelde vragen]]&lt;br /&gt;
[[pt:FAQ]]&lt;br /&gt;
[[pt-br:Perguntas_frequentes]]&lt;br /&gt;
[[sr:FAQ]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FAQ&amp;diff=144257</id>
		<title>Pl/FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FAQ&amp;diff=144257"/>
		<updated>2026-04-30T17:12:53Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dziękujemy za zainteresowanie [[FlightGear]]! Ten ''FAQ'' zawiera listę najczęściej zadawanych pytań. Jeśli nie możesz znaleźć odpowiedzi na swój problem, proszę utworzyć temat na {{forum link|text=naszym forum}}.&lt;br /&gt;
&lt;br /&gt;
== Dystrybucja ==&lt;br /&gt;
&lt;br /&gt;
=== Skąd wziąć FlightGear? ===&lt;br /&gt;
Oficjalną stroną pobierania jest: {{project infrastructure|website|link=no|urn=download/}}. Znajdziesz tam wersje binarne dla Windows, macOS oraz Linux (AppImage). W większości dystrybucji Linuxa, FlightGear można pobrać bezpośrednio z repozytoriów danej dystrybucji. Szukaj w &amp;quot;Centrum/Menedżer oprogramowania&amp;quot; Twojej dystrybucji.&lt;br /&gt;
&lt;br /&gt;
=== Jak zainstalować FlightGeara na Linuksie? ===&lt;br /&gt;
Wiele dystrybucji zawiera FlightGear w swoich repozytoriach. Ponadto w {{project infrastructure|website|urn=download/|text=Centrum Pobierania}} znajdziesz też wersję skompilowaną do AppImage, którą uruchomisz na niemal każdej współczesnej dystrybucji. Jeśli nie możesz znaleźć wersji pakietowej dla siebie, rozważ pobranie i [[Building FlightGear - Linux|kompilację z kodów źródłowych]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę znaleźć najnowszy kod źródłowy? ===&lt;br /&gt;
Najnowszy kod źródłowy jest dostępny dla każdego za pośrednictwem naszego [[FlightGear Git|repozytorium Git]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę latać i skąd wziąć scenerie? ===&lt;br /&gt;
Latać można wszędzie, po całym świecie. Scenerie można pobrać na wiele sposobów. Obecnie najlepszą opcją jest automatyczne pobieranie scenerii w zależności od tego gdzie się znajdujesz. Służy do tego program TerraSync. Aby go włączyć wystarczy w Launcherze wejść do &amp;quot;Ustawienia&amp;quot; -&amp;gt; &amp;quot;Pobieranie&amp;quot; i tam zaznaczyć opcję &amp;quot;Automatycznie pobieraj scenerię&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Można także pobrać większe rejony świata ręcznie, ze strony {{project infrastructure|website|urn=download/scenery|text=Pobieranie Scenerii}}&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę zdobyć dodatkowe samoloty? ===&lt;br /&gt;
Najnowsze, oficjalne samoloty można pobrać i zainstalować jednym kliknięciem w zakładce samolotów w Launcherze (patrz [[FlightGear Qt launcher|FlightGear Qt Launcher]]). &lt;br /&gt;
&lt;br /&gt;
Możesz także zajrzeć na oficjalną stronę {{project infrastructure|website|urn=download/download-aircraft/|text=Pobierania Samolotów}}. &lt;br /&gt;
&lt;br /&gt;
Inne samoloty w fazie rozwoju możesz znaleźć w oficjalnym repozytorium samolotów [[FGAddon]], a inne w hangarach FlightGear osób trzecich (patrz także [[Pl/Instalowanie_samolotów|Jak zainstalować samoloty]]).&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego samoloty na FlightGear.org są nieaktualne? ===&lt;br /&gt;
Samoloty z oficjalnej {{project infrastructure|website|urn=download/|text=strony pobierania}} są aktualizowane tylko w momencie wydania nowej wersji FlightGeara. Dzieje się tak, ponieważ samoloty, które są obecnie w fazie rozwoju, są zwykle opracowywane dla rozwojowych/nieopublikowanych wersji FlightGeara. Te wersje rozwojowe mają wiele funkcji, które nie są obsługiwane przez starszą, stabilną wersję. Gdybyśmy częściej aktualizowali pobierane samoloty, większość samolotów nie działałaby w stabilnej wersji FlightGeara.&lt;br /&gt;
&lt;br /&gt;
=== Jak aktualne są dane we FlightGear w porównaniu z rzeczywistością? ===&lt;br /&gt;
Korzystamy z tych samych danych nawigacyjnych i baz lotnisk co X-Plane. Aktualne bazy danych można znaleźć w folderach [[$FG ROOT]]/Navaids/ and [[$FG ROOT]]/Airports/.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego nie pobieracie za to pieniędzy? ===&lt;br /&gt;
FlightGear można pobrać bezpłatnie z wielu miejsc, w tym ze strony internetowej FlightGear, ale można go również kupić na płycie CD/DVD. Chociaż oferujemy tę usługę (zobacz oficjalną stronę internetową), zachęcamy inne grupy do redystrybucji dla swoich użytkowników, zwłaszcza w ramach dystrybucji systemu operacyjnego, która sprawia, że instalacja jest jeszcze szybsza i łatwiejsza dla nowych użytkowników.&lt;br /&gt;
&lt;br /&gt;
Czasami możesz znaleźć ofertę kupna FlightGeara na portalach aukcyjnych lub komercyjnych stronach internetowych pod inną nazwą. Można to zrobić całkiem legalnie, o ile warunki licencji są przestrzegane i może być warte kosztów, jeśli uwzględnione zostaną niektóre funkcje o wartości dodanej, takie jak dodatkowa sceneria, samolot lub wsparcie posprzedażowe. Niestety, większość przypadków obserwowanych do tej pory wydaje się być po prostu próbą zarobienia pieniędzy na sprzedaży czegoś, co jest bezpłatne i nie zapewnia prawdziwej wartości dodanej.&lt;br /&gt;
&lt;br /&gt;
=== Jak mogę zacząć korzystać z FlightGear? ===&lt;br /&gt;
FlightGear można pobrać z {{project infrastructure|website|urn=download/|text=Download Central}}. Po uruchomieniu Launchera, możesz doinstalować tam samoloty z oficjalnego hangaru. Włączając automatyczne pobieranie scenerii, FlightGear sam zadba o scenerię. Uważaj na wymagania systemowe! Sprawdź też [[Pl/Nowy we FlightGear|Nowy we FlightGear]].&lt;br /&gt;
&lt;br /&gt;
== Kompilacja ==&lt;br /&gt;
=== Jak skompilować FlightGear z kodów źródłowych? ===&lt;br /&gt;
Zobacz [[Building Flightgear|Budowanie FlightGear]]. Istnieją wyjaśnienia dla kompilacji pod Window, Linuks, a nawet skrypty do automatycznego pobrania i kompilowania całości.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego FlightGear się nie kompiluje? ===&lt;br /&gt;
&lt;br /&gt;
To zależy. Po pierwsze upewnij się że używasz odpowiednich wersji FlightGear, [[SimGear]], plib, zlib. Jeśli którykolwiek z pakietów nie pasuje (wersją) do innych, kompilacja może się nie udać.&lt;br /&gt;
&lt;br /&gt;
Upewnij się też czy masz implementację OpenGL ze wsparciem glut'a z odpowiednimi plikami nagłówkowymi. Użytkownicy Linuksa posiadający karty nVidia powinni się sprawdzić, czy mają najnowsze sterowniki. Inni posiadacze Linuks powinni mieć bibliotekę Mesa3d (http://mesa3d.org/). Sprawdź też czy masz dobrze zainstalowany i skonfigurowany serwer X-ów.&lt;br /&gt;
&lt;br /&gt;
Jeśli dalej masz problemy, zapytaj na {{forum link|text=FlightGear forum}}, na [[IRC]] lub zapisz się na naszą [[mailing list|listę mailingową]] FlightGear-Users i daj nam znać, jaki masz problem.&lt;br /&gt;
&lt;br /&gt;
=== Czym jest SimGear i dlaczego go potrzebuję? ===&lt;br /&gt;
[[SimGear]] jest biblioteką kodu pomocniczego. SimGear jest potrzebny tylko wtedy, gdy planujesz skompilować FlightGear - nie jest potrzebny do uruchamiania prekompilowanych binariów. Więcej informacji znajdziesz na stronie http://www.simgear.org/. Uwaga: Podczas kompilacji FlightGeara bardzo ważne jest posiadanie pasującej wersji SimGeara.&lt;br /&gt;
&lt;br /&gt;
== Konfiguracja i uruchomienie ==&lt;br /&gt;
&lt;br /&gt;
=== Jak uruchomić FlightGear? ===&lt;br /&gt;
Najprostszym sposobem jest użycie [[FlightGear Qt launcher|Launchera]]. Alternatywnie możesz go uruchomić z terminala używając [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zainstalować nowe scenerie? ===&lt;br /&gt;
&lt;br /&gt;
Jeśli naprawdę nie chcesz/nie możesz używać [[Terrasync]], pliki archiwum scenerii (np. w100n30.tar.gz) powinny zostać rozpakowane do katalogu Scenery/Terrain w Twoim [[$FG_ROOT]]. Więcej na [[Pl/Instalowanie_scenerii|Instalowanie scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Jak skonfigurować mój joystick? ===&lt;br /&gt;
&lt;br /&gt;
FlightGear obsługuje wiele joysticków/wolantów od razu po podłączeniu. Jeśli jednak masz problemy, zobacz [[Input device|Urządzenie wejściowe]].&lt;br /&gt;
&lt;br /&gt;
=== W jakim formacie powinien być mój osobisty plik .fgfsrc? ===&lt;br /&gt;
&lt;br /&gt;
Twój plik .fgfsrc powinien po prostu być listą [[Pl/Opcje_wiersza_poleceń|opcji wiersza poleceń]], z każdą opcją w osobnej linii. Plik ten nie jest plikiem XML.&lt;br /&gt;
&lt;br /&gt;
Jeśli wolałbyś korzystać z plików konfiguracyjnych XML mógłbyś dodać coś takiego do pliku .fgfsrc lub do wiersza poleceń:&lt;br /&gt;
&lt;br /&gt;
 --config=/ścieżka/do/pliku.xml&lt;br /&gt;
&lt;br /&gt;
Prawie każda opcja odpowiada właściwości, więc możesz wybrać metodę która Ci najlepiej odpowiada.&lt;br /&gt;
&lt;br /&gt;
=== Jak dostać się do opcji, pomocy itp.? ===&lt;br /&gt;
Prawdopodobnie nie widzisz głównego menu. Aby je wyświetlić naciśnij {{Key press|F10}}.&lt;br /&gt;
&lt;br /&gt;
== Latanie ==&lt;br /&gt;
&lt;br /&gt;
=== Jak uruchomić silnik/i? ===&lt;br /&gt;
Samoloty różnią się w swoich procedurach startowych. Niektóre mogą mieć sekwencję automatycznego startu lub instrukcje w menu pomocy samolotu (naciśnij klawisz {{key press|?}}) i/lub na stronie Wiki o [[Aircraft|statkach powietrznych]]. Zapoznaj się z [[Pl/Podręcznik_FlightGear|Podręcznikiem FlightGear]] lub zobacz [[Pl/Nowy_w_FlightGear#Uruchamianie_silnika|szybki przewodnik]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie jest przesuwana mapa? ===&lt;br /&gt;
W symulatorze można wejść w menu &amp;quot;Wyposażenie &amp;gt; [[Map|Mapa]]&amp;quot;, ale nie jest to mapa lotnicza. Popularna ruchoma mapa jest dostępne w ramach osobnego projektu o nazwie Atlas. Jest również [[MPmap]] - mapa online dla multiplayer.&lt;br /&gt;
&lt;br /&gt;
Jeśli lubisz alternatywę dla Atlasa z uaktualnioną grafiką i mapami dostarczanymi przez projekt OpenStreetMap, to sprawdź [[Phi#Map|Phi]] lub [[JMapView]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę się nauczyć latania według wskazań przyrządów i nawigacji? ===&lt;br /&gt;
Jest dobry artykuł [[Understanding navigation]] oraz jest to bardzo dobrze wyjaśnione w [[Pl/Podręcznik_FlightGear|Podręczniku FlightGear]]. Inne zasoby to:&lt;br /&gt;
* [http://www.av8n.com/how/ See How It Flies] - bardzo dobra książka autorstwa Johna S. Denkera, dostępna online.&lt;br /&gt;
&lt;br /&gt;
=== Jaka jest różnica między lotką a sterem kierunku? ===&lt;br /&gt;
W tej samej książce jest trochę informacji o lotkach i sterze kierunku.&lt;br /&gt;
&lt;br /&gt;
=== Czy FlightGear wspiera multiplayer? ===&lt;br /&gt;
Oczywiście. Zobacz [[Howto: Multiplayer]]. Zarówno wersje Windowsowe jak i Unixowe obsługują tryb wieloosobowy na serwerach FlightGear. Również komunikacja głosowa jest obsługiwana dzięki [[FGCom]].&lt;br /&gt;
&lt;br /&gt;
Mapa pokazująca samoloty graczy online w czasie rzeczywistym jest dostępna jako [[MPmap]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie są najlepsze miejsca do latania w FlightGear? ===&lt;br /&gt;
Sceneria FlightGear obejmuje cały świat, ale dzięki społeczności użytkowników FlightGear, niektóre lotniska i obszary są bardziej szczegółowe niż inne: &lt;br /&gt;
* W okolicach Paryża we Francji jest wiele wysokiej jakości modeli scenerii.&lt;br /&gt;
* EHAM Amsterdam Schiphol, EGK Londyn Gatwick i LFPG Paryż Charles de Gaulle są jednymi z najwyższej jakości lotnisk.&lt;br /&gt;
* LOWI Innsbruck jest zarówno rozwinięty w scenerii jak i na lotnisku.&lt;br /&gt;
* TNCM St. Maarten jest popularnym celem podróży, a okoliczne wyspy (Anguilla, St. Eustatius, Saba, St. Barthélemy, St. Kitts i Nevis) są dobrze wymodelowane.&lt;br /&gt;
&lt;br /&gt;
Ponadto zobacz [[Suggested Flights|sugerowane loty]], [[Suggested Airports|sugerowane lotniska]] i [[Suggested custom scenery|sugerowane scenerie niestandardowe]].&lt;br /&gt;
&lt;br /&gt;
=== Gdzie mogę znaleźć informacje o lotniskach i mapy lotnicze online? ===&lt;br /&gt;
Lotniska:&lt;br /&gt;
* [http://www.airnav.com/airports/ AirNav.com]&lt;br /&gt;
&lt;br /&gt;
Mapy:&lt;br /&gt;
* [http://skyvector.com/ SkyVector.com]&lt;br /&gt;
&lt;br /&gt;
Zobacz także [[Getting aeronautical charts|pozyskanie map lotniczych]].&lt;br /&gt;
&lt;br /&gt;
=== Czy we FlightGear jest możliwość prowadzenia działań militarnych np. prowadzenia walk powietrznych lub zrzucania bomb? ===&lt;br /&gt;
Tak. Sprawdź dodatek [[Bombable]] i {{forum link|t=5742|title=Bombable}}. Istnieją również scenariusze bombardowania dla [[A-10]] i innych samolotów z uzbrojeniem, jak [[North American OV-10A Bronco]], [[General Dynamics F-16]] i [[F-117 Nighthawk]].&lt;br /&gt;
&lt;br /&gt;
=== Problemy z lataniem ===&lt;br /&gt;
&lt;br /&gt;
==== Dlaczego moje powierzchnie sterowe wracają do określonej pozycji? ====&lt;br /&gt;
Jest kilka możliwości, które mogą do tego doprowadzać:&lt;br /&gt;
* Jeśli [[autopilot]] twojego samolotu jest włączony, przejmie on (część) twoich elementów sterujących. Wyłącz autopilota, aby odzyskać kontrolę.&lt;br /&gt;
* Niektóre laptopy mają wbudowany czujnik grawitacji, który może zostać wykryty jako [[joystick]]. Zobacz jak to rozwiązać na [[Troubleshooting input devices#Controls returning to a particular position|Rozwiązywanie problemów z urządzeniami wejściowymi]].&lt;br /&gt;
&lt;br /&gt;
==== Dlaczego mój kokpit znika, gdy się rozglądam? ====&lt;br /&gt;
Prawdopodobnie używasz wersji samolotu z panelem 2D. Upewnij się, że wybrałeś ten z kokpitem 3D. Większość samolotów ma go teraz!&lt;br /&gt;
&lt;br /&gt;
==== Wokół lata mnóstwo innych samolotów ====&lt;br /&gt;
FlightGear posiada tak zwany system sztucznego ruchu lotniczego (AI Traffic). System ten generuje sterowane przez komputer samoloty na podstawie prawdziwych planów lotu, aby świat we FlightGear wyglądał bardziej żywo. Aby wyłączyć sztuczny ruch idź do menu &amp;quot;SI&amp;quot; &amp;gt; &amp;quot;Ruch lotniczy oraz scenariusze&amp;quot; i odznacz opcję &amp;quot;Enable AI traffic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Jeśli natomiast nie widzisz żadnych samolotów poza swoim, rozważ [[AI Traffic|przyczynienie się do dodania ruchu]] w swoim ulubionym miejscu!&lt;br /&gt;
&lt;br /&gt;
==== Samolot ciągle skręca w lewo, nie mogę lecieć prosto! ====&lt;br /&gt;
Tak, FlightGear jest prawdziwym symulatorem lotu i modeluje te efekty. Dokładnie tak zachowują się prawdziwe samoloty śmigłowe. Zobacz [[Understanding Propeller Torque and P-Factor|zrozumienie momentu obrotowego śmigła i współczynnika P]]. &lt;br /&gt;
&lt;br /&gt;
Sprawdź też rozkład obciążenia samolotu. Spróbuj dodać drugiego pilota o wadze 180 funtów i zobacz, czy efekt zostanie zniwelowany.&lt;br /&gt;
&lt;br /&gt;
== Wkład własny ==&lt;br /&gt;
&lt;br /&gt;
=== W jakim języku napisany jest FlightGear? ===&lt;br /&gt;
Głównie C++ z pewną ilością wspierającego kodu C, który jest głównie zawarty w SimGear. Więcej szczegółów na temat użytych języków:&lt;br /&gt;
* [https://www.openhub.net/p/flightgear/analyses/latest/languages_summary Moduł FlightGear]&lt;br /&gt;
* [https://www.openhub.net/p/simgear/analyses/latest/languages_summary Moduł SimGear]&lt;br /&gt;
* [https://www.openhub.net/p/flightgeardata/analyses/latest/languages_summary Dane FlightGeara] (samoloty, dźwięki itp.)&lt;br /&gt;
&lt;br /&gt;
Ponieważ wydajesz się być zainteresowany rozwojem rdzenia, powinieneś naprawdę sprawdzić [[Howto:Start core development]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zaprojektować model dynamiki lotu do nowego samolotu? ===&lt;br /&gt;
&lt;br /&gt;
FlightGear obsługuje różne [[flight dynamics model|modele dynamiki lotu]] (FDM), ale tylko dwa z nich są powszechnie używane:&lt;br /&gt;
* [[JSBSim]]: patrz http://jsbsim.sf.net/.&lt;br /&gt;
* [[YASim]]: jeśli chcesz pracować z prostszym FDM, spróbuj swoich sił w YASim. Przewodnik dotyczący tworzenia samolotów YASim znajduje się w podstawowym pakiecie FlightGear w pliku &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Docs/README.yasim&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zobacz [[Portal:Developer/Aircraft|Portal rozwoju samolotów]].&lt;br /&gt;
&lt;br /&gt;
=== Jak zaprojektować albo zmienić panel? ===&lt;br /&gt;
Zobacz plik &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Docs/README.xmlpanel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Skąd mogę się nauczyć programowania 3D i zaangażować się? ===&lt;br /&gt;
Jeśli chciałbyś stworzyć trójwymiarowy kokpit samolotu do FlightGear lub stworzyć budynki, zewnętrzne modele samolotów itp., Twoja pomoc jest bardzo potrzebna. Postaraj się nie przesadzać ze złożonością siatki. Najczęściej używanymi narzędziami są tutaj [[Blender]], [[AC3D]], [[Gimp]].&lt;br /&gt;
&lt;br /&gt;
Jeśli natomiast naprawdę chcesz wejść w programowanie w C++, będziesz musiał kupić sobie dobrą książkę o [[OpenGL]]. Jednak, FlightGear korzysta z biblioteki wysokiego poziomu [[OSG]], wydajnego zestawu narzędzi do grafiki 3D. Aby rozpocząć pracę z kodowaniem 3D w C++, możesz przejrzeć dokumentację OSG i nauczyć się tylko tyle OpenGL, ile będziesz potrzebować.&lt;br /&gt;
&lt;br /&gt;
=== Jak mogę dodać lotnisko? ===&lt;br /&gt;
&lt;br /&gt;
Proces ten obejmuje stworzenie układu lotniska w [[WorldEditor]], przetestowanie go (możesz chcieć wygenerować część scenerii, ale nie jest to obowiązkowe), a następnie, jeśli twoje źródła danych są zgodne z GPL, użycie [[WorldEditor]] do przesłania go do bramki. Lotnisko będzie dostępne w następnej pełnej przebudowie scenerii, chyba że chcesz wygenerować własną scenerię. Więcej na [[Howto:Make an airport]].&lt;br /&gt;
&lt;br /&gt;
=== Czy mogę stworzyć własną scenerię? ===&lt;br /&gt;
&lt;br /&gt;
Tak, choć może to być trudne zadanie. Generowaniem scenerii dla FlightGeara zajmuje się siostrzany projekt [[TerraGear]]. Dobrą wiadomością jest to, że gdy już wszystko ustawisz, jest to dość łatwe (choć może być czasochłonne), a przede wszystkim, że możesz to łatwo udostępnić.&lt;br /&gt;
&lt;br /&gt;
== Problemy ==&lt;br /&gt;
&lt;br /&gt;
=== Błędy sieciowe lub DNS podczas pobierania terenu ===&lt;br /&gt;
Jeśli wystąpią błędy sieciowe/DNS, wpisz &amp;lt;code&amp;gt;--prop:/sim/terrasync/http-server= twój serwer&amp;lt;/code&amp;gt; w dodatkowych ustawieniach programu uruchamiającego (np. &amp;lt;code&amp;gt;--prop:/sim/terrasync/http-server=http://flightgear.sourceforge.net/scenery&amp;lt;/code&amp;gt;) lub kliknij przycisk „Pokaż więcej” po prawej stronie i wybierz serwer DNS.&lt;br /&gt;
&lt;br /&gt;
Patrz post na forum: [https://forum.flightgear.org/viewtopic.php?p=438783 Network errors occurred]&lt;br /&gt;
&lt;br /&gt;
=== X-y nie działają / są uszkodzone / złe / nie uruchamiają się ===&lt;br /&gt;
FlightGear jest bardzo skomplikowanym programem. Jeśli potrzebujesz pomocy w ogólnym użytkowaniu symulatora, znajdziesz ją na [[Portal:User|portalu Użytkownika]] oraz na {{forum link|text=forum FlightGeara}}.&lt;br /&gt;
&lt;br /&gt;
Jeśli Twoim problemem jest zawieszanie się oprogramowania, otrzymujesz błędy itp., rozważ zastosowanie się do wskazówek zawartych na stronie [[Troubleshooting problems|rozwiązywania problemów]].&lt;br /&gt;
&lt;br /&gt;
Niektóre z najczęściej występujących problemów są jednak wymienione poniżej. Jeśli nie możesz rozwiązać problemu samodzielnie i potrzebujesz pomocy kogoś, proszę pamiętaj, że jesteśmy ''wszyscy'' tutaj dla zabawy, deweloperzy również, i że każda pomoc ''jest'' aktem hojności. Więc postaraj się być miły, nawet jeśli problem cię frustruje.&lt;br /&gt;
&lt;br /&gt;
=== Co się stało z panelem, klawiaturą itp.? ===&lt;br /&gt;
Problemem jest prawie na pewno to, że Twój pakiet bazowy (FGData) nie jest zsynchronizowany z FlightGearem. Wiele konfigurowalnych części FlightGeara jest zdefiniowanych w plikach [[XML]] zawartych w pakiecie podstawowym.&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego FlightGear działa tak wolno? ===&lt;br /&gt;
Jeśli wydaje Ci się, że FlightGear działa zbyt wolno, sprawdź w [[Howto: Improve Framerates]], czy możesz pokombinować z ustawieniami grafiki.&lt;br /&gt;
&lt;br /&gt;
Jeśli wszystko działa skrajnie wolno (np. ~1 klatka na sekundę), być może sprzętowa akceleracja 3D nie jest aktywna. Upewnij się, że masz zainstalowane biblioteki OpenGL i [[Graphics drivers configuration|poprawnie skonfigurowane]] oraz upewnij się, że masz najnowsze sterowniki do swojej karty graficznej. Bądź również świadomy, że niektóre karty graficzne [[Problematic Video Cards|nie są zbyt dobrze wspierane]].&lt;br /&gt;
&lt;br /&gt;
=== Jak sprawdzić liczbę klatek na sekundę? ===&lt;br /&gt;
&lt;br /&gt;
W symulatorze idź do menu &amp;quot;Widok&amp;quot; &amp;gt; &amp;quot;Opcje widoku&amp;quot; i zaznacz tam opcję &amp;quot;Show frame rate&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Jak zmienić ustawienia kokpitu 2D? ===&lt;br /&gt;
&lt;br /&gt;
Aby pokazać/ukryć panel 2D użyj kombinacji klawiszy {{Key press|Shift|P}}. Aby wyświetlić/ukryć HUD, naciskaj klawisz {{Key press|Shift|H}}. Możesz też włączyć alternatywny HUD przez naciśnięcie {{Key press|Shift|I}} (naciśnij {{Key press|I}} aby wrócić do domyślnego). Klawiszem {{Key press|Shift|H}} dostosujesz jasność HUD-a.&lt;br /&gt;
&lt;br /&gt;
=== Utknąłem do góry nogami po rozbiciu się? ===&lt;br /&gt;
&lt;br /&gt;
Szybką odpowiedzią jest zresetowanie symulatora, poprzez menu &amp;quot;Plik&amp;quot; &amp;gt; &amp;quot;Zresetuj&amp;quot;. To ustawi twój samolot z powrotem w pozycji startowej.&lt;br /&gt;
&lt;br /&gt;
Alternatywnie naciśnij {{Key press|Ctrl|U}} (w domyślnej konfiguracji), aby podnieść samolot o 1000 stóp.&lt;br /&gt;
&lt;br /&gt;
Dla upartych: sztuczka do nauki. Aby wrócić do normalnej (nie odwróconej) pozycji, wznieś się o 500 stóp i obróć się przy użyciu lotek o 180*. Pamiętaj, sterowanie działa odwrotnie gdy jesteś do góry nogami i utrzymuj prędkość!&lt;br /&gt;
&lt;br /&gt;
=== Dlaczego najnowsze wersje niektórych samolotów nie działają w mojej (starszej) wersji FlightGeara? ===&lt;br /&gt;
Często rozwój nowych samolotów nadąża za rozwojem kodu FlightGeara. Nowe lub nowo zmodyfikowane samoloty mogą korzystać z plików (takich jak nowe pliki instrumentów) lub funkcji dostępnych tylko w nowszych wersjach FlightGeara. Jeśli utknąłeś w starszej wersji FlightGeara, możesz spróbować pobrać wcześniejszą wersję samolotu z odpowiedniego [[FlightGear_hangars#Official_hangars|oficjalnego hangaru]] FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Kiedy uruchamiam FlightGear widzę błąd wspominający o &amp;quot;SQLite&amp;quot;. Co mam zrobić? ===&lt;br /&gt;
&lt;br /&gt;
Od wersji FlightGear v2.10 (wydanej w lutym 2013) wprowadzono [[navdata cache|pamięć podręczną navdata]], aby poprawić czas uruchamiania FlightGeara. Ta pamięć podręczna to baza danych SQLite, która czasami jest trochę niestabilna. Jeśli baza danych jest uszkodzona, FlightGear nie będzie mógł się uruchomić.&lt;br /&gt;
&lt;br /&gt;
Aby to naprawić musisz po prostu usunąć plik &amp;lt;code&amp;gt;[[$FG_HOME]]/navdata.cache&amp;lt;/code&amp;gt;. Przy pierwszym uruchomieniu FlightGeara, po usunięciu pliku, pamięć podręczna navdata zostanie odbudowana. Ponieważ proces ten jest czasochłonny, uruchomienie FlightGeara zajmie więcej czasu.&lt;br /&gt;
&lt;br /&gt;
Niektórzy uciekają się do usunięcia całego katalogu &amp;lt;code&amp;gt;$FG_HOME&amp;lt;/code&amp;gt; lub nawet ponownej instalacji FlightGeara. Jednak żadne z nich nie jest potrzebne i może spowodować utratę wszelkich skonfigurowanych niestandardowych preferencji.&lt;br /&gt;
&lt;br /&gt;
Kolejnym wskaźnikiem problemu związanego z SQLite jest komunikat o błędzie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
   Sqlite error:attempt to write a readonly database (8) while running:&lt;br /&gt;
      INSERT OR REPLACE INTO stat_cache (path, stamp) VALUES (?,?)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W takim przypadku, wcześniej uruchomiona instancja FlightGeara może nadal działać i blokować plik navdata.cache. Sprawdź, czy działa inny proces fgfs i zakończ go.&lt;br /&gt;
&lt;br /&gt;
=== Mój samolot ma szare okna? ===&lt;br /&gt;
Problem nieprzejrzystych szarych okien, prze które nie można nic zobaczyć, jest najczęściej spowodowany niezgodnością wersji programu FlightGear i samolotu. Lub może to być spowodowane efektem okna, który nie jest zgodny z systemami renderowania [[Project Rembrandt|Rembrandt]] lub [[ALS]]. Przyczyną techniczną jest niezgodność renderera i zadeklarowanego efektu dla okna. Niektóre rozwiązania obejmują:&lt;br /&gt;
&lt;br /&gt;
* Jeśli używasz stabilnej wersji FlightGeara, pobierz samolot z [[FlightGear_hangars#Official_hangars|oficjalnego hangaru]] pasującego do Twojej wersji FlightGeara.&lt;br /&gt;
* Jeśli używasz najnowszej wersji z [[FlightGear Build Server|builda nocnego]] lub [[Building FlightGear|samodzielnie skompilowanej wersji FlightGeara]] lub chcesz używać najnowocześniejszego samolotu, zobacz [[FGAddon#Obtaining aircraft|FGAddon - pozyskiwanie samolotu]].&lt;br /&gt;
* Jeśli korzystasz z samolotu z jednego z [[FlightGear_hangars#Unofficial_sites|nieoficjalnych hangarów]], najlepiej skontaktuj się z oryginalnym autorem samolotu lub osobą odpowiedzialną za ten hangar.&lt;br /&gt;
* Jeśli używasz [[Project Rembrandt|Rembrandta]], spróbuj wyłączyć ten system renderowania. Samoloty, które używają &amp;lt;code&amp;gt;model-default.eff&amp;lt;/code&amp;gt; dla okien (prostym kosztem nierobienia niczego) zamiast &amp;lt;code&amp;gt;model-transparent.eff&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;model-combined-transparent .eff&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;glass.eff&amp;lt;/code&amp;gt; (które instruują Rembrandta, aby nie używał odroczonego renderowania dla szyb) będą miały szare okna podczas używania Rembrandta.&lt;br /&gt;
&lt;br /&gt;
=== Mój ekran staje się całkowicie czerwony zaraz po uruchomieniu FlightGear ===&lt;br /&gt;
Czerwony ekran to wizualizacja efektu &amp;quot;redout&amp;quot; (napływ krwi do głowy pilota z powodu zbyt dużych przeciążeń). Jeśli pojawia się zaraz po uruchomieniu FlightGeara, może to być spowodowane problemem z ładowaniem scenerii. FlightGear ładuje scenerię w locie, a jeśli scenerii nie można załadować, np. ze względu na problemy z siecią, może nie być podłoża, na którym można zlokalizować statek powietrzny. W rezultacie samolot spada przez nieistniejący grunt, zaczynając się przewracać doprowadzając do nadmiernych przeciążeń. To z kolei powoduje efekt czerwonej planszy. Aby zweryfikować problem, należy rozpocząć lot w KSFO, którego sceneria jest już zawarta w pakiecie podstawowym.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Z kim się kontaktować w sprawie tego FAQ? ===&lt;br /&gt;
Dodaj komentarz na temat FAQ [[Talk:Frequently asked questions|na tej stronie]].&lt;br /&gt;
&lt;br /&gt;
=== Jak stary jest ten dokument? ===&lt;br /&gt;
Sprawdź jego &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:{{PAGENAME}}|action=history}} historię]&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Jaką inną dokumentację powinienem przeczytać? ===&lt;br /&gt;
* [[Pl/Podręcznik_FlightGear|Podręcznik FlightGear]]&lt;br /&gt;
* [[Pl/Nowy_w_FlightGear|Nowy we FlightGear]]&lt;br /&gt;
* Zobacz także katalog FlightGear/docs-mini/ w dystrybucji źródłowej, aby znaleźć różne inne przydatne dokumenty.&lt;br /&gt;
&lt;br /&gt;
== Wkład własny ==&lt;br /&gt;
&lt;br /&gt;
=== Ochrona treści ===&lt;br /&gt;
{{See also|FlightGear Plugins}} DRM&lt;br /&gt;
{{Cleanup}}&lt;br /&gt;
&lt;br /&gt;
Co jakiś czas pojawia się pytanie, czy dostarczanie do do FlightGeara zamkniętego kodu źródłowego wtyczki (dokładniej wtyczki czytnika plików OSG) jest legalne. Jedyną potrzebą trzymania kodu w pobliżu jest zapobieganie inżynierii wstecznej.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/27996073/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Content protection for modders? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Paul Guhl &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 25th, 2011 &lt;br /&gt;
  |added  =  Aug 25th, 2011 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Soitanen (Aug 28th, 2014). {{forum link|title=Re: Encrypted aircraft dynamics|p=217378}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34559749/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] External FDM to protect propriety data in a GPL&lt;br /&gt;
	eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Alan Teeder &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 21st, 2015 &lt;br /&gt;
  |added  =  Oct 21st, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear w obecnej postaci jest efektem pracy wielu ludzi, którzy dobrowolnie pracują nad wspólnym wysiłkiem stworzenia otwartej i rozszerzalnej platformy symulatora lotu. Sam Twój pomysł wprowadzenia DRM jest wbrew wszelkim zasadom open source.&lt;br /&gt;
&lt;br /&gt;
Możesz swobodnie stworzyć samolot dla FlightGeara na licencji własnościowej - to są dane z perspektywy symulatora i nie uruchamiają licencji. Możesz to sprzedawać, nie pozwalając na ponowną dystrybucję kodu źródłowego. Musisz trzymać się z dala od kilku rzeczy (nie możesz używać ogólnych instrumentów, bibliotek Nasal,...) ale to powinno być do zrobienia. Możesz pobierać opłaty licencyjne za taki samolot i nikt nie może go redystrybuować.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dane są analizowane z XML-a do dynamicznych tabel wyszukiwania (IE. STL). Jedynymi zasobami używanymi poza tym, co jest potrzebne do stworzenia funkcji FDM, jest narzut związany z wyciąganiem danych z pliku XML do pamięci. To musiałoby się zdarzyć bez względu na to, w jakiej formie były dane.&lt;br /&gt;
Chociaż mogą istnieć lepsze sposoby przechowywania danych niż XML-e, jeśli nie przejmujesz się interakcją człowieka z danymi. Myślę, że uczynienie danych czytelnymi/edytowalnymi dla człowieka jest głównym celem używania XML-i. Może być zbyt gadatliwy, ale działa i istnieją standardowe biblioteki do odczytu/parsowania plików XML, dzięki czemu używanie ich do wprowadzania danych jest dość proste. Jest to korzystne zarówno dla FlightGeara, jak i JSBSim pod względem ograniczenia złożoności obsługi danych konfiguracyjnych. Ponadto istnieje ograniczona liczba standardowych formatów dla tego typu rzeczy, takich jak JSON, a wszystkie te, które są czytelne/edytowalne przez człowieka, mają wiele takich samych problemów jak XML.&lt;br /&gt;
W pełni funkcjonalne FDM są złożone, a zrozumienie XML-a używanego do konfiguracji złożonego FDM jest bardzo drobnym problemem, a każdy, kto faktycznie rozumie w pełni funkcjonalny FDM, będzie miał bardzo niewiele problemów z częścią XML.&amp;lt;ref&amp;gt;hvengel (Aug 28th, 2014). {{forum link|title=Re: Encrypted aircraft dynamics|p=217408}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear sam w sobie jest OpenSource, więc niezależnie od tego, w jakim systemie DRM chcemy zakodować dane, każdy może go usunąć (i jest to całkiem legalne). Nie trzeba się zastanawiać, aby wygenerować wersję FlightGear bez ochrony praw autorskich i rozpowszechnić ją, na której Twoja treść działa bez klucza (lub czegokolwiek innego). Biorąc pod uwagę, że ludziom zwykle udaje się złamać schematy DRM przy braku otwartego kodu źródłowego, próba zrobienia tego z kodem źródłowym otwartym dla każdego wydaje się po prostu stratą czasu. Po drugie, jakikolwiek format pliku odczyta OSG, zanim dotrze do renderera, musi być tablicą wierzchołków. Renderer tego potrzebuje, na etapie GLSL nie ma deszyfrowania. Więc są szanse, że skoro działamy na *Open*GL, to znowu każdy, kto naprawdę chce, może wypisać niezaszyfrowany format.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponieważ FlightGear jest open source, niezwykle łatwo jest dodać kod, aby uzyskać dostęp do grafu sceny 3D i wyodrębnić pełny model samolotu (z wyłączeniem skryptów, chociaż można je odtworzyć). Informacje po prostu tam siedzą, w pełni widoczne i gotowe do pobrania z gałęzi OSG jak duża soczysta brzoskwinia. Prawdopodobnie mógłbym napisać ten kod w pół dnia, ale konwersja do formatu AC3D, tekstur PNG itp. w celu odtworzenia nowej kopii samolotu zajęłaby trochę więcej czasu. Gdyby FlightGear miał zamknięty kod źródłowy, napisanie kodu ekstraktora OSG byłoby znacznie trudniejsze, ale mimo to nadal wykonalne.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076297/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Edward d'Auvergne &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Właśnie z tego powodu mamy wsparcie dla katalogów i zewnętrznych hangarów. Oczywiście chcemy zachęcać do tworzenia samolotów na licencji GPL, ale nie każdy twórca samolotów chce lub może udostępniać swoje prace na licencji GPL. FlightGear szanuje i wspiera tę opcję.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076199/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] botom line: if i don't my aircraft to be&lt;br /&gt;
 subject to GPL FGAddon clauses &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Stuart Buchanan &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z pewnością można uruchomić model FDM z zewnątrz i użyć jednej z wielu opcji sieciowych I/O we FlightGear, aby przesyłać dane tam i z powrotem. W przeszłości zrobiono to w kilku projektach badawczych, aby wykorzystać FlightGear jako narzędzie do wizualizacji. Co za tym idzie, możesz zrobić to samo w przypadku skryptów - uruchomić skrypty na zewnątrz i wchodzić w interakcje z FlightGearem za pośrednictwem jednego z tych protokołów.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35076187/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Stuart Buchanan &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 10th, 2016 &lt;br /&gt;
  |added  =  May 10th, 2016 &lt;br /&gt;
  |script_version = 0.39 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli faktycznie spróbujesz pobierać opłatę 100$ za samolot dla FlighGear, nie znajdziesz zbyt wielu klientów, ponieważ FG jest popularny głównie w społeczności OpenSource. Jeśli sprawisz, że będzie to zbyt kłopotliwe za pomocą DRM-ów, być może ktoś spróbuje to obejść dla zasady (ludzie robią to dla sportu) - nie jest łatwo sprawić by wieloplatformowy DRM nie był irytujący dla użytkowników.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074186/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Należy pamiętać, że bez względu na format źródłowy (dll, zaszyfrowany + podpisany, binarny itp.), ostatecznie siatka modelu, tekstury i struktura logiczna są wczytywane do wewnętrznych struktur klas OSG. Po zakończeniu tego procesu, aby model mógł zostać wyrenderowany na ekranie, osoba może wywołać odpowiednią funkcję write*File() w celu zapisania poddrzewa modelu w dowolnym obsługiwanym formacie. Jedyne, co jest potrzebne, to dostęp do kodu źródłowego FlightGeara, aby wstawić wywołanie funkcji w strategicznym miejscu. W ostatecznym rozrachunku nie możesz całkowicie chronić swojej treści, jeśli nie masz pełnej kontroli nad sytuacją na poziomie kodu źródłowego aplikacji. I jest to klasyczna strategia hakowania ochrony przed kopiowaniem, wstawiaj magię do kodu po uwierzytelnieniu/załadowaniu/dekodowaniu formatu dystrybucji, a następnie zapisz go w &amp;quot;odszyfrowanym&amp;quot; formacie. Ludzie robią to cały czas, nawet z zastrzeżonym kodem. Wartość celu zwykle określa, jak ciężko są skłonni pracować, aby go ukraść.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074534/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.38 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodanie wsparcia dla DRM do FlightGear nie nastąpi - skrypty Nasal są domyślnie dostarczane w formacie zwykłego tekstu (podobnie jak JavaScript), natomiast zaciemnianie jest oczywiście możliwe, jednak nie ma to żadnego sensu w kontekście FlightGear jako projektu otwarto źródłowego.&lt;br /&gt;
&lt;br /&gt;
Ponadto skrypty mogą być łatwo udostępniane i uruchamiane przez użytkowników, po prostu je wymieniając lub kopiując.&lt;br /&gt;
&lt;br /&gt;
Nawet gdybyś zrzucił pośredni kod bajtowy Nasal do pliku obiektowego i wykonał to za pomocą maszyny wirtualnej Nasal, nie byłoby możliwości wyegzekwowania DRM.&lt;br /&gt;
&lt;br /&gt;
Oczywiście, ponieważ FlightGear jest open source, możesz po prostu dodać obsługę DSO/wtyczek do rozwidlenia FlightGear i oprzeć całą swoją pracę na tym rozwidleniu - z drugiej strony, twoje modyfikacje nadal będą musiały być udostępniane.&lt;br /&gt;
&lt;br /&gt;
Istnieje sposób na tworzenie legalnych dodatków z zamkniętym kodem źródłowym: możesz napisać cały &amp;quot;tajny&amp;quot; kod C++ jako zewnętrzną aplikację i pozwolić jej komunikować się z FlightGearem za pośrednictwem gniazd sieciowych. To powinno działać w miarę dobrze. Ale nie oczekuję, że zdobędziesz wielu klientów. Przede wszystkim, przynajmniej w Linuksie, nikt nie chce uruchamiać binarnych blobów, które mogłyby z łatwością wymazać katalog domowy podczas zabawy we FlightGear. A potem dzieje się tyle darmowych samolotów, z dużym rozmachem, że prawdopodobnie zawsze będziesz w tyle. A ci programiści mają bliskie powiązania z (lub są) programistami FlightGeara, więc mają tę zaletę, że mogą w dowolnym momencie zmienić kod FlightGeara według własnych upodobań. Mogą zmieniać interfejs do woli, a ty musisz nadrobić zaległości i zająć się reklamacjami klientów, którzy nagle siadają na zepsutym binarnym blobie, który nie działa z ostatnią wersją FlightGeara. I wreszcie, to podejście do gniazd działa tylko za pośrednictwem systemu właściwości i jest otwarte do wglądu dla każdego (oprócz niedawno dodanej półtajnej właściwości wektora śmieci).&lt;br /&gt;
&lt;br /&gt;
FlightGear nie ma możliwości ładowania samolotów z bibliotek współdzielonych. Możesz rozpowszechniać swój samolot na licencji zastrzeżonej, tak jak robi to Vitos, ale nie jako biblioteka współdzielona. Zmiana we FlightGear, aby mógł ładować samoloty z bibliotek współdzielonych, wymagałaby dużo pracy. Kto miałby to robić i dlaczego ktokolwiek miałby to robić, skoro mógłby poświęcić swój czas na ulepszanie wolnego oprogramowania? I dlaczego główni twórcy FlightGear mieliby akceptować taki wkład?&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073736/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared library, and what  legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Ludovic Brenta &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Realistycznie patrząc, jeśli chcesz sprzedać komercyjny samolot, twoją bazą klientów będzie Flight Sim X, X-Plane, Prepar3D. Po prostu nie uzyskasz żadnej przyczepności w ekosystemie FlightGear. Nie jest on do tego stworzony.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074166/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; geneb &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poza tym obsługa języka skryptowego OSG (lua) nie może uzyskać dostępu do wszystkich wewnętrznych funkcji Nasal, po prostu dlatego, że we FlightGear nie zaimplementowano kodu łączącego. Więc nie ma żadnych właściwości dla ciebie i żadnego dostępu do wewnętrznego wywołania funkcji, które zapewnia Nasal.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074133/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Erik Hofman &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Posiadasz prawa autorskie do swojej pracy, nawet jeśli wydasz ją na licencji GPL i możesz dalej rozwijać swoją pracę i wydać bardziej kompletną wersję na licencji komercyjnej, jeśli tylko chcesz (jest to wariant podwójnej licencji). Jedynym sposobem, aby nie zachować praw autorskich do tego, co robisz, jest przeniesienie ich na kogoś innego lub zrzeczenie się ich poprzez udostępnienie swojej pracy jako domeny publicznej. Jeśli stworzysz model 3D dla samolotu FG i nadasz mu licencję GPL, nikt nie zabroni Ci adaptacji i sprzedaży go dla X-Plane. W rzeczywistości możesz go sprzedawać również dla FG (ale inni mogą go redystrybuować, jak im się podoba, gdy go kupią, ponieważ jest to GPL, więc może to nie być zbyt opłacalny model biznesowy).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073832/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Czy inne symulatory oferują szyfrowanie lub ochronę zawartości? Na przykład udało mi się zlokalizować i przetestować wtyczkę blendera, która może otworzyć wiele modeli samolotów MSFS. A jak z X-Plane?  Minął *długi*, *długi* czas, odkąd majstrowałem przy ich pakiecie, ale w tamtym czasie zwracałem uwagę, że wszystkie ich formaty 3D były otwarte i dobrze zdefiniowane. Często komercyjne symulatory przechowują rzeczy we własnych formatach binarnych, ale w większości przypadków nie są one zaszyfrowane, a użytkownicy końcowi dość szybko je odszyfrowują -- więc mogą edytować lub tworzyć nową zawartość w tym samym formacie. Nie uważałbym formatu binarnego za schemat ochrony treści, zwłaszcza w projekcie typu open source, w którym źródło do ładowania i przechowywania formatu binarnego jest łatwo dostępne.  Rozumiem pragnienie twórców treści, aby nie dać się „oszukać”. Ale zrozum też, że jednym z głównych powodów, dla których FlightGear może odnieść sukces, jest to, że cały kod źródłowy i zawartość są otwarte. Gdybyśmy nie otworzyli wszystkiego, nie otrzymalibyśmy prawie takiej samej liczby datków wolontariuszy, a wysokiej jakości wolontariat jest kluczowym powodem, dla którego FlightGear odniósł taki sukces. Gdybyśmy byli zamkniętą organizacją komercyjną, kto chciałby się włączyć i pomóc komuś innemu zarabiać pieniądze? Ale gdy wszystko jest otwarte, wiesz, że wszyscy inni mogą cieszyć się takim samym wkładem, tak samo jak Ty cieszysz się wkładem wszystkich innych. Istnieje kilka oszustów, którzy próbują zarobić na pracy innych ludzi i chętnie kłamią i wprowadzają w błąd, aby wyłudzić jak najwięcej pieniędzy od niczego niepodejrzewających użytkowników końcowych. Prawda jest taka, że ​​ci ludzie zawsze istnieli i zawsze będą istnieć. Są niezwykle skrupulatni i uporczywi w kopiowaniu rzeczy, posuwają się nawet do łamania schematów ochrony przed kopiowaniem, przeprowadzania inżynierii wstecznej projektów sprzętu, kopiowania dokładnego wyglądu produktów (nawet łącznie z logo). To nie jest problem, który jest unikalny dla projektu FlightGear -- i jest to coś, z czym wciąż byśmy się borykali, bez względu na to, jak ciężko pracowaliśmy nad stworzeniem schematów ochrony przed kopiowaniem. Jeśli zaprojektowałeś format zawartości binarnej, ktoś dokona inżynierii wstecznej. Jeśli zaprojektujesz schemat szyfrowania, ktoś po prostu zmodyfikuje kod symulatora, aby zrzucić odszyfrowaną wersję po załadowaniu jej do pamięci przez zastrzeżoną wtyczkę deszyfrującą (o ile nie złamie schematu szyfrowania lub nie ukradnie kluczy szyfrowania). We wszystkich tych przypadkach zawartość nadal można łatwo kopiować, replikować, sprzedawać itp. Najlepszy schemat, jaki widziałem, to taki, który ma klucz blokady węzła, który będzie działał tylko na jednym komputerze (klucz przypisany do adresu mac lub identyfikatora procesora). Oznacza to jednak bardziej skomplikowaną dwuetapową instalację, w której użytkownik musi wrócić do Ciebie po zainstalowaniu produktu, zgłosić swój unikalny identyfikator, uzyskać klucz, a następnie zainstalować ten klucz, zanim będzie mógł działać. Problem z tym wszystkim polega na tym, że w projekcie open source ktoś może po prostu skompilować nową wersję symulatora, która pomija sprawdzanie klucza lub akceptuje trywialny klucz lub dowolny klucz. Zastanawiam się tutaj nad różnymi możliwościami, ale mam nadzieję, że widzisz, że to, co na pierwszy rzut oka wydaje się prostą prośbą, w rzeczywistości jest dość złożone i w dalszym ciągu powoduje różnego rodzaju problemy (zarówno pod względem technicznym, jak i ze wsparciem użytkowników). Ostatecznie złoczyńcy i tak zazwyczaj znajdują obejścia i nie są zbytnio spowalniani. Kiedy rolnicy uprawiają rośliny, muszą znosić chwasty. Możemy spróbować rozsądnych rzeczy, aby zminimalizować chwasty, ale jeśli jesteś zbyt agresywny w zabijaniu chwastów i nie tolerujesz ani jednego, najprawdopodobniej zabijesz również większość swoich upraw. Dlatego uważam, że jest to coś, z czym musimy się po prostu pogodzić. Możemy spróbować podjąć rozsądne kroki, aby zminimalizować problem, ale nie możemy wyeliminować wszystkich złych osób bez szkody dla wszystkich dobrych rzeczy w naszym projekcie.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/27998023/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Content protection for modders? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 25th, 2011 &lt;br /&gt;
  |added  =  Aug 25th, 2011 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kiedy już rozpowszechniłeś kod źródłowy na licencji GPL, wyraźnie zadeklarowałeś, że każdy ma prawo do redystrybucji i modyfikacji - o ile nie rozpowszechnia go na innej licencji. Ale ty, jako właściciel praw autorskich, możesz zmienić licencję dla nowej wersji kodu, której jeszcze nie rozpowszechniałeś na licencji GPL - o ile modyfikacje te nie zostały dokonane przez innych, tj. Ty, jako jedyny posiadacz praw autorskich, możesz również rozpowszechniać go na kilku licencjach jednocześnie, np. GPL i niektórych licencjach własnościowych (czyniąc go wartym pieniędzy, które ludzie mogą za niego zapłacić, dzięki szybszym poprawkom błędów, dystrybuowanym tylko do płacących klientów itp.).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073990/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Jens Thoms Toerring &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inną rzeczą do rozważenia jest to, że dystrybucja Twojego statku powietrznego jako .dll lub .so nie ukryła by ani nie zaciemniła by Twojego kodu i tekstur po załadowaniu ich do struktur symulatora w celu renderowania. Reszta FlightGeara jest open source, więc wstawienie wywołania funkcji OSG, aby zapisać samolot (modele i tekstury) w innym popularnym formacie 3D, nie wymagałoby wiele wysiłku.  Spowodowałoby to pewne straty w zakresie organizacji plików źródłowych, ale mimo to dałoby miejsce startu komuś, kto zamierza skopiować lub zmodyfikować pracę. Cała konfiguracja XML także powinna być dostępna za darmo w drzewie właściwości. Licencjonowanie Nasal (jak sądzę) jest napisane w sposób, który utrudnia dystrybucję zastrzeżonego kodu Nasal. Zatem stworzenie samolotu dla FlightGear zabezpieczonego przed modyfikacjami, nie mówiąc już o kopiowaniu, wiązałoby się z pewnymi naprawdę poważnymi wyzwaniami.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35073896/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kluczem do projektu open source nie jest to, czy możesz wygrać spór prawny, czy nie. Chodzi raczej o to, aby przede wszystkim unikać wszelkich sporów prawnych i to za wszelką cenę. To znaczy trzymać się z dala od sądu. Aby bezpiecznie użyć czegoś takiego w projekcie open source, sugerowałbym coś w następujący sposób: &lt;br /&gt;
* Upublicznienie swojego produktu pochodnego w całości (ale bez licencji, mówiąc, że jest to materiał chroniony prawem autorskim), &lt;br /&gt;
* Zwrócenie się do właścicieli oryginalnego produktu i przekazanie im linku do produktu pochodnego, &lt;br /&gt;
* Poproszenie ich o publiczne oświadczenie, że produkt pochodny może być licencjonowany przy użyciu licencji „GPLv2 lub nowszej wersji”, &lt;br /&gt;
* Pamiętaj, aby poprosić ich o zidentyfikowanie publicznego produktu pochodnego jako łącza i zidentyfikowanie wszystkich jego części (aby uniknąć późniejszego stwierdzenia, że ​​​​umieściłeś fragmenty chronionego materiału).&lt;br /&gt;
&lt;br /&gt;
Kopię zapasową każdego oświadczenia złożonego w sieci można znaleźć w archiwum internetowym (http://web.archive.org/). Aby uprościć ten proces, możesz sporządzić część oświadczenia opisującą w całości produkt pochodny, ze wszystkimi szczegółami. Dzięki temu nie będzie już żadnych odcieni szarości! Jeśli chętnie to zrobią, to z prawnego punktu widzenia nie będzie problemu z ich użyciem (tj. szara sytuacja zmieniła się w białą). Jeśli nie są zadowoleni z Twojej propozycji, pewnego dnia mogą odwrócić się i pozwać (tj. szara sytuacja zmieniła się w czystą czerń).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34561220/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] External FDM to protect propriety data in a&lt;br /&gt;
 GPL eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Edward d'Auvergne &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 22nd, 2015 &lt;br /&gt;
  |added  =  Oct 22nd, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Świat open source zależy od warunków licencji i praw autorskich oraz współpracy i zaufania w celu ochrony naszej pracy. Znosimy niewielki podzbiór ludzi, którzy chcą nadużywać tych warunków i mamy nadzieję, że presja większej grupy utrzyma złych aktorów w ryzach. Czasami istnieje środek prawny, czasami trudno jest coś z tym zrobić, gdy problemy wykraczają poza granice kraju (lub gdy ktoś po prostu chce złamać zasady dla własnych korzyści). Mam jednak wrażenie, że na dłuższą metę większość ludzi jest uczciwa i chce postępować właściwie, a mała grupa, która naprawdę istnieje, aby powodować problemy lub po prostu służyć sobie kosztem innych, nigdy nie przetrwa tak długo, jak większa grupa ludzi o dobrych intencjach. Ostatecznie musisz samodzielnie określić, ile wysiłku włożyłeś w model, ile pieniędzy możesz zarobić na jego sprzedaży, w porównaniu z ryzykiem, że ktoś go sam skopiuje i rozpowszechni, w porównaniu z kosztami prawnymi, aby spróbować ich powstrzymać.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35074534/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] can i distribute my airplane as a shared&lt;br /&gt;
 library, and what legislation issues would that ensue? &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 9th, 2016 &lt;br /&gt;
  |added  =  May 9th, 2016 &lt;br /&gt;
  |script_version = 0.38 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obejścia DRM ===&lt;br /&gt;
&lt;br /&gt;
W jednym z moich poprzednich projektów miałem do czynienia z autorskim modelem dynamiki lotu. Początkowo korzystałem z interfejsu Ethernet, aby mógł działać jako zewnętrzna samodzielna aplikacja. Potem przełączyłem się na dwukierunkowy układ potoków uniksowych, więc mogłem mieć ściślejszą synchronizację z kolejnością wykonania, ale nadal zewnętrzny program był całkowicie niezależny i samodzielny. Chciałbym, aby wszystko było darmowe i otwarte, ale w tym przypadku nie miałem wyboru i było to coś zakupionego od firmy zewnętrznej na surowych warunkach. Czułem, że dwa niezależne, samowystarczalne programy (które mogą ze sobą rozmawiać i wymieniać informacje) stworzyły wystarczającą separację licencji, aby honorować warunki licencji GPL FlightGeara.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34559783/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] External FDM to protect propriety data in a&lt;br /&gt;
 GPL eviirenment &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Oct 21st, 2015 &lt;br /&gt;
  |added  =  Oct 21st, 2015 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na ile to jest warte, FDM „ExternalPipe” został skonfigurowany tak, aby obejmował większość obszarów, których dotknąłeś. Prawdopodobnie nie jest to dokładnie to, czego chcesz, ale oto trochę mojej logiki w tym, jak/dlaczego skonfigurowałem to tak, jak to zrobiłem: &lt;br /&gt;
* Korzystanie z interfejsu sieciowego dodaje trochę indeterminizmu. Czasami pakiety sieciowe są opóźniane lub układają się w stos w zależności od tego, co dzieje się z maszyną, więc nie ma gwarantowanej relacji między symulatorem a dynamiką lotu. &lt;br /&gt;
* Zwykle interfejs sieciowy jest dobry, ale zaobserwowałem czasy, kiedy pakiety docierały tam, gdzie powinny, z dodatkowymi opóźnieniami.  &lt;br /&gt;
* Alternatywnie ustawiam parę „nazwanych potoków”. Potoki są konstrukcją uniksową, dla programu wyglądają jak plik, ale to, co do nich zapisujesz, jest gromadzone i przechowywane do odczytania przez inną aplikację. Niestety nie są one obsługiwane w systemie Windows. Potoki są jednokierunkowe, stąd potrzeba dwóch do komunikacji dwukierunkowej. Potok jest naprawdę prosty: otwierasz go jak każdy inny plik, a jeden proces zapisuje w nim; odczytuje z niego inny proces. W międzyczasie system operacyjny może buforować pewną ilość informacji, dopóki proces odczytujący ich nie złapie. Możesz użyć blokowania odczytów (ostrożnie z tym), aby mieć pewność, że FlightGear i zewnętrzny FDM działają dokładnie tak samo. &lt;br /&gt;
* Potoki oznaczają, że oba procesy będą działać na tej samej maszynie, interfejs sieciowy pozwoliłby procesom działać na oddzielnych maszynach. &lt;br /&gt;
* Interfejs ExternalPipe obsługuje elastyczny interfejs właściwości, więc zewnętrzny proces FDM może wysyłać dowolne pary nazwa/wartość, które chce wysłać, a interfejs sumiennie skopiuje je do drzewa właściwości FlightGeara. Strona FDM może również wysłać listę nazw właściwości, które chciałaby otrzymać w odpowiedzi, a interfejs będzie sumiennie przesyłał je potokiem wychodzącym w każdej klatce. To był miły dodatek, a nazwane potoki mają dużą przepustowość, aby zrobić to czystym tekstem, nawet z wieloma dodatkowymi wartościami właściwości. &lt;br /&gt;
&lt;br /&gt;
Historia: Użyłem tego jako części projektu, który zrobiłem z symulatorem lotu ATC. Mieli własne, zastrzeżone aplikacje do dynamiki lotu, które modelowały konkretny statek powietrzny w samym kodzie. Modele te posiadały całą niezbędną dokumentację źródłową i dane z testów w locie, aby spełnić wymagania testowe certyfikacyjne FAA dotyczące ostatecznego symulatora. Ponadto ten zewnętrzny kod modelował wiele systemów samolotu dla jednej z ich wysokiej klasy symulacji. Wymagało to elastyczności w zakresie wysyłanych tam i z powrotem wartości i umożliwiło mi sterowanie niektórymi wskaźnikami przyrządów bezpośrednio z kodu zewnętrznego.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/31900851/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Feeding FlightGear data through the Protocol&lt;br /&gt;
	Pipe &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Curtis Olson &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 29th, 2014 &lt;br /&gt;
  |added  =  Jan 29th, 2014 &lt;br /&gt;
  |script_version = 0.37 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[de:FAQ]]&lt;br /&gt;
[[en:Frequently asked questions]]&lt;br /&gt;
[[es:Preguntas frecuentes]]&lt;br /&gt;
[[fr:Foire aux questions]]&lt;br /&gt;
[[it:Domande frequenti]]&lt;br /&gt;
[[ja:FAQ]]&lt;br /&gt;
[[nl:veel gestelde vragen]]&lt;br /&gt;
[[pt:FAQ]]&lt;br /&gt;
[[pt-br:Perguntas_frequentes]]&lt;br /&gt;
[[sr:FAQ]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/Opcje_wiersza_polece%C5%84&amp;diff=144157</id>
		<title>Pl/Opcje wiersza poleceń</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/Opcje_wiersza_polece%C5%84&amp;diff=144157"/>
		<updated>2026-04-27T09:29:40Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Opcje IO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|Ten artykuł przedstawia aktualne opcje wiersza poleceń, włączając wersję deweloperską. Aby sprawdzić opcje dla wersji '''FlightGeara 2020.3.x''', zobacz artykuł [[Command line options 2020.3]].}}&lt;br /&gt;
&lt;br /&gt;
'''Opcje wiersza poleceń''' to powszechny sposób informowania aplikacji, co i jak ma robić podczas uruchamiania. We [[FlightGear]] są one używane do wielu rzeczy, od prostych, takich jak wybór samolotu, po złożone, takie jak ruch sieciowy i parametry pogodowe.&lt;br /&gt;
&lt;br /&gt;
Najłatwiejszym sposobem obsługi tych opcji we FlightGear jest użycie narzędzia z graficznym interfejsem użytkownika, takim jak [[FlightGear Qt launcher]]. W ten sposób nie trzeba się nimi w ogóle przejmować.&lt;br /&gt;
&lt;br /&gt;
Są jednak użytkownicy, którzy nie chcą lub nie mogą uruchamiać GUI i dlatego są tym zainteresowani. Ci, którzy ich potrzebują lub po prostu chcą dowiedzieć się więcej o FlightGear, ale nie mają pojęcia, o czym mówimy, mogą przeczytać stronę wiki o ogólnym użyciu [[command line|wiersza poleceń]].&lt;br /&gt;
&lt;br /&gt;
Dobrym miejscem do przechowywania osobistych opcji jest plik o nazwie [[fgfsrc]]. Ten plik jest odczytywany przez FlightGear przy każdym uruchamianiu.&lt;br /&gt;
&lt;br /&gt;
Poniższe listy przedstawiają opcje FlightGear, w tym krótki opis i są posortowane wg kategorii. Pamiętaj, że utrzymywanie aktualności tych list na wiki nie jest łatwym zadaniem. Istnieją również różne wersje FlightGear, które nie mają dokładnie tych samych opcji. Dlatego lepiej sprawdź również swoje wersje za pomocą polecenia &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. Jeśli to polecenie nie powiedzie się, możesz dodać również opcję &amp;lt;code&amp;gt;--fg-root=[ścieżka]&amp;lt;/code&amp;gt;. Co to oznacza, patrz poniżej.&lt;br /&gt;
&lt;br /&gt;
To smutne, ale prawdziwe, że nawet powyższe polecenie nie jest, przynajmniej w Gitcie, cały czas aktualne. W chwili pisania tego tekstu przynajmniej jedna obsługiwana opcja nie jest wyświetlana za pomocą &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. Więc jeśli masz poważne problemy z jakąś opcją, to kod źródłowy, jak zawsze, jest najlepszym źródłem informacji. W pliku ''src/Main/options.cxx'' wszystkie opcje są wymienione na stałe wraz z ich ustawieniem ''domyślnym'' i typem.&lt;br /&gt;
&lt;br /&gt;
Plik [[$FG_ROOT]]/options.xml służy do generowania danych wyjściowych dla &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. To jest powód, dla którego &amp;lt;code&amp;gt;--fg-root=[ścieżka]&amp;lt;/code&amp;gt; musi zostać do tego dodana, jeśli nie jest ustawiona jako zmienna środowiskowa lub jako opcja w fgfsrc.&lt;br /&gt;
&lt;br /&gt;
Sposób użycia z linii komend: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sposób użycia z [[FlightGear Qt launcher]]: idź do zakładki &amp;quot;Ustawienia&amp;quot; i w sekcji &amp;quot;Dodatkowe ustawienia&amp;quot; wpisz poniższe opcje, każda w nowej linii. Wpisane tam opcje mają pierwszeństwo przed tymi zdefiniowanymi przez Qt Launcher. Aby z poziomu Qt Launchera zobaczyć całą listę użytych opcji wiersza poleceń, użyj skrótu klawiszowego {{Key press|Ctrl|L}} lub z menu wybierz &amp;quot;Zobacz listę parametrów&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Legenda sposobu zapisu poniższych opcji =&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt;) - w tym przypadku &amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt; jest aliastem dla &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;, czyli robi dokładnie to samo co &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt; - dwie różne opcje, wykluczające się. Nie można ich użyć jednocześnie, ale są połączone ze względu na wspólny opis.&lt;br /&gt;
# &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt; - dwie różne opcje, które można podać jednocześnie, są połączone ze względu na wspólny opis.&lt;br /&gt;
&lt;br /&gt;
= Wartości dla opcji =&lt;br /&gt;
&lt;br /&gt;
Pewne opcje nie przyjmują wartości, jak np. &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt;, ale są też opcji, dla których powinieneś podać wartość, jak np. dla &amp;lt;code&amp;gt;--fg-root&amp;lt;/code&amp;gt; oraz są też opcje, dla których możesz podać wartość opcjonalnie, np. dla &amp;lt;code&amp;gt;--launcher&amp;lt;/code&amp;gt;. Możesz oddzielić wartość od opcji znakiem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; lub spacją, np.:&lt;br /&gt;
&lt;br /&gt;
    --fg-root=/path/to/fgdata&lt;br /&gt;
    --fg-root /path/to/fgdata&lt;br /&gt;
&lt;br /&gt;
Opcje, które działają jak przełącznik włącz/wyłącz, mogą przyjąć wartości &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; (włącz) lub &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; (wyłącz). Jeśli dla takiej opcji nie podasz żadnej wartości, to z domysłu zadziała ona tak jakbyś przekazała tam &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;, czyli ją włączył, np.:&lt;br /&gt;
&lt;br /&gt;
    --launcher&lt;br /&gt;
&lt;br /&gt;
uruchomi Launcher, co jest równoznaczne z:&lt;br /&gt;
&lt;br /&gt;
    --launcher=yes&lt;br /&gt;
&lt;br /&gt;
Z drugiej strony możesz także przekazać wartość, która wyłączy daną opcję, np.:&lt;br /&gt;
&lt;br /&gt;
    --launcher=no&lt;br /&gt;
&lt;br /&gt;
co spowoduje, że Launcher nie będzie uruchamiany. Poza tym, większość takich opcji zawiera dodatkowo dwa warianty z przedrostkami &amp;lt;code&amp;gt;enable-&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;disable-&amp;lt;/code&amp;gt;, np.:&lt;br /&gt;
&lt;br /&gt;
    --enable-launcher&lt;br /&gt;
&lt;br /&gt;
co także włączy Launcher.&lt;br /&gt;
&lt;br /&gt;
= Opcje ogólne =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Pokaż najbardziej istotne opcje wiersza poleceń.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--verbose&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Pokaż wszystkie opcje wiersza poleceń w połączeniu z &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--version[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz wypisanie informacje o wersji FlighGear i niektórych bibliotek używanych przez program (SimGear, OpenSceneGraph, PLIB).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fg-root=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ główną ścieżkę do danych (tam gdzie FlightGear jest zainstalowany).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fg-scenery=ścieżka[:ścieżka...]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ podstawową ścieżkę scenerii. Domyślnie [[$FG_ROOT]]/Scenery.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fg-aircraft=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ dodatkowe ścieżki katalogów z samolotami (alternatywnie możesz użyć &amp;lt;code&amp;gt;--aircraft-dir&amp;lt;/code&amp;gt;, aby wskazać konkretny samolot w podanym katalogu).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--addon=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ ścieżkę do dodatku. Można użyć tej opcji wielokrotnie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--download-dir=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ główny katalog jako miejsce przechowywania pobranych samolotów i scenerii. Domyślnie dla Windows %userprofile%\FlightGear\Downloads\, dla Linux ~/.fgfs/. Katalog scenerii TerraSync może być dodatkowo określony przez opcję &amp;lt;code&amp;gt;--terrasync-dir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--data=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określa dodatkowy katalog danych podstawowych (FGData), przed katalogiem [[$FG_ROOT]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--terrasync[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-terrasync&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-terrasync&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz automatyczne pobieranie scenerii przez TerraSync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--terrasync-dir=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ katalog gdzie TerraSync będzie przechowywał pobieraną scenerię (domyślnie jest to katalog &amp;quot;TerraSync&amp;quot; w lokalizacji określonej przez &amp;lt;code&amp;gt;--download-dir&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--language=kod&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw język używany przez symulator podany jako kod. Dostępne kody: &amp;lt;tt&amp;gt;ca&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;de&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;en&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;es&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fr&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;it&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pt&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ru&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tr&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;sk&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;zh&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--launcher[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-launcher&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-launcher&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Włącz/wyłącz uruchamianie [[FlightGear Qt launcher|Qt Launchera]]. Bez tej opcji lub gdy wyłączysz, uruchomi się od razu symulator w domyślnej konfiguracji lub w konfiguracji odczytanej z pliku [[Fgfsrc|fgfsrc]] - o ile istnieje.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--splash-screen[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-splash-screen&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-splash-screen&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz ekran powitalny.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--mouse-pointer[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-mouse-pointer&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-mouse-pointer&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz dodatkowy wskaźnik myszy (dla pełnego ekranu dla kart Voodoo).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--browser-app=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ ścieżkę do swojej przeglądarki internetowej aby otworzyć dokumentację statku powietrznego.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:[typ:]właściwość=wartość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw podaną właściwość na zadaną wartość. &amp;quot;Typ&amp;quot; jest opcjonalny i może być: &amp;lt;tt&amp;gt;string&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; lub &amp;lt;tt&amp;gt;bool&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:browser=właściwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Po uruchomieniu symulatora otwórz okno z drzewem właściwości od razu na podanej właściwości (property). Jeśli potrzebujesz więcej okien, to wystarczy dodać kolejne indeksy przy browser, jak &amp;lt;tt&amp;gt;browser[1]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;browser[2]&amp;lt;/tt&amp;gt; itd., np.:&lt;br /&gt;
 --prop:browser=/sim/presets&lt;br /&gt;
 --prop:browser[1]=/devices/status/keyboard/event&lt;br /&gt;
co spowoduje otworzenie dwóch okien z podanymi właściwościami.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--config=/ścieżka/plik.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
::Załaduj dodatkowe właściwości z podanego pliku xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--no-default-config[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włączy/wyłącz nie wczytywanie żadnych domyślnych plików konfiguracyjnych (jak [[Fgfsrc|fgfsrc]]), chyba że wyraźnie określono je za pomocą &amp;lt;code&amp;gt;--config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--units-feet&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt;&lt;br /&gt;
::Używaj stóp (domyślnie) lub metrów do określania odległości.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--allow-nasal-read=ścieżka[:ścieżka...]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Zezwalaj skryptom Nasal samolotu na odczytywanie plików z wymienionych katalogów (oddziel ścieżki dwukropkami lub średnikami w Microsoft Windows). Jako środek bezpieczeństwa, domyślnie skrypty Nasal mogą odczytywać dane tylko z [[$FG_ROOT]] i [[$FG_HOME]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--read-only[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-read-only&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-read-only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz folder [[$FG_HOME]] (lokalizację, w której przechowywane są dane FlightGear użytkownika) tylko do odczytu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ignore-autosave[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-ignore-autosave&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-ignore-autosave&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz ignorowanie pliku autosave, tzn. ustawienia zapisane w tym pliku nie będą wczytywane podczas uruchamiania, ani nie będą zapisywane do tego pliku podczas zamykania symulatora.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--save-on-exit[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-save-on-exit&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-save-on-exit&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz zapisywanie preferencji użytkownika podczas wychodzenia z symulatora.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--restore-defaults[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-restore-defaults&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-restore-defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz resetowanie wszystkich ustawień użytkownika do wartości domyślnych.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--gui[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-gui&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-gui&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz GUI. Wyłączenie GUI oznacza włączenie trybu headless.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--jsbsim-output-directive-file=plik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Rejestrowanie właściwości JSBSim. Podany plik musi zawierać w sobie znacznik &amp;lt;code&amp;gt;&amp;lt;output&amp;gt;&amp;lt;/code&amp;gt; z odpowiednimi opcjami i właściwościami do logowania - patrz [[JSBSim Logging]].&lt;br /&gt;
&lt;br /&gt;
= Funkcje =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--composite-viewer[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-composite-viewer&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-composite-viewer&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz CompositeViewer (widoki w osobnych oknach). Opcje te zostały usunięte z wersji dev, gdzie CompositeViewer jest zawsze włączony.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--panel[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-panel&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-panel&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz tablicę przyrządów 2D.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--freeze[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-freeze&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-freeze&amp;lt;/code&amp;gt;&lt;br /&gt;
::Uruchom w stanie zapauzowanym/odpauzowanym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fuel-freeze[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fuel-freeze&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fuel-freeze&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz nieużywanie paliwa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--clock-freeze[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-clock-freeze&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-clock-freeze&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz zamrożenie upływu czasu. Włączenie jest jednoznaczne z włączeniem pauzy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ai-scenario=scenariusz&amp;lt;/code&amp;gt;&lt;br /&gt;
::Dodaj i włącz nowy scenariusz SI. Dozwolonych jest wiele opcji. Scenariusze znajdują się w [[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ai-models[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-ai-models&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-ai-models&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz podsystem SI (wyłącza to również wyświetlanie modeli innych samolotów w trybie wieloosobowym).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ai-traffic[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-ai-traffic&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-ai-traffic&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz podsystem ruchu generowanego automatycznie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vr[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-vr&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-vr&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz obsługę zestawu wirtualnej rzeczywistości.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--restart-launcher[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-restart-launcher&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-restart-launcher&amp;lt;/code&amp;gt;&lt;br /&gt;
::Uruchom Launcher po zamknięciu symulatora.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--load-tape={plik|url}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wczytaj nagranie wcześniejszej sesji lotu. W przypadku pliku, jeśli plik kończy się na „.fgtape”, jest traktowana jako lokalna ścieżka pliku nagrania. W przeciwnym razie tworzymy ścieżkę lokalną, poprzedzając plik katalogiem taśmy i dopisując „.fgtape”. W przypadku URL-a (zaczynającego się od http:// lub https://) pobieramy zdalne nagranie (które musi być nagrywaniem ciągłym) w tle do nazwy pliku zależnej od adresu URL podczas odtwarzania. Jeśli nazwa pliku zależna od adresu URL już istnieje, zakłada się, że jest to skrócone pobieranie i pobieramy tylko pozostałe dane.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--load-tape-create-video[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-load-tape-create-video&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-load-tape-create-video&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz tworzenie plik wideo podczas odtwarzania taśmy określonej przez &amp;lt;code&amp;gt;--load-tape&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--load-tape-fixed-dt=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustawia tryb fixed delta time podczas odtwarzania taśmy określonej przez &amp;lt;code&amp;gt;--load-tape&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Samolot =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aircraft=nazwa&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--vehicle=nazwa&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Wybierz samolot zgodnie z definicją w pliku -set.xml. Plik jest wyszukiwany w [[$FG_ROOT]]/Aircraft, w katalogu wskazywanym przez zmienną środowiskową $FG_AIRCRAFT oraz w katalogach przekazanych do fgfs przy użyciu &amp;lt;code&amp;gt;--fg-aircraft&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aircraft-dir=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ dokładny katalog, który ma być używany dla samolotu (zwykle nie jest to wymagane, ale może być przydatne). Ścieżka jest względna w stosunku do bieżącego katalogu. Powoduje ominięcie opcji &amp;lt;code&amp;gt;&amp;lt;path-cache&amp;gt;&amp;lt;/code&amp;gt; z pliku autosave_X_Y.xml, a także opcji &amp;lt;code&amp;gt;--fg-aircraft&amp;lt;/code&amp;gt; i zmiennej środowiskowej $FG_AIRCRAFT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--show-aircraft&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wyświetl listę aktualnie dostępnych typów samolotów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--min-status={alpha|beta|early-production|production}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Umożliwia zdefiniowanie minimalnego poziomu statusu dla wszystkich listowanych samolotów, które są w trakcie rozwoju. Zobacz [[Aircraft rating system|System oceny statków powietrznych]], aby uzyskać szerszy opis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--auto-coordination[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-auto-coordination&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-auto-coordination&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz automatyczną koordynację. Domyślnie wyłączone. Gdy włączone ster kierunku będzie reagował stosownie do ruchu lotek.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--livery=nazwa&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wybierz malowanie dla samolotu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--state=wartość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw początkowy stan samolotu na podaną wartość. Stany, które można wykorzystać, zależą od statku powietrznego. Na przykład Cessna 172P ma tylko jeden stan &amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Model lotu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fdm={ada | acms | aisim | balloon | jsb | larcsim | magic | network | pipe | ufo | yasim | external | null}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wybierz podstawowy model dynamiki lotu. LaRCsim (wartość &amp;lt;code&amp;gt;larcsim&amp;lt;/code&amp;gt;) jako przestarzały model został usunięt z wersji dev.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aero=nazwa&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wybierz model aerodynamiki samolotu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--model-hz=n&amp;lt;/code&amp;gt;&lt;br /&gt;
::Uruchom model dynamiki lotu z częstotliwością &amp;quot;n&amp;quot; Hz (iteracje na sekundę).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--speed=n&amp;lt;/code&amp;gt;&lt;br /&gt;
::Uruchom model dynamiki lotu &amp;quot;n&amp;quot; razy szybciej niż w czasie rzeczywistym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--trim[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--notrim[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustabilizuj/nie stabilizuj model dynami lotu (tylko z &amp;lt;code&amp;gt;--fdm=jsbsim&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--on-ground[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--in-air[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Rozpocznij na ziemi (domyślnie) lub w powietrzu. Nie trzeba ustawiać &amp;lt;code&amp;gt;--in-air&amp;lt;/code&amp;gt;, gdy użyte jest &amp;lt;code&amp;gt;--altitude&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Początkowa pozycja i orientacja =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--airport=ICAO&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ lotnisko (e.g. EPWA).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--runway=nr_pasa&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ początkowy pas startowy (wymaga podania &amp;lt;code&amp;gt;--airport&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--parking-id=nazwa&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--parkpos=nazwa&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Określ miejsce postojowe na lotnisku (wymaga podania &amp;lt;code&amp;gt;--airport&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--carrier={name|ID}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ pozycję startową na lotniskowcu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--carrier-position={abeam|FLOLS|name}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ pozycję początkową dla lotniskowca, gdzie możesz użyć wstępnie zdefiniowanej &amp;lt;tt&amp;gt;abeam&amp;lt;/tt&amp;gt; (rozpoczęcie na trawersie z wiatrem) lub &amp;lt;tt&amp;gt;FLOLS&amp;lt;/tt&amp;gt; (rozpoczęcie po podejściu końcowym) lub określ nazwę pozycji parkingowej lotniskowca. Należy również określić lotniskowiec opcją &amp;lt;code&amp;gt;--carrier&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vor=ID&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ pozycję początkową względem VOR-a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vor-frequency=częstotliwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw częstotliwość dla VOR-a podanego w opcji&amp;lt;code&amp;gt;--vor&amp;lt;/code&amp;gt; (wymaga podania opcji &amp;lt;code&amp;gt;--vor&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ndb=ID&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ pozycję początkową względem NDB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ndb-frequency=częstotliwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw częstotliwość dla NDB podanego w opcji &amp;lt;code&amp;gt;--ndb&amp;lt;/code&amp;gt; (wymaga podania opcji &amp;lt;code&amp;gt;--ndb&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fix=ID&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ pozycję początkową względem skrzyżowania.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--offset-distance=nm&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ odległość do punktu odniesienia (mile morskie).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--offset-azimuth=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kurs do punktu odniesienia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lat=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Początkowa szerokość geograficzna (S ze znakiem minus).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lon=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Początkowa długość geograficzna (W ze znakiem minus).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--altitude=stopy&amp;lt;/code&amp;gt;&lt;br /&gt;
::Początkowa wysokość (w stopach, chyba że włączono &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--heading=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kąt kierunku/odchylenia (Psi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--roll=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kąt przechyłu (Phi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--pitch=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kąt pochyłu (Theta).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vc=węzły&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--mach=liczba&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość początkową w węzłach lub w liczbie Macha.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--glideslope=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kąt schodzenia (może być dodatni).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--roc=fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ początkową prędkość pionową w stopach na minutę (wartość może być ujemna).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--uBody=jednostki_na_sek&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość wzdłuż osi X statku (w stopach na sek., chyba że włączono &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vBody=jednostki_na_sek&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość wzdłuż osi Y statku (w stopach na sek., chyba że włączono &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wBody=jednostki_na_sek&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość wzdłuż osi Z statku (w stopach na sek., chyba że włączono &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vNorth=jednostki_na_sek&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość początkową wzdłuż osi północ-południe dla statku.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vEast=jednostki_na_sek&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość początkową wzdłuż osi wschód-zachód dla statku.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vDown=jednostki_na_sek&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ prędkość początkową wzdłuż osi pionowej statku.&lt;br /&gt;
&lt;br /&gt;
= Opcje dźwięku =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--show-sound-devices[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Pokaż listę dostępnych urządzeń audio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--sound-device=nazwa&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ urządzenie audio, którego chcesz użyć. Aby uzyskać dostępne nazwy użyj &amp;lt;code&amp;gt;--show-sound-devices&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--sound[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-sound&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-sound&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wyłącz/wyłącz dźwięk.&lt;br /&gt;
&lt;br /&gt;
= Opcje renderowania =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:/sim/rendering/multi-sample-buffers={true|false}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz bufor wielopróbkowania (antyaliasing).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:/sim/rendering/multi-samples={2|4|8|16}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ liczbę multipróbek (antyaliasing). Prawidłowe wartości to 2, 4, 8, 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aspect-ratio-multiplier=współczynnik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ mnożnik dla współczynnika proporcji.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--bpp={16|24|32}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ głębię kolorów jako liczbę bitów na piksel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--compositor=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ ścieżkę do pliku XML do renderowania wieloprzebiegowego. Ścieżka jest względna do [[$FG_ROOT]] (domyślnie &amp;lt;tt&amp;gt;Compositor/default.xml&amp;lt;/tt&amp;gt;). Dla włączenia potoku HDR użyj ścieżki &amp;lt;code&amp;gt;Compositor/HDR/hdr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--horizon-effect[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-horizon-effect&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-horizon-effect&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz iluzję powiększenia ciała niebieskiego w pobliżu horyzontu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--distance-attenuation[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-distance-attenuation&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-distance-attenuation&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz tłumienie światła na drodze startowej.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--specular-highlight[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-specular-highlight&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-specular-highlight&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz odbicia lustrzane na teksturowanych obiektach.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--clouds[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-clouds&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-clouds&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz dwuwymiarowe (płaskie) warstwy chmur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--clouds3d[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-clouds3d&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-clouds3d&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz trójwymiarowe (wolumetryczne) warstwy chmur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--texture-cache[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-texture-cache&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-texture-cache&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz pamięć podręczną tekstur dla szybkiego wczytywania.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--texture-cache-dir=ścieżka&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ ścieżkę pamięć podręcznej dla tekstur (domyślnie [[$FG_HOME]]/TextureCache).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fullscreen[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fullscreen&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fullscreen&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz tryb pełnoekranowy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--random-objects[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-random-objects&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-random-objects&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz losowe obiekty scenerii (budynki, itp.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wireframe[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-wireframe&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-wireframe&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz tryb rysowania siatki modeli 3D.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fog-disable&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--fog-fastest&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--fog-nicest&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw mgłę. Opcja &amp;lt;code&amp;gt;--fog-disable&amp;lt;/code&amp;gt; wyłączy mgłę, powodując zwiększenie widoczności oraz spadek wydajności (więcej terenu do wyrenderowania). Opcja &amp;lt;code&amp;gt;--fog-fastest&amp;lt;/code&amp;gt; włączy renderowanie mgły w sposób mniej realistyczny, ale zwiększając wydajność. Domyślnie użyta jest opcja &amp;lt;code&amp;gt;--fog-nicest&amp;lt;/code&amp;gt; renderująca realistyczną mgłę, kosztem wydajności. Te opcje sa przestarzałe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fov=stopnie&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kąt pola widzenia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--geometry=SzerokośćxWysokość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ rozdzielczość okna (np.: &amp;lt;code&amp;gt;--geometry=1366x768&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--graphics-preset={minimal-quality|low-quality|medium-quality|high-quality|ultra-quality}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ predefiniowane ustawienie graficzne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--materials-file=plik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ plik materiału używany do renderowanie scenerii, domyślnie: [[$FG_ROOT]]/Materials/regions/materials.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--max-fps=Hz&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ maksymalną liczbę renderowanych klatek na sekundę.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--shading-smooth&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--shading-flat&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz gładkie lub płaskie cieniowanie. Te opcje sa przestarzałe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--texture-filtering=liczba&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ filtrowanie anizotropowe tekstur terenu. Prawidłowe wartości to 1, 2, 4, 8, 16. Wartość domyślna to 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--view-offset=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ domyślny widok do przodu jako odchylenie od kierunku na wprost. Dopuszczalne wartości: &amp;lt;tt&amp;gt;LEFT&amp;lt;/tt&amp;gt; (lewo), &amp;lt;tt&amp;gt;RIGHT&amp;lt;/tt&amp;gt; (prawo), &amp;lt;tt&amp;gt;CENTER&amp;lt;/tt&amp;gt; (wyśrodkuj) lub określona liczba w stopniach.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--terrain-engine={tilecache|pagedLOD}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ silnik terenu, którego chcesz użyć: &amp;lt;tt&amp;gt;tilecache&amp;lt;/tt&amp;gt; lub &amp;lt;tt&amp;gt;pagedLOD&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-levels=poziomy&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ poziomy szczegółowości, gdzie poziomy są ciągiem liczb oddzielonych spacjami. Wartość domyślna to &amp;quot;1 3 5 7 9&amp;quot;. Dostępne tylko z &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-res=rozdzielczość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw rozdzielczość siatki terenu. Domyślnie 1. Dostępne tylko z &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-texturing={bluemarble|raster|debug}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw metodę teksturowania terenu. Domyślnie &amp;lt;tt&amp;gt;bluemarble&amp;lt;/tt&amp;gt;. Dostępne tylko z &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-range-mult=mnożnik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw mnożnik zakresu (punkt od niskiego do wysokiego poziomu szczegółowości). Domyślnie 2. Dostępne tylko z &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--season={summer|winter}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz scenerię letnią (&amp;lt;tt&amp;gt;summer&amp;lt;/tt&amp;gt;) lub zimową (&amp;lt;tt&amp;gt;winter&amp;lt;/tt&amp;gt;) - domyślnie &amp;lt;tt&amp;gt;summer&amp;lt;/tt&amp;gt;. Dostępna do FG 2020.3.&lt;br /&gt;
&lt;br /&gt;
== Sceneria Świata 3.0 (WS3.0) ==&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:/scenery/use-vpb=true&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz Scenerię Świata 3.0&lt;br /&gt;
&lt;br /&gt;
= Opcje wyświetlacza przeziernego (HUD) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hud[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-hud&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-hud&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz wyświetlanie HUD-a, ustawienie domyślne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--anti-alias-hud[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-anti-alias-hud&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-anti-alias-hud&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz antyaliasing dla HUD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hud-3d[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-hud-3d&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-hud-3d&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz HUD 3D.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hud-tris&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--hud-culled&amp;lt;/code&amp;gt;&lt;br /&gt;
::HUD wyświetla liczbę renderowanych trójkątów lub procent odrzuconych trójkątów.&lt;br /&gt;
&lt;br /&gt;
= Opcje czasu =&lt;br /&gt;
&lt;br /&gt;
Poniższe opcje ustawienia czasu i daty nie są ze sobą kompatybilne, więc należy podawać tylko jedną z nich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--timeofday={real|dawn|morning|noon|afternoon|dusk|evening|midnight}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ porę dnia:&lt;br /&gt;
::::&amp;lt;tt&amp;gt;real&amp;lt;/tt&amp;gt;: aktualny czas w danym miejscu;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;dawn&amp;lt;/tt&amp;gt; (świt): czas, kiedy słońce znajduje się pod kątem 90°E na horyzoncie;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;morning&amp;lt;/tt&amp;gt; (poranek): czas, kiedy słońce znajduje się na horyzoncie 75°E;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;noon&amp;lt;/tt&amp;gt; (południe): czas, kiedy słońce znajduje się 0° na horyzoncie;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;afternoon&amp;lt;/tt&amp;gt; (popołudnie): czas, kiedy słońce znajduje 75°W na horyzoncie;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;dusk&amp;lt;/tt&amp;gt; (zmierzch): czas, kiedy słońce znajduje się na horyzoncie pod kątem 90°W;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;evening&amp;lt;/tt&amp;gt; (wieczór): czas, kiedy słońce znajduje się na horyzoncie 100°W;&lt;br /&gt;
::::&amp;lt;tt&amp;gt;midnight&amp;lt;/tt&amp;gt; (północ): czas, kiedy słońce znajduje się na horyzoncie 180°W;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--time-offset=[+-]hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Dodaj podane przesunięcie czasu dla &amp;lt;code&amp;gt;--time-match-real&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--time-match-real&amp;lt;/code&amp;gt;&lt;br /&gt;
::Zsynchronizuj czas z aktualnym czasem w danym miejscu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--time-match-local&amp;lt;/code&amp;gt;&lt;br /&gt;
::Zsynchronizuj czas z czasem systemowym komputera.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--start-date-sys=yyyy:mm:dd:hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ początkową datę i godzinę w odniesieniu do czasu systemowego.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--start-date-gmt=yyyy:mm:dd:hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ początkową datę i godzinę w odniesieniu do czasu Greenwich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--start-date-lat=yyyy:mm:dd:hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ początkową datę i godzinę w odniesieniu do strefy czasowej lotniska początkowego.&lt;br /&gt;
&lt;br /&gt;
= Opcje sieciowe =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--proxy=[nazwa:hasło@]host:port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ serwer proxy i port, który ma być używany. Nazwa użytkownika i hasło są opcjonalne. Jeśli są obecne, powinny być podane jako skróty MD5. Ta opcja jest przydatna tylko wtedy, gdy włączona jest opcja &amp;lt;code&amp;gt;--real-weather-fetch&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--httpd=port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz interfejs [[Phi]] (serwer HTTP) na określonym porcie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--telnet={port|socket,bi,hz,localhost,port,tcp}&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--props={port|socket,bi,hz,localhost,port,tcp}&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Włącz serwer telnet na określonym porcie. Opcjonalnie można zmienić hz (ilość pakietów na sekundę).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--jpg-httpd=port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz serwer HTTP zrzutów ekranu na określonym porcie. Ta opcja została wycofana, zamiast niej użyj &amp;lt;code&amp;gt;--httpd&amp;lt;/code&amp;gt; i użyj URL-a /screenshot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--allow-nasal-from-sockets[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-allow-nasal-from-sockets&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-allow-nasal-from-sockets&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz uruchamianie skryptów Nasal przesyłanych przez gniazdo sieciowe. Włączenie oznacza, że połączenia sieciowe będą miały pełny dostęp do symulatora, w tym uruchamianie dowolnych skryptów Nasal. Upewnij się, że masz odpowiednie zabezpieczenia takie jak zapora, która blokuje połączenia zewnętrzne.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--sentry[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-sentry&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-sentry&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz wysyłanie raportów o awariach i błędach do zespołu programistów w celu analizy.&lt;br /&gt;
&lt;br /&gt;
= Opcje Multiplayer =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--callsign=nazwa&amp;lt;/code&amp;gt;&lt;br /&gt;
::Przypisz pilotowi unikalną nazwę (znak wywoławczy). Znak wywoławczy musi mieć co najwyżej 10 znaków i może zawierać tylko cyfry, litery alfabetu angielskiego, myślniki (-) i podkreślenia (_). Dłuższe znaki wywoławcze są obcinane, a znaki nie pasujące do wymienionych powyżej są zastępowane myślnikami.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--multiplay={in|out},hz,adres,port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ ustawienia komunikacji dla trybu multiplayer. Pierwsze pole określa, czy ustawienia dotyczą komunikacji przychodzącej (in) czy wychodzącej (out). Drugie pole (hz) określa częstotliwość, z jaką mają być wysyłane dane. Trzecie pole (adres) musi być ustawione na adres IP interfejsu sieciowego, którego FlightGear powinien używać do wysyłania/odbierania danych lub pozostawić puste, aby symulator mógł korzystać ze wszystkich dostępnych interfejsów. Czwarte pole (port) powinno być ustawione na wykorzystywany port (zwykle 5000).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fgcom[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fgcom&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fgcom&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz wbudowany [[FGCom]] (głosowa komunikacja z ATC).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hold-short[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-hold-short&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-hold-short&amp;lt;/code&amp;gt;&lt;br /&gt;
::W trybie wieloosobowym, gdy wybierzemy pozycję początkową na pasie startowym, to domyślnie zostaniemy przeniesieni na pozycję hold short, czyli na drodze kołowania, tuż przed pasem. Opcja &amp;lt;code&amp;gt;--disable-hold-short&amp;lt;/code&amp;gt; umożliwia wyłączenie tego zachowania, jednak należy mieć na uwadze, że jest to niepożądane, gdyż może zakłócać innym start czy lądowanie.&lt;br /&gt;
&lt;br /&gt;
= Opcje trasy/punktów na trasie =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wp=ID[@alt]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wprowadź identyfikator punktu trasy (VOR, NDB, fix) do autopilota. Opcjonalna część @alt może służyć do określenia wysokości, na której należy przekroczyć dany punkt, np. OKE@3000 Można użyć tej opcji wielokrotnie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--flight-plan=plik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wczytaj plan lotu z pliku.&lt;br /&gt;
&lt;br /&gt;
= Opcje IO =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--generic=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie za pomocą predefiniowanego interfejsu komunikacyjnego i uprzednio wybranego protokołu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--atlas=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie za pomocą protokołu Atlas (używanego przez Atlas i TerraSync).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--atcsim=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu ATC Sim (atc610x).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie, aby sterować GPS Garmin serii 196/296.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400Sim=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Zestaw ciągów znaków AV400 wymaganych do napędzania GPS-a Garmin serii 400.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400WSimA=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Zestaw ciągów wymaganych wymaganych do sterowania Garmin WAAS GPS (gdzie kanał A wykorzystuje wariant protokołu AVSim400, a kanał B komunikuje się z urządzeniem GPS).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400WSimB=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Patrz opcja &amp;lt;code&amp;gt;--AV400WSimA&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--flarm=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie z wykorzystaniem protokołu FLARM, który zawiera komunikaty NMEA/GPS i raporty o ruchu lotniczym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--garmin=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu Garmin GPS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--igc=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu International Glider Commission (Międzynarodowa Komisja Szybowcowa).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--joyclient=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie z joystickiem Agwagon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--jsclient=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie ze zdalnym joystickiem.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native-ctrls=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu FG Native Controls (przesył informacji o powierzchniach sterowych samolotu).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native-fdm=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu FG Native FDM (przesył informacji o modelu dynamiki lotu).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native-gui=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu FG Native GUI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu FG Native.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--nmea=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie za pomocą protokołu NMEA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--opengc=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu OpenGC (oprogramowanie służące do renderowania wysokiej jakości szklanych kokpitów w symulatorach).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--props={port|socket,bi,5,localhost,port,tcp}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie za pomocą interaktywnego menedżera właściwości (tak samo jak &amp;lt;code&amp;gt;--telnet&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--pve=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie za pomocą protokołu PVE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ray=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie przy użyciu protokołu ruchomego krzesła Raya Woodwortha.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--rul=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Otwórz połączenie za pomocą protokołu RUL.&lt;br /&gt;
&lt;br /&gt;
Parametry (params) muszą mieć postać:&lt;br /&gt;
 medium,direction,hz,medium_options&lt;br /&gt;
gdzie:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; jest medium używanym przez protokół (&amp;lt;code&amp;gt;serial&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;socket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;...),&lt;br /&gt;
* &amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt; to kierunek komunikacji (&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;bi&amp;lt;/code&amp;gt;),&lt;br /&gt;
* &amp;lt;code&amp;gt;hz&amp;lt;/code&amp;gt; to częstotliwość, z którą kanał powinien być przetwarzany (akceptowane są wartości zmiennoprzecinkowe),&lt;br /&gt;
* a &amp;lt;code&amp;gt;medium_options&amp;lt;/code&amp;gt; to:&lt;br /&gt;
** dla protokołów szeregowych: &amp;lt;code&amp;gt;device,baud&amp;lt;/code&amp;gt;, gdzie &amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt; to nazwa urządzenia, które ma zostać otwarte, a &amp;lt;code&amp;gt;baud&amp;lt;/code&amp;gt; to prędkość transmisji;&lt;br /&gt;
** dla protokołów gniazd: &amp;lt;code&amp;gt;machine,port,style&amp;lt;/code&amp;gt;, gdzie &amp;lt;code&amp;gt;machine&amp;lt;/code&amp;gt; jest nazwą maszyny lub adres IP serwera (jeśli symulator ma działać jako klient) lub jest pozostawiona pusta (jeśli symulator ma działać jako serwer), &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; to numer port, którego należy użyć (lub jest pusty, aby system operacyjny sam wybrał dostępny port), a &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; to jeden z protokołów &amp;lt;code&amp;gt;tcp&amp;lt;/code&amp;gt; lub &amp;lt;code&amp;gt;udp&amp;lt;/code&amp;gt;;&lt;br /&gt;
** dla protokołów plików: &amp;lt;code&amp;gt;filename&amp;lt;/code&amp;gt;, gdzie &amp;lt;code&amp;gt;filename&amp;lt;/code&amp;gt; to nazwa pliku do którego dane powinny zostać zapisane.&lt;br /&gt;
&lt;br /&gt;
W systemie Windows musisz użyć specjalnej sekwencji ucieczki, jeśli chcesz określić port COM wyższy niż 9.&lt;br /&gt;
&lt;br /&gt;
Na przykład: &amp;lt;code&amp;gt;--generic=\\.\COM10,out,1,/tmp/data.xml,myproto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jest to opisane w artykule Microsoft KB tutaj: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
= Opcje awioniki =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--com1=częstotliwość&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--com2=częstotliwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw częstotliwość radia COM1, COM2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--nav1=[radial:]częstotliwość&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--nav2=[radial:]częstotliwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw częstotliwość radia NAV1, NAV2, opcjonalnie poprzedzoną radialem.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--adf1=[obrót:]częstotliwość&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--adf2=[obrót:]częstotliwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw częstotliwość radia ADF1, ADF2, opcjonalnie poprzedzoną obrotem tarczy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--dme={nav1|nav2|częstotliwość}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Podporządkuj ADF jednemu z NAV lub ustaw jego częstotliwość wewnętrzną.&lt;br /&gt;
&lt;br /&gt;
= Opcje środowiska =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--real-weather-fetch[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-real-weather-fetch&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-real-weather-fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz pobieranie rzeczywistej pogody na podstawie METAR-u (wymaga połączenia z internetem).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--horizon-effect[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-horizon-effect&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-horizon-effect&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz iluzję powiększenia ciała niebieskiego w pobliżu horyzontu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--visibility=metry&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--visibility-miles=mile&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ początkową widoczność w metrach lub w milach.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wind=kierunek[:maks-kierunek]@prędkość[:porywy]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ kierunek z którego wieje wiatr (kierunek) i jego prędkość (w węzłach). Jeśli kierunek wiatru jest zmienny, określ zakres jako kierunek:maks-kierunek, jako minimalny i maksymalny kąt w stopniach. Jeśli chcesz, aby symulator również modelował porywy wiatru, ustaw maksymalne natężenie porywów w węzłach.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--turbulence=współczynnik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ stopień turbulencji od 0.0 (brak) do 1.0 (silna).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ceiling=FT_ASL[:GRUBOŚĆ_FT]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określ pułap zachmurzenia (w stopach nad średnim poziomem morza), opcjonalnie o określonej grubości (domyślnie 2000 stóp).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--random-wind&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw wiatr generowany losowo, z różnych kierunków o różnej sile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--metar=depesza METAR&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw pogodę wg podanego METAR-u, np.: &amp;lt;code&amp;gt;XXXX 012345Z 28035G50KT 250V300 9999 TSRA SCT022CB BKN030 13/09 Q1005&amp;lt;/code&amp;gt;. Działa tylko wtedy, gdy pobieranie rzeczywistej pogody jest wyłączone.&lt;br /&gt;
&lt;br /&gt;
= Opcje sytuacji =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--failure={pitot|static|system|vacuum}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Awaria rurki Pitota, ciśnienia statycznego, układu próżniowego lub elektrycznego (powtórz opcję w przypadku wielu awarii systemu).&lt;br /&gt;
&lt;br /&gt;
= Opcje debugowania =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--console[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Włącz/wyłącz konsolę (dla systemu Windows). Skrót &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; zawsze wyświetla konsolę.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--developer[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-developer&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-developer&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz tryb programisty. Włączenie spowoduje logowanie większej ilości zdarzeń.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fpe[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fpe&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fpe&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz przerwanie po napotkaniu wyjątku zmiennoprzecinkowego.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fgviewer plik&amp;lt;/code&amp;gt;&lt;br /&gt;
::Użyj przeglądarki modelu z OpenSceneGraph, zamiast wczytywać cały symulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--json-report[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Włącz/wyłącz wypisanie raportu w formacie JSON na standardowym wyjściu, podając informacje, takie jak wersja FlightGear, [[$FG_ROOT]], [[$FG_HOME]], ścieżki samolotów i scenerii itp.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--log-level={bulk|debug|info|warn|alert}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ustaw poziom logowania dla tej sesji. Zobacz także [[Commonly used debugging tools#fgfs.log]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--log-class={none|ai|aircraft|astro|atc|autopilot|clipper|cockpit| environment|event|flight|general|gl|gui|headless|input|instrumentation| io|math|nasal|navaid|network|osg|particles|sound|systems|terrain| terrasync|undefined|view|all}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Określenie klasy (klasę) logowania, które mają być używane.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--log-dir=katalog&amp;lt;/code&amp;gt;&lt;br /&gt;
::Zapisz logi w podanym katalogu. Jeśli podamy desktop, to logi zostaną zapisywane na Pulpicie. Opcję tę można podać kilka razy, używając za każdym razem innego katalogu. Wewnątrz podanego katalogu plik dziennika będzie miał nazwę FlightGear_YYY-MM-DD_num.log, gdzie YYYY-MM-DD to bieżąca data, a num to liczba postępowa zaczynająca się od 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--trace-read=właściwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Śledź odczyty dla właściwości. Można użyć tej opcji wielokrotnie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--trace-write=właściwość&amp;lt;/code&amp;gt;&lt;br /&gt;
::Śledź zapisy dla właściwości. Można użyć tej opcji wielokrotnie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--uninstall&amp;lt;/code&amp;gt;&lt;br /&gt;
::Usuń katalog [[$FG_HOME]]. Dla Windows dodatkowo usuwa katalogi TerraSync, Aircraft i TextureCache z katalogu download.&lt;br /&gt;
&lt;br /&gt;
=Treści powiązane=&lt;br /&gt;
==Artykuły na Wiki==&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
* [[Command line options 2020.3]]&lt;br /&gt;
&lt;br /&gt;
==Pliki źródłowe==&lt;br /&gt;
*{{fgdata file|options.xml}}&lt;br /&gt;
*{{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
*{{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[en:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=144156</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=144156"/>
		<updated>2026-04-27T09:11:08Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* IO Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|This article presents the current command line options, including the development version. To check the options for '''older version 2020.3.x''', see the [[Command line options 2020.3]] article.}}&lt;br /&gt;
&lt;br /&gt;
'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]]. The launcher GUI works by setting command-line options for the options you choose. Try different options and see what the launcher sets from menu in Qt launcher &amp;lt;code&amp;gt;*** &amp;gt; View command-line&amp;lt;/code&amp;gt; or by use {{Key press|Ctrl|L}} keyboard shortcut.&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
Usage in terminal: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The way to use options by [[FlightGear Qt launcher|Qt Launcher]]: go to the &amp;quot;Settings&amp;quot; tab and in the &amp;quot;Additional Settings&amp;quot; section enter the following options, each on a new line. The options entered there take precedence over those defined by Qt Launcher. To see the entire list of command line options used by Qt Launcher, use the keyboard shortcut {{Key press|Ctrl|L}} or select &amp;quot;View command-line&amp;quot; from the Launcher menu.&lt;br /&gt;
&lt;br /&gt;
= Legend how to read the following options =&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt;) - in this case &amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt; is the aliast for &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt; which is exactly the same as &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt; - two different options, mutually exclusive. They cannot be used simultaneously, but are connected due to a common description.&lt;br /&gt;
# &amp;lt;code&amp;gt;--option1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--option2&amp;lt;/code&amp;gt; - two different options that can be used simultaneously and are connected due to a common description.&lt;br /&gt;
&lt;br /&gt;
= Values for options =&lt;br /&gt;
&lt;br /&gt;
Some options do not require a value, such as &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt;, but there are options for which we must specify a value, such as &amp;lt;code&amp;gt;--fg-root&amp;lt;/code&amp;gt;, as well as there are options for which we can optionally specify a value, such as for &amp;lt;code&amp;gt;--launcher&amp;lt;/code&amp;gt;. We can separate the value from the option with either the &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; sign or a space, such as:&lt;br /&gt;
&lt;br /&gt;
    --fg-root=/path/to/fgdata&lt;br /&gt;
    --fg-root /path/to/fgdata&lt;br /&gt;
&lt;br /&gt;
Options that act like an enable/disable switch take optional values as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; (enable) or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no&amp;lt;/code&amp;gt; (disable). If we don't specify any value next to such an option, it will work by default as if we passed &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;, i.e. enabled it, e.g:&lt;br /&gt;
&lt;br /&gt;
    --launcher&lt;br /&gt;
&lt;br /&gt;
will enable Launcher, which is equivalent to:&lt;br /&gt;
&lt;br /&gt;
    --launcher=yes&lt;br /&gt;
&lt;br /&gt;
On the other hand, we can also pass a value that disables the option, e.g.:&lt;br /&gt;
&lt;br /&gt;
    --launcher=no&lt;br /&gt;
&lt;br /&gt;
which will cause Launcher not to be launched. In addition, most of such options have two additional versions without a value, but preceded by the prefix &amp;lt;code&amp;gt;enable-&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;disable-&amp;lt;/code&amp;gt;, e.g.:&lt;br /&gt;
&lt;br /&gt;
    --enable-launcher&lt;br /&gt;
&lt;br /&gt;
will also enable Launcher.&lt;br /&gt;
&lt;br /&gt;
= General Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Show the most relevant command line options.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--verbose&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Show all command line options when combined with &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--version[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Display the current FlightGear version.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fg-root=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the root data path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fg-scenery=path[:path...]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the base scenery path. Defaults to [[$FG_ROOT]]/Scenery.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fg-aircraft=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify additional aircraft directory path(s) (alternatively, you can use &amp;lt;code&amp;gt;--aircraft-dir&amp;lt;/code&amp;gt; to target a specific aircraft in a given directory).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--addon=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a path to addon. Multiple instances can be used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--download-dir=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Store aircraft and scenery downloaded via the simulator in path. The TerraSync directory may be specifically set with the &amp;lt;code&amp;gt;--terrasync-dir&amp;lt;/code&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--data=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify an additional base data directory (FGData), before the [[$FG_ROOT]] directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--terrasync[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-terrasync&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-terrasync&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable automatic scenery downloads/updates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--terrasync-dir=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the [[TerraSync]] scenery path. Defaults to [[$FG_HOME]]/TerraSync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--language=code&amp;lt;/code&amp;gt;&lt;br /&gt;
::Select the language for this session. Available codes: &amp;lt;tt&amp;gt;ca&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;de&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;en&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;es&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fr&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;it&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ka&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;pt&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ru&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;sk&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;tr&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;zh_CN&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:: In FlightGear 2024.2, &amp;lt;code&amp;gt;--language=default&amp;lt;/code&amp;gt; is also supported and selects the ''default translation'', also known as “engineering English”. This “translation” contains exactly the English strings that translators translate; these have only one form for both singular and plural, contrary to the English translation loaded by &amp;lt;code&amp;gt;--language=en&amp;lt;/code&amp;gt; which, starting from FlightGear 2024.2, can show different forms depending on a “cardinal number” (this applies to those strings that have been declared with &amp;lt;code&amp;gt;has-plural=true&amp;lt;/code&amp;gt; in the default translation, i.e. in one of the XML files from &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Translations/default&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
:: In FlightGear 2024.2, in case the locale specified with &amp;lt;code&amp;gt;--language&amp;lt;/code&amp;gt; or via user locale settings doesn't match any of the locales defined in &amp;lt;tt&amp;gt;[[$FG_ROOT]]/Translations/locale.xml&amp;lt;/tt&amp;gt;, the effect is the same as with &amp;lt;code&amp;gt;--language=en&amp;lt;/code&amp;gt;, i.e. proper English with singular and plural forms that may differ.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--launcher[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-launcher&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-launcher&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable [[FlightGear Qt launcher|Qt Launcher]]. Without this option or with enabled it, it will immediately start the simulator in the default configuration or in the configuration read from the [[Fgfsrc|fgfsrc]] file - if it exists.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--splash-screen[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-splash-screen&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-splash-screen&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable splash screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--mouse-pointer[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-mouse-pointer&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-mouse-pointer&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable extra mouse pointer (i.e. for full screen Voodoo based cards).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--browser-app=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify path to your web browser.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:[type:]property=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the given property to the given value. Type can be one of &amp;lt;tt&amp;gt;string&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;bool&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:browser=property&amp;lt;/code&amp;gt;&lt;br /&gt;
::After starting the simulator, open the properties dialog immediately on the given property. If you need more windows, just add more browser indexes like &amp;lt;tt&amp;gt;browser[1]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;browser[2]&amp;lt;/tt&amp;gt; etc., for example:&lt;br /&gt;
  --prop:browser=/sim/presets&lt;br /&gt;
  --prop:browser[1]=/devices/status/keyboard/event&lt;br /&gt;
::which will open two dialogs with the given properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--config=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Load additional properties from path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--no-default-config[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable not loading any default configuration files (like [[Fgfsrc|fgfsrc]]) unless explicitly specified with &amp;lt;code&amp;gt;--config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--units-feet&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt;&lt;br /&gt;
::Use feets (default) or meters for distances.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--allow-nasal-read=path[:path...]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Allow Nasal scripts to read files from directories listed as path (separate multiple paths with a semicolon (Windows) or a colon (UNIX)). By default, for security reasons, Nasal scripts can only read data from certain directories, such as [[$FG_ROOT]], [[$FG_HOME]], etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--read-only[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-read-only&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-read-only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable folder [[$FG_HOME]] read-only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ignore-autosave[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-ignore-autosave&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-ignore-autosave&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable ignoring the autosave file, i.e. the settings saved in this file will not be loaded during startup, nor will the settings be saved to this file when closing the simulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--save-on-exit[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-save-on-exit&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-save-on-exit&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable saving preferences at program exit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--restore-defaults[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-restore-defaults&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-restore-defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable resetting all user settings to their defaults (rendering options etc.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--gui[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-gui&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-gui&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable GUI (disabling GUI enables headless mode.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--jsbsim-output-directive-file=file&amp;lt;/code&amp;gt;&lt;br /&gt;
::Log JSBSim properties. An output directives file contains an &amp;lt;code&amp;gt;&amp;lt;output&amp;gt;&amp;lt;/code&amp;gt; element, within which should be specified the parameters or parameter groups that should be logged. See [[JSBSim Logging]].&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--composite-viewer[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-composite-viewer&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-composite-viewer&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable CompositeViewer (extra view windows.) These options have been removed from the dev version, where CompositeViewer is always enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--panel[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-panel&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-panel&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable 2D instrument panel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--freeze[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-freeze&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-freeze&amp;lt;/code&amp;gt;&lt;br /&gt;
::Start in a pause state or unpause.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fuel-freeze[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fuel-freeze&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fuel-freeze&amp;lt;/code&amp;gt;&lt;br /&gt;
::Fuel tank quantity forced to remain constant or fuel is consumed normally.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--clock-freeze[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-clock-freeze&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-clock-freeze&amp;lt;/code&amp;gt;&lt;br /&gt;
::Do not advance clock or clock advances normally.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ai-scenario=scenario&amp;lt;/code&amp;gt;&lt;br /&gt;
::Add and enable a new scenario. Multiple options are allowed. Scenarios are in [[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ai-models[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-ai-models&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-ai-models&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable the AI subsystem. When disabled this also disables showing the models of other multiplayer aircraft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ai-traffic[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-ai-traffic&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-ai-traffic&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable the autogenerated traffic subsystem.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vr[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-vr&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-vr&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable the Virtual Reality.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--restart-launcher[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-restart-launcher&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-restart-launcher&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable automatic opening of the Launcher when exiting FlightGear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--load-tape={name|url}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Load recording of earlier flightgear session. For &amp;lt;name&amp;gt;, if &amp;lt;name&amp;gt; ends with &amp;quot;.fgtape&amp;quot; it is treated as the local path of the recording file; otherwise we form the local path by prepending &amp;lt;name&amp;gt; with the tape directory and appending &amp;quot;.fgtape&amp;quot;. For &amp;lt;url&amp;gt; (starting with http:// or https://) we download the remote recording (which must be a Continuous recording) in the background to a url-dependent filename while replaying it; if the url-dependent filename already exists it is assumed to be a truncated download and we only download any remaining data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--load-tape-create-video[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-load-tape-create-video&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-load-tape-create-video&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable encode video while replaying tape specified by &amp;lt;code&amp;gt;--load-tape&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--load-tape-fixed-dt=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set fixed-dt mode while replaying tape specified by &amp;lt;code&amp;gt;--load-tape&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Aircraft =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aircraft=name&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--vehicle=name&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Select an aircraft profile as defined by a top level -set.xml.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aircraft-dir=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the exact directory to use for the aircraft (normally not required, but may be useful). Interpreted relatively to the current directory. Causes the &amp;lt;code&amp;gt;&amp;lt;path-cache&amp;gt;&amp;lt;/code&amp;gt; from autosave_X_Y.xml, as well as &amp;lt;code&amp;gt;--fg-aircraft&amp;lt;/code&amp;gt; options and the FG_AIRCRAFT environment variable to be bypassed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--show-aircraft[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable printing a list of the currently available aircraft types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--min-status={alpha|beta|early-production|production}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Allows you to define a minimum status level (=development status) for all listed aircraft by &amp;lt;code&amp;gt;--show-aircraft&amp;lt;/code&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--auto-coordination[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-auto-coordination&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-auto-coordination&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable auto coordination. Disabled as default. If enabled, the rudder will respond according to the movement of the ailerons.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--livery=name&amp;lt;/code&amp;gt;&lt;br /&gt;
::Select aircraft livery.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--state=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the initial state of the aircraft to the given value. The states that can be used depend on the aircraft. For example, the Cessna 172P has only one state: &amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Flight Model =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fdm={ada | acms | aisim | balloon | jsb | larcsim | magic | network | pipe | ufo | yasim | external | null}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Select the core flight dynamics model. LaRCsim (&amp;lt;code&amp;gt;larcsim&amp;lt;/code&amp;gt; value) as a deprecated model has been removed from the dev version.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aero=name&amp;lt;/code&amp;gt;&lt;br /&gt;
::Select aircraft aerodynamics model to load.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--model-hz=n&amp;lt;/code&amp;gt;&lt;br /&gt;
::Run the FDM this rate (iterations per second).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--speed=n&amp;lt;/code&amp;gt;&lt;br /&gt;
::Run the FDM 'n' times faster than real time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--trim[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--notrim[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Trim or do not attempt to trim the model (only with &amp;lt;code&amp;gt;--fdm=jsbsim&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--on-ground[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--in-air[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Start at ground level (default) or in air (implied when using &amp;lt;code&amp;gt;--altitude&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Initial Position and Orientation =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--airport=ICAO&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify airport (e.g. KOAK).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--runway=rwy_no&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify starting runway (must also specify an airport).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--parking-id=name&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--parkpos=name&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Specify a gate at the airport (e.g. 747d11).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--carrier={name|ID}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify starting position on an AI carrier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--carrier-position={abeam|FLOLS|name}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a starting position relative to the carrier where you can use the predefined &amp;lt;tt&amp;gt;abeam&amp;lt;/tt&amp;gt; (start on downwind abeam) or &amp;lt;tt&amp;gt;FLOLS&amp;lt;/tt&amp;gt; (start on final approach) values, or specify the name of the carrier's parking position. Must also specify a carrier by &amp;lt;code&amp;gt;--carrier&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vor=ID&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify starting position relative to a VOR.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vor-frequency=frequency&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the frequency of the VOR. Use with &amp;lt;code&amp;gt;--vor=ID&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ndb=ID&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify starting position relative to an NDB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ndb-frequency=frequency&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the frequency of the NDB. Use with &amp;lt;code&amp;gt;--ndb=ID&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fix=ID&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify starting position relative to a fix.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--offset-distance=nm&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify distance to reference point (nautical miles).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--offset-azimuth=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify heading to reference point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lon=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Starting longitude (west = -).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lat=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Starting latitude (south = -).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--altitude=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Starting altitude (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--heading=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify heading (yaw) angle (Psi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--roll=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify roll angle (Phi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--pitch=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify pitch angle (Theta).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vc=knots&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--mach=num&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify initial airspeed in knots or mach number.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--glideslope=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify flight path angle (can be positive).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--roc=fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify initial climb of rate (can be negative).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--uBody=units_per_sec&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify velocity along the body X axis (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vBody=units_per_sec&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify velocity along the body Y axis (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wBody=units_per_sec&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify velocity along the body Z axis (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vNorth=units_per_sec&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify velocity along a South-North axis (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vEast=units_per_sec&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify velocity along a West-East axis (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--vDown=units_per_sec&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify velocity along a vertical axis (in feet unless &amp;lt;code&amp;gt;--units-meters&amp;lt;/code&amp;gt; specified).&lt;br /&gt;
&lt;br /&gt;
= Audio Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--show-sound-devices[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable the display of the list of audio devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--sound-device=name&amp;lt;/code&amp;gt;&lt;br /&gt;
::Explicitly specify the audio device to use. To get available names use &amp;lt;code&amp;gt;--show-sound-devices&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--sound[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-sound&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-sound&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable sound.&lt;br /&gt;
&lt;br /&gt;
= Rendering Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:/sim/rendering/multi-sample-buffers={true|false}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable multi sample buffer (anti-aliasing).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:/sim/rendering/multi-samples=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify number of multi samples (anti-aliasing). Valid values is 2, 4, 8, 16.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--aspect-ratio-multiplier=factor&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a multiplier for the aspect ratio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--bpp={16|24|32}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the bits per pixel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--compositor=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the path to XML file for multi-pass rendering. The path is relative to [[$FG_ROOT]] (defaults to &amp;lt;code&amp;gt;Compositor/default&amp;lt;/code&amp;gt;.) For enable HDR pipeline use &amp;lt;code&amp;gt;Compositor/HDR/hdr&amp;lt;/code&amp;gt; path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--horizon-effect[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-horizon-effect&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-horizon-effect&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable celestial body growth illusion near the horizon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--distance-attenuation[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-distance-attenuation&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-distance-attenuation&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable runway light distance attenuation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--specular-highlight[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-specular-highlight&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-specular-highlight&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable specular reflections on textured objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--clouds[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-clouds&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-clouds&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable 2D (flat) cloud layers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--clouds3d[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-clouds3d&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-clouds3d&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable 3D (volumetric) cloud layers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--texture-cache[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-texture-cache&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-texture-cache&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable texture cache (DDS).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--texture-cache-dir=path&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the DDS texture cache directory to be different than the default location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fullscreen[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fullscreen&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fullscreen&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable fullscreen mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--random-objects[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-random-objects&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-random-objects&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable random scenery objects (buildings, etc.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wireframe[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-wireframe&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-wireframe&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable wireframe drawing mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fog-disable&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--fog-fastest&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--fog-nicest&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the fog. The &amp;lt;code&amp;gt;--fog-disable&amp;lt;/code&amp;gt; option will turn off the fog, resulting in increased visibility and a decrease in performance (more terrain to render). The &amp;lt;code&amp;gt;--fog-fastest&amp;lt;/code&amp;gt; option will enable fog rendering in a less realistic way, but improving performance. By default, the &amp;lt;code&amp;gt;--fog-nicest&amp;lt;/code&amp;gt; option is used to render a realistic fog, at the expense of performance. These options are deprecated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fov=degrees&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify field of view angle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--geometry=WidthxHeight&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify window geometry/resolution (640x480, etc).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--graphics-preset={minimal-quality|low-quality|medium-quality|high-quality|ultra-quality}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a graphic preset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--materials-file=file&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the materials file used to render the scenery (default: Materials/regions/materials.xml).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--max-fps=Hz&amp;lt;/code&amp;gt;&lt;br /&gt;
::Maximum frame rate in Hz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--shading-smooth&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--shading-flat&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable smooth or flat shading. These options are deprecated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--texture-filtering={1|2|4|8|16}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--view-offset={LEFT|CENTER|RIGHT|value}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the default forward view direction as an offset from straight ahead. Allowable values are &amp;lt;tt&amp;gt;LEFT&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;RIGHT&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CENTER&amp;lt;/tt&amp;gt;, or a specific number in degrees.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--terrain-engine={tilecache|pagedLOD}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the terrain engine you want to use: &amp;lt;tt&amp;gt;tilecache&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;pagedLOD&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-levels=levels&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the detail levels, where levels are a space-separated numeric list of levels. The default is &amp;quot;1 3 5 7 9&amp;quot;. Use with &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-res=resolution&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the resolution of the terrain grid. Defaults is 1. Use with &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-texturing={bluemarble|raster|debug}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the method of texturing the terrain. The default is &amp;lt;tt&amp;gt;bluemarble&amp;lt;/tt&amp;gt;. Use with &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--lod-range-mult=multiplier&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the range multiplier (point from low to fine detail). Defaults is 2. Use with &amp;lt;code&amp;gt;--terrain-engine=pagedLOD&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== WS3.0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--prop:/scenery/use-vpb=true&amp;lt;/code&amp;gt;&lt;br /&gt;
::Activate the use of World Scenery 3.0.&lt;br /&gt;
&lt;br /&gt;
= Hud Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hud[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-hud&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-hud&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable Heads Up Display (HUD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--anti-alias-hud[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-anti-alias-hud&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-anti-alias-hud&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable anti-aliased HUD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hud-3d[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-hud-3d&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-hud-3d&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable 3D HUD.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hud-tris&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--hud-culled&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hud displays number of triangles rendered or percentage of triangles culled.&lt;br /&gt;
&lt;br /&gt;
= Time Options =&lt;br /&gt;
&lt;br /&gt;
The following time and date setting options are not compatible with each other, so only one of them should be given.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--timeofday={real|dawn|morning|noon|afternoon|dusk|evening|midnight}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a time of day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--time-offset=[+-]hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Add this time offset to &amp;lt;code&amp;gt;--time-match-real&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--time-match-real&amp;lt;/code&amp;gt;&lt;br /&gt;
::Synchronize time with current time at chosen airport.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--time-match-local&amp;lt;/code&amp;gt;&lt;br /&gt;
::Synchronize time with system time of computer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--start-date-sys=yyyy:mm:dd:hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a starting date/time with respect to system time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--start-date-gmt=yyyy:mm:dd:hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a starting date/time with respect to Greenwich Mean Time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--start-date-lat=yyyy:mm:dd:hh:mm:ss&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a starting date/time with respect to Local Aircraft Time.&lt;br /&gt;
&lt;br /&gt;
= Network Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--proxy=[user:password@]host:port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the proxy server and port to be used. Username and password are optional. If present, they should be listed as MD5 hashes. This option is only useful when &amp;lt;code&amp;gt;--real-weather-fetch&amp;lt;/code&amp;gt; is enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--httpd=port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable HTTP server on the specified port.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--telnet={port|socket,bi,hz,localhost,port,tcp}&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;--props={port|socket,bi,hz,localhost,port,tcp}&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Enable telnet server on the specified port. Optionally, you can change the hz (number of packets per second).&lt;br /&gt;
::Example: &amp;lt;code&amp;gt;--telnet=5000&amp;lt;/code&amp;gt; will send 5 packages per second, but &amp;lt;code&amp;gt;--telnet=,,100,,5000,&amp;lt;/code&amp;gt; will send 100 packages per second.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--jpg-httpd=port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable screen shot HTTP server on the specified port. This option has been withdrawn, instead use &amp;lt;code&amp;gt;--httpd&amp;lt;/code&amp;gt; and /screenshot URL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--allow-nasal-from-sockets[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-allow-nasal-from-sockets&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-allow-nasal-from-sockets&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable allowing executing Nasal scripts from sockets. Enable means that network connections will be allowed full access to the simulator including running arbitrary scripts. Ensure you have adequate security such as a firewall which blocks external connections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--sentry[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-sentry&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-sentry&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable crash and error reports from being sent to the development team for analysis.&lt;br /&gt;
&lt;br /&gt;
= MultiPlayer Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--callsign=name&amp;lt;/code&amp;gt;&lt;br /&gt;
::Assign a unique name to a player. A call sign must be at most 10 characters long and can only contain numbers, letters of the English alphabet, hyphens (-) and underscores (_). Longer call signs are truncated, and characters that do not match those listed above are replaced with hyphens.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--multiplay={in|out},hz,address,port&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify multipilot communication settings. Multiple instances can be used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fgcom[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fgcom&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fgcom&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable built-in FGCom (voice communication with ATC.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--hold-short[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-hold-short&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-hold-short&amp;lt;/code&amp;gt;&lt;br /&gt;
::In multiplayer mode, when you select an initial position on the runway, you will be moved by default to the hold-short position (&amp;lt;code&amp;gt;--hold-short&amp;lt;/code&amp;gt;), which is on the taxiway, just in front of the runway. The &amp;lt;code&amp;gt;--disable-hold-short&amp;lt;/code&amp;gt; option allows you to disable this behavior, but keep in mind that this is undesirable, as it may interfere with others taking off or landing.&lt;br /&gt;
&lt;br /&gt;
= Route/Way Point Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wp=ID[@alt]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify a waypoint for the GC autopilot. Multiple instances can be used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--flight-plan=file&amp;lt;/code&amp;gt;&lt;br /&gt;
::Read all waypoints from a file.&lt;br /&gt;
&lt;br /&gt;
= IO Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--generic=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using a predefined communication interface and a preselected communication protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--atlas=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the Atlas protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--atcsim=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the ATC sim protocol (atc610x).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Emit the Garmin AV400 protocol required to drive a Garmin 196/296 series GPS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400Sim=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Emit the set of AV400 strings required to drive a Garmin 400-series GPS from FlightGear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--AV400WSimA=params&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--AV400WSimB=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::The Garmin WAAS GPS uses 2 serial channels to communicate with the simulator. These 2 channels are represented by the FGAV400WSimA and the FGAV400WSimB classes. The &amp;quot;A&amp;quot; channel is similar to the previous AVSim400 protocol. The &amp;quot;B&amp;quot; channel is considered the &amp;quot;GPS&amp;quot; channel and uses a different protocol than the &amp;quot;A&amp;quot; channel. The GPS unit expects input on the &amp;quot;B&amp;quot; channel at two different frequencies (1hz and 5hz, normally). The &amp;quot;B&amp;quot; channel also expects responses to certain output messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--flarm=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the FLARM protocol, which includes NMEA/GPS and traffic reporting messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--garmin=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the Garmin GPS protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--igc=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the International Gliding Commission (IGC) protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--joyclient=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection to an Agwagon joystick.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--jsclient=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection to a remote joystick.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the FG Native protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native-ctrls=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the FG Native Controls protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native-fdm=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the FG Native FDM protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--native-gui=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the FG Native GUI protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--nmea=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the NMEA protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--opengc=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the OpenGC protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--props=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the interactive property manager (same as &amp;lt;code&amp;gt;--telnet&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--pve=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the PVE protocol (ProVision Entertainment - some sort of motion platform).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ray=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the Ray Woodworth motion chair protocol.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--rul=params&amp;lt;/code&amp;gt;&lt;br /&gt;
::Open connection using the RUL protocol (some sort of motion platform some guy was building).&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;--generic=\\.\COM10,out,1,/tmp/data.xml,myproto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
= Avionics Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--com1=frequency&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--com2=frequency&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the COM1 and COM2 radio frequency.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--nav1=[radial:]frequency&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--nav2=[radial:]frequency&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the NAV1 and NAV2 radio frequency, optionally preceded by a radial.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--adf1=[rotation:]frequency&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--adf2=[rotation:]frequency&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the ADF1 and ADF2 frequency to frequency kHz. You can optionally specify the rotation angle of its compass card by prefixing the frequency with the angle and a colon. The &amp;lt;code&amp;gt;--adf&amp;lt;/code&amp;gt; option is deprecated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--dme={nav1|nav2|frequency}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Slave the ADF to one of the NAV radios, or set its internal frequency.&lt;br /&gt;
&lt;br /&gt;
= Environment Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--real-weather-fetch[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-real-weather-fetch&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-real-weather-fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable METAR based real weather fetching. Enable requires an open internet connection.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--horizon-effect[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-horizon-effect&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-horizon-effect&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/disable celestial body growth illusion near the horizon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--visibility=meters&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--visibility-miles=miles&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify initial visibility in meters or in statute miles. It works only with Basic Weather.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--wind=DIR[:MAXDIR]@SPEED[:GUST]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify the direction from which the wind is blowing (DIR in degrees) and its SPEED (in knots). If the wind direction is variable, specify the range as DIR:MAXDIR, as a minimum and maximum angle in degrees. If you want the simulator to also model wind gusts, set the maximum :GUST rate in knots.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--turbulence=value&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify turbulence where value must to be from 0.0 (calm) to 1.0 (severe).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--ceiling=FT_ASL[:THICKNESS_FT]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Create an overcast ceiling, optionally with a specific thickness (defaults to 2000 ft). This option looks like it has been broken for a long time and doesn't work at all.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--random-wind&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set up random wind direction and speed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--metar=&amp;quot;metar string&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
::Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
= Situation Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--failure={pitot|static|vacuum|electrical}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Fail the pitot, static, vacuum, or electrical system (repeat the option for multiple system failures).&lt;br /&gt;
&lt;br /&gt;
= Debugging Options =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--console[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;)&lt;br /&gt;
::Enable/Disable displaying console (Windows specific.) Short &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; always enable console.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--developer[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-developer&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-developer&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable developer mode which will log more events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fpe[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--enable-fpe&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;--disable-fpe&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable aborting on encountering a floating point exception.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--fgviewer file&amp;lt;/code&amp;gt;&lt;br /&gt;
::Use a model viewer rather than load the entire simulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--json-report[={true|false|1|0|yes|no}]&amp;lt;/code&amp;gt;&lt;br /&gt;
::Enable/Disable printing a report in JSON format on the standard output. The report will give useful information for debugging purposes, such as the FlightGear version, the scenery/aircraft paths in use, the TerraSync and the data download directories and the paths to navigation data files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--log-level={bulk|debug|info|warn|alert}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Set the logging level for this session. 0 = verbose, 5 = alerts only. See also [[Commonly used debugging tools#fgfs.log]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--log-class={none|ai|aircraft|astro|atc|autopilot|clipper|cockpit| environment|event|flight|general|gl|gui|headless|input|instrumentation| io|math|nasal|navaid|network|osg|particles|sound|systems|terrain| terrasync|undefined|view|all}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Specify which logging class(es) to use.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--log-dir={desktop|path}&amp;lt;/code&amp;gt;&lt;br /&gt;
::Save the logs in the given directory. If &amp;lt;code&amp;gt;desktop&amp;lt;/code&amp;gt; is entered instead of the path, the logs are saved on the Desktop. This option may be given several times, using a different directory each time. Inside the specified directory, the log file will be named FlightGear_YYYY-MM-DD_num.log, where YYYY-MM-DD is the current date and num is a progressive number starting at 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--trace-read=property&amp;lt;/code&amp;gt;&lt;br /&gt;
::Trace the reads for a property; multiple instances can be used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--trace-write=property&amp;lt;/code&amp;gt;&lt;br /&gt;
::Trace the writes for a property; multiple instances can be used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--uninstall&amp;lt;/code&amp;gt;&lt;br /&gt;
::Remove [[$FG_HOME]] directory. For Windows, it additionally removes TerraSync, Aircraft and TextureCache directories from download directory.&lt;br /&gt;
&lt;br /&gt;
= Related content =&lt;br /&gt;
== Wiki articles ==&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
* [[Command line options 2020.3]]&lt;br /&gt;
&lt;br /&gt;
== Source files ==&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;br /&gt;
[[pl:Opcje wiersza poleceń]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Model_Cockpit_View&amp;diff=144123</id>
		<title>Model Cockpit View</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Model_Cockpit_View&amp;diff=144123"/>
		<updated>2026-04-25T11:12:14Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
{{infobox subsystem&lt;br /&gt;
|image       = Fgaddonslogo202x89.png |thumb&lt;br /&gt;
|name        = Model Cockpit View&lt;br /&gt;
|started     = 07/2007&lt;br /&gt;
|description = Model Cockpit View&lt;br /&gt;
|status      = Inactive (development from 07/2007 to 2017)&lt;br /&gt;
|maintainers = {{usr|AndersG}}&lt;br /&gt;
|developers  = {{usr|AndersG}}, Melchior Franz, maybe others&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Model Cockpit View''' is a FlightGear [[addon]] that allows to switch the view from any AI/MP models and cockpits. It is based on the previous modules &amp;lt;code&amp;gt;model-view.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cockpit-view.xml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;model2-view.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{key press|q}}/{{key press|Shift|Q}} steps through the available MP/AI aircraft.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
Currently the cockpit views starts at (0,0,0) which is a bit of a usability problem - it works for someone that knows it is a bit of a hack but looks bad for anyone else.&lt;br /&gt;
&lt;br /&gt;
The {{key press|q}}/{{key press|Shift|Q}} key bindings might interfere with aircraft that use these keys.&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
AndersG created a version of the addon&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=32718&amp;amp;start=15#p316599 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re:  &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; AndersG &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 14th, 2017 &lt;br /&gt;
  |added  =  Aug 14th, 2017    &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt; &lt;br /&gt;
that is available in http://www.gidenstam.org/FlightGear/misc/ModelCockpitView-addon.tar.gz.&lt;br /&gt;
&lt;br /&gt;
wkitty42 was working on converting the cockpit-view mod to the &amp;lt;code&amp;gt;--addon&amp;lt;/code&amp;gt; format&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=316498#p316498 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re:  &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; wkitty42 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 13th, 2017 &lt;br /&gt;
  |added  =  Aug 13th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
and currently this addon is abandoned.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=32718&amp;amp;start=45#p430651 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re:  &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; wkitty42 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 24th, 2025 &lt;br /&gt;
  |added  =  Mar 24th, 2025 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Changing the view point ==&lt;br /&gt;
By default, the view point will be at (0,0,0), so the view point will be exactly on the bottom for many models.&lt;br /&gt;
The viewpoint can be moved up/down/left/right at runtime by pressing RMB+MMB (right and middle mouse buttons) and dragging. Holding control too makes it move forward/aft/left/right instead. The offset so set will apply to all models viewed (in essence it does not change as you switch the model the view follows).&lt;br /&gt;
&lt;br /&gt;
Though this might be useful for analysis purposes, a raised view point is more interesting. The view point can be changed by adding the following code to the addons &amp;lt;code&amp;gt;main.nas&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
        if (type != &amp;quot;multiplayer&amp;quot;)&lt;br /&gt;
            color = { text: { color: { red: 0.5, green: 0.8, blue: 0.5 }}};&lt;br /&gt;
# move view point above back of vehicle.&lt;br /&gt;
if (getprop(&amp;quot;/sim/current-view/name&amp;quot;) == &amp;quot;Model Cockpit View&amp;quot; and name) {&lt;br /&gt;
	if (string.match(name,&amp;quot;*gsvehicle*&amp;quot;)){&lt;br /&gt;
		#Ground Service vehicle&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/z-offset-m&amp;quot;, 20);&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/y-offset-m&amp;quot;, 7);&lt;br /&gt;
	} else if (string.match(name,&amp;quot;*carrier*&amp;quot;)){&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/z-offset-m&amp;quot;, 110);&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/y-offset-m&amp;quot;, 47);&lt;br /&gt;
	} else {&lt;br /&gt;
		#Aircraft?&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/z-offset-m&amp;quot;, 60);&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/y-offset-m&amp;quot;, 17);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
        if (name)&lt;br /&gt;
            gui.popupTip(name, 2, color);&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The offset values shown here are just arbitrary.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear addons]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Model_Cockpit_View&amp;diff=144122</id>
		<title>Model Cockpit View</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Model_Cockpit_View&amp;diff=144122"/>
		<updated>2026-04-25T11:09:47Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
{{infobox subsystem&lt;br /&gt;
|image       = Fgaddonslogo202x89.png |thumb&lt;br /&gt;
|name        = Model Cockpit View&lt;br /&gt;
|started     = 07/2007&lt;br /&gt;
|description = Model Cockpit View&lt;br /&gt;
|status      = Under active development as of 07/2007&lt;br /&gt;
|maintainers = {{usr|AndersG}}&lt;br /&gt;
|developers  = {{usr|AndersG}}, Melchior Franz, maybe others&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Model Cockpit View''' is a FlightGear [[addon]] that allows to switch the view from any AI/MP models and cockpits. It is based on the previous modules &amp;lt;code&amp;gt;model-view.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cockpit-view.xml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;model2-view.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{key press|q}}/{{key press|Shift|Q}} steps through the available MP/AI aircraft.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
Currently the cockpit views starts at (0,0,0) which is a bit of a usability problem - it works for someone that knows it is a bit of a hack but looks bad for anyone else.&lt;br /&gt;
&lt;br /&gt;
The {{key press|q}}/{{key press|Shift|Q}} key bindings might interfere with aircraft that use these keys.&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
AndersG created a version of the addon&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=32718&amp;amp;start=15#p316599 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re:  &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; AndersG &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 14th, 2017 &lt;br /&gt;
  |added  =  Aug 14th, 2017    &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt; &lt;br /&gt;
that is available in http://www.gidenstam.org/FlightGear/misc/ModelCockpitView-addon.tar.gz.&lt;br /&gt;
&lt;br /&gt;
wkitty42 was working on converting the cockpit-view mod to the &amp;lt;code&amp;gt;--addon&amp;lt;/code&amp;gt; format&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=316498#p316498 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re:  &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; wkitty42 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Aug 13th, 2017 &lt;br /&gt;
  |added  =  Aug 13th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
and currently this addon is abandoned.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=32718&amp;amp;start=45#p430651 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re:  &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; wkitty42 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 24th, 2025 &lt;br /&gt;
  |added  =  Mar 24th, 2025 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Changing the view point ==&lt;br /&gt;
By default, the view point will be at (0,0,0), so the view point will be exactly on the bottom for many models.&lt;br /&gt;
The viewpoint can be moved up/down/left/right at runtime by pressing RMB+MMB (right and middle mouse buttons) and dragging. Holding control too makes it move forward/aft/left/right instead. The offset so set will apply to all models viewed (in essence it does not change as you switch the model the view follows).&lt;br /&gt;
&lt;br /&gt;
Though this might be useful for analysis purposes, a raised view point is more interesting. The view point can be changed by adding the following code to the addons &amp;lt;code&amp;gt;main.nas&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
        if (type != &amp;quot;multiplayer&amp;quot;)&lt;br /&gt;
            color = { text: { color: { red: 0.5, green: 0.8, blue: 0.5 }}};&lt;br /&gt;
# move view point above back of vehicle.&lt;br /&gt;
if (getprop(&amp;quot;/sim/current-view/name&amp;quot;) == &amp;quot;Model Cockpit View&amp;quot; and name) {&lt;br /&gt;
	if (string.match(name,&amp;quot;*gsvehicle*&amp;quot;)){&lt;br /&gt;
		#Ground Service vehicle&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/z-offset-m&amp;quot;, 20);&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/y-offset-m&amp;quot;, 7);&lt;br /&gt;
	} else if (string.match(name,&amp;quot;*carrier*&amp;quot;)){&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/z-offset-m&amp;quot;, 110);&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/y-offset-m&amp;quot;, 47);&lt;br /&gt;
	} else {&lt;br /&gt;
		#Aircraft?&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/z-offset-m&amp;quot;, 60);&lt;br /&gt;
		setprop(&amp;quot;/sim/current-view/y-offset-m&amp;quot;, 17);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
        if (name)&lt;br /&gt;
            gui.popupTip(name, 2, color);&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The offset values shown here are just arbitrary.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear addons]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143883</id>
		<title>Pl/FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143883"/>
		<updated>2026-04-03T16:43:22Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Sprzęt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
|title             = FlightGear Flight Simulator&lt;br /&gt;
|logo              = FlightGear logo.png&lt;br /&gt;
|logosize          = 200px&lt;br /&gt;
|image             = Boeing 777-200ER cockpit.jpg&lt;br /&gt;
|alt               = W kokpicie [[Boeing 777-200ER]]&lt;br /&gt;
|developedby       = Developerzy FlightGear i współtwórcy&lt;br /&gt;
|initialrelease    = Lipec 17, 1997&lt;br /&gt;
|latestrelease     = {{current release|full}} ({{#time: j xg Y | {{current release|fulldate}} | pl }})&lt;br /&gt;
|writtenin         = C/C++/Nasal&lt;br /&gt;
|os                = Windows, Linux, macOS oraz FreeBSD&lt;br /&gt;
|platform          = wieloplatformowy&lt;br /&gt;
|developmentstatus = Aktywny (1996-)&lt;br /&gt;
|type              = Symulator Lotu&lt;br /&gt;
|license           = [[GNU General Public License]]&lt;br /&gt;
|website           = https://www.flightgear.org/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:OV10A-NASA-in-action.jpg|thumb|right|270px|NASA [[OV-10]] we FlightGear 1.0]]&lt;br /&gt;
&lt;br /&gt;
'''FlightGear Flight Simulator''' (w skrócie '''FlightGear''' lub '''FGFS''') to zaawansowana, darmowa i całkowicie otwarto-źródłowa platforma symulacji lotu, stworzona przez wolontariuszy. FlightGear jest wydany na zasadach licencji [[GNU General Public License]] i jest on w większości napisany przy użyciu języka programowania C++.&lt;br /&gt;
&lt;br /&gt;
Coraz bardziej szczegółowe i zaawansowane wersje FlightGeara są corocznie wydawane od zapoczątkowania projektu w 1996 roku.&lt;br /&gt;
&lt;br /&gt;
Najnowsze publiczne wydanie dostępne jest do pobrania na [https://www.flightgear.org/download/ www.flightgear.org/download/] wraz z wersjami dla Microsoft Windows, macOS i Linux.&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
{{main article|FlightGear History}}&lt;br /&gt;
&lt;br /&gt;
Rozwój FlightGeara rozpoczął się od propozycji stworzenia otwarto-źródłowego symulatora w 1996 roku, w oparciu o własny kod renderowania grafiki 3D. Rozwój wersji opartej na [[OpenGL]] rozpoczął Curtis Olson w 1997 roku, ale także wiele innych osób miało swój wkład w ten projekt.&lt;br /&gt;
&lt;br /&gt;
FlightGear włączył inne otwarto-źródłowe zasoby, w tym model lotu LaRCsim od NASA oraz powszechnie dostępne dane o elewacji terenu. Pierwsze działające pliki binarne, wykorzystujące OpenGL dla grafiki 3D, pojawiły się w 1997 roku. Entuzjastyczny rozwój kolejnych wersji przez kilka lat zaowocował stopniowo coraz bardziej stabilnymi i zaawansowanymi wersjami. W 2001 roku zespół regularnie wydawał nowe wersje beta, a w 2005 roku dojrzałość oprogramowania doprowadziła do szerszych recenzji i wzrostu popularności. W 2007 roku nastąpiło formalne wyjście z wersji beta wraz z wydaniem wersji 1.0.0, dziesięć lat po pierwszym wydaniu FlightGeara w 1997 roku.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|Kokpit 3D [[A-10]] w wersji 1.0.0, rok 2008]]&lt;br /&gt;
&lt;br /&gt;
W 2008 roku, wersja 1.9.0 FlightGeara przeszła z biblioteki [[PLIB]] na [[OSG]], co spowodowało tymczasową utratę niektórych funkcji programu, takich jak wyświetlanie chmury 3D i cienie, za to nowo wprowadzone funkcje, takie jak cząsteczki, nadały symulacji kolejny stopień realizmu.&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
Silnik symulacji we FlightGear to [[SimGear]]. Jest on używany zarówno jako aplikacja użytkownika końcowego jak i przy pracach badawczych w środowiskach akademickich w celu rozwoju zagadnień związanych z symulacją lotu.&lt;br /&gt;
&lt;br /&gt;
Przykładem na możliwość dostosowywania FlightGeara jest szeroki wachlarz modeli dostępnych statków powietrznych, od [[:Category:Gliders|szybowców]] przez [[Helicopter|śmigłowców]], [[:Category:Airliners|liniowce]], [[Military aircraft|myśliwców odrzutowych]] do [[Space Shuttle|Wahadłowca Kosmicznego]]. Modele te zostały wykonane i dodane do projektu przez wielu ochotników ze społeczności FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Od wersji 0.9.10 statki powietrzne we FlightGear używają jednego z trzech [[Flight Dynamics Model|modeli dynamiki lotu]] (FDM): [[JSBSim]], [[YASim]] lub [[UIUC]]. Obecnie wyłącznie jeden silnik terenu jest w użyciu, jest nim [[TerraGear]]. Dostępne efekty pogodowe to między innymi chmury 3D, efekty świetlne, pory dnia i nocy. &lt;br /&gt;
&lt;br /&gt;
=== Modele Dynamiki Lotu ===&lt;br /&gt;
[[Flight Dynamics Models|Model dynamiki lotu]] (FDM) odpowiada za to w jaki sposób w programie jest symulowany lot statku powietrznego. FlightGear korzysta z własnych oraz zewnętrznych projektów modeli dynamiki lotu. Każdy statek powietrzny musi być tak zaprogramowany, aby korzystał z jednego z dostępnych modeli dynamiki lotu. Obecnie FlightGear jest jedynym, graficznym symulatorem lotu korzystającym ze wszystkich wspomnianych modeli dynamiki lotu, a UIUC i YASim zostały rozwinięte z myślą i w szczególności dla FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Wczesne wersje programu używały FDM, który był oparty na [[LaRCsim]] od NASA. W kolejnych wersjach został on zastąpiony przez bardziej elastyczne FDM.&lt;br /&gt;
&lt;br /&gt;
* [[JSBSim]] - domyślny model dynamiki lotu od 2000 roku.&lt;br /&gt;
* [[YASim]] - inny FDM, używający odmiennych metod obliczeniowych. Wprowadzony od wersji 0.7.9 w 2002 roku.&lt;br /&gt;
* [[UIUC]] - kolejny FDM, rozwijany przez UIUC Applied Aerodynamics Group z Uniwersytetu w Illinois na Urbana-Champaign, bazujący na LaRCsim. Obecnie już wycofany z wersji deweloperskiej FlightGeara.&lt;br /&gt;
* FlightGear może być tak skonfigurowany, aby przyjmował dane z zewnętrznych źródeł FDM takich jak [[MATLAB]].&lt;br /&gt;
* Inne niestandardowe FDM zostały napisane dla specyficznych typów statków powietrznych jak balony i sterowce.&lt;br /&gt;
&lt;br /&gt;
=== Zależności FlightGeara ===&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnych tytułów, głównym rezultatem prac nad projektem jest publikacja kodu źródłowego. Aby skorzystać z programu, można samodzielnie skompilować udostępniony kod dla docelowej platformy.&lt;br /&gt;
&lt;br /&gt;
Wykorzystywane przez FlightGeara biblioteki zmieniały się na przestrzeni czasu. Najważniejszą zależnością pozostaje SimGear, będący silnikiem symulacji dla FlightGeara. [[TerraGear]] nie stanowi bezpośredniej zależności – jest raczej nazwą domyślnego silnika odpowiedzialnego za generowanie terenu.&lt;br /&gt;
&lt;br /&gt;
Do obsługi dźwięku wykorzystywany jest OpenAL (z włączonym wsparciem dla SDL od wersji 0.9.5), natomiast wcześniej w tym celu używano biblioteki PLIB, która odpowiadała również za obsługę sprzętu. Za renderowanie grafiki 3D odpowiada [[OpenGL]] – DirectX nie jest wspierany. Z FlightGearem zintegrowano także silnik graficzny [[OpenSceneGraph]]. Do kompilacji wymagane jest również użycie biblioteki Simple Direct Media Layer (SDL).&lt;br /&gt;
&lt;br /&gt;
Zakres zależności może się różnić w zależności od docelowej platformy. Użytkownicy mogą samodzielnie kompilować kod lub – jeśli nie jest on dostępny bezpośrednio w ramach projektu – korzystać z gotowych wersji binarnych przygotowanych przez osoby trzecie.&lt;br /&gt;
&lt;br /&gt;
== Sprzęt==&lt;br /&gt;
&lt;br /&gt;
Do uruchomienia FlightGeara wymagany jest sprzęt obsługujący [[OpenGL]] oraz akcelerację 3D. Najlepsze wsparcie zapewniają karty graficzne NVIDIA. We wcześniejszych wersjach dostępna była również obsługa kart 3dfx, jednak została ona wycofana wraz ze wzrostem wymagań sprzętowych.&lt;br /&gt;
&lt;br /&gt;
[[File:Fgrun-page2.jpg|thumb|left|270px|[[FlightGear Launch Control|FlightGear Launcher]]]]&lt;br /&gt;
&lt;br /&gt;
== Dodatki i dostosowywanie ==&lt;br /&gt;
&lt;br /&gt;
Istnieją programy, które są zintegrowane z FlightGearem (zależności) lub są programami zewnętrznymi i współpracują z nim. Oprogramowanie takie może być częścią projektu FlightGear lub może być rozwijane niezależnie, ale udostępniane przez projekt FlightGear.&lt;br /&gt;
&lt;br /&gt;
Ważnym dodatkowym oprogramowaniem jest interfejs graficzny, służący do uruchomienia pliku wykonywalnego FlightGeara. We wczesnych wersjach, FlightGear mógł być uruchomiony jedynie z wykorzystaniem [[Pl/Opcje wiersza poleceń|opcji wiersza poleceń]]. Jednakże, w 2003 roku od wersji 0.9.3, został dołączony ''[[FlightGear Launch Control|FGRun]]'' - program startowy z interfejsem graficznym. Obecnie tę rolę spełnia ''[[FlightGear Qt launcher|QT Launcher]]''.&lt;br /&gt;
Podobną funkcję spełnia ''[[KFreeFlight]]'' dla środowiska KDE. ''FGTools'' jest alternatywnym front-endem dla środowiska Windows. ''FGKicker'' jest używany dla GTK+.&lt;br /&gt;
&lt;br /&gt;
Inne znaczące programy obejmują edytory i projekty związane z terenem. ''[[Atlas]]'' jest mapą dla FlightGeara; ''[[Kelpie Flight Planner]]'' to rozwijane w Javie narzędzie do planowania lotów.&lt;br /&gt;
''[[FlightGear Scenery Designer]]'' to edytor scenerii, pomocny przy pracy z danymi terenu. ''[[World Custom Scenery Project]]'' to projekt pomagający koordynować wspólne wysiłki na rzecz tworzenia scenerii. Na koniec edytor ''[[TaxiDraw]]'' do tworzenia nowych pasów startowych i dróg kołowania.&lt;br /&gt;
&lt;br /&gt;
=== Statki Powietrzne ===&lt;br /&gt;
{{Main article|Table of models}}&lt;br /&gt;
&lt;br /&gt;
Na początku, FlightGear dysponował tylko jednym statkiem powietrznym, był to Navion zawarty w projekcie LaRCsim od NASA, który w 2000 roku został zastąpiony przez Cessnę 172P. Rozwój UIUC i JSBSim przyniósł ze sobą kilka kolejnych samolotów, podobnie jak rozwój YASim, który od tego czasu stał się głównym FDM używanym we FlightGear. W wersji 2.12 dostępnych jest ponad 400 samolotów w ponad 900 unikalnych malowaniach, choć tylko kilka z nich wchodzi w skład pakietu podstawowego.&lt;br /&gt;
&lt;br /&gt;
[[File:EHAM.jpg|thumb|270px|[[Boeing 737-300|Boeing 733]] zaparkowany w scenerii [[EHAM]] ]]&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
{{Main article|Scenery}}&lt;br /&gt;
&lt;br /&gt;
Projekt [[World Scenery]] dla FlightGeara zawiera dane o wysokości i klasie terenu całego świata.&lt;br /&gt;
Obiekty takie jak terminale, wiatraki i mosty są zebrane w [[FlightGear Scenery Database|bazie danych scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Sieć i wiele monitorów ===&lt;br /&gt;
&lt;br /&gt;
Istnieje kilka możliwości, które pozwalają komunikować się jednej instancji FlightGeara z inną. Dostępny jest protokół [[Multiplayer Howto|multiplayer]], co umożliwia lot w formacji lub symulowanie kontroli ruchu lotniczego w sieci lokalnej. Protokół Multiplayer zostanie wkrótce tak rozbudowany, aby także pozwalał na pracę w internecie. Dodatkową cechą możliwości sieciowych jest opcja podglądu innych pilotów na mapach Google.&lt;br /&gt;
&lt;br /&gt;
Kilka instancji FlightGeara może zostać tak zsynchronizowana, aby korzystały z wielu monitorów. Możliwe jest uzyskanie bardzo dobrej synchronizacji między monitorami jeżeli wszystkie instancje FlightGeara będą pracowały z tą samą częstotliwością wyświetlania klatek.&lt;br /&gt;
&lt;br /&gt;
== Kod FlightGeara vs wersja binarna ==&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnego oprogramowania, data wydania dotyczy wyłącznie kodu źródłowego, a nie wersji binarnej. Aby stworzyć wykonywalny program, kod źródłowy musi zostać skompilowany, co wymaga kilku bibliotek, włączając w to kilka ogólnych oraz specyficznych dla platfory. Jednak jest to zbyt trudne zadanie dla wielu zwykłych użytkowników, dlatego ochotnicy społeczności pracują, aby udostępnić wersje binarne dla poszczególnych platform i systemów operacyjnych. Dystrybucje te różnią się poziomem stabilności, wydajnością, zależnościami, a także tym, jak aktualne są one w stosunku do kodu źródłowego. Dla przykładu, niektóre ze starszych wersji binarnych będą pracować poprawnie pod Mac OS 9, ale nowsze wydania wymagają określonych wersji Mac OS X.&lt;br /&gt;
&lt;br /&gt;
For example, by late 2012 the latest code release was 2.10 (pre-release) and 2.8.0 (final). Binaries are generally available for the last final code release on all major platforms. [http://www.flightgear.org/download/main-program/ Click here to proceed to the flightgear binaries download page]&lt;br /&gt;
&lt;br /&gt;
Przykładowo, pod koniec 2012 roku najnowszą wersją kodu była wersja 2.10 (przedpremierowa) i 2.8.0 (finalna). Pliki binarne są ogólnie dostępne dla ostatniego finalnego wydania kodu na wszystkich głównych platformach. Przejdź do naszej oficjalnej [https://www.flightgear.org/download/ strony pobierania] aby pobrać pliki binarne FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Pliki binarne dla innych platform, takich jak IRIX, nie są już obsługiwane, chociaż wydania sprzed 1.0 mogą działać i można je znaleźć w [[FlightGear Git|repozytoriach kodu źródłowego git]].&lt;br /&gt;
&lt;br /&gt;
== Recenzje FlightGear ==&lt;br /&gt;
{{Main article|FlightGear Reviews}}&lt;br /&gt;
&lt;br /&gt;
== Łącza zewnętrzne ==&lt;br /&gt;
{{Main article|Links}}&lt;br /&gt;
* {{Wikipedia|FlightGear}}&lt;br /&gt;
* [https://www.flightgear.org Oficjalna strona]&lt;br /&gt;
* {{forum link|text=Forum}}&lt;br /&gt;
* [https://sourceforge.net/p/flightgear/codetickets/ System śledzenia błędów]&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Oryginalna propozycja stworzenia FlightGear]&lt;br /&gt;
&lt;br /&gt;
== Źródła ==&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/FlightGear Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[ca:FlightGear]]&lt;br /&gt;
[[de:FlightGear]]&lt;br /&gt;
[[en:FlightGear]]&lt;br /&gt;
[[es:FlightGear]]&lt;br /&gt;
[[fr:FlightGear]]&lt;br /&gt;
[[it:FlightGear]]&lt;br /&gt;
[[nl:FlightGear]]&lt;br /&gt;
[[pt:FlightGear]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143882</id>
		<title>Pl/FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143882"/>
		<updated>2026-04-03T16:41:59Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Zależności FlightGeara */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
|title             = FlightGear Flight Simulator&lt;br /&gt;
|logo              = FlightGear logo.png&lt;br /&gt;
|logosize          = 200px&lt;br /&gt;
|image             = Boeing 777-200ER cockpit.jpg&lt;br /&gt;
|alt               = W kokpicie [[Boeing 777-200ER]]&lt;br /&gt;
|developedby       = Developerzy FlightGear i współtwórcy&lt;br /&gt;
|initialrelease    = Lipec 17, 1997&lt;br /&gt;
|latestrelease     = {{current release|full}} ({{#time: j xg Y | {{current release|fulldate}} | pl }})&lt;br /&gt;
|writtenin         = C/C++/Nasal&lt;br /&gt;
|os                = Windows, Linux, macOS oraz FreeBSD&lt;br /&gt;
|platform          = wieloplatformowy&lt;br /&gt;
|developmentstatus = Aktywny (1996-)&lt;br /&gt;
|type              = Symulator Lotu&lt;br /&gt;
|license           = [[GNU General Public License]]&lt;br /&gt;
|website           = https://www.flightgear.org/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:OV10A-NASA-in-action.jpg|thumb|right|270px|NASA [[OV-10]] we FlightGear 1.0]]&lt;br /&gt;
&lt;br /&gt;
'''FlightGear Flight Simulator''' (w skrócie '''FlightGear''' lub '''FGFS''') to zaawansowana, darmowa i całkowicie otwarto-źródłowa platforma symulacji lotu, stworzona przez wolontariuszy. FlightGear jest wydany na zasadach licencji [[GNU General Public License]] i jest on w większości napisany przy użyciu języka programowania C++.&lt;br /&gt;
&lt;br /&gt;
Coraz bardziej szczegółowe i zaawansowane wersje FlightGeara są corocznie wydawane od zapoczątkowania projektu w 1996 roku.&lt;br /&gt;
&lt;br /&gt;
Najnowsze publiczne wydanie dostępne jest do pobrania na [https://www.flightgear.org/download/ www.flightgear.org/download/] wraz z wersjami dla Microsoft Windows, macOS i Linux.&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
{{main article|FlightGear History}}&lt;br /&gt;
&lt;br /&gt;
Rozwój FlightGeara rozpoczął się od propozycji stworzenia otwarto-źródłowego symulatora w 1996 roku, w oparciu o własny kod renderowania grafiki 3D. Rozwój wersji opartej na [[OpenGL]] rozpoczął Curtis Olson w 1997 roku, ale także wiele innych osób miało swój wkład w ten projekt.&lt;br /&gt;
&lt;br /&gt;
FlightGear włączył inne otwarto-źródłowe zasoby, w tym model lotu LaRCsim od NASA oraz powszechnie dostępne dane o elewacji terenu. Pierwsze działające pliki binarne, wykorzystujące OpenGL dla grafiki 3D, pojawiły się w 1997 roku. Entuzjastyczny rozwój kolejnych wersji przez kilka lat zaowocował stopniowo coraz bardziej stabilnymi i zaawansowanymi wersjami. W 2001 roku zespół regularnie wydawał nowe wersje beta, a w 2005 roku dojrzałość oprogramowania doprowadziła do szerszych recenzji i wzrostu popularności. W 2007 roku nastąpiło formalne wyjście z wersji beta wraz z wydaniem wersji 1.0.0, dziesięć lat po pierwszym wydaniu FlightGeara w 1997 roku.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|Kokpit 3D [[A-10]] w wersji 1.0.0, rok 2008]]&lt;br /&gt;
&lt;br /&gt;
W 2008 roku, wersja 1.9.0 FlightGeara przeszła z biblioteki [[PLIB]] na [[OSG]], co spowodowało tymczasową utratę niektórych funkcji programu, takich jak wyświetlanie chmury 3D i cienie, za to nowo wprowadzone funkcje, takie jak cząsteczki, nadały symulacji kolejny stopień realizmu.&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
Silnik symulacji we FlightGear to [[SimGear]]. Jest on używany zarówno jako aplikacja użytkownika końcowego jak i przy pracach badawczych w środowiskach akademickich w celu rozwoju zagadnień związanych z symulacją lotu.&lt;br /&gt;
&lt;br /&gt;
Przykładem na możliwość dostosowywania FlightGeara jest szeroki wachlarz modeli dostępnych statków powietrznych, od [[:Category:Gliders|szybowców]] przez [[Helicopter|śmigłowców]], [[:Category:Airliners|liniowce]], [[Military aircraft|myśliwców odrzutowych]] do [[Space Shuttle|Wahadłowca Kosmicznego]]. Modele te zostały wykonane i dodane do projektu przez wielu ochotników ze społeczności FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Od wersji 0.9.10 statki powietrzne we FlightGear używają jednego z trzech [[Flight Dynamics Model|modeli dynamiki lotu]] (FDM): [[JSBSim]], [[YASim]] lub [[UIUC]]. Obecnie wyłącznie jeden silnik terenu jest w użyciu, jest nim [[TerraGear]]. Dostępne efekty pogodowe to między innymi chmury 3D, efekty świetlne, pory dnia i nocy. &lt;br /&gt;
&lt;br /&gt;
=== Modele Dynamiki Lotu ===&lt;br /&gt;
[[Flight Dynamics Models|Model dynamiki lotu]] (FDM) odpowiada za to w jaki sposób w programie jest symulowany lot statku powietrznego. FlightGear korzysta z własnych oraz zewnętrznych projektów modeli dynamiki lotu. Każdy statek powietrzny musi być tak zaprogramowany, aby korzystał z jednego z dostępnych modeli dynamiki lotu. Obecnie FlightGear jest jedynym, graficznym symulatorem lotu korzystającym ze wszystkich wspomnianych modeli dynamiki lotu, a UIUC i YASim zostały rozwinięte z myślą i w szczególności dla FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Wczesne wersje programu używały FDM, który był oparty na [[LaRCsim]] od NASA. W kolejnych wersjach został on zastąpiony przez bardziej elastyczne FDM.&lt;br /&gt;
&lt;br /&gt;
* [[JSBSim]] - domyślny model dynamiki lotu od 2000 roku.&lt;br /&gt;
* [[YASim]] - inny FDM, używający odmiennych metod obliczeniowych. Wprowadzony od wersji 0.7.9 w 2002 roku.&lt;br /&gt;
* [[UIUC]] - kolejny FDM, rozwijany przez UIUC Applied Aerodynamics Group z Uniwersytetu w Illinois na Urbana-Champaign, bazujący na LaRCsim. Obecnie już wycofany z wersji deweloperskiej FlightGeara.&lt;br /&gt;
* FlightGear może być tak skonfigurowany, aby przyjmował dane z zewnętrznych źródeł FDM takich jak [[MATLAB]].&lt;br /&gt;
* Inne niestandardowe FDM zostały napisane dla specyficznych typów statków powietrznych jak balony i sterowce.&lt;br /&gt;
&lt;br /&gt;
=== Zależności FlightGeara ===&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnych tytułów, głównym rezultatem prac nad projektem jest publikacja kodu źródłowego. Aby skorzystać z programu, można samodzielnie skompilować udostępniony kod dla docelowej platformy.&lt;br /&gt;
&lt;br /&gt;
Wykorzystywane przez FlightGeara biblioteki zmieniały się na przestrzeni czasu. Najważniejszą zależnością pozostaje SimGear, będący silnikiem symulacji dla FlightGeara. [[TerraGear]] nie stanowi bezpośredniej zależności – jest raczej nazwą domyślnego silnika odpowiedzialnego za generowanie terenu.&lt;br /&gt;
&lt;br /&gt;
Do obsługi dźwięku wykorzystywany jest OpenAL (z włączonym wsparciem dla SDL od wersji 0.9.5), natomiast wcześniej w tym celu używano biblioteki PLIB, która odpowiadała również za obsługę sprzętu. Za renderowanie grafiki 3D odpowiada [[OpenGL]] – DirectX nie jest wspierany. Z FlightGearem zintegrowano także silnik graficzny [[OpenSceneGraph]]. Do kompilacji wymagane jest również użycie biblioteki Simple Direct Media Layer (SDL).&lt;br /&gt;
&lt;br /&gt;
Zakres zależności może się różnić w zależności od docelowej platformy. Użytkownicy mogą samodzielnie kompilować kod lub – jeśli nie jest on dostępny bezpośrednio w ramach projektu – korzystać z gotowych wersji binarnych przygotowanych przez osoby trzecie.&lt;br /&gt;
&lt;br /&gt;
== Sprzęt==&lt;br /&gt;
&lt;br /&gt;
Sprzęt konieczny do uruchomienia FlightGeara jest ograniczony do sprzętu, który wspiera [[OpenGL]] i akcelerację 3D, przy czym najlepiej wspierana jest NVIDIA. Wczesne wersje posiadały wsparcie dla kart 3dfx, jednak wsparcie to zostało wycofane wraz ze zwiększającymi się wymaganiami sprzętowymi.&lt;br /&gt;
&lt;br /&gt;
[[File:Fgrun-page2.jpg|thumb|left|270px|[[FlightGear Launch Control|FlightGear Launcher]]]]&lt;br /&gt;
== Dodatki i dostosowywanie ==&lt;br /&gt;
&lt;br /&gt;
Istnieją programy, które są zintegrowane z FlightGearem (zależności) lub są programami zewnętrznymi i współpracują z nim. Oprogramowanie takie może być częścią projektu FlightGear lub może być rozwijane niezależnie, ale udostępniane przez projekt FlightGear.&lt;br /&gt;
&lt;br /&gt;
Ważnym dodatkowym oprogramowaniem jest interfejs graficzny, służący do uruchomienia pliku wykonywalnego FlightGeara. We wczesnych wersjach, FlightGear mógł być uruchomiony jedynie z wykorzystaniem [[Pl/Opcje wiersza poleceń|opcji wiersza poleceń]]. Jednakże, w 2003 roku od wersji 0.9.3, został dołączony ''[[FlightGear Launch Control|FGRun]]'' - program startowy z interfejsem graficznym. Obecnie tę rolę spełnia ''[[FlightGear Qt launcher|QT Launcher]]''.&lt;br /&gt;
Podobną funkcję spełnia ''[[KFreeFlight]]'' dla środowiska KDE. ''FGTools'' jest alternatywnym front-endem dla środowiska Windows. ''FGKicker'' jest używany dla GTK+.&lt;br /&gt;
&lt;br /&gt;
Inne znaczące programy obejmują edytory i projekty związane z terenem. ''[[Atlas]]'' jest mapą dla FlightGeara; ''[[Kelpie Flight Planner]]'' to rozwijane w Javie narzędzie do planowania lotów.&lt;br /&gt;
''[[FlightGear Scenery Designer]]'' to edytor scenerii, pomocny przy pracy z danymi terenu. ''[[World Custom Scenery Project]]'' to projekt pomagający koordynować wspólne wysiłki na rzecz tworzenia scenerii. Na koniec edytor ''[[TaxiDraw]]'' do tworzenia nowych pasów startowych i dróg kołowania.&lt;br /&gt;
&lt;br /&gt;
=== Statki Powietrzne ===&lt;br /&gt;
{{Main article|Table of models}}&lt;br /&gt;
&lt;br /&gt;
Na początku, FlightGear dysponował tylko jednym statkiem powietrznym, był to Navion zawarty w projekcie LaRCsim od NASA, który w 2000 roku został zastąpiony przez Cessnę 172P. Rozwój UIUC i JSBSim przyniósł ze sobą kilka kolejnych samolotów, podobnie jak rozwój YASim, który od tego czasu stał się głównym FDM używanym we FlightGear. W wersji 2.12 dostępnych jest ponad 400 samolotów w ponad 900 unikalnych malowaniach, choć tylko kilka z nich wchodzi w skład pakietu podstawowego.&lt;br /&gt;
&lt;br /&gt;
[[File:EHAM.jpg|thumb|270px|[[Boeing 737-300|Boeing 733]] zaparkowany w scenerii [[EHAM]] ]]&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
{{Main article|Scenery}}&lt;br /&gt;
&lt;br /&gt;
Projekt [[World Scenery]] dla FlightGeara zawiera dane o wysokości i klasie terenu całego świata.&lt;br /&gt;
Obiekty takie jak terminale, wiatraki i mosty są zebrane w [[FlightGear Scenery Database|bazie danych scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Sieć i wiele monitorów ===&lt;br /&gt;
&lt;br /&gt;
Istnieje kilka możliwości, które pozwalają komunikować się jednej instancji FlightGeara z inną. Dostępny jest protokół [[Multiplayer Howto|multiplayer]], co umożliwia lot w formacji lub symulowanie kontroli ruchu lotniczego w sieci lokalnej. Protokół Multiplayer zostanie wkrótce tak rozbudowany, aby także pozwalał na pracę w internecie. Dodatkową cechą możliwości sieciowych jest opcja podglądu innych pilotów na mapach Google.&lt;br /&gt;
&lt;br /&gt;
Kilka instancji FlightGeara może zostać tak zsynchronizowana, aby korzystały z wielu monitorów. Możliwe jest uzyskanie bardzo dobrej synchronizacji między monitorami jeżeli wszystkie instancje FlightGeara będą pracowały z tą samą częstotliwością wyświetlania klatek.&lt;br /&gt;
&lt;br /&gt;
== Kod FlightGeara vs wersja binarna ==&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnego oprogramowania, data wydania dotyczy wyłącznie kodu źródłowego, a nie wersji binarnej. Aby stworzyć wykonywalny program, kod źródłowy musi zostać skompilowany, co wymaga kilku bibliotek, włączając w to kilka ogólnych oraz specyficznych dla platfory. Jednak jest to zbyt trudne zadanie dla wielu zwykłych użytkowników, dlatego ochotnicy społeczności pracują, aby udostępnić wersje binarne dla poszczególnych platform i systemów operacyjnych. Dystrybucje te różnią się poziomem stabilności, wydajnością, zależnościami, a także tym, jak aktualne są one w stosunku do kodu źródłowego. Dla przykładu, niektóre ze starszych wersji binarnych będą pracować poprawnie pod Mac OS 9, ale nowsze wydania wymagają określonych wersji Mac OS X.&lt;br /&gt;
&lt;br /&gt;
For example, by late 2012 the latest code release was 2.10 (pre-release) and 2.8.0 (final). Binaries are generally available for the last final code release on all major platforms. [http://www.flightgear.org/download/main-program/ Click here to proceed to the flightgear binaries download page]&lt;br /&gt;
&lt;br /&gt;
Przykładowo, pod koniec 2012 roku najnowszą wersją kodu była wersja 2.10 (przedpremierowa) i 2.8.0 (finalna). Pliki binarne są ogólnie dostępne dla ostatniego finalnego wydania kodu na wszystkich głównych platformach. Przejdź do naszej oficjalnej [https://www.flightgear.org/download/ strony pobierania] aby pobrać pliki binarne FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Pliki binarne dla innych platform, takich jak IRIX, nie są już obsługiwane, chociaż wydania sprzed 1.0 mogą działać i można je znaleźć w [[FlightGear Git|repozytoriach kodu źródłowego git]].&lt;br /&gt;
&lt;br /&gt;
== Recenzje FlightGear ==&lt;br /&gt;
{{Main article|FlightGear Reviews}}&lt;br /&gt;
&lt;br /&gt;
== Łącza zewnętrzne ==&lt;br /&gt;
{{Main article|Links}}&lt;br /&gt;
* {{Wikipedia|FlightGear}}&lt;br /&gt;
* [https://www.flightgear.org Oficjalna strona]&lt;br /&gt;
* {{forum link|text=Forum}}&lt;br /&gt;
* [https://sourceforge.net/p/flightgear/codetickets/ System śledzenia błędów]&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Oryginalna propozycja stworzenia FlightGear]&lt;br /&gt;
&lt;br /&gt;
== Źródła ==&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/FlightGear Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[ca:FlightGear]]&lt;br /&gt;
[[de:FlightGear]]&lt;br /&gt;
[[en:FlightGear]]&lt;br /&gt;
[[es:FlightGear]]&lt;br /&gt;
[[fr:FlightGear]]&lt;br /&gt;
[[it:FlightGear]]&lt;br /&gt;
[[nl:FlightGear]]&lt;br /&gt;
[[pt:FlightGear]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143881</id>
		<title>Pl/FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143881"/>
		<updated>2026-04-03T16:37:13Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Modele Dynamiki Lotu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
|title             = FlightGear Flight Simulator&lt;br /&gt;
|logo              = FlightGear logo.png&lt;br /&gt;
|logosize          = 200px&lt;br /&gt;
|image             = Boeing 777-200ER cockpit.jpg&lt;br /&gt;
|alt               = W kokpicie [[Boeing 777-200ER]]&lt;br /&gt;
|developedby       = Developerzy FlightGear i współtwórcy&lt;br /&gt;
|initialrelease    = Lipec 17, 1997&lt;br /&gt;
|latestrelease     = {{current release|full}} ({{#time: j xg Y | {{current release|fulldate}} | pl }})&lt;br /&gt;
|writtenin         = C/C++/Nasal&lt;br /&gt;
|os                = Windows, Linux, macOS oraz FreeBSD&lt;br /&gt;
|platform          = wieloplatformowy&lt;br /&gt;
|developmentstatus = Aktywny (1996-)&lt;br /&gt;
|type              = Symulator Lotu&lt;br /&gt;
|license           = [[GNU General Public License]]&lt;br /&gt;
|website           = https://www.flightgear.org/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:OV10A-NASA-in-action.jpg|thumb|right|270px|NASA [[OV-10]] we FlightGear 1.0]]&lt;br /&gt;
&lt;br /&gt;
'''FlightGear Flight Simulator''' (w skrócie '''FlightGear''' lub '''FGFS''') to zaawansowana, darmowa i całkowicie otwarto-źródłowa platforma symulacji lotu, stworzona przez wolontariuszy. FlightGear jest wydany na zasadach licencji [[GNU General Public License]] i jest on w większości napisany przy użyciu języka programowania C++.&lt;br /&gt;
&lt;br /&gt;
Coraz bardziej szczegółowe i zaawansowane wersje FlightGeara są corocznie wydawane od zapoczątkowania projektu w 1996 roku.&lt;br /&gt;
&lt;br /&gt;
Najnowsze publiczne wydanie dostępne jest do pobrania na [https://www.flightgear.org/download/ www.flightgear.org/download/] wraz z wersjami dla Microsoft Windows, macOS i Linux.&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
{{main article|FlightGear History}}&lt;br /&gt;
&lt;br /&gt;
Rozwój FlightGeara rozpoczął się od propozycji stworzenia otwarto-źródłowego symulatora w 1996 roku, w oparciu o własny kod renderowania grafiki 3D. Rozwój wersji opartej na [[OpenGL]] rozpoczął Curtis Olson w 1997 roku, ale także wiele innych osób miało swój wkład w ten projekt.&lt;br /&gt;
&lt;br /&gt;
FlightGear włączył inne otwarto-źródłowe zasoby, w tym model lotu LaRCsim od NASA oraz powszechnie dostępne dane o elewacji terenu. Pierwsze działające pliki binarne, wykorzystujące OpenGL dla grafiki 3D, pojawiły się w 1997 roku. Entuzjastyczny rozwój kolejnych wersji przez kilka lat zaowocował stopniowo coraz bardziej stabilnymi i zaawansowanymi wersjami. W 2001 roku zespół regularnie wydawał nowe wersje beta, a w 2005 roku dojrzałość oprogramowania doprowadziła do szerszych recenzji i wzrostu popularności. W 2007 roku nastąpiło formalne wyjście z wersji beta wraz z wydaniem wersji 1.0.0, dziesięć lat po pierwszym wydaniu FlightGeara w 1997 roku.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|Kokpit 3D [[A-10]] w wersji 1.0.0, rok 2008]]&lt;br /&gt;
&lt;br /&gt;
W 2008 roku, wersja 1.9.0 FlightGeara przeszła z biblioteki [[PLIB]] na [[OSG]], co spowodowało tymczasową utratę niektórych funkcji programu, takich jak wyświetlanie chmury 3D i cienie, za to nowo wprowadzone funkcje, takie jak cząsteczki, nadały symulacji kolejny stopień realizmu.&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
Silnik symulacji we FlightGear to [[SimGear]]. Jest on używany zarówno jako aplikacja użytkownika końcowego jak i przy pracach badawczych w środowiskach akademickich w celu rozwoju zagadnień związanych z symulacją lotu.&lt;br /&gt;
&lt;br /&gt;
Przykładem na możliwość dostosowywania FlightGeara jest szeroki wachlarz modeli dostępnych statków powietrznych, od [[:Category:Gliders|szybowców]] przez [[Helicopter|śmigłowców]], [[:Category:Airliners|liniowce]], [[Military aircraft|myśliwców odrzutowych]] do [[Space Shuttle|Wahadłowca Kosmicznego]]. Modele te zostały wykonane i dodane do projektu przez wielu ochotników ze społeczności FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Od wersji 0.9.10 statki powietrzne we FlightGear używają jednego z trzech [[Flight Dynamics Model|modeli dynamiki lotu]] (FDM): [[JSBSim]], [[YASim]] lub [[UIUC]]. Obecnie wyłącznie jeden silnik terenu jest w użyciu, jest nim [[TerraGear]]. Dostępne efekty pogodowe to między innymi chmury 3D, efekty świetlne, pory dnia i nocy. &lt;br /&gt;
&lt;br /&gt;
=== Modele Dynamiki Lotu ===&lt;br /&gt;
[[Flight Dynamics Models|Model dynamiki lotu]] (FDM) odpowiada za to w jaki sposób w programie jest symulowany lot statku powietrznego. FlightGear korzysta z własnych oraz zewnętrznych projektów modeli dynamiki lotu. Każdy statek powietrzny musi być tak zaprogramowany, aby korzystał z jednego z dostępnych modeli dynamiki lotu. Obecnie FlightGear jest jedynym, graficznym symulatorem lotu korzystającym ze wszystkich wspomnianych modeli dynamiki lotu, a UIUC i YASim zostały rozwinięte z myślą i w szczególności dla FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Wczesne wersje programu używały FDM, który był oparty na [[LaRCsim]] od NASA. W kolejnych wersjach został on zastąpiony przez bardziej elastyczne FDM.&lt;br /&gt;
&lt;br /&gt;
* [[JSBSim]] - domyślny model dynamiki lotu od 2000 roku.&lt;br /&gt;
* [[YASim]] - inny FDM, używający odmiennych metod obliczeniowych. Wprowadzony od wersji 0.7.9 w 2002 roku.&lt;br /&gt;
* [[UIUC]] - kolejny FDM, rozwijany przez UIUC Applied Aerodynamics Group z Uniwersytetu w Illinois na Urbana-Champaign, bazujący na LaRCsim. Obecnie już wycofany z wersji deweloperskiej FlightGeara.&lt;br /&gt;
* FlightGear może być tak skonfigurowany, aby przyjmował dane z zewnętrznych źródeł FDM takich jak [[MATLAB]].&lt;br /&gt;
* Inne niestandardowe FDM zostały napisane dla specyficznych typów statków powietrznych jak balony i sterowce.&lt;br /&gt;
&lt;br /&gt;
=== Zależności FlightGeara ===&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnych tytułów, głównym wynikiem pracy projektu jest wydanie zestawu kodów źródłowych. Aby użyć programu należy skompilować udostępniony kod dla docelowej platformy, na której ma pracować. Biblioteki użyte przez FlightGeara były różne w zależności od okresu. Główną biblioteką zależną jest SimGear, która jest silnikiem symulacji dla FlightGeara. [[TerraGear]] nie jest zależnością, a raczej tylko nazwą dla domyślnego silnika odpowiadającego za generowanie terenu we FlightGear. OpenAL jest używany dla obsługi dźwięku, włączając wsparcie dla SDL (od wersji 0.9.5). PLIB jest użyte do obsługi sprzętowej, także dla obsługi dźwięku przed wprowadzeniem OpenAL. [[OpenGL]] jest użyty dla swoich funkcji 3D, DirectX nie jest wspierany. Silnik graficzny [[OpenSceneGraph]] jest również zintegrowany z FlightGearem. Na koniec do kompilacji jest konieczna biblioteka Simple Direct Media Layer (SDL). Niektóre zależności mogą się różnić w zależności od tego na jaką platformę docelową jest kompilowany kod. Użytkownicy FlightGeara powinni sami kompilować kod lub jeżeli nie jest on dostępny w ramach projektu, korzystać z wersji binarnej udostępnionej przez osoby trzecie.&lt;br /&gt;
&lt;br /&gt;
== Sprzęt==&lt;br /&gt;
&lt;br /&gt;
Sprzęt konieczny do uruchomienia FlightGeara jest ograniczony do sprzętu, który wspiera [[OpenGL]] i akcelerację 3D, przy czym najlepiej wspierana jest NVIDIA. Wczesne wersje posiadały wsparcie dla kart 3dfx, jednak wsparcie to zostało wycofane wraz ze zwiększającymi się wymaganiami sprzętowymi.&lt;br /&gt;
&lt;br /&gt;
[[File:Fgrun-page2.jpg|thumb|left|270px|[[FlightGear Launch Control|FlightGear Launcher]]]]&lt;br /&gt;
== Dodatki i dostosowywanie ==&lt;br /&gt;
&lt;br /&gt;
Istnieją programy, które są zintegrowane z FlightGearem (zależności) lub są programami zewnętrznymi i współpracują z nim. Oprogramowanie takie może być częścią projektu FlightGear lub może być rozwijane niezależnie, ale udostępniane przez projekt FlightGear.&lt;br /&gt;
&lt;br /&gt;
Ważnym dodatkowym oprogramowaniem jest interfejs graficzny, służący do uruchomienia pliku wykonywalnego FlightGeara. We wczesnych wersjach, FlightGear mógł być uruchomiony jedynie z wykorzystaniem [[Pl/Opcje wiersza poleceń|opcji wiersza poleceń]]. Jednakże, w 2003 roku od wersji 0.9.3, został dołączony ''[[FlightGear Launch Control|FGRun]]'' - program startowy z interfejsem graficznym. Obecnie tę rolę spełnia ''[[FlightGear Qt launcher|QT Launcher]]''.&lt;br /&gt;
Podobną funkcję spełnia ''[[KFreeFlight]]'' dla środowiska KDE. ''FGTools'' jest alternatywnym front-endem dla środowiska Windows. ''FGKicker'' jest używany dla GTK+.&lt;br /&gt;
&lt;br /&gt;
Inne znaczące programy obejmują edytory i projekty związane z terenem. ''[[Atlas]]'' jest mapą dla FlightGeara; ''[[Kelpie Flight Planner]]'' to rozwijane w Javie narzędzie do planowania lotów.&lt;br /&gt;
''[[FlightGear Scenery Designer]]'' to edytor scenerii, pomocny przy pracy z danymi terenu. ''[[World Custom Scenery Project]]'' to projekt pomagający koordynować wspólne wysiłki na rzecz tworzenia scenerii. Na koniec edytor ''[[TaxiDraw]]'' do tworzenia nowych pasów startowych i dróg kołowania.&lt;br /&gt;
&lt;br /&gt;
=== Statki Powietrzne ===&lt;br /&gt;
{{Main article|Table of models}}&lt;br /&gt;
&lt;br /&gt;
Na początku, FlightGear dysponował tylko jednym statkiem powietrznym, był to Navion zawarty w projekcie LaRCsim od NASA, który w 2000 roku został zastąpiony przez Cessnę 172P. Rozwój UIUC i JSBSim przyniósł ze sobą kilka kolejnych samolotów, podobnie jak rozwój YASim, który od tego czasu stał się głównym FDM używanym we FlightGear. W wersji 2.12 dostępnych jest ponad 400 samolotów w ponad 900 unikalnych malowaniach, choć tylko kilka z nich wchodzi w skład pakietu podstawowego.&lt;br /&gt;
&lt;br /&gt;
[[File:EHAM.jpg|thumb|270px|[[Boeing 737-300|Boeing 733]] zaparkowany w scenerii [[EHAM]] ]]&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
{{Main article|Scenery}}&lt;br /&gt;
&lt;br /&gt;
Projekt [[World Scenery]] dla FlightGeara zawiera dane o wysokości i klasie terenu całego świata.&lt;br /&gt;
Obiekty takie jak terminale, wiatraki i mosty są zebrane w [[FlightGear Scenery Database|bazie danych scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Sieć i wiele monitorów ===&lt;br /&gt;
&lt;br /&gt;
Istnieje kilka możliwości, które pozwalają komunikować się jednej instancji FlightGeara z inną. Dostępny jest protokół [[Multiplayer Howto|multiplayer]], co umożliwia lot w formacji lub symulowanie kontroli ruchu lotniczego w sieci lokalnej. Protokół Multiplayer zostanie wkrótce tak rozbudowany, aby także pozwalał na pracę w internecie. Dodatkową cechą możliwości sieciowych jest opcja podglądu innych pilotów na mapach Google.&lt;br /&gt;
&lt;br /&gt;
Kilka instancji FlightGeara może zostać tak zsynchronizowana, aby korzystały z wielu monitorów. Możliwe jest uzyskanie bardzo dobrej synchronizacji między monitorami jeżeli wszystkie instancje FlightGeara będą pracowały z tą samą częstotliwością wyświetlania klatek.&lt;br /&gt;
&lt;br /&gt;
== Kod FlightGeara vs wersja binarna ==&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnego oprogramowania, data wydania dotyczy wyłącznie kodu źródłowego, a nie wersji binarnej. Aby stworzyć wykonywalny program, kod źródłowy musi zostać skompilowany, co wymaga kilku bibliotek, włączając w to kilka ogólnych oraz specyficznych dla platfory. Jednak jest to zbyt trudne zadanie dla wielu zwykłych użytkowników, dlatego ochotnicy społeczności pracują, aby udostępnić wersje binarne dla poszczególnych platform i systemów operacyjnych. Dystrybucje te różnią się poziomem stabilności, wydajnością, zależnościami, a także tym, jak aktualne są one w stosunku do kodu źródłowego. Dla przykładu, niektóre ze starszych wersji binarnych będą pracować poprawnie pod Mac OS 9, ale nowsze wydania wymagają określonych wersji Mac OS X.&lt;br /&gt;
&lt;br /&gt;
For example, by late 2012 the latest code release was 2.10 (pre-release) and 2.8.0 (final). Binaries are generally available for the last final code release on all major platforms. [http://www.flightgear.org/download/main-program/ Click here to proceed to the flightgear binaries download page]&lt;br /&gt;
&lt;br /&gt;
Przykładowo, pod koniec 2012 roku najnowszą wersją kodu była wersja 2.10 (przedpremierowa) i 2.8.0 (finalna). Pliki binarne są ogólnie dostępne dla ostatniego finalnego wydania kodu na wszystkich głównych platformach. Przejdź do naszej oficjalnej [https://www.flightgear.org/download/ strony pobierania] aby pobrać pliki binarne FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Pliki binarne dla innych platform, takich jak IRIX, nie są już obsługiwane, chociaż wydania sprzed 1.0 mogą działać i można je znaleźć w [[FlightGear Git|repozytoriach kodu źródłowego git]].&lt;br /&gt;
&lt;br /&gt;
== Recenzje FlightGear ==&lt;br /&gt;
{{Main article|FlightGear Reviews}}&lt;br /&gt;
&lt;br /&gt;
== Łącza zewnętrzne ==&lt;br /&gt;
{{Main article|Links}}&lt;br /&gt;
* {{Wikipedia|FlightGear}}&lt;br /&gt;
* [https://www.flightgear.org Oficjalna strona]&lt;br /&gt;
* {{forum link|text=Forum}}&lt;br /&gt;
* [https://sourceforge.net/p/flightgear/codetickets/ System śledzenia błędów]&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Oryginalna propozycja stworzenia FlightGear]&lt;br /&gt;
&lt;br /&gt;
== Źródła ==&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/FlightGear Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[ca:FlightGear]]&lt;br /&gt;
[[de:FlightGear]]&lt;br /&gt;
[[en:FlightGear]]&lt;br /&gt;
[[es:FlightGear]]&lt;br /&gt;
[[fr:FlightGear]]&lt;br /&gt;
[[it:FlightGear]]&lt;br /&gt;
[[nl:FlightGear]]&lt;br /&gt;
[[pt:FlightGear]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143880</id>
		<title>Pl/FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Pl/FlightGear&amp;diff=143880"/>
		<updated>2026-04-03T16:33:53Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
|title             = FlightGear Flight Simulator&lt;br /&gt;
|logo              = FlightGear logo.png&lt;br /&gt;
|logosize          = 200px&lt;br /&gt;
|image             = Boeing 777-200ER cockpit.jpg&lt;br /&gt;
|alt               = W kokpicie [[Boeing 777-200ER]]&lt;br /&gt;
|developedby       = Developerzy FlightGear i współtwórcy&lt;br /&gt;
|initialrelease    = Lipec 17, 1997&lt;br /&gt;
|latestrelease     = {{current release|full}} ({{#time: j xg Y | {{current release|fulldate}} | pl }})&lt;br /&gt;
|writtenin         = C/C++/Nasal&lt;br /&gt;
|os                = Windows, Linux, macOS oraz FreeBSD&lt;br /&gt;
|platform          = wieloplatformowy&lt;br /&gt;
|developmentstatus = Aktywny (1996-)&lt;br /&gt;
|type              = Symulator Lotu&lt;br /&gt;
|license           = [[GNU General Public License]]&lt;br /&gt;
|website           = https://www.flightgear.org/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:OV10A-NASA-in-action.jpg|thumb|right|270px|NASA [[OV-10]] we FlightGear 1.0]]&lt;br /&gt;
&lt;br /&gt;
'''FlightGear Flight Simulator''' (w skrócie '''FlightGear''' lub '''FGFS''') to zaawansowana, darmowa i całkowicie otwarto-źródłowa platforma symulacji lotu, stworzona przez wolontariuszy. FlightGear jest wydany na zasadach licencji [[GNU General Public License]] i jest on w większości napisany przy użyciu języka programowania C++.&lt;br /&gt;
&lt;br /&gt;
Coraz bardziej szczegółowe i zaawansowane wersje FlightGeara są corocznie wydawane od zapoczątkowania projektu w 1996 roku.&lt;br /&gt;
&lt;br /&gt;
Najnowsze publiczne wydanie dostępne jest do pobrania na [https://www.flightgear.org/download/ www.flightgear.org/download/] wraz z wersjami dla Microsoft Windows, macOS i Linux.&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
{{main article|FlightGear History}}&lt;br /&gt;
&lt;br /&gt;
Rozwój FlightGeara rozpoczął się od propozycji stworzenia otwarto-źródłowego symulatora w 1996 roku, w oparciu o własny kod renderowania grafiki 3D. Rozwój wersji opartej na [[OpenGL]] rozpoczął Curtis Olson w 1997 roku, ale także wiele innych osób miało swój wkład w ten projekt.&lt;br /&gt;
&lt;br /&gt;
FlightGear włączył inne otwarto-źródłowe zasoby, w tym model lotu LaRCsim od NASA oraz powszechnie dostępne dane o elewacji terenu. Pierwsze działające pliki binarne, wykorzystujące OpenGL dla grafiki 3D, pojawiły się w 1997 roku. Entuzjastyczny rozwój kolejnych wersji przez kilka lat zaowocował stopniowo coraz bardziej stabilnymi i zaawansowanymi wersjami. W 2001 roku zespół regularnie wydawał nowe wersje beta, a w 2005 roku dojrzałość oprogramowania doprowadziła do szerszych recenzji i wzrostu popularności. W 2007 roku nastąpiło formalne wyjście z wersji beta wraz z wydaniem wersji 1.0.0, dziesięć lat po pierwszym wydaniu FlightGeara w 1997 roku.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|Kokpit 3D [[A-10]] w wersji 1.0.0, rok 2008]]&lt;br /&gt;
&lt;br /&gt;
W 2008 roku, wersja 1.9.0 FlightGeara przeszła z biblioteki [[PLIB]] na [[OSG]], co spowodowało tymczasową utratę niektórych funkcji programu, takich jak wyświetlanie chmury 3D i cienie, za to nowo wprowadzone funkcje, takie jak cząsteczki, nadały symulacji kolejny stopień realizmu.&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
Silnik symulacji we FlightGear to [[SimGear]]. Jest on używany zarówno jako aplikacja użytkownika końcowego jak i przy pracach badawczych w środowiskach akademickich w celu rozwoju zagadnień związanych z symulacją lotu.&lt;br /&gt;
&lt;br /&gt;
Przykładem na możliwość dostosowywania FlightGeara jest szeroki wachlarz modeli dostępnych statków powietrznych, od [[:Category:Gliders|szybowców]] przez [[Helicopter|śmigłowców]], [[:Category:Airliners|liniowce]], [[Military aircraft|myśliwców odrzutowych]] do [[Space Shuttle|Wahadłowca Kosmicznego]]. Modele te zostały wykonane i dodane do projektu przez wielu ochotników ze społeczności FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Od wersji 0.9.10 statki powietrzne we FlightGear używają jednego z trzech [[Flight Dynamics Model|modeli dynamiki lotu]] (FDM): [[JSBSim]], [[YASim]] lub [[UIUC]]. Obecnie wyłącznie jeden silnik terenu jest w użyciu, jest nim [[TerraGear]]. Dostępne efekty pogodowe to między innymi chmury 3D, efekty świetlne, pory dnia i nocy. &lt;br /&gt;
&lt;br /&gt;
=== Modele Dynamiki Lotu ===&lt;br /&gt;
[[Flight Dynamics Models|Model dynamiki lotu]] (FDM) odpowiada za to w jaki sposób w programie jest symulowany lot statku powietrznego. FlightGear korzysta z własnych oraz zewnętrznych projektów modeli dynamiki lotu. Każdy statek powietrzny musi być tak zaprogramowany, aby korzystał z jednego z dostępnych modeli dynamiki lotu. Obecnie FlightGear jest jedynym, graficznym symulatorem lotu korzystającym ze wszystkich wspomnianych modeli dynamiki lotu, a UIUC i YASim zostały rozwinięte z myślą i w szczególności dla FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Wczesne wersje programu używały FDM, który był oparty na [[LaRCsim]] od NASA. W kolejnych wersjach został on zastąpiony przez bardziej elastyczne FDM.&lt;br /&gt;
&lt;br /&gt;
* [[JSBSim]] - domyślny model dynamiki lotu od 2000 roku.&lt;br /&gt;
* [[YASim]] - inny FDM, używający odmiennych metod obliczeniowych. Wprowadzony od wersji 0.7.9 w 2002 roku.&lt;br /&gt;
* [[UIUC]] - kolejny FDM, rozwinięty przez UIUC Applied Aerodynamics Group z Uniwersytetu w Illinois na Urbana-Champaign, bazujący na LaRCsim.&lt;br /&gt;
* FlightGear może być tak skonfigurowany tak, aby przyjmował dane z zewnętrznych źródeł FDM takich jak [[MATLAB]].&lt;br /&gt;
* Inne niestandardowe FDM zostały napisane dla specyficznych typów statków powietrznych jak balony i sterowce.&lt;br /&gt;
&lt;br /&gt;
=== Zależności FlightGeara ===&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnych tytułów, głównym wynikiem pracy projektu jest wydanie zestawu kodów źródłowych. Aby użyć programu należy skompilować udostępniony kod dla docelowej platformy, na której ma pracować. Biblioteki użyte przez FlightGeara były różne w zależności od okresu. Główną biblioteką zależną jest SimGear, która jest silnikiem symulacji dla FlightGeara. [[TerraGear]] nie jest zależnością, a raczej tylko nazwą dla domyślnego silnika odpowiadającego za generowanie terenu we FlightGear. OpenAL jest używany dla obsługi dźwięku, włączając wsparcie dla SDL (od wersji 0.9.5). PLIB jest użyte do obsługi sprzętowej, także dla obsługi dźwięku przed wprowadzeniem OpenAL. [[OpenGL]] jest użyty dla swoich funkcji 3D, DirectX nie jest wspierany. Silnik graficzny [[OpenSceneGraph]] jest również zintegrowany z FlightGearem. Na koniec do kompilacji jest konieczna biblioteka Simple Direct Media Layer (SDL). Niektóre zależności mogą się różnić w zależności od tego na jaką platformę docelową jest kompilowany kod. Użytkownicy FlightGeara powinni sami kompilować kod lub jeżeli nie jest on dostępny w ramach projektu, korzystać z wersji binarnej udostępnionej przez osoby trzecie.&lt;br /&gt;
&lt;br /&gt;
== Sprzęt==&lt;br /&gt;
&lt;br /&gt;
Sprzęt konieczny do uruchomienia FlightGeara jest ograniczony do sprzętu, który wspiera [[OpenGL]] i akcelerację 3D, przy czym najlepiej wspierana jest NVIDIA. Wczesne wersje posiadały wsparcie dla kart 3dfx, jednak wsparcie to zostało wycofane wraz ze zwiększającymi się wymaganiami sprzętowymi.&lt;br /&gt;
&lt;br /&gt;
[[File:Fgrun-page2.jpg|thumb|left|270px|[[FlightGear Launch Control|FlightGear Launcher]]]]&lt;br /&gt;
== Dodatki i dostosowywanie ==&lt;br /&gt;
&lt;br /&gt;
Istnieją programy, które są zintegrowane z FlightGearem (zależności) lub są programami zewnętrznymi i współpracują z nim. Oprogramowanie takie może być częścią projektu FlightGear lub może być rozwijane niezależnie, ale udostępniane przez projekt FlightGear.&lt;br /&gt;
&lt;br /&gt;
Ważnym dodatkowym oprogramowaniem jest interfejs graficzny, służący do uruchomienia pliku wykonywalnego FlightGeara. We wczesnych wersjach, FlightGear mógł być uruchomiony jedynie z wykorzystaniem [[Pl/Opcje wiersza poleceń|opcji wiersza poleceń]]. Jednakże, w 2003 roku od wersji 0.9.3, został dołączony ''[[FlightGear Launch Control|FGRun]]'' - program startowy z interfejsem graficznym. Obecnie tę rolę spełnia ''[[FlightGear Qt launcher|QT Launcher]]''.&lt;br /&gt;
Podobną funkcję spełnia ''[[KFreeFlight]]'' dla środowiska KDE. ''FGTools'' jest alternatywnym front-endem dla środowiska Windows. ''FGKicker'' jest używany dla GTK+.&lt;br /&gt;
&lt;br /&gt;
Inne znaczące programy obejmują edytory i projekty związane z terenem. ''[[Atlas]]'' jest mapą dla FlightGeara; ''[[Kelpie Flight Planner]]'' to rozwijane w Javie narzędzie do planowania lotów.&lt;br /&gt;
''[[FlightGear Scenery Designer]]'' to edytor scenerii, pomocny przy pracy z danymi terenu. ''[[World Custom Scenery Project]]'' to projekt pomagający koordynować wspólne wysiłki na rzecz tworzenia scenerii. Na koniec edytor ''[[TaxiDraw]]'' do tworzenia nowych pasów startowych i dróg kołowania.&lt;br /&gt;
&lt;br /&gt;
=== Statki Powietrzne ===&lt;br /&gt;
{{Main article|Table of models}}&lt;br /&gt;
&lt;br /&gt;
Na początku, FlightGear dysponował tylko jednym statkiem powietrznym, był to Navion zawarty w projekcie LaRCsim od NASA, który w 2000 roku został zastąpiony przez Cessnę 172P. Rozwój UIUC i JSBSim przyniósł ze sobą kilka kolejnych samolotów, podobnie jak rozwój YASim, który od tego czasu stał się głównym FDM używanym we FlightGear. W wersji 2.12 dostępnych jest ponad 400 samolotów w ponad 900 unikalnych malowaniach, choć tylko kilka z nich wchodzi w skład pakietu podstawowego.&lt;br /&gt;
&lt;br /&gt;
[[File:EHAM.jpg|thumb|270px|[[Boeing 737-300|Boeing 733]] zaparkowany w scenerii [[EHAM]] ]]&lt;br /&gt;
&lt;br /&gt;
=== Sceneria ===&lt;br /&gt;
{{Main article|Scenery}}&lt;br /&gt;
&lt;br /&gt;
Projekt [[World Scenery]] dla FlightGeara zawiera dane o wysokości i klasie terenu całego świata.&lt;br /&gt;
Obiekty takie jak terminale, wiatraki i mosty są zebrane w [[FlightGear Scenery Database|bazie danych scenerii]].&lt;br /&gt;
&lt;br /&gt;
=== Sieć i wiele monitorów ===&lt;br /&gt;
&lt;br /&gt;
Istnieje kilka możliwości, które pozwalają komunikować się jednej instancji FlightGeara z inną. Dostępny jest protokół [[Multiplayer Howto|multiplayer]], co umożliwia lot w formacji lub symulowanie kontroli ruchu lotniczego w sieci lokalnej. Protokół Multiplayer zostanie wkrótce tak rozbudowany, aby także pozwalał na pracę w internecie. Dodatkową cechą możliwości sieciowych jest opcja podglądu innych pilotów na mapach Google.&lt;br /&gt;
&lt;br /&gt;
Kilka instancji FlightGeara może zostać tak zsynchronizowana, aby korzystały z wielu monitorów. Możliwe jest uzyskanie bardzo dobrej synchronizacji między monitorami jeżeli wszystkie instancje FlightGeara będą pracowały z tą samą częstotliwością wyświetlania klatek.&lt;br /&gt;
&lt;br /&gt;
== Kod FlightGeara vs wersja binarna ==&lt;br /&gt;
&lt;br /&gt;
W przeciwieństwie do komercyjnego oprogramowania, data wydania dotyczy wyłącznie kodu źródłowego, a nie wersji binarnej. Aby stworzyć wykonywalny program, kod źródłowy musi zostać skompilowany, co wymaga kilku bibliotek, włączając w to kilka ogólnych oraz specyficznych dla platfory. Jednak jest to zbyt trudne zadanie dla wielu zwykłych użytkowników, dlatego ochotnicy społeczności pracują, aby udostępnić wersje binarne dla poszczególnych platform i systemów operacyjnych. Dystrybucje te różnią się poziomem stabilności, wydajnością, zależnościami, a także tym, jak aktualne są one w stosunku do kodu źródłowego. Dla przykładu, niektóre ze starszych wersji binarnych będą pracować poprawnie pod Mac OS 9, ale nowsze wydania wymagają określonych wersji Mac OS X.&lt;br /&gt;
&lt;br /&gt;
For example, by late 2012 the latest code release was 2.10 (pre-release) and 2.8.0 (final). Binaries are generally available for the last final code release on all major platforms. [http://www.flightgear.org/download/main-program/ Click here to proceed to the flightgear binaries download page]&lt;br /&gt;
&lt;br /&gt;
Przykładowo, pod koniec 2012 roku najnowszą wersją kodu była wersja 2.10 (przedpremierowa) i 2.8.0 (finalna). Pliki binarne są ogólnie dostępne dla ostatniego finalnego wydania kodu na wszystkich głównych platformach. Przejdź do naszej oficjalnej [https://www.flightgear.org/download/ strony pobierania] aby pobrać pliki binarne FlightGeara.&lt;br /&gt;
&lt;br /&gt;
Pliki binarne dla innych platform, takich jak IRIX, nie są już obsługiwane, chociaż wydania sprzed 1.0 mogą działać i można je znaleźć w [[FlightGear Git|repozytoriach kodu źródłowego git]].&lt;br /&gt;
&lt;br /&gt;
== Recenzje FlightGear ==&lt;br /&gt;
{{Main article|FlightGear Reviews}}&lt;br /&gt;
&lt;br /&gt;
== Łącza zewnętrzne ==&lt;br /&gt;
{{Main article|Links}}&lt;br /&gt;
* {{Wikipedia|FlightGear}}&lt;br /&gt;
* [https://www.flightgear.org Oficjalna strona]&lt;br /&gt;
* {{forum link|text=Forum}}&lt;br /&gt;
* [https://sourceforge.net/p/flightgear/codetickets/ System śledzenia błędów]&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Oryginalna propozycja stworzenia FlightGear]&lt;br /&gt;
&lt;br /&gt;
== Źródła ==&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/FlightGear Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[ca:FlightGear]]&lt;br /&gt;
[[de:FlightGear]]&lt;br /&gt;
[[en:FlightGear]]&lt;br /&gt;
[[es:FlightGear]]&lt;br /&gt;
[[fr:FlightGear]]&lt;br /&gt;
[[it:FlightGear]]&lt;br /&gt;
[[nl:FlightGear]]&lt;br /&gt;
[[pt:FlightGear]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Bendix/King_KAP140_Autopilot&amp;diff=143868</id>
		<title>Bendix/King KAP140 Autopilot</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Bendix/King_KAP140_Autopilot&amp;diff=143868"/>
		<updated>2026-04-01T16:11:06Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''''Bendix/King KAP 140''''' '''Two Axis/Altitude Preselect Autopilot System''' is the [[autopilot]] of the default [[Cessna 172]], controlling the [[elevator]] and [[aileron]]s.&lt;br /&gt;
&lt;br /&gt;
== Quick Guide ==&lt;br /&gt;
[[File:KAP140.jpg|KAP140 Two Axis with Preselect Altitude]]&lt;br /&gt;
&lt;br /&gt;
Normally the autopilot boots as soon as the electrical system has power&amp;lt;ref&amp;gt;newer models simulate preflight checks, so it's not immediately available after power-on.&amp;lt;/ref&amp;gt;. It is commonly wired to an electrical avionics bus and secured by a dedicated breaker; if it stays dark, check power, avionics bus switches and the breaker.&lt;br /&gt;
&lt;br /&gt;
# To activate the autopilot in wings level (ROL) and vertical speed (VS) modes, press and hold the AP button for 0.25 seconds&amp;lt;ref&amp;gt;for older models, just press&amp;lt;/ref&amp;gt;. The autopilot will try to keep the wings level by keeping the turn rate at zero. The autopilot will also try to maintain the vertical speed at activation. Use the UP and DN buttons to set the desired vertical speed.&lt;br /&gt;
# With the autopilot active you can use the HDG button to toggle between wings level (ROL) and heading select (HDG) modes. In heading select mode the autopilot will try to maintain the heading selected by the heading bug on the directional gyro.&lt;br /&gt;
# Use NAV button to toggle between navigation mode (NAV) and wings level (ROL) mode. NAV mode is flying to NAV1 or GPS. That is one of the Heading modes in KAP140 that direction when heading bug OBS operated. Please be careful.&lt;br /&gt;
# Toggle other mode and approach (APR) mode when APR button pushed and following marker beacon, VOR, GPS and [[ILS]] (localizer and glide slope) for automatic approach. This mode is recommended for instrument approach.&lt;br /&gt;
# The REV button enables the back course mode having the autopilot flying away from the runway. This mode is like APR mode except that the direction is away from the localizer (LOC) and that glide slope (GS) is not used.&lt;br /&gt;
# Use the ALT button to toggle between vertical speed (VS) and altitude hold (ALT) modes. In altitude hold mode the UP and DN buttons change the altitude by 20 feet per press.&lt;br /&gt;
# The ARM button enables altitude preselect by the rotary knob using procedure below, pushing it again disables altitude preselect.&lt;br /&gt;
## Input the current atmospheric pressure using the BARO button and rotary knob&lt;br /&gt;
## Check that the display is showing altitude and set your desired altitude, using the rotary knob. &lt;br /&gt;
## Set your desired vertical speed using UP and DN button.&lt;br /&gt;
## Press the ARM button that is enable ARM mode.&lt;br /&gt;
# The BARO button sets the atmospheric pressure. When the BARO button is pushed, enter desired atmospheric pressure using the rotary dial/knob. When pushed long, it switches the setting display to hPa (and back)&amp;lt;ref&amp;gt;only on newer simulated models&amp;lt;/ref&amp;gt; (hint: you can do InHG&amp;lt;&amp;gt;hPa conversion easily with this)&lt;br /&gt;
# Press the AP button to deactivate the autopilot. The horizontal and vertical modes can not be activated independently.&lt;br /&gt;
&lt;br /&gt;
Please read the Pilot's Guide for complete instructions on the use of the KAP140 Autopilot system.&lt;br /&gt;
&lt;br /&gt;
== Limits ==&lt;br /&gt;
* Not certified for use below 200ft [[AGL]], below 80 or above 160 knots [[IAS]] or when alternate static port is active.&lt;br /&gt;
* Only activate when flaps are retracted.&lt;br /&gt;
* Do not override the autopilot with flight controls, instead deactivate it temporarily to make manual adjustments.&lt;br /&gt;
* Do not activate the autopilot near the ground (takeoff, landing) or at low speeds: it will mess up and may crash you into the ground.&lt;br /&gt;
* It also has no autoland capability, so it can't land you based on ILS signals.&lt;br /&gt;
* Don't activate it when in an unstable or mistrimmed flight attitude. Tough it will try(!) to stabilize the plane, this is unsafe.&lt;br /&gt;
* It will not rescue you out of a stall, so watch the airspeed regularly. If the plane slows down, the autopilot will increase pitch to maintain the VS/ALT mode ordered, putting you into a stall. Disengage the autopilot and manually stabilize your flight.&lt;br /&gt;
* Altitude catching only works if you are flying towards the desired setting. For example, if you are at 1500ft, entered 2000ft as target and then descend, it will not intercept but fly you into the ground. Similarly, if you enter an altitude below you and accidentally climb, you will eventually reach the planes service ceiling and stall. The &amp;quot;ALT ARM&amp;quot; mode does not mean &amp;quot;bring me to that altitude&amp;quot;.&lt;br /&gt;
* Like with altitude interception, intercepting a VOR radial or ILS will not work, if the heading bug was not aligned or if you try to intercept from a custom angle (ie. engaging NAV mode from ROL).&lt;br /&gt;
&lt;br /&gt;
== Altitude alert (beeping sound) ==&lt;br /&gt;
A nice feature for assisting manual flights is the altitude alert. This is the aural beeping alert when you get near the selected altitude preset:&lt;br /&gt;
* When getting near 1000ft of the selected altitude, it starts to beep five times and show a steady &amp;quot;ALERT&amp;quot; right below the altitude.&lt;br /&gt;
* When intercepting the altitude, the ALERT annunciator vanishes if you get 200ft near, and will shortly flash up when crossing the selected altitude to signal it &amp;quot;catched on&amp;quot;.&lt;br /&gt;
* When now exceeding the +-200ft band, it will alert by flashing and beeping.&lt;br /&gt;
&lt;br /&gt;
This feature just needs a calibrated baro setting and a selected altitude, thus it is also active when using the modes utilizing altitude preset described below.&lt;br /&gt;
&lt;br /&gt;
== Example workflow ==&lt;br /&gt;
This example tries to show you how to deal with the autopilot to achieve common tasks. There are more advanced techniques to achieve with the autopilot, but they are out of scope for this quick introduction. Please refer to the 'KAP 140 Pilot's Guide' which is linked below.&lt;br /&gt;
&lt;br /&gt;
For better familiarization it would be good to follow trough the following guide inside flightgear.&lt;br /&gt;
&lt;br /&gt;
{{note| Be aware of procedure differences when you have an [[HSI|Horizontal Situation Indicator (HSI)]] installed in the aircraft: In this case, the KAP 140 will not have an automatic 45°-Intercept for NAV/APR/REV modes when switching from HDG-mode and you need to select the desired intercept course manually by turning the heading bug to the desired intercept course. }}&lt;br /&gt;
&lt;br /&gt;
=== Before-takeoff preparations ===&lt;br /&gt;
* For the HDG/NAV mode it is important to calibrate the [[Avionics_and_instruments#Directional_Gyro|Directional Gyro (DG)]] to the magnetic compass (with running motor, so the DG has power): read the magnetic compass and rotate the DG so its upper bearing mark reflects that course (use the red heading bug if necessary, it makes it easier at the beginning). If your DG was not calibrated, this will not be the magnetic course and you probably will not get where you wanted to.&lt;br /&gt;
* For the ALT mode it is important to calibrate the barometric setting of the autopilot to the one of the altimeter: read the altimeters baro setting from the Kollsman window (the small window at the altimeter), press the &amp;quot;BARO&amp;quot; key at the autopilot and rotate the right &amp;quot;altitude-preselect knob&amp;quot; so the autopilot shows the same setting. If you miss to calibrate the baro setting, you will under-/overshoot altitude presets&lt;br /&gt;
* You should run through the HDG and VS modes on ground as preflight check to make sure the autopilot is operating the aileron, elevator and trim wheel&lt;br /&gt;
* If you intend to follow the runway heading after takeoff, now is a good time to adjust the heading bug.&lt;br /&gt;
* If you intend to climb to a specific altitude and let the autopilot intercept it, you should now rotate the altitude preselect knob of the autopilot to the desired altitude.&lt;br /&gt;
&lt;br /&gt;
=== After Takeoff: Hold heading, continue climbing ===&lt;br /&gt;
It is not advised to engage the autopilot immediately for takeoff as it will mess up with lower speeds. Establish a smooth climb rate and trimmed flight first.&lt;br /&gt;
&lt;br /&gt;
When you achieved a stable climb rate after takeoff, engage the autopilot by pressing &amp;quot;AP&amp;quot;. It will engage in ROL/VS mode: keeps the wings level and maintain climb at the current rate. The moment you engage the autopilot it will show &amp;quot;ROL&amp;quot;, &amp;quot;VS&amp;quot;, and at the right side the currently set climb rate for some seconds. Always visually confirm the autopilot shows the modes you expect!&lt;br /&gt;
&lt;br /&gt;
If not done yet, rotate the red heading bug at the DG to the desired heading before switching to HDG mode.&lt;br /&gt;
&lt;br /&gt;
Once you press the HGT button, the autopilot will switch from ROL to the HDG mode, and the plane now follows the desired course. When you change the heading bug, the plane will bank and follow the new heading (it will do this at standard turn rate).&lt;br /&gt;
&lt;br /&gt;
=== Climb to Altitude, then hold it (intercept altitude) ===&lt;br /&gt;
The autpilot now should be in HDG/VS mode. You should check the vertical speed the autopilot automatically set to the climb rate you had when engaging it. Using the buttons &amp;quot;UP&amp;quot; and &amp;quot;DN&amp;quot; you can adjust the vertical speed setting to the desired value.&lt;br /&gt;
&lt;br /&gt;
To let the autopilot intercept the desired altitude, you need to enter it using the knob on the right side. Turn in the desired altitude.&lt;br /&gt;
Doing this should automatically &amp;quot;arm&amp;quot; the autopilot (it shows &amp;quot;ALT ARM&amp;quot;), telling you that it waits to reach the entered altitude. If it was not arming automatically, you can arm it by manually pressing &amp;quot;ARM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The plane will now climb to the altitude you requested. When you get at 1000ft near your setting, it will beep to let you know its close. Once you reach the altitude it will reduce the climb rate to zero, leveling out at the desired altitude: this is indicated by the &amp;quot;ALT ARM&amp;quot; vanishing.&lt;br /&gt;
If you are not at the altitude you entered, you probably forgot to calibrate the baro setting.&lt;br /&gt;
&lt;br /&gt;
=== Enroute climb / descend ===&lt;br /&gt;
In case you want to change the currently maintained altitude, you can do so by two means:&lt;br /&gt;
# ''Small adjustments'' can be made by pressing just the UP/DN buttons. Each press will adjust the set altitude for 20ft.&amp;lt;ref&amp;gt;In reality you can hold the button to trigger climb/descend at 500ft/m until you release the key. Recent KAP140 simulations implement this.&amp;lt;/ref&amp;gt; Note that we are in ALT mode, so we adjust absolute altiutde with UP/DN knobs, not climb rate! &lt;br /&gt;
# For ''larger adjustments'' you just rotate the altitude preselect knob to the new desired altitude. The autopilot will show &amp;quot;ALT ARM&amp;quot;. When you are ready to climb or descend, put the autopilot to VS mode by pressing the ALT button. Now push UP/DN buttons to climb or descend, and everything else will behave like already described above. You can adjust the desired climb rate anytime. When intercepting, the autopilot will automatically enter ALT mode again (which changes the behaviour of UP/DN buttons to absolute corrections too!).&lt;br /&gt;
# For other cases you can also use the manual ALT mode: Put the autopilot in VS mode by pressing &amp;quot;ALT&amp;quot;, adjust the climb rate to your liking and as soon as you feel the altitude is right, you can press &amp;quot;ALT&amp;quot; again. The AP will show &amp;quot;ALT&amp;quot; immediately, indicating it is holding this altitude. If your climb rate was a little higher, you probably overshoot the desired altitude, but the autopilot will soon return to it.&lt;br /&gt;
&lt;br /&gt;
Note that you can use these techniques with ROL, HDG and NAV modes.&lt;br /&gt;
&lt;br /&gt;
=== VOR interception (NAV mode) ===&lt;br /&gt;
For longer trips it is nice to let the autopilot track a [[VOR]] radial. The difference to the HDG mode is that the plane will compensate for wind drift as it seeks to keep the [https://en.wikipedia.org/wiki/Course_deviation_indicator CDI]-needle centered.&lt;br /&gt;
&lt;br /&gt;
To use the NAV mode you have to tune NAV1 to the VORs frequency and select the desired radial with the OBS knob of your [https://en.wikipedia.org/wiki/Course_deviation_indicator CDI1] (which links to NAV1).&lt;br /&gt;
Now you can intercept the radial, and you have two options to do that:&lt;br /&gt;
# ''From HDG mode'': select the radial also on your DG heading bug (the plane will try to follow that now). Then engage by pressing &amp;quot;NAV&amp;quot;. The autopilot will show &amp;quot;NAV ARM&amp;quot; and turn the plane to an 45° interception angle, but it will remain in HDG mode. Once you are close enough, the NAV-mode will kick in (&amp;quot;NAV ARM&amp;quot; vanishes and NAV shows) - the plane now follows the radial.&lt;br /&gt;
# ''From ROL mode'' (all angle intercept): It works like HDG mode, but once you push the NAV knob, the plane will intercept the radial at the angle you are currently flying. To initially bring the plane to the desired angle, use either HDG-mode with the heading bug, or fly manually, then engage ROL mode by pressing HDG.&lt;br /&gt;
Both modes will show a flashing &amp;quot;HDG&amp;quot; annunciator to remind you that you have to set the DG heading bug to the radial in both cases (the autopilot computes the needed course from that)!&lt;br /&gt;
&lt;br /&gt;
=== ILS assisted approach (APR mode) ===&lt;br /&gt;
The NAV and APR modes are really similar, but the APR mode does additionally follow also the glideslope signal from an [https://en.wikipedia.org/wiki/Instrument_landing_system ILS], and the ILS has a fixed radial (so it ignores the OBS knob setting of the CDI!).&lt;br /&gt;
&lt;br /&gt;
The interception works exactly as in the NAV mode described above. If you engage the APR mode knob the plane will start to intercept the signal, showing &amp;quot;APR ARM&amp;quot; and continue with the currently selected lateral mode (ROL or HDG with 45° intercept angle). Remember to set the DG heading bug to the desired approach course (&amp;quot;HDG&amp;quot; will flash to remember you of that).&lt;br /&gt;
&lt;br /&gt;
As soon as the plane intercepts the localizer (that drives the CDI needle left/right), it will behave like in NAV mode. &amp;quot;APR ARM&amp;quot; will vanish and switch to &amp;quot;APR&amp;quot;, showing you are in approach mode now.&lt;br /&gt;
&lt;br /&gt;
When the APR mode engages, the GS mode will try to intercept the vertical glideslope beam. As long as you stay below the beam, it will show &amp;quot;GS ARM&amp;quot;. When the vertical glideslope is intercepted, the plane will start to follow it downwards.&lt;br /&gt;
&lt;br /&gt;
'''Attention! This mode is dangerous''', because it will drive you into the ground if you don't disengage the autopilot. It is not meant to land you automatically, just to guide you close to the runway. As soon as you are near the runway you should disengage and land manually.&lt;br /&gt;
&lt;br /&gt;
=== Flying opposite direction of VOR or ILS (REV mode) ===&lt;br /&gt;
Using the REV mode allows you to fly away from an VOR or ILS localizer signal (note that glideslope is ignored).&lt;br /&gt;
It works the same as NAV or APR, just in the opposite compass direction. This is helpful if you want to fly straight away from the runway at start or to fly away from a VOR that you tuned the inbound course into the OBS.&lt;br /&gt;
&lt;br /&gt;
As APR and NAV, you can intercept the radial or localizer either from ROL or HDG mode.&lt;br /&gt;
In either case, dial in the Front Inbound course into the OBS and the DG heading bug, and not the direction you want to fly.&lt;br /&gt;
Course reversal is done from the autopilot automatically.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[Joystick Autopilot Bindings]]  Snippets for joystick.xml file that allow control of most of the autopilot functions using the joystick.&lt;br /&gt;
: {{icaution|These joystick bindings only work with the older KAP versions, not the new one with the preflight check simulated!}}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
*[https://bkx.bendixking.com/downloads/006-18034-0000_3.pdf Bendix/King KAP 140 Pilot's Guide download link] (PDF, 6.8 MB), Honywell, rev. 3, Nov 2005.&lt;br /&gt;
*[https://www.bendixking.com/content/dam/bendixking/en/documents/document-lists/downloads-and-manuals/006-18034-0000-KAP-140-Pilots-Guide.pdf Bendix/King KAP 140 Pilot's Guide], Honeywell, rev. 3, Nov 2005.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
[[Category:Aircraft instruments]]&lt;br /&gt;
&lt;br /&gt;
[[de:Autopilot Bendix/King KAP140]]&lt;br /&gt;
[[es:Piloto automático Bendix/King KAP140]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_Browser&amp;diff=143843</id>
		<title>Nasal Browser</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_Browser&amp;diff=143843"/>
		<updated>2026-03-30T10:01:05Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Nasal Namespace Browser Prototype.png|thumb|Screen shot showing the new [[Nasal Browser|Nasal Namespace Browser]] that is currently being worked on by Philosopher.]]&lt;br /&gt;
&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
The '''Nasal '''('''Namespace''')''' Browser''' is a dialog created by user Philosopher that allows the user to peek at the internal state of Nasal (starting from the global namespace). It displays an alphabetical list of keys mapped to values using the [[Canvas]] framework. Hashes and vectors are shown as their size and can be entered into via clicking on them; scalars' complete values are shown while ghosts and other types and represented in brackets.&lt;br /&gt;
&lt;br /&gt;
The source code can be viewed [{{gitorious url&lt;br /&gt;
| proj = fg&lt;br /&gt;
| repo = canvas-hackers-fgdata&lt;br /&gt;
| path = Nasal/nasal_browser.nas&lt;br /&gt;
| branch = topics/nasal-browser-rebased&lt;br /&gt;
| view = raw&lt;br /&gt;
}} here]&lt;br /&gt;
&lt;br /&gt;
{{Note|Per-update performance of the dialog (i.e. how fast it runs) is determined by how big the namespace is. On the developer's computer, it takes about 20-30 ms to update the global namespace, much less for much smaller namespaces. The dialog is automatically updated about every 0.6 seconds.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Each entry is color-coded by type and scrollable via the Canvas scroll widget, sorted either by name or type and name. In a hash, each key is shown as either a string, a number, or a symbol, depending on what it really is (i.e. a scalar may be numeric but still a string; also, interned symbols are special cases of strings). Strings are shown in single quotes, symbols and numbers are shown without quotes. For strings, the brightness of the color is optionally reduced.&lt;br /&gt;
&lt;br /&gt;
If the binary includes the &amp;lt;code&amp;gt;debug.decompile()&amp;lt;/code&amp;gt; extension function (i.e. is part of [[User:Philosopher/Nasal introspection|extended-nasal]]) then functions can optionally be shown with their arguments, e.g. &amp;lt;code&amp;gt;isa = &amp;lt;func(obj,class)&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;_setlistener = &amp;lt;internal func&amp;gt;&amp;lt;/code&amp;gt; (in the sense of a function implemented in C/C++).&lt;br /&gt;
&lt;br /&gt;
Values can be edited when they are clicked on; the edit bar then becomes activated and will capture key presses. A valid Nasal expression should be entered, which will be executed on {{key press|Enter}}.&lt;br /&gt;
&lt;br /&gt;
== 2025 Revival ==&lt;br /&gt;
&lt;br /&gt;
Since 2025, the Nasal Browser project has been revived and is now maintained as a standalone addon. As the original source code repository is no longer available, this version serves as its direct successor, updated for compatibility with modern FlightGear versions.&lt;br /&gt;
&lt;br /&gt;
The new version is hosted on GitHub: {{github source|user=PlayeRom|repo=flightgear-addon-nasal-namespace-browser|text=playerom/flightgear-addon-nasal-namespace-browser}}. It is fully integrated with the FlightGear addon system, providing a modernized interface for browsing the Nasal namespace while preserving historical functionality.&lt;br /&gt;
&lt;br /&gt;
Notably, the addon '''includes the original source code''', which can be optionally enabled for those who prefer the classic experience or wish to compare implementations.&lt;br /&gt;
&lt;br /&gt;
* '''Modernized UI:''' Improved compatibility with recent FlightGear releases.&lt;br /&gt;
* '''Easy Installation:''' Fully compatible with the FlightGear Addon system.&lt;br /&gt;
* '''Project Homepage &amp;amp; Source:''' {{github source|user=PlayeRom|repo=flightgear-addon-nasal-namespace-browser|text=playerom/flightgear-addon-nasal-namespace-browser}}&lt;br /&gt;
* '''Compatibility:''' FlightGear 2024.1+&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter&amp;diff=143839</id>
		<title>FlightGear Newsletter</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter&amp;diff=143839"/>
		<updated>2026-03-30T09:02:55Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Archive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:magagazine.png|right]]&lt;br /&gt;
&lt;br /&gt;
The '''FlightGear Newsletter''' is intended to provide a collection of the latest developments from the worldwide [[FlightGear]] community. With so much development ongoing, it's almost impossible for anyone to keep up. The newsletter was started in July 2009, and is presented on a monthly basis.  It is a collaborative effort that is created, edited and distributed via the [[FlightGear Wiki]], and all FlightGear users, contributors and developers are invited to contribute.&lt;br /&gt;
&lt;br /&gt;
=== Archive ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;noresize&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2026&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2025&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2024&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2023&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2022&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2021&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2020&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2019&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2018&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2017&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2016&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2015&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2014&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2013&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2012&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2011&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2010&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2009&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2026|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2026|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2026|March]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2025|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2025|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2025|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2025|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2025|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2025|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2025|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2025|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2025|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2025|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2025|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2025|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2024|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2024|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2024|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2024|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2024|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2024|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2024|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2024|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2024|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2024|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2024|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2024|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2023|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2023|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2023|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2023|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2023|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2023|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2023|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2023|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2023|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2023|October]] &lt;br /&gt;
* [[FlightGear Newsletter November 2023|November]] &lt;br /&gt;
* [[FlightGear Newsletter December 2023|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2022|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2022|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2022|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2022|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2022|May]] &lt;br /&gt;
* June&lt;br /&gt;
* [[FlightGear Newsletter July 2022|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2022|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2022|September]]&lt;br /&gt;
* [[FlightGear Newsletter November 2022|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2022|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2021|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2021|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2021|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2021|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2021|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2021|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2021|July]] &lt;br /&gt;
* [[FlightGear Newsletter August 2021|August]] &lt;br /&gt;
* [[FlightGear Newsletter September 2021|September]] &lt;br /&gt;
* [[FlightGear Newsletter October 2021|October]] &lt;br /&gt;
* [[FlightGear Newsletter November 2021|November]] &lt;br /&gt;
* [[FlightGear Newsletter December 2021|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2020|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2020|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2020|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2020|April]] &lt;br /&gt;
* [[FlightGear Newsletter May 2020|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2020|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2020|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2020|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2020|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2020|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2020|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2020|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2019|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2019|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2019|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2019|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2019|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2019|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2019|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2019|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2019|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2019|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2019|November]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2018|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2018|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2018|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2018|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2018|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2018|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2018|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2018|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2018|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2018|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2018|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2018|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2017|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2017|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2017|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2017|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2017|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2017|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2017|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2017|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2017|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2017|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2017|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2017|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2016|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2016|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2016|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2016|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2016|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2016|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2016|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2016|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2016|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2016|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2016|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2016|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2015|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2015|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2015|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2015|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2015|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2015|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2015|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2015|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2015|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2015|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2015|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2015|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2014|January]] &lt;br /&gt;
* [[FlightGear Newsletter February 2014|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2014|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2014|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2014|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2014|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2014|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2014|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2014|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2014|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2014|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2014|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2013|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2013|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2013|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2013|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2013|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2013|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2013|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2013|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2013|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2013|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2013|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2013|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2012|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2012|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2012|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2012|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2012|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2012|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2012|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2012|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2012|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2012|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2012|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2012|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2011|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2011|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2011|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2011|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2011|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2011|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2011|July]] &lt;br /&gt;
* [[FlightGear Newsletter August 2011|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2011|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2011|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2011|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2011|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2010|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2010|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2010|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2010|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2010|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2010|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2010|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2010|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2010|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2010|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2010|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2010|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter July 2009|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2009|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2009|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2009|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2009|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2009|December]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some newsletter editions have been translated in other languages:&lt;br /&gt;
* [[File:De.gif|16px|link=:De:FlightGear Newsletter]] [[:De:FlightGear Newsletter|Deutsch]]&lt;br /&gt;
* [[File:Es.gif|16px|link=:Es:FlightGear Newsletter]] [[:Es:FlightGear Newsletter|Español]]&lt;br /&gt;
* [[File:Fr.gif|16px|link=:Fr:FlightGear Newsletter]] [[:Fr:FlightGear Newsletter|Français]]&lt;br /&gt;
&lt;br /&gt;
=== You are invited to contribute! ===&lt;br /&gt;
We would like to emphasize that the monthly newsletter can not live without the contributions of FlightGear users and developers. The FlightGear Newsletter is a community-driven newsletter, which means that it is created and edited by people like ''you''. You don't need to be a long-time FlightGear user (or even a developer) to contribute to the newsletter. &lt;br /&gt;
&lt;br /&gt;
In fact, helping write the monthly FlightGear newsletter is an excellent way for getting started contributing to the FlightGear community very quickly and very easily. &lt;br /&gt;
&lt;br /&gt;
Even if you don't have to add anything yourself, just reviewing and improving additions by others is also highly appreciated, as are efforts to help translate newsletters or add screen shots (e.g. taken from the forum or mailing lists) to the newsletter. Screen shots can be uploaded at [[Special:Upload]].&lt;br /&gt;
&lt;br /&gt;
Everyone with a wiki account (free to [[Special:UserLogin|register]]) can edit the newsletter and every contribution is welcome. So if you know about any FlightGear related projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.&lt;br /&gt;
&lt;br /&gt;
A simple template providing a basic structure for each upcoming newsletter can be taken from [[Talk:Next newsletter]]. This template can be copied/pasted into each new newsletter to help users getting started providing contents.&lt;br /&gt;
&lt;br /&gt;
The draft for the upcoming newsletter can always be found at [[Next newsletter]].&lt;br /&gt;
&lt;br /&gt;
If English is not your native language, please don't be concerned about contributing to the newsletter, you can always easily ask fellow FlightGear users to review or proof-read your changes. Also, one of the easiest ways to get started is simply copying/pasting text from forum or mailing list discussions, such as announcements (e.g., new aircraft, new scenery, etc.).&lt;br /&gt;
&lt;br /&gt;
Another neat option to get started is adding links to FlightGear-related YouTube videos. For this, we have a dedicated section in each newsletter: &amp;quot;[[FlightGear Newsletter {{#time: F Y | last month }}#FlightGear on YouTube|FlightGear on YouTube]].&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you want to embed a video, please see {{mediawiki|Extension:EmbedVideo#Usage}}&lt;br /&gt;
&lt;br /&gt;
If you are looking for other ways to get involved, please see [[Volunteer]].&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear Newsletter| ]]&lt;br /&gt;
[[Category:Community|Newsletter]]&lt;br /&gt;
[[Category:Lists|Newsletter]]&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear Newsletter]]&lt;br /&gt;
[[es:FlightGear Newsletter]]&lt;br /&gt;
[[fr:FlightGear Newsletter]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_FAQ&amp;diff=143790</id>
		<title>Nasal FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_FAQ&amp;diff=143790"/>
		<updated>2026-03-26T13:29:51Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* How to play sounds using Nasal script? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
This is meant to provide a place for '''frequently asked questions related to [[Nasal]]''' and related to using Nasal in [[FlightGear]], it's largely inspired by several related discussions on both, the FlightGear forums as well as the [[Mailing list|FlightGear mailing lists]].&lt;br /&gt;
&lt;br /&gt;
== What are the major features of Nasal? ==&lt;br /&gt;
(Based on [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg21428.html] and [http://plausible.org/nasal/])&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Designed as an extension language, well suited for embedded applications&lt;br /&gt;
* Nasal can be instructed to run for only a certain number of &amp;quot;cycles&amp;quot; before returning. Later calls will automatically pick up the interpreter state where it left off. &lt;br /&gt;
* Small Interpreter, written in ANSI C, even smaller than lua&lt;br /&gt;
* Nasal's VM uses internally a stack machine model&lt;br /&gt;
* Nasal does not depend on any third party libraries other than the standard C library.&lt;br /&gt;
* Nasal provides optional bindings for libraries such as for example gtk, cairo, regex, readline, sqlite or unix &lt;br /&gt;
* Nasal does not depend on third party tools like (f)lex and yacc/bison. &lt;br /&gt;
* Nasal builds simply and easily, supports a reasonably simple extension API and cohabitates well with other code&lt;br /&gt;
* Nasal is threadsafe&lt;br /&gt;
* Nasal does not use a global interpreter lock (i.e. GIL in Python or Lua)&lt;br /&gt;
* Nasal is stackless for interpreted code&lt;br /&gt;
* Nasal has complete programmatic control over the runtime namespace for any piece of code, making &amp;quot;modules&amp;quot; a question of script coding and allowing a bunch of neat metaprogramming tricks&lt;br /&gt;
* Unicode Support&lt;br /&gt;
* Support for multiple execution contexts and subcontexts&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
* Supported Types: Vectors, Hashes and Scalars &lt;br /&gt;
* Literal numbers can be decimal, exponential, or hex constants. All numbers are stored internally as IEEE double-precision values.&lt;br /&gt;
* Nasal supports exception handling as a first-class language feature, with built-in runtime-inspectable stack trace&lt;br /&gt;
* Standard OOP syntax (obj.field) using Hashes&lt;br /&gt;
* Nasal is a true functional language with recursion, lexical scoping, runtime binding, anonymous lambda expressions and true closures.&lt;br /&gt;
* Nasal has a true garbage collector.&lt;br /&gt;
* Nasal's data model matches what you are used to from perl, python and javascript.&lt;br /&gt;
* Nasal has syntax (e.g. based on concepts borrowed from ECMAScript/JavaScript) that makes sense in the modern world and to programmers exposed to other languages like Javascript.&lt;br /&gt;
&lt;br /&gt;
== How to play sounds using Nasal script? ==&lt;br /&gt;
This works via property-fgcommands as per $FG_ROOT/Docs/README.commands:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var sound = {&lt;br /&gt;
    path  : DIRECTORYPATH, &lt;br /&gt;
    file  : FILENAME, &lt;br /&gt;
    volume: VOLUME,&lt;br /&gt;
    queue : &amp;quot;instant&amp;quot;, # Other optional choices, do not include queue for default, or user defined queue name&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fgcommand(&amp;quot;play-audio-sample&amp;quot;, props.Node.new(sound));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll want to adjust the capital variables with your own path/file name and volume, e.g. using a helper class :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var Sound = {&lt;br /&gt;
    # static&lt;br /&gt;
    default_path: getprop(&amp;quot;/sim/fg-root&amp;quot;) ~ '/Sounds', &lt;br /&gt;
    &lt;br /&gt;
    # constructor&lt;br /&gt;
    new: func(filename, volume = 0.5, path = nil) {&lt;br /&gt;
        var m = Props.Node.new({&lt;br /&gt;
            path  : path or default_path,&lt;br /&gt;
            file  : filename,&lt;br /&gt;
            volume: volume,&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return m;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fgcommand(&amp;quot;play-audio-sample&amp;quot;, Sound.new(filename: 'blade_vortex.wav', volume: 0.8));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# You could put your sound file in the same folder and load it from there, &lt;br /&gt;
# if you aren't using an existing sound:&lt;br /&gt;
&lt;br /&gt;
var node = Sound.new(&lt;br /&gt;
    filename: 'mySoundFile.wav',&lt;br /&gt;
    volume: 0.8,&lt;br /&gt;
    path: getprop(&amp;quot;/sim/fg-root&amp;quot;) ~ '/Aircraft/Foo/Sounds',&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
fgcommand(&amp;quot;play-audio-sample&amp;quot;, node);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The same way one would do animations using Nasal:The current sound model is property-driven. You can create a new sound event (see the *-sound.xml files under Aircraft for examples) and drive it from a given set of properties. You can then set those properties from Nasal.&lt;br /&gt;
&lt;br /&gt;
Adjust properties in Nasal (they may be &amp;quot;private&amp;quot; properties in your own subtree of the property list, say /tmp/&amp;lt;aircraft&amp;gt;) and let the sound configuration file act on those properties.&lt;br /&gt;
(from flightgear-devel).&lt;br /&gt;
&lt;br /&gt;
If your sounds are aircraft-specific, then the mechanism of putting it into the -sound.xml file is probably exactly what you want. &lt;br /&gt;
Things like playing sounds from the UI are more problematic from the current interface.&lt;br /&gt;
&lt;br /&gt;
Start with a single beep.wav with an XML definition like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;sim&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;fx&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;beep&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;engstart&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;path&amp;gt;Sounds/beep.wav&amp;lt;/path&amp;gt;&lt;br /&gt;
   &amp;lt;property&amp;gt;/tmp/somewhere/beep&amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;/beep&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can trigger the beep by toggling the property from false to true. With a little work with settimer(), you can get it to beep with different patterns and frequencies, etc... &lt;br /&gt;
&lt;br /&gt;
For additional information, you'll want to check out [[$FG_ROOT]]/Docs/README.xmlsound&lt;br /&gt;
&lt;br /&gt;
=== Using cmdarg() ===&lt;br /&gt;
cmdarg() returns the listened-to property as props.Node object, so you can use it with all its methods (see [[$FG_ROOT]]/Nasal/props.nas),&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
  print(cmdarg().getPath(), &amp;quot; has been changed to &amp;quot;, cmdarg().getValue())&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_FAQ&amp;diff=143789</id>
		<title>Nasal FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_FAQ&amp;diff=143789"/>
		<updated>2026-03-26T13:29:17Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* How to play sounds using Nasal script? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
This is meant to provide a place for '''frequently asked questions related to [[Nasal]]''' and related to using Nasal in [[FlightGear]], it's largely inspired by several related discussions on both, the FlightGear forums as well as the [[Mailing list|FlightGear mailing lists]].&lt;br /&gt;
&lt;br /&gt;
== What are the major features of Nasal? ==&lt;br /&gt;
(Based on [http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg21428.html] and [http://plausible.org/nasal/])&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Designed as an extension language, well suited for embedded applications&lt;br /&gt;
* Nasal can be instructed to run for only a certain number of &amp;quot;cycles&amp;quot; before returning. Later calls will automatically pick up the interpreter state where it left off. &lt;br /&gt;
* Small Interpreter, written in ANSI C, even smaller than lua&lt;br /&gt;
* Nasal's VM uses internally a stack machine model&lt;br /&gt;
* Nasal does not depend on any third party libraries other than the standard C library.&lt;br /&gt;
* Nasal provides optional bindings for libraries such as for example gtk, cairo, regex, readline, sqlite or unix &lt;br /&gt;
* Nasal does not depend on third party tools like (f)lex and yacc/bison. &lt;br /&gt;
* Nasal builds simply and easily, supports a reasonably simple extension API and cohabitates well with other code&lt;br /&gt;
* Nasal is threadsafe&lt;br /&gt;
* Nasal does not use a global interpreter lock (i.e. GIL in Python or Lua)&lt;br /&gt;
* Nasal is stackless for interpreted code&lt;br /&gt;
* Nasal has complete programmatic control over the runtime namespace for any piece of code, making &amp;quot;modules&amp;quot; a question of script coding and allowing a bunch of neat metaprogramming tricks&lt;br /&gt;
* Unicode Support&lt;br /&gt;
* Support for multiple execution contexts and subcontexts&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
* Supported Types: Vectors, Hashes and Scalars &lt;br /&gt;
* Literal numbers can be decimal, exponential, or hex constants. All numbers are stored internally as IEEE double-precision values.&lt;br /&gt;
* Nasal supports exception handling as a first-class language feature, with built-in runtime-inspectable stack trace&lt;br /&gt;
* Standard OOP syntax (obj.field) using Hashes&lt;br /&gt;
* Nasal is a true functional language with recursion, lexical scoping, runtime binding, anonymous lambda expressions and true closures.&lt;br /&gt;
* Nasal has a true garbage collector.&lt;br /&gt;
* Nasal's data model matches what you are used to from perl, python and javascript.&lt;br /&gt;
* Nasal has syntax (e.g. based on concepts borrowed from ECMAScript/JavaScript) that makes sense in the modern world and to programmers exposed to other languages like Javascript.&lt;br /&gt;
&lt;br /&gt;
== How to play sounds using Nasal script? ==&lt;br /&gt;
This works via property-fgcommands as per $FG_ROOT/Docs/README.commands:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var sound = {&lt;br /&gt;
    path  : DIRECTORYPATH, &lt;br /&gt;
    file  : FILENAME, &lt;br /&gt;
    volume: VOLUME,&lt;br /&gt;
    queue : &amp;quot;instant&amp;quot;, # Other optional choices, do not include queue for default, or user defined queue name&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fgcommand(&amp;quot;play-audio-sample&amp;quot;, props.Node.new(sound));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll want to adjust the capital variables with your own path/file name and volume, e.g. using a helper class :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var Sound = {&lt;br /&gt;
    # static&lt;br /&gt;
    default_path: getprop(&amp;quot;/sim/fg-root&amp;quot;) ~ '/Sounds', &lt;br /&gt;
    &lt;br /&gt;
    # constructor&lt;br /&gt;
    new: func(filename, volume = 0.5, path = nil) {&lt;br /&gt;
        var m = Props.Node.new({&lt;br /&gt;
           path  : path or default_path,&lt;br /&gt;
           file  : filename,&lt;br /&gt;
           volume: volume,&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return m;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
fgcommand(&amp;quot;play-audio-sample&amp;quot;, Sound.new(filename: 'blade_vortex.wav', volume: 0.8));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# You could put your sound file in the same folder and load it from there, &lt;br /&gt;
# if you aren't using an existing sound:&lt;br /&gt;
&lt;br /&gt;
var node = Sound.new(&lt;br /&gt;
    filename: 'mySoundFile.wav',&lt;br /&gt;
    volume: 0.8,&lt;br /&gt;
    path: getprop(&amp;quot;/sim/fg-root&amp;quot;) ~ '/Aircraft/Foo/Sounds',&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
fgcommand(&amp;quot;play-audio-sample&amp;quot;, node);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The same way one would do animations using Nasal:The current sound model is property-driven. You can create a new sound event (see the *-sound.xml files under Aircraft for examples) and drive it from a given set of properties. You can then set those properties from Nasal.&lt;br /&gt;
&lt;br /&gt;
Adjust properties in Nasal (they may be &amp;quot;private&amp;quot; properties in your own subtree of the property list, say /tmp/&amp;lt;aircraft&amp;gt;) and let the sound configuration file act on those properties.&lt;br /&gt;
(from flightgear-devel).&lt;br /&gt;
&lt;br /&gt;
If your sounds are aircraft-specific, then the mechanism of putting it into the -sound.xml file is probably exactly what you want. &lt;br /&gt;
Things like playing sounds from the UI are more problematic from the current interface.&lt;br /&gt;
&lt;br /&gt;
Start with a single beep.wav with an XML definition like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;sim&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;fx&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;beep&amp;gt;&lt;br /&gt;
   &amp;lt;name&amp;gt;engstart&amp;lt;/name&amp;gt;&lt;br /&gt;
   &amp;lt;path&amp;gt;Sounds/beep.wav&amp;lt;/path&amp;gt;&lt;br /&gt;
   &amp;lt;property&amp;gt;/tmp/somewhere/beep&amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;/beep&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can trigger the beep by toggling the property from false to true. With a little work with settimer(), you can get it to beep with different patterns and frequencies, etc... &lt;br /&gt;
&lt;br /&gt;
For additional information, you'll want to check out [[$FG_ROOT]]/Docs/README.xmlsound&lt;br /&gt;
&lt;br /&gt;
=== Using cmdarg() ===&lt;br /&gt;
cmdarg() returns the listened-to property as props.Node object, so you can use it with all its methods (see [[$FG_ROOT]]/Nasal/props.nas),&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
  print(cmdarg().getPath(), &amp;quot; has been changed to &amp;quot;, cmdarg().getValue())&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library&amp;diff=143529</id>
		<title>Nasal library</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library&amp;diff=143529"/>
		<updated>2026-01-16T21:10:17Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* has_member() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page documents the global '''library functions and variables''' of FlightGear's built-in scripting language, [[Nasal]]. This includes ''[[#Core library functions|core library functions]]'', which were included in Nasal before its integration into FlightGear, the ''[[#Extension functions|extension functions]]'', which have been subsequently added, and are specifically designed for FlightGear, and the ''[[#variables|global variables]]'', which are conversion variables, added with extension functions, for converting between units. The relevant folders in [[Git]] are:&lt;br /&gt;
* {{flightgear file|src/Scripting}}&lt;br /&gt;
* {{simgear file|simgear/nasal}}&lt;br /&gt;
&lt;br /&gt;
All these functions and variables are in the global namespace, that is, they are directly accessible (e.g., one can call &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot; inline&amp;gt;magvar()&amp;lt;/syntaxhighlight&amp;gt; instead of &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot; inline&amp;gt;namespace.magvar()&amp;lt;/syntaxhighlight&amp;gt;). However, if a namespace must be used, &amp;lt;code&amp;gt;globals&amp;lt;/code&amp;gt; is the correct namespace, but using it is not recommended. For a more complete explanation, see [[Nasal Namespaces in-depth]].&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Core library functions ==&lt;br /&gt;
This is the list of the basic '''core library functions.''' Most of these functions were part of the original Nasal library (before its integration in to FlightGear), while some have been added or changed over time.  See also:&lt;br /&gt;
* http://plausible.org/nasal/lib.html ([http://web.archive.org/web/20101010094553/http://plausible.org/nasal/lib.html archive])&lt;br /&gt;
* {{simgear file|simgear/nasal/lib.c}} ([http://sourceforge.net/p/flightgear/simgear/ci/next/log/?path=/simgear/nasal/lib.c history])&lt;br /&gt;
&lt;br /&gt;
=== append() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = append(vector, element[, element[, ...]]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=45|t=Source}}&lt;br /&gt;
|text = This function appends, or adds, the given element(s) to the end of the vector given in the first argument.  Returns the vector operated on.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to which the arguments will be appended.&lt;br /&gt;
|param2 = element&lt;br /&gt;
|param2text = An element to be added to the vector.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector&lt;br /&gt;
append(vector, 4); # Append the number 4 to the end of the vector&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector&lt;br /&gt;
append(vector, 4, 5, 6); # Append the numbers 4, 5, and 6 to the end of the vector&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== bind() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = bind(function, locals[, outer_scope]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=638|t=Source}}&lt;br /&gt;
|text = This creates a new function object. A function in Nasal is three things: the actual code, a hash/namespace of local variables available to the function namespace, and the closure object of that namespace. These correspond to the three arguments respectively.&lt;br /&gt;
|param1 = function&lt;br /&gt;
|param1text = Function to evaluate.&lt;br /&gt;
|param2 = locals&lt;br /&gt;
|param2text = Hash containing values that will become the namespace (first closure) for the function.&lt;br /&gt;
|param3 = outer_scope&lt;br /&gt;
|param3text = Optional function which is bound to the next closure. This can be bound to yet another, making a linked list.&lt;br /&gt;
|example1 = # This is a namespace/hash with a single member, named &amp;quot;key,&amp;quot; which is initialized to 12 &lt;br /&gt;
var Namespace = {&lt;br /&gt;
    key: 12&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# This is different namespace/hash containing a function&lt;br /&gt;
# dividing a variable &amp;quot;key&amp;quot; (which is unavailable/nil in this namespace) by 2&lt;br /&gt;
var AnotherNamespace = {&lt;br /&gt;
    ret: func {&lt;br /&gt;
        key /= 2;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# To see that key is not available, try to call AnotherNamespace.ret() first&lt;br /&gt;
call(AnotherNamespace.ret, [], nil, nil, var errors = []);&lt;br /&gt;
if(size(errors)){&lt;br /&gt;
    print(&amp;quot;Key could not be divided/resolved!&amp;quot;);&lt;br /&gt;
    debug.printerror(errors);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Associate the AnotherNamespace.ret() function with the first namespace&lt;br /&gt;
# so that &amp;quot;key&amp;quot; is now available&lt;br /&gt;
var function = bind(AnotherNamespace.ret, Namespace);&lt;br /&gt;
&lt;br /&gt;
# Invoke the new function&lt;br /&gt;
function();&lt;br /&gt;
&lt;br /&gt;
# Print out the value of Namespace.key&lt;br /&gt;
# It was changed to 12 from 6 by AnotherNamespace.ret()&lt;br /&gt;
print(Namespace.key);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== call() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = call(func[, args[, me[, locals[, error]]]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=376|t=Source}}&lt;br /&gt;
|text = Calls the given function with the given arguments and returns the result.  This function is very useful as it allows much more control over function calls and catches any errors or {{func link|die()}} calls that would normally trigger run-time errors cancelling execution of the script otherwise. &lt;br /&gt;
|param1 = func&lt;br /&gt;
|param1text = Function to execute.&lt;br /&gt;
|param2 = args&lt;br /&gt;
|param2text = Vector containing arguments to give to the called function.&lt;br /&gt;
|param3 = me&lt;br /&gt;
|param3text = &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; reference for the function call (i.e., for method calls). If given, this will override any &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; value existing in the namespace (locals argument).&lt;br /&gt;
|param4 = locals&lt;br /&gt;
|param4text = A hash with key/value pairs that will be available to the called function, typically used as the namespace for the function to be called.&lt;br /&gt;
|param5 = error&lt;br /&gt;
|param5text = A vector to append errors to.  If the called function generates an error, the error, place, and line will be written to this.  These errors can be printed using {{func link|printerror()|debug}}.&lt;br /&gt;
|example1 =&lt;br /&gt;
# prints &amp;quot;Called from call()&amp;quot;&lt;br /&gt;
call(func {&lt;br /&gt;
    print(&amp;quot;Called from call()&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
|example2 =&lt;br /&gt;
# prints &amp;quot;a = 1 : b = 2&lt;br /&gt;
call(func(a, b){&lt;br /&gt;
        print(&amp;quot;a = &amp;quot;, a, &amp;quot; : b = &amp;quot;, b);&lt;br /&gt;
    },&lt;br /&gt;
    [1, 2]&lt;br /&gt;
);&lt;br /&gt;
|example3 =&lt;br /&gt;
var Hash = {&lt;br /&gt;
    new: func {&lt;br /&gt;
        var m = { parents: [Hash] };&lt;br /&gt;
&lt;br /&gt;
        m.el1 = &amp;quot;string1&amp;quot;;&lt;br /&gt;
        m.el2 = &amp;quot;string2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        return m;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# prints &amp;quot;me.el1 = string1&amp;quot;, then &amp;quot;me.el2 = string2&amp;quot; on the next line&lt;br /&gt;
call(func(a, b){        &lt;br /&gt;
        print(&amp;quot;me.el&amp;quot;, a, &amp;quot; = &amp;quot;, me[&amp;quot;el&amp;quot; ~ a]);      &lt;br /&gt;
        print(&amp;quot;me.el&amp;quot;, b, &amp;quot; = &amp;quot;, me[&amp;quot;el&amp;quot; ~ b]);&lt;br /&gt;
    },&lt;br /&gt;
    [1, 2],&lt;br /&gt;
    Hash.new()&lt;br /&gt;
);&lt;br /&gt;
|example4 =&lt;br /&gt;
# prints the value of math.pi&lt;br /&gt;
call(func {&lt;br /&gt;
        print(pi);&lt;br /&gt;
    }, nil, nil, &lt;br /&gt;
    math&lt;br /&gt;
);&lt;br /&gt;
|example5 =&lt;br /&gt;
call(func {&lt;br /&gt;
        print(math.ip); # math.ip doesn't exist&lt;br /&gt;
    }, nil, nil, nil,&lt;br /&gt;
    var errs = []&lt;br /&gt;
);&lt;br /&gt;
debug.printerror(errs); # The error is caught and printed using debug.printerror()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== caller() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = caller([level]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=540|t=Source}}&lt;br /&gt;
|text = Returns a vector containing a record from the current call stack.  The level numbering starts from the currently executing function (level 0).  Level 1 (the default) is the caller of the current function, and so on.&lt;br /&gt;
&lt;br /&gt;
The result is a four-element vector containing '''[0]''' a hash of local variables, '''[1]''' the function object, '''[2]''' the full source file name (incl. path) and '''[3]''' the line number. &lt;br /&gt;
|param1 = level&lt;br /&gt;
|param1text = Optional integer specifying the stack level to return a result from.  Defaults to 1 (i.e. the caller of the currently executing function).&lt;br /&gt;
|example1 =&lt;br /&gt;
var myFunction = func(a, b) {&lt;br /&gt;
    debug.dump(caller(0)[0]); # prints a hash of local variables, including arguments a and b&lt;br /&gt;
    return 2 * 2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;2 x 2 = &amp;quot;, myFunction(2, 2));&lt;br /&gt;
|example2 =&lt;br /&gt;
var get_arg_value = func() {&lt;br /&gt;
    print(&amp;quot;Argument to myFunc = &amp;quot;, caller(1)[0]['a']); # print the value of myFunc's single argument, using caller()&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var myFunc = func(a) {&lt;br /&gt;
    get_arg_value();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
myFunc(3);&lt;br /&gt;
|example3text = This is a real example taken from {{fgdata file|Nasal/canvas/MapStructure.nas}}.  Function &amp;lt;code&amp;gt;r()&amp;lt;/code&amp;gt; (above the TODOs) returns a hash with the key/value pairs as per its arguments. For example, something like this is returned: &amp;lt;code&amp;gt;{ name: &amp;quot;&amp;lt;name&amp;gt;&amp;quot;, vis: true, zindex: nil }&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example3 =&lt;br /&gt;
var MapStructure_selfTest = func() {&lt;br /&gt;
    var temp = {};&lt;br /&gt;
    temp.dlg = canvas.Window.new([600, 400], &amp;quot;dialog&amp;quot;);&lt;br /&gt;
    temp.canvas = temp.dlg.createCanvas().setColorBackground(1, 1, 1, 0.5);&lt;br /&gt;
    temp.root = temp.canvas.createGroup();&lt;br /&gt;
&lt;br /&gt;
    var testMap = temp.root.createChild(&amp;quot;map&amp;quot;);&lt;br /&gt;
    testMap.setController(&amp;quot;Aircraft position&amp;quot;);&lt;br /&gt;
    testMap.setRange(25); # TODO: implement zooming/panning via mouse/wheel here, for lack of buttons :-/&lt;br /&gt;
    testMap.setTranslation(&lt;br /&gt;
        temp.canvas.get(&amp;quot;view[0]&amp;quot;) / 2,&lt;br /&gt;
        temp.canvas.get(&amp;quot;view[1]&amp;quot;) / 2,&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    var r = func(name, vis = true, zindex = nil) {&lt;br /&gt;
        return caller(0)[0];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # TODO: we'll need some z-indexing here, right now it's just random&lt;br /&gt;
    # TODO: use foreach/keys to show all layers in this case by traversing SymbolLayer.registry directly ?&lt;br /&gt;
    # maybe encode implicit z-indexing for each lcontroller ctor call ? - i.e. preferred above/below order ?&lt;br /&gt;
    var types = [&lt;br /&gt;
        r('TFC', false),&lt;br /&gt;
        r('APT'),&lt;br /&gt;
        r('DME'),&lt;br /&gt;
        r('VOR'),&lt;br /&gt;
        r('NDB'),&lt;br /&gt;
        r('FIX', false),&lt;br /&gt;
        r('RTE'),&lt;br /&gt;
        r('WPT'),&lt;br /&gt;
        r('FLT'),&lt;br /&gt;
        r('WXR'),&lt;br /&gt;
        r('APS'),&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    foreach (var type; types) {&lt;br /&gt;
        testMap.addLayer(&lt;br /&gt;
            factory: canvas.SymbolLayer,&lt;br /&gt;
            type_arg: type.name,&lt;br /&gt;
            visible: type.vis,&lt;br /&gt;
            priority: type.zindex,&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}; # MapStructure_selfTest&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== chr() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = chr(code);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=240|t=Source}}&lt;br /&gt;
|text = Returns a character as per the single argument. Extended ASCII is supported (see http://www.asciitable.com/ for a list of supported characters), although this may vary between different systems.  For a list of the most commonly used characters, see the {{wikipedia|ASCII#ASCII printable code chart|ASCII printable code chart}} ('''Dec''' column). The following table lists supported control characters, along with their equivalent control characters in Nasal strings.  {{Note|In Nasal, only strings enclosed with double-quotes (&amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;) supports control chracters.  Strings in single quotes (&amp;lt;code&amp;gt;'string'&amp;lt;/code&amp;gt;) do not.}}&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Name !! Equivalent to&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 10 {{!!}} {{Wikipedia|Newline}} {{!!}} &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 9 {{!!}} {{Wikipedia|Tab key#Tab characters|Horizontal tab}} {{!!}} &amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 13 {{!!}} {{Wikipedia|Carriage return}} {{!!}} &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param1 = code&lt;br /&gt;
|param1text = Integer character code for the desired glyph.&lt;br /&gt;
|example1 = print(&amp;quot;Code 65 = &amp;quot;, chr(65)); # prints &amp;quot;Code 65 = A&amp;quot;&lt;br /&gt;
|example2text = This example displays all of the characters in a list, in the format &amp;lt;code&amp;gt;Code '''n''' = &amp;gt;'''char'''&amp;lt;&amp;lt;/code&amp;gt;, '''n''' being the index, and '''char''' being the character.&lt;br /&gt;
|example2 =&lt;br /&gt;
for(var i = 0; i &amp;lt;= 255; i += 1){&lt;br /&gt;
    print(&amp;quot;Code &amp;quot;, i, &amp;quot; = &amp;gt;&amp;quot;, chr(i), &amp;quot;&amp;lt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== closure() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = closure(func[, level]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=557|t=Source}}&lt;br /&gt;
|text = Returns the hash table containing the lexical namespace of the given function. The level numbering start with level 0 being the namespace of '''func'''. &lt;br /&gt;
|param1 = func&lt;br /&gt;
|param1text = Function to evaluate.&lt;br /&gt;
|param2 = level&lt;br /&gt;
|param2text = Optional integer specifying the scope level.  Defaults to 0 (the namespace of '''func''').&lt;br /&gt;
|example1 =&lt;br /&gt;
var get_math_e = func {&lt;br /&gt;
    return e; # return the value of math.e&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var myFunction = bind(get_math_e, math); # bind get_math_e to the math namespace, so that math.e is immediately available to get_math_e&lt;br /&gt;
debug.dump(closure(myFunction)); # print the hash of the namespace &amp;quot;get_math_e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
print(myFunction());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== cmp() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = cmp(a, b);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=169|t=Source}}&lt;br /&gt;
|text = Compares two strings, returning -1 if '''a''' is less than '''b''', 0 if they are identical and 1 if '''a''' is greater than '''b'''. &lt;br /&gt;
|param1 = a&lt;br /&gt;
|param1text = First string argument for comparison.&lt;br /&gt;
|param2 = b&lt;br /&gt;
|param2text = Second string argument for comparison.&lt;br /&gt;
|example1 = print(cmp(&amp;quot;1&amp;quot;, &amp;quot;two&amp;quot;)); # prints -1&lt;br /&gt;
|example2 = print(cmp(&amp;quot;string&amp;quot;, &amp;quot;string&amp;quot;)); # prints 0&lt;br /&gt;
|example3 = print(cmp(&amp;quot;one&amp;quot;, &amp;quot;2&amp;quot;)); # prints 1&lt;br /&gt;
|example4 = print(cmp(&amp;quot;string1&amp;quot;, &amp;quot;string2&amp;quot;)); # prints -1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== compile() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = compile(code[, filename]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=349|t=Source}}&lt;br /&gt;
|text = Compiles the specified code string and returns a function object bound to the current lexical context.  If there is an error, the function dies, with the argument to {{func link|die()}} being '''filename'''.&lt;br /&gt;
|param1 = code&lt;br /&gt;
|param1text = String containing Nasal code to be compiled.&lt;br /&gt;
|param2 = filename&lt;br /&gt;
|param2text = Optional string used for error messages/logging. Defaults to &amp;lt;code&amp;gt;&amp;lt;compile&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|example1 = &lt;br /&gt;
var myCode = 'print(&amp;quot;hello&amp;quot;);';&lt;br /&gt;
var helloFunc = compile(myCode, &amp;quot;myCode&amp;quot;);&lt;br /&gt;
helloFunc();&lt;br /&gt;
|example2text = &amp;lt;code&amp;gt;compile&amp;lt;/code&amp;gt; is very convenient to support Nasal loaded from other files.  For instance, [[PropertyList XML files]] (such as GUI dialogs) may contain embedded Nasal sections that need to be parsed, processed and compiled.  For an example of how to do this, save the below XML code as &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/gui/dialogs/test.xml''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
print(&amp;quot;You have FlightGear v&amp;quot;, getprop(&amp;quot;/sim/version/flightgear&amp;quot;));&lt;br /&gt;
]]&amp;gt;&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, start FlightGear and execute this code in the [[Nasal Console]].&lt;br /&gt;
|example2 =&lt;br /&gt;
# Build the path&lt;br /&gt;
var FGRoot = getprop(&amp;quot;/sim/fg-root&amp;quot;);&lt;br /&gt;
var filename = &amp;quot;/gui/dialogs/test.xml&amp;quot;;&lt;br /&gt;
var path = FGRoot ~ filename;&lt;br /&gt;
&lt;br /&gt;
var blob = io.read_properties(path);&lt;br /&gt;
var script = blob.getValues().nasal; # Get the nasal string&lt;br /&gt;
&lt;br /&gt;
# Compile the script.  We're passing the filename here for better runtime diagnostics &lt;br /&gt;
var code = call(func {&lt;br /&gt;
    compile(script, filename);&lt;br /&gt;
}, nil, nil, var compilation_errors = []);&lt;br /&gt;
&lt;br /&gt;
if(size(compilation_errors)){&lt;br /&gt;
    die(&amp;quot;Error compiling code in: &amp;quot; ~ filename);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Invoke the compiled script, equivalent to code(); &lt;br /&gt;
# We're using call() here to detect errors:&lt;br /&gt;
call(code, [], nil, nil, var runtime_errors = []);&lt;br /&gt;
&lt;br /&gt;
if(size(runtime_errors)){&lt;br /&gt;
    die(&amp;quot;Error calling code compiled loaded from: &amp;quot; ~ filename);&lt;br /&gt;
}&lt;br /&gt;
|example3text = The &amp;lt;code&amp;gt;compile()&amp;lt;/code&amp;gt; function also allows you to parse a JSON string into a hash. Simplest example:&lt;br /&gt;
|example3 =&lt;br /&gt;
var jsonFunc = compile('{&amp;quot;version&amp;quot;:&amp;quot;1.2.0&amp;quot;,&amp;quot;author&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;John&amp;quot;} }');&lt;br /&gt;
var json = jsonFunc(); # return hash&lt;br /&gt;
logprint(LOG_ALERT, json[&amp;quot;version&amp;quot;]); # print &amp;quot;1.2.0&amp;quot;&lt;br /&gt;
logprint(LOG_ALERT, json[&amp;quot;author&amp;quot;][&amp;quot;name&amp;quot;]); # print &amp;quot;John&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== contains() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = contains(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=249|t=Source}}&lt;br /&gt;
|text = Returns 1 (True) if the hash contains the specified key, or 0 (False) if not.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash to search in.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = The scalar to be searched for, contained as a key in the hash.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize a hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element: &amp;quot;value&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
print(contains(hash, &amp;quot;element&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;Yes&amp;quot;&lt;br /&gt;
print(contains(hash, &amp;quot;element2&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;No&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===contains()===&lt;br /&gt;
{{Requires commit|desc=Vector support|details=see {{Merge-request|project=fgdata|id=305}}|commit=ee39abbd3b70c9b6d5e3a1c4ccedddaac1a92b11|repo=Simgear}}&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = contains(vector, item);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=249|t=Source}}&lt;br /&gt;
|text = Returns 1 (True) if the vector contains the specified item, or 0 (False) if not.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to search in.&lt;br /&gt;
|param2 = item&lt;br /&gt;
|param2text = The object to be searched for in the vector.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize a vector&lt;br /&gt;
var vec = [&amp;quot;element&amp;quot;, &amp;quot;foo&amp;quot;];&lt;br /&gt;
print(contains(vec, &amp;quot;element&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;Yes&amp;quot;&lt;br /&gt;
print(contains(vec, &amp;quot;element2&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;No&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===delete() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = delete(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=118|t=Source}}&lt;br /&gt;
|text = Deletes the key from the hash if it exists. Operationally, this is NOT identical to setting the hash value specified by the key to &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; as the key will stay in the hash (at least for a while). This variant potentially frees storage by deleting the reference to the key and by shrinking the hash.  Returns the hash that has been operated on.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash from which to delete the key.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = The scalar to be deleted, contained as a key in the hash.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize the hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value1&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value2&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
delete(hash, &amp;quot;element1&amp;quot;); # Delete element1&lt;br /&gt;
debug.dump(hash); # prints the hash, which is now minus element1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===die()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = die(error);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=417|t=Source}}&lt;br /&gt;
|text = Terminates execution and unwinds the stack.  The place and the line will be added to the '''error'''.  This invokes the same internal exception handler used for internal runtime errors. Use this to signal fatal errors, or to implement exception handling. The error thrown (including internal runtime errors) can be caught with {{func link|call()}}.&lt;br /&gt;
|param1 = error&lt;br /&gt;
|param1text = String describing the error.&lt;br /&gt;
:{{inote|This parameter is technically optional, but it is highly recommended to use it.}}&lt;br /&gt;
|example1 = &lt;br /&gt;
print(&amp;quot;Will print&amp;quot;);&lt;br /&gt;
die(&amp;quot;Don't go any further!&amp;quot;); &lt;br /&gt;
print(&amp;quot;Won't print&amp;quot;); # Will not be printed because die() stops the process&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== find()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = find(needle, haystack);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=586|t=Source}}&lt;br /&gt;
|text = Finds and returns the index of the first occurrence of the string '''needle''' in the string '''haystack''', or -1 if no such occurrence was found.&lt;br /&gt;
|param1 = needle&lt;br /&gt;
|param1text = String to search for.&lt;br /&gt;
|param2 = haystack&lt;br /&gt;
|param2text = String to search in.&lt;br /&gt;
|example1 = print(find(&amp;quot;c&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints 2&lt;br /&gt;
|example2 = print(find(&amp;quot;x&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints -1&lt;br /&gt;
|example3 = print(find(&amp;quot;cd&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===ghosttype()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = ghosttype(ghost);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=336|t=Source}}&lt;br /&gt;
|text = Returns a string containing either a descriptive name of a ghost (a raw C/C++ object), or a unique id (the pointer to the C/C++ &amp;lt;code&amp;gt;naGhostType&amp;lt;/code&amp;gt; instance) if no name has been set.  Ghost is an acronym that stands for '''G'''arbage-collected '''H'''andle to '''O'''ut'''S'''ide '''T'''hingy.&lt;br /&gt;
|param1 = ghost&lt;br /&gt;
|param1text = Ghost to return a description for.&lt;br /&gt;
|example1 = print(ghosttype(airportinfo())); # prints &amp;quot;airport&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===id()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = id(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=706|t=Source}}&lt;br /&gt;
|text = Returns a string containing information on the type and ID of the object provided in the single argument.  The information is returned in the form of &amp;lt;code&amp;gt;'''&amp;lt;type&amp;gt;''':'''&amp;lt;id&amp;gt;'''&amp;lt;/code&amp;gt;, where '''&amp;lt;type&amp;gt;''' is the type of object, and '''&amp;lt;id&amp;gt;''' is the ID.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Can be either of a string, a vector, a hash, a code, a function, or a ghost.&lt;br /&gt;
|example1 = print(id(&amp;quot;A&amp;quot;)); # prints &amp;quot;str:000000001624A590&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===int() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = int(number);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=125|t=Source}}&lt;br /&gt;
|text = Returns the integer part of the numeric value of the single argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if none exists.&lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = Number or string with just a number in it to return an integer from.&lt;br /&gt;
|example1 = print(int(23)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example2 = print(int(23.123)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example3 = debug.dump(int(&amp;quot;string&amp;quot;)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===keys()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = keys(hash);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=36|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the list of keys found in the single hash argument. &lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash to return the keys from.&lt;br /&gt;
|example1 = &lt;br /&gt;
# Initialize a hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
debug.dump(keys(hash)); # print the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===left()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = left(string, length);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=214|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{simgear commit|bd7163|t=commit}}&lt;br /&gt;
|text = Returns a substring of '''string''', starting from the left.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return part of.&lt;br /&gt;
|param2 = length&lt;br /&gt;
|param2text = Integer specifying the length of the substring to return.&lt;br /&gt;
|example1 = print(left(&amp;quot;string&amp;quot;, 2)); # prints &amp;quot;st&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== num()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = num(number);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=149|t=Source}}&lt;br /&gt;
|text = Returns the numerical value of the single string argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if none exists. &lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = String with just a number in it to return a number from.&lt;br /&gt;
|example1 = print(num(&amp;quot;23&amp;quot;)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example2 = print(num(&amp;quot;23.123&amp;quot;)); # prints &amp;quot;23.123&amp;quot;&lt;br /&gt;
|example3 = debug.dump(num(&amp;quot;string&amp;quot;)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===pop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = pop(vector);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=85|t=Source}}&lt;br /&gt;
|text = Removes and returns the last element of the single vector argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the vector is empty. &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = Vector to remove an element from.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
pop(vector);&lt;br /&gt;
debug.dump(vector); # prints &amp;quot;[1, 2]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(pop(vector)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var vector = [];&lt;br /&gt;
debug.dump(pop(vector)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== range() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = range([start, ]stop[, step]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=756|t=Source}}&lt;br /&gt;
|text = Creates a vector of numbers starting from &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (default 0) up to but not including &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, incremented by &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; (default 1). Note: To specify &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;, you must also provide &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;; otherwise the second argument is interpreted as &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = start&lt;br /&gt;
|param1text = Optional. The starting number of the sequence. Defaults to 0 if omitted. Required if you want to specify &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = stop&lt;br /&gt;
|param2text = Required. The number at which to stop the sequence (not included).&lt;br /&gt;
|param3 = step&lt;br /&gt;
|param3text = Optional. The increment between each number in the sequence. Defaults to 1. Only valid if &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is also specified.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vec = range(5);        # Creates a vector [0, 1, 2, 3, 4]&lt;br /&gt;
var vec = range(2, 5);     # Creates a vector [2, 3, 4]&lt;br /&gt;
var vec = range(0, 10, 2); # Creates a vector [0, 2, 4, 6, 8]&lt;br /&gt;
var vec = range(0, 0);     # Creates an empty vector []&lt;br /&gt;
var vec = range(0, 1);     # Creates a vector [0]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== remove() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = remove(vector, value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=53|t=Source}}&lt;br /&gt;
|text = Removes all elements equal to the given value from a vector and returns the modified vector.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector from which elements are to be removed.&lt;br /&gt;
|param2 = value&lt;br /&gt;
|param2text = A value to remove from the vector.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector.&lt;br /&gt;
remove(vector, 2); # Remove the value 2 from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[1, 3]&amp;quot;.&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [&amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;]; # Initialize the vector.&lt;br /&gt;
remove(vector, &amp;quot;text&amp;quot;); # Remove the value &amp;quot;text&amp;quot; from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[]&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== removeat() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removeat(vector, index);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=72|t=Source}}&lt;br /&gt;
|text = Removes the element at the specified index from the vector and returns it.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector from which the element will be removed.&lt;br /&gt;
|param2 = index&lt;br /&gt;
|param2text = Index of the item to be deleted.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector.&lt;br /&gt;
removeat(vector, 0); # Remove the index 0 from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[2, 3]&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===right()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = right(string, length);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=226|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{simgear commit|bd7163|t=commit}}&lt;br /&gt;
|text = Returns a substring of '''string''', starting from the right.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return part of.&lt;br /&gt;
|param2 = length&lt;br /&gt;
|param2text = Integer specifying the length of the substring to return.&lt;br /&gt;
|example1 = print(right(&amp;quot;string&amp;quot;, 2)); # prints &amp;quot;ng&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setsize()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = setsize(vector, size);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=91|t=Source}}&lt;br /&gt;
|text = Sets the size of a vector. The first argument specifies a vector, the second a number representing the desired size of that vector. If the vector is currently larger than the specified size, it is truncated. If it is smaller, it is padded with &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; entries. Returns the vector operated upon. &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to be operated on.&lt;br /&gt;
|param2 = size&lt;br /&gt;
|param2text = The desired size of the vector in number of entries.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize a vector&lt;br /&gt;
setsize(vector, 4);&lt;br /&gt;
debug.dump(vector); # print the vector &amp;quot;[1, 2, 3, nil]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize a vector&lt;br /&gt;
setsize(vector, 2);&lt;br /&gt;
debug.dump(vector); # print the vector &amp;quot;[1, 2]&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===size()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = size(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=26|t=Source}}&lt;br /&gt;
|text = Returns the size of the single argument. For strings, this is the length in bytes. For vectors, this is the number of elements. For hashes, it is the number of key/value pairs. If the argument is &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; or a number, this error will be thrown: &amp;lt;code&amp;gt;object has no size()&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to find the size of.  Must be a string, a vector or a hash.&lt;br /&gt;
|example1 = &lt;br /&gt;
var string = &amp;quot;string&amp;quot;;&lt;br /&gt;
print(size(string)); # prints &amp;quot;6&amp;quot;&lt;br /&gt;
|example2 =&lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
print(size(vector)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
|example3 =&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value1&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value2&amp;quot;,&lt;br /&gt;
    element3: &amp;quot;value3&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
print(size(hash)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== sort()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = sort(vector, function);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=678|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the elements in the input '''vector''' sorted in according to the rule given by '''function'''. Implemented with the ANSI C {{func link|qsort()|link=http://www.cplusplus.com/reference/cstdlib/qsort/}}, &amp;lt;code&amp;gt;sort()&amp;lt;/code&amp;gt; is stable.  This means that if the rules in the first example are used, equal elements in the output vector will appear in the same relative order as they do in the input.  It is run in a loop, so '''function''' is run several times.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = Input vector to sort.&lt;br /&gt;
|param2 = function&lt;br /&gt;
|param2text = Function according to which the elements will be sorted by.  It should take two arguments and should return one of 1, 0, or -1.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Return value !! Meaning&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} less than 0 {{!!}} first argument should go before second argument&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0 {{!!}} first argument equals second argument&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} greater than 0 {{!!}} first argument should go after second argument&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
|example1text = This example sorts elements from smallest to greatest.&lt;br /&gt;
|example1 = &lt;br /&gt;
var sort_rules = func(a, b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return -1; # A should before b in the returned vector&lt;br /&gt;
    } elsif (a == b) {&lt;br /&gt;
        return 0; # A is equivalent to b &lt;br /&gt;
    } else {&lt;br /&gt;
        return 1; # A should after b in the returned vector&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
debug.dump(sort([3, 2, 5, 6, 4, 1], sort_rules)); # prints &amp;quot;[1, 2, 3, 4, 5, 6]&amp;quot;&lt;br /&gt;
|example2text = This example sorts elements from greatest to smallest.&lt;br /&gt;
|example2 = &lt;br /&gt;
# Outputs the elements in reverse order (greatest to smallest)&lt;br /&gt;
var sort_rules = func(a, b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return 1; # -1 in the above example&lt;br /&gt;
    } elsif (a == b) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        return -1; # 1 in the above example&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
debug.dump(sort([3, 2, 5, 6, 4, 1], sort_rules)); # prints &amp;quot;[6, 5, 4, 3, 2, 1]&amp;quot;&lt;br /&gt;
|example3text = This example sorts a vector of strings (runways for example) from smallest to greatest.&lt;br /&gt;
|example3 = &lt;br /&gt;
var runways = [&amp;quot;09R&amp;quot;, &amp;quot;27R&amp;quot;, &amp;quot;26L&amp;quot;, &amp;quot;09L&amp;quot;, &amp;quot;15&amp;quot;];&lt;br /&gt;
var rwy = sort(runways, func(a, b) cmp(a, b));&lt;br /&gt;
debug.dump(rwy); # prints ['09L', '09R', '15', '26L', '27R']&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== split()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = split(delimiter, string);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=596|t=Source}}&lt;br /&gt;
|text = Splits the input string into a vector of substrings bounded by occurrences of the delimiter substring. See [[Nasal_library/string#string.join(sep,list)|string.join()]].&lt;br /&gt;
|param1 = delimiter&lt;br /&gt;
|param1text = String that will split the substrings in the returned vector.&lt;br /&gt;
|param2 = string&lt;br /&gt;
|param2text = String to split up.&lt;br /&gt;
|example1 = debug.dump(split(&amp;quot;cd&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints &amp;quot;['ab', 'ef']&amp;quot;&lt;br /&gt;
|example2 = debug.dump(split(&amp;quot;.&amp;quot;, &amp;quot;3.2.0&amp;quot;)); # prints &amp;quot;[3, 2, 0]&amp;quot;&lt;br /&gt;
|example3 = debug.dump(split(&amp;quot;/&amp;quot;, &amp;quot;path/to/file&amp;quot;)); # prints &amp;quot;['path', 'to', 'file']&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;sprintf(format[, arg[, arg, [...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=491|t=Source}}&lt;br /&gt;
|text = Creates and returns a string formatted using ANSI C {{func link|vsnprintf()|link=http://en.cppreference.com/w/c/io/vfprintf}} &amp;lt;ref&amp;gt;&lt;br /&gt;
{{Cite web&lt;br /&gt;
|url = http://sourceforge.net/p/flightgear/simgear/ci/next/tree/simgear/nasal/lib.c#l308&lt;br /&gt;
|title = fgdata/simgear/simgear/nasal/lib.c, line 308&lt;br /&gt;
|accessdate = October 2015&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;.  Below is a table of supported format specifiers.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot; width=&amp;quot;75%&amp;quot;&lt;br /&gt;
{{!}}+ %[flags][width][.precision]specifier&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Flags&lt;br /&gt;
{{!-}}&lt;br /&gt;
! Flag !! Output&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; {{!!}} Forces to precede the result with a plus or minus sign ('''+''' or '''-''') even for positive numbers. By default, only negative numbers are preceded with a '''-''' sign.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} ''space'' {{!!}} Prefixes non-signed numbers with a space.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; {{!!}} Left-align the output of this placeholder (the default is to right-align the output) when the width option is specified.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; {{!!}} Use 0 instead of spaces to pad a field when the width option is specified.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; {{!!}} Used with &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; specifiers the value is preceded with &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;0x&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;0X&amp;lt;/tt&amp;gt; respectively for values different than zero. Used with &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written. Used with &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; the result is the same as with &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; but trailing zeros are not removed.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Width&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot; {{!}} Integer specifying the minimum number of characters to be returned. This includes the decimal point and decimal fraction as well as + or - signs.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Precision&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot; {{!}} Integer preceded by a dot specifying the number of decimal places to be written.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Specifiers&lt;br /&gt;
{{!-}}&lt;br /&gt;
! Specifier !! Output&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; {{!!}} Signed decimal number.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; {{!!}} A string&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; {{!!}} Percent (%) character.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; {{!!}} A single character assigned to a character code, the code given in an integer argument.  See http://www.asciitable.com/ for a list of supported characters and their codes.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; {{!!}} Unsigned integer as an octal number.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; {{!!}} Unsigned decimal integer.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; {{!!}} Unsigned integer as a hexadecimal number.  If &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is used, any letters in the number are lowercase, while &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; gives uppercase.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; {{!!}} Double value in scientific notation (i.e., ''[-]ddd.ddd'''e'''[+/-]ddd''), with an exponent being denoted by &amp;lt;tt&amp;gt;e&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;E&amp;lt;/tt&amp;gt; depending on whether an upper or lowercase is used respectively.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; {{!!}} Floating-point number, in fixed decimal notation, by default with 6 decimal places.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; {{!!}} Appears to be available&amp;lt;ref&amp;gt;&lt;br /&gt;
{{Cite web&lt;br /&gt;
|url = http://sourceforge.net/p/flightgear/simgear/ci/next/tree/simgear/nasal/lib.c#l389&lt;br /&gt;
|title = fgdata/simgear/simgear/nasal/lib.c, line 389&lt;br /&gt;
|accessdate = October 2015&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;, but doesn't work.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; {{!!}} Double in either normal or exponential notation, whichever is more appropriate for its magnitude. &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; uses lower-case letters, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; uses upper-case letters. This type differs slightly from fixed-point notation in that insignificant zeroes to the right of the decimal point are not included.  Also, the decimal point is not included on whole numbers.&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
|param1 = format&lt;br /&gt;
|param1text = String specifying the format.  Can be used with or without a format specifiers.  See below for examples.&lt;br /&gt;
|param2 = arg&lt;br /&gt;
|param2text = Argument specifying a value to replace a format placeholder (such as &amp;lt;code&amp;gt;%d&amp;lt;/code&amp;gt;) in the format string.  Not required if there are no format specifiers.&lt;br /&gt;
&lt;br /&gt;
|example1 = print(sprintf(&amp;quot;%i&amp;quot;, 54)); # prints &amp;quot;54&amp;quot;&lt;br /&gt;
|example2 = print(sprintf(&amp;quot;Pi = %+.10f&amp;quot;, math.pi)); # prints &amp;quot;Pi = +3.1415926536&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
print(sprintf(&amp;quot;%6d&amp;quot;, 23));  # prints &amp;quot;    23&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%06d&amp;quot;, 23)); # prints &amp;quot;000023&amp;quot;&lt;br /&gt;
|example4 =&lt;br /&gt;
var FGVer = getprop(&amp;quot;/sim/version/flightgear&amp;quot;);&lt;br /&gt;
print(sprintf(&amp;quot;You have FlightGear v%s&amp;quot;, FGVer)); # prints &amp;quot;You have FlightGear v&amp;lt;your version&amp;gt;&amp;quot;&lt;br /&gt;
|example5 = &lt;br /&gt;
print(sprintf(&amp;quot;Hexadecimal 100000 = %X&amp;quot;, 100000)); # prints &amp;quot;Hexadecimal 100000 = 186A0&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;Hexadecimal 100000 = %x&amp;quot;, 100000)); # prints &amp;quot;Hexadecimal 100000 = 186a0&amp;quot;&lt;br /&gt;
|example6 = print(sprintf(&amp;quot;Code 65 is %c&amp;quot;, 65)); # prints &amp;quot;Code 65 is A&amp;quot;&lt;br /&gt;
|example7 = &lt;br /&gt;
print(sprintf(&amp;quot;%e&amp;quot;, 54)); # prints &amp;quot;5.400000e+001&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%E&amp;quot;, 54)); # prints &amp;quot;5.400000E+001&amp;quot;&lt;br /&gt;
|example8 = print(sprintf(&amp;quot;%o&amp;quot;, 54)); # prints &amp;quot;66&amp;quot;&lt;br /&gt;
|example9 = print(sprintf(&amp;quot;50%% of 100 is %i&amp;quot;, 100 / 2)); # prints &amp;quot;50% of 100 is 50&amp;quot;&lt;br /&gt;
|example10 =&lt;br /&gt;
print(sprintf(&amp;quot;%.2f&amp;quot;, 1.4));   # prints &amp;quot;1.40&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%.1f&amp;quot;, 1.4));   # prints &amp;quot;1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;% 4.1f&amp;quot;, 1.4)); # prints &amp;quot; 1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%04.1f&amp;quot;, 1.4)); # prints &amp;quot;01.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;% 6.1f&amp;quot;, 1.4)); # prints &amp;quot;   1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%06.1f&amp;quot;, 1.4)); # prints &amp;quot;0001.4&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===str()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = str(value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=186|t=Source}}&lt;br /&gt;
|text = Convert given value (scalar) to string. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is a number, it will be converted to a string. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is a string, the same string will be returned. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not a scalar (hash, vector, nil), &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; will be returned.&lt;br /&gt;
|param1 = value&lt;br /&gt;
|param1text = The value to convert to string.&lt;br /&gt;
|example1 = &lt;br /&gt;
var result = str(true);     # result is a string &amp;quot;1&amp;quot;&lt;br /&gt;
var result = str(false);    # result is a string &amp;quot;0&amp;quot;&lt;br /&gt;
var result = str(12);       # result is a string &amp;quot;12&amp;quot;&lt;br /&gt;
var result = str(12.5);     # result is a string &amp;quot;12.5&amp;quot;&lt;br /&gt;
var result = str(-12.5);    # result is a string &amp;quot;-12.5&amp;quot;&lt;br /&gt;
var result = str(&amp;quot;12.5&amp;quot;);   # result is a string &amp;quot;12.5&amp;quot;&lt;br /&gt;
var result = str([1, 2]);   # result is a nil&lt;br /&gt;
var result = str({ x: 0 }); # result is a nil&lt;br /&gt;
var result = str(nil);      # result is a nil&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===streq()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = streq(a, b);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=164|t=Source}}&lt;br /&gt;
|text = Tests the string values of the two arguments for equality. This function is needed because the &amp;lt;code&amp;gt;'''=='''&amp;lt;/code&amp;gt; operator (see [[Nasal_Operators#Equality|Nasal Operators]]) tests for numeric equality first.  If either or both the arguments are not strings, 0 (False) will be returned.  Returns either 0 (False) or 1 (True).  {{Note|This function is rarely required in typical code.}}&lt;br /&gt;
|param1 = a&lt;br /&gt;
|param1text = First argument for testing equality.&lt;br /&gt;
|param2 = b&lt;br /&gt;
|param2text = Second argument for testing equality.&lt;br /&gt;
|example1 = print(streq(&amp;quot;0&amp;quot;, &amp;quot;0&amp;quot;)); # prints &amp;quot;1&amp;quot; (True)&lt;br /&gt;
|example2 = &lt;br /&gt;
print(0 == 0.0); # prints &amp;quot;1&amp;quot; (True)&lt;br /&gt;
print(streq(&amp;quot;0&amp;quot;, &amp;quot;0.0&amp;quot;)); # prints &amp;quot;0&amp;quot; (False)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===substr()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = substr(string, start [, length]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=194|t=Source}}&lt;br /&gt;
|text = Similar the {{func link|subvec()}}, but operates on strings. Computes and returns a substring. The first argument specifies a string, the second is the index of the start of a substring, the optional third argument specifies a length (the default is to return the rest of the string from the start).&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return a substring from.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = Integer specifying the start of a substring. Negative values specify a position from the end of the string.&lt;br /&gt;
|param3 = length&lt;br /&gt;
|param3text = Optional argument specifying the length of the substring. Defaults to the end of the string.&lt;br /&gt;
|example1 = print(substr(&amp;quot;abcde&amp;quot;, 1, 3)); # prints &amp;quot;bcd&amp;quot;&lt;br /&gt;
|example2 = print(substr(&amp;quot;abcde&amp;quot;, 1)); # prints &amp;quot;bcde&amp;quot;&lt;br /&gt;
|example3 = print(substr(&amp;quot;abcde&amp;quot;, 2, 1)); # prints &amp;quot;c&amp;quot;&lt;br /&gt;
|example4 = print(substr(&amp;quot;abcde&amp;quot;, -2)); # prints &amp;quot;de&amp;quot;&lt;br /&gt;
|example5 = print(substr(&amp;quot;abcde&amp;quot;, -3, 2)); # prints &amp;quot;cd&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===subvec()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = subvec(vector, start[, length]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=98|t=Source}}&lt;br /&gt;
|text = Returns a sub-range of a vector. The first argument specifies a vector, the second a starting index, and the optional third argument indicates a length (the default is to the end of the vector). &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to take the sub-vector from.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = The starting point of the sub-vector within the given vector.&lt;br /&gt;
|param3 = length&lt;br /&gt;
|param3text = Optional argument specifying the length of the sub-vector, from the starting point.&lt;br /&gt;
'''Notes:'''&lt;br /&gt;
* Omitting the ''vector'' and ''start'' arguments is not an error (possibly it should be) but the return value is ''nil''.&lt;br /&gt;
* A negative ''start'' argument ''is'' an error. This seems wrong. Perhaps the language designer could comment.&lt;br /&gt;
* A value of ''start'' greater than ''size(vector)'' causes an error. A value equal to ''size(vector)'' returns an empty vector.&lt;br /&gt;
* If the value of ''length'' is greater than ''size(vector) - start'' then it is ignored. That is, all elements from ''start'' to the end of ''vector'' are returned. If ''length'' is zero then an empty vector is returned. A negative value of ''length'' causes an error.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 0)); # prints &amp;quot;[1, 2, 3]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 1)); # prints &amp;quot;[2, 3]&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 1, 1)); # prints &amp;quot;[2]&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== typeof()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = typeof(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=287|t=Source}}&lt;br /&gt;
|text = Returns a string indicating the whether the object is &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;, a scalar (number or string), a vector, a hash, a function, or a ghost.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to return the type of.&lt;br /&gt;
|example1 = &lt;br /&gt;
var object = nil;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var object = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;scalar&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var object = math.pi;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;scalar&amp;quot;&lt;br /&gt;
|example4 = &lt;br /&gt;
var object = [1, 2, 3];&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;vector&amp;quot;&lt;br /&gt;
|example5 = &lt;br /&gt;
var object = {};&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;hash&amp;quot;&lt;br /&gt;
|example6 = &lt;br /&gt;
var object = func {};&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;func&amp;quot;&lt;br /&gt;
|example7 =&lt;br /&gt;
var object = airportinfo();&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;ghost&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Extension modules ==&lt;br /&gt;
=== thread ===&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newthread(func);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = start a new worker thread&lt;br /&gt;
|example1 = thread.newthread( func() {} );&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newlock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = create a new lock&lt;br /&gt;
|example1 = var lock = thread.newlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.lock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = lock a lock&lt;br /&gt;
|example1 = var lock = thread.newlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.unlock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = unlock a lock&lt;br /&gt;
|example1 = var lock = thread.unlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newsem();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = create a new {{Wikipedia|semaphore}}&lt;br /&gt;
|example1 = var semaphore = thread.newsem()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.semdown();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = semaphore down&lt;br /&gt;
|example1 = thread.semdown(semaphore)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.semup();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = semaphore up&lt;br /&gt;
|example1 = thread.semup(semaphore)&lt;br /&gt;
}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Extension functions==&lt;br /&gt;
The '''extension functions''' are global functions that have been added to Nasal since its integration into FlightGear. Unlike the core library functions, they are generally specifically designed to interact directly with FlightGear. Extension functions come from three source files:&lt;br /&gt;
*{{flightgear file|src/Scripting/NasalPositioned.cxx}}&lt;br /&gt;
*{{flightgear file|src/Scripting/NasalSys.cxx}}&lt;br /&gt;
*{{fgdata file|Nasal/globals.nas}}&lt;br /&gt;
&lt;br /&gt;
===abort()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = abort();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=565|t=Source}}&lt;br /&gt;
|text = This function is a wrapper for the C++ {{func link|abort()|link=http://www.cplusplus.com/reference/cstdlib/abort/}} function. It simply aborts FlightGear with an error, which varies depending on the operating system. This function should not really be used; instead, please use the &amp;quot;exit&amp;quot; [[Fgcommands|fgcommand]], which will exit FlightGear more gracefully (see example below).&lt;br /&gt;
|example1text = This example will immediately stop FlightGear with an error, such as &amp;quot;FlightGear has stopped working.&amp;quot;&lt;br /&gt;
|example1 = abort();&lt;br /&gt;
|example2text = For exiting FlightGear in a better way, please use the following code:&lt;br /&gt;
|example2 = fgcommand(&amp;quot;exit&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== abs() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = abs(number);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = This simple function returns the {{wikipedia|absolute value|noicon=1}} of the provided number.&lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = This argument is required and should be a number.&lt;br /&gt;
|example1 = print(abs(1)); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
|example2 = print(abs(-1)); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===aircraftToCart() ===&lt;br /&gt;
This new function in FG 2017.2.1 takes coordinates in aircraft structural coordinate system, and translate them into geocentric coordinates.&lt;br /&gt;
Example for (5,6,7):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var pos = aircraftToCart({x: -5, y: 6, z: -7});&lt;br /&gt;
var coord = geo.Coord.new();&lt;br /&gt;
coord.set_xyz(pos.x, pos.y, pos.z);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Notice: x and z is inverted sign on purpose.&lt;br /&gt;
if you want lat. lon, alt from that, just call: (degrees and meters)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
coord.lat()&lt;br /&gt;
coord.lon()&lt;br /&gt;
coord.alt()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===addcommand() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = addcommand(name, code);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=659|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{flightgear commit|7b663c|t=commit}}&lt;br /&gt;
|text = {{see also|Howto:Add new fgcommands to FlightGear}}&lt;br /&gt;
&lt;br /&gt;
This function enables the addition of a new custom [[fgcommands|fgcommand]] to FlightGear from within Nasal. An fgcommand created using this method can be used in exactly the same way as the built-in fgcommands. Also, an fgcommand created via this method will always return True or 1, like all other fgcommands.&lt;br /&gt;
|param1 = name&lt;br /&gt;
|param1text = This will become the name of the new fgcommand. Must be a string.&lt;br /&gt;
|param2 = code&lt;br /&gt;
|param2text = The code that will be executed when the fgcommand is run. Must be a function.&lt;br /&gt;
|example1text = This example adds a new fgcommand and then runs it. Although it executes a simple {{func link|print()}} statement, any valid Nasal code can be used.&lt;br /&gt;
|example1 = addcommand(&amp;quot;myFGCmd&amp;quot;, func(node) {&lt;br /&gt;
    print(&amp;quot;fgcommand 'myFGCmd' has been run.&amp;quot;);&lt;br /&gt;
    props.dump( node );&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;myFGCmd&amp;quot;, props.Node.new({foo:1, bar:2}) );&lt;br /&gt;
|example2text = This example demonstrates how parameters are defined in a new fgcommand.&lt;br /&gt;
|example2 = addcommand(&amp;quot;myFGCmd&amp;quot;, func(node){&lt;br /&gt;
    print(node.getNode(&amp;quot;number&amp;quot;).getValue()); # prints the value of &amp;quot;number,&amp;quot; which is 12&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;myFGCmd&amp;quot;, props.Node.new({&amp;quot;number&amp;quot;: 12}));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airportinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airportinfo();&lt;br /&gt;
airportinfo(type);&lt;br /&gt;
airportinfo(id);&lt;br /&gt;
airportinfo(lat, lon[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1024|t=Source}}&lt;br /&gt;
|text = Function for retrieval of airport, heliport, or seaplane base information. It returns a Nasal ghost; however, its structure is like that of a Nasal hash. The following information is returned:&lt;br /&gt;
* '''parents''': A vector containing a hash of various functions to access information about the runway. These functions are:&lt;br /&gt;
** '''findBestRunwayForPos()''' return runway as ghost by given geo position, e.g. &amp;lt;code&amp;gt;var rwy = airportinfo().findBestRunwayForPos(geo.aircraft_position());&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''runway()''' return runway as ghost by runway ID, e.g. &amp;lt;code&amp;gt;var rwy = airportinfo().runway(&amp;quot;18R&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''runwaysWithoutReciprocals()''' return vector of runways as ghost.&lt;br /&gt;
** '''helipad()''' return helipad as ghost by helipad ID, e.g. &amp;lt;code&amp;gt;var heli = airportinfo().helipad(&amp;quot;H19&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''tower()''' return hash with &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;elevation&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''comms()''' return vector of hashes, each hash with &amp;lt;code&amp;gt;frequency&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''sids()''' return vector of strings with SID IDs.&lt;br /&gt;
** '''stars()''' return vector of strings with STAR IDs.&lt;br /&gt;
** '''getApproachList()''' return vector of string with approaches.&lt;br /&gt;
** '''parking()''' return vector of hashes, each hash with  &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;elevation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''getSid()''' return SID as ghost, e.g. &amp;lt;code&amp;gt;var sid = airportinfo().getSid(&amp;quot;SA1A&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getStar()''' return STAR as ghost, e.g. &amp;lt;code&amp;gt;var star = airportinfo().getStar(&amp;quot;KEILA1&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getIAP()''' return IAP as ghost, e.g. &amp;lt;code&amp;gt;var iap = airportinfo().getIAP(&amp;quot;ILS02&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getApproach()''' return approach as ghost, e.g. &amp;lt;code&amp;gt;var approach = airportinfo().getApproach(&amp;quot;ILS02&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''tostring()''' just return string &amp;quot;an airport ICAO&amp;quot;.&lt;br /&gt;
** See also {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1902}}.&lt;br /&gt;
* '''lon''': Longitude of the location.&lt;br /&gt;
* '''lat''': Latitude of the location.&lt;br /&gt;
* '''has_metar''': True or false depending whether the airport has a [[METAR]] code defined for it.&lt;br /&gt;
* '''elevation''': Elevation of the location in metres.&lt;br /&gt;
* '''id''': ICAO code of the airport (or ID of the seaplane base/heliport).&lt;br /&gt;
* '''name''': Name of the airport/heliport/seaplane base.&lt;br /&gt;
* '''runways'''&lt;br /&gt;
** '''&amp;lt;runway name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of runway.&lt;br /&gt;
*** '''lat''': Latitude of the runway.&lt;br /&gt;
*** '''lon''': Longitude of the runway.&lt;br /&gt;
*** '''heading''': True heading of the runway.&lt;br /&gt;
*** '''length''': Length of the runway in metres.&lt;br /&gt;
*** '''width''': Width of the runway in metres.&lt;br /&gt;
*** '''surface''': Runway surface type.&lt;br /&gt;
*** '''threshold''': Length of the runway's {{wikipedia|displaced threshold}} in metres. Will return 0 if there is none.&lt;br /&gt;
*** '''stopway''': Length of the runway's stopway (the area before the threshold) in metres. Will return 0 if there is none.&lt;br /&gt;
*** '''reciprocal''': &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt; ghost of the reciprocal runway.&lt;br /&gt;
*** '''ils_frequency_mhz''': ILS frequency in megahertz.&lt;br /&gt;
*** '''ils''': &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost of the ILS transmitter.&lt;br /&gt;
* '''helipads'''&lt;br /&gt;
** '''&amp;lt;helipad name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of helipad.&lt;br /&gt;
*** '''lat''': Latitude of the helipad.&lt;br /&gt;
*** '''lon''': Longitude of the helipad.&lt;br /&gt;
*** '''heading''': True heading of the helipad.&lt;br /&gt;
*** '''length''': Length of the helipad in metres.&lt;br /&gt;
*** '''width''': Width of the helipad in metres.&lt;br /&gt;
*** '''surface''': Helipad surface type.&lt;br /&gt;
* '''taxiways'''&lt;br /&gt;
** '''&amp;lt;taxiway name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of taxiway.&lt;br /&gt;
*** '''lat''': Latitude of the taxiway.&lt;br /&gt;
*** '''lon''': Longitude of the taxiway.&lt;br /&gt;
*** '''heading''': Heading of the taxiway.&lt;br /&gt;
*** '''length''': Length of the taxiway in metres.&lt;br /&gt;
*** '''width''': Width of the taxiway in metres.&lt;br /&gt;
*** '''surface''': Taxiway surface type.&lt;br /&gt;
&lt;br /&gt;
Information is extracted in the same way as accessing members of a Nasal hash. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# prints to lengths of the runways of the nearest airport in feet and metres&lt;br /&gt;
var info = airportinfo();&lt;br /&gt;
print(&amp;quot;-- Lengths of the runways at &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;) --&amp;quot;);&lt;br /&gt;
foreach(var rwy; keys(info.runways)){&lt;br /&gt;
    print(rwy, &amp;quot;: &amp;quot;, math.round(info.runways[rwy].length * M2FT), &amp;quot; ft (&amp;quot;, info.runways[rwy].length, &amp;quot; m)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that searches for locations that are a long way away (e.g., the nearest seaplane base to the middle of the Sahara) may cause FlightGear to pause for an amount of time.&lt;br /&gt;
|param1 = id&lt;br /&gt;
|param1text = The {{wikipedia|International Civil Aviation Organization airport code|ICAO code|noicon=1}} of an airport to retrieve information about.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = When this argument is used, the function will return the closest airport of a certain type. Can be one of &amp;quot;heliport,&amp;quot; &amp;quot;seaport,&amp;quot; or &amp;quot;airport&amp;quot; (default).&lt;br /&gt;
: {{inote|Running this function without any parameters is equivalent to this:&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
airportinfo(&amp;quot;airport&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
|param3 = lat ''and'' lon&lt;br /&gt;
|param3text = When these parameters are used, the function will return information on the nearest airport, heliport or seaplane base (depending on the '''type''' parameter) to those coordinates.&lt;br /&gt;
|example1 = var info = airportinfo();&lt;br /&gt;
print(&amp;quot;Nearest airport: &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;)&amp;quot;); # prints the name and ICAO code of the nearest airport&lt;br /&gt;
|example2 = var info = airportinfo(&amp;quot;heliport&amp;quot;);&lt;br /&gt;
print(&amp;quot;Elevation of the nearest heliport: &amp;quot;, math.round(info.elevation * M2FT), &amp;quot; ft&amp;quot;); # prints the elevation and name of the nearest heliport&lt;br /&gt;
|example3 = var info = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
print(&amp;quot;-- Runways of &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;): --&amp;quot;);&lt;br /&gt;
foreach(var rwy; keys(info.runways)) {&lt;br /&gt;
    print(rwy); # prints the runways of KSQL&lt;br /&gt;
}&lt;br /&gt;
|example4 = var info = airportinfo(37.81909385, -122.4722484);&lt;br /&gt;
print(&amp;quot;Coordinates of the nearest airport: &amp;quot;, info.lat, &amp;quot;, &amp;quot;, info.lon); # print the name and ICAO of the nearest airport to the Golden Gate Bridge&lt;br /&gt;
|example5 = var info = airportinfo(37.81909385, -122.4722484, &amp;quot;seaport&amp;quot;);&lt;br /&gt;
print(&amp;quot;Nearest seaplane base: &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;)&amp;quot;); # print the name and ID of the nearest seaplane base to the Golden Gate Bridge&lt;br /&gt;
|example6text = This example prints the all information from an &amp;lt;code&amp;gt;airportinfo()&amp;lt;/code&amp;gt; call.&lt;br /&gt;
|example6 = var info = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
print(info.name);&lt;br /&gt;
print(info.id);&lt;br /&gt;
print(info.lat);&lt;br /&gt;
print(info.lon);&lt;br /&gt;
print(info.has_metar);&lt;br /&gt;
print(info.elevation);&lt;br /&gt;
foreach(var rwy; keys(info.runways)){&lt;br /&gt;
    print(&amp;quot;-- &amp;quot;, rwy, &amp;quot; --&amp;quot;);&lt;br /&gt;
    print(info.runways[rwy].lat);&lt;br /&gt;
    print(info.runways[rwy].lon);&lt;br /&gt;
    print(info.runways[rwy].length);&lt;br /&gt;
    print(info.runways[rwy].width);&lt;br /&gt;
    print(info.runways[rwy].heading);&lt;br /&gt;
    print(info.runways[rwy].stopway);&lt;br /&gt;
    print(info.runways[rwy].threshold);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airwaysRoute() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airwaysRoute(start, end[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1933|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
This function returns a vector containing waypoints between two given waypoints. The returned waypoints are ghosts, but can be accessed in the same way as a Nasal hash. See [[Nasal Flightplan]] for more information.&lt;br /&gt;
|param1 = start&lt;br /&gt;
|param1text = Start waypoint, in the form of a waypoint ghost, such as that provided by {{func link|flightplan()}}.&lt;br /&gt;
|param2 = end&lt;br /&gt;
|param2text = Same as above.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = Instructs the function to compute a high level route (when set to &amp;quot;highlevel&amp;quot;), or a low level route (when set to &amp;quot;lowlevel&amp;quot;). Defaults to &amp;quot;highlevel.&amp;quot;&lt;br /&gt;
|example1text = In the [[route manager]] dialog, add two waypoints to the flightplan, ideally ones that are far apart (tip: use the [[Map]] for this). Then run this code in your Nasal Console.&lt;br /&gt;
|example1 = var fp = flightplan();&lt;br /&gt;
var start = fp.getWP(0);&lt;br /&gt;
var end = fp.getWP(fp.getPlanSize() - 1);&lt;br /&gt;
var rt = airwaysRoute(start, end);&lt;br /&gt;
foreach(var wp; rt){&lt;br /&gt;
    print(wp.wp_name); # print the waypoints in the computed route&lt;br /&gt;
}&lt;br /&gt;
|example2text = Exactly the same as above, but computes a low level path.&lt;br /&gt;
|example2 = var fp = flightplan();&lt;br /&gt;
var start = fp.getWP(0);&lt;br /&gt;
var end = fp.getWP(fp.getPlanSize() - 1);&lt;br /&gt;
var rt = airwaysRoute(start, end, &amp;quot;lowlevel&amp;quot;);&lt;br /&gt;
foreach(var wp; rt){&lt;br /&gt;
    print(wp.wp_name); # print the waypoints in the computed route&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airway()===&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airway(ident [, pos]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2644|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
This function returns a ghost containing an airway of a specified id.&lt;br /&gt;
|param1 = ident&lt;br /&gt;
|param1text = a Positioned ghost (leg, navaid, airport) and so on, passed to the search function.&lt;br /&gt;
|param2 = pos&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===assert()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = assert(condition[, message]);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|version = 3.2&lt;br /&gt;
|commit = {{fgdata commit|8b16a7|t=commit}}&lt;br /&gt;
|text = Returns either true if the condition evaluates as true, or aborts with a {{func link|die()}} call, which can be customised.&lt;br /&gt;
|param1 = condition&lt;br /&gt;
|param1text = Condition to evaluate.&lt;br /&gt;
|param2 = message&lt;br /&gt;
|param2text = Optional message that will be used in any {{func link|die()}} call. Defaults to &amp;quot;assertion failed!&amp;quot;&lt;br /&gt;
|example1 = var a = 1;&lt;br /&gt;
var b = 2;&lt;br /&gt;
print(assert(a &amp;lt; b)); # prints &amp;quot;1&amp;quot; (true)&lt;br /&gt;
|example2 = var a = 1;&lt;br /&gt;
var b = 2;&lt;br /&gt;
assert(a &amp;gt; b, 'a is not greater than b'); # aborts with a custom error message&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===carttogeod()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = carttogeod(x, y, z);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=945|t=Source}}&lt;br /&gt;
|text = Converts {{wikipedia|ECEF|Earth-centered, Earth-fixed}} coordinates (x, y and z) to {{wikipedia|geodetic coordinates}} (latitude, longitude, and altitude). A vector is returned containing latitude and longitude, both in degrees, and altitude, which is returned in metres above the equatorial radius of Earth as defined by the {{wikipedia|WGS 84}} (6,378,137 metres).&amp;lt;ref&amp;gt;{{simgear file|simgear/math/sg_geodesy.hxx|l=43}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|param1 = x&lt;br /&gt;
|param1text = Mandatory x-axis value, in metres.&lt;br /&gt;
|param2 = y&lt;br /&gt;
|param2text = Mandatory y-axis value, in metres.&lt;br /&gt;
|param3 = z&lt;br /&gt;
|param3text = Mandatory z-axis value, in metres.&lt;br /&gt;
|example1 = var (lat, lon, alt) = carttogeod(6378137, 0, 0); # point is the intersection of the prime meridian and equator.&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, lat); # prints lat, lon and alt, which are all zero, see above&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, lon);&lt;br /&gt;
print(&amp;quot;Altitude: &amp;quot;, alt);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===cmdarg()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|private = _cmdarg()&lt;br /&gt;
|syntax = cmdarg();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=513|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; returns the property root of certain types of XML files. These could be nodes in the [[Property Tree]], or temporary and/or non-public nodes outside the Property tree. &lt;br /&gt;
It is used by Nasal scripts embedded in XML files. It returns a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object (see {{fgdata file|Nasal/props.nas}}), and you can use all of its methods on the returned value. &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; should only be used in four types/places of XML files:&lt;br /&gt;
* Bindings: This is needed so that the value of a joystick's axis can be accessed internally.&lt;br /&gt;
* Dialogs: This will return the root of the dialog in the Property Tree. This is useful for dialogs that are created/modified procedurally (e.g. for populating/changing widgets while loading the dialog). &lt;br /&gt;
* Embedded Canvases: The Nasal code behind [[Canvas]] windows [[Howto:Adding a canvas to a GUI dialog|embedded in PUI dialogs]] can use it to accessing the root directory of their Canvas.&lt;br /&gt;
* Animation XML files: If the animation XML file is used in an AI/MP model, &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; will return the root of the AI model in the &amp;lt;code&amp;gt;/ai/models/&amp;lt;/code&amp;gt; directory. Examples: &amp;lt;code&amp;gt;/ai/models/aircraft[3]/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ai/models/multiplayer[1]/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should not use &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in places other than those stated above. Although it won't cause an error, it will return the value of the last legitimate &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; call. &lt;br /&gt;
&lt;br /&gt;
Also, you should not delay &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; using {{func link|maketimer()}}, {{func link|settimer()}} or {{func link|setlistener()}}, because it will return an unrelated property.&lt;br /&gt;
|example1 = fgcommand(&amp;quot;dialog-show&amp;quot;, {&amp;quot;dialog-name&amp;quot;: &amp;quot;cmdarg-demo&amp;quot;});&lt;br /&gt;
|example1text = &amp;lt;br&amp;gt;This example demonstrates the usage of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in a binding.  Save the below XML snippet as &amp;lt;tt&amp;gt;[[$FG_ROOT]]/gui/dialogs/cmdarg-demo.xml&amp;lt;/tt&amp;gt;. Then run the Nasal snippet below in your [[Nasal Console]]. Upon clicking {{button|Close}}, a message will be printed sowing the root of the binding in the Property Tree.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;cmdarg-demo&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
  &amp;lt;label&amp;gt;Click &amp;quot;Close&amp;quot; to activate the demonstration (a message in the console).&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Close&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;nasal&amp;lt;/command&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;print(&amp;quot;Button binding root: '&amp;quot; ~ cmdarg().getPath() ~ &amp;quot;'&amp;quot;);&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example2text = This example demonstrates the usage of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in Nasal code within dialogs.  Open &amp;lt;tt&amp;gt;[[$FG_ROOT]]/gui/dialogs/cmdarg-demo.xml&amp;lt;/tt&amp;gt; from the previous example, copy &amp;amp; paste the code below, and save it. Then run the same Nasal snippet as the previous example in your Nasal Console. If you click {{button|Click me!}}, the button's label will change to &amp;quot;I've been changed!&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;cmdarg-demo&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
  &amp;lt;label&amp;gt;Click &amp;quot;Click me!&amp;quot; to activate the demonstration (the button's label will change).&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Click me!&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;nasal&amp;lt;/command&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;change_label();&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Close&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&lt;br /&gt;
  &amp;lt;open&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
    var dlg_root = cmdarg();&lt;br /&gt;
    var dlg_name = {&amp;quot;dialog-name&amp;quot;: &amp;quot;cmdarg-demo&amp;quot;};&lt;br /&gt;
    var change_label = func {&lt;br /&gt;
        dlg_root.getNode(&amp;quot;button[0]/legend&amp;quot;).setValue(&amp;quot;I've been changed!&amp;quot;);&lt;br /&gt;
        fgcommand(&amp;quot;dialog-close&amp;quot;, dlg_name);&lt;br /&gt;
        fgcommand(&amp;quot;dialog-show&amp;quot;, dlg_name);&lt;br /&gt;
    }&lt;br /&gt;
  ]]&amp;gt;&amp;lt;/open&amp;gt;&lt;br /&gt;
&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example3text = For an example of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; used with Canvas, please see [[Howto:Adding a canvas to a GUI dialog#FGPlot|Howto:Adding a canvas to a GUI dialog]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===courseAndDistance()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = courseAndDistance(to);&lt;br /&gt;
courseAndDistance(from, to);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1668|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the course from one point to another and the distance between them in nautical miles. The course is the initial bearing (see [http://www.movable-type.co.uk/scripts/latlong.html#bearing here]), and is in the range 0–360. Both arguments can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object with geodetic coordinates (cartesian coordinates will not be accepted)&lt;br /&gt;
|param1 = from&lt;br /&gt;
|param1text = Optional parameter defining the from where the function should calculate its results. If the function is given one argument ('''to'''), the aircraft's current position will be used. As well as the argument types as defined above, this argument can be two numbers separated with a comma, as if the function is taking three arguments. See example 5 below.&lt;br /&gt;
|param2 = to&lt;br /&gt;
|param2text = Like the first parameter, but defines the second point.&lt;br /&gt;
|example1text = This example demonstrates the usage of the function with the &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost type.&lt;br /&gt;
|example1 = var from = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var to = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course); # prints course from KSFO to KSQL&lt;br /&gt;
print(dist); # prints distance in nm from KSFO to KSQL&lt;br /&gt;
|example2text = This example demonstrates the usage of the function with hashes containing ''lat'' and ''lon''.&lt;br /&gt;
|example2 = var from = {lat: 0, lon: 0};&lt;br /&gt;
var to = {lat: 1, lon: 1};&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example3text = This example demonstrates usage of a geo.Coord object.&lt;br /&gt;
|example3 = var from = geo.Coord.new().set_latlon(0, 0);&lt;br /&gt;
var to = geo.Coord.new().set_latlon(1, 1);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example4text = This example demonstrates usage of differing parameter types.&lt;br /&gt;
|example4 = var from = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var to = geo.Coord.new().set_latlon(0, 0);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example5text = The same as above, but the other way round.&lt;br /&gt;
|example5 = var to = {lat: 1, lon: 1};&lt;br /&gt;
var (course, dist) = courseAndDistance(0, 0, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example6text = Usage of just one parameter.&lt;br /&gt;
|example6 = var dest = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
var (course, dist) = courseAndDistance(dest);&lt;br /&gt;
print(&amp;quot;Turn to heading &amp;quot;, math.round(course), &amp;quot;. You have &amp;quot;, sprintf(&amp;quot;%.2f&amp;quot;, dist), &amp;quot; nm to go&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createFlightplan()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createFlightplan(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2331|t=Source}}&lt;br /&gt;
|text = Creates an empty flightplan object. It accepts one argument, ''path'' passed an absolute path to a .fgfp / .gpx file, it will populate the flightplan with waypoints from the file.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional parameter defining the file from which a flightplan will be populated.&lt;br /&gt;
|example1 = &lt;br /&gt;
var path = getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test.fgfp&amp;quot;;&lt;br /&gt;
var flightplan = createFlightplan(path);&lt;br /&gt;
debug.dump(flightplan);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createDiscontinuity()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createDiscontinuity();&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object. A route discontinuity is inserted by an {{abbr|FMS|Flight Management System}} when it is unsure how to connect two waypoints.&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2045|t=Source}}&lt;br /&gt;
|version = 2016.1&lt;br /&gt;
|commit = {{flightgear commit|caead6|t=commit}}&lt;br /&gt;
}}&lt;br /&gt;
===createViaTo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createViaTo(airway, waypoint);&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object. It represents a route &amp;quot;via '''airway''' to '''waypoint'''&amp;quot;.&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2009|t=Source}}&lt;br /&gt;
|version = 2016.1&lt;br /&gt;
|commit = {{flightgear commit|caead6|t=commit}}&lt;br /&gt;
|param1 = airway&lt;br /&gt;
|param1text = The name of an airway.&lt;br /&gt;
|param2 = waypoint&lt;br /&gt;
|param2text = Must be in the airway and one of:&lt;br /&gt;
* The name of a waypoint.&lt;br /&gt;
* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
}}&lt;br /&gt;
===createWP()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createWP(pos, name[, flag]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1964|t=Source}}&lt;br /&gt;
|text = Creates a new waypoint ghost object.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Dictates the position of the new waypoint. It can be one of the following:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. See example 4 below.&lt;br /&gt;
|param2 = name&lt;br /&gt;
|param2text = String that will become the name of the new waypoint.&lt;br /&gt;
|param3 = flag&lt;br /&gt;
|param3text = Optional string that will tell FlightGear what type of waypoint it is. Must be one of &amp;quot;sid,&amp;quot; &amp;quot;star,&amp;quot; &amp;quot;approach,&amp;quot; &amp;quot;missed,&amp;quot; or &amp;quot;pseudo.&amp;quot;&lt;br /&gt;
|example1text = Creates a waypoint directly in front and 1 km away and appends it to the flight plan.&lt;br /&gt;
|example1 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example2 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP({lat: pos.lat(), lon: pos.lon()}, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example3 = var apt = airportinfo();&lt;br /&gt;
var wp = createWP(apt, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example4 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos.lat(), pos.lon(), &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example5text = Creates a new waypoint and adds it to the flight plan. Waypoints of the type &amp;quot;pseudo&amp;quot; are then removed from the flight plan, including the new waypoint. The {{func link|print()}} statements show this.&lt;br /&gt;
|example5 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos, &amp;quot;NEWWP&amp;quot;, &amp;quot;pseudo&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
fp.clearWPType(&amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createWPFrom()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createWPFrom(object[, flag]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1989|t=Source}}&lt;br /&gt;
|text = Creates a new waypoint object from another object.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = A ghost object. Must be a ghost type that is one of &amp;quot;airport,&amp;quot; &amp;quot;navaid,&amp;quot; &amp;quot;runway,&amp;quot; or &amp;quot;fix.&amp;quot;&lt;br /&gt;
|param2 = flag&lt;br /&gt;
|param2text = Optional string that will tell FlightGear what type of waypoint it is. Must be one of &amp;quot;sid,&amp;quot; &amp;quot;star,&amp;quot; &amp;quot;approach,&amp;quot; &amp;quot;missed,&amp;quot; or &amp;quot;pseudo.&amp;quot;&lt;br /&gt;
|example1text = Creates a new waypoint and appends it to the flight plan.&lt;br /&gt;
|example1 = var apt = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var wp = createWPFrom(apt);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example2text = Creates a new waypoint and appends it to the flight plan. This way point is then removed; the {{func link|print()}} statements prove this.&lt;br /&gt;
|example2 = var apt = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var wp = createWPFrom(apt, &amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(wp.wp_name);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
fp.clearWPType(&amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===defined()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = defined(symbol);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns 1 (true) or 0 (false) depending on whether a variable exists.&lt;br /&gt;
|param1 = symbol&lt;br /&gt;
|param1text = A string that will be what the function searches for.&lt;br /&gt;
|example1 = var number = 12;&lt;br /&gt;
var check_exist = func {&lt;br /&gt;
    print(&amp;quot;Variable 'number' &amp;quot;, defined(&amp;quot;number&amp;quot;) == 1 ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;); # 'number' does exist&lt;br /&gt;
    print(&amp;quot;Variable 'number2' &amp;quot;, defined(&amp;quot;number2&amp;quot;) == 1 ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;); # 'number2' does not exist&lt;br /&gt;
}&lt;br /&gt;
check_exist();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===directory()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = directory(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=572|t=Source}}&lt;br /&gt;
|text = Returns a vector containing a list of the folders and files in a given file path or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the path doesn't exist. Hidden folders and files are not added to the vector.&lt;br /&gt;
{{inote|The first two elements of the vector will be &amp;lt;code&amp;gt;'.'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'..'&amp;lt;/code&amp;gt;. These are for navigating back up the file tree, but have no use in Nasal. They can be safely removed from the vector.}}&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Absolute file path.&lt;br /&gt;
|example1text = Gets the folders and files in [[$FG_ROOT]], and then removes the extra first two elements (see note above). &lt;br /&gt;
|example1 = var dir = directory(getprop(&amp;quot;/sim/fg-root&amp;quot;)); # get directory&lt;br /&gt;
dir = subvec(dir, 2); # strips off the first two elements&lt;br /&gt;
debug.dump(dir); # dump the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===fgcommand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = fgcommand(cmd[, args]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=456|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = Runs an fgcommand. See also {{readme file|commands}} and [[Bindings]] for more information. See {{flightgear file|src/Main/fg_commands.cxx|l=1425}} for the full list of fgcommands. Note that fgcommands generated by {{func link|addcommand()}} can also be run using this function. Also, the full list of fgcommands depends on the version of FlightGear you have. Returns 1 (true) if the fgcommand succeeded or 0 (false) if it failed.&lt;br /&gt;
|param1 = cmd&lt;br /&gt;
|param1text = String that is the name of the command that is to be run.&lt;br /&gt;
|param2 = args&lt;br /&gt;
|param2text = If the fgcommand takes arguments, they are inputted using this argument. Can either be a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object, or a hash (see examples below).&lt;br /&gt;
|example1 = fgcommand(&amp;quot;null&amp;quot;); # does nothing&lt;br /&gt;
|example2 = var args = props.Node.new({'script': 'print(&amp;quot;Running fgcommand&amp;quot;);'});&lt;br /&gt;
if (fgcommand(&amp;quot;nasal&amp;quot;, args)) { # prints &amp;quot;Running fgcommand&amp;quot; and then one of these print statements&lt;br /&gt;
    print(&amp;quot;Fgcommand succeeded&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Fgcommand encountered a problem&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example3 = var args = { 'dialog-name': 'about' };&lt;br /&gt;
fgcommand(&amp;quot;dialog-show&amp;quot;, args); # shows the 'about' dialog&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findAirportsByICAO() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findAirportsByICAO(search[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1096|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost objects which are (by default) airports whose ICAO code matches the search string. The results are sorted by range from closest to furthest.&lt;br /&gt;
|param1 = search&lt;br /&gt;
|param1text = Search string for the function. Can either be a partial or a full ICAO code.&lt;br /&gt;
:{{icaution|The more matches there are for the given code, the longer the function will take. Passing just one character (e.g., &amp;quot;K&amp;quot;), might make FlightGear hang for a certain amount of time.}}&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = This will narrow the search to airports of a certain type. By default, only airports are searched for. May be one of &amp;quot;airport,&amp;quot; &amp;quot;heliport,&amp;quot; or &amp;quot;seaport.&amp;quot;&lt;br /&gt;
|example1 = var apts = findAirportsByICAO(&amp;quot;KSF&amp;quot;); # finds all airports matching &amp;quot;KSF&amp;quot;&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;); # prints them&lt;br /&gt;
}&lt;br /&gt;
|example2 = var apts = findAirportsByICAO(&amp;quot;SP0&amp;quot;, &amp;quot;seaport&amp;quot;); # finds all seaplane bases matching &amp;quot;SP0&amp;quot;&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;); # prints them&lt;br /&gt;
}&lt;br /&gt;
|example3 = var apt = findAirportsByICAO(&amp;quot;XBET&amp;quot;); # one way to check if an airport does exist&amp;quot;&lt;br /&gt;
if (size(apt) == 0) {&lt;br /&gt;
    print(&amp;quot;Airport does not exist&amp;quot;); # this one will be printed&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Airport does exist&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findAirportsWithinRange()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findAirportsWithinRange([pos, ]range[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1066|t=Source}}&lt;br /&gt;
|text = Returns a vector of &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost object which are (by default) airports that are within a given range of a given position, or the aircraft's current position. The results are sorted by range from closest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findAirportsWithinRange(lat, lon, range, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = range&lt;br /&gt;
|param2text = Mandatory number giving the range in nautical miles within which to search for airports/heliports/seaplane bases.only airports are searched for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to airports of a certain type. By default, only airports are searched for. May be one of &amp;quot;airport,&amp;quot; &amp;quot;heliport,&amp;quot; or &amp;quot;seaport.&amp;quot;&lt;br /&gt;
|example1text = Searches for airports within 10 nm of [[KSFO]].&lt;br /&gt;
|example1 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var apts = findAirportsWithinRange(pos, 10);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2text = Searches for seaplane bases within 15 nm of [[KSFO]].&lt;br /&gt;
|example2 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var apts = findAirportsWithinRange(pos, 15, &amp;quot;seaport&amp;quot;);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example3text = Searches for airports within 10 nm of your current position.&lt;br /&gt;
|example3 = var apts = findAirportsWithinRange(10);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findCommByFrequencyMHz()===&lt;br /&gt;
 findCommByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
[[sourceforge:p/flightgear/flightgear/ci/next/tree/src/Scripting/NasalPositioned.cxx#l1547|source]]&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;code&amp;gt;comm&amp;lt;/code&amp;gt; ghost object for a station matching a given frequency. If there is more than one station with that frequency, the nearest station is returned.&lt;br /&gt;
&lt;br /&gt;
'''pos'''&lt;br /&gt;
&lt;br /&gt;
: Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findCommByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
; freq&lt;br /&gt;
: Frequency, in megahertz, of the station to search for.&lt;br /&gt;
; type&lt;br /&gt;
: This will narrow the search to station of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see flightgear/src/Navaids/positioned.cxx (line 160)&lt;br /&gt;
'''Example'''&lt;br /&gt;
 var com = findCommByFrequencyMHz(123.6);&lt;br /&gt;
 print(&amp;quot;ID: &amp;quot;, com.id); # prints info about the comm station&lt;br /&gt;
 print(&amp;quot;Name: &amp;quot;, com.name);&lt;br /&gt;
 print(&amp;quot;Latitude: &amp;quot;, com.lat);&lt;br /&gt;
 print(&amp;quot;Longitude: &amp;quot;, com.lon);&lt;br /&gt;
 print(&amp;quot;Type: &amp;quot;, com.type);&lt;br /&gt;
 print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, com.frequency), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== findFixesByID() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findFixesByID([pos, ]id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1627|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; ghost objects matching a given ID, sorted by range from a certain position.&lt;br /&gt;
{{inote|Fixes are (usually) also known as waypoints.}}&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findFixesByID(lat, lon, id);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = id&lt;br /&gt;
|param2text = Full or partial ID of the fix to search for.&lt;br /&gt;
:{{inote|1=Inputting a partial ID does not work correctly (see [http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=28129 here]). It is best to just input a full ID.}}&lt;br /&gt;
|example1 = var fixes = findFixesByID(&amp;quot;POGIC&amp;quot;);&lt;br /&gt;
foreach(var fix; fixes){&lt;br /&gt;
    print(fix.id, &amp;quot; - lat: &amp;quot;, fix.lat, &amp;quot; {{!}} lon: &amp;quot;, fix.lon); # prints information about POGIC&lt;br /&gt;
}&lt;br /&gt;
|example2 = var fix = findFixesByID(&amp;quot;ZUNAP&amp;quot;);&lt;br /&gt;
fix = fix[0];&lt;br /&gt;
var (course, dist) = courseAndDistance(fix);&lt;br /&gt;
print(&amp;quot;Turn to heading &amp;quot;, math.round(course), &amp;quot;. You have &amp;quot;, sprintf(&amp;quot;%.2f&amp;quot;, dist), &amp;quot; nm to go to reach &amp;quot;, fixes[0].id);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidByFrequencyMHz()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1547|t=Source}}&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost object for a navaid matching a given frequency. If there is more than one navaid with that frequency, the nearest station is returned.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = freq&lt;br /&gt;
|param2text = Frequency, in megahertz, of the navaid to search for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaid = findNavaidByFrequencyMHz(109.55);&lt;br /&gt;
print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about the navaid&lt;br /&gt;
print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 100), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
if(navaid.course) print(&amp;quot;Course: &amp;quot;, navaid.course);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== findNavaidsByFrequencyMHz()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1572|t=Source}}&lt;br /&gt;
|text = Returns a vector conatining &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects for navaids that match a given frequency, sorted from nearest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = freq&lt;br /&gt;
|param2text = Frequency, in megahertz, of the navaid to search for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaids = findNavaidsByFrequencyMHz(109.55);&lt;br /&gt;
foreach(var navaid; navaids){&lt;br /&gt;
    print(&amp;quot;--&amp;quot;);&lt;br /&gt;
    print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about the navaid&lt;br /&gt;
    print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
    print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
    print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
    print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
    print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
    print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 100), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
    print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
    if(navaid.course) print(&amp;quot;Course: &amp;quot;, navaid.course);&lt;br /&gt;
    print(&amp;quot;--&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidsByID()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsByID([pos, ]id[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1600|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects matching a given ID, sorted by range from a certain position.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsByID(lat, lon, id, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = id&lt;br /&gt;
|param2text = Full or partial ID of the fix to search for.&lt;br /&gt;
:{{inote|1=Inputting a partial ID does not work correctly (see [http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=28129 here]). It is best to just input a full ID.}}&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaid = findNavaidsByID(&amp;quot;MXW&amp;quot;);&lt;br /&gt;
navaid = navaid[0];&lt;br /&gt;
print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about 'MXW' (a VOR station)&lt;br /&gt;
print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 1000), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidsWithinRange()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsWithinRange([pos, ]range[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1518|t=Source}}&lt;br /&gt;
|text = Returns a vector of &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects which are within a given range of a given position (by default the aircraft's current position). The results are sorted from closest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsWithinRange(lat, lon, range, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = range&lt;br /&gt;
|param2text = Mandatory number giving the range in nautical miles within which to search for navaids.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1text = Searches for navaids within 10 nm of [[KSFO]].&lt;br /&gt;
|example1 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var navs = findNavaidsWithinRange(pos, 10);&lt;br /&gt;
foreach(var nav; navs){&lt;br /&gt;
    print(nav.name, &amp;quot; (ID: &amp;quot;, nav.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2text = Searches for navaids within 10 nm of your current position.&lt;br /&gt;
|example2 = var navs = findNavaidsWithinRange(10);&lt;br /&gt;
foreach(var nav; navs){&lt;br /&gt;
    print(nav.name, &amp;quot; (ID: &amp;quot;, nav.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===finddata()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = finddata(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=603|t=Source}}&lt;br /&gt;
|text = Takes a relative path and tries to return an absolute one. It works by appending the relative path to some paths and testing to see if they exist. As of FlightGear v3.7, these paths are the TerraSync directory (tested first) and [[$FG_ROOT]]. &lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = A relative path as a string.&lt;br /&gt;
|example1 = var path = finddata(&amp;quot;Aircraft/Generic&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to $FG_ROOT/Aircraft/Generic&lt;br /&gt;
|example2 = var path = finddata(&amp;quot;Airports&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to &amp;lt;TerraSync dir&amp;gt;/Airports&lt;br /&gt;
|example3 = var path = finddata(&amp;quot;preferences.xml&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to $FG_ROOT/preferences.xml&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===flightplan()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = flightplan([path]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1738|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
Returns a flight plan object, either one for the current flight plan, or one loaded from a given path.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional path to flight plan XML file.&lt;br /&gt;
|example1text = Gets the active flight plan and gets the ID of the current waypoint. Note that this example requires a flight plan to be set in the [[Route Manager]] first.&lt;br /&gt;
|example1 = var fp = flightplan();&lt;br /&gt;
print(fp.getWP(fp.current).id);&lt;br /&gt;
|example2text = Creates a new flight plan from an XML file and prints the IDs of the waypoints. Note that this example requires a flight plan to have been created and saved as &amp;lt;tt&amp;gt;''[[$FG_HOME]]/fp-demo.xml''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example2 = var path = getprop('/sim/fg-home') ~ '/fp-demo.xml';&lt;br /&gt;
var fp = flightplan(path);&lt;br /&gt;
for(var i = 0; i &amp;lt; fp.getPlanSize(); i += 1){&lt;br /&gt;
    print(fp.getWP(i).id);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===geodinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = geodinfo(lat, lon[, max_alt]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=981|t=Source}}&lt;br /&gt;
|text = Returns a vector containing two entries or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if no information could be obtained because the terrain tile wasn't loaded. The first entry in the vector is the elevation (in meters) for the given point, and the second is a hash with information about the assigned material (as defined in &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/Materials''&amp;lt;/tt&amp;gt;), or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if there was no material information available (for example, because there is an untextured building at that location). The structure of the hash is as follows (see also {{readme file|materials}}):&lt;br /&gt;
* '''light_coverage:''' The coverage of a single point of light in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* '''bumpiness:''' Normalized bumpiness factor for the material.&lt;br /&gt;
* '''load_resistance:''' The amount of pressure in N/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; the material can withstand without deformation.&lt;br /&gt;
* '''solid:''' 1 (true) or false (0) depending on whether the material is solid or not.&lt;br /&gt;
* '''names:''' Vector of scenery types (usually generated by [[TerraGear]]) that will use this material. &lt;br /&gt;
* '''friction_factor:''' Normalized friction factor of the material.&lt;br /&gt;
* '''rolling_friction:''' The rolling friction coefficient of the material.&lt;br /&gt;
&lt;br /&gt;
Note that this function is a ''very'' CPU-intensive operation, particularly in FlightGear v2.4 and earlier. It is advised to use this function as little as possible.&lt;br /&gt;
|param1 = lat&lt;br /&gt;
|param1text = Latitude, inputted as a number.&lt;br /&gt;
|param2 = lon&lt;br /&gt;
|param2text = Longitude, inputted as a number.&lt;br /&gt;
|param3 = max_alt&lt;br /&gt;
|param3text = The altitude, in metres, from which the function will begin searching for the height of the terrain. Defaults to 10,000 metres. If the terrain is higher than this argument specifies, &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; will be returned.&lt;br /&gt;
|example1text = Dumps information about ground underneath the aircraft.&lt;br /&gt;
|example1 = var pos = geo.aircraft_position();&lt;br /&gt;
var info = geodinfo(pos.lat(), pos.lon());&lt;br /&gt;
debug.dump(info);&lt;br /&gt;
|example2text = Prints whether the ground underneath the aircraft is solid or is water.&lt;br /&gt;
|example2 = var pos = geo.aircraft_position();&lt;br /&gt;
var info = geodinfo(pos.lat(), pos.lon());&lt;br /&gt;
if (info != nil and info[1] != nil) {&lt;br /&gt;
    print(&amp;quot;The ground underneath the aircraft is &amp;quot;, info[1].solid == 1 ? &amp;quot;solid.&amp;quot; : &amp;quot;water.&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== geodtocart() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = geodtocart(lat, lon, alt);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=962|t=Source}}&lt;br /&gt;
|text = Converts {{wikipedia|geodetic coordinates}} (latitude, longitude, and altitude) to {{wikipedia|ECEF|Earth-centered, Earth-fixed}} coordinates (x, y and z). A vector is returned containing x, y, and z in metres. The equatorial radius of earth used is that defined by the {{wikipedia|WGS 84}} (6,378,137 metres). All argument are mandatory.&lt;br /&gt;
|param1 = lat&lt;br /&gt;
|param1text = Latitude, in degrees.&lt;br /&gt;
|param2 = lon&lt;br /&gt;
|param2text = Longitude, in degrees.&lt;br /&gt;
|param3 = alt&lt;br /&gt;
|param3text = Altitude, in metres.&lt;br /&gt;
|example1 = var (x, y, z) = geodtocart(0, 0, 0); # point is the intersection of the prime meridian and equator.&lt;br /&gt;
print(&amp;quot;x: &amp;quot;, x); # prints &amp;quot;x: 6378137&amp;quot;&lt;br /&gt;
print(&amp;quot;y: &amp;quot;, y); # prints &amp;quot;y: 0&amp;quot;&lt;br /&gt;
print(&amp;quot;z: &amp;quot;, z); # prints &amp;quot;y: 0&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== get_cart_ground_intersection()===&lt;br /&gt;
Introduced in 2017.2.1, see [[Terrain Detection]].&lt;br /&gt;
&lt;br /&gt;
===getprop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;getprop(path[, path[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=345|t=Source}}&lt;br /&gt;
|text = Returns the value of a node in the [[Property Tree]] or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the node does not exist or the value is not a number (NaN).&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = There needs to be at least one argument, but there is no limit to the maximum amount of arguments that can be given. The arguments will be concatenated together to form a property tree path. The arguments must be strings, but in FlightGear v3.2 onwards, there is also support (added by {{flightgear commit|34ed79}}) for numeric arguments as indices. See example 2 below.&lt;br /&gt;
|example1 = print(&amp;quot;You have FlightGear v&amp;quot;, getprop(&amp;quot;/sim/version/flightgear&amp;quot;)); # prints FlightGear version&lt;br /&gt;
|example2text = Note that the example below will only work in FlightGear 3.2 and above.&lt;br /&gt;
|example2 = for(var i = 0; i &amp;lt; 8; i += 1){&lt;br /&gt;
    print(&amp;quot;View #&amp;quot;, i + 1, &amp;quot; is named &amp;quot;, getprop(&amp;quot;/sim/view&amp;quot;, i, &amp;quot;name&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
|example3text = Same as above, but is supported by all versions of FlightGear.&lt;br /&gt;
|example3 = for(var i = 0; i &amp;lt; 8; i += 1){&lt;br /&gt;
    print(&amp;quot;View #&amp;quot;, i + 1, &amp;quot; is named &amp;quot;, getprop(&amp;quot;/sim/view[&amp;quot; ~ i ~ &amp;quot;]/name&amp;quot;));&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== See also====&lt;br /&gt;
{{note| If you have to read/write the same property multiple times (e.g. in an update loop), it is more efficient to use a node object: &lt;br /&gt;
To get a Node rather than its value, use &amp;lt;code&amp;gt;props.globals.getNode()&amp;lt;/code&amp;gt; - see [[Nasal_library/props]]. }}&lt;br /&gt;
&lt;br /&gt;
===greatCircleMove()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = greatCircleMove([pos, ]course, dist);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1681|t=Source}}&lt;br /&gt;
|text = Calculates a new set of geodetic coordinates using inputs of course and distance, either from the aircraft's current position (by default) or from another set of coordinates. Returns a hash containing two members, ''lat'' and ''lon'' (latitude and longitude respectively).&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to calculate from. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A &amp;lt;code&amp;gt;geo.Coord&amp;lt;/code&amp;gt; object&lt;br /&gt;
:* A lat/lon pair, that is, a pair of numbers (latitude followed by longitude) separated by a comma: &amp;lt;code&amp;gt;greatCircleMove(lat,lon, ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = course&lt;br /&gt;
|param2text = Course to new set of coordinates, in degrees (in the range 0–360).&lt;br /&gt;
|param3 = dist&lt;br /&gt;
|param3text = Distance in nautical miles to the new set of coordinates.&lt;br /&gt;
|example1 = var pos = greatCircleMove(0,0, 0, 1);&lt;br /&gt;
debug.dump(pos); # print hash with coordinates&lt;br /&gt;
|example2 = var fix = findFixesByID(&amp;quot;POGIC&amp;quot;);&lt;br /&gt;
fix = fix[0];&lt;br /&gt;
var pos = greatCircleMove(fix, 45, 10);&lt;br /&gt;
debug.dump(pos); # print hash with coordinates&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===interpolate()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|private = _interpolate()&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;interpolate(prop, value1, time1[, value2, time2[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=522|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = Linearly interpolates a node in the property tree to a given value in a specified time. The value/time pairs will be run one after the other in the order that they are passed to the function. Note that the interpolation will continue even when the simulation is paused.&lt;br /&gt;
|param1 = prop&lt;br /&gt;
|param1text = String or &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object that indicates a node in the property tree to be used.&lt;br /&gt;
|param2 = value''n''&lt;br /&gt;
|param2text = Target value to change the property to in the set amount of time. This should be a number.&lt;br /&gt;
|param3 = time''n''&lt;br /&gt;
|param3text = Time in seconds, that will be taken for the interpolation.&lt;br /&gt;
|example1text = Paste the code below into the Nasal Console and execute. Then, open the Property Browser and look for the property. Finally, run the code again, and watch the value of the property change.&lt;br /&gt;
|example1 = setprop(&amp;quot;/test&amp;quot;, 0); # (re-)set property&lt;br /&gt;
interpolate(&amp;quot;/test&amp;quot;,&lt;br /&gt;
    50, 5, # interpolate to 50 in 5 seconds&lt;br /&gt;
    10, 2, # interpolate to 10 in 2 seconds&lt;br /&gt;
    0, 5); # interpolate to 0 in 5 seconds&lt;br /&gt;
|example2 = # Apply the left brake at 20% per second&lt;br /&gt;
var prop = &amp;quot;controls/gear/brake-left&amp;quot;;&lt;br /&gt;
var dist = 1 - getprop(prop);&lt;br /&gt;
if (dist == 1) {&lt;br /&gt;
    interpolate(prop, 1, dist / 0.2);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isa()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isa(object, class);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Checks if an object is an instance of, or inherits from, a second object (or class), returning 1 (true) if it is and 0 (false) if otherwise.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to check.&lt;br /&gt;
|param2 = class&lt;br /&gt;
|param2text = Class/object to check that '''object''' inherits from or is an instance of.&lt;br /&gt;
|example1 = var coord = geo.Coord.new();&lt;br /&gt;
if(isa(coord, geo.Coord)){&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is an instance of class 'geo.Coord'&amp;quot;); # this one will be printed&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is not an instance of class 'geo.Coord'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2 = var coord = geo.Coord.new();&lt;br /&gt;
if(isa(coord, props.Node)){&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is an instance of class 'props.Node'&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is not an instance of class 'props.Node'&amp;quot;); # this one will be printed&lt;br /&gt;
}&lt;br /&gt;
|example3text = The example below demonstrates checking of inheritance.&lt;br /&gt;
|example3 = var Const = {&lt;br /&gt;
    constant: 2,&lt;br /&gt;
    getConst: func {&lt;br /&gt;
        return me.constant;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Add = {&lt;br /&gt;
    new: func {&lt;br /&gt;
        return { parents: [Add, Const] };&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addToConst: func(a){&lt;br /&gt;
        return a * me.getConst();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var m = Add.new();&lt;br /&gt;
print(m.addToConst(4));&lt;br /&gt;
&lt;br /&gt;
if(isa(m, Add)) print(&amp;quot;Variable 'm' is an instance of class 'Add'&amp;quot;); # will be printed&lt;br /&gt;
if(isa(m, Const)) print(&amp;quot;Variable 'm' is an instance of class 'Const'&amp;quot;); # will also be printed&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===logprint()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;logprint(priority[, msg[, msg[, ...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=431|t=Source}}&lt;br /&gt;
|text = Concatenates a message and logs it with a given priority level. Unlike {{func link|print()}} and {{func link|printlog()}}, message outputted by this function will be logged in your &amp;lt;code&amp;gt;[[Commonly used debugging tools#fgfs.log|fgfs.log]]&amp;lt;/code&amp;gt; file as coming from the Nasal file itself rather than from {{flightgear file|src/Scripting/NasalSys.cxx}}.&lt;br /&gt;
|param1 = priority&lt;br /&gt;
|param1text = Number specifying the priority level of the outputted message:&lt;br /&gt;
:{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Number !! Debug type&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 1 {{!!}} Bulk&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 2 {{!!}} Debug&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 3 {{!!}} Info&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 4 {{!!}} Warn&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 5 {{!!}} Alert&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param2 = msg&lt;br /&gt;
|param2text = The message. There is no limit to the arguments you give give. They will be concatenated together before logging.&lt;br /&gt;
|example1 = # logs the value of pi to three decimal places with log level 3&lt;br /&gt;
logprint(3, &amp;quot;pi = &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, math.pi));&lt;br /&gt;
|example2 = logprint(5, &amp;quot;Alert! This is an important message!&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
{{note| &lt;br /&gt;
The following constants have been added to the development branch of FlightGear (&amp;quot;next&amp;quot;) and will be releases with FG 2020.1 so you won't have to remember the numbers anymore:&lt;br /&gt;
&lt;br /&gt;
LOG_BULK, LOG_WARN, LOG_DEBUG, LOG_INFO, LOG_ALERT, DEV_WARN, DEV_ALERT }}&lt;br /&gt;
&lt;br /&gt;
===magvar() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = magvar([pos]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1642|t=Source}}&lt;br /&gt;
|text = Returns the {{wikipedia|magnetic variation}} at a given set of coordinates. The table below gives the magnetic model used depending on the version of FlightGear.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! FlightGear versions !! Model !! Reference date&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 3.6 and above {{!!}} {{wikipedia|World Magnetic Model}} (WMM) 2015 {{!!}} 1 January 2015&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0.9.11-pre1 to 3.4 {{!!}} WMM 2005 {{!!}} 1 January 2005&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0.7.3 to 0.9.10 {{!!}} WMM 2000 {{!!}} 1 January 2000&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to calculate from. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A &amp;lt;code&amp;gt;geo.Coord&amp;lt;/code&amp;gt; object&lt;br /&gt;
:* A lat/lon pair, that is, a pair of numbers (latitude followed by longitude) separated by a comma: &amp;lt;code&amp;gt;magvar(lat,lon)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = print(magvar(0, 0)); # prints the magnetic variation at 0, 0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===maketimer() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = maketimer(interval[, self], function);&lt;br /&gt;
|source = ''Implemented using the {{API Link|flightgear|class|TimerObj}} class.''&amp;lt;br&amp;gt;{{flightgear file|src/Scripting/NasalSys.cxx|l=90|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=533|t=Part 2}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{flightgear commit|ab939f|t=commit}}&lt;br /&gt;
|text = Returns a timer object containing the following methods and members:&lt;br /&gt;
* '''start()''': Starts the timer.&lt;br /&gt;
* '''stop()''': Stops the timer.&lt;br /&gt;
* '''restart(interval)''': Restarts the timer with the given interval.&lt;br /&gt;
* '''singleShot''': Bool showing whether the timer is only to be run once, or continuously until told to stop. Can be both set and read from (see examples).&lt;br /&gt;
* '''isRunning''': Read-only bool telling whether the timer is currently running.&lt;br /&gt;
* '''simulatedTime''': (FG 2017.1+; {{flightgear commit|0af316|t=commit}}) Bool telling whether the timer is using simulated time (which accounts for pause, etc.). Defaults to false (use real time). Can be both read and set. This cannot be changed while the timer is running.&lt;br /&gt;
Unlike {{func link|settimer()}}, which it replaces, &amp;lt;code&amp;gt;maketimer()&amp;lt;/code&amp;gt; provides more control over the timer. In addition, it can help reduce memory usage.&lt;br /&gt;
|param1 = interval&lt;br /&gt;
|param1text = Interval in seconds for the timer.&lt;br /&gt;
|param2 = self&lt;br /&gt;
|param2text = Optional parameter specifying what any &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; references in the function being called will refer to.&lt;br /&gt;
|param3 = function&lt;br /&gt;
|param3text = Function to be called at the given interval.&lt;br /&gt;
|example1 = var timer = maketimer(1, func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;); # print &amp;quot;Hello, World!&amp;quot; once every second (call timer.stop() to stop it)&lt;br /&gt;
});&lt;br /&gt;
timer.start();&lt;br /&gt;
|example2 = var timer = maketimer(1, math, func(){&lt;br /&gt;
    print(me.math); # 'me' reference is the 'math' namespace&lt;br /&gt;
});&lt;br /&gt;
timer.singleShot = 1; # timer will only be run once&lt;br /&gt;
timer.start();&lt;br /&gt;
|example3 = var timer = maketimer(1, func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;); # print &amp;quot;Hello, World!&amp;quot; once every second (call timer.stop() to stop it)&lt;br /&gt;
});&lt;br /&gt;
timer.start();&lt;br /&gt;
print(timer.isRunning); # prints 1&lt;br /&gt;
|example4text = In the example below, &amp;quot;Hello, World!&amp;quot; will be printed after one second the first time, and after two seconds thereafter.&lt;br /&gt;
|example4 = var update = func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
    timer.restart(2); # restarts the timer with a two second interval&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var timer = maketimer(1, update);&lt;br /&gt;
timer.singleShot = 1;&lt;br /&gt;
timer.start();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===maketimestamp()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = maketimestamp()&lt;br /&gt;
|source = ''Implemented using the {{API Link|flightgear|class|TimeStampObj}} class.''&amp;lt;br&amp;gt;{{flightgear file|src/Scripting/NasalSys.cxx|l=214|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=589|t=Part 2}}&lt;br /&gt;
|version = 2019.2&lt;br /&gt;
|commit = {{flightgear commit|7db06300|t=commit}}&lt;br /&gt;
|text = Returns a time stamp object to allow high resolution timing of Nasal operations. When created the timer will automatically be stamped. The object has the following methods:&lt;br /&gt;
* '''stamp()''': Resets the timing operation. Call this first.&lt;br /&gt;
* '''elapsedMSec()''': returns number of milliseconds elapsed since stamp() called. Resolution may vary depending on platform but is usually at least millisecond accuracy.&lt;br /&gt;
* '''elapsedUSec()''': returns number of microseconds elapsed since stamp() called. Resolution may vary depending on platform but is usually at least millisecond accuracy.&lt;br /&gt;
|&lt;br /&gt;
|example1text = In the example below the number of milliseconds elapsed will be printed.&lt;br /&gt;
|example1 = var timestamp = maketimestamp();&lt;br /&gt;
timestamp.stamp();&lt;br /&gt;
print(timestamp.elapsedMSec(), &amp;quot;ms elapsed&amp;quot;);&lt;br /&gt;
print(timestamp.elapsedMSec(), &amp;quot;ms elapsed&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===md5()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = md5(string);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=758|t=Source}}&lt;br /&gt;
|version = 3.2&lt;br /&gt;
|commit = {{flightgear commit|cfbf9e|t=commit}}&lt;br /&gt;
|text = Returns a the {{wikipedia|MD5}} hash (as a string) of the inputted string.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String the generate the hash of. Mandatory.&lt;br /&gt;
|example1text = The below code should output &amp;lt;code&amp;gt;65a8e27d8879283831b664bd8b7f0ad4&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = print(md5(&amp;quot;Hello, World!&amp;quot;));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===navinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = navinfo(lat, lon, type, id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1453|t=Source}}&lt;br /&gt;
|text = Returns vector &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects matching the given '''type''' and '''id''' or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; on error.&lt;br /&gt;
|param1 = lat ''and'' lon&lt;br /&gt;
|param1text = If given, the returned navaids will be put into order of ascending distance from the location.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = Narrows the search to the given type. Must be one of &amp;quot;any,&amp;quot; &amp;quot;fix,&amp;quot; &amp;quot;vor,&amp;quot; &amp;quot;ndb,&amp;quot; &amp;quot;ils,&amp;quot; &amp;quot;dme,&amp;quot; or &amp;quot;tacan.&amp;quot; Defaults to the equivalent of &amp;quot;any.&amp;quot;&lt;br /&gt;
|param3 = id&lt;br /&gt;
|param3text = ID to search for. Note that, although all the parameters are technically optional, this parameter must be given, otherwise an empty vector will be returned.&lt;br /&gt;
|example1 = navinfo(&amp;quot;vor&amp;quot;); # returns all VORs&lt;br /&gt;
|example2 = navinfo(&amp;quot;HAM&amp;quot;); # return all navaids whose names start with &amp;quot;HAM&amp;quot;&lt;br /&gt;
|example3 = navinfo(&amp;quot;vor&amp;quot;, &amp;quot;HAM&amp;quot;); # return all VORs whose names start with &amp;quot;HAM&amp;quot;&lt;br /&gt;
|example4 = navinfo(34,48,&amp;quot;vor&amp;quot;,&amp;quot;HAM&amp;quot;); # return all VORs whose names start with &amp;quot;HAM&amp;quot; and sorted by distance relative to 34°, 48°&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===parse_markdown()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = parse_markdown(markdown);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=745|t=Part 1}} {{!}} {{simgear file|simgear/misc/SimpleMarkdown.cxx|t=Part 2}} &lt;br /&gt;
|version = 3.2&lt;br /&gt;
|text = Parses a string containing {{wikipedia|Markdown}} and returns the result as a string. As of FlightGear 2016.1, it is just a simple parser, and does the following:&lt;br /&gt;
* It strips whitespace from the beginning of the string.&lt;br /&gt;
* It supports [http://daringfireball.net/projects/markdown/syntax#p paragraphs and line breaks].&lt;br /&gt;
* It collapses whitespace.&lt;br /&gt;
* It converts unordered [http://daringfireball.net/projects/markdown/syntax#list lists] to use a bullet character (&amp;amp;bull;). Note that the bullet character is implemented in hexadecimal UTF-8 character bytes (&amp;lt;code&amp;gt;E2 80 A2&amp;lt;/code&amp;gt;), as so may not work properly when the being displayed in an encoding other than UTF-8.&lt;br /&gt;
|param1 = markdown&lt;br /&gt;
|param1text = String containing Markdown to be parsed.&lt;br /&gt;
|example1text = &lt;br /&gt;
Save the below code as &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/gui/dialogs/test.xml''&amp;lt;/tt&amp;gt;, then run the Nasal code below it to open the dialog. To change the markdown to be parsed, simply change the code in the highlighted section, save it, and reload the GUI (&amp;lt;tt&amp;gt;Debug &amp;gt; Reload GUI&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; highlight=&amp;quot;41-50&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;test&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;group&amp;gt;&lt;br /&gt;
    &amp;lt;layout&amp;gt;hbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;empty&amp;gt;&lt;br /&gt;
        &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;/empty&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;text&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;parse_markdown() test dialog&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;/text&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;empty&amp;gt;&lt;br /&gt;
        &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;/empty&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button&amp;gt;&lt;br /&gt;
        &amp;lt;legend&amp;gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;
        &amp;lt;pref-width&amp;gt;16&amp;lt;/pref-width&amp;gt;&lt;br /&gt;
        &amp;lt;pref-height&amp;gt;16&amp;lt;/pref-height&amp;gt;&lt;br /&gt;
        &amp;lt;binding&amp;gt;&lt;br /&gt;
            &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
        &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;canvas&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;Canvas plot&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;pref-width&amp;gt;400&amp;lt;/pref-width&amp;gt;&lt;br /&gt;
    &amp;lt;pref-height&amp;gt;300&amp;lt;/pref-height&amp;gt;&lt;br /&gt;
    &amp;lt;nasal&amp;gt;&lt;br /&gt;
        &amp;lt;load&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
var text = 'Items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears&lt;br /&gt;
&lt;br /&gt;
Some text.&lt;br /&gt;
Some more items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears';&lt;br /&gt;
&lt;br /&gt;
var parsed = parse_markdown(text);&lt;br /&gt;
&lt;br /&gt;
var root_canvas = canvas.get(cmdarg());&lt;br /&gt;
root_canvas.setColorBackground(255, 255, 255);&lt;br /&gt;
var root = root_canvas.createGroup();&lt;br /&gt;
&lt;br /&gt;
var text_dis = root.createChild(&amp;quot;text&amp;quot;)&lt;br /&gt;
    .setText(parsed)&lt;br /&gt;
    .setTranslation(5, 5)&lt;br /&gt;
    .setFont(&amp;quot;LiberationFonts\LiberationSans-Regular.ttf&amp;quot;)&lt;br /&gt;
    .setFontSize(15)&lt;br /&gt;
    .setColor(0, 0, 0)&lt;br /&gt;
    .setDrawMode(canvas.Text.TEXT)&lt;br /&gt;
    .setAlignment(&amp;quot;left-top&amp;quot;);&lt;br /&gt;
        ]]&amp;gt;&amp;lt;/load&amp;gt;&lt;br /&gt;
    &amp;lt;/nasal&amp;gt;&lt;br /&gt;
&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example1 = fgcommand(&amp;quot;dialog-show&amp;quot;, {&amp;quot;dialog-name&amp;quot;: &amp;quot;test&amp;quot;});&lt;br /&gt;
|example2text = The example below parses Markdown and outputs it in a HTML document. The parsed text is placed in &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; tags. To change the Markdown to be parsed, simply edit the variable &amp;lt;tt&amp;gt;markdown&amp;lt;/tt&amp;gt; at the top of the code.&lt;br /&gt;
|example2 = &amp;lt;nowiki&amp;gt;var markdown = 'Items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears&lt;br /&gt;
&lt;br /&gt;
Some text.&lt;br /&gt;
Some more items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears';&lt;br /&gt;
&lt;br /&gt;
var parsed = parse_markdown(markdown);&lt;br /&gt;
&lt;br /&gt;
debug.dump(parsed);&lt;br /&gt;
&lt;br /&gt;
var path = string.normpath(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ '/Export/parse_markdown()-test.html');&lt;br /&gt;
&lt;br /&gt;
var file = io.open(path, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var html = &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;\n\n&amp;lt;html&amp;gt;\n\n&amp;lt;head&amp;gt;\n\t&amp;lt;meta charset=\&amp;quot;UTF-8\&amp;quot;&amp;gt;\n\t&amp;lt;title&amp;gt;parse_markdown() test generated by Nasal&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n\n&amp;lt;body&amp;gt;\n\t&amp;lt;pre&amp;gt;&amp;quot; ~ parsed ~ &amp;quot;&amp;lt;/pre&amp;gt;\n&amp;lt;/body&amp;gt;\n\n&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
io.write(file, html);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(&amp;quot;Done, file ready for viewing (&amp;quot; ~ path ~ &amp;quot;)&amp;quot;);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===parsexml()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;parsexml(path[, start[, end[, data[, pro_ins]]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=710|t=Source}}&lt;br /&gt;
|text = This function is an interface into the built-in [http://expat.sourceforge.net/ Expat XML parser]. The absolute path to the file is returned as string, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; is returned on error.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Mandatory absolute path to the XML file to be parsed.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = Optional callback function that will be called for every starting tag. The function should take two argument: the tag name and a hash containing attributes.&lt;br /&gt;
|param3 = end&lt;br /&gt;
|param3text = Optional callback function that will be called for every ending tag. The function should take one argument: the tag name.&lt;br /&gt;
|param4 = data&lt;br /&gt;
|param4text = Optional callback function that will be called for every piece of data within a set of tags. The function should take one argument: the data as a string.&lt;br /&gt;
|param5 = pro_ins&lt;br /&gt;
|param5text = Optional callback function that will be called for every {{wikipedia|Processing Instruction|processing instruction}}. The function should take two argument: the target and the data string.&lt;br /&gt;
|example1text = Save the below XML code in &amp;lt;tt&amp;gt;''[[$FG_HOME]]/Export/demo.xml''&amp;lt;/tt&amp;gt;. Then, execute the Nasal code below in the Nasal Console. The XML will be parsed and each bit of the code will be printed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;style.xsl&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;foo&amp;gt;&lt;br /&gt;
  &amp;lt;blah type=&amp;quot;string&amp;quot;&amp;gt;&amp;lt;![CDATA[ &amp;lt;sender&amp;gt;John Smith&amp;lt;/sender&amp;gt; ]]&amp;gt;&amp;lt;/blah&amp;gt;&lt;br /&gt;
  &amp;lt;blah2 type=&amp;quot;string&amp;quot;&amp;gt;Orange &amp;amp;amp; lemons&amp;lt;/blah2&amp;gt;&lt;br /&gt;
&amp;lt;/foo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example1 = var start = func(name, attr){&lt;br /&gt;
    print(&amp;quot;Starting tag: '&amp;quot;, name, &amp;quot;'&amp;quot;);&lt;br /&gt;
    foreach(var a; keys(attr)){&lt;br /&gt;
        print(&amp;quot;\twith attribute &amp;quot;, a, '=&amp;quot;', attr[a], '&amp;quot;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var end = func(name){&lt;br /&gt;
    print(&amp;quot;Ending tag: '&amp;quot;, name, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var data = func(data){&lt;br /&gt;
    print(&amp;quot;Data = '&amp;quot;, data, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var pro_instr = func(target, data){&lt;br /&gt;
    print(&amp;quot;Processing instruction: target = '&amp;quot;, target, &amp;quot;', data = '&amp;quot;, data, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
parsexml(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ '/Export/demo.xml', start, end, data, pro_instr);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===print()===&lt;br /&gt;
{{Note|As of 07/2020, we are in the process of slowly deprecating and removing Nasal print() (in fgdata) where possible in favor of log [[#logprint()]] which takes a priority level.&lt;br /&gt;
&lt;br /&gt;
This is part of the goal that we achieve zero output at log-level at alert, and everything shown at ‘warn; is really a warning, not just information.&amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/37042224/&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;print(data[, data[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=415|t=Source}}&lt;br /&gt;
|text = Concatenates its arguments and then prints it to the terminal and the [[Commonly used debugging tools#fgfs.log|log]]. Note that a newline is automatically added.&lt;br /&gt;
|param1 = data&lt;br /&gt;
|param1text = Data to print. Only strings and numbers can be printed; other data types will not be. There many be any number of arguments; they will just be concatenated together.&lt;br /&gt;
|example1 = print(&amp;quot;Just&amp;quot;, &amp;quot; a &amp;quot;, &amp;quot;test&amp;quot;); # prints &amp;quot;Just a test&amp;quot;&lt;br /&gt;
|example2 = print(&amp;quot;pi = &amp;quot;, math.pi); # prints &amp;quot;pi = 3.141592...&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== printf() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;printf(format[, arg[, arg, [...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Creates and prints a formatted string. For a description of its arguments, see {{func link|sprintf()}} (it is, in fact, implemented using &amp;lt;code&amp;gt;sprintf()&amp;lt;/code&amp;gt;).&lt;br /&gt;
|example1 = printf(&amp;quot;In hexadecimal, 100000 = %X&amp;quot;, 186A0); # prints &amp;quot;In hexadecimal, 100000 = 186A0&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===printlog()===&lt;br /&gt;
{{caution|This function is deprecated and doesn't work. Please use the new one {{func link|logprint()}}.}}&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;printlog(level, data[, data[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Prints the given message with the given log level. If the log level is higher or equal to &amp;lt;code&amp;gt;/sim/logging/priority&amp;lt;/code&amp;gt;, it is printed.&lt;br /&gt;
|param1 = level&lt;br /&gt;
|param1text = Mandatory log level as a string. Must be one of &amp;quot;none,&amp;quot; &amp;quot;bulk,&amp;quot; &amp;quot;debug,&amp;quot; &amp;quot;info,&amp;quot; &amp;quot;warn,&amp;quot; or &amp;quot;alert.&amp;quot; Note that &amp;quot;none&amp;quot; will mean that the message will never be printed.&lt;br /&gt;
|param2 = data&lt;br /&gt;
|param2text = Data to be printed. Only strings and numbers will be printed; others will not be. There may be any number of arguments; they will just be concatenated together.&lt;br /&gt;
|example1 = printlog(&amp;quot;alert&amp;quot;, &amp;quot;This is an alert&amp;quot;); # message will be printed&lt;br /&gt;
|example2 = printlog(&amp;quot;info&amp;quot;, &amp;quot;Just informing you about something&amp;quot;); # message will be printed only if log level is set to &amp;quot;info&amp;quot; or less&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===rand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = rand();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=554|t=Source}}&lt;br /&gt;
|text = Returns a random floating point number between 0 (inclusive) and 1 (exclusive). It takes no arguments.&lt;br /&gt;
|example1 = print(rand()); # prints random number&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===registerFlightPlanDelegate()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = registerFlightPlanDelegate(init_func);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1879|t=Source}}&lt;br /&gt;
|text = Registers a flight plan delegate. See &amp;lt;tt&amp;gt;''{{fgdata file|Nasal/route_manager.nas|t=$FG_ROOT/Nasal/route_manager.nas}}''&amp;lt;/tt&amp;gt; for examples.&lt;br /&gt;
|param1 = init_func&lt;br /&gt;
|param1text = Initialization function which will be called during FlightGear's startup.&lt;br /&gt;
}}&lt;br /&gt;
===removecommand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removecommand(cmd);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=668|t=Source}}&lt;br /&gt;
|text = Removes the given fgcommand. Returns &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{caution|This will remove '''any''' [[fgcommands|fgcommand]], even those implemented in C++, so use with caution!}}&lt;br /&gt;
|param1 = cmd&lt;br /&gt;
|param1text = String specifying the name of the command to remove.&lt;br /&gt;
|example1 = addcommand(&amp;quot;hello&amp;quot;, func(){&lt;br /&gt;
    print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;hello&amp;quot;); # &amp;quot;Hello&amp;quot; will be printed&lt;br /&gt;
removecommand(&amp;quot;hello&amp;quot;); # removes it&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===removelistener()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removelistener(id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=1384|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=506|t=Part 2}}&lt;br /&gt;
|text = Removes and deactivates the given listener and returns the number of listeners left or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; on error.&lt;br /&gt;
{{note|It is good practice to remove listeners when they are not required anymore. This prevents the listeners reducing FlightGear's run performance.}}&lt;br /&gt;
|param1 = id&lt;br /&gt;
|param1text = ID of listener as returned by {{func link|setlistener()}}.&lt;br /&gt;
|example1 = var ls = setlistener(&amp;quot;/sim/test&amp;quot;, func(){&lt;br /&gt;
    print(&amp;quot;Property '/sim/test' has been changed&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
setprop(&amp;quot;/sim/test&amp;quot;, &amp;quot;blah&amp;quot;); # trigger listener&lt;br /&gt;
var rem = removelistener(ls); # remove listener&lt;br /&gt;
print(&amp;quot;There are &amp;quot;, rem, &amp;quot; listeners remaining&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===resolvepath()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = resolvepath(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=604|t=Source}}&lt;br /&gt;
|text = Takes a relative path as a string and uses [[SimGear]]'s path-resolving framework to return an absolute path as a string. If the path could not be resolved, an empty string is returned. See [[Resolving Paths]] for a detailed description of the algorithm. This function can also be used to check if a file exists.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Relative path to be completed.&lt;br /&gt;
|example1 = print(resolvepath(&amp;quot;Nasal/globals.nas&amp;quot;)); # prints the equivalent of $FG_ROOT/Nasal/globals.nas&lt;br /&gt;
|example2 = print(resolvepath(&amp;quot;blah&amp;quot;)); # prints nothing; could not be resolved&lt;br /&gt;
|example3 = var file_path = resolvepath(&amp;quot;Aircraft/SenecaII/some-file&amp;quot;);&lt;br /&gt;
if (file_path != &amp;quot;&amp;quot;){&lt;br /&gt;
    gui.popupTip(&amp;quot;some-file found&amp;quot;, 2);&lt;br /&gt;
} else {&lt;br /&gt;
    gui.popupTip(&amp;quot;some-file not found&amp;quot;, 2);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===setlistener()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;setlistener(node, code[, init[, type]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|private = _setlistener()&lt;br /&gt;
|source = {{flightgear file|src/Scripting/Nasal|l=499|t=Part 1}} {{!}} {{flightgear file|src/Scripting/Nasal|l=1350|t=Part 2}}&amp;lt;br&amp;gt;''Listener implemented using the {{API Link|flightgear|class|FGNasalListener}} class.''&lt;br /&gt;
|text = Creates a listener which will be triggered when the given property is changed (depending on the '''type'''). A unique integer ID is returned; this can later be used as the argument to {{func link|removelistener()}}.&lt;br /&gt;
{{note|Listeners are known to be a source of resource leaks. To avoid this, please take measures such as:&lt;br /&gt;
* Using {{func link|removelistener()}} when they are not needed any more.&lt;br /&gt;
* Using a single initialization listener.&lt;br /&gt;
* Avoiding tying listeners to properties that are rapidly updated (e.g., many times per frame).&lt;br /&gt;
}}&lt;br /&gt;
|param1 = node&lt;br /&gt;
|param1text = Mandatory string or &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to a property in the [[Property Tree]].&lt;br /&gt;
|param2 = code&lt;br /&gt;
|param2text = Mandatory callback function to execute when the listener is triggered. The function can take up to four arguments in the following order:&lt;br /&gt;
* '''changed''': a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to the changed node.&lt;br /&gt;
* '''listen''': a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to the listened-to node. Note that this argument maybe different depending on the '''type'''.&lt;br /&gt;
* '''mode''': an integer telling how the listener was triggered. 0 means that the value was changed. 1 means that a child property was added. -1 means that a child property was removed.&lt;br /&gt;
* '''is_child''': boolean telling whether '''changed''' is a child property of the listened-to '''node''' or not. 1 (true) if it is, 0 (false) otherwise.&lt;br /&gt;
|param3 = init&lt;br /&gt;
|param3text = If set to 1 (true), the listener will additionally be triggered when it is created. This argument is optional and defaults to 0 (false).&lt;br /&gt;
|param4 = type&lt;br /&gt;
|param4text = Integer specifying the listener's behavior. 0 means that the listener will only trigger when the property is changed. 1 means that the trigger will always be triggered when the property is written to. 2 will mean that the listener will be triggered even if child properties are modified. This argument is optional and defaults to 1.&lt;br /&gt;
|example1 = var prop = props.globals.initNode(&amp;quot;/sim/test&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;STRING&amp;quot;); # create property&lt;br /&gt;
var id = setlistener(&amp;quot;/sim/test&amp;quot;, func(n){ # create listener&lt;br /&gt;
    print(&amp;quot;Value: &amp;quot;, n.getValue());&lt;br /&gt;
});&lt;br /&gt;
setprop(&amp;quot;/sim/test&amp;quot;, &amp;quot;blah&amp;quot;); # trigger listener&lt;br /&gt;
removelistener(id); # remove listener&lt;br /&gt;
prop.remove(); # remove property&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===setprop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;setprop(path[, path[, ...]], value);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=385|t=Source}}&lt;br /&gt;
|text = Sets the value of a property in the [[Property Tree]]. If the property does not exist, it will be created. Returns 1 (true) on success or 0 (false) if there was an error.&lt;br /&gt;
{{note|If you want to remove a property, you will have to use one of the &amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; helpers:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
props.globals.getNode(&amp;quot;foo/bar&amp;quot;).remove(); # take out the complete node&lt;br /&gt;
props.globals.getNode(&amp;quot;foo&amp;quot;).removeChild(&amp;quot;bar&amp;quot;); # take out a certain child node&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = There needs to be at least one '''path''' argument, but there is no limit to the maximum amount that can be given. They will be concatenated together to form a property tree path. The arguments must be strings, but in FlightGear v3.2 onwards, there also is support (added by {{flightgear commit|34ed79}}) for numeric arguments as indices. See example 2 below.&lt;br /&gt;
|param2 = value&lt;br /&gt;
|param2text = Value to write to the given property. Must be either a string or a number.&lt;br /&gt;
|example1 = setprop(&amp;quot;/sim/demo&amp;quot;, &amp;quot;This is a demo&amp;quot;);&lt;br /&gt;
|example2text = Note that the example below will only work in FlightGear 3.2 and above.&lt;br /&gt;
|example2 = for(var i = 0; i &amp;lt; 3; i += 1){&lt;br /&gt;
    setprop(&amp;quot;/sim/demo&amp;quot;, i, &amp;quot;Demo #&amp;quot; ~ i));&lt;br /&gt;
}&lt;br /&gt;
|example3text = Same as above, but is supported by all versions of FlightGear.&lt;br /&gt;
|example3 = for(var i = 0; i &amp;lt; 3; i += 1){&lt;br /&gt;
    setprop(&amp;quot;/sim/demo[&amp;quot; ~ i ~ &amp;quot;]&amp;quot;, &amp;quot;Demo #&amp;quot; ~ i));&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
====See also====&lt;br /&gt;
{{note| If you have to read/write the same property multiple times (e.g. in an update loop), it is more efficient to use a node object: &lt;br /&gt;
To get a Node rather than its value, use &amp;lt;code&amp;gt;props.globals.getNode()&amp;lt;/code&amp;gt; - see [[Nasal_library/props]]. }}&lt;br /&gt;
&lt;br /&gt;
===settimer() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = settimer(function, delta[, realtime]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=499|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=1286|t=Part 2}}&lt;br /&gt;
|text = Runs the given function a specified amount of seconds after the current time. Returns &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{note|Improper use of &amp;lt;code&amp;gt;settimer()&amp;lt;/code&amp;gt; may cause resource leaks. It is also highly recommended that the newer {{func link|maketimer()}} should be used instead of this function.}} &lt;br /&gt;
|param1 = function&lt;br /&gt;
|param1text = Mandatory function that will be called. It may be necessary to enclose code in an anonymous function (see example).&lt;br /&gt;
|param2 = delta&lt;br /&gt;
|param2text = Mandatory amount of time in seconds after which the function will be called.&lt;br /&gt;
|param3 = realtime&lt;br /&gt;
|param3text = If 1 (true), &amp;quot;real time&amp;quot; will be used instead of &amp;quot;simulation time.&amp;quot; Defaults to 0 (false). Note that if &amp;quot;simulation time&amp;quot; is used, the timer will not run while FlightGear is paused.&lt;br /&gt;
|example1 = var myFunc = func(){&lt;br /&gt;
    print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
settimer(myFunc, 2); # runs myFunc after 2 seconds&lt;br /&gt;
|example2 = var sqr = func(a){&lt;br /&gt;
    return a * a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
settimer(func(){&lt;br /&gt;
    print(sqr(2)); # will print 4 after 2 seconds&lt;br /&gt;
}, 2);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===srand() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = srand();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=559|t=Source}}&lt;br /&gt;
|text = Makes the pseudorandom number generator (see {{func link|rand()}}) generate a new {{wikipedia|random seed|noicon=1}} based on time. Returns 0.&lt;br /&gt;
}}&lt;br /&gt;
===systime()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = systime();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=770|t=Source}}&lt;br /&gt;
|text = Returns the {{wikipedia|Unix time}} (seconds since since 00:00:00 UTC, 1/1/1970) as a floating point number with high resolution. This function is useful for benchmarking purposes (see example 2).&lt;br /&gt;
{{note|1=High resolution timers under Windows can produce inaccurate or fixed sub-millisecond results.&amp;lt;ref&amp;gt;{{cite web|url=http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=29259|title=Nasal: systime() ??!?|author=Necolatis|date=Apr 2nd, 2016}}&amp;lt;/ref&amp;gt; This is due to the underlying {{func link|GetSystemTimeAsFileTime()|link=https://msdn.microsoft.com/en-us/library/windows/desktop/ms724397(v=vs.85).aspx}} API call, which depends on hardware availability of suitable high resolution timers. See also [https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx Acquiring high-resolution time stamps]}}&lt;br /&gt;
|example1 = print(&amp;quot;Unix time: &amp;quot;, systime()); # prints Unix time&lt;br /&gt;
|example2 = var myFunc = func(){&lt;br /&gt;
    for(var i = 0; i &amp;lt;= 10; i += 1){&lt;br /&gt;
        print(&amp;quot;Interation #&amp;quot;, i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
var t = systime(); # record time&lt;br /&gt;
myFunc(); # run function&lt;br /&gt;
var t2 = systime(); # record new time&lt;br /&gt;
print(&amp;quot;myFunc() took &amp;quot;, t2 - t, &amp;quot; seconds&amp;quot;); # print result&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===thisfunc()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thisfunc();&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns the function from which this function is called. This allows a function to reliably and safely call itself from within a closure.&lt;br /&gt;
|example1 = var stringify_vec = func(input){&lt;br /&gt;
    if (typeof(input) == &amp;quot;scalar&amp;quot;){&lt;br /&gt;
        return sprintf(&amp;quot;%s&amp;quot;, input);&lt;br /&gt;
    } elsif (typeof(input) == &amp;quot;vector&amp;quot;) {&lt;br /&gt;
        if (size(input) == 0) return &amp;quot;[]&amp;quot;;&lt;br /&gt;
        var this = thisfunc();&lt;br /&gt;
        var buffer = &amp;quot;[&amp;quot;;&lt;br /&gt;
        for(var i = 0; i &amp;lt; size(input); i += 1){&lt;br /&gt;
            buffer ~= this(input[i]);&lt;br /&gt;
            if (i == size(input) - 1) {&lt;br /&gt;
                buffer ~= &amp;quot;]&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                buffer ~= &amp;quot;, &amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return buffer;&lt;br /&gt;
    } else {&lt;br /&gt;
        die(&amp;quot;stringify_vec(): Error! Invalid input. Must be a vector or scalar&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var test_vec = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, [1, 2, 3], &amp;quot;d&amp;quot;];&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # prints &amp;quot;[a, b, c, [1, 2, 3], d]&amp;quot;&lt;br /&gt;
test_vec = [];&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # prints &amp;quot;[]&amp;quot;&lt;br /&gt;
test_vec = {};&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # will throw an error&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===tileIndex() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = tileIndex();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1720|t=Source}}&lt;br /&gt;
|text = Returns the index of the tile at the aircraft's current position as a string. This corresponds to the name of the STG file of the tile. For example, at [[KSFO]], this would be &amp;lt;code&amp;gt;942050&amp;lt;/code&amp;gt;, corresponding to &amp;lt;tt&amp;gt;''[[$FG_SCENERY]]/Terrain/w130n30/w123n3/942050.stg''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example1 = print(tileIndex()); # print index&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== tilePath()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = tilePath();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1712|t=Source}}&lt;br /&gt;
|text = Returns the base path of the tile at the aircraft's current position as a string. For example, at KSFO, this would be &amp;lt;code&amp;gt;w130n30/w123n3&amp;lt;/code&amp;gt;, corresponding to &amp;lt;tt&amp;gt;''[[$FG_SCENERY]]/Terrain/w130n30/w123n3''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example1 = print(tilePath()); # print path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== values()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = values(hash);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the values of the given hash.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = Mandatory hash to get the values of.&lt;br /&gt;
|example1 = var hash = {&lt;br /&gt;
    &amp;quot;a&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;b&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;c&amp;quot;: 3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
foreach(var val; values(hash)){&lt;br /&gt;
    print(val);&lt;br /&gt;
}&lt;br /&gt;
|example2text = The below example does exactly the same thing as the above example, but does not use &amp;lt;code&amp;gt;values()&amp;lt;/code&amp;gt;:&lt;br /&gt;
|example2 = var hash = {&lt;br /&gt;
    &amp;quot;a&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;b&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;c&amp;quot;: 3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
foreach(var key; keys(hash)){&lt;br /&gt;
    print(hash[key]);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extension functions new in FG 2020.1 ==&lt;br /&gt;
The following functions have been added to the nasal core library and will be released with FlightGear version 2020.1. &lt;br /&gt;
Before the release they are available in the development branch &amp;quot;next&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===isfunc()===&lt;br /&gt;
Returns 1 if type or argument is a function, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===isghost()===&lt;br /&gt;
Returns 1 if type or argument is a ghost, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
=== ishash()===&lt;br /&gt;
Returns 1 if type or argument is a hash, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===isint()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isint(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if argument has a numeric value and x == floor(x), e.g. integer.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isnum()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isnum(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if typeof(x) is &amp;quot;scalar&amp;quot; and x has a numeric value otherwise 0. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isscalar()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isscalar(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if type or argument is a scalar (string or numeric), otherwise (vector, hash, func, ...) it returns 0. This is useful to check if a variable can be converted to string e.g. when useing the string concat operator &amp;quot;~&amp;quot;. &lt;br /&gt;
|example1 = var a = &amp;quot;foo&amp;quot;; &lt;br /&gt;
var b=42;&lt;br /&gt;
if (isscalar(a) and isscalar(b)) print(a~b);&lt;br /&gt;
if (isstr(a)) print(&amp;quot;a is a string&amp;quot;);&lt;br /&gt;
if (isint(b)) print(&amp;quot;b is an integer&amp;quot;);&lt;br /&gt;
# if (isscalar(a))... is equivalent to if (typeof(a) == &amp;quot;scalar&amp;quot;)...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isstr()===&lt;br /&gt;
Returns 1 if type or argument is a string, otherwise 0. &lt;br /&gt;
&lt;br /&gt;
===isvec()===&lt;br /&gt;
Returns 1 if type or argument is a vector, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===vecindex()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = vecindex(vector, value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns the index of value or nil, if value is not found in vector.&lt;br /&gt;
|example1=&lt;br /&gt;
var myvector = [&amp;quot;apple&amp;quot;, &amp;quot;bananna&amp;quot;, &amp;quot;coconut&amp;quot;];&lt;br /&gt;
# to check if a vector contains a certain value compare vecindex to nil&lt;br /&gt;
if (vecindex(myvector, &amp;quot;apple&amp;quot;) != nil) {&lt;br /&gt;
    print(&amp;quot;found apple&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
# WARNING: this will not work as desired because index is 0&lt;br /&gt;
if (vecindex(myvector, &amp;quot;apple&amp;quot;)) {&lt;br /&gt;
    print(&amp;quot;found apple&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extension functions new in &amp;quot;dev&amp;quot; version ==&lt;br /&gt;
The following functions have been added to the nasal core library curernty on &amp;quot;dev&amp;quot; version.&lt;br /&gt;
&lt;br /&gt;
===member()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = member(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=796|t=Source}}&lt;br /&gt;
|text = The function searches for a key in the given hash, including the &amp;lt;code&amp;gt;parents&amp;lt;/code&amp;gt;. If the key is found, its value is returned; otherwise, it returns &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash in which the key is searched.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = Key as a string whose value we want to return.&lt;br /&gt;
|example1 = &lt;br /&gt;
var Hash = {&lt;br /&gt;
    key: 12,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Hash, 'key');     # return 12&lt;br /&gt;
member(Hash, 'missing'); # return nil&lt;br /&gt;
|example2 = # member() also includes parents&lt;br /&gt;
&lt;br /&gt;
var Base = {&lt;br /&gt;
    key: 'text',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Child = {&lt;br /&gt;
    parents: [Base],&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Child, 'key');     # return 'text'&lt;br /&gt;
member(Child, 'missing'); # return nil&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===has_member()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = has_member(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=811|t=Source}}&lt;br /&gt;
|text = The function searches for a key in the given hash, including the &amp;lt;code&amp;gt;parents&amp;lt;/code&amp;gt;. If the key is found, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is returned, otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash in which the key is searched.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = Key as a string.&lt;br /&gt;
|example1 = &lt;br /&gt;
var Hash = {&lt;br /&gt;
    key: 12,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
has_member(Hash, 'key');     # return true&lt;br /&gt;
has_member(Hash, 'missing'); # return false&lt;br /&gt;
|example2 = # has_member() also includes parents&lt;br /&gt;
&lt;br /&gt;
var Base = {&lt;br /&gt;
    key: 'text',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Child = {&lt;br /&gt;
    parents: [Base],&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
has_member(Child, 'key');     # return true&lt;br /&gt;
has_member(Child, 'missing'); # return false&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
Various global constants (technically variables) are provided for use in converting between different units. They are all found in {{fgdata file|Nasal/globals.nas|text=$FG_ROOT/Nasal/globals.nas}}.&lt;br /&gt;
&lt;br /&gt;
===D2R===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var radians = degrees * D2R;&lt;br /&gt;
|text = Converts an angle from degrees to radians when multiplied by the angle in degrees. Equal to &amp;lt;code&amp;gt;π / 180&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
===FPS2KT===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var knots = feet_per_second * FPS2KT;&lt;br /&gt;
|text = Converts a velocity from feet per second to knots when multiplied by the velocity in feet per second. Approximately equal to 0.5925.&lt;br /&gt;
}}&lt;br /&gt;
===FT2M===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = feet * FT2M;&lt;br /&gt;
|text = Converts a length from feet to metres when multiplied by the length in feet. Equal to 0.3048.&lt;br /&gt;
}}&lt;br /&gt;
===GAL2L ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var litres = gallons * GAL2L;&lt;br /&gt;
|text = Converts a volume from US liquid gallons to litres when multiplied by the volume in gallons. Approximately equal to 3.7854.&lt;br /&gt;
}}&lt;br /&gt;
===IN2M===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = inches * IN2M;&lt;br /&gt;
|text = Converts a length from inches to metres when multiplied by the length in inches. Equal to 0.0254.&lt;br /&gt;
}}&lt;br /&gt;
===KG2LB===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var pounds = kilograms * KG2LB;&lt;br /&gt;
|text = Converts a mass from kilograms to pounds when multiplied by the mass in kilograms. Approximately equal to 2.2046.&lt;br /&gt;
}}&lt;br /&gt;
===KT2FPS===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var feet_per_second = knots * KT2FPS;&lt;br /&gt;
|text = Converts a velocity from knots to feet per second when multiplied by the velocity in knots. Approximately equal to 1.6878.&lt;br /&gt;
}}&lt;br /&gt;
===KT2MPS===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres_per_second = knots * KT2MPS;&lt;br /&gt;
|text = Converts a velocity from knots to metres per second when multiplied by the velocity in knots. Approximately equal to 0.5144.&lt;br /&gt;
}}&lt;br /&gt;
===L2GAL===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var gallons = litres * L2GAL;&lt;br /&gt;
|text = Converts a volume from litres to US liquid gallons when multiplied by the volume in litres. Approximately equal to 0.2642.&lt;br /&gt;
}}&lt;br /&gt;
===LB2KG===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var kilograms = pounds * LB2KG;&lt;br /&gt;
|text = Converts a mass from pounds to kilograms when multiplied by the mass in pounds. Approximately equal to 0.4536.&lt;br /&gt;
}}&lt;br /&gt;
===M2FT ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var feet = metres * M2FT;&lt;br /&gt;
|text = Converts a length from metres to feet when multiplied by the length in metres. Approximately equal to 3.2808.&lt;br /&gt;
}}&lt;br /&gt;
===M2IN===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var inches = metres * M2IN;&lt;br /&gt;
|text = Converts a length from metres to inches when multiplied by the length in metres. Approximately equal to 39.3701.&lt;br /&gt;
}}&lt;br /&gt;
===M2NM ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var nautical_miles = metres * M2NM;&lt;br /&gt;
|text = Converts a length from metres to nautical miles when multiplied by the length in metres. Approximately equal to 0.00054.&lt;br /&gt;
}}&lt;br /&gt;
===MPS2KT ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var knots = metres_per_second * MPS2KT;&lt;br /&gt;
|text = Converts a velocity from metres per second to knots when multiplied by the velocity in metres per second. Approximately equal to 1.9438.&lt;br /&gt;
}}&lt;br /&gt;
===NM2M ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = nautical_miles * NM2M;&lt;br /&gt;
|text = Converts a length from nautical miles to metres when multiplied by the length in nautical miles. Equal to 1,852.&lt;br /&gt;
}}&lt;br /&gt;
===R2D===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var degrees = radians * R2D;&lt;br /&gt;
|text = Converts an angle from radians to degrees when multiplied by the angle in radians. Equal to &amp;lt;code&amp;gt;180 / π&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library&amp;diff=143527</id>
		<title>Nasal library</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library&amp;diff=143527"/>
		<updated>2026-01-16T19:37:21Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* has_member() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page documents the global '''library functions and variables''' of FlightGear's built-in scripting language, [[Nasal]]. This includes ''[[#Core library functions|core library functions]]'', which were included in Nasal before its integration into FlightGear, the ''[[#Extension functions|extension functions]]'', which have been subsequently added, and are specifically designed for FlightGear, and the ''[[#variables|global variables]]'', which are conversion variables, added with extension functions, for converting between units. The relevant folders in [[Git]] are:&lt;br /&gt;
* {{flightgear file|src/Scripting}}&lt;br /&gt;
* {{simgear file|simgear/nasal}}&lt;br /&gt;
&lt;br /&gt;
All these functions and variables are in the global namespace, that is, they are directly accessible (e.g., one can call &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot; inline&amp;gt;magvar()&amp;lt;/syntaxhighlight&amp;gt; instead of &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot; inline&amp;gt;namespace.magvar()&amp;lt;/syntaxhighlight&amp;gt;). However, if a namespace must be used, &amp;lt;code&amp;gt;globals&amp;lt;/code&amp;gt; is the correct namespace, but using it is not recommended. For a more complete explanation, see [[Nasal Namespaces in-depth]].&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Core library functions ==&lt;br /&gt;
This is the list of the basic '''core library functions.''' Most of these functions were part of the original Nasal library (before its integration in to FlightGear), while some have been added or changed over time.  See also:&lt;br /&gt;
* http://plausible.org/nasal/lib.html ([http://web.archive.org/web/20101010094553/http://plausible.org/nasal/lib.html archive])&lt;br /&gt;
* {{simgear file|simgear/nasal/lib.c}} ([http://sourceforge.net/p/flightgear/simgear/ci/next/log/?path=/simgear/nasal/lib.c history])&lt;br /&gt;
&lt;br /&gt;
=== append() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = append(vector, element[, element[, ...]]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=45|t=Source}}&lt;br /&gt;
|text = This function appends, or adds, the given element(s) to the end of the vector given in the first argument.  Returns the vector operated on.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to which the arguments will be appended.&lt;br /&gt;
|param2 = element&lt;br /&gt;
|param2text = An element to be added to the vector.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector&lt;br /&gt;
append(vector, 4); # Append the number 4 to the end of the vector&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector&lt;br /&gt;
append(vector, 4, 5, 6); # Append the numbers 4, 5, and 6 to the end of the vector&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== bind() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = bind(function, locals[, outer_scope]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=638|t=Source}}&lt;br /&gt;
|text = This creates a new function object. A function in Nasal is three things: the actual code, a hash/namespace of local variables available to the function namespace, and the closure object of that namespace. These correspond to the three arguments respectively.&lt;br /&gt;
|param1 = function&lt;br /&gt;
|param1text = Function to evaluate.&lt;br /&gt;
|param2 = locals&lt;br /&gt;
|param2text = Hash containing values that will become the namespace (first closure) for the function.&lt;br /&gt;
|param3 = outer_scope&lt;br /&gt;
|param3text = Optional function which is bound to the next closure. This can be bound to yet another, making a linked list.&lt;br /&gt;
|example1 = # This is a namespace/hash with a single member, named &amp;quot;key,&amp;quot; which is initialized to 12 &lt;br /&gt;
var Namespace = {&lt;br /&gt;
    key: 12&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# This is different namespace/hash containing a function&lt;br /&gt;
# dividing a variable &amp;quot;key&amp;quot; (which is unavailable/nil in this namespace) by 2&lt;br /&gt;
var AnotherNamespace = {&lt;br /&gt;
    ret: func {&lt;br /&gt;
        key /= 2;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# To see that key is not available, try to call AnotherNamespace.ret() first&lt;br /&gt;
call(AnotherNamespace.ret, [], nil, nil, var errors = []);&lt;br /&gt;
if(size(errors)){&lt;br /&gt;
    print(&amp;quot;Key could not be divided/resolved!&amp;quot;);&lt;br /&gt;
    debug.printerror(errors);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Associate the AnotherNamespace.ret() function with the first namespace&lt;br /&gt;
# so that &amp;quot;key&amp;quot; is now available&lt;br /&gt;
var function = bind(AnotherNamespace.ret, Namespace);&lt;br /&gt;
&lt;br /&gt;
# Invoke the new function&lt;br /&gt;
function();&lt;br /&gt;
&lt;br /&gt;
# Print out the value of Namespace.key&lt;br /&gt;
# It was changed to 12 from 6 by AnotherNamespace.ret()&lt;br /&gt;
print(Namespace.key);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== call() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = call(func[, args[, me[, locals[, error]]]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=376|t=Source}}&lt;br /&gt;
|text = Calls the given function with the given arguments and returns the result.  This function is very useful as it allows much more control over function calls and catches any errors or {{func link|die()}} calls that would normally trigger run-time errors cancelling execution of the script otherwise. &lt;br /&gt;
|param1 = func&lt;br /&gt;
|param1text = Function to execute.&lt;br /&gt;
|param2 = args&lt;br /&gt;
|param2text = Vector containing arguments to give to the called function.&lt;br /&gt;
|param3 = me&lt;br /&gt;
|param3text = &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; reference for the function call (i.e., for method calls). If given, this will override any &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; value existing in the namespace (locals argument).&lt;br /&gt;
|param4 = locals&lt;br /&gt;
|param4text = A hash with key/value pairs that will be available to the called function, typically used as the namespace for the function to be called.&lt;br /&gt;
|param5 = error&lt;br /&gt;
|param5text = A vector to append errors to.  If the called function generates an error, the error, place, and line will be written to this.  These errors can be printed using {{func link|printerror()|debug}}.&lt;br /&gt;
|example1 =&lt;br /&gt;
# prints &amp;quot;Called from call()&amp;quot;&lt;br /&gt;
call(func {&lt;br /&gt;
    print(&amp;quot;Called from call()&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
|example2 =&lt;br /&gt;
# prints &amp;quot;a = 1 : b = 2&lt;br /&gt;
call(func(a, b){&lt;br /&gt;
        print(&amp;quot;a = &amp;quot;, a, &amp;quot; : b = &amp;quot;, b);&lt;br /&gt;
    },&lt;br /&gt;
    [1, 2]&lt;br /&gt;
);&lt;br /&gt;
|example3 =&lt;br /&gt;
var Hash = {&lt;br /&gt;
    new: func {&lt;br /&gt;
        var m = { parents: [Hash] };&lt;br /&gt;
&lt;br /&gt;
        m.el1 = &amp;quot;string1&amp;quot;;&lt;br /&gt;
        m.el2 = &amp;quot;string2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        return m;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# prints &amp;quot;me.el1 = string1&amp;quot;, then &amp;quot;me.el2 = string2&amp;quot; on the next line&lt;br /&gt;
call(func(a, b){        &lt;br /&gt;
        print(&amp;quot;me.el&amp;quot;, a, &amp;quot; = &amp;quot;, me[&amp;quot;el&amp;quot; ~ a]);      &lt;br /&gt;
        print(&amp;quot;me.el&amp;quot;, b, &amp;quot; = &amp;quot;, me[&amp;quot;el&amp;quot; ~ b]);&lt;br /&gt;
    },&lt;br /&gt;
    [1, 2],&lt;br /&gt;
    Hash.new()&lt;br /&gt;
);&lt;br /&gt;
|example4 =&lt;br /&gt;
# prints the value of math.pi&lt;br /&gt;
call(func {&lt;br /&gt;
        print(pi);&lt;br /&gt;
    }, nil, nil, &lt;br /&gt;
    math&lt;br /&gt;
);&lt;br /&gt;
|example5 =&lt;br /&gt;
call(func {&lt;br /&gt;
        print(math.ip); # math.ip doesn't exist&lt;br /&gt;
    }, nil, nil, nil,&lt;br /&gt;
    var errs = []&lt;br /&gt;
);&lt;br /&gt;
debug.printerror(errs); # The error is caught and printed using debug.printerror()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== caller() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = caller([level]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=540|t=Source}}&lt;br /&gt;
|text = Returns a vector containing a record from the current call stack.  The level numbering starts from the currently executing function (level 0).  Level 1 (the default) is the caller of the current function, and so on.&lt;br /&gt;
&lt;br /&gt;
The result is a four-element vector containing '''[0]''' a hash of local variables, '''[1]''' the function object, '''[2]''' the full source file name (incl. path) and '''[3]''' the line number. &lt;br /&gt;
|param1 = level&lt;br /&gt;
|param1text = Optional integer specifying the stack level to return a result from.  Defaults to 1 (i.e. the caller of the currently executing function).&lt;br /&gt;
|example1 =&lt;br /&gt;
var myFunction = func(a, b) {&lt;br /&gt;
    debug.dump(caller(0)[0]); # prints a hash of local variables, including arguments a and b&lt;br /&gt;
    return 2 * 2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;2 x 2 = &amp;quot;, myFunction(2, 2));&lt;br /&gt;
|example2 =&lt;br /&gt;
var get_arg_value = func() {&lt;br /&gt;
    print(&amp;quot;Argument to myFunc = &amp;quot;, caller(1)[0]['a']); # print the value of myFunc's single argument, using caller()&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var myFunc = func(a) {&lt;br /&gt;
    get_arg_value();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
myFunc(3);&lt;br /&gt;
|example3text = This is a real example taken from {{fgdata file|Nasal/canvas/MapStructure.nas}}.  Function &amp;lt;code&amp;gt;r()&amp;lt;/code&amp;gt; (above the TODOs) returns a hash with the key/value pairs as per its arguments. For example, something like this is returned: &amp;lt;code&amp;gt;{ name: &amp;quot;&amp;lt;name&amp;gt;&amp;quot;, vis: true, zindex: nil }&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example3 =&lt;br /&gt;
var MapStructure_selfTest = func() {&lt;br /&gt;
    var temp = {};&lt;br /&gt;
    temp.dlg = canvas.Window.new([600, 400], &amp;quot;dialog&amp;quot;);&lt;br /&gt;
    temp.canvas = temp.dlg.createCanvas().setColorBackground(1, 1, 1, 0.5);&lt;br /&gt;
    temp.root = temp.canvas.createGroup();&lt;br /&gt;
&lt;br /&gt;
    var testMap = temp.root.createChild(&amp;quot;map&amp;quot;);&lt;br /&gt;
    testMap.setController(&amp;quot;Aircraft position&amp;quot;);&lt;br /&gt;
    testMap.setRange(25); # TODO: implement zooming/panning via mouse/wheel here, for lack of buttons :-/&lt;br /&gt;
    testMap.setTranslation(&lt;br /&gt;
        temp.canvas.get(&amp;quot;view[0]&amp;quot;) / 2,&lt;br /&gt;
        temp.canvas.get(&amp;quot;view[1]&amp;quot;) / 2,&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    var r = func(name, vis = true, zindex = nil) {&lt;br /&gt;
        return caller(0)[0];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # TODO: we'll need some z-indexing here, right now it's just random&lt;br /&gt;
    # TODO: use foreach/keys to show all layers in this case by traversing SymbolLayer.registry directly ?&lt;br /&gt;
    # maybe encode implicit z-indexing for each lcontroller ctor call ? - i.e. preferred above/below order ?&lt;br /&gt;
    var types = [&lt;br /&gt;
        r('TFC', false),&lt;br /&gt;
        r('APT'),&lt;br /&gt;
        r('DME'),&lt;br /&gt;
        r('VOR'),&lt;br /&gt;
        r('NDB'),&lt;br /&gt;
        r('FIX', false),&lt;br /&gt;
        r('RTE'),&lt;br /&gt;
        r('WPT'),&lt;br /&gt;
        r('FLT'),&lt;br /&gt;
        r('WXR'),&lt;br /&gt;
        r('APS'),&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    foreach (var type; types) {&lt;br /&gt;
        testMap.addLayer(&lt;br /&gt;
            factory: canvas.SymbolLayer,&lt;br /&gt;
            type_arg: type.name,&lt;br /&gt;
            visible: type.vis,&lt;br /&gt;
            priority: type.zindex,&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}; # MapStructure_selfTest&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== chr() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = chr(code);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=240|t=Source}}&lt;br /&gt;
|text = Returns a character as per the single argument. Extended ASCII is supported (see http://www.asciitable.com/ for a list of supported characters), although this may vary between different systems.  For a list of the most commonly used characters, see the {{wikipedia|ASCII#ASCII printable code chart|ASCII printable code chart}} ('''Dec''' column). The following table lists supported control characters, along with their equivalent control characters in Nasal strings.  {{Note|In Nasal, only strings enclosed with double-quotes (&amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;) supports control chracters.  Strings in single quotes (&amp;lt;code&amp;gt;'string'&amp;lt;/code&amp;gt;) do not.}}&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Name !! Equivalent to&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 10 {{!!}} {{Wikipedia|Newline}} {{!!}} &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 9 {{!!}} {{Wikipedia|Tab key#Tab characters|Horizontal tab}} {{!!}} &amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 13 {{!!}} {{Wikipedia|Carriage return}} {{!!}} &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param1 = code&lt;br /&gt;
|param1text = Integer character code for the desired glyph.&lt;br /&gt;
|example1 = print(&amp;quot;Code 65 = &amp;quot;, chr(65)); # prints &amp;quot;Code 65 = A&amp;quot;&lt;br /&gt;
|example2text = This example displays all of the characters in a list, in the format &amp;lt;code&amp;gt;Code '''n''' = &amp;gt;'''char'''&amp;lt;&amp;lt;/code&amp;gt;, '''n''' being the index, and '''char''' being the character.&lt;br /&gt;
|example2 =&lt;br /&gt;
for(var i = 0; i &amp;lt;= 255; i += 1){&lt;br /&gt;
    print(&amp;quot;Code &amp;quot;, i, &amp;quot; = &amp;gt;&amp;quot;, chr(i), &amp;quot;&amp;lt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== closure() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = closure(func[, level]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=557|t=Source}}&lt;br /&gt;
|text = Returns the hash table containing the lexical namespace of the given function. The level numbering start with level 0 being the namespace of '''func'''. &lt;br /&gt;
|param1 = func&lt;br /&gt;
|param1text = Function to evaluate.&lt;br /&gt;
|param2 = level&lt;br /&gt;
|param2text = Optional integer specifying the scope level.  Defaults to 0 (the namespace of '''func''').&lt;br /&gt;
|example1 =&lt;br /&gt;
var get_math_e = func {&lt;br /&gt;
    return e; # return the value of math.e&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var myFunction = bind(get_math_e, math); # bind get_math_e to the math namespace, so that math.e is immediately available to get_math_e&lt;br /&gt;
debug.dump(closure(myFunction)); # print the hash of the namespace &amp;quot;get_math_e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
print(myFunction());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== cmp() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = cmp(a, b);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=169|t=Source}}&lt;br /&gt;
|text = Compares two strings, returning -1 if '''a''' is less than '''b''', 0 if they are identical and 1 if '''a''' is greater than '''b'''. &lt;br /&gt;
|param1 = a&lt;br /&gt;
|param1text = First string argument for comparison.&lt;br /&gt;
|param2 = b&lt;br /&gt;
|param2text = Second string argument for comparison.&lt;br /&gt;
|example1 = print(cmp(&amp;quot;1&amp;quot;, &amp;quot;two&amp;quot;)); # prints -1&lt;br /&gt;
|example2 = print(cmp(&amp;quot;string&amp;quot;, &amp;quot;string&amp;quot;)); # prints 0&lt;br /&gt;
|example3 = print(cmp(&amp;quot;one&amp;quot;, &amp;quot;2&amp;quot;)); # prints 1&lt;br /&gt;
|example4 = print(cmp(&amp;quot;string1&amp;quot;, &amp;quot;string2&amp;quot;)); # prints -1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== compile() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = compile(code[, filename]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=349|t=Source}}&lt;br /&gt;
|text = Compiles the specified code string and returns a function object bound to the current lexical context.  If there is an error, the function dies, with the argument to {{func link|die()}} being '''filename'''.&lt;br /&gt;
|param1 = code&lt;br /&gt;
|param1text = String containing Nasal code to be compiled.&lt;br /&gt;
|param2 = filename&lt;br /&gt;
|param2text = Optional string used for error messages/logging. Defaults to &amp;lt;code&amp;gt;&amp;lt;compile&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|example1 = &lt;br /&gt;
var myCode = 'print(&amp;quot;hello&amp;quot;);';&lt;br /&gt;
var helloFunc = compile(myCode, &amp;quot;myCode&amp;quot;);&lt;br /&gt;
helloFunc();&lt;br /&gt;
|example2text = &amp;lt;code&amp;gt;compile&amp;lt;/code&amp;gt; is very convenient to support Nasal loaded from other files.  For instance, [[PropertyList XML files]] (such as GUI dialogs) may contain embedded Nasal sections that need to be parsed, processed and compiled.  For an example of how to do this, save the below XML code as &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/gui/dialogs/test.xml''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
print(&amp;quot;You have FlightGear v&amp;quot;, getprop(&amp;quot;/sim/version/flightgear&amp;quot;));&lt;br /&gt;
]]&amp;gt;&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, start FlightGear and execute this code in the [[Nasal Console]].&lt;br /&gt;
|example2 =&lt;br /&gt;
# Build the path&lt;br /&gt;
var FGRoot = getprop(&amp;quot;/sim/fg-root&amp;quot;);&lt;br /&gt;
var filename = &amp;quot;/gui/dialogs/test.xml&amp;quot;;&lt;br /&gt;
var path = FGRoot ~ filename;&lt;br /&gt;
&lt;br /&gt;
var blob = io.read_properties(path);&lt;br /&gt;
var script = blob.getValues().nasal; # Get the nasal string&lt;br /&gt;
&lt;br /&gt;
# Compile the script.  We're passing the filename here for better runtime diagnostics &lt;br /&gt;
var code = call(func {&lt;br /&gt;
    compile(script, filename);&lt;br /&gt;
}, nil, nil, var compilation_errors = []);&lt;br /&gt;
&lt;br /&gt;
if(size(compilation_errors)){&lt;br /&gt;
    die(&amp;quot;Error compiling code in: &amp;quot; ~ filename);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Invoke the compiled script, equivalent to code(); &lt;br /&gt;
# We're using call() here to detect errors:&lt;br /&gt;
call(code, [], nil, nil, var runtime_errors = []);&lt;br /&gt;
&lt;br /&gt;
if(size(runtime_errors)){&lt;br /&gt;
    die(&amp;quot;Error calling code compiled loaded from: &amp;quot; ~ filename);&lt;br /&gt;
}&lt;br /&gt;
|example3text = The &amp;lt;code&amp;gt;compile()&amp;lt;/code&amp;gt; function also allows you to parse a JSON string into a hash. Simplest example:&lt;br /&gt;
|example3 =&lt;br /&gt;
var jsonFunc = compile('{&amp;quot;version&amp;quot;:&amp;quot;1.2.0&amp;quot;,&amp;quot;author&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;John&amp;quot;} }');&lt;br /&gt;
var json = jsonFunc(); # return hash&lt;br /&gt;
logprint(LOG_ALERT, json[&amp;quot;version&amp;quot;]); # print &amp;quot;1.2.0&amp;quot;&lt;br /&gt;
logprint(LOG_ALERT, json[&amp;quot;author&amp;quot;][&amp;quot;name&amp;quot;]); # print &amp;quot;John&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== contains() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = contains(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=249|t=Source}}&lt;br /&gt;
|text = Returns 1 (True) if the hash contains the specified key, or 0 (False) if not.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash to search in.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = The scalar to be searched for, contained as a key in the hash.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize a hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element: &amp;quot;value&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
print(contains(hash, &amp;quot;element&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;Yes&amp;quot;&lt;br /&gt;
print(contains(hash, &amp;quot;element2&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;No&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===contains()===&lt;br /&gt;
{{Requires commit|desc=Vector support|details=see {{Merge-request|project=fgdata|id=305}}|commit=ee39abbd3b70c9b6d5e3a1c4ccedddaac1a92b11|repo=Simgear}}&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = contains(vector, item);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=249|t=Source}}&lt;br /&gt;
|text = Returns 1 (True) if the vector contains the specified item, or 0 (False) if not.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to search in.&lt;br /&gt;
|param2 = item&lt;br /&gt;
|param2text = The object to be searched for in the vector.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize a vector&lt;br /&gt;
var vec = [&amp;quot;element&amp;quot;, &amp;quot;foo&amp;quot;];&lt;br /&gt;
print(contains(vec, &amp;quot;element&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;Yes&amp;quot;&lt;br /&gt;
print(contains(vec, &amp;quot;element2&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;No&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===delete() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = delete(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=118|t=Source}}&lt;br /&gt;
|text = Deletes the key from the hash if it exists. Operationally, this is NOT identical to setting the hash value specified by the key to &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; as the key will stay in the hash (at least for a while). This variant potentially frees storage by deleting the reference to the key and by shrinking the hash.  Returns the hash that has been operated on.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash from which to delete the key.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = The scalar to be deleted, contained as a key in the hash.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize the hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value1&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value2&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
delete(hash, &amp;quot;element1&amp;quot;); # Delete element1&lt;br /&gt;
debug.dump(hash); # prints the hash, which is now minus element1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===die()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = die(error);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=417|t=Source}}&lt;br /&gt;
|text = Terminates execution and unwinds the stack.  The place and the line will be added to the '''error'''.  This invokes the same internal exception handler used for internal runtime errors. Use this to signal fatal errors, or to implement exception handling. The error thrown (including internal runtime errors) can be caught with {{func link|call()}}.&lt;br /&gt;
|param1 = error&lt;br /&gt;
|param1text = String describing the error.&lt;br /&gt;
:{{inote|This parameter is technically optional, but it is highly recommended to use it.}}&lt;br /&gt;
|example1 = &lt;br /&gt;
print(&amp;quot;Will print&amp;quot;);&lt;br /&gt;
die(&amp;quot;Don't go any further!&amp;quot;); &lt;br /&gt;
print(&amp;quot;Won't print&amp;quot;); # Will not be printed because die() stops the process&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== find()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = find(needle, haystack);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=586|t=Source}}&lt;br /&gt;
|text = Finds and returns the index of the first occurrence of the string '''needle''' in the string '''haystack''', or -1 if no such occurrence was found.&lt;br /&gt;
|param1 = needle&lt;br /&gt;
|param1text = String to search for.&lt;br /&gt;
|param2 = haystack&lt;br /&gt;
|param2text = String to search in.&lt;br /&gt;
|example1 = print(find(&amp;quot;c&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints 2&lt;br /&gt;
|example2 = print(find(&amp;quot;x&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints -1&lt;br /&gt;
|example3 = print(find(&amp;quot;cd&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===ghosttype()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = ghosttype(ghost);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=336|t=Source}}&lt;br /&gt;
|text = Returns a string containing either a descriptive name of a ghost (a raw C/C++ object), or a unique id (the pointer to the C/C++ &amp;lt;code&amp;gt;naGhostType&amp;lt;/code&amp;gt; instance) if no name has been set.  Ghost is an acronym that stands for '''G'''arbage-collected '''H'''andle to '''O'''ut'''S'''ide '''T'''hingy.&lt;br /&gt;
|param1 = ghost&lt;br /&gt;
|param1text = Ghost to return a description for.&lt;br /&gt;
|example1 = print(ghosttype(airportinfo())); # prints &amp;quot;airport&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===id()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = id(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=706|t=Source}}&lt;br /&gt;
|text = Returns a string containing information on the type and ID of the object provided in the single argument.  The information is returned in the form of &amp;lt;code&amp;gt;'''&amp;lt;type&amp;gt;''':'''&amp;lt;id&amp;gt;'''&amp;lt;/code&amp;gt;, where '''&amp;lt;type&amp;gt;''' is the type of object, and '''&amp;lt;id&amp;gt;''' is the ID.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Can be either of a string, a vector, a hash, a code, a function, or a ghost.&lt;br /&gt;
|example1 = print(id(&amp;quot;A&amp;quot;)); # prints &amp;quot;str:000000001624A590&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===int() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = int(number);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=125|t=Source}}&lt;br /&gt;
|text = Returns the integer part of the numeric value of the single argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if none exists.&lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = Number or string with just a number in it to return an integer from.&lt;br /&gt;
|example1 = print(int(23)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example2 = print(int(23.123)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example3 = debug.dump(int(&amp;quot;string&amp;quot;)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===keys()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = keys(hash);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=36|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the list of keys found in the single hash argument. &lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash to return the keys from.&lt;br /&gt;
|example1 = &lt;br /&gt;
# Initialize a hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
debug.dump(keys(hash)); # print the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===left()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = left(string, length);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=214|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{simgear commit|bd7163|t=commit}}&lt;br /&gt;
|text = Returns a substring of '''string''', starting from the left.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return part of.&lt;br /&gt;
|param2 = length&lt;br /&gt;
|param2text = Integer specifying the length of the substring to return.&lt;br /&gt;
|example1 = print(left(&amp;quot;string&amp;quot;, 2)); # prints &amp;quot;st&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== num()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = num(number);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=149|t=Source}}&lt;br /&gt;
|text = Returns the numerical value of the single string argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if none exists. &lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = String with just a number in it to return a number from.&lt;br /&gt;
|example1 = print(num(&amp;quot;23&amp;quot;)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example2 = print(num(&amp;quot;23.123&amp;quot;)); # prints &amp;quot;23.123&amp;quot;&lt;br /&gt;
|example3 = debug.dump(num(&amp;quot;string&amp;quot;)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===pop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = pop(vector);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=85|t=Source}}&lt;br /&gt;
|text = Removes and returns the last element of the single vector argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the vector is empty. &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = Vector to remove an element from.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
pop(vector);&lt;br /&gt;
debug.dump(vector); # prints &amp;quot;[1, 2]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(pop(vector)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var vector = [];&lt;br /&gt;
debug.dump(pop(vector)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== range() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = range([start, ]stop[, step]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=756|t=Source}}&lt;br /&gt;
|text = Creates a vector of numbers starting from &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (default 0) up to but not including &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, incremented by &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; (default 1). Note: To specify &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;, you must also provide &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;; otherwise the second argument is interpreted as &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = start&lt;br /&gt;
|param1text = Optional. The starting number of the sequence. Defaults to 0 if omitted. Required if you want to specify &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = stop&lt;br /&gt;
|param2text = Required. The number at which to stop the sequence (not included).&lt;br /&gt;
|param3 = step&lt;br /&gt;
|param3text = Optional. The increment between each number in the sequence. Defaults to 1. Only valid if &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is also specified.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vec = range(5);        # Creates a vector [0, 1, 2, 3, 4]&lt;br /&gt;
var vec = range(2, 5);     # Creates a vector [2, 3, 4]&lt;br /&gt;
var vec = range(0, 10, 2); # Creates a vector [0, 2, 4, 6, 8]&lt;br /&gt;
var vec = range(0, 0);     # Creates an empty vector []&lt;br /&gt;
var vec = range(0, 1);     # Creates a vector [0]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== remove() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = remove(vector, value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=53|t=Source}}&lt;br /&gt;
|text = Removes all elements equal to the given value from a vector and returns the modified vector.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector from which elements are to be removed.&lt;br /&gt;
|param2 = value&lt;br /&gt;
|param2text = A value to remove from the vector.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector.&lt;br /&gt;
remove(vector, 2); # Remove the value 2 from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[1, 3]&amp;quot;.&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [&amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;]; # Initialize the vector.&lt;br /&gt;
remove(vector, &amp;quot;text&amp;quot;); # Remove the value &amp;quot;text&amp;quot; from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[]&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== removeat() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removeat(vector, index);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=72|t=Source}}&lt;br /&gt;
|text = Removes the element at the specified index from the vector and returns it.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector from which the element will be removed.&lt;br /&gt;
|param2 = index&lt;br /&gt;
|param2text = Index of the item to be deleted.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector.&lt;br /&gt;
removeat(vector, 0); # Remove the index 0 from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[2, 3]&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===right()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = right(string, length);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=226|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{simgear commit|bd7163|t=commit}}&lt;br /&gt;
|text = Returns a substring of '''string''', starting from the right.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return part of.&lt;br /&gt;
|param2 = length&lt;br /&gt;
|param2text = Integer specifying the length of the substring to return.&lt;br /&gt;
|example1 = print(right(&amp;quot;string&amp;quot;, 2)); # prints &amp;quot;ng&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setsize()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = setsize(vector, size);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=91|t=Source}}&lt;br /&gt;
|text = Sets the size of a vector. The first argument specifies a vector, the second a number representing the desired size of that vector. If the vector is currently larger than the specified size, it is truncated. If it is smaller, it is padded with &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; entries. Returns the vector operated upon. &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to be operated on.&lt;br /&gt;
|param2 = size&lt;br /&gt;
|param2text = The desired size of the vector in number of entries.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize a vector&lt;br /&gt;
setsize(vector, 4);&lt;br /&gt;
debug.dump(vector); # print the vector &amp;quot;[1, 2, 3, nil]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize a vector&lt;br /&gt;
setsize(vector, 2);&lt;br /&gt;
debug.dump(vector); # print the vector &amp;quot;[1, 2]&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===size()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = size(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=26|t=Source}}&lt;br /&gt;
|text = Returns the size of the single argument. For strings, this is the length in bytes. For vectors, this is the number of elements. For hashes, it is the number of key/value pairs. If the argument is &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; or a number, this error will be thrown: &amp;lt;code&amp;gt;object has no size()&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to find the size of.  Must be a string, a vector or a hash.&lt;br /&gt;
|example1 = &lt;br /&gt;
var string = &amp;quot;string&amp;quot;;&lt;br /&gt;
print(size(string)); # prints &amp;quot;6&amp;quot;&lt;br /&gt;
|example2 =&lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
print(size(vector)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
|example3 =&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value1&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value2&amp;quot;,&lt;br /&gt;
    element3: &amp;quot;value3&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
print(size(hash)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== sort()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = sort(vector, function);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=678|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the elements in the input '''vector''' sorted in according to the rule given by '''function'''. Implemented with the ANSI C {{func link|qsort()|link=http://www.cplusplus.com/reference/cstdlib/qsort/}}, &amp;lt;code&amp;gt;sort()&amp;lt;/code&amp;gt; is stable.  This means that if the rules in the first example are used, equal elements in the output vector will appear in the same relative order as they do in the input.  It is run in a loop, so '''function''' is run several times.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = Input vector to sort.&lt;br /&gt;
|param2 = function&lt;br /&gt;
|param2text = Function according to which the elements will be sorted by.  It should take two arguments and should return one of 1, 0, or -1.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Return value !! Meaning&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} less than 0 {{!!}} first argument should go before second argument&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0 {{!!}} first argument equals second argument&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} greater than 0 {{!!}} first argument should go after second argument&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
|example1text = This example sorts elements from smallest to greatest.&lt;br /&gt;
|example1 = &lt;br /&gt;
var sort_rules = func(a, b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return -1; # A should before b in the returned vector&lt;br /&gt;
    } elsif (a == b) {&lt;br /&gt;
        return 0; # A is equivalent to b &lt;br /&gt;
    } else {&lt;br /&gt;
        return 1; # A should after b in the returned vector&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
debug.dump(sort([3, 2, 5, 6, 4, 1], sort_rules)); # prints &amp;quot;[1, 2, 3, 4, 5, 6]&amp;quot;&lt;br /&gt;
|example2text = This example sorts elements from greatest to smallest.&lt;br /&gt;
|example2 = &lt;br /&gt;
# Outputs the elements in reverse order (greatest to smallest)&lt;br /&gt;
var sort_rules = func(a, b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return 1; # -1 in the above example&lt;br /&gt;
    } elsif (a == b) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        return -1; # 1 in the above example&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
debug.dump(sort([3, 2, 5, 6, 4, 1], sort_rules)); # prints &amp;quot;[6, 5, 4, 3, 2, 1]&amp;quot;&lt;br /&gt;
|example3text = This example sorts a vector of strings (runways for example) from smallest to greatest.&lt;br /&gt;
|example3 = &lt;br /&gt;
var runways = [&amp;quot;09R&amp;quot;, &amp;quot;27R&amp;quot;, &amp;quot;26L&amp;quot;, &amp;quot;09L&amp;quot;, &amp;quot;15&amp;quot;];&lt;br /&gt;
var rwy = sort(runways, func(a, b) cmp(a, b));&lt;br /&gt;
debug.dump(rwy); # prints ['09L', '09R', '15', '26L', '27R']&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== split()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = split(delimiter, string);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=596|t=Source}}&lt;br /&gt;
|text = Splits the input string into a vector of substrings bounded by occurrences of the delimiter substring. See [[Nasal_library/string#string.join(sep,list)|string.join()]].&lt;br /&gt;
|param1 = delimiter&lt;br /&gt;
|param1text = String that will split the substrings in the returned vector.&lt;br /&gt;
|param2 = string&lt;br /&gt;
|param2text = String to split up.&lt;br /&gt;
|example1 = debug.dump(split(&amp;quot;cd&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints &amp;quot;['ab', 'ef']&amp;quot;&lt;br /&gt;
|example2 = debug.dump(split(&amp;quot;.&amp;quot;, &amp;quot;3.2.0&amp;quot;)); # prints &amp;quot;[3, 2, 0]&amp;quot;&lt;br /&gt;
|example3 = debug.dump(split(&amp;quot;/&amp;quot;, &amp;quot;path/to/file&amp;quot;)); # prints &amp;quot;['path', 'to', 'file']&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;sprintf(format[, arg[, arg, [...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=491|t=Source}}&lt;br /&gt;
|text = Creates and returns a string formatted using ANSI C {{func link|vsnprintf()|link=http://en.cppreference.com/w/c/io/vfprintf}} &amp;lt;ref&amp;gt;&lt;br /&gt;
{{Cite web&lt;br /&gt;
|url = http://sourceforge.net/p/flightgear/simgear/ci/next/tree/simgear/nasal/lib.c#l308&lt;br /&gt;
|title = fgdata/simgear/simgear/nasal/lib.c, line 308&lt;br /&gt;
|accessdate = October 2015&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;.  Below is a table of supported format specifiers.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot; width=&amp;quot;75%&amp;quot;&lt;br /&gt;
{{!}}+ %[flags][width][.precision]specifier&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Flags&lt;br /&gt;
{{!-}}&lt;br /&gt;
! Flag !! Output&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; {{!!}} Forces to precede the result with a plus or minus sign ('''+''' or '''-''') even for positive numbers. By default, only negative numbers are preceded with a '''-''' sign.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} ''space'' {{!!}} Prefixes non-signed numbers with a space.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; {{!!}} Left-align the output of this placeholder (the default is to right-align the output) when the width option is specified.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; {{!!}} Use 0 instead of spaces to pad a field when the width option is specified.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; {{!!}} Used with &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; specifiers the value is preceded with &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;0x&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;0X&amp;lt;/tt&amp;gt; respectively for values different than zero. Used with &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written. Used with &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; the result is the same as with &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; but trailing zeros are not removed.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Width&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot; {{!}} Integer specifying the minimum number of characters to be returned. This includes the decimal point and decimal fraction as well as + or - signs.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Precision&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot; {{!}} Integer preceded by a dot specifying the number of decimal places to be written.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Specifiers&lt;br /&gt;
{{!-}}&lt;br /&gt;
! Specifier !! Output&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; {{!!}} Signed decimal number.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; {{!!}} A string&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; {{!!}} Percent (%) character.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; {{!!}} A single character assigned to a character code, the code given in an integer argument.  See http://www.asciitable.com/ for a list of supported characters and their codes.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; {{!!}} Unsigned integer as an octal number.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; {{!!}} Unsigned decimal integer.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; {{!!}} Unsigned integer as a hexadecimal number.  If &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is used, any letters in the number are lowercase, while &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; gives uppercase.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; {{!!}} Double value in scientific notation (i.e., ''[-]ddd.ddd'''e'''[+/-]ddd''), with an exponent being denoted by &amp;lt;tt&amp;gt;e&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;E&amp;lt;/tt&amp;gt; depending on whether an upper or lowercase is used respectively.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; {{!!}} Floating-point number, in fixed decimal notation, by default with 6 decimal places.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; {{!!}} Appears to be available&amp;lt;ref&amp;gt;&lt;br /&gt;
{{Cite web&lt;br /&gt;
|url = http://sourceforge.net/p/flightgear/simgear/ci/next/tree/simgear/nasal/lib.c#l389&lt;br /&gt;
|title = fgdata/simgear/simgear/nasal/lib.c, line 389&lt;br /&gt;
|accessdate = October 2015&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;, but doesn't work.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; {{!!}} Double in either normal or exponential notation, whichever is more appropriate for its magnitude. &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; uses lower-case letters, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; uses upper-case letters. This type differs slightly from fixed-point notation in that insignificant zeroes to the right of the decimal point are not included.  Also, the decimal point is not included on whole numbers.&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
|param1 = format&lt;br /&gt;
|param1text = String specifying the format.  Can be used with or without a format specifiers.  See below for examples.&lt;br /&gt;
|param2 = arg&lt;br /&gt;
|param2text = Argument specifying a value to replace a format placeholder (such as &amp;lt;code&amp;gt;%d&amp;lt;/code&amp;gt;) in the format string.  Not required if there are no format specifiers.&lt;br /&gt;
&lt;br /&gt;
|example1 = print(sprintf(&amp;quot;%i&amp;quot;, 54)); # prints &amp;quot;54&amp;quot;&lt;br /&gt;
|example2 = print(sprintf(&amp;quot;Pi = %+.10f&amp;quot;, math.pi)); # prints &amp;quot;Pi = +3.1415926536&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
print(sprintf(&amp;quot;%6d&amp;quot;, 23));  # prints &amp;quot;    23&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%06d&amp;quot;, 23)); # prints &amp;quot;000023&amp;quot;&lt;br /&gt;
|example4 =&lt;br /&gt;
var FGVer = getprop(&amp;quot;/sim/version/flightgear&amp;quot;);&lt;br /&gt;
print(sprintf(&amp;quot;You have FlightGear v%s&amp;quot;, FGVer)); # prints &amp;quot;You have FlightGear v&amp;lt;your version&amp;gt;&amp;quot;&lt;br /&gt;
|example5 = &lt;br /&gt;
print(sprintf(&amp;quot;Hexadecimal 100000 = %X&amp;quot;, 100000)); # prints &amp;quot;Hexadecimal 100000 = 186A0&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;Hexadecimal 100000 = %x&amp;quot;, 100000)); # prints &amp;quot;Hexadecimal 100000 = 186a0&amp;quot;&lt;br /&gt;
|example6 = print(sprintf(&amp;quot;Code 65 is %c&amp;quot;, 65)); # prints &amp;quot;Code 65 is A&amp;quot;&lt;br /&gt;
|example7 = &lt;br /&gt;
print(sprintf(&amp;quot;%e&amp;quot;, 54)); # prints &amp;quot;5.400000e+001&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%E&amp;quot;, 54)); # prints &amp;quot;5.400000E+001&amp;quot;&lt;br /&gt;
|example8 = print(sprintf(&amp;quot;%o&amp;quot;, 54)); # prints &amp;quot;66&amp;quot;&lt;br /&gt;
|example9 = print(sprintf(&amp;quot;50%% of 100 is %i&amp;quot;, 100 / 2)); # prints &amp;quot;50% of 100 is 50&amp;quot;&lt;br /&gt;
|example10 =&lt;br /&gt;
print(sprintf(&amp;quot;%.2f&amp;quot;, 1.4));   # prints &amp;quot;1.40&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%.1f&amp;quot;, 1.4));   # prints &amp;quot;1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;% 4.1f&amp;quot;, 1.4)); # prints &amp;quot; 1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%04.1f&amp;quot;, 1.4)); # prints &amp;quot;01.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;% 6.1f&amp;quot;, 1.4)); # prints &amp;quot;   1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%06.1f&amp;quot;, 1.4)); # prints &amp;quot;0001.4&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===str()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = str(value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=186|t=Source}}&lt;br /&gt;
|text = Convert given value (scalar) to string. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is a number, it will be converted to a string. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is a string, the same string will be returned. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not a scalar (hash, vector, nil), &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; will be returned.&lt;br /&gt;
|param1 = value&lt;br /&gt;
|param1text = The value to convert to string.&lt;br /&gt;
|example1 = &lt;br /&gt;
var result = str(true);     # result is a string &amp;quot;1&amp;quot;&lt;br /&gt;
var result = str(false);    # result is a string &amp;quot;0&amp;quot;&lt;br /&gt;
var result = str(12);       # result is a string &amp;quot;12&amp;quot;&lt;br /&gt;
var result = str(12.5);     # result is a string &amp;quot;12.5&amp;quot;&lt;br /&gt;
var result = str(-12.5);    # result is a string &amp;quot;-12.5&amp;quot;&lt;br /&gt;
var result = str(&amp;quot;12.5&amp;quot;);   # result is a string &amp;quot;12.5&amp;quot;&lt;br /&gt;
var result = str([1, 2]);   # result is a nil&lt;br /&gt;
var result = str({ x: 0 }); # result is a nil&lt;br /&gt;
var result = str(nil);      # result is a nil&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===streq()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = streq(a, b);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=164|t=Source}}&lt;br /&gt;
|text = Tests the string values of the two arguments for equality. This function is needed because the &amp;lt;code&amp;gt;'''=='''&amp;lt;/code&amp;gt; operator (see [[Nasal_Operators#Equality|Nasal Operators]]) tests for numeric equality first.  If either or both the arguments are not strings, 0 (False) will be returned.  Returns either 0 (False) or 1 (True).  {{Note|This function is rarely required in typical code.}}&lt;br /&gt;
|param1 = a&lt;br /&gt;
|param1text = First argument for testing equality.&lt;br /&gt;
|param2 = b&lt;br /&gt;
|param2text = Second argument for testing equality.&lt;br /&gt;
|example1 = print(streq(&amp;quot;0&amp;quot;, &amp;quot;0&amp;quot;)); # prints &amp;quot;1&amp;quot; (True)&lt;br /&gt;
|example2 = &lt;br /&gt;
print(0 == 0.0); # prints &amp;quot;1&amp;quot; (True)&lt;br /&gt;
print(streq(&amp;quot;0&amp;quot;, &amp;quot;0.0&amp;quot;)); # prints &amp;quot;0&amp;quot; (False)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===substr()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = substr(string, start [, length]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=194|t=Source}}&lt;br /&gt;
|text = Similar the {{func link|subvec()}}, but operates on strings. Computes and returns a substring. The first argument specifies a string, the second is the index of the start of a substring, the optional third argument specifies a length (the default is to return the rest of the string from the start).&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return a substring from.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = Integer specifying the start of a substring. Negative values specify a position from the end of the string.&lt;br /&gt;
|param3 = length&lt;br /&gt;
|param3text = Optional argument specifying the length of the substring. Defaults to the end of the string.&lt;br /&gt;
|example1 = print(substr(&amp;quot;abcde&amp;quot;, 1, 3)); # prints &amp;quot;bcd&amp;quot;&lt;br /&gt;
|example2 = print(substr(&amp;quot;abcde&amp;quot;, 1)); # prints &amp;quot;bcde&amp;quot;&lt;br /&gt;
|example3 = print(substr(&amp;quot;abcde&amp;quot;, 2, 1)); # prints &amp;quot;c&amp;quot;&lt;br /&gt;
|example4 = print(substr(&amp;quot;abcde&amp;quot;, -2)); # prints &amp;quot;de&amp;quot;&lt;br /&gt;
|example5 = print(substr(&amp;quot;abcde&amp;quot;, -3, 2)); # prints &amp;quot;cd&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===subvec()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = subvec(vector, start[, length]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=98|t=Source}}&lt;br /&gt;
|text = Returns a sub-range of a vector. The first argument specifies a vector, the second a starting index, and the optional third argument indicates a length (the default is to the end of the vector). &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to take the sub-vector from.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = The starting point of the sub-vector within the given vector.&lt;br /&gt;
|param3 = length&lt;br /&gt;
|param3text = Optional argument specifying the length of the sub-vector, from the starting point.&lt;br /&gt;
'''Notes:'''&lt;br /&gt;
* Omitting the ''vector'' and ''start'' arguments is not an error (possibly it should be) but the return value is ''nil''.&lt;br /&gt;
* A negative ''start'' argument ''is'' an error. This seems wrong. Perhaps the language designer could comment.&lt;br /&gt;
* A value of ''start'' greater than ''size(vector)'' causes an error. A value equal to ''size(vector)'' returns an empty vector.&lt;br /&gt;
* If the value of ''length'' is greater than ''size(vector) - start'' then it is ignored. That is, all elements from ''start'' to the end of ''vector'' are returned. If ''length'' is zero then an empty vector is returned. A negative value of ''length'' causes an error.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 0)); # prints &amp;quot;[1, 2, 3]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 1)); # prints &amp;quot;[2, 3]&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 1, 1)); # prints &amp;quot;[2]&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== typeof()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = typeof(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=287|t=Source}}&lt;br /&gt;
|text = Returns a string indicating the whether the object is &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;, a scalar (number or string), a vector, a hash, a function, or a ghost.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to return the type of.&lt;br /&gt;
|example1 = &lt;br /&gt;
var object = nil;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var object = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;scalar&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var object = math.pi;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;scalar&amp;quot;&lt;br /&gt;
|example4 = &lt;br /&gt;
var object = [1, 2, 3];&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;vector&amp;quot;&lt;br /&gt;
|example5 = &lt;br /&gt;
var object = {};&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;hash&amp;quot;&lt;br /&gt;
|example6 = &lt;br /&gt;
var object = func {};&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;func&amp;quot;&lt;br /&gt;
|example7 =&lt;br /&gt;
var object = airportinfo();&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;ghost&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Extension modules ==&lt;br /&gt;
=== thread ===&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newthread(func);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = start a new worker thread&lt;br /&gt;
|example1 = thread.newthread( func() {} );&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newlock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = create a new lock&lt;br /&gt;
|example1 = var lock = thread.newlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.lock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = lock a lock&lt;br /&gt;
|example1 = var lock = thread.newlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.unlock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = unlock a lock&lt;br /&gt;
|example1 = var lock = thread.unlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newsem();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = create a new {{Wikipedia|semaphore}}&lt;br /&gt;
|example1 = var semaphore = thread.newsem()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.semdown();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = semaphore down&lt;br /&gt;
|example1 = thread.semdown(semaphore)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.semup();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = semaphore up&lt;br /&gt;
|example1 = thread.semup(semaphore)&lt;br /&gt;
}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Extension functions==&lt;br /&gt;
The '''extension functions''' are global functions that have been added to Nasal since its integration into FlightGear. Unlike the core library functions, they are generally specifically designed to interact directly with FlightGear. Extension functions come from three source files:&lt;br /&gt;
*{{flightgear file|src/Scripting/NasalPositioned.cxx}}&lt;br /&gt;
*{{flightgear file|src/Scripting/NasalSys.cxx}}&lt;br /&gt;
*{{fgdata file|Nasal/globals.nas}}&lt;br /&gt;
&lt;br /&gt;
===abort()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = abort();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=565|t=Source}}&lt;br /&gt;
|text = This function is a wrapper for the C++ {{func link|abort()|link=http://www.cplusplus.com/reference/cstdlib/abort/}} function. It simply aborts FlightGear with an error, which varies depending on the operating system. This function should not really be used; instead, please use the &amp;quot;exit&amp;quot; [[Fgcommands|fgcommand]], which will exit FlightGear more gracefully (see example below).&lt;br /&gt;
|example1text = This example will immediately stop FlightGear with an error, such as &amp;quot;FlightGear has stopped working.&amp;quot;&lt;br /&gt;
|example1 = abort();&lt;br /&gt;
|example2text = For exiting FlightGear in a better way, please use the following code:&lt;br /&gt;
|example2 = fgcommand(&amp;quot;exit&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== abs() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = abs(number);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = This simple function returns the {{wikipedia|absolute value|noicon=1}} of the provided number.&lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = This argument is required and should be a number.&lt;br /&gt;
|example1 = print(abs(1)); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
|example2 = print(abs(-1)); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===aircraftToCart() ===&lt;br /&gt;
This new function in FG 2017.2.1 takes coordinates in aircraft structural coordinate system, and translate them into geocentric coordinates.&lt;br /&gt;
Example for (5,6,7):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var pos = aircraftToCart({x: -5, y: 6, z: -7});&lt;br /&gt;
var coord = geo.Coord.new();&lt;br /&gt;
coord.set_xyz(pos.x, pos.y, pos.z);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Notice: x and z is inverted sign on purpose.&lt;br /&gt;
if you want lat. lon, alt from that, just call: (degrees and meters)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
coord.lat()&lt;br /&gt;
coord.lon()&lt;br /&gt;
coord.alt()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===addcommand() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = addcommand(name, code);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=659|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{flightgear commit|7b663c|t=commit}}&lt;br /&gt;
|text = {{see also|Howto:Add new fgcommands to FlightGear}}&lt;br /&gt;
&lt;br /&gt;
This function enables the addition of a new custom [[fgcommands|fgcommand]] to FlightGear from within Nasal. An fgcommand created using this method can be used in exactly the same way as the built-in fgcommands. Also, an fgcommand created via this method will always return True or 1, like all other fgcommands.&lt;br /&gt;
|param1 = name&lt;br /&gt;
|param1text = This will become the name of the new fgcommand. Must be a string.&lt;br /&gt;
|param2 = code&lt;br /&gt;
|param2text = The code that will be executed when the fgcommand is run. Must be a function.&lt;br /&gt;
|example1text = This example adds a new fgcommand and then runs it. Although it executes a simple {{func link|print()}} statement, any valid Nasal code can be used.&lt;br /&gt;
|example1 = addcommand(&amp;quot;myFGCmd&amp;quot;, func(node) {&lt;br /&gt;
    print(&amp;quot;fgcommand 'myFGCmd' has been run.&amp;quot;);&lt;br /&gt;
    props.dump( node );&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;myFGCmd&amp;quot;, props.Node.new({foo:1, bar:2}) );&lt;br /&gt;
|example2text = This example demonstrates how parameters are defined in a new fgcommand.&lt;br /&gt;
|example2 = addcommand(&amp;quot;myFGCmd&amp;quot;, func(node){&lt;br /&gt;
    print(node.getNode(&amp;quot;number&amp;quot;).getValue()); # prints the value of &amp;quot;number,&amp;quot; which is 12&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;myFGCmd&amp;quot;, props.Node.new({&amp;quot;number&amp;quot;: 12}));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airportinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airportinfo();&lt;br /&gt;
airportinfo(type);&lt;br /&gt;
airportinfo(id);&lt;br /&gt;
airportinfo(lat, lon[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1024|t=Source}}&lt;br /&gt;
|text = Function for retrieval of airport, heliport, or seaplane base information. It returns a Nasal ghost; however, its structure is like that of a Nasal hash. The following information is returned:&lt;br /&gt;
* '''parents''': A vector containing a hash of various functions to access information about the runway. These functions are:&lt;br /&gt;
** '''findBestRunwayForPos()''' return runway as ghost by given geo position, e.g. &amp;lt;code&amp;gt;var rwy = airportinfo().findBestRunwayForPos(geo.aircraft_position());&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''runway()''' return runway as ghost by runway ID, e.g. &amp;lt;code&amp;gt;var rwy = airportinfo().runway(&amp;quot;18R&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''runwaysWithoutReciprocals()''' return vector of runways as ghost.&lt;br /&gt;
** '''helipad()''' return helipad as ghost by helipad ID, e.g. &amp;lt;code&amp;gt;var heli = airportinfo().helipad(&amp;quot;H19&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''tower()''' return hash with &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;elevation&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''comms()''' return vector of hashes, each hash with &amp;lt;code&amp;gt;frequency&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''sids()''' return vector of strings with SID IDs.&lt;br /&gt;
** '''stars()''' return vector of strings with STAR IDs.&lt;br /&gt;
** '''getApproachList()''' return vector of string with approaches.&lt;br /&gt;
** '''parking()''' return vector of hashes, each hash with  &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;elevation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''getSid()''' return SID as ghost, e.g. &amp;lt;code&amp;gt;var sid = airportinfo().getSid(&amp;quot;SA1A&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getStar()''' return STAR as ghost, e.g. &amp;lt;code&amp;gt;var star = airportinfo().getStar(&amp;quot;KEILA1&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getIAP()''' return IAP as ghost, e.g. &amp;lt;code&amp;gt;var iap = airportinfo().getIAP(&amp;quot;ILS02&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getApproach()''' return approach as ghost, e.g. &amp;lt;code&amp;gt;var approach = airportinfo().getApproach(&amp;quot;ILS02&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''tostring()''' just return string &amp;quot;an airport ICAO&amp;quot;.&lt;br /&gt;
** See also {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1902}}.&lt;br /&gt;
* '''lon''': Longitude of the location.&lt;br /&gt;
* '''lat''': Latitude of the location.&lt;br /&gt;
* '''has_metar''': True or false depending whether the airport has a [[METAR]] code defined for it.&lt;br /&gt;
* '''elevation''': Elevation of the location in metres.&lt;br /&gt;
* '''id''': ICAO code of the airport (or ID of the seaplane base/heliport).&lt;br /&gt;
* '''name''': Name of the airport/heliport/seaplane base.&lt;br /&gt;
* '''runways'''&lt;br /&gt;
** '''&amp;lt;runway name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of runway.&lt;br /&gt;
*** '''lat''': Latitude of the runway.&lt;br /&gt;
*** '''lon''': Longitude of the runway.&lt;br /&gt;
*** '''heading''': True heading of the runway.&lt;br /&gt;
*** '''length''': Length of the runway in metres.&lt;br /&gt;
*** '''width''': Width of the runway in metres.&lt;br /&gt;
*** '''surface''': Runway surface type.&lt;br /&gt;
*** '''threshold''': Length of the runway's {{wikipedia|displaced threshold}} in metres. Will return 0 if there is none.&lt;br /&gt;
*** '''stopway''': Length of the runway's stopway (the area before the threshold) in metres. Will return 0 if there is none.&lt;br /&gt;
*** '''reciprocal''': &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt; ghost of the reciprocal runway.&lt;br /&gt;
*** '''ils_frequency_mhz''': ILS frequency in megahertz.&lt;br /&gt;
*** '''ils''': &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost of the ILS transmitter.&lt;br /&gt;
* '''helipads'''&lt;br /&gt;
** '''&amp;lt;helipad name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of helipad.&lt;br /&gt;
*** '''lat''': Latitude of the helipad.&lt;br /&gt;
*** '''lon''': Longitude of the helipad.&lt;br /&gt;
*** '''heading''': True heading of the helipad.&lt;br /&gt;
*** '''length''': Length of the helipad in metres.&lt;br /&gt;
*** '''width''': Width of the helipad in metres.&lt;br /&gt;
*** '''surface''': Helipad surface type.&lt;br /&gt;
* '''taxiways'''&lt;br /&gt;
** '''&amp;lt;taxiway name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of taxiway.&lt;br /&gt;
*** '''lat''': Latitude of the taxiway.&lt;br /&gt;
*** '''lon''': Longitude of the taxiway.&lt;br /&gt;
*** '''heading''': Heading of the taxiway.&lt;br /&gt;
*** '''length''': Length of the taxiway in metres.&lt;br /&gt;
*** '''width''': Width of the taxiway in metres.&lt;br /&gt;
*** '''surface''': Taxiway surface type.&lt;br /&gt;
&lt;br /&gt;
Information is extracted in the same way as accessing members of a Nasal hash. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# prints to lengths of the runways of the nearest airport in feet and metres&lt;br /&gt;
var info = airportinfo();&lt;br /&gt;
print(&amp;quot;-- Lengths of the runways at &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;) --&amp;quot;);&lt;br /&gt;
foreach(var rwy; keys(info.runways)){&lt;br /&gt;
    print(rwy, &amp;quot;: &amp;quot;, math.round(info.runways[rwy].length * M2FT), &amp;quot; ft (&amp;quot;, info.runways[rwy].length, &amp;quot; m)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that searches for locations that are a long way away (e.g., the nearest seaplane base to the middle of the Sahara) may cause FlightGear to pause for an amount of time.&lt;br /&gt;
|param1 = id&lt;br /&gt;
|param1text = The {{wikipedia|International Civil Aviation Organization airport code|ICAO code|noicon=1}} of an airport to retrieve information about.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = When this argument is used, the function will return the closest airport of a certain type. Can be one of &amp;quot;heliport,&amp;quot; &amp;quot;seaport,&amp;quot; or &amp;quot;airport&amp;quot; (default).&lt;br /&gt;
: {{inote|Running this function without any parameters is equivalent to this:&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
airportinfo(&amp;quot;airport&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
|param3 = lat ''and'' lon&lt;br /&gt;
|param3text = When these parameters are used, the function will return information on the nearest airport, heliport or seaplane base (depending on the '''type''' parameter) to those coordinates.&lt;br /&gt;
|example1 = var info = airportinfo();&lt;br /&gt;
print(&amp;quot;Nearest airport: &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;)&amp;quot;); # prints the name and ICAO code of the nearest airport&lt;br /&gt;
|example2 = var info = airportinfo(&amp;quot;heliport&amp;quot;);&lt;br /&gt;
print(&amp;quot;Elevation of the nearest heliport: &amp;quot;, math.round(info.elevation * M2FT), &amp;quot; ft&amp;quot;); # prints the elevation and name of the nearest heliport&lt;br /&gt;
|example3 = var info = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
print(&amp;quot;-- Runways of &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;): --&amp;quot;);&lt;br /&gt;
foreach(var rwy; keys(info.runways)) {&lt;br /&gt;
    print(rwy); # prints the runways of KSQL&lt;br /&gt;
}&lt;br /&gt;
|example4 = var info = airportinfo(37.81909385, -122.4722484);&lt;br /&gt;
print(&amp;quot;Coordinates of the nearest airport: &amp;quot;, info.lat, &amp;quot;, &amp;quot;, info.lon); # print the name and ICAO of the nearest airport to the Golden Gate Bridge&lt;br /&gt;
|example5 = var info = airportinfo(37.81909385, -122.4722484, &amp;quot;seaport&amp;quot;);&lt;br /&gt;
print(&amp;quot;Nearest seaplane base: &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;)&amp;quot;); # print the name and ID of the nearest seaplane base to the Golden Gate Bridge&lt;br /&gt;
|example6text = This example prints the all information from an &amp;lt;code&amp;gt;airportinfo()&amp;lt;/code&amp;gt; call.&lt;br /&gt;
|example6 = var info = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
print(info.name);&lt;br /&gt;
print(info.id);&lt;br /&gt;
print(info.lat);&lt;br /&gt;
print(info.lon);&lt;br /&gt;
print(info.has_metar);&lt;br /&gt;
print(info.elevation);&lt;br /&gt;
foreach(var rwy; keys(info.runways)){&lt;br /&gt;
    print(&amp;quot;-- &amp;quot;, rwy, &amp;quot; --&amp;quot;);&lt;br /&gt;
    print(info.runways[rwy].lat);&lt;br /&gt;
    print(info.runways[rwy].lon);&lt;br /&gt;
    print(info.runways[rwy].length);&lt;br /&gt;
    print(info.runways[rwy].width);&lt;br /&gt;
    print(info.runways[rwy].heading);&lt;br /&gt;
    print(info.runways[rwy].stopway);&lt;br /&gt;
    print(info.runways[rwy].threshold);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airwaysRoute() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airwaysRoute(start, end[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1933|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
This function returns a vector containing waypoints between two given waypoints. The returned waypoints are ghosts, but can be accessed in the same way as a Nasal hash. See [[Nasal Flightplan]] for more information.&lt;br /&gt;
|param1 = start&lt;br /&gt;
|param1text = Start waypoint, in the form of a waypoint ghost, such as that provided by {{func link|flightplan()}}.&lt;br /&gt;
|param2 = end&lt;br /&gt;
|param2text = Same as above.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = Instructs the function to compute a high level route (when set to &amp;quot;highlevel&amp;quot;), or a low level route (when set to &amp;quot;lowlevel&amp;quot;). Defaults to &amp;quot;highlevel.&amp;quot;&lt;br /&gt;
|example1text = In the [[route manager]] dialog, add two waypoints to the flightplan, ideally ones that are far apart (tip: use the [[Map]] for this). Then run this code in your Nasal Console.&lt;br /&gt;
|example1 = var fp = flightplan();&lt;br /&gt;
var start = fp.getWP(0);&lt;br /&gt;
var end = fp.getWP(fp.getPlanSize() - 1);&lt;br /&gt;
var rt = airwaysRoute(start, end);&lt;br /&gt;
foreach(var wp; rt){&lt;br /&gt;
    print(wp.wp_name); # print the waypoints in the computed route&lt;br /&gt;
}&lt;br /&gt;
|example2text = Exactly the same as above, but computes a low level path.&lt;br /&gt;
|example2 = var fp = flightplan();&lt;br /&gt;
var start = fp.getWP(0);&lt;br /&gt;
var end = fp.getWP(fp.getPlanSize() - 1);&lt;br /&gt;
var rt = airwaysRoute(start, end, &amp;quot;lowlevel&amp;quot;);&lt;br /&gt;
foreach(var wp; rt){&lt;br /&gt;
    print(wp.wp_name); # print the waypoints in the computed route&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airway()===&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airway(ident [, pos]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2644|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
This function returns a ghost containing an airway of a specified id.&lt;br /&gt;
|param1 = ident&lt;br /&gt;
|param1text = a Positioned ghost (leg, navaid, airport) and so on, passed to the search function.&lt;br /&gt;
|param2 = pos&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===assert()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = assert(condition[, message]);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|version = 3.2&lt;br /&gt;
|commit = {{fgdata commit|8b16a7|t=commit}}&lt;br /&gt;
|text = Returns either true if the condition evaluates as true, or aborts with a {{func link|die()}} call, which can be customised.&lt;br /&gt;
|param1 = condition&lt;br /&gt;
|param1text = Condition to evaluate.&lt;br /&gt;
|param2 = message&lt;br /&gt;
|param2text = Optional message that will be used in any {{func link|die()}} call. Defaults to &amp;quot;assertion failed!&amp;quot;&lt;br /&gt;
|example1 = var a = 1;&lt;br /&gt;
var b = 2;&lt;br /&gt;
print(assert(a &amp;lt; b)); # prints &amp;quot;1&amp;quot; (true)&lt;br /&gt;
|example2 = var a = 1;&lt;br /&gt;
var b = 2;&lt;br /&gt;
assert(a &amp;gt; b, 'a is not greater than b'); # aborts with a custom error message&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===carttogeod()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = carttogeod(x, y, z);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=945|t=Source}}&lt;br /&gt;
|text = Converts {{wikipedia|ECEF|Earth-centered, Earth-fixed}} coordinates (x, y and z) to {{wikipedia|geodetic coordinates}} (latitude, longitude, and altitude). A vector is returned containing latitude and longitude, both in degrees, and altitude, which is returned in metres above the equatorial radius of Earth as defined by the {{wikipedia|WGS 84}} (6,378,137 metres).&amp;lt;ref&amp;gt;{{simgear file|simgear/math/sg_geodesy.hxx|l=43}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|param1 = x&lt;br /&gt;
|param1text = Mandatory x-axis value, in metres.&lt;br /&gt;
|param2 = y&lt;br /&gt;
|param2text = Mandatory y-axis value, in metres.&lt;br /&gt;
|param3 = z&lt;br /&gt;
|param3text = Mandatory z-axis value, in metres.&lt;br /&gt;
|example1 = var (lat, lon, alt) = carttogeod(6378137, 0, 0); # point is the intersection of the prime meridian and equator.&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, lat); # prints lat, lon and alt, which are all zero, see above&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, lon);&lt;br /&gt;
print(&amp;quot;Altitude: &amp;quot;, alt);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===cmdarg()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|private = _cmdarg()&lt;br /&gt;
|syntax = cmdarg();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=513|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; returns the property root of certain types of XML files. These could be nodes in the [[Property Tree]], or temporary and/or non-public nodes outside the Property tree. &lt;br /&gt;
It is used by Nasal scripts embedded in XML files. It returns a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object (see {{fgdata file|Nasal/props.nas}}), and you can use all of its methods on the returned value. &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; should only be used in four types/places of XML files:&lt;br /&gt;
* Bindings: This is needed so that the value of a joystick's axis can be accessed internally.&lt;br /&gt;
* Dialogs: This will return the root of the dialog in the Property Tree. This is useful for dialogs that are created/modified procedurally (e.g. for populating/changing widgets while loading the dialog). &lt;br /&gt;
* Embedded Canvases: The Nasal code behind [[Canvas]] windows [[Howto:Adding a canvas to a GUI dialog|embedded in PUI dialogs]] can use it to accessing the root directory of their Canvas.&lt;br /&gt;
* Animation XML files: If the animation XML file is used in an AI/MP model, &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; will return the root of the AI model in the &amp;lt;code&amp;gt;/ai/models/&amp;lt;/code&amp;gt; directory. Examples: &amp;lt;code&amp;gt;/ai/models/aircraft[3]/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ai/models/multiplayer[1]/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should not use &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in places other than those stated above. Although it won't cause an error, it will return the value of the last legitimate &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; call. &lt;br /&gt;
&lt;br /&gt;
Also, you should not delay &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; using {{func link|maketimer()}}, {{func link|settimer()}} or {{func link|setlistener()}}, because it will return an unrelated property.&lt;br /&gt;
|example1 = fgcommand(&amp;quot;dialog-show&amp;quot;, {&amp;quot;dialog-name&amp;quot;: &amp;quot;cmdarg-demo&amp;quot;});&lt;br /&gt;
|example1text = &amp;lt;br&amp;gt;This example demonstrates the usage of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in a binding.  Save the below XML snippet as &amp;lt;tt&amp;gt;[[$FG_ROOT]]/gui/dialogs/cmdarg-demo.xml&amp;lt;/tt&amp;gt;. Then run the Nasal snippet below in your [[Nasal Console]]. Upon clicking {{button|Close}}, a message will be printed sowing the root of the binding in the Property Tree.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;cmdarg-demo&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
  &amp;lt;label&amp;gt;Click &amp;quot;Close&amp;quot; to activate the demonstration (a message in the console).&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Close&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;nasal&amp;lt;/command&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;print(&amp;quot;Button binding root: '&amp;quot; ~ cmdarg().getPath() ~ &amp;quot;'&amp;quot;);&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example2text = This example demonstrates the usage of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in Nasal code within dialogs.  Open &amp;lt;tt&amp;gt;[[$FG_ROOT]]/gui/dialogs/cmdarg-demo.xml&amp;lt;/tt&amp;gt; from the previous example, copy &amp;amp; paste the code below, and save it. Then run the same Nasal snippet as the previous example in your Nasal Console. If you click {{button|Click me!}}, the button's label will change to &amp;quot;I've been changed!&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;cmdarg-demo&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
  &amp;lt;label&amp;gt;Click &amp;quot;Click me!&amp;quot; to activate the demonstration (the button's label will change).&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Click me!&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;nasal&amp;lt;/command&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;change_label();&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Close&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&lt;br /&gt;
  &amp;lt;open&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
    var dlg_root = cmdarg();&lt;br /&gt;
    var dlg_name = {&amp;quot;dialog-name&amp;quot;: &amp;quot;cmdarg-demo&amp;quot;};&lt;br /&gt;
    var change_label = func {&lt;br /&gt;
        dlg_root.getNode(&amp;quot;button[0]/legend&amp;quot;).setValue(&amp;quot;I've been changed!&amp;quot;);&lt;br /&gt;
        fgcommand(&amp;quot;dialog-close&amp;quot;, dlg_name);&lt;br /&gt;
        fgcommand(&amp;quot;dialog-show&amp;quot;, dlg_name);&lt;br /&gt;
    }&lt;br /&gt;
  ]]&amp;gt;&amp;lt;/open&amp;gt;&lt;br /&gt;
&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example3text = For an example of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; used with Canvas, please see [[Howto:Adding a canvas to a GUI dialog#FGPlot|Howto:Adding a canvas to a GUI dialog]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===courseAndDistance()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = courseAndDistance(to);&lt;br /&gt;
courseAndDistance(from, to);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1668|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the course from one point to another and the distance between them in nautical miles. The course is the initial bearing (see [http://www.movable-type.co.uk/scripts/latlong.html#bearing here]), and is in the range 0–360. Both arguments can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object with geodetic coordinates (cartesian coordinates will not be accepted)&lt;br /&gt;
|param1 = from&lt;br /&gt;
|param1text = Optional parameter defining the from where the function should calculate its results. If the function is given one argument ('''to'''), the aircraft's current position will be used. As well as the argument types as defined above, this argument can be two numbers separated with a comma, as if the function is taking three arguments. See example 5 below.&lt;br /&gt;
|param2 = to&lt;br /&gt;
|param2text = Like the first parameter, but defines the second point.&lt;br /&gt;
|example1text = This example demonstrates the usage of the function with the &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost type.&lt;br /&gt;
|example1 = var from = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var to = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course); # prints course from KSFO to KSQL&lt;br /&gt;
print(dist); # prints distance in nm from KSFO to KSQL&lt;br /&gt;
|example2text = This example demonstrates the usage of the function with hashes containing ''lat'' and ''lon''.&lt;br /&gt;
|example2 = var from = {lat: 0, lon: 0};&lt;br /&gt;
var to = {lat: 1, lon: 1};&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example3text = This example demonstrates usage of a geo.Coord object.&lt;br /&gt;
|example3 = var from = geo.Coord.new().set_latlon(0, 0);&lt;br /&gt;
var to = geo.Coord.new().set_latlon(1, 1);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example4text = This example demonstrates usage of differing parameter types.&lt;br /&gt;
|example4 = var from = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var to = geo.Coord.new().set_latlon(0, 0);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example5text = The same as above, but the other way round.&lt;br /&gt;
|example5 = var to = {lat: 1, lon: 1};&lt;br /&gt;
var (course, dist) = courseAndDistance(0, 0, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example6text = Usage of just one parameter.&lt;br /&gt;
|example6 = var dest = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
var (course, dist) = courseAndDistance(dest);&lt;br /&gt;
print(&amp;quot;Turn to heading &amp;quot;, math.round(course), &amp;quot;. You have &amp;quot;, sprintf(&amp;quot;%.2f&amp;quot;, dist), &amp;quot; nm to go&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createFlightplan()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createFlightplan(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2331|t=Source}}&lt;br /&gt;
|text = Creates an empty flightplan object. It accepts one argument, ''path'' passed an absolute path to a .fgfp / .gpx file, it will populate the flightplan with waypoints from the file.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional parameter defining the file from which a flightplan will be populated.&lt;br /&gt;
|example1 = &lt;br /&gt;
var path = getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test.fgfp&amp;quot;;&lt;br /&gt;
var flightplan = createFlightplan(path);&lt;br /&gt;
debug.dump(flightplan);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createDiscontinuity()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createDiscontinuity();&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object. A route discontinuity is inserted by an {{abbr|FMS|Flight Management System}} when it is unsure how to connect two waypoints.&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2045|t=Source}}&lt;br /&gt;
|version = 2016.1&lt;br /&gt;
|commit = {{flightgear commit|caead6|t=commit}}&lt;br /&gt;
}}&lt;br /&gt;
===createViaTo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createViaTo(airway, waypoint);&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object. It represents a route &amp;quot;via '''airway''' to '''waypoint'''&amp;quot;.&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2009|t=Source}}&lt;br /&gt;
|version = 2016.1&lt;br /&gt;
|commit = {{flightgear commit|caead6|t=commit}}&lt;br /&gt;
|param1 = airway&lt;br /&gt;
|param1text = The name of an airway.&lt;br /&gt;
|param2 = waypoint&lt;br /&gt;
|param2text = Must be in the airway and one of:&lt;br /&gt;
* The name of a waypoint.&lt;br /&gt;
* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
}}&lt;br /&gt;
===createWP()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createWP(pos, name[, flag]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1964|t=Source}}&lt;br /&gt;
|text = Creates a new waypoint ghost object.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Dictates the position of the new waypoint. It can be one of the following:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. See example 4 below.&lt;br /&gt;
|param2 = name&lt;br /&gt;
|param2text = String that will become the name of the new waypoint.&lt;br /&gt;
|param3 = flag&lt;br /&gt;
|param3text = Optional string that will tell FlightGear what type of waypoint it is. Must be one of &amp;quot;sid,&amp;quot; &amp;quot;star,&amp;quot; &amp;quot;approach,&amp;quot; &amp;quot;missed,&amp;quot; or &amp;quot;pseudo.&amp;quot;&lt;br /&gt;
|example1text = Creates a waypoint directly in front and 1 km away and appends it to the flight plan.&lt;br /&gt;
|example1 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example2 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP({lat: pos.lat(), lon: pos.lon()}, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example3 = var apt = airportinfo();&lt;br /&gt;
var wp = createWP(apt, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example4 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos.lat(), pos.lon(), &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example5text = Creates a new waypoint and adds it to the flight plan. Waypoints of the type &amp;quot;pseudo&amp;quot; are then removed from the flight plan, including the new waypoint. The {{func link|print()}} statements show this.&lt;br /&gt;
|example5 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos, &amp;quot;NEWWP&amp;quot;, &amp;quot;pseudo&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
fp.clearWPType(&amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createWPFrom()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createWPFrom(object[, flag]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1989|t=Source}}&lt;br /&gt;
|text = Creates a new waypoint object from another object.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = A ghost object. Must be a ghost type that is one of &amp;quot;airport,&amp;quot; &amp;quot;navaid,&amp;quot; &amp;quot;runway,&amp;quot; or &amp;quot;fix.&amp;quot;&lt;br /&gt;
|param2 = flag&lt;br /&gt;
|param2text = Optional string that will tell FlightGear what type of waypoint it is. Must be one of &amp;quot;sid,&amp;quot; &amp;quot;star,&amp;quot; &amp;quot;approach,&amp;quot; &amp;quot;missed,&amp;quot; or &amp;quot;pseudo.&amp;quot;&lt;br /&gt;
|example1text = Creates a new waypoint and appends it to the flight plan.&lt;br /&gt;
|example1 = var apt = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var wp = createWPFrom(apt);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example2text = Creates a new waypoint and appends it to the flight plan. This way point is then removed; the {{func link|print()}} statements prove this.&lt;br /&gt;
|example2 = var apt = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var wp = createWPFrom(apt, &amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(wp.wp_name);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
fp.clearWPType(&amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===defined()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = defined(symbol);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns 1 (true) or 0 (false) depending on whether a variable exists.&lt;br /&gt;
|param1 = symbol&lt;br /&gt;
|param1text = A string that will be what the function searches for.&lt;br /&gt;
|example1 = var number = 12;&lt;br /&gt;
var check_exist = func {&lt;br /&gt;
    print(&amp;quot;Variable 'number' &amp;quot;, defined(&amp;quot;number&amp;quot;) == 1 ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;); # 'number' does exist&lt;br /&gt;
    print(&amp;quot;Variable 'number2' &amp;quot;, defined(&amp;quot;number2&amp;quot;) == 1 ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;); # 'number2' does not exist&lt;br /&gt;
}&lt;br /&gt;
check_exist();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===directory()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = directory(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=572|t=Source}}&lt;br /&gt;
|text = Returns a vector containing a list of the folders and files in a given file path or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the path doesn't exist. Hidden folders and files are not added to the vector.&lt;br /&gt;
{{inote|The first two elements of the vector will be &amp;lt;code&amp;gt;'.'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'..'&amp;lt;/code&amp;gt;. These are for navigating back up the file tree, but have no use in Nasal. They can be safely removed from the vector.}}&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Absolute file path.&lt;br /&gt;
|example1text = Gets the folders and files in [[$FG_ROOT]], and then removes the extra first two elements (see note above). &lt;br /&gt;
|example1 = var dir = directory(getprop(&amp;quot;/sim/fg-root&amp;quot;)); # get directory&lt;br /&gt;
dir = subvec(dir, 2); # strips off the first two elements&lt;br /&gt;
debug.dump(dir); # dump the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===fgcommand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = fgcommand(cmd[, args]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=456|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = Runs an fgcommand. See also {{readme file|commands}} and [[Bindings]] for more information. See {{flightgear file|src/Main/fg_commands.cxx|l=1425}} for the full list of fgcommands. Note that fgcommands generated by {{func link|addcommand()}} can also be run using this function. Also, the full list of fgcommands depends on the version of FlightGear you have. Returns 1 (true) if the fgcommand succeeded or 0 (false) if it failed.&lt;br /&gt;
|param1 = cmd&lt;br /&gt;
|param1text = String that is the name of the command that is to be run.&lt;br /&gt;
|param2 = args&lt;br /&gt;
|param2text = If the fgcommand takes arguments, they are inputted using this argument. Can either be a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object, or a hash (see examples below).&lt;br /&gt;
|example1 = fgcommand(&amp;quot;null&amp;quot;); # does nothing&lt;br /&gt;
|example2 = var args = props.Node.new({'script': 'print(&amp;quot;Running fgcommand&amp;quot;);'});&lt;br /&gt;
if (fgcommand(&amp;quot;nasal&amp;quot;, args)) { # prints &amp;quot;Running fgcommand&amp;quot; and then one of these print statements&lt;br /&gt;
    print(&amp;quot;Fgcommand succeeded&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Fgcommand encountered a problem&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example3 = var args = { 'dialog-name': 'about' };&lt;br /&gt;
fgcommand(&amp;quot;dialog-show&amp;quot;, args); # shows the 'about' dialog&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findAirportsByICAO() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findAirportsByICAO(search[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1096|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost objects which are (by default) airports whose ICAO code matches the search string. The results are sorted by range from closest to furthest.&lt;br /&gt;
|param1 = search&lt;br /&gt;
|param1text = Search string for the function. Can either be a partial or a full ICAO code.&lt;br /&gt;
:{{icaution|The more matches there are for the given code, the longer the function will take. Passing just one character (e.g., &amp;quot;K&amp;quot;), might make FlightGear hang for a certain amount of time.}}&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = This will narrow the search to airports of a certain type. By default, only airports are searched for. May be one of &amp;quot;airport,&amp;quot; &amp;quot;heliport,&amp;quot; or &amp;quot;seaport.&amp;quot;&lt;br /&gt;
|example1 = var apts = findAirportsByICAO(&amp;quot;KSF&amp;quot;); # finds all airports matching &amp;quot;KSF&amp;quot;&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;); # prints them&lt;br /&gt;
}&lt;br /&gt;
|example2 = var apts = findAirportsByICAO(&amp;quot;SP0&amp;quot;, &amp;quot;seaport&amp;quot;); # finds all seaplane bases matching &amp;quot;SP0&amp;quot;&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;); # prints them&lt;br /&gt;
}&lt;br /&gt;
|example3 = var apt = findAirportsByICAO(&amp;quot;XBET&amp;quot;); # one way to check if an airport does exist&amp;quot;&lt;br /&gt;
if (size(apt) == 0) {&lt;br /&gt;
    print(&amp;quot;Airport does not exist&amp;quot;); # this one will be printed&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Airport does exist&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findAirportsWithinRange()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findAirportsWithinRange([pos, ]range[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1066|t=Source}}&lt;br /&gt;
|text = Returns a vector of &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost object which are (by default) airports that are within a given range of a given position, or the aircraft's current position. The results are sorted by range from closest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findAirportsWithinRange(lat, lon, range, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = range&lt;br /&gt;
|param2text = Mandatory number giving the range in nautical miles within which to search for airports/heliports/seaplane bases.only airports are searched for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to airports of a certain type. By default, only airports are searched for. May be one of &amp;quot;airport,&amp;quot; &amp;quot;heliport,&amp;quot; or &amp;quot;seaport.&amp;quot;&lt;br /&gt;
|example1text = Searches for airports within 10 nm of [[KSFO]].&lt;br /&gt;
|example1 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var apts = findAirportsWithinRange(pos, 10);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2text = Searches for seaplane bases within 15 nm of [[KSFO]].&lt;br /&gt;
|example2 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var apts = findAirportsWithinRange(pos, 15, &amp;quot;seaport&amp;quot;);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example3text = Searches for airports within 10 nm of your current position.&lt;br /&gt;
|example3 = var apts = findAirportsWithinRange(10);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findCommByFrequencyMHz()===&lt;br /&gt;
 findCommByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
[[sourceforge:p/flightgear/flightgear/ci/next/tree/src/Scripting/NasalPositioned.cxx#l1547|source]]&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;code&amp;gt;comm&amp;lt;/code&amp;gt; ghost object for a station matching a given frequency. If there is more than one station with that frequency, the nearest station is returned.&lt;br /&gt;
&lt;br /&gt;
'''pos'''&lt;br /&gt;
&lt;br /&gt;
: Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findCommByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
; freq&lt;br /&gt;
: Frequency, in megahertz, of the station to search for.&lt;br /&gt;
; type&lt;br /&gt;
: This will narrow the search to station of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see flightgear/src/Navaids/positioned.cxx (line 160)&lt;br /&gt;
'''Example'''&lt;br /&gt;
 var com = findCommByFrequencyMHz(123.6);&lt;br /&gt;
 print(&amp;quot;ID: &amp;quot;, com.id); # prints info about the comm station&lt;br /&gt;
 print(&amp;quot;Name: &amp;quot;, com.name);&lt;br /&gt;
 print(&amp;quot;Latitude: &amp;quot;, com.lat);&lt;br /&gt;
 print(&amp;quot;Longitude: &amp;quot;, com.lon);&lt;br /&gt;
 print(&amp;quot;Type: &amp;quot;, com.type);&lt;br /&gt;
 print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, com.frequency), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== findFixesByID() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findFixesByID([pos, ]id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1627|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; ghost objects matching a given ID, sorted by range from a certain position.&lt;br /&gt;
{{inote|Fixes are (usually) also known as waypoints.}}&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findFixesByID(lat, lon, id);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = id&lt;br /&gt;
|param2text = Full or partial ID of the fix to search for.&lt;br /&gt;
:{{inote|1=Inputting a partial ID does not work correctly (see [http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=28129 here]). It is best to just input a full ID.}}&lt;br /&gt;
|example1 = var fixes = findFixesByID(&amp;quot;POGIC&amp;quot;);&lt;br /&gt;
foreach(var fix; fixes){&lt;br /&gt;
    print(fix.id, &amp;quot; - lat: &amp;quot;, fix.lat, &amp;quot; {{!}} lon: &amp;quot;, fix.lon); # prints information about POGIC&lt;br /&gt;
}&lt;br /&gt;
|example2 = var fix = findFixesByID(&amp;quot;ZUNAP&amp;quot;);&lt;br /&gt;
fix = fix[0];&lt;br /&gt;
var (course, dist) = courseAndDistance(fix);&lt;br /&gt;
print(&amp;quot;Turn to heading &amp;quot;, math.round(course), &amp;quot;. You have &amp;quot;, sprintf(&amp;quot;%.2f&amp;quot;, dist), &amp;quot; nm to go to reach &amp;quot;, fixes[0].id);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidByFrequencyMHz()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1547|t=Source}}&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost object for a navaid matching a given frequency. If there is more than one navaid with that frequency, the nearest station is returned.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = freq&lt;br /&gt;
|param2text = Frequency, in megahertz, of the navaid to search for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaid = findNavaidByFrequencyMHz(109.55);&lt;br /&gt;
print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about the navaid&lt;br /&gt;
print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 100), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
if(navaid.course) print(&amp;quot;Course: &amp;quot;, navaid.course);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== findNavaidsByFrequencyMHz()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1572|t=Source}}&lt;br /&gt;
|text = Returns a vector conatining &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects for navaids that match a given frequency, sorted from nearest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = freq&lt;br /&gt;
|param2text = Frequency, in megahertz, of the navaid to search for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaids = findNavaidsByFrequencyMHz(109.55);&lt;br /&gt;
foreach(var navaid; navaids){&lt;br /&gt;
    print(&amp;quot;--&amp;quot;);&lt;br /&gt;
    print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about the navaid&lt;br /&gt;
    print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
    print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
    print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
    print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
    print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
    print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 100), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
    print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
    if(navaid.course) print(&amp;quot;Course: &amp;quot;, navaid.course);&lt;br /&gt;
    print(&amp;quot;--&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidsByID()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsByID([pos, ]id[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1600|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects matching a given ID, sorted by range from a certain position.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsByID(lat, lon, id, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = id&lt;br /&gt;
|param2text = Full or partial ID of the fix to search for.&lt;br /&gt;
:{{inote|1=Inputting a partial ID does not work correctly (see [http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=28129 here]). It is best to just input a full ID.}}&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaid = findNavaidsByID(&amp;quot;MXW&amp;quot;);&lt;br /&gt;
navaid = navaid[0];&lt;br /&gt;
print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about 'MXW' (a VOR station)&lt;br /&gt;
print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 1000), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidsWithinRange()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsWithinRange([pos, ]range[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1518|t=Source}}&lt;br /&gt;
|text = Returns a vector of &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects which are within a given range of a given position (by default the aircraft's current position). The results are sorted from closest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsWithinRange(lat, lon, range, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = range&lt;br /&gt;
|param2text = Mandatory number giving the range in nautical miles within which to search for navaids.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1text = Searches for navaids within 10 nm of [[KSFO]].&lt;br /&gt;
|example1 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var navs = findNavaidsWithinRange(pos, 10);&lt;br /&gt;
foreach(var nav; navs){&lt;br /&gt;
    print(nav.name, &amp;quot; (ID: &amp;quot;, nav.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2text = Searches for navaids within 10 nm of your current position.&lt;br /&gt;
|example2 = var navs = findNavaidsWithinRange(10);&lt;br /&gt;
foreach(var nav; navs){&lt;br /&gt;
    print(nav.name, &amp;quot; (ID: &amp;quot;, nav.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===finddata()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = finddata(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=603|t=Source}}&lt;br /&gt;
|text = Takes a relative path and tries to return an absolute one. It works by appending the relative path to some paths and testing to see if they exist. As of FlightGear v3.7, these paths are the TerraSync directory (tested first) and [[$FG_ROOT]]. &lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = A relative path as a string.&lt;br /&gt;
|example1 = var path = finddata(&amp;quot;Aircraft/Generic&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to $FG_ROOT/Aircraft/Generic&lt;br /&gt;
|example2 = var path = finddata(&amp;quot;Airports&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to &amp;lt;TerraSync dir&amp;gt;/Airports&lt;br /&gt;
|example3 = var path = finddata(&amp;quot;preferences.xml&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to $FG_ROOT/preferences.xml&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===flightplan()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = flightplan([path]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1738|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
Returns a flight plan object, either one for the current flight plan, or one loaded from a given path.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional path to flight plan XML file.&lt;br /&gt;
|example1text = Gets the active flight plan and gets the ID of the current waypoint. Note that this example requires a flight plan to be set in the [[Route Manager]] first.&lt;br /&gt;
|example1 = var fp = flightplan();&lt;br /&gt;
print(fp.getWP(fp.current).id);&lt;br /&gt;
|example2text = Creates a new flight plan from an XML file and prints the IDs of the waypoints. Note that this example requires a flight plan to have been created and saved as &amp;lt;tt&amp;gt;''[[$FG_HOME]]/fp-demo.xml''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example2 = var path = getprop('/sim/fg-home') ~ '/fp-demo.xml';&lt;br /&gt;
var fp = flightplan(path);&lt;br /&gt;
for(var i = 0; i &amp;lt; fp.getPlanSize(); i += 1){&lt;br /&gt;
    print(fp.getWP(i).id);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===geodinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = geodinfo(lat, lon[, max_alt]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=981|t=Source}}&lt;br /&gt;
|text = Returns a vector containing two entries or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if no information could be obtained because the terrain tile wasn't loaded. The first entry in the vector is the elevation (in meters) for the given point, and the second is a hash with information about the assigned material (as defined in &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/Materials''&amp;lt;/tt&amp;gt;), or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if there was no material information available (for example, because there is an untextured building at that location). The structure of the hash is as follows (see also {{readme file|materials}}):&lt;br /&gt;
* '''light_coverage:''' The coverage of a single point of light in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* '''bumpiness:''' Normalized bumpiness factor for the material.&lt;br /&gt;
* '''load_resistance:''' The amount of pressure in N/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; the material can withstand without deformation.&lt;br /&gt;
* '''solid:''' 1 (true) or false (0) depending on whether the material is solid or not.&lt;br /&gt;
* '''names:''' Vector of scenery types (usually generated by [[TerraGear]]) that will use this material. &lt;br /&gt;
* '''friction_factor:''' Normalized friction factor of the material.&lt;br /&gt;
* '''rolling_friction:''' The rolling friction coefficient of the material.&lt;br /&gt;
&lt;br /&gt;
Note that this function is a ''very'' CPU-intensive operation, particularly in FlightGear v2.4 and earlier. It is advised to use this function as little as possible.&lt;br /&gt;
|param1 = lat&lt;br /&gt;
|param1text = Latitude, inputted as a number.&lt;br /&gt;
|param2 = lon&lt;br /&gt;
|param2text = Longitude, inputted as a number.&lt;br /&gt;
|param3 = max_alt&lt;br /&gt;
|param3text = The altitude, in metres, from which the function will begin searching for the height of the terrain. Defaults to 10,000 metres. If the terrain is higher than this argument specifies, &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; will be returned.&lt;br /&gt;
|example1text = Dumps information about ground underneath the aircraft.&lt;br /&gt;
|example1 = var pos = geo.aircraft_position();&lt;br /&gt;
var info = geodinfo(pos.lat(), pos.lon());&lt;br /&gt;
debug.dump(info);&lt;br /&gt;
|example2text = Prints whether the ground underneath the aircraft is solid or is water.&lt;br /&gt;
|example2 = var pos = geo.aircraft_position();&lt;br /&gt;
var info = geodinfo(pos.lat(), pos.lon());&lt;br /&gt;
if (info != nil and info[1] != nil) {&lt;br /&gt;
    print(&amp;quot;The ground underneath the aircraft is &amp;quot;, info[1].solid == 1 ? &amp;quot;solid.&amp;quot; : &amp;quot;water.&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== geodtocart() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = geodtocart(lat, lon, alt);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=962|t=Source}}&lt;br /&gt;
|text = Converts {{wikipedia|geodetic coordinates}} (latitude, longitude, and altitude) to {{wikipedia|ECEF|Earth-centered, Earth-fixed}} coordinates (x, y and z). A vector is returned containing x, y, and z in metres. The equatorial radius of earth used is that defined by the {{wikipedia|WGS 84}} (6,378,137 metres). All argument are mandatory.&lt;br /&gt;
|param1 = lat&lt;br /&gt;
|param1text = Latitude, in degrees.&lt;br /&gt;
|param2 = lon&lt;br /&gt;
|param2text = Longitude, in degrees.&lt;br /&gt;
|param3 = alt&lt;br /&gt;
|param3text = Altitude, in metres.&lt;br /&gt;
|example1 = var (x, y, z) = geodtocart(0, 0, 0); # point is the intersection of the prime meridian and equator.&lt;br /&gt;
print(&amp;quot;x: &amp;quot;, x); # prints &amp;quot;x: 6378137&amp;quot;&lt;br /&gt;
print(&amp;quot;y: &amp;quot;, y); # prints &amp;quot;y: 0&amp;quot;&lt;br /&gt;
print(&amp;quot;z: &amp;quot;, z); # prints &amp;quot;y: 0&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== get_cart_ground_intersection()===&lt;br /&gt;
Introduced in 2017.2.1, see [[Terrain Detection]].&lt;br /&gt;
&lt;br /&gt;
===getprop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;getprop(path[, path[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=345|t=Source}}&lt;br /&gt;
|text = Returns the value of a node in the [[Property Tree]] or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the node does not exist or the value is not a number (NaN).&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = There needs to be at least one argument, but there is no limit to the maximum amount of arguments that can be given. The arguments will be concatenated together to form a property tree path. The arguments must be strings, but in FlightGear v3.2 onwards, there is also support (added by {{flightgear commit|34ed79}}) for numeric arguments as indices. See example 2 below.&lt;br /&gt;
|example1 = print(&amp;quot;You have FlightGear v&amp;quot;, getprop(&amp;quot;/sim/version/flightgear&amp;quot;)); # prints FlightGear version&lt;br /&gt;
|example2text = Note that the example below will only work in FlightGear 3.2 and above.&lt;br /&gt;
|example2 = for(var i = 0; i &amp;lt; 8; i += 1){&lt;br /&gt;
    print(&amp;quot;View #&amp;quot;, i + 1, &amp;quot; is named &amp;quot;, getprop(&amp;quot;/sim/view&amp;quot;, i, &amp;quot;name&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
|example3text = Same as above, but is supported by all versions of FlightGear.&lt;br /&gt;
|example3 = for(var i = 0; i &amp;lt; 8; i += 1){&lt;br /&gt;
    print(&amp;quot;View #&amp;quot;, i + 1, &amp;quot; is named &amp;quot;, getprop(&amp;quot;/sim/view[&amp;quot; ~ i ~ &amp;quot;]/name&amp;quot;));&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== See also====&lt;br /&gt;
{{note| If you have to read/write the same property multiple times (e.g. in an update loop), it is more efficient to use a node object: &lt;br /&gt;
To get a Node rather than its value, use &amp;lt;code&amp;gt;props.globals.getNode()&amp;lt;/code&amp;gt; - see [[Nasal_library/props]]. }}&lt;br /&gt;
&lt;br /&gt;
===greatCircleMove()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = greatCircleMove([pos, ]course, dist);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1681|t=Source}}&lt;br /&gt;
|text = Calculates a new set of geodetic coordinates using inputs of course and distance, either from the aircraft's current position (by default) or from another set of coordinates. Returns a hash containing two members, ''lat'' and ''lon'' (latitude and longitude respectively).&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to calculate from. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A &amp;lt;code&amp;gt;geo.Coord&amp;lt;/code&amp;gt; object&lt;br /&gt;
:* A lat/lon pair, that is, a pair of numbers (latitude followed by longitude) separated by a comma: &amp;lt;code&amp;gt;greatCircleMove(lat,lon, ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = course&lt;br /&gt;
|param2text = Course to new set of coordinates, in degrees (in the range 0–360).&lt;br /&gt;
|param3 = dist&lt;br /&gt;
|param3text = Distance in nautical miles to the new set of coordinates.&lt;br /&gt;
|example1 = var pos = greatCircleMove(0,0, 0, 1);&lt;br /&gt;
debug.dump(pos); # print hash with coordinates&lt;br /&gt;
|example2 = var fix = findFixesByID(&amp;quot;POGIC&amp;quot;);&lt;br /&gt;
fix = fix[0];&lt;br /&gt;
var pos = greatCircleMove(fix, 45, 10);&lt;br /&gt;
debug.dump(pos); # print hash with coordinates&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===interpolate()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|private = _interpolate()&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;interpolate(prop, value1, time1[, value2, time2[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=522|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = Linearly interpolates a node in the property tree to a given value in a specified time. The value/time pairs will be run one after the other in the order that they are passed to the function. Note that the interpolation will continue even when the simulation is paused.&lt;br /&gt;
|param1 = prop&lt;br /&gt;
|param1text = String or &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object that indicates a node in the property tree to be used.&lt;br /&gt;
|param2 = value''n''&lt;br /&gt;
|param2text = Target value to change the property to in the set amount of time. This should be a number.&lt;br /&gt;
|param3 = time''n''&lt;br /&gt;
|param3text = Time in seconds, that will be taken for the interpolation.&lt;br /&gt;
|example1text = Paste the code below into the Nasal Console and execute. Then, open the Property Browser and look for the property. Finally, run the code again, and watch the value of the property change.&lt;br /&gt;
|example1 = setprop(&amp;quot;/test&amp;quot;, 0); # (re-)set property&lt;br /&gt;
interpolate(&amp;quot;/test&amp;quot;,&lt;br /&gt;
    50, 5, # interpolate to 50 in 5 seconds&lt;br /&gt;
    10, 2, # interpolate to 10 in 2 seconds&lt;br /&gt;
    0, 5); # interpolate to 0 in 5 seconds&lt;br /&gt;
|example2 = # Apply the left brake at 20% per second&lt;br /&gt;
var prop = &amp;quot;controls/gear/brake-left&amp;quot;;&lt;br /&gt;
var dist = 1 - getprop(prop);&lt;br /&gt;
if (dist == 1) {&lt;br /&gt;
    interpolate(prop, 1, dist / 0.2);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isa()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isa(object, class);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Checks if an object is an instance of, or inherits from, a second object (or class), returning 1 (true) if it is and 0 (false) if otherwise.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to check.&lt;br /&gt;
|param2 = class&lt;br /&gt;
|param2text = Class/object to check that '''object''' inherits from or is an instance of.&lt;br /&gt;
|example1 = var coord = geo.Coord.new();&lt;br /&gt;
if(isa(coord, geo.Coord)){&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is an instance of class 'geo.Coord'&amp;quot;); # this one will be printed&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is not an instance of class 'geo.Coord'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2 = var coord = geo.Coord.new();&lt;br /&gt;
if(isa(coord, props.Node)){&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is an instance of class 'props.Node'&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is not an instance of class 'props.Node'&amp;quot;); # this one will be printed&lt;br /&gt;
}&lt;br /&gt;
|example3text = The example below demonstrates checking of inheritance.&lt;br /&gt;
|example3 = var Const = {&lt;br /&gt;
    constant: 2,&lt;br /&gt;
    getConst: func {&lt;br /&gt;
        return me.constant;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Add = {&lt;br /&gt;
    new: func {&lt;br /&gt;
        return { parents: [Add, Const] };&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addToConst: func(a){&lt;br /&gt;
        return a * me.getConst();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var m = Add.new();&lt;br /&gt;
print(m.addToConst(4));&lt;br /&gt;
&lt;br /&gt;
if(isa(m, Add)) print(&amp;quot;Variable 'm' is an instance of class 'Add'&amp;quot;); # will be printed&lt;br /&gt;
if(isa(m, Const)) print(&amp;quot;Variable 'm' is an instance of class 'Const'&amp;quot;); # will also be printed&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===logprint()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;logprint(priority[, msg[, msg[, ...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=431|t=Source}}&lt;br /&gt;
|text = Concatenates a message and logs it with a given priority level. Unlike {{func link|print()}} and {{func link|printlog()}}, message outputted by this function will be logged in your &amp;lt;code&amp;gt;[[Commonly used debugging tools#fgfs.log|fgfs.log]]&amp;lt;/code&amp;gt; file as coming from the Nasal file itself rather than from {{flightgear file|src/Scripting/NasalSys.cxx}}.&lt;br /&gt;
|param1 = priority&lt;br /&gt;
|param1text = Number specifying the priority level of the outputted message:&lt;br /&gt;
:{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Number !! Debug type&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 1 {{!!}} Bulk&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 2 {{!!}} Debug&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 3 {{!!}} Info&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 4 {{!!}} Warn&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 5 {{!!}} Alert&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param2 = msg&lt;br /&gt;
|param2text = The message. There is no limit to the arguments you give give. They will be concatenated together before logging.&lt;br /&gt;
|example1 = # logs the value of pi to three decimal places with log level 3&lt;br /&gt;
logprint(3, &amp;quot;pi = &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, math.pi));&lt;br /&gt;
|example2 = logprint(5, &amp;quot;Alert! This is an important message!&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
{{note| &lt;br /&gt;
The following constants have been added to the development branch of FlightGear (&amp;quot;next&amp;quot;) and will be releases with FG 2020.1 so you won't have to remember the numbers anymore:&lt;br /&gt;
&lt;br /&gt;
LOG_BULK, LOG_WARN, LOG_DEBUG, LOG_INFO, LOG_ALERT, DEV_WARN, DEV_ALERT }}&lt;br /&gt;
&lt;br /&gt;
===magvar() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = magvar([pos]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1642|t=Source}}&lt;br /&gt;
|text = Returns the {{wikipedia|magnetic variation}} at a given set of coordinates. The table below gives the magnetic model used depending on the version of FlightGear.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! FlightGear versions !! Model !! Reference date&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 3.6 and above {{!!}} {{wikipedia|World Magnetic Model}} (WMM) 2015 {{!!}} 1 January 2015&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0.9.11-pre1 to 3.4 {{!!}} WMM 2005 {{!!}} 1 January 2005&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0.7.3 to 0.9.10 {{!!}} WMM 2000 {{!!}} 1 January 2000&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to calculate from. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A &amp;lt;code&amp;gt;geo.Coord&amp;lt;/code&amp;gt; object&lt;br /&gt;
:* A lat/lon pair, that is, a pair of numbers (latitude followed by longitude) separated by a comma: &amp;lt;code&amp;gt;magvar(lat,lon)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = print(magvar(0, 0)); # prints the magnetic variation at 0, 0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===maketimer() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = maketimer(interval[, self], function);&lt;br /&gt;
|source = ''Implemented using the {{API Link|flightgear|class|TimerObj}} class.''&amp;lt;br&amp;gt;{{flightgear file|src/Scripting/NasalSys.cxx|l=90|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=533|t=Part 2}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{flightgear commit|ab939f|t=commit}}&lt;br /&gt;
|text = Returns a timer object containing the following methods and members:&lt;br /&gt;
* '''start()''': Starts the timer.&lt;br /&gt;
* '''stop()''': Stops the timer.&lt;br /&gt;
* '''restart(interval)''': Restarts the timer with the given interval.&lt;br /&gt;
* '''singleShot''': Bool showing whether the timer is only to be run once, or continuously until told to stop. Can be both set and read from (see examples).&lt;br /&gt;
* '''isRunning''': Read-only bool telling whether the timer is currently running.&lt;br /&gt;
* '''simulatedTime''': (FG 2017.1+; {{flightgear commit|0af316|t=commit}}) Bool telling whether the timer is using simulated time (which accounts for pause, etc.). Defaults to false (use real time). Can be both read and set. This cannot be changed while the timer is running.&lt;br /&gt;
Unlike {{func link|settimer()}}, which it replaces, &amp;lt;code&amp;gt;maketimer()&amp;lt;/code&amp;gt; provides more control over the timer. In addition, it can help reduce memory usage.&lt;br /&gt;
|param1 = interval&lt;br /&gt;
|param1text = Interval in seconds for the timer.&lt;br /&gt;
|param2 = self&lt;br /&gt;
|param2text = Optional parameter specifying what any &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; references in the function being called will refer to.&lt;br /&gt;
|param3 = function&lt;br /&gt;
|param3text = Function to be called at the given interval.&lt;br /&gt;
|example1 = var timer = maketimer(1, func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;); # print &amp;quot;Hello, World!&amp;quot; once every second (call timer.stop() to stop it)&lt;br /&gt;
});&lt;br /&gt;
timer.start();&lt;br /&gt;
|example2 = var timer = maketimer(1, math, func(){&lt;br /&gt;
    print(me.math); # 'me' reference is the 'math' namespace&lt;br /&gt;
});&lt;br /&gt;
timer.singleShot = 1; # timer will only be run once&lt;br /&gt;
timer.start();&lt;br /&gt;
|example3 = var timer = maketimer(1, func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;); # print &amp;quot;Hello, World!&amp;quot; once every second (call timer.stop() to stop it)&lt;br /&gt;
});&lt;br /&gt;
timer.start();&lt;br /&gt;
print(timer.isRunning); # prints 1&lt;br /&gt;
|example4text = In the example below, &amp;quot;Hello, World!&amp;quot; will be printed after one second the first time, and after two seconds thereafter.&lt;br /&gt;
|example4 = var update = func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
    timer.restart(2); # restarts the timer with a two second interval&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var timer = maketimer(1, update);&lt;br /&gt;
timer.singleShot = 1;&lt;br /&gt;
timer.start();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===maketimestamp()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = maketimestamp()&lt;br /&gt;
|source = ''Implemented using the {{API Link|flightgear|class|TimeStampObj}} class.''&amp;lt;br&amp;gt;{{flightgear file|src/Scripting/NasalSys.cxx|l=214|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=589|t=Part 2}}&lt;br /&gt;
|version = 2019.2&lt;br /&gt;
|commit = {{flightgear commit|7db06300|t=commit}}&lt;br /&gt;
|text = Returns a time stamp object to allow high resolution timing of Nasal operations. When created the timer will automatically be stamped. The object has the following methods:&lt;br /&gt;
* '''stamp()''': Resets the timing operation. Call this first.&lt;br /&gt;
* '''elapsedMSec()''': returns number of milliseconds elapsed since stamp() called. Resolution may vary depending on platform but is usually at least millisecond accuracy.&lt;br /&gt;
* '''elapsedUSec()''': returns number of microseconds elapsed since stamp() called. Resolution may vary depending on platform but is usually at least millisecond accuracy.&lt;br /&gt;
|&lt;br /&gt;
|example1text = In the example below the number of milliseconds elapsed will be printed.&lt;br /&gt;
|example1 = var timestamp = maketimestamp();&lt;br /&gt;
timestamp.stamp();&lt;br /&gt;
print(timestamp.elapsedMSec(), &amp;quot;ms elapsed&amp;quot;);&lt;br /&gt;
print(timestamp.elapsedMSec(), &amp;quot;ms elapsed&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===md5()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = md5(string);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=758|t=Source}}&lt;br /&gt;
|version = 3.2&lt;br /&gt;
|commit = {{flightgear commit|cfbf9e|t=commit}}&lt;br /&gt;
|text = Returns a the {{wikipedia|MD5}} hash (as a string) of the inputted string.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String the generate the hash of. Mandatory.&lt;br /&gt;
|example1text = The below code should output &amp;lt;code&amp;gt;65a8e27d8879283831b664bd8b7f0ad4&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = print(md5(&amp;quot;Hello, World!&amp;quot;));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===navinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = navinfo(lat, lon, type, id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1453|t=Source}}&lt;br /&gt;
|text = Returns vector &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects matching the given '''type''' and '''id''' or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; on error.&lt;br /&gt;
|param1 = lat ''and'' lon&lt;br /&gt;
|param1text = If given, the returned navaids will be put into order of ascending distance from the location.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = Narrows the search to the given type. Must be one of &amp;quot;any,&amp;quot; &amp;quot;fix,&amp;quot; &amp;quot;vor,&amp;quot; &amp;quot;ndb,&amp;quot; &amp;quot;ils,&amp;quot; &amp;quot;dme,&amp;quot; or &amp;quot;tacan.&amp;quot; Defaults to the equivalent of &amp;quot;any.&amp;quot;&lt;br /&gt;
|param3 = id&lt;br /&gt;
|param3text = ID to search for. Note that, although all the parameters are technically optional, this parameter must be given, otherwise an empty vector will be returned.&lt;br /&gt;
|example1 = navinfo(&amp;quot;vor&amp;quot;); # returns all VORs&lt;br /&gt;
|example2 = navinfo(&amp;quot;HAM&amp;quot;); # return all navaids whose names start with &amp;quot;HAM&amp;quot;&lt;br /&gt;
|example3 = navinfo(&amp;quot;vor&amp;quot;, &amp;quot;HAM&amp;quot;); # return all VORs whose names start with &amp;quot;HAM&amp;quot;&lt;br /&gt;
|example4 = navinfo(34,48,&amp;quot;vor&amp;quot;,&amp;quot;HAM&amp;quot;); # return all VORs whose names start with &amp;quot;HAM&amp;quot; and sorted by distance relative to 34°, 48°&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===parse_markdown()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = parse_markdown(markdown);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=745|t=Part 1}} {{!}} {{simgear file|simgear/misc/SimpleMarkdown.cxx|t=Part 2}} &lt;br /&gt;
|version = 3.2&lt;br /&gt;
|text = Parses a string containing {{wikipedia|Markdown}} and returns the result as a string. As of FlightGear 2016.1, it is just a simple parser, and does the following:&lt;br /&gt;
* It strips whitespace from the beginning of the string.&lt;br /&gt;
* It supports [http://daringfireball.net/projects/markdown/syntax#p paragraphs and line breaks].&lt;br /&gt;
* It collapses whitespace.&lt;br /&gt;
* It converts unordered [http://daringfireball.net/projects/markdown/syntax#list lists] to use a bullet character (&amp;amp;bull;). Note that the bullet character is implemented in hexadecimal UTF-8 character bytes (&amp;lt;code&amp;gt;E2 80 A2&amp;lt;/code&amp;gt;), as so may not work properly when the being displayed in an encoding other than UTF-8.&lt;br /&gt;
|param1 = markdown&lt;br /&gt;
|param1text = String containing Markdown to be parsed.&lt;br /&gt;
|example1text = &lt;br /&gt;
Save the below code as &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/gui/dialogs/test.xml''&amp;lt;/tt&amp;gt;, then run the Nasal code below it to open the dialog. To change the markdown to be parsed, simply change the code in the highlighted section, save it, and reload the GUI (&amp;lt;tt&amp;gt;Debug &amp;gt; Reload GUI&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; highlight=&amp;quot;41-50&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;test&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;group&amp;gt;&lt;br /&gt;
    &amp;lt;layout&amp;gt;hbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;empty&amp;gt;&lt;br /&gt;
        &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;/empty&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;text&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;parse_markdown() test dialog&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;/text&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;empty&amp;gt;&lt;br /&gt;
        &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;/empty&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button&amp;gt;&lt;br /&gt;
        &amp;lt;legend&amp;gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;
        &amp;lt;pref-width&amp;gt;16&amp;lt;/pref-width&amp;gt;&lt;br /&gt;
        &amp;lt;pref-height&amp;gt;16&amp;lt;/pref-height&amp;gt;&lt;br /&gt;
        &amp;lt;binding&amp;gt;&lt;br /&gt;
            &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
        &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;canvas&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;Canvas plot&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;pref-width&amp;gt;400&amp;lt;/pref-width&amp;gt;&lt;br /&gt;
    &amp;lt;pref-height&amp;gt;300&amp;lt;/pref-height&amp;gt;&lt;br /&gt;
    &amp;lt;nasal&amp;gt;&lt;br /&gt;
        &amp;lt;load&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
var text = 'Items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears&lt;br /&gt;
&lt;br /&gt;
Some text.&lt;br /&gt;
Some more items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears';&lt;br /&gt;
&lt;br /&gt;
var parsed = parse_markdown(text);&lt;br /&gt;
&lt;br /&gt;
var root_canvas = canvas.get(cmdarg());&lt;br /&gt;
root_canvas.setColorBackground(255, 255, 255);&lt;br /&gt;
var root = root_canvas.createGroup();&lt;br /&gt;
&lt;br /&gt;
var text_dis = root.createChild(&amp;quot;text&amp;quot;)&lt;br /&gt;
    .setText(parsed)&lt;br /&gt;
    .setTranslation(5, 5)&lt;br /&gt;
    .setFont(&amp;quot;LiberationFonts\LiberationSans-Regular.ttf&amp;quot;)&lt;br /&gt;
    .setFontSize(15)&lt;br /&gt;
    .setColor(0, 0, 0)&lt;br /&gt;
    .setDrawMode(canvas.Text.TEXT)&lt;br /&gt;
    .setAlignment(&amp;quot;left-top&amp;quot;);&lt;br /&gt;
        ]]&amp;gt;&amp;lt;/load&amp;gt;&lt;br /&gt;
    &amp;lt;/nasal&amp;gt;&lt;br /&gt;
&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example1 = fgcommand(&amp;quot;dialog-show&amp;quot;, {&amp;quot;dialog-name&amp;quot;: &amp;quot;test&amp;quot;});&lt;br /&gt;
|example2text = The example below parses Markdown and outputs it in a HTML document. The parsed text is placed in &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; tags. To change the Markdown to be parsed, simply edit the variable &amp;lt;tt&amp;gt;markdown&amp;lt;/tt&amp;gt; at the top of the code.&lt;br /&gt;
|example2 = &amp;lt;nowiki&amp;gt;var markdown = 'Items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears&lt;br /&gt;
&lt;br /&gt;
Some text.&lt;br /&gt;
Some more items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears';&lt;br /&gt;
&lt;br /&gt;
var parsed = parse_markdown(markdown);&lt;br /&gt;
&lt;br /&gt;
debug.dump(parsed);&lt;br /&gt;
&lt;br /&gt;
var path = string.normpath(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ '/Export/parse_markdown()-test.html');&lt;br /&gt;
&lt;br /&gt;
var file = io.open(path, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var html = &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;\n\n&amp;lt;html&amp;gt;\n\n&amp;lt;head&amp;gt;\n\t&amp;lt;meta charset=\&amp;quot;UTF-8\&amp;quot;&amp;gt;\n\t&amp;lt;title&amp;gt;parse_markdown() test generated by Nasal&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n\n&amp;lt;body&amp;gt;\n\t&amp;lt;pre&amp;gt;&amp;quot; ~ parsed ~ &amp;quot;&amp;lt;/pre&amp;gt;\n&amp;lt;/body&amp;gt;\n\n&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
io.write(file, html);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(&amp;quot;Done, file ready for viewing (&amp;quot; ~ path ~ &amp;quot;)&amp;quot;);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===parsexml()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;parsexml(path[, start[, end[, data[, pro_ins]]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=710|t=Source}}&lt;br /&gt;
|text = This function is an interface into the built-in [http://expat.sourceforge.net/ Expat XML parser]. The absolute path to the file is returned as string, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; is returned on error.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Mandatory absolute path to the XML file to be parsed.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = Optional callback function that will be called for every starting tag. The function should take two argument: the tag name and a hash containing attributes.&lt;br /&gt;
|param3 = end&lt;br /&gt;
|param3text = Optional callback function that will be called for every ending tag. The function should take one argument: the tag name.&lt;br /&gt;
|param4 = data&lt;br /&gt;
|param4text = Optional callback function that will be called for every piece of data within a set of tags. The function should take one argument: the data as a string.&lt;br /&gt;
|param5 = pro_ins&lt;br /&gt;
|param5text = Optional callback function that will be called for every {{wikipedia|Processing Instruction|processing instruction}}. The function should take two argument: the target and the data string.&lt;br /&gt;
|example1text = Save the below XML code in &amp;lt;tt&amp;gt;''[[$FG_HOME]]/Export/demo.xml''&amp;lt;/tt&amp;gt;. Then, execute the Nasal code below in the Nasal Console. The XML will be parsed and each bit of the code will be printed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;style.xsl&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;foo&amp;gt;&lt;br /&gt;
  &amp;lt;blah type=&amp;quot;string&amp;quot;&amp;gt;&amp;lt;![CDATA[ &amp;lt;sender&amp;gt;John Smith&amp;lt;/sender&amp;gt; ]]&amp;gt;&amp;lt;/blah&amp;gt;&lt;br /&gt;
  &amp;lt;blah2 type=&amp;quot;string&amp;quot;&amp;gt;Orange &amp;amp;amp; lemons&amp;lt;/blah2&amp;gt;&lt;br /&gt;
&amp;lt;/foo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example1 = var start = func(name, attr){&lt;br /&gt;
    print(&amp;quot;Starting tag: '&amp;quot;, name, &amp;quot;'&amp;quot;);&lt;br /&gt;
    foreach(var a; keys(attr)){&lt;br /&gt;
        print(&amp;quot;\twith attribute &amp;quot;, a, '=&amp;quot;', attr[a], '&amp;quot;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var end = func(name){&lt;br /&gt;
    print(&amp;quot;Ending tag: '&amp;quot;, name, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var data = func(data){&lt;br /&gt;
    print(&amp;quot;Data = '&amp;quot;, data, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var pro_instr = func(target, data){&lt;br /&gt;
    print(&amp;quot;Processing instruction: target = '&amp;quot;, target, &amp;quot;', data = '&amp;quot;, data, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
parsexml(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ '/Export/demo.xml', start, end, data, pro_instr);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===print()===&lt;br /&gt;
{{Note|As of 07/2020, we are in the process of slowly deprecating and removing Nasal print() (in fgdata) where possible in favor of log [[#logprint()]] which takes a priority level.&lt;br /&gt;
&lt;br /&gt;
This is part of the goal that we achieve zero output at log-level at alert, and everything shown at ‘warn; is really a warning, not just information.&amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/37042224/&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;print(data[, data[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=415|t=Source}}&lt;br /&gt;
|text = Concatenates its arguments and then prints it to the terminal and the [[Commonly used debugging tools#fgfs.log|log]]. Note that a newline is automatically added.&lt;br /&gt;
|param1 = data&lt;br /&gt;
|param1text = Data to print. Only strings and numbers can be printed; other data types will not be. There many be any number of arguments; they will just be concatenated together.&lt;br /&gt;
|example1 = print(&amp;quot;Just&amp;quot;, &amp;quot; a &amp;quot;, &amp;quot;test&amp;quot;); # prints &amp;quot;Just a test&amp;quot;&lt;br /&gt;
|example2 = print(&amp;quot;pi = &amp;quot;, math.pi); # prints &amp;quot;pi = 3.141592...&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== printf() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;printf(format[, arg[, arg, [...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Creates and prints a formatted string. For a description of its arguments, see {{func link|sprintf()}} (it is, in fact, implemented using &amp;lt;code&amp;gt;sprintf()&amp;lt;/code&amp;gt;).&lt;br /&gt;
|example1 = printf(&amp;quot;In hexadecimal, 100000 = %X&amp;quot;, 186A0); # prints &amp;quot;In hexadecimal, 100000 = 186A0&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===printlog()===&lt;br /&gt;
{{caution|This function is deprecated and doesn't work. Please use the new one {{func link|logprint()}}.}}&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;printlog(level, data[, data[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Prints the given message with the given log level. If the log level is higher or equal to &amp;lt;code&amp;gt;/sim/logging/priority&amp;lt;/code&amp;gt;, it is printed.&lt;br /&gt;
|param1 = level&lt;br /&gt;
|param1text = Mandatory log level as a string. Must be one of &amp;quot;none,&amp;quot; &amp;quot;bulk,&amp;quot; &amp;quot;debug,&amp;quot; &amp;quot;info,&amp;quot; &amp;quot;warn,&amp;quot; or &amp;quot;alert.&amp;quot; Note that &amp;quot;none&amp;quot; will mean that the message will never be printed.&lt;br /&gt;
|param2 = data&lt;br /&gt;
|param2text = Data to be printed. Only strings and numbers will be printed; others will not be. There may be any number of arguments; they will just be concatenated together.&lt;br /&gt;
|example1 = printlog(&amp;quot;alert&amp;quot;, &amp;quot;This is an alert&amp;quot;); # message will be printed&lt;br /&gt;
|example2 = printlog(&amp;quot;info&amp;quot;, &amp;quot;Just informing you about something&amp;quot;); # message will be printed only if log level is set to &amp;quot;info&amp;quot; or less&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===rand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = rand();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=554|t=Source}}&lt;br /&gt;
|text = Returns a random floating point number between 0 (inclusive) and 1 (exclusive). It takes no arguments.&lt;br /&gt;
|example1 = print(rand()); # prints random number&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===registerFlightPlanDelegate()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = registerFlightPlanDelegate(init_func);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1879|t=Source}}&lt;br /&gt;
|text = Registers a flight plan delegate. See &amp;lt;tt&amp;gt;''{{fgdata file|Nasal/route_manager.nas|t=$FG_ROOT/Nasal/route_manager.nas}}''&amp;lt;/tt&amp;gt; for examples.&lt;br /&gt;
|param1 = init_func&lt;br /&gt;
|param1text = Initialization function which will be called during FlightGear's startup.&lt;br /&gt;
}}&lt;br /&gt;
===removecommand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removecommand(cmd);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=668|t=Source}}&lt;br /&gt;
|text = Removes the given fgcommand. Returns &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{caution|This will remove '''any''' [[fgcommands|fgcommand]], even those implemented in C++, so use with caution!}}&lt;br /&gt;
|param1 = cmd&lt;br /&gt;
|param1text = String specifying the name of the command to remove.&lt;br /&gt;
|example1 = addcommand(&amp;quot;hello&amp;quot;, func(){&lt;br /&gt;
    print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;hello&amp;quot;); # &amp;quot;Hello&amp;quot; will be printed&lt;br /&gt;
removecommand(&amp;quot;hello&amp;quot;); # removes it&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===removelistener()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removelistener(id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=1384|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=506|t=Part 2}}&lt;br /&gt;
|text = Removes and deactivates the given listener and returns the number of listeners left or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; on error.&lt;br /&gt;
{{note|It is good practice to remove listeners when they are not required anymore. This prevents the listeners reducing FlightGear's run performance.}}&lt;br /&gt;
|param1 = id&lt;br /&gt;
|param1text = ID of listener as returned by {{func link|setlistener()}}.&lt;br /&gt;
|example1 = var ls = setlistener(&amp;quot;/sim/test&amp;quot;, func(){&lt;br /&gt;
    print(&amp;quot;Property '/sim/test' has been changed&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
setprop(&amp;quot;/sim/test&amp;quot;, &amp;quot;blah&amp;quot;); # trigger listener&lt;br /&gt;
var rem = removelistener(ls); # remove listener&lt;br /&gt;
print(&amp;quot;There are &amp;quot;, rem, &amp;quot; listeners remaining&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===resolvepath()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = resolvepath(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=604|t=Source}}&lt;br /&gt;
|text = Takes a relative path as a string and uses [[SimGear]]'s path-resolving framework to return an absolute path as a string. If the path could not be resolved, an empty string is returned. See [[Resolving Paths]] for a detailed description of the algorithm. This function can also be used to check if a file exists.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Relative path to be completed.&lt;br /&gt;
|example1 = print(resolvepath(&amp;quot;Nasal/globals.nas&amp;quot;)); # prints the equivalent of $FG_ROOT/Nasal/globals.nas&lt;br /&gt;
|example2 = print(resolvepath(&amp;quot;blah&amp;quot;)); # prints nothing; could not be resolved&lt;br /&gt;
|example3 = var file_path = resolvepath(&amp;quot;Aircraft/SenecaII/some-file&amp;quot;);&lt;br /&gt;
if (file_path != &amp;quot;&amp;quot;){&lt;br /&gt;
    gui.popupTip(&amp;quot;some-file found&amp;quot;, 2);&lt;br /&gt;
} else {&lt;br /&gt;
    gui.popupTip(&amp;quot;some-file not found&amp;quot;, 2);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===setlistener()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;setlistener(node, code[, init[, type]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|private = _setlistener()&lt;br /&gt;
|source = {{flightgear file|src/Scripting/Nasal|l=499|t=Part 1}} {{!}} {{flightgear file|src/Scripting/Nasal|l=1350|t=Part 2}}&amp;lt;br&amp;gt;''Listener implemented using the {{API Link|flightgear|class|FGNasalListener}} class.''&lt;br /&gt;
|text = Creates a listener which will be triggered when the given property is changed (depending on the '''type'''). A unique integer ID is returned; this can later be used as the argument to {{func link|removelistener()}}.&lt;br /&gt;
{{note|Listeners are known to be a source of resource leaks. To avoid this, please take measures such as:&lt;br /&gt;
* Using {{func link|removelistener()}} when they are not needed any more.&lt;br /&gt;
* Using a single initialization listener.&lt;br /&gt;
* Avoiding tying listeners to properties that are rapidly updated (e.g., many times per frame).&lt;br /&gt;
}}&lt;br /&gt;
|param1 = node&lt;br /&gt;
|param1text = Mandatory string or &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to a property in the [[Property Tree]].&lt;br /&gt;
|param2 = code&lt;br /&gt;
|param2text = Mandatory callback function to execute when the listener is triggered. The function can take up to four arguments in the following order:&lt;br /&gt;
* '''changed''': a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to the changed node.&lt;br /&gt;
* '''listen''': a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to the listened-to node. Note that this argument maybe different depending on the '''type'''.&lt;br /&gt;
* '''mode''': an integer telling how the listener was triggered. 0 means that the value was changed. 1 means that a child property was added. -1 means that a child property was removed.&lt;br /&gt;
* '''is_child''': boolean telling whether '''changed''' is a child property of the listened-to '''node''' or not. 1 (true) if it is, 0 (false) otherwise.&lt;br /&gt;
|param3 = init&lt;br /&gt;
|param3text = If set to 1 (true), the listener will additionally be triggered when it is created. This argument is optional and defaults to 0 (false).&lt;br /&gt;
|param4 = type&lt;br /&gt;
|param4text = Integer specifying the listener's behavior. 0 means that the listener will only trigger when the property is changed. 1 means that the trigger will always be triggered when the property is written to. 2 will mean that the listener will be triggered even if child properties are modified. This argument is optional and defaults to 1.&lt;br /&gt;
|example1 = var prop = props.globals.initNode(&amp;quot;/sim/test&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;STRING&amp;quot;); # create property&lt;br /&gt;
var id = setlistener(&amp;quot;/sim/test&amp;quot;, func(n){ # create listener&lt;br /&gt;
    print(&amp;quot;Value: &amp;quot;, n.getValue());&lt;br /&gt;
});&lt;br /&gt;
setprop(&amp;quot;/sim/test&amp;quot;, &amp;quot;blah&amp;quot;); # trigger listener&lt;br /&gt;
removelistener(id); # remove listener&lt;br /&gt;
prop.remove(); # remove property&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===setprop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;setprop(path[, path[, ...]], value);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=385|t=Source}}&lt;br /&gt;
|text = Sets the value of a property in the [[Property Tree]]. If the property does not exist, it will be created. Returns 1 (true) on success or 0 (false) if there was an error.&lt;br /&gt;
{{note|If you want to remove a property, you will have to use one of the &amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; helpers:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
props.globals.getNode(&amp;quot;foo/bar&amp;quot;).remove(); # take out the complete node&lt;br /&gt;
props.globals.getNode(&amp;quot;foo&amp;quot;).removeChild(&amp;quot;bar&amp;quot;); # take out a certain child node&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = There needs to be at least one '''path''' argument, but there is no limit to the maximum amount that can be given. They will be concatenated together to form a property tree path. The arguments must be strings, but in FlightGear v3.2 onwards, there also is support (added by {{flightgear commit|34ed79}}) for numeric arguments as indices. See example 2 below.&lt;br /&gt;
|param2 = value&lt;br /&gt;
|param2text = Value to write to the given property. Must be either a string or a number.&lt;br /&gt;
|example1 = setprop(&amp;quot;/sim/demo&amp;quot;, &amp;quot;This is a demo&amp;quot;);&lt;br /&gt;
|example2text = Note that the example below will only work in FlightGear 3.2 and above.&lt;br /&gt;
|example2 = for(var i = 0; i &amp;lt; 3; i += 1){&lt;br /&gt;
    setprop(&amp;quot;/sim/demo&amp;quot;, i, &amp;quot;Demo #&amp;quot; ~ i));&lt;br /&gt;
}&lt;br /&gt;
|example3text = Same as above, but is supported by all versions of FlightGear.&lt;br /&gt;
|example3 = for(var i = 0; i &amp;lt; 3; i += 1){&lt;br /&gt;
    setprop(&amp;quot;/sim/demo[&amp;quot; ~ i ~ &amp;quot;]&amp;quot;, &amp;quot;Demo #&amp;quot; ~ i));&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
====See also====&lt;br /&gt;
{{note| If you have to read/write the same property multiple times (e.g. in an update loop), it is more efficient to use a node object: &lt;br /&gt;
To get a Node rather than its value, use &amp;lt;code&amp;gt;props.globals.getNode()&amp;lt;/code&amp;gt; - see [[Nasal_library/props]]. }}&lt;br /&gt;
&lt;br /&gt;
===settimer() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = settimer(function, delta[, realtime]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=499|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=1286|t=Part 2}}&lt;br /&gt;
|text = Runs the given function a specified amount of seconds after the current time. Returns &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{note|Improper use of &amp;lt;code&amp;gt;settimer()&amp;lt;/code&amp;gt; may cause resource leaks. It is also highly recommended that the newer {{func link|maketimer()}} should be used instead of this function.}} &lt;br /&gt;
|param1 = function&lt;br /&gt;
|param1text = Mandatory function that will be called. It may be necessary to enclose code in an anonymous function (see example).&lt;br /&gt;
|param2 = delta&lt;br /&gt;
|param2text = Mandatory amount of time in seconds after which the function will be called.&lt;br /&gt;
|param3 = realtime&lt;br /&gt;
|param3text = If 1 (true), &amp;quot;real time&amp;quot; will be used instead of &amp;quot;simulation time.&amp;quot; Defaults to 0 (false). Note that if &amp;quot;simulation time&amp;quot; is used, the timer will not run while FlightGear is paused.&lt;br /&gt;
|example1 = var myFunc = func(){&lt;br /&gt;
    print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
settimer(myFunc, 2); # runs myFunc after 2 seconds&lt;br /&gt;
|example2 = var sqr = func(a){&lt;br /&gt;
    return a * a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
settimer(func(){&lt;br /&gt;
    print(sqr(2)); # will print 4 after 2 seconds&lt;br /&gt;
}, 2);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===srand() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = srand();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=559|t=Source}}&lt;br /&gt;
|text = Makes the pseudorandom number generator (see {{func link|rand()}}) generate a new {{wikipedia|random seed|noicon=1}} based on time. Returns 0.&lt;br /&gt;
}}&lt;br /&gt;
===systime()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = systime();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=770|t=Source}}&lt;br /&gt;
|text = Returns the {{wikipedia|Unix time}} (seconds since since 00:00:00 UTC, 1/1/1970) as a floating point number with high resolution. This function is useful for benchmarking purposes (see example 2).&lt;br /&gt;
{{note|1=High resolution timers under Windows can produce inaccurate or fixed sub-millisecond results.&amp;lt;ref&amp;gt;{{cite web|url=http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=29259|title=Nasal: systime() ??!?|author=Necolatis|date=Apr 2nd, 2016}}&amp;lt;/ref&amp;gt; This is due to the underlying {{func link|GetSystemTimeAsFileTime()|link=https://msdn.microsoft.com/en-us/library/windows/desktop/ms724397(v=vs.85).aspx}} API call, which depends on hardware availability of suitable high resolution timers. See also [https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx Acquiring high-resolution time stamps]}}&lt;br /&gt;
|example1 = print(&amp;quot;Unix time: &amp;quot;, systime()); # prints Unix time&lt;br /&gt;
|example2 = var myFunc = func(){&lt;br /&gt;
    for(var i = 0; i &amp;lt;= 10; i += 1){&lt;br /&gt;
        print(&amp;quot;Interation #&amp;quot;, i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
var t = systime(); # record time&lt;br /&gt;
myFunc(); # run function&lt;br /&gt;
var t2 = systime(); # record new time&lt;br /&gt;
print(&amp;quot;myFunc() took &amp;quot;, t2 - t, &amp;quot; seconds&amp;quot;); # print result&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===thisfunc()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thisfunc();&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns the function from which this function is called. This allows a function to reliably and safely call itself from within a closure.&lt;br /&gt;
|example1 = var stringify_vec = func(input){&lt;br /&gt;
    if (typeof(input) == &amp;quot;scalar&amp;quot;){&lt;br /&gt;
        return sprintf(&amp;quot;%s&amp;quot;, input);&lt;br /&gt;
    } elsif (typeof(input) == &amp;quot;vector&amp;quot;) {&lt;br /&gt;
        if (size(input) == 0) return &amp;quot;[]&amp;quot;;&lt;br /&gt;
        var this = thisfunc();&lt;br /&gt;
        var buffer = &amp;quot;[&amp;quot;;&lt;br /&gt;
        for(var i = 0; i &amp;lt; size(input); i += 1){&lt;br /&gt;
            buffer ~= this(input[i]);&lt;br /&gt;
            if (i == size(input) - 1) {&lt;br /&gt;
                buffer ~= &amp;quot;]&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                buffer ~= &amp;quot;, &amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return buffer;&lt;br /&gt;
    } else {&lt;br /&gt;
        die(&amp;quot;stringify_vec(): Error! Invalid input. Must be a vector or scalar&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var test_vec = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, [1, 2, 3], &amp;quot;d&amp;quot;];&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # prints &amp;quot;[a, b, c, [1, 2, 3], d]&amp;quot;&lt;br /&gt;
test_vec = [];&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # prints &amp;quot;[]&amp;quot;&lt;br /&gt;
test_vec = {};&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # will throw an error&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===tileIndex() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = tileIndex();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1720|t=Source}}&lt;br /&gt;
|text = Returns the index of the tile at the aircraft's current position as a string. This corresponds to the name of the STG file of the tile. For example, at [[KSFO]], this would be &amp;lt;code&amp;gt;942050&amp;lt;/code&amp;gt;, corresponding to &amp;lt;tt&amp;gt;''[[$FG_SCENERY]]/Terrain/w130n30/w123n3/942050.stg''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example1 = print(tileIndex()); # print index&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== tilePath()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = tilePath();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1712|t=Source}}&lt;br /&gt;
|text = Returns the base path of the tile at the aircraft's current position as a string. For example, at KSFO, this would be &amp;lt;code&amp;gt;w130n30/w123n3&amp;lt;/code&amp;gt;, corresponding to &amp;lt;tt&amp;gt;''[[$FG_SCENERY]]/Terrain/w130n30/w123n3''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example1 = print(tilePath()); # print path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== values()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = values(hash);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the values of the given hash.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = Mandatory hash to get the values of.&lt;br /&gt;
|example1 = var hash = {&lt;br /&gt;
    &amp;quot;a&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;b&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;c&amp;quot;: 3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
foreach(var val; values(hash)){&lt;br /&gt;
    print(val);&lt;br /&gt;
}&lt;br /&gt;
|example2text = The below example does exactly the same thing as the above example, but does not use &amp;lt;code&amp;gt;values()&amp;lt;/code&amp;gt;:&lt;br /&gt;
|example2 = var hash = {&lt;br /&gt;
    &amp;quot;a&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;b&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;c&amp;quot;: 3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
foreach(var key; keys(hash)){&lt;br /&gt;
    print(hash[key]);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extension functions new in FG 2020.1 ==&lt;br /&gt;
The following functions have been added to the nasal core library and will be released with FlightGear version 2020.1. &lt;br /&gt;
Before the release they are available in the development branch &amp;quot;next&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===isfunc()===&lt;br /&gt;
Returns 1 if type or argument is a function, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===isghost()===&lt;br /&gt;
Returns 1 if type or argument is a ghost, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
=== ishash()===&lt;br /&gt;
Returns 1 if type or argument is a hash, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===isint()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isint(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if argument has a numeric value and x == floor(x), e.g. integer.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isnum()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isnum(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if typeof(x) is &amp;quot;scalar&amp;quot; and x has a numeric value otherwise 0. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isscalar()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isscalar(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if type or argument is a scalar (string or numeric), otherwise (vector, hash, func, ...) it returns 0. This is useful to check if a variable can be converted to string e.g. when useing the string concat operator &amp;quot;~&amp;quot;. &lt;br /&gt;
|example1 = var a = &amp;quot;foo&amp;quot;; &lt;br /&gt;
var b=42;&lt;br /&gt;
if (isscalar(a) and isscalar(b)) print(a~b);&lt;br /&gt;
if (isstr(a)) print(&amp;quot;a is a string&amp;quot;);&lt;br /&gt;
if (isint(b)) print(&amp;quot;b is an integer&amp;quot;);&lt;br /&gt;
# if (isscalar(a))... is equivalent to if (typeof(a) == &amp;quot;scalar&amp;quot;)...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isstr()===&lt;br /&gt;
Returns 1 if type or argument is a string, otherwise 0. &lt;br /&gt;
&lt;br /&gt;
===isvec()===&lt;br /&gt;
Returns 1 if type or argument is a vector, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===vecindex()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = vecindex(vector, value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns the index of value or nil, if value is not found in vector.&lt;br /&gt;
|example1=&lt;br /&gt;
var myvector = [&amp;quot;apple&amp;quot;, &amp;quot;bananna&amp;quot;, &amp;quot;coconut&amp;quot;];&lt;br /&gt;
# to check if a vector contains a certain value compare vecindex to nil&lt;br /&gt;
if (vecindex(myvector, &amp;quot;apple&amp;quot;) != nil) {&lt;br /&gt;
    print(&amp;quot;found apple&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
# WARNING: this will not work as desired because index is 0&lt;br /&gt;
if (vecindex(myvector, &amp;quot;apple&amp;quot;)) {&lt;br /&gt;
    print(&amp;quot;found apple&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extension functions new in &amp;quot;dev&amp;quot; version ==&lt;br /&gt;
The following functions have been added to the nasal core library curernty on &amp;quot;dev&amp;quot; version.&lt;br /&gt;
&lt;br /&gt;
===member()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = member(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=796|t=Source}}&lt;br /&gt;
|text = The function searches for a key in the given hash, including the &amp;lt;code&amp;gt;parents&amp;lt;/code&amp;gt;. If the key is found, its value is returned; otherwise, it returns &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash in which the key is searched.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = Key as a string whose value we want to return.&lt;br /&gt;
|example1 = &lt;br /&gt;
var Hash = {&lt;br /&gt;
    key: 12,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Hash, 'key');     # return 12&lt;br /&gt;
member(Hash, 'missing'); # return nil&lt;br /&gt;
|example2 = # member() also includes parents&lt;br /&gt;
&lt;br /&gt;
var Base = {&lt;br /&gt;
    key: 'text',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Child = {&lt;br /&gt;
    parents: [Base],&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Child, 'key');     # return 'text'&lt;br /&gt;
member(Child, 'missing'); # return nil&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===has_member()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = has_member(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=811|t=Source}}&lt;br /&gt;
|text = The function searches for a key in the given hash, including the &amp;lt;code&amp;gt;parents&amp;lt;/code&amp;gt;. If the key is found, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is returned, otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash in which the key is searched.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = Key as a string.&lt;br /&gt;
|example1 = &lt;br /&gt;
var Hash = {&lt;br /&gt;
    key: 12,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Hash, 'key');     # return true&lt;br /&gt;
member(Hash, 'missing'); # return false&lt;br /&gt;
|example2 = # has_member() also includes parents&lt;br /&gt;
&lt;br /&gt;
var Base = {&lt;br /&gt;
    key: 'text',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Child = {&lt;br /&gt;
    parents: [Base],&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Child, 'key');     # return true&lt;br /&gt;
member(Child, 'missing'); # return false&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
Various global constants (technically variables) are provided for use in converting between different units. They are all found in {{fgdata file|Nasal/globals.nas|text=$FG_ROOT/Nasal/globals.nas}}.&lt;br /&gt;
&lt;br /&gt;
===D2R===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var radians = degrees * D2R;&lt;br /&gt;
|text = Converts an angle from degrees to radians when multiplied by the angle in degrees. Equal to &amp;lt;code&amp;gt;π / 180&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
===FPS2KT===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var knots = feet_per_second * FPS2KT;&lt;br /&gt;
|text = Converts a velocity from feet per second to knots when multiplied by the velocity in feet per second. Approximately equal to 0.5925.&lt;br /&gt;
}}&lt;br /&gt;
===FT2M===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = feet * FT2M;&lt;br /&gt;
|text = Converts a length from feet to metres when multiplied by the length in feet. Equal to 0.3048.&lt;br /&gt;
}}&lt;br /&gt;
===GAL2L ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var litres = gallons * GAL2L;&lt;br /&gt;
|text = Converts a volume from US liquid gallons to litres when multiplied by the volume in gallons. Approximately equal to 3.7854.&lt;br /&gt;
}}&lt;br /&gt;
===IN2M===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = inches * IN2M;&lt;br /&gt;
|text = Converts a length from inches to metres when multiplied by the length in inches. Equal to 0.0254.&lt;br /&gt;
}}&lt;br /&gt;
===KG2LB===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var pounds = kilograms * KG2LB;&lt;br /&gt;
|text = Converts a mass from kilograms to pounds when multiplied by the mass in kilograms. Approximately equal to 2.2046.&lt;br /&gt;
}}&lt;br /&gt;
===KT2FPS===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var feet_per_second = knots * KT2FPS;&lt;br /&gt;
|text = Converts a velocity from knots to feet per second when multiplied by the velocity in knots. Approximately equal to 1.6878.&lt;br /&gt;
}}&lt;br /&gt;
===KT2MPS===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres_per_second = knots * KT2MPS;&lt;br /&gt;
|text = Converts a velocity from knots to metres per second when multiplied by the velocity in knots. Approximately equal to 0.5144.&lt;br /&gt;
}}&lt;br /&gt;
===L2GAL===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var gallons = litres * L2GAL;&lt;br /&gt;
|text = Converts a volume from litres to US liquid gallons when multiplied by the volume in litres. Approximately equal to 0.2642.&lt;br /&gt;
}}&lt;br /&gt;
===LB2KG===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var kilograms = pounds * LB2KG;&lt;br /&gt;
|text = Converts a mass from pounds to kilograms when multiplied by the mass in pounds. Approximately equal to 0.4536.&lt;br /&gt;
}}&lt;br /&gt;
===M2FT ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var feet = metres * M2FT;&lt;br /&gt;
|text = Converts a length from metres to feet when multiplied by the length in metres. Approximately equal to 3.2808.&lt;br /&gt;
}}&lt;br /&gt;
===M2IN===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var inches = metres * M2IN;&lt;br /&gt;
|text = Converts a length from metres to inches when multiplied by the length in metres. Approximately equal to 39.3701.&lt;br /&gt;
}}&lt;br /&gt;
===M2NM ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var nautical_miles = metres * M2NM;&lt;br /&gt;
|text = Converts a length from metres to nautical miles when multiplied by the length in metres. Approximately equal to 0.00054.&lt;br /&gt;
}}&lt;br /&gt;
===MPS2KT ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var knots = metres_per_second * MPS2KT;&lt;br /&gt;
|text = Converts a velocity from metres per second to knots when multiplied by the velocity in metres per second. Approximately equal to 1.9438.&lt;br /&gt;
}}&lt;br /&gt;
===NM2M ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = nautical_miles * NM2M;&lt;br /&gt;
|text = Converts a length from nautical miles to metres when multiplied by the length in nautical miles. Equal to 1,852.&lt;br /&gt;
}}&lt;br /&gt;
===R2D===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var degrees = radians * R2D;&lt;br /&gt;
|text = Converts an angle from radians to degrees when multiplied by the angle in radians. Equal to &amp;lt;code&amp;gt;180 / π&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library&amp;diff=143526</id>
		<title>Nasal library</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library&amp;diff=143526"/>
		<updated>2026-01-16T19:35:42Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page documents the global '''library functions and variables''' of FlightGear's built-in scripting language, [[Nasal]]. This includes ''[[#Core library functions|core library functions]]'', which were included in Nasal before its integration into FlightGear, the ''[[#Extension functions|extension functions]]'', which have been subsequently added, and are specifically designed for FlightGear, and the ''[[#variables|global variables]]'', which are conversion variables, added with extension functions, for converting between units. The relevant folders in [[Git]] are:&lt;br /&gt;
* {{flightgear file|src/Scripting}}&lt;br /&gt;
* {{simgear file|simgear/nasal}}&lt;br /&gt;
&lt;br /&gt;
All these functions and variables are in the global namespace, that is, they are directly accessible (e.g., one can call &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot; inline&amp;gt;magvar()&amp;lt;/syntaxhighlight&amp;gt; instead of &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot; inline&amp;gt;namespace.magvar()&amp;lt;/syntaxhighlight&amp;gt;). However, if a namespace must be used, &amp;lt;code&amp;gt;globals&amp;lt;/code&amp;gt; is the correct namespace, but using it is not recommended. For a more complete explanation, see [[Nasal Namespaces in-depth]].&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Core library functions ==&lt;br /&gt;
This is the list of the basic '''core library functions.''' Most of these functions were part of the original Nasal library (before its integration in to FlightGear), while some have been added or changed over time.  See also:&lt;br /&gt;
* http://plausible.org/nasal/lib.html ([http://web.archive.org/web/20101010094553/http://plausible.org/nasal/lib.html archive])&lt;br /&gt;
* {{simgear file|simgear/nasal/lib.c}} ([http://sourceforge.net/p/flightgear/simgear/ci/next/log/?path=/simgear/nasal/lib.c history])&lt;br /&gt;
&lt;br /&gt;
=== append() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = append(vector, element[, element[, ...]]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=45|t=Source}}&lt;br /&gt;
|text = This function appends, or adds, the given element(s) to the end of the vector given in the first argument.  Returns the vector operated on.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to which the arguments will be appended.&lt;br /&gt;
|param2 = element&lt;br /&gt;
|param2text = An element to be added to the vector.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector&lt;br /&gt;
append(vector, 4); # Append the number 4 to the end of the vector&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector&lt;br /&gt;
append(vector, 4, 5, 6); # Append the numbers 4, 5, and 6 to the end of the vector&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== bind() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = bind(function, locals[, outer_scope]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=638|t=Source}}&lt;br /&gt;
|text = This creates a new function object. A function in Nasal is three things: the actual code, a hash/namespace of local variables available to the function namespace, and the closure object of that namespace. These correspond to the three arguments respectively.&lt;br /&gt;
|param1 = function&lt;br /&gt;
|param1text = Function to evaluate.&lt;br /&gt;
|param2 = locals&lt;br /&gt;
|param2text = Hash containing values that will become the namespace (first closure) for the function.&lt;br /&gt;
|param3 = outer_scope&lt;br /&gt;
|param3text = Optional function which is bound to the next closure. This can be bound to yet another, making a linked list.&lt;br /&gt;
|example1 = # This is a namespace/hash with a single member, named &amp;quot;key,&amp;quot; which is initialized to 12 &lt;br /&gt;
var Namespace = {&lt;br /&gt;
    key: 12&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# This is different namespace/hash containing a function&lt;br /&gt;
# dividing a variable &amp;quot;key&amp;quot; (which is unavailable/nil in this namespace) by 2&lt;br /&gt;
var AnotherNamespace = {&lt;br /&gt;
    ret: func {&lt;br /&gt;
        key /= 2;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# To see that key is not available, try to call AnotherNamespace.ret() first&lt;br /&gt;
call(AnotherNamespace.ret, [], nil, nil, var errors = []);&lt;br /&gt;
if(size(errors)){&lt;br /&gt;
    print(&amp;quot;Key could not be divided/resolved!&amp;quot;);&lt;br /&gt;
    debug.printerror(errors);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Associate the AnotherNamespace.ret() function with the first namespace&lt;br /&gt;
# so that &amp;quot;key&amp;quot; is now available&lt;br /&gt;
var function = bind(AnotherNamespace.ret, Namespace);&lt;br /&gt;
&lt;br /&gt;
# Invoke the new function&lt;br /&gt;
function();&lt;br /&gt;
&lt;br /&gt;
# Print out the value of Namespace.key&lt;br /&gt;
# It was changed to 12 from 6 by AnotherNamespace.ret()&lt;br /&gt;
print(Namespace.key);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== call() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = call(func[, args[, me[, locals[, error]]]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=376|t=Source}}&lt;br /&gt;
|text = Calls the given function with the given arguments and returns the result.  This function is very useful as it allows much more control over function calls and catches any errors or {{func link|die()}} calls that would normally trigger run-time errors cancelling execution of the script otherwise. &lt;br /&gt;
|param1 = func&lt;br /&gt;
|param1text = Function to execute.&lt;br /&gt;
|param2 = args&lt;br /&gt;
|param2text = Vector containing arguments to give to the called function.&lt;br /&gt;
|param3 = me&lt;br /&gt;
|param3text = &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; reference for the function call (i.e., for method calls). If given, this will override any &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; value existing in the namespace (locals argument).&lt;br /&gt;
|param4 = locals&lt;br /&gt;
|param4text = A hash with key/value pairs that will be available to the called function, typically used as the namespace for the function to be called.&lt;br /&gt;
|param5 = error&lt;br /&gt;
|param5text = A vector to append errors to.  If the called function generates an error, the error, place, and line will be written to this.  These errors can be printed using {{func link|printerror()|debug}}.&lt;br /&gt;
|example1 =&lt;br /&gt;
# prints &amp;quot;Called from call()&amp;quot;&lt;br /&gt;
call(func {&lt;br /&gt;
    print(&amp;quot;Called from call()&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
|example2 =&lt;br /&gt;
# prints &amp;quot;a = 1 : b = 2&lt;br /&gt;
call(func(a, b){&lt;br /&gt;
        print(&amp;quot;a = &amp;quot;, a, &amp;quot; : b = &amp;quot;, b);&lt;br /&gt;
    },&lt;br /&gt;
    [1, 2]&lt;br /&gt;
);&lt;br /&gt;
|example3 =&lt;br /&gt;
var Hash = {&lt;br /&gt;
    new: func {&lt;br /&gt;
        var m = { parents: [Hash] };&lt;br /&gt;
&lt;br /&gt;
        m.el1 = &amp;quot;string1&amp;quot;;&lt;br /&gt;
        m.el2 = &amp;quot;string2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        return m;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
# prints &amp;quot;me.el1 = string1&amp;quot;, then &amp;quot;me.el2 = string2&amp;quot; on the next line&lt;br /&gt;
call(func(a, b){        &lt;br /&gt;
        print(&amp;quot;me.el&amp;quot;, a, &amp;quot; = &amp;quot;, me[&amp;quot;el&amp;quot; ~ a]);      &lt;br /&gt;
        print(&amp;quot;me.el&amp;quot;, b, &amp;quot; = &amp;quot;, me[&amp;quot;el&amp;quot; ~ b]);&lt;br /&gt;
    },&lt;br /&gt;
    [1, 2],&lt;br /&gt;
    Hash.new()&lt;br /&gt;
);&lt;br /&gt;
|example4 =&lt;br /&gt;
# prints the value of math.pi&lt;br /&gt;
call(func {&lt;br /&gt;
        print(pi);&lt;br /&gt;
    }, nil, nil, &lt;br /&gt;
    math&lt;br /&gt;
);&lt;br /&gt;
|example5 =&lt;br /&gt;
call(func {&lt;br /&gt;
        print(math.ip); # math.ip doesn't exist&lt;br /&gt;
    }, nil, nil, nil,&lt;br /&gt;
    var errs = []&lt;br /&gt;
);&lt;br /&gt;
debug.printerror(errs); # The error is caught and printed using debug.printerror()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== caller() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = caller([level]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=540|t=Source}}&lt;br /&gt;
|text = Returns a vector containing a record from the current call stack.  The level numbering starts from the currently executing function (level 0).  Level 1 (the default) is the caller of the current function, and so on.&lt;br /&gt;
&lt;br /&gt;
The result is a four-element vector containing '''[0]''' a hash of local variables, '''[1]''' the function object, '''[2]''' the full source file name (incl. path) and '''[3]''' the line number. &lt;br /&gt;
|param1 = level&lt;br /&gt;
|param1text = Optional integer specifying the stack level to return a result from.  Defaults to 1 (i.e. the caller of the currently executing function).&lt;br /&gt;
|example1 =&lt;br /&gt;
var myFunction = func(a, b) {&lt;br /&gt;
    debug.dump(caller(0)[0]); # prints a hash of local variables, including arguments a and b&lt;br /&gt;
    return 2 * 2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;2 x 2 = &amp;quot;, myFunction(2, 2));&lt;br /&gt;
|example2 =&lt;br /&gt;
var get_arg_value = func() {&lt;br /&gt;
    print(&amp;quot;Argument to myFunc = &amp;quot;, caller(1)[0]['a']); # print the value of myFunc's single argument, using caller()&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var myFunc = func(a) {&lt;br /&gt;
    get_arg_value();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
myFunc(3);&lt;br /&gt;
|example3text = This is a real example taken from {{fgdata file|Nasal/canvas/MapStructure.nas}}.  Function &amp;lt;code&amp;gt;r()&amp;lt;/code&amp;gt; (above the TODOs) returns a hash with the key/value pairs as per its arguments. For example, something like this is returned: &amp;lt;code&amp;gt;{ name: &amp;quot;&amp;lt;name&amp;gt;&amp;quot;, vis: true, zindex: nil }&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example3 =&lt;br /&gt;
var MapStructure_selfTest = func() {&lt;br /&gt;
    var temp = {};&lt;br /&gt;
    temp.dlg = canvas.Window.new([600, 400], &amp;quot;dialog&amp;quot;);&lt;br /&gt;
    temp.canvas = temp.dlg.createCanvas().setColorBackground(1, 1, 1, 0.5);&lt;br /&gt;
    temp.root = temp.canvas.createGroup();&lt;br /&gt;
&lt;br /&gt;
    var testMap = temp.root.createChild(&amp;quot;map&amp;quot;);&lt;br /&gt;
    testMap.setController(&amp;quot;Aircraft position&amp;quot;);&lt;br /&gt;
    testMap.setRange(25); # TODO: implement zooming/panning via mouse/wheel here, for lack of buttons :-/&lt;br /&gt;
    testMap.setTranslation(&lt;br /&gt;
        temp.canvas.get(&amp;quot;view[0]&amp;quot;) / 2,&lt;br /&gt;
        temp.canvas.get(&amp;quot;view[1]&amp;quot;) / 2,&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    var r = func(name, vis = true, zindex = nil) {&lt;br /&gt;
        return caller(0)[0];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # TODO: we'll need some z-indexing here, right now it's just random&lt;br /&gt;
    # TODO: use foreach/keys to show all layers in this case by traversing SymbolLayer.registry directly ?&lt;br /&gt;
    # maybe encode implicit z-indexing for each lcontroller ctor call ? - i.e. preferred above/below order ?&lt;br /&gt;
    var types = [&lt;br /&gt;
        r('TFC', false),&lt;br /&gt;
        r('APT'),&lt;br /&gt;
        r('DME'),&lt;br /&gt;
        r('VOR'),&lt;br /&gt;
        r('NDB'),&lt;br /&gt;
        r('FIX', false),&lt;br /&gt;
        r('RTE'),&lt;br /&gt;
        r('WPT'),&lt;br /&gt;
        r('FLT'),&lt;br /&gt;
        r('WXR'),&lt;br /&gt;
        r('APS'),&lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    foreach (var type; types) {&lt;br /&gt;
        testMap.addLayer(&lt;br /&gt;
            factory: canvas.SymbolLayer,&lt;br /&gt;
            type_arg: type.name,&lt;br /&gt;
            visible: type.vis,&lt;br /&gt;
            priority: type.zindex,&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}; # MapStructure_selfTest&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== chr() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = chr(code);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=240|t=Source}}&lt;br /&gt;
|text = Returns a character as per the single argument. Extended ASCII is supported (see http://www.asciitable.com/ for a list of supported characters), although this may vary between different systems.  For a list of the most commonly used characters, see the {{wikipedia|ASCII#ASCII printable code chart|ASCII printable code chart}} ('''Dec''' column). The following table lists supported control characters, along with their equivalent control characters in Nasal strings.  {{Note|In Nasal, only strings enclosed with double-quotes (&amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;) supports control chracters.  Strings in single quotes (&amp;lt;code&amp;gt;'string'&amp;lt;/code&amp;gt;) do not.}}&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Name !! Equivalent to&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 10 {{!!}} {{Wikipedia|Newline}} {{!!}} &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 9 {{!!}} {{Wikipedia|Tab key#Tab characters|Horizontal tab}} {{!!}} &amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 13 {{!!}} {{Wikipedia|Carriage return}} {{!!}} &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param1 = code&lt;br /&gt;
|param1text = Integer character code for the desired glyph.&lt;br /&gt;
|example1 = print(&amp;quot;Code 65 = &amp;quot;, chr(65)); # prints &amp;quot;Code 65 = A&amp;quot;&lt;br /&gt;
|example2text = This example displays all of the characters in a list, in the format &amp;lt;code&amp;gt;Code '''n''' = &amp;gt;'''char'''&amp;lt;&amp;lt;/code&amp;gt;, '''n''' being the index, and '''char''' being the character.&lt;br /&gt;
|example2 =&lt;br /&gt;
for(var i = 0; i &amp;lt;= 255; i += 1){&lt;br /&gt;
    print(&amp;quot;Code &amp;quot;, i, &amp;quot; = &amp;gt;&amp;quot;, chr(i), &amp;quot;&amp;lt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== closure() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = closure(func[, level]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=557|t=Source}}&lt;br /&gt;
|text = Returns the hash table containing the lexical namespace of the given function. The level numbering start with level 0 being the namespace of '''func'''. &lt;br /&gt;
|param1 = func&lt;br /&gt;
|param1text = Function to evaluate.&lt;br /&gt;
|param2 = level&lt;br /&gt;
|param2text = Optional integer specifying the scope level.  Defaults to 0 (the namespace of '''func''').&lt;br /&gt;
|example1 =&lt;br /&gt;
var get_math_e = func {&lt;br /&gt;
    return e; # return the value of math.e&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var myFunction = bind(get_math_e, math); # bind get_math_e to the math namespace, so that math.e is immediately available to get_math_e&lt;br /&gt;
debug.dump(closure(myFunction)); # print the hash of the namespace &amp;quot;get_math_e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
print(myFunction());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== cmp() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = cmp(a, b);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=169|t=Source}}&lt;br /&gt;
|text = Compares two strings, returning -1 if '''a''' is less than '''b''', 0 if they are identical and 1 if '''a''' is greater than '''b'''. &lt;br /&gt;
|param1 = a&lt;br /&gt;
|param1text = First string argument for comparison.&lt;br /&gt;
|param2 = b&lt;br /&gt;
|param2text = Second string argument for comparison.&lt;br /&gt;
|example1 = print(cmp(&amp;quot;1&amp;quot;, &amp;quot;two&amp;quot;)); # prints -1&lt;br /&gt;
|example2 = print(cmp(&amp;quot;string&amp;quot;, &amp;quot;string&amp;quot;)); # prints 0&lt;br /&gt;
|example3 = print(cmp(&amp;quot;one&amp;quot;, &amp;quot;2&amp;quot;)); # prints 1&lt;br /&gt;
|example4 = print(cmp(&amp;quot;string1&amp;quot;, &amp;quot;string2&amp;quot;)); # prints -1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== compile() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = compile(code[, filename]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=349|t=Source}}&lt;br /&gt;
|text = Compiles the specified code string and returns a function object bound to the current lexical context.  If there is an error, the function dies, with the argument to {{func link|die()}} being '''filename'''.&lt;br /&gt;
|param1 = code&lt;br /&gt;
|param1text = String containing Nasal code to be compiled.&lt;br /&gt;
|param2 = filename&lt;br /&gt;
|param2text = Optional string used for error messages/logging. Defaults to &amp;lt;code&amp;gt;&amp;lt;compile&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|example1 = &lt;br /&gt;
var myCode = 'print(&amp;quot;hello&amp;quot;);';&lt;br /&gt;
var helloFunc = compile(myCode, &amp;quot;myCode&amp;quot;);&lt;br /&gt;
helloFunc();&lt;br /&gt;
|example2text = &amp;lt;code&amp;gt;compile&amp;lt;/code&amp;gt; is very convenient to support Nasal loaded from other files.  For instance, [[PropertyList XML files]] (such as GUI dialogs) may contain embedded Nasal sections that need to be parsed, processed and compiled.  For an example of how to do this, save the below XML code as &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/gui/dialogs/test.xml''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
print(&amp;quot;You have FlightGear v&amp;quot;, getprop(&amp;quot;/sim/version/flightgear&amp;quot;));&lt;br /&gt;
]]&amp;gt;&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, start FlightGear and execute this code in the [[Nasal Console]].&lt;br /&gt;
|example2 =&lt;br /&gt;
# Build the path&lt;br /&gt;
var FGRoot = getprop(&amp;quot;/sim/fg-root&amp;quot;);&lt;br /&gt;
var filename = &amp;quot;/gui/dialogs/test.xml&amp;quot;;&lt;br /&gt;
var path = FGRoot ~ filename;&lt;br /&gt;
&lt;br /&gt;
var blob = io.read_properties(path);&lt;br /&gt;
var script = blob.getValues().nasal; # Get the nasal string&lt;br /&gt;
&lt;br /&gt;
# Compile the script.  We're passing the filename here for better runtime diagnostics &lt;br /&gt;
var code = call(func {&lt;br /&gt;
    compile(script, filename);&lt;br /&gt;
}, nil, nil, var compilation_errors = []);&lt;br /&gt;
&lt;br /&gt;
if(size(compilation_errors)){&lt;br /&gt;
    die(&amp;quot;Error compiling code in: &amp;quot; ~ filename);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Invoke the compiled script, equivalent to code(); &lt;br /&gt;
# We're using call() here to detect errors:&lt;br /&gt;
call(code, [], nil, nil, var runtime_errors = []);&lt;br /&gt;
&lt;br /&gt;
if(size(runtime_errors)){&lt;br /&gt;
    die(&amp;quot;Error calling code compiled loaded from: &amp;quot; ~ filename);&lt;br /&gt;
}&lt;br /&gt;
|example3text = The &amp;lt;code&amp;gt;compile()&amp;lt;/code&amp;gt; function also allows you to parse a JSON string into a hash. Simplest example:&lt;br /&gt;
|example3 =&lt;br /&gt;
var jsonFunc = compile('{&amp;quot;version&amp;quot;:&amp;quot;1.2.0&amp;quot;,&amp;quot;author&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;John&amp;quot;} }');&lt;br /&gt;
var json = jsonFunc(); # return hash&lt;br /&gt;
logprint(LOG_ALERT, json[&amp;quot;version&amp;quot;]); # print &amp;quot;1.2.0&amp;quot;&lt;br /&gt;
logprint(LOG_ALERT, json[&amp;quot;author&amp;quot;][&amp;quot;name&amp;quot;]); # print &amp;quot;John&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== contains() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = contains(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=249|t=Source}}&lt;br /&gt;
|text = Returns 1 (True) if the hash contains the specified key, or 0 (False) if not.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash to search in.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = The scalar to be searched for, contained as a key in the hash.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize a hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element: &amp;quot;value&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
print(contains(hash, &amp;quot;element&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;Yes&amp;quot;&lt;br /&gt;
print(contains(hash, &amp;quot;element2&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;No&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===contains()===&lt;br /&gt;
{{Requires commit|desc=Vector support|details=see {{Merge-request|project=fgdata|id=305}}|commit=ee39abbd3b70c9b6d5e3a1c4ccedddaac1a92b11|repo=Simgear}}&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = contains(vector, item);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=249|t=Source}}&lt;br /&gt;
|text = Returns 1 (True) if the vector contains the specified item, or 0 (False) if not.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to search in.&lt;br /&gt;
|param2 = item&lt;br /&gt;
|param2text = The object to be searched for in the vector.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize a vector&lt;br /&gt;
var vec = [&amp;quot;element&amp;quot;, &amp;quot;foo&amp;quot;];&lt;br /&gt;
print(contains(vec, &amp;quot;element&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;Yes&amp;quot;&lt;br /&gt;
print(contains(vec, &amp;quot;element2&amp;quot;) ? &amp;quot;Yes&amp;quot; : &amp;quot;No&amp;quot;); # This will print &amp;quot;No&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===delete() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = delete(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=118|t=Source}}&lt;br /&gt;
|text = Deletes the key from the hash if it exists. Operationally, this is NOT identical to setting the hash value specified by the key to &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; as the key will stay in the hash (at least for a while). This variant potentially frees storage by deleting the reference to the key and by shrinking the hash.  Returns the hash that has been operated on.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash from which to delete the key.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = The scalar to be deleted, contained as a key in the hash.&lt;br /&gt;
|example1 =&lt;br /&gt;
# Initialize the hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value1&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value2&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
delete(hash, &amp;quot;element1&amp;quot;); # Delete element1&lt;br /&gt;
debug.dump(hash); # prints the hash, which is now minus element1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===die()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = die(error);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=417|t=Source}}&lt;br /&gt;
|text = Terminates execution and unwinds the stack.  The place and the line will be added to the '''error'''.  This invokes the same internal exception handler used for internal runtime errors. Use this to signal fatal errors, or to implement exception handling. The error thrown (including internal runtime errors) can be caught with {{func link|call()}}.&lt;br /&gt;
|param1 = error&lt;br /&gt;
|param1text = String describing the error.&lt;br /&gt;
:{{inote|This parameter is technically optional, but it is highly recommended to use it.}}&lt;br /&gt;
|example1 = &lt;br /&gt;
print(&amp;quot;Will print&amp;quot;);&lt;br /&gt;
die(&amp;quot;Don't go any further!&amp;quot;); &lt;br /&gt;
print(&amp;quot;Won't print&amp;quot;); # Will not be printed because die() stops the process&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== find()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = find(needle, haystack);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=586|t=Source}}&lt;br /&gt;
|text = Finds and returns the index of the first occurrence of the string '''needle''' in the string '''haystack''', or -1 if no such occurrence was found.&lt;br /&gt;
|param1 = needle&lt;br /&gt;
|param1text = String to search for.&lt;br /&gt;
|param2 = haystack&lt;br /&gt;
|param2text = String to search in.&lt;br /&gt;
|example1 = print(find(&amp;quot;c&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints 2&lt;br /&gt;
|example2 = print(find(&amp;quot;x&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints -1&lt;br /&gt;
|example3 = print(find(&amp;quot;cd&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints 2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===ghosttype()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = ghosttype(ghost);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=336|t=Source}}&lt;br /&gt;
|text = Returns a string containing either a descriptive name of a ghost (a raw C/C++ object), or a unique id (the pointer to the C/C++ &amp;lt;code&amp;gt;naGhostType&amp;lt;/code&amp;gt; instance) if no name has been set.  Ghost is an acronym that stands for '''G'''arbage-collected '''H'''andle to '''O'''ut'''S'''ide '''T'''hingy.&lt;br /&gt;
|param1 = ghost&lt;br /&gt;
|param1text = Ghost to return a description for.&lt;br /&gt;
|example1 = print(ghosttype(airportinfo())); # prints &amp;quot;airport&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===id()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = id(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=706|t=Source}}&lt;br /&gt;
|text = Returns a string containing information on the type and ID of the object provided in the single argument.  The information is returned in the form of &amp;lt;code&amp;gt;'''&amp;lt;type&amp;gt;''':'''&amp;lt;id&amp;gt;'''&amp;lt;/code&amp;gt;, where '''&amp;lt;type&amp;gt;''' is the type of object, and '''&amp;lt;id&amp;gt;''' is the ID.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Can be either of a string, a vector, a hash, a code, a function, or a ghost.&lt;br /&gt;
|example1 = print(id(&amp;quot;A&amp;quot;)); # prints &amp;quot;str:000000001624A590&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===int() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = int(number);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=125|t=Source}}&lt;br /&gt;
|text = Returns the integer part of the numeric value of the single argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if none exists.&lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = Number or string with just a number in it to return an integer from.&lt;br /&gt;
|example1 = print(int(23)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example2 = print(int(23.123)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example3 = debug.dump(int(&amp;quot;string&amp;quot;)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===keys()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = keys(hash);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=36|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the list of keys found in the single hash argument. &lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash to return the keys from.&lt;br /&gt;
|example1 = &lt;br /&gt;
# Initialize a hash&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
debug.dump(keys(hash)); # print the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===left()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = left(string, length);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=214|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{simgear commit|bd7163|t=commit}}&lt;br /&gt;
|text = Returns a substring of '''string''', starting from the left.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return part of.&lt;br /&gt;
|param2 = length&lt;br /&gt;
|param2text = Integer specifying the length of the substring to return.&lt;br /&gt;
|example1 = print(left(&amp;quot;string&amp;quot;, 2)); # prints &amp;quot;st&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== num()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = num(number);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=149|t=Source}}&lt;br /&gt;
|text = Returns the numerical value of the single string argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if none exists. &lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = String with just a number in it to return a number from.&lt;br /&gt;
|example1 = print(num(&amp;quot;23&amp;quot;)); # prints &amp;quot;23&amp;quot;&lt;br /&gt;
|example2 = print(num(&amp;quot;23.123&amp;quot;)); # prints &amp;quot;23.123&amp;quot;&lt;br /&gt;
|example3 = debug.dump(num(&amp;quot;string&amp;quot;)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===pop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = pop(vector);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=85|t=Source}}&lt;br /&gt;
|text = Removes and returns the last element of the single vector argument, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the vector is empty. &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = Vector to remove an element from.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
pop(vector);&lt;br /&gt;
debug.dump(vector); # prints &amp;quot;[1, 2]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(pop(vector)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var vector = [];&lt;br /&gt;
debug.dump(pop(vector)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== range() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = range([start, ]stop[, step]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=756|t=Source}}&lt;br /&gt;
|text = Creates a vector of numbers starting from &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; (default 0) up to but not including &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, incremented by &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; (default 1). Note: To specify &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;, you must also provide &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;; otherwise the second argument is interpreted as &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = start&lt;br /&gt;
|param1text = Optional. The starting number of the sequence. Defaults to 0 if omitted. Required if you want to specify &amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = stop&lt;br /&gt;
|param2text = Required. The number at which to stop the sequence (not included).&lt;br /&gt;
|param3 = step&lt;br /&gt;
|param3text = Optional. The increment between each number in the sequence. Defaults to 1. Only valid if &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is also specified.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vec = range(5);        # Creates a vector [0, 1, 2, 3, 4]&lt;br /&gt;
var vec = range(2, 5);     # Creates a vector [2, 3, 4]&lt;br /&gt;
var vec = range(0, 10, 2); # Creates a vector [0, 2, 4, 6, 8]&lt;br /&gt;
var vec = range(0, 0);     # Creates an empty vector []&lt;br /&gt;
var vec = range(0, 1);     # Creates a vector [0]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== remove() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = remove(vector, value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=53|t=Source}}&lt;br /&gt;
|text = Removes all elements equal to the given value from a vector and returns the modified vector.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector from which elements are to be removed.&lt;br /&gt;
|param2 = value&lt;br /&gt;
|param2text = A value to remove from the vector.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector.&lt;br /&gt;
remove(vector, 2); # Remove the value 2 from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[1, 3]&amp;quot;.&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [&amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;]; # Initialize the vector.&lt;br /&gt;
remove(vector, &amp;quot;text&amp;quot;); # Remove the value &amp;quot;text&amp;quot; from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[]&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== removeat() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removeat(vector, index);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=72|t=Source}}&lt;br /&gt;
|text = Removes the element at the specified index from the vector and returns it.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector from which the element will be removed.&lt;br /&gt;
|param2 = index&lt;br /&gt;
|param2text = Index of the item to be deleted.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize the vector.&lt;br /&gt;
removeat(vector, 0); # Remove the index 0 from the vector.&lt;br /&gt;
debug.dump(vector); # Print the contents of the vector: &amp;quot;[2, 3]&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===right()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = right(string, length);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=226|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{simgear commit|bd7163|t=commit}}&lt;br /&gt;
|text = Returns a substring of '''string''', starting from the right.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return part of.&lt;br /&gt;
|param2 = length&lt;br /&gt;
|param2text = Integer specifying the length of the substring to return.&lt;br /&gt;
|example1 = print(right(&amp;quot;string&amp;quot;, 2)); # prints &amp;quot;ng&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setsize()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = setsize(vector, size);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=91|t=Source}}&lt;br /&gt;
|text = Sets the size of a vector. The first argument specifies a vector, the second a number representing the desired size of that vector. If the vector is currently larger than the specified size, it is truncated. If it is smaller, it is padded with &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; entries. Returns the vector operated upon. &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to be operated on.&lt;br /&gt;
|param2 = size&lt;br /&gt;
|param2text = The desired size of the vector in number of entries.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize a vector&lt;br /&gt;
setsize(vector, 4);&lt;br /&gt;
debug.dump(vector); # print the vector &amp;quot;[1, 2, 3, nil]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3]; # Initialize a vector&lt;br /&gt;
setsize(vector, 2);&lt;br /&gt;
debug.dump(vector); # print the vector &amp;quot;[1, 2]&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===size()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = size(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=26|t=Source}}&lt;br /&gt;
|text = Returns the size of the single argument. For strings, this is the length in bytes. For vectors, this is the number of elements. For hashes, it is the number of key/value pairs. If the argument is &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; or a number, this error will be thrown: &amp;lt;code&amp;gt;object has no size()&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to find the size of.  Must be a string, a vector or a hash.&lt;br /&gt;
|example1 = &lt;br /&gt;
var string = &amp;quot;string&amp;quot;;&lt;br /&gt;
print(size(string)); # prints &amp;quot;6&amp;quot;&lt;br /&gt;
|example2 =&lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
print(size(vector)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
|example3 =&lt;br /&gt;
var hash = {&lt;br /&gt;
    element1: &amp;quot;value1&amp;quot;,&lt;br /&gt;
    element2: &amp;quot;value2&amp;quot;,&lt;br /&gt;
    element3: &amp;quot;value3&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
print(size(hash)); # prints &amp;quot;3&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== sort()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = sort(vector, function);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=678|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the elements in the input '''vector''' sorted in according to the rule given by '''function'''. Implemented with the ANSI C {{func link|qsort()|link=http://www.cplusplus.com/reference/cstdlib/qsort/}}, &amp;lt;code&amp;gt;sort()&amp;lt;/code&amp;gt; is stable.  This means that if the rules in the first example are used, equal elements in the output vector will appear in the same relative order as they do in the input.  It is run in a loop, so '''function''' is run several times.&lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = Input vector to sort.&lt;br /&gt;
|param2 = function&lt;br /&gt;
|param2text = Function according to which the elements will be sorted by.  It should take two arguments and should return one of 1, 0, or -1.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Return value !! Meaning&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} less than 0 {{!!}} first argument should go before second argument&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0 {{!!}} first argument equals second argument&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} greater than 0 {{!!}} first argument should go after second argument&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
|example1text = This example sorts elements from smallest to greatest.&lt;br /&gt;
|example1 = &lt;br /&gt;
var sort_rules = func(a, b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return -1; # A should before b in the returned vector&lt;br /&gt;
    } elsif (a == b) {&lt;br /&gt;
        return 0; # A is equivalent to b &lt;br /&gt;
    } else {&lt;br /&gt;
        return 1; # A should after b in the returned vector&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
debug.dump(sort([3, 2, 5, 6, 4, 1], sort_rules)); # prints &amp;quot;[1, 2, 3, 4, 5, 6]&amp;quot;&lt;br /&gt;
|example2text = This example sorts elements from greatest to smallest.&lt;br /&gt;
|example2 = &lt;br /&gt;
# Outputs the elements in reverse order (greatest to smallest)&lt;br /&gt;
var sort_rules = func(a, b) {&lt;br /&gt;
    if (a &amp;lt; b) {&lt;br /&gt;
        return 1; # -1 in the above example&lt;br /&gt;
    } elsif (a == b) {&lt;br /&gt;
        return 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        return -1; # 1 in the above example&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
debug.dump(sort([3, 2, 5, 6, 4, 1], sort_rules)); # prints &amp;quot;[6, 5, 4, 3, 2, 1]&amp;quot;&lt;br /&gt;
|example3text = This example sorts a vector of strings (runways for example) from smallest to greatest.&lt;br /&gt;
|example3 = &lt;br /&gt;
var runways = [&amp;quot;09R&amp;quot;, &amp;quot;27R&amp;quot;, &amp;quot;26L&amp;quot;, &amp;quot;09L&amp;quot;, &amp;quot;15&amp;quot;];&lt;br /&gt;
var rwy = sort(runways, func(a, b) cmp(a, b));&lt;br /&gt;
debug.dump(rwy); # prints ['09L', '09R', '15', '26L', '27R']&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== split()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = split(delimiter, string);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=596|t=Source}}&lt;br /&gt;
|text = Splits the input string into a vector of substrings bounded by occurrences of the delimiter substring. See [[Nasal_library/string#string.join(sep,list)|string.join()]].&lt;br /&gt;
|param1 = delimiter&lt;br /&gt;
|param1text = String that will split the substrings in the returned vector.&lt;br /&gt;
|param2 = string&lt;br /&gt;
|param2text = String to split up.&lt;br /&gt;
|example1 = debug.dump(split(&amp;quot;cd&amp;quot;, &amp;quot;abcdef&amp;quot;)); # prints &amp;quot;['ab', 'ef']&amp;quot;&lt;br /&gt;
|example2 = debug.dump(split(&amp;quot;.&amp;quot;, &amp;quot;3.2.0&amp;quot;)); # prints &amp;quot;[3, 2, 0]&amp;quot;&lt;br /&gt;
|example3 = debug.dump(split(&amp;quot;/&amp;quot;, &amp;quot;path/to/file&amp;quot;)); # prints &amp;quot;['path', 'to', 'file']&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===sprintf()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;sprintf(format[, arg[, arg, [...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=491|t=Source}}&lt;br /&gt;
|text = Creates and returns a string formatted using ANSI C {{func link|vsnprintf()|link=http://en.cppreference.com/w/c/io/vfprintf}} &amp;lt;ref&amp;gt;&lt;br /&gt;
{{Cite web&lt;br /&gt;
|url = http://sourceforge.net/p/flightgear/simgear/ci/next/tree/simgear/nasal/lib.c#l308&lt;br /&gt;
|title = fgdata/simgear/simgear/nasal/lib.c, line 308&lt;br /&gt;
|accessdate = October 2015&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;.  Below is a table of supported format specifiers.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot; width=&amp;quot;75%&amp;quot;&lt;br /&gt;
{{!}}+ %[flags][width][.precision]specifier&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Flags&lt;br /&gt;
{{!-}}&lt;br /&gt;
! Flag !! Output&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; {{!!}} Forces to precede the result with a plus or minus sign ('''+''' or '''-''') even for positive numbers. By default, only negative numbers are preceded with a '''-''' sign.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} ''space'' {{!!}} Prefixes non-signed numbers with a space.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; {{!!}} Left-align the output of this placeholder (the default is to right-align the output) when the width option is specified.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; {{!!}} Use 0 instead of spaces to pad a field when the width option is specified.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; {{!!}} Used with &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; specifiers the value is preceded with &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;0x&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;0X&amp;lt;/tt&amp;gt; respectively for values different than zero. Used with &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written. Used with &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; the result is the same as with &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; but trailing zeros are not removed.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Width&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot; {{!}} Integer specifying the minimum number of characters to be returned. This includes the decimal point and decimal fraction as well as + or - signs.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Precision&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot; {{!}} Integer preceded by a dot specifying the number of decimal places to be written.&lt;br /&gt;
{{!-}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Specifiers&lt;br /&gt;
{{!-}}&lt;br /&gt;
! Specifier !! Output&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; {{!!}} Signed decimal number.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; {{!!}} A string&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; {{!!}} Percent (%) character.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; {{!!}} A single character assigned to a character code, the code given in an integer argument.  See http://www.asciitable.com/ for a list of supported characters and their codes.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; {{!!}} Unsigned integer as an octal number.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; {{!!}} Unsigned decimal integer.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; {{!!}} Unsigned integer as a hexadecimal number.  If &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is used, any letters in the number are lowercase, while &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; gives uppercase.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; {{!!}} Double value in scientific notation (i.e., ''[-]ddd.ddd'''e'''[+/-]ddd''), with an exponent being denoted by &amp;lt;tt&amp;gt;e&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;E&amp;lt;/tt&amp;gt; depending on whether an upper or lowercase is used respectively.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; {{!!}} Floating-point number, in fixed decimal notation, by default with 6 decimal places.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; {{!!}} Appears to be available&amp;lt;ref&amp;gt;&lt;br /&gt;
{{Cite web&lt;br /&gt;
|url = http://sourceforge.net/p/flightgear/simgear/ci/next/tree/simgear/nasal/lib.c#l389&lt;br /&gt;
|title = fgdata/simgear/simgear/nasal/lib.c, line 389&lt;br /&gt;
|accessdate = October 2015&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;, but doesn't work.&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; {{!!}} Double in either normal or exponential notation, whichever is more appropriate for its magnitude. &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; uses lower-case letters, &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; uses upper-case letters. This type differs slightly from fixed-point notation in that insignificant zeroes to the right of the decimal point are not included.  Also, the decimal point is not included on whole numbers.&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
|param1 = format&lt;br /&gt;
|param1text = String specifying the format.  Can be used with or without a format specifiers.  See below for examples.&lt;br /&gt;
|param2 = arg&lt;br /&gt;
|param2text = Argument specifying a value to replace a format placeholder (such as &amp;lt;code&amp;gt;%d&amp;lt;/code&amp;gt;) in the format string.  Not required if there are no format specifiers.&lt;br /&gt;
&lt;br /&gt;
|example1 = print(sprintf(&amp;quot;%i&amp;quot;, 54)); # prints &amp;quot;54&amp;quot;&lt;br /&gt;
|example2 = print(sprintf(&amp;quot;Pi = %+.10f&amp;quot;, math.pi)); # prints &amp;quot;Pi = +3.1415926536&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
print(sprintf(&amp;quot;%6d&amp;quot;, 23));  # prints &amp;quot;    23&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%06d&amp;quot;, 23)); # prints &amp;quot;000023&amp;quot;&lt;br /&gt;
|example4 =&lt;br /&gt;
var FGVer = getprop(&amp;quot;/sim/version/flightgear&amp;quot;);&lt;br /&gt;
print(sprintf(&amp;quot;You have FlightGear v%s&amp;quot;, FGVer)); # prints &amp;quot;You have FlightGear v&amp;lt;your version&amp;gt;&amp;quot;&lt;br /&gt;
|example5 = &lt;br /&gt;
print(sprintf(&amp;quot;Hexadecimal 100000 = %X&amp;quot;, 100000)); # prints &amp;quot;Hexadecimal 100000 = 186A0&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;Hexadecimal 100000 = %x&amp;quot;, 100000)); # prints &amp;quot;Hexadecimal 100000 = 186a0&amp;quot;&lt;br /&gt;
|example6 = print(sprintf(&amp;quot;Code 65 is %c&amp;quot;, 65)); # prints &amp;quot;Code 65 is A&amp;quot;&lt;br /&gt;
|example7 = &lt;br /&gt;
print(sprintf(&amp;quot;%e&amp;quot;, 54)); # prints &amp;quot;5.400000e+001&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%E&amp;quot;, 54)); # prints &amp;quot;5.400000E+001&amp;quot;&lt;br /&gt;
|example8 = print(sprintf(&amp;quot;%o&amp;quot;, 54)); # prints &amp;quot;66&amp;quot;&lt;br /&gt;
|example9 = print(sprintf(&amp;quot;50%% of 100 is %i&amp;quot;, 100 / 2)); # prints &amp;quot;50% of 100 is 50&amp;quot;&lt;br /&gt;
|example10 =&lt;br /&gt;
print(sprintf(&amp;quot;%.2f&amp;quot;, 1.4));   # prints &amp;quot;1.40&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%.1f&amp;quot;, 1.4));   # prints &amp;quot;1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;% 4.1f&amp;quot;, 1.4)); # prints &amp;quot; 1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%04.1f&amp;quot;, 1.4)); # prints &amp;quot;01.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;% 6.1f&amp;quot;, 1.4)); # prints &amp;quot;   1.4&amp;quot;&lt;br /&gt;
print(sprintf(&amp;quot;%06.1f&amp;quot;, 1.4)); # prints &amp;quot;0001.4&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===str()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = str(value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=186|t=Source}}&lt;br /&gt;
|text = Convert given value (scalar) to string. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is a number, it will be converted to a string. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is a string, the same string will be returned. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not a scalar (hash, vector, nil), &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; will be returned.&lt;br /&gt;
|param1 = value&lt;br /&gt;
|param1text = The value to convert to string.&lt;br /&gt;
|example1 = &lt;br /&gt;
var result = str(true);     # result is a string &amp;quot;1&amp;quot;&lt;br /&gt;
var result = str(false);    # result is a string &amp;quot;0&amp;quot;&lt;br /&gt;
var result = str(12);       # result is a string &amp;quot;12&amp;quot;&lt;br /&gt;
var result = str(12.5);     # result is a string &amp;quot;12.5&amp;quot;&lt;br /&gt;
var result = str(-12.5);    # result is a string &amp;quot;-12.5&amp;quot;&lt;br /&gt;
var result = str(&amp;quot;12.5&amp;quot;);   # result is a string &amp;quot;12.5&amp;quot;&lt;br /&gt;
var result = str([1, 2]);   # result is a nil&lt;br /&gt;
var result = str({ x: 0 }); # result is a nil&lt;br /&gt;
var result = str(nil);      # result is a nil&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===streq()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = streq(a, b);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=164|t=Source}}&lt;br /&gt;
|text = Tests the string values of the two arguments for equality. This function is needed because the &amp;lt;code&amp;gt;'''=='''&amp;lt;/code&amp;gt; operator (see [[Nasal_Operators#Equality|Nasal Operators]]) tests for numeric equality first.  If either or both the arguments are not strings, 0 (False) will be returned.  Returns either 0 (False) or 1 (True).  {{Note|This function is rarely required in typical code.}}&lt;br /&gt;
|param1 = a&lt;br /&gt;
|param1text = First argument for testing equality.&lt;br /&gt;
|param2 = b&lt;br /&gt;
|param2text = Second argument for testing equality.&lt;br /&gt;
|example1 = print(streq(&amp;quot;0&amp;quot;, &amp;quot;0&amp;quot;)); # prints &amp;quot;1&amp;quot; (True)&lt;br /&gt;
|example2 = &lt;br /&gt;
print(0 == 0.0); # prints &amp;quot;1&amp;quot; (True)&lt;br /&gt;
print(streq(&amp;quot;0&amp;quot;, &amp;quot;0.0&amp;quot;)); # prints &amp;quot;0&amp;quot; (False)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===substr()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = substr(string, start [, length]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=194|t=Source}}&lt;br /&gt;
|text = Similar the {{func link|subvec()}}, but operates on strings. Computes and returns a substring. The first argument specifies a string, the second is the index of the start of a substring, the optional third argument specifies a length (the default is to return the rest of the string from the start).&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String to return a substring from.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = Integer specifying the start of a substring. Negative values specify a position from the end of the string.&lt;br /&gt;
|param3 = length&lt;br /&gt;
|param3text = Optional argument specifying the length of the substring. Defaults to the end of the string.&lt;br /&gt;
|example1 = print(substr(&amp;quot;abcde&amp;quot;, 1, 3)); # prints &amp;quot;bcd&amp;quot;&lt;br /&gt;
|example2 = print(substr(&amp;quot;abcde&amp;quot;, 1)); # prints &amp;quot;bcde&amp;quot;&lt;br /&gt;
|example3 = print(substr(&amp;quot;abcde&amp;quot;, 2, 1)); # prints &amp;quot;c&amp;quot;&lt;br /&gt;
|example4 = print(substr(&amp;quot;abcde&amp;quot;, -2)); # prints &amp;quot;de&amp;quot;&lt;br /&gt;
|example5 = print(substr(&amp;quot;abcde&amp;quot;, -3, 2)); # prints &amp;quot;cd&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===subvec()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = subvec(vector, start[, length]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=98|t=Source}}&lt;br /&gt;
|text = Returns a sub-range of a vector. The first argument specifies a vector, the second a starting index, and the optional third argument indicates a length (the default is to the end of the vector). &lt;br /&gt;
|param1 = vector&lt;br /&gt;
|param1text = The vector to take the sub-vector from.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = The starting point of the sub-vector within the given vector.&lt;br /&gt;
|param3 = length&lt;br /&gt;
|param3text = Optional argument specifying the length of the sub-vector, from the starting point.&lt;br /&gt;
'''Notes:'''&lt;br /&gt;
* Omitting the ''vector'' and ''start'' arguments is not an error (possibly it should be) but the return value is ''nil''.&lt;br /&gt;
* A negative ''start'' argument ''is'' an error. This seems wrong. Perhaps the language designer could comment.&lt;br /&gt;
* A value of ''start'' greater than ''size(vector)'' causes an error. A value equal to ''size(vector)'' returns an empty vector.&lt;br /&gt;
* If the value of ''length'' is greater than ''size(vector) - start'' then it is ignored. That is, all elements from ''start'' to the end of ''vector'' are returned. If ''length'' is zero then an empty vector is returned. A negative value of ''length'' causes an error.&lt;br /&gt;
|example1 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 0)); # prints &amp;quot;[1, 2, 3]&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 1)); # prints &amp;quot;[2, 3]&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var vector = [1, 2, 3];&lt;br /&gt;
debug.dump(subvec(vector, 1, 1)); # prints &amp;quot;[2]&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== typeof()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = typeof(object);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=287|t=Source}}&lt;br /&gt;
|text = Returns a string indicating the whether the object is &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;, a scalar (number or string), a vector, a hash, a function, or a ghost.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to return the type of.&lt;br /&gt;
|example1 = &lt;br /&gt;
var object = nil;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;nil&amp;quot;&lt;br /&gt;
|example2 = &lt;br /&gt;
var object = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;scalar&amp;quot;&lt;br /&gt;
|example3 = &lt;br /&gt;
var object = math.pi;&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;scalar&amp;quot;&lt;br /&gt;
|example4 = &lt;br /&gt;
var object = [1, 2, 3];&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;vector&amp;quot;&lt;br /&gt;
|example5 = &lt;br /&gt;
var object = {};&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;hash&amp;quot;&lt;br /&gt;
|example6 = &lt;br /&gt;
var object = func {};&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;func&amp;quot;&lt;br /&gt;
|example7 =&lt;br /&gt;
var object = airportinfo();&lt;br /&gt;
print(typeof(object)); # prints &amp;quot;ghost&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Extension modules ==&lt;br /&gt;
=== thread ===&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newthread(func);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = start a new worker thread&lt;br /&gt;
|example1 = thread.newthread( func() {} );&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newlock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = create a new lock&lt;br /&gt;
|example1 = var lock = thread.newlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.lock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = lock a lock&lt;br /&gt;
|example1 = var lock = thread.newlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.unlock();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = unlock a lock&lt;br /&gt;
|example1 = var lock = thread.unlock()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.newsem();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = create a new {{Wikipedia|semaphore}}&lt;br /&gt;
|example1 = var semaphore = thread.newsem()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.semdown();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = semaphore down&lt;br /&gt;
|example1 = thread.semdown(semaphore)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thread.semup();&lt;br /&gt;
|source = {{simgear file|simgear/nasal/threadlib.c|l=101|t=Source}}&lt;br /&gt;
|text = &lt;br /&gt;
|example1text = semaphore up&lt;br /&gt;
|example1 = thread.semup(semaphore)&lt;br /&gt;
}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Extension functions==&lt;br /&gt;
The '''extension functions''' are global functions that have been added to Nasal since its integration into FlightGear. Unlike the core library functions, they are generally specifically designed to interact directly with FlightGear. Extension functions come from three source files:&lt;br /&gt;
*{{flightgear file|src/Scripting/NasalPositioned.cxx}}&lt;br /&gt;
*{{flightgear file|src/Scripting/NasalSys.cxx}}&lt;br /&gt;
*{{fgdata file|Nasal/globals.nas}}&lt;br /&gt;
&lt;br /&gt;
===abort()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = abort();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=565|t=Source}}&lt;br /&gt;
|text = This function is a wrapper for the C++ {{func link|abort()|link=http://www.cplusplus.com/reference/cstdlib/abort/}} function. It simply aborts FlightGear with an error, which varies depending on the operating system. This function should not really be used; instead, please use the &amp;quot;exit&amp;quot; [[Fgcommands|fgcommand]], which will exit FlightGear more gracefully (see example below).&lt;br /&gt;
|example1text = This example will immediately stop FlightGear with an error, such as &amp;quot;FlightGear has stopped working.&amp;quot;&lt;br /&gt;
|example1 = abort();&lt;br /&gt;
|example2text = For exiting FlightGear in a better way, please use the following code:&lt;br /&gt;
|example2 = fgcommand(&amp;quot;exit&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== abs() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = abs(number);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = This simple function returns the {{wikipedia|absolute value|noicon=1}} of the provided number.&lt;br /&gt;
|param1 = number&lt;br /&gt;
|param1text = This argument is required and should be a number.&lt;br /&gt;
|example1 = print(abs(1)); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
|example2 = print(abs(-1)); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===aircraftToCart() ===&lt;br /&gt;
This new function in FG 2017.2.1 takes coordinates in aircraft structural coordinate system, and translate them into geocentric coordinates.&lt;br /&gt;
Example for (5,6,7):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var pos = aircraftToCart({x: -5, y: 6, z: -7});&lt;br /&gt;
var coord = geo.Coord.new();&lt;br /&gt;
coord.set_xyz(pos.x, pos.y, pos.z);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Notice: x and z is inverted sign on purpose.&lt;br /&gt;
if you want lat. lon, alt from that, just call: (degrees and meters)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
coord.lat()&lt;br /&gt;
coord.lon()&lt;br /&gt;
coord.alt()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===addcommand() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = addcommand(name, code);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=659|t=Source}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{flightgear commit|7b663c|t=commit}}&lt;br /&gt;
|text = {{see also|Howto:Add new fgcommands to FlightGear}}&lt;br /&gt;
&lt;br /&gt;
This function enables the addition of a new custom [[fgcommands|fgcommand]] to FlightGear from within Nasal. An fgcommand created using this method can be used in exactly the same way as the built-in fgcommands. Also, an fgcommand created via this method will always return True or 1, like all other fgcommands.&lt;br /&gt;
|param1 = name&lt;br /&gt;
|param1text = This will become the name of the new fgcommand. Must be a string.&lt;br /&gt;
|param2 = code&lt;br /&gt;
|param2text = The code that will be executed when the fgcommand is run. Must be a function.&lt;br /&gt;
|example1text = This example adds a new fgcommand and then runs it. Although it executes a simple {{func link|print()}} statement, any valid Nasal code can be used.&lt;br /&gt;
|example1 = addcommand(&amp;quot;myFGCmd&amp;quot;, func(node) {&lt;br /&gt;
    print(&amp;quot;fgcommand 'myFGCmd' has been run.&amp;quot;);&lt;br /&gt;
    props.dump( node );&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;myFGCmd&amp;quot;, props.Node.new({foo:1, bar:2}) );&lt;br /&gt;
|example2text = This example demonstrates how parameters are defined in a new fgcommand.&lt;br /&gt;
|example2 = addcommand(&amp;quot;myFGCmd&amp;quot;, func(node){&lt;br /&gt;
    print(node.getNode(&amp;quot;number&amp;quot;).getValue()); # prints the value of &amp;quot;number,&amp;quot; which is 12&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;myFGCmd&amp;quot;, props.Node.new({&amp;quot;number&amp;quot;: 12}));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airportinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airportinfo();&lt;br /&gt;
airportinfo(type);&lt;br /&gt;
airportinfo(id);&lt;br /&gt;
airportinfo(lat, lon[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1024|t=Source}}&lt;br /&gt;
|text = Function for retrieval of airport, heliport, or seaplane base information. It returns a Nasal ghost; however, its structure is like that of a Nasal hash. The following information is returned:&lt;br /&gt;
* '''parents''': A vector containing a hash of various functions to access information about the runway. These functions are:&lt;br /&gt;
** '''findBestRunwayForPos()''' return runway as ghost by given geo position, e.g. &amp;lt;code&amp;gt;var rwy = airportinfo().findBestRunwayForPos(geo.aircraft_position());&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''runway()''' return runway as ghost by runway ID, e.g. &amp;lt;code&amp;gt;var rwy = airportinfo().runway(&amp;quot;18R&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''runwaysWithoutReciprocals()''' return vector of runways as ghost.&lt;br /&gt;
** '''helipad()''' return helipad as ghost by helipad ID, e.g. &amp;lt;code&amp;gt;var heli = airportinfo().helipad(&amp;quot;H19&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''tower()''' return hash with &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;elevation&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''comms()''' return vector of hashes, each hash with &amp;lt;code&amp;gt;frequency&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''sids()''' return vector of strings with SID IDs.&lt;br /&gt;
** '''stars()''' return vector of strings with STAR IDs.&lt;br /&gt;
** '''getApproachList()''' return vector of string with approaches.&lt;br /&gt;
** '''parking()''' return vector of hashes, each hash with  &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;elevation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
** '''getSid()''' return SID as ghost, e.g. &amp;lt;code&amp;gt;var sid = airportinfo().getSid(&amp;quot;SA1A&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getStar()''' return STAR as ghost, e.g. &amp;lt;code&amp;gt;var star = airportinfo().getStar(&amp;quot;KEILA1&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getIAP()''' return IAP as ghost, e.g. &amp;lt;code&amp;gt;var iap = airportinfo().getIAP(&amp;quot;ILS02&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''getApproach()''' return approach as ghost, e.g. &amp;lt;code&amp;gt;var approach = airportinfo().getApproach(&amp;quot;ILS02&amp;quot;);&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''tostring()''' just return string &amp;quot;an airport ICAO&amp;quot;.&lt;br /&gt;
** See also {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1902}}.&lt;br /&gt;
* '''lon''': Longitude of the location.&lt;br /&gt;
* '''lat''': Latitude of the location.&lt;br /&gt;
* '''has_metar''': True or false depending whether the airport has a [[METAR]] code defined for it.&lt;br /&gt;
* '''elevation''': Elevation of the location in metres.&lt;br /&gt;
* '''id''': ICAO code of the airport (or ID of the seaplane base/heliport).&lt;br /&gt;
* '''name''': Name of the airport/heliport/seaplane base.&lt;br /&gt;
* '''runways'''&lt;br /&gt;
** '''&amp;lt;runway name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of runway.&lt;br /&gt;
*** '''lat''': Latitude of the runway.&lt;br /&gt;
*** '''lon''': Longitude of the runway.&lt;br /&gt;
*** '''heading''': True heading of the runway.&lt;br /&gt;
*** '''length''': Length of the runway in metres.&lt;br /&gt;
*** '''width''': Width of the runway in metres.&lt;br /&gt;
*** '''surface''': Runway surface type.&lt;br /&gt;
*** '''threshold''': Length of the runway's {{wikipedia|displaced threshold}} in metres. Will return 0 if there is none.&lt;br /&gt;
*** '''stopway''': Length of the runway's stopway (the area before the threshold) in metres. Will return 0 if there is none.&lt;br /&gt;
*** '''reciprocal''': &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt; ghost of the reciprocal runway.&lt;br /&gt;
*** '''ils_frequency_mhz''': ILS frequency in megahertz.&lt;br /&gt;
*** '''ils''': &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost of the ILS transmitter.&lt;br /&gt;
* '''helipads'''&lt;br /&gt;
** '''&amp;lt;helipad name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of helipad.&lt;br /&gt;
*** '''lat''': Latitude of the helipad.&lt;br /&gt;
*** '''lon''': Longitude of the helipad.&lt;br /&gt;
*** '''heading''': True heading of the helipad.&lt;br /&gt;
*** '''length''': Length of the helipad in metres.&lt;br /&gt;
*** '''width''': Width of the helipad in metres.&lt;br /&gt;
*** '''surface''': Helipad surface type.&lt;br /&gt;
* '''taxiways'''&lt;br /&gt;
** '''&amp;lt;taxiway name&amp;gt;'''&lt;br /&gt;
*** '''id''': Name of taxiway.&lt;br /&gt;
*** '''lat''': Latitude of the taxiway.&lt;br /&gt;
*** '''lon''': Longitude of the taxiway.&lt;br /&gt;
*** '''heading''': Heading of the taxiway.&lt;br /&gt;
*** '''length''': Length of the taxiway in metres.&lt;br /&gt;
*** '''width''': Width of the taxiway in metres.&lt;br /&gt;
*** '''surface''': Taxiway surface type.&lt;br /&gt;
&lt;br /&gt;
Information is extracted in the same way as accessing members of a Nasal hash. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# prints to lengths of the runways of the nearest airport in feet and metres&lt;br /&gt;
var info = airportinfo();&lt;br /&gt;
print(&amp;quot;-- Lengths of the runways at &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;) --&amp;quot;);&lt;br /&gt;
foreach(var rwy; keys(info.runways)){&lt;br /&gt;
    print(rwy, &amp;quot;: &amp;quot;, math.round(info.runways[rwy].length * M2FT), &amp;quot; ft (&amp;quot;, info.runways[rwy].length, &amp;quot; m)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that searches for locations that are a long way away (e.g., the nearest seaplane base to the middle of the Sahara) may cause FlightGear to pause for an amount of time.&lt;br /&gt;
|param1 = id&lt;br /&gt;
|param1text = The {{wikipedia|International Civil Aviation Organization airport code|ICAO code|noicon=1}} of an airport to retrieve information about.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = When this argument is used, the function will return the closest airport of a certain type. Can be one of &amp;quot;heliport,&amp;quot; &amp;quot;seaport,&amp;quot; or &amp;quot;airport&amp;quot; (default).&lt;br /&gt;
: {{inote|Running this function without any parameters is equivalent to this:&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
airportinfo(&amp;quot;airport&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
|param3 = lat ''and'' lon&lt;br /&gt;
|param3text = When these parameters are used, the function will return information on the nearest airport, heliport or seaplane base (depending on the '''type''' parameter) to those coordinates.&lt;br /&gt;
|example1 = var info = airportinfo();&lt;br /&gt;
print(&amp;quot;Nearest airport: &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;)&amp;quot;); # prints the name and ICAO code of the nearest airport&lt;br /&gt;
|example2 = var info = airportinfo(&amp;quot;heliport&amp;quot;);&lt;br /&gt;
print(&amp;quot;Elevation of the nearest heliport: &amp;quot;, math.round(info.elevation * M2FT), &amp;quot; ft&amp;quot;); # prints the elevation and name of the nearest heliport&lt;br /&gt;
|example3 = var info = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
print(&amp;quot;-- Runways of &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;): --&amp;quot;);&lt;br /&gt;
foreach(var rwy; keys(info.runways)) {&lt;br /&gt;
    print(rwy); # prints the runways of KSQL&lt;br /&gt;
}&lt;br /&gt;
|example4 = var info = airportinfo(37.81909385, -122.4722484);&lt;br /&gt;
print(&amp;quot;Coordinates of the nearest airport: &amp;quot;, info.lat, &amp;quot;, &amp;quot;, info.lon); # print the name and ICAO of the nearest airport to the Golden Gate Bridge&lt;br /&gt;
|example5 = var info = airportinfo(37.81909385, -122.4722484, &amp;quot;seaport&amp;quot;);&lt;br /&gt;
print(&amp;quot;Nearest seaplane base: &amp;quot;, info.name, &amp;quot; (&amp;quot;, info.id, &amp;quot;)&amp;quot;); # print the name and ID of the nearest seaplane base to the Golden Gate Bridge&lt;br /&gt;
|example6text = This example prints the all information from an &amp;lt;code&amp;gt;airportinfo()&amp;lt;/code&amp;gt; call.&lt;br /&gt;
|example6 = var info = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
print(info.name);&lt;br /&gt;
print(info.id);&lt;br /&gt;
print(info.lat);&lt;br /&gt;
print(info.lon);&lt;br /&gt;
print(info.has_metar);&lt;br /&gt;
print(info.elevation);&lt;br /&gt;
foreach(var rwy; keys(info.runways)){&lt;br /&gt;
    print(&amp;quot;-- &amp;quot;, rwy, &amp;quot; --&amp;quot;);&lt;br /&gt;
    print(info.runways[rwy].lat);&lt;br /&gt;
    print(info.runways[rwy].lon);&lt;br /&gt;
    print(info.runways[rwy].length);&lt;br /&gt;
    print(info.runways[rwy].width);&lt;br /&gt;
    print(info.runways[rwy].heading);&lt;br /&gt;
    print(info.runways[rwy].stopway);&lt;br /&gt;
    print(info.runways[rwy].threshold);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airwaysRoute() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airwaysRoute(start, end[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1933|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
This function returns a vector containing waypoints between two given waypoints. The returned waypoints are ghosts, but can be accessed in the same way as a Nasal hash. See [[Nasal Flightplan]] for more information.&lt;br /&gt;
|param1 = start&lt;br /&gt;
|param1text = Start waypoint, in the form of a waypoint ghost, such as that provided by {{func link|flightplan()}}.&lt;br /&gt;
|param2 = end&lt;br /&gt;
|param2text = Same as above.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = Instructs the function to compute a high level route (when set to &amp;quot;highlevel&amp;quot;), or a low level route (when set to &amp;quot;lowlevel&amp;quot;). Defaults to &amp;quot;highlevel.&amp;quot;&lt;br /&gt;
|example1text = In the [[route manager]] dialog, add two waypoints to the flightplan, ideally ones that are far apart (tip: use the [[Map]] for this). Then run this code in your Nasal Console.&lt;br /&gt;
|example1 = var fp = flightplan();&lt;br /&gt;
var start = fp.getWP(0);&lt;br /&gt;
var end = fp.getWP(fp.getPlanSize() - 1);&lt;br /&gt;
var rt = airwaysRoute(start, end);&lt;br /&gt;
foreach(var wp; rt){&lt;br /&gt;
    print(wp.wp_name); # print the waypoints in the computed route&lt;br /&gt;
}&lt;br /&gt;
|example2text = Exactly the same as above, but computes a low level path.&lt;br /&gt;
|example2 = var fp = flightplan();&lt;br /&gt;
var start = fp.getWP(0);&lt;br /&gt;
var end = fp.getWP(fp.getPlanSize() - 1);&lt;br /&gt;
var rt = airwaysRoute(start, end, &amp;quot;lowlevel&amp;quot;);&lt;br /&gt;
foreach(var wp; rt){&lt;br /&gt;
    print(wp.wp_name); # print the waypoints in the computed route&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===airway()===&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = airway(ident [, pos]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2644|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
This function returns a ghost containing an airway of a specified id.&lt;br /&gt;
|param1 = ident&lt;br /&gt;
|param1text = a Positioned ghost (leg, navaid, airport) and so on, passed to the search function.&lt;br /&gt;
|param2 = pos&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===assert()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = assert(condition[, message]);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|version = 3.2&lt;br /&gt;
|commit = {{fgdata commit|8b16a7|t=commit}}&lt;br /&gt;
|text = Returns either true if the condition evaluates as true, or aborts with a {{func link|die()}} call, which can be customised.&lt;br /&gt;
|param1 = condition&lt;br /&gt;
|param1text = Condition to evaluate.&lt;br /&gt;
|param2 = message&lt;br /&gt;
|param2text = Optional message that will be used in any {{func link|die()}} call. Defaults to &amp;quot;assertion failed!&amp;quot;&lt;br /&gt;
|example1 = var a = 1;&lt;br /&gt;
var b = 2;&lt;br /&gt;
print(assert(a &amp;lt; b)); # prints &amp;quot;1&amp;quot; (true)&lt;br /&gt;
|example2 = var a = 1;&lt;br /&gt;
var b = 2;&lt;br /&gt;
assert(a &amp;gt; b, 'a is not greater than b'); # aborts with a custom error message&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===carttogeod()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = carttogeod(x, y, z);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=945|t=Source}}&lt;br /&gt;
|text = Converts {{wikipedia|ECEF|Earth-centered, Earth-fixed}} coordinates (x, y and z) to {{wikipedia|geodetic coordinates}} (latitude, longitude, and altitude). A vector is returned containing latitude and longitude, both in degrees, and altitude, which is returned in metres above the equatorial radius of Earth as defined by the {{wikipedia|WGS 84}} (6,378,137 metres).&amp;lt;ref&amp;gt;{{simgear file|simgear/math/sg_geodesy.hxx|l=43}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|param1 = x&lt;br /&gt;
|param1text = Mandatory x-axis value, in metres.&lt;br /&gt;
|param2 = y&lt;br /&gt;
|param2text = Mandatory y-axis value, in metres.&lt;br /&gt;
|param3 = z&lt;br /&gt;
|param3text = Mandatory z-axis value, in metres.&lt;br /&gt;
|example1 = var (lat, lon, alt) = carttogeod(6378137, 0, 0); # point is the intersection of the prime meridian and equator.&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, lat); # prints lat, lon and alt, which are all zero, see above&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, lon);&lt;br /&gt;
print(&amp;quot;Altitude: &amp;quot;, alt);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===cmdarg()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|private = _cmdarg()&lt;br /&gt;
|syntax = cmdarg();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=513|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; returns the property root of certain types of XML files. These could be nodes in the [[Property Tree]], or temporary and/or non-public nodes outside the Property tree. &lt;br /&gt;
It is used by Nasal scripts embedded in XML files. It returns a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object (see {{fgdata file|Nasal/props.nas}}), and you can use all of its methods on the returned value. &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; should only be used in four types/places of XML files:&lt;br /&gt;
* Bindings: This is needed so that the value of a joystick's axis can be accessed internally.&lt;br /&gt;
* Dialogs: This will return the root of the dialog in the Property Tree. This is useful for dialogs that are created/modified procedurally (e.g. for populating/changing widgets while loading the dialog). &lt;br /&gt;
* Embedded Canvases: The Nasal code behind [[Canvas]] windows [[Howto:Adding a canvas to a GUI dialog|embedded in PUI dialogs]] can use it to accessing the root directory of their Canvas.&lt;br /&gt;
* Animation XML files: If the animation XML file is used in an AI/MP model, &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; will return the root of the AI model in the &amp;lt;code&amp;gt;/ai/models/&amp;lt;/code&amp;gt; directory. Examples: &amp;lt;code&amp;gt;/ai/models/aircraft[3]/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/ai/models/multiplayer[1]/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should not use &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in places other than those stated above. Although it won't cause an error, it will return the value of the last legitimate &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; call. &lt;br /&gt;
&lt;br /&gt;
Also, you should not delay &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; using {{func link|maketimer()}}, {{func link|settimer()}} or {{func link|setlistener()}}, because it will return an unrelated property.&lt;br /&gt;
|example1 = fgcommand(&amp;quot;dialog-show&amp;quot;, {&amp;quot;dialog-name&amp;quot;: &amp;quot;cmdarg-demo&amp;quot;});&lt;br /&gt;
|example1text = &amp;lt;br&amp;gt;This example demonstrates the usage of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in a binding.  Save the below XML snippet as &amp;lt;tt&amp;gt;[[$FG_ROOT]]/gui/dialogs/cmdarg-demo.xml&amp;lt;/tt&amp;gt;. Then run the Nasal snippet below in your [[Nasal Console]]. Upon clicking {{button|Close}}, a message will be printed sowing the root of the binding in the Property Tree.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;cmdarg-demo&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
  &amp;lt;label&amp;gt;Click &amp;quot;Close&amp;quot; to activate the demonstration (a message in the console).&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Close&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;nasal&amp;lt;/command&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;print(&amp;quot;Button binding root: '&amp;quot; ~ cmdarg().getPath() ~ &amp;quot;'&amp;quot;);&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example2text = This example demonstrates the usage of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; in Nasal code within dialogs.  Open &amp;lt;tt&amp;gt;[[$FG_ROOT]]/gui/dialogs/cmdarg-demo.xml&amp;lt;/tt&amp;gt; from the previous example, copy &amp;amp; paste the code below, and save it. Then run the same Nasal snippet as the previous example in your Nasal Console. If you click {{button|Click me!}}, the button's label will change to &amp;quot;I've been changed!&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;cmdarg-demo&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
  &amp;lt;label&amp;gt;Click &amp;quot;Click me!&amp;quot; to activate the demonstration (the button's label will change).&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Click me!&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;nasal&amp;lt;/command&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;change_label();&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button&amp;gt;&lt;br /&gt;
  &amp;lt;legend&amp;gt;Close&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;binding&amp;gt;&lt;br /&gt;
    &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
  &amp;lt;/binding&amp;gt;&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&lt;br /&gt;
  &amp;lt;open&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
    var dlg_root = cmdarg();&lt;br /&gt;
    var dlg_name = {&amp;quot;dialog-name&amp;quot;: &amp;quot;cmdarg-demo&amp;quot;};&lt;br /&gt;
    var change_label = func {&lt;br /&gt;
        dlg_root.getNode(&amp;quot;button[0]/legend&amp;quot;).setValue(&amp;quot;I've been changed!&amp;quot;);&lt;br /&gt;
        fgcommand(&amp;quot;dialog-close&amp;quot;, dlg_name);&lt;br /&gt;
        fgcommand(&amp;quot;dialog-show&amp;quot;, dlg_name);&lt;br /&gt;
    }&lt;br /&gt;
  ]]&amp;gt;&amp;lt;/open&amp;gt;&lt;br /&gt;
&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example3text = For an example of &amp;lt;code&amp;gt;cmdarg()&amp;lt;/code&amp;gt; used with Canvas, please see [[Howto:Adding a canvas to a GUI dialog#FGPlot|Howto:Adding a canvas to a GUI dialog]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===courseAndDistance()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = courseAndDistance(to);&lt;br /&gt;
courseAndDistance(from, to);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1668|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the course from one point to another and the distance between them in nautical miles. The course is the initial bearing (see [http://www.movable-type.co.uk/scripts/latlong.html#bearing here]), and is in the range 0–360. Both arguments can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object with geodetic coordinates (cartesian coordinates will not be accepted)&lt;br /&gt;
|param1 = from&lt;br /&gt;
|param1text = Optional parameter defining the from where the function should calculate its results. If the function is given one argument ('''to'''), the aircraft's current position will be used. As well as the argument types as defined above, this argument can be two numbers separated with a comma, as if the function is taking three arguments. See example 5 below.&lt;br /&gt;
|param2 = to&lt;br /&gt;
|param2text = Like the first parameter, but defines the second point.&lt;br /&gt;
|example1text = This example demonstrates the usage of the function with the &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost type.&lt;br /&gt;
|example1 = var from = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var to = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course); # prints course from KSFO to KSQL&lt;br /&gt;
print(dist); # prints distance in nm from KSFO to KSQL&lt;br /&gt;
|example2text = This example demonstrates the usage of the function with hashes containing ''lat'' and ''lon''.&lt;br /&gt;
|example2 = var from = {lat: 0, lon: 0};&lt;br /&gt;
var to = {lat: 1, lon: 1};&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example3text = This example demonstrates usage of a geo.Coord object.&lt;br /&gt;
|example3 = var from = geo.Coord.new().set_latlon(0, 0);&lt;br /&gt;
var to = geo.Coord.new().set_latlon(1, 1);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example4text = This example demonstrates usage of differing parameter types.&lt;br /&gt;
|example4 = var from = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var to = geo.Coord.new().set_latlon(0, 0);&lt;br /&gt;
var (course, dist) = courseAndDistance(from, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example5text = The same as above, but the other way round.&lt;br /&gt;
|example5 = var to = {lat: 1, lon: 1};&lt;br /&gt;
var (course, dist) = courseAndDistance(0, 0, to);&lt;br /&gt;
print(course);&lt;br /&gt;
print(dist);&lt;br /&gt;
|example6text = Usage of just one parameter.&lt;br /&gt;
|example6 = var dest = airportinfo(&amp;quot;KSQL&amp;quot;);&lt;br /&gt;
var (course, dist) = courseAndDistance(dest);&lt;br /&gt;
print(&amp;quot;Turn to heading &amp;quot;, math.round(course), &amp;quot;. You have &amp;quot;, sprintf(&amp;quot;%.2f&amp;quot;, dist), &amp;quot; nm to go&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createFlightplan()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createFlightplan(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2331|t=Source}}&lt;br /&gt;
|text = Creates an empty flightplan object. It accepts one argument, ''path'' passed an absolute path to a .fgfp / .gpx file, it will populate the flightplan with waypoints from the file.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional parameter defining the file from which a flightplan will be populated.&lt;br /&gt;
|example1 = &lt;br /&gt;
var path = getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test.fgfp&amp;quot;;&lt;br /&gt;
var flightplan = createFlightplan(path);&lt;br /&gt;
debug.dump(flightplan);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createDiscontinuity()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createDiscontinuity();&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object. A route discontinuity is inserted by an {{abbr|FMS|Flight Management System}} when it is unsure how to connect two waypoints.&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2045|t=Source}}&lt;br /&gt;
|version = 2016.1&lt;br /&gt;
|commit = {{flightgear commit|caead6|t=commit}}&lt;br /&gt;
}}&lt;br /&gt;
===createViaTo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createViaTo(airway, waypoint);&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object. It represents a route &amp;quot;via '''airway''' to '''waypoint'''&amp;quot;.&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=2009|t=Source}}&lt;br /&gt;
|version = 2016.1&lt;br /&gt;
|commit = {{flightgear commit|caead6|t=commit}}&lt;br /&gt;
|param1 = airway&lt;br /&gt;
|param1text = The name of an airway.&lt;br /&gt;
|param2 = waypoint&lt;br /&gt;
|param2text = Must be in the airway and one of:&lt;br /&gt;
* The name of a waypoint.&lt;br /&gt;
* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
}}&lt;br /&gt;
===createWP()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createWP(pos, name[, flag]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1964|t=Source}}&lt;br /&gt;
|text = Creates a new waypoint ghost object.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Dictates the position of the new waypoint. It can be one of the following:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. See example 4 below.&lt;br /&gt;
|param2 = name&lt;br /&gt;
|param2text = String that will become the name of the new waypoint.&lt;br /&gt;
|param3 = flag&lt;br /&gt;
|param3text = Optional string that will tell FlightGear what type of waypoint it is. Must be one of &amp;quot;sid,&amp;quot; &amp;quot;star,&amp;quot; &amp;quot;approach,&amp;quot; &amp;quot;missed,&amp;quot; or &amp;quot;pseudo.&amp;quot;&lt;br /&gt;
|example1text = Creates a waypoint directly in front and 1 km away and appends it to the flight plan.&lt;br /&gt;
|example1 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example2 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP({lat: pos.lat(), lon: pos.lon()}, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example3 = var apt = airportinfo();&lt;br /&gt;
var wp = createWP(apt, &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example4 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos.lat(), pos.lon(), &amp;quot;NEWWP&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example5text = Creates a new waypoint and adds it to the flight plan. Waypoints of the type &amp;quot;pseudo&amp;quot; are then removed from the flight plan, including the new waypoint. The {{func link|print()}} statements show this.&lt;br /&gt;
|example5 = var pos = geo.aircraft_position().apply_course_distance(getprop(&amp;quot;/orientation/heading-deg&amp;quot;), 1000);&lt;br /&gt;
var wp = createWP(pos, &amp;quot;NEWWP&amp;quot;, &amp;quot;pseudo&amp;quot;);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
fp.clearWPType(&amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===createWPFrom()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = createWPFrom(object[, flag]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1989|t=Source}}&lt;br /&gt;
|text = Creates a new waypoint object from another object.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = A ghost object. Must be a ghost type that is one of &amp;quot;airport,&amp;quot; &amp;quot;navaid,&amp;quot; &amp;quot;runway,&amp;quot; or &amp;quot;fix.&amp;quot;&lt;br /&gt;
|param2 = flag&lt;br /&gt;
|param2text = Optional string that will tell FlightGear what type of waypoint it is. Must be one of &amp;quot;sid,&amp;quot; &amp;quot;star,&amp;quot; &amp;quot;approach,&amp;quot; &amp;quot;missed,&amp;quot; or &amp;quot;pseudo.&amp;quot;&lt;br /&gt;
|example1text = Creates a new waypoint and appends it to the flight plan.&lt;br /&gt;
|example1 = var apt = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var wp = createWPFrom(apt);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
|example2text = Creates a new waypoint and appends it to the flight plan. This way point is then removed; the {{func link|print()}} statements prove this.&lt;br /&gt;
|example2 = var apt = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var wp = createWPFrom(apt, &amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(wp.wp_name);&lt;br /&gt;
var fp = flightplan();&lt;br /&gt;
fp.appendWP(wp);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
fp.clearWPType(&amp;quot;pseudo&amp;quot;);&lt;br /&gt;
print(fp.getPlanSize());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===defined()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = defined(symbol);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns 1 (true) or 0 (false) depending on whether a variable exists.&lt;br /&gt;
|param1 = symbol&lt;br /&gt;
|param1text = A string that will be what the function searches for.&lt;br /&gt;
|example1 = var number = 12;&lt;br /&gt;
var check_exist = func {&lt;br /&gt;
    print(&amp;quot;Variable 'number' &amp;quot;, defined(&amp;quot;number&amp;quot;) == 1 ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;); # 'number' does exist&lt;br /&gt;
    print(&amp;quot;Variable 'number2' &amp;quot;, defined(&amp;quot;number2&amp;quot;) == 1 ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;); # 'number2' does not exist&lt;br /&gt;
}&lt;br /&gt;
check_exist();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===directory()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = directory(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=572|t=Source}}&lt;br /&gt;
|text = Returns a vector containing a list of the folders and files in a given file path or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the path doesn't exist. Hidden folders and files are not added to the vector.&lt;br /&gt;
{{inote|The first two elements of the vector will be &amp;lt;code&amp;gt;'.'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'..'&amp;lt;/code&amp;gt;. These are for navigating back up the file tree, but have no use in Nasal. They can be safely removed from the vector.}}&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Absolute file path.&lt;br /&gt;
|example1text = Gets the folders and files in [[$FG_ROOT]], and then removes the extra first two elements (see note above). &lt;br /&gt;
|example1 = var dir = directory(getprop(&amp;quot;/sim/fg-root&amp;quot;)); # get directory&lt;br /&gt;
dir = subvec(dir, 2); # strips off the first two elements&lt;br /&gt;
debug.dump(dir); # dump the vector&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===fgcommand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = fgcommand(cmd[, args]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=456|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = Runs an fgcommand. See also {{readme file|commands}} and [[Bindings]] for more information. See {{flightgear file|src/Main/fg_commands.cxx|l=1425}} for the full list of fgcommands. Note that fgcommands generated by {{func link|addcommand()}} can also be run using this function. Also, the full list of fgcommands depends on the version of FlightGear you have. Returns 1 (true) if the fgcommand succeeded or 0 (false) if it failed.&lt;br /&gt;
|param1 = cmd&lt;br /&gt;
|param1text = String that is the name of the command that is to be run.&lt;br /&gt;
|param2 = args&lt;br /&gt;
|param2text = If the fgcommand takes arguments, they are inputted using this argument. Can either be a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object, or a hash (see examples below).&lt;br /&gt;
|example1 = fgcommand(&amp;quot;null&amp;quot;); # does nothing&lt;br /&gt;
|example2 = var args = props.Node.new({'script': 'print(&amp;quot;Running fgcommand&amp;quot;);'});&lt;br /&gt;
if (fgcommand(&amp;quot;nasal&amp;quot;, args)) { # prints &amp;quot;Running fgcommand&amp;quot; and then one of these print statements&lt;br /&gt;
    print(&amp;quot;Fgcommand succeeded&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Fgcommand encountered a problem&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example3 = var args = { 'dialog-name': 'about' };&lt;br /&gt;
fgcommand(&amp;quot;dialog-show&amp;quot;, args); # shows the 'about' dialog&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findAirportsByICAO() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findAirportsByICAO(search[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1096|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost objects which are (by default) airports whose ICAO code matches the search string. The results are sorted by range from closest to furthest.&lt;br /&gt;
|param1 = search&lt;br /&gt;
|param1text = Search string for the function. Can either be a partial or a full ICAO code.&lt;br /&gt;
:{{icaution|The more matches there are for the given code, the longer the function will take. Passing just one character (e.g., &amp;quot;K&amp;quot;), might make FlightGear hang for a certain amount of time.}}&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = This will narrow the search to airports of a certain type. By default, only airports are searched for. May be one of &amp;quot;airport,&amp;quot; &amp;quot;heliport,&amp;quot; or &amp;quot;seaport.&amp;quot;&lt;br /&gt;
|example1 = var apts = findAirportsByICAO(&amp;quot;KSF&amp;quot;); # finds all airports matching &amp;quot;KSF&amp;quot;&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;); # prints them&lt;br /&gt;
}&lt;br /&gt;
|example2 = var apts = findAirportsByICAO(&amp;quot;SP0&amp;quot;, &amp;quot;seaport&amp;quot;); # finds all seaplane bases matching &amp;quot;SP0&amp;quot;&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;); # prints them&lt;br /&gt;
}&lt;br /&gt;
|example3 = var apt = findAirportsByICAO(&amp;quot;XBET&amp;quot;); # one way to check if an airport does exist&amp;quot;&lt;br /&gt;
if (size(apt) == 0) {&lt;br /&gt;
    print(&amp;quot;Airport does not exist&amp;quot;); # this one will be printed&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Airport does exist&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findAirportsWithinRange()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findAirportsWithinRange([pos, ]range[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1066|t=Source}}&lt;br /&gt;
|text = Returns a vector of &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt; ghost object which are (by default) airports that are within a given range of a given position, or the aircraft's current position. The results are sorted by range from closest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findAirportsWithinRange(lat, lon, range, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = range&lt;br /&gt;
|param2text = Mandatory number giving the range in nautical miles within which to search for airports/heliports/seaplane bases.only airports are searched for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to airports of a certain type. By default, only airports are searched for. May be one of &amp;quot;airport,&amp;quot; &amp;quot;heliport,&amp;quot; or &amp;quot;seaport.&amp;quot;&lt;br /&gt;
|example1text = Searches for airports within 10 nm of [[KSFO]].&lt;br /&gt;
|example1 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var apts = findAirportsWithinRange(pos, 10);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2text = Searches for seaplane bases within 15 nm of [[KSFO]].&lt;br /&gt;
|example2 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var apts = findAirportsWithinRange(pos, 15, &amp;quot;seaport&amp;quot;);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example3text = Searches for airports within 10 nm of your current position.&lt;br /&gt;
|example3 = var apts = findAirportsWithinRange(10);&lt;br /&gt;
foreach(var apt; apts){&lt;br /&gt;
    print(apt.name, &amp;quot; (&amp;quot;, apt.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findCommByFrequencyMHz()===&lt;br /&gt;
 findCommByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
[[sourceforge:p/flightgear/flightgear/ci/next/tree/src/Scripting/NasalPositioned.cxx#l1547|source]]&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;code&amp;gt;comm&amp;lt;/code&amp;gt; ghost object for a station matching a given frequency. If there is more than one station with that frequency, the nearest station is returned.&lt;br /&gt;
&lt;br /&gt;
'''pos'''&lt;br /&gt;
&lt;br /&gt;
: Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findCommByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
; freq&lt;br /&gt;
: Frequency, in megahertz, of the station to search for.&lt;br /&gt;
; type&lt;br /&gt;
: This will narrow the search to station of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see flightgear/src/Navaids/positioned.cxx (line 160)&lt;br /&gt;
'''Example'''&lt;br /&gt;
 var com = findCommByFrequencyMHz(123.6);&lt;br /&gt;
 print(&amp;quot;ID: &amp;quot;, com.id); # prints info about the comm station&lt;br /&gt;
 print(&amp;quot;Name: &amp;quot;, com.name);&lt;br /&gt;
 print(&amp;quot;Latitude: &amp;quot;, com.lat);&lt;br /&gt;
 print(&amp;quot;Longitude: &amp;quot;, com.lon);&lt;br /&gt;
 print(&amp;quot;Type: &amp;quot;, com.type);&lt;br /&gt;
 print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, com.frequency), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== findFixesByID() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findFixesByID([pos, ]id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1627|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; ghost objects matching a given ID, sorted by range from a certain position.&lt;br /&gt;
{{inote|Fixes are (usually) also known as waypoints.}}&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findFixesByID(lat, lon, id);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = id&lt;br /&gt;
|param2text = Full or partial ID of the fix to search for.&lt;br /&gt;
:{{inote|1=Inputting a partial ID does not work correctly (see [http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=28129 here]). It is best to just input a full ID.}}&lt;br /&gt;
|example1 = var fixes = findFixesByID(&amp;quot;POGIC&amp;quot;);&lt;br /&gt;
foreach(var fix; fixes){&lt;br /&gt;
    print(fix.id, &amp;quot; - lat: &amp;quot;, fix.lat, &amp;quot; {{!}} lon: &amp;quot;, fix.lon); # prints information about POGIC&lt;br /&gt;
}&lt;br /&gt;
|example2 = var fix = findFixesByID(&amp;quot;ZUNAP&amp;quot;);&lt;br /&gt;
fix = fix[0];&lt;br /&gt;
var (course, dist) = courseAndDistance(fix);&lt;br /&gt;
print(&amp;quot;Turn to heading &amp;quot;, math.round(course), &amp;quot;. You have &amp;quot;, sprintf(&amp;quot;%.2f&amp;quot;, dist), &amp;quot; nm to go to reach &amp;quot;, fixes[0].id);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidByFrequencyMHz()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1547|t=Source}}&lt;br /&gt;
|text = Returns a &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost object for a navaid matching a given frequency. If there is more than one navaid with that frequency, the nearest station is returned.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = freq&lt;br /&gt;
|param2text = Frequency, in megahertz, of the navaid to search for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaid = findNavaidByFrequencyMHz(109.55);&lt;br /&gt;
print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about the navaid&lt;br /&gt;
print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 100), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
if(navaid.course) print(&amp;quot;Course: &amp;quot;, navaid.course);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== findNavaidsByFrequencyMHz()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsByFrequencyMHz([pos, ]freq[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1572|t=Source}}&lt;br /&gt;
|text = Returns a vector conatining &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects for navaids that match a given frequency, sorted from nearest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsByFrequencyMHz(lat, lon, freq, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = freq&lt;br /&gt;
|param2text = Frequency, in megahertz, of the navaid to search for.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaids = findNavaidsByFrequencyMHz(109.55);&lt;br /&gt;
foreach(var navaid; navaids){&lt;br /&gt;
    print(&amp;quot;--&amp;quot;);&lt;br /&gt;
    print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about the navaid&lt;br /&gt;
    print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
    print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
    print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
    print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
    print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
    print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 100), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
    print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
    if(navaid.course) print(&amp;quot;Course: &amp;quot;, navaid.course);&lt;br /&gt;
    print(&amp;quot;--&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidsByID()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsByID([pos, ]id[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1600|t=Source}}&lt;br /&gt;
|text = Returns a vector containing &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects matching a given ID, sorted by range from a certain position.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsByID(lat, lon, id, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = id&lt;br /&gt;
|param2text = Full or partial ID of the fix to search for.&lt;br /&gt;
:{{inote|1=Inputting a partial ID does not work correctly (see [http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=28129 here]). It is best to just input a full ID.}}&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1 = var navaid = findNavaidsByID(&amp;quot;MXW&amp;quot;);&lt;br /&gt;
navaid = navaid[0];&lt;br /&gt;
print(&amp;quot;ID: &amp;quot;, navaid.id); # prints info about 'MXW' (a VOR station)&lt;br /&gt;
print(&amp;quot;Name: &amp;quot;, navaid.name);&lt;br /&gt;
print(&amp;quot;Latitude: &amp;quot;, navaid.lat);&lt;br /&gt;
print(&amp;quot;Longitude: &amp;quot;, navaid.lon);&lt;br /&gt;
print(&amp;quot;Elevation (AMSL): &amp;quot;, navaid.elevation, &amp;quot; m&amp;quot;);&lt;br /&gt;
print(&amp;quot;Type: &amp;quot;, navaid.type);&lt;br /&gt;
print(&amp;quot;Frequency: &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, navaid.frequency / 1000), &amp;quot; Mhz&amp;quot;);&lt;br /&gt;
print(&amp;quot;Range: &amp;quot;, navaid.range_nm, &amp;quot; nm&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===findNavaidsWithinRange()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = findNavaidsWithinRange([pos, ]range[, type]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1518|t=Source}}&lt;br /&gt;
|text = Returns a vector of &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects which are within a given range of a given position (by default the aircraft's current position). The results are sorted from closest to furthest.&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to search around. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost type&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A geo.Coord object&lt;br /&gt;
:* Two numbers separated by a comma, as if the function is taking three arguments. Example: &amp;lt;code&amp;gt;findNavaidsWithinRange(lat, lon, range, type);&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = range&lt;br /&gt;
|param2text = Mandatory number giving the range in nautical miles within which to search for navaids.&lt;br /&gt;
|param3 = type&lt;br /&gt;
|param3text = This will narrow the search to navaids of a certain type. Defaults to &amp;quot;all.&amp;quot; For the full list of accepted type arguments, see {{flightgear file|src/Navaids/positioned.cxx|l=127}}.&lt;br /&gt;
|example1text = Searches for navaids within 10 nm of [[KSFO]].&lt;br /&gt;
|example1 = var pos = airportinfo(&amp;quot;KSFO&amp;quot;);&lt;br /&gt;
var navs = findNavaidsWithinRange(pos, 10);&lt;br /&gt;
foreach(var nav; navs){&lt;br /&gt;
    print(nav.name, &amp;quot; (ID: &amp;quot;, nav.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2text = Searches for navaids within 10 nm of your current position.&lt;br /&gt;
|example2 = var navs = findNavaidsWithinRange(10);&lt;br /&gt;
foreach(var nav; navs){&lt;br /&gt;
    print(nav.name, &amp;quot; (ID: &amp;quot;, nav.id, &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===finddata()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = finddata(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=603|t=Source}}&lt;br /&gt;
|text = Takes a relative path and tries to return an absolute one. It works by appending the relative path to some paths and testing to see if they exist. As of FlightGear v3.7, these paths are the TerraSync directory (tested first) and [[$FG_ROOT]]. &lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = A relative path as a string.&lt;br /&gt;
|example1 = var path = finddata(&amp;quot;Aircraft/Generic&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to $FG_ROOT/Aircraft/Generic&lt;br /&gt;
|example2 = var path = finddata(&amp;quot;Airports&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to &amp;lt;TerraSync dir&amp;gt;/Airports&lt;br /&gt;
|example3 = var path = finddata(&amp;quot;preferences.xml&amp;quot;);&lt;br /&gt;
print(path); # prints the absolute path to $FG_ROOT/preferences.xml&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===flightplan()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = flightplan([path]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1738|t=Source}}&lt;br /&gt;
|text = {{see also|Nasal Flightplan}}&lt;br /&gt;
Returns a flight plan object, either one for the current flight plan, or one loaded from a given path.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional path to flight plan XML file.&lt;br /&gt;
|example1text = Gets the active flight plan and gets the ID of the current waypoint. Note that this example requires a flight plan to be set in the [[Route Manager]] first.&lt;br /&gt;
|example1 = var fp = flightplan();&lt;br /&gt;
print(fp.getWP(fp.current).id);&lt;br /&gt;
|example2text = Creates a new flight plan from an XML file and prints the IDs of the waypoints. Note that this example requires a flight plan to have been created and saved as &amp;lt;tt&amp;gt;''[[$FG_HOME]]/fp-demo.xml''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example2 = var path = getprop('/sim/fg-home') ~ '/fp-demo.xml';&lt;br /&gt;
var fp = flightplan(path);&lt;br /&gt;
for(var i = 0; i &amp;lt; fp.getPlanSize(); i += 1){&lt;br /&gt;
    print(fp.getWP(i).id);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===geodinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = geodinfo(lat, lon[, max_alt]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=981|t=Source}}&lt;br /&gt;
|text = Returns a vector containing two entries or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if no information could be obtained because the terrain tile wasn't loaded. The first entry in the vector is the elevation (in meters) for the given point, and the second is a hash with information about the assigned material (as defined in &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/Materials''&amp;lt;/tt&amp;gt;), or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if there was no material information available (for example, because there is an untextured building at that location). The structure of the hash is as follows (see also {{readme file|materials}}):&lt;br /&gt;
* '''light_coverage:''' The coverage of a single point of light in m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* '''bumpiness:''' Normalized bumpiness factor for the material.&lt;br /&gt;
* '''load_resistance:''' The amount of pressure in N/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; the material can withstand without deformation.&lt;br /&gt;
* '''solid:''' 1 (true) or false (0) depending on whether the material is solid or not.&lt;br /&gt;
* '''names:''' Vector of scenery types (usually generated by [[TerraGear]]) that will use this material. &lt;br /&gt;
* '''friction_factor:''' Normalized friction factor of the material.&lt;br /&gt;
* '''rolling_friction:''' The rolling friction coefficient of the material.&lt;br /&gt;
&lt;br /&gt;
Note that this function is a ''very'' CPU-intensive operation, particularly in FlightGear v2.4 and earlier. It is advised to use this function as little as possible.&lt;br /&gt;
|param1 = lat&lt;br /&gt;
|param1text = Latitude, inputted as a number.&lt;br /&gt;
|param2 = lon&lt;br /&gt;
|param2text = Longitude, inputted as a number.&lt;br /&gt;
|param3 = max_alt&lt;br /&gt;
|param3text = The altitude, in metres, from which the function will begin searching for the height of the terrain. Defaults to 10,000 metres. If the terrain is higher than this argument specifies, &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; will be returned.&lt;br /&gt;
|example1text = Dumps information about ground underneath the aircraft.&lt;br /&gt;
|example1 = var pos = geo.aircraft_position();&lt;br /&gt;
var info = geodinfo(pos.lat(), pos.lon());&lt;br /&gt;
debug.dump(info);&lt;br /&gt;
|example2text = Prints whether the ground underneath the aircraft is solid or is water.&lt;br /&gt;
|example2 = var pos = geo.aircraft_position();&lt;br /&gt;
var info = geodinfo(pos.lat(), pos.lon());&lt;br /&gt;
if (info != nil and info[1] != nil) {&lt;br /&gt;
    print(&amp;quot;The ground underneath the aircraft is &amp;quot;, info[1].solid == 1 ? &amp;quot;solid.&amp;quot; : &amp;quot;water.&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== geodtocart() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = geodtocart(lat, lon, alt);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=962|t=Source}}&lt;br /&gt;
|text = Converts {{wikipedia|geodetic coordinates}} (latitude, longitude, and altitude) to {{wikipedia|ECEF|Earth-centered, Earth-fixed}} coordinates (x, y and z). A vector is returned containing x, y, and z in metres. The equatorial radius of earth used is that defined by the {{wikipedia|WGS 84}} (6,378,137 metres). All argument are mandatory.&lt;br /&gt;
|param1 = lat&lt;br /&gt;
|param1text = Latitude, in degrees.&lt;br /&gt;
|param2 = lon&lt;br /&gt;
|param2text = Longitude, in degrees.&lt;br /&gt;
|param3 = alt&lt;br /&gt;
|param3text = Altitude, in metres.&lt;br /&gt;
|example1 = var (x, y, z) = geodtocart(0, 0, 0); # point is the intersection of the prime meridian and equator.&lt;br /&gt;
print(&amp;quot;x: &amp;quot;, x); # prints &amp;quot;x: 6378137&amp;quot;&lt;br /&gt;
print(&amp;quot;y: &amp;quot;, y); # prints &amp;quot;y: 0&amp;quot;&lt;br /&gt;
print(&amp;quot;z: &amp;quot;, z); # prints &amp;quot;y: 0&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== get_cart_ground_intersection()===&lt;br /&gt;
Introduced in 2017.2.1, see [[Terrain Detection]].&lt;br /&gt;
&lt;br /&gt;
===getprop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;getprop(path[, path[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=345|t=Source}}&lt;br /&gt;
|text = Returns the value of a node in the [[Property Tree]] or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; if the node does not exist or the value is not a number (NaN).&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = There needs to be at least one argument, but there is no limit to the maximum amount of arguments that can be given. The arguments will be concatenated together to form a property tree path. The arguments must be strings, but in FlightGear v3.2 onwards, there is also support (added by {{flightgear commit|34ed79}}) for numeric arguments as indices. See example 2 below.&lt;br /&gt;
|example1 = print(&amp;quot;You have FlightGear v&amp;quot;, getprop(&amp;quot;/sim/version/flightgear&amp;quot;)); # prints FlightGear version&lt;br /&gt;
|example2text = Note that the example below will only work in FlightGear 3.2 and above.&lt;br /&gt;
|example2 = for(var i = 0; i &amp;lt; 8; i += 1){&lt;br /&gt;
    print(&amp;quot;View #&amp;quot;, i + 1, &amp;quot; is named &amp;quot;, getprop(&amp;quot;/sim/view&amp;quot;, i, &amp;quot;name&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
|example3text = Same as above, but is supported by all versions of FlightGear.&lt;br /&gt;
|example3 = for(var i = 0; i &amp;lt; 8; i += 1){&lt;br /&gt;
    print(&amp;quot;View #&amp;quot;, i + 1, &amp;quot; is named &amp;quot;, getprop(&amp;quot;/sim/view[&amp;quot; ~ i ~ &amp;quot;]/name&amp;quot;));&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== See also====&lt;br /&gt;
{{note| If you have to read/write the same property multiple times (e.g. in an update loop), it is more efficient to use a node object: &lt;br /&gt;
To get a Node rather than its value, use &amp;lt;code&amp;gt;props.globals.getNode()&amp;lt;/code&amp;gt; - see [[Nasal_library/props]]. }}&lt;br /&gt;
&lt;br /&gt;
===greatCircleMove()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = greatCircleMove([pos, ]course, dist);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1681|t=Source}}&lt;br /&gt;
|text = Calculates a new set of geodetic coordinates using inputs of course and distance, either from the aircraft's current position (by default) or from another set of coordinates. Returns a hash containing two members, ''lat'' and ''lon'' (latitude and longitude respectively).&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to calculate from. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A &amp;lt;code&amp;gt;geo.Coord&amp;lt;/code&amp;gt; object&lt;br /&gt;
:* A lat/lon pair, that is, a pair of numbers (latitude followed by longitude) separated by a comma: &amp;lt;code&amp;gt;greatCircleMove(lat,lon, ...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param2 = course&lt;br /&gt;
|param2text = Course to new set of coordinates, in degrees (in the range 0–360).&lt;br /&gt;
|param3 = dist&lt;br /&gt;
|param3text = Distance in nautical miles to the new set of coordinates.&lt;br /&gt;
|example1 = var pos = greatCircleMove(0,0, 0, 1);&lt;br /&gt;
debug.dump(pos); # print hash with coordinates&lt;br /&gt;
|example2 = var fix = findFixesByID(&amp;quot;POGIC&amp;quot;);&lt;br /&gt;
fix = fix[0];&lt;br /&gt;
var pos = greatCircleMove(fix, 45, 10);&lt;br /&gt;
debug.dump(pos); # print hash with coordinates&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===interpolate()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|private = _interpolate()&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;interpolate(prop, value1, time1[, value2, time2[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=522|t=Part 1}} {{!}} {{fgdata file|Nasal/globals.nas|t=Part 2}}&lt;br /&gt;
|text = Linearly interpolates a node in the property tree to a given value in a specified time. The value/time pairs will be run one after the other in the order that they are passed to the function. Note that the interpolation will continue even when the simulation is paused.&lt;br /&gt;
|param1 = prop&lt;br /&gt;
|param1text = String or &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object that indicates a node in the property tree to be used.&lt;br /&gt;
|param2 = value''n''&lt;br /&gt;
|param2text = Target value to change the property to in the set amount of time. This should be a number.&lt;br /&gt;
|param3 = time''n''&lt;br /&gt;
|param3text = Time in seconds, that will be taken for the interpolation.&lt;br /&gt;
|example1text = Paste the code below into the Nasal Console and execute. Then, open the Property Browser and look for the property. Finally, run the code again, and watch the value of the property change.&lt;br /&gt;
|example1 = setprop(&amp;quot;/test&amp;quot;, 0); # (re-)set property&lt;br /&gt;
interpolate(&amp;quot;/test&amp;quot;,&lt;br /&gt;
    50, 5, # interpolate to 50 in 5 seconds&lt;br /&gt;
    10, 2, # interpolate to 10 in 2 seconds&lt;br /&gt;
    0, 5); # interpolate to 0 in 5 seconds&lt;br /&gt;
|example2 = # Apply the left brake at 20% per second&lt;br /&gt;
var prop = &amp;quot;controls/gear/brake-left&amp;quot;;&lt;br /&gt;
var dist = 1 - getprop(prop);&lt;br /&gt;
if (dist == 1) {&lt;br /&gt;
    interpolate(prop, 1, dist / 0.2);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isa()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isa(object, class);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Checks if an object is an instance of, or inherits from, a second object (or class), returning 1 (true) if it is and 0 (false) if otherwise.&lt;br /&gt;
|param1 = object&lt;br /&gt;
|param1text = Object to check.&lt;br /&gt;
|param2 = class&lt;br /&gt;
|param2text = Class/object to check that '''object''' inherits from or is an instance of.&lt;br /&gt;
|example1 = var coord = geo.Coord.new();&lt;br /&gt;
if(isa(coord, geo.Coord)){&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is an instance of class 'geo.Coord'&amp;quot;); # this one will be printed&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is not an instance of class 'geo.Coord'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
|example2 = var coord = geo.Coord.new();&lt;br /&gt;
if(isa(coord, props.Node)){&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is an instance of class 'props.Node'&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    print(&amp;quot;Variable 'coord' is not an instance of class 'props.Node'&amp;quot;); # this one will be printed&lt;br /&gt;
}&lt;br /&gt;
|example3text = The example below demonstrates checking of inheritance.&lt;br /&gt;
|example3 = var Const = {&lt;br /&gt;
    constant: 2,&lt;br /&gt;
    getConst: func {&lt;br /&gt;
        return me.constant;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Add = {&lt;br /&gt;
    new: func {&lt;br /&gt;
        return { parents: [Add, Const] };&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addToConst: func(a){&lt;br /&gt;
        return a * me.getConst();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var m = Add.new();&lt;br /&gt;
print(m.addToConst(4));&lt;br /&gt;
&lt;br /&gt;
if(isa(m, Add)) print(&amp;quot;Variable 'm' is an instance of class 'Add'&amp;quot;); # will be printed&lt;br /&gt;
if(isa(m, Const)) print(&amp;quot;Variable 'm' is an instance of class 'Const'&amp;quot;); # will also be printed&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===logprint()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;logprint(priority[, msg[, msg[, ...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=431|t=Source}}&lt;br /&gt;
|text = Concatenates a message and logs it with a given priority level. Unlike {{func link|print()}} and {{func link|printlog()}}, message outputted by this function will be logged in your &amp;lt;code&amp;gt;[[Commonly used debugging tools#fgfs.log|fgfs.log]]&amp;lt;/code&amp;gt; file as coming from the Nasal file itself rather than from {{flightgear file|src/Scripting/NasalSys.cxx}}.&lt;br /&gt;
|param1 = priority&lt;br /&gt;
|param1text = Number specifying the priority level of the outputted message:&lt;br /&gt;
:{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Number !! Debug type&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 1 {{!!}} Bulk&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 2 {{!!}} Debug&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 3 {{!!}} Info&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 4 {{!!}} Warn&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 5 {{!!}} Alert&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param2 = msg&lt;br /&gt;
|param2text = The message. There is no limit to the arguments you give give. They will be concatenated together before logging.&lt;br /&gt;
|example1 = # logs the value of pi to three decimal places with log level 3&lt;br /&gt;
logprint(3, &amp;quot;pi = &amp;quot;, sprintf(&amp;quot;%.3f&amp;quot;, math.pi));&lt;br /&gt;
|example2 = logprint(5, &amp;quot;Alert! This is an important message!&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
{{note| &lt;br /&gt;
The following constants have been added to the development branch of FlightGear (&amp;quot;next&amp;quot;) and will be releases with FG 2020.1 so you won't have to remember the numbers anymore:&lt;br /&gt;
&lt;br /&gt;
LOG_BULK, LOG_WARN, LOG_DEBUG, LOG_INFO, LOG_ALERT, DEV_WARN, DEV_ALERT }}&lt;br /&gt;
&lt;br /&gt;
===magvar() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = magvar([pos]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1642|t=Source}}&lt;br /&gt;
|text = Returns the {{wikipedia|magnetic variation}} at a given set of coordinates. The table below gives the magnetic model used depending on the version of FlightGear.&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! FlightGear versions !! Model !! Reference date&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 3.6 and above {{!!}} {{wikipedia|World Magnetic Model}} (WMM) 2015 {{!!}} 1 January 2015&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0.9.11-pre1 to 3.4 {{!!}} WMM 2005 {{!!}} 1 January 2005&lt;br /&gt;
{{!-}}&lt;br /&gt;
{{!}} 0.7.3 to 0.9.10 {{!!}} WMM 2000 {{!!}} 1 January 2000&lt;br /&gt;
{{!}}}&lt;br /&gt;
|param1 = pos&lt;br /&gt;
|param1text = Optional position to calculate from. If not given, the aircraft's current position will be used. Can be one of:&lt;br /&gt;
:* An &amp;lt;code&amp;gt;airport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;runway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxiway&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;waypoint&amp;lt;/code&amp;gt; ghost object.&lt;br /&gt;
:* A hash with ''lat'' and ''lon'' members&lt;br /&gt;
:* A &amp;lt;code&amp;gt;geo.Coord&amp;lt;/code&amp;gt; object&lt;br /&gt;
:* A lat/lon pair, that is, a pair of numbers (latitude followed by longitude) separated by a comma: &amp;lt;code&amp;gt;magvar(lat,lon)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = print(magvar(0, 0)); # prints the magnetic variation at 0, 0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===maketimer() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = maketimer(interval[, self], function);&lt;br /&gt;
|source = ''Implemented using the {{API Link|flightgear|class|TimerObj}} class.''&amp;lt;br&amp;gt;{{flightgear file|src/Scripting/NasalSys.cxx|l=90|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=533|t=Part 2}}&lt;br /&gt;
|version = 2.12&lt;br /&gt;
|commit = {{flightgear commit|ab939f|t=commit}}&lt;br /&gt;
|text = Returns a timer object containing the following methods and members:&lt;br /&gt;
* '''start()''': Starts the timer.&lt;br /&gt;
* '''stop()''': Stops the timer.&lt;br /&gt;
* '''restart(interval)''': Restarts the timer with the given interval.&lt;br /&gt;
* '''singleShot''': Bool showing whether the timer is only to be run once, or continuously until told to stop. Can be both set and read from (see examples).&lt;br /&gt;
* '''isRunning''': Read-only bool telling whether the timer is currently running.&lt;br /&gt;
* '''simulatedTime''': (FG 2017.1+; {{flightgear commit|0af316|t=commit}}) Bool telling whether the timer is using simulated time (which accounts for pause, etc.). Defaults to false (use real time). Can be both read and set. This cannot be changed while the timer is running.&lt;br /&gt;
Unlike {{func link|settimer()}}, which it replaces, &amp;lt;code&amp;gt;maketimer()&amp;lt;/code&amp;gt; provides more control over the timer. In addition, it can help reduce memory usage.&lt;br /&gt;
|param1 = interval&lt;br /&gt;
|param1text = Interval in seconds for the timer.&lt;br /&gt;
|param2 = self&lt;br /&gt;
|param2text = Optional parameter specifying what any &amp;lt;code&amp;gt;'''me'''&amp;lt;/code&amp;gt; references in the function being called will refer to.&lt;br /&gt;
|param3 = function&lt;br /&gt;
|param3text = Function to be called at the given interval.&lt;br /&gt;
|example1 = var timer = maketimer(1, func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;); # print &amp;quot;Hello, World!&amp;quot; once every second (call timer.stop() to stop it)&lt;br /&gt;
});&lt;br /&gt;
timer.start();&lt;br /&gt;
|example2 = var timer = maketimer(1, math, func(){&lt;br /&gt;
    print(me.math); # 'me' reference is the 'math' namespace&lt;br /&gt;
});&lt;br /&gt;
timer.singleShot = 1; # timer will only be run once&lt;br /&gt;
timer.start();&lt;br /&gt;
|example3 = var timer = maketimer(1, func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;); # print &amp;quot;Hello, World!&amp;quot; once every second (call timer.stop() to stop it)&lt;br /&gt;
});&lt;br /&gt;
timer.start();&lt;br /&gt;
print(timer.isRunning); # prints 1&lt;br /&gt;
|example4text = In the example below, &amp;quot;Hello, World!&amp;quot; will be printed after one second the first time, and after two seconds thereafter.&lt;br /&gt;
|example4 = var update = func(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
    timer.restart(2); # restarts the timer with a two second interval&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var timer = maketimer(1, update);&lt;br /&gt;
timer.singleShot = 1;&lt;br /&gt;
timer.start();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===maketimestamp()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = maketimestamp()&lt;br /&gt;
|source = ''Implemented using the {{API Link|flightgear|class|TimeStampObj}} class.''&amp;lt;br&amp;gt;{{flightgear file|src/Scripting/NasalSys.cxx|l=214|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=589|t=Part 2}}&lt;br /&gt;
|version = 2019.2&lt;br /&gt;
|commit = {{flightgear commit|7db06300|t=commit}}&lt;br /&gt;
|text = Returns a time stamp object to allow high resolution timing of Nasal operations. When created the timer will automatically be stamped. The object has the following methods:&lt;br /&gt;
* '''stamp()''': Resets the timing operation. Call this first.&lt;br /&gt;
* '''elapsedMSec()''': returns number of milliseconds elapsed since stamp() called. Resolution may vary depending on platform but is usually at least millisecond accuracy.&lt;br /&gt;
* '''elapsedUSec()''': returns number of microseconds elapsed since stamp() called. Resolution may vary depending on platform but is usually at least millisecond accuracy.&lt;br /&gt;
|&lt;br /&gt;
|example1text = In the example below the number of milliseconds elapsed will be printed.&lt;br /&gt;
|example1 = var timestamp = maketimestamp();&lt;br /&gt;
timestamp.stamp();&lt;br /&gt;
print(timestamp.elapsedMSec(), &amp;quot;ms elapsed&amp;quot;);&lt;br /&gt;
print(timestamp.elapsedMSec(), &amp;quot;ms elapsed&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===md5()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = md5(string);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=758|t=Source}}&lt;br /&gt;
|version = 3.2&lt;br /&gt;
|commit = {{flightgear commit|cfbf9e|t=commit}}&lt;br /&gt;
|text = Returns a the {{wikipedia|MD5}} hash (as a string) of the inputted string.&lt;br /&gt;
|param1 = string&lt;br /&gt;
|param1text = String the generate the hash of. Mandatory.&lt;br /&gt;
|example1text = The below code should output &amp;lt;code&amp;gt;65a8e27d8879283831b664bd8b7f0ad4&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = print(md5(&amp;quot;Hello, World!&amp;quot;));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===navinfo()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = navinfo(lat, lon, type, id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1453|t=Source}}&lt;br /&gt;
|text = Returns vector &amp;lt;code&amp;gt;navaid&amp;lt;/code&amp;gt; ghost objects matching the given '''type''' and '''id''' or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; on error.&lt;br /&gt;
|param1 = lat ''and'' lon&lt;br /&gt;
|param1text = If given, the returned navaids will be put into order of ascending distance from the location.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = Narrows the search to the given type. Must be one of &amp;quot;any,&amp;quot; &amp;quot;fix,&amp;quot; &amp;quot;vor,&amp;quot; &amp;quot;ndb,&amp;quot; &amp;quot;ils,&amp;quot; &amp;quot;dme,&amp;quot; or &amp;quot;tacan.&amp;quot; Defaults to the equivalent of &amp;quot;any.&amp;quot;&lt;br /&gt;
|param3 = id&lt;br /&gt;
|param3text = ID to search for. Note that, although all the parameters are technically optional, this parameter must be given, otherwise an empty vector will be returned.&lt;br /&gt;
|example1 = navinfo(&amp;quot;vor&amp;quot;); # returns all VORs&lt;br /&gt;
|example2 = navinfo(&amp;quot;HAM&amp;quot;); # return all navaids whose names start with &amp;quot;HAM&amp;quot;&lt;br /&gt;
|example3 = navinfo(&amp;quot;vor&amp;quot;, &amp;quot;HAM&amp;quot;); # return all VORs whose names start with &amp;quot;HAM&amp;quot;&lt;br /&gt;
|example4 = navinfo(34,48,&amp;quot;vor&amp;quot;,&amp;quot;HAM&amp;quot;); # return all VORs whose names start with &amp;quot;HAM&amp;quot; and sorted by distance relative to 34°, 48°&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===parse_markdown()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = parse_markdown(markdown);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=745|t=Part 1}} {{!}} {{simgear file|simgear/misc/SimpleMarkdown.cxx|t=Part 2}} &lt;br /&gt;
|version = 3.2&lt;br /&gt;
|text = Parses a string containing {{wikipedia|Markdown}} and returns the result as a string. As of FlightGear 2016.1, it is just a simple parser, and does the following:&lt;br /&gt;
* It strips whitespace from the beginning of the string.&lt;br /&gt;
* It supports [http://daringfireball.net/projects/markdown/syntax#p paragraphs and line breaks].&lt;br /&gt;
* It collapses whitespace.&lt;br /&gt;
* It converts unordered [http://daringfireball.net/projects/markdown/syntax#list lists] to use a bullet character (&amp;amp;bull;). Note that the bullet character is implemented in hexadecimal UTF-8 character bytes (&amp;lt;code&amp;gt;E2 80 A2&amp;lt;/code&amp;gt;), as so may not work properly when the being displayed in an encoding other than UTF-8.&lt;br /&gt;
|param1 = markdown&lt;br /&gt;
|param1text = String containing Markdown to be parsed.&lt;br /&gt;
|example1text = &lt;br /&gt;
Save the below code as &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/gui/dialogs/test.xml''&amp;lt;/tt&amp;gt;, then run the Nasal code below it to open the dialog. To change the markdown to be parsed, simply change the code in the highlighted section, save it, and reload the GUI (&amp;lt;tt&amp;gt;Debug &amp;gt; Reload GUI&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; highlight=&amp;quot;41-50&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;name&amp;gt;test&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;layout&amp;gt;vbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;group&amp;gt;&lt;br /&gt;
    &amp;lt;layout&amp;gt;hbox&amp;lt;/layout&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;empty&amp;gt;&lt;br /&gt;
        &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;/empty&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;text&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;parse_markdown() test dialog&amp;lt;/label&amp;gt;&lt;br /&gt;
    &amp;lt;/text&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;empty&amp;gt;&lt;br /&gt;
        &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;/empty&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button&amp;gt;&lt;br /&gt;
        &amp;lt;legend&amp;gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;
        &amp;lt;pref-width&amp;gt;16&amp;lt;/pref-width&amp;gt;&lt;br /&gt;
        &amp;lt;pref-height&amp;gt;16&amp;lt;/pref-height&amp;gt;&lt;br /&gt;
        &amp;lt;binding&amp;gt;&lt;br /&gt;
            &amp;lt;command&amp;gt;dialog-close&amp;lt;/command&amp;gt;&lt;br /&gt;
        &amp;lt;/binding&amp;gt;&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;canvas&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;Canvas plot&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;stretch&amp;gt;true&amp;lt;/stretch&amp;gt;&lt;br /&gt;
    &amp;lt;pref-width&amp;gt;400&amp;lt;/pref-width&amp;gt;&lt;br /&gt;
    &amp;lt;pref-height&amp;gt;300&amp;lt;/pref-height&amp;gt;&lt;br /&gt;
    &amp;lt;nasal&amp;gt;&lt;br /&gt;
        &amp;lt;load&amp;gt;&amp;lt;![CDATA[&lt;br /&gt;
var text = 'Items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears&lt;br /&gt;
&lt;br /&gt;
Some text.&lt;br /&gt;
Some more items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears';&lt;br /&gt;
&lt;br /&gt;
var parsed = parse_markdown(text);&lt;br /&gt;
&lt;br /&gt;
var root_canvas = canvas.get(cmdarg());&lt;br /&gt;
root_canvas.setColorBackground(255, 255, 255);&lt;br /&gt;
var root = root_canvas.createGroup();&lt;br /&gt;
&lt;br /&gt;
var text_dis = root.createChild(&amp;quot;text&amp;quot;)&lt;br /&gt;
    .setText(parsed)&lt;br /&gt;
    .setTranslation(5, 5)&lt;br /&gt;
    .setFont(&amp;quot;LiberationFonts\LiberationSans-Regular.ttf&amp;quot;)&lt;br /&gt;
    .setFontSize(15)&lt;br /&gt;
    .setColor(0, 0, 0)&lt;br /&gt;
    .setDrawMode(canvas.Text.TEXT)&lt;br /&gt;
    .setAlignment(&amp;quot;left-top&amp;quot;);&lt;br /&gt;
        ]]&amp;gt;&amp;lt;/load&amp;gt;&lt;br /&gt;
    &amp;lt;/nasal&amp;gt;&lt;br /&gt;
&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example1 = fgcommand(&amp;quot;dialog-show&amp;quot;, {&amp;quot;dialog-name&amp;quot;: &amp;quot;test&amp;quot;});&lt;br /&gt;
|example2text = The example below parses Markdown and outputs it in a HTML document. The parsed text is placed in &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; tags. To change the Markdown to be parsed, simply edit the variable &amp;lt;tt&amp;gt;markdown&amp;lt;/tt&amp;gt; at the top of the code.&lt;br /&gt;
|example2 = &amp;lt;nowiki&amp;gt;var markdown = 'Items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears&lt;br /&gt;
&lt;br /&gt;
Some text.&lt;br /&gt;
Some more items:&lt;br /&gt;
* apples&lt;br /&gt;
* oranges&lt;br /&gt;
* pears';&lt;br /&gt;
&lt;br /&gt;
var parsed = parse_markdown(markdown);&lt;br /&gt;
&lt;br /&gt;
debug.dump(parsed);&lt;br /&gt;
&lt;br /&gt;
var path = string.normpath(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ '/Export/parse_markdown()-test.html');&lt;br /&gt;
&lt;br /&gt;
var file = io.open(path, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var html = &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;\n\n&amp;lt;html&amp;gt;\n\n&amp;lt;head&amp;gt;\n\t&amp;lt;meta charset=\&amp;quot;UTF-8\&amp;quot;&amp;gt;\n\t&amp;lt;title&amp;gt;parse_markdown() test generated by Nasal&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n\n&amp;lt;body&amp;gt;\n\t&amp;lt;pre&amp;gt;&amp;quot; ~ parsed ~ &amp;quot;&amp;lt;/pre&amp;gt;\n&amp;lt;/body&amp;gt;\n\n&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
io.write(file, html);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(&amp;quot;Done, file ready for viewing (&amp;quot; ~ path ~ &amp;quot;)&amp;quot;);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===parsexml()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;parsexml(path[, start[, end[, data[, pro_ins]]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=710|t=Source}}&lt;br /&gt;
|text = This function is an interface into the built-in [http://expat.sourceforge.net/ Expat XML parser]. The absolute path to the file is returned as string, or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; is returned on error.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Mandatory absolute path to the XML file to be parsed.&lt;br /&gt;
|param2 = start&lt;br /&gt;
|param2text = Optional callback function that will be called for every starting tag. The function should take two argument: the tag name and a hash containing attributes.&lt;br /&gt;
|param3 = end&lt;br /&gt;
|param3text = Optional callback function that will be called for every ending tag. The function should take one argument: the tag name.&lt;br /&gt;
|param4 = data&lt;br /&gt;
|param4text = Optional callback function that will be called for every piece of data within a set of tags. The function should take one argument: the data as a string.&lt;br /&gt;
|param5 = pro_ins&lt;br /&gt;
|param5text = Optional callback function that will be called for every {{wikipedia|Processing Instruction|processing instruction}}. The function should take two argument: the target and the data string.&lt;br /&gt;
|example1text = Save the below XML code in &amp;lt;tt&amp;gt;''[[$FG_HOME]]/Export/demo.xml''&amp;lt;/tt&amp;gt;. Then, execute the Nasal code below in the Nasal Console. The XML will be parsed and each bit of the code will be printed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;style.xsl&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;foo&amp;gt;&lt;br /&gt;
  &amp;lt;blah type=&amp;quot;string&amp;quot;&amp;gt;&amp;lt;![CDATA[ &amp;lt;sender&amp;gt;John Smith&amp;lt;/sender&amp;gt; ]]&amp;gt;&amp;lt;/blah&amp;gt;&lt;br /&gt;
  &amp;lt;blah2 type=&amp;quot;string&amp;quot;&amp;gt;Orange &amp;amp;amp; lemons&amp;lt;/blah2&amp;gt;&lt;br /&gt;
&amp;lt;/foo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|example1 = var start = func(name, attr){&lt;br /&gt;
    print(&amp;quot;Starting tag: '&amp;quot;, name, &amp;quot;'&amp;quot;);&lt;br /&gt;
    foreach(var a; keys(attr)){&lt;br /&gt;
        print(&amp;quot;\twith attribute &amp;quot;, a, '=&amp;quot;', attr[a], '&amp;quot;');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var end = func(name){&lt;br /&gt;
    print(&amp;quot;Ending tag: '&amp;quot;, name, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var data = func(data){&lt;br /&gt;
    print(&amp;quot;Data = '&amp;quot;, data, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var pro_instr = func(target, data){&lt;br /&gt;
    print(&amp;quot;Processing instruction: target = '&amp;quot;, target, &amp;quot;', data = '&amp;quot;, data, &amp;quot;'&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
parsexml(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ '/Export/demo.xml', start, end, data, pro_instr);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===print()===&lt;br /&gt;
{{Note|As of 07/2020, we are in the process of slowly deprecating and removing Nasal print() (in fgdata) where possible in favor of log [[#logprint()]] which takes a priority level.&lt;br /&gt;
&lt;br /&gt;
This is part of the goal that we achieve zero output at log-level at alert, and everything shown at ‘warn; is really a warning, not just information.&amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/37042224/&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;print(data[, data[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=415|t=Source}}&lt;br /&gt;
|text = Concatenates its arguments and then prints it to the terminal and the [[Commonly used debugging tools#fgfs.log|log]]. Note that a newline is automatically added.&lt;br /&gt;
|param1 = data&lt;br /&gt;
|param1text = Data to print. Only strings and numbers can be printed; other data types will not be. There many be any number of arguments; they will just be concatenated together.&lt;br /&gt;
|example1 = print(&amp;quot;Just&amp;quot;, &amp;quot; a &amp;quot;, &amp;quot;test&amp;quot;); # prints &amp;quot;Just a test&amp;quot;&lt;br /&gt;
|example2 = print(&amp;quot;pi = &amp;quot;, math.pi); # prints &amp;quot;pi = 3.141592...&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== printf() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;printf(format[, arg[, arg, [...]]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Creates and prints a formatted string. For a description of its arguments, see {{func link|sprintf()}} (it is, in fact, implemented using &amp;lt;code&amp;gt;sprintf()&amp;lt;/code&amp;gt;).&lt;br /&gt;
|example1 = printf(&amp;quot;In hexadecimal, 100000 = %X&amp;quot;, 186A0); # prints &amp;quot;In hexadecimal, 100000 = 186A0&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===printlog()===&lt;br /&gt;
{{caution|This function is deprecated and doesn't work. Please use the new one {{func link|logprint()}}.}}&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;printlog(level, data[, data[, ...]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Prints the given message with the given log level. If the log level is higher or equal to &amp;lt;code&amp;gt;/sim/logging/priority&amp;lt;/code&amp;gt;, it is printed.&lt;br /&gt;
|param1 = level&lt;br /&gt;
|param1text = Mandatory log level as a string. Must be one of &amp;quot;none,&amp;quot; &amp;quot;bulk,&amp;quot; &amp;quot;debug,&amp;quot; &amp;quot;info,&amp;quot; &amp;quot;warn,&amp;quot; or &amp;quot;alert.&amp;quot; Note that &amp;quot;none&amp;quot; will mean that the message will never be printed.&lt;br /&gt;
|param2 = data&lt;br /&gt;
|param2text = Data to be printed. Only strings and numbers will be printed; others will not be. There may be any number of arguments; they will just be concatenated together.&lt;br /&gt;
|example1 = printlog(&amp;quot;alert&amp;quot;, &amp;quot;This is an alert&amp;quot;); # message will be printed&lt;br /&gt;
|example2 = printlog(&amp;quot;info&amp;quot;, &amp;quot;Just informing you about something&amp;quot;); # message will be printed only if log level is set to &amp;quot;info&amp;quot; or less&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===rand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = rand();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=554|t=Source}}&lt;br /&gt;
|text = Returns a random floating point number between 0 (inclusive) and 1 (exclusive). It takes no arguments.&lt;br /&gt;
|example1 = print(rand()); # prints random number&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===registerFlightPlanDelegate()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = registerFlightPlanDelegate(init_func);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1879|t=Source}}&lt;br /&gt;
|text = Registers a flight plan delegate. See &amp;lt;tt&amp;gt;''{{fgdata file|Nasal/route_manager.nas|t=$FG_ROOT/Nasal/route_manager.nas}}''&amp;lt;/tt&amp;gt; for examples.&lt;br /&gt;
|param1 = init_func&lt;br /&gt;
|param1text = Initialization function which will be called during FlightGear's startup.&lt;br /&gt;
}}&lt;br /&gt;
===removecommand()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removecommand(cmd);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=668|t=Source}}&lt;br /&gt;
|text = Removes the given fgcommand. Returns &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{caution|This will remove '''any''' [[fgcommands|fgcommand]], even those implemented in C++, so use with caution!}}&lt;br /&gt;
|param1 = cmd&lt;br /&gt;
|param1text = String specifying the name of the command to remove.&lt;br /&gt;
|example1 = addcommand(&amp;quot;hello&amp;quot;, func(){&lt;br /&gt;
    print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
fgcommand(&amp;quot;hello&amp;quot;); # &amp;quot;Hello&amp;quot; will be printed&lt;br /&gt;
removecommand(&amp;quot;hello&amp;quot;); # removes it&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===removelistener()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = removelistener(id);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=1384|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=506|t=Part 2}}&lt;br /&gt;
|text = Removes and deactivates the given listener and returns the number of listeners left or &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt; on error.&lt;br /&gt;
{{note|It is good practice to remove listeners when they are not required anymore. This prevents the listeners reducing FlightGear's run performance.}}&lt;br /&gt;
|param1 = id&lt;br /&gt;
|param1text = ID of listener as returned by {{func link|setlistener()}}.&lt;br /&gt;
|example1 = var ls = setlistener(&amp;quot;/sim/test&amp;quot;, func(){&lt;br /&gt;
    print(&amp;quot;Property '/sim/test' has been changed&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
setprop(&amp;quot;/sim/test&amp;quot;, &amp;quot;blah&amp;quot;); # trigger listener&lt;br /&gt;
var rem = removelistener(ls); # remove listener&lt;br /&gt;
print(&amp;quot;There are &amp;quot;, rem, &amp;quot; listeners remaining&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===resolvepath()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = resolvepath(path);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=604|t=Source}}&lt;br /&gt;
|text = Takes a relative path as a string and uses [[SimGear]]'s path-resolving framework to return an absolute path as a string. If the path could not be resolved, an empty string is returned. See [[Resolving Paths]] for a detailed description of the algorithm. This function can also be used to check if a file exists.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Relative path to be completed.&lt;br /&gt;
|example1 = print(resolvepath(&amp;quot;Nasal/globals.nas&amp;quot;)); # prints the equivalent of $FG_ROOT/Nasal/globals.nas&lt;br /&gt;
|example2 = print(resolvepath(&amp;quot;blah&amp;quot;)); # prints nothing; could not be resolved&lt;br /&gt;
|example3 = var file_path = resolvepath(&amp;quot;Aircraft/SenecaII/some-file&amp;quot;);&lt;br /&gt;
if (file_path != &amp;quot;&amp;quot;){&lt;br /&gt;
    gui.popupTip(&amp;quot;some-file found&amp;quot;, 2);&lt;br /&gt;
} else {&lt;br /&gt;
    gui.popupTip(&amp;quot;some-file not found&amp;quot;, 2);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===setlistener()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;setlistener(node, code[, init[, type]]);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|private = _setlistener()&lt;br /&gt;
|source = {{flightgear file|src/Scripting/Nasal|l=499|t=Part 1}} {{!}} {{flightgear file|src/Scripting/Nasal|l=1350|t=Part 2}}&amp;lt;br&amp;gt;''Listener implemented using the {{API Link|flightgear|class|FGNasalListener}} class.''&lt;br /&gt;
|text = Creates a listener which will be triggered when the given property is changed (depending on the '''type'''). A unique integer ID is returned; this can later be used as the argument to {{func link|removelistener()}}.&lt;br /&gt;
{{note|Listeners are known to be a source of resource leaks. To avoid this, please take measures such as:&lt;br /&gt;
* Using {{func link|removelistener()}} when they are not needed any more.&lt;br /&gt;
* Using a single initialization listener.&lt;br /&gt;
* Avoiding tying listeners to properties that are rapidly updated (e.g., many times per frame).&lt;br /&gt;
}}&lt;br /&gt;
|param1 = node&lt;br /&gt;
|param1text = Mandatory string or &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to a property in the [[Property Tree]].&lt;br /&gt;
|param2 = code&lt;br /&gt;
|param2text = Mandatory callback function to execute when the listener is triggered. The function can take up to four arguments in the following order:&lt;br /&gt;
* '''changed''': a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to the changed node.&lt;br /&gt;
* '''listen''': a &amp;lt;code&amp;gt;props.Node&amp;lt;/code&amp;gt; object pointing to the listened-to node. Note that this argument maybe different depending on the '''type'''.&lt;br /&gt;
* '''mode''': an integer telling how the listener was triggered. 0 means that the value was changed. 1 means that a child property was added. -1 means that a child property was removed.&lt;br /&gt;
* '''is_child''': boolean telling whether '''changed''' is a child property of the listened-to '''node''' or not. 1 (true) if it is, 0 (false) otherwise.&lt;br /&gt;
|param3 = init&lt;br /&gt;
|param3text = If set to 1 (true), the listener will additionally be triggered when it is created. This argument is optional and defaults to 0 (false).&lt;br /&gt;
|param4 = type&lt;br /&gt;
|param4text = Integer specifying the listener's behavior. 0 means that the listener will only trigger when the property is changed. 1 means that the trigger will always be triggered when the property is written to. 2 will mean that the listener will be triggered even if child properties are modified. This argument is optional and defaults to 1.&lt;br /&gt;
|example1 = var prop = props.globals.initNode(&amp;quot;/sim/test&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;STRING&amp;quot;); # create property&lt;br /&gt;
var id = setlistener(&amp;quot;/sim/test&amp;quot;, func(n){ # create listener&lt;br /&gt;
    print(&amp;quot;Value: &amp;quot;, n.getValue());&lt;br /&gt;
});&lt;br /&gt;
setprop(&amp;quot;/sim/test&amp;quot;, &amp;quot;blah&amp;quot;); # trigger listener&lt;br /&gt;
removelistener(id); # remove listener&lt;br /&gt;
prop.remove(); # remove property&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===setprop()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = &amp;lt;nowiki&amp;gt;setprop(path[, path[, ...]], value);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=385|t=Source}}&lt;br /&gt;
|text = Sets the value of a property in the [[Property Tree]]. If the property does not exist, it will be created. Returns 1 (true) on success or 0 (false) if there was an error.&lt;br /&gt;
{{note|If you want to remove a property, you will have to use one of the &amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; helpers:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
props.globals.getNode(&amp;quot;foo/bar&amp;quot;).remove(); # take out the complete node&lt;br /&gt;
props.globals.getNode(&amp;quot;foo&amp;quot;).removeChild(&amp;quot;bar&amp;quot;); # take out a certain child node&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = There needs to be at least one '''path''' argument, but there is no limit to the maximum amount that can be given. They will be concatenated together to form a property tree path. The arguments must be strings, but in FlightGear v3.2 onwards, there also is support (added by {{flightgear commit|34ed79}}) for numeric arguments as indices. See example 2 below.&lt;br /&gt;
|param2 = value&lt;br /&gt;
|param2text = Value to write to the given property. Must be either a string or a number.&lt;br /&gt;
|example1 = setprop(&amp;quot;/sim/demo&amp;quot;, &amp;quot;This is a demo&amp;quot;);&lt;br /&gt;
|example2text = Note that the example below will only work in FlightGear 3.2 and above.&lt;br /&gt;
|example2 = for(var i = 0; i &amp;lt; 3; i += 1){&lt;br /&gt;
    setprop(&amp;quot;/sim/demo&amp;quot;, i, &amp;quot;Demo #&amp;quot; ~ i));&lt;br /&gt;
}&lt;br /&gt;
|example3text = Same as above, but is supported by all versions of FlightGear.&lt;br /&gt;
|example3 = for(var i = 0; i &amp;lt; 3; i += 1){&lt;br /&gt;
    setprop(&amp;quot;/sim/demo[&amp;quot; ~ i ~ &amp;quot;]&amp;quot;, &amp;quot;Demo #&amp;quot; ~ i));&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
====See also====&lt;br /&gt;
{{note| If you have to read/write the same property multiple times (e.g. in an update loop), it is more efficient to use a node object: &lt;br /&gt;
To get a Node rather than its value, use &amp;lt;code&amp;gt;props.globals.getNode()&amp;lt;/code&amp;gt; - see [[Nasal_library/props]]. }}&lt;br /&gt;
&lt;br /&gt;
===settimer() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = settimer(function, delta[, realtime]);&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=499|t=Part 1}} {{!}} {{flightgear file|src/Scripting/NasalSys.cxx|l=1286|t=Part 2}}&lt;br /&gt;
|text = Runs the given function a specified amount of seconds after the current time. Returns &amp;lt;code&amp;gt;'''nil'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{note|Improper use of &amp;lt;code&amp;gt;settimer()&amp;lt;/code&amp;gt; may cause resource leaks. It is also highly recommended that the newer {{func link|maketimer()}} should be used instead of this function.}} &lt;br /&gt;
|param1 = function&lt;br /&gt;
|param1text = Mandatory function that will be called. It may be necessary to enclose code in an anonymous function (see example).&lt;br /&gt;
|param2 = delta&lt;br /&gt;
|param2text = Mandatory amount of time in seconds after which the function will be called.&lt;br /&gt;
|param3 = realtime&lt;br /&gt;
|param3text = If 1 (true), &amp;quot;real time&amp;quot; will be used instead of &amp;quot;simulation time.&amp;quot; Defaults to 0 (false). Note that if &amp;quot;simulation time&amp;quot; is used, the timer will not run while FlightGear is paused.&lt;br /&gt;
|example1 = var myFunc = func(){&lt;br /&gt;
    print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
settimer(myFunc, 2); # runs myFunc after 2 seconds&lt;br /&gt;
|example2 = var sqr = func(a){&lt;br /&gt;
    return a * a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
settimer(func(){&lt;br /&gt;
    print(sqr(2)); # will print 4 after 2 seconds&lt;br /&gt;
}, 2);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===srand() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = srand();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=559|t=Source}}&lt;br /&gt;
|text = Makes the pseudorandom number generator (see {{func link|rand()}}) generate a new {{wikipedia|random seed|noicon=1}} based on time. Returns 0.&lt;br /&gt;
}}&lt;br /&gt;
===systime()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = systime();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalSys.cxx|l=770|t=Source}}&lt;br /&gt;
|text = Returns the {{wikipedia|Unix time}} (seconds since since 00:00:00 UTC, 1/1/1970) as a floating point number with high resolution. This function is useful for benchmarking purposes (see example 2).&lt;br /&gt;
{{note|1=High resolution timers under Windows can produce inaccurate or fixed sub-millisecond results.&amp;lt;ref&amp;gt;{{cite web|url=http://forum.flightgear.org/viewtopic.php?f=30&amp;amp;t=29259|title=Nasal: systime() ??!?|author=Necolatis|date=Apr 2nd, 2016}}&amp;lt;/ref&amp;gt; This is due to the underlying {{func link|GetSystemTimeAsFileTime()|link=https://msdn.microsoft.com/en-us/library/windows/desktop/ms724397(v=vs.85).aspx}} API call, which depends on hardware availability of suitable high resolution timers. See also [https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx Acquiring high-resolution time stamps]}}&lt;br /&gt;
|example1 = print(&amp;quot;Unix time: &amp;quot;, systime()); # prints Unix time&lt;br /&gt;
|example2 = var myFunc = func(){&lt;br /&gt;
    for(var i = 0; i &amp;lt;= 10; i += 1){&lt;br /&gt;
        print(&amp;quot;Interation #&amp;quot;, i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
var t = systime(); # record time&lt;br /&gt;
myFunc(); # run function&lt;br /&gt;
var t2 = systime(); # record new time&lt;br /&gt;
print(&amp;quot;myFunc() took &amp;quot;, t2 - t, &amp;quot; seconds&amp;quot;); # print result&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===thisfunc()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = thisfunc();&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns the function from which this function is called. This allows a function to reliably and safely call itself from within a closure.&lt;br /&gt;
|example1 = var stringify_vec = func(input){&lt;br /&gt;
    if (typeof(input) == &amp;quot;scalar&amp;quot;){&lt;br /&gt;
        return sprintf(&amp;quot;%s&amp;quot;, input);&lt;br /&gt;
    } elsif (typeof(input) == &amp;quot;vector&amp;quot;) {&lt;br /&gt;
        if (size(input) == 0) return &amp;quot;[]&amp;quot;;&lt;br /&gt;
        var this = thisfunc();&lt;br /&gt;
        var buffer = &amp;quot;[&amp;quot;;&lt;br /&gt;
        for(var i = 0; i &amp;lt; size(input); i += 1){&lt;br /&gt;
            buffer ~= this(input[i]);&lt;br /&gt;
            if (i == size(input) - 1) {&lt;br /&gt;
                buffer ~= &amp;quot;]&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                buffer ~= &amp;quot;, &amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return buffer;&lt;br /&gt;
    } else {&lt;br /&gt;
        die(&amp;quot;stringify_vec(): Error! Invalid input. Must be a vector or scalar&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var test_vec = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, [1, 2, 3], &amp;quot;d&amp;quot;];&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # prints &amp;quot;[a, b, c, [1, 2, 3], d]&amp;quot;&lt;br /&gt;
test_vec = [];&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # prints &amp;quot;[]&amp;quot;&lt;br /&gt;
test_vec = {};&lt;br /&gt;
debug.dump(stringify_vec(test_vec)); # will throw an error&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===tileIndex() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = tileIndex();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1720|t=Source}}&lt;br /&gt;
|text = Returns the index of the tile at the aircraft's current position as a string. This corresponds to the name of the STG file of the tile. For example, at [[KSFO]], this would be &amp;lt;code&amp;gt;942050&amp;lt;/code&amp;gt;, corresponding to &amp;lt;tt&amp;gt;''[[$FG_SCENERY]]/Terrain/w130n30/w123n3/942050.stg''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example1 = print(tileIndex()); # print index&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== tilePath()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = tilePath();&lt;br /&gt;
|source = {{flightgear file|src/Scripting/NasalPositioned.cxx|l=1712|t=Source}}&lt;br /&gt;
|text = Returns the base path of the tile at the aircraft's current position as a string. For example, at KSFO, this would be &amp;lt;code&amp;gt;w130n30/w123n3&amp;lt;/code&amp;gt;, corresponding to &amp;lt;tt&amp;gt;''[[$FG_SCENERY]]/Terrain/w130n30/w123n3''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|example1 = print(tilePath()); # print path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== values()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = values(hash);&lt;br /&gt;
|source = {{fgdata file|Nasal/globals.nas|t=Source}}&lt;br /&gt;
|text = Returns a vector containing the values of the given hash.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = Mandatory hash to get the values of.&lt;br /&gt;
|example1 = var hash = {&lt;br /&gt;
    &amp;quot;a&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;b&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;c&amp;quot;: 3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
foreach(var val; values(hash)){&lt;br /&gt;
    print(val);&lt;br /&gt;
}&lt;br /&gt;
|example2text = The below example does exactly the same thing as the above example, but does not use &amp;lt;code&amp;gt;values()&amp;lt;/code&amp;gt;:&lt;br /&gt;
|example2 = var hash = {&lt;br /&gt;
    &amp;quot;a&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;b&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;c&amp;quot;: 3&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
foreach(var key; keys(hash)){&lt;br /&gt;
    print(hash[key]);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extension functions new in FG 2020.1 ==&lt;br /&gt;
The following functions have been added to the nasal core library and will be released with FlightGear version 2020.1. &lt;br /&gt;
Before the release they are available in the development branch &amp;quot;next&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===isfunc()===&lt;br /&gt;
Returns 1 if type or argument is a function, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===isghost()===&lt;br /&gt;
Returns 1 if type or argument is a ghost, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
=== ishash()===&lt;br /&gt;
Returns 1 if type or argument is a hash, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===isint()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isint(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if argument has a numeric value and x == floor(x), e.g. integer.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isnum()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isnum(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if typeof(x) is &amp;quot;scalar&amp;quot; and x has a numeric value otherwise 0. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isscalar()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = isscalar(x);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns 1 if type or argument is a scalar (string or numeric), otherwise (vector, hash, func, ...) it returns 0. This is useful to check if a variable can be converted to string e.g. when useing the string concat operator &amp;quot;~&amp;quot;. &lt;br /&gt;
|example1 = var a = &amp;quot;foo&amp;quot;; &lt;br /&gt;
var b=42;&lt;br /&gt;
if (isscalar(a) and isscalar(b)) print(a~b);&lt;br /&gt;
if (isstr(a)) print(&amp;quot;a is a string&amp;quot;);&lt;br /&gt;
if (isint(b)) print(&amp;quot;b is an integer&amp;quot;);&lt;br /&gt;
# if (isscalar(a))... is equivalent to if (typeof(a) == &amp;quot;scalar&amp;quot;)...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===isstr()===&lt;br /&gt;
Returns 1 if type or argument is a string, otherwise 0. &lt;br /&gt;
&lt;br /&gt;
===isvec()===&lt;br /&gt;
Returns 1 if type or argument is a vector, otherwise 0.&lt;br /&gt;
&lt;br /&gt;
===vecindex()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = vecindex(vector, value);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|t=Source}}&lt;br /&gt;
|text = Returns the index of value or nil, if value is not found in vector.&lt;br /&gt;
|example1=&lt;br /&gt;
var myvector = [&amp;quot;apple&amp;quot;, &amp;quot;bananna&amp;quot;, &amp;quot;coconut&amp;quot;];&lt;br /&gt;
# to check if a vector contains a certain value compare vecindex to nil&lt;br /&gt;
if (vecindex(myvector, &amp;quot;apple&amp;quot;) != nil) {&lt;br /&gt;
    print(&amp;quot;found apple&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
# WARNING: this will not work as desired because index is 0&lt;br /&gt;
if (vecindex(myvector, &amp;quot;apple&amp;quot;)) {&lt;br /&gt;
    print(&amp;quot;found apple&amp;quot;);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extension functions new in &amp;quot;dev&amp;quot; version ==&lt;br /&gt;
The following functions have been added to the nasal core library curernty on &amp;quot;dev&amp;quot; version.&lt;br /&gt;
&lt;br /&gt;
===member()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = member(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=796|t=Source}}&lt;br /&gt;
|text = The function searches for a key in the given hash, including the &amp;lt;code&amp;gt;parents&amp;lt;/code&amp;gt;. If the key is found, its value is returned; otherwise, it returns &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash in which the key is searched.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = Key as a string whose value we want to return.&lt;br /&gt;
|example1 = &lt;br /&gt;
var Hash = {&lt;br /&gt;
    key: 12,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Hash, 'key');     # return 12&lt;br /&gt;
member(Hash, 'missing'); # return nil&lt;br /&gt;
|example2 = # member() also includes parents&lt;br /&gt;
&lt;br /&gt;
var Base = {&lt;br /&gt;
    key: 'text',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Child = {&lt;br /&gt;
    parents: [Base],&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Child, 'key');     # return 'text'&lt;br /&gt;
member(Child, 'missing'); # return nil&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===has_member()===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = has_member(hash, key);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/lib.c|l=811|t=Source}}&lt;br /&gt;
|text = The function searches for a key in the given hash, including the &amp;lt;code&amp;gt;parents&amp;lt;/code&amp;gt;. If the key is found, &amp;lt;code&amp;gt;trur&amp;lt;/code&amp;gt; is returned; otherwise &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
|param1 = hash&lt;br /&gt;
|param1text = The hash in which the key is searched.&lt;br /&gt;
|param2 = key&lt;br /&gt;
|param2text = Key as a string.&lt;br /&gt;
|example1 = &lt;br /&gt;
var Hash = {&lt;br /&gt;
    key: 12,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Hash, 'key');     # return true&lt;br /&gt;
member(Hash, 'missing'); # return false&lt;br /&gt;
|example2 = # has_member() also includes parents&lt;br /&gt;
&lt;br /&gt;
var Base = {&lt;br /&gt;
    key: 'text',&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Child = {&lt;br /&gt;
    parents: [Base],&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
member(Child, 'key');     # return true&lt;br /&gt;
member(Child, 'missing'); # return false&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Variables==&lt;br /&gt;
Various global constants (technically variables) are provided for use in converting between different units. They are all found in {{fgdata file|Nasal/globals.nas|text=$FG_ROOT/Nasal/globals.nas}}.&lt;br /&gt;
&lt;br /&gt;
===D2R===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var radians = degrees * D2R;&lt;br /&gt;
|text = Converts an angle from degrees to radians when multiplied by the angle in degrees. Equal to &amp;lt;code&amp;gt;π / 180&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
===FPS2KT===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var knots = feet_per_second * FPS2KT;&lt;br /&gt;
|text = Converts a velocity from feet per second to knots when multiplied by the velocity in feet per second. Approximately equal to 0.5925.&lt;br /&gt;
}}&lt;br /&gt;
===FT2M===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = feet * FT2M;&lt;br /&gt;
|text = Converts a length from feet to metres when multiplied by the length in feet. Equal to 0.3048.&lt;br /&gt;
}}&lt;br /&gt;
===GAL2L ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var litres = gallons * GAL2L;&lt;br /&gt;
|text = Converts a volume from US liquid gallons to litres when multiplied by the volume in gallons. Approximately equal to 3.7854.&lt;br /&gt;
}}&lt;br /&gt;
===IN2M===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = inches * IN2M;&lt;br /&gt;
|text = Converts a length from inches to metres when multiplied by the length in inches. Equal to 0.0254.&lt;br /&gt;
}}&lt;br /&gt;
===KG2LB===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var pounds = kilograms * KG2LB;&lt;br /&gt;
|text = Converts a mass from kilograms to pounds when multiplied by the mass in kilograms. Approximately equal to 2.2046.&lt;br /&gt;
}}&lt;br /&gt;
===KT2FPS===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var feet_per_second = knots * KT2FPS;&lt;br /&gt;
|text = Converts a velocity from knots to feet per second when multiplied by the velocity in knots. Approximately equal to 1.6878.&lt;br /&gt;
}}&lt;br /&gt;
===KT2MPS===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres_per_second = knots * KT2MPS;&lt;br /&gt;
|text = Converts a velocity from knots to metres per second when multiplied by the velocity in knots. Approximately equal to 0.5144.&lt;br /&gt;
}}&lt;br /&gt;
===L2GAL===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var gallons = litres * L2GAL;&lt;br /&gt;
|text = Converts a volume from litres to US liquid gallons when multiplied by the volume in litres. Approximately equal to 0.2642.&lt;br /&gt;
}}&lt;br /&gt;
===LB2KG===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var kilograms = pounds * LB2KG;&lt;br /&gt;
|text = Converts a mass from pounds to kilograms when multiplied by the mass in pounds. Approximately equal to 0.4536.&lt;br /&gt;
}}&lt;br /&gt;
===M2FT ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var feet = metres * M2FT;&lt;br /&gt;
|text = Converts a length from metres to feet when multiplied by the length in metres. Approximately equal to 3.2808.&lt;br /&gt;
}}&lt;br /&gt;
===M2IN===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var inches = metres * M2IN;&lt;br /&gt;
|text = Converts a length from metres to inches when multiplied by the length in metres. Approximately equal to 39.3701.&lt;br /&gt;
}}&lt;br /&gt;
===M2NM ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var nautical_miles = metres * M2NM;&lt;br /&gt;
|text = Converts a length from metres to nautical miles when multiplied by the length in metres. Approximately equal to 0.00054.&lt;br /&gt;
}}&lt;br /&gt;
===MPS2KT ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var knots = metres_per_second * MPS2KT;&lt;br /&gt;
|text = Converts a velocity from metres per second to knots when multiplied by the velocity in metres per second. Approximately equal to 1.9438.&lt;br /&gt;
}}&lt;br /&gt;
===NM2M ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var metres = nautical_miles * NM2M;&lt;br /&gt;
|text = Converts a length from nautical miles to metres when multiplied by the length in nautical miles. Equal to 1,852.&lt;br /&gt;
}}&lt;br /&gt;
===R2D===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = var degrees = radians * R2D;&lt;br /&gt;
|text = Converts an angle from radians to degrees when multiplied by the angle in radians. Equal to &amp;lt;code&amp;gt;180 / π&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143263</id>
		<title>FlightGear Newsletter November 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143263"/>
		<updated>2025-12-11T22:41:32Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Multiplayer events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-11}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-11}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-20251113-202721.jpg|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana has begun writing the manual for the Photoscenery GUI, which has been published at the following link:&lt;br /&gt;
https://wiki.flightgear.org/Julia_photoscenery_generator_GUI&lt;br /&gt;
The manual currently contains the essential information for correct installation.&lt;br /&gt;
&lt;br /&gt;
New features in the latest version include:&lt;br /&gt;
&lt;br /&gt;
The tool, which already managed the rational downloading of tiles in various resolutions, now includes additional features accessible via its web interface to increase operational utility. The program's initialization has been modified to enable faster startup.&lt;br /&gt;
&lt;br /&gt;
A new functionality has been introduced to read airports and radio navigation aids from files updated weekly—the same data sources used by FlightGear itself. This resolves the previous issue of airport misalignment between the tool and the simulator.&lt;br /&gt;
&lt;br /&gt;
Route management has been improved. When loading a route for display on the map, the system now simultaneously loads data on local scenery to prevent unnecessary downloads. For users with a fast internet connection, real-time image downloading is possible. A fast, low-resolution preload feature also provides a valid overview of the surrounding area's coverage.&lt;br /&gt;
&lt;br /&gt;
The interface allows users to view radio navigation aids and airports, along with their key information.&lt;br /&gt;
&lt;br /&gt;
The [create route] mode enables users to generate a flight path by clicking on map points, airports, and navigation aids. Created routes can be saved and later imported into FlightGear for use.&lt;br /&gt;
&lt;br /&gt;
Many other features will be documented on the Wiki in the future.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=390&lt;br /&gt;
&lt;br /&gt;
=== Framework for Canvas Add-on ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom on the forum) created a [https://github.com/PlayeRom/flightgear-addon-framework Framework] for creating add-ons based on Canvas dialog boxes. After creating numerous add-ons, he realized he needed to separate the common code base. This led to the creation of a separate Framework project that could be attached to any add-on. The framework includes the following features:&lt;br /&gt;
&lt;br /&gt;
# Automatic recognition and loading of add-on Nasal files into the appropriate namespaces (with an exclusion list if necessary).&lt;br /&gt;
# Ability to add a menu for restarting add-on Nasal files without having to change repository files.&lt;br /&gt;
# Ability to define keys for the multi-key command to restart add-on Nasal files without having to change repository files.&lt;br /&gt;
# A mechanism for checking whether there is a new version of your add-on to inform users about it.&lt;br /&gt;
# Base classes for Canvas windows that are created and destroyed on demand (Transient dialog), as well as created once during simulator startup (Persistent dialog).&lt;br /&gt;
# Ability to create Nasal unit tests and run them using multi-key command.&lt;br /&gt;
&lt;br /&gt;
An example project using the Framework is the [https://github.com/PlayeRom/flightgear-addon-canvas-skeleton Canvas Skeleton] project, which can be used as a basis for creating a new add-on.&lt;br /&gt;
&lt;br /&gt;
You can also see how his other add-ons are written, all based on the Framework (main branches):&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-aerotow-everywhere Aerotow Everywhere]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-logbook Logbook]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-on Menu Aggregator]&lt;br /&gt;
&lt;br /&gt;
=== Add-ons Menu Aggregator ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki has created a new &amp;quot;[https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-ons Menu Aggregator]&amp;quot; add-on. The &amp;quot;Add-ons Menu Aggregator&amp;quot; add-on solves the problem of increasing menu clutter in FlightGear, which occurs after installing multiple add-ons. Each add-on can add its own items to the main menu, causing it to become very large and, at low resolutions, extend beyond the screen. This makes it difficult for users to find functions related to specific add-ons, and the menu itself becomes unreadable.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Add-ons Menu Aggregator&amp;quot; automatically aggregates menu entries from all installed add-ons and places them into one common menu item – &amp;quot;Add-ons.&amp;quot; Each add-on receives its own submenu here, containing its original items while maintaining full functionality and layout.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|gNH3MBpRxjo|480px||Add-ons Menu Aggregator - Polish audio}}&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
=== Aircraft reviews ===&lt;br /&gt;
==== Laminar 13 Hang Glider for FlightGear ====&lt;br /&gt;
==== Flight Test &amp;amp; Personal Tweaks by Vons ====&lt;br /&gt;
&lt;br /&gt;
Having recently become interested in gliding and soaring in FG, I thought I'd go a (simpler) step further and merely strap a wing to myself (or me to a wing). That of course was also a good opportunity to harmonize further a few of the control inputs on the Laminar 13 for my rig/setup, as well as (subtly) to modify some of the weight shifts, drag and lift values, etc. Representative clip below for those who enjoy hang gliders, both real ones and in the world of FG.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|tHQqhl3Sf5w|||Flight Test &amp;amp; Tweaks Laminar 13 Hang Glider for FlightGear|frame}}&lt;br /&gt;
&lt;br /&gt;
If you're interested in seeing the flight test results and accessing the tweaks, visit the forum page at: https://forum.flightgear.org/viewtopic.php?f=19&amp;amp;t=42893&amp;amp;start=45#p436600&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finished events ===&lt;br /&gt;
==== Independence Day Event 2025 ====&lt;br /&gt;
To celebrate Poland's Independence Day, the Polish Discord channel organized an Air Show with several performances. Clips are included in the video:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|ekiLpbSXAmU|480px||Independence Day Event 2025}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[Category:Changes after 2024.1]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 11]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Add_aerotow_hitch_to_an_AI-aircraft&amp;diff=143216</id>
		<title>Howto:Add aerotow hitch to an AI-aircraft</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Add_aerotow_hitch_to_an_AI-aircraft&amp;diff=143216"/>
		<updated>2025-12-09T13:18:19Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the visualization of the tow rope, it is advantageous if a hitch position is defined for the AI tow plane.&lt;br /&gt;
&lt;br /&gt;
To set the hitch position for the AI aircraft, add the following code to the top of the &amp;lt;tt&amp;gt;{aircraft}-ai.xml&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nasal&amp;gt;&lt;br /&gt;
    &amp;lt;load&amp;gt;&lt;br /&gt;
      var acNode = cmdarg(); # &amp;quot;/ai/models/aircraft&amp;quot;&lt;br /&gt;
      acNode.getNode(&amp;quot;sim/hitches/aerotow/local-pos-x&amp;quot;, true).setValue(x); # forward&lt;br /&gt;
      acNode.getNode(&amp;quot;sim/hitches/aerotow/local-pos-y&amp;quot;, true).setValue(y); # left&lt;br /&gt;
      acNode.getNode(&amp;quot;sim/hitches/aerotow/local-pos-z&amp;quot;, true).setValue(z); # up&lt;br /&gt;
    &amp;lt;/load&amp;gt;&lt;br /&gt;
    &amp;lt;unload&amp;gt;&lt;br /&gt;
      acNode.getNode(&amp;quot;sim/hitches&amp;quot;).remove();&lt;br /&gt;
    &amp;lt;/unload&amp;gt;&lt;br /&gt;
  &amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Rest of content here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In place of x, y, z, enter appropriate values for the hitch position.&lt;br /&gt;
Coordinate system: x forward, y to the left, and z up. The units are meters.&lt;br /&gt;
&lt;br /&gt;
That's it! The tow rope ends at the defined position.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[Soaring]]&lt;br /&gt;
* [[Improving Glider Realism]]&lt;br /&gt;
* [[Howto:Setup winch and aerotowing for JSBSim-aircraft]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Aircraft enhancement]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_December_2025&amp;diff=143215</id>
		<title>FlightGear Newsletter December 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_December_2025&amp;diff=143215"/>
		<updated>2025-12-09T11:35:54Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-12}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-12}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI ====&lt;br /&gt;
[[File:FG-JPS.png|thumb|278px|FG Julia Photoscenery-GUI Design proposal &amp;quot;LIBERA ET TESSELA&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
A major update has been released for the Photoscenery GUI, introducing significant accessibility enhancements.&lt;br /&gt;
&lt;br /&gt;
The key addition is full Internationalization (i18n) support, which makes the tool more accessible to a global audience. Users can now switch between languages instantly using new flag icons located in the control panel.&lt;br /&gt;
&lt;br /&gt;
What’s New:&lt;br /&gt;
&lt;br /&gt;
Multi-language Support:&lt;br /&gt;
The interface now supports multiple languages, including: English, Italian, French, German, Spanish, Portuguese, Chinese (Simplified), Japanese, Korean, Arabic (with full Right-to-Left layout support), and Russian.&lt;br /&gt;
&lt;br /&gt;
UI Improvements:&lt;br /&gt;
A new language switcher with flag icons has been implemented. Layout and font sizes have been optimized for better readability across different languages. Spacing in the control panel has been improved for a cleaner interface.&lt;br /&gt;
&lt;br /&gt;
This update is now available in the main branch on GitHub https://github.com/abassign/Photoscenery-GUI.git. Users are encouraged to test the new features and provide feedback regarding any translation errors or suggestions for additional language support.&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=420&lt;br /&gt;
&lt;br /&gt;
=== Re-Introducing the Rain Vector Editor Addon ===&lt;br /&gt;
This tool has been around for awhile, to reintroduce it there is a short video in the forum link below demonstrating its simple use. Use it to get the exact splash-x, y and z vectors that best look like rain on any specific window. Use that data to code dynamic control over the look of rain on windows and windscreens when introducing wind, prop blast and aircraft velocity through the air.&lt;br /&gt;
&lt;br /&gt;
https://sourceforge.net/p/flightgear/fgaddon/HEAD/tree/trunk/Addons/RainVectorEditor/&lt;br /&gt;
&lt;br /&gt;
https://forum.flightgear.org/viewtopic.php?f=14&amp;amp;t=43932&amp;amp;sid=20078e01f815391532dbded0a512a825&amp;amp;start=45#p436889&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143214</id>
		<title>FlightGear Newsletter November 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143214"/>
		<updated>2025-12-09T11:35:35Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-11}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-11}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-20251113-202721.jpg|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana has begun writing the manual for the Photoscenery GUI, which has been published at the following link:&lt;br /&gt;
https://wiki.flightgear.org/Julia_photoscenery_generator_GUI&lt;br /&gt;
The manual currently contains the essential information for correct installation.&lt;br /&gt;
&lt;br /&gt;
New features in the latest version include:&lt;br /&gt;
&lt;br /&gt;
The tool, which already managed the rational downloading of tiles in various resolutions, now includes additional features accessible via its web interface to increase operational utility. The program's initialization has been modified to enable faster startup.&lt;br /&gt;
&lt;br /&gt;
A new functionality has been introduced to read airports and radio navigation aids from files updated weekly—the same data sources used by FlightGear itself. This resolves the previous issue of airport misalignment between the tool and the simulator.&lt;br /&gt;
&lt;br /&gt;
Route management has been improved. When loading a route for display on the map, the system now simultaneously loads data on local scenery to prevent unnecessary downloads. For users with a fast internet connection, real-time image downloading is possible. A fast, low-resolution preload feature also provides a valid overview of the surrounding area's coverage.&lt;br /&gt;
&lt;br /&gt;
The interface allows users to view radio navigation aids and airports, along with their key information.&lt;br /&gt;
&lt;br /&gt;
The [create route] mode enables users to generate a flight path by clicking on map points, airports, and navigation aids. Created routes can be saved and later imported into FlightGear for use.&lt;br /&gt;
&lt;br /&gt;
Many other features will be documented on the Wiki in the future.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=390&lt;br /&gt;
&lt;br /&gt;
=== Framework for Canvas Add-on ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom on the forum) created a [https://github.com/PlayeRom/flightgear-addon-framework Framework] for creating add-ons based on Canvas dialog boxes. After creating numerous add-ons, he realized he needed to separate the common code base. This led to the creation of a separate Framework project that could be attached to any add-on. The framework includes the following features:&lt;br /&gt;
&lt;br /&gt;
# Automatic recognition and loading of add-on Nasal files into the appropriate namespaces (with an exclusion list if necessary).&lt;br /&gt;
# Ability to add a menu for restarting add-on Nasal files without having to change repository files.&lt;br /&gt;
# Ability to define keys for the multi-key command to restart add-on Nasal files without having to change repository files.&lt;br /&gt;
# A mechanism for checking whether there is a new version of your add-on to inform users about it.&lt;br /&gt;
# Base classes for Canvas windows that are created and destroyed on demand (Transient dialog), as well as created once during simulator startup (Persistent dialog).&lt;br /&gt;
# Ability to create Nasal unit tests and run them using multi-key command.&lt;br /&gt;
&lt;br /&gt;
An example project using the Framework is the [https://github.com/PlayeRom/flightgear-addon-canvas-skeleton Canvas Skeleton] project, which can be used as a basis for creating a new add-on.&lt;br /&gt;
&lt;br /&gt;
You can also see how his other add-ons are written, all based on the Framework (main branches):&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-aerotow-everywhere Aerotow Everywhere]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-logbook Logbook]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-on Menu Aggregator]&lt;br /&gt;
&lt;br /&gt;
=== Add-ons Menu Aggregator ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki has created a new &amp;quot;[https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-ons Menu Aggregator]&amp;quot; add-on. The &amp;quot;Add-ons Menu Aggregator&amp;quot; add-on solves the problem of increasing menu clutter in FlightGear, which occurs after installing multiple add-ons. Each add-on can add its own items to the main menu, causing it to become very large and, at low resolutions, extend beyond the screen. This makes it difficult for users to find functions related to specific add-ons, and the menu itself becomes unreadable.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Add-ons Menu Aggregator&amp;quot; automatically aggregates menu entries from all installed add-ons and places them into one common menu item – &amp;quot;Add-ons.&amp;quot; Each add-on receives its own submenu here, containing its original items while maintaining full functionality and layout.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|gNH3MBpRxjo|480px||Add-ons Menu Aggregator - Polish audio}}&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_October_2025&amp;diff=143213</id>
		<title>FlightGear Newsletter October 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_October_2025&amp;diff=143213"/>
		<updated>2025-12-09T11:35:21Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-10}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-10}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
No News letter for October 2025&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Nasal Namespace Browser ===&lt;br /&gt;
&lt;br /&gt;
After 7 years, Roman Ludwicki resurrected [[Nasal Browser|Nasal Browser]] as an add-on. [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser] it's reimplementation of the Nasal Browser using Canvas Widgets.&lt;br /&gt;
&lt;br /&gt;
This add-on is useful for developers who want to view all the namespaces created in Nasal. It also makes it easier to understand how namespaces are organized.&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_September_2025&amp;diff=143212</id>
		<title>FlightGear Newsletter September 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_September_2025&amp;diff=143212"/>
		<updated>2025-12-09T11:35:05Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-09}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-09}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI Beta ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-Beta-20250810.png|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana Adriano continues working on the beta version of his Julia code, which provides an interactive map-based workflow for generating photographic scenery for FlightGear. The latest release now includes a feature that shows where the system places the Orthophotos and Orthophotos-save directories.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=375&lt;br /&gt;
&lt;br /&gt;
=== Which Runway Add-on ===&lt;br /&gt;
&lt;br /&gt;
[[File:Which_Runway_main_window_v.1.3.0.png|thumb|Which Runway main window]]&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom) created a new add-on names &amp;quot;[https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&amp;quot;. This add-on uses weather data and preferred runways at the airport (ICAO.rwyuse.xml files) to indicate the best runway for takeoff or landing. It also calculates headwinds, crosswinds, and tailwinds for each airport runway (which can be useful for input into the MCDU), and provides a wealth of information about the airport and its runways, along with a graphical representation on a wind rose.&lt;br /&gt;
&lt;br /&gt;
See also [https://forum.flightgear.org/viewtopic.php?f=89&amp;amp;t=43680 forum] and [[Which_Runway_Add-on|wiki]] pages.&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear's Screenshot of the Month {{#time: F | 2025-9}} 2025 is &amp;quot;Operation Market Garden&amp;quot; by @OrbitalMartian&lt;br /&gt;
&lt;br /&gt;
[[File:Operation Market Garden by @OrbitalMartian.webp|thumb|Operation Market Garden by @OrbitalMartian]]&lt;br /&gt;
&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 09]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-095 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_August_2025&amp;diff=143211</id>
		<title>FlightGear Newsletter August 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_August_2025&amp;diff=143211"/>
		<updated>2025-12-09T11:34:52Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-08}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-08}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI Beta ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-Beta-20250810.png|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana has released a beta version of his code written in Julia. Now It provides an interactive map-based workflow for generating photographic scenery for FlightGear.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=345&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_July_2025&amp;diff=143210</id>
		<title>FlightGear Newsletter July 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_July_2025&amp;diff=143210"/>
		<updated>2025-12-09T11:34:36Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-07}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-07}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Related Software tools and projects == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Those not being part of FlightGear itself, like for example OpenRadar, TerreMaster or flightgear-atc.alwaysdata.net. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-06}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-06 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-06 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 06]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-06 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_June_2025&amp;diff=143209</id>
		<title>FlightGear Newsletter June 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_June_2025&amp;diff=143209"/>
		<updated>2025-12-09T11:34:21Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-06}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-06}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
No News letter for June 2025&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Related Software tools and projects == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Those not being part of FlightGear itself, like for example OpenRadar, TerreMaster or flightgear-atc.alwaysdata.net. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_October_2025&amp;diff=143208</id>
		<title>FlightGear Newsletter October 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_October_2025&amp;diff=143208"/>
		<updated>2025-12-09T11:28:18Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Development news */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-05}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-05}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
No News letter for October 2025&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Nasal Namespace Browser ===&lt;br /&gt;
&lt;br /&gt;
After 7 years, Roman Ludwicki resurrected [[Nasal Browser|Nasal Browser]] as an add-on. [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser] it's reimplementation of the Nasal Browser using Canvas Widgets.&lt;br /&gt;
&lt;br /&gt;
This add-on is useful for developers who want to view all the namespaces created in Nasal. It also makes it easier to understand how namespaces are organized.&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143207</id>
		<title>FlightGear Newsletter November 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143207"/>
		<updated>2025-12-09T11:16:56Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Add-ons Menu Aggregator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-05}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-05}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-20251113-202721.jpg|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana has begun writing the manual for the Photoscenery GUI, which has been published at the following link:&lt;br /&gt;
https://wiki.flightgear.org/Julia_photoscenery_generator_GUI&lt;br /&gt;
The manual currently contains the essential information for correct installation.&lt;br /&gt;
&lt;br /&gt;
New features in the latest version include:&lt;br /&gt;
&lt;br /&gt;
The tool, which already managed the rational downloading of tiles in various resolutions, now includes additional features accessible via its web interface to increase operational utility. The program's initialization has been modified to enable faster startup.&lt;br /&gt;
&lt;br /&gt;
A new functionality has been introduced to read airports and radio navigation aids from files updated weekly—the same data sources used by FlightGear itself. This resolves the previous issue of airport misalignment between the tool and the simulator.&lt;br /&gt;
&lt;br /&gt;
Route management has been improved. When loading a route for display on the map, the system now simultaneously loads data on local scenery to prevent unnecessary downloads. For users with a fast internet connection, real-time image downloading is possible. A fast, low-resolution preload feature also provides a valid overview of the surrounding area's coverage.&lt;br /&gt;
&lt;br /&gt;
The interface allows users to view radio navigation aids and airports, along with their key information.&lt;br /&gt;
&lt;br /&gt;
The [create route] mode enables users to generate a flight path by clicking on map points, airports, and navigation aids. Created routes can be saved and later imported into FlightGear for use.&lt;br /&gt;
&lt;br /&gt;
Many other features will be documented on the Wiki in the future.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=390&lt;br /&gt;
&lt;br /&gt;
=== Framework for Canvas Add-on ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom on the forum) created a [https://github.com/PlayeRom/flightgear-addon-framework Framework] for creating add-ons based on Canvas dialog boxes. After creating numerous add-ons, he realized he needed to separate the common code base. This led to the creation of a separate Framework project that could be attached to any add-on. The framework includes the following features:&lt;br /&gt;
&lt;br /&gt;
# Automatic recognition and loading of add-on Nasal files into the appropriate namespaces (with an exclusion list if necessary).&lt;br /&gt;
# Ability to add a menu for restarting add-on Nasal files without having to change repository files.&lt;br /&gt;
# Ability to define keys for the multi-key command to restart add-on Nasal files without having to change repository files.&lt;br /&gt;
# A mechanism for checking whether there is a new version of your add-on to inform users about it.&lt;br /&gt;
# Base classes for Canvas windows that are created and destroyed on demand (Transient dialog), as well as created once during simulator startup (Persistent dialog).&lt;br /&gt;
# Ability to create Nasal unit tests and run them using multi-key command.&lt;br /&gt;
&lt;br /&gt;
An example project using the Framework is the [https://github.com/PlayeRom/flightgear-addon-canvas-skeleton Canvas Skeleton] project, which can be used as a basis for creating a new add-on.&lt;br /&gt;
&lt;br /&gt;
You can also see how his other add-ons are written, all based on the Framework (main branches):&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-aerotow-everywhere Aerotow Everywhere]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-logbook Logbook]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-on Menu Aggregator]&lt;br /&gt;
&lt;br /&gt;
=== Add-ons Menu Aggregator ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki has created a new &amp;quot;[https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-ons Menu Aggregator]&amp;quot; add-on. The &amp;quot;Add-ons Menu Aggregator&amp;quot; add-on solves the problem of increasing menu clutter in FlightGear, which occurs after installing multiple add-ons. Each add-on can add its own items to the main menu, causing it to become very large and, at low resolutions, extend beyond the screen. This makes it difficult for users to find functions related to specific add-ons, and the menu itself becomes unreadable.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Add-ons Menu Aggregator&amp;quot; automatically aggregates menu entries from all installed add-ons and places them into one common menu item – &amp;quot;Add-ons.&amp;quot; Each add-on receives its own submenu here, containing its original items while maintaining full functionality and layout.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|gNH3MBpRxjo|480px||Add-ons Menu Aggregator - Polish audio}}&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143206</id>
		<title>FlightGear Newsletter November 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143206"/>
		<updated>2025-12-09T11:14:10Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Related Software tools and projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-05}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-05}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-20251113-202721.jpg|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana has begun writing the manual for the Photoscenery GUI, which has been published at the following link:&lt;br /&gt;
https://wiki.flightgear.org/Julia_photoscenery_generator_GUI&lt;br /&gt;
The manual currently contains the essential information for correct installation.&lt;br /&gt;
&lt;br /&gt;
New features in the latest version include:&lt;br /&gt;
&lt;br /&gt;
The tool, which already managed the rational downloading of tiles in various resolutions, now includes additional features accessible via its web interface to increase operational utility. The program's initialization has been modified to enable faster startup.&lt;br /&gt;
&lt;br /&gt;
A new functionality has been introduced to read airports and radio navigation aids from files updated weekly—the same data sources used by FlightGear itself. This resolves the previous issue of airport misalignment between the tool and the simulator.&lt;br /&gt;
&lt;br /&gt;
Route management has been improved. When loading a route for display on the map, the system now simultaneously loads data on local scenery to prevent unnecessary downloads. For users with a fast internet connection, real-time image downloading is possible. A fast, low-resolution preload feature also provides a valid overview of the surrounding area's coverage.&lt;br /&gt;
&lt;br /&gt;
The interface allows users to view radio navigation aids and airports, along with their key information.&lt;br /&gt;
&lt;br /&gt;
The [create route] mode enables users to generate a flight path by clicking on map points, airports, and navigation aids. Created routes can be saved and later imported into FlightGear for use.&lt;br /&gt;
&lt;br /&gt;
Many other features will be documented on the Wiki in the future.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=390&lt;br /&gt;
&lt;br /&gt;
=== Framework for Canvas Add-on ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom on the forum) created a [https://github.com/PlayeRom/flightgear-addon-framework Framework] for creating add-ons based on Canvas dialog boxes. After creating numerous add-ons, he realized he needed to separate the common code base. This led to the creation of a separate Framework project that could be attached to any add-on. The framework includes the following features:&lt;br /&gt;
&lt;br /&gt;
# Automatic recognition and loading of add-on Nasal files into the appropriate namespaces (with an exclusion list if necessary).&lt;br /&gt;
# Ability to add a menu for restarting add-on Nasal files without having to change repository files.&lt;br /&gt;
# Ability to define keys for the multi-key command to restart add-on Nasal files without having to change repository files.&lt;br /&gt;
# A mechanism for checking whether there is a new version of your add-on to inform users about it.&lt;br /&gt;
# Base classes for Canvas windows that are created and destroyed on demand (Transient dialog), as well as created once during simulator startup (Persistent dialog).&lt;br /&gt;
# Ability to create Nasal unit tests and run them using multi-key command.&lt;br /&gt;
&lt;br /&gt;
An example project using the Framework is the [https://github.com/PlayeRom/flightgear-addon-canvas-skeleton Canvas Skeleton] project, which can be used as a basis for creating a new add-on.&lt;br /&gt;
&lt;br /&gt;
You can also see how his other add-ons are written, all based on the Framework (main branches):&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-aerotow-everywhere Aerotow Everywhere]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-logbook Logbook]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-on Menu Aggregator]&lt;br /&gt;
&lt;br /&gt;
=== Add-ons Menu Aggregator ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki has created a new &amp;quot;[https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-ons Menu Aggregator]&amp;quot; add-on. The &amp;quot;Add-ons Menu Aggregator&amp;quot; add-on solves the problem of increasing menu clutter in FlightGear, which occurs after installing multiple add-ons. Each add-on can add its own items to the main menu, causing it to become very large and, at low resolutions, extend beyond the screen. This makes it difficult for users to find functions related to specific add-ons, and the menu itself becomes unreadable.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Add-ons Menu Aggregator&amp;quot; automatically aggregates menu entries from all installed add-ons and places them into one common menu item – &amp;quot;Add-ons.&amp;quot; Each add-on receives its own submenu here, containing its original items while maintaining full functionality and layout.&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 05]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_September_2025&amp;diff=143205</id>
		<title>FlightGear Newsletter September 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_September_2025&amp;diff=143205"/>
		<updated>2025-12-09T11:09:50Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: /* Related Software tools and projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-05}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-05}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator GUI ===&lt;br /&gt;
==== Photoscenery-GUI Beta ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-Beta-20250810.png|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana Adriano continues working on the beta version of his Julia code, which provides an interactive map-based workflow for generating photographic scenery for FlightGear. The latest release now includes a feature that shows where the system places the Orthophotos and Orthophotos-save directories.&lt;br /&gt;
&lt;br /&gt;
https://github.com/abassign/Photoscenery-GUI.git&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=375&lt;br /&gt;
&lt;br /&gt;
=== Which Runway Add-on ===&lt;br /&gt;
&lt;br /&gt;
[[File:Which_Runway_main_window_v.1.3.0.png|thumb|Which Runway main window]]&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom) created a new add-on names &amp;quot;[https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&amp;quot;. This add-on uses weather data and preferred runways at the airport (ICAO.rwyuse.xml files) to indicate the best runway for takeoff or landing. It also calculates headwinds, crosswinds, and tailwinds for each airport runway (which can be useful for input into the MCDU), and provides a wealth of information about the airport and its runways, along with a graphical representation on a wind rose.&lt;br /&gt;
&lt;br /&gt;
See also [https://forum.flightgear.org/viewtopic.php?f=89&amp;amp;t=43680 forum] and [[Which_Runway_Add-on|wiki]] pages.&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Finished events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FlightGear's Screenshot of the Month {{#time: F | 2025-9}} 2025 is &amp;quot;Operation Market Garden&amp;quot; by @OrbitalMartian&lt;br /&gt;
&lt;br /&gt;
[[File:Operation Market Garden by @OrbitalMartian.webp|thumb|Operation Market Garden by @OrbitalMartian]]&lt;br /&gt;
&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Changes after 2024.1]]&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 09]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-095 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter&amp;diff=143204</id>
		<title>FlightGear Newsletter</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter&amp;diff=143204"/>
		<updated>2025-12-09T11:03:02Z</updated>

		<summary type="html">&lt;p&gt;PlayeRom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:magagazine.png|right]]&lt;br /&gt;
&lt;br /&gt;
The '''FlightGear Newsletter''' is intended to provide a collection of the latest developments from the worldwide [[FlightGear]] community. With so much development ongoing, it's almost impossible for anyone to keep up. The newsletter was started in July 2009, and is presented on a monthly basis.  It is a collaborative effort that is created, edited and distributed via the [[FlightGear Wiki]], and all FlightGear users, contributors and developers are invited to contribute.&lt;br /&gt;
&lt;br /&gt;
=== Archive ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;noresize&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2025&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2024&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2023&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2022&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2021&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2020&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2019&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2018&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2017&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2016&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2015&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2014&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2013&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2012&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2011&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2010&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | 2009&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2025|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2025|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2025|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2025|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2025|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2025|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2025|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2025|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2025|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2025|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2025|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2025|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2024|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2024|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2024|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2024|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2024|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2024|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2024|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2024|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2024|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2024|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2024|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2024|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2023|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2023|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2023|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2023|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2023|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2023|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2023|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2023|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2023|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2023|October]] &lt;br /&gt;
* [[FlightGear Newsletter November 2023|November]] &lt;br /&gt;
* [[FlightGear Newsletter December 2023|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2022|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2022|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2022|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2022|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2022|May]] &lt;br /&gt;
* June&lt;br /&gt;
* [[FlightGear Newsletter July 2022|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2022|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2022|September]]&lt;br /&gt;
* [[FlightGear Newsletter November 2022|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2022|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2021|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2021|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2021|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2021|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2021|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2021|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2021|July]] &lt;br /&gt;
* [[FlightGear Newsletter August 2021|August]] &lt;br /&gt;
* [[FlightGear Newsletter September 2021|September]] &lt;br /&gt;
* [[FlightGear Newsletter October 2021|October]] &lt;br /&gt;
* [[FlightGear Newsletter November 2021|November]] &lt;br /&gt;
* [[FlightGear Newsletter December 2021|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2020|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2020|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2020|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2020|April]] &lt;br /&gt;
* [[FlightGear Newsletter May 2020|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2020|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2020|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2020|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2020|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2020|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2020|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2020|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2019|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2019|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2019|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2019|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2019|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2019|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2019|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2019|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2019|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2019|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2019|November]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2018|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2018|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2018|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2018|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2018|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2018|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2018|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2018|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2018|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2018|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2018|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2018|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2017|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2017|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2017|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2017|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2017|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2017|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2017|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2017|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2017|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2017|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2017|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2017|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2016|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2016|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2016|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2016|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2016|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2016|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2016|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2016|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2016|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2016|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2016|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2016|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2015|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2015|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2015|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2015|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2015|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2015|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2015|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2015|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2015|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2015|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2015|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2015|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2014|January]] &lt;br /&gt;
* [[FlightGear Newsletter February 2014|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2014|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2014|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2014|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2014|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2014|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2014|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2014|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2014|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2014|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2014|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2013|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2013|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2013|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2013|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2013|May]] &lt;br /&gt;
* [[FlightGear Newsletter June 2013|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2013|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2013|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2013|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2013|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2013|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2013|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2012|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2012|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2012|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2012|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2012|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2012|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2012|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2012|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2012|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2012|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2012|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2012|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2011|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2011|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2011|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2011|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2011|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2011|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2011|July]] &lt;br /&gt;
* [[FlightGear Newsletter August 2011|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2011|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2011|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2011|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2011|December]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter January 2010|January]]&lt;br /&gt;
* [[FlightGear Newsletter February 2010|February]]&lt;br /&gt;
* [[FlightGear Newsletter March 2010|March]]&lt;br /&gt;
* [[FlightGear Newsletter April 2010|April]]&lt;br /&gt;
* [[FlightGear Newsletter May 2010|May]]&lt;br /&gt;
* [[FlightGear Newsletter June 2010|June]]&lt;br /&gt;
* [[FlightGear Newsletter July 2010|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2010|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2010|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2010|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2010|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2010|December]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
* [[FlightGear Newsletter July 2009|July]]&lt;br /&gt;
* [[FlightGear Newsletter August 2009|August]]&lt;br /&gt;
* [[FlightGear Newsletter September 2009|September]]&lt;br /&gt;
* [[FlightGear Newsletter October 2009|October]]&lt;br /&gt;
* [[FlightGear Newsletter November 2009|November]]&lt;br /&gt;
* [[FlightGear Newsletter December 2009|December]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some newsletter editions have been translated in other languages:&lt;br /&gt;
* [[File:De.gif|16px|link=:De:FlightGear Newsletter]] [[:De:FlightGear Newsletter|Deutsch]]&lt;br /&gt;
* [[File:Es.gif|16px|link=:Es:FlightGear Newsletter]] [[:Es:FlightGear Newsletter|Español]]&lt;br /&gt;
* [[File:Fr.gif|16px|link=:Fr:FlightGear Newsletter]] [[:Fr:FlightGear Newsletter|Français]]&lt;br /&gt;
&lt;br /&gt;
=== You are invited to contribute! ===&lt;br /&gt;
We would like to emphasize that the monthly newsletter can not live without the contributions of FlightGear users and developers. The FlightGear Newsletter is a community-driven newsletter, which means that it is created and edited by people like ''you''. You don't need to be a long-time FlightGear user (or even a developer) to contribute to the newsletter. &lt;br /&gt;
&lt;br /&gt;
In fact, helping write the monthly FlightGear newsletter is an excellent way for getting started contributing to the FlightGear community very quickly and very easily. &lt;br /&gt;
&lt;br /&gt;
Even if you don't have to add anything yourself, just reviewing and improving additions by others is also highly appreciated, as are efforts to help translate newsletters or add screen shots (e.g. taken from the forum or mailing lists) to the newsletter. Screen shots can be uploaded at [[Special:Upload]].&lt;br /&gt;
&lt;br /&gt;
Everyone with a wiki account (free to [[Special:UserLogin|register]]) can edit the newsletter and every contribution is welcome. So if you know about any FlightGear related projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.&lt;br /&gt;
&lt;br /&gt;
A simple template providing a basic structure for each upcoming newsletter can be taken from [[Talk:Next newsletter]]. This template can be copied/pasted into each new newsletter to help users getting started providing contents.&lt;br /&gt;
&lt;br /&gt;
The draft for the upcoming newsletter can always be found at [[Next newsletter]].&lt;br /&gt;
&lt;br /&gt;
If English is not your native language, please don't be concerned about contributing to the newsletter, you can always easily ask fellow FlightGear users to review or proof-read your changes. Also, one of the easiest ways to get started is simply copying/pasting text from forum or mailing list discussions, such as announcements (e.g., new aircraft, new scenery, etc.).&lt;br /&gt;
&lt;br /&gt;
Another neat option to get started is adding links to FlightGear-related YouTube videos. For this, we have a dedicated section in each newsletter: &amp;quot;[[FlightGear Newsletter {{#time: F Y | last month }}#FlightGear on YouTube|FlightGear on YouTube]].&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you want to embed a video, please see {{mediawiki|Extension:EmbedVideo#Usage}}&lt;br /&gt;
&lt;br /&gt;
If you are looking for other ways to get involved, please see [[Volunteer]].&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear Newsletter| ]]&lt;br /&gt;
[[Category:Community|Newsletter]]&lt;br /&gt;
[[Category:Lists|Newsletter]]&lt;br /&gt;
&lt;br /&gt;
[[de:FlightGear Newsletter]]&lt;br /&gt;
[[es:FlightGear Newsletter]]&lt;br /&gt;
[[fr:FlightGear Newsletter]]&lt;/div&gt;</summary>
		<author><name>PlayeRom</name></author>
	</entry>
</feed>