Back to Index Page generated: Dec 20, 2024, 7:22:10 AM

Expansion Liners

Content

Warnings

  1. Unknown key 'optional_oxp' at https://wiki.alioth.net/img_auth.php/7/76/Liners_v1.7.0.oxz!manifest.plist

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.7.0 1.7.0
Tags ships ships
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
Conflict Expansions
Information URL http://wiki.alioth.net/index.php/Liners n/a
Download URL https://wiki.alioth.net/img_auth.php/7/76/Liners_v1.7.0.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 1610873341

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
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;
			}
		}
	}