<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://backup.witchspacewiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Milo</id>
	<title>Elite Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://backup.witchspacewiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Milo"/>
	<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php/Special:Contributions/Milo"/>
	<updated>2026-04-16T08:34:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.12</generator>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67369</id>
		<title>Traffic Control OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67369"/>
		<updated>2021-07-17T03:41:51Z</updated>

		<summary type="html">&lt;p&gt;Milo: added version 2.02&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A little script which gives each system main station a traffic control department, whose job it is to guide new Commanders (and a few old hands who have become too reliant on docking computers) on the best route for manual approach and docking into the station. They oversee all traffic from station aegis and planetary approach right up until the actual docking itself. Also they keep an eye on ships leaving the station and wish people a bon voyage. Just don't dally in the approach lane and get in everyone's way, or you'll feel their wrath!&lt;br /&gt;
&lt;br /&gt;
Recommended for new players learning how to dock manually, and for experienced players who want a bit of extra ambience around main stations. It is fully integrated with the docking clearance protocols introduced in Oolite 1.72 (if the stations enable them). Most messages from this OXP will appear only if your ship does not have functional docking computers, but a few will appear regardless, for example: Clear the lane, Commander! If you see a message that starts with 'Traffic Control:' then it is probably from this OXP.&lt;br /&gt;
&lt;br /&gt;
In terms of balance, this OXP is neutral for beginners and slightly biased against the experienced player, because it enforces (with fines and small but escalating bounties) a sensible rule against the use of cloaking devices in proximity to main stations... however, to be fair, it will not impose any penalties if you pass undetected (or at least unidentified). Of course, requesting docking clearance or activating docking computers will transmit your identity to the station...&lt;br /&gt;
&lt;br /&gt;
This OXP is compatible with all other OXPs, and includes considerations for Buoy Repair, ILS and AutoDock if those OXPs are also installed.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
This OXP requires at least version 1.88 of Oolite. &lt;br /&gt;
&lt;br /&gt;
The traffic controllers also assume that any Commander's ship equipped with Docking Computers can look after itself in terms of approach and docking.&lt;br /&gt;
&lt;br /&gt;
==Version History==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
09/10/2008 - Version 1.00, Initial release.&lt;br /&gt;
04/11/2008 - Version 1.01, scripting update for v1.72+ compatibility.&lt;br /&gt;
24/05/2010 - Version 1.10, fortified equipment damage checking for 1.74&lt;br /&gt;
13/02/2011 - Version 1.11, removal of upper limit, to allow running with 1.75&lt;br /&gt;
08/07/2020 - Version 2.00, updated by Milo; set minimum Oolite version to 1.88; &lt;br /&gt;
*fixed errors if navigation buoy is destroyed; &lt;br /&gt;
*corrected planet approach guidance (follow green circle, not square, if ship has a basic compass); &lt;br /&gt;
*added additional hints for new players (until they buy docking computers); &lt;br /&gt;
*set up recurring reminders to &amp;quot;clear the lane&amp;quot; when not supposed to be there; &lt;br /&gt;
*integrated docking advice with docking clearance protocol for main stations that require clearance; &lt;br /&gt;
*added warning messages to fugitive players entering station aegis or requesting docking clearance; &lt;br /&gt;
*Cloaking Devices: added responses to being detected using cloaking devices in the station aegis (this OXP now declares it illegal to cloak within main station aegis and introduces a small bounty for the first offence, which will be increased for non-fugitive players each time they are detected still cloaked after the initial offence; however, entering the aegis cloaked and never interacting with the station will not impose a penalty as the traffic controllers are unaware of the trespass); added a 1000 credit fine (or equivalent bounty) to the arrival report when docking at main stations while cloaked (even if fast-docking is used); &lt;br /&gt;
*added considerations for nova systems (traffic control will leave a recording when sun has gone nova) and for Buoy Repair, ILS and AutoDock OXPs&lt;br /&gt;
07/11/2021 - Version 2.01, updated by Milo; fix bug reported by dybal (docking clearance &amp;quot;granted&amp;quot; status was not correctly detected, resulting in unintended behavior, particularly noticeable when combined with ILS OXP)&lt;br /&gt;
07/16/2021 - Version 2.02, updated by Milo; reduced the frequency of some messages, changed one word to be more situationally neutral, and fixed a log warning involving percent symbols; updated license from CC 3.0 to CC 4.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
The latest version, [[Media:Oolite.oxp.Thargoid.TrafficControl.2.02.oxz|Traffic Control v2.02]], can be downloaded from the wiki by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
An older version, [http://www.box.com/shared/qah2zp7sq2 '''Traffic Control v1.11'''], can be downloaded from Box.Net by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=20180 BB Thread] (2019-20)&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?p=59662#p59662 Original thread] (2008)&lt;br /&gt;
&lt;br /&gt;
[[File:Tag-colour-blue.png]]{{OXPLevel|0}}&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.02.oxz&amp;diff=67368</id>
		<title>File:Oolite.oxp.Thargoid.TrafficControl.2.02.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.02.oxz&amp;diff=67368"/>
		<updated>2021-07-17T03:40:29Z</updated>

		<summary type="html">&lt;p&gt;Milo: 07/16/2021 - Version 2.02, updated by Milo; reduced the frequency of some messages, changed one word to be more situationally neutral, and fixed a log warning involving percent symbols; updated license from CC 3.0 to CC 4.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
07/16/2021 - Version 2.02, updated by Milo; reduced the frequency of some messages, changed one word to be more situationally neutral, and fixed a log warning involving percent symbols; updated license from CC 3.0 to CC 4.0&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Space_Crowds&amp;diff=67329</id>
		<title>Space Crowds</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Space_Crowds&amp;diff=67329"/>
		<updated>2021-07-16T01:00:11Z</updated>

		<summary type="html">&lt;p&gt;Milo: added version history&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Adds random encounters in deep space.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Space Crowds (SC) is basically a heavy modification of Deep Space Pirates. The changes are:&lt;br /&gt;
* It is more focused on populating the &amp;quot;long lanes&amp;quot; than guarding the main lanes against &amp;quot;cheaters&amp;quot;. SC is triggered by the use of the Torus drive rather than the location,&lt;br /&gt;
* It takes into account the base speed of your ship so the number of encounters is roughly function of the distance you travel with the Torus engaged,&lt;br /&gt;
* It is less player-centric: it doesn't increase the number of ships spawn depending on your kills, and it spawns equally pirates, hunters, police, traders and very rarely Thargoids ships.&lt;br /&gt;
&lt;br /&gt;
Based on and inspired from [[User:Eric Walch|Eric Walch]]'s [[DeepSpacePirates|Deep Space Pirates]]. Should work with it, but they overlap in functionality. Configurable with [[User:Svengali|Svengali]]'s [[Library]].&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
*CC-BY-NC-SA 4.0&lt;br /&gt;
*Author: [[User:Astrobe|Astrobe]]&lt;br /&gt;
*Version 1.2.0&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=19053 BB Thread]] (2017+)&lt;br /&gt;
*[[Stellar Serpents OXP|Space Crowds - Stellar Serpent]]&lt;br /&gt;
&lt;br /&gt;
== Version History ==&lt;br /&gt;
*Version 1.2.0 - switch from visibility criteria to distance criteria to decide if a spawned ship should be removed - two options to however preserve asteroids and derelicts contributed by Dybal.	&lt;br /&gt;
*Version 1.1.0 - contributed by phkb&lt;br /&gt;
*Version 1.0.0 - initial release&lt;br /&gt;
&lt;br /&gt;
== Gameplay and Balance Indicator ==&lt;br /&gt;
[[File:Tag-colour-green.png|right]]&lt;br /&gt;
Good things and bad things usually end up balancing each other out.&lt;br /&gt;
&lt;br /&gt;
{{Activity-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:SpaceCrowds_1.1.oxz&amp;diff=67328</id>
		<title>File:SpaceCrowds 1.1.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:SpaceCrowds_1.1.oxz&amp;diff=67328"/>
		<updated>2021-07-16T00:56:54Z</updated>

		<summary type="html">&lt;p&gt;Milo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Missiles_and_Bombs&amp;diff=67301</id>
		<title>Missiles and Bombs</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Missiles_and_Bombs&amp;diff=67301"/>
		<updated>2021-07-15T03:33:07Z</updated>

		<summary type="html">&lt;p&gt;Milo: added version history from 2.8 readme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Missiles and Bombs is an OXP containing a collection of weapons and equipment available to buy from medium and high tech shipyards.  While heavily focused on offensive weapons, the package also provides a selection of defensive equipment that may be particularly useful to pilots operating slower vessels.&lt;br /&gt;
&lt;br /&gt;
== Offensive Weapons ==&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[Image:BlueSteel.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-1 Blue Steel Stand-off Cascade Missile'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Blue Steel is a large ship-sized missile armed with a 10-megaton quirium cascade warhead, effective at ranges of up to 20km.  Although slower and less maneuverable than a conventional missile, the Blue Steel is hardened against both electronic countermeasures and direct laser fire, increasing its survivability in combat situations.&amp;lt;br/&amp;gt;Availability: TL13+ systems, 10,000₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:RedPivot.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-2 Red Pivot Fragmentation Missile'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Red Pivot is a medium-sized missile armed with a fragmentation warhead.  Upon initial detonation, a collection of bomblets are released which are then exploded via a time-delay fuse.  The weapon has a 750m blast radius.&amp;lt;br/&amp;gt;Availability: TL9+ systems, 750₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:GreenSpark.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-3 Green Spark Laydown Fragmentation Bomb'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Green Spark is a derivative of the Red Pivot missile and is armed with with a similar but significantly larger fragmentation warhead.  The weapon is deployed in the form of a mine, and so may be used without a specific target being set into a ship's systems.  The wide blast radius of the bomb makes it especially effective against multiple-ship formations or static targets such as asteroids or space stations.&amp;lt;br/&amp;gt;Availability: TL8+ systems, 650₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:OrangeTear.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-4 Orange Tear Immobilisation Missile'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Popularly known as the 'Lawmaker', the Orange Tear was developed for use by GalCop to help in apprehending fugitives.  The missile uses a short-range electromagnetic pulse to temporarily disable a ship's systems, bringing the vehicle to a stop and allowing it to be boarded and searched by law enforcement officers.&amp;lt;br/&amp;gt;Availability: TL10+ systems, 2,000₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:BlueNeon.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-5 Blue Neon High Speed Interception Missile'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Blue Neon is a small and highly-maneuverable missile designed for use against fast, agile targets capable of outrunning conventional weapons.  For maximum speed the missile is equipped with fuel injection, however due to size and weight constraints this results in a relatively small warhead.  The Blue Neon in therefore best used to damage and slow down targets, bringing them within range of laser fire or heavier missile weapons.&amp;lt;br/&amp;gt;Availability: TL7+ systems, 50₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:YellowChisel.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-6 Yellow Chisel Multiple Warhead Anti-Thargoid Missile'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Developed for use by the Imperial Navy against Thargoid warship formations, the Yellow Chisel is a large missile weapon that splits into four independent warheads; each warhead is equipped with a smart seeker head that is able to automatically identify and engage Thargoid ships, significantly increasing the odds of a successful attack.  In the hands of Navy pilots, the Yellow Chisel is helping to turn the tide against the Thargoid menace.&amp;lt;br/&amp;gt;Availability: TL10+ systems, 8,000₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:VioletFlax.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-7 Violet Flax Electronic Override Missile'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;An advanced development of the Orange Tear, the Violet Flax analyses a target's systems and within seconds generates an intelligent software virus designed to strike at vulnerable areas of code within the target's avionics systems.  The virus is transmitted by the missile via a short-range electromagnetic pulse, and results in temporary control failure and severe damage to the ship's equipment.&amp;lt;br/&amp;gt;Availability: TL13+ systems, 8,500₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Image:PurpleStrand.png|left|150px]]&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;'''AS-8 Purple Strand Remote Detonation Bomb'''&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Purple Strand is a high explosive munition that is deployed in the same way as a mine but is detonated using remote control rather than a time-delay fuse.  The weapon is armed once it has reached a sufficient distance from the launching ship, after which it may be detonated using an ECM pulse.  The bomb has an effective range of 5km.&amp;lt;br/&amp;gt;Availability: TL10+ systems, 2,000₢ each.&amp;lt;br/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
== Defense Systems ==&lt;br /&gt;
&lt;br /&gt;
'''Chaff Dispenser'''&lt;br /&gt;
&lt;br /&gt;
The Chaff Dispenser allows a pilot to launch bundles of chaff to provide a passive defense against most conventional missiles, including the industry-standard [[Faulcon de Lacy]] HM3 and HMX5 models.  Chaff refills, available in bundles of five, may be purchased at shipyards once the dispenser equipment is installed.&lt;br /&gt;
&lt;br /&gt;
Availability: TL8+ systems, 5,000₢ &amp;lt;br/&amp;gt;&lt;br /&gt;
Chaff refills: TL5+ systems, 500₢ per refill.&lt;br /&gt;
&lt;br /&gt;
'''Defense Mine'''&lt;br /&gt;
&lt;br /&gt;
The Defense Mine is an anti-missile defense system.  Each mine releases four smart missiles, each armed with a small fragmentation warhead, that automatically seek and destroy any other missiles in the immediate area.&lt;br /&gt;
&lt;br /&gt;
Availability: TL10+ systems, 7,000₢ each.&lt;br /&gt;
&lt;br /&gt;
'''Distress Beacon'''&lt;br /&gt;
&lt;br /&gt;
For pilots operating in dangerous territory, the Distress Beacon is an invaluable security precaution.  Once deployed, the beacon transmits a distress signal to the nearest police unit, which will dispatch a squadron of ships to assist against any hostile targets.&lt;br /&gt;
&lt;br /&gt;
Availability: TL10+ systems, 700₢ each.&lt;br /&gt;
&lt;br /&gt;
== Version Requirement ==&lt;br /&gt;
The latest version of Missiles and Bombs is v2.8 requires Oolite v1.79+ to work properly.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
Download v2.8 in OXZ format [[Media:Missiles_and_Bombs_2.8.oxz|here]] for Oolite 1.79 or later (downloaded {{#downloads:Missiles_and_Bombs_2.8.oxz}} times). Discussion of this updated version can be found on the [http://aegidian.org/bb/viewtopic.php?t=19488 BB Forum here].&lt;br /&gt;
&lt;br /&gt;
Missiles and Bombs (v2.5) is available from Ramirez' Oolite Pages [http://www.arcadia-digital.net/steve/Oolite/Oolite.html here].&lt;br /&gt;
&lt;br /&gt;
== Version History ==&lt;br /&gt;
2.8, July 2021 (by phkb)&lt;br /&gt;
- Made Intercept missile susceptible to ECM.&lt;br /&gt;
&lt;br /&gt;
2.7, July 2018 (by phkb)&lt;br /&gt;
- Added unique missile icon for Intercept missile.&lt;br /&gt;
&lt;br /&gt;
2.6, March 2018 (by phkb)&lt;br /&gt;
- Updated to avoid deprecated AI methods.&lt;br /&gt;
&lt;br /&gt;
2.5, December 2011&lt;br /&gt;
- fixed a problem with errors caused when missiles have no target&lt;br /&gt;
&lt;br /&gt;
2.4, December 2009&lt;br /&gt;
- fixed a problem with chaff refills not being available after removing pylon-mounted weapons (compatibility with Oolite v1.73.4)&lt;br /&gt;
&lt;br /&gt;
2.3, October 2009&lt;br /&gt;
- fixed problem with AI stack overflow on the Override and Lawmaker missiles &lt;br /&gt;
&lt;br /&gt;
2.2, September 2009&lt;br /&gt;
- minor correction to the equipment.plist to make the Cascade Missile available to all&lt;br /&gt;
&lt;br /&gt;
2.1, February 2009&lt;br /&gt;
- re-engineered the chaff launcher to avoid having overwrite original missile AIs&lt;br /&gt;
&lt;br /&gt;
2.0, January 2009&lt;br /&gt;
- fixed the override missile, which was incorrectly damaging players' systems when used against NPCs&lt;br /&gt;
- revised the two EMP weapons so that they do not affect stations or asteroids&lt;br /&gt;
- made some minor game balancing tweaks&lt;br /&gt;
- general renaming of entities for consistency&lt;br /&gt;
- use of javascript to manage the chaff launcher more efficiently&lt;br /&gt;
&lt;br /&gt;
1.2, December 2008&lt;br /&gt;
- incorporated Commander McLane's Status Quo Q-Bomb OXP, which prevents cascade weapons from detonating close to planets and suns&lt;br /&gt;
- modified the warning message used with by the electronic override missile shows which system has been damaged&lt;br /&gt;
- implemented compatibility changes for Oolite v1.72&lt;br /&gt;
&lt;br /&gt;
1.1, September 2008&lt;br /&gt;
- electronic override missile now causes random failure of a ship's systems.  Note that the weapon can be used against the player as well as NPC ships.&lt;br /&gt;
- defence mine has been modified so that once again it targets incoming missiles.  The new missile interception code used in Oolite v1.71.2 makes this more effective than in previous versions of Oolite&lt;br /&gt;
- anti-thargoid missile will target any thargoid or thargon ships in the area&lt;br /&gt;
&lt;br /&gt;
1.0, May 2008&lt;br /&gt;
- full release version to include compatibility with latest Oolite version (1.71.2)&lt;br /&gt;
- introduced javascript to manage the fragmentation weapons.  Each one is now fitted with a proper Strike Enable Facility to ensure that they can only be activated when given the correct instruction.  In previous versions, weapons such as the frag missile and frag bomb were liable to detonate in the event of a collision or explosion&lt;br /&gt;
- chaff refills are now only available from the shipyard if the player has a chaff dispenser fitted.&lt;br /&gt;
&lt;br /&gt;
0.5, March 2008&lt;br /&gt;
- modified chaff so that it is no longer 100% effective and not as persistent.  &lt;br /&gt;
&lt;br /&gt;
0.4, November 2007&lt;br /&gt;
- added a multi-use chaff dispenser.  The flares in v0.3 have been modified so that missiles (both standard and ECM-hardened) will lock onto them.  The system has then been transformed into a multi-use chaff launcher&lt;br /&gt;
- interception missiles now make more use of fuel injection as originally intended&lt;br /&gt;
- added the Purple Strand ECM-activated remote detonation bomb.&lt;br /&gt;
&lt;br /&gt;
0.3, September 2007&lt;br /&gt;
- added the Violet Flax Electronic Override Missile&lt;br /&gt;
- added the Distress Beacon&lt;br /&gt;
- altered the EMP Immobilisation Missile to have only a temporary effect on targets; ships will now be out of action for only 15 seconds&lt;br /&gt;
- further minor tweaks to various stats&lt;br /&gt;
&lt;br /&gt;
0.2, March 2007&lt;br /&gt;
- altered the Defence Mine so that its missiles target pirate ships rather than other missiles.  This makes it much more useful in combat.&lt;br /&gt;
- minor tweaks to various stats.&lt;br /&gt;
&lt;br /&gt;
0.1, February 2007&lt;br /&gt;
- Initial package containing the following:&lt;br /&gt;
    - Cascade Missile&lt;br /&gt;
    - Anti-Thargoid Missile&lt;br /&gt;
    - EMP Immobilisation Missile&lt;br /&gt;
    - Fragmentation Missile and Bomb&lt;br /&gt;
    - Interception Missile&lt;br /&gt;
    - Anti-Missile Defence Mine&lt;br /&gt;
    - Flare Dispenser&lt;br /&gt;
&lt;br /&gt;
{{weapon-OXP}} {{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Shipdata.plist&amp;diff=67300</id>
		<title>Shipdata.plist</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Shipdata.plist&amp;diff=67300"/>
		<updated>2021-07-15T02:53:51Z</updated>

		<summary type="html">&lt;p&gt;Milo: added missing quotation mark pointed out by UK_Eliter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Format =&lt;br /&gt;
Shipdata.plist is in [http://wiki.alioth.net/index.php/Property_list Property List] format.&lt;br /&gt;
The shipdata document is a dictionary of ships. Example:&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;rsvh_adder&amp;quot; = {&lt;br /&gt;
        like_ship = &amp;quot;adder&amp;quot;;&lt;br /&gt;
        is_external_dependency = yes;&lt;br /&gt;
        pilot = &amp;quot;oolite-hunter&amp;quot;;&lt;br /&gt;
        roles = &amp;quot;rrs-vicious-hunter(1)&amp;quot;;&lt;br /&gt;
        &amp;quot;missile_role&amp;quot; = &amp;quot;EQ_HARDENED_MISSILE&amp;quot;;&lt;br /&gt;
    	&amp;quot;script_info&amp;quot; = {&lt;br /&gt;
    		&amp;quot;randomshipnames&amp;quot; = &amp;quot;hunter&amp;quot;;&lt;br /&gt;
    		&amp;quot;skilled_npc_role&amp;quot; = &amp;quot;hunter&amp;quot;;&lt;br /&gt;
    	};&lt;br /&gt;
      };&lt;br /&gt;
    &lt;br /&gt;
      &amp;quot;rsvh_asp&amp;quot; = {&lt;br /&gt;
        like_ship = &amp;quot;asp&amp;quot;;&lt;br /&gt;
        is_external_dependency = yes;&lt;br /&gt;
        pilot = &amp;quot;oolite-hunter&amp;quot;;&lt;br /&gt;
        roles = &amp;quot;rrs-vicious-hunter(1)&amp;quot;;&lt;br /&gt;
        &amp;quot;aft_weapon_type&amp;quot; = &amp;quot;WEAPON_BEAM_LASER&amp;quot;;&lt;br /&gt;
    	&amp;quot;script_info&amp;quot; = {&lt;br /&gt;
    		&amp;quot;randomshipnames&amp;quot; = &amp;quot;hunter&amp;quot;;&lt;br /&gt;
    		&amp;quot;skilled_npc_role&amp;quot; = &amp;quot;hunter&amp;quot;;&lt;br /&gt;
    	};&lt;br /&gt;
      };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
'''shipdata.[[plist]]''' will provide Oolite with all the definitions necessary to include it as an entity in the game, be it ship, station, freak object or sub-entity [[shipdata_structure|(extra)]]. The following (property) entries are, for order's sake, listed alphabetically:&lt;br /&gt;
&lt;br /&gt;
= Ship keys=&lt;br /&gt;
The following keys are used by all ships&lt;br /&gt;
==accuracy==&lt;br /&gt;
Used with missiles it has influence on tracking of target. Allowed values with missiles are between 0.0 and 10.0. When not defined, the system assigns to the missile the accuracy value of 0.0, which corresponds to the standard missile tracking behaviour.&lt;br /&gt;
&lt;br /&gt;
In 1.76 or earlier, when used with NPC ships it slightly enlarges the chance of shooting at greater distances, and makes a small improvement to their aim. Value with NPC ships is between -5 and 10 though all values between -5 and +1 will be increased to +1. When not defined, NPCs will be assigned a random value in the range +1 to +10.&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, when used with NPC ships it affects various aspects of the ship AI. Values can be assigned between -5 and +10. When not defined, a random value between -5 and +5 will be used. [[OXP_NPC_Combat_AI|NPC accuracy]] significantly affects the quality of the AI in combat.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;accuracy&amp;quot; = 8.3;&lt;br /&gt;
&lt;br /&gt;
== aft_eject_position ==&lt;br /&gt;
Determines the XYZ point on the model from which cargo is ejected.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;aft_eject_position&amp;quot; = &amp;quot;0.0 -4.5 -23.0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== aft_weapon_type ==&lt;br /&gt;
Assigns the ship's aft laser. &lt;br /&gt;
Any weapon type from the [[equipment.plist]] can be used (and WEAPON_NONE). &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;aft_weapon_type&amp;quot; = &amp;quot;WEAPON_BEAM_LASER&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== ai_type ==&lt;br /&gt;
Assigns an AI to the entity. This may be a previously existing AI, or one custom made for the occasion.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;ai_type&amp;quot; = &amp;quot;pirateAI.plist&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== auto_ai ==&lt;br /&gt;
This will autoswitch the ai to the appropriate one if a ship was added in one of its standard roles like trader or pirate. (true by default). See also the comment in the autoAIMap.plist inside Oolite. Defining auto_ai is only necessary when using one of the standard roles mentioned in the autoAIMap.plist for your ship. auto_ai does nothing for ships with custom roles.&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;auto_ai&amp;quot; = yes;&lt;br /&gt;
This auto_ai switch is also used for bounties. When auto_ai is false the ship will keep the bounty as defined for the ship but, when true and the ship is added in one of the populator roles, the ship will get the default bounty for that role.&lt;br /&gt;
&lt;br /&gt;
== auto_weapons ==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
This parameter if true (the default is false) indicates to the Oolite system populator (and potentially to OXPs) that they may change the weapons, missile load, equipment and other such parameters of this ship to make it better fit its role. This allows you to specify a single hull for multiple roles, and have the ship re-equipped to suit those roles. Ships intended for general addition to the spacelanes in standard roles and not intended to be significantly different in difficulty to the core ships should probably turn this on.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;auto_weapons&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== beacon ==&lt;br /&gt;
A special feature for beacons and navigation aids.&lt;br /&gt;
The string can be anything - the first letter is what's displayed in the advanced space compass.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
 &amp;quot;beacon&amp;quot; = &amp;quot;X&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Characters that are known to be used as identifiers for '''stations and other fixed objects''' are found on the page for the [[Advanced_Space_Compass#List_of_Navigational_Buoys|Advanced Space Compass]]. Most letters have been used multiple times in various OXPs. In 1.79 the HUD will therefore display a longer label also; before that several HUD OXPs are available to do something similar.&lt;br /&gt;
&lt;br /&gt;
We can also use custom icons with the compass. For that you must define a key in descriptions.plist with the same name as the beacon definition.  Than define the icon in the same way as missile icons. (An array of x/y-coordinates that will be connected by lines). You can find more info at [http://aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=9529 the Oolite BB].&amp;lt;br&amp;gt;&lt;br /&gt;
Example in shipdata:&lt;br /&gt;
 &amp;quot;beacon&amp;quot; = &amp;quot;fuelStation_location&amp;quot;;&lt;br /&gt;
Example in descriptions.plist&lt;br /&gt;
 &amp;quot;fuelStation_location&amp;quot; =  (1, 2, -3, 2, -3, -4, 3, -4, 3, 4,  -3, 4, -3, 3, 2, 3, 2, -3, 1, -3 );&lt;br /&gt;
Before 1.75 the ships primary role was used for defining the icon name in descriptions.plist, but since 1.75 the beacon name itself is used.&lt;br /&gt;
&lt;br /&gt;
== beacon_label ==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
A full label for the beacon. If this is not set, it will default to be the same as &amp;lt;code&amp;gt;beacon&amp;lt;/code&amp;gt;, but it may be useful to have a beacon with a full label starting with a different letter than its code. The beacon label text will be expanded using the standard description rules&lt;br /&gt;
 &amp;quot;beacon_label&amp;quot; = &amp;quot;%H Station&amp;quot;; // Lave Station, Diso Station, etc.&lt;br /&gt;
&lt;br /&gt;
== bounty ==&lt;br /&gt;
Sets a Cr. reward on the NPC's head, and is bound to give it trouble with the law . This bounty setting is overruled when adding ships in one of the populator roles like pirate, trader etc. Pirates are default added with a small bounty and traders are added clean. However, like the player, also the npc bounty can raise when attacking other clean ships or police vessels.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;bounty&amp;quot; = 50;&lt;br /&gt;
&lt;br /&gt;
== cargo_carried ==&lt;br /&gt;
Determines the type of cargo carried as described in [[commodities]] and [[commodities.plist]].  Only one type can be specified. This key can be used for both ships and barrels.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;cargo_carried&amp;quot; = &amp;quot;Gold&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
When used for barrels, it is also possible to add several units in a pod by preceding the commodity name with a space separated number. Adding more than a ton in a pod is not possible. Defining a quantity for ships is not possible this way.&amp;lt;br&amp;gt;&lt;br /&gt;
It is possible to define a mix of random cargo for ships by using the string &amp;quot;SCARCE_GOODS&amp;quot; or &amp;quot;PLENTIFUL_GOODS&amp;quot;, instead of a commodity name. The first selects random goods that are scarce at the main station, the second selects goods that are plentiful present at the main station. (Populator added traders heading toward the station always have scarce goods while traders heading from the main station always have plentiful goods on board. It would be wise to stick to this rule with custom ships.)&amp;lt;br&amp;gt;&lt;br /&gt;
To make cargo_carried working for ships, the cargo_type must be &amp;quot;CARGO_NOT_CARGO&amp;quot; to define the ship not being cargo itself. (see below)&lt;br /&gt;
&lt;br /&gt;
'''Note''': A bug introduced in 1.82 means that only commodity keys from the [[Trade-goods.plist]] are recognised here. That is &amp;quot;gold&amp;quot; will be recognised, whereas &amp;quot;Gold&amp;quot; will not. This bug is fixed in the 1.83/1.84 release.&lt;br /&gt;
&lt;br /&gt;
== [[cargo_type]] ==&lt;br /&gt;
Determines if object is indeed cargo (CARGO_RANDOM, CARGO_SLAVES, CARGO_THARGOID, CARGO_ALLOY, CARGO_MINERALS, CARGO_CARRIED) or a ship, as below, which is not cargo.  (CARGO_RANDOM is not fully random but means that a container can hold any kind of commodity.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;cargo_type&amp;quot; = &amp;quot;CARGO_RANDOM&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Will create random cargo, often based on availability in the system. When you want fixed cargo you can use:&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;cargo_type&amp;quot; = &amp;quot;CARGO_CARRIED&amp;quot;;&lt;br /&gt;
 &amp;quot;cargo_carried&amp;quot; = &amp;quot;4 Gold&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
You can also specify the cargo of a ship. use &amp;quot;cargo_type&amp;quot; = CARGO_NOT_CARGO  and define the contents of the barrels it will give with &amp;quot;cargo_carried&amp;quot;. In that case there must be no quantity defined, only the type of [[commodity]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;cargo_type&amp;quot; =  &amp;quot;CARGO_NOT_CARGO&amp;quot;;&lt;br /&gt;
 &amp;quot;cargo_carried&amp;quot; = &amp;quot;Computers&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Another notable type of cargo is the scripted item CARGO_SCRIPTED_ITEM, as examplified by the cloacking device. When CARGO_SCRIPTED_ITEM is defined, the barrels will trigger scooping events for the ship-scripts. Other barrels don't trigger scooping events.&amp;lt;br&amp;gt;&lt;br /&gt;
The cargo barrels are stored in the ships hold like normal barrels when a cargo was defined for them with the JS method &amp;quot;setCargo&amp;quot;. Without defined content, scripted barrels are removed after scooping. Scripted cargo works with any object that can be scooped. When you have scripted escape pods that must be preserved after scooping, fill it with one ton of Slaves.&lt;br /&gt;
&lt;br /&gt;
== cloak_automatic ==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
When false, the cloak of npc ships will never get activate automatic during combat, but is only activated by JS script commands. (True by default)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;cloak_automatic&amp;quot; = no;&lt;br /&gt;
&lt;br /&gt;
== cloak_passive ==&lt;br /&gt;
When true, any firing of laser will deactivate the cloak. (False by default in 1.76 or earlier, true by default in 1.77 or later) &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;cloak_passive&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
==conditions==&lt;br /&gt;
With this option you can include an array of extra conditions when to add a ship. When the conditions are not met, the ship does not appear in a selection list by role. Useful when you have a standard ship like a trader that should only be added in certain systems.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;conditions&amp;quot; = (&lt;br /&gt;
                 &amp;quot;systemGovernment_number equal 3&amp;quot;,&lt;br /&gt;
                 &amp;quot;systemEconomy_number lessthan 4&amp;quot;&lt;br /&gt;
                );&lt;br /&gt;
&lt;br /&gt;
==condition_script==&lt;br /&gt;
''Available from Oolite 1.77 onwards''&lt;br /&gt;
&lt;br /&gt;
This option specifies a Javascript file which controls the addition of this ship. The &amp;lt;code&amp;gt;allowSpawnShip&amp;lt;/code&amp;gt; function in that [[Oolite_JavaScript_Reference:_Condition_scripts|condition script]] will then be tested before the ship is added. Several ships can share a condition script.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;condition_script&amp;quot; = &amp;quot;myoxp_conditions.js&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== counts_as_kill ==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
Killing this ship will not count as a kill by the player when set to false. (Default is true). Using this key prevents awarding kills to all kind of cargo, debris etc.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;counts_as_kill&amp;quot; = no;&lt;br /&gt;
&lt;br /&gt;
== custom_views==&lt;br /&gt;
Will add the ability to display custom POVs of the player ship, in game toggled by pressing '''v'''.  &lt;br /&gt;
&lt;br /&gt;
This is an array with any number of entries, one for each view, each with:&lt;br /&gt;
*a '''view_description''' - giving a textual description of the view. &lt;br /&gt;
*a '''view_position''' - relative to the origin of the ship model. &lt;br /&gt;
*a '''view_orientation''' - this is a [[Quaternions|quaternion]] expressing a rotation from directly forwards. &lt;br /&gt;
*a '''weapon_facing''' - FORWARD, AFT, PORT or STARBOARD. The weapon that will fire when that view is selected.&lt;br /&gt;
&lt;br /&gt;
The view_position is best chosen by selecting a facet, line or point in Wings and copying down the coordinates. &lt;br /&gt;
&lt;br /&gt;
For the view_orientation you will probably need a calculator but the basic method is to choose a unit vector (x y z) as the axis for a rotation then calculate the four values W X Y and Z for the quaternion as follows: &lt;br /&gt;
&lt;br /&gt;
W = the cosine of half the angle rotated about the axis xyz&amp;lt;br /&amp;gt;&lt;br /&gt;
X = the sine of half the angle rotated about xyz, multiplied by x&amp;lt;br /&amp;gt;&lt;br /&gt;
Y = the sine of half the angle rotated about xyz, multiplied by y &amp;lt;br /&amp;gt;&lt;br /&gt;
Z = the sine of half the angle rotated about xyz, multiplied by z &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Four decimal places are probably enough accuracy for these values.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  custom_views =&lt;br /&gt;
 (&lt;br /&gt;
     {&lt;br /&gt;
         view_description = &amp;quot;Front View&amp;quot;;&lt;br /&gt;
         view_orientation = &amp;quot;0.0 0.0 1.0 0.0&amp;quot;;&lt;br /&gt;
         view_position = &amp;quot;0.0 30.0 200.0&amp;quot;;&lt;br /&gt;
         weapon_facing = &amp;quot;FORWARD&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== death_actions ==&lt;br /&gt;
Gives an opportunity to have a ship's death trigger one or a set of [[Shipdata.plist#script_actions|script_actions]]. It contains an array of legacy script expressions.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;death_actions&amp;quot; = (&amp;quot;spawn: explosive_shrapnel 1&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
== debris_role ==&lt;br /&gt;
{{oolite-prop-added|1.74}}&lt;br /&gt;
&lt;br /&gt;
Specifies the kind of debris an asteroid or boulder generates. When not defined they default to generating 'ships' with role &amp;quot;boulder&amp;quot; or &amp;quot;splinter&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;debris_role&amp;quot; = &amp;quot;my_boulder_foo&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
== density ==&lt;br /&gt;
This real value is used to calculate a ships total mass. Default is 1.0. The mass of the ship is then 20 * density * volume.&lt;br /&gt;
&lt;br /&gt;
Ship's mass does not affect its flight under the non-inertial engines - see [[#thrust|thrust]]. It does affect:&lt;br /&gt;
* changes in momentum, and damage done, in a collision&lt;br /&gt;
* the minimum distance needed from this ship for another ship to open a witchspace wormhole (the blocking radius is the square root of a tenth of the mass)&lt;br /&gt;
* the length of time a witchspace wormhole opened by this ship will remain open, and the radius of that wormhole.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;density&amp;quot; = 1.5;&lt;br /&gt;
&lt;br /&gt;
== display_name ==&lt;br /&gt;
States the model's name as it will be known to the ID computer. By default this is the same as &amp;quot;name&amp;quot;. Added for multilingual oolite.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;display_name&amp;quot; = &amp;quot;ExampleShip Mark IX&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== energy_recharge_rate ==&lt;br /&gt;
The rate at which energy is replenished.  Stations are at 100, Adders at 2. (Default value: 1)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;energy_recharge_rate&amp;quot; = &amp;quot;3.5&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== escape_pod_model ==&lt;br /&gt;
With this entry ships can have custom escape pods. (starting from version 1.65) You have to specify the '''role''' of your custom escape pod (not its entry-name).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;escape_pod_model&amp;quot; = &amp;quot;custom_pod&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== escorts ==&lt;br /&gt;
Determines how many escorts an NPC shall have. Maximum is 16.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;escorts&amp;quot; = 4;&lt;br /&gt;
Warning: Ships with scanClass = CLASS_POLICE should always have escorts set to zero. Oolite will set this value here and add wingmans instead of escorts. Without special scripting escorts won't escort a mother with CLASS_POLICE.&amp;lt;br&amp;gt;&lt;br /&gt;
For ships that are added in a trader role, the populator can decide to subtract escorts from the defined value when the system is estimated as safe. &lt;br /&gt;
&lt;br /&gt;
== escort_role ==&lt;br /&gt;
Assigns the specific ship type to be the escort, by the ship's role. (Before Oolite 1.74 only the name &amp;quot;escort-role&amp;quot; is accepted.)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;escort_role&amp;quot; = &amp;quot;my_custom_escort_role&amp;quot;;&lt;br /&gt;
Escort ships will use the escortAI.plist unless &amp;quot;auto_ai&amp;quot; is set to false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==escort_roles==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
This property overrules &amp;lt;code&amp;gt;escorts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;escort_role&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;escort_ship&amp;lt;/code&amp;gt; to allow more flexible specification of a ship's escorts. It takes the form of a list of dictionaries, each containing a &amp;quot;role&amp;quot;, &amp;quot;min&amp;quot; and &amp;quot;max&amp;quot; key. The ship will then get between &amp;quot;min&amp;quot; and &amp;quot;max&amp;quot; of that role of escort ship (specific ships can be added using the &amp;quot;[dataKey]&amp;quot; style of role), with &amp;quot;max&amp;quot; more likely in Anarchy systems and &amp;quot;min&amp;quot; more likely in Corporate States.&lt;br /&gt;
&lt;br /&gt;
   escort_roles = (&lt;br /&gt;
      { role = &amp;quot;escort&amp;quot;; min = -2; max = 2; },&lt;br /&gt;
      { role = &amp;quot;escort-medium&amp;quot;; min = 0; max = 4; },&lt;br /&gt;
      { role = &amp;quot;escort-heavy&amp;quot;; min = -4; max = 2; },&lt;br /&gt;
      { role = &amp;quot;&amp;quot;; min = 0; max = 2; } // spare slots for wandering escorts&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
A negative number can be used for &amp;quot;min&amp;quot; - this makes it more likely that none of this type of escort will be used in safer systems, and makes the maximum number less likely in the more dangerous systems. In the example above, the ship will mainly be escorted by &amp;quot;escort-medium&amp;quot; ships, with a couple of &amp;quot;escort&amp;quot; ships likely in unsafe systems, and a small chance of &amp;quot;escort-heavy&amp;quot; ships also appearing in more dangerous systems.&lt;br /&gt;
&lt;br /&gt;
Leaving the role key blank allows the ship to have spare slots for escorts which are left unfilled when the ship is spawned. This can be used to simulate a willingness to hire additional escorts, or to indicate that the ship has already lost some of its escorts.&lt;br /&gt;
&lt;br /&gt;
The maximum number of escorts remains 16, and the list will be processed from top to bottom. Once 16 escorts are added no further entries will be considered.&lt;br /&gt;
&lt;br /&gt;
== escort_ship ==&lt;br /&gt;
Assigns the specific ship type to be the escort, by the ship's name. (Before Oolite 1.74 only the name &amp;quot;escort-ship&amp;quot; is accepted.)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;escort_ship&amp;quot; = &amp;quot;cobramk1&amp;quot;;&lt;br /&gt;
Escort ships will use the escortAI.plist unless &amp;quot;auto_ai&amp;quot; is set to false.&lt;br /&gt;
&lt;br /&gt;
In Oolite 1.77 and later it is also possible to use &amp;lt;code&amp;gt;&amp;quot;escort_role&amp;quot; = &amp;quot;[cobramk1]&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== exhaust ==&lt;br /&gt;
The XYZ position(s) of exhaust plume(s), and the XYZ of the plume shape, ergo&lt;br /&gt;
&lt;br /&gt;
 x y z width height length&lt;br /&gt;
&lt;br /&gt;
'''x y z''' is the position relative to the origin of the main model. &lt;br /&gt;
&lt;br /&gt;
'''width''' in meters, how far a plume extends on x axis, on each side of plume position. (x radius)&lt;br /&gt;
&lt;br /&gt;
'''height''' in meters, how far a plume extends on y axis, above and below of plume position. (y radius)&lt;br /&gt;
&lt;br /&gt;
'''length''' in meters, how long a plume is on z axis. (This value is in current Oolite versions ignored. Length is now derived from the ships speed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below are 2 assigned plumes at coords 5, 0, -25 and -5, 0, -25, and each plume is 6 m wide and 4 m tall. (length info is ignored)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;exhaust&amp;quot; = (&lt;br /&gt;
     &amp;quot;5 0.0 -25 3.0 2.0 10.0&amp;quot;,&lt;br /&gt;
     &amp;quot;-5 0.0 -25 3.0 2.0 10.0&amp;quot;&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== exhaust_emissive_color ==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
Determines the colour of the exhausts.&lt;br /&gt;
&lt;br /&gt;
For the colour you can use either a [[Materials in Oolite#Colour specifiers|colour specifier]] or a [[Materials in Oolite#Named colours|named colour]]. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;exhaust_emissive_color&amp;quot; = &amp;quot;redColor&amp;quot;;&lt;br /&gt;
or&lt;br /&gt;
 &amp;quot;exhaust_emissive_color&amp;quot; = &amp;quot;1 0 0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== explosion_type ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
A list of [[explosions.plist]] entries describing how the ship explodes if destroyed.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;explosion_type&amp;quot; = (&amp;quot;oolite-default-asteroid-explosion&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== extra_cargo ==&lt;br /&gt;
Cargobay extension size can be customised. This is the amount the cargo capacity increases when an extra cargobay is installed. Default value is 15. It is only used with player ships.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;extra_cargo&amp;quot; = 25;&lt;br /&gt;
&lt;br /&gt;
== forward_weapon_type ==&lt;br /&gt;
Assigns the ship's forward laser. &lt;br /&gt;
Any weapon type from the [[equipment.plist]] can be used.&amp;lt;br&amp;gt; e.g.: WEAPON_PULSE_LASER, WEAPON_BEAM_LASER, WEAPON_MILITARY_LASER, WEAPON_MINING_LASER, WEAPON_PLASMA_CANNON, WEAPON_THARGOID_LASER and WEAPON_NONE. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;forward_weapon_type&amp;quot; = &amp;quot;WEAPON_BEAM_LASER&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== frangible ==&lt;br /&gt;
Determines if eventual sub-entities are &amp;quot;loose&amp;quot;. By default any given object is already frangible, so the use of this line must be to negate that. &lt;br /&gt;
If set to false, the object plus subentities will be regarded as a single object.&lt;br /&gt;
If set to true, sub entities can be destroyed seperately from the main object. Frangible sub-entities can have a max_energy and an energy_recharge_rate that is independently set from the main entity.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;frangible&amp;quot; = no;&lt;br /&gt;
 &lt;br /&gt;
== fragment_chance ==&lt;br /&gt;
Determines if a ship breaks apart into fragments and generates parts with role &amp;quot;wreckage&amp;quot;. By chance factor, or true/false. Default is 90% chance.&lt;br /&gt;
The amount of wreckage is based on the ships mass with a maximum of 3. Wreckage is scaled to match the ships size but is very short living. (0.25s -&amp;gt; 1.25s)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;fragment_chance&amp;quot; = no;&lt;br /&gt;
 &lt;br /&gt;
== fuel ==&lt;br /&gt;
Determines an NPC ship's fuel storage, which will affect how it uses its Fuel Injectors and how far it can jump. If unspecified the default is zero (though ships added via the system populator will often be given some fuel anyway)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;fuel&amp;quot; = 70;&lt;br /&gt;
&lt;br /&gt;
== has_cloaking_device ==&lt;br /&gt;
Determines if a ship has a cloacking device installed. By chance factor, or true/false.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_cloaking_device&amp;quot; = 0.5;&lt;br /&gt;
&lt;br /&gt;
== has_ecm ==&lt;br /&gt;
Determines if a ship has the E.C.M system installed. By chance factor, or true/false.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_ecm&amp;quot; = 0.5;&lt;br /&gt;
or&lt;br /&gt;
 &amp;quot;has_ecm&amp;quot; = no;&lt;br /&gt;
 &lt;br /&gt;
== has_energy_bomb ==&lt;br /&gt;
Determines if a ship has an energy bomb. If it has one, it might launch a mine with role &amp;quot;energy_bomb&amp;quot; as part of his fleeing behavior. currently the only build-in mine with this role is the q-bomb.&amp;lt;br&amp;gt;A ship will only deploy the bomb when it has also fuel-injectors and some fuel left to avoid getting killed by its own bomb. On average it will try to deploy the bomb once every 100 seconds during fleeing.&lt;br /&gt;
&lt;br /&gt;
Example:		&lt;br /&gt;
 &amp;quot;has_energy_bomb&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== has_escape_pod ==&lt;br /&gt;
Determines if a ship has an escape pod. Can be either a boolean value, or a number from 0 to 1 expressing the likelihood of the equipment being present. Starting with version 1.65 ships can have multiple escape pods. To specify more than one escape pod, '''has_escape_pod''' must be set to a numeric value corresponding to the escape pods present on board.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
 has_escape_pod = no;&lt;br /&gt;
 has_escape_pod = 0.75;&lt;br /&gt;
 has_escape_pod = 3;&lt;br /&gt;
&lt;br /&gt;
== has_fuel_injection ==&lt;br /&gt;
Determines if a ship has the witchdrive fuel injector.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_fuel_injection&amp;quot; = 0.99;&lt;br /&gt;
&lt;br /&gt;
==has_military_jammer==&lt;br /&gt;
Determines if a ship has a military jammer. Ships equipped with this item become invisible on the radar. &lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_military_jammer&amp;quot; = 0.75;&lt;br /&gt;
&lt;br /&gt;
==has_military_scanner_filter==&lt;br /&gt;
Determines if a ship has a military jammer filter. Ships equipped with this item can see ships equipped with a military jammer on the radar. &lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_military_scanner_filter&amp;quot; = 0.50;&lt;br /&gt;
&lt;br /&gt;
== has_scoop ==&lt;br /&gt;
Determines if a ship has a fuel/cargo scoop.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_scoop&amp;quot; = no;&lt;br /&gt;
&lt;br /&gt;
== has_scoop_message ==&lt;br /&gt;
A key for cargo. Determines if a barrel generates a default scoop message when scooped. Default is true, but setting it to false suppresses any messages, so a scripts can generate its custom messages on scooping. (Added with Oolite 1.74)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_scoop_message&amp;quot; = no;&lt;br /&gt;
&lt;br /&gt;
== has_shield_booster==&lt;br /&gt;
Determines if a ship has the shield booster. (enlarges max energy with 256)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_shield_booster&amp;quot; = 0.80;&lt;br /&gt;
&lt;br /&gt;
== has_shield_enhancer ==&lt;br /&gt;
Determines if a ship has the coveted shield enhancer. (enlarges max energy with 256 and raises energy recharge rate with 50%)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_shield_enhancer&amp;quot; = 0.45;&lt;br /&gt;
&lt;br /&gt;
== heat_insulation ==&lt;br /&gt;
This real number gives the amount of heat insulation of a ship. Default is 1.0 (2.0 for ships equipped with EQ_HEAT_SHIELD). Values below 0.125 will be increased to that minimum. This parameter is only for NPC ships and stations. Player ships ignore this and always start with 1.0 heat insulation and can add an additional 1.0 (for a total of 2.0) with the ship equipment EQ_HEAT_SHIELD. Heat insulation for NPCs is only a factor when close to the sun. Energy damage does not cause overheating (because otherwise it would be too easy to overheat NPC ships with missiles or lasers), but it can raise ships' temperature to the maximum safe level. Overheating occurs when a ship's temperature exceeds the safe level, which is determined by the heat insulation level. External temperature is determined by distance from the sun. Larger suns are hotter. Suns that are going nova are, unsurprisingly, even warmer. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;heat_insulation&amp;quot; = &amp;quot;2.0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
NPC ships launched from stations are given the same heat insulation as the station if the station's is greater than the ship's. Courier ships generated by the core system populator are given a heat insulation level of 6.0. Escort ships (if any) receive at least the same heat insulation as the ship they are escorting. See [http://www.aegidian.org/bb/viewtopic.php?p=177357#p177357 BB Thread] (2012)&lt;br /&gt;
&lt;br /&gt;
Player ships use the same model as NPC ships for external temperature from the sun, but additionally simulate heat from air friction when inside planetary atmospheres, which is a factor that NPC ships ignore.&lt;br /&gt;
&lt;br /&gt;
== hud ==&lt;br /&gt;
Used for a playership, to assign another HUD than the default one.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;hud&amp;quot; = &amp;quot;specialhud.plist&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== hyperspace_motor ==&lt;br /&gt;
If set to false / NO, it will stop ships from executing normal hyperspace jump (player ships will still be able to execute galactic jumps). Default = true / YES. (Planned for Oolite 1.75)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
 &amp;quot;hyperspace_motor&amp;quot; = no;&lt;br /&gt;
&lt;br /&gt;
 hyperspace_motor=NO;&lt;br /&gt;
&lt;br /&gt;
== hyperspace_motor_spin_time ==&lt;br /&gt;
Used to modify jump countdown time. Default = 15.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
 &amp;quot;hyperspace_motor_spin_time&amp;quot; = &amp;quot;15&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
==injector_burn_rate==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The default fuel burn rate of injectors on this ship, in deci-LY per second. The default is 0.25.&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;injector_burn_rate&amp;quot; = 0.25;&lt;br /&gt;
&lt;br /&gt;
==injector_speed_factor==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The multiplier applied to the ship's maximum speed when it is using injectors. The default is 7.&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;injector_speed_factor&amp;quot; = 7;&lt;br /&gt;
&lt;br /&gt;
==is_external_dependency==&lt;br /&gt;
This key should be added to ships that use like_ship references to ships in other oxps but don't depend on them. Normally will Oolite write errors in the log when it can't resolve a like_ship reference. When this key is set to YES, it will suppress the error generation.&amp;lt;br&amp;gt;WARNING: only set this key to YES when the model won't get added to the system without the other oxp installed or you will miss a valuable warning.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;is_external_dependency&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
==is_submunition==&lt;br /&gt;
Key added for missiles with multiple warheads. When this key is set and the entity is spawn or fired by a missile, it inherits its parent as owner. This key must be set so the player will be awarded for a kill by submunition.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;is_submunition&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
==is_template==&lt;br /&gt;
Set this to yes for ships which are only used through like_ships and are not intended to be used directly. If your (otherwise working) OXP generates warnings about ships with no roles or model attribute, you probably need this.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;is_template&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== laser_color ==&lt;br /&gt;
Determines a ship's laser colour.&lt;br /&gt;
&lt;br /&gt;
As colour you can use a [[Materials in Oolite#Colour specifiers|colour specifier]] or a [[Materials in Oolite#Named colours|named colour]]. The game requires laser colours to be reasonably bright; if the brightest colour component is less than 0.5, the colour will be brightened.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;laser_color&amp;quot; = &amp;quot;cyanColor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== launch_actions ==&lt;br /&gt;
Triggers a script on the entity just after setup, also when called by spawn and addShip methods.&lt;br /&gt;
Can be used to change to a custom AI, when a ship is generated by standard role. &lt;br /&gt;
[[Shipdata.plist#script_actions|script_actions]]&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;quot;role = trader&amp;quot;;&lt;br /&gt;
 &amp;quot;launch_actions&amp;quot; = (&lt;br /&gt;
   &amp;quot;setAITo: pirateAI.plist&amp;quot;&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== like_ship ==&lt;br /&gt;
Allows a shipdata entry (of a ship with many matching characteristics to another) to be short and sweet. With '''like_ship''' you can reference to another existing shipdata entry, and then only specify the differences to the 'original'. It takes the unique '''entry-identifier''' as argument. Of course you have to make sure that the 'original' you are referring to actually exists, or Oolite won't be able to create your ship.&lt;br /&gt;
&lt;br /&gt;
Works well together with the [[#is_template|is_template]]-key.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;my_ship&amp;quot; = {&lt;br /&gt;
 &amp;quot;like_ship&amp;quot; = &amp;quot;adder&amp;quot;;&lt;br /&gt;
 &amp;quot;max_flight_speed&amp;quot; = &amp;quot;700&amp;quot;;&lt;br /&gt;
 &amp;quot;name&amp;quot; = &amp;quot;Freak Turbo Adder&amp;quot;;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
== likely_cargo ==&lt;br /&gt;
This is only used for ships with role asteroid and pirate. With asteroids it gives the likely number of boulders it breaks into. With pirates added by the [[System Populator]]: when lower than 16 it is the cargo, when higher than 15, it is changed in a random value between 0 and 15. This value is overridden by the actual scooped cargo if the pirate had scooped something.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;likely_cargo&amp;quot; = &amp;quot;2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== materials ==&lt;br /&gt;
See [[Materials in Oolite]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_cargo ==&lt;br /&gt;
Sets the ship's cargo limit. On explosion of trader ships added by the [[System Populator]], 10% of this value is used as likely cargo. When the result is lower than 16 it is the cargo, when higher than 15, it is changed in a random value between 0 and 15.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_cargo&amp;quot; = &amp;quot;5&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== max_energy ==&lt;br /&gt;
Sets the ship's energy value. (Default value: 200)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_energy&amp;quot; = &amp;quot;300&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_flight_pitch ==&lt;br /&gt;
Sets pitch factor. Will usually range from a sluggish 0.6 to a very sensitive 3.0&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_flight_pitch&amp;quot; = &amp;quot;2.2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_flight_roll ==&lt;br /&gt;
Sets roll factor. Will usually range from 0.8 to 4.6.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_flight_roll&amp;quot; = &amp;quot;4.2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_flight_speed ==&lt;br /&gt;
Sets the model's top speed. Interceptors fly at 520 (0.52 LM), Shuttles at 80.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_flight_speed&amp;quot; = &amp;quot;320&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== max_flight_yaw ==&lt;br /&gt;
Sets yaw factor. Will usually range from a sluggish 0.6 to a very sensitive 3.0 When no value is defined it will use the same value as max_flight_pitch&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_flight_yaw&amp;quot; = &amp;quot;2.2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== max_missiles ==&lt;br /&gt;
Sets a ship's missile limit. Maximum allowable value for the player is 16 and for npc ships 32. When not defined, the value with &amp;quot;missiles&amp;quot; is used as max_missiles. When defining more than a few missiles, it could be wise to also define value for &amp;quot;missile_load_time&amp;quot; to avoid massive missile launches. npc ships are more likely to fire missiles the more they carry.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_missiles&amp;quot; = &amp;quot;1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== missile_launch_position ==&lt;br /&gt;
Determines the XYZ point on the model from which a missile is launched.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;missile_launch_position&amp;quot; = &amp;quot;0.0 -2.25 10.0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
This position should lie outside the bounding box of the core entity and not just outside of the ships mesh.  Default value: (0, -4, 1)&amp;lt;br&amp;gt;&lt;br /&gt;
If the position does lie inside the bounding box, the launch position is shifted along its direction until the launched missile lies outside the bounding box of the central entity. (Bounding boxes of subentities are ignored) The collision radius of the launched missile is taken into account. The collision radius for a plain missile is 4.52 meter.&lt;br /&gt;
&lt;br /&gt;
== missile_load_time ==&lt;br /&gt;
Defines the time in seconds before a new missile is ready to fire after one is fired. Mainly useful for npc ships that have many missiles.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;missile_load_time&amp;quot; = &amp;quot;2.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== missiles ==&lt;br /&gt;
Sets the number of missiles the ship is equipped with on ship creation. e.g. you can set this at zero and than use a dedicated script to fill up the bay with specific missiles.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;missiles&amp;quot; = &amp;quot;0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== missile_role ==&lt;br /&gt;
Defines the type of missiles (or mines) an NPC ship is provided with. Default is &amp;quot;EQ_MISSILE&amp;quot;. When missiles are loaded on ship creation, 90% will be of this type and 10% will be random, chosen from all possible NPC missiles and mines. Also affects the javascript [[Oolite_JavaScript_Reference:_Ship#selectNewMissile|selectNewMissile()]] command.&lt;br /&gt;
The string defined inside missile_role needs both to be defined inside [[equipment.plist]], and be inside the '''roles''' property of the missile/mine shipdata entry. &lt;br /&gt;
&lt;br /&gt;
To assign a specific missile type to a newly bought player ship, its dependancies must be defined inside [[shipyard.plist]].&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
 &amp;quot;missile_role&amp;quot; = &amp;quot;EQ_THARGON&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== model ==&lt;br /&gt;
Assigns the entity's corresponding '''.dat''' file that will be found with the exact same name in the ''Models'' folder.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;model&amp;quot; = &amp;quot;example_ship.dat&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== model_scale_factor ==&lt;br /&gt;
1.81 or later only.&lt;br /&gt;
&lt;br /&gt;
If this is set, the model specified in the &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt; property will be scaled by this factor (the default is 1.0, of course). Additionally, all subentities will have both their positions and sizes scaled (recursively if necessary), and the weapon positions will also be multiplied by the scale factor.&lt;br /&gt;
&lt;br /&gt;
Player ships will also have their internal and external view positions multiplied by the scale factor.&lt;br /&gt;
&lt;br /&gt;
model_scale_factors on subentities will be ignored - the value for the main entity will be used instead.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;model_scale_factor&amp;quot; = 2.0;&lt;br /&gt;
&lt;br /&gt;
== name ==&lt;br /&gt;
States the model's name as it will be known to the ID computer.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;name&amp;quot; = &amp;quot;ExampleShip Mark IX&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== no_boulders ==&lt;br /&gt;
With older versions, scripted asteroids had no boulders by default. Starting with 1.70 all asteroids produce boulders when hit by a mining laser. no_boulders can overwrite this to emulate the old situation. By chance factor, or true/false.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;no_boulders&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== pilot ==&lt;br /&gt;
Gives the ship a predefined pilot, defined in [[characters.plist]]. Can eject in pod, if available, and be captured.&amp;lt;BR&amp;gt;&lt;br /&gt;
By default every object starts with a pilot except buoys, missiles, cargo and rocks. By defining a specific pilot,  any default pilot is replaced or a pilot is added to previously unpiloted objects.&lt;br /&gt;
  &lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;pilot&amp;quot; = &amp;quot;constrictor-mission-thief&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
When no pilot is defined, Oolite will create a random pilot based on the ships role. For custom roles this means that Oolite has no clue and the pilot might have other bounties/insurances than desired. For this reason contains Oolite, starting with v 1.75, some predefined pilots: &amp;quot;oolite-trader&amp;quot;, &amp;quot;oolite-pirate&amp;quot;, &amp;quot;oolite-hunter&amp;quot;, &amp;quot;oolite-police&amp;quot;, &amp;quot;oolite-miner&amp;quot;, &amp;quot;oolite-passenger&amp;quot; and &amp;quot;oolite-slave&amp;quot;. When using one of these pilots, a random bounty/insurance will be set appropriate for this pilot role. Pilot bounty is different as ship bounty but on ejecting the pilot inherits the highest of both values. (actually a bitwise OR of both values)&lt;br /&gt;
&lt;br /&gt;
== port_weapon_type ==&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
Assigns the ship's port laser. &lt;br /&gt;
Any weapon type from the [[equipment.plist]] can be used (and WEAPON_NONE). &lt;br /&gt;
&lt;br /&gt;
While not essential, you should generally assign the same weapon to [[#starboard_weapon_type|starboard_weapon_type]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;port_weapon_type&amp;quot; = &amp;quot;WEAPON_BEAM_LASER&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== roles ==&lt;br /&gt;
Assigns which [[role]](s) the entity should have, that can correspond to one specific, exclusive use, or several.&lt;br /&gt;
&lt;br /&gt;
The game engine constantly calls for generic roles to populate the universe.  In the example below the ship in question will be considered twice as often (2.0) when a trader is called for, only one quarter as often (0.25) when looking for a hunter, and as often as any other pirate ships when looking for a pirate. Multiple roles are space separated. An explanation of the generic roles available in Oolite 1.79 or later is at [[Oolite_Ship_Roles]].&lt;br /&gt;
&lt;br /&gt;
'''NB:''' If the ship cannot be docked to, extra care should be taken to avoid using the words '''station''' or '''carrier''' as part of any of the ship's role names. When either of these words are inside the roles key, the ship is automatically given station attributes. Other ships might even fruitless try to dock with it, and it will affect how some ships / entities are shown on the scanner.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;roles&amp;quot; = &amp;quot;hunter(0.25) trader(2.0) pirate&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
or an exclusive role, simply:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;roles&amp;quot; = &amp;quot;uniquely_named_role&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
This has the benefit of being the only ship to be selected when a [[Script.plist|script]] calls for the ''uniquely_named_role'' ship.&lt;br /&gt;
&lt;br /&gt;
An item from the [[commodities]] can also be named as a role, for when that commodity is floating in space and called upon, to be represented by a particular model.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;roles&amp;quot; = &amp;quot;Gold&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Some roles are used by the game engine to populate systems, detect and define properties. (see also the [[System Populator]])&lt;br /&gt;
Such roles include 'thargoid', 'missile' and 'energybomb'.&lt;br /&gt;
Externally used equipment also needs specific mention of role, for example EQ_*_MINE and EQ_*_MISSILE.&lt;br /&gt;
&lt;br /&gt;
== rotational_velocity ==&lt;br /&gt;
May be applied to a sub-entity, like the following entry to the [[Shipdata.plist#subentities|subentity]] spines of the [[Weeviloid Hunter]].&lt;br /&gt;
Takes the form of [[Quaternions|quaternions]]. The following example enables rotation around the Z-axis.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;rotational_velocity&amp;quot; = &amp;quot;0.707 0.0 0.0 0.707&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An explaining example taken from the Oolite Bulletin board.&lt;br /&gt;
&lt;br /&gt;
The rotational velocity key is rotation per second. &lt;br /&gt;
&lt;br /&gt;
For instance, if you want to rotate once per 20 seconds around the Z axis:&lt;br /&gt;
 &lt;br /&gt;
a = 360 ° / 20 = 18 °&lt;br /&gt;
&lt;br /&gt;
[x, y, z] = [0, 0, 1]&lt;br /&gt;
 &lt;br /&gt;
sin a ˜ 0.30902&lt;br /&gt;
 &lt;br /&gt;
cos a ˜ 0.95106&lt;br /&gt;
 &lt;br /&gt;
Q = (0.95106, 0, 0, 0.30902)&lt;br /&gt;
&lt;br /&gt;
'''shipdata.plist entry:'''&lt;br /&gt;
 &amp;quot;rotational_velocity&amp;quot;=&amp;quot;0.95106 0.0 0.0 0.30902&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scan_class ==&lt;br /&gt;
Will alter the model's appearance on the [[IFF system]].  If this line is omitted, it will usually become by default a standard ship entity (CLASS_NEUTRAL), appearing as a yellow flag on the radar (red if hostile to the player), but may be given a different scan class if added with other roles.  There are other options.&lt;br /&gt;
* CLASS_BUOY - green/yellow on scanner, will rotate in idle state, does not masslock&lt;br /&gt;
* CLASS_CARGO - white on scanner, can be scooped, does not masslock&lt;br /&gt;
* CLASS_MILITARY - purple on scanner, better pilots, will not attack other military ships, flashes purple/magenta if hostile to player&lt;br /&gt;
* CLASS_MISSILE - cyan on scanner, will not avoid collisions&lt;br /&gt;
* CLASS_POLICE - purple on scanner, will not attack other police ships, legal penalties for attacking, never has bounty, flashes purple/magenta if hostile to player&lt;br /&gt;
* CLASS_ROCK - white on scanner, launched defense ships do not inherit scan class, does not masslock&lt;br /&gt;
* CLASS_STATION - green on scanner, launched defense ships do not inherit scan class&lt;br /&gt;
* CLASS_THARGOID - green/red on scanner, considered hostile to any non-thargoid ship&lt;br /&gt;
* CLASS_NO_DRAW - invisible on scanner, cannot be targeted by missiles, does not masslock&lt;br /&gt;
* CLASS_MINE - red/yellow on scanner, automatically set on mines launched by player to override existing scan class, does not masslock&lt;br /&gt;
(This property was called &amp;quot;scanClass&amp;quot; before Oolite 1.74.)&lt;br /&gt;
Scan classes marked as &amp;quot;does not masslock&amp;quot; will masslock the player anyway if they are hostile to the player (as condition will be Red)&lt;br /&gt;
&lt;br /&gt;
Scripts can define custom colours for ships on the [[IFF system]] so ships may have a scanner appearance different to the default for their scan class.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scan_class&amp;quot; = &amp;quot;CLASS_ROCK&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
==== Developer Note ====&lt;br /&gt;
Oolite uses scan_class internally to determine the behaviour of some ships (particularly with regard to who may shoot whom without incurring legal penalties). Bear this in mind and don't allocate CLASS_POLICE or CLASS_THARGOID to ships lightly!&lt;br /&gt;
&lt;br /&gt;
== scan_description ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The description of the ship's legal status on the [[Scanner Targeting Enhancement]]. If this is absent, the default text for the scan class will be used.&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;scan_description&amp;quot; = &amp;quot;Unclaimed rock&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scanner_display_color1 ==&lt;br /&gt;
Overrides the color that would normally be set by scanClass.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scanner_display_color1&amp;quot; = &amp;quot;greenColor&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scanner_display_color2 ==&lt;br /&gt;
Overrides the color that would normally be set by scanClass. If this is set, the ship will flash between the two colours.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scanner_display_color2&amp;quot; = &amp;quot;redColor&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scanner_hostile_display_color1 ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
Overrides the color that would normally be set by scanClass when the ship is hostile and targeting the player.&lt;br /&gt;
&lt;br /&gt;
If no hostile colours are set, but normal colours are set, then the normal colours, not the scan class colours, will be used for a hostile ship.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scanner_hostile_display_color1&amp;quot; = &amp;quot;greenColor&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scanner_hostile_display_color2 ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
Overrides the color that would normally be set by scanClass when the ship is hostile and targeting the player. If this is set, the ship will flash between the two colours.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scanner_hostile_display_color2&amp;quot; = &amp;quot;redColor&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scanner_range ==&lt;br /&gt;
Sets a custom scanner range. Standard is 25.6 km, thargoids have 50 km. Only applies to NPCs. However, at least since oolite 1.65 all defined scanner ranges are limited to 25.6 km, even for thargoids. This means it only makes sense defining shorter ranges than the maximum range.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scanner_range&amp;quot; = &amp;quot;25600&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== scoop_position ==&lt;br /&gt;
Determines the XYZ point on the model from which cargo is scooped. (default is 0,0,0)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;scoop_position&amp;quot; = &amp;quot;0.0 -4.5 -23.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Scooping for a player ship starts when the cargo collides with the front half of the bottom of the ship. Any other place of first contact leads to smashing the cargo in pieces. A good y-value for the position would therefor be half the size of the lowest body part of this area of the ship. For the z-value a point in the back side would be better.&lt;br /&gt;
&lt;br /&gt;
== script ==&lt;br /&gt;
Specifies a [[Scripting Oolite with JavaScript|JavaScript script]] (through it's filename) to attach to the ship. Ship scripts are the preferred approach for scripting ships in current Oolite.&lt;br /&gt;
&lt;br /&gt;
== script_info ==&lt;br /&gt;
A property list whose contents are available to JavaScript scripts, for whatever use they desire. It is exposed to JavaScript as the &amp;lt;code&amp;gt;[[Oolite JavaScript Reference: Ship#scriptInfo|scriptInfo]]&amp;lt;/code&amp;gt; property of &amp;lt;code&amp;gt;Ship&amp;lt;/code&amp;gt; objects.&amp;lt;br&amp;gt;&lt;br /&gt;
Take note that when using an ascii plist, the JS engine will read in all entries as strings. When you need an entry as number, you might need to explicit convert it to a number. This is specially true for booleans as a &amp;quot;NO&amp;quot; string will be read as true. For all normal keys its Oolite that does the conversion for you.&lt;br /&gt;
&lt;br /&gt;
A short overview about used [[OXP_scriptInfo|script_info keys in OXPs]].&lt;br /&gt;
&lt;br /&gt;
== script_actions ==&lt;br /&gt;
Gives an oportunity to insert events such as in [[script.plist]], to involve a specific shipdata entity.  As seen in the following example, this particular object checks if Player has a cloaking device, and if not, will award it.  Should Player already have it, the gift will be in gold. See also [[scripts within shipdata]] for more detailled info.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;script_actions&amp;quot; =&lt;br /&gt;
 (&lt;br /&gt;
     &amp;quot;testForEquipment: EQ_CLOAKING_DEVICE&amp;quot;,&lt;br /&gt;
     {&lt;br /&gt;
        &amp;quot;conditions&amp;quot;&lt;br /&gt;
        (&lt;br /&gt;
           &amp;quot;foundEquipment_bool equal NO&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
        &amp;quot;do&amp;quot;&lt;br /&gt;
        (&lt;br /&gt;
           &amp;quot;awardEquipment: EQ_CLOAKING_DEVICE&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
        &amp;quot;else&amp;quot;&lt;br /&gt;
        (&lt;br /&gt;
           &amp;quot;awardCargo: 100 Gold&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
     }&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== setup_actions ==&lt;br /&gt;
Arranges a process that may be necessary for some objects, like ball turrets.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;setup_actions&amp;quot; =&lt;br /&gt;
 (&lt;br /&gt;
    &amp;quot;initialiseTurret&amp;quot;&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== shaders ==&lt;br /&gt;
The ''shaders'' dictionary has the same structure as the ''[[#materials|materials]]'' dictionary. When [[Shaders in Oolite|shaders]] are available, the contents of the ''shaders'' dictionary are used in preference to those in ''materials''. If shaders are not available, the ''shaders'' dictionary is ignored.&lt;br /&gt;
&lt;br /&gt;
== ship_name ==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The name of this individual ship (e.g. Pride of Lave), which is placed in [[Oolite_JavaScript_Reference:_Ship#shipUniqueName|ship.shipUniqueName]]. It rarely makes sense to set this property in &amp;lt;code&amp;gt;shipdata.plist&amp;lt;/code&amp;gt;, except perhaps for a unique mission ship.&lt;br /&gt;
&lt;br /&gt;
== ship_class_name ==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The name of this ship's class (e.g. Sidewinder), which is placed in [[Oolite_JavaScript_Reference:_Ship#shipClassName|ship.shipClassName]]. If this is not set, it will default to [[#name|name]], which is usually suitable.&lt;br /&gt;
&lt;br /&gt;
== show_damage ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
Whether to show sparks and other damage effects when this ship is hit.&lt;br /&gt;
&lt;br /&gt;
Defaults to on if energy recharge rate is greater than zero, off otherwise, for compatibility with previous hard-coded behaviour.&lt;br /&gt;
&lt;br /&gt;
== smooth ==&lt;br /&gt;
Determines if the model will use glLightModel(GL_FLAT) or glLightModel(GL_SMOOTH).&lt;br /&gt;
&lt;br /&gt;
If true, then lighting effects will be interpolated across the polygons of the model, giving a more 'rounded' effect.&lt;br /&gt;
&lt;br /&gt;
Asteroids, Boulders and Splinters use this effect as do some other models.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;smooth&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== spawn ==&lt;br /&gt;
The spawn directory is only used when a ship is added with the command: &amp;quot;spawnShip: shipname&amp;quot;.  This command only allows to add one ship by name (not role!). The position and orientation are taken from a spawn directory that describes the position it is placed and the position it is looking at.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
 &amp;quot;spawn&amp;quot;&lt;br /&gt;
 {&lt;br /&gt;
       &amp;quot;facing_position&amp;quot; = &amp;quot;spu 0 0 0&amp;quot;;&lt;br /&gt;
       &amp;quot;position&amp;quot; = &amp;quot;wpu 0 0 0.2&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== starboard_weapon_type ==&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
Assigns the ship's starboard laser. &lt;br /&gt;
Any weapon type from the [[equipment.plist]] can be used (and WEAPON_NONE). &lt;br /&gt;
&lt;br /&gt;
While not essential, you should generally assign the same weapon to [[#port_weapon_type|port_weapon_type]].&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;starboard_weapon_type&amp;quot; = &amp;quot;WEAPON_BEAM_LASER&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== subentities ==&lt;br /&gt;
An array of ''subentity definitions''. A ''subentity'' is an object attached to your ship. There are several types of subentity:&lt;br /&gt;
* ''Static subentities'', the default type, are simply extra models. They are defined as separate shipdata.plist entries, so technically they’re ships, but they don’t have a mind of their own. If the main ship is [[#frangible|frangible]], static subentities can take damage and blow up separately from the main ship. They can also be individually exploded or removed by scripts.&lt;br /&gt;
* ''Docks'' are recognized when setting up a station or carrier, and used to determine the station’s docking port parameters. After set-up, they work just like normal static subentities. The string &amp;quot;dock&amp;quot; in lowercase must be part of the old style name in order to get recognised as the dock subEntity.&lt;br /&gt;
* ''Ball turrets'' turn to track the ship’s current target, and shoot plasma balls if the target is within range (6000 metres). A ball turret’s field of fire is a 157 ° cone centred on its original facing. Currently, ball turrets make no effort not to shoot their own ship, so it is up to the designer to ensure this field of fire is clear. Like a static subentity, a ball turret is based on a shipdata.plist entry so its appearance can be customized. Oolite provides a built-in shipdata entry for ball turrets called, imaginatively, '''ballturret'''.&lt;br /&gt;
* ''Flashers'' are blobs which glow with a pulsating light. From Oolite 1.74 onwards, constant light will also be an option. Note that while flashers appear luminous – they are unaffected by shadows – they do not cast light on other objects.&lt;br /&gt;
&lt;br /&gt;
=== New-style subentity definition ===&lt;br /&gt;
Oolite 1.73 introduced a more flexible, dictionary-based way of specifying subentities. A new-style subentity is a dictionary using the following keys:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+ Subentity definition properties&lt;br /&gt;
! Name !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''type''' || string || One of: “'''standard'''”, “'''ball_turret'''”, “'''flasher'''”. If not specified, “standard” is assumed.&lt;br /&gt;
|-&lt;br /&gt;
| '''subentity_key''' || string || The key of a ''shipdata.plist'' entry. Required for '''standard''' and '''ball_turret''' subentities, ignored for flashers.&lt;br /&gt;
|-&lt;br /&gt;
| '''position''' || vector || The position of the subentity relative to its parent. (This can be specified as a string with three numbers in it, or an array of three numbers, or a dictionary with '''x''', '''y''' and '''z''' entries.) Default: (0, 0, 0).&lt;br /&gt;
|-&lt;br /&gt;
| '''orientation''' || [[quaternion]] || The orientation of the subentity. Ignored for flashers. (This can be specified as a string with four numbers in it, or an array of four numbers, or a dictionary with '''w''', '''x''', '''y''' and '''z''' entries.) Default: (1, 0, 0, 0), which corresponds to no rotation.&lt;br /&gt;
|-&lt;br /&gt;
| '''is_dock''' || boolean || True if the subentity is a dock; false by default. Only applies to '''standard''' subentities. '''Note:''' this is ''not'' implied by having “dock” in the '''subentity_key''', as it is for old-style subentity definitions. In Oolite 1.76 or earlier a station may only have at most one dock subentity.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+ Subentity definition properties for dock subentities (1.77 or later)&lt;br /&gt;
! Name !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''allow_docking''' || boolean || ''In Oolite 1.77 or later'', whether the dock allows docking. Defaults to true. (and always true in 1.76). Ignored for non-docks.&lt;br /&gt;
|-&lt;br /&gt;
| '''allow_launching''' || boolean || ''In Oolite 1.77 or later'', whether the dock allows launching. Defaults to true. (and always true in 1.76).  Ignored for non-docks.&lt;br /&gt;
|-&lt;br /&gt;
| '''disallowed_docking_collides''' || boolean || ''In Oolite 1.77 or later'', if this is true, ships attempting to dock here will collide with the dock if &amp;lt;code&amp;gt;allow_docking&amp;lt;/code&amp;gt; is false. If it is false, ships attempting to dock here will be docked with the station anyway. Defaults to false. (and always false in 1.76).  Ignored for non-docks.&lt;br /&gt;
|-&lt;br /&gt;
| '''dock_label''' || string || ''In Oolite 1.77 or later'', the name given to the dock by traffic control (overrides the display_name of the dock subentity). Defaults to &amp;quot;the docking bay&amp;quot;, and ignored for non-docks. In Oolite 1.76 or earlier the concept of dock names is meaningless.&lt;br /&gt;
|}&lt;br /&gt;
See [[Multiple Docks]] for more information on dock subentities and stations with more than one dock in Oolite 1.77 or later.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+ Subentity definition properties for ball turrets&lt;br /&gt;
! Name !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''fire_rate''' || number || Interval between shots in seconds, for '''ball_turret''' subentities. Default: 0.5; minimum: 0.25.&lt;br /&gt;
|-&lt;br /&gt;
| '''weapon_range''' || number || Range for '''ball_turret''' subentities. Default: 6000; maximum 7500.&lt;br /&gt;
|-&lt;br /&gt;
| '''weapon_energy''' || number || Weapon energy for '''ball_turret''' subentities. Default: 25; maximum 100.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|+ Subentity definition properties for flashers&lt;br /&gt;
! Name !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''color''' || [[Materials in Oolite#Colour specifiers|colour specifier]] || Single colour for a flasher. Ignored for non-flashers. Default value: '''redColor'''.&lt;br /&gt;
|-&lt;br /&gt;
| '''colors''' || array || Array of colour specifiers for a flasher. Ignored for non-flashers. Before 1.74, only the first entry was used. If not present, see '''color'''. '''Note:''' like [[#laser_color|laser_color]], flasher colours must be “reasonably bright”.&lt;br /&gt;
|-&lt;br /&gt;
| '''frequency''' || number || Pulse rate for flashers, in cycles per second. Ignored for non-flashers. If 0, the flasher will have full intensity all the time in Oolite 1.74 and later, but half intensity in earlier releases. Default: 2.&lt;br /&gt;
|-&lt;br /&gt;
| '''initially_on''' || boolean || Specifiers whether a flasher is turned on when created. Ignored for non-flashers. Default: yes.&lt;br /&gt;
|-&lt;br /&gt;
| '''phase''' || number || Pulse phase offset for flashers, in seconds. Ignored for non-flashers. (This value is simply added to the time to get the pulse parameter.) Default: 0.&lt;br /&gt;
|-&lt;br /&gt;
| '''size''' || positive number || Diameter of a flasher in metres. Ignored for non-flashers. Default: 8. (Why 8? I don’t remember.)&lt;br /&gt;
|-&lt;br /&gt;
| '''bright_fraction''' || number || ''In Oolite 1.77 or later'', a number between 0 and 1 defining the proportion of the flasher's cycle that the flasher is bright for. Ignored for non-flashers. The default (which mimics the behaviour of all flashers in 1.76 or earlier) is 0.5.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Old-style subentity definition ===&lt;br /&gt;
Prior to Oolite 1.73, this was the the only way to specify a subentity.&lt;br /&gt;
&lt;br /&gt;
An old-style subentity definition is a string with eight items separated by spaces. In the description below, words in bold correspond to keys in [[#New-style subentity definition|new-style definitions]]. There are two variants:&lt;br /&gt;
&lt;br /&gt;
==== Flashers ====&lt;br /&gt;
For a flasher, the entry takes the form:&lt;br /&gt;
 *FLASHER* x y z hue frequency phase size&lt;br /&gt;
''*FLASHER*'' must be precisely the string “*FLASHER*”, in capitals.&lt;br /&gt;
&lt;br /&gt;
''x'', ''y'' and ''z'' form the '''position'''.&lt;br /&gt;
&lt;br /&gt;
''hue'' specifies the [http://en.wikipedia.org/wiki/HSL_and_HSV HSV] hue component (in degrees) of '''color'''. Saturation and value are always 1.&lt;br /&gt;
&lt;br /&gt;
'''frequency''', '''phase''' and '''size''' are the same as in the new-style format.&lt;br /&gt;
&lt;br /&gt;
'''initially_on''' is false.&lt;br /&gt;
&lt;br /&gt;
==== Other subentities ====&lt;br /&gt;
For a non-flasher, the entry takes the form:&lt;br /&gt;
 key x y z qw qx qy qz&lt;br /&gt;
''key'' corresponds to '''subentity_key'''.&lt;br /&gt;
&lt;br /&gt;
''x'', ''y'' and ''z'' form the '''position'''.&lt;br /&gt;
&lt;br /&gt;
''qw'', ''qx'', ''qy'' and ''qz'' form the '''orientation'''.&lt;br /&gt;
&lt;br /&gt;
'''type''' is ''standard'' unless the command ''initialiseTurret'' is present in the [[#setup_actions|setup_actions]] of the subentity, in which case it is ''ball_turret''. Note that the ''initialiseTurret'' no longer does anything when executed in a script; its presence is only used as an indicator to set the ''is_turret'' property when old-style definitions are translated. If ''initialiseTurret'' is inside a condition, it will be ignored. The ''initialiseTurret'' command is not required or useful for turrets which are only referenced using new-style subentity definitions.&lt;br /&gt;
&lt;br /&gt;
'''is_dock''' is implied by having the string “dock” (in lowercase) in the ''key''.&lt;br /&gt;
&lt;br /&gt;
== sun_glare_filter ==&lt;br /&gt;
{{oolite-prop-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The default strength of the sun glare filter on this ship. A number between 0 and 1, with the default being 0 (no filter)&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;sun_glare_filter&amp;quot; = 0.3;&lt;br /&gt;
&lt;br /&gt;
== track_contacts ==&lt;br /&gt;
Tracks the movement of the ship and sends a &amp;quot;CLOSE CONTACT&amp;quot; message to other ship AI's. It uses a time consuming tracking, so only set to true when actually used.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;track_contacts&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== throw_sparks ==&lt;br /&gt;
{{oolite-prop-added|1.73}}&lt;br /&gt;
&lt;br /&gt;
Each new ship should start in seemingly good operating condition, unless specifically told not to. (false by default)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;throw_sparks&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== thrust ==&lt;br /&gt;
Gives the entity an 'inertia' value, telling how fast it can increase or reduce speed (in m/s^2). 0 for rocks and cargo, 50 for a very fast ship, 100 for a station. When used with turrets it defines the turn rate in revolutions per second (with 1 being an average value). &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;thrust&amp;quot; = &amp;quot;25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== unpiloted ==&lt;br /&gt;
Used to designate items that will never have a pilot, thus never turn aggressive and never eject a pod. By chance factor, or true/false.&amp;lt;br&amp;gt;&lt;br /&gt;
It will not add a pilot when set to false, but will remove any existing pilot when set to true.&lt;br /&gt;
commsMessages can only be broadcasted by piloted ships. Ships are by default piloted.  cargo , rocks, missiles etc. are not piloted by default.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;unpiloted&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== view_position_.. ==&lt;br /&gt;
Sets the ship's 4 point-of-view positions in XYZ relative to the model.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;view_position_aft&amp;quot; = &amp;quot;0.0 5.0 -20.0&amp;quot;;&lt;br /&gt;
 &amp;quot;view_position_forward&amp;quot; = &amp;quot;0.0 1.9375 5.0&amp;quot;;&lt;br /&gt;
 &amp;quot;view_position_port&amp;quot; = &amp;quot;-11.85 2.825 -3.5&amp;quot;;&lt;br /&gt;
 &amp;quot;view_position_starboard&amp;quot; = &amp;quot;11.85 2.825 -3.5&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== weapon_energy ==&lt;br /&gt;
This setting works differently depending on the type of entity it's used for:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Missiles.&amp;lt;/b&amp;gt; Changes the damage inflicted by the missile. Any value accepted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NPC ships.&amp;lt;/b&amp;gt; Changes the forward weapon damage to a value different to the default one. Values higher than 50 will be clamped to 50. Does not change the value for aft weapons or subEntity weapons.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;N.B.&amp;lt;/b&amp;gt; It does not have any effect on player ships.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;turrets.&amp;lt;/b&amp;gt; Unused for turrets. Set the turret weapon_energy in its [[Shipdata.plist#New-style_subentity_definition|subEntity directory]].&lt;br /&gt;
&lt;br /&gt;
Default values are: WEAPON_PLASMA_CANNON = 6.0; WEAPON_PULSE_LASER = 15.0; WEAPON_BEAM_LASER = 15.0; WEAPON_MINING_LASER = 50.0; WEAPON_THARGOID_LASER = 12.5; WEAPON_MILITARY_LASER = 23.0&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;weapon_energy&amp;quot; = &amp;quot;17&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== weapon_facings ==&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
What weapon mounts are available on the ship. This is a bit-mask, so pick the mounts and add the numbers:&lt;br /&gt;
&lt;br /&gt;
1 - Forward&amp;lt;br /&amp;gt;&lt;br /&gt;
2 - Aft&amp;lt;br /&amp;gt;&lt;br /&gt;
4 - Port&amp;lt;br /&amp;gt;&lt;br /&gt;
8 - Starboard&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;br /&amp;gt;&lt;br /&gt;
Fore and aft weapon mounts only.&lt;br /&gt;
  &amp;lt;key&amp;gt;weapon_facings&amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;integer&amp;gt;3&amp;lt;/integer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If omitted, defaults to 15 (all mounts). If a player ship has this specified, and the same property specified in shipyard.plist, the shipyard.plist property takes precedence.&lt;br /&gt;
&lt;br /&gt;
Weapons assigned to a mount that the ship does not have will be ignored. Scripting cannot be used to add weapons to these mounts later, either.&lt;br /&gt;
&lt;br /&gt;
== weapon_mount_mode ==&lt;br /&gt;
{{oolite-prop-added|1.83}}&lt;br /&gt;
&lt;br /&gt;
This controls how multiple weapon mount points work. It has three possible values:&lt;br /&gt;
* '''&amp;quot;single&amp;quot;''': this is the default, and replicates 1.82 and previous behaviour. In this mode, &amp;lt;code&amp;gt;weapon_position_*&amp;lt;/code&amp;gt; properties are simple vector expressions, and there is exactly one mount per facing.&lt;br /&gt;
* '''&amp;quot;split&amp;quot;''': In this mode, &amp;lt;code&amp;gt;weapon_position_*&amp;lt;/code&amp;gt; properties are an array of vector expressions. A weapon fitted to this facing has the same heat and energy cost as a single standard weapon, and the damage output is divided equally between all mount points. (in other words, the distinction is mainly cosmetic)&lt;br /&gt;
* '''&amp;quot;multiply&amp;quot;''': In this mode, &amp;lt;code&amp;gt;weapon_position_*&amp;lt;/code&amp;gt; properties are an array of vector expressions. A weapon fitted to this facing has N times the heat and energy cost as a single standard weapon, and each mount point does normal damage. (in other words, the weapon is fitted N times at once)&lt;br /&gt;
&lt;br /&gt;
For best results with AI and the &amp;quot;target reticle sensitive&amp;quot; feature, if there are several weapon positions in a (rough) line, the middle one should be listed first.&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/OoliteProject/oolite/pull/161 this comment] or [[Multiple Lasers]] for examples.&lt;br /&gt;
&lt;br /&gt;
== weapon_offset ==&lt;br /&gt;
Removed after version 1.65 (it was used to change the offsetpoint of a plasma cannon.)&lt;br /&gt;
&lt;br /&gt;
== weapon_position_.. ==&lt;br /&gt;
Plots the 'gunmouth' points of the model's 4 potential lasers.&lt;br /&gt;
&lt;br /&gt;
In 1.82 and earlier, and in 1.83 and later in the &amp;quot;single&amp;quot; &amp;lt;code&amp;gt;weapon_mount_mode&amp;lt;/code&amp;gt;, these are vector expressions.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;weapon_position_aft&amp;quot; = &amp;quot;0.0 -5.0 -20.0&amp;quot;;&lt;br /&gt;
 &amp;quot;weapon_position_forward&amp;quot; = &amp;quot;0.0 0.0417 16.6667&amp;quot;;&lt;br /&gt;
 &amp;quot;weapon_position_port&amp;quot; = &amp;quot;-13.75 -2.0625 -1.875&amp;quot;;&lt;br /&gt;
 &amp;quot;weapon_position_starboard&amp;quot; = &amp;quot;13.75 -2.0625 -1.875&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
In 1.83 and later, with &amp;quot;split&amp;quot; or &amp;quot;multiply&amp;quot; &amp;lt;code&amp;gt;weapon_mount_mode&amp;lt;/code&amp;gt;, these values are specified as arrays of vector expressions. For example:&lt;br /&gt;
 &amp;quot;weapon_position_forward&amp;quot; = ( &amp;quot;0.0 3.0 32.0&amp;quot; , &amp;quot;-15.0 0.0 32.0&amp;quot; , &amp;quot;15.0 0.0 32.0&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
= Station keys=&lt;br /&gt;
The following keys are only used by stations or carriers.&lt;br /&gt;
&lt;br /&gt;
== allegiance ==&lt;br /&gt;
An advisory flag that informs AIs how they should expect to be treated near or when attempting to dock with this station. See [[Oolite_JavaScript_Reference:_Station#allegiance|station.allegiance]] for the allowable values. If this is not set, the game will guess based on other station properties.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 allegiance = &amp;quot;neutral&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== allows_auto_docking ==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
When set false for a station, this station will not allow the use of a docking computer. Default value in &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 allows_auto_docking = &amp;quot;no&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
== allows_fast_docking ==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
When set true for a station, this station will allow fast docking with the docking computer. Default value in &amp;quot;no&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 allows_fast_docking = &amp;quot;yes&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
== defense_ship ==&lt;br /&gt;
Gives an oportunity to designate a particular ship by name that will defend a station/carrier. See also [[Shipdata.plist#defense_ship_role|defense_ship_role]]&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 defense_ship&amp;quot; = &amp;quot;my_defender&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== defense_ship_role ==&lt;br /&gt;
Gives an oportunity to designate a particular (group of) ships that will defend a station/carrier. This has to be specified in the [[Shipdata.plist#roles|roles]] of the ship(s) that are assigned to defend. When launched from a carrier the scan_class becomes that of the carrier. Default role is &amp;quot;police&amp;quot;/&amp;quot;interceptor&amp;quot; for normal stations and &amp;quot;hermit-ship&amp;quot; for stations of CLASS_ROCK. Defense ships with scanclass police or with a hermit-ship role launch with a policeInterceptAI.plist. All other ships use the ai_type as defined in shipdata.plist. After launch, all primary roles are changed into: &amp;quot;defense_ship&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;defense_ship_role&amp;quot; = &amp;quot; carrier_defenders&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== equipment_price_factor ==&lt;br /&gt;
Equipment price mask for dockables.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;equipment_price_factor&amp;quot; = &amp;quot;4.5&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== equivalent_tech_level ==&lt;br /&gt;
Sets shipyard tech level for dockables, different to the local system tech_level. Default value is the system tech_level.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;equivalent_tech_level&amp;quot; = 1;&lt;br /&gt;
&lt;br /&gt;
== has_npc_traffic ==&lt;br /&gt;
Determines if a station launches NPC traffic. Default is &amp;quot;yes&amp;quot; for stationary stations, and &amp;quot;no&amp;quot; for stations with a non-zero maximum speed. When set to &amp;quot;no&amp;quot; the station will not launch random ships as part of the main Oolite system repopulator (though OXP scripts may still launch ships from it).&lt;br /&gt;
&lt;br /&gt;
The type of traffic launched depends on the [[#allegiance|allegiance]] property of the station (which also determines what, if any, ships may try to dock at it).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_npc_traffic&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== has_patrol_ships ==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
Determines if a station launches periodic patrol ships. Default is &amp;quot;no&amp;quot;. Main stations always have patrol ships.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_patrol_ships&amp;quot; = yes;&lt;br /&gt;
 &lt;br /&gt;
== has_shipyard ==&lt;br /&gt;
Determines if a station or carrier has a shipyard. By chance factor as number between 0 and 1, but it can also be an array of conditions. Default is &amp;quot;no&amp;quot;, but for main stations has_shipyard is always &amp;quot;yes&amp;quot;. (Name is valid starting with Oolite 1.74. Before it was called &amp;quot;hasShipyard&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;has_shipyard&amp;quot; = &amp;quot;0.75&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;has_shipyard&amp;quot; = (&lt;br /&gt;
                   &amp;quot;systemGovernment_number morethan 3&amp;quot;,&lt;br /&gt;
                   &amp;quot;systemEconomy_number lessthan 4&amp;quot;&lt;br /&gt;
                  )&lt;br /&gt;
&lt;br /&gt;
== interstellar_undocking ==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
When set true for a station, this station will allow interstellar docking and undocking in interstellar space. When set to &amp;quot;no&amp;quot; the player docks in nearby normal space. Default value in &amp;quot;no&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 interstellar_undocking = &amp;quot;yes&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
==is_carrier==&lt;br /&gt;
Added as a tag for making the model be considered a carrier or station.  An alternative to including ''carrier'' or ''station'' among the [[Shipdata.plist#roles|roles]]. When present this key even overrules station/carrier settings with roles. (Name is valid starting with Oolite 1.74. Before it was called &amp;quot;isCarrier&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;is_carrier&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== market ==&lt;br /&gt;
Key that sets the market for stations and carriers. The name defines the key in [[commodities.plist]] that will be used as local market. Without a market key, the stations primaryRole is used as market.  Added with test release 1.74 and no longer used in 1.81 or later, where it is replaced by the market_* properties below.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;market&amp;quot; = &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== market_broadcast ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
If this is enabled the station's market will appear on the F8 screen if the player is in flight and has the station targeted. The default is enabled. This is ignored (and always true) if the station is the main station.&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;market_broadcast&amp;quot; = no;&lt;br /&gt;
&lt;br /&gt;
== market_capacity ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The capacity in units per trade good of the station market. If omitted, the default market capacity of 127 units will be used. This is ignored if the station is the main station as it will use the system market, not its own.&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;market_capacity&amp;quot; = 31;&lt;br /&gt;
&lt;br /&gt;
== market_definition ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
An array of [[trade-goods.plist#Secondary_Market_Definitions|secondary market rules]] which modify some or all of the price, quantity, capacity and legal status of a good relative to the primary system market. This is ignored if the station is the main station as it will use the system market, not its own.&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;market_definition&amp;quot; = (&lt;br /&gt;
 	{&lt;br /&gt;
 		// export cheap clothes&lt;br /&gt;
 		&amp;quot;type&amp;quot; = &amp;quot;class&amp;quot;;&lt;br /&gt;
 		&amp;quot;name&amp;quot; = &amp;quot;oolite-wearable&amp;quot;;&lt;br /&gt;
 		&amp;quot;price_multiplier&amp;quot; = 0.8;&lt;br /&gt;
 		&amp;quot;price_randomiser&amp;quot; = 0.1;&lt;br /&gt;
 		&amp;quot;quantity_multiplier&amp;quot; = 3.5;&lt;br /&gt;
 		&amp;quot;quantity_randomiser&amp;quot; = 3.0;&lt;br /&gt;
 	}, 			&lt;br /&gt;
 	{&lt;br /&gt;
 		// not really interested in other goods&lt;br /&gt;
 		&amp;quot;type&amp;quot; = &amp;quot;default&amp;quot;;&lt;br /&gt;
 		&amp;quot;price_multiplier&amp;quot; = 0.55;&lt;br /&gt;
 		&amp;quot;price_randomiser&amp;quot; = 0.25;&lt;br /&gt;
 		&amp;quot;quantity_multiplier&amp;quot; = 0.0;&lt;br /&gt;
 		&amp;quot;capacity&amp;quot; = 3;&lt;br /&gt;
 	}&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
If the capacity set by a rule is larger than the market_capacity of the station, the market_capacity of the station is used instead.&lt;br /&gt;
&lt;br /&gt;
A blank array&lt;br /&gt;
 &amp;quot;market_definition&amp;quot; = ();&lt;br /&gt;
will give a market identical to the primary system market.&lt;br /&gt;
&lt;br /&gt;
If this key is omitted, the station will have no market. This is roughly equivalent to&lt;br /&gt;
 &amp;quot;market_definition&amp;quot; = (&lt;br /&gt;
 	{&lt;br /&gt;
 		&amp;quot;type&amp;quot; = &amp;quot;default&amp;quot;;&lt;br /&gt;
 		&amp;quot;price_multiplier&amp;quot; = 0;&lt;br /&gt;
 		&amp;quot;quantity_multiplier&amp;quot; = 0;&lt;br /&gt;
 		&amp;quot;capacity&amp;quot; = 0;&lt;br /&gt;
 	}&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
== market_monitored ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
If this is true, the market is subject to Cooperative law for the import and export of trade goods, and the player will gain the usual bounties for smuggling contraband. The default value is no. This is ignored (and effectively always true) if the station is the main station.&lt;br /&gt;
&lt;br /&gt;
 market_monitored = yes;&lt;br /&gt;
&lt;br /&gt;
== market_script ==&lt;br /&gt;
{{oolite-prop-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
Allows a [[Oolite Market Scripts|market script]] to be used to modify trade prices. This overrides market_definition, if it is present.&lt;br /&gt;
&lt;br /&gt;
 market_script = &amp;quot;myoxp_marketchanges.js&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== max_defense_ships ==&lt;br /&gt;
Designates how many ships a dockable entity (station, carrier) can launch in defense. Default value is 3. See also [[Station Ships]]&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_defense_ships&amp;quot; = &amp;quot;10&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== max_police ==&lt;br /&gt;
Designates how many police or patrol ships a dockable entity (station, carrier) can launch.  Default value is 8. See also [[Station Ships]]&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_police &amp;quot; = &amp;quot;10&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== max_scavengers ==&lt;br /&gt;
Designates how many scavengers or miners a dockable entity (station, carrier) can launch. Default value  is 3. See also [[Station Ships]]&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;max_scavengers&amp;quot; = &amp;quot;10&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== port_dimensions ==&lt;br /&gt;
Defines the size of the docking port and takes 3 numbers, separated by &amp;quot;x&amp;quot;. This key is generally of little use and can be skipped as it becomes overwritten by the actual size of the bounding box of the dock subentity when a correct dock subentity is defined.&lt;br /&gt;
  &lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;port_dimensions&amp;quot; = &amp;quot;65x30x500&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Size of Oolites main-station dock is: 64.00 x 192.00 x 250.00  while the dimension of a rock-hermit dock is: 138.001 x 138.001 x 250.12 (W x H x L)&amp;lt;br&amp;gt;&lt;br /&gt;
These sizes may be relevant for ship dimensions as since Oolite 1.75 ships must fit in these docks to be allowed docking or launching.&lt;br /&gt;
&lt;br /&gt;
== port_radius ==&lt;br /&gt;
Defines the size of the docking port radius. Or more precise, this is the distance from the station centre to the port location. Default value is 500. This key is generally of little use and can be skipped as it will be overwritten by the real position of the dock subentity.&lt;br /&gt;
  &lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;port_radius&amp;quot; = &amp;quot;500&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== requires_docking_clearance ==&lt;br /&gt;
Sets the requirement for docking clearance. Default is &amp;quot;no&amp;quot;. See also [[Oolite_Docking_Clearance_Protocol_%28v1.72_or_later%29|DockingClearance]]&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;requires_docking_clearance&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
==rotating==&lt;br /&gt;
Given to a station when rotation is desired. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;rotating&amp;quot; = yes;&lt;br /&gt;
&lt;br /&gt;
== station_roll ==&lt;br /&gt;
{{oolite-prop-added|1.74.2}}&lt;br /&gt;
&lt;br /&gt;
Determines the rotation speed of a station. Default value is determined by the systemwide station_roll in planetInfo.plist. If that is not defined, the default is 0.4. Negative values are also possible for a rotation in the other direction.&lt;br /&gt;
&lt;br /&gt;
'''Note''': unlike the other turn rate properties, for historical reasons &amp;lt;code&amp;gt;station_roll&amp;lt;/code&amp;gt; is measured in right-angles/second, ''not'' radians/second.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;station_roll&amp;quot; = &amp;quot;-1.5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==tunnel_corners==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
Defines the number of corners in the docking tunnel. Ranges from 4 to 128. Default is &amp;quot;4&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;tunnel_corners&amp;quot; = 6;&lt;br /&gt;
&lt;br /&gt;
==tunnel_start_angle==&lt;br /&gt;
{{oolite-prop-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
Defines the position of the first corner of the docking tunnel in degrees. 0 means the first corner is straight up. Default is &amp;quot;45&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;tunnel_start_angle&amp;quot; = 0;&lt;br /&gt;
&lt;br /&gt;
==tunnel_aspect_ratio==&lt;br /&gt;
Defines the proportion of the tunnel’s width to its height. Default is &amp;quot;2.67&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &amp;quot;tunnel_aspect_ratio&amp;quot; = 1;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
[[Category:Oolite]]&lt;br /&gt;
[[Category:Oolite scripting]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Deep_Horizon_Advanced_Navigation_Computer&amp;diff=67299</id>
		<title>Deep Horizon Advanced Navigation Computer</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Deep_Horizon_Advanced_Navigation_Computer&amp;diff=67299"/>
		<updated>2021-07-15T02:47:14Z</updated>

		<summary type="html">&lt;p&gt;Milo: added 1.0.5 to version history&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Adds a primeable piece of equipment that improves interstellar navigation in the form of fuel savings.&lt;br /&gt;
&lt;br /&gt;
== Release Blurb ==&lt;br /&gt;
''A small blue-skinned humanoid approaches the podium in front of the assembled members of the press accompanied by an even shorter, squat, black-bodied avian with a white belly. He appears to have flippers instead of wings, and may be an Arritian. After scanning the room, the blue-skinned being begins reading aloud from his notes...''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Greetings all. I'd like to thank you all for coming today.&lt;br /&gt;
&lt;br /&gt;
Deep Horizon Industries, in association with Gorth Consultancy Services, is proud to announce our latest technological delivery to the space faring populace. Available immediately is the '''ANC-42 Advanced Navigation Computer'''. While the exact nature of Witchspace is still the subject of scientific research, we are aware that it has certain directional flows. We at Deep Horizon Industries together with our project partners at Gorth Consultancy Services, decided to take advantage of these eddies and currents within witchspace utilizing feedback derived from the recently deployed GFL-1 Witchpoint Tunnel Demarkation Buoys. By extending the calcuation time before making a witchjump, our Advanced Navigation Computer enables vessels to successfully navigate witchspace in a more efficient manner that results in a lower overall energy expenditure for a witchspace jump. A pilot utilizing this equipment can save 10% of his fuel expenditures in this manner.&lt;br /&gt;
&lt;br /&gt;
Additionally, we at Deep Horizon Industries would like to announce the separate development of the '''EWI-OS-5141 Emergency Witchspace Initiator''' or '''EWI'''. Developed independently of the ANC project, the EWI offers a new hope for pilots. Combat is a dangerous proposition, whether entered willingly to claim a prize, begrudgingly in defense of another, or fearfully when not of your choosing. Given time, it is also inevitable for pilots to find themselves in combat. Likewise, overwhelming odds, inferior abilities compared to your opponent, or simple misfortune will one day turn the tide of battle against every pilot. Retreat is sometimes a necessity.&lt;br /&gt;
&lt;br /&gt;
The Emergency Witchspace Initiator makes the interminable delay between deciding to retreat and the actual act a little quicker. By allowing certain 'safety guidelines' to be optimized, the EWI-OS-5141 is able to lessen the time needed for the hyperspace motors to 'spin up'. This can be a decrease of 50% of the normal spin-time required. Vital seconds during an emergency.&lt;br /&gt;
&lt;br /&gt;
My legal team however would like me to add the following statement: ''Deep Horizon Industries would like to remind all customers that all safety guidelines published by GALCOP are there for your protection. Bypassing or eliminating such protocols may result in misjumps, faulty navigation calculations, damage to ship systems, wasted fuel, and other side-effects. Deep Horizon Industries is not responsible for any undesirable outcomes from use of this product including, but not limited to, death by Thargoid.''&lt;br /&gt;
&lt;br /&gt;
== Large Slow Ships ==&lt;br /&gt;
Some large, slow-moving ships (such as the [[Anaconda (Oolite)|Anaconda]]) may not be able to complete reorientation before completion of the normal hyperspace countdown timer.  This is a known issue.  We decided that accelerating the reorientation any more than current would ruin the illusion of size of such large vessels.  So instead, we are allowing this 'bug' to exist for this release, and may address it in a future release of this OXP.&lt;br /&gt;
&lt;br /&gt;
== Equipment List ==&lt;br /&gt;
*Akai Stella Automated Transport Routing Unit: Plots wormhole entry and exit event horizons in conjunction with Witchspace Navigation Beacons: &lt;br /&gt;
*Dynamic Response Uridium Injection Dilator: Dynamically alters uridium injection into the drive initiator housing during exit sequence.&lt;br /&gt;
*Proton Anti-Gaussing Anisotropy Neutraliser: Re-stabilizes the proton-focusing crystal in the drive unit's anti-gaussing field destabilizer into an isotrophic state.&lt;br /&gt;
*Std. Heisenberg Atemporal Muon-Ambiplasma Navigation: Ensures asynchronous temporal wormhole exit by destabilising the witchspace exit meniscus only after the ship has entered the wormhole using ambiplasma-derived muons.&lt;br /&gt;
*Witchspace Initiator Chromo-Channel Accelerator: Accelerates particles in the quantum chromodynamics channel to initiate a witchspace jump.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
*CC-BY-NC-ND 3.0&lt;br /&gt;
*Authors: [[User:Cmd. Cheyd|Cmd. Cheyd]] &amp;amp; Phantorgorth&lt;br /&gt;
*Contributors: [[User:Svengali|Svengali]], Submersible &amp;amp; [[User:Phkb|Phkb]]&lt;br /&gt;
&lt;br /&gt;
== Version History ==&lt;br /&gt;
*Version 1.0.5: Minor patch designating farpoint marker as unpiloted.&lt;br /&gt;
*Version 1.0.4: ANC will now disengage if auto-docking is started during a jump countdown. &lt;br /&gt;
*Version 1.0.3: Jump markers were not being removed if jump countdown was aborted by the player in some situations.&lt;br /&gt;
*Version 1.0.2: A couple of small bug fixes for &amp;quot;item is null&amp;quot; errors. Adjusted function names to remove them from the global namespace.&lt;br /&gt;
*Version 1.0.1: Updated to work with ANA navigation plotting introduced in 1.82. &lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*[http://aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=13526 BB Thread] (2013+)&lt;br /&gt;
*[http://deephorizonindustries.com/ Deep Horizon industries]&lt;br /&gt;
*[[Hyperspace|witchspace]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gameplay and Balance Indicator ==&lt;br /&gt;
[[File:Tag-colour-green.png|right]]&lt;br /&gt;
If one is attacked waiting to enter Witchspace, there are complications! Unsure that they warrant an orange rating.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67283</id>
		<title>Traffic Control OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67283"/>
		<updated>2021-07-13T03:59:03Z</updated>

		<summary type="html">&lt;p&gt;Milo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A little script which gives each system main station a traffic control department, whose job it is to guide new Commanders (and a few old hands who have become too reliant on docking computers) on the best route for manual approach and docking into the station. They oversee all traffic from station aegis and planetary approach right up until the actual docking itself. Also they keep an eye on ships leaving the station and wish people a bon voyage. Just don't dally in the approach lane and get in everyone's way, or you'll feel their wrath!&lt;br /&gt;
&lt;br /&gt;
Recommended for new players learning how to dock manually, and for experienced players who want a bit of extra ambience around main stations. It is fully integrated with the docking clearance protocols introduced in Oolite 1.72 (if the stations enable them). Most messages from this OXP will appear only if your ship does not have functional docking computers, but a few will appear regardless, for example: Clear the lane, Commander! If you see a message that starts with 'Traffic Control:' then it is probably from this OXP.&lt;br /&gt;
&lt;br /&gt;
In terms of balance, this OXP is neutral for beginners and slightly biased against the experienced player, because it enforces (with fines and small but escalating bounties) a sensible rule against the use of cloaking devices in proximity to main stations... however, to be fair, it will not impose any penalties if you pass undetected (or at least unidentified). Of course, requesting docking clearance or activating docking computers will transmit your identity to the station...&lt;br /&gt;
&lt;br /&gt;
This OXP is compatible with all other OXPs, and includes considerations for Buoy Repair, ILS and AutoDock if those OXPs are also installed.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
This OXP requires at least version 1.88 of Oolite. &lt;br /&gt;
&lt;br /&gt;
The traffic controllers also assume that any Commander's ship equipped with Docking Computers can look after itself in terms of approach and docking.&lt;br /&gt;
&lt;br /&gt;
==Version History==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
09/10/2008 - Version 1.00, Initial release.&lt;br /&gt;
04/11/2008 - Version 1.01, scripting update for v1.72+ compatibility.&lt;br /&gt;
24/05/2010 - Version 1.10, fortified equipment damage checking for 1.74&lt;br /&gt;
13/02/2011 - Version 1.11, removal of upper limit, to allow running with 1.75&lt;br /&gt;
08/07/2020 - Version 2.00, updated by Milo; set minimum Oolite version to 1.88; &lt;br /&gt;
*fixed errors if navigation buoy is destroyed; &lt;br /&gt;
*corrected planet approach guidance (follow green circle, not square, if ship has a basic compass); &lt;br /&gt;
*added additional hints for new players (until they buy docking computers); &lt;br /&gt;
*set up recurring reminders to &amp;quot;clear the lane&amp;quot; when not supposed to be there; &lt;br /&gt;
*integrated docking advice with docking clearance protocol for main stations that require clearance; &lt;br /&gt;
*added warning messages to fugitive players entering station aegis or requesting docking clearance; &lt;br /&gt;
*Cloaking Devices: added responses to being detected using cloaking devices in the station aegis (this OXP now declares it illegal to cloak within main station aegis and introduces a small bounty for the first offence, which will be increased for non-fugitive players each time they are detected still cloaked after the initial offence; however, entering the aegis cloaked and never interacting with the station will not impose a penalty as the traffic controllers are unaware of the trespass); added a 1000 credit fine (or equivalent bounty) to the arrival report when docking at main stations while cloaked (even if fast-docking is used); &lt;br /&gt;
*added considerations for nova systems (traffic control will leave a recording when sun has gone nova) and for Buoy Repair, ILS and AutoDock OXPs&lt;br /&gt;
07/11/2021 - Version 2.01, updated by Milo; fix bug reported by dybal (docking clearance &amp;quot;granted&amp;quot; status was not correctly detected, resulting in unintended behavior, particularly noticeable when combined with ILS OXP)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
The latest version, [[Media:Oolite.oxp.Thargoid.TrafficControl.2.01.oxz|Traffic Control v2.01]], can be downloaded from the wiki by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
An older version, [http://www.box.com/shared/qah2zp7sq2 '''Traffic Control v1.11'''], can be downloaded from Box.Net by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=20180 BB Thread] (2019-20)&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?p=59662#p59662 Original thread] (2008)&lt;br /&gt;
&lt;br /&gt;
[[File:Tag-colour-blue.png]]{{OXPLevel|0}}&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.01.oxz&amp;diff=67282</id>
		<title>File:Oolite.oxp.Thargoid.TrafficControl.2.01.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.01.oxz&amp;diff=67282"/>
		<updated>2021-07-13T03:56:12Z</updated>

		<summary type="html">&lt;p&gt;Milo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67173</id>
		<title>Traffic Control OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67173"/>
		<updated>2021-07-12T00:42:12Z</updated>

		<summary type="html">&lt;p&gt;Milo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A little script which gives each system main station a traffic control department, whose job it is to guide new Commanders (and a few old hands who have become too reliant on docking computers) on the best route for manual approach and docking into the station. They oversee all traffic from station aegis and planetary approach right up until the actual docking itself. Also they keep an eye on ships leaving the station and wish people a bon voyage. Just don't dally in the approach lane and get in everyone's way, or you'll feel their wrath!&lt;br /&gt;
&lt;br /&gt;
Recommended for new players learning how to dock manually, and for experienced players who want a bit of extra ambience around main stations. It is fully integrated with the docking clearance protocols introduced in Oolite 1.72 (if the stations enable them). Most messages from this OXP will appear only if your ship does not have functional docking computers, but a few will appear regardless, for example: Clear the lane, Commander! If you see a message that starts with 'Traffic Control:' then it is probably from this OXP.&lt;br /&gt;
&lt;br /&gt;
In terms of balance, this OXP is neutral for beginners and slightly biased against the experienced player, because it enforces (with fines and small but escalating bounties) a sensible rule against the use of cloaking devices in proximity to main stations... however, to be fair, it will not impose any penalties if you pass undetected (or at least unidentified). Of course, requesting docking clearance or activating docking computers will transmit your identity to the station...&lt;br /&gt;
&lt;br /&gt;
This OXP is compatible with all other OXPs, and includes considerations for Buoy Repair, ILS and AutoDock if those OXPs are also installed.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
This OXP requires at least version 1.88 of Oolite. &lt;br /&gt;
&lt;br /&gt;
The traffic controllers also assume that any Commander's ship equipped with Docking Computers can look after itself in terms of approach and docking.&lt;br /&gt;
&lt;br /&gt;
==Version History==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
09/10/2008 - Version 1.00, Initial release.&lt;br /&gt;
04/11/2008 - Version 1.01, scripting update for v1.72+ compatibility.&lt;br /&gt;
24/05/2010 - Version 1.10, fortified equipment damage checking for 1.74&lt;br /&gt;
13/02/2011 - Version 1.11, removal of upper limit, to allow running with 1.75&lt;br /&gt;
08/07/2020 - Version 2.00, updated by Milo; set minimum Oolite version to 1.88; &lt;br /&gt;
*fixed errors if navigation buoy is destroyed; &lt;br /&gt;
*corrected planet approach guidance (follow green circle, not square, if ship has a basic compass); &lt;br /&gt;
*added additional hints for new players (until they buy docking computers); &lt;br /&gt;
*set up recurring reminders to &amp;quot;clear the lane&amp;quot; when not supposed to be there; &lt;br /&gt;
*integrated docking advice with docking clearance protocol for main stations that require clearance; &lt;br /&gt;
*added warning messages to fugitive players entering station aegis or requesting docking clearance; &lt;br /&gt;
*Cloaking Devices: added responses to being detected using cloaking devices in the station aegis (this OXP now declares it illegal to cloak within main station aegis and introduces a small bounty for the first offence, which will be increased for non-fugitive players each time they are detected still cloaked after the initial offence; however, entering the aegis cloaked and never interacting with the station will not impose a penalty as the traffic controllers are unaware of the trespass); added a 1000 credit fine (or equivalent bounty) to the arrival report when docking at main stations while cloaked (even if fast-docking is used); &lt;br /&gt;
*added considerations for nova systems (traffic control will leave a recording when sun has gone nova) and for Buoy Repair, ILS and AutoDock OXPs&lt;br /&gt;
07/11/2021 - Version 2.01, updated by Milo; fix bug reported by dybal (docking clearance &amp;quot;granted&amp;quot; status was not correctly detected, resulting in unintended behavior, particularly noticeable when combined with ILS OXP)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
The latest version, [[Media:Oolite.oxp.Thargoid.TrafficControl.2.0.1.oxz|Traffic Control v2.0.1]], can be downloaded from the wiki by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
An older version, [http://www.box.com/shared/qah2zp7sq2 '''Traffic Control v1.11'''], can be downloaded from Box.Net by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=20180 BB Thread] (2019-20)&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?p=59662#p59662 Original thread] (2008)&lt;br /&gt;
&lt;br /&gt;
[[File:Tag-colour-blue.png]]{{OXPLevel|0}}&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67172</id>
		<title>Traffic Control OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=67172"/>
		<updated>2021-07-12T00:41:47Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 2.01&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A little script which gives each system main station a traffic control department, whose job it is to guide new Commanders (and a few old hands who have become too reliant on docking computers) on the best route for manual approach and docking into the station. They oversee all traffic from station aegis and planetary approach right up until the actual docking itself. Also they keep an eye on ships leaving the station and wish people a bon voyage. Just don't dally in the approach lane and get in everyone's way, or you'll feel their wrath!&lt;br /&gt;
&lt;br /&gt;
Recommended for new players learning how to dock manually, and for experienced players who want a bit of extra ambience around main stations. It is fully integrated with the docking clearance protocols introduced in Oolite 1.72 (if the stations enable them). Most messages from this OXP will appear only if your ship does not have functional docking computers, but a few will appear regardless, for example: Clear the lane, Commander! If you see a message that starts with 'Traffic Control:' then it is probably from this OXP.&lt;br /&gt;
&lt;br /&gt;
In terms of balance, this OXP is neutral for beginners and slightly biased against the experienced player, because it enforces (with fines and small but escalating bounties) a sensible rule against the use of cloaking devices in proximity to main stations... however, to be fair, it will not impose any penalties if you pass undetected (or at least unidentified). Of course, requesting docking clearance or activating docking computers will transmit your identity to the station...&lt;br /&gt;
&lt;br /&gt;
This OXP is compatible with all other OXPs, and includes considerations for Buoy Repair, ILS and AutoDock if those OXPs are also installed.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
This OXP requires at least version 1.88 of Oolite. &lt;br /&gt;
&lt;br /&gt;
The traffic controllers also assume that any Commander's ship equipped with Docking Computers can look after itself in terms of approach and docking.&lt;br /&gt;
&lt;br /&gt;
==Version History==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
09/10/2008 - Version 1.00, Initial release.&lt;br /&gt;
04/11/2008 - Version 1.01, scripting update for v1.72+ compatibility.&lt;br /&gt;
24/05/2010 - Version 1.10, fortified equipment damage checking for 1.74&lt;br /&gt;
13/02/2011 - Version 1.11, removal of upper limit, to allow running with 1.75&lt;br /&gt;
08/07/2020 - Version 2.00, updated by Milo; set minimum Oolite version to 1.88; &lt;br /&gt;
*fixed errors if navigation buoy is destroyed; &lt;br /&gt;
*corrected planet approach guidance (follow green circle, not square, if ship has a basic compass); &lt;br /&gt;
*added additional hints for new players (until they buy docking computers); &lt;br /&gt;
*set up recurring reminders to &amp;quot;clear the lane&amp;quot; when not supposed to be there; &lt;br /&gt;
*integrated docking advice with docking clearance protocol for main stations that require clearance; &lt;br /&gt;
*added warning messages to fugitive players entering station aegis or requesting docking clearance; &lt;br /&gt;
*Cloaking Devices: added responses to being detected using cloaking devices in the station aegis (this OXP now declares it illegal to cloak within main station aegis and introduces a small bounty for the first offence, which will be increased for non-fugitive players each time they are detected still cloaked after the initial offence; however, entering the aegis cloaked and never interacting with the station will not impose a penalty as the traffic controllers are unaware of the trespass); added a 1000 credit fine (or equivalent bounty) to the arrival report when docking at main stations while cloaked (even if fast-docking is used); &lt;br /&gt;
*added considerations for nova systems (traffic control will leave a recording when sun has gone nova) and for Buoy Repair, ILS and AutoDock OXPs&lt;br /&gt;
07/11/2021 - Version 2.01, updated by Milo; fix bug reported by dybal (docking clearance &amp;quot;granted&amp;quot; status was not correctly detected, resulting in unintended behavior, particularly noticeable when combined with ILS OXP)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
http://wiki.alioth.net/img_auth.php/3/38/Oolite.oxp.Thargoid.TrafficControl.2.0.1.oxz&lt;br /&gt;
The latest version, [[Media:Oolite.oxp.Thargoid.TrafficControl.2.0.1.oxz|Traffic Control v2.0.1]], can be downloaded from the wiki by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
An older version, [http://www.box.com/shared/qah2zp7sq2 '''Traffic Control v1.11'''], can be downloaded from Box.Net by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=20180 BB Thread] (2019-20)&lt;br /&gt;
*[http://www.aegidian.org/bb/viewtopic.php?p=59662#p59662 Original thread] (2008)&lt;br /&gt;
&lt;br /&gt;
[[File:Tag-colour-blue.png]]{{OXPLevel|0}}&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.0.1.oxz&amp;diff=67171</id>
		<title>File:Oolite.oxp.Thargoid.TrafficControl.2.0.1.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.0.1.oxz&amp;diff=67171"/>
		<updated>2021-07-12T00:38:57Z</updated>

		<summary type="html">&lt;p&gt;Milo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.LittleBear.RandomStationNames.0.0.2.oxz&amp;diff=58750</id>
		<title>File:Oolite.oxp.LittleBear.RandomStationNames.0.0.2.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.LittleBear.RandomStationNames.0.0.2.oxz&amp;diff=58750"/>
		<updated>2020-08-05T20:57:17Z</updated>

		<summary type="html">&lt;p&gt;Milo: 0.0.2 update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;0.0.2 update&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.LittleBear.RandomStationNames.0.0.1.oxz&amp;diff=58625</id>
		<title>File:Oolite.oxp.LittleBear.RandomStationNames.0.0.1.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.LittleBear.RandomStationNames.0.0.1.oxz&amp;diff=58625"/>
		<updated>2020-07-28T03:50:18Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 0.0.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 0.0.1&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.Pods.1.48.oxz&amp;diff=58586</id>
		<title>File:Oolite.oxp.Thargoid.Pods.1.48.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.Pods.1.48.oxz&amp;diff=58586"/>
		<updated>2020-07-12T05:34:31Z</updated>

		<summary type="html">&lt;p&gt;Milo: update by Milo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;update by Milo&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Pods_OXP&amp;diff=58585</id>
		<title>Pods OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Pods_OXP&amp;diff=58585"/>
		<updated>2020-07-12T05:34:05Z</updated>

		<summary type="html">&lt;p&gt;Milo: 1.48 update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Overview==&lt;br /&gt;
A general expansion to the Ooniverse, this OXP introduces a number of new [[Cargo Container (Oolite)|cargo pod]] variations. Some are nice, some less so...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==New Pods==&lt;br /&gt;
* Standard containers - some more descriptive variants on the standard 1t cargo pods.&lt;br /&gt;
* Bulk container - larger capacity pod, featuring up to 10 tons of cargo, 100 kilos of metals (gold/platinum) or 200 grammes of gem-stones.&lt;br /&gt;
* Missile pod - again exactly what it says, a missile that can be scooped and added to your arsenal (if you have a free pylon). Usually standard missiles, but sometimes ECM hardened ones for the lucky commander. If scooper not have a free pylon. Then a missile pod will scooped as firearms. If you have a free pylon and it has been scooped missile pod to the cargo hold. If you like, so you can dumping a firearms and scooped for mount to pylon.&lt;br /&gt;
* Fuel pod - similar in nature to the external fuel tank, a pod which can carry up to 3.0 ly of witchspace fuel for your thirsty tanks. Occasionally the fuel has been known to be contaminated, requiring a tank purge.&lt;br /&gt;
* Piggybank pod - some poor soul's personal effects, including their life savings of up to 1000 credits.&lt;br /&gt;
* Empty pod - exactly what it says, either an empty pod or one full of worthless content.&lt;br /&gt;
* Trumble pod - pod containing everyone's favourite burger ingredient.&lt;br /&gt;
* Retry pod - a little annoyance, a pod that doesn't quite scoop right. If all else fails, try try again...&lt;br /&gt;
* Jam pod - no, not a pod full of jam, but when a pod tries to go through a fuel scoop sideways. Pod jams in the scoop, rendering it inoperable until a friendly tech can apply a pry-bar to it in dry-dock.&lt;br /&gt;
* Exploding pod - pod explodes within the ship's shields during scooping. Energy damage done to the ship, and fuel scoops destroyed.&lt;br /&gt;
* Breach pod - pod explodes in hold, causing hull breach. Some cargo may be vented before breach can be repaired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==OXP Pods==&lt;br /&gt;
These are now included within the main pods OXZ (no additional add-on OXP is needed any more). If you have [[UPS Courier]], [[Cargo Wreck Teaser OXP|Cargo Wreck Teaser]] and Svengali [[CCL|Cabal Common Library]] v1.7.1 installed, then some of the cargopods should be from Pods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Technical Information ==&lt;br /&gt;
&lt;br /&gt;
This OXP requires at least version 1.79 of Oolite.&lt;br /&gt;
&lt;br /&gt;
===Download===&lt;br /&gt;
[[Media:oolite.oxp.Thargoid.Pods.1.48.oxz|Pods 1.48]] ({{#downloads:oolite.oxp.Thargoid.Pods.1.48.oxz}} downloads).&lt;br /&gt;
&lt;br /&gt;
Old versions:&lt;br /&gt;
[[Media:Pods.oxz|Pods 1.46]] ({{#downloads:Pods.oxz}} downloads).&lt;br /&gt;
[[Media:Pods_1.35.oxz|Pods 1.35]] ({{#downloads:Pods_1.35.oxz}} downloads).&lt;br /&gt;
&lt;br /&gt;
===License===&lt;br /&gt;
This work is licensed under the Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license with clauses - see readme file.&lt;br /&gt;
&lt;br /&gt;
=== Version History ===&lt;br /&gt;
 19/08/2008 - Version 0.20, Beta-test release version.&lt;br /&gt;
 22/08/2008 - version 1.00, Full release, now with Trumble, piggybank, breach and exploding pods added.&lt;br /&gt;
 31/08/2008 - version 1.01, minor bug fix for the fuel pods fuel leak.&lt;br /&gt;
 04/11/2008 - Version 1.02, scripting update for compatability with v1.72.&lt;br /&gt;
 09/04/2009 - Version 1.03, script tidy-up to prevent error for awarding cargo when hold full. Also tweaked trumblepod.&lt;br /&gt;
 01/11/2009 - Version 1.10, update to add scanclass and some new roles to the pods.&lt;br /&gt;
 18/03/2010 - Version 1.20, update for v1.74 (not compatible with lower versions).&lt;br /&gt;
 13/02/2011 - Version 1.21, removal of upper limit, to allow running with 1.75&lt;br /&gt;
 19/02/2011 - Version 1.22, correction of Manifest / manifest script glitch&lt;br /&gt;
 10/07/2012 - Version 1.30, merged pods and pods_UPS into one, and updated breachpod script (thanks to Eric W). Also added new variants for the standard 1t pods.&lt;br /&gt;
 10/12/2012 - Version 1.31, fixed a few case sensitivity issues for non-Windows OS's.&lt;br /&gt;
 12/12/2012 - Version 1.32, and a few more I missed before.&lt;br /&gt;
 22/12/2012 - Version 1.33, sorted out some [%I] references in description.plist (again thanks Eric!).&lt;br /&gt;
 20/01/2013 - Version 1.34, fixed a couple more references I missed last time (yet again thanks to Eric).&lt;br /&gt;
 07/02/2013 - Version 1.35, added a rogue &amp;quot;s&amp;quot; back into the big kg script (thanks to Plisken for that one!).&lt;br /&gt;
 &lt;br /&gt;
 12/09/2017 - Version 1.36 : update for oolite v1.79 - cag and rustem.&lt;br /&gt;
 - Added logging for error cargo type in pods_standardPod.js.&lt;br /&gt;
 - Edited name of the cargo type in description.plist and script for pods_standardPod.&lt;br /&gt;
 - Edited the scripts: correct name decsriptions, sometimes increased time for display consoleMessage.&lt;br /&gt;
 - Edited the shipdata: for pods_emptyBarrel (and pods_UPS_emptyBarrel) decreased value role of the cargopod from 0.1(0.12) to 0.005.&lt;br /&gt;
 - Edited the shipdata: for pods_missileBarrel decreased value role of the cargopod from 0.05 to 0.005.&lt;br /&gt;
 - Edited the shipdata: for all standart pods decreased value role of the cargopod from 0.5 to 0.05.&lt;br /&gt;
 - Added damage sounds to Jam, Exploding and Breach pods.&lt;br /&gt;
&lt;br /&gt;
 14/09/2017 - Version 1.37, updated by Rustem&lt;br /&gt;
 - Added &amp;quot;use strict&amp;quot; in the scripts.&lt;br /&gt;
 - Improvement of damage sound effect for the correspond pods (thanks cag!).&lt;br /&gt;
 - Add time interval for display consoleMessage of Jam pod (again thanks cag!).&lt;br /&gt;
&lt;br /&gt;
 19/09/2017 - Version 1.38, updated by Rustem&lt;br /&gt;
 - Fixed: replaced hasScoopMessages on the has_scoop_message in the shipdata.&lt;br /&gt;
 - Added no has_scoop_message to: fuelPod, emptyPod, retryPod, jamPod, missilePod, explodingPod, trumblePod (and UPS version also).&lt;br /&gt;
&lt;br /&gt;
 23/10/2017 - Version 1.39, updated by Rustem&lt;br /&gt;
 - Added worldScript for storing all the resources. Added timer for exploding and breach pods (thanks cag!).&lt;br /&gt;
 - Added group roles as brokenpod, bigpod, dampod for application in the other OXPs. Added group role names from UPS Courier OXP.&lt;br /&gt;
 - Rebalanced role weights.&lt;br /&gt;
 - New calculation of the credits for piggybank pod.&lt;br /&gt;
&lt;br /&gt;
 27/10/2017 - Version 1.40, updated by Rustem&lt;br /&gt;
 - Resorting and optimization by template pods in the shipdata.plist.&lt;br /&gt;
 - Added cargopod(hexapod) from CargoWreck OXP like external dependency as broken pods.&lt;br /&gt;
 - Edited group role names for standart pods.&lt;br /&gt;
&lt;br /&gt;
 30/10/2017 - Version 1.41, updated by Rustem&lt;br /&gt;
 - Added big pod(ccl_crateA) and broken pods(ccl_crateB) for cargopod from Svengali CCL OXP like external dependency.&lt;br /&gt;
 - Added model scale factor to big pods.&lt;br /&gt;
 - Fixed shipdata bug for external pods.&lt;br /&gt;
&lt;br /&gt;
 18/11/2017 - Version 1.42, updated by Rustem&lt;br /&gt;
 - Added a routine for checking a setCargo by other OXPs and etc.&lt;br /&gt;
 - Added logging condition in the pod ship.script.&lt;br /&gt;
&lt;br /&gt;
 21/11/2017 - Version 1.43, updated by Rustem&lt;br /&gt;
 - Code refactoring: released an one script for Bulk container with NPC-scooping feature.&lt;br /&gt;
 - Added a routine for checking a shipUniqueName for renew of the pod name (for cargo scanner).&lt;br /&gt;
 - Modified the missilePod script for player-rescooping.&lt;br /&gt;
 - Upgraded all scripts for NPC-scooping.&lt;br /&gt;
&lt;br /&gt;
 01/12/2017 - Version 1.44, updated by Rustem&lt;br /&gt;
 - Added description for communicate.&lt;br /&gt;
 - Fixed bug in the addition cargo to NPC.&lt;br /&gt;
 - Code refactoring.&lt;br /&gt;
&lt;br /&gt;
 16/12/2018 - Version 1.45, updated by Rustem&lt;br /&gt;
 - Logging is off.&lt;br /&gt;
 - Formatted the JS code: scripts.&lt;br /&gt;
 - Fixed ship script for trumble pod (a TypeError for player.awardEquipment in pods_standardPod-1t, pods_trumblePod).&lt;br /&gt;
 - Tweaks in shipdata.plist, adds a materials for missilePod, adds a standartpod role.&lt;br /&gt;
 - Upgraded a scripts for trumblePod.&lt;br /&gt;
&lt;br /&gt;
 20/12/2018 - Version 1.46, updated by Rustem&lt;br /&gt;
 - Adds cargopods from the Griff Cargopods OXP as standart pod and piggybank pod.&lt;br /&gt;
 - Reduce chance to award a trumble in the trumble pod.&lt;br /&gt;
 - Code refactoring of the trumblepod-scooping.&lt;br /&gt;
&lt;br /&gt;
 10/07/2020 - Version 1.47, updated by Milo&lt;br /&gt;
 - Fixed errors in the scripts for the breach pod, jam pod, and exploding pod.&lt;br /&gt;
&lt;br /&gt;
 12/07/2020 - Version 1.48, updated by Milo&lt;br /&gt;
 - Fixed another error in the script for the exploding pod.&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Quick Facts==&lt;br /&gt;
{{OXPLevel|0}}{{Infobox OXPb| title = Pods&lt;br /&gt;
|version = 1.48&lt;br /&gt;
|release = 2020-07-12&lt;br /&gt;
|features = New cargo pods and pod features&lt;br /&gt;
|license = CC BY-NC-SA 3&lt;br /&gt;
|category = Mechanics OXPs&lt;br /&gt;
|author = [[User:Thargoid|Thargoid]], [[User:Rustem|Rustem]] (maintainer), [[User:Milo|Milo]] (maintainer)&lt;br /&gt;
|download = [[Media:oolite.oxp.Thargoid.Pods.1.47.oxz|Download]]&lt;br /&gt;
|feedback = [http://aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=4952 BB-Link]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Gameplay and Balance indicator ==&lt;br /&gt;
[[File:Tag-colour-orange.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.NewtSoup.MiningIFFScannerUpgrade.1.1.3.oxz&amp;diff=58584</id>
		<title>File:Oolite.oxp.NewtSoup.MiningIFFScannerUpgrade.1.1.3.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.NewtSoup.MiningIFFScannerUpgrade.1.1.3.oxz&amp;diff=58584"/>
		<updated>2020-07-10T19:27:11Z</updated>

		<summary type="html">&lt;p&gt;Milo: Update by Milo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update by Milo&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.Pods.1.47.oxz&amp;diff=58583</id>
		<title>File:Oolite.oxp.Thargoid.Pods.1.47.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.Pods.1.47.oxz&amp;diff=58583"/>
		<updated>2020-07-10T19:05:39Z</updated>

		<summary type="html">&lt;p&gt;Milo: Update by Milo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update by Milo&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Pods_OXP&amp;diff=58582</id>
		<title>Pods OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Pods_OXP&amp;diff=58582"/>
		<updated>2020-07-10T19:04:58Z</updated>

		<summary type="html">&lt;p&gt;Milo: Pods 1.47 update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Overview==&lt;br /&gt;
A general expansion to the Ooniverse, this OXP introduces a number of new [[Cargo Container (Oolite)|cargo pod]] variations. Some are nice, some less so...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==New Pods==&lt;br /&gt;
* Standard containers - some more descriptive variants on the standard 1t cargo pods.&lt;br /&gt;
* Bulk container - larger capacity pod, featuring up to 10 tons of cargo, 100 kilos of metals (gold/platinum) or 200 grammes of gem-stones.&lt;br /&gt;
* Missile pod - again exactly what it says, a missile that can be scooped and added to your arsenal (if you have a free pylon). Usually standard missiles, but sometimes ECM hardened ones for the lucky commander. If scooper not have a free pylon. Then a missile pod will scooped as firearms. If you have a free pylon and it has been scooped missile pod to the cargo hold. If you like, so you can dumping a firearms and scooped for mount to pylon.&lt;br /&gt;
* Fuel pod - similar in nature to the external fuel tank, a pod which can carry up to 3.0 ly of witchspace fuel for your thirsty tanks. Occasionally the fuel has been known to be contaminated, requiring a tank purge.&lt;br /&gt;
* Piggybank pod - some poor soul's personal effects, including their life savings of up to 1000 credits.&lt;br /&gt;
* Empty pod - exactly what it says, either an empty pod or one full of worthless content.&lt;br /&gt;
* Trumble pod - pod containing everyone's favourite burger ingredient.&lt;br /&gt;
* Retry pod - a little annoyance, a pod that doesn't quite scoop right. If all else fails, try try again...&lt;br /&gt;
* Jam pod - no, not a pod full of jam, but when a pod tries to go through a fuel scoop sideways. Pod jams in the scoop, rendering it inoperable until a friendly tech can apply a pry-bar to it in dry-dock.&lt;br /&gt;
* Exploding pod - pod explodes within the ship's shields during scooping. Energy damage done to the ship, and fuel scoops destroyed.&lt;br /&gt;
* Breach pod - pod explodes in hold, causing hull breach. Some cargo may be vented before breach can be repaired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==OXP Pods==&lt;br /&gt;
These are now included within the main pods OXZ (no additional add-on OXP is needed any more). If you have [[UPS Courier]], [[Cargo Wreck Teaser OXP|Cargo Wreck Teaser]] and Svengali [[CCL|Cabal Common Library]] v1.7.1 installed, then some of the cargopods should be from Pods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Technical Information ==&lt;br /&gt;
&lt;br /&gt;
This OXP requires at least version 1.79 of Oolite.&lt;br /&gt;
&lt;br /&gt;
===Download===&lt;br /&gt;
[[Media:oolite.oxp.Thargoid.Pods.1.47.oxz|Pods 1.47]] ({{#downloads:oolite.oxp.Thargoid.Pods.1.47.oxz}} downloads).&lt;br /&gt;
&lt;br /&gt;
Old versions:&lt;br /&gt;
[[Media:Pods.oxz|Pods 1.46]] ({{#downloads:Pods.oxz}} downloads).&lt;br /&gt;
[[Media:Pods_1.35.oxz|Pods 1.35]] ({{#downloads:Pods_1.35.oxz}} downloads).&lt;br /&gt;
&lt;br /&gt;
===License===&lt;br /&gt;
This work is licensed under the Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license with clauses - see readme file.&lt;br /&gt;
&lt;br /&gt;
=== Version History ===&lt;br /&gt;
 19/08/2008 - Version 0.20, Beta-test release version.&lt;br /&gt;
 22/08/2008 - version 1.00, Full release, now with Trumble, piggybank, breach and exploding pods added.&lt;br /&gt;
 31/08/2008 - version 1.01, minor bug fix for the fuel pods fuel leak.&lt;br /&gt;
 04/11/2008 - Version 1.02, scripting update for compatability with v1.72.&lt;br /&gt;
 09/04/2009 - Version 1.03, script tidy-up to prevent error for awarding cargo when hold full. Also tweaked trumblepod.&lt;br /&gt;
 01/11/2009 - Version 1.10, update to add scanclass and some new roles to the pods.&lt;br /&gt;
 18/03/2010 - Version 1.20, update for v1.74 (not compatible with lower versions).&lt;br /&gt;
 13/02/2011 - Version 1.21, removal of upper limit, to allow running with 1.75&lt;br /&gt;
 19/02/2011 - Version 1.22, correction of Manifest / manifest script glitch&lt;br /&gt;
 10/07/2012 - Version 1.30, merged pods and pods_UPS into one, and updated breachpod script (thanks to Eric W). Also added new variants for the standard 1t pods.&lt;br /&gt;
 10/12/2012 - Version 1.31, fixed a few case sensitivity issues for non-Windows OS's.&lt;br /&gt;
 12/12/2012 - Version 1.32, and a few more I missed before.&lt;br /&gt;
 22/12/2012 - Version 1.33, sorted out some [%I] references in description.plist (again thanks Eric!).&lt;br /&gt;
 20/01/2013 - Version 1.34, fixed a couple more references I missed last time (yet again thanks to Eric).&lt;br /&gt;
 07/02/2013 - Version 1.35, added a rogue &amp;quot;s&amp;quot; back into the big kg script (thanks to Plisken for that one!).&lt;br /&gt;
 &lt;br /&gt;
 12/09/2017 - Version 1.36 : update for oolite v1.79 - cag and rustem.&lt;br /&gt;
 - Added logging for error cargo type in pods_standardPod.js.&lt;br /&gt;
 - Edited name of the cargo type in description.plist and script for pods_standardPod.&lt;br /&gt;
 - Edited the scripts: correct name decsriptions, sometimes increased time for display consoleMessage.&lt;br /&gt;
 - Edited the shipdata: for pods_emptyBarrel (and pods_UPS_emptyBarrel) decreased value role of the cargopod from 0.1(0.12) to 0.005.&lt;br /&gt;
 - Edited the shipdata: for pods_missileBarrel decreased value role of the cargopod from 0.05 to 0.005.&lt;br /&gt;
 - Edited the shipdata: for all standart pods decreased value role of the cargopod from 0.5 to 0.05.&lt;br /&gt;
 - Added damage sounds to Jam, Exploding and Breach pods.&lt;br /&gt;
&lt;br /&gt;
 14/09/2017 - Version 1.37, updated by Rustem&lt;br /&gt;
 - Added &amp;quot;use strict&amp;quot; in the scripts.&lt;br /&gt;
 - Improvement of damage sound effect for the correspond pods (thanks cag!).&lt;br /&gt;
 - Add time interval for display consoleMessage of Jam pod (again thanks cag!).&lt;br /&gt;
&lt;br /&gt;
 19/09/2017 - Version 1.38, updated by Rustem&lt;br /&gt;
 - Fixed: replaced hasScoopMessages on the has_scoop_message in the shipdata.&lt;br /&gt;
 - Added no has_scoop_message to: fuelPod, emptyPod, retryPod, jamPod, missilePod, explodingPod, trumblePod (and UPS version also).&lt;br /&gt;
&lt;br /&gt;
 23/10/2017 - Version 1.39, updated by Rustem&lt;br /&gt;
 - Added worldScript for storing all the resources. Added timer for exploding and breach pods (thanks cag!).&lt;br /&gt;
 - Added group roles as brokenpod, bigpod, dampod for application in the other OXPs. Added group role names from UPS Courier OXP.&lt;br /&gt;
 - Rebalanced role weights.&lt;br /&gt;
 - New calculation of the credits for piggybank pod.&lt;br /&gt;
&lt;br /&gt;
 27/10/2017 - Version 1.40, updated by Rustem&lt;br /&gt;
 - Resorting and optimization by template pods in the shipdata.plist.&lt;br /&gt;
 - Added cargopod(hexapod) from CargoWreck OXP like external dependency as broken pods.&lt;br /&gt;
 - Edited group role names for standart pods.&lt;br /&gt;
&lt;br /&gt;
 30/10/2017 - Version 1.41, updated by Rustem&lt;br /&gt;
 - Added big pod(ccl_crateA) and broken pods(ccl_crateB) for cargopod from Svengali CCL OXP like external dependency.&lt;br /&gt;
 - Added model scale factor to big pods.&lt;br /&gt;
 - Fixed shipdata bug for external pods.&lt;br /&gt;
&lt;br /&gt;
 18/11/2017 - Version 1.42, updated by Rustem&lt;br /&gt;
 - Added a routine for checking a setCargo by other OXPs and etc.&lt;br /&gt;
 - Added logging condition in the pod ship.script.&lt;br /&gt;
&lt;br /&gt;
 21/11/2017 - Version 1.43, updated by Rustem&lt;br /&gt;
 - Code refactoring: released an one script for Bulk container with NPC-scooping feature.&lt;br /&gt;
 - Added a routine for checking a shipUniqueName for renew of the pod name (for cargo scanner).&lt;br /&gt;
 - Modified the missilePod script for player-rescooping.&lt;br /&gt;
 - Upgraded all scripts for NPC-scooping.&lt;br /&gt;
&lt;br /&gt;
 01/12/2017 - Version 1.44, updated by Rustem&lt;br /&gt;
 - Added description for communicate.&lt;br /&gt;
 - Fixed bug in the addition cargo to NPC.&lt;br /&gt;
 - Code refactoring.&lt;br /&gt;
&lt;br /&gt;
 16/12/2018 - Version 1.45, updated by Rustem&lt;br /&gt;
 - Logging is off.&lt;br /&gt;
 - Formatted the JS code: scripts.&lt;br /&gt;
 - Fixed ship script for trumble pod (a TypeError for player.awardEquipment in pods_standardPod-1t, pods_trumblePod).&lt;br /&gt;
 - Tweaks in shipdata.plist, adds a materials for missilePod, adds a standartpod role.&lt;br /&gt;
 - Upgraded a scripts for trumblePod.&lt;br /&gt;
&lt;br /&gt;
 20/12/2018 - Version 1.46, updated by Rustem&lt;br /&gt;
 - Adds cargopods from the Griff Cargopods OXP as standart pod and piggybank pod.&lt;br /&gt;
 - Reduce chance to award a trumble in the trumble pod.&lt;br /&gt;
 - Code refactoring of the trumblepod-scooping.&lt;br /&gt;
&lt;br /&gt;
 10/07/2020 - Version 1.47, updated by Milo&lt;br /&gt;
 - Fixed errors in the scripts for the breach pod, jam pod, and exploding pod.&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Quick Facts==&lt;br /&gt;
{{OXPLevel|0}}{{Infobox OXPb| title = Pods&lt;br /&gt;
|version = 1.47&lt;br /&gt;
|release = 2018-12-20&lt;br /&gt;
|features = New cargo pods and pod features&lt;br /&gt;
|license = CC BY-NC-SA 3&lt;br /&gt;
|category = Mechanics OXPs&lt;br /&gt;
|author = [[User:Thargoid|Thargoid]], [[User:Rustem|Rustem]] (maintainer), [[User:Milo|Milo]] (maintainer)&lt;br /&gt;
|download = [[Media:oolite.oxp.Thargoid.Pods.1.47.oxz|Download]]&lt;br /&gt;
|feedback = [http://aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=4952 BB-Link]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Gameplay and Balance indicator ==&lt;br /&gt;
[[File:Tag-colour-orange.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=58581</id>
		<title>Traffic Control OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=58581"/>
		<updated>2020-07-09T02:49:12Z</updated>

		<summary type="html">&lt;p&gt;Milo: more detailed description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A little script which gives each system main station a traffic control department, whose job it is to guide new Commanders (and a few old hands who have become too reliant on docking computers) on the best route for manual approach and docking into the station. They oversee all traffic from station aegis and planetary approach right up until the actual docking itself. Also they keep an eye on ships leaving the station and wish people a bon voyage. Just don't dally in the approach lane and get in everyone's way, or you'll feel their wrath!&lt;br /&gt;
&lt;br /&gt;
Recommended for new players learning how to dock manually, and for experienced players who want a bit of extra ambience around main stations. It is fully integrated with the docking clearance protocols introduced in Oolite 1.72 (if the stations enable them). Most messages from this OXP will appear only if your ship does not have functional docking computers, but a few will appear regardless, for example: Clear the lane, Commander! If you see a message that starts with 'Traffic Control:' then it is probably from this OXP.&lt;br /&gt;
&lt;br /&gt;
In terms of balance, this OXP is neutral for beginners and slightly biased against the experienced player, because it enforces (with fines and small but escalating bounties) a sensible rule against the use of cloaking devices in proximity to main stations... however, to be fair, it will not impose any penalties if you pass undetected (or at least unidentified). Of course, requesting docking clearance or activating docking computers will transmit your identity to the station...&lt;br /&gt;
&lt;br /&gt;
This OXP is compatible with all other OXPs, and includes considerations for Buoy Repair, ILS and AutoDock if those OXPs are also installed.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
This OXP requires at least version 1.88 of Oolite. &lt;br /&gt;
&lt;br /&gt;
The traffic controllers also assume that any Commander's ship equipped with Docking Computers can look after itself in terms of approach and docking.&lt;br /&gt;
&lt;br /&gt;
==Version History==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
09/10/2008 - Version 1.00, Initial release.&lt;br /&gt;
04/11/2008 - Version 1.01, scripting update for v1.72+ compatibility.&lt;br /&gt;
24/05/2010 - Version 1.10, fortified equipment damage checking for 1.74&lt;br /&gt;
13/02/2011 - Version 1.11, removal of upper limit, to allow running with 1.75&lt;br /&gt;
08/07/2020 - Version 2.00, updated by Milo; set minimum Oolite version to 1.88; fixed errors if navigation buoy is destroyed; corrected planet approach guidance (follow green circle, not square, if ship has a basic compass); added additional hints for new players (until they buy docking computers); set up recurring reminders to &amp;quot;clear the lane&amp;quot; when not supposed to be there; integrated docking advice with docking clearance protocol for main stations that require clearance; added warning messages to fugitive players entering station aegis or requesting docking clearance; added responses to being detected using cloaking devices in the station aegis (this OXP now declares it illegal to cloak within main station aegis and introduces a small bounty for the first offence, which will be increased for non-fugitive players each time they are detected still cloaked after the initial offence; however, entering the aegis cloaked and never interacting with the station will not impose a penalty as the traffic controllers are unaware of the trespass); added a 1000 credit fine (or equivalent bounty) to the arrival report when docking at main stations while cloaked (even if fast-docking is used); added considerations for nova systems (traffic control will leave a recording when sun has gone nova) and for Buoy Repair, ILS and AutoDock OXPs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
The latest version, [[Media:Oolite.oxp.Thargoid.TrafficControl.2.0.0.oxz|Traffic Control v2.0.0]], can be downloaded from the wiki by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
The previous version, [http://www.box.com/shared/qah2zp7sq2 '''Traffic Control v1.11'''], can be downloaded from Box.Net by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=58580</id>
		<title>Traffic Control OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Traffic_Control_OXP&amp;diff=58580"/>
		<updated>2020-07-09T02:41:36Z</updated>

		<summary type="html">&lt;p&gt;Milo: Traffic Control 2.0.0 release&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A little script which gives each system main station a traffic control department, whose job it is to guide new Commanders (and a few old hands who have become too reliant on docking computers) on the best route for manual approach and docking into the station. They oversee all traffic from station aegis and planetary approach right up until the actual docking itself. Also they keep an eye on ships leaving the station and wish people a bon voyage. Just don't dally in the approach lane and get in everyone's way, or you'll feel their wrath!&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
This OXP requires at least version 1.88 of Oolite. &lt;br /&gt;
&lt;br /&gt;
The traffic controllers also assume that any Commander's ship equipped with Docking Computers can look after itself in terms of approach and docking.&lt;br /&gt;
&lt;br /&gt;
==Version History==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
09/10/2008 - Version 1.00, Initial release.&lt;br /&gt;
04/11/2008 - Version 1.01, scripting update for v1.72+ compatibility.&lt;br /&gt;
24/05/2010 - Version 1.10, fortified equipment damage checking for 1.74&lt;br /&gt;
13/02/2011 - Version 1.11, removal of upper limit, to allow running with 1.75&lt;br /&gt;
08/07/2020 - Version 2.00, updated by Milo; set minimum Oolite version to 1.88; fixed errors if navigation buoy is destroyed; corrected planet approach guidance (follow green circle, not square, if ship has a basic compass); added additional hints for new players (until they buy docking computers); set up recurring reminders to &amp;quot;clear the lane&amp;quot; when not supposed to be there; integrated docking advice with docking clearance protocol for main stations that require clearance; added warning messages to fugitive players entering station aegis or requesting docking clearance; added responses to being detected using cloaking devices in the station aegis (this OXP now declares it illegal to cloak within main station aegis and introduces a small bounty for the first offence, which will be increased for non-fugitive players each time they are detected still cloaked after the initial offence; however, entering the aegis cloaked and never interacting with the station will not impose a penalty as the traffic controllers are unaware of the trespass); added a 1000 credit fine (or equivalent bounty) to the arrival report when docking at main stations while cloaked (even if fast-docking is used); added considerations for nova systems (traffic control will leave a recording when sun has gone nova) and for Buoy Repair, ILS and AutoDock OXPs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
The latest version, [[Media:Oolite.oxp.Thargoid.TrafficControl.2.0.0.oxz|Traffic Control v2.0.0]], can be downloaded from the wiki by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
The previous version, [http://www.box.com/shared/qah2zp7sq2 '''Traffic Control v1.11'''], can be downloaded from Box.Net by clicking on the link.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
{{mechanics-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.0.0.oxz&amp;diff=58579</id>
		<title>File:Oolite.oxp.Thargoid.TrafficControl.2.0.0.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.TrafficControl.2.0.0.oxz&amp;diff=58579"/>
		<updated>2020-07-09T02:35:30Z</updated>

		<summary type="html">&lt;p&gt;Milo: Update by Milo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update by Milo&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.NewtSoup.MiningIFFScannerUpgrade.1.1.2.oxz&amp;diff=58578</id>
		<title>File:Oolite.oxp.NewtSoup.MiningIFFScannerUpgrade.1.1.2.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.NewtSoup.MiningIFFScannerUpgrade.1.1.2.oxz&amp;diff=58578"/>
		<updated>2020-07-09T00:50:05Z</updated>

		<summary type="html">&lt;p&gt;Milo: Update by Milo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update by Milo&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Career_Options&amp;diff=58577</id>
		<title>Career Options</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Career_Options&amp;diff=58577"/>
		<updated>2020-07-08T18:57:40Z</updated>

		<summary type="html">&lt;p&gt;Milo: /* OXP's to help with or enhance mining */ corrected link for Mining IFF Scanner Upgrade (it was linked to the freight train OXP thread)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Oolite is built specifically with no plot or overall mission in place. The only plot is what you, the pilot, bring to the game (aside from any mission OXP's you might have installed). The game doesn't tell you where to go, what to be, how to play - it's completely up to you...&lt;br /&gt;
&lt;br /&gt;
...up to a point. Oolite does have limits in what it can allow you to do. For instance, there is no option (nor will there likely be one) to become a backyard landscaper or an accountant. But within the limits of the game, there is still a number of options available to you. &lt;br /&gt;
&lt;br /&gt;
It should be noted that none of these careers are mutually exclusive to the others. For instance, it's possible to be a passenger ferry and opportunistic trader at the same time. &lt;br /&gt;
&lt;br /&gt;
In each section there is a small list of OXP's that can help or enhance that career option. Please make sure you read all the documentation about these OXP's before you install them. There may be unexpected consequences from adding them. For instance, installing the Bounty System will change how your offender status is treated. These lists are not to be considered as some form of recommendation, or even a complete list of OXP's for each career. They are merely a starting point for finding OXP additions that might be suitable for that career in your play experience. The links will take you to the page that describes the OXP. Read this information carefully before you install the OXP.&lt;br /&gt;
&lt;br /&gt;
For a full list of OXP's you can visit [http://oolite.org/oxps oolite.org/oxps], which lists all the OXP's that can be downloaded directly from within the game, or go to the [[OXP List]] which lists pretty much everything else.&lt;br /&gt;
&lt;br /&gt;
==Trader==&lt;br /&gt;
Trading (the action of buying and selling [[Commodities|commodities]]) is the first career almost every pilot is likely to choose, as it provides the most expedient and predictable path to credits, but there are different types of trader. Here we'll look at the most prominent ones. For all trading careers, cargo space is critical - the more space you have, the more cargo you can buy/sell, and therefore the greater the profits. For a [[Cobra_Mk.3_(Oolite)|Cobra Mk III]], the default 20t of space is OK for when you're starting out, but it will soon feel small. The [[Cargo Bay Expansion]] (400cr from TL2 systems) will add an extra 15t, but even at 35t, you might find it difficult to do serious trading. Many players who pursue a trading career will find changing their ship to a [[Python_(Oolite)|Python]] (100t), [[Boa_(Oolite)|Boa]] (125t), [[Boa_2_Class_Cruiser|Boa Class Cruiser]] (175t) or an [[Anaconda_(Oolite)|Anaconda]] (750t), is an essential move as soon as sufficient funds are available for the purchase, and is all the more important if additional careers, like [[Career_Options#Passenger_Transporting|passenger transporting]], are pursued.&lt;br /&gt;
&lt;br /&gt;
===Bulk Trader===&lt;br /&gt;
The logic is simple enough - buy lots of cargo at low prices, sell it for a higher price. Finding the best deals is the trickiest part of the process (other than getting to each station alive - that can be tricky too).&lt;br /&gt;
&lt;br /&gt;
In most cases, though, the secret is finding systems with opposite economies, reasonably close together. A rich industrial (RI) close to a poor agricultural (PA) will provide the best profits: buying computers cheaply at the RI, selling them at the PA, then buying furs cheaply and selling them back at the RI. This is what's known as a &amp;quot;milk run&amp;quot;, and there are tools out there to help you find them.&lt;br /&gt;
&lt;br /&gt;
Swapping back and forth between two systems can be a little monotonous, so your other option is to find a trade route where a series of systems have opposite economies,&lt;br /&gt;
&lt;br /&gt;
===Contract Trader===&lt;br /&gt;
This type of trader uses the [[Contracts#Cargo_Contracts|cargo contracts]] page to take on specific deliveries of cargo to specific systems, within a given timeframe. The benefits for this type of trader come when your reputation starts to increase. The better your reputation, the more profitable are the contracts that will be offered to you. &lt;br /&gt;
&lt;br /&gt;
Once your reputation starts to increase, look for contracts on gold, platinum or gem-stones. Because of the much smaller cargo space requirement for these commodities, more contracts can be accepted on each run, meaning far larger profits at the other end.&lt;br /&gt;
&lt;br /&gt;
If you lose part of your contracted cargo on route to the destination, don't fret. You can buy the difference at any station, and it will count towards the total amount. As long as you arrive at the destination with the right amount of cargo, you will complete the contract successfully.&lt;br /&gt;
&lt;br /&gt;
Be aware of the impact of using an [[Escape_Pod|escape pod]]. A large amount of time can transpire between launching and getting back to the dock, which might have a bearing on any deadlines you have. Also, unless your cargo is gold, platinum or gem-stones, you will lose all your cargo when you eject. To complete the contract successfully you will need to repurchase all the stock from wherever you can find it. And even some gold, platinum and gem-stones could be lost, if their amounts are larger than 500kg for gold or platinum, or 1000g for gem-stones, as amounts over those values will take up cargo space, rather than being contained by the ship's safe, which is kept on the escape pod.&lt;br /&gt;
&lt;br /&gt;
===Opportunistic Trader===&lt;br /&gt;
An opportunistic trader is one that only trades when a particular opportunity presents itself. Normally, an opportunistic trader is also doing something else (like being a courier or bounty hunter), so they won't be scouring the galaxy for the best deals. Rather they will pick up any cargo they find and sell it, or they might notice that computers are cheap, so they buy a few tons and then when they see a good sell price on their travels, get the profit then. &lt;br /&gt;
&lt;br /&gt;
An opportunistic trader is looking to simply supplement other income with some money on the side. There is a benefit to doing some of this type of trading, even if your primary focus is something else - other traders will notice. The more trading you do, the more likely it is that other ships will consider you as a trader, which can have benefits in a skirmish where there are multiple sides. If another trader considers you to be a trader as well, they are more likely to fight with you.&lt;br /&gt;
&lt;br /&gt;
A [[Fuel_Scoops|fuel scoop]] is almost a requirement for the opportunistic trader, particularly if you want to take advantage of any cargo left behind in space. Fuel scoops can be purchased in any TL6 system for 525cr.&lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance trading===&lt;br /&gt;
* [[MarketObserver|Market Observer]] enhances the market screen with valuable data, like average prices and % differences.&lt;br /&gt;
* [[Market Inquirer]] adds an interface screen (f4) that shows the distances in system and an interface screen that shows the markets (prices and quantities) of the main station and selected stations closest to the player.&lt;br /&gt;
* [[In_System_Trader|In-System trader]] introduces a &amp;quot;living market&amp;quot; to systems with rewards and risks for in-system trading.&lt;br /&gt;
* [[Display Current Course]] adds your currently plotted course to any mission map screen, so you can tell whether the destination for the new mission is close to where you are currently heading.&lt;br /&gt;
* [[GalCop Galactic Registry]] gives pilots access to chart-wide system data, allowing them to quickly analyse routes and regions, which can aid in plotting trade routes.&lt;br /&gt;
* There are plenty of OXP ships that have increased cargo capacity. Check out the [[Largest_Ships_(Oolite)|Largest Ships]] list for some examples.&lt;br /&gt;
&lt;br /&gt;
==Smuggling==&lt;br /&gt;
While this could be considered a variation on a trading career, the different play-style required to pursue this option really makes it quite separate. &lt;br /&gt;
&lt;br /&gt;
Smuggling involves trading in illegal goods: slaves, firearms, and narcotics. You can freely dock at any station with these commodities on board, but if you launch your ship with any of them, you will be tagged as an offender, with the size of the penalty related to the amount and type of illegal goods you're carrying.&lt;br /&gt;
&lt;br /&gt;
Illegal goods can sometimes have spectacular profits. Narcotics in particular can be bought in some systems for less than a single credit, and sold in others for over 100. However, these deals are hard to find.&lt;br /&gt;
&lt;br /&gt;
Rock Hermits can provide safe places to dock, and they sometimes have good prices on illegal goods. &lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance smuggling===&lt;br /&gt;
* Any of the additional station OXP's can provide extra docking options for smugglers. See the [http://wiki.alioth.net/index.php/Category:Dockables_OXPs Dockables] page for some examples.&lt;br /&gt;
* [[Smugglers - The Galactic Underworld]] introduces smuggling compartments, bribing docking authorities, while at the same time can potentially make any commodity illegal.&lt;br /&gt;
* [[Illegal_Goods_Tweak_OXP|Illegal Goods Tweak]] changes the way illegal goods are processed when you dock at stations.&lt;br /&gt;
&lt;br /&gt;
==Courier==&lt;br /&gt;
Parcel couriers take small packages from one system to another for a given price. These opportunities are offered via the [[Contracts#Parcel_Contracts|parcel contracts]] page. As you complete more and more of these contracts, your reputation will increase and better contracts will be offered. &lt;br /&gt;
&lt;br /&gt;
Because of their small size, there is no limit to the number of parcel contracts you can accept, if you believe you can deliver them on time. Parcels will be stored with your [[Escape_Pod|escape pod]] if you have one installed and are forced to eject. Be aware, though, that a lot of time can pass when an escape pod is used, which might make it hard (or even impossible) to reach the destinations on time.&lt;br /&gt;
&lt;br /&gt;
The biggest threat to couriers are assassins. Sometimes, someone doesn't want a parcel delivered, and they will instruct assassins to hunt down and kill anyone attempting to do so. You will normally encounter these ships somewhere around the witchpoint of a system, where they lie in wait for targets. Assassins will generally have a &amp;quot;clean&amp;quot; status, which can cause complications with the police should a battle be observed by them. Depending on a number of factors, police may decide that you are the guilty party, not the assassin, and slap you with a bounty. The best advice in these situations is to (a) keep a watch for police ships when you get into a fight with assassins, and (b) if you see any, make sure the police can see the assassins shooting at you, and don't shoot at the assassins until they have shot and hit your ship. &lt;br /&gt;
&lt;br /&gt;
Some courier contracts are more dangerous than others, but with careful observation it should become clear which contracts are likely to attract unwanted attention.&lt;br /&gt;
&lt;br /&gt;
Speed is your friend, and many pilots who really pursue a courier career find changing their ship to something faster, like an [[Asp_(Oolite)|Asp]], can be beneficial. [[Witchdrive_Fuel_Injectors|Fuel Injectors]] are also a valuable piece of kit, enabling you to outrun many of the threats you will encounter.&lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance courier contracts===&lt;br /&gt;
* [[Display Current Course]] adds your currently plotted course to any mission map screen, so you can tell whether the destination for the new mission is close to where you are currently heading.&lt;br /&gt;
* [[GalCop Galactic Registry]] gives pilots access to chart-wide system data, allowing them to quickly analyse routes and regions, which can aid in determining where dangerous routes might lie and how to avoid them.&lt;br /&gt;
* There are plenty of OXP ships that have a high maximum speed. Check out the [[Fastest_Ships_(Oolite)|Fastest Ships]] list for some examples.&lt;br /&gt;
&lt;br /&gt;
==Passenger Transporting==&lt;br /&gt;
Passenger transporting involves taking sentient beings from one system to another. These opportunities are offered via the [[Contracts#Passenger_Contracts|passenger contracts]] page. In order to accept any passenger contract, you must have at least one free [[Passenger_Berth|passenger berth]], which can be purchased from any TL6 or greater system for 825cr. Each berth takes up 5t of cargo space.&lt;br /&gt;
&lt;br /&gt;
As you complete passenger contracts, your reputation will increase, which will result in better contracts being offered.&lt;br /&gt;
&lt;br /&gt;
Passengers will be auto-transferred to your escape pod in the event you are forced to use it. As noted above, be aware that a lot of time can pass when an escape pod is used, which might make it hard (or even impossible) to reach the destinations on time.&lt;br /&gt;
&lt;br /&gt;
Assassins can also target particular passengers, so the advice for couriers applies here as well. Again, with careful observation it should become clear which contracts are likely to be the dangerous ones.&lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance passenger contracts===&lt;br /&gt;
* [[Display Current Course]] adds your currently plotted course to any mission map screen, so you can tell whether the destination for the new mission is close to where you are currently heading.&lt;br /&gt;
* [[GalCop Galactic Registry]] gives pilots access to chart-wide system data, allowing them to quickly analyse routes and regions, which can aid in determining where dangerous routes might lie and how to avoid them.&lt;br /&gt;
* [[Taxi Galactica]] adds some additional specialised passenger contracts.&lt;br /&gt;
* [[In-System Taxi]] adds passenger contracts that are only for travel between stations in the current system.&lt;br /&gt;
* [[Enhanced Passenger Contracts]] adds some extra flavour to passenger contracts, with additional contract stipulations and in-game communications.&lt;br /&gt;
&lt;br /&gt;
==Miner==&lt;br /&gt;
Mining asteroids involves first finding some, then shooting at the large ones to reduce them to boulders, then shooting the boulders to reduce them to splinters, and then scooping the splinters and selling the results. Two pieces of equipment are required: a [[Mining_Laser|mining laser]], which can be purchased in TL11 systems for 800cr, and a [[Fuel_Scoops|fuel scoop]], which can be purchased in TL6 systems for 525cr. You can technically use any laser to shoot the asteroids, but only a mining laser will reliably give you splinters to scoop. &lt;br /&gt;
&lt;br /&gt;
Sometimes, the hardest part of the job is finding asteroids to shoot at. The planet-to-sun spacelane is probably your best starting point for searching.&lt;br /&gt;
&lt;br /&gt;
Once you have some splinters scooped, your next task is selling them. Given you haven't spent any money getting them (other than the setup costs for your ship), you can sell them anywhere and get a profit. But mining is a slow process, so it's still in your best interests to do your mining in systems that have good prices on alloys and minerals. &lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance mining===&lt;br /&gt;
* [[Asteroid Tweaks]] can help with ensuring there are always asteroids to mine.&lt;br /&gt;
* [[Ore Processor]] helps by refining them splinters as you scoop them&lt;br /&gt;
* [[Waypoint Here]] can help by letting you mark points in a system (for instance, where a large asteroid field is located) so you can easily find your way back.&lt;br /&gt;
* [http://aegidian.org/bb/viewtopic.php?f=4&amp;amp;t=19010 Mining IFF Scanner Upgrade] changes the colours of boulders and splinters on the scanner, making them easier to identify.&lt;br /&gt;
* [[Mining_Contracts_OXP|Mining Contracts]] offers contracts to players, in which they need to mine a certain quantity of minerals or alloys by a certain time.&lt;br /&gt;
* [[Miner Cobra]] is a ship set up specifically with mining in mind. It will be offered for sale at some stations.&lt;br /&gt;
* [[Start Choices]] give players the option of starting out in a ship set up for mining.&lt;br /&gt;
* [[Laser Mount Switching System]] helps overcome the issue of which mount will you place your mining laser, by allowing you to have a normal laser and a mining laser installed in one position, and then swapping between them during flight.&lt;br /&gt;
* [[Bulk Cargo Processor]] can help quickly get rid of worthless commodities that might be filling up your cargo hold.&lt;br /&gt;
&lt;br /&gt;
==Bounty Hunter==&lt;br /&gt;
A bounty hunter tracks down and destroys ships that currently have a legal status of offender or fugitive. When the ship is destroyed, the bounty on that ship is paid to you. Identifying ships that have a bounty can be tricky, especially without the [[Scanner Targeting Enhancement]]. Look for groups of ships loitering on the witchpoint-to-planet spacelane - there is a high chance these ships will be pirates.&lt;br /&gt;
&lt;br /&gt;
While a career in bounty hunting can be started at almost any time, it is highly advisable to have some upgraded attack and defence options on your ship: a beam laser, some shield and energy enhancements. It is also highly recommended that the Scanner Targeting Enhancement is purchased, as this can provide some crucial information to the HUD to help with identifying potential targets. The [[Scanner_Targeting_Enhancement|STE]] can be purchased from any TL12 system for 450cr.&lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance bounty hunting===&lt;br /&gt;
* [[Bounty System]] introduces a Warrant Scanner, which can scan ships in search of any bounties those ships might have picked up in other systems.&lt;br /&gt;
* [[Random Hits]] adds &amp;quot;Seedy Space Bars&amp;quot; to Anarchy systems, and from these stations you can take on contract kills. You will be given a target, and be told where to find that target. Your job will be to travel to the destination, find the target and kill them. &lt;br /&gt;
* [[GalCop's Most Wanted]] is an addition to the [[Bounty System]] OXP, and adds persisent NPC ships that can be tracked around the chart. These NPC's have large bounties on their heads, so finding them can be quite rewarding. Note that the Bounty system changes the way bounties are recorded by making crimes persist (that is, your offender status will not degrade slowly with each jump).&lt;br /&gt;
&lt;br /&gt;
==Pirate==&lt;br /&gt;
Piracy involves shooting at peaceful, clean-rated trading ships so that they dump some of their cargo for you to scoop. Completely destroying ships can also be profitable, especially larger trade-focused vessels like [[Python_(Oolite)|Pythons]], [[Boa_(Oolite)|Boas]] and [[Anaconda_(Oolite)|Anacondas]], as cargo will often float free of the wreck. In both cases, [[Fuel_Scoops|fuel scoops]] are essential in order to collect all of this drifting cargo. Fuel scoops can be purchased in any TL6 system for 525cr. &lt;br /&gt;
&lt;br /&gt;
Theoretically, this career is open to players as soon as they start the game, as long as they're careful who they shoot at, but to have any chance at a long life as a pirate you really need an upgraded ship. Shields, energy banks, lasers, injectors, everything you can get your hands on really. A successful pirate is an &amp;quot;Iron-Assed&amp;quot; pirate.&lt;br /&gt;
&lt;br /&gt;
Pirates usually get involved in [[Career_Options#Smuggling|smuggling]] activities, as illegal goods can fetch good prices, and are regularly left behind by fleeing traders.&lt;br /&gt;
&lt;br /&gt;
The life of a pirate is a hard one. There aren't many &amp;quot;clean&amp;quot; pirates out there - the longer you pursue this life, the more likely it is you'll end up as an offender or a fugitive. This makes you a target for bounty hunters and police, and can make docking at a main station a tricky endeavour. Rock Hermits are your friends here, and learning how to find them will be one of the first things you will need to do. However, your bounty will decrease with each jump, so it will not take long to return to a &amp;quot;clean&amp;quot; state. Having a [[Fuel_Scoops|fuel scoop]] can be extremely valuable, as it can let you refuel your ship without needing to dock at the main station, simply by scooping fuel from the sun.&lt;br /&gt;
&lt;br /&gt;
One of the benefits of being a pirate, is that pirates will be less likely to attack you, and may even side with you in a skirmish. &lt;br /&gt;
&lt;br /&gt;
===OXP's to help with or enhance piracy===&lt;br /&gt;
* [[Manifest Scanner]] allows you to scan a target ship and see what cargo they have on board, to help with the decision-making process of whether to attack this ship or not.&lt;br /&gt;
* [[Rock Hermit Locator]] helps pilots find Rock Hermits in each system.&lt;br /&gt;
* [[Spicy Hermits]] makes Rock Hermits more interesting and worthwhile.&lt;br /&gt;
* [[BroadcastComms MFD]] has options to transmit a demand for cargo, which could avoid the need to send the same message with a laser.&lt;br /&gt;
&lt;br /&gt;
==OXP Careers==&lt;br /&gt;
Many OXP's have sought to expand on existing career paths, or create entirely new ones, in order to deepen the game experience. What follows are some OXP's you might want to consider if you want to broaden the career options in your game.&lt;br /&gt;
&lt;br /&gt;
===Rescue Stations===&lt;br /&gt;
[[RRS_Group|Rescue Stations]] adds the RRS stations to various safer systems, and offers a variety of rescue and recovery missions to the player.&lt;br /&gt;
&lt;br /&gt;
===Galactic Navy Reservist===&lt;br /&gt;
If you have the ship for it (meaning, you’ve upgraded most of it), you can join the [[Galactic Navy]] reserves and participate in various sorties and SecOps missions. [[Thargoid Wars]] also gives you the opportunity to work with the Navy in their battles against the Thargoids.&lt;br /&gt;
&lt;br /&gt;
===Salvage Operator===&lt;br /&gt;
A salvager looks for wrecked, derelict ships, then either tows them (using a [[Towbar]]), or attaches a drone to it, to get the hulk to a station or to a [[Deep Space Dredger]], where the derelict can be sold for parts and a worthwhile profit.&lt;br /&gt;
&lt;br /&gt;
===Ship Escort Services===&lt;br /&gt;
Traders travelling to dangerous systems often need extra protection. [[Escort Contracts]] give players a chance to join a convoy and protect the mothership from all attackers, to see them safely to their destination.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_Mission&amp;diff=58551</id>
		<title>Oolite JavaScript Reference: Mission</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_Mission&amp;diff=58551"/>
		<updated>2020-06-29T18:24:34Z</updated>

		<summary type="html">&lt;p&gt;Milo: /* runScreen */ fix link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;small&amp;gt;'''Prototype:''' &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Subtypes:''' none&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''mission''' global object is used to run mission screens, and perform other actions related to mission scripting.&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;displayModel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 '''displayModel''' : {{oojsclass|Ship}}&lt;br /&gt;
If currently running a mission screen with a &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;, the ship entity used to display the model. This can be animated by setting its position and orientation from a [[Oolite JavaScript Reference: Global#addFrameCallback|frame callback]]. Uses role to identify ship, so be sure to use a unique role if you want a specific ship to be showed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;exitScreen&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
 '''exitScreen''' : [[Oolite JavaScript Reference: Global#guiScreen|guiScreen]] (read/write)&lt;br /&gt;
&lt;br /&gt;
This can be used to set a new exit screen for the current mission screen. Outside of a callback function, the value of this is meaningless, and setting it has no useful effect.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;markedSystems&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
 '''markedSystems''' : Array (read-only)&lt;br /&gt;
&lt;br /&gt;
An array of the objects currently being used to mark systems. The objects will have the same properties as those used by &amp;lt;code&amp;gt;markSystem&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;unmarkSystem&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;screenID&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
 '''screenID''' : String (read-only)&lt;br /&gt;
&lt;br /&gt;
If there is currently a mission screen running, and it defined a screenID, then that screenID. Otherwise, this is null.&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;addMessageText&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''addMessageText'''(message : String)&lt;br /&gt;
&lt;br /&gt;
Appends text to the currently running mission screen. Can also be used to add text to other screens like the system data (F7) screen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;addMessageTextKey&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''addMessageTextKey'''(messageKey : String)&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;code&amp;gt;[[#addMessageText|addMessageText()]]&amp;lt;/code&amp;gt;, but looks up the specified &amp;lt;code&amp;gt;messageKey&amp;lt;/code&amp;gt; in [[missiontext.plist]].&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;markSystem&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''markSystem'''(systemNumber : Number)&lt;br /&gt;
&lt;br /&gt;
Mark a system on the long range chart. Multiple systems may be marked at once, as in &amp;lt;code&amp;gt;mission.markSystem(4, 54, 222)&amp;lt;/code&amp;gt;. In 1.76 and earlier a system cannot be marked twice, so:&lt;br /&gt;
 mission.markSystem(7);&lt;br /&gt;
 mission.markSystem(7);&lt;br /&gt;
 mission.unmarkSystem(7);&lt;br /&gt;
will leave the system unmarked.&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, the parameters may be objects instead of numbers. This allows control over the marker's appearance, and allows multiple markers to be placed on the same system. The object takes the following parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; : The system ID. This is the only required parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; : A string identifying the group this marker belongs to (which may be the script's name, or something more specific). If omitted, which is not recommended, this defaults to &amp;quot;__oolite_legacy_destinations&amp;quot; which is also used for marking with numbers and marking carried out by legacy scripts.&lt;br /&gt;
* &amp;lt;code&amp;gt;markerColor&amp;lt;/code&amp;gt; : A string specifying a colour. e.g. &amp;quot;redColor&amp;quot; or &amp;quot;1.0 0.5 0.0&amp;quot;. If omitted, &amp;quot;redColor&amp;quot; will be used.&lt;br /&gt;
* &amp;lt;code&amp;gt;markerScale&amp;lt;/code&amp;gt; : A number between 0.5 and 2.0 specifying the relative size of the marker. Defaults to 1.0.&lt;br /&gt;
* &amp;lt;code&amp;gt;markerShape&amp;lt;/code&amp;gt; : A string describing the shape of the marker. Valid values are MARKER_X, MARKER_PLUS, MARKER_SQUARE and MARKER_DIAMOND. If this value is invalid or omitted, MARKER_X will be used.&lt;br /&gt;
&lt;br /&gt;
Multiple markers may be placed on the same system, provided that they have different names. If a marker with the same system and name already exists, it will be replaced.&lt;br /&gt;
&lt;br /&gt;
 mission.markSystem({&lt;br /&gt;
    system: 55,&lt;br /&gt;
    name: &amp;quot;my_oxp&amp;quot;,&lt;br /&gt;
    markerColor: &amp;quot;cyanColor&amp;quot;,&lt;br /&gt;
    markerScale: 1.5,&lt;br /&gt;
    markerShape: &amp;quot;MARKER_DIAMOND&amp;quot;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#unmarkSystem|unmarkSystem()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runShipLibrary&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
 function '''runShipLibrary()'''&lt;br /&gt;
Display the ship library based on [[shiplibrary.plist]], including processing of condition scripts.&lt;br /&gt;
&lt;br /&gt;
This is mainly useful for scenarios which override the standard scripts.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runScreen&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''runScreen(parameters : Object [, callback : Function [, this : Object]])''' &lt;br /&gt;
Present a mission screen.&lt;br /&gt;
&lt;br /&gt;
The appearance of the mission screen is defined by the properties of the &amp;lt;code&amp;gt;parameters&amp;lt;/code&amp;gt; object. The currently defined properties are:&lt;br /&gt;
* &amp;lt;code&amp;gt;title : String&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;titleKey : String&amp;lt;/code&amp;gt; (Key in [[missiontext.plist]])&lt;br /&gt;
* &amp;lt;code&amp;gt;music : String&amp;lt;/code&amp;gt; (name of a music file)&lt;br /&gt;
* &amp;lt;code&amp;gt;overlay : ''guiTextureSpecifier''&amp;lt;/code&amp;gt; (name of an image used as overlay)&lt;br /&gt;
* &amp;lt;code&amp;gt;background : ''guiTextureSpecifier''&amp;lt;/code&amp;gt; (name of a picture used as background)&lt;br /&gt;
* &amp;lt;code&amp;gt;backgroundSpecial: String&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, special background layer)&lt;br /&gt;
* &amp;lt;code&amp;gt;model : String&amp;lt;/code&amp;gt; (Role of a ship that will be shown as rotating ship)&lt;br /&gt;
* &amp;lt;code&amp;gt;modelPersonality : Int&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, the entityPersonality assigned to the &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;. If unspecified, or in 1.76 or earlier, a random personality is used)&lt;br /&gt;
* &amp;lt;code&amp;gt;message : String&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;messageKey : String&amp;lt;/code&amp;gt; (Key in [[missiontext.plist]])&lt;br /&gt;
* &amp;lt;code&amp;gt;spinModel: Boolean&amp;lt;/code&amp;gt; (If &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the model is shown from the top with no automatic animation.)&lt;br /&gt;
* &amp;lt;code&amp;gt;choices: Object&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, Object describing [[Oolite_JavaScript_Reference:_Mission#Advanced_choices_.281.77_or_later_only.29|advanced choices]])&lt;br /&gt;
* &amp;lt;code&amp;gt;choicesKey : String&amp;lt;/code&amp;gt; (Key in [[missiontext.plist]])&lt;br /&gt;
* &amp;lt;code&amp;gt;initialChoicesKey : String&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, the key from &amp;lt;code&amp;gt;choicesKey&amp;lt;/code&amp;gt; which is initially selected)&lt;br /&gt;
* &amp;lt;code&amp;gt;allowInterrupt : Boolean&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}. If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (default: false), the mission screen can be interrupted with function keys, which does not call the callback function. Mainly intended for interfaces.)&lt;br /&gt;
* &amp;lt;code&amp;gt;exitScreen : ''guiScreen''&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, a GUI screen to exit on. If omitted, an invalid value is given, or the player is not docked, this will revert to &amp;quot;GUI_SCREEN_STATUS&amp;quot;. Not all GUI screens are selectable for this: only those reachable with function keys F3 to F8)&lt;br /&gt;
* &amp;lt;code&amp;gt;screenID : String&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, an optional string which can be read later from &amp;lt;code&amp;gt;[[#screenID|mission.screenID]]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;textEntry : Boolean&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.79}}, if it's true, then you get the text prompt and 'choices' and 'choicesKey' are ignored. Whatever's typed there gets passed as the parameter to the callback function. The [https://github.com/OoliteProject/oolite/blob/master/Resources/Scripts/oolite-registership.js ship registry code] has a simple example.)&lt;br /&gt;
* &amp;lt;code&amp;gt;customChartZoom : decimal&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.87}}, zoom level of the 'CUSTOM_CHART' backgroundSpecial map)&lt;br /&gt;
* &amp;lt;code&amp;gt;customChartCentre: Vector3D&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.87}}, centre position of the 'CUSTOM_CHART' backgroundSpecial map, using the internal coordinate system. The z component is always zero. Discouraged in favour of customChartCentreInLY)&lt;br /&gt;
* &amp;lt;code&amp;gt;customChartCentreLY: Vector3D&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.87}}, centre position of the 'CUSTOM_CHART' backgroundSpecial map, in LY. e.g. for Lave: (8, 34.6, 0). The z component is always zero.)&lt;br /&gt;
Some of these are mutually exclusive; for instance, “title” overrides “titleKey”. See [[Oolite JavaScript Reference: Global#setScreenBackground|setScreenBackground()]] for a discussion of ''guiTextureSpecifier''. &lt;br /&gt;
&lt;br /&gt;
There are 21 lines available for display of the message and choices combined. (In 1.77, this is extended to 27 lines if the player's HUD is hidden)&lt;br /&gt;
&lt;br /&gt;
==== runScreen callbacks ====&lt;br /&gt;
The callback function is a function that is called when the player makes a choice. Every runScreen can have its own specific callback function, or you can design a single function to handle multiple mission screens instead. The optional &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; parameter will be used as the &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; property of the mission screen callback. It is usually unnecessary to specify this, but if you intend the function which calls runScreen to be called from a different script, and the callback references &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;, you will need to use it.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&amp;lt;br&amp;gt;&lt;br /&gt;
A simple mission screen:&lt;br /&gt;
 mission.runScreen({&lt;br /&gt;
     title: &amp;quot;My first mission screen&amp;quot;,&lt;br /&gt;
     message: &amp;quot;This am a mission screen wot is good&amp;quot;,&lt;br /&gt;
     choicesKey: &amp;quot;me_firstmission_choices&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
 function (choice)&lt;br /&gt;
 {&lt;br /&gt;
     if (choice === &amp;quot;1_YES&amp;quot;)  player.commsMessage(&amp;quot;Yay!&amp;quot;);&lt;br /&gt;
     else if (choice === &amp;quot;2_NO&amp;quot;)  player.commsMessage(&amp;quot;Boo.&amp;quot;);&lt;br /&gt;
     else  player.commsMessage(&amp;quot;Whut?&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
In [[missiontext.plist]], you’ll need the following. The numbers are used because choices are sorted by key.&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;me_firstmission_choices&amp;quot; =&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;1_YES&amp;quot; = &amp;quot;Yes.&amp;quot;;&lt;br /&gt;
         &amp;quot;2_NO&amp;quot; = &amp;quot;No.&amp;quot;;&lt;br /&gt;
         &amp;quot;3_MAYBE&amp;quot; = &amp;quot;Maybe.&amp;quot;;&lt;br /&gt;
     };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The call does not have to be laid out as above. The parameters object can be manipulated in any way you want beforehand, and the callback function can be written out of line. For example, the following is equivalent:&lt;br /&gt;
 var parameters = new Object();&lt;br /&gt;
 parameters.title = &amp;quot;My first mission screen&amp;quot;;&lt;br /&gt;
 parameters.message = &amp;quot;This am&amp;quot;;&lt;br /&gt;
 parameters.choicesKey = &amp;quot;me_firstmission_choices&amp;quot;;&lt;br /&gt;
 parameters.message += &amp;quot; a mission screen wot is good&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 function callback(choice)&lt;br /&gt;
 {&lt;br /&gt;
     if (choice === &amp;quot;1_YES&amp;quot;)  player.commsMessage(&amp;quot;Yay!&amp;quot;);&lt;br /&gt;
     else if (choice === &amp;quot;2_NO&amp;quot;)  player.commsMessage(&amp;quot;Boo.&amp;quot;);&lt;br /&gt;
     else  player.commsMessage(&amp;quot;Whut?&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 mission.runScreen(parameters, callback);&lt;br /&gt;
&lt;br /&gt;
This form is more complicated, and the ordering is less intuitive. However, it does allow you to make complex decisions about the parameters in code, and writing the callback out of line can be preferable if it’s long. It is recommended that you start out with the first approach, but keep in mind that there are other options if it becomes too limiting.&lt;br /&gt;
&lt;br /&gt;
In 1.77, if &amp;lt;code&amp;gt;allowInterrupt&amp;lt;/code&amp;gt; is set to true, it is possible that the callback function will not be called. It should therefore only be set for mission screens which can safely be interrupted without the callback. Regardless of this setting, all mission screens may be interrupted by the player launching from the station, and this possibility should be considered (in such case callback function will be called with &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; argument).&lt;br /&gt;
&lt;br /&gt;
==== runScreen special backgrounds (1.77 or later only) ====&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, 'backgroundSpecial' may be given the following special string values:&lt;br /&gt;
* &amp;lt;code&amp;gt;SHORT_RANGE_CHART&amp;lt;/code&amp;gt;: Uses the short range chart (as if the player had pressed F6). The first 18 lines of the mission text will overlap the chart if used.&lt;br /&gt;
* &amp;lt;code&amp;gt;LONG_RANGE_CHART&amp;lt;/code&amp;gt;: Uses the current long range chart (as if the player had pressed F6 twice). The first 16 lines of the mission text will overlap the chart if used.&lt;br /&gt;
* &amp;lt;code&amp;gt;LONG_RANGE_CHART_SHORTEST&amp;lt;/code&amp;gt;: As LONG_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the shortest (fewest jumps, not necessarily shortest distance) route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;LONG_RANGE_CHART_QUICKEST&amp;lt;/code&amp;gt;: As LONG_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the quickest route to their current destination system will be displayed.&lt;br /&gt;
&lt;br /&gt;
In 1.87 or later, 'backgroundSpecial' has these additional special string values:&lt;br /&gt;
* &amp;lt;code&amp;gt;SHORT_RANGE_CHART_SHORTEST&amp;lt;/code&amp;gt;: As SHORT_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the shortest (fewest jumps, not necessarily shortest distance) route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;SHORT_RANGE_CHART_QUICKEST&amp;lt;/code&amp;gt;: As SHORT_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the quickest route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;CUSTOM_CHART&amp;lt;/code&amp;gt;: Displays a chart where zoom and centre position can be customised using the 'customChartZoom' and 'customChartCentreInLY' properties. The first 18 lines of the mission text will overlap the chart if used.&lt;br /&gt;
* &amp;lt;code&amp;gt;CUSTOM_CHART_SHORTEST&amp;lt;/code&amp;gt;: As CUSTOM_CHART, but if the player has a working [[Advanced Navigational Array]] then the shortest (fewest jumps, not necessarily shortest distance) route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;CUSTOM_CHART_QUICKEST&amp;lt;/code&amp;gt;: As CUSTOM_CHART, but if the player has a working [[Advanced Navigational Array]] then the quickest route to their current destination system will be displayed.&lt;br /&gt;
&lt;br /&gt;
With all special chart backgrounds, changes made to destination system, or to markers, will be updated immediately.&amp;lt;br/&amp;gt;&lt;br /&gt;
These backgrounds will be displayed above the '&amp;lt;code&amp;gt;background&amp;lt;/code&amp;gt;' (if any) but below everything else.&lt;br /&gt;
&lt;br /&gt;
==== Advanced choices (1.77 or later only) ====&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, choices may be set either with the 'choicesKey' parameter from missiontext.plist as before, or with the 'choices' parameter. (If both are set, 'choicesKey' will be ignored)&lt;br /&gt;
'''Example'''&amp;lt;br&amp;gt;&lt;br /&gt;
 var options = {&lt;br /&gt;
    &amp;quot;01_AGREE&amp;quot; : &amp;quot;Take the job&amp;quot;,&lt;br /&gt;
    &amp;quot;02_DECLINE&amp;quot; : &amp;quot;Politely decline&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
 if (player.bounty == 0) // only clean players have this option&lt;br /&gt;
 {&lt;br /&gt;
    options[&amp;quot;03_REPORT&amp;quot;] = &amp;quot;Call the police&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 mission.runScreen({&lt;br /&gt;
    // title, message, etc.&lt;br /&gt;
    choices: options&lt;br /&gt;
 },function(choice) {&lt;br /&gt;
    // choice handling&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
This is useful where the options available (perhaps depending on the player's ship or equipment, or on previous events in the mission) may vary in a complex fashion, to avoid the need to have a separate missiontext.plist entry for every possibility.&lt;br /&gt;
&lt;br /&gt;
The value (either in &amp;lt;code&amp;gt;choicesKey&amp;lt;/code&amp;gt;'s missiontext entry or &amp;lt;code&amp;gt;choices&amp;lt;/code&amp;gt;) may either be a text string as in previous versions, or an object itself. If it is an object, it can take three parameters: &lt;br /&gt;
* 'text' is the displayed text for this key. &lt;br /&gt;
* 'alignment' can be 'LEFT', 'RIGHT' or 'CENTER' (the default). &lt;br /&gt;
* 'unselectable' can be &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; (the default for non-blank text). Unselectable rows are printed, but are skipped when moving through the options. This can be useful for keeping a consistent interface.&lt;br /&gt;
* 'color' can be any color specification (e.g. &amp;quot;orangeColor&amp;quot;). The default is &amp;quot;yellowColor&amp;quot;, or &amp;quot;darkGrayColor&amp;quot; for unselectable rows.&lt;br /&gt;
For example (missiontext.plist):&lt;br /&gt;
 &amp;quot;my_choice_1&amp;quot; = {&lt;br /&gt;
    &amp;quot;01_AGREE&amp;quot; = {&lt;br /&gt;
       text = &amp;quot;Take the job&amp;quot;;&lt;br /&gt;
       alignment = &amp;quot;LEFT&amp;quot;;&lt;br /&gt;
       color = &amp;quot;greenColor&amp;quot;;&lt;br /&gt;
    };&lt;br /&gt;
    // more options&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
In 1.77, the behaviour for choices which have no text is slightly changed. These will now leave a blank and unselectable line in the option list.&lt;br /&gt;
&lt;br /&gt;
==== Safe usage of runScreen ====&lt;br /&gt;
&lt;br /&gt;
One warning: &amp;lt;code&amp;gt;runScreen()&amp;lt;/code&amp;gt; will overwrite any existing missionscreen or GUI screen. The only safe place is using it inside a &amp;lt;code&amp;gt;missionScreenOpportunity&amp;lt;/code&amp;gt; handler or the callback function from a previous mission screen (or in 1.77 onwards, inside an interface callback function), because that handler only fires when it is allowed to show such a screen. When using the command at other places, first make sure with &amp;lt;code&amp;gt;guiScreen != &amp;quot;GUI_SCREEN_MISSION&amp;quot;&amp;lt;/code&amp;gt; that there is currently no missionscreen on display by another oxp.&lt;br /&gt;
&lt;br /&gt;
==== Known issues ====&lt;br /&gt;
&lt;br /&gt;
From Oolite 1.79, only the A-Z, a-z, 0-9 and (space) characters may be reliably entered in the 'textEntry' field. A wider selection, for boring internal reasons, is available on the Mac, and is hoped to also be available on other platforms in later releases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setInstructions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''setInstructions(instructions : String, [worldScriptName : String])'''&lt;br /&gt;
&lt;br /&gt;
Specify a message to put on the Manifest screen (usually short instructions for current mission), under the title “Missions”.&lt;br /&gt;
&lt;br /&gt;
When not called from within a world script, the name of a world script must be specified so that Oolite knows which script the message belongs to. Clear the message by calling &amp;lt;code&amp;gt;setInstructions(null)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is recommended that &amp;lt;code&amp;gt;setInstructions()&amp;lt;/code&amp;gt; is used only when you need to customise the text for a specific scenario. For static text, use &amp;lt;code&amp;gt;[[#setInstructionsKey|setInstructionsKey()]]&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
In Oolite 1.81 onwards, the following variant is available&lt;br /&gt;
&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
 function '''setInstructions(instructions : Array, [worldScriptName : String])'''&lt;br /&gt;
&lt;br /&gt;
If this version is used, the first array element will be a heading on the Manifest screen, and the remaining elements will be entered underneath it, rather than being entered under the &amp;quot;Missions&amp;quot; heading.&lt;br /&gt;
&lt;br /&gt;
'''Example''':  &amp;lt;code&amp;gt;mission.setInstructions([&amp;quot;Ship Companion:&amp;quot;,expandMissionText(&amp;quot;myoxp_currentpet&amp;quot;),...]);&amp;lt;/code&amp;gt; will display Ship Companion: in yellow text on the F5F5 screen, and beneath it will show the [[String expansion|expanded]] value of the key &amp;quot;myoxp_currentpet&amp;quot; from the [[missiontext.plist]] associated with the calling world script. If not called from a world script, the worldScriptName (this.name from the script) must be provided also: &amp;lt;code&amp;gt;mission.setInstructions([&amp;quot;Ship Companion:&amp;quot;,expandMissionText(&amp;quot;myoxp_currentpet&amp;quot;),...], &amp;quot;myoxp's script name&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the line or lines to be added must be enclosed in square brackets, comma separated. Also note the optional use of expandMissionText to retrieve text from [[missiontext.plist]]. It is also possible to construct the array before calling setInstructions, for example:&amp;lt;pre&amp;gt;&lt;br /&gt;
if(myoxp_petslist.length == 0) {&lt;br /&gt;
  mission.setInstructions(null); // clear any text previously displayed by this world script on the F5F5 screen&lt;br /&gt;
} else {&lt;br /&gt;
  var textArray = [];&lt;br /&gt;
  textArray.push(&amp;quot;Ship Companion&amp;quot; + (myoxp_petslist.length &amp;gt; 1 ? &amp;quot;s:&amp;quot; : &amp;quot;:&amp;quot;)); // &amp;quot;Ship Companion:&amp;quot; or &amp;quot;Ship Companions:&amp;quot; if more than one&lt;br /&gt;
  var i = myoxp_petslist.length - 1; // pointer to last entry in myoxp_petslist&lt;br /&gt;
  while(i--) { // for each pet in the list, starting from the bottom (probably newest to oldest)&lt;br /&gt;
    textArray.push(myoxp_petslist[i].name); // add the name of the pet to the text we will show on the F5F5 screen&lt;br /&gt;
  }&lt;br /&gt;
  mission.setInstructions(textArray); // our pets list will now be visible on the F5F5 screen until further notice (the next time we call setInstructions or one of its variants, it will replace this)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#setInstructionsKey|setInstructionsKey()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setInstructionsKey&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''setInstructionsKey(messageKey : String, [worldScript : String])'''&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;code&amp;gt;[[#setInstructions|setInstructions()]]&amp;lt;/code&amp;gt;, but looks up the specified &amp;lt;code&amp;gt;messageKey&amp;lt;/code&amp;gt; in [[missiontext.plist]].&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#setInstructions|setInstructions()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;unmarkSystem&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''unmarkSystem'''(systemNumbers : Number)&lt;br /&gt;
&lt;br /&gt;
Remove a mark set with &amp;lt;code&amp;gt;[[#markSystem|markSystem()]]&amp;lt;/code&amp;gt;. Multiple systems may be unmarked at once, as in &amp;lt;code&amp;gt;mission.unmarkSystem(4, 54, 222)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In 1.76 and earlier versions, any script can unmark a system, regardless of which script marked it or how many times it was previously marked. &lt;br /&gt;
&lt;br /&gt;
In 1.77, each marker has a name, and if a system has multiple markers each marker must be removed separately. Parameters in 1.77 may be numbers or objects. Numbers remove the &amp;quot;__oolite_legacy_destinations&amp;quot; markers. Objects are the same format as in &amp;lt;code&amp;gt;markSystem&amp;lt;/code&amp;gt; and remove the marker of the corresponding name (the marker style options are ignored when unmarking). In 1.77, this function will return true if all requested markers existed and were removed, or false if any of the requested markers did not exist.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#markSystem|markSystem()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite JavaScript Reference]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=String_expansion&amp;diff=58504</id>
		<title>String expansion</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=String_expansion&amp;diff=58504"/>
		<updated>2020-06-24T16:17:10Z</updated>

		<summary type="html">&lt;p&gt;Milo: corrected operator examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Format ==&lt;br /&gt;
Oolite has a mechanism to replace text in strings with other text. At certain times before displaying text (details below), Oolite searches for % symbols and square brackets [ ]. If it finds them, it checks if what immediately follows the % symbols, or what is between the square brackets, has a recognized special meaning, and if so, substitutes replacement text.  Oolite also recognizes vertical bars ('|') and colons (':') inside square brackets as special characters. When you do not want Oolite to replace text, use a double % ('%%') to display a single %, and put a backslash ('\') before each square bracket to display the brackets and text inside them without substitution ('\[example\]' will be displayed as '[example]').  Additionally, the special value '\n' will be replaced by a new line, which can be prevented by preceding it with an extra slash ('\\n' will display '\n').&lt;br /&gt;
&lt;br /&gt;
== What is switched ==&lt;br /&gt;
'''Recognized % codes:'''&lt;br /&gt;
&lt;br /&gt;
* %H       - Current System name, e.g., Lave&lt;br /&gt;
* %I       - Current System name with &amp;quot;ian&amp;quot; appended, e.g., Laveian&lt;br /&gt;
* %Jxxx    - Name of System corresponding with ID number xxx in the current galaxy (must be a 3-digit number), e.g., %J007 is Lave while in Galaxy 1 (feature added in Oolite 1.73)&lt;br /&gt;
* %Gxxxyyy - Name of System corresponding with ID number xxx in galaxy number yyy (both must be 3-digit numbers), e.g. %G007000 is Lave (feature added in Oolite 1.87) &lt;br /&gt;
* %N       - Random name (repetitions of %N in the same string generate the same result)&lt;br /&gt;
* %R       - Random word (repetitions of %R in the same string generate unique results)&lt;br /&gt;
&lt;br /&gt;
'''Text in brackets:'''&lt;br /&gt;
&lt;br /&gt;
* If there are only numbers between the brackets (e.g., [0] or [35]), the corresponding Nth sub-array (counting from zero) is retrieved from the &amp;lt;code&amp;gt;system_description&amp;lt;/code&amp;gt; array in [[descriptions.plist]], which is expected to contain only sub-arrays of strings. When a sub-array is retrieved, one string is selected from it at random and the result is expanded recursively (if it contains %-codes or bracket expressions, those will be replaced too). As of Oolite 1.87, there are 36 entries in the system_description array (the last is [35]). This is used to generate planet descriptions but may be used in OXPs if the strings are suitable. For example, [10] is replaced with a random beverage.&lt;br /&gt;
* Otherwise, the text between the brackets (hereafter called the &amp;quot;key&amp;quot;) is evaluated recursively in the following priority order to find a replacement:&lt;br /&gt;
*# Overrides (context-specific expansions, special keys that are only recognized in certain situations, and can also be used from JavaScript)&lt;br /&gt;
*#* In comms messages, [self:name] and [target:name] will be replaced respectively with the sender's displayName and the target's displayName (or the &amp;quot;unknown-target&amp;quot; description from [[descriptions.plist]], if the scanner is jammed).&lt;br /&gt;
*#* In [[Oolite_JavaScript_Reference:_Global#expandDescription|expandDescription]] and [[Oolite_JavaScript_Reference:_Global#expandMissionText|expandMissionText]] you can provide a dictionary of keys and replacement values (which can be JavaScript expressions calculated at run-time).&lt;br /&gt;
*# Special keys (these are hard-coded)&lt;br /&gt;
*#* [commander_name]&lt;br /&gt;
*#* [commander_shipname]&lt;br /&gt;
*#* [commander_shipdisplayname]&lt;br /&gt;
*#* [commander_rank]&lt;br /&gt;
*#* [commander_kills]&lt;br /&gt;
*#* [commander_legal_status]&lt;br /&gt;
*#* [commander_bounty]&lt;br /&gt;
*#* [credits_number]&lt;br /&gt;
*# [[Descriptions.plist]] (if there is a matching key, substitutes the associated value, which may be a single string or an array of string; if it is an array of strings, then one is selected at random.) Because [[descriptions.plist]] entries from all OXPs are merged at run-time with the ones in the game's Resources folder, it is '''recommended''' that OXP-specific entries in [[descriptions.plist]] have an OXP or creator-specific prefix to ensure uniqueness.&lt;br /&gt;
*#* For example, [nom] will match the &amp;quot;nom&amp;quot; key in [[descriptions.plist]], the value of which is an array of two strings (&amp;quot;%R&amp;quot;, &amp;quot;[nom1]&amp;quot;), one of which will be randomly selected, and then evaluated again.&lt;br /&gt;
*# Keyboard bindings (will be replaced with corresponding key name; however, [[descriptions.plist]] overrides keybindings and is evaluated first, so using these keys in OXPs is '''discouraged'''; instead, look for the comment &amp;quot;translations of special keys&amp;quot; in [[descriptions.plist]] and use the keys there)&lt;br /&gt;
*#* [oolite_key_tab], [oolite_key_esc], [oolite_key_space], [oolite_key_f1], [oolite_key_f2], [oolite_key_f3], [oolite_key_f4], [oolite_key_f5], [oolite_key_f6], [oolite_key_f7], [oolite_key_f8], [oolite_key_f9], [oolite_key_f10, [oolite_key_f11]&lt;br /&gt;
*#* [oolite_key_right], [oolite_key_left], [oolite_key_down], [oolite_key_up], [oolite_key_home], [oolite_key_end], [oolite_key_insert], [oolite_key_delete], [oolite_key_pageup], [oolite_key_pagedown]&lt;br /&gt;
*#* [oolite_key_numpad0], [oolite_key_numpad1], [oolite_key_numpad2], [oolite_key_numpad3], [oolite_key_numpad4], [oolite_key_numpad5], [oolite_key_numpad6], [oolite_key_numpad7], [oolite_key_numpad8], [oolite_key_numpad9]&lt;br /&gt;
*# Mission variables (&amp;lt;code&amp;gt;[mission_FOO]&amp;lt;/code&amp;gt; substitutes the value contained in &amp;lt;code&amp;gt;missionVariables.FOO&amp;lt;/code&amp;gt;)&lt;br /&gt;
*#* These are commonly used in OXPs as a method of including dynamic information in displayed text.&lt;br /&gt;
*# Legacy local variables (&amp;lt;code&amp;gt;[local_FOO]&amp;lt;/code&amp;gt; substitutes the value contained in &amp;lt;code&amp;gt;worldScripts.scriptname.FOO&amp;lt;/code&amp;gt; with the scriptname depending on the context where the text is being evaluated)&lt;br /&gt;
*#* A local variable is a property defined on a world script (e.g., a script.js in Config/, or any script listed in a [[Scripting Oolite with JavaScript|world-scripts.plist]]). this.name from a script.js in Config/ is used as the key for that script in the global worldScripts dictionary. As of Oolite 1.87, none of the core game texts use local variables.&lt;br /&gt;
*#* In [[Oolite_JavaScript_Reference:_Mission#addMessageText]] and [[Oolite_JavaScript_Reference:_Mission#addMessageTextKey]], the applicable scriptname is the calling script.  As an example, if your script has a local variable &amp;lt;code&amp;gt;this.calculatedvalue&amp;lt;/code&amp;gt; you could display the content of that variable with other text by calling &amp;lt;code&amp;gt;mission.addMissionText(&amp;quot;various text [local_calculatedvalue] various other text&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
*# Legacy script query methods&lt;br /&gt;
*#* As a last resort, Oolite attempts to expand a key by treating it as a legacy script query method and invoking it. Only [[whitelist.plist|whitelisted]] query_methods and query_method_aliases are permitted. Examples:  [systemGovernment_string] (a whitelisted query method), [fuelLevel_number] (a whitelisted query method) or [fuel_level_number] (a whitelisted alias for [fuelLevel_number])&lt;br /&gt;
* If no suitable replacement is found, the text will be displayed unchanged and a warning will be logged.&lt;br /&gt;
&lt;br /&gt;
'''Operators:'''&lt;br /&gt;
&lt;br /&gt;
If a vertical bar ('|') is found between square brackets, Oolite will interpret whatever is on the left side of the bar as the ''key'' and whatever is on the right side of the bar as an ''operator''. An ''operator'' tells Oolite to apply a change after the key has been expanded. Some operators also require an input value, a colon (':'). The available ''operators'' are:&lt;br /&gt;
* cr        - displays the text as a credit value, interpreting the value as floating point credits (e.g., if the value is 1007.7, display 1007.7 ₢)&lt;br /&gt;
* dcr       - displays the text as a credit value, interpreting the value as floating point deci-credits (e.g., if the value is 1007.7, display 100.7 ₢)&lt;br /&gt;
* icr       - displays the text as a credit value, interpreting the value as integer credits (e.g., if the value is 1007.7, display 1007 ₢)&lt;br /&gt;
* idcr      - displays the text as a credit value, interpreting the value as integer deci-credits, rounded (e.g., if the value is 1007.7, display 101 ₢)&lt;br /&gt;
* precision - displays the text as a floating point value with an integer-specified number of decimal places, must be specified as ''precision'':number (e.g., [distance|precision:2])&lt;br /&gt;
* multiply  - displays the text as a floating point value multiplied with another floating point value, which must be provided as ''multiply'':othervalue (e.g., [fuelLevel_number|multiply:0.5])&lt;br /&gt;
* add       - displays the text as a floating point value added to another floating point value, which must be provided as ''add'':othervalue (e.g., [fuelLevel_number|add:1.5])&lt;br /&gt;
&lt;br /&gt;
Multiple ''operators'' can be applied sequentially to the same key, each separated by a vertical bar. For example: [distance|multiply:0.5|precision:1].&lt;br /&gt;
&lt;br /&gt;
== When are things switched ==&lt;br /&gt;
Oolite calls the switching routine only at certain places ('''this is not a complete list'''):&lt;br /&gt;
*The most often used place is in [[missiontext.plist]]. Every text line is evaluated for string replacement. Most commonly this is used to replace text in brackets with the content of a variable or a [[descriptions.plist]] entry.&lt;br /&gt;
*Inside a [[descriptions.plist]] entry you can also use brackets. This way you can get a recursive process. Look for example in the descriptions.plist in Oolite's Resources\Config folder where it generates random names in a recursive way. (Recursion is limited to 32 times to prevent infinite looping.). Because of the random number generator used for expansion, the use of deep recursion may cause correlations which are not random - consider for example that &amp;quot;mud&amp;quot; is always followed by &amp;quot;tennis&amp;quot; or &amp;quot;hockey&amp;quot; in planetary descriptions, never anything else. In Oolite 1.79, certain ways of expanding descriptions from JavaScript will use a higher quality random number generator, which does not have correlation problems.&lt;br /&gt;
*During evaluation of a [[OXP howto AI|plist-based AI]], it only uses switching on the content of a &amp;quot;commsMessage&amp;quot;.&lt;br /&gt;
*During evaluation of a [[script.plist]] all the lines in the DO or ELSE part of a condition statement are switched. Nothing is switched in the CONDITIONS part of a command so you cannot use anything in brackets there.&lt;br /&gt;
*In [[Oolite_JavaScript_Reference:_Global#expandDescription|expandDescription]] and [[Oolite_JavaScript_Reference:_Global#expandMissionText|expandMissionText]].&lt;br /&gt;
&lt;br /&gt;
The way things work means that you can create complicated structures. You can use for example:&lt;br /&gt;
 addSystemShips: my_ship 1 0.[d100_number]&lt;br /&gt;
&lt;br /&gt;
Oolite first offers the above line to the replacement routine. That replaces [d100_number] by a random number. e.g. 46. Than the routine returns:&lt;br /&gt;
 addSystemShips: my_ship 1 0.46&lt;br /&gt;
&lt;br /&gt;
This line will then be executed and the ship is placed at the calculated random position. You can also define a [[descriptions.plist]] entry of my_random_ship and define a list of several ship roles. When you then use:&lt;br /&gt;
 addSystemShips: [my_random_ship] 1 0.[d100_number]&lt;br /&gt;
the system will randomly pick a ship from the list and replace the d100_number with a value and return the expanded string. This will than be executed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite scripting]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_World_script_event_handlers&amp;diff=58503</id>
		<title>Oolite JavaScript Reference: World script event handlers</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_World_script_event_handlers&amp;diff=58503"/>
		<updated>2020-06-24T12:50:58Z</updated>

		<summary type="html">&lt;p&gt;Milo: minor elaboration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page provides a list of event handlers which can be implemented inside world scripts [[Scripting Oolite with JavaScript|JavaScript scripts for Oolite]]. Additionally, ship script handlers called on the player's ship will cause an equivalent world script event.&lt;br /&gt;
&lt;br /&gt;
Most event handlers can be used both in world scripts and in ship scripts. Generally speaking, handlers starting with &amp;quot;ship&amp;quot; can be used for both scripts and those starting with &amp;quot;player&amp;quot; are meant only for the player (= can only be used in a world script). Exceptions on this rule are mentioned with the individual handlers below. &lt;br /&gt;
&lt;br /&gt;
World scripts can be either found inside Config\script.js, or be distinctly named .js files inside the Scripts directory - in the latter case, the worldScript.plist will list the active world scripts.&lt;br /&gt;
&lt;br /&gt;
World scripts are always active.&lt;br /&gt;
&lt;br /&gt;
The list of event handlers will change from version to version (usually additions of extra handlers). For this reason, any variables or functions you create as &amp;lt;code&amp;gt;this.variable&amp;lt;/code&amp;gt; should have a name beginning with '_' or '$' - e.g. &amp;lt;code&amp;gt;this._variable&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;this.$variable&amp;lt;/code&amp;gt; - to avoid potential conflicts with future event handlers (which will never start with '_' or '$').&lt;br /&gt;
&lt;br /&gt;
=== Game State ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;gamePaused&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
This event is called when the game is paused. This is mainly useful for pausing sound playback which should not continue while the game is paused.&lt;br /&gt;
&lt;br /&gt;
 this.gamePaused = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;gameResumed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
This event is called when the game is resumed from pause. This is mainly useful for resuming sound playback paused in a &amp;lt;code&amp;gt;gamePaused&amp;lt;/code&amp;gt; handler.&lt;br /&gt;
&lt;br /&gt;
 this.gameResumed = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerWillSaveGame&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerWillSaveGame&amp;lt;/code&amp;gt; handler is called whenever the player saves a game. The transferred message is one of the following strings: 'standardSave', 'autoSave' or 'quickSave'&lt;br /&gt;
&lt;br /&gt;
 this.playerWillSaveGame = function(message : String)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Using this event is useful for storing temporary variables in missionVariables, just before the game gets saved. missionVariables are slow in use compared to normal JS variables, therefor their use should be minimised for efficient code. The main benefit of using missionVariables is that they are saved in a saved game.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;startUp&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;startUp&amp;lt;/code&amp;gt; handler is called after all OXPs have been loaded. This also means that it is called every time the player loads a game, begins a new game or presses space after dying. It can be used to do one-off initialisation such as copying mission variables into &amp;lt;code&amp;gt;this.*&amp;lt;/code&amp;gt; properties for efficiency or setting up data arrays to be used by the script in other handlers. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.startUp = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that from Oolite 1.79 onwards the player will be in the main station while this function is run, but may be moved from there to another station soon after.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;startUpComplete&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;startUpComplete&amp;lt;/code&amp;gt; handler is run at game startup after the initial population of the system has been complete, and after the player has been moved to the station recorded in their save game. The order of world events at game start is therefore:&lt;br /&gt;
* &amp;lt;code&amp;gt;startUp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;systemWillPopulate&amp;lt;/code&amp;gt; (or an alternative handler specified by the system info)&lt;br /&gt;
* &amp;lt;code&amp;gt;startUpComplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Docking ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillDockWithStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillDockWithStation&amp;lt;/code&amp;gt; handler is called at the beginning of the docking tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipWillDockWithStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == null&amp;quot;, &amp;quot;ship.docked == true&amp;quot;, &amp;quot;ship.status == STATUS_DOCKING&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipDockedWithStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipDockedWithStation&amp;lt;/code&amp;gt; handler is called at the end of the docking tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipDockedWithStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == the station&amp;quot;, &amp;quot;ship.docked == true&amp;quot;, &amp;quot;ship.status == STATUS_DOCKED&amp;quot; and &amp;quot;gui_screen&amp;quot; is either GUI_SCREEN_STATUS or GUI_SCREEN_REPORT. However, any identical handler from an other oxp could have changed those values. Never count on it but double check when important.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillLaunchFromStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillLaunchFromStation&amp;lt;/code&amp;gt; handler is called at the beginning of the launch tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipWillLaunchFromStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == the station&amp;quot;, &amp;quot;ship.docked == false&amp;quot;, &amp;quot;ship.status == STATUS_LAUNCHING&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipLaunchedFromStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipLaunchedFromStation&amp;lt;/code&amp;gt; handler is called at the end of the launch tunnel effect. The argument passed to the handler function is the station entity from which the ship was launched.&lt;br /&gt;
&lt;br /&gt;
 this.shipLaunchedFromStation = function(stationLaunchedFrom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == null&amp;quot;, &amp;quot;ship.docked == false&amp;quot;, &amp;quot;ship.status == STATUS_IN_FLIGHT&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerStartedAutoPilot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerStartedAutoPilot&amp;lt;/code&amp;gt; handler is called when the player starts autopilot docking. It is not called for the instantaneous dock command. The handler is called with an argument containing the station entity that is the docking target.&lt;br /&gt;
&lt;br /&gt;
 this.playerStartedAutoPilot = function(stationForDocking)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerCancelledAutoPilot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerCancelledAutoPilot&amp;lt;/code&amp;gt; handler is called when the player cancels autopilot docking.&lt;br /&gt;
&lt;br /&gt;
 this.playerCancelledAutoPilot = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingClearanceCancelled&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingClearanceCancelled&amp;lt;/code&amp;gt; handler is called when the player withdraws their request to dock at a station. &lt;br /&gt;
&lt;br /&gt;
 this.playerDockingClearanceCancelled = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingClearanceExpired&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.83}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingClearanceExpired&amp;lt;/code&amp;gt; handler is called when the player exceeds the two minute window without requesting an extension&lt;br /&gt;
&lt;br /&gt;
 this.playerDockingClearanceExpired = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingClearanceGranted&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingClearanceGranted&amp;lt;/code&amp;gt; handler is called when the player is given permission to dock at a station. If the player is given immediate clearance to dock, this event will be called immediately after the &amp;lt;code&amp;gt;playerRequestedDockingClearance&amp;lt;/code&amp;gt; event. If, however, the station is unable to give immediate clearance, then there will be some delay between the request to dock and permission being granted. This event will be called when the station actually gives docking clearance.&lt;br /&gt;
&lt;br /&gt;
 this.playerDockingClearanceGranted = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingRefused&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingRefused&amp;lt;/code&amp;gt; handler is called when a station refuses to provide autopilot docking instructions.&lt;br /&gt;
&lt;br /&gt;
 this.playerDockingRefused = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerRequestedDockingClearance&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerRequestedDockingClearance&amp;lt;/code&amp;gt; handler is called when a station answers on a docking request of the player by targeting the station and pressing L (shift-l).&lt;br /&gt;
&lt;br /&gt;
 this.playerRequestedDockingClearance = function(message)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Message is a string and can take the values: &amp;quot;DOCKING_CLEARANCE_GRANTED&amp;quot;, &amp;quot;DOCKING_CLEARANCE_DENIED_TRAFFIC_OUTBOUND&amp;quot;, &amp;quot;DOCKING_CLEARANCE_DENIED_TRAFFIC_INBOUND&amp;quot;,  &amp;quot;DOCKING_CLEARANCE_DENIED_SHIP_FUGITIVE&amp;quot;, &amp;quot;DOCKING_CLEARANCE_NOT_REQUIRED&amp;quot;, &amp;quot;DOCKING_CLEARANCE_EXTENDED&amp;quot; or &amp;quot;DOCKING_CLEARANCE_CANCELLED&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerRescuedEscapePod&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerRescuedEscapePod&amp;lt;/code&amp;gt; handler is called when the player rescues an escape pod which does not have scripted content (all consequences of scripted content escape pods are assumed to be dealt with by the specified script instead). It has three parameters:&lt;br /&gt;
# the rescue fee, in decicredits&lt;br /&gt;
# the fee reason, which can be &amp;quot;insurance&amp;quot;, &amp;quot;bounty&amp;quot; or &amp;quot;slave&amp;quot; (in the latter case, the fee will always be zero)&lt;br /&gt;
# a dictionary like those in the &amp;lt;code&amp;gt;ship.crew&amp;lt;/code&amp;gt; property describing the pod occupant&lt;br /&gt;
&lt;br /&gt;
 this.playerRescuedEscapePod = function(fee, reason, occupant)&lt;br /&gt;
 {&lt;br /&gt;
     // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This method is called after the escape pod has been processed, but slightly before the arrival report screen giving the results of the processing is displayed to the player.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerCompletedContract&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerCompletedContract&amp;lt;/code&amp;gt; handler is called when a passenger, parcel or cargo contract ends, either successfully or by defaulting on it. It is not called when all contracts are cancelled on a galactic jump. It has four parameters:&lt;br /&gt;
# The type of contract, which can be &amp;quot;cargo&amp;quot;, &amp;quot;parcel&amp;quot; or &amp;quot;passenger&amp;quot;&lt;br /&gt;
# The result of the contract, which can be &amp;quot;success&amp;quot;, &amp;quot;late&amp;quot;, &amp;quot;failed&amp;quot;, or for cargo contracts only &amp;quot;short&amp;quot;&lt;br /&gt;
# The fee paid for the contract in decicredits&lt;br /&gt;
# The contract information dictionary&lt;br /&gt;
Note that the fee actually paid for the contract will often ''not'' match the originally agreed fee in the contract information dictionary, as penalties for late delivery or bonuses for good service are included in the fee parameter.&lt;br /&gt;
&lt;br /&gt;
 this.playerCompletedContract = function(type, result, fee, contract)&lt;br /&gt;
 {&lt;br /&gt;
     // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This method is called after the contract has been processed, but slightly before the arrival report screen giving the results of the processing is displayed to the player.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerEnteredContract&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerEnteredContract&amp;lt;/code&amp;gt; handler is called when a passenger, parcel or cargo contract starts, just after the items have been transferred to the player ship. It has two parameters:&lt;br /&gt;
# The type of contract, which can be &amp;quot;cargo&amp;quot;, &amp;quot;parcel&amp;quot; or &amp;quot;passenger&amp;quot;&lt;br /&gt;
# The contract information dictionary&lt;br /&gt;
&lt;br /&gt;
 this.playerEnteredContract = function(type, contract)&lt;br /&gt;
 {&lt;br /&gt;
     // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Witchspace Jumps ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerStartedJumpCountdown&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerStartedJumpCountdown&amp;lt;/code&amp;gt; handler is called when the user starts a witchspace or galactic witchspace jump countdown. The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; parameter is a string specifying which type of jump is occuring; currently, the possible values are “standard” and “galactic”. Other values may be added in future. The &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; parameter is a number specifying the number of seconds the countdown is running for.&lt;br /&gt;
&lt;br /&gt;
 this.playerStartedJumpCountdown = function(type, seconds)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerCancelledJumpCountdown&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerCancelledJumpCountdown&amp;lt;/code&amp;gt; handler is called when the user cancels a witchspace or galactic witchspace jump countdown.&lt;br /&gt;
&lt;br /&gt;
 this.playerCancelledJumpCountdown = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerJumpFailed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerJumpFailed&amp;lt;/code&amp;gt; handler is called at the end of a witchspace or galactic witchspace countdown, if the jump is not possible. The &amp;lt;code&amp;gt;reason&amp;lt;/code&amp;gt; parameter is a string specifying why the jump failed. The current values are:&lt;br /&gt;
* '''&amp;quot;insufficient fuel&amp;quot;''' - the ship no longer has enough fuel to make the jump (e.g. injector use or fuel leak).&lt;br /&gt;
* '''&amp;quot;blocked&amp;quot;''' - a heavy ship is near the player (specifically &amp;lt;code&amp;gt;object mass&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;object distance&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt;= 10.0, and &amp;lt;code&amp;gt;object distance&amp;lt;/code&amp;gt; &amp;lt;= scanner range).&lt;br /&gt;
* '''&amp;quot;malfunction&amp;quot;''' - the jump malfunctioned in a way that leaves the player ship in the current system.&lt;br /&gt;
* '''&amp;quot;malfunction&amp;quot;''' - the Galactic Hyperdrive is damaged or removed during a galactic jump countdown.&lt;br /&gt;
&lt;br /&gt;
Also theoretically possible but unlikely in current Oolite:&lt;br /&gt;
* '''&amp;quot;too far&amp;quot;''' - the jump destination is outside the 7LY range (but wasn't when the countdown started).&lt;br /&gt;
* '''&amp;quot;no target&amp;quot;''' - the jump destination is the current location (but wasn't when the countdown started).&lt;br /&gt;
&lt;br /&gt;
 this.playerJumpFailed = function(reason)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillEnterWitchspace&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillEnterWitchspace&amp;lt;/code&amp;gt; handler is called immediately before a witchspace jump, while the player is still in the starting system. The &amp;lt;code&amp;gt;cause&amp;lt;/code&amp;gt; parameter is a string specifying what sort of jump is occuring; currently, the possible values are “standard jump”, “galactic jump” and “wormhole”. Other values may be added in future.&lt;br /&gt;
&lt;br /&gt;
 // 1.80 or earlier&lt;br /&gt;
 this.shipWillEnterWitchspace = function(cause)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In 1.81 or later the handler gains a second parameter, describing the jump destination. For standard and wormhole jumps, this will be the system ID of the destination system. For galactic jumps, this will be the galaxy ID of the destination galaxy. (As [[Oolite JavaScript Reference: PlayerShip#galacticHyperspaceBehaviour|player.ship.galacticHyperspaceBehaviour]] may be changed during &amp;lt;code&amp;gt;shipWillEnterWitchspace&amp;lt;/code&amp;gt;, it is not possible to predict in advance of a galactic jump being made what the resulting system ID in the destination galaxy will be)&lt;br /&gt;
&lt;br /&gt;
 // 1.81 or later&lt;br /&gt;
 this.shipWillEnterWitchspace = function(cause, destination)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillExitWitchspace&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillExitWitchspace&amp;lt;/code&amp;gt; handler is called as a witchspace jump concludes. When it is called, the player is (from a program perspective) in the destination system, but the tunnel effect has not yet been shown. Use this event to set up elements which need to be present in-system after the player exits witchspace.&lt;br /&gt;
&lt;br /&gt;
 this.shipWillExitWitchspace = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipExitedWitchspace&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipExitedWitchspace&amp;lt;/code&amp;gt; handler is called after a witchspace jump has concluded and the tunnel effect has been shown.&lt;br /&gt;
&lt;br /&gt;
 this.shipExitedWitchspace = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerEnteredNewGalaxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerEnteredNewGalaxy&amp;lt;/code&amp;gt; handler is called just before shipWillExitWitchspace.&lt;br /&gt;
&lt;br /&gt;
the sequence of events for a player jumping to a different galaxy is as follows:&lt;br /&gt;
&lt;br /&gt;
shipWillEnterWitchspace (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
playerWillEnterWitchspace (NPC ship event)&amp;lt;br&amp;gt;&lt;br /&gt;
playerEnteredNewGalaxy (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
shipWillExitWitchspace (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
shipExitedWitchspace (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 this.playerEnteredNewGalaxy = function(galaxyNumber)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Enter/Exit Aegis ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipEnteredStationAegis&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipEnteredStationAegis&amp;lt;/code&amp;gt; handler is called when the player enters the aegis of the main-station (2x scanner range from main-station). Other stations than the main-station don't give aegis messages.&lt;br /&gt;
&lt;br /&gt;
 this.shipEnteredStationAegis = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipExitedStationAegis&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipExitedStationAegis&amp;lt;/code&amp;gt; handler is called when the player leaves the aegis of the main-station (2x scanner range from main-station).&lt;br /&gt;
&lt;br /&gt;
 this.shipExitedStationAegis = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipEnteredPlanetaryVicinity&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipEnteredPlanetaryVicinity&amp;lt;/code&amp;gt; handler is called when the player enters the planet aegis (3x planet radius).&lt;br /&gt;
&lt;br /&gt;
 this.shipEnteredPlanetaryVicinity = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipExitedPlanetaryVicinity&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipExitedPlanetaryVicinity&amp;lt;/code&amp;gt; handler is called when the player leaves the planet aegis (3x planet radius).&lt;br /&gt;
&lt;br /&gt;
 this.shipExitedPlanetaryVicinity = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipApproachingPlanetSurface&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipApproachingPlanetSurface&amp;lt;/code&amp;gt; handler is called when the player is very close to the planet (crosses a border ± 500 meter above the surface).&lt;br /&gt;
&lt;br /&gt;
 this.shipApproachingPlanetSurface = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipLeavingPlanetSurface&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipLeavingPlanetSurface&amp;lt;/code&amp;gt; handler is called when the player leaves the planet (crosses a border ± 500 meter above the surface).&lt;br /&gt;
&lt;br /&gt;
 this.shipLeavingPlanetSurface = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Combat ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;alertConditionChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;alertConditionChanged&amp;lt;/code&amp;gt; handler is called when the player’s alert status (&amp;lt;code&amp;gt;[[Oolite JavaScript Reference: Player#alertCondition|player.alertCondition]]&amp;lt;/code&amp;gt;) changes. Only the player and stations have an alert condition. (world script and station scripts)&lt;br /&gt;
&lt;br /&gt;
 this.alertConditionChanged = function(newCondition, oldCondition)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerTargetedMissile&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerTargetedMissile&amp;lt;/code&amp;gt; handler is called when the player targets the nearest missile by pressing T (shift-t) on the keybord.&lt;br /&gt;
&lt;br /&gt;
 this.playerTargetedMissile = function(missile)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipAttackedOther&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipAttackedOther&amp;lt;/code&amp;gt; handler is called when the player hits another with a laser shot. &amp;lt;code&amp;gt;other&amp;lt;/code&amp;gt; is the identity of the ship being hit.&lt;br /&gt;
&lt;br /&gt;
 this.shipAttackedOther = function(other)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipAttackedWithMissile&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipAttackedWithMissile&amp;lt;/code&amp;gt; handler is called when a missile is fired. &amp;lt;code&amp;gt;missile&amp;lt;/code&amp;gt; contains the missile entity and &amp;lt;code&amp;gt;whom&amp;lt;/code&amp;gt; the identity of the ship that launched the missile.&lt;br /&gt;
&lt;br /&gt;
 this.shipAttackedWithMissile = function(missile, whom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipBeingAttacked&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipBeingAttacked&amp;lt;/code&amp;gt; handler is called when a laser shot  hits. &amp;lt;code&amp;gt;whom&amp;lt;/code&amp;gt; the identity of the ship that attacked.&lt;br /&gt;
&lt;br /&gt;
 this.shipBeingAttacked = function(whom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipBeingAttackedByCloaked&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipBeingAttackedByCloaked&amp;lt;/code&amp;gt; handler is called when a laser shot from a cloaked ship hits. Guess what, there is no parameter because he is cloaked!&lt;br /&gt;
&lt;br /&gt;
 this.shipBeingAttackedByCloaked = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipKilledOther&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipKilledOther&amp;lt;/code&amp;gt; handler is called when a ship kills an other ship. &amp;lt;code&amp;gt;whom&amp;lt;/code&amp;gt; the identity of the ship that was killed. &amp;lt;code&amp;gt;damageType&amp;lt;/code&amp;gt; is the type of damage.&lt;br /&gt;
&lt;br /&gt;
 this.shipKilledOther = function(whom : ship, damageType : string)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipReleasedEquipment&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipReleasedEquipment&amp;lt;/code&amp;gt; handler is called when a ship launches a mine (a pylon-mounted equipment item whose key ends with &amp;quot;_MINE&amp;quot;). &amp;lt;code&amp;gt;mine&amp;lt;/code&amp;gt; contains the launched mine entity.&lt;br /&gt;
&lt;br /&gt;
 this.shipReleasedEquipment = function(mine)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipTargetDestroyed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipTargetDestroyed&amp;lt;/code&amp;gt; handler is called when the target gets destroyed by the player. &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; contains the destroyed target entity. This command is always preceded by the &amp;lt;code&amp;gt;shipTargetLost&amp;lt;/code&amp;gt; handler.&lt;br /&gt;
&lt;br /&gt;
 this.shipTargetDestroyed = function(target)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipDied&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipDied&amp;lt;/code&amp;gt; handler is called when the ship or player dies. Expect a &amp;lt;code&amp;gt;reset()&amp;lt;/code&amp;gt; shortly when it is the player ship.&lt;br /&gt;
&lt;br /&gt;
 this.shipDied = function(whom, why)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
'''whom''' contains the entity that caused the kill. '''why''' is the cause written as string and is one of: &amp;quot;removed&amp;quot;, &amp;quot;hit a planet&amp;quot;, &amp;quot;energy damage&amp;quot;, &amp;quot;scrape damage&amp;quot;, &amp;quot;heat damage&amp;quot;, &amp;quot;cascade weapon&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
(&amp;quot;cascade weapon&amp;quot; is new in 1.74 and  &amp;quot;removed&amp;quot; / &amp;quot;energy damage&amp;quot; were accidentally switched in 1.73)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipFiredMissile&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipFiredMissile&amp;lt;/code&amp;gt; handler is called when a missile is fired. &amp;lt;code&amp;gt;missile&amp;lt;/code&amp;gt; contains the missile entity and &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; the identity of the target. The handler is send to the ship that launched the missile.&lt;br /&gt;
&lt;br /&gt;
 this.shipFiredMissile = function(missile, target)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipTargetLost&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipTargetLost&amp;lt;/code&amp;gt; handler is called when the target gets lost. &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; contains the lost target entity.&lt;br /&gt;
&lt;br /&gt;
 this.shipTargetLost = function(target)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipTargetCloaked&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipTargetCloaked&amp;lt;/code&amp;gt; handler is called when the target cloakes.&lt;br /&gt;
&lt;br /&gt;
 this.shipTargetCloaked = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;weaponsSystemsToggled&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;weaponsSystemsToggled&amp;lt;/code&amp;gt; handler is called whenever the player toggles their weapons systems on or off. The &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; parameter contains the new state of the weapons systems&lt;br /&gt;
&lt;br /&gt;
 this.weaponsSystemsToggled = function(state : boolean)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Equipment and Cargo ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentAdded&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentAdded&amp;lt;/code&amp;gt; handler is called whenever the player ship gains an item of equipment. This includes &amp;quot;gaining&amp;quot; of &amp;lt;code&amp;gt;EQ_SOMETHING_DAMAGED&amp;lt;/code&amp;gt; when an &amp;lt;code&amp;gt;EQ_SOMETHING&amp;lt;/code&amp;gt; is damaged. This event will fire regardless of the reason for the equipment being added to the ship.&lt;br /&gt;
&lt;br /&gt;
 this.equipmentAdded = function(equipmentKey)&lt;br /&gt;
 {&lt;br /&gt;
       // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This is often more convenient than monitoring both &amp;lt;code&amp;gt;equipmentRepaired&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;playerBoughtEquipment&amp;lt;/code&amp;gt;, and will also detect equipment addition by script.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentDamaged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentDamaged&amp;lt;/code&amp;gt; handler is called when equipment gets damaged. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.equipmentDamaged = function(equipment)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentRemoved&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentRemoved&amp;lt;/code&amp;gt; handler is called whenever the player ship loses an item of equipment. This includes &amp;quot;losing&amp;quot; of &amp;lt;code&amp;gt;EQ_SOMETHING_DAMAGED&amp;lt;/code&amp;gt; when an &amp;lt;code&amp;gt;EQ_SOMETHING&amp;lt;/code&amp;gt; is repaired. This event will fire regardless of the reason for the equipment being removed from the ship.&lt;br /&gt;
&lt;br /&gt;
 this.equipmentRemoved = function(equipmentKey)&lt;br /&gt;
 {&lt;br /&gt;
       // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentRepaired&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentRepaired&amp;lt;/code&amp;gt; handler is called when equipment gets repaired. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.equipmentRepaired = function(equipment)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerBoughtCargo&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerBoughtCargo&amp;lt;/code&amp;gt; handler is called when cargo is bought at the market screen. &amp;lt;code&amp;gt;commodity&amp;lt;/code&amp;gt; contains the non-localised name for the cargo. You can get the localised name using &amp;lt;code&amp;gt;expandDescription(&amp;quot;[commodity-name &amp;quot;+commodity+&amp;quot;]&amp;quot;);&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;price&amp;lt;/code&amp;gt; is price per unit in tenths of a credit.&lt;br /&gt;
&lt;br /&gt;
 this.playerBoughtCargo = function(commodity, units, price)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerBoughtEquipment&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerBoughtEquipment&amp;lt;/code&amp;gt; handler is called when equipment is bought at the outfit screen.&lt;br /&gt;
&lt;br /&gt;
 this.playerBoughtEquipment = function(equipment, paid)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The 'paid' parameter is added from 1.89 onwards. This is the amount of credits the player paid for the equipment, including any refunds that might have been applied during the purchase (eg when purchasing a laser and installing it in a position where a laser is already fitted, the cost of the current laser will be refunded to the player during the purchase).&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; handler is called when a new ship is bought. May be needed to re-evaluate the old equipment as buying a new ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerBoughtNewShip = function(ship, price)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The 'price' parameter is added from 1.81 onwards. It is the cost of the ship (not counting any trade-in value of the player's old ship) in credits, or zero for changes using [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' In a future release of Oolite, &amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; will no longer be fired when the ship is replaced using the [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]] function. Instead, the &amp;lt;code&amp;gt;[[#playerReplacedShip|playerReplacedShip]]&amp;lt;/code&amp;gt; event should be used. At the moment, both events (&amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;playerReplacedShip&amp;lt;/code&amp;gt;) will fire.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerWillBuyNewShip|playerWillBuyNewShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerChangedPrimedEquipment&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerChangedPrimedEquipment&amp;lt;/code&amp;gt; handler is called whenever the player changes the currently primed equipment (either with shift-n or ctrl-shift-n). The equipment key of the newly primed equipment will be passed as an argument.&lt;br /&gt;
&lt;br /&gt;
 this.playerChangedPrimedEquipment = function(equipmentKey)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerReplacedShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.89}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerReplacedShip&amp;lt;/code&amp;gt; handler is called when the player ship is replaced via the JS method [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]]. May be needed to re-evaluate the old equipment as replacing a ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerReplacedShip = function(ship)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerWillReplaceShip|playerWillReplaceShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerSoldCargo&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerSoldCargo&amp;lt;/code&amp;gt; handler is called when cargo is sold at the market screen. &amp;lt;code&amp;gt;commodity&amp;lt;/code&amp;gt; contains the non-localised name for the cargo. You can get the localised name using &amp;lt;code&amp;gt;expandDescription(&amp;quot;[commodity-name &amp;quot;+commodity+&amp;quot;]&amp;quot;);&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;price&amp;lt;/code&amp;gt; is price per unit in tenths of a credit.&lt;br /&gt;
&lt;br /&gt;
 this.playerSoldCargo = function(commodity, units, price)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipScoopedFuel&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipScoopedFuel&amp;lt;/code&amp;gt; handler is called whenever the player's ship transfers 0.1LY of fuel from the scoops to the tank.&lt;br /&gt;
&lt;br /&gt;
 this.shipScoopedFuel = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipScoopedOther&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipScoopedOther&amp;lt;/code&amp;gt; handler is called when a ship scoops cargo. The scooped item is transferred as argument.&amp;lt;br&amp;gt;If the cargo is scripted cargo, but not otherwise, then the scooped cargo itself gets the handler &amp;lt;code&amp;gt;shipWasScooped&amp;lt;/code&amp;gt; with the scooper as argument.&lt;br /&gt;
&lt;br /&gt;
 this.shipScoopedOther = function(whom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerWillBuyNewShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.89}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerWillBuyNewShip&amp;lt;/code&amp;gt; handler is called just before a new ship is bought. May be needed to re-evaluate the old equipment as buying a new ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerWillBuyNewShip = function(dataKey, shipyard, price, tradeIn)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; is the shipdata.plist &amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; for the ship being purchased.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;shipyard&amp;lt;/code&amp;gt; is a dictionary object containing details about the ship being purchased, with information similar to the following:&lt;br /&gt;
 {&lt;br /&gt;
    short_description: &amp;quot;Python: Plus Galactic Hyperdrive. Extra Energy Unit. Docking Computers. E.C.M. System. Forward weapon upgraded to military laser. Price 215 000 ₢.&amp;quot;,&lt;br /&gt;
    shipdata_key: &amp;quot;python-player&amp;quot;,&lt;br /&gt;
    id: &amp;quot;675b6b-c60a74&amp;quot;,&lt;br /&gt;
    price: 215000,&lt;br /&gt;
    ship: {&lt;br /&gt;
      ...''[[shipdata.plist]]'' details of ship...&lt;br /&gt;
    },&lt;br /&gt;
    personality: 9807,&lt;br /&gt;
    extras: [&amp;quot;EQ_GAL_DRIVE&amp;quot;, &amp;quot;EQ_FUEL_SCOOPS&amp;quot;, &amp;quot;EQ_ENERGY_UNIT&amp;quot;, &amp;quot;EQ_FUEL_INJECTION&amp;quot;, &amp;quot;EQ_DOCK_COMP&amp;quot;, &amp;quot;EQ_ECM&amp;quot;]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;price&amp;lt;/code&amp;gt; is the amount being paid the for ship.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tradeIn&amp;lt;/code&amp;gt; is the trade in value of the current ship.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerBoughtNewShip|playerBoughtNewShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerWillReplaceShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.89}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerWillReplaceShip&amp;lt;/code&amp;gt; handler is called just before a ship is replaced using the [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]] function. May be needed to re-evaluate the old equipment as buying a new ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerWillReplaceShip = function(dataKey)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; is the shipdata.plist &amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; for the ship being purchased.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerReplacedShip|playerReplacedShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;chartHightlightModeChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.87}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;chartHighlightModeChanged&amp;lt;/code&amp;gt; handler is called whenever the highlight mode of the galactic chart is changed, either manually (from player input), or programmatically (by code setting the mode with &amp;lt;code&amp;gt;player.ship.chartHightlightMode&amp;lt;/code&amp;gt;. &amp;quot;newMode&amp;quot; is the new mode of the chart highlight, and will be one of the following:&lt;br /&gt;
&lt;br /&gt;
 OOLRC_MODE_SUNCOLOR&lt;br /&gt;
 OOLRC_MODE_ECONOMY&lt;br /&gt;
 OOLRC_MODE_GOVERNMENT&lt;br /&gt;
 OOLRC_MODE_TECHLEVEL&lt;br /&gt;
&lt;br /&gt;
 this.chartHightlightModeChanged = function(newMode)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;compassTargetChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;compassTargetChanged&amp;lt;/code&amp;gt; handler is called when a new target is selected. Mode can be any of the following:&lt;br /&gt;
&lt;br /&gt;
 COMPASS_MODE_BASIC&lt;br /&gt;
 COMPASS_MODE_PLANET&lt;br /&gt;
 COMPASS_MODE_STATION&lt;br /&gt;
 COMPASS_MODE_SUN&lt;br /&gt;
 COMPASS_MODE_TARGET&lt;br /&gt;
 COMPASS_MODE_BEACONS&lt;br /&gt;
&lt;br /&gt;
script example &lt;br /&gt;
&lt;br /&gt;
 this.compassTargetChanged = function(whom, mode)&lt;br /&gt;
 {&lt;br /&gt;
      log(' Now targeting ' + whom);&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;dayChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;dayChanged&amp;lt;/code&amp;gt; handler is called each time a new day starts. At very low frame rates while the clock is updating, it is possible for this handler to be called twice in the same frame. Therefore, clock.days will not be correct for one of the calls. Use the day number passed to the function instead.&lt;br /&gt;
&lt;br /&gt;
 this.dayChanged = function(newday)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;escapePodSequenceOver&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;escapePodSequenceOver&amp;lt;/code&amp;gt; handler is called at the end of the escape pod sequence, after the &amp;lt;code&amp;gt;shipLaunchedEscapePod&amp;lt;/code&amp;gt; event and just prior to the &amp;lt;code&amp;gt;shipWillDockWithStation&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;shipDockedWithStation&amp;lt;/code&amp;gt; events. &lt;br /&gt;
&lt;br /&gt;
Use this function if you need to override the destination for the escape pod with the player method [[Oolite_JavaScript_Reference:_Player#setEscapePodDestination|&amp;lt;code&amp;gt;player.setEscapePodDestination()&amp;lt;/code&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
 this.escapePodSequenceOver = function() &lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;guiScreenChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;guiScreenChanged&amp;lt;/code&amp;gt; handler is called when the guiScreen changes. &amp;quot;from&amp;quot; is the screen it is changing from and &amp;quot;to&amp;quot; is the screen were it initially switched to. Note that the screen can have changed again in the meantime by the action of other oxps. Therefor, it will generally better to test for the global &amp;lt;code&amp;gt;guiScreen&amp;lt;/code&amp;gt; to see which page is really on display instead of using the &amp;quot;to&amp;quot; parameter. (world script only)&amp;lt;br&amp;gt;&lt;br /&gt;
This handler will not fire for every screen the player can switch to, but only when switching to any of the following screens: &lt;br /&gt;
&lt;br /&gt;
1.76: &amp;lt;code&amp;gt;GUI_SCREEN_MAIN, GUI_SCREEN_STATUS, GUI_SCREEN_MANIFEST, GUI_SCREEN_SYSTEM_DATA, GUI_SCREEN_OPTIONS, GUI_SCREEN_EQUIP_SHIP, GUI_SCREEN_SHIPYARD, GUI_SCREEN_SHORT_RANGE_CHART, GUI_SCREEN_LONG_RANGE_CHART, GUI_SCREEN_MARKET, GUI_SCREEN_CONTRACTS, GUI_SCREEN_REPORT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.77: adds &amp;lt;code&amp;gt;GUI_SCREEN_INTERFACES&amp;lt;/code&amp;gt; and removes &amp;lt;code&amp;gt;GUI_SCREEN_CONTRACTS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 this.guiScreenChanged = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;guiScreenWillChange&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;guiScreenWillChange&amp;lt;/code&amp;gt; handler is called when the guiScreen is about to change.  It only fires for the screens: &amp;lt;code&amp;gt;GUI_SCREEN_EQUIP_SHIP, GUI_SCREEN_MANIFEST, GUI_SCREEN_MARKET, GUI_SCREEN_SHIPYARD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;GUI_SCREEN_SYSTEM_DATA&amp;lt;/code&amp;gt; (in 1.77, also &amp;lt;code&amp;gt;GUI_SCREEN_STATUS&amp;lt;/code&amp;gt;). On these screens a script could change the content of the page to be displayed. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.guiScreenWillChange = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;infoSystemChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.83}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;infoSystemChanged&amp;lt;/code&amp;gt; handler is called when the system displayed in F7 is changed, e.g. by moving the small blue cursor along the planned route in the chart.&lt;br /&gt;
&lt;br /&gt;
 this.infoSystemChanged = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;infoSystemWillChange&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;infoSystemWChange&amp;lt;/code&amp;gt; handler is called just before the system displayed in F7 is updated, e.g. by moving the small blue cursor along the planned route in the chart.&lt;br /&gt;
&lt;br /&gt;
 this.infoSystemWillChange = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;mfdKeyChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;mfdKeyChanged&amp;lt;/code&amp;gt; handler is called whenever the player changes the content of an MFD slot. The &amp;lt;code&amp;gt;activeMFD&amp;lt;/code&amp;gt; parameter identifies which MFD slot is being changed, and the &amp;lt;code&amp;gt;mfdKey&amp;lt;/code&amp;gt; specifies the key code now in use in this slot.&lt;br /&gt;
&lt;br /&gt;
 this.mfdKeyChanged = function(activeMFD : integer, mfdKey : string)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[Oolite JavaScript Reference: PlayerShip#setMultiFunctionDisplay|PlayerShip.setMultiFunctionDisplay()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;missionChoiceWasReset&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;missionChoiceWasReset&amp;lt;/code&amp;gt; handler is called when the mission choice is set to null via script (either using the legacy script method resetMissionChice, or using mission.choice = null; in javascript)&lt;br /&gt;
&lt;br /&gt;
 this.missionChoiceWasReset= function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;missionScreenEnded&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;missionScreenEnded&amp;lt;/code&amp;gt; handler is called when the missionscreen ends. Note that an other script may have put up a new missionscreen in the meantime. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.missionScreenEnded = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;missionScreenOpportunity&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;missionScreenOpportunity&amp;lt;/code&amp;gt; handler is called if there are no mission / report screens active, and the player is docked to a station. It gets fired at game startup, upon docking, and after a docking report or previous mission screen has ended.  (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.missionScreenOpportunity= function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This handler works a bit different as other handlers. It fires for every installed oxp, until an oxp creates a mission screen during this handler. Than it stops. When the mission screen ends and there is no callback function that created a new mission screen, than the missionScreenOpportunity is send again to all installed oxps, starting with the oxp that used the mission screen as last one. All this means that when this handler fires, it is safe to show a mission screen and no further test are needed.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;reportScreenEnded&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;reportScreenEnded&amp;lt;/code&amp;gt; handler is called when the last arrival-report  screen ends. This is a screen that should not be written by a missionscreen. The code should wait until this eventhandler fires. Note that an other script may have put up a new missionscreen in the meantime. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.reportScreenEnded = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;selectedMFDChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;selectedMFDChanged&amp;lt;/code&amp;gt; handler is send whenever the player selects a new MFD slot (normally using the default keypress &amp;quot;;&amp;quot;). The &amp;lt;code&amp;gt;activeMFD&amp;lt;/code&amp;gt; paramater is the index of the MFD which is now active.&lt;br /&gt;
&lt;br /&gt;
 this.selectedMFDChanged = function(activeMFD : integer)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipCollided&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipCollided&amp;lt;/code&amp;gt; handler is send after a collision with otherShip.&lt;br /&gt;
&lt;br /&gt;
 this.shipCollided = function(otherShip)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipSpawned&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipSpawned&amp;lt;/code&amp;gt; handler is called after an NPC ship has been added to the system. After a witchspace jump it means that first all ships are added to the system, then all the relevant shipSpawned events are triggered.&amp;lt;br&amp;gt;&lt;br /&gt;
This handler for the worldScript is new since Oolite 1.74. After the event is sent to the shipScript, it is now also send to the worldScript with the added entity as argument.&lt;br /&gt;
&lt;br /&gt;
 this.shipSpawned = function(ship)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipLaunchedEscapePod&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipLaunchedEscapePod&amp;lt;/code&amp;gt; handler is called when the player bails out. This will be followed by the &amp;lt;code&amp;gt;escapePodSequenceOver&amp;lt;/code&amp;gt; event, and then a &amp;lt;code&amp;gt;shipWillDockWithStation()&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;shipDockedWithStation()&amp;lt;/code&amp;gt; pair after a few seconds.&lt;br /&gt;
&lt;br /&gt;
 this.shipLaunchedEscapePod = function(escapepod)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;systemInformationChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;systemInformationChanged&amp;lt;/code&amp;gt; handler is called when system information is modified. It is passed the galaxy and system ID which were changed, and the key and new value in the SystemInfo object.&lt;br /&gt;
&lt;br /&gt;
To avoid problems with recursion, attempting to change the value of any system information property from within this function will fail and log an error. Also note that changes which take place while Oolite is not running (from OXP planetinfo.plist files) will not cause this handler to be called when the game is reloaded.&lt;br /&gt;
&lt;br /&gt;
 this.systemInformationChanged = function(galaxy,system,key,newValue)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;viewDirectionChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;viewDirectionChanged&amp;lt;/code&amp;gt; handler is called when the player view changes, with a string to indicate which view the player is facing. Amongst its possible values are &amp;quot;VIEW_FORWARD&amp;quot;, &amp;quot;VIEW_AFT&amp;quot;, &amp;quot;VIEW_PORT&amp;quot;, &amp;quot;VIEW_STARBOARD&amp;quot;,&lt;br /&gt;
&amp;quot;VIEW_CUSTOM&amp;quot;,&lt;br /&gt;
&amp;quot;VIEW_GUI_DISPLAY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 this.viewDirectionChanged = function(viewString)&lt;br /&gt;
 {&lt;br /&gt;
   if (viewString == &amp;quot;VIEW_PORT&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
      // Your code here&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== System population ===&lt;br /&gt;
&lt;br /&gt;
In Oolite 1.79 and later, functions are called to populate and repopulate the system. These functions do not have fixed names, as they depend on the system, but otherwise act like normal worldscript functions. [[Oolite System Populator|The populator page]] has more documentation on these functions.&lt;br /&gt;
&lt;br /&gt;
=== Defunct ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentDestroyed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
''Handler no longer exists in current stable version 1.80''&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentDestroyed&amp;lt;/code&amp;gt; handler is called when equipment gets destroyed completely beyond repair. (in strict mode, 1.77 or earlier only)  (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.equipmentDestroyed = function(equipment)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;tickle&amp;lt;/code&amp;gt; (removed in 1.77) ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;tickle&amp;lt;/code&amp;gt; handler is called periodically-ish, whenever the old [[property list|plist]] scripts are updated. &amp;lt;code&amp;gt;tickle()&amp;lt;/code&amp;gt; is deprecated. In new code, use appropriate event handlers or [[Oolite JavaScript Reference: Timer|timers]] instead.&lt;br /&gt;
&lt;br /&gt;
=== Missing Events ===&lt;br /&gt;
&lt;br /&gt;
All the initially planned events have been implemented in 1.74.&lt;br /&gt;
&lt;br /&gt;
If there are other events you would like to be able to respond to, please write a request [http://www.aegidian.org/bb/viewtopic.php?t=3296 on the forum].&lt;br /&gt;
&lt;br /&gt;
'''See also:''' [[Oolite JavaScript Reference: Ship script event handlers|ship script event handlers]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite JavaScript Reference]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_World_script_event_handlers&amp;diff=58502</id>
		<title>Oolite JavaScript Reference: World script event handlers</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_World_script_event_handlers&amp;diff=58502"/>
		<updated>2020-06-24T11:58:30Z</updated>

		<summary type="html">&lt;p&gt;Milo: playerStartedAutoPilot is called with an argument&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page provides a list of event handlers which can be implemented inside world scripts [[Scripting Oolite with JavaScript|JavaScript scripts for Oolite]]. Additionally, ship script handlers called on the player's ship will cause an equivalent world script event.&lt;br /&gt;
&lt;br /&gt;
Most event handlers can be used both in world scripts and in ship scripts. Generally speaking, handlers starting with &amp;quot;ship&amp;quot; can be used for both scripts and those starting with &amp;quot;player&amp;quot; are meant only for the player (= can only be used in a world script). Exceptions on this rule are mentioned with the individual handlers below. &lt;br /&gt;
&lt;br /&gt;
World scripts can be either found inside Config\script.js, or be distinctly named .js files inside the Scripts directory - in the latter case, the worldScript.plist will list the active world scripts.&lt;br /&gt;
&lt;br /&gt;
World scripts are always active.&lt;br /&gt;
&lt;br /&gt;
The list of event handlers will change from version to version (usually additions of extra handlers). For this reason, any variables or functions you create as &amp;lt;code&amp;gt;this.variable&amp;lt;/code&amp;gt; should have a name beginning with '_' or '$' - e.g. &amp;lt;code&amp;gt;this._variable&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;this.$variable&amp;lt;/code&amp;gt; - to avoid potential conflicts with future event handlers (which will never start with '_' or '$').&lt;br /&gt;
&lt;br /&gt;
=== Game State ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;gamePaused&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
This event is called when the game is paused. This is mainly useful for pausing sound playback which should not continue while the game is paused.&lt;br /&gt;
&lt;br /&gt;
 this.gamePaused = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;gameResumed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
This event is called when the game is resumed from pause. This is mainly useful for resuming sound playback paused in a &amp;lt;code&amp;gt;gamePaused&amp;lt;/code&amp;gt; handler.&lt;br /&gt;
&lt;br /&gt;
 this.gameResumed = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerWillSaveGame&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerWillSaveGame&amp;lt;/code&amp;gt; handler is called whenever the player saves a game. The transferred message is one of the following strings: 'standardSave', 'autoSave' or 'quickSave'&lt;br /&gt;
&lt;br /&gt;
 this.playerWillSaveGame = function(message : String)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Using this event is useful for storing temporary variables in missionVariables, just before the game gets saved. missionVariables are slow in use compared to normal JS variables, therefor their use should be minimised for efficient code. The main benefit of using missionVariables is that they are saved in a saved game.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;startUp&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;startUp&amp;lt;/code&amp;gt; handler is called after all OXPs have been loaded. This also means that it is called every time the player loads a game, begins a new game or presses space after dying. It can be used to do one-off initialisation such as copying mission variables into &amp;lt;code&amp;gt;this.*&amp;lt;/code&amp;gt; properties for efficiency or setting up data arrays to be used by the script in other handlers. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.startUp = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that from Oolite 1.79 onwards the player will be in the main station while this function is run, but may be moved from there to another station soon after.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;startUpComplete&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;startUpComplete&amp;lt;/code&amp;gt; handler is run at game startup after the initial population of the system has been complete, and after the player has been moved to the station recorded in their save game. The order of world events at game start is therefore:&lt;br /&gt;
* &amp;lt;code&amp;gt;startUp&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;systemWillPopulate&amp;lt;/code&amp;gt; (or an alternative handler specified by the system info)&lt;br /&gt;
* &amp;lt;code&amp;gt;startUpComplete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Docking ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillDockWithStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillDockWithStation&amp;lt;/code&amp;gt; handler is called at the beginning of the docking tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipWillDockWithStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == null&amp;quot;, &amp;quot;ship.docked == true&amp;quot;, &amp;quot;ship.status == STATUS_DOCKING&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipDockedWithStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipDockedWithStation&amp;lt;/code&amp;gt; handler is called at the end of the docking tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipDockedWithStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == the station&amp;quot;, &amp;quot;ship.docked == true&amp;quot;, &amp;quot;ship.status == STATUS_DOCKED&amp;quot; and &amp;quot;gui_screen&amp;quot; is either GUI_SCREEN_STATUS or GUI_SCREEN_REPORT. However, any identical handler from an other oxp could have changed those values. Never count on it but double check when important.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillLaunchFromStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillLaunchFromStation&amp;lt;/code&amp;gt; handler is called at the beginning of the launch tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipWillLaunchFromStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == the station&amp;quot;, &amp;quot;ship.docked == false&amp;quot;, &amp;quot;ship.status == STATUS_LAUNCHING&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipLaunchedFromStation&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipLaunchedFromStation&amp;lt;/code&amp;gt; handler is called at the end of the launch tunnel effect.&lt;br /&gt;
&lt;br /&gt;
 this.shipLaunchedFromStation = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
At this moment &amp;quot;ship.dockedStation == null&amp;quot;, &amp;quot;ship.docked == false&amp;quot;, &amp;quot;ship.status == STATUS_IN_FLIGHT&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerStartedAutoPilot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerStartedAutoPilot&amp;lt;/code&amp;gt; handler is called when the player starts autopilot docking. It is not called for the instantaneous dock command. The handler is called with an argument containing the station entity that is the docking target.&lt;br /&gt;
&lt;br /&gt;
 this.playerStartedAutoPilot = function(stationForDocking)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerCancelledAutoPilot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerCancelledAutoPilot&amp;lt;/code&amp;gt; handler is called when the player cancels autopilot docking.&lt;br /&gt;
&lt;br /&gt;
 this.playerCancelledAutoPilot = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingClearanceCancelled&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingClearanceCancelled&amp;lt;/code&amp;gt; handler is called when the player withdraws their request to dock at a station. &lt;br /&gt;
&lt;br /&gt;
 this.playerDockingClearanceCancelled = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingClearanceExpired&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.83}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingClearanceExpired&amp;lt;/code&amp;gt; handler is called when the player exceeds the two minute window without requesting an extension&lt;br /&gt;
&lt;br /&gt;
 this.playerDockingClearanceExpired = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingClearanceGranted&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingClearanceGranted&amp;lt;/code&amp;gt; handler is called when the player is given permission to dock at a station. If the player is given immediate clearance to dock, this event will be called immediately after the &amp;lt;code&amp;gt;playerRequestedDockingClearance&amp;lt;/code&amp;gt; event. If, however, the station is unable to give immediate clearance, then there will be some delay between the request to dock and permission being granted. This event will be called when the station actually gives docking clearance.&lt;br /&gt;
&lt;br /&gt;
 this.playerDockingClearanceGranted = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerDockingRefused&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerDockingRefused&amp;lt;/code&amp;gt; handler is called when a station refuses to provide autopilot docking instructions.&lt;br /&gt;
&lt;br /&gt;
 this.playerDockingRefused = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerRequestedDockingClearance&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerRequestedDockingClearance&amp;lt;/code&amp;gt; handler is called when a station answers on a docking request of the player by targeting the station and pressing L (shift-l).&lt;br /&gt;
&lt;br /&gt;
 this.playerRequestedDockingClearance = function(message)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Message is a string and can take the values: &amp;quot;DOCKING_CLEARANCE_GRANTED&amp;quot;, &amp;quot;DOCKING_CLEARANCE_DENIED_TRAFFIC_OUTBOUND&amp;quot;, &amp;quot;DOCKING_CLEARANCE_DENIED_TRAFFIC_INBOUND&amp;quot;,  &amp;quot;DOCKING_CLEARANCE_DENIED_SHIP_FUGITIVE&amp;quot;, &amp;quot;DOCKING_CLEARANCE_NOT_REQUIRED&amp;quot;, &amp;quot;DOCKING_CLEARANCE_EXTENDED&amp;quot; or &amp;quot;DOCKING_CLEARANCE_CANCELLED&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerRescuedEscapePod&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerRescuedEscapePod&amp;lt;/code&amp;gt; handler is called when the player rescues an escape pod which does not have scripted content (all consequences of scripted content escape pods are assumed to be dealt with by the specified script instead). It has three parameters:&lt;br /&gt;
# the rescue fee, in decicredits&lt;br /&gt;
# the fee reason, which can be &amp;quot;insurance&amp;quot;, &amp;quot;bounty&amp;quot; or &amp;quot;slave&amp;quot; (in the latter case, the fee will always be zero)&lt;br /&gt;
# a dictionary like those in the &amp;lt;code&amp;gt;ship.crew&amp;lt;/code&amp;gt; property describing the pod occupant&lt;br /&gt;
&lt;br /&gt;
 this.playerRescuedEscapePod = function(fee, reason, occupant)&lt;br /&gt;
 {&lt;br /&gt;
     // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This method is called after the escape pod has been processed, but slightly before the arrival report screen giving the results of the processing is displayed to the player.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerCompletedContract&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerCompletedContract&amp;lt;/code&amp;gt; handler is called when a passenger, parcel or cargo contract ends, either successfully or by defaulting on it. It is not called when all contracts are cancelled on a galactic jump. It has four parameters:&lt;br /&gt;
# The type of contract, which can be &amp;quot;cargo&amp;quot;, &amp;quot;parcel&amp;quot; or &amp;quot;passenger&amp;quot;&lt;br /&gt;
# The result of the contract, which can be &amp;quot;success&amp;quot;, &amp;quot;late&amp;quot;, &amp;quot;failed&amp;quot;, or for cargo contracts only &amp;quot;short&amp;quot;&lt;br /&gt;
# The fee paid for the contract in decicredits&lt;br /&gt;
# The contract information dictionary&lt;br /&gt;
Note that the fee actually paid for the contract will often ''not'' match the originally agreed fee in the contract information dictionary, as penalties for late delivery or bonuses for good service are included in the fee parameter.&lt;br /&gt;
&lt;br /&gt;
 this.playerCompletedContract = function(type, result, fee, contract)&lt;br /&gt;
 {&lt;br /&gt;
     // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This method is called after the contract has been processed, but slightly before the arrival report screen giving the results of the processing is displayed to the player.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerEnteredContract&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerEnteredContract&amp;lt;/code&amp;gt; handler is called when a passenger, parcel or cargo contract starts, just after the items have been transferred to the player ship. It has two parameters:&lt;br /&gt;
# The type of contract, which can be &amp;quot;cargo&amp;quot;, &amp;quot;parcel&amp;quot; or &amp;quot;passenger&amp;quot;&lt;br /&gt;
# The contract information dictionary&lt;br /&gt;
&lt;br /&gt;
 this.playerEnteredContract = function(type, contract)&lt;br /&gt;
 {&lt;br /&gt;
     // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Witchspace Jumps ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerStartedJumpCountdown&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerStartedJumpCountdown&amp;lt;/code&amp;gt; handler is called when the user starts a witchspace or galactic witchspace jump countdown. The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; parameter is a string specifying which type of jump is occuring; currently, the possible values are “standard” and “galactic”. Other values may be added in future. The &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; parameter is a number specifying the number of seconds the countdown is running for.&lt;br /&gt;
&lt;br /&gt;
 this.playerStartedJumpCountdown = function(type, seconds)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerCancelledJumpCountdown&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerCancelledJumpCountdown&amp;lt;/code&amp;gt; handler is called when the user cancels a witchspace or galactic witchspace jump countdown.&lt;br /&gt;
&lt;br /&gt;
 this.playerCancelledJumpCountdown = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerJumpFailed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerJumpFailed&amp;lt;/code&amp;gt; handler is called at the end of a witchspace or galactic witchspace countdown, if the jump is not possible. The &amp;lt;code&amp;gt;reason&amp;lt;/code&amp;gt; parameter is a string specifying why the jump failed. The current values are:&lt;br /&gt;
* '''&amp;quot;insufficient fuel&amp;quot;''' - the ship no longer has enough fuel to make the jump (e.g. injector use or fuel leak).&lt;br /&gt;
* '''&amp;quot;blocked&amp;quot;''' - a heavy ship is near the player (specifically &amp;lt;code&amp;gt;object mass&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;object distance&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &amp;gt;= 10.0, and &amp;lt;code&amp;gt;object distance&amp;lt;/code&amp;gt; &amp;lt;= scanner range).&lt;br /&gt;
* '''&amp;quot;malfunction&amp;quot;''' - the jump malfunctioned in a way that leaves the player ship in the current system.&lt;br /&gt;
* '''&amp;quot;malfunction&amp;quot;''' - the Galactic Hyperdrive is damaged or removed during a galactic jump countdown.&lt;br /&gt;
&lt;br /&gt;
Also theoretically possible but unlikely in current Oolite:&lt;br /&gt;
* '''&amp;quot;too far&amp;quot;''' - the jump destination is outside the 7LY range (but wasn't when the countdown started).&lt;br /&gt;
* '''&amp;quot;no target&amp;quot;''' - the jump destination is the current location (but wasn't when the countdown started).&lt;br /&gt;
&lt;br /&gt;
 this.playerJumpFailed = function(reason)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillEnterWitchspace&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillEnterWitchspace&amp;lt;/code&amp;gt; handler is called immediately before a witchspace jump, while the player is still in the starting system. The &amp;lt;code&amp;gt;cause&amp;lt;/code&amp;gt; parameter is a string specifying what sort of jump is occuring; currently, the possible values are “standard jump”, “galactic jump” and “wormhole”. Other values may be added in future.&lt;br /&gt;
&lt;br /&gt;
 // 1.80 or earlier&lt;br /&gt;
 this.shipWillEnterWitchspace = function(cause)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In 1.81 or later the handler gains a second parameter, describing the jump destination. For standard and wormhole jumps, this will be the system ID of the destination system. For galactic jumps, this will be the galaxy ID of the destination galaxy. (As [[Oolite JavaScript Reference: PlayerShip#galacticHyperspaceBehaviour|player.ship.galacticHyperspaceBehaviour]] may be changed during &amp;lt;code&amp;gt;shipWillEnterWitchspace&amp;lt;/code&amp;gt;, it is not possible to predict in advance of a galactic jump being made what the resulting system ID in the destination galaxy will be)&lt;br /&gt;
&lt;br /&gt;
 // 1.81 or later&lt;br /&gt;
 this.shipWillEnterWitchspace = function(cause, destination)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipWillExitWitchspace&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipWillExitWitchspace&amp;lt;/code&amp;gt; handler is called as a witchspace jump concludes. When it is called, the player is (from a program perspective) in the destination system, but the tunnel effect has not yet been shown. Use this event to set up elements which need to be present in-system after the player exits witchspace.&lt;br /&gt;
&lt;br /&gt;
 this.shipWillExitWitchspace = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipExitedWitchspace&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipExitedWitchspace&amp;lt;/code&amp;gt; handler is called after a witchspace jump has concluded and the tunnel effect has been shown.&lt;br /&gt;
&lt;br /&gt;
 this.shipExitedWitchspace = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerEnteredNewGalaxy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerEnteredNewGalaxy&amp;lt;/code&amp;gt; handler is called just before shipWillExitWitchspace.&lt;br /&gt;
&lt;br /&gt;
the sequence of events for a player jumping to a different galaxy is as follows:&lt;br /&gt;
&lt;br /&gt;
shipWillEnterWitchspace (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
playerWillEnterWitchspace (NPC ship event)&amp;lt;br&amp;gt;&lt;br /&gt;
playerEnteredNewGalaxy (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
shipWillExitWitchspace (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
shipExitedWitchspace (world event)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 this.playerEnteredNewGalaxy = function(galaxyNumber)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Enter/Exit Aegis ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipEnteredStationAegis&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipEnteredStationAegis&amp;lt;/code&amp;gt; handler is called when the player enters the aegis of the main-station (2x scanner range from main-station). Other stations than the main-station don't give aegis messages.&lt;br /&gt;
&lt;br /&gt;
 this.shipEnteredStationAegis = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipExitedStationAegis&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipExitedStationAegis&amp;lt;/code&amp;gt; handler is called when the player leaves the aegis of the main-station (2x scanner range from main-station).&lt;br /&gt;
&lt;br /&gt;
 this.shipExitedStationAegis = function(station)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipEnteredPlanetaryVicinity&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipEnteredPlanetaryVicinity&amp;lt;/code&amp;gt; handler is called when the player enters the planet aegis (3x planet radius).&lt;br /&gt;
&lt;br /&gt;
 this.shipEnteredPlanetaryVicinity = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipExitedPlanetaryVicinity&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipExitedPlanetaryVicinity&amp;lt;/code&amp;gt; handler is called when the player leaves the planet aegis (3x planet radius).&lt;br /&gt;
&lt;br /&gt;
 this.shipExitedPlanetaryVicinity = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipApproachingPlanetSurface&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipApproachingPlanetSurface&amp;lt;/code&amp;gt; handler is called when the player is very close to the planet (crosses a border ± 500 meter above the surface).&lt;br /&gt;
&lt;br /&gt;
 this.shipApproachingPlanetSurface = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipLeavingPlanetSurface&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipLeavingPlanetSurface&amp;lt;/code&amp;gt; handler is called when the player leaves the planet (crosses a border ± 500 meter above the surface).&lt;br /&gt;
&lt;br /&gt;
 this.shipLeavingPlanetSurface = function(planet)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Combat ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;alertConditionChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;alertConditionChanged&amp;lt;/code&amp;gt; handler is called when the player’s alert status (&amp;lt;code&amp;gt;[[Oolite JavaScript Reference: Player#alertCondition|player.alertCondition]]&amp;lt;/code&amp;gt;) changes. Only the player and stations have an alert condition. (world script and station scripts)&lt;br /&gt;
&lt;br /&gt;
 this.alertConditionChanged = function(newCondition, oldCondition)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerTargetedMissile&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerTargetedMissile&amp;lt;/code&amp;gt; handler is called when the player targets the nearest missile by pressing T (shift-t) on the keybord.&lt;br /&gt;
&lt;br /&gt;
 this.playerTargetedMissile = function(missile)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipAttackedOther&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipAttackedOther&amp;lt;/code&amp;gt; handler is called when the player hits another with a laser shot. &amp;lt;code&amp;gt;other&amp;lt;/code&amp;gt; is the identity of the ship being hit.&lt;br /&gt;
&lt;br /&gt;
 this.shipAttackedOther = function(other)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipAttackedWithMissile&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipAttackedWithMissile&amp;lt;/code&amp;gt; handler is called when a missile is fired. &amp;lt;code&amp;gt;missile&amp;lt;/code&amp;gt; contains the missile entity and &amp;lt;code&amp;gt;whom&amp;lt;/code&amp;gt; the identity of the ship that launched the missile.&lt;br /&gt;
&lt;br /&gt;
 this.shipAttackedWithMissile = function(missile, whom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipBeingAttacked&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipBeingAttacked&amp;lt;/code&amp;gt; handler is called when a laser shot  hits. &amp;lt;code&amp;gt;whom&amp;lt;/code&amp;gt; the identity of the ship that attacked.&lt;br /&gt;
&lt;br /&gt;
 this.shipBeingAttacked = function(whom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipBeingAttackedByCloaked&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipBeingAttackedByCloaked&amp;lt;/code&amp;gt; handler is called when a laser shot from a cloaked ship hits. Guess what, there is no parameter because he is cloaked!&lt;br /&gt;
&lt;br /&gt;
 this.shipBeingAttackedByCloaked = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipKilledOther&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.75}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipKilledOther&amp;lt;/code&amp;gt; handler is called when a ship kills an other ship. &amp;lt;code&amp;gt;whom&amp;lt;/code&amp;gt; the identity of the ship that was killed. &amp;lt;code&amp;gt;damageType&amp;lt;/code&amp;gt; is the type of damage.&lt;br /&gt;
&lt;br /&gt;
 this.shipKilledOther = function(whom : ship, damageType : string)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipReleasedEquipment&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipReleasedEquipment&amp;lt;/code&amp;gt; handler is called when a ship launches a mine (a pylon-mounted equipment item whose key ends with &amp;quot;_MINE&amp;quot;). &amp;lt;code&amp;gt;mine&amp;lt;/code&amp;gt; contains the launched mine entity.&lt;br /&gt;
&lt;br /&gt;
 this.shipReleasedEquipment = function(mine)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipTargetDestroyed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipTargetDestroyed&amp;lt;/code&amp;gt; handler is called when the target gets destroyed by the player. &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; contains the destroyed target entity. This command is always preceded by the &amp;lt;code&amp;gt;shipTargetLost&amp;lt;/code&amp;gt; handler.&lt;br /&gt;
&lt;br /&gt;
 this.shipTargetDestroyed = function(target)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipDied&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipDied&amp;lt;/code&amp;gt; handler is called when the ship or player dies. Expect a &amp;lt;code&amp;gt;reset()&amp;lt;/code&amp;gt; shortly when it is the player ship.&lt;br /&gt;
&lt;br /&gt;
 this.shipDied = function(whom, why)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
'''whom''' contains the entity that caused the kill. '''why''' is the cause written as string and is one of: &amp;quot;removed&amp;quot;, &amp;quot;hit a planet&amp;quot;, &amp;quot;energy damage&amp;quot;, &amp;quot;scrape damage&amp;quot;, &amp;quot;heat damage&amp;quot;, &amp;quot;cascade weapon&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
(&amp;quot;cascade weapon&amp;quot; is new in 1.74 and  &amp;quot;removed&amp;quot; / &amp;quot;energy damage&amp;quot; were accidentally switched in 1.73)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipFiredMissile&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipFiredMissile&amp;lt;/code&amp;gt; handler is called when a missile is fired. &amp;lt;code&amp;gt;missile&amp;lt;/code&amp;gt; contains the missile entity and &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; the identity of the target. The handler is send to the ship that launched the missile.&lt;br /&gt;
&lt;br /&gt;
 this.shipFiredMissile = function(missile, target)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipTargetLost&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipTargetLost&amp;lt;/code&amp;gt; handler is called when the target gets lost. &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; contains the lost target entity.&lt;br /&gt;
&lt;br /&gt;
 this.shipTargetLost = function(target)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipTargetCloaked&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipTargetCloaked&amp;lt;/code&amp;gt; handler is called when the target cloakes.&lt;br /&gt;
&lt;br /&gt;
 this.shipTargetCloaked = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;weaponsSystemsToggled&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;weaponsSystemsToggled&amp;lt;/code&amp;gt; handler is called whenever the player toggles their weapons systems on or off. The &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; parameter contains the new state of the weapons systems&lt;br /&gt;
&lt;br /&gt;
 this.weaponsSystemsToggled = function(state : boolean)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Equipment and Cargo ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentAdded&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentAdded&amp;lt;/code&amp;gt; handler is called whenever the player ship gains an item of equipment. This includes &amp;quot;gaining&amp;quot; of &amp;lt;code&amp;gt;EQ_SOMETHING_DAMAGED&amp;lt;/code&amp;gt; when an &amp;lt;code&amp;gt;EQ_SOMETHING&amp;lt;/code&amp;gt; is damaged. This event will fire regardless of the reason for the equipment being added to the ship.&lt;br /&gt;
&lt;br /&gt;
 this.equipmentAdded = function(equipmentKey)&lt;br /&gt;
 {&lt;br /&gt;
       // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This is often more convenient than monitoring both &amp;lt;code&amp;gt;equipmentRepaired&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;playerBoughtEquipment&amp;lt;/code&amp;gt;, and will also detect equipment addition by script.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentDamaged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentDamaged&amp;lt;/code&amp;gt; handler is called when equipment gets damaged. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.equipmentDamaged = function(equipment)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentRemoved&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.81}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentRemoved&amp;lt;/code&amp;gt; handler is called whenever the player ship loses an item of equipment. This includes &amp;quot;losing&amp;quot; of &amp;lt;code&amp;gt;EQ_SOMETHING_DAMAGED&amp;lt;/code&amp;gt; when an &amp;lt;code&amp;gt;EQ_SOMETHING&amp;lt;/code&amp;gt; is repaired. This event will fire regardless of the reason for the equipment being removed from the ship.&lt;br /&gt;
&lt;br /&gt;
 this.equipmentRemoved = function(equipmentKey)&lt;br /&gt;
 {&lt;br /&gt;
       // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentRepaired&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentRepaired&amp;lt;/code&amp;gt; handler is called when equipment gets repaired. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.equipmentRepaired = function(equipment)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerBoughtCargo&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerBoughtCargo&amp;lt;/code&amp;gt; handler is called when cargo is bought at the market screen. &amp;lt;code&amp;gt;commodity&amp;lt;/code&amp;gt; contains the non-localised name for the cargo. You can get the localised name using &amp;lt;code&amp;gt;expandDescription(&amp;quot;[commodity-name &amp;quot;+commodity+&amp;quot;]&amp;quot;);&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;price&amp;lt;/code&amp;gt; is price per unit in tenths of a credit.&lt;br /&gt;
&lt;br /&gt;
 this.playerBoughtCargo = function(commodity, units, price)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerBoughtEquipment&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerBoughtEquipment&amp;lt;/code&amp;gt; handler is called when equipment is bought at the outfit screen.&lt;br /&gt;
&lt;br /&gt;
 this.playerBoughtEquipment = function(equipment, paid)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The 'paid' parameter is added from 1.89 onwards. This is the amount of credits the player paid for the equipment, including any refunds that might have been applied during the purchase (eg when purchasing a laser and installing it in a position where a laser is already fitted, the cost of the current laser will be refunded to the player during the purchase).&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; handler is called when a new ship is bought. May be needed to re-evaluate the old equipment as buying a new ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerBoughtNewShip = function(ship, price)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The 'price' parameter is added from 1.81 onwards. It is the cost of the ship (not counting any trade-in value of the player's old ship) in credits, or zero for changes using [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' In a future release of Oolite, &amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; will no longer be fired when the ship is replaced using the [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]] function. Instead, the &amp;lt;code&amp;gt;[[#playerReplacedShip|playerReplacedShip]]&amp;lt;/code&amp;gt; event should be used. At the moment, both events (&amp;lt;code&amp;gt;playerBoughtNewShip&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;playerReplacedShip&amp;lt;/code&amp;gt;) will fire.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerWillBuyNewShip|playerWillBuyNewShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerChangedPrimedEquipment&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerChangedPrimedEquipment&amp;lt;/code&amp;gt; handler is called whenever the player changes the currently primed equipment (either with shift-n or ctrl-shift-n). The equipment key of the newly primed equipment will be passed as an argument.&lt;br /&gt;
&lt;br /&gt;
 this.playerChangedPrimedEquipment = function(equipmentKey)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerReplacedShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.89}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerReplacedShip&amp;lt;/code&amp;gt; handler is called when the player ship is replaced via the JS method [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]]. May be needed to re-evaluate the old equipment as replacing a ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerReplacedShip = function(ship)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerWillReplaceShip|playerWillReplaceShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerSoldCargo&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerSoldCargo&amp;lt;/code&amp;gt; handler is called when cargo is sold at the market screen. &amp;lt;code&amp;gt;commodity&amp;lt;/code&amp;gt; contains the non-localised name for the cargo. You can get the localised name using &amp;lt;code&amp;gt;expandDescription(&amp;quot;[commodity-name &amp;quot;+commodity+&amp;quot;]&amp;quot;);&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;price&amp;lt;/code&amp;gt; is price per unit in tenths of a credit.&lt;br /&gt;
&lt;br /&gt;
 this.playerSoldCargo = function(commodity, units, price)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipScoopedFuel&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipScoopedFuel&amp;lt;/code&amp;gt; handler is called whenever the player's ship transfers 0.1LY of fuel from the scoops to the tank.&lt;br /&gt;
&lt;br /&gt;
 this.shipScoopedFuel = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipScoopedOther&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipScoopedOther&amp;lt;/code&amp;gt; handler is called when a ship scoops cargo. The scooped item is transferred as argument.&amp;lt;br&amp;gt;If the cargo is scripted cargo, but not otherwise, then the scooped cargo itself gets the handler &amp;lt;code&amp;gt;shipWasScooped&amp;lt;/code&amp;gt; with the scooper as argument.&lt;br /&gt;
&lt;br /&gt;
 this.shipScoopedOther = function(whom)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerWillBuyNewShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.89}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerWillBuyNewShip&amp;lt;/code&amp;gt; handler is called just before a new ship is bought. May be needed to re-evaluate the old equipment as buying a new ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerWillBuyNewShip = function(dataKey, shipyard, price, tradeIn)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; is the shipdata.plist &amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; for the ship being purchased.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;shipyard&amp;lt;/code&amp;gt; is a dictionary object containing details about the ship being purchased, with information similar to the following:&lt;br /&gt;
 {&lt;br /&gt;
    short_description: &amp;quot;Python: Plus Galactic Hyperdrive. Extra Energy Unit. Docking Computers. E.C.M. System. Forward weapon upgraded to military laser. Price 215 000 ₢.&amp;quot;,&lt;br /&gt;
    shipdata_key: &amp;quot;python-player&amp;quot;,&lt;br /&gt;
    id: &amp;quot;675b6b-c60a74&amp;quot;,&lt;br /&gt;
    price: 215000,&lt;br /&gt;
    ship: {&lt;br /&gt;
      ...''[[shipdata.plist]]'' details of ship...&lt;br /&gt;
    },&lt;br /&gt;
    personality: 9807,&lt;br /&gt;
    extras: [&amp;quot;EQ_GAL_DRIVE&amp;quot;, &amp;quot;EQ_FUEL_SCOOPS&amp;quot;, &amp;quot;EQ_ENERGY_UNIT&amp;quot;, &amp;quot;EQ_FUEL_INJECTION&amp;quot;, &amp;quot;EQ_DOCK_COMP&amp;quot;, &amp;quot;EQ_ECM&amp;quot;]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;price&amp;lt;/code&amp;gt; is the amount being paid the for ship.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tradeIn&amp;lt;/code&amp;gt; is the trade in value of the current ship.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerBoughtNewShip|playerBoughtNewShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;playerWillReplaceShip&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{Oolite-method-added|1.89}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;playerWillReplaceShip&amp;lt;/code&amp;gt; handler is called just before a ship is replaced using the [[Oolite JavaScript Reference: Player#replaceShip|&amp;lt;code&amp;gt;player.replaceShip&amp;lt;/code&amp;gt;]] function. May be needed to re-evaluate the old equipment as buying a new ship does not trigger equipment removal.&lt;br /&gt;
&lt;br /&gt;
 this.playerWillReplaceShip = function(dataKey)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; is the shipdata.plist &amp;lt;code&amp;gt;dataKey&amp;lt;/code&amp;gt; for the ship being purchased.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#playerReplacedShip|playerReplacedShip]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;chartHightlightModeChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.87}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;chartHighlightModeChanged&amp;lt;/code&amp;gt; handler is called whenever the highlight mode of the galactic chart is changed, either manually (from player input), or programmatically (by code setting the mode with &amp;lt;code&amp;gt;player.ship.chartHightlightMode&amp;lt;/code&amp;gt;. &amp;quot;newMode&amp;quot; is the new mode of the chart highlight, and will be one of the following:&lt;br /&gt;
&lt;br /&gt;
 OOLRC_MODE_SUNCOLOR&lt;br /&gt;
 OOLRC_MODE_ECONOMY&lt;br /&gt;
 OOLRC_MODE_GOVERNMENT&lt;br /&gt;
 OOLRC_MODE_TECHLEVEL&lt;br /&gt;
&lt;br /&gt;
 this.chartHightlightModeChanged = function(newMode)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;compassTargetChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;compassTargetChanged&amp;lt;/code&amp;gt; handler is called when a new target is selected. Mode can be any of the following:&lt;br /&gt;
&lt;br /&gt;
 COMPASS_MODE_BASIC&lt;br /&gt;
 COMPASS_MODE_PLANET&lt;br /&gt;
 COMPASS_MODE_STATION&lt;br /&gt;
 COMPASS_MODE_SUN&lt;br /&gt;
 COMPASS_MODE_TARGET&lt;br /&gt;
 COMPASS_MODE_BEACONS&lt;br /&gt;
&lt;br /&gt;
script example &lt;br /&gt;
&lt;br /&gt;
 this.compassTargetChanged = function(whom, mode)&lt;br /&gt;
 {&lt;br /&gt;
      log(' Now targeting ' + whom);&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;dayChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.77}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;dayChanged&amp;lt;/code&amp;gt; handler is called each time a new day starts. At very low frame rates while the clock is updating, it is possible for this handler to be called twice in the same frame. Therefore, clock.days will not be correct for one of the calls. Use the day number passed to the function instead.&lt;br /&gt;
&lt;br /&gt;
 this.dayChanged = function(newday)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;escapePodSequenceOver&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;escapePodSequenceOver&amp;lt;/code&amp;gt; handler is called at the end of the escape pod sequence, after the &amp;lt;code&amp;gt;shipLaunchedEscapePod&amp;lt;/code&amp;gt; event and just prior to the &amp;lt;code&amp;gt;shipWillDockWithStation&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;shipDockedWithStation&amp;lt;/code&amp;gt; events. &lt;br /&gt;
&lt;br /&gt;
Use this function if you need to override the destination for the escape pod with the player method [[Oolite_JavaScript_Reference:_Player#setEscapePodDestination|&amp;lt;code&amp;gt;player.setEscapePodDestination()&amp;lt;/code&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
 this.escapePodSequenceOver = function() &lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;guiScreenChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;guiScreenChanged&amp;lt;/code&amp;gt; handler is called when the guiScreen changes. &amp;quot;from&amp;quot; is the screen it is changing from and &amp;quot;to&amp;quot; is the screen were it initially switched to. Note that the screen can have changed again in the meantime by the action of other oxps. Therefor, it will generally better to test for the global &amp;lt;code&amp;gt;guiScreen&amp;lt;/code&amp;gt; to see which page is really on display instead of using the &amp;quot;to&amp;quot; parameter. (world script only)&amp;lt;br&amp;gt;&lt;br /&gt;
This handler will not fire for every screen the player can switch to, but only when switching to any of the following screens: &lt;br /&gt;
&lt;br /&gt;
1.76: &amp;lt;code&amp;gt;GUI_SCREEN_MAIN, GUI_SCREEN_STATUS, GUI_SCREEN_MANIFEST, GUI_SCREEN_SYSTEM_DATA, GUI_SCREEN_OPTIONS, GUI_SCREEN_EQUIP_SHIP, GUI_SCREEN_SHIPYARD, GUI_SCREEN_SHORT_RANGE_CHART, GUI_SCREEN_LONG_RANGE_CHART, GUI_SCREEN_MARKET, GUI_SCREEN_CONTRACTS, GUI_SCREEN_REPORT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.77: adds &amp;lt;code&amp;gt;GUI_SCREEN_INTERFACES&amp;lt;/code&amp;gt; and removes &amp;lt;code&amp;gt;GUI_SCREEN_CONTRACTS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 this.guiScreenChanged = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;guiScreenWillChange&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;guiScreenWillChange&amp;lt;/code&amp;gt; handler is called when the guiScreen is about to change.  It only fires for the screens: &amp;lt;code&amp;gt;GUI_SCREEN_EQUIP_SHIP, GUI_SCREEN_MANIFEST, GUI_SCREEN_MARKET, GUI_SCREEN_SHIPYARD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;GUI_SCREEN_SYSTEM_DATA&amp;lt;/code&amp;gt; (in 1.77, also &amp;lt;code&amp;gt;GUI_SCREEN_STATUS&amp;lt;/code&amp;gt;). On these screens a script could change the content of the page to be displayed. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.guiScreenWillChange = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;infoSystemChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.83}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;infoSystemChanged&amp;lt;/code&amp;gt; handler is called when the system displayed in F7 is changed, e.g. by moving the small blue cursor along the planned route in the chart.&lt;br /&gt;
&lt;br /&gt;
 this.infoSystemChanged = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;infoSystemWillChange&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;infoSystemWChange&amp;lt;/code&amp;gt; handler is called just before the system displayed in F7 is updated, e.g. by moving the small blue cursor along the planned route in the chart.&lt;br /&gt;
&lt;br /&gt;
 this.infoSystemWillChange = function(to, from)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;mfdKeyChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;mfdKeyChanged&amp;lt;/code&amp;gt; handler is called whenever the player changes the content of an MFD slot. The &amp;lt;code&amp;gt;activeMFD&amp;lt;/code&amp;gt; parameter identifies which MFD slot is being changed, and the &amp;lt;code&amp;gt;mfdKey&amp;lt;/code&amp;gt; specifies the key code now in use in this slot.&lt;br /&gt;
&lt;br /&gt;
 this.mfdKeyChanged = function(activeMFD : integer, mfdKey : string)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[Oolite JavaScript Reference: PlayerShip#setMultiFunctionDisplay|PlayerShip.setMultiFunctionDisplay()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;missionChoiceWasReset&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;missionChoiceWasReset&amp;lt;/code&amp;gt; handler is called when the mission choice is set to null via script (either using the legacy script method resetMissionChice, or using mission.choice = null; in javascript)&lt;br /&gt;
&lt;br /&gt;
 this.missionChoiceWasReset= function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;missionScreenEnded&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;missionScreenEnded&amp;lt;/code&amp;gt; handler is called when the missionscreen ends. Note that an other script may have put up a new missionscreen in the meantime. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.missionScreenEnded = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;missionScreenOpportunity&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;missionScreenOpportunity&amp;lt;/code&amp;gt; handler is called if there are no mission / report screens active, and the player is docked to a station. It gets fired at game startup, upon docking, and after a docking report or previous mission screen has ended.  (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.missionScreenOpportunity= function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This handler works a bit different as other handlers. It fires for every installed oxp, until an oxp creates a mission screen during this handler. Than it stops. When the mission screen ends and there is no callback function that created a new mission screen, than the missionScreenOpportunity is send again to all installed oxps, starting with the oxp that used the mission screen as last one. All this means that when this handler fires, it is safe to show a mission screen and no further test are needed.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;reportScreenEnded&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;reportScreenEnded&amp;lt;/code&amp;gt; handler is called when the last arrival-report  screen ends. This is a screen that should not be written by a missionscreen. The code should wait until this eventhandler fires. Note that an other script may have put up a new missionscreen in the meantime. (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.reportScreenEnded = function()&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;selectedMFDChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.85}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;selectedMFDChanged&amp;lt;/code&amp;gt; handler is send whenever the player selects a new MFD slot (normally using the default keypress &amp;quot;;&amp;quot;). The &amp;lt;code&amp;gt;activeMFD&amp;lt;/code&amp;gt; paramater is the index of the MFD which is now active.&lt;br /&gt;
&lt;br /&gt;
 this.selectedMFDChanged = function(activeMFD : integer)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipCollided&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipCollided&amp;lt;/code&amp;gt; handler is send after a collision with otherShip.&lt;br /&gt;
&lt;br /&gt;
 this.shipCollided = function(otherShip)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipSpawned&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipSpawned&amp;lt;/code&amp;gt; handler is called after an NPC ship has been added to the system. After a witchspace jump it means that first all ships are added to the system, then all the relevant shipSpawned events are triggered.&amp;lt;br&amp;gt;&lt;br /&gt;
This handler for the worldScript is new since Oolite 1.74. After the event is sent to the shipScript, it is now also send to the worldScript with the added entity as argument.&lt;br /&gt;
&lt;br /&gt;
 this.shipSpawned = function(ship)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;shipLaunchedEscapePod&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;shipLaunchedEscapePod&amp;lt;/code&amp;gt; handler is called when the player bails out. This will be followed by the &amp;lt;code&amp;gt;escapePodSequenceOver&amp;lt;/code&amp;gt; event, and then a &amp;lt;code&amp;gt;shipWillDockWithStation()&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;shipDockedWithStation()&amp;lt;/code&amp;gt; pair after a few seconds.&lt;br /&gt;
&lt;br /&gt;
 this.shipLaunchedEscapePod = function(escapepod)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;systemInformationChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
{{oolite-method-added|1.79}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;systemInformationChanged&amp;lt;/code&amp;gt; handler is called when system information is modified. It is passed the galaxy and system ID which were changed, and the key and new value in the SystemInfo object.&lt;br /&gt;
&lt;br /&gt;
To avoid problems with recursion, attempting to change the value of any system information property from within this function will fail and log an error. Also note that changes which take place while Oolite is not running (from OXP planetinfo.plist files) will not cause this handler to be called when the game is reloaded.&lt;br /&gt;
&lt;br /&gt;
 this.systemInformationChanged = function(galaxy,system,key,newValue)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;viewDirectionChanged&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;viewDirectionChanged&amp;lt;/code&amp;gt; handler is called when the player view changes, with a string to indicate which view the player is facing. Amongst its possible values are &amp;quot;VIEW_FORWARD&amp;quot;, &amp;quot;VIEW_AFT&amp;quot;, &amp;quot;VIEW_PORT&amp;quot;, &amp;quot;VIEW_STARBOARD&amp;quot;,&lt;br /&gt;
&amp;quot;VIEW_CUSTOM&amp;quot;,&lt;br /&gt;
&amp;quot;VIEW_GUI_DISPLAY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 this.viewDirectionChanged = function(viewString)&lt;br /&gt;
 {&lt;br /&gt;
   if (viewString == &amp;quot;VIEW_PORT&amp;quot;)&lt;br /&gt;
   {&lt;br /&gt;
      // Your code here&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== System population ===&lt;br /&gt;
&lt;br /&gt;
In Oolite 1.79 and later, functions are called to populate and repopulate the system. These functions do not have fixed names, as they depend on the system, but otherwise act like normal worldscript functions. [[Oolite System Populator|The populator page]] has more documentation on these functions.&lt;br /&gt;
&lt;br /&gt;
=== Defunct ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;equipmentDestroyed&amp;lt;/code&amp;gt; ====&lt;br /&gt;
''Handler no longer exists in current stable version 1.80''&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;equipmentDestroyed&amp;lt;/code&amp;gt; handler is called when equipment gets destroyed completely beyond repair. (in strict mode, 1.77 or earlier only)  (world script only)&lt;br /&gt;
&lt;br /&gt;
 this.equipmentDestroyed = function(equipment)&lt;br /&gt;
 {&lt;br /&gt;
      // Your code here&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;tickle&amp;lt;/code&amp;gt; (removed in 1.77) ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;tickle&amp;lt;/code&amp;gt; handler is called periodically-ish, whenever the old [[property list|plist]] scripts are updated. &amp;lt;code&amp;gt;tickle()&amp;lt;/code&amp;gt; is deprecated. In new code, use appropriate event handlers or [[Oolite JavaScript Reference: Timer|timers]] instead.&lt;br /&gt;
&lt;br /&gt;
=== Missing Events ===&lt;br /&gt;
&lt;br /&gt;
All the initially planned events have been implemented in 1.74.&lt;br /&gt;
&lt;br /&gt;
If there are other events you would like to be able to respond to, please write a request [http://www.aegidian.org/bb/viewtopic.php?t=3296 on the forum].&lt;br /&gt;
&lt;br /&gt;
'''See also:''' [[Oolite JavaScript Reference: Ship script event handlers|ship script event handlers]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite JavaScript Reference]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58472</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58472"/>
		<updated>2020-06-22T03:56:52Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.06&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.02, updated by Milo; doubled price variance for larger ships and applied proportional adjustment to repair costs (they were still using the baseline price); improved compatibility with ShipVersion OXP by not offering IronHide for purchase on ships that ShipVersion does not allow to use it (when ShipVersion OXP is detected, civilian IronHide is only for ships with mass 30t or higher and military IronHide is only for ships with mass 130t or higher).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.03, updated by Milo; added indication on F5F5 screen showing whether current IronHide armour is civilian or military grade.&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.04, updated by Milo; improved handling of invalid ironHide_milFlag missionVariable (not zero or one) from old saved game; modified allowAwardEquipment handler to allow other OXPs to add IronHide to player ships (e.g., Ship Storage Helper).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.05, updated by Milo; re-assess damage-to-armour multiplier each time the ship launches, in case another OXP replaced the player ship, awarded IronHide, or changed the grade of the armour.&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.06, updated by Milo; if armour percentage is above zero but EQ_IRONHIDE is missing at startUp or at launch, set percentage to zero (in case another OXP removed IronHide without changing percentage); allow other OXPs to awardEquipment(&amp;quot;EQ_IRONHIDE&amp;quot;) to NPC ships (e.g., Ship Storage Helper using it as a placeholder for player-&amp;gt;npc-&amp;gt;player transitions), but IronHide does nothing for NPC ships, so outside of scripted additions, do not allow NPC ships to spawn with IronHide armour, and do not allow awardEquipment(&amp;quot;EQ_IRONHIDE_MIL&amp;quot; or &amp;quot;EQ_IRONHIDE_REPAIRS&amp;quot;) on NPCs because those are used only as script triggers from the F3 purchase screen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.3.06.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.3.06.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.06.oxz&amp;diff=58471</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.06.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.06.oxz&amp;diff=58471"/>
		<updated>2020-06-22T03:56:09Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.06&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.06&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58470</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58470"/>
		<updated>2020-06-22T02:48:49Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.05&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.02, updated by Milo; doubled price variance for larger ships and applied proportional adjustment to repair costs (they were still using the baseline price); improved compatibility with ShipVersion OXP by not offering IronHide for purchase on ships that ShipVersion does not allow to use it (when ShipVersion OXP is detected, civilian IronHide is only for ships with mass 30t or higher and military IronHide is only for ships with mass 130t or higher).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.03, updated by Milo; added indication on F5F5 screen showing whether current IronHide armour is civilian or military grade.&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.04, updated by Milo; improved handling of invalid ironHide_milFlag missionVariable (not zero or one) from old saved game; modified allowAwardEquipment handler to allow other OXPs to add IronHide to player ships (e.g., Ship Storage Helper).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.05, updated by Milo; re-assess damage-to-armour multiplier each time the ship launches, in case another OXP replaced the player ship, awarded IronHide, or changed the grade of the armour.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.3.05.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.3.05.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.05.oxz&amp;diff=58469</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.05.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.05.oxz&amp;diff=58469"/>
		<updated>2020-06-22T02:48:21Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.05&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.05&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58468</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58468"/>
		<updated>2020-06-22T02:06:08Z</updated>

		<summary type="html">&lt;p&gt;Milo: update to version 3.04&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.02, updated by Milo; doubled price variance for larger ships and applied proportional adjustment to repair costs (they were still using the baseline price); improved compatibility with ShipVersion OXP by not offering IronHide for purchase on ships that ShipVersion does not allow to use it (when ShipVersion OXP is detected, civilian IronHide is only for ships with mass 30t or higher and military IronHide is only for ships with mass 130t or higher).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.03, updated by Milo; added indication on F5F5 screen showing whether current IronHide armour is civilian or military grade.&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.04, updated by Milo; improved handling of invalid ironHide_milFlag missionVariable (not zero or one) from old saved game; modified allowAwardEquipment handler to allow other OXPs to add IronHide to player ships (e.g., Ship Storage Helper).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.3.04.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.3.04.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.04.oxz&amp;diff=58467</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.04.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.04.oxz&amp;diff=58467"/>
		<updated>2020-06-22T02:05:58Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.04&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.04&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_Mission&amp;diff=58466</id>
		<title>Oolite JavaScript Reference: Mission</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Oolite_JavaScript_Reference:_Mission&amp;diff=58466"/>
		<updated>2020-06-22T01:28:14Z</updated>

		<summary type="html">&lt;p&gt;Milo: added examples for mission.setInstructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;small&amp;gt;'''Prototype:''' &amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Subtypes:''' none&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''mission''' global object is used to run mission screens, and perform other actions related to mission scripting.&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;displayModel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 '''displayModel''' : {{oojsclass|Ship}}&lt;br /&gt;
If currently running a mission screen with a &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;, the ship entity used to display the model. This can be animated by setting its position and orientation from a [[Oolite JavaScript Reference: Global#addFrameCallback|frame callback]]. Uses role to identify ship, so be sure to use a unique role if you want a specific ship to be showed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;exitScreen&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
 '''exitScreen''' : [[Oolite JavaScript Reference: Global#guiScreen|guiScreen]] (read/write)&lt;br /&gt;
&lt;br /&gt;
This can be used to set a new exit screen for the current mission screen. Outside of a callback function, the value of this is meaningless, and setting it has no useful effect.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;markedSystems&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
 '''markedSystems''' : Array (read-only)&lt;br /&gt;
&lt;br /&gt;
An array of the objects currently being used to mark systems. The objects will have the same properties as those used by &amp;lt;code&amp;gt;markSystem&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;unmarkSystem&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;screenID&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-prop-added|1.77}}&lt;br /&gt;
 '''screenID''' : String (read-only)&lt;br /&gt;
&lt;br /&gt;
If there is currently a mission screen running, and it defined a screenID, then that screenID. Otherwise, this is null.&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;addMessageText&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''addMessageText'''(message : String)&lt;br /&gt;
&lt;br /&gt;
Appends text to the currently running mission screen. Can also be used to add text to other screens like the system data (F7) screen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;addMessageTextKey&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''addMessageTextKey'''(messageKey : String)&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;code&amp;gt;[[#addMessageText|addMessageText()]]&amp;lt;/code&amp;gt;, but looks up the specified &amp;lt;code&amp;gt;messageKey&amp;lt;/code&amp;gt; in [[missiontext.plist]].&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;markSystem&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''markSystem'''(systemNumber : Number)&lt;br /&gt;
&lt;br /&gt;
Mark a system on the long range chart. Multiple systems may be marked at once, as in &amp;lt;code&amp;gt;mission.markSystem(4, 54, 222)&amp;lt;/code&amp;gt;. In 1.76 and earlier a system cannot be marked twice, so:&lt;br /&gt;
 mission.markSystem(7);&lt;br /&gt;
 mission.markSystem(7);&lt;br /&gt;
 mission.unmarkSystem(7);&lt;br /&gt;
will leave the system unmarked.&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, the parameters may be objects instead of numbers. This allows control over the marker's appearance, and allows multiple markers to be placed on the same system. The object takes the following parameters:&lt;br /&gt;
* &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; : The system ID. This is the only required parameter.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; : A string identifying the group this marker belongs to (which may be the script's name, or something more specific). If omitted, which is not recommended, this defaults to &amp;quot;__oolite_legacy_destinations&amp;quot; which is also used for marking with numbers and marking carried out by legacy scripts.&lt;br /&gt;
* &amp;lt;code&amp;gt;markerColor&amp;lt;/code&amp;gt; : A string specifying a colour. e.g. &amp;quot;redColor&amp;quot; or &amp;quot;1.0 0.5 0.0&amp;quot;. If omitted, &amp;quot;redColor&amp;quot; will be used.&lt;br /&gt;
* &amp;lt;code&amp;gt;markerScale&amp;lt;/code&amp;gt; : A number between 0.5 and 2.0 specifying the relative size of the marker. Defaults to 1.0.&lt;br /&gt;
* &amp;lt;code&amp;gt;markerShape&amp;lt;/code&amp;gt; : A string describing the shape of the marker. Valid values are MARKER_X, MARKER_PLUS, MARKER_SQUARE and MARKER_DIAMOND. If this value is invalid or omitted, MARKER_X will be used.&lt;br /&gt;
&lt;br /&gt;
Multiple markers may be placed on the same system, provided that they have different names. If a marker with the same system and name already exists, it will be replaced.&lt;br /&gt;
&lt;br /&gt;
 mission.markSystem({&lt;br /&gt;
    system: 55,&lt;br /&gt;
    name: &amp;quot;my_oxp&amp;quot;,&lt;br /&gt;
    markerColor: &amp;quot;cyanColor&amp;quot;,&lt;br /&gt;
    markerScale: 1.5,&lt;br /&gt;
    markerShape: &amp;quot;MARKER_DIAMOND&amp;quot;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#unmarkSystem|unmarkSystem()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runShipLibrary&amp;lt;/code&amp;gt; ===&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
 function '''runShipLibrary()'''&lt;br /&gt;
Display the ship library based on [[shiplibrary.plist]], including processing of condition scripts.&lt;br /&gt;
&lt;br /&gt;
This is mainly useful for scenarios which override the standard scripts.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runScreen&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''runScreen(parameters : Object [, callback : Function [, this : Object]])''' &lt;br /&gt;
Present a mission screen.&lt;br /&gt;
&lt;br /&gt;
The appearance of the mission screen is defined by the properties of the &amp;lt;code&amp;gt;parameters&amp;lt;/code&amp;gt; object. The currently defined properties are:&lt;br /&gt;
* &amp;lt;code&amp;gt;title : String&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;titleKey : String&amp;lt;/code&amp;gt; (Key in [[missiontext.plist]])&lt;br /&gt;
* &amp;lt;code&amp;gt;music : String&amp;lt;/code&amp;gt; (name of a music file)&lt;br /&gt;
* &amp;lt;code&amp;gt;overlay : ''guiTextureSpecifier''&amp;lt;/code&amp;gt; (name of an image used as overlay)&lt;br /&gt;
* &amp;lt;code&amp;gt;background : ''guiTextureSpecifier''&amp;lt;/code&amp;gt; (name of a picture used as background)&lt;br /&gt;
* &amp;lt;code&amp;gt;backgroundSpecial: String&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, special background layer)&lt;br /&gt;
* &amp;lt;code&amp;gt;model : String&amp;lt;/code&amp;gt; (Role of a ship that will be shown as rotating ship)&lt;br /&gt;
* &amp;lt;code&amp;gt;modelPersonality : Int&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, the entityPersonality assigned to the &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;. If unspecified, or in 1.76 or earlier, a random personality is used)&lt;br /&gt;
* &amp;lt;code&amp;gt;message : String&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;messageKey : String&amp;lt;/code&amp;gt; (Key in [[missiontext.plist]])&lt;br /&gt;
* &amp;lt;code&amp;gt;spinModel: Boolean&amp;lt;/code&amp;gt; (If &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, the model is shown from the top with no automatic animation.)&lt;br /&gt;
* &amp;lt;code&amp;gt;[[Oolite JavaScript Reference: Mission#Advanced choices ({{oolite-prop-added|1.77}})|choices]]: Object&amp;lt;/code&amp;gt; (1.77 or later. Object describing choices)&lt;br /&gt;
* &amp;lt;code&amp;gt;choicesKey : String&amp;lt;/code&amp;gt; (Key in [[missiontext.plist]])&lt;br /&gt;
* &amp;lt;code&amp;gt;initialChoicesKey : String&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, the key from &amp;lt;code&amp;gt;choicesKey&amp;lt;/code&amp;gt; which is initially selected)&lt;br /&gt;
* &amp;lt;code&amp;gt;allowInterrupt : Boolean&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}. If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (default: false), the mission screen can be interrupted with function keys, which does not call the callback function. Mainly intended for interfaces.)&lt;br /&gt;
* &amp;lt;code&amp;gt;exitScreen : ''guiScreen''&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, a GUI screen to exit on. If omitted, an invalid value is given, or the player is not docked, this will revert to &amp;quot;GUI_SCREEN_STATUS&amp;quot;. Not all GUI screens are selectable for this: only those reachable with function keys F3 to F8)&lt;br /&gt;
* &amp;lt;code&amp;gt;screenID : String&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.77}}, an optional string which can be read later from &amp;lt;code&amp;gt;[[#screenID|mission.screenID]]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;textEntry : Boolean&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.79}}, if it's true, then you get the text prompt and 'choices' and 'choicesKey' are ignored. Whatever's typed there gets passed as the parameter to the callback function. The [https://github.com/OoliteProject/oolite/blob/master/Resources/Scripts/oolite-registership.js ship registry code] has a simple example.)&lt;br /&gt;
* &amp;lt;code&amp;gt;customChartZoom : decimal&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.87}}, zoom level of the 'CUSTOM_CHART' backgroundSpecial map)&lt;br /&gt;
* &amp;lt;code&amp;gt;customChartCentre: Vector3D&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.87}}, centre position of the 'CUSTOM_CHART' backgroundSpecial map, using the internal coordinate system. The z component is always zero. Discouraged in favour of customChartCentreInLY)&lt;br /&gt;
* &amp;lt;code&amp;gt;customChartCentreLY: Vector3D&amp;lt;/code&amp;gt; ({{oolite-prop-added|1.87}}, centre position of the 'CUSTOM_CHART' backgroundSpecial map, in LY. e.g. for Lave: (8, 34.6, 0). The z component is always zero.)&lt;br /&gt;
Some of these are mutually exclusive; for instance, “title” overrides “titleKey”. See [[Oolite JavaScript Reference: Global#setScreenBackground|setScreenBackground()]] for a discussion of ''guiTextureSpecifier''. &lt;br /&gt;
&lt;br /&gt;
There are 21 lines available for display of the message and choices combined. (In 1.77, this is extended to 27 lines if the player's HUD is hidden)&lt;br /&gt;
&lt;br /&gt;
==== runScreen callbacks ====&lt;br /&gt;
The callback function is a function that is called when the player makes a choice. Every runScreen can have its own specific callback function, or you can design a single function to handle multiple mission screens instead. The optional &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; parameter will be used as the &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; property of the mission screen callback. It is usually unnecessary to specify this, but if you intend the function which calls runScreen to be called from a different script, and the callback references &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;, you will need to use it.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&amp;lt;br&amp;gt;&lt;br /&gt;
A simple mission screen:&lt;br /&gt;
 mission.runScreen({&lt;br /&gt;
     title: &amp;quot;My first mission screen&amp;quot;,&lt;br /&gt;
     message: &amp;quot;This am a mission screen wot is good&amp;quot;,&lt;br /&gt;
     choicesKey: &amp;quot;me_firstmission_choices&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
 function (choice)&lt;br /&gt;
 {&lt;br /&gt;
     if (choice === &amp;quot;1_YES&amp;quot;)  player.commsMessage(&amp;quot;Yay!&amp;quot;);&lt;br /&gt;
     else if (choice === &amp;quot;2_NO&amp;quot;)  player.commsMessage(&amp;quot;Boo.&amp;quot;);&lt;br /&gt;
     else  player.commsMessage(&amp;quot;Whut?&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
In [[missiontext.plist]], you’ll need the following. The numbers are used because choices are sorted by key.&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;me_firstmission_choices&amp;quot; =&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;1_YES&amp;quot; = &amp;quot;Yes.&amp;quot;;&lt;br /&gt;
         &amp;quot;2_NO&amp;quot; = &amp;quot;No.&amp;quot;;&lt;br /&gt;
         &amp;quot;3_MAYBE&amp;quot; = &amp;quot;Maybe.&amp;quot;;&lt;br /&gt;
     };&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The call does not have to be laid out as above. The parameters object can be manipulated in any way you want beforehand, and the callback function can be written out of line. For example, the following is equivalent:&lt;br /&gt;
 var parameters = new Object();&lt;br /&gt;
 parameters.title = &amp;quot;My first mission screen&amp;quot;;&lt;br /&gt;
 parameters.message = &amp;quot;This am&amp;quot;;&lt;br /&gt;
 parameters.choicesKey = &amp;quot;me_firstmission_choices&amp;quot;;&lt;br /&gt;
 parameters.message += &amp;quot; a mission screen wot is good&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 function callback(choice)&lt;br /&gt;
 {&lt;br /&gt;
     if (choice === &amp;quot;1_YES&amp;quot;)  player.commsMessage(&amp;quot;Yay!&amp;quot;);&lt;br /&gt;
     else if (choice === &amp;quot;2_NO&amp;quot;)  player.commsMessage(&amp;quot;Boo.&amp;quot;);&lt;br /&gt;
     else  player.commsMessage(&amp;quot;Whut?&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 mission.runScreen(parameters, callback);&lt;br /&gt;
&lt;br /&gt;
This form is more complicated, and the ordering is less intuitive. However, it does allow you to make complex decisions about the parameters in code, and writing the callback out of line can be preferable if it’s long. It is recommended that you start out with the first approach, but keep in mind that there are other options if it becomes too limiting.&lt;br /&gt;
&lt;br /&gt;
In 1.77, if &amp;lt;code&amp;gt;allowInterrupt&amp;lt;/code&amp;gt; is set to true, it is possible that the callback function will not be called. It should therefore only be set for mission screens which can safely be interrupted without the callback. Regardless of this setting, all mission screens may be interrupted by the player launching from the station, and this possibility should be considered (in such case callback function will be called with &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; argument).&lt;br /&gt;
&lt;br /&gt;
==== runScreen special backgrounds (1.77 or later only) ====&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, 'backgroundSpecial' may be given the following special string values:&lt;br /&gt;
* &amp;lt;code&amp;gt;SHORT_RANGE_CHART&amp;lt;/code&amp;gt;: Uses the short range chart (as if the player had pressed F6). The first 18 lines of the mission text will overlap the chart if used.&lt;br /&gt;
* &amp;lt;code&amp;gt;LONG_RANGE_CHART&amp;lt;/code&amp;gt;: Uses the current long range chart (as if the player had pressed F6 twice). The first 16 lines of the mission text will overlap the chart if used.&lt;br /&gt;
* &amp;lt;code&amp;gt;LONG_RANGE_CHART_SHORTEST&amp;lt;/code&amp;gt;: As LONG_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the shortest (fewest jumps, not necessarily shortest distance) route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;LONG_RANGE_CHART_QUICKEST&amp;lt;/code&amp;gt;: As LONG_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the quickest route to their current destination system will be displayed.&lt;br /&gt;
&lt;br /&gt;
In 1.87 or later, 'backgroundSpecial' has these additional special string values:&lt;br /&gt;
* &amp;lt;code&amp;gt;SHORT_RANGE_CHART_SHORTEST&amp;lt;/code&amp;gt;: As SHORT_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the shortest (fewest jumps, not necessarily shortest distance) route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;SHORT_RANGE_CHART_QUICKEST&amp;lt;/code&amp;gt;: As SHORT_RANGE_CHART, but if the player has a working [[Advanced Navigational Array]] then the quickest route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;CUSTOM_CHART&amp;lt;/code&amp;gt;: Displays a chart where zoom and centre position can be customised using the 'customChartZoom' and 'customChartCentreInLY' properties. The first 18 lines of the mission text will overlap the chart if used.&lt;br /&gt;
* &amp;lt;code&amp;gt;CUSTOM_CHART_SHORTEST&amp;lt;/code&amp;gt;: As CUSTOM_CHART, but if the player has a working [[Advanced Navigational Array]] then the shortest (fewest jumps, not necessarily shortest distance) route to their current destination system will be displayed.&lt;br /&gt;
* &amp;lt;code&amp;gt;CUSTOM_CHART_QUICKEST&amp;lt;/code&amp;gt;: As CUSTOM_CHART, but if the player has a working [[Advanced Navigational Array]] then the quickest route to their current destination system will be displayed.&lt;br /&gt;
&lt;br /&gt;
With all special chart backgrounds, changes made to destination system, or to markers, will be updated immediately.&amp;lt;br/&amp;gt;&lt;br /&gt;
These backgrounds will be displayed above the '&amp;lt;code&amp;gt;background&amp;lt;/code&amp;gt;' (if any) but below everything else.&lt;br /&gt;
&lt;br /&gt;
==== Advanced choices (1.77 or later only) ====&lt;br /&gt;
&lt;br /&gt;
In 1.77 or later, choices may be set either with the 'choicesKey' parameter from missiontext.plist as before, or with the 'choices' parameter. (If both are set, 'choicesKey' will be ignored)&lt;br /&gt;
'''Example'''&amp;lt;br&amp;gt;&lt;br /&gt;
 var options = {&lt;br /&gt;
    &amp;quot;01_AGREE&amp;quot; : &amp;quot;Take the job&amp;quot;,&lt;br /&gt;
    &amp;quot;02_DECLINE&amp;quot; : &amp;quot;Politely decline&amp;quot;&lt;br /&gt;
 };&lt;br /&gt;
 if (player.bounty == 0) // only clean players have this option&lt;br /&gt;
 {&lt;br /&gt;
    options[&amp;quot;03_REPORT&amp;quot;] = &amp;quot;Call the police&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 mission.runScreen({&lt;br /&gt;
    // title, message, etc.&lt;br /&gt;
    choices: options&lt;br /&gt;
 },function(choice) {&lt;br /&gt;
    // choice handling&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
This is useful where the options available (perhaps depending on the player's ship or equipment, or on previous events in the mission) may vary in a complex fashion, to avoid the need to have a separate missiontext.plist entry for every possibility.&lt;br /&gt;
&lt;br /&gt;
The value (either in &amp;lt;code&amp;gt;choicesKey&amp;lt;/code&amp;gt;'s missiontext entry or &amp;lt;code&amp;gt;choices&amp;lt;/code&amp;gt;) may either be a text string as in previous versions, or an object itself. If it is an object, it can take three parameters: &lt;br /&gt;
* 'text' is the displayed text for this key. &lt;br /&gt;
* 'alignment' can be 'LEFT', 'RIGHT' or 'CENTER' (the default). &lt;br /&gt;
* 'unselectable' can be &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; (the default for non-blank text). Unselectable rows are printed, but are skipped when moving through the options. This can be useful for keeping a consistent interface.&lt;br /&gt;
* 'color' can be any color specification (e.g. &amp;quot;orangeColor&amp;quot;). The default is &amp;quot;yellowColor&amp;quot;, or &amp;quot;darkGrayColor&amp;quot; for unselectable rows.&lt;br /&gt;
For example (missiontext.plist):&lt;br /&gt;
 &amp;quot;my_choice_1&amp;quot; = {&lt;br /&gt;
    &amp;quot;01_AGREE&amp;quot; = {&lt;br /&gt;
       text = &amp;quot;Take the job&amp;quot;;&lt;br /&gt;
       alignment = &amp;quot;LEFT&amp;quot;;&lt;br /&gt;
       color = &amp;quot;greenColor&amp;quot;;&lt;br /&gt;
    };&lt;br /&gt;
    // more options&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
In 1.77, the behaviour for choices which have no text is slightly changed. These will now leave a blank and unselectable line in the option list.&lt;br /&gt;
&lt;br /&gt;
==== Safe usage of runScreen ====&lt;br /&gt;
&lt;br /&gt;
One warning: &amp;lt;code&amp;gt;runScreen()&amp;lt;/code&amp;gt; will overwrite any existing missionscreen or GUI screen. The only safe place is using it inside a &amp;lt;code&amp;gt;missionScreenOpportunity&amp;lt;/code&amp;gt; handler or the callback function from a previous mission screen (or in 1.77 onwards, inside an interface callback function), because that handler only fires when it is allowed to show such a screen. When using the command at other places, first make sure with &amp;lt;code&amp;gt;guiScreen != &amp;quot;GUI_SCREEN_MISSION&amp;quot;&amp;lt;/code&amp;gt; that there is currently no missionscreen on display by another oxp.&lt;br /&gt;
&lt;br /&gt;
==== Known issues ====&lt;br /&gt;
&lt;br /&gt;
From Oolite 1.79, only the A-Z, a-z, 0-9 and (space) characters may be reliably entered in the 'textEntry' field. A wider selection, for boring internal reasons, is available on the Mac, and is hoped to also be available on other platforms in later releases.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setInstructions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''setInstructions(instructions : String, [worldScriptName : String])'''&lt;br /&gt;
&lt;br /&gt;
Specify a message to put on the Manifest screen (usually short instructions for current mission), under the title “Missions”.&lt;br /&gt;
&lt;br /&gt;
When not called from within a world script, the name of a world script must be specified so that Oolite knows which script the message belongs to. Clear the message by calling &amp;lt;code&amp;gt;setInstructions(null)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is recommended that &amp;lt;code&amp;gt;setInstructions()&amp;lt;/code&amp;gt; is used only when you need to customise the text for a specific scenario. For static text, use &amp;lt;code&amp;gt;[[#setInstructionsKey|setInstructionsKey()]]&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
In Oolite 1.81 onwards, the following variant is available&lt;br /&gt;
&lt;br /&gt;
{{oolite-method-added|1.81}}&lt;br /&gt;
 function '''setInstructions(instructions : Array, [worldScriptName : String])'''&lt;br /&gt;
&lt;br /&gt;
If this version is used, the first array element will be a heading on the Manifest screen, and the remaining elements will be entered underneath it, rather than being entered under the &amp;quot;Missions&amp;quot; heading.&lt;br /&gt;
&lt;br /&gt;
'''Example''':  &amp;lt;code&amp;gt;mission.setInstructions([&amp;quot;Ship Companion:&amp;quot;,expandMissionText(&amp;quot;myoxp_currentpet&amp;quot;),...]);&amp;lt;/code&amp;gt; will display Ship Companion: in yellow text on the F5F5 screen, and beneath it will show the [[String expansion|expanded]] value of the key &amp;quot;myoxp_currentpet&amp;quot; from the [[missiontext.plist]] associated with the calling world script. If not called from a world script, the worldScriptName (this.name from the script) must be provided also: &amp;lt;code&amp;gt;mission.setInstructions([&amp;quot;Ship Companion:&amp;quot;,expandMissionText(&amp;quot;myoxp_currentpet&amp;quot;),...], &amp;quot;myoxp's script name&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the line or lines to be added must be enclosed in square brackets, comma separated. Also note the optional use of expandMissionText to retrieve text from [[missiontext.plist]]. It is also possible to construct the array before calling setInstructions, for example:&amp;lt;pre&amp;gt;&lt;br /&gt;
if(myoxp_petslist.length == 0) {&lt;br /&gt;
  mission.setInstructions(null); // clear any text previously displayed by this world script on the F5F5 screen&lt;br /&gt;
} else {&lt;br /&gt;
  var textArray = [];&lt;br /&gt;
  textArray.push(&amp;quot;Ship Companion&amp;quot; + (myoxp_petslist.length &amp;gt; 1 ? &amp;quot;s:&amp;quot; : &amp;quot;:&amp;quot;)); // &amp;quot;Ship Companion:&amp;quot; or &amp;quot;Ship Companions:&amp;quot; if more than one&lt;br /&gt;
  var i = myoxp_petslist.length - 1; // pointer to last entry in myoxp_petslist&lt;br /&gt;
  while(i--) { // for each pet in the list, starting from the bottom (probably newest to oldest)&lt;br /&gt;
    textArray.push(myoxp_petslist[i].name); // add the name of the pet to the text we will show on the F5F5 screen&lt;br /&gt;
  }&lt;br /&gt;
  mission.setInstructions(textArray); // our pets list will now be visible on the F5F5 screen until further notice (the next time we call setInstructions or one of its variants, it will replace this)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#setInstructionsKey|setInstructionsKey()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setInstructionsKey&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''setInstructionsKey(messageKey : String, [worldScript : String])'''&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;code&amp;gt;[[#setInstructions|setInstructions()]]&amp;lt;/code&amp;gt;, but looks up the specified &amp;lt;code&amp;gt;messageKey&amp;lt;/code&amp;gt; in [[missiontext.plist]].&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#setInstructions|setInstructions()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;unmarkSystem&amp;lt;/code&amp;gt; ===&lt;br /&gt;
 function '''unmarkSystem'''(systemNumbers : Number)&lt;br /&gt;
&lt;br /&gt;
Remove a mark set with &amp;lt;code&amp;gt;[[#markSystem|markSystem()]]&amp;lt;/code&amp;gt;. Multiple systems may be unmarked at once, as in &amp;lt;code&amp;gt;mission.unmarkSystem(4, 54, 222)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In 1.76 and earlier versions, any script can unmark a system, regardless of which script marked it or how many times it was previously marked. &lt;br /&gt;
&lt;br /&gt;
In 1.77, each marker has a name, and if a system has multiple markers each marker must be removed separately. Parameters in 1.77 may be numbers or objects. Numbers remove the &amp;quot;__oolite_legacy_destinations&amp;quot; markers. Objects are the same format as in &amp;lt;code&amp;gt;markSystem&amp;lt;/code&amp;gt; and remove the marker of the corresponding name (the marker style options are ignored when unmarking). In 1.77, this function will return true if all requested markers existed and were removed, or false if any of the requested markers did not exist.&lt;br /&gt;
&lt;br /&gt;
'''See also:''' &amp;lt;code&amp;gt;[[#markSystem|markSystem()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite JavaScript Reference]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.03.oxz&amp;diff=58465</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.03.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.03.oxz&amp;diff=58465"/>
		<updated>2020-06-22T01:00:31Z</updated>

		<summary type="html">&lt;p&gt;Milo: Milo uploaded a new version of File:Oolite.oxp.Thargoid.IronHide.3.03.oxz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.03&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58464</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58464"/>
		<updated>2020-06-22T00:59:53Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.03&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.02, updated by Milo; doubled price variance for larger ships and applied proportional adjustment to repair costs (they were still using the baseline price); improved compatibility with ShipVersion OXP by not offering IronHide for purchase on ships that ShipVersion does not allow to use it (when ShipVersion OXP is detected, civilian IronHide is only for ships with mass 30t or higher and military IronHide is only for ships with mass 130t or higher).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.03, updated by Milo; added indication on F5F5 screen showing whether current IronHide armour is civilian or military grade.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.3.03.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.3.03.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.03.oxz&amp;diff=58463</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.03.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.03.oxz&amp;diff=58463"/>
		<updated>2020-06-22T00:58:30Z</updated>

		<summary type="html">&lt;p&gt;Milo: version 3.03&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.03&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58462</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58462"/>
		<updated>2020-06-21T20:30:03Z</updated>

		<summary type="html">&lt;p&gt;Milo: add version number to filename&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.02, updated by Milo; doubled price variance for larger ships and applied proportional adjustment to repair costs (they were still using the baseline price); improved compatibility with ShipVersion OXP by not offering IronHide for purchase on ships that ShipVersion does not allow to use it (when ShipVersion OXP is detected, civilian IronHide is only for ships with mass 30t or higher and military IronHide is only for ships with mass 130t or higher).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.3.02.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.3.02.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58460</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.02.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58460"/>
		<updated>2020-06-21T20:28:08Z</updated>

		<summary type="html">&lt;p&gt;Milo: Milo moved page File:Oolite.oxp.Thargoid.IronHide.oxz to File:Oolite.oxp.Thargoid.IronHide.3.02.oxz: add version number&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.00&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.oxz&amp;diff=58461</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.oxz&amp;diff=58461"/>
		<updated>2020-06-21T20:28:08Z</updated>

		<summary type="html">&lt;p&gt;Milo: Milo moved page File:Oolite.oxp.Thargoid.IronHide.oxz to File:Oolite.oxp.Thargoid.IronHide.3.02.oxz: add version number&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[File:Oolite.oxp.Thargoid.IronHide.3.02.oxz]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58459</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58459"/>
		<updated>2020-06-21T20:14:51Z</updated>

		<summary type="html">&lt;p&gt;Milo: update IronHide to 3.02&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install).&lt;br /&gt;
&lt;br /&gt;
21/06/2020 - Version 3.02, updated by Milo; doubled price variance for larger ships and applied proportional adjustment to repair costs (they were still using the baseline price); improved compatibility with ShipVersion OXP by not offering IronHide for purchase on ships that ShipVersion does not allow to use it (when ShipVersion OXP is detected, civilian IronHide is only for ships with mass 30t or higher and military IronHide is only for ships with mass 130t or higher).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58458</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.02.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58458"/>
		<updated>2020-06-21T20:13:57Z</updated>

		<summary type="html">&lt;p&gt;Milo: Milo uploaded a new version of File:Oolite.oxp.Thargoid.IronHide.oxz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.00&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58457</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.02.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58457"/>
		<updated>2020-06-21T05:17:07Z</updated>

		<summary type="html">&lt;p&gt;Milo: Milo uploaded a new version of File:Oolite.oxp.Thargoid.IronHide.oxz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.00&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58456</id>
		<title>IronHide OXP</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=IronHide_OXP&amp;diff=58456"/>
		<updated>2020-06-21T03:56:36Z</updated>

		<summary type="html">&lt;p&gt;Milo: IronHide OXP 3.01 update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Ships Systems Department of the Aquarian Shipbuilding Corporation introduce their latest development - IronHide armour. This is a simple but effective technology which applies a special treatment to the hull of the customer ship which helps to strengthen it against combat and physical damage in collaboration with the ship's shielding.&lt;br /&gt;
&lt;br /&gt;
In practice the armour helps to absorb damage that gets past (or takes down) the shields, although if a truly concentrated attack occurs then localised penetration and energy damage may still occur. This is especially true of missile attacks, which can still cause internal damage and equipment failure due to concussion effects. The current strength of the armour can be viewed on the ship's manifest (F5-F5) screen, and any damage can be repaired at a suitably high-tech station. &lt;br /&gt;
&lt;br /&gt;
The armour itself is available from all good tech 5 locations, for a recommended retail price of just 750 credits. These stations should also be able to quote for repairs to damaged installations. It should also be noted that insurers class armour as a combat consumable, and so its replacement is not included as part of the insurance for equipment such as escape pods and lifeboats.&lt;br /&gt;
&lt;br /&gt;
A special enhanced upgrade for military uses has also been developed, and may be available to customers at tech 10 systems (the upgrade requires an undamaged civilian-grade installation). The upgrade doubles the effectiveness of the regular armour.&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
This OXP came about following a discussion over a beer with ClymAngus, and was one of my fastest-written OXPs (sketch-out concept to beta-test was around 7 hours on a boring day at work with nothing to do).&lt;br /&gt;
&lt;br /&gt;
Thanks also to UK_Eliter and Caracal for beta-testing for me, and their feedback and comments.&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
You can find the IronHide discussion thread on the Oolite Bulletin Boards [http://www.aegidian.org/bb/viewtopic.php?t=8311 here].&lt;br /&gt;
&lt;br /&gt;
==Version history==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31/07/2010 - Version 1.00, initial release.&lt;br /&gt;
01/08/2010 - Version 1.01, changed shield strength from this. to mission variables to maintain across save games.&lt;br /&gt;
19/02/2011 - Version 2.00, upgrade for 1.75 trunk - and operating properly now after shields are gone!&lt;br /&gt;
19/06/2020 - Version 3.00, updated by Milo; IronHide OXP now requires Oolite 1.79+; armour durability increased but energy restoration is now proportional to damage absorbed (previously the ship's energy was fully restored after every hit, which could conflict with other OXPs' attempts to regulate energy levels); damage below 5 (10 for military grade) will not degrade IronHide armour; further improved compatibility with other OXPs by checking damage type instead of energy level to decide which damage the armour can absorb.&lt;br /&gt;
20/06/2020 - Version 3.01, updated by Milo; IronHide OXP now requires Oolite 1.82+; introduced a new script_info property in equipment.plist (ironHide_percentArmourLostPerDamagePointTaken), which functionally replaces the ironHide_strength mission variable (now unused by IronHide, but kept and returned to its pre-3.00 values because CombatMFD uses it for its SEE indicator); eliminated the &amp;quot;damage below X will not degrade armour&amp;quot; threshold (any damage that gets through shields now will consume armour); set damage_probability to zero so IronHide cannot be made &amp;quot;inoperable&amp;quot; (appear broken on the F5 screen) before it is fully consumed; introduced price variance for installation and repairs proportional to ship surface area (cobra3-player is the baseline); added installation_time of 12 hours for both civilian and military grades and a proportional time advance when repairing (repairing X percent is 25% faster than installing X percent, a small incentive to repair before the armour is destroyed; note that if military grade armour is fully consumed, you must first reinstall civilian grade [12 hrs] and then upgrade to military grade [12 hrs], so it saves even more time if you repair military grade before it breaks; also, while not a change from previous versions, military grade armour costs less to repair than it costs to install)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download Location ==&lt;br /&gt;
This OXP requires at least version 1.82 of Oolite.&lt;br /&gt;
&lt;br /&gt;
Download the latest version in OXZ format [[Media:Oolite.oxp.Thargoid.IronHide.oxz|here]] (downloaded {{#downloads:Oolite.oxp.Thargoid.IronHide.oxz}} times).&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
*[[User:Thargoid|Thargoid's OXP page]].&lt;br /&gt;
&lt;br /&gt;
{{equipment-OXP}}&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58455</id>
		<title>File:Oolite.oxp.Thargoid.IronHide.3.02.oxz</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=File:Oolite.oxp.Thargoid.IronHide.3.02.oxz&amp;diff=58455"/>
		<updated>2020-06-21T03:54:56Z</updated>

		<summary type="html">&lt;p&gt;Milo: Milo uploaded a new version of File:Oolite.oxp.Thargoid.IronHide.oxz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;version 3.00&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Missiontext.plist&amp;diff=58454</id>
		<title>Missiontext.plist</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Missiontext.plist&amp;diff=58454"/>
		<updated>2020-06-20T21:09:26Z</updated>

		<summary type="html">&lt;p&gt;Milo: linked to string expansion page, added note about not using oolite_key_&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the filename of the file that contains all the text relevant to scripted missions. It should be placed inside the /Config - folder (see [[OXP_howto#Structure|OXP HowTo]]). See the [[Property_list|Property List]] page for more detail on plists.&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
The file is organised as a dictionary { }. &lt;br /&gt;
Every entry consists of the key name, followed by  a '=' and then the text in quotes.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
   conhunt_short_desc1 = &amp;quot;Hunt for the constrictor stolen from Xeer.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
==Special Expansions==&lt;br /&gt;
&lt;br /&gt;
These can be included in your text, inside the quotation marks in openStep, to automatically insert the following details:&lt;br /&gt;
&lt;br /&gt;
[commander_name] - Displays the name of the saved game file.&lt;br /&gt;
&lt;br /&gt;
[commander_shipname] - Displays the name of the player's ship, as specified by [[shipdata.plist]].&lt;br /&gt;
&lt;br /&gt;
[commander_shipdisplayname] - Could be different from commander_shipname.&lt;br /&gt;
&lt;br /&gt;
[commander_rank] - Displays the player's Elite rating.&lt;br /&gt;
&lt;br /&gt;
[commander_legal_status] - Displays the player's current legal status.&lt;br /&gt;
&lt;br /&gt;
[commander_bounty] - Displays the current bounty on the player. ''(Oolite v1.74 &amp;amp; up)''&lt;br /&gt;
&lt;br /&gt;
[mission_xxxx] - displays the missionVariables.xxxxx.&lt;br /&gt;
&lt;br /&gt;
[nom] - Generate a random surname.&lt;br /&gt;
&lt;br /&gt;
[thanks-for-assist] - Err, thanks the player for their assistance.&lt;br /&gt;
&lt;br /&gt;
[police-thanks-for-assist] - the police thanks the player personally.&lt;br /&gt;
&lt;br /&gt;
[describe-pirate] - Random description for an outlaw.&lt;br /&gt;
&lt;br /&gt;
[describe-Pirate] - Capitalized random description for an outlaw.&lt;br /&gt;
&lt;br /&gt;
[thargoid_curses] - Random Thargoid curses.&lt;br /&gt;
&lt;br /&gt;
[police_warning] - Random impending fines notifications.&lt;br /&gt;
&lt;br /&gt;
[police_attack_warning] - Random warning of immediate(?) attack.&lt;br /&gt;
&lt;br /&gt;
%H - Will display the current system name i.e. Isinor.&lt;br /&gt;
&lt;br /&gt;
%I - Displays the current system name with &amp;quot;ian&amp;quot; attached i.e. Isinorian.&lt;br /&gt;
&lt;br /&gt;
%R - Random word. (Use %N for a better result)&lt;br /&gt;
&lt;br /&gt;
%N - Random name. More variation than with %R. Multiple repetitions of %N in the same string generate the same expansion. (Feature added with Oolite 1.73)&lt;br /&gt;
&lt;br /&gt;
%Jxxx - Will display the system name of system with ID number &amp;quot;xxx&amp;quot;. xxx must be a 3 digit number or no replacement takes place. e.g. %J007 is Lave. This replacement follows any system renaming by other OXPs. (Feature added with Oolite 1.73)&lt;br /&gt;
&lt;br /&gt;
%Gxxxyyy - Will display the system name of system with ID number &amp;quot;xxx&amp;quot; in galaxy with ID &amp;quot;yyy&amp;quot;. xxx and yyy must be 3 digit numbers or no replacement takes place. e.g. %G007000 is Lave. This replacement follows any system renaming by other OXPs. (Feature added with Oolite 1.87)&lt;br /&gt;
&lt;br /&gt;
[oolite_key_FOO] - A human-readable description of the [[Oolite_Keyboard_Controls|keyconfig.plist]] entry &amp;lt;code&amp;gt;key_FOO&amp;lt;/code&amp;gt;, if one exists. (Feature added with Oolite 1.79) It is '''discouraged''' for OXPs to use these, instead it is '''recommended''' to use &amp;lt;code&amp;gt;oolite-keycode-&amp;lt;/code&amp;gt; prefixed entries found in [[descriptions.plist]].&lt;br /&gt;
&lt;br /&gt;
If the message contains elements enclosed in square brackets [like_this] that correspond to mission_variable names or keys in [[descriptions.plist]], or several [[String expansion|other variations]], then these also will be expanded and substituted into the original message.&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
Several spacial characters are used in determining the layout of the text, just as in Wiki.&lt;br /&gt;
&lt;br /&gt;
*'''\&amp;quot;''' Enables the use of colons.&lt;br /&gt;
*'''\\n''' Insers a hard Enter.&lt;br /&gt;
&lt;br /&gt;
In XML:&lt;br /&gt;
*'''\n''' Inserts a hard Enter.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 trumble_offer = &amp;quot;Commander,\\n\\nYou look like someone who could use a Trumble!...&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
== Choices ==&lt;br /&gt;
Most missions offer a choice, that is the spirit of elite. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
   nova_yesno = {&lt;br /&gt;
     YES = &amp;quot;Okay, I'll help&amp;quot;;&lt;br /&gt;
     NO = &amp;quot;No, sorry.&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
On the missionscreen the choices are sorted by key.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite]]&lt;br /&gt;
[[Category:Oolite scripting]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=String_expansion&amp;diff=58453</id>
		<title>String expansion</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=String_expansion&amp;diff=58453"/>
		<updated>2020-06-20T21:00:42Z</updated>

		<summary type="html">&lt;p&gt;Milo: more detailed explanation of string expansion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Format ==&lt;br /&gt;
Oolite has a mechanism to replace text in strings with other text. At certain times before displaying text (details below), Oolite searches for % symbols and square brackets [ ]. If it finds them, it checks if what immediately follows the % symbols, or what is between the square brackets, has a recognized special meaning, and if so, substitutes replacement text.  Oolite also recognizes vertical bars ('|') and colons (':') inside square brackets as special characters. When you do not want Oolite to replace text, use a double % ('%%') to display a single %, and put a backslash ('\') before each square bracket to display the brackets and text inside them without substitution ('\[example\]' will be displayed as '[example]').  Additionally, the special value '\n' will be replaced by a new line, which can be prevented by preceding it with an extra slash ('\\n' will display '\n').&lt;br /&gt;
&lt;br /&gt;
== What is switched ==&lt;br /&gt;
'''Recognized % codes:'''&lt;br /&gt;
&lt;br /&gt;
* %H       - Current System name, e.g., Lave&lt;br /&gt;
* %I       - Current System name with &amp;quot;ian&amp;quot; appended, e.g., Laveian&lt;br /&gt;
* %Jxxx    - Name of System corresponding with ID number xxx in the current galaxy (must be a 3-digit number), e.g., %J007 is Lave while in Galaxy 1 (feature added in Oolite 1.73)&lt;br /&gt;
* %Gxxxyyy - Name of System corresponding with ID number xxx in galaxy number yyy (both must be 3-digit numbers), e.g. %G007000 is Lave (feature added in Oolite 1.87) &lt;br /&gt;
* %N       - Random name (repetitions of %N in the same string generate the same result)&lt;br /&gt;
* %R       - Random word (repetitions of %R in the same string generate unique results)&lt;br /&gt;
&lt;br /&gt;
'''Text in brackets:'''&lt;br /&gt;
&lt;br /&gt;
* If there are only numbers between the brackets (e.g., [0] or [35]), the corresponding Nth sub-array (counting from zero) is retrieved from the &amp;lt;code&amp;gt;system_description&amp;lt;/code&amp;gt; array in [[descriptions.plist]], which is expected to contain only sub-arrays of strings. When a sub-array is retrieved, one string is selected from it at random and the result is expanded recursively (if it contains %-codes or bracket expressions, those will be replaced too). As of Oolite 1.87, there are 36 entries in the system_description array (the last is [35]). This is used to generate planet descriptions but may be used in OXPs if the strings are suitable. For example, [10] is replaced with a random beverage.&lt;br /&gt;
* Otherwise, the text between the brackets (hereafter called the &amp;quot;key&amp;quot;) is evaluated recursively in the following priority order to find a replacement:&lt;br /&gt;
*# Overrides (context-specific expansions, special keys that are only recognized in certain situations, and can also be used from JavaScript)&lt;br /&gt;
*#* In comms messages, [self:name] and [target:name] will be replaced respectively with the sender's displayName and the target's displayName (or the &amp;quot;unknown-target&amp;quot; description from [[descriptions.plist]], if the scanner is jammed).&lt;br /&gt;
*#* In [[Oolite_JavaScript_Reference:_Global#expandDescription|expandDescription]] and [[Oolite_JavaScript_Reference:_Global#expandMissionText|expandMissionText]] you can provide a dictionary of keys and replacement values (which can be JavaScript expressions calculated at run-time).&lt;br /&gt;
*# Special keys (these are hard-coded)&lt;br /&gt;
*#* [commander_name]&lt;br /&gt;
*#* [commander_shipname]&lt;br /&gt;
*#* [commander_shipdisplayname]&lt;br /&gt;
*#* [commander_rank]&lt;br /&gt;
*#* [commander_kills]&lt;br /&gt;
*#* [commander_legal_status]&lt;br /&gt;
*#* [commander_bounty]&lt;br /&gt;
*#* [credits_number]&lt;br /&gt;
*# [[Descriptions.plist]] (if there is a matching key, substitutes the associated value, which may be a single string or an array of string; if it is an array of strings, then one is selected at random.) Because [[descriptions.plist]] entries from all OXPs are merged at run-time with the ones in the game's Resources folder, it is '''recommended''' that OXP-specific entries in [[descriptions.plist]] have an OXP or creator-specific prefix to ensure uniqueness.&lt;br /&gt;
*#* For example, [nom] will match the &amp;quot;nom&amp;quot; key in [[descriptions.plist]], the value of which is an array of two strings (&amp;quot;%R&amp;quot;, &amp;quot;[nom1]&amp;quot;), one of which will be randomly selected, and then evaluated again.&lt;br /&gt;
*# Keyboard bindings (will be replaced with corresponding key name; however, [[descriptions.plist]] overrides keybindings and is evaluated first, so using these keys in OXPs is '''discouraged'''; instead, look for the comment &amp;quot;translations of special keys&amp;quot; in [[descriptions.plist]] and use the keys there)&lt;br /&gt;
*#* [oolite_key_tab], [oolite_key_esc], [oolite_key_space], [oolite_key_f1], [oolite_key_f2], [oolite_key_f3], [oolite_key_f4], [oolite_key_f5], [oolite_key_f6], [oolite_key_f7], [oolite_key_f8], [oolite_key_f9], [oolite_key_f10, [oolite_key_f11]&lt;br /&gt;
*#* [oolite_key_right], [oolite_key_left], [oolite_key_down], [oolite_key_up], [oolite_key_home], [oolite_key_end], [oolite_key_insert], [oolite_key_delete], [oolite_key_pageup], [oolite_key_pagedown]&lt;br /&gt;
*#* [oolite_key_numpad0], [oolite_key_numpad1], [oolite_key_numpad2], [oolite_key_numpad3], [oolite_key_numpad4], [oolite_key_numpad5], [oolite_key_numpad6], [oolite_key_numpad7], [oolite_key_numpad8], [oolite_key_numpad9]&lt;br /&gt;
*# Mission variables (&amp;lt;code&amp;gt;[mission_FOO]&amp;lt;/code&amp;gt; substitutes the value contained in &amp;lt;code&amp;gt;missionVariables.FOO&amp;lt;/code&amp;gt;)&lt;br /&gt;
*#* These are commonly used in OXPs as a method of including dynamic information in displayed text.&lt;br /&gt;
*# Legacy local variables (&amp;lt;code&amp;gt;[local_FOO]&amp;lt;/code&amp;gt; substitutes the value contained in &amp;lt;code&amp;gt;worldScripts.scriptname.FOO&amp;lt;/code&amp;gt; with the scriptname depending on the context where the text is being evaluated)&lt;br /&gt;
*#* A local variable is a property defined on a world script (e.g., a script.js in Config/, or any script listed in a [[Scripting Oolite with JavaScript|world-scripts.plist]]). this.name from a script.js in Config/ is used as the key for that script in the global worldScripts dictionary. As of Oolite 1.87, none of the core game texts use local variables.&lt;br /&gt;
*#* In [[Oolite_JavaScript_Reference:_Mission#addMessageText]] and [[Oolite_JavaScript_Reference:_Mission#addMessageTextKey]], the applicable scriptname is the calling script.  As an example, if your script has a local variable &amp;lt;code&amp;gt;this.calculatedvalue&amp;lt;/code&amp;gt; you could display the content of that variable with other text by calling &amp;lt;code&amp;gt;mission.addMissionText(&amp;quot;various text [local_calculatedvalue] various other text&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
*# Legacy script query methods&lt;br /&gt;
*#* As a last resort, Oolite attempts to expand a key by treating it as a legacy script query method and invoking it. Only [[whitelist.plist|whitelisted]] query_methods and query_method_aliases are permitted. Examples:  [systemGovernment_string] (a whitelisted query method), [fuelLevel_number] (a whitelisted query method) or [fuel_level_number] (a whitelisted alias for [fuelLevel_number])&lt;br /&gt;
* If no suitable replacement is found, the text will be displayed unchanged and a warning will be logged.&lt;br /&gt;
&lt;br /&gt;
'''Operators:'''&lt;br /&gt;
&lt;br /&gt;
If a vertical bar ('|') is found between square brackets, Oolite will interpret whatever is on the left side of the bar as the ''key'' and whatever is on the right side of the bar as an ''operator''. An ''operator'' tells Oolite to apply a change after the key has been expanded. Some operators also require an input value, a colon (':'). The available ''operators'' are:&lt;br /&gt;
* dcr       - displays the text as a credit value, interpreting the value as floating point deci-credits (e.g., if the value is 100.7, display 10.7 credits)&lt;br /&gt;
* cr        - displays the text as a credit value, interpreting the value as floating point credits (e.g., if the value is 100.7, display 100.7 credits)&lt;br /&gt;
* icr       - displays the text as a credit value, interpreting the value as integer credits (e.g., if the value is 100.7, display 100.0 credits)&lt;br /&gt;
* idcr      - displays the text as a credit value, interpreting the value as integer deci-credits, rounded (e.g., if the value is 100.7, display 10.0 credits)&lt;br /&gt;
* precision - displays the text as a floating point value with an integer-specified number of decimal places, must be specified as ''precision'':number (e.g., [distance|precision:2])&lt;br /&gt;
* multiply  - displays the text as a floating point value multiplied with another floating point value, which must be provided as ''multiply'':othervalue (e.g., [fuelLevel_number|multiply:0.5])&lt;br /&gt;
* add       - displays the text as a floating point value added to another floating point value, which must be provided as ''add'':othervalue (e.g., [fuelLevel_number|add:1.5])&lt;br /&gt;
&lt;br /&gt;
Multiple ''operators'' can be applied sequentially to the same key, each separated by a vertical bar. For example: [distance|multiply:0.5|precision:1].&lt;br /&gt;
&lt;br /&gt;
== When are things switched ==&lt;br /&gt;
Oolite calls the switching routine only at certain places ('''this is not a complete list'''):&lt;br /&gt;
*The most often used place is in [[missiontext.plist]]. Every text line is evaluated for string replacement. Most commonly this is used to replace text in brackets with the content of a variable or a [[descriptions.plist]] entry.&lt;br /&gt;
*Inside a [[descriptions.plist]] entry you can also use brackets. This way you can get a recursive process. Look for example in the descriptions.plist in Oolite's Resources\Config folder where it generates random names in a recursive way. (Recursion is limited to 32 times to prevent infinite looping.). Because of the random number generator used for expansion, the use of deep recursion may cause correlations which are not random - consider for example that &amp;quot;mud&amp;quot; is always followed by &amp;quot;tennis&amp;quot; or &amp;quot;hockey&amp;quot; in planetary descriptions, never anything else. In Oolite 1.79, certain ways of expanding descriptions from JavaScript will use a higher quality random number generator, which does not have correlation problems.&lt;br /&gt;
*During evaluation of a [[OXP howto AI|plist-based AI]], it only uses switching on the content of a &amp;quot;commsMessage&amp;quot;.&lt;br /&gt;
*During evaluation of a [[script.plist]] all the lines in the DO or ELSE part of a condition statement are switched. Nothing is switched in the CONDITIONS part of a command so you cannot use anything in brackets there.&lt;br /&gt;
*In [[Oolite_JavaScript_Reference:_Global#expandDescription|expandDescription]] and [[Oolite_JavaScript_Reference:_Global#expandMissionText|expandMissionText]].&lt;br /&gt;
&lt;br /&gt;
The way things work means that you can create complicated structures. You can use for example:&lt;br /&gt;
 addSystemShips: my_ship 1 0.[d100_number]&lt;br /&gt;
&lt;br /&gt;
Oolite first offers the above line to the replacement routine. That replaces [d100_number] by a random number. e.g. 46. Than the routine returns:&lt;br /&gt;
 addSystemShips: my_ship 1 0.46&lt;br /&gt;
&lt;br /&gt;
This line will then be executed and the ship is placed at the calculated random position. You can also define a [[descriptions.plist]] entry of my_random_ship and define a list of several ship roles. When you then use:&lt;br /&gt;
 addSystemShips: [my_random_ship] 1 0.[d100_number]&lt;br /&gt;
the system will randomly pick a ship from the list and replace the d100_number with a value and return the expanded string. This will than be executed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite scripting]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Scripting_Oolite_with_JavaScript&amp;diff=58452</id>
		<title>Scripting Oolite with JavaScript</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Scripting_Oolite_with_JavaScript&amp;diff=58452"/>
		<updated>2020-06-20T19:49:04Z</updated>

		<summary type="html">&lt;p&gt;Milo: changed world-scripts.plist to a link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Oolite]] 1.68 and later supports scripts written in [http://en.wikipedia.org/wiki/ECMAScript ECMAScript] (more commonly known as [http://en.wikipedia.org/wiki/JavaScript JavaScript]) in addition to its traditional model based on [[property lists]]. This page provides an overview of how JavaScript is used in Oolite. The page [[Oolite JavaScript Reference: object model]] provides reference for Oolite-specific objects and methods. The page [[Oolite JavaScript Reference: World script event handlers]] provides reference for the event handlers Oolite supports. The language standards and some tutorials can be found through the Wiki links provided above.&lt;br /&gt;
&lt;br /&gt;
== Using JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Currently, JavaScript is supported for “worldScripts”, that is, as a replacement for scripts in ''script.plist'' and shipScripts, that acts as expansion for the ships AI. While a ''script.plist'' file may contain any number of separate scripts, a single JavaScript file may contain only one script.&lt;br /&gt;
&lt;br /&gt;
If your OXP only uses one script, place a JavaScript file named ''script.js'' (or ''script.es'') in the OXP’s ''Config'' directory. If you wish to use multiple scripts, you may instead create file named ''world-scripts.plist'' in the ''Config'' directory. This [[property list]] file should consist of an array of worldScript names; the named scripts should exist in a directory named ''Scripts'' inside your OXP. As with most “atomic” files (files which cannot be merged), such script files must have a unique name to avoid conflicts with other OXPs. Using the [[world-scripts.plist]] method, you can combine JavaScript, plist and OOS scripts however you wish.&lt;br /&gt;
&lt;br /&gt;
Whereas plist scripts are based on polling – all scripts are run at semi-regular intervals, whether they need to be or not – scripts written in JavaScript are “event driven” – different functions, or ''event handlers'', in the script are called in response to state changes in the game, or when other events of interest happen. For instance, &amp;lt;code&amp;gt;willExitWitchSpace&amp;lt;/code&amp;gt; is called just before player exits witchspace, and &amp;lt;code&amp;gt;alertConditionChanged&amp;lt;/code&amp;gt; is called whenever the alert condition changes. See the [[Oolite JavaScript event handler reference|event handler reference]] for a full list of handlers and when Oolite will call them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== script.js File Template ===&lt;br /&gt;
&lt;br /&gt;
Copy and paste this template into a file called script.js in the OXP Config directory. Ensure you change at least the Name value. '''Every script must have a unique name.''' If multiple scripts with the same name are encountered, Oolite will arbitrarily select one and discard the others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;this.name           = &amp;quot;My OXP Script&amp;quot;;&lt;br /&gt;
this.author         = &amp;quot;Your Name Here&amp;quot;;&lt;br /&gt;
this.copyright      = &amp;quot;(C) 2013 Me.&amp;quot;;&lt;br /&gt;
this.licence        = &amp;quot;CC-NC-by-SA 2.0&amp;quot;;&lt;br /&gt;
this.description    = &amp;quot;This OXP doesn't do very much yet.&amp;quot;;&lt;br /&gt;
this.version        = &amp;quot;1.0 alpha 1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/*  You can copy and paste this function and just change the &amp;quot;startUp&amp;quot;&lt;br /&gt;
    to another event name to handle other OXP events (eg &amp;quot;shipDockedWithStation&amp;quot;,&lt;br /&gt;
    &amp;quot;alertConditionChanged&amp;quot;, etc).&lt;br /&gt;
*/&lt;br /&gt;
this.startUp = function()&lt;br /&gt;
{&lt;br /&gt;
    log(this.name, &amp;quot;Initialising OXP &amp;quot; + this.name);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [https://developer.mozilla.org/en/JavaScript/Reference Mozilla JavaScript reference pages]&lt;br /&gt;
* [[Oolite JavaScript event handler reference]]&lt;br /&gt;
* [[Oolite JavaScript object model]]&lt;br /&gt;
&amp;lt;!-- * [[JavaScript test OXP]] --&amp;gt;&lt;br /&gt;
* [[Variables in Oolite JavaScripts]]&lt;br /&gt;
* [[Javascript Operators]]&lt;br /&gt;
* [[Handling OXP Dependencies with JavaScript]]&lt;br /&gt;
* [[Optimization tips]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Oolite]]&lt;br /&gt;
[[Category:Oolite scripting]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
	<entry>
		<id>http://backup.witchspacewiki.org/index.php?title=Worldscripts_plist&amp;diff=58451</id>
		<title>Worldscripts plist</title>
		<link rel="alternate" type="text/html" href="http://backup.witchspacewiki.org/index.php?title=Worldscripts_plist&amp;diff=58451"/>
		<updated>2020-06-20T19:45:07Z</updated>

		<summary type="html">&lt;p&gt;Milo: create redirect for worldscripts plist variant spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Misc plists#world-scripts.plist]]&lt;/div&gt;</summary>
		<author><name>Milo</name></author>
		
	</entry>
</feed>