<?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=Chillz</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=Chillz"/>
	<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/Special:Contributions/Chillz"/>
	<updated>2026-04-19T04:07:12Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Portal:Wiki&amp;diff=125724</id>
		<title>Portal:Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Portal:Wiki&amp;diff=125724"/>
		<updated>2020-06-14T15:42:41Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Fixing grammatical errors, making main page more easier to understand&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Main page/Header&lt;br /&gt;
  |title=Welcome to the wiki editing portal&lt;br /&gt;
  |introduction= This is the place to find out what is happening on the FlightGear wiki. Learn what tasks need to be done and what groups there are to join, and share news about recent events or current activities taking place on the wiki.&lt;br /&gt;
  |rightbox=&lt;br /&gt;
&amp;lt;!-------------------------------------------------------------&lt;br /&gt;
                    Portal overview&lt;br /&gt;
--------------------------------------------------------------&amp;gt;&lt;br /&gt;
  |rightcolumn1= &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:105%; font-weight:bold&amp;quot;&amp;gt;Checking articles&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-style:italic;&amp;quot;&amp;gt;&lt;br /&gt;
Also check: [[Special:NewPages|new articles]], [[Special:NewFiles|new files]] and [[Special:RecentChanges|recent changes]].&amp;lt;/span&amp;gt;&lt;br /&gt;
  |rightcolumn2= [[FIle:Portal lamp.png|40px]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:105%; font-weight:bold&amp;quot;&amp;gt;Inspiration for new articles&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-style:italic;&amp;quot;&amp;gt;&lt;br /&gt;
[[Understanding the Project]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Special:WantedPages|Most wanted articles]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Help:Translate|Translating articles]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  |rightcolumn3= [[File:Portal_radarwheel.png|40px]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:105%; font-weight:bold&amp;quot;&amp;gt;Improving articles&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-style:italic;&amp;quot;&amp;gt;&lt;br /&gt;
[[Wiki Housekeepking]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Category:Articles considered for deletion|Articles considered for deletion]] – [[:Category:Accuracy disputes|Accuracy disputes]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[:Category:Stubs|Extending short articles]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fixing up articles with wrong quotes]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[:Category:Articles to be merged|Articles to be merged]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[FlightGear wiki:Manual of Style|Manual of Style]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  |rightcolumn4= [[File:Portal developer.png|40px]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:105%; font-weight:bold&amp;quot;&amp;gt;Regular maintenance&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-style:italic;&amp;quot;&amp;gt;&lt;br /&gt;
[[Portal:Wiki/Plugin Requests|Plugin Installation Requests]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[:Category:Picture of the week|Pictures of the week]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Uncategorized: [[Special:UncategorizedFiles|files]] – [[Special:UncategorizedPages|pages]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Special:LonelyPages|Orphaned pages]] – Pages with no links to them yet.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[:Category:Undocumented templates|Undocumented templates]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Special:Categories|Categories]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[FlightGear wiki:Missing images|If you find missing images]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[FlightGear wiki:Notes to administrators|Notes to admins]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-------------------------------------------------------------&lt;br /&gt;
                    Main sections&lt;br /&gt;
--------------------------------------------------------------&amp;gt;&lt;br /&gt;
  |sections=&lt;br /&gt;
{{Main page/Leftbox|title=Get involved!&lt;br /&gt;
  |contents=Just like FlightGear itself, the wiki can be considered open-source. Everyone is encouraged to [[Special:UserLogin|register an account]] and start contributing!&lt;br /&gt;
&lt;br /&gt;
Maybe you noticed that the article on your favourite aircraft is a bit [[:Category:out of date|out of date]] and you can give it a refresh, or the Howto on making coffee on the 747 [[:Category:cleanup|needs a cleanup]], or the one on Blender [[:Category:Image requested|lacks a picture]], you have found a spam link or simply a typo and want to fix it! All are very valid reasons to join and every little effort helps the maintainers, even just adding the [[:Category:Maintenance templates|proper template]] to let them know. Remember to add a meaningful summary message, maintainers [[Special:RecentChanges|do read them]]!&lt;br /&gt;
&lt;br /&gt;
By the way, do you want to help with [[Help:Maintenance|regular maintenance]]? That would allow you to learn a whole lot on the FlightGear project. In fact, ''maintaining documentation is the classical way of getting into an open project''.&lt;br /&gt;
&lt;br /&gt;
This portal provides links to useful wiki tools and articles, ranging from how to write your first article to extensive markup techniques.  See also the [[Help:Contents|help pages]].&lt;br /&gt;
&lt;br /&gt;
One last note. Remember that any contribution to this wiki is licensed under the [[GPL|GNU GPL version 2]].&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Main page/Leftbox|title=Discuss!&lt;br /&gt;
  |contents=__NOTOC__&lt;br /&gt;
Discuss the wiki and helping each other out improving the wiki!&lt;br /&gt;
&lt;br /&gt;
Please, '''remember to sign your comments''': use four tildes (&amp;quot;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;quot;) or the sign button ([[File:Button sig.png|16px]]) above the editor text box.&lt;br /&gt;
&lt;br /&gt;
; Individual pages:  To discuss individual pages, use their &amp;quot;Discussion&amp;quot; page accessible through the tab at the top left of corner of the page.&lt;br /&gt;
&lt;br /&gt;
; The wiki in general:  Discuss the wiki, its organization and maintenance at the [[FlightGear wiki:Village pump|Village pump]].&lt;br /&gt;
&lt;br /&gt;
; Chat:  There is a wiki-related IRC channel at irc://irc.flightgear.org/#wiki&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{Main page/Rightcolumn end|title=[[Special:Statistics|Wiki statistics]]&lt;br /&gt;
  |contents=&lt;br /&gt;
* {{NUMBEROFARTICLES}} articles&lt;br /&gt;
* {{NUMBEROFFILES}} files&lt;br /&gt;
* {{NUMBEROFUSERS}} users&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[ca:Portal:Wiki]]&lt;br /&gt;
[[es:Portal:Wiki]]&lt;br /&gt;
[[fr:Portal:Wiki]]&lt;br /&gt;
[[nl:Portaal:Wiki]]&lt;br /&gt;
[[Category:Portals]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_using_vectors_and_hashes_in_Nasal&amp;diff=125722</id>
		<title>Howto:Start using vectors and hashes in Nasal</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_using_vectors_and_hashes_in_Nasal&amp;diff=125722"/>
		<updated>2020-06-14T13:24:13Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Fixing 30 grammatical errors whilst reviewing afterwards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation}}&lt;br /&gt;
Here we look into how to '''start using vectors and hashes in Nasal''' to simplify and generalize code.  Vectors and hashes are two data structures that [[Nasal]] uses to store data.  Vectors are in some other programming languages called for example lists or one-dimensional arrays, and hashes are similar to C's structs.&lt;br /&gt;
&lt;br /&gt;
In many cases repetitive code can be generalized and rewritten into vectors, hashes or helper functions using them.  Some of the advantages with rewriting repetitive code this way is that it helps maintenance by requiring less typing when modifying and/or when fixing bugs.&lt;br /&gt;
&lt;br /&gt;
In addition to storing data hashes can &amp;quot;store&amp;quot; functions and be used as object classes.  Object classes can be created by adding a function into a hash, that will create a new hash when called, a so called ''constructor'' (sometimes abbreviated to ''ctor'' or ''c'tor'') usually named &amp;lt;code&amp;gt;'''new'''()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Learn more about vectors ==&lt;br /&gt;
Imagine a piece of Nasal code working with 5 different waypoints. You would need to manage the data for each waypoint. A simple version using different variables for each data set might look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp1 = 0;&lt;br /&gt;
var wp1alt = 0;&lt;br /&gt;
var wp1dist = 0;&lt;br /&gt;
var wp1angle = 0;&lt;br /&gt;
var wp1length = 0;&lt;br /&gt;
var wp1id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp1brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp2 = 0;&lt;br /&gt;
var wp2alt = 0;&lt;br /&gt;
var wp2dist = 0;&lt;br /&gt;
var wp2angle = 0;&lt;br /&gt;
var wp2length = 0;&lt;br /&gt;
var wp2id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp2brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp3 = 0;&lt;br /&gt;
var wp3alt = 0;&lt;br /&gt;
var wp3dist = 0;&lt;br /&gt;
var wp3angle = 0;&lt;br /&gt;
var wp3length = 0;&lt;br /&gt;
var wp3id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp3brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp4 = 0;&lt;br /&gt;
var wp4alt = 0;&lt;br /&gt;
var wp4dist = 0;&lt;br /&gt;
var wp4angle = 0;&lt;br /&gt;
var wp4length = 0;&lt;br /&gt;
var wp4id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp4brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp5 = 0;&lt;br /&gt;
var wp5alt = 0;&lt;br /&gt;
var wp5dist = 0;&lt;br /&gt;
var wp5angle = 0;&lt;br /&gt;
var wp5length = 0;&lt;br /&gt;
var wp5id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp5brg = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, this is fairly repetitive and not overly scalable, because the variable names are hardcoded and need to be changed in a lot of places in the source code. &lt;br /&gt;
&lt;br /&gt;
Just imagine we'd need to support more than just 5 waypoints, like maybe 10, 20, 50 or maybe even 1000 waypoints. As you can see, this method is very inflexible, complicated, tedious and error-prone.&lt;br /&gt;
&lt;br /&gt;
Such code contains so called &amp;quot;code smells&amp;quot;, another example would be code like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var l0 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l1 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l2 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l3 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l4 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l5 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l6 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l7 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l8 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l9 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l10 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l11 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l12 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l13 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l14 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l15 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l16 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l17 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l18 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l19 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l20 = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
var hist1 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist2 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist3 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist4 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist5 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist6 = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
IDENTl3 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTl4 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTr4 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTl5 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTr5 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTl8 = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line0-l&amp;quot;, l0);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line1-l&amp;quot;, l1);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line2-l&amp;quot;, l2);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line3-l&amp;quot;, l3);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line4-l&amp;quot;, l4);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line5-l&amp;quot;, l5);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line6-l&amp;quot;, l6);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line7-l&amp;quot;, l7);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line8-l&amp;quot;, l8);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line9-l&amp;quot;, l9);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line10-l&amp;quot;, l10);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line11-l&amp;quot;, l11);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line12-l&amp;quot;, l12);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line13-l&amp;quot;, l13);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line14-l&amp;quot;, l14);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line15-l&amp;quot;, l15);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line16-l&amp;quot;, l16);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line17-l&amp;quot;, l17);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line18-l&amp;quot;, l18);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line19-l&amp;quot;, l19);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line20-l&amp;quot;, l20);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whenever you see such a code, it should be obvious that using arrays/vectors would be a good idea.&lt;br /&gt;
&lt;br /&gt;
So, it would be better to use a vector of waypoints instead. A vector is a list of things (variables) that can be easily accessed using an index into the vector. Pretty much like an array in C or C++, with the added advantage that the vector can be dynamically resized, e.g. using the setsize() library call. Consider the following example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;, &amp;quot;wp2&amp;quot;, &amp;quot;wp3&amp;quot;, &amp;quot;wp4&amp;quot;, &amp;quot;wp5&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This piece of code is equivalent to creating 5 different variables named &amp;quot;waypoints[n]&amp;quot; with an access index from n=0 to 4 (5 elements in total).&lt;br /&gt;
&lt;br /&gt;
As you can see below, indexing starts at 0.&lt;br /&gt;
&lt;br /&gt;
The problem is, that this only gives us a list of single waypoints:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;, &amp;quot;wp2&amp;quot;, &amp;quot;wp3&amp;quot;, &amp;quot;wp4&amp;quot;, &amp;quot;wp5&amp;quot;];&lt;br /&gt;
print(waypoints[0]); # print wp1&lt;br /&gt;
print(waypoints[1]); # print wp2&lt;br /&gt;
print(waypoints[2]); # print wp3&lt;br /&gt;
print(waypoints[3]); # print wp4&lt;br /&gt;
print(waypoints[4]); # print wp5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To do this using a conventional for loop, you would use the size() function to get the size of the vector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;,&amp;quot;wp2&amp;quot;,&amp;quot;wp3&amp;quot;,&amp;quot;wp4&amp;quot;,&amp;quot;wp5&amp;quot;];&lt;br /&gt;
for(var index; index &amp;lt; size(waypoints); index=index+1) {&lt;br /&gt;
    print(waypoints[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The same thing can be accomplished using the forindex loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;,&amp;quot;wp2&amp;quot;,&amp;quot;wp3&amp;quot;,&amp;quot;wp4&amp;quot;,&amp;quot;wp5&amp;quot;];&lt;br /&gt;
forindex(var index; waypoints) {&lt;br /&gt;
     print(waypoints[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, waypoints being a vector, we can also use a simple foreach loop, that works without a counter, to process each element easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;,&amp;quot;wp2&amp;quot;,&amp;quot;wp3&amp;quot;,&amp;quot;wp4&amp;quot;,&amp;quot;wp5&amp;quot;];&lt;br /&gt;
foreach(var wpt; waypoints) {&lt;br /&gt;
     print(wpt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What we need to save all the other waypoint specific information is a new variable type that serves as the &amp;quot;container&amp;quot; for variables, so that we can save several variables for each waypoint.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp4 = 0;       # waypoint number&lt;br /&gt;
var wp4alt = 0;    # waypoint altitude&lt;br /&gt;
var wp4dist = 0;   # waypoint distance&lt;br /&gt;
var wp4angle = 0;  # waypoint angle&lt;br /&gt;
var wp4length = 0; # waypoint length&lt;br /&gt;
var wp4id = &amp;quot;&amp;quot;;    # waypoint id&lt;br /&gt;
var wp4brg = 0;    # waypoint bearing&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A vector based version ==&lt;br /&gt;
&lt;br /&gt;
One simple way to accomplish this is by using another vector for each waypoint, nested inside the original vector. So that we end up with a two-dimensional data structure. For example, imagine a folder containing subfolders, with folders not having names but rather indices (numbers).&lt;br /&gt;
&lt;br /&gt;
So we could be using a &amp;quot;main&amp;quot; vector to store all waypoints, while each field of the main vector is a different vector that contains all waypoint-specific data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp4 = 0;       # waypoint number&lt;br /&gt;
var wp4alt = 0;    # waypoint altitude&lt;br /&gt;
var wp4dist = 0;   # waypoint distance&lt;br /&gt;
var wp4angle = 0;  # waypoint angle&lt;br /&gt;
var wp4length = 0; # waypoint length&lt;br /&gt;
var wp4id = &amp;quot;&amp;quot;;    # waypoint id&lt;br /&gt;
var wp4brg = 0;    # waypoint bearing&lt;br /&gt;
&lt;br /&gt;
var waypoint4 = [wp4,wp4alt,wp4dist,wp4angle,wp4length,wp4id, wp4brg];&lt;br /&gt;
var waypoints = [waypoint4]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First of all, we are setting up all the different variables for wp4, next, you are storing all variables in a vector called &amp;quot;waypoint4&amp;quot;. In the end, we store this vector in another vector named &amp;quot;waypoints&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So, the very first vector element would be waypoints[0] and it would point to another vector (waypoint4), the elements of waypoint4 would be also available by index:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp4 = 1;         # waypoint number&lt;br /&gt;
var wp4alt = 1000;   # waypoint altitude&lt;br /&gt;
var wp4dist = 20.4;  # waypoint distance&lt;br /&gt;
var wp4angle = 33.4; #waypoint angle&lt;br /&gt;
var wp4length = 12;  # waypoint length&lt;br /&gt;
var wp4id = &amp;quot;none&amp;quot;;  # waypoint id&lt;br /&gt;
var wp4brg = 122;    # waypoint bearing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var waypoint4 = [wp4,wp4alt,wp4dist,wp4angle,wp4length,wp4id, wp4brg];&lt;br /&gt;
var waypoints = [waypoint4]&lt;br /&gt;
&lt;br /&gt;
print ( waypoints[0][0] ) # contains the data stored in wp4&lt;br /&gt;
print ( waypoints[0][1] ) # contains the data stored in wp4alt&lt;br /&gt;
print ( waypoints[0][2] ) # contains the data stored in wp4dist&lt;br /&gt;
print ( waypoints[0][3] ) # contains the data stored in wp4angle&lt;br /&gt;
print ( waypoints[0][4] ) # contains the data stored in wp4length&lt;br /&gt;
print ( waypoints[0][5] ) # contains the data stored in wp4id&lt;br /&gt;
print ( waypoints[0][6] ) # contains the data stored in wp4brg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What we have here is a list of waypoints, with the first (0th) element containing another vector.&lt;br /&gt;
&lt;br /&gt;
Obviously, you could add a bunch of other waypoints to the &amp;quot;waypoints&amp;quot; vector, too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint4 = [wp4,wp4alt,wp4dist,wp4angle,wp4length,wp4id, wp4brg];&lt;br /&gt;
var waypoint5 = [wp5,wp5alt,wp5dist,wp5angle,wp5length,wp5id, wp5brg];&lt;br /&gt;
var waypoints = [waypoint4, waypoint5]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only problem with this approach is, that you'll need to set up all those wp variables - so there's a shorter version possible, by directly adding your data without using variables, i.e. &amp;quot;inline&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint4 = [1,1000,12,22,44,&amp;quot;none&amp;quot;, 33];&lt;br /&gt;
var waypoint5 = [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133];&lt;br /&gt;
var waypoints = [waypoint4, waypoint5];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's an even more succinct version possible. The next step would be to use embedded vectors directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&lt;br /&gt;
 [1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], &lt;br /&gt;
 [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is just formatted for clarity, the following snippet would be equivalent, but not as readable to people new to vectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [ [1,1000,12,22,44,&amp;quot;none&amp;quot;, 33],  [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133] ];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Accessing such a vector with embedded (or nested) vectors is still as simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
print(waypoints[0][0]) # prints 1&lt;br /&gt;
print(waypoints[0][1]) # prints 1000&lt;br /&gt;
print(waypoints[1][0]) # prints 2&lt;br /&gt;
print(waypoints[1][1]) # prints 1500&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only issue here is that you'll need to keep vector ordering in mind so that you can always access the right element number. This could be simplified by using some variables with telling names as the index for each vector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# these are used self-explanatory indices - so that you don't need to remember each field's position:&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
print(waypoints[0][ALTITUDE]) # prints 1&lt;br /&gt;
print(waypoints[0][DISTANCE]) # prints 1000&lt;br /&gt;
print(waypoints[1][ALTITUDE]) # prints 2&lt;br /&gt;
print(waypoints[1][DISTANCE]) # prints 1500&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, this yields already fairly readable source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
&lt;br /&gt;
# print the altitude for each waypoint in the vector:&lt;br /&gt;
foreach(var waypoint; waypoints) {&lt;br /&gt;
    print( waypoint[ALTITUDE] );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, this would already be much better than our original version, because we can now have an arbitrary number of waypoints. New waypoints would need to be added to the waypoints vector by using the append() library function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
print(waypoints[0][ALTITUDE]) # prints 1&lt;br /&gt;
print(waypoints[0][DISTANCE]) # prints 1000&lt;br /&gt;
print(waypoints[1][ALTITUDE]) # prints 2&lt;br /&gt;
print(waypoints[1][DISTANCE]) # prints 1500&lt;br /&gt;
&lt;br /&gt;
append(waypoints, [3,3000,122,212,34,&amp;quot;none&amp;quot;, 133] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we could come up with some helper functions to deal with the vector details transparently, using the same method as before: self-explanatory indices, which spares us having to remember the purpose of each field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]];&lt;br /&gt;
&lt;br /&gt;
var get = func (n,what) {&lt;br /&gt;
    return waypoints[n][what];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var set = func (n,what,value) {&lt;br /&gt;
    waypoints[n][what]=value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print( get(0, ALTITUDE)  ); # prints 1&lt;br /&gt;
print( get(0, DISTANCE)  ); # prints 1000&lt;br /&gt;
print( get(1, ALTITUDE)  ); # prints 2&lt;br /&gt;
print( get(1, DISTANCE)  ); # prints 1500&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's one caveat here: The set function doesn't check the size of the vector, so it may try to access elements that are not there. To fix this, you'd need to use a size(vec) call and check its size, and then adjust the size as needed using the setsize(vec,size) library function.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You could even add some more high level helpers for each waypoint field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]];&lt;br /&gt;
&lt;br /&gt;
var get = func (n,what) {&lt;br /&gt;
    return waypoints[n][what];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var set = func (n,what,value) {&lt;br /&gt;
    waypoints[n][what]=value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_alt = func(n) {&lt;br /&gt;
    return get(n,ALTITUDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_dist = func(n) {&lt;br /&gt;
    return get(n,DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_angle = func(n) {&lt;br /&gt;
    return get(n,ANGLE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_length = func(n) {&lt;br /&gt;
    return get(n,LENGTH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_id = func(n) {&lt;br /&gt;
    return get(n,ID);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_brg = func(n) {&lt;br /&gt;
    return get(n,BEARING);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There's still one issue though: we are using lots of variables and helpers that all belong to the &amp;quot;waypoints&amp;quot; type, but which clutter our source code. &lt;br /&gt;
&lt;br /&gt;
So, next, we are going to look into an even more flexible approach that nicely maps each waypoint field and all helper functions to a symbolic name, without having to remember vector indices and such: using Nasal hashes, which are easier to use than complex arrangements using nested vectors.&lt;br /&gt;
&lt;br /&gt;
== A hash based version (recommended) ==&lt;br /&gt;
&lt;br /&gt;
Now, to wrap these fields into a single variable that serves as the container for other variables, we could use a Nasal hash and start completely from scratch. &lt;br /&gt;
&lt;br /&gt;
Consider the following empty hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we are going to add some fields to our new variable &amp;quot;container&amp;quot;. Each new field can be assigned an initial value, this is done by treating the field as a value/key pair, with a colon (:) separating both. And with multiple fields being separated by a comma (formatting only added for clarity):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# declare a new hash named waypoint&lt;br /&gt;
var waypoint = {&lt;br /&gt;
# add a few fields and assign a value to each field:&lt;br /&gt;
number:0,&lt;br /&gt;
altitude:0,&lt;br /&gt;
distance:0,&lt;br /&gt;
angle:0,&lt;br /&gt;
length:0,&lt;br /&gt;
ID:0,&lt;br /&gt;
bearing:0&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which is equivalent to this, more succinct, version:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:0,altitude:0,distance:0,angle:0,length:0,ID:0,bearing:0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is already equivalent to our first example that used a vector to store this waypoint info, the only difference is here that we assign symbolic names (like number, altitude, distance etc) to each field, rather than just a numeric index, as was the case in the vector example.&lt;br /&gt;
&lt;br /&gt;
This adds the following &amp;quot;member fields&amp;quot; to the waypoint hash and sets their initial value to 0:&lt;br /&gt;
* number&lt;br /&gt;
* altitude&lt;br /&gt;
* distance&lt;br /&gt;
* angle&lt;br /&gt;
* length&lt;br /&gt;
* ID&lt;br /&gt;
* bearing&lt;br /&gt;
&lt;br /&gt;
Now, to access any of these fields, we would use the &amp;quot;dot notation&amp;quot; by first specifying the name of the enclosing context (which is just a fancy word for the name of the hash) and the name of the field we are interested in. You could read this as LOCATION.FIELD (i.e. get FIELD out of location).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:0,altitude:0,distance:0,angle:0,length:0,ID:0,bearing:0};&lt;br /&gt;
print ( waypoint.number );&lt;br /&gt;
print ( waypoint.altitude );&lt;br /&gt;
print ( waypoint.distance );&lt;br /&gt;
print ( waypoint.angle );&lt;br /&gt;
print ( waypoint.length );&lt;br /&gt;
print ( waypoint.ID );&lt;br /&gt;
print ( waypoint.bearing );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, the hash represents the surrounding environment (i.e. context or &amp;quot;namespace&amp;quot;) in which these symbols are valid. For more information on namespaces, please see [[Namespaces and Methods]].&lt;br /&gt;
&lt;br /&gt;
Now, to make this is a little more interesting and to show what's happening, we are going to change the value of each field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
print ( waypoint.number ); # prints 1&lt;br /&gt;
print ( waypoint.altitude ); # prints 2&lt;br /&gt;
print ( waypoint.distance ); # prints 3&lt;br /&gt;
print ( waypoint.angle ); # prints 4&lt;br /&gt;
print ( waypoint.length ); # 5&lt;br /&gt;
print ( waypoint.ID ); #6&lt;br /&gt;
print ( waypoint.bearing ); #7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, you could obviously create several different versions of this hash to store your waypoint data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint1 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint2 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint3 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint4 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint5 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is already a pretty cool thing because you would end up with 5 different containers all having their own set of fields, that you can access and set arbitrarily - without affecting the other containers.&lt;br /&gt;
&lt;br /&gt;
But the cool thing comes next:&lt;br /&gt;
&lt;br /&gt;
As you may have noticed, the code (internal structure of fields) for each waypoint is 100% identical - so we could just as well tell the Nasal engine to use an existing hash as a TEMPLATE for a new object instead of having to replicate the hash over and over again. This is accomplished using the &amp;quot;parents&amp;quot; keyword:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var Position3D = {x:1.00, y:2.00, z:3.00};&lt;br /&gt;
var p1 = { parents: [Position3D] };&lt;br /&gt;
var p2 = { parents: [Position3D] };&lt;br /&gt;
var p3 = { parents: [Position3D] };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates three different new containers/hashes by copying the fields from the hash specified in the parents' vector.&lt;br /&gt;
&lt;br /&gt;
What parents will do is this: whenever a hash contains a vector field named &amp;quot;parents:&amp;quot; pointing to other hashes, it will look up the parent hashes and use them as a template and copy the fields of the parent hashes to the new hash, i.e. less typing for you!&lt;br /&gt;
&lt;br /&gt;
This means, that the previously posted code could be easily abbreviated and written like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint1 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint2 = {parents:[waypoint1] };&lt;br /&gt;
var waypoint3 = {parents:[waypoint1] };&lt;br /&gt;
var waypoint4 = {parents:[waypoint1] };&lt;br /&gt;
var waypoint5 = {parents:[waypoint1] };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You could even introduce a new helper function to create new objects, let's call it new_waypoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var new_waypoint = func() {&lt;br /&gt;
 return { parents:[waypoint] };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var waypoint1 = new_waypoint();&lt;br /&gt;
var waypoint2 = new_waypoint();&lt;br /&gt;
var waypoint3 = new_waypoint();&lt;br /&gt;
var waypoint4 = new_waypoint();&lt;br /&gt;
var waypoint5 = new_waypoint();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
or using a vector for each object, which has the added advantage that you can easily create arbitrary amounts of waypoints on demand:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# this is our template for new waypoints&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
&lt;br /&gt;
# this is our allocator function creating new waypoints&lt;br /&gt;
var new_waypoint = func {return {parents:[waypoint] };}&lt;br /&gt;
&lt;br /&gt;
var waypoints = [nil,nil,nil,nil,nil]; # initialize the vector to set its size&lt;br /&gt;
&lt;br /&gt;
# populate the waypoints vector by allocating one new waypoint per &amp;quot;slot&amp;quot;&lt;br /&gt;
waypoints[0] = new_waypoint();&lt;br /&gt;
waypoints[1] = new_waypoint();&lt;br /&gt;
waypoints[2] = new_waypoint();&lt;br /&gt;
waypoints[3] = new_waypoint();&lt;br /&gt;
waypoints[4] = new_waypoint();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A shorter version would read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var new_waypoint = func {return {parents:[waypoint] };}&lt;br /&gt;
&lt;br /&gt;
var NUM_ELEMENTS = 5;&lt;br /&gt;
var waypoints = [];&lt;br /&gt;
setsize(waypoints, NUM_ELEMENTS);&lt;br /&gt;
&lt;br /&gt;
forindex(var i; waypoints)&lt;br /&gt;
    waypoints[i] = new_waypoint();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once we start using a hash as a template for other hashes using the &amp;quot;parents&amp;quot; vector, we are creating a class that is copied to each new hash. This new copy of the class is called an &amp;quot;object&amp;quot; after creation.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;class&amp;quot; is just a template for a certain data type that consists of other data types and provides functions to work with the class. The functions publicly accessible are called its &amp;quot;interface&amp;quot; because these functions are meant to be used by the users of your class. This is in contrast to member fields which are usually not meant to be accessed directly.&lt;br /&gt;
&lt;br /&gt;
Once a class is used as a template to create a new object, we say the class is getting &amp;quot;instantiated&amp;quot;, i.e. an instance of the class (an actual object) is created. This makes it then possible to make use of its interface and access member functions (which are methods). Also see {{forum link|p=145769}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, given that the creation of new hashes using a template class is such a common thing to do - we could just as well add a new function to the parent hash that we can use to construct new hashes. As you could see already, the fields (or members) of a hash are specified in a well-defined form using the key/value format where key and value are separated by a colon: &amp;quot;field_name:value&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint1 = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This isn't any different for fields that are of type &amp;quot;function&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
&lt;br /&gt;
    hello: func {&lt;br /&gt;
        print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we have added a new field named &amp;quot;hello&amp;quot; to our waypoint hash. This can be easily accessed and also called:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    hello: func {&lt;br /&gt;
        print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var w = {parents: [waypoint]};&lt;br /&gt;
w.hello();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand, we were just about to make the construction of such hashes much simpler. This can be done by creating a new function that constructs hashes dynamically using a hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var make_waypoint = func {&lt;br /&gt;
    return { parents:[waypoint] };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we are going to change the function and and embed it into the hash, so that the constructor function becomes a part of the class, renaming it to &amp;quot;new&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func {&lt;br /&gt;
        return {parents:[waypoint]}&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, whenever we need a new hash object of type &amp;quot;waypoint&amp;quot;, we can simply call this construction function (which we'll call a constructor from now on):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp = waypoint.new();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is what most Nasal code using OOP will typically look like.&lt;br /&gt;
&lt;br /&gt;
== Hashes and foreach (enumerating a hash) ==&lt;br /&gt;
&lt;br /&gt;
To iterate through all elements in a hash the keys(hash) method is used to produce a vector of the keys for the hash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var namehash = {};&lt;br /&gt;
namehash[&amp;quot;value1&amp;quot;]= 1;&lt;br /&gt;
namehash[&amp;quot;value2&amp;quot;] =2;&lt;br /&gt;
&lt;br /&gt;
foreach(var hash_key ; keys(namehash))&lt;br /&gt;
    print(namehash[hash_key]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A generic constructor ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, you'll work with classes that do not have any custom constructor functions - but you can easily create a generic constructor, too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func(obj) {&lt;br /&gt;
    return {parents:obj};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As long as '''obj''' is a vector of hashes, it can be simply invoked like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var p = new( [Position3D] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, once you remember that Nasal implicitly has an '''arg''' vector for its arguments, the whole thing can be simplified like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func {&lt;br /&gt;
    return {parents:arg};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var Position3D = {x:0.0, y:0.0, z:0.0};&lt;br /&gt;
&lt;br /&gt;
var p = new( Position3D );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will simply create a function named &amp;quot;new&amp;quot; which accepts an implicit list of arguments (in the implicit &amp;quot;args&amp;quot; vector). The function returns a hash whose parents field is set to the args vector, so this method could even be used for multiple inheritances. Note that the Position3D hash no longer has its constructor, it's just a simple hash in this case. &lt;br /&gt;
&lt;br /&gt;
To make this look a little nicer, we can also rename the default argument vector (i.e. args) to something more informative, like &amp;quot;classes&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func(classes...) {&lt;br /&gt;
    return {parents:classes};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var Position3D = {x:0.0, y:0.0, z:0.0};&lt;br /&gt;
&lt;br /&gt;
var p = new( Position3D );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using this approach, you could even make the &amp;quot;new operator&amp;quot; call custom constructors automatically for each created object.&lt;br /&gt;
&lt;br /&gt;
You could even implement an overloaded function that creates arrays/vectors of objects.&lt;br /&gt;
&lt;br /&gt;
A simple generic constructor can be expressed in a very succinct fashion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# a new function with an implicit arg parameter that simply returns a new hash with the parents' field set to all arguments provided&lt;br /&gt;
var new = func return { parents:arg };&lt;br /&gt;
&lt;br /&gt;
var Position3D = {x:0.0, y:0.0, z:0.0};&lt;br /&gt;
&lt;br /&gt;
var p = new( Position3D );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let's imagine you want to add another member function to print a certain field's value, such as &amp;quot;number&amp;quot;. &lt;br /&gt;
Given that objects created from the same class template, there needs to be a way for a method (class function) to refer to itself (its object), i.e. to refer to the object itself, otherwise, the function wouldn't know what object is meant, and what object it is referring to.&lt;br /&gt;
&lt;br /&gt;
This can be accomplished using the &amp;quot;me&amp;quot; keyword which ensures that the member function is always referring to the currently active object (itself):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func {&lt;br /&gt;
        return {parents:[waypoint]};&lt;br /&gt;
    },&lt;br /&gt;
    show_number: func {&lt;br /&gt;
        print(me.number);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we are just prepending the &amp;quot;me&amp;quot; keyword to the object's field, making it clear that &amp;quot;me&amp;quot; is the requested namespace/context of the field to be retrieved.&lt;br /&gt;
&lt;br /&gt;
On the other hand, maybe you'd like to add some information (such as the number) during construction time to the object. So this would require changing the constructor function to accept a parameter, too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
       return {parents:[waypoint]};&lt;br /&gt;
    },&lt;br /&gt;
    show_number: func {&lt;br /&gt;
        print(me.number);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the new function has been changed to accept a parameter named &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Now, to actually set the number field during construction time to the value of n, you could create a temporary hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or in its entirety:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
    },&lt;br /&gt;
    show_number: func {&lt;br /&gt;
        print(me.number);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, back to your initial example regarding a list of waypoints:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var waypoints = [waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new() ];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how this creates a vector of 5 waypoints (0..4), each of these waypoints is a full object that can be conveniently accessed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
waypoints[0].bearing = 100;&lt;br /&gt;
waypoints[1].altitude = 100;&lt;br /&gt;
waypoints[2].ID = &amp;quot;none&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also use Nasal's support for looping to conveniently process these waypoints:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
    },&lt;br /&gt;
    dump: func {&lt;br /&gt;
        print(&amp;quot;Altitude:&amp;quot;, me.altitude, &amp;quot; distance:&amp;quot;, me.distance, &amp;quot; Bearing:&amp;quot;, me.bearing);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var waypoints = [waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new(), ];&lt;br /&gt;
&lt;br /&gt;
foreach(var w; waypoints) {&lt;br /&gt;
    w.dump();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you may remember, the parents' keyword points not just to a single &amp;quot;class template&amp;quot; (hash), but instead to a vector of hashes. This makes it possible to use several different hashes as the template for a new hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
&lt;br /&gt;
var propulsion = {horse_power:0};&lt;br /&gt;
var vehicle = {tyres:0};&lt;br /&gt;
&lt;br /&gt;
# create different propulsion classes:&lt;br /&gt;
var engine = new(propulsion);&lt;br /&gt;
var piston_engine = new (engine);&lt;br /&gt;
var turboprop_engine = new(engine);&lt;br /&gt;
var jet_engine = new(engine);&lt;br /&gt;
&lt;br /&gt;
var car = new(vehicle, propulsion);&lt;br /&gt;
var boat = new(vehicle, propulsion);&lt;br /&gt;
var airplane = new(vehicle, propulsion);&lt;br /&gt;
&lt;br /&gt;
# seaplane is a new type of vehicle that inherits from the classes boat and aeroplane&lt;br /&gt;
var seaplane = new(boat, airplane);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two important concepts to keep in mind here: The relationship between classes is classified according to an &amp;quot;IS A&amp;quot; and &amp;quot;HAS A&amp;quot; pattern:&lt;br /&gt;
&lt;br /&gt;
* a car &amp;quot;IS A&amp;quot; vehicle&lt;br /&gt;
* an aeroplane &amp;quot;IS A&amp;quot; vehicle&lt;br /&gt;
* an elephant &amp;quot;IS AN&amp;quot; animal&lt;br /&gt;
&lt;br /&gt;
* a car &amp;quot;HAS AN&amp;quot; engine (0..x)&lt;br /&gt;
* an airplane &amp;quot;HAS AN&amp;quot; engine (0..x)&lt;br /&gt;
* an elephant &amp;quot;HAS&amp;quot; ears&lt;br /&gt;
&lt;br /&gt;
The difference when dealing with these relationships is that whenever something &amp;quot;IS&amp;quot; something, the right thing to do is to directly create a new object using the parent class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
var animal = {eyes:0,ears:0};&lt;br /&gt;
&lt;br /&gt;
var dog = new(animal);&lt;br /&gt;
var cat = new(animal);&lt;br /&gt;
var bird = new(animal);&lt;br /&gt;
var spider = new(animal);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, imagine we wanted to keep the number of legs for each animal, too: 4 legs for dogs and cats, 2 legs for birds and 8 legs for spiders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
var animal = {eyes:0,ears:0,legs:0};&lt;br /&gt;
&lt;br /&gt;
var dog = new(animal);&lt;br /&gt;
var cat = new(animal);&lt;br /&gt;
var bird = new(animal);&lt;br /&gt;
var spider = new(animal);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, at some point we may need additional information for each leg - such as the length of each leg. That's where we use a new &amp;quot;leg&amp;quot; class (an animal HAS legs), so that the animal class no longer just contains the number of legs, but rather contains a vector of &amp;quot;leg&amp;quot; objects:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
var leg = {length:0};&lt;br /&gt;
var animal = {eyes:0,ears:0,legs:[] };&lt;br /&gt;
&lt;br /&gt;
var dog = new(animal);&lt;br /&gt;
var cat = new(animal);&lt;br /&gt;
var bird = new(animal);&lt;br /&gt;
var spider = new(animal);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was a very simple introduction to object-oriented programming in Nasal.&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal howto|Module, Create a new Nasal]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125697</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125697"/>
		<updated>2020-06-14T11:01:21Z</updated>

		<summary type="html">&lt;p&gt;Chillz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font face=&amp;quot;Arial Rounded MT Bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:Red;font-size:255%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;''Welcome to my UserPage.. !! ''&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font face=&amp;quot;Arial Rounded MT Bold&amp;quot;&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 13pt&amp;quot;&amp;gt;'''Note 1:''' Today's date: [[{{#time:l|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:l|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]] [[{{#time:F|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:F|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]] [[{{#time:F j|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:j|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]], [[{{#time:Y|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:Y|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; '''Note 2:''' '''Chillz''' is a '''NEW''' editor on the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' joined the wiki project on '''14 June 2020'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' has amassed over '''10''' contributions to the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 5:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 6:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 7:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 8:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is a '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 9:''' Need any '''help''' or assistance with '''anything'''? Leave her a '''NOTE''' on her [[User talk:Chillz|talk page]]! (Emails not allowed!) &amp;lt;center/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125696</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125696"/>
		<updated>2020-06-14T10:57:47Z</updated>

		<summary type="html">&lt;p&gt;Chillz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font face=&amp;quot;Arial Rounded MT Bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:Red;font-size:255%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;''Welcome to my UserPage.. !! ''&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font face=&amp;quot;Arial Rounded MT Bold&amp;quot;&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 13pt&amp;quot;&amp;gt;Today's date: [[{{#time:l|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:l|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]] [[{{#time:F|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:F|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]] [[{{#time:F j|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:j|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]], [[{{#time:Y|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:Y|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*********************************** Start content here ***********************************--&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative; z-index: 3; width: 670px; height: 480px; margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 1px; top: 1px&amp;quot;&amp;gt;&lt;br /&gt;
[[image:BranMoviC Hakken.gif|130px|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/About Me|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:120%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;About Me&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 20px; top: 130px&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Nixie2.gif|100px|Sepiola atlantica|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[https://template.miraheze.org/wiki/Special:CentralAuth/{{PAGENAME}}&amp;lt;span style=&amp;quot;color:lightgrey;font-size:120%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Contribution&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 30px; top: 250px&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:The Fairybread Barnstar.gif|100px|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User Talk:{{PAGENAME}}/Templatian|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:140%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;small&amp;gt;BarnStars&amp;lt;/small&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 30px; top: 380px&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Gears animation A-B.gif|100px|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/Useful|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Useful Link&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 400px; top: 1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User Talk:{{PAGENAME}}|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:120%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Talk page&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;amp;nbsp; [[Image:E-mail.gif]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 400px; top: 145px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/Sandbox|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:100%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Sandbox&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;amp;nbsp; [[Image:KeretaApiPuterMajuMundur.gif|200px|link=|alt={{PAGENAME}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 400px; top: 300px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/TOP 10|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:100%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Top 10&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;amp;nbsp; [[Image:Horse gallop.gif|100px|link=|alt=mmrsafy]] [[Image:Horse gallop.gif|100px|link=|alt=mmrsafy]] [[Image:Horse gallop.gif|100px|link=|alt=mmrsafy]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt; &amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 220px; top: 205px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' '''Chillz''' is a '''NEW''' editor on the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' '''Chillz''' joined the wiki project on '''14 June 2020'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' has amassed over '''10''' contributions to the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 5:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 6:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 7:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is a '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 8:''' Need any '''help''' or assistance with '''anything'''? Leave her a '''NOTE''' on her [[User talk:Chillz|talk page]]! (Emails not allowed!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125695</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125695"/>
		<updated>2020-06-14T10:57:01Z</updated>

		<summary type="html">&lt;p&gt;Chillz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font face=&amp;quot;Arial Rounded MT Bold&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:Red;font-size:255%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;''Welcome to my UserPage.. !! ''&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/font face=&amp;quot;Arial Rounded MT Bold&amp;quot;&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: 13pt&amp;quot;&amp;gt;Today's date: [[{{#time:l|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:l|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]] [[{{#time:F|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:F|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]] [[{{#time:F j|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:j|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]], [[{{#time:Y|}}|&amp;lt;span style=&amp;quot;color:magenta;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-family: Segoe Script&amp;quot;&amp;gt;{{#time:Y|}}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 4px .2em; word-spacing: 4px; border: 1px solid #A3B1BF;&amp;quot; align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=fulltext&lt;br /&gt;
width=65&lt;br /&gt;
searchbuttonlabel=Search Miraheze&lt;br /&gt;
break=no&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:absolute; z-index:100; right:1px; top:4px;&amp;quot; class=&amp;quot;metadata&amp;quot; id=&amp;quot;developer&amp;quot;&amp;gt;{{Wiki favicon|icon_nr=4}}{{click|link=User talk:{{PAGENAME}}|image=Farm-Fresh female.png|width=25px|height=35px|title=I'm a woman.}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;position:absolute;top:-15px;left:-401px;z-index:-1&amp;quot;&amp;gt;[[Image:Lilium jankae 1.jpg.jpg|350px]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 3px solid lightgrey; background-color:Black; padding: .5em 1em; margin: 5px 5px 0; text-align: left&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*********************************** Start content here ***********************************--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: relative; z-index: 3; width: 670px; height: 480px; margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 1px; top: 1px&amp;quot;&amp;gt;&lt;br /&gt;
[[image:BranMoviC Hakken.gif|130px|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/About Me|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:120%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;About Me&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 20px; top: 130px&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Nixie2.gif|100px|Sepiola atlantica|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[https://template.miraheze.org/wiki/Special:CentralAuth/{{PAGENAME}}&amp;lt;span style=&amp;quot;color:lightgrey;font-size:120%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Contribution&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 30px; top: 250px&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:The Fairybread Barnstar.gif|100px|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User Talk:{{PAGENAME}}/Templatian|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:140%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;small&amp;gt;BarnStars&amp;lt;/small&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 30px; top: 380px&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Gears animation A-B.gif|100px|link=|alt={{PAGENAME}}]]&amp;amp;nbsp; &amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/Useful|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Useful Link&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 400px; top: 1px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User Talk:{{PAGENAME}}|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:120%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Talk page&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;amp;nbsp; [[Image:E-mail.gif]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 400px; top: 145px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/Sandbox|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:100%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Sandbox&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;amp;nbsp; [[Image:KeretaApiPuterMajuMundur.gif|200px|link=|alt={{PAGENAME}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 400px; top: 300px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;[[User:{{PAGENAME}}/TOP 10|&amp;lt;span style=&amp;quot;color:lightgrey;font-size:100%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Top 10&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/font face=&amp;quot;Times New Roman&amp;quot;&amp;gt;&amp;amp;nbsp; [[Image:Horse gallop.gif|100px|link=|alt=mmrsafy]] [[Image:Horse gallop.gif|100px|link=|alt=mmrsafy]] [[Image:Horse gallop.gif|100px|link=|alt=mmrsafy]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt; &amp;lt;div style=&amp;quot;position: absolute; z-index: 1; left: 220px; top: 205px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' '''Chillz''' is a '''NEW''' editor on the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' '''Chillz''' joined the wiki project on '''14 June 2020'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' has amassed over '''10''' contributions to the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 5:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 6:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 7:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is a '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 8:''' Need any '''help''' or assistance with '''anything'''? Leave her a '''NOTE''' on her [[User talk:Chillz|talk page]]! (Emails not allowed!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125694</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125694"/>
		<updated>2020-06-14T10:50:13Z</updated>

		<summary type="html">&lt;p&gt;Chillz: User category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Note 1:''' '''Chillz''' is a '''NEW''' editor on the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' '''Chillz''' joined the wiki project on '''14 June 2020'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' has amassed over '''10''' contributions to the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 5:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 6:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 7:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is a '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 8:''' Need any '''help''' or assistance with '''anything'''? Leave her a '''NOTE''' on her [[User talk:Chillz|talk page]]! (Emails not allowed!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125693</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125693"/>
		<updated>2020-06-14T10:49:06Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Note 1:''' '''Chillz''' is a '''NEW''' editor on the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' '''Chillz''' joined the wiki project on '''14 June 2020'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' has amassed over '''10''' contributions to the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 5:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 6:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 7:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is a '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;br /&gt;
&lt;br /&gt;
'''Note 8:''' Need any '''help''' or assistance with '''anything'''? Leave her a '''NOTE''' on her [[User talk:Chillz|talk page]]! (Emails not allowed!)&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125692</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125692"/>
		<updated>2020-06-14T10:42:40Z</updated>

		<summary type="html">&lt;p&gt;Chillz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her [[User talk:Chillz|talk page]]!&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is a '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125691</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125691"/>
		<updated>2020-06-14T10:42:23Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Also note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her [[User talk:Chillz|talk page]]!&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' is real good at fixing grammatical errors.&lt;br /&gt;
&lt;br /&gt;
'''Note 4:''' '''Chillz''' is on the look out for any '''VANDALISM'''. She is an '''24/7''' [[Special:RecentChanges|recent changes]] '''PATROLLER'''.&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125690</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125690"/>
		<updated>2020-06-14T10:40:47Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Also note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her [[User talk:Chillz|talk page]]!&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;br /&gt;
&lt;br /&gt;
'''Note 3:''' '''Chillz''' is real good at fixing grammatical errors.&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125689</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125689"/>
		<updated>2020-06-14T10:40:06Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Also noe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her [[User talk:Chillz|talk page]]!&lt;br /&gt;
&lt;br /&gt;
'''Note 1:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;br /&gt;
&lt;br /&gt;
'''Note 2:''' If you get the time, feel free to check out her [[User:Chillz/sandbox|sandbox]].&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Developer_Mode&amp;diff=125688</id>
		<title>Developer Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Developer_Mode&amp;diff=125688"/>
		<updated>2020-06-14T10:38:13Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Fixing 5 grammatical errors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
{{See also|Startup Modes}}&lt;br /&gt;
03/2017: James pushed a build system change &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/35666576/&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/35692898/&amp;lt;/ref&amp;gt;, to do the following: &lt;br /&gt;
* define a FG_BUILD_TYPE in Cmake, with values ‘Dev’ (default), ‘Nightly’ and ‘Release’. (other values can be added if meaningful, eg ‘release-candidate’) &lt;br /&gt;
* replace the existing FG_NIGHTLY and ENABLE_DEV_WARNINGS Cmake options &lt;br /&gt;
* add a /sim/developer-mode boolean flag &lt;br /&gt;
* initialise the default value of this based on the build-type. &lt;br /&gt;
&lt;br /&gt;
*Right now*, the only controversial thing is that Nightly builds default to developer-mode=true. - allow developer-mode to be forced on and off in *any* build from the command line —developer (switches it on) —developer=false (switch it off, for testing in a self-compiled build) - use this to switch the severity of the SG_DEV_WARN and SG_DEV_ALERT log messages up or down - replace all the previous compile-time conditional warnings controlled by ‘ENABLE_DEV_WARNINGS’ to be dev warnings at runtime. - report the build type in lots of places, eg via JSON, on startup, etc I also just updated the fgmeta build script used by Jenkins to pass (I hope!) correct values for FG_BUILD_TYPE to Cmake for our nightly and release builds, but this layer can be improved now, I guess. Please test: the new splash screen shows a red warning text for Nightly builds, we could also show something in developer mode if it's useful. We can also discuss hiding UI elements or picking different defaults based on the developer mode; since it’s a run-time switch, we aren’t excluding anyone from contributing by hiding things in ‘out-of-the-box’ mode in release builds, is my opinion. Candidate things to hide, more suggestions welcome: - the entire Debug menu - wireframe mode in Rendering settings (and probably a few more things there) I will gradually review warnings for dev-mode suitability, using the ‘can an end-user do anything meaningful with this message?’ criteria, I believe Richard Harrison also volunteered to do a review of that. Any feedback on this system is welcome, we have a whole release cycle to decide what, if anything, we change in developer-mode vs normal. (Oh and the launcher will get an ‘enable developer mode’ checkbox shortly)&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35693664/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Developer-mode, warnings, build-type &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Feb 28th, 2017 &lt;br /&gt;
  |added  =  Feb 28th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
{{Appendix}}&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125687</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125687"/>
		<updated>2020-06-14T10:35:41Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Also note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her [[User talk:Chillz|talk page]]!&lt;br /&gt;
&lt;br /&gt;
'''Note:''' '''Chillz''' is destined to become an '''ADMIN''' on the FlightGear wiki!&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125686</id>
		<title>Air traffic control</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125686"/>
		<updated>2020-06-14T10:34:09Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Fixing 4 grammatical errors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Air traffic control''' (ATC) is a service mostly provided by ground-based controllers who direct aircraft on the ground and in the air. The primary purpose of ATC systems worldwide is to separate aircraft to prevent collisions, to organize and expedite the flow of traffic, and to provide information and other support for pilots when able. In some countries, ATC may also play a security or defence role (as in the United States), or be run entirely by the military (as in Brazil).&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[ATC phraseology]] lists common phraseology and their meanings.&lt;br /&gt;
* [[Spoken_ATC]] allows the pilot to listen to the directives of the Air Traffic Controller.&lt;br /&gt;
* [[Red Griffin ATC]] Speaking Air Traffic Controller Addon for FlightGear&lt;br /&gt;
&lt;br /&gt;
== ATC in FlightGear multi-player ==&lt;br /&gt;
To know if an area is controlled or booked:&lt;br /&gt;
* Check for announced ATC sessions on [http://flightgear-atc.alwaysdata.net/ Lenny's website].&lt;br /&gt;
* Check the Pilot List in FlightGear or the [[MPMap|Multiplayer map]]. Usually, controllers:&lt;br /&gt;
** have a callsign ''XXXX_DE'', ''XXXX_GN'', ''XXXX_TW'' or ''XXXX_AP'' (where ''XXXX'' is the ICAO code of the airport they are manning);&lt;br /&gt;
** generally use ''[[OpenRadar]]'' or ''[[ATC-pie]]'', which appear as aircraft models on the map, or older ''ATC-*'' named models.&lt;br /&gt;
&lt;br /&gt;
=== For pilots ===&lt;br /&gt;
* [[ATC Tutorial]]&lt;br /&gt;
* [[ATC best practices#For pilots|Best practices]]&lt;br /&gt;
* [[SquawkGear|Connecting to Vatsim]]&lt;br /&gt;
&lt;br /&gt;
=== For controllers ===&lt;br /&gt;
* [[ATC best practices#For controllers|Best practices]]&lt;br /&gt;
* &amp;quot;[http://flightgear-atc.alwaysdata.net Lenny's website]&amp;quot; is today's ''de facto'' ATC platform featuring a [[Flight_planning|flight plan]] database, tutorials and resources, software downloads, and a schedule where ATCs announce their session and let pilots know when and which airport will be controlled&lt;br /&gt;
&lt;br /&gt;
Software for controlling on FlightGear:&lt;br /&gt;
* Standalone programs for more realistic experience: [[OpenRadar]], [[ATC-pie]]&lt;br /&gt;
* FG aircraft like [[ATC-FS]], an ATC model with flight strips&lt;br /&gt;
&lt;br /&gt;
[[Category:Air Traffic Control]]&lt;br /&gt;
[[it:Controllo Traffico Aereo]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125685</id>
		<title>Air traffic control</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125685"/>
		<updated>2020-06-14T10:33:08Z</updated>

		<summary type="html">&lt;p&gt;Chillz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Air traffic control''' (ATC) is a service mostly provided by ground-based controllers who direct aircraft on the ground and in the air. The primary purpose of ATC systems worldwide is to separate aircraft to prevent collisions, to organize and expedite the flow of traffic, and to provide information and other support for pilots when able. In some countries, ATC may also play a security or defense role (as in the United States), or actually be run entirely by the military (as in Brazil).&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[ATC phraseology]] lists common phraseology and their meanings.&lt;br /&gt;
* [[Spoken_ATC]] allows the pilot to listen to the directives of the Air Traffic Controller.&lt;br /&gt;
* [[Red Griffin ATC]] Speaking Air Traffic Controller Addon for FlightGear&lt;br /&gt;
&lt;br /&gt;
== ATC in FlightGear multi-player ==&lt;br /&gt;
To know if an area is controlled or booked:&lt;br /&gt;
* Check for announced ATC sessions on [http://flightgear-atc.alwaysdata.net/ Lenny's website].&lt;br /&gt;
* Check the Pilot List in FlightGear or the [[MPMap|Multiplayer map]]. Usually, controllers:&lt;br /&gt;
** have a callsign ''XXXX_DE'', ''XXXX_GN'', ''XXXX_TW'' or ''XXXX_AP'' (where ''XXXX'' is the ICAO code of the airport they are manning);&lt;br /&gt;
** generally use ''[[OpenRadar]]'' or ''[[ATC-pie]]'', which appear as aircraft models on the map, or older ''ATC-*'' named models.&lt;br /&gt;
&lt;br /&gt;
=== For pilots ===&lt;br /&gt;
* [[ATC Tutorial]]&lt;br /&gt;
* [[ATC best practices#For pilots|Best practices]]&lt;br /&gt;
* [[SquawkGear|Connecting to Vatsim]]&lt;br /&gt;
&lt;br /&gt;
=== For controllers ===&lt;br /&gt;
* [[ATC best practices#For controllers|Best practices]]&lt;br /&gt;
* &amp;quot;[http://flightgear-atc.alwaysdata.net Lenny's website]&amp;quot; is today's ''de facto'' ATC platform featuring a [[Flight_planning|flight plan]] data base, tutorials and resources, software downloads, and a schedule where ATCs announce their session and let pilots know when and which airport will be controlled&lt;br /&gt;
&lt;br /&gt;
Software for controlling on FlightGear:&lt;br /&gt;
* Standalone programs for more realistic experience: [[OpenRadar]], [[ATC-pie]]&lt;br /&gt;
* FG aircrafts like [[ATC-FS]], an ATC model with flight strips&lt;br /&gt;
&lt;br /&gt;
[[Category:Air Traffic Control]]&lt;br /&gt;
[[it:Controllo Traffico Aereo]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125684</id>
		<title>Air traffic control</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125684"/>
		<updated>2020-06-14T10:32:52Z</updated>

		<summary type="html">&lt;p&gt;Chillz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Air traffic control''' (ATC) is a service mostly provided by ground-based controllers who direct aircraft on the ground and in the air. The primary purpose of ATC systems worldwide is to separate aircraft to prevent collisions, to organize and expedite the flow of traffic, and to provide information and other support for pilots when able. In some countries, ATC may also play a security or defense role (as in the United States), or actually be run entirely by the military (as in Brazil).&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[ATC phraseology]] lists common phraseology and their meanings.&lt;br /&gt;
* [[Spoken_ATC]] allows the pilot to listen to the directives of the Air Traffic Controller.&lt;br /&gt;
* [[Red Griffin ATC]] Speaking Air Traffic Controller Addon for FlightGear&lt;br /&gt;
&lt;br /&gt;
== ATC in FlightGear multi-player ==&lt;br /&gt;
To know if an area is controlled or booked:&lt;br /&gt;
*Check for announced ATC sessions on [http://flightgear-atc.alwaysdata.net/ Lenny's website].&lt;br /&gt;
*Check the Pilot List in FlightGear or the [[MPMap|Multiplayer map]]. Usually, controllers:&lt;br /&gt;
** have a callsign ''XXXX_DE'', ''XXXX_GN'', ''XXXX_TW'' or ''XXXX_AP'' (where ''XXXX'' is the ICAO code of the airport they are manning);&lt;br /&gt;
** generally use ''[[OpenRadar]]'' or ''[[ATC-pie]]'', which appear as aircraft models on the map, or older ''ATC-*'' named models.&lt;br /&gt;
&lt;br /&gt;
=== For pilots ===&lt;br /&gt;
* [[ATC Tutorial]]&lt;br /&gt;
* [[ATC best practices#For pilots|Best practices]]&lt;br /&gt;
* [[SquawkGear|Connecting to Vatsim]]&lt;br /&gt;
&lt;br /&gt;
=== For controllers ===&lt;br /&gt;
* [[ATC best practices#For controllers|Best practices]]&lt;br /&gt;
* &amp;quot;[http://flightgear-atc.alwaysdata.net Lenny's website]&amp;quot; is today's ''de facto'' ATC platform featuring a [[Flight_planning|flight plan]] data base, tutorials and resources, software downloads, and a schedule where ATCs announce their session and let pilots know when and which airport will be controlled&lt;br /&gt;
&lt;br /&gt;
Software for controlling on FlightGear:&lt;br /&gt;
* Standalone programs for more realistic experience: [[OpenRadar]], [[ATC-pie]]&lt;br /&gt;
* FG aircrafts like [[ATC-FS]], an ATC model with flight strips&lt;br /&gt;
&lt;br /&gt;
[[Category:Air Traffic Control]]&lt;br /&gt;
[[it:Controllo Traffico Aereo]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125683</id>
		<title>Air traffic control</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Air_traffic_control&amp;diff=125683"/>
		<updated>2020-06-14T10:32:23Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Article is NOT a stub&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Air traffic control''' (ATC) is a service mostly provided by ground-based controllers who direct aircraft on the ground and in the air. The primary purpose of ATC systems worldwide is to separate aircraft to prevent collisions, to organize and expedite the flow of traffic, and to provide information and other support for pilots when able. In some countries, ATC may also play a security or defense role (as in the United States), or actually be run entirely by the military (as in Brazil).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[ATC phraseology]] lists common phraseology and their meanings.&lt;br /&gt;
* [[Spoken_ATC]] allows the pilot to listen to the directives of the Air Traffic Controller.&lt;br /&gt;
* [[Red Griffin ATC]] Speaking Air Traffic Controller Addon for FlightGear&lt;br /&gt;
&lt;br /&gt;
== ATC in FlightGear multi-player ==&lt;br /&gt;
&lt;br /&gt;
To know if an area is controlled or booked:&lt;br /&gt;
*Check for announced ATC sessions on [http://flightgear-atc.alwaysdata.net/ Lenny's website].&lt;br /&gt;
*Check the Pilot List in FlightGear or the [[MPMap|Multiplayer map]]. Usually, controllers:&lt;br /&gt;
** have a callsign ''XXXX_DE'', ''XXXX_GN'', ''XXXX_TW'' or ''XXXX_AP'' (where ''XXXX'' is the ICAO code of the airport they are manning);&lt;br /&gt;
** generally use ''[[OpenRadar]]'' or ''[[ATC-pie]]'', which appear as aircraft models on the map, or older ''ATC-*'' named models.&lt;br /&gt;
&lt;br /&gt;
=== For pilots ===&lt;br /&gt;
&lt;br /&gt;
* [[ATC Tutorial]]&lt;br /&gt;
* [[ATC best practices#For pilots|Best practices]]&lt;br /&gt;
* [[SquawkGear|Connecting to Vatsim]]&lt;br /&gt;
&lt;br /&gt;
=== For controllers ===&lt;br /&gt;
&lt;br /&gt;
* [[ATC best practices#For controllers|Best practices]]&lt;br /&gt;
* &amp;quot;[http://flightgear-atc.alwaysdata.net Lenny's website]&amp;quot; is today's ''de facto'' ATC platform featuring a [[Flight_planning|flight plan]] data base, tutorials and resources, software downloads, and a schedule where ATCs announce their session and let pilots know when and which airport will be controlled&lt;br /&gt;
&lt;br /&gt;
Software for controlling on FlightGear:&lt;br /&gt;
* Standalone programs for more realistic experience: [[OpenRadar]], [[ATC-pie]]&lt;br /&gt;
* FG aircrafts like [[ATC-FS]], an ATC model with flight strips&lt;br /&gt;
&lt;br /&gt;
[[Category:Air Traffic Control]]&lt;br /&gt;
&lt;br /&gt;
[[it:Controllo Traffico Aereo]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User_talk:Chillz&amp;diff=125682</id>
		<title>User talk:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User_talk:Chillz&amp;diff=125682"/>
		<updated>2020-06-14T10:31:11Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_using_vectors_and_hashes_in_Nasal&amp;diff=125681</id>
		<title>Howto:Start using vectors and hashes in Nasal</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_using_vectors_and_hashes_in_Nasal&amp;diff=125681"/>
		<updated>2020-06-14T10:30:46Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Fixing 50 grammatical errors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Here we look into how to '''start using vectors and hashes in Nasal''' to simplify and generalize code.  Vectors and hashes are two data structures that [[Nasal]] uses to store data.  Vectors are in some other programming languages called for example lists or one-dimensional arrays, and hashes are similar to C's structs.&lt;br /&gt;
&lt;br /&gt;
In many cases repetitive code can be generalized and rewritten into vectors, hashes or helper functions using them.  Some of the advantages with rewriting repetitive code this way is that it helps maintenance by requiring less typing when modifying and/or when fixing bugs.&lt;br /&gt;
&lt;br /&gt;
In addition to storing data hashes can &amp;quot;store&amp;quot; functions and be used as object classes.  Object classes can be created by adding a function into a hash, that will create a new hash when called, a so called ''constructor'' (sometimes abbreviated to ''ctor'' or ''c'tor'') usually named &amp;lt;code&amp;gt;'''new'''()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Learn more about vectors ==&lt;br /&gt;
Imagine a piece of Nasal code working with 5 different waypoints. You would need to manage the data for each waypoint. A simple version using different variables for each data set might look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp1 = 0;&lt;br /&gt;
var wp1alt = 0;&lt;br /&gt;
var wp1dist = 0;&lt;br /&gt;
var wp1angle = 0;&lt;br /&gt;
var wp1length = 0;&lt;br /&gt;
var wp1id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp1brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp2 = 0;&lt;br /&gt;
var wp2alt = 0;&lt;br /&gt;
var wp2dist = 0;&lt;br /&gt;
var wp2angle = 0;&lt;br /&gt;
var wp2length = 0;&lt;br /&gt;
var wp2id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp2brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp3 = 0;&lt;br /&gt;
var wp3alt = 0;&lt;br /&gt;
var wp3dist = 0;&lt;br /&gt;
var wp3angle = 0;&lt;br /&gt;
var wp3length = 0;&lt;br /&gt;
var wp3id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp3brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp4 = 0;&lt;br /&gt;
var wp4alt = 0;&lt;br /&gt;
var wp4dist = 0;&lt;br /&gt;
var wp4angle = 0;&lt;br /&gt;
var wp4length = 0;&lt;br /&gt;
var wp4id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp4brg = 0;&lt;br /&gt;
&lt;br /&gt;
var wp5 = 0;&lt;br /&gt;
var wp5alt = 0;&lt;br /&gt;
var wp5dist = 0;&lt;br /&gt;
var wp5angle = 0;&lt;br /&gt;
var wp5length = 0;&lt;br /&gt;
var wp5id = &amp;quot;&amp;quot;;&lt;br /&gt;
var wp5brg = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, this is fairly repetitive and not overly scalable, because the variable names are hardcoded and need to be changed in a lot of places in the source code. &lt;br /&gt;
&lt;br /&gt;
Just imagine we'd need to support more than just 5 waypoints, like maybe 10, 20, 50 or maybe even 1000 waypoints. As you can see, this method is very inflexible, complicated, tedious and error-prone.&lt;br /&gt;
&lt;br /&gt;
Such code contains so called &amp;quot;code smells&amp;quot;, another example would be code like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var l0 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l1 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l2 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l3 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l4 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l5 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l6 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l7 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l8 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l9 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l10 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l11 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l12 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l13 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l14 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l15 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l16 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l17 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l18 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l19 = &amp;quot;&amp;quot;;&lt;br /&gt;
var l20 = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
var hist1 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist2 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist3 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist4 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist5 = &amp;quot;&amp;quot;;&lt;br /&gt;
var hist6 = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
IDENTl3 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTl4 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTr4 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTl5 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTr5 = &amp;quot;&amp;quot;;&lt;br /&gt;
IDENTl8 = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line0-l&amp;quot;, l0);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line1-l&amp;quot;, l1);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line2-l&amp;quot;, l2);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line3-l&amp;quot;, l3);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line4-l&amp;quot;, l4);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line5-l&amp;quot;, l5);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line6-l&amp;quot;, l6);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line7-l&amp;quot;, l7);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line8-l&amp;quot;, l8);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line9-l&amp;quot;, l9);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line10-l&amp;quot;, l10);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line11-l&amp;quot;, l11);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line12-l&amp;quot;, l12);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line13-l&amp;quot;, l13);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line14-l&amp;quot;, l14);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line15-l&amp;quot;, l15);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line16-l&amp;quot;, l16);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line17-l&amp;quot;, l17);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line18-l&amp;quot;, l18);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line19-l&amp;quot;, l19);&lt;br /&gt;
setprop(&amp;quot;/instrumentation/efb/display/line20-l&amp;quot;, l20);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whenever you see such a code, it should be obvious that using arrays/vectors would be a good idea.&lt;br /&gt;
&lt;br /&gt;
So, it would be better to use a vector of waypoints instead. A vector is a list of things (variables) that can be easily accessed using an index into the vector. Pretty much like an array in C or C++, with the added advantage that the vector can be dynamically resized, e.g. using the setsize() library call. Consider the following example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;, &amp;quot;wp2&amp;quot;, &amp;quot;wp3&amp;quot;, &amp;quot;wp4&amp;quot;, &amp;quot;wp5&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This piece of code is equivalent to creating 5 different variables named &amp;quot;waypoints[n]&amp;quot; with an access index from n=0 to 4 (5 elements in total).&lt;br /&gt;
&lt;br /&gt;
As you can see below, indexing starts at 0.&lt;br /&gt;
&lt;br /&gt;
The problem is, that this only gives us a list of single waypoints:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;, &amp;quot;wp2&amp;quot;, &amp;quot;wp3&amp;quot;, &amp;quot;wp4&amp;quot;, &amp;quot;wp5&amp;quot;];&lt;br /&gt;
print(waypoints[0]); # print wp1&lt;br /&gt;
print(waypoints[1]); # print wp2&lt;br /&gt;
print(waypoints[2]); # print wp3&lt;br /&gt;
print(waypoints[3]); # print wp4&lt;br /&gt;
print(waypoints[4]); # print wp5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To do this using a conventional for loop, you would use the size() function to get the size of the vector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;,&amp;quot;wp2&amp;quot;,&amp;quot;wp3&amp;quot;,&amp;quot;wp4&amp;quot;,&amp;quot;wp5&amp;quot;];&lt;br /&gt;
for(var index; index &amp;lt; size(waypoints); index=index+1) {&lt;br /&gt;
    print(waypoints[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The same thing can be accomplished using the forindex loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;,&amp;quot;wp2&amp;quot;,&amp;quot;wp3&amp;quot;,&amp;quot;wp4&amp;quot;,&amp;quot;wp5&amp;quot;];&lt;br /&gt;
forindex(var index; waypoints) {&lt;br /&gt;
     print(waypoints[index]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, waypoints being a vector, we can also use a simple foreach loop, that works without a counter, to process each element easily:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&amp;quot;wp1&amp;quot;,&amp;quot;wp2&amp;quot;,&amp;quot;wp3&amp;quot;,&amp;quot;wp4&amp;quot;,&amp;quot;wp5&amp;quot;];&lt;br /&gt;
foreach(var wpt; waypoints) {&lt;br /&gt;
     print(wpt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What we need to save all the other waypoint specific information is a new variable type that serves as the &amp;quot;container&amp;quot; for variables, so that we can save several variables for each waypoint.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp4 = 0;       # waypoint number&lt;br /&gt;
var wp4alt = 0;    # waypoint altitude&lt;br /&gt;
var wp4dist = 0;   # waypoint distance&lt;br /&gt;
var wp4angle = 0;  # waypoint angle&lt;br /&gt;
var wp4length = 0; # waypoint length&lt;br /&gt;
var wp4id = &amp;quot;&amp;quot;;    # waypoint id&lt;br /&gt;
var wp4brg = 0;    # waypoint bearing&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A vector based version ==&lt;br /&gt;
&lt;br /&gt;
One simple way to accomplish this is by using another vector for each waypoint, nested inside the original vector. So that we end up with a two-dimensional data structure. For example, imagine a folder containing subfolders, with folders not having names but rather indices (numbers).&lt;br /&gt;
&lt;br /&gt;
So we could be using a &amp;quot;main&amp;quot; vector to store all waypoints, while each field of the main vector is a different vector that contains all waypoint-specific data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp4 = 0;       # waypoint number&lt;br /&gt;
var wp4alt = 0;    # waypoint altitude&lt;br /&gt;
var wp4dist = 0;   # waypoint distance&lt;br /&gt;
var wp4angle = 0;  # waypoint angle&lt;br /&gt;
var wp4length = 0; # waypoint length&lt;br /&gt;
var wp4id = &amp;quot;&amp;quot;;    # waypoint id&lt;br /&gt;
var wp4brg = 0;    # waypoint bearing&lt;br /&gt;
&lt;br /&gt;
var waypoint4 = [wp4,wp4alt,wp4dist,wp4angle,wp4length,wp4id, wp4brg];&lt;br /&gt;
var waypoints = [waypoint4]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First of all, we are setting up all the different variables for wp4, next, you are storing all variables in a vector called &amp;quot;waypoint4&amp;quot;. In the end, we store this vector in another vector named &amp;quot;waypoints&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So, the very first vector element would be waypoints[0] and it would point to another vector (waypoint4), the elements of waypoint4 would be also available by index:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp4 = 1;         # waypoint number&lt;br /&gt;
var wp4alt = 1000;   # waypoint altitude&lt;br /&gt;
var wp4dist = 20.4;  # waypoint distance&lt;br /&gt;
var wp4angle = 33.4; #waypoint angle&lt;br /&gt;
var wp4length = 12;  # waypoint length&lt;br /&gt;
var wp4id = &amp;quot;none&amp;quot;;  # waypoint id&lt;br /&gt;
var wp4brg = 122;    # waypoint bearing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var waypoint4 = [wp4,wp4alt,wp4dist,wp4angle,wp4length,wp4id, wp4brg];&lt;br /&gt;
var waypoints = [waypoint4]&lt;br /&gt;
&lt;br /&gt;
print ( waypoints[0][0] ) # contains the data stored in wp4&lt;br /&gt;
print ( waypoints[0][1] ) # contains the data stored in wp4alt&lt;br /&gt;
print ( waypoints[0][2] ) # contains the data stored in wp4dist&lt;br /&gt;
print ( waypoints[0][3] ) # contains the data stored in wp4angle&lt;br /&gt;
print ( waypoints[0][4] ) # contains the data stored in wp4length&lt;br /&gt;
print ( waypoints[0][5] ) # contains the data stored in wp4id&lt;br /&gt;
print ( waypoints[0][6] ) # contains the data stored in wp4brg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What we have here is a list of waypoints, with the first (0th) element containing another vector.&lt;br /&gt;
&lt;br /&gt;
Obviously, you could add a bunch of other waypoints to the &amp;quot;waypoints&amp;quot; vector, too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint4 = [wp4,wp4alt,wp4dist,wp4angle,wp4length,wp4id, wp4brg];&lt;br /&gt;
var waypoint5 = [wp5,wp5alt,wp5dist,wp5angle,wp5length,wp5id, wp5brg];&lt;br /&gt;
var waypoints = [waypoint4, waypoint5]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only problem with this approach is, that you'll need to set up all those wp variables - so there's a shorter version possible, by directly adding your data without using variables, i.e. &amp;quot;inline&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint4 = [1,1000,12,22,44,&amp;quot;none&amp;quot;, 33];&lt;br /&gt;
var waypoint5 = [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133];&lt;br /&gt;
var waypoints = [waypoint4, waypoint5];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's an even more succinct version possible. The next step would be to use embedded vectors directly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [&lt;br /&gt;
 [1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], &lt;br /&gt;
 [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is just formatted for clarity, the following snippet would be equivalent, but not as readable to people new to vectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [ [1,1000,12,22,44,&amp;quot;none&amp;quot;, 33],  [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133] ];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Accessing such a vector with embedded (or nested) vectors is still as simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
print(waypoints[0][0]) # prints 1&lt;br /&gt;
print(waypoints[0][1]) # prints 1000&lt;br /&gt;
print(waypoints[1][0]) # prints 2&lt;br /&gt;
print(waypoints[1][1]) # prints 1500&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only issue here is that you'll need to keep vector ordering in mind so that you can always access the right element number. This could be simplified by using some variables with telling names as the index for each vector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# these are used self-explanatory indices - so that you don't need to remember each field's position:&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
print(waypoints[0][ALTITUDE]) # prints 1&lt;br /&gt;
print(waypoints[0][DISTANCE]) # prints 1000&lt;br /&gt;
print(waypoints[1][ALTITUDE]) # prints 2&lt;br /&gt;
print(waypoints[1][DISTANCE]) # prints 1500&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, this yields already fairly readable source code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
&lt;br /&gt;
# print the altitude for each waypoint in the vector:&lt;br /&gt;
foreach(var waypoint; waypoints) {&lt;br /&gt;
    print( waypoint[ALTITUDE] );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, this would already be much better than our original version, because we can now have an arbitrary number of waypoints. New waypoints would need to be added to the waypoints vector by using the append() library function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]]&lt;br /&gt;
print(waypoints[0][ALTITUDE]) # prints 1&lt;br /&gt;
print(waypoints[0][DISTANCE]) # prints 1000&lt;br /&gt;
print(waypoints[1][ALTITUDE]) # prints 2&lt;br /&gt;
print(waypoints[1][DISTANCE]) # prints 1500&lt;br /&gt;
&lt;br /&gt;
append(waypoints, [3,3000,122,212,34,&amp;quot;none&amp;quot;, 133] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we could come up with some helper functions to deal with the vector details transparently, using the same method as before: self-explanatory indices, which spares us having to remember the purpose of each field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]];&lt;br /&gt;
&lt;br /&gt;
var get = func (n,what) {&lt;br /&gt;
    return waypoints[n][what];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var set = func (n,what,value) {&lt;br /&gt;
    waypoints[n][what]=value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print( get(0, ALTITUDE)  ); # prints 1&lt;br /&gt;
print( get(0, DISTANCE)  ); # prints 1000&lt;br /&gt;
print( get(1, ALTITUDE)  ); # prints 2&lt;br /&gt;
print( get(1, DISTANCE)  ); # prints 1500&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's one caveat here: The set function doesn't check the size of the vector, so it may try to access elements that are not there. To fix this, you'd need to use size(vec) call and check its size, and then adjust the size as needed using the set size(vec, size) library function.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You could even add some more high level helpers for each waypoint field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var NUMBER=0; var ALTITUDE=1; var DISTANCE=2; var ANGLE=3; var LENGTH=4; var ID=5; var BRG=6;&lt;br /&gt;
var waypoints = [[1,1000,12,22,44,&amp;quot;none&amp;quot;, 33], [2,1500,22,42,14,&amp;quot;none&amp;quot;, 133]];&lt;br /&gt;
&lt;br /&gt;
var get = func (n,what) {&lt;br /&gt;
    return waypoints[n][what];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var set = func (n,what,value) {&lt;br /&gt;
    waypoints[n][what]=value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_alt = func(n) {&lt;br /&gt;
    return get(n,ALTITUDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_dist = func(n) {&lt;br /&gt;
    return get(n,DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_angle = func(n) {&lt;br /&gt;
    return get(n,ANGLE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_length = func(n) {&lt;br /&gt;
    return get(n,LENGTH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_id = func(n) {&lt;br /&gt;
    return get(n,ID);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var get_brg = func(n) {&lt;br /&gt;
    return get(n,BEARING);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There's still one issue though: we are using lots of variables and helpers that all belong to the &amp;quot;waypoints&amp;quot; type, but which clutter our source code. &lt;br /&gt;
&lt;br /&gt;
So, next, we are going to look into an even more flexible approach that nicely maps each waypoint field and all helper functions to a symbolic name, without having to remember vector indices and such: using Nasal hashes, which are easier to use than complex arrangements using nested vectors.&lt;br /&gt;
&lt;br /&gt;
== A hash based version (recommended) ==&lt;br /&gt;
&lt;br /&gt;
Now, to wrap these fields into a single variable that serves as the container for other variables, we could use a Nasal hash and start completely from scratch. &lt;br /&gt;
&lt;br /&gt;
Consider the following empty hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we are going to add some fields to our new variable &amp;quot;container&amp;quot;. Each new field can be assigned an initial value, this is done by treating the field as a value/key pair, with a colon (:) separating both. And with multiple fields being separated by a comma (formatting only added for clarity):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# declare a new hash named waypoint&lt;br /&gt;
var waypoint = {&lt;br /&gt;
# add a few fields and assign a value to each field:&lt;br /&gt;
number:0,&lt;br /&gt;
altitude:0,&lt;br /&gt;
distance:0,&lt;br /&gt;
angle:0,&lt;br /&gt;
length:0,&lt;br /&gt;
ID:0,&lt;br /&gt;
bearing:0&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which is equivalent to this, more succinct, version:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:0,altitude:0,distance:0,angle:0,length:0,ID:0,bearing:0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is already equivalent to our first example that used a vector to store this waypoint info, the only difference is here that we assign symbolic names (like number, altitude, distance etc) to each field, rather than just a numeric index, as was the case in the vector example.&lt;br /&gt;
&lt;br /&gt;
This adds the following &amp;quot;member fields&amp;quot; to the waypoint hash and sets their initial value to 0:&lt;br /&gt;
* number&lt;br /&gt;
* altitude&lt;br /&gt;
* distance&lt;br /&gt;
* angle&lt;br /&gt;
* length&lt;br /&gt;
* ID&lt;br /&gt;
* bearing&lt;br /&gt;
&lt;br /&gt;
Now, to access any of these fields, we would use the &amp;quot;dot notation&amp;quot; by first specifying the name of the enclosing context (which is just a fancy word for the name of the hash) and the name of the field we are interested in. You could read this as LOCATION.FIELD (i.e. get FIELD out of location).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:0,altitude:0,distance:0,angle:0,length:0,ID:0,bearing:0};&lt;br /&gt;
print ( waypoint.number );&lt;br /&gt;
print ( waypoint.altitude );&lt;br /&gt;
print ( waypoint.distance );&lt;br /&gt;
print ( waypoint.angle );&lt;br /&gt;
print ( waypoint.length );&lt;br /&gt;
print ( waypoint.ID );&lt;br /&gt;
print ( waypoint.bearing );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, the hash represents the surrounding environment (i.e. context or &amp;quot;namespace&amp;quot;) in which these symbols are valid. For more information on namespaces, please see [[Namespaces and Methods]].&lt;br /&gt;
&lt;br /&gt;
Now, to make this is a little more interesting and to show what's happening, we are going to change the value of each field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
print ( waypoint.number ); # prints 1&lt;br /&gt;
print ( waypoint.altitude ); # prints 2&lt;br /&gt;
print ( waypoint.distance ); # prints 3&lt;br /&gt;
print ( waypoint.angle ); # prints 4&lt;br /&gt;
print ( waypoint.length ); # 5&lt;br /&gt;
print ( waypoint.ID ); #6&lt;br /&gt;
print ( waypoint.bearing ); #7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, you could obviously create several different versions of this hash to store your waypoint data:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint1 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint2 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint3 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint4 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint5 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is already a pretty cool thing because you would end up with 5 different containers all having their own set of fields, that you can access and set arbitrarily - without affecting the other containers.&lt;br /&gt;
&lt;br /&gt;
But the cool thing comes next:&lt;br /&gt;
&lt;br /&gt;
As you may have noticed, the code (internal structure of fields) for each waypoint is 100% identical - so we could just as well tell the Nasal engine to use an existing hash as a TEMPLATE for a new object instead of having to replicate the hash over and over again. This is accomplished using the &amp;quot;parents&amp;quot; keyword:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var Position3D = {x:1.00, y:2.00, z:3.00};&lt;br /&gt;
var p1 = { parents: [Position3D] };&lt;br /&gt;
var p2 = { parents: [Position3D] };&lt;br /&gt;
var p3 = { parents: [Position3D] };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates three different new containers/hashes by copying the fields from the hash specified in the parents' vector.&lt;br /&gt;
&lt;br /&gt;
What parents will do is this: whenever a hash contains a vector field named &amp;quot;parents:&amp;quot; pointing to other hashes, it will look up the parent hashes and use them as a template and copy the fields of the parent hashes to the new hash, i.e. less typing for you!&lt;br /&gt;
&lt;br /&gt;
This means, that the previously posted code could be easily abbreviated and written like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint1 = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var waypoint2 = {parents:[waypoint1] };&lt;br /&gt;
var waypoint3 = {parents:[waypoint1] };&lt;br /&gt;
var waypoint4 = {parents:[waypoint1] };&lt;br /&gt;
var waypoint5 = {parents:[waypoint1] };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You could even introduce a new helper function to create new objects, let's call it new_waypoint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var new_waypoint = func() {&lt;br /&gt;
 return { parents:[waypoint] };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var waypoint1 = new_waypoint();&lt;br /&gt;
var waypoint2 = new_waypoint();&lt;br /&gt;
var waypoint3 = new_waypoint();&lt;br /&gt;
var waypoint4 = new_waypoint();&lt;br /&gt;
var waypoint5 = new_waypoint();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
or using a vector for each object, which has the added advantage that you can easily create arbitrary amounts of waypoints on demand:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# this is our template for new waypoints&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
&lt;br /&gt;
# this is our allocator function creating new waypoints&lt;br /&gt;
var new_waypoint = func {return {parents:[waypoint] };}&lt;br /&gt;
&lt;br /&gt;
var waypoints = [nil,nil,nil,nil,nil]; # initialize the vector to set its size&lt;br /&gt;
&lt;br /&gt;
# populate the waypoints vector by allocating one new waypoint per &amp;quot;slot&amp;quot;&lt;br /&gt;
waypoints[0] = new_waypoint();&lt;br /&gt;
waypoints[1] = new_waypoint();&lt;br /&gt;
waypoints[2] = new_waypoint();&lt;br /&gt;
waypoints[3] = new_waypoint();&lt;br /&gt;
waypoints[4] = new_waypoint();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A shorter version would read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {number:1,altitude:2,distance:3,angle:4,length:5,ID:6,bearing:7};&lt;br /&gt;
var new_waypoint = func {return {parents:[waypoint] };}&lt;br /&gt;
&lt;br /&gt;
var NUM_ELEMENTS = 5;&lt;br /&gt;
var waypoints = [];&lt;br /&gt;
setsize(waypoints, NUM_ELEMENTS);&lt;br /&gt;
&lt;br /&gt;
forindex(var i; waypoints)&lt;br /&gt;
    waypoints[i] = new_waypoint();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once we start using a hash as a template for other hashes using the &amp;quot;parents&amp;quot; vector, we are creating a class that is copied to each new hash. This new copy of the class is called an &amp;quot;object&amp;quot; after creation.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;class&amp;quot; is just a template for a certain data type that consists of other data types and provides functions to work with the class. The functions publicly accessible are called its &amp;quot;interface&amp;quot; because these functions are meant to be used by the users of your class. This is in contrast to member fields which are usually not meant to be accessed directly.&lt;br /&gt;
&lt;br /&gt;
Once a class is used as a template to create a new object, we say the class is getting &amp;quot;instantiated&amp;quot;, i.e. an instance of the class (an actual object) is created. This makes it then possible to make use of its interface and access member functions (which are methods). Also see {{forum link|p=145769}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, given that the creation of new hashes using a template class is such a common thing to do - we could just as well add a new function to the parent hash that we can use to construct new hashes. As you could see already, the fields (or members) of a hash are specified in a well-defined form using the key/value format where key and value are separated by a colon: &amp;quot;field_name: value&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint1 = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This isn't any different for fields that are of type &amp;quot;function&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
&lt;br /&gt;
    hello: func {&lt;br /&gt;
        print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we have added a new field named &amp;quot;hello&amp;quot; to our waypoint hash. This can be easily accessed and also called:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    hello: func {&lt;br /&gt;
        print(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var w = {parents: [waypoint]};&lt;br /&gt;
w.hello();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand, we were just about to make the construction of such hashes much simpler. This can be done by creating a new function that constructs hashes dynamically using a hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var make_waypoint = func {&lt;br /&gt;
    return { parents:[waypoint] };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we are going to change the function and and embed it into the hash, so that the constructor function becomes a part of the class, renaming it to &amp;quot;new&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func {&lt;br /&gt;
        return {parents:[waypoint]}&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, whenever we need a new hash object of type &amp;quot;waypoint&amp;quot;, we can simply call this construction function (which we'll call a constructor from now on):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var wp = waypoint.new();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is what most Nasal code using OOP will typically look like.&lt;br /&gt;
&lt;br /&gt;
== Hashes and foreach (enumerating a hash) ==&lt;br /&gt;
&lt;br /&gt;
To iterate through all elements in a &amp;quot;hash the keys(hash) method&amp;quot; is used to produce a vector of the keys for the hash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var namehash = {};&lt;br /&gt;
namehash[&amp;quot;value1&amp;quot;]= 1;&lt;br /&gt;
namehash[&amp;quot;value2&amp;quot;] =2;&lt;br /&gt;
&lt;br /&gt;
foreach(var hash_key ; keys(namehash))&lt;br /&gt;
    print(namehash[hash_key]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A generic constructor ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, you'll work with classes that do not have any custom constructor functions - but you can easily create a generic constructor, too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func(obj) {&lt;br /&gt;
    return {parents:obj};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As long as '''obj''' is a vector of hashes, it can be simply invoked like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var p = new( [Position3D] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, once you remember that Nasal implicitly has an '''arg''' vector for its arguments, the whole thing can be simplified like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func {&lt;br /&gt;
    return {parents:arg};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var Position3D = {x:0.0, y:0.0, z:0.0};&lt;br /&gt;
&lt;br /&gt;
var p = new( Position3D );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will simply create a function named &amp;quot;new&amp;quot; which accepts an implicit list of arguments (in the implicit &amp;quot;args&amp;quot; vector). The function returns a hash whose parents field is set to the args vector, so this method could even be used for multiple inheritances. Note that the Position3D hash no longer has its constructor, it's just a simple hash in this case. &lt;br /&gt;
&lt;br /&gt;
To make this look a little nicer, we can also rename the default argument vector (i.e. args) to something more informative, like &amp;quot;classes&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func(classes...) {&lt;br /&gt;
    return {parents:classes};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var Position3D = {x:0.0, y:0.0, z:0.0};&lt;br /&gt;
&lt;br /&gt;
var p = new( Position3D );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using this approach, you could even make the &amp;quot;new operator&amp;quot; call custom constructors automatically for each created object.&lt;br /&gt;
&lt;br /&gt;
You could even implement an overloaded function that creates arrays/vectors of objects.&lt;br /&gt;
&lt;br /&gt;
A simple generic constructor can be expressed in a very succinct fashion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# a new function with an implicit arg parameter that simply returns a new hash with the parents' field set to all arguments provided&lt;br /&gt;
var new = func return { parents:arg };&lt;br /&gt;
&lt;br /&gt;
var Position3D = {x:0.0, y:0.0, z:0.0};&lt;br /&gt;
&lt;br /&gt;
var p = new( Position3D );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let's imagine you want to add another member function to print a certain field's value, such as &amp;quot;number&amp;quot;. &lt;br /&gt;
Given that objects created from the same class template, there needs to be away for a method (class function) to refer to itself (its object), i.e. to refer to the object itself, otherwise, the function wouldn't know what object is meant, and what object it is referring to.&lt;br /&gt;
&lt;br /&gt;
This can be accomplished using the &amp;quot;me&amp;quot; keyword which ensures that the member function is always referring to the currently active object (itself):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func {&lt;br /&gt;
        return {parents:[waypoint]};&lt;br /&gt;
    },&lt;br /&gt;
    show_number: func {&lt;br /&gt;
        print(me.number);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how we are just prepending the &amp;quot;me&amp;quot; keyword to the object's field, making it clear that &amp;quot;me&amp;quot; is the requested namespace/context of the field to be retrieved.&lt;br /&gt;
&lt;br /&gt;
On the other hand, maybe you'd like to add some information (such as the number) during construction time to the object. So this would require changing the constructor function to accept a parameter, too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
       return {parents:[waypoint]};&lt;br /&gt;
    },&lt;br /&gt;
    show_number: func {&lt;br /&gt;
        print(me.number);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how the new function has been changed to accept a parameter named &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Now, to actually set the number field during construction time to the value of n, you could create a temporary hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or in its entirety:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
    },&lt;br /&gt;
    show_number: func {&lt;br /&gt;
        print(me.number);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, back to your initial example regarding a list of waypoints:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var waypoints = [waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new() ];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how this creates a vector of 5 waypoints (0..4), each of these waypoints is a full object that can be conveniently accessed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
waypoints[0].bearing = 100;&lt;br /&gt;
waypoints[1].altitude = 100;&lt;br /&gt;
waypoints[2].ID = &amp;quot;none&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also use Nasal's support for looping to conveniently process these waypoints:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var waypoint = {&lt;br /&gt;
    number:1,&lt;br /&gt;
    altitude:2,&lt;br /&gt;
    distance:3,&lt;br /&gt;
    angle:4,&lt;br /&gt;
    length:5,&lt;br /&gt;
    ID:6,&lt;br /&gt;
    bearing:7,&lt;br /&gt;
    new: func(n) {&lt;br /&gt;
        var t={parents:[waypoint]};&lt;br /&gt;
        t.number = n;&lt;br /&gt;
        return t;&lt;br /&gt;
    },&lt;br /&gt;
    dump: func {&lt;br /&gt;
        print(&amp;quot;Altitude:&amp;quot;, me.altitude, &amp;quot; distance:&amp;quot;, me.distance, &amp;quot; Bearing:&amp;quot;, me.bearing);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var waypoints = [waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new(), waypoint.new(), ];&lt;br /&gt;
&lt;br /&gt;
foreach(var w; waypoints) {&lt;br /&gt;
    w.dump();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you may remember, the parents' keyword points not just to a single &amp;quot;class template&amp;quot; (hash), but instead to a vector of hashes. This makes it possible to use several different hashes as the template for a new hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
&lt;br /&gt;
var propulsion = {horse_power:0};&lt;br /&gt;
var vehicle = {tyres:0};&lt;br /&gt;
&lt;br /&gt;
# create different propulsion classes:&lt;br /&gt;
var engine = new(propulsion);&lt;br /&gt;
var piston_engine = new (engine);&lt;br /&gt;
var turboprop_engine = new(engine);&lt;br /&gt;
var jet_engine = new(engine);&lt;br /&gt;
&lt;br /&gt;
var car = new(vehicle, propulsion);&lt;br /&gt;
var boat = new(vehicle, propulsion);&lt;br /&gt;
var airplane = new(vehicle, propulsion);&lt;br /&gt;
&lt;br /&gt;
# seaplane is a new type of vehicle that inherits from the classes boat and aeroplane&lt;br /&gt;
var seaplane = new(boat, airplane);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two important concepts to keep in mind here: The relationship between classes is classified according to an &amp;quot;IS A&amp;quot; and &amp;quot;HAS A&amp;quot; pattern:&lt;br /&gt;
&lt;br /&gt;
* a car &amp;quot;IS A&amp;quot; vehicle&lt;br /&gt;
* an aeroplane &amp;quot;IS A&amp;quot; vehicle&lt;br /&gt;
* an elephant &amp;quot;IS AN&amp;quot; animal&lt;br /&gt;
&lt;br /&gt;
* a car &amp;quot;HAS AN&amp;quot; engine (0..x)&lt;br /&gt;
* an airplane &amp;quot;HAS AN&amp;quot; engine (0..x)&lt;br /&gt;
* an elephant &amp;quot;HAS&amp;quot; ears&lt;br /&gt;
&lt;br /&gt;
The difference when dealing with these relationships is that whenever something &amp;quot;IS&amp;quot; something, the right thing to do is to directly create a new object using the parent class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
var animal = {eyes:0,ears:0};&lt;br /&gt;
&lt;br /&gt;
var dog = new(animal);&lt;br /&gt;
var cat = new(animal);&lt;br /&gt;
var bird = new(animal);&lt;br /&gt;
var spider = new(animal);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, imagine we wanted to keep the number of legs for each animal, too: 4 legs for dogs and cats, 2 legs for birds and 8 legs for spiders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
var animal = {eyes:0,ears:0,legs:0};&lt;br /&gt;
&lt;br /&gt;
var dog = new(animal);&lt;br /&gt;
var cat = new(animal);&lt;br /&gt;
var bird = new(animal);&lt;br /&gt;
var spider = new(animal);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, at some point we may need additional information for each leg - such as the length of each leg. That's where we use a new &amp;quot;leg&amp;quot; class (an animal HAS legs), so that the animal class no longer just contains the number of legs, but rather contains a vector of &amp;quot;leg&amp;quot; objects:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var new = func return {parents:arg};&lt;br /&gt;
var leg = {length:0};&lt;br /&gt;
var animal = {eyes:0,ears:0,legs:[] };&lt;br /&gt;
&lt;br /&gt;
var dog = new(animal);&lt;br /&gt;
var cat = new(animal);&lt;br /&gt;
var bird = new(animal);&lt;br /&gt;
var spider = new(animal);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was a very simple introduction to object-oriented programming in Nasal.&lt;br /&gt;
&lt;br /&gt;
[[Category: Nasal howto|Module, Create a new Nasal]]&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User_talk:Scttgs&amp;diff=125680</id>
		<title>User talk:Scttgs</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User_talk:Scttgs&amp;diff=125680"/>
		<updated>2020-06-14T10:12:50Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Created page with &amp;quot;Great work on the World Scenery 3.0 roadmap article! --~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Great work on the [[World Scenery 3.0 roadmap]] article! --[[User:Chillz|Chillz]] ([[User talk:Chillz|talk]]) 06:12, 14 June 2020 (EDT)&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125679</id>
		<title>User:Chillz</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Chillz&amp;diff=125679"/>
		<updated>2020-06-14T10:11:32Z</updated>

		<summary type="html">&lt;p&gt;Chillz: Created page with &amp;quot;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her talk page!&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Chillz''' is a NEW editor on the FlightGear wiki. Need help or assistance with anything? Leave her a note on her [[User talk:Chillz|talk page]]!&lt;/div&gt;</summary>
		<author><name>Chillz</name></author>
	</entry>
</feed>