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

Expansion Tionisla Orbital Graveyard

Content

Warnings

  1. Information URL mismatch between OXP Manifest and Expansion Manager string length at character position 0

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Adds the Tionisla Orbital Graveyard (from the novel 'The Dark Wheel') to the Tionisla system. Adds the Tionisla Orbital Graveyard (from the novel 'The Dark Wheel') to the Tionisla system.
Identifier oolite.oxp.phkb.TionislaOrbitalGraveyard oolite.oxp.phkb.TionislaOrbitalGraveyard
Title Tionisla Orbital Graveyard Tionisla Orbital Graveyard
Category Ambience Ambience
Author Selezen, Rxke, Arexack_Heretic, Eric Walch, Captain Kev, Svengali, Disembodied, Griff, gsagostinho, phkb Selezen, Rxke, Arexack_Heretic, Eric Walch, Captain Kev, Svengali, Disembodied, Griff, gsagostinho, phkb
Version 2.7 2.7
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
Conflict Expansions
Information URL n/a
Download URL https://wiki.alioth.net/img_auth.php/a/a6/TionislaOrbitalGraveyard.oxz n/a
License CC-BY-NC-SA 3.0 CC-BY-NC-SA 3.0
File Size n/a
Upload date 1691389281

Documentation

Also read http://wiki.alioth.net/index.php/Tionisla%20Orbital%20Graveyard

readme.txt

Tionisla Orbital Graveyard

From the original OXP credits.txt file:

Created By
----------
Rik Declercq (Rxke) - plist initialisation, geography, testing, Mac coding/tweaking
Arnoud van Marion (Arexack_Heretic)	- object modelling, textures
Dave Hughes (Selezen) - geography, data files, plist coding, model conversion, PC coding

The Tionisla Orbital Graveyard was originally created by Robert Holdstock in the novella The Dark Wheel, produced in accompaniment with Elite.

The TOG development team would like to extend their thanks to all those abovementioned for creating the universe we are helping to expand, and special thanks to Giles "Aegidian" Williams for the hundred or so questions we bombarded him with during the development.

More discusion about the oxp at: http://aegidian.org/bb/viewtopic.php?t=617

-------------------------------------------------------
Extract from The Dark Wheel, Chapter 3

The best way to see the wreckplace at Tionisla is to approach it from the Sun (a reasonably safe thing to do since Tionisla, being a Democracy has few pirates in its system). Tionisla itself is a bright yellow world, and the cemetery is always between the planet and its star. As you fly close, the whole strange graveyard seems to be expanding from the circle of the world behind. 

The first thing you see is a shimmering, silver disc, a double spiral of tiny bright points. It slowly turns: it's a galaxy in miniature, with the same intense blur of light at its centre, because here is where the biggest tombs are to be found. 

Come closer and soon you can see that the stars in this galaxy are markers, great lumps of metal, heavily inscribed with the words and symbols of a thousand religions. The cemetery is a bizarre and moving sight. The markers are rarely less than a thousand feet across. There are chrome-alloy crosses, titanium 
Stars of David, duralium henges, and all the strange symbolic shapes of the worlds, and the minds and the faiths that have come to die in this Star traveller's special place. 

Tethered below this vast, rotating mausoleum is the dodecahedral shape of a 'Dodo' class space station, the home of the Cemetery Authorites. Here you go through security checks and get your visitor's visa. And as you stand in the queue, staring up through the translucent ceiling of the Customs Hall, you can see the battered, broken ships of many of the dead, still attached to the silent tomb that contains the body. 

It's a good enough reason to come to Tionisla. There are pickings aplenty among the wrecks. The treasures of centuries might be revealed by pressing the right panel on the right cube of black, alien metal as it floats silently by. 

Or maybe not treasure, just the tomb's defences... 

A pit with a laser. 

A robot guardian with knives where its hands should be. 

A hyperspace vacuum that sucks you in and throws you out into another time. 

You tread carefully among the wrecks in orbit about Tionisla. The creatures buried here - human and alien - had money enough to buy these prized resting places, and more than enough wealth to protect their property after death from the mercenary fingers of bounty hunters. 

-------------------------------------------------------
Version 2.7

TOGY Main - Changed beacon definition to be unpiloted.

Version 2.6

TOGY Main - Changed template for "togy_basic_monuments_template" to be class "CLASS_CARGO", instead of "CLASS_ROCK".
TOGY Monuments - Changed scanClass for some monuments to "CLASS_CARGO".

Version 2.5

TOGY Main - Added beacon to Graveyard Dodo station. Tweaked name generation code to reduce the size of the code base.

Version 2.4

TOGY Main - updated texture for Dodo station with adjusted colours and gloss property added. Updated other ship models with new gloss property. Added some additional special monument names.

Version 2.3

TOGY Main - Corrected some shader texture reference errors, and updated the Krait texture.

Version 2.2

TOGY Main - Added some additional special monument names.

Version 2.1

TOGY Main - added missing alpha channel to Krait model.

Version 2.0

Update by Nick Rogers (phkb)

TOGY Main: Replaced population routine to use systemWillPopulate JS function. Replaced Dodc station model with Neolite Dodec from SFEP pack. Replaced Krait Patrol ship with Griff Krait, replaced Lancet with Griff/gsagostinho Fer-de-Lance, replaced tourist ship with Griff Shuttle. Put the application of the scanner colour into shipdata rather than using shipSpawned.

All monuments will now have details of who the monument is for, accessed via a Broadcast Comms MFD message "Query monument info".

TOGY Monuments: No changes to models, changed XML-style plist files to OpenStep format, added manifest.plist file.

TOGY Shipwrecks: Created rusty models of most core ships (including Anaconda, Python, Boa and Boa Class Cruiser), plus added possibility of having normally coloured ships added as graveships, with the idea being that these are new.

Version 1.1

Update by Eric Walch, based on original files from Selezen.

There has changed a lot in Oolite since the original version of the graveyard was released. Many things that were wanted, but never possible in the original release, became possible now. Oolite can now also handle large numbers of objects better. Before Oolite 1.65, every object had to be distance checked against every other object. This requires exponentially growing numbers of calculations with increasing entities in the system. And the graveyard tripled the average number of entities in a system! But as said, this is improved with Oolite 1.65.

Then there is the problem that there exists two different "original" versions.
- One "original" contains mainly rusty adders. This one was meant as a test version only with the adders as temporarily placeholders. Unlucky enough, it was this version that was linked to from all sites and is the version that most people know as "the original".
- The real "original" only contained simple objects and only a few complex monuments for maximum performance on old hardware. On high end computers there is no real speed difference noticeable between rendering a field with only simple objects and one full with the more complex models.

To give the player a choice, the oxp is split in 3 parts. 
- TOGY_Main. This is the main module with all the scripts in it. The module only contains simple monuments for maximum performance on old hardware.
- TOGY_Monuments pack. This oxp only holds additional, complex monuments. When added together with the main oxp, it will replace part of the simple monuments by the more complex ones. Leave it uninstalled when every thing slows down while flying through the graveyard.
- TOGY_Shipwreck pack. This oxp holds only rusty ships. It does the same as the Monument pack, but now replacing the simple monuments by rusty ships. Add this pack when you like the wrecks, but be aware that the rusty ships were never intended to be in a release version. Putting it in a separate pack is a bit of a compromise.

Be aware that this oxp adds over 200 extra objects in the Tionisla system. This has an effect on the FPS rate when flying in the Tionisla system. However on fast computers this FPS drop will not be noticeable to the player. Any speed difference between the packs will not be noticeable when the player is not near the monuments, as they are only drawn when the player is within the draw distance. For any speed effect between the installed packs you must approach the graveyard. When you are not in the Tionisla system, this oxp has no performance hit at all.

Changes in v 1.1
- At regular intervals there are tourist shuttle launches from the main station.
- Broadcasts of ships are no longer silenced by the many objects, but always reach the player.
- Removed all the rusty adders and put them together with new rusts in a separate pack.
- Changed the colour of the monuments on the scanner from white to a more appropriate colour for a graveyard.
- Updated all AI files.
- Added a 1.75 ship-key that makes that killing a monument no longer count as a kill. (No longer boosting your score by q-bombing the graveyard on Oolite 1.75+)
- Added several ship scripts for better fine-tuning all kind of behavior.

License
-------
This OXP is released under the Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/

Thanks to Svengali and Disembodied for their PhraseGen tool.

Infinity image from https://commons.wikimedia.org/wiki/File:Infinity_in_circle.svg, public domain.
Omega image from https://commons.wikimedia.org/wiki/File:Code2000_Greek_omega.svg, licensed under Creative Commons Attribution-Share Alike 3.0 Unported.
Ankh image from https://en.wikipedia.org/wiki/File:Ankh.svg, licensed under Creative Commons Attribution-Share Alike 3.0 Unported.

Equipment

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

Ships

Name
togy_basic_monuments_template
Tomb casket
Tomb casket
Tomb casket
Graveyard Beacon
togy_griff_dock
togy_griff_dodo_flashers
Fer-de-Lance Interceptor
Fer-de-Lance Interceptor
Krait Patrol
Tourist Ship
Tomb casket
Graveyard Stone
Graveyard Stone
Graveyard Stone
Tionisla Orbital Graveyard
Tomb casket

Models

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

Scripts

Path
Scripts/togy_dodo.js
"use strict";
this.name      = "togy_dodo"; 
this.author    = "eric walch"; 
this.copyright = "2010 the authors.";
this.description = "togy_dodo script";

this.dockedPatrols = 0;
this.dockedTourists = 5;

this.shipSpawned = function () {
    // look for any nearby cargo after spawning.
    // ships within 2000 meter in front of the docking area block launches.
    // The dock is positioned at 392 meter from the station center, so ships must stay
    // at 2400 meter from the station. This sometimes happens, so remove them.
    // Moving ships are no problem as they are suposed to fly away themselves.
    var problem = system.entitiesWithScanClass("CLASS_CARGO", this.ship, 2.4E3);
    for (var i=0; i< problem.length; i++) {
        problem[i].remove();
    }
    var problem = system.entitiesWithScanClass("CLASS_ROCK", this.ship, 2.4E3);
    for (var i=0; i< problem.length; i++) {
        problem[i].remove();
    }
}

this.otherShipDocked = function (ship) {
    if (ship.primaryRole == "togy-patrol") this.dockedPatrols++;
    else if (ship.primaryRole == "togy_tourist") this.dockedTourists++;
    if (!this.launchTimer || this.launchTimer.isRunning === false) this.launchTimer = new Timer(this, this.launchPatrol, 30 + 120 * Math.random());
}

this.launchPatrol = function launchPatrol() { // is triggered by any docking ship.
    if (this.dockedPatrols > 0) {
        this.dockedPatrols--;
        this.ship.launchShipWithRole("togy-patrol");
        // patrols add themselves to the station group.
    }
    else if (this.dockedTourists > 0) {
        this.dockedTourists--;
        var tourist = this.ship.launchShipWithRole("togy_tourist");
        // add tourist to group to be able to call help from group when attacked.
        this.ship.group.addShip(tourist);
        tourist.group = this.ship.group;
    }

    if (this.dockedPatrols > 0) {
        this.launchTimer = new Timer(this, this.launchPatrol, 30 + 120 * Math.random());
    } else {
        delete this.launchTimer;
    }
}

this.shipDied = function (killer, why) {
    if (why && why == "cascade weapon") {
        if (killer.isPlayer) killer.setBounty(killer.bounty + 10E3, "togy_cascade_weapon"); // takes the player quite a while to become clean again. Might give valuable npc ships!
    }
    if (this.launchTimer) {
        this.launchTimer.stop();
        delete this.launchTimer;
    }
}
Scripts/togy_main.js
"use strict";
this.name        = "TOGY_Main";
this.author      = "phkb";
this.copyright   = "2017 phkb";
this.description = "Controls the creation of the TOGY station and ships.";
this.licence     = "CC BY-NC-SA 3.0";

this._debug = false;
this._msgCount = 0;
this._predefinedNames = [
	{name:"Robert Holdstock",born:"1948-08-02",died:"2009-11-29"},
	{name:"Steve Jobs",born:"1955-02-24",died:"2011-10-05"},
	{name:"Terry Pratchett",born:"1948-04-28",died:"2015-03-12"},
	{name:"Isaac Asimov",born:"1920-01-02",died:"1992-04-06"},
	{name:"Arthur C. Clarke",born:"1917-12-16",died:"2008-03-19"},
	{name:"Philip P. Dick",born:"1928-12-16",died:"1982-03-02"},
	{name:"Ray Bradbury",born:"1920-08-22",died:"2012-06-05"},
	{name:"Frank Herbert",born:"1920-10-08",died:"1986-02-11"},
	{name:"George Orwell",born:"1903-06-25",died:"1950-01-21"},
	{name:"Jules Verne",born:"1828-02-08",died:"1905-03-24"},
	{name:"Robert Heinlein",born:"1907-07-07",died:"1988-05-08"},
	{name:"H. G. Wells",born:"1866-09-21",died:"1946-08-13"},
	{name:"Carrie Fisher",born:"1956-10-21",died:"2016-12-27"},
	{name:"J. R. R. Tolkien",born:"1892-01-03",died:"1973-09-02"},
	{name:"Douglas Adams",born:"1952-03-11",died:"2001-05-11"},
	{name:"Albert Einstein",born:"1879-03-14",died:"1955-04-18"},
	{name:"Nikola Tesla",born:"1856-07-10",died:"1943-01-07"},
	{name:"Thomas Edison",born:"1847-02-11",died:"1931-10-18"},
	{name:"Alexander Graham Bell",born:"1847-03-03",died:"1922-08-02"},
	{name:"Leonardo da Vinci",born:"1452-04-15",died:"1519-05-02"},
	{name:"Johannes Kepler",born:"1571-12-27",died:"1630-11-15"},
	{name:"Carl Sagan",born:"1934-11-09",died:"1996-12-20"},
	{name:"Edwin Hubble",born:"1889-11-20",died:"1953-09-28"},
	{name:"Ursula K Le Guin",born:"1929-10-21",died:"2018-01-22"},
	{name:"Galileo Galilei",born:"1564-02-15",died:"1642-01-08"},
	{name:"Nicolaus Copernicus",born:"1473-02-19",died:"1543-05-24"},
	{name:"Stephen Hawking",born:"1942-01-08",died:"2018-03-14"},
	{name:"Marie Curie",born:"1867-11-07",died:"1934-07-04"},
	{name:"Alfred Nobel",born:"1833-10-21",died:"1896-12-10"},
	{name:"Mary Winston Jackson",born:"1921-04-09",died:"2005-02-11"},
	{name:"Marie M. Daly",born:"1921-04-16",died:"2003-10-28"},
	{name:"Virgil Ivan 'Gus' Grissom",born:"1926-04-03",died:"1967-01-27"},
	{name:"Edward Higgins White II",born:"1930-11-14",died:"1967-01-27"},
	{name:"Roger Bruce Chaffee",born:"1935-02-15",died:"1967-01-27"},
	{name:"Michael John Smith",born:"1945-04-30",died:"1986-01-28"},
	{name:"Francis Richard Scobee",born:"1939-05-19",died:"1986-01-28"},
	{name:"Ronald Erwin McNair",born:"1950-10-21",died:"1986-01-28"},
	{name:"Edison Shoji Onizuka",born:"1946-06-24",died:"1986-01-28"},
	{name:"Sharon Christa McAuliffe",born:"1948-09-02",died:"1986-01-28"},
	{name:"Gregory Bruce Jarvis",born:"1944-08-24",died:"1986-01-28"},
	{name:"Judith Arlene Resnik",born:"1949-04-05",died:"1986-01-28"},
	{name:"Theodore C. Freeman",born:"1930-02-18",died:"1964-10-31"},
	{name:"Charles A. Bassett II",born:"1931-12-30",died:"1966-02-28"},
	{name:"Elliot M. See, Jr",born:"1927-07-23",died:"1966-02-28"},
	{name:"Edward G. Givens",born:"1930-01-05",died:"1967-06-06"},
	{name:"Clifton C. Williams, Jr",born:"1932-09-26",died:"1967-10-05"},
	{name:"Michael James Adams",born:"1930-05-30",died:"1967-11-15"},
	{name:"Robert Henry Lawrence",born:"1935-10-02",died:"1967-12-08"},
	{name:"Michael P. Anderson",born:"1959-12-25",died:"2003-02-01"},
	{name:"David M. Brown",born:"1956-04-16",died:"2003-02-01"},
	{name:"Kalpana Chawla",born:"1962-03-17",died:"2003-02-01"},
	{name:"Laurel Blair Salton Clark",born:"1961-03-10",died:"2003-02-01"},
	{name:"Rick Douglas Husband",born:"1957-07-12",died:"2003-02-01"},
	{name:"William C. McCool",born:"1961-09-23",died:"2003-02-01"},
	{name:"Ilan Ramon",born:"1954-07-20",died:"2003-02-01"},
	{name:"Vladimir Mikhaylovich Komarov",born:"1927-03-16",died:"1967-04-24"},
	{name:"Georgiy Timofeyevich Dobrovolsky",born:"1928-06-01",died:"1971-06-30"},
	{name:"Viktor Ivanovich Patsayev",born:"1933-06-19",died:"1971-06-30"},
	{name:"Vladislav Nikolayevich Volkov",born:"1935-11-23",died:"1971-06-30"},
	{name:"Yuri Alekseyevich Gagarin",born:"1934-03-09",died:"1968-03-27"},
	{name:"Vladimir Sergeyevich Seryogin",born:"1922-07-07",died:"1968-03-27"},
	{name:"Valentin Vasiliyevich Bondarenko",born:"1937-02-16",died:"1961-03-23"},
	{name:"Sergei Yuriyevich Vozovikov",born:"1958-04-17",died:"1993-07-11"},
	{name:"Rosalind Elsie Franklin",born:"1920-07-25",died:"1958-04-16"},
	{name:"Frederick William Herschel",born:"1738-11-15",died:"1822-08-25"},
	{name:"Andre-Marie Ampere",born:"1775-01-20",died:"1836-06-10"},
	{name:"Francis Bacon",born:"1561-01-02",died:"1626-04-09"},
	{name:"Daniel Bernoulli",born:"1700-02-08",died:"1782-03-17"},
	{name:"Niels Bohr",born:"1885-10-07",died:"1962-11-18"},
	{name:"Satyendra Nath Bose",born:"1894-01-01",died:"1974-02-04"},
	{name:"Tycho Brahe",born:"1546-12-12",died:"1601-10-24"},
	{name:"Subrahmanyan Chandrasekhar",born:"1910-10-19",died:"1995-08-21"},
	{name:"Michael Faraday",born:"1791-09-22",died:"1867-08-25"},
	{name:"Carl Friedrich Gauss",born:"1777-04-30",died:"1855-02-23"},
	{name:"Joseph Henry",born:"1797-12-17",died:"1878-05-13"},
	{name:"Heinrich Rudolf Hertz",born:"1857-02-22",died:"1894-01-01"},
	{name:"David Hilbert",born:"1862-01-23",died:"1943-02-14"},
	{name:"Grace Murray Hopper",born:"1906-12-09",died:"1992-01-01"},
	{name:"Stephanie Louise Kwolek",born:"1923-07-31",died:"2014-06-14"},
	{name:"Ada Lovelace",born:"1815-12-10",died:"1852-11-27"},
	{name:"Lise Meitner",born:"1878-11-07",died:"1968-10-27"},
	{name:"Amalie Emmy Noether",born:"1882-03-23",died:"1935-04-14"},
	{name:"Hans Christian Oersted",born:"1777-08-14",died:"1851-03-09"},
	{name:"Max Planck",born:"1858-04-23",died:"1947-10-04"},
	{name:"Ernest Rutherford",born:"1871-08-30",died:"1937-10-19"},
	{name:"Eugene Merle Shoemaker",born:"1928-04-28",died:"1997-07-18"},
	{name:"Joseph John Thomson",born:"1856-12-18",died:"1940-08-30"},
	{name:"Alessandro Volta",born:"1745-02-18",died:"1827-03-05"},
	{name:"James Watt",born:"1736-01-30",died:"1819-08-25"}
];

// we'll set the position of the station from these co-ords, and then make everything else relative to it
// just in case a decision is made to change the position of the graveyard later
this._pos = {x:0, y:-3000, z:210600};

//-------------------------------------------------------------------------------------------------------------
this.startUpComplete = function() {
    if (worldScripts.BountySystem_Core) {
        var bsc = worldScripts.BountySystem_Core;
        bsc._offenceTypes["togy_cascade_weapon"] = {
            description: "Deliberate detonation of a cascade weapon near the gravesite.",
		    severity: 3
        };
	}
}

//-------------------------------------------------------------------------------------------------------------
this.systemWillPopulate = function() {
    if (((galaxyNumber === 0 && system.ID === 124) || this._debug === true) && system.countShipsWithRole("togy_station") === 0) {
		var posTOGY = Vector3D(this._pos.x, this._pos.y, this._pos.z).fromCoordinateSystem("psm");
		system.setPopulator("togy-station", {
			callback: function(pos) {
				var sr = 1000;
				var tm = worldScripts.TOGY_Main;
				var stn = system.addShips("togy_station", 1, pos, 1)[0];
				// point station at planet for consistency
				stn.orientation = system.mainPlanet.position.subtract(stn.position).direction().rotationTo([0,0,1]);

				var x = tm._pos.x;
				var y = tm._pos.y;
				var z = tm._pos.z;
				system.addShips("togy-patrol", 4, Vector3D(x, y + 2000, z).fromCoordinateSystem("psm"), sr);
				system.addShips("togy-defence", 2, Vector3D(x, y + 2000, z).fromCoordinateSystem("psm"), sr);
				system.addShips("togy_grave_beacon", 1, Vector3D(x - 3400, y + 3000, z - 5800).fromCoordinateSystem("psm"), sr);
				system.addShips("togy_grave_beacon", 1, Vector3D(x + 3400, y + 3000, z - 5800).fromCoordinateSystem("psm"), sr);
				system.addShips("togy_grave_beacon", 1, Vector3D(x - 6600, y + 3000, z).fromCoordinateSystem("psm"), sr);
				system.addShips("togy_grave_beacon", 1, Vector3D(x + 6600, y + 3000, z).fromCoordinateSystem("psm"), sr);
				system.addShips("togy_grave_beacon", 1, Vector3D(x - 3400, y + 3000, z + 5600).fromCoordinateSystem("psm"), sr);
				system.addShips("togy_grave_beacon", 1, Vector3D(x + 3400, y + 3000, z + 5600).fromCoordinateSystem("psm"), sr);
				tm.$addInfoToGrave(system.addShips("grave_monument", 1, Vector3D(x, y + 3000, z).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x, y + 3000, z - 700).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x - 400, y + 3000, z - 400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x + 380, y + 3000, z - 400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x - 400, y + 3000, z - 3600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x + 160, y + 3000, z - 3600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x - 760, y + 3000, z).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x + 760, y + 3000, z).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x - 400, y + 3000, z + 400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x + 400, y + 3000, z + 400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 5, Vector3D(x, y + 3000, z + 700).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 400, y + 3000, z - 3600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 160, y + 3000, z - 3600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 800, y + 3000, z - 3400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1200, y + 3000, z - 3000).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x, y + 3000, z + 2600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1360, y + 3000, z - 2400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1160, y + 3000, z - 2000).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1380, y + 3000, z - 1800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 200, y + 3000, z - 1700).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 760, y + 3000, z - 1660).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 2400, y + 3000, z - 1400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1800, y + 3000, z - 1400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 3000, y + 3000, z - 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1200, y + 3000, z - 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 380, y + 3000, z - 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 340, y + 3000, z - 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1200, y + 3000, z - 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 2000, y + 3000, z - 1040).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 3400, y + 3000, z - 800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 800, y + 3000, z - 800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 800, y + 3000, z - 800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1620, y + 3000, z + 1250).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 3600, y + 3000, z - 400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1200, y + 3000, z - 380).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1200, y + 3000, z - 360).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 3600, y + 3000, z - 200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1740, y + 3000, z + 1600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 3600, y + 3000, z + 120).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1640, y + 3000, z + 200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1200, y + 3000, z + 300).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1200, y + 3000, z + 360).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 3600, y + 3000, z + 400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1620, y + 3000, z + 700).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 800, y + 3000, z + 800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 800, y + 3000, z + 800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 3400, y + 3000, z + 800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 2000, y + 3000, z + 1100).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1200, y + 3000, z + 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 300, y + 3000, z + 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 340, y + 3000, z + 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1200, y + 3000, z + 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 3000, y + 3000, z + 1200).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1800, y + 3000, z + 1400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 2400, y + 3000, z + 1400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 640, y + 3000, z + 1600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 200, y + 3000, z + 1680).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1400, y + 3000, z + 1800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 1100, y + 3000, z + 2000).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1400, y + 3000, z + 2400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 1200, y + 3000, z + 2800).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 800, y + 3000, z + 3400).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x - 200, y + 3000, z + 3600).fromCoordinateSystem("psm"), sr));
				tm.$addInfoToGrave(system.addShips("grave_monument", 3, Vector3D(x + 400, y + 3000, z + 3600).fromCoordinateSystem("psm"), sr));
			},
			location:"COORDINATES",
			coordinates:posTOGY,
			deterministic:true
		});
	}
}

//-------------------------------------------------------------------------------------------------------------
this.$addInfoToGrave = function(ships) {
	if (!ships || ships.length === 0) return;
	var bcc = worldScripts.BroadcastCommsMFD;
	if (!bcc) return;
	var tm = worldScripts.TOGY_Main;
	for (var i = 0; i < ships.length; i++) {
		if (Math.random() > 0.5 && tm._predefinedNames.length > 0) {
			// get the first element in the array, and remove it
			var item = tm._predefinedNames.shift();
			var nm = item.name;
			var born = new Date(Date.parse(item.born));
			var died = new Date(Date.parse(item.died));
		} else {
			// just generate a random name
			var end = Math.floor(Math.random() * 750 + 20); // how long ago did they die?
			// if this is a newer type ship, move the death date to be a bit closer to now
			if (ships[i].hasRole("togy_newship") === true) end = Math.floor(Math.random() * 20 + 20);
			var age = Math.floor(Math.random() * 70 + 20); // how old were they?
			// calc a date of death
			var died = new Date(3142 - end, Math.floor(Math.random() * 12), Math.floor(Math.random() * 27 + 1));
			// calc a birth date
			var born = new Date(died.getFullYear() - age, Math.floor(Math.random() * 12), Math.floor(Math.random() * 27 + 1));
			var nm = expandDescription("%N ") + expandDescription("[nom]");
		}
		ships[i].script._togy_info = expandDescription("[togy_memorial]", 
			{name:nm, born:tm.$getShortDate(born), died:tm.$getShortDate(died)}
		);
		// add a reply option
		tm._msgCount += 1;
		bcc.$createMessage({
			messageName:"togy_transmit_reply_" + tm._msgCount, 
			displayText:"[Query monument info]", 
			messageText:"",
			ship:ships[i],
			transmissionType:"target", 
			callbackFunction:tm.$transmitMonumentInfo,
			deleteOnTransmit:false, 
			delayCallback:1, 
			hideOnConditionRed:false}
		);
	}
}

//-------------------------------------------------------------------------------------------------------------
this.$transmitMonumentInfo = function() {
	var t = player.ship.target;
	if (!t || !t.script || t.script.hasOwnProperty("_togy_info") === false) return;
    t.commsMessage(t.script._togy_info, player.ship);
}

//-------------------------------------------------------------------------------------------------------------
this.$getShortDate = function(date) {
	return date.getDate() + " " + this.$monthName(date.getMonth()) + " " + date.getFullYear();
}

//-------------------------------------------------------------------------------------------------------------
this.$monthName = function(month) {
	switch (month) {
		case 0: return "Jan";
		case 1: return "Feb";
		case 2: return "Mar";
		case 3: return "Apr";
		case 4: return "May";
		case 5: return "Jun";
		case 6: return "Jul";
		case 7: return "Aug";
		case 8: return "Sep";
		case 9: return "Oct";
		case 10: return "Nov";
		case 11: return "Dec";
	}
}
Scripts/togy_monument.js
"use strict";
this.name      = "togy_monument"; 
this.author    = "eric walch"; 
this.copyright = "2010 the authors.";
this.description = "script for monuments";

/*
    The AI sends a distress message when attacked. But when the patrol ships are not very near they will miss it because the distress message only goes to the 16 nearest opjects.
    Same is true for commsMessages. Those are only send to the 16 nearest ships. The AI can send a "sendTargetCommsMessage", but it needs a pilot to do that
    Therefor we add deliberate checks that are send directly to the station.
    With 1.75 things might have changed in a way that the player always will receive the plain commsMessage when in range.
*/
this.shipBeingAttacked = function (attacker) {
   if (!this.canReact()) return;
   var station = system.shipsWithPrimaryRole("togy_station", this.ship, this.ship.scannerRange)[0];
   if (!station || (attacker.group && attacker.group == station.group)) return;
   station.target = attacker;
   station.launchDefenseShip();
   station.reactToAIMessage("GRAVEYARD_ATTACKED");
   attacker.bounty += 10;
}

this.shipCollided = function (collider)
{
    if (!this.canReact()) return;
    if (collider && (collider.scanClass == "CLASS_CARGO" || collider.scanClass == "CLASS_ROCK")) return;
    var station = system.shipsWithPrimaryRole("togy_station", this.ship, this.ship.scannerRange)[0];
    if (!station || (collider.group && collider.group == station.group)) return;
    station.target = collider;
    station.reactToAIMessage("GRAVEYARD_DISTURBED");
    if (Math.random() < 0.1) { // don't always attack
       station.launchDefenseShip();
    }
}

this.shipAttackedWithMissile = function (missile, missileOwner) {
   if (!this.canReact()) return;
   var station = system.shipsWithPrimaryRole("togy_station", this.ship, this.ship.scannerRange)[0];
   if (!station || (missileOwner.group && missileOwner.group == station.group)) return;
   station.target = missileOwner;
   station.launchDefenseShip();
   station.reactToAIMessage("GRAVEYARD_ATTACKED");
   missileOwner.bounty += 10;
}

this.canReact = function () {
    if (this.lastMessageTime && this.lastMessageTime + 60 > clock.absoluteSeconds) return false; // don't react to often.
    this.lastMessageTime = clock.absoluteSeconds;
    return true;
}
Scripts/togy_patrol.js
"use strict";
this.name      = "togy-patrol"; 
this.author    = "eric walch"; 
this.copyright = "2010 the authors.";
this.description = "togy-patrol script";

/*
The player will not hear the distress call because only ships with pilots
can send commsMessages and since about Oolite 1.71 stuff of class_cargo
has no pilots as default.
Also are the commsMessages are only send to 16 ships. Starting with 1.75 commsMessages
always wil go to the player.
*/
this.shipSpawned = function () {
    var station = system.shipsWithPrimaryRole("togy_station")[0];
    station.group.addShip(this.ship); // make self part of the station group
    this.ship.group = station.group; // we are one group now.
}

this.shipBeingAttacked = function (attacker) {
    var station = this.ship.group.leader;
    if (attacker.group && attacker.group == station.group) return;
    station.target = attacker;
    if (station.dockedDefenders > 0) station.launchDefenseShip();
    station.reactToAIMessage("GRAVEYARD_DISTURBED");
}

this.distressMessageReceived = function (aggressor, victim) {
    if (aggressor && victim) this.ship.commsMessage("Hey, " + aggressor.displayName + ", stay away from the " + victim.displayName);
}