Back to Index Page generated: May 8, 2024, 6:16:03 AM

Expansion Explorers' Club

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Keeps a record of all the systems you visit and gives you an explorer rank. Lets you view your exploration achievements and provides a special Explorers’ Club long-range navigation chart. Keeps a record of all the systems you visit and gives you an explorer rank. Lets you view your exploration achievements and provides a special Explorers’ Club long-range navigation chart.
Identifier oolite.oxp.CaptMurphy.ExplorersClub oolite.oxp.CaptMurphy.ExplorersClub
Title Explorers' Club Explorers' Club
Category Activities Activities
Author Capt. Murphy & Wildeblood Capt. Murphy & Wildeblood
Version 1.4.6 1.4.6
Tags charts charts
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
Conflict Expansions
Information URL http://wiki.alioth.net/index.php/Explorers%27_Club_OXP n/a
Download URL https://wiki.alioth.net/img_auth.php/5/55/Explorers_Club_1.4.4.oxz Explorers_Club_1.4.4.oxz
License CC-BY-NC-SA 3.0 CC-BY-NC-SA 3.0
File Size n/a
Upload date 1706939844

Documentation

Also read http://wiki.alioth.net/index.php/Explorers'%20Club

New readme.rtf

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057\deflangfe2057{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\froman\fprq2\fcharset2 Symbol;}}
{\colortbl ;\red0\green0\blue255;}
{\*\generator Riched20 6.3.9600}\viewkind4\uc1 
\pard\nowidctlpar\f0\fs20 Explorers\rquote  Club OXP  ver. 1.4.4\par
Last updated on 19th August, 2014\par
\par
Code by Capt Murphy, 2011-2012, & Wildeblood, 2013-2014\par

\pard Licence: CC BY-NC-SA 3.0 : Please visit {{\field{\*\fldinst{HYPERLINK http://creativecommons.org/licenses/by-nc-sa/3.0/ }}{\fldrslt{http://creativecommons.org/licenses/by-nc-sa/3.0/\ul0\cf0}}}}\f0\fs20  for more info.\par
Requires Oolite 1.80\par
\par
Overview: \par
\par
Once installed this OXP keeps track of unique systems visited and reports on the manifest screen (F5, F5) the total systems visited out of 256 in the current chart and the total systems visited out of 2048 in the whole Ooniverse. It also displays an Explorer \lquote rank\rquote . You need to visit all 2048 systems to be ranked an Elite Explorer.\par
\par
In addition this OXP adds some functionality to the Long Range Chart (F6, F6) in that it can be set to different modes. To access the options go to the Interfaces screen (F4) when docked. The available options are:\par
\par

\pard\nowidctlpar\fi-360\li720\tx720 1)\tab Default - standard long range chart behaviour.\par

\pard\nowidctlpar\fi-360\li720 2)\tab Long range chart shows animation of systems visited to date, in order of first visit.\par
3)\tab Long range chart marks unvisited systems.\par

\pard\nowidctlpar\par
The options screen also allows you to choose when a system is recorded as visited. The options are.\par
\par

\pard\nowidctlpar\fi-360\li720\tx720 1)\tab Default \endash  when docked at the main station.\par

\pard\nowidctlpar\fi-360\li720 2)\tab Immediately on arrival from witch-space.\par
3)\tab When reaching the planet's surface.\par

\pard\nowidctlpar\par
Options are persistent between sessions with the same saved game.\par
\par
The options screen also gives access to two further sets of mission screens.\par
\par

\pard\nowidctlpar\fi-360\li720\tx720 1)\tab Displays a list of the system names that have been visited so far in the current Galaxy, followed by a list of the system names that are yet to be visited in the current galaxy.\par

\pard\nowidctlpar\fi-360\li720 2)\tab Displays a list of mile-stones that the player has completed, or not completed, so far. Defined mile-stones are:\par

\pard\nowidctlpar\li360\par

\pard\nowidctlpar\fi-360\li1440\tx1440\f1\'b7\tab\f0 Visited all of the \lquote Old Worlds\rquote  in galaxy 1.\par

\pard\nowidctlpar\fi-360\li1440\f1\'b7\tab\f0 Visited all of the \lquote Famous Planets\rquote  in galaxy 1 (as per OXP of same name).\par
\f1\'b7\tab\f0 Visited all of the \lquote Famous Planets\rquote  in galaxy 2 (as per OXP of same name).\par
\f1\'b7\tab\f0 Visited the \lquote Prodigal Suns\rquote  in galaxy 3.\par
\f1\'b7\tab\f0 Visited the \lquote Lost Worlds\rquote  in galaxy 6.\par
\f1\'b7\tab\f0 Visited the systems beyond the \lquote Great Rift\rquote  in galaxy 7.\par
\f1\'b7\tab\f0 Visited Oresrati in galaxy 8.\par
\f1\'b7\tab\f0 Visited all 8 galaxies at least once.\par

\pard\nowidctlpar\par
The experimental feature to keep a photographic record of systems visited, only usable with development versions of Oolite, has been removed from this version of the OXP.\par
\par
Change Log:\par
\par
Version 1.4.4 (19/8/2014) Can now leave mission screens at any time, and fixed harmless bug introduced in 1.4.3. \par
\par
Version 1.4.3 (5/8/2014) Counter now displayed on interface summary, jumping into a nova system is now always logged immediately, and fine-tuned the change made in 1.4.2. \par
\par
Version 1.4.2 (27/7/2014) Code updated for Oolite 1.80: bug-fix for loading games saved at stations other than GalCop main.\par
\par
Version 1.4.1 (21/10/2013) System data screen tweaked, micro-tweak to API functions, last text string moved to missiontext.plist file.\par
\par
Version 1.4 (9/6/2013) Based on version 1.3.3, updated by Wildeblood. Code updated for Oolite 1.77, station interface added, photographic record feature removed, nearly all text strings moved to missiontext.plist file, new option for recording visit added, API functions added.\par
\par
\par
}

Old readme.rtf

{\rtf1\ansi\ansicpg1252\deff0\deflang2057\deflangfe2057{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\froman\fprq2\fcharset2 Symbol;}}
{\colortbl ;\red0\green0\blue255;}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\nowidctlpar\f0\fs20 Explorers\rquote  Club OXP v1.3.3 (30/06/12)\par
Inspired by Wildeblood, code by capt murphy - 2011,2012\par
\pard Licence: CC BY-NC-SA 3.0 : Please visit {\field{\*\fldinst{HYPERLINK "http://creativecommons.org/licenses/by-nc-sa/3.0/"}}{\fldrslt{\ul\cf1 http://creativecommons.org/licenses/by-nc-sa/3.0/}}}\f0\fs20  for more info.\par
Requires Oolite 1.76.1\par
\par
Overview: \par
\par
Once installed this OXP keeps track of unique systems visited and reports on the manifest screen (F5) the total systems visited in the current galaxy out of 256 and the total systems visited out of 2048 in the whole Ooniverse. It also displays an Explorer \lquote rank\rquote . You need to visit all 2048 systems to be ranked an Elite Explorer.\par
\par
In addition this OXP adds some functionality to the Long Range Chart (F6/F6) in that it can be set to different modes. To access the options screen press F2, then F6 when docked. The available options are:\par
\par
\pard\nowidctlpar\fi-360\li720\tx720 1)\tab Default - standard long range chart behaviour.\par
\pard\nowidctlpar\fi-360\li720 2)\tab Long range chart shows animation of systems visited to date, in order of first visit.\par
3)\tab Long range chart marks unvisited systems.\par
4)\tab Player can manually mark systems on long range chart as a destination (highlight a system with the cursor and press F7)\par
5)\tab Player can manually unmark systems on long range chart as a destination (highlight a system with the cursor and press F7)\par
\pard\nowidctlpar\par
Players should exercise caution when using the 2\super nd\nosupersub  and 3rd options as it will clear any currently marked systems (e.g mission or contract destinations), although the 4\super th\nosupersub  option can be used to manually reinstate them.\par
\par
The options screen also allows you to choose when a system is recorded as visited. The options are.\par
\par
\pard\nowidctlpar\fi-360\li720\tx720 1)\tab Default \endash  when docked at the main station.\par
\pard\nowidctlpar\fi-360\li720 2)\tab On arrival from witch-space.\par
\pard\nowidctlpar\par
Options are persistent between sessions with the same save game.\par
\par
The options screen also gives access to two further sets of mission screens.\par
\par
\pard\nowidctlpar\fi-360\li720\tx720 1)\tab Displays a list of the system names that have been visited so far in the current Galaxy, followed by a list of the system names that are yet to be visited in the current galaxy.\par
\pard\nowidctlpar\fi-360\li720 2)\tab Displays a list of mile-stones that the player has completed / not completed so far. Defined mile-stones are:\par
\pard\nowidctlpar\li360\par
\pard\nowidctlpar\fi-360\li1440\tx1440\f1\'b7\tab\f0 Visited all of the \lquote Old Worlds\rquote  in galaxy 1.\par
\pard\nowidctlpar\fi-360\li1440\f1\'b7\tab\f0 Visited all of the \lquote Famous Planets\rquote  in galaxy 1 (as per OXP of same name).\par
\f1\'b7\tab\f0 Visited all of the \lquote Famous Planets\rquote  in galaxy 2 (as per OXP of same name).\par
\f1\'b7\tab\f0 Visited the \lquote Prodigal Suns\rquote  in galaxy 3.\par
\f1\'b7\tab\f0 Visited the \lquote Lost Worlds\rquote  in galaxy 6.\par
\f1\'b7\tab\f0 Visited the systems beyond the \lquote Great Rift\rquote  in galaxy 7.\par
\f1\'b7\tab\f0 Visited Oresrati in galaxy 8.\par
\f1\'b7\tab\f0 Visited all 8 galaxies at least once.\par
\pard\nowidctlpar\par
The options screen also allows you to enable/disable an experimental feature to keep a photographic record of systems visited. This is disabled by default.\par
\par
If enabled the behaviour will depend on which option is set for recording a visit. If a visit is recorded on arrival from witch-space a screenshot will be automatically saved on exiting witch-space. If a visit is recorded on docking with the main station, at the next launch the player will be briefly \lquote teleported\rquote  to a good vantage point and a screenshot will be automatically saved before the player is teleported back to the launch point.\par
\par
Change Log:\par
\par
Version 1.0: 23/11/11 - Initial release.\par
\par
Version 1.1: 24/11/11 \endash  Fixed dodgy condition checks for the \lquote rank\rquote  string. Incorporated a number of code tweaks for efficiency suggested by Svengali.\par
\par
Version 1.2.1: 1/12/11\par
\par
Added functionality to view long range chart with unvisited systems marked, to view list of system names visited and unvisited in current galaxy, and to view list of mile-stones.\par
All missionScreens now managed via missionScreenOpportunity. \par
Long range chart mark visited systems animation will now complete in a maximum of 32 seconds (if all 256 systems have been visited).\par
Script now uses strict mode. \par
Added code to disable OXP entirely if player is in a galaxy outside of the range 1 to 8. \par
Added code to disable mile-stones feature if player is using a non-standard galaxy_seed.\par
\par
Version 1.3.1: 21/01/12\par
\par
Made compatible with Save Anywhere OXP.\par
Amended start-up behaviour for 1.76.\par
Removed use of forEach method for array iteration.\par
Message appended to system description on F7 screen to indicate whether system has been visited or not.\par
Added background image to missionScreens,\par
Added experimental photographic record of visited systems feature (thanks to Wildeblood for the snapshot HUD and some script suggestions, and thanks to the Honourable Guild of Test-Pilots for their valuable testing services).\par
\par
Version 1.3.2 and 1.3.2oxpC: 5/03/12\par
\par
Fixed minor bug in oxpC version that caused setting not to be saved in some circumstances.\par
Changed timing of record visit on witch space exit from this.shipWillExitWitchSpace to this.shipExitedWitchSpace - for compatibility with as yet unreleased long range jump OXPs.\par
Fixed mechanism of failsafe which prevents freeze should a JS timeout occur. \par
\par
Version 1.3.3 and 1.3.3oxpC: 30/06/12\par
\par
Fixed timer clean up mechanism to avoid unrooted timer errors when flicking rapidly to and from the long range chart.\par
\par
}

Equipment

This expansion declares no equipment.

Ships

This expansion declares no ships.

Models

This expansion declares no models.

Scripts

Path
Config/script.js
/* ========================================================
			EXPLORERS' CLUB OXP

Created by Karl Smith ("Wildeblood"), June, 2013.
Based on an earlier work of the same name:- 

author:      "Capt. Murphy"
copyright:   2011, 2012 Steve Murphy
licence:     "CC BY-NC-SA 3.0"
description: Worldscript to record unique systems visited.

Reviewed January, 2024, using Oolite 1.91. 
It hasn't broken yet, despite all the changes to Oolite. 
We must have done something right.
=========================================================== */

this.name    = "Explorers Club"; 
this.version = "1.4.6";

/* ========================================================
			FUNCTIONS TO RECORD VISITS

 Check to see if new system has already been visited,
 and if not, add it to the record array.
=========================================================== */

    this._recordVisit = function () {
        "use strict";
        if (this.$xc_record[galaxyNumber].indexOf(system.ID) === -1) {
            this.$xc_record[galaxyNumber].push(system.ID);
            return true;
        } else {
            return false;
        }
    }

    // Visiting option 1, default mode.

    this.shipWillDockWithStation = function (station) {
        "use strict";
        if (this.$xc_visitOption === 1 &&
            station.isMainStation) {
            this._recordVisit();
        }
    }

    // Visiting option 2, easy mode.

    this.shipExitedWitchspace = function () {
        "use strict";
        if (system.isInterstellarSpace) {
            return;
        }
        if (this.$xc_visitOption === 2) {
            this._recordVisit();
            return;
        }
        if (system.sun.hasGoneNova) {
            if (this._recordVisit()) {
                player.commsMessage(expandMissionText("explorers_club_visit_logged"));
            }
        }
    }

    // Visiting option 3, expert mode.

    this.shipApproachingPlanetSurface = function (planet) {
        "use strict";
        if (this.$xc_visitOption === 3 &&
            planet.isMainPlanet) {
            if (this._recordVisit()) {
                player.commsMessage(expandMissionText("explorers_club_visit_logged"));
            }
        }
    }

    this.playerWillSaveGame = function () {
        "use strict";
        missionVariables.explorerClub_record = JSON.stringify(this.$xc_record);
        missionVariables.explorerClub_chartOption = this.$xc_chartOption;
        missionVariables.explorerClub_visitOption = this.$xc_visitOption;
    }

/* ========================================================
			THE ENHANCED NAVIGATION CHARTS
=========================================================== */

    this.guiScreenChanged = function (to, from) {
        "use strict";
        if (guiScreen === "GUI_SCREEN_SYSTEM_DATA") {
            if (this.$xc_record[galaxyNumber].indexOf(player.ship.targetSystem) === -1) {
                mission.addMessageTextKey("explorers_club_never_visited");
            } else if (player.ship.targetSystem === system.ID) {
                mission.addMessageTextKey("explorers_club_here_now");
            } else {
                mission.addMessageTextKey("explorers_club_already_visited");
            }
        } else if (guiScreen === "GUI_SCREEN_LONG_RANGE_CHART") {
            if (this.$xc_chartOption === 2) {
                for (var i = 0; i < 256; i++) {
                    mission.unmarkSystem({system: i, name: "exclubmap"});
                }
                if (this.$xc_fadingReminder > 1) {
                    player.consoleMessage(expandMissionText("explorers_club_chart_visited"), this.$xc_fadingReminder);
                    this.$xc_fadingReminder -= 1;
                }
                // Double timer to execute function every 0.125 seconds.
                this.$xc_chartAnimationCounter = 0;
                this.$xc_markingTimer1 = new Timer(this, this._xc_markChart, 0.25, 0.25);
                this.$xc_markingTimer2 = new Timer(this, this._xc_markChart, 0.375, 0.25);
            } else if (this.$xc_chartOption === 3) {
                if (this.$xc_fadingReminder > 1) {
                    player.consoleMessage(expandMissionText("explorers_club_chart_unvisited"), this.$xc_fadingReminder);
                    this.$xc_fadingReminder -= 1;
                }
                var currentGalaxy = galaxyNumber;
                for (var i = 0; i < 256; i++) {
                    if (this.$xc_record[currentGalaxy].indexOf(i) === -1) {
                        mission.markSystem({system: i, name: "exclubmap", markerColor: "orangeColor", markerScale: 1.0, markerShape: "MARKER_DIAMOND"});
                    } else {
                        mission.unmarkSystem({system: i, name: "exclubmap"});
                    }
                }
            }
            return; // Yes.
        }
        if (from === "GUI_SCREEN_LONG_RANGE_CHART") {
            if (this.$xc_markingTimer1) {
                this.$xc_markingTimer1.stop();
                delete this.$xc_markingTimer1;
            }
            if (this.$xc_markingTimer2) {
                this.$xc_markingTimer2.stop();
                delete this.$xc_markingTimer2;
            }
            if (to !== "GUI_SCREEN_SHORT_RANGE_CHART" &&
                this.$xc_chartOption !== 1) {
                for (var i = 0; i < 256; i++) {
                    mission.unmarkSystem({system: i, name: "exclubmap"});
                }
            }
        }
    }

    this._xc_markChart = function () {
        "use strict";
        if (this.$xc_chartAnimationCounter >= this.$xc_record[galaxyNumber].length) {
            if (this.$xc_markingTimer1) {
                this.$xc_markingTimer1.stop();
                delete this.$xc_markingTimer1;
            }
            if (this.$xc_markingTimer2) {
                this.$xc_markingTimer2.stop();
                delete this.$xc_markingTimer2;
            }
            return;
        }
        var sysID = this.$xc_record[galaxyNumber][this.$xc_chartAnimationCounter];
        mission.markSystem({system: sysID, name: "exclubmap", markerColor: "greenColor", markerScale: 1.0, markerShape: "MARKER_X"});
        this.$xc_chartAnimationCounter++;
    }

/* ========================================================
			EVENT HANDLERS FOR THE SPECIAL SCREENS
=========================================================== */

    this.shipDockedWithStation = function (station) {
        "use strict";
        station.setInterface("explorers_club", {title: expandMissionText("explorers_club_interface_title"), category: expandDescription("[interfaces-category-organisations]"), summary: expandMissionText("explorers_club_interface_summary") + "\n" + this._playerRank(), callback: this.missionScreenOpportunity.bind(this)});
    }

    this.missionScreenOpportunity = function (screenToShowNext) {
        "use strict";
        if (screenToShowNext) {
            this.$xc_screenToShowNext = screenToShowNext;
        }
        if (!this.$xc_screenToShowNext) {
            return;
        }
        switch (this.$xc_screenToShowNext) {
          case "explorers_club":
            mission.runScreen({allowInterrupt: true, exitScreen: "GUI_SCREEN_INTERFACES", titleKey: "explorers_club_options_title", messageKey: "explorers_club_options_text", background: "Explorers_Club.png", choicesKey: "explorers_club_options_choices", initialChoicesKey: ["99_EXIT"]}, this._xc_choice);
            delete this.$xc_screenToShowNext;
            mission.addMessageText("\n" + this._playerRank());
            delete this.$xc_mileStonesPage;
            delete this.$xc_visitedNameAllPage;
            delete this.$xc_visitedNameFirstPage;
            delete this.$xc_visitedNameSecondPage;
            delete this.$xc_unvisitedNameAllPage;
            delete this.$xc_unvisitedNameFirstPage;
            delete this.$xc_unvisitedNameSecondPage;
            break;
          case "settings":
            mission.runScreen({allowInterrupt: true, exitScreen: "GUI_SCREEN_LONG_RANGE_CHART", titleKey: "explorers_club_settings_title", messageKey: "explorers_club_settings_text", background: "Explorers_Club.png"});
            delete this.$xc_screenToShowNext;
            switch (this.$xc_chartOption) {
              case 1:
                mission.addMessageTextKey("explorers_club_settings_chart_1");
                break;
              case 2:
                mission.addMessageTextKey("explorers_club_settings_chart_2");
                break;
              case 3:
                mission.addMessageTextKey("explorers_club_settings_chart_3");
                break;
              default:;
            }
            switch (this.$xc_visitOption) {
              case 1:
                mission.addMessageTextKey("explorers_club_settings_visit_1");
                break;
              case 2:
                mission.addMessageTextKey("explorers_club_settings_visit_2");
                break;
              case 3:
                mission.addMessageTextKey("explorers_club_settings_visit_3");
                break;
              default:;
            }
            break;
          case "achievements":
            mission.runScreen({allowInterrupt: true, titleKey: "explorers_club_achieved_title", message: this.$xc_mileStonesPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "explorers_club";
            break;
          case "alternative_ooniverse":
            mission.runScreen({allowInterrupt: true, titleKey: "explorers_club_achieved_title", messageKey: "explorers_club_alternative_ooniverse", background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "explorers_club";
            break;
          case "systems_visited_all":
            mission.runScreen({allowInterrupt: true, title: "G" + (galaxyNumber + 1) + expandMissionText("explorers_club_systems_visited_all"), message: this.$xc_visitedNameAllPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "systems_unvisited_1";
            break;
          case "systems_unvisited_1":
            mission.runScreen({allowInterrupt: true, title: "G" + (galaxyNumber + 1) + expandMissionText("explorers_club_systems_unvisited_1"), message: this.$xc_unvisitedNameFirstPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "systems_unvisited_2";
            break;
          case "systems_unvisited_2":
            mission.runScreen({allowInterrupt: true, title: "G" + (galaxyNumber + 1) + expandMissionText("explorers_club_systems_unvisited_2"), message: this.$xc_unvisitedNameSecondPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "explorers_club";
            break;
          case "systems_visited_1":
            mission.runScreen({allowInterrupt: true, title: "G" + (galaxyNumber + 1) + expandMissionText("explorers_club_systems_visited_1"), message: this.$xc_visitedNameFirstPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "systems_visited_2";
            break;
          case "systems_visited_2":
            mission.runScreen({allowInterrupt: true, title: "G" + (galaxyNumber + 1) + expandMissionText("explorers_club_systems_visited_2"), message: this.$xc_visitedNameSecondPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "systems_unvisited_all";
            break;
          case "systems_unvisited_all":
            mission.runScreen({allowInterrupt: true, title: "G" + (galaxyNumber + 1) + expandMissionText("explorers_club_systems_unvisited_all"), message: this.$xc_unvisitedNameAllPage, background: "Explorers_Club.png"});
            this.$xc_screenToShowNext = "explorers_club";
            break;
          default:;
        }
    }

/* ========================================================
			OTHER FUNCTIONS FOR THE SPECIAL SCREENS
=========================================================== */

    this._xc_choice = function (choice) {
        "use strict";
        switch (choice) {
          case "99_EXIT":
            delete this.$xc_screenToShowNext;
            break;
          case "31_SYSTEMS":
            this._xc_systemList();
            break;
          case "32_ACHIEVE":
            this._xc_achievements();
            break;
          default: // All these go to the settings screen.
            switch (choice) {
              case "11_CHART_NORMAL":
                this.$xc_chartOption = 1;
                for (var i = 0; i < 256; i++) {
                    mission.unmarkSystem({system: i, name: "exclubmap"});
                }
                break;
              case "12_CHART_VISITED":
                this.$xc_chartOption = 2;
                this.$xc_fadingReminder = 10;
                break;
              case "13_CHART_UNVISITED":
                this.$xc_chartOption = 3;
                this.$xc_fadingReminder = 10;
                break;
              case "21_DOCKED":
                this.$xc_visitOption = 1;
                if (player.ship.dockedStation.isMainStation) {
                    this._recordVisit();
                }
                break;
              case "22_FLYING":
                this.$xc_visitOption = 2;
                this._recordVisit();
                break;
              case "23_SURFACE":
                this.$xc_visitOption = 3;
                break;
              default:;
            }
            this.$xc_screenToShowNext = "settings";
        }
    }

    this._xc_systemList = function () {
        "use strict";
        var visitedName = new Array;
        var unVisitedName = new Array;
        var currentGalaxy = galaxyNumber;
        var arrayLength = this.$xc_record[galaxyNumber].length;
        var i;
        for (i = 0; i < arrayLength; i++) {
            visitedName.push(" " + System.systemNameForID(this.$xc_record[currentGalaxy][i]));
        }
        for (i = 0; i < 256; i++) {
            if (this.$xc_record[currentGalaxy].indexOf(i) === -1) {
                unVisitedName.push(" " + System.systemNameForID(i));
            }
        }
        unVisitedName = unVisitedName.sort();
        if (visitedName.length <= 128) {
            this.$xc_visitedNameAllPage = visitedName;
            this.$xc_unvisitedNameFirstPage = unVisitedName.slice(0, 128);
            this.$xc_unvisitedNameSecondPage = unVisitedName.slice(128);
            this.$xc_screenToShowNext = "systems_visited_all";
            this.missionScreenOpportunity();
        } else {
            this.$xc_visitedNameFirstPage = visitedName.slice(0, 128);
            this.$xc_visitedNameSecondPage = visitedName.slice(128);
            this.$xc_unvisitedNameAllPage = unVisitedName;
            this.$xc_screenToShowNext = "systems_visited_1";
            this.missionScreenOpportunity();
        }
    }

    this._xc_achievements = function () {
        "use strict";
        var testCoords = [[4.8, 40.6, 0], [9.6, 30.4, 0], [31.2, 42.4, 0], [62.4, 34.2, 0], [51.2, 28.8, 0], [86.4, 27.6, 0], [70.8, 4.6, 0], [90.8, 39.8, 0]];
        var alternativeOoniverse = false;
        if (System.infoForSystem(galaxyNumber, 255).coordinates.distanceTo(testCoords[galaxyNumber]) > 0.00001) {
            alternativeOoniverse = true;
        }
        if (alternativeOoniverse) {
            this.$xc_screenToShowNext = "alternative_ooniverse";
            this.missionScreenOpportunity();
            return;
        }
        if (!this.$xc_oldWorlds) {
            var oldWorlds = [7, 39, 46, 55, 129, 147, 255];
            this.$xc_oldWorlds = this._xc_isArray1_subsetOfArray2(oldWorlds, this.$xc_record[0]);
        }
        if (!this.$xc_famousPlanetsGalOne) {
            var famousPlanetsGalOne = [3, 7, 13, 16, 18, 21, 23, 28, 29, 35, 36, 39, 42, 44, 50, 55, 62, 66, 73, 86, 89, 90, 93, 99, 100, 101, 111, 124, 126, 129, 131, 132, 141, 147, 150, 153, 154, 172, 177, 186, 188, 198, 200, 221, 222, 227, 228, 241, 246, 250];
            this.$xc_famousPlanetsGalOne = this._xc_isArray1_subsetOfArray2(famousPlanetsGalOne, this.$xc_record[0]);
        }
        if (!this.$xc_famousPlanetsGalTwo) {
            var famousPlanetsGalTwo = [6, 23, 24, 29, 33, 42, 45, 48, 53, 54, 57, 58, 65, 66, 74, 78, 82, 88, 94, 109, 113, 114, 115, 122, 127, 136, 140, 144, 178, 188, 189, 193, 202, 204, 207, 221, 236];
            this.$xc_famousPlanetsGalTwo = this._xc_isArray1_subsetOfArray2(famousPlanetsGalTwo, this.$xc_record[1]);
        }
        if (!this.$xc_prodigalSuns) {
            var prodigalSuns = [133, 206];
            this.$xc_prodigalSuns = this._xc_isArray1_subsetOfArray2(prodigalSuns, this.$xc_record[2]);
        }
        if (!this.$xc_lostWorlds) {
            var lostWorlds = [33, 41, 55, 202];
            this.$xc_lostWorlds = this._xc_isArray1_subsetOfArray2(lostWorlds, this.$xc_record[5]);
        }
        if (!this.$xc_greatRift) {
            var greatRift = [15, 17, 27, 30, 61, 79, 97, 110, 115, 125, 130, 134, 137, 139, 153, 161, 173, 178, 186, 191, 205, 214, 218, 228, 229, 237, 248];
            this.$xc_greatRift = this._xc_isArray1_subsetOfArray2(greatRift, this.$xc_record[6]);
        }
        if (!this.$xc_oresratiChallenge) {
            if (this.$xc_record[7].indexOf(162) !== -1) {
                this.$xc_oresratiChallenge = true;
            }
        }
        if (!this.$xc_everyGalaxy) {
            if (this.$xc_record[0].length !== 0 &&
                this.$xc_record[1].length !== 0 &&
                this.$xc_record[2].length !== 0 &&
                this.$xc_record[3].length !== 0 &&
                this.$xc_record[4].length !== 0 &&
                this.$xc_record[5].length !== 0 &&
                this.$xc_record[6].length !== 0 &&
                this.$xc_record[7].length !== 0) {
                this.$xc_everyGalaxy = true;
            }
        }
        this.$xc_mileStonesPage = "";
        if (this.$xc_oldWorlds) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_old") + "\n";
        }
        if (this.$xc_famousPlanetsGalOne) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_famous_1") + "\n";
        }
        if (this.$xc_famousPlanetsGalTwo) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_famous_2") + "\n";
        }
        if (this.$xc_prodigalSuns) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_prodigal") + "\n";
        }
        if (this.$xc_lostWorlds) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_lost") + "\n";
        }
        if (this.$xc_greatRift) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_rift") + "\n";
        }
        if (this.$xc_oresratiChallenge) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_oresrati") + "\n";
        }
        if (this.$xc_everyGalaxy) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_eight") + "\n";
        }
        if (!this.$xc_oldWorlds) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_old") + "\n";
        }
        if (!this.$xc_famousPlanetsGalOne) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_famous_1") + "\n";
        }
        if (!this.$xc_famousPlanetsGalTwo) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_famous_2") + "\n";
        }
        if (!this.$xc_prodigalSuns) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_prodigal") + "\n";
        }
        if (!this.$xc_lostWorlds) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_lost") + "\n";
        }
        if (!this.$xc_greatRift) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_rift") + "\n";
        }
        if (!this.$xc_oresratiChallenge) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_oresrati") + "\n";
        }
        if (!this.$xc_everyGalaxy) {
            this.$xc_mileStonesPage += expandMissionText("explorers_club_achieved_no_eight") + "\n";
        }
        this.$xc_screenToShowNext = "achievements";
        this.missionScreenOpportunity();
    }

    this._xc_isArray1_subsetOfArray2 = function (array1, array2) {
        "use strict";
        if (!array1 || !array2 || array1.length > array2.length) {
            return false;
        }
        if (array1.length === array2.filter(function (value) {return this.indexOf(value) >= 0;}, array1).length) {
            return true;
        } else {
            return false;
        }
    }

/* ========================================================
			INITIALIZATION
=========================================================== */

    this.startUp = function () {
        "use strict";
        if (galaxyNumber < 0 || galaxyNumber > 7) {
            var message = "Warning: Explorers' Club is not compatible with additional hacked galaxies. OXP disabled.";
            log(this.name, message);
            player.consoleMessage(message, 10);
            for (prop in this) {
                if (prop !== "name" && prop !== "version") {
                    delete this[prop];
                }
            }
            return;
        }
        if (!missionVariables.explorerClub_record) {
            this.$xc_record = [[], [], [], [], [], [], [], []];
            this.$xc_chartOption = 1;
            this.$xc_visitOption = 1;
            this.$xc_firstRun = true;
        } else {
            this.$xc_record = JSON.parse(missionVariables.explorerClub_record);
            this.$xc_chartOption = missionVariables.explorerClub_chartOption;
            this.$xc_visitOption = missionVariables.explorerClub_visitOption;
        }
        this.$xc_fadingReminder = 7;
        delete this.startUp;
        // Defunct mission variables from previous versions:-
        delete missionVariables.explorerClub_snapshotOption;
        delete missionVariables.explorerClub_snapshotOnLaunch;
        mission.setInstructions(null, this.name);
    }

    this.startUpComplete = function () {
        "use strict";
        if (player.ship.docked) {
            this.shipDockedWithStation(player.ship.dockedStation);
            if (this.$xc_firstRun) {
                delete this.$xc_firstRun;
                if (player.ship.dockedStation === system.mainStation) {
                    this.$xc_record[galaxyNumber][0] = system.ID;
                }
            }
        }
        delete this.startUpComplete;
    }

/* ========================================================
			INTERFACE FUNCTIONS

	Other scripts can call these functions.
=========================================================== */

    this._playerRank = function (requested) {
        "use strict";
        if (this.startUp) {
            this.startUp();
        }
        var chartVisited = this.$xc_record[galaxyNumber].length;
        if (requested === "chart") {
            return chartVisited;
        }
        var totalVisited = 0;
        for (var i = 0; i < 8; i++) {
            totalVisited += this.$xc_record[i].length;
        }
        if (requested === "total") {
            return totalVisited;
        }
        var rank;
        if (totalVisited >= 2048) {
            rank = expandMissionText("explorers_club_rank_2048");
        } else if (totalVisited >= 1024) {
            rank = expandMissionText("explorers_club_rank_1024");
        } else if (totalVisited >= 512) {
            rank = expandMissionText("explorers_club_rank_512");
        } else if (totalVisited >= 256) {
            rank = expandMissionText("explorers_club_rank_256");
        } else if (totalVisited >= 128) {
            rank = expandMissionText("explorers_club_rank_128");
        } else {
            rank = expandMissionText("explorers_club_rank_1");
        }
        if (requested === "rank") {
            return rank;
        }
        var rankString = expandMissionText("explorers_club_rank_string", {"explorers_club_rank_chart": chartVisited, "explorers_club_rank_total": totalVisited, "explorers_club_rank_player": rank});
        return rankString;
    }

    this._playerVisited = function (galaxy, sysID) {
        "use strict";
        if (this.startUp) {
            this.startUp();
        }
        if (typeof(sysID) === "undefined") {
            return "bad parameters";
        }
        if (galaxy < 0 ||
            galaxy > 7) {
            return "bad galaxy";
        }
        if (sysID < 0 ||
            sysID > 255) {
            return "bad system";
        }
        if (this.$xc_record[galaxy].indexOf(sysID) === -1) {
            return false;
        } else {
            return true;
        }
    }

/* ========================================================
			OTHER EVENT HANDLER

This is the only change from 1.4.4 to 1.4.6 - removing this 
because, for many players, the manifest screen is a lot 
more cluttered than it used to be.
=========================================================== */

  //  this.guiScreenWillChange = function (to, from) {
  //      "use strict";
  //      if (to === "GUI_SCREEN_MANIFEST") {
  //          mission.setInstructions(this._playerRank(), this.name);
  //      }
  //  }

/* ========================================================
			THE END
=========================================================== */