Back to Index Page generated: Feb 22, 2026, 1:21:04 AM

Expansion Liners

Content

Warnings

  1. Wiki check failed: org.apache.http.conn.ConnectTimeoutException: Connect to wiki.alioth.net:443 [wiki.alioth.net/109.70.41.29] failed: Connection timed out
  2. Wiki check failed: org.apache.http.conn.ConnectTimeoutException: Connect to wiki.alioth.net:443 [wiki.alioth.net/109.70.41.29] failed: Connection timed out
  3. Wiki check failed: org.apache.http.conn.ConnectTimeoutException: Connect to wiki.alioth.net:443 [wiki.alioth.net/109.70.41.29] failed: Connection timed out

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Adds some beautiful and very large vessels to the spacelanes. Adds some beautiful and very large vessels to the spacelanes.
Identifier oolite.oxp.smivs.Liners oolite.oxp.smivs.Liners
Title Liners Liners
Category Ships Ships
Author Smivs, P.A.Groove, Griff and Thargoid Smivs, P.A.Groove, Griff and Thargoid
Version 1.8 1.8
Tags ships ships
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
  • oolite.oxp.Thargoid.Bigships:1.02
  • oolite.oxp.Thargoid.Bigships:1.02
  • Conflict Expansions
    Information URL http://wiki.alioth.net/index.php/Liners n/a
    Download URL https://wiki.alioth.net/img_auth.php/b/bf/Liners_v1.8.oxz n/a
    License Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license
    File Size n/a
    Upload date 1771214517

    Documentation

    Also read http://wiki.alioth.net/index.php/Liners

    readme.rtf

    {\rtf1\ansi\deff3\adeflang1025
    {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 Arial;}{\f5\froman\fprq2\fcharset0 Times New Roman;}{\f6\fnil\fprq2\fcharset0 FreeSans;}{\f7\fnil\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}}
    {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
    {\stylesheet{\s0\snext0\ql\widctlpar\ltrpar\hyphpar0\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\alang1081\loch\f5\fs24\lang2057 Normal;}
    {\s15\sbasedon0\snext16\ql\widctlpar\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af7\afs24\loch\f4\fs28\lang2057 Heading;}
    {\s16\sbasedon0\snext16\sl288\slmult1\ql\widctlpar\sb0\sa120\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 Text Body;}
    {\s17\sbasedon16\snext17\sl288\slmult1\ql\widctlpar\sb0\sa120\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 List;}
    {\s18\sbasedon0\snext18\ql\widctlpar\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af6\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 Caption;}
    {\s19\sbasedon0\snext19\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af6\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 Index;}
    {\s20\sbasedon0\snext20\ql\widctlpar\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 caption;}
    {\s21\sbasedon0\snext21\ql\widctlpar\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 WW-caption;}
    {\s22\sbasedon0\snext22\ql\widctlpar\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs24\lang2057 WW-caption1;}
    {\s23\sbasedon0\snext23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057 Preformatted Text;}
    }{\*\generator LibreOffice/5.0.3.2$Linux_X86_64 LibreOffice_project/00m0$Build-2}{\info{\author smivs }{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2018\mo4\dy12\hr21\min41}{\printim\yr0\mo0\dy0\hr0\min0}}\deftab709
    \viewscale100
    {\*\pgdsctbl
    {\pgdsc0\pgdscuse451\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}}
    \formshade{\*\pgdscno0}\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
    {\*\ftnsep}\pgndec\pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    Liners OXP v1.}{\i0\b0\rtlch \ltrch\loch\lang1025
    7}{\i0\b0\rtlch \ltrch\loch\lang1025
    .}{\i0\b0\rtlch \ltrch\loch\lang1025
    0}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch\lang1025
    
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    Liners adds huge cruise liners to the spaceways. These are enormous vessels, self-contained cities in space, with often tens of thousands of passengers on board. They will occasionally be found en-route to the planet, or in orbit around the planet close to the Main Station where passengers can enjoy the facilities of the GalCop stations and visit the planet below. Many of these ships have their own escort ships, shuttles and supply ships and these will often be seen ferrying passengers, crew and supplies from the station or the liner.}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch\lang1025
    
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    More information can be found on the Wiki page:-}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    http://wiki.alioth.net/index.php/Liners}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch\lang1025
    
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    This OXP is self contained and has no dependencies. Big Ships and CCL are NOT required - this OXP will work with BigShips installed. The Aurora liner is available as a separate OXP - Liners OXP supercedes Aurora OXP and it should be removed when Liners is installed. }{\i0\b0\rtlch \ltrch\loch\lang1025
    Also added is the P A G roove Orisis.}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch\lang1025
    
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    Licence}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. To view a copy of this license, visit the Creative Commons website or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch\lang1025
    
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    Credits}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar{\i0\b0\rtlch \ltrch\loch\lang1025
    This OXP was made with contributions from Thargoid, P A Groove, Smivs, Griff }{\i0\b0\rtlch \ltrch\loch\lang1025
    and cbr}{\i0\b0\rtlch \ltrch\loch\lang1025
    . The base models for the Ferry, Sidewinder-X Escort and Lifeboat are by Aegidian, and the Saga Class liner model is by ADCK. Thanks also go to Commander McLane, PHKB and Eric Walch for help, advice and bugfixing.}
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch\lang1025
    
    \par \pard\plain \s23\ql\widctlpar\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af7\afs24\loch\f5\fs20\lang2057\ql\widctlpar\ltrpar\rtlch \ltrch\loch
    
    \par }

    Equipment

    This expansion declares no equipment. This may be related to warnings.

    Ships

    Name
    Orisis class Ferry
    PAGroove-Orisis-basic
    PAGroove-Orisis-basic-a
    PAGroove-Orisis-basic-b
    PAGroove-Orisis-basic-c
    Orisis class hospital
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    Saga Class Cruise Ship
    classicShipsEngine1
    classicShipsEngine2
    classicShipsGun
    Inter-system ferry
    Aurora Galaxy Liner
    Aurora
    liners_aurora_blue_ocean
    liners_aurora_broadway
    liners_aurora_colors_of_the_sun
    liners_aurora_white_pearl
    Docking Bay
    Diamond Class Shuttle
    Attack Drone
    Emerald Dock
    Emerald Class Liner
    liners_emeraldLiner_bb
    liners_emeraldLiner_bd
    liners_emeraldLiner_bl
    liners_emeraldLiner_bo
    liners_emeraldLiner_bp
    liners_emeraldLiner_db
    liners_emeraldLiner_dd
    liners_emeraldLiner_dl
    liners_emeraldLiner_do
    liners_emeraldLiner_dp
    liners_emeraldLiner_lb
    liners_emeraldLiner_ld
    liners_emeraldLiner_ll
    liners_emeraldLiner_lo
    liners_emeraldLiner_lp
    liners_emeraldLiner_ob
    liners_emeraldLiner_od
    liners_emeraldLiner_ol
    liners_emeraldLiner_op
    liners_emeraldLiner_rb
    liners_emeraldLiner_rd
    liners_emeraldLiner_rl
    liners_emeraldLiner_ro
    liners_emeraldLiner_rp
    liners_emeraldPBShuttle
    liners_emeraldPTShuttle
    liners_emeraldSBShuttle
    liners_emeraldSTShuttle
    liners_ferry1
    liners_ferry2
    liners_ferry3
    Jade Class RunAbout
    Kamikaze Drone Laser Sub-entity
    Lifeboat
    liners_sidewinder_x
    Cruise Security Vessel
    Tigershark
    Turret Mount
    Tigershark
    Trident Missile
    Trident Tine
    saga-liner_template
    Cruise Ship 'Ronald'
    Cruise Ship 'Patricia'
    smivs-liner_template

    Models

    This expansion declares no models. This may be related to warnings.

    Scripts

    Path
    Scripts/Orisis_shipScript.js
    "use strict";
    this.name				= "Orisis_shipScript";
    this.author				= "Thargoid";
    this.copyright			= "Creative Commons: attribution, non-commercial, sharealike.";
    this.description			= "Adds lifepods when energy gets low";
    this.version			= "1.0";
    
    
    this.shipEnergyIsLow = function()
    	{
    	if(!this.shipEvacuated)
    		{
    		this.shipEvacuated = true;
    		var leftPods = Math.ceil(Math.random() * 10) + 5;
    		var rightPods = Math.ceil(Math.random() * 10) + 5;
    		this.ship.commsMessage("Mayday, mayday! Hull breach imminent, all passengers and non-essential crew to the lifepods!");
    		
    		var offset;
    		for(var i=0; i < rightPods; i++)
    			{
    			offset = new Vector3D([240, 0, Math.random() * 670 - 483]);
    			var orientation = this.ship.orientation;
    			orientation.w = -orientation.w;
    			system.legacy_addShipsAtPrecisely("escape-capsule", 1, "abs", this.ship.position.add(offset.rotateBy(orientation)));
    			}
    		
    		for(var i=0; i < leftPods; i++)
    			{
    			offset = new Vector3D([-240, 0, Math.random() * 670 - 483]);
    			var orientation = this.ship.orientation;
    			orientation.w = -orientation.w;
    			system.legacy_addShipsAtPrecisely("escape-capsule", 1, "abs", this.ship.position.add(offset.rotateBy(orientation)));
    			}
    		}
    	}
    
    this.shipEnergyBecameFull = function()
    	{
    	this.shipEvacuated = false;
    	}
    Scripts/liners_aurora.js
    "use strict"; 
    
    this.name				= "liners_aurora";
    this.author				= "Thargoid";
    this.copyright			= "Creative Commons: attribution, non-commercial, sharealike.";
    this.description		= "Aurora shipscript";
    this.version			= "1.6.2";
    
    
    // the functions for placing the escorts around the Aurora ...
    (function() {
    const escortPositions =
    [
        // X-shape escort pattern
        new Vector3D(-1, 1,  0),
        new Vector3D( 1, 1,  0),
        new Vector3D(-1, -1, 0),
        new Vector3D( 1, -1, 0)
    ];
    
    // ... are nicked from Ahruman
    this.coordinatesForEscortPosition = function(index)
    {
        var highPart = 1 + (index >> 2);  // Equivalent to 1 + Math.floor(position / 4)
        var lowPart = index % 4;
        var spacing = this.ship.collisionRadius * 2.5 * highPart;
        return escortPositions[lowPart].multiply(spacing);
    }
    }).call(this);
    
    this.shipEnergyIsLow = function()
    	{
    	if(!this.shipEvacuated)
    		{
    		this.shipEvacuated = true;
    		this.ship.desiredSpeed = 0;
    		var leftPods = Math.ceil(Math.random() * 10) + 5;
    		var rightPods = Math.ceil(Math.random() * 10) + 5;
            var leftOrientation = this.ship.orientation.multiply([0.7071, 0, 0.7071, 0]);
            var rightOrientation = this.ship.orientation.multiply([0.7071, 0, -0.7071, 0]);
            var leftVelocity = this.ship.vectorRight.multiply(-200).add(this.ship.velocity);
            var rightVelocity = this.ship.vectorRight.multiply(200).add(this.ship.velocity);
    		this.ship.commsMessage("Mayday, mayday! Hull breach imminent, all passengers and non-essential crew to the lifepods!");
    		
    		var offset, pod, fraction, i;
    		for(i=0; i < rightPods; i++)
    			{
                // ship has a triangular shape
                fraction = Math.random();
    			offset = new Vector3D([(1 - fraction) * 1400, 0, (fraction * 4315) - 2155]);
    			pod = system.addShips("escape-capsule", 1, this.ship.position.add(offset.rotateBy(this.ship.orientation)), 0)[0];
                pod.orientation = rightOrientation;
                pod.velocity = rightVelocity; // eject them outwards
    			}
    		
    		for(i=0; i < leftPods; i++)
    			{
                fraction = Math.random();
    			offset = new Vector3D([(1 - fraction) * -1400, 0, (fraction * 4315) - 2155]); 
    			pod = system.addShips("escape-capsule", 1, this.ship.position.add(offset.rotateBy(this.ship.orientation)), 0)[0];
                pod.orientation = leftOrientation;
                pod.velocity = leftVelocity;
    			}
    		}
    	}
    
    this.shipEnergyBecameFull = function()
    	{
    	this.shipEvacuated = false;
    	}
    
    Scripts/liners_drone.js
    "use strict"; 
    
    this.name					= "liners_drone.js";
    this.author					= "Thargoid & Eric Walch";
    this.copyright				= "Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license with clauses - see readme.txt.";
    this.description			= "Pickup of a drone after combat, and check if it's reusable (T). New JS Scanning routine (EW).";
    this.version				= "1.6.s";
    
    
    this.findMastersHostiles = function()
    	{
    	function isHostile(entity) 
    		{ 
    		return (entity.isShip && entity.target && (entity.target == this.ship.owner || entity.target == this.ship) && entity.hasHostileTarget);
    		}
    	if(!this.ship.owner)
    		{
    		this.ship.reactToAIMessage("NOTHING_FOUND");
    		}
    	else
    		{
    		let targets = system.filteredEntities(this, isHostile, this.ship, 25600);
    		if(targets.length > 0)
    			{
    			this.ship.target = targets[0];
    			this.ship.reactToAIMessage("NEW_DRONE_TARGET");
    			}
    		else 
    			{
    			this.ship.reactToAIMessage("NOTHING_FOUND");
    			}
    		}
    	}
    
    Scripts/liners_emerald.js
    "use strict"; 
    
    this.name					= "liners_emerald.js";
    this.author					= "Thargoid";
    this.copyright				= "Creative Commons: attribution, non-commercial, sharealike with clauses - see readme.txt";
    this.description			= "Emerald liner script.";
    this.version				= "1.6.2";
    
    (function () {
    
    const escortPositions =
    	[
        new Vector3D(-2, 0,  2),
        new Vector3D(-2, 0,  -2),
        new Vector3D( 2, 0,  2),
        new Vector3D( 2, 0, -2),
        new Vector3D(2, 0, 0),
        new Vector3D(-2, 0,  0)
    	];
    
    const escortPositionCount = escortPositions.length;
    const escortSpacingFactor = 3;
    
    
    this.coordinatesForEscortPosition = function (index, count)
    	{
        var highPart = Math.floor(index / escortPositionCount) + 1;
        var lowPart = index % escortPositionCount;
        
        var spacing = this.ship.collisionRadius * escortSpacingFactor * highPart;
        
        return escortPositions[lowPart].multiply(spacing);
    	}
    
    	}).call(this);
    
    this.shipSpawned = function()
    	{
    	this.linerGroup = this.ship.group;
    	this.linerGroup.leader = this.ship;
    	this.launchChance = 0;
    	this.counterArray = [0,0,0,0];
    	this.posArray = [];
    	this.IDArray = [0,0,0,0];
    	var subCounter = 0 ; // reset the counter
    	for(subCounter = 0;subCounter<this.ship.subEntities.length;subCounter++)
    		{
    		if(this.ship.subEntities[subCounter].hasRole("liners_emeraldShuttle"))
    			{ this.posArray.push(this.ship.subEntities[subCounter].position) }
    		}	
    	this.nameShip();
    	if(Math.random() > 0.75)
    		{
    		this.ship.switchAI("liners_emeraldWAI.plist");
    		}
    	}	
    	
    this.nameShip = function()
    	{
    	this.nameArray = ["XXXX", "Titanic", "Olympic", "Galactica", "Andromeda", "Kessel", "Aegidian", "Aqualina", "Antilles", "Dark Star", "Atlantis", "Discovery", "Kobayashi Maru", "Bermuda Cube", "Nebula", "Empiric", "Majestic", "Emerald Moon", "Empress of Ryaxaxax", "Far Sky", "Fuji Maru", "Imperator", "XXXX", "Independence", "Leviathan", "Maelstrom", "Meridian", "Michelangelo", "Millenium", "Neptune", "Neptunia", "Oceania", "Oceanic", "Orca", "Republic", "Resolute", "Saturnia", "Soyuz", "Valkerie", "Valhalla", "Star Dancer", "Solaris", "Victory", "Viking", "XXXX", "Vulcan", "Concorde", "Wolf", "Adonis", "Poseidon", "Zeus", "Apollo", "Eagle", "Phoenix", "Adventurer", "Odyssey", "Dolphin", "Allure", "Amadeus", "Adamant", "Spirit", "Aquamarine", "Arcadia", "XXXX", "Calypso", "Conquest", "Freedom", "Imagination", "Inspiration", "Legend", "Liberty", "Constellation", "Infinity", "Heart of Gold", "Solstice", "Mercury", "Jupiter", "Saturn", "Mars", "Crystal", "Symphony", "Melody", "Ambassador", "Rhapsody", "Wonder", "XXXX", "Dream Weaver", "Dreamer", "Elation", "Enchanter", "Enchantment", "Illusion", "Conjurer", "Magii", "Far Star", "XXXX", "Venturer", "Jubilee", "Sun Skimmer", "Lucky", "Preen", "Lucky Star", "Brigadoon", "Mardi Gras", "Carnival", "Festival", "Samba", "Tango", "Mariner", "Minerva", "Fantasia", "Opera", "Firefox", "Explorer", "Oasis", "Orion", "Platinum", "Aloha", "Radiant", "Regal", "Renaissance", "Princess", "Royale", "Rose", "Wonder", "Sovereign", "Vista", "Capricorn", "Aquarius", "Pisces", "Aries", "Taurus", "Gemini", "Leo", "Virgo", "Libra", "Scorpio", "Corona", "Wind Song", "Zion", "XXXX"];
    	this.nameChoice = Math.floor(Math.random() * this.nameArray.length);
    	this.shipTitle = this.nameArray[this.nameChoice]
    	if(this.shipTitle !== "XXXX")
    		{ this.ship.displayName = "ASL " + this.shipTitle; }
    	else
    		{
    		this.titleArray = ["Maid", "Queen", "Empress", "Moons", "Freedom", "Majesty", "Splendour", "Magic", "Memories", "Tales", "Spirit"];
    		this.titleChoice = Math.floor(Math.random() * this.titleArray.length);
    		this.systemName = System.systemNameForID(Math.floor(Math.random() * 256));
    		this.ship.displayName = this.titleArray[this.titleChoice] + " of " + this.systemName;
    		this.shipTitle = this.titleArray[this.titleChoice] + " of " + this.systemName;
    		}
    	}
    
    this.beginUnload = function()
    	{
    	this.launchChance = 0;
    	this.ship.commsMessage("WARNING - This is the Emerald class liner ASL " + this.shipTitle + ". Please exercise caution around this region as we are beginning our disembarkation process.");
    	}
    
    this.endUnload = function()
    	{
    	this.launchChance = 0;
    	this.ship.AIState = "DEPART";
    	this.ship.commsMessage("This is the ASL " + this.shipTitle + ". Our disembarkation for " + system.name + " is now completed.");
    	}
    
    this.beginLaunch = function()
    	{
    	if(Math.random() < this.launchChance) // ending launches and ship out
    		{
    		this.endUnload();
    		return;
    		}
    		
    	if(Math.random() > 0.5 && this.counterArray[0] === 0) // 50% chance of launching upper port shuttle
    		{ 
    		this.launchShuttle(0);
    		this.launchChance += 0.01;
    		} 
    	
    	if(Math.random() > 0.5 && this.counterArray[1] === 0) // 50% chance of launching upper starboard shuttle
    		{ 
    		this.launchShuttle(1);
    		this.launchChance += 0.01;
    		} 
    		
    	if(Math.random() > 0.5 && this.counterArray[2] === 0) // 50% chance of launching lower port shuttle
    		{ 
    		this.launchShuttle(2);
    		this.launchChance += 0.01;
    		} 
    	
    	if(Math.random() > 0.5 && this.counterArray[3] === 0) // 50% chance of launching lower starboard shuttle
    		{ 
    		this.launchShuttle(3);
    		this.launchChance += 0.01;
    		} 	
    	
    	this.launchChance += 0.01;	// increment the chance of departure by 1% in any case.
    	}
    
    this.launchShuttle = function(subEnt)
    	{
    	switch(subEnt)
    		{
    		case 0:
    			{
    			this.callback = addFrameCallback(this.movePTShuttle.bind(this));
    			this.IDArray[0] = this.callback;
    			break;
    			}
    		case 1:
    			{
    			this.callback = addFrameCallback(this.moveSTShuttle.bind(this));
    			this.IDArray[1] = this.callback;
    			break;
    			}
    		case 2:
    			{
    			this.callback = addFrameCallback(this.movePBShuttle.bind(this));
    			this.IDArray[2] = this.callback; 
    			break;
    			}
    		case 3:
    			{
    			this.callback = addFrameCallback(this.moveSBShuttle.bind(this));
    			this.IDArray[3] = this.callback; 
    			break;
    			}
    		}	
    	
    	this.callback = 0;
    	}
    
    this.movePTShuttle = function(delta)
    	{
    	if(delta === 0) {return;} // so we're not moving things when the game is paused
    	this.moveShuttle(0);
    	}
    
    this.moveSTShuttle = function(delta)
    	{
    	if(delta === 0) {return;} // so we're not moving things when the game is paused
    	this.moveShuttle(1);
    	}
    	
    this.movePBShuttle = function(delta)
    	{
    	if(delta === 0) {return;} // so we're not moving things when the game is paused
    	this.moveShuttle(2);
    	}
    
    this.moveSBShuttle = function(delta)
    	{
    	if(delta === 0) {return;} // so we're not moving things when the game is paused
    	this.moveShuttle(3);
    	}	
    	
    this.moveShuttle = function(subEnt)
    	{
    	this.ship.subEntities[subEnt].position = this.ship.subEntities[subEnt].position.add(this.ship.subEntities[subEnt].vectorForward);
    	this.counterArray[subEnt]++;
    	if(this.counterArray[subEnt] > 500)
    		{
    		if(this.IDArray[subEnt] !== 0)
    			{ 
    			removeFrameCallback(this.IDArray[subEnt]); 
    			this.IDArray[subEnt] = 0;
    			this.swapShuttle(subEnt);
    			}
    		this.counterArray[subEnt] = 0;	
    		}
    	}
    	
    this.swapShuttle = function(subEnt)
    	{
    	this.subPosition = this.ship.subEntities[subEnt].position;
    	this.subOrientation = this.ship.subEntities[subEnt].orientation;
    	this.ship.subEntities[subEnt].position = this.posArray[subEnt]; 
    	let subShuttle = this.ship.spawnOne("liners_jade"); 
    	subShuttle.position = this.localToGlobal(this.subPosition); 
    	subShuttle.orientation = this.subOrientation.multiply(this.ship.orientation); 
    	subShuttle.velocity = subShuttle.vectorForward;
    	subShuttle.desiredSpeed = subShuttle.maxSpeed;
    	this.linerGroup.addShip(subShuttle);
    	subShuttle.group = this.ship.group;
    	if(Math.random() > 0.33)
    		{
    		subShuttle.target = system.mainStation;
    		subShuttle.switchAI("liners_dockingShuttleAI.plist"); 
    		}
    	else
    		{ subShuttle.switchAI("liners_landingShuttleAI.plist"); }
    	}
    	
    this.localToGlobal = function(position)
    	{ // sub-ent position is relative to mother, but for swapping we need the absolute global position
    	let orientation = this.ship.orientation;
    	return this.ship.position.add(position.rotateBy(orientation));
    	}
    
    this.playerWillEnterWitchspace = this.shipWillEnterWormhole = this.shipRemoved = this.shipDied = function ()
    	{ this.stopCallbacks();	}	
    	
    this.stopCallbacks = function()
    	{
    	var IDCounter = 0 ; // reset the counter
    	for(IDCounter = 0;IDCounter<this.IDArray.length;IDCounter++)
    		{
    		if(this.IDArray[IDCounter] !== 0)
    			{
    			removeFrameCallback(this.IDArray[IDCounter]); 
    			this.IDArray[IDCounter] = 0;
    			}
    		}	
    	}	
    
    Scripts/liners_populator.js
    "use strict"; 
    
    // Standard attributes 
    this.name           = "liners_populator_script.js"; 
    this.author	    = "Thargoid, Smivs";
    this.copyright	    = "Creative Commons: attribution, non-commercial, sharealike."; 
    this.version        = "1.6.2"; 
    this.description    = "Population script for Liners." 
    
    this.shipWillExitWitchspace = function()
    	{
    	if(!system.isInterstellarSpace)
    		{
    		this.populator();
    		}
    	}
    
    this.shipWillLaunchFromStation = function(station)
    	{
    	if(worldScripts["bigShips_populator"]) // if bigShips is installed, we don't need this script
    		{
    		delete this.shipWillExitWitchspace;
    		delete this.populator;
    		log("Big Ships is installed, Liners populator removed");
    		}
    	else
    		{
    		this.populator();
    		}
    	delete this.shipWillLaunchFromStation; // this is only needed for the first launch	
    	}
    
    this.populator = function() 
    {
     if (system.government > 0 && system.techLevel > 9) 
     {
     system.addShipsToRoute("liners_liner", 1, Math.random(), "wp")
     }
    }
    
    
    
    Scripts/liners_tigershark.js
    "use strict"; 
    
    this.name				= "liners_tigershark.js";
    this.author				= "Thargoid";
    this.copyright			= "Creative Commons: attribution, non-commercial, sharealike.";
    this.description		= "Ship script for Tiger Shark";
    this.version			= "1.6.2";
    
    this.shipSpawned = function()
    	{
    	this.nameShip();
    	}
    	
    this.nameShip = function()
    	{
    	this.shipTitle = expandDescription('[TigersharkName]');
    	if(Math.random() > 0.25)
    		{
    		this.shipTitle = this.shipTitle + expandDescription('[TigersharkNumber]');
    		}
    	this.ship.displayName = "TSK " + this.shipTitle;
    	}
    
    
    this.shipEnergyIsLow = function()
    	{
    	if(!this.shipEvacuated)
    		{
    		this.shipEvacuated = true;
    		this.ship.desiredSpeed = 0;
    		var leftPods = Math.ceil(Math.random() * 10) + 5;
    		var rightPods = Math.ceil(Math.random() * 10) + 5;
            var leftOrientation = this.ship.orientation.multiply([0.7071, 0, 0.7071, 0]);
            var rightOrientation = this.ship.orientation.multiply([0.7071, 0, -0.7071, 0]);
            var leftVelocity = this.ship.vectorRight.multiply(-150).add(this.ship.velocity);
            var rightVelocity = this.ship.vectorRight.multiply(150).add(this.ship.velocity);
    		this.ship.commsMessage("Mayday, mayday! Hull breach imminent, all passengers and non-essential crew to the lifepods!");
    		
    		var offset, pod, i;
    		for(i=0; i < rightPods; i++)
    			{
    			offset = new Vector3D([350, 0, (Math.random() * 2308) - 1154]);
    			pod = system.addShips("escape-capsule", 1, this.ship.position.add(offset.rotateBy(this.ship.orientation)), 0)[0];
                pod.orientation = rightOrientation;
                pod.velocity = rightVelocity;
    			}
    		
    		for(i=0; i < leftPods; i++)
    			{
    			offset = new Vector3D([-350, 0, (Math.random() * 2308) - 1154]);
    			pod = system.addShips("escape-capsule", 1, this.ship.position.add(offset.rotateBy(this.ship.orientation)), 0)[0];
                pod.orientation = leftOrientation;
                pod.velocity = leftVelocity;
    			}
    		}
    	}
    
    this.shipEnergyBecameFull = function()
    	{
    	this.shipEvacuated = false;
    	}
    
    Scripts/liners_trident.js
    "use strict"; 
    
    this.name           = "liners_trident";
    this.author         = "Thargoid";
    this.copyright      = "May 2009";
    this.description    = "Ship script for the trident missile";
    this.version        = "1.6.2";
    
    this.spawnTines = function() 
    	{ 
    	var loopCounter = 0 ; // reset the counter
    	for(loopCounter = 0; loopCounter < 9; loopCounter++)
    		{
    		var Tine = this.ship.spawnOne("liners_tridentTine");
    		this.xDistance = ((Math.random() * 40) - 20);
    		this.yDistance = ((Math.random() * 40) - 20);
    		Tine.position = this.ship.position.add([this.xDistance, this.yDistance, 0]);
    		Tine.orientation = this.ship.orientation; 
    		if(this.ship.target)
    			{
    			Tine.target = this.ship.target;
    			}
    		}
    	}