| Scripts/fuelTweaks_fuelEconomy.js | "use strict";
this.name = "FuelTweaks_FuelEconomy";
this.author = "phkb";
this.copyright = "2017 phkb";
this.description = "Controls where fuel is available";
this.licence = "CC BY-NC-SA 4.0";
/* 
check: fuel available at corp state, but rations were shown instead. plus, rations up to 6 were shown, even though limit was 4
also, buying the 5 and 6 rations did nothing (ie no fuel)
*/
this._fuelNormal = true;                    // switch to true to enable normal fuel operations galaxywide
this._fuelUseRations = false;               // default setting to indicate whether fuel rationing is in place (true) or standard fuel purchasing (false)
                                            // even if false, availability of fuel will still be controlled by settings below
this._npcUseStations = false;
this._defaultMinTL = 0;
this._fuelGovs = 0;
this._fuelEcos = 0;
this._fuelAvailability = [{eco:[0,1,2,3,4,5,6,7],gov:[0,1,2,3,4,5,6,7],tl:0,rations:false,max:1}];
                                            // an array of dictionaries
                                            // dict:    eco         array of economies. empty array means no economy check
                                            //          gov         array of government types. empty array means no gov checks
                                            //          tl          min tech level. -1 means no tl check
                                            //          rations     boolean to indicate fuel rations are in use. default = this._fuelUseRations
                                            //          max         integer between 0 and 6 being the maximum ration that can be sold
this._maxFuelRation = 1;                    // default maximum amount of ration that can be sold (between 0 and 6)
this._fuelAllegiances = 1;
this._fuelAllegiance = ["galcop"];          // allegiance of stations where fuel rations will be available. empty means any station allegiance
                                            // can include galcop,neutral,pirate,chaotic,,military,private,restricted,hunter,thargoid
this._fuelSystemOverride = [];              // array of dictionaries
                                            // dict:    systemID    id of the system having the override
                                            //          available   boolean indicating whether any fuel is for sale
                                            //          rations     boolean indicating whether rations are in use
                                            //          max         integer between 0 and 4 indicating the maximum ration that can be sold
this._defaultRSMinTL = 0;
this._refuelGovs = 0;
this._refuelEcos = 0;
this._refuelStationAvailability = [{eco:[0,1,2,3,4,5,6,7],gov:[0,1,2,3,4,5,6,7],tl:0,factor:0.15}];
                                           // an array of dictionaries
                                            // dict:    eco         array of economies. empty array means no economy check
                                            //          gov         array of government types. empty array means no gov checks
                                            //          tl          min tech level. -1 means no tl check
                                            //          factor      price factor for these systems
this._refuelStationSystemOverride = [];     // array of dictionaries 
                                            // dict:    systemID    system id of system in question
                                            //          available   boolean indicating whether refuel station is available
                                            //          factor      price factor to apply to fuel here
this._refuelStationCostFactor = 0.15;       // default price factor applied to fuel sold through refuelling stations
this._emergencyFuel = [];                   // array of stations names where player has purchased a fuel ration
this._saveSettings = false;                 // set to true to save all settings in save game file (which means values set above will be overridden)
                                            // this would probably only enabled if the OXP reached release stage and was linked into other OXP's
                                            // eg Diplomacy
this._trueValues = ["yes", "1", 1, "true", true];
this._allegiances = ["galcop", "neutral", "pirate", "chaotic", "military", "private", "restricted", "hunter", "thargoid"];
this._allegianceDisplay = [expandMissionText("FT_allegiance_galcop"), expandMissionText("FT_allegiance_neutral"), expandMissionText("FT_allegiance_pirate"),
    expandMissionText("FT_allegiance_chaotic"), expandMissionText("FT_allegiance_military"), expandMissionText("FT_allegiance_private"),
    expandMissionText("FT_allegiance_restricted"), expandMissionText("FT_allegiance_hunter"), expandMissionText("FT_allegiance_thargoid")
];
this._ecos = [];
this._govs = [];
// configuration settings for use in Lib_Config
this._feConfig = {
	Name: this.name,
	Alias: expandMissionText("FT_config_alias"),
	Display: expandMissionText("FT_config_display"),
	Alive: "_feConfig",
	Notify: "$update",
	Bool: {
		B0: { Name: "_saveSettings", Def: false, Desc: expandMissionText("FT_config_saveSettings") },
		B1: { Name: "_fuelNormal", Def: true, Desc: expandMissionText("FT_config_fuelNormal") },
        B2: { Name: "_fuelUseRations", Def: false, Desc: expandMissionText("FT_config_fuelUseRations") },
        B3: { Name: "_npcUseStations", Def: false, Desc: expandMissionText("FT_config_npcUseStations") },
		Info: "^FT_config_boolInfo"
	},
	SInt: {
		S0: { Name: "_maxFuelRation", Def: 1, Min: 0, Max: 6, Desc: expandMissionText("FT_config_maxFuelRation") },
		S1: { Name: "_defaultMinTL", Def: 0, Min: 0, Max: 15, Desc: expandMissionText("FT_config_defaultMinTL") },
		S2: { Name: "_refuelStationCostFactor", Def: 0.15, Min: 0.01, Max: 50, Float:true, Desc: expandMissionText("FT_config_refuelStationCostFactor") },
		S3: { Name: "_defaultRSMinTL", Def: 0, Min: 0, Max: 15, Desc: expandMissionText("FT_config_defaultRSMinTL") },
		Info: "^FT_config_sintInfo"
	},
};
this._faAllegianceConfig = {
    Name: this.name,
    Display: expandMissionText("FT_allegiance_display"),
    Alias: expandMissionText("FT_config_alias"),
    Alive: "_faAllegianceConfig",
    Notify: "$update",
    EInt: {
        E0: {
            Name: "_fuelAllegiances",
            Def: 0,
            Min: 0,
            Max: 511,
            Desc: this._allegianceDisplay
        },
        Info: "^FT_allegiance_info"
    },
};
this._faGovernmentConfig = {
    Name: this.name,
    Display: expandMissionText("FT_government_display"),
    Alias: expandMissionText("FT_config_alias"),
    Alive: "_faGovernmentConfig",
    Notify: "$update",
    EInt: {
        E0: {
            Name: "_fuelGovs",
            Def: 0,
            Min: 0,
            Max: 255,
            Desc: this._govs
        },
        Info: "^FT_government_info"
    },
};
this._faEconomyConfig = {
    Name: this.name,
    Display: expandMissionText("FT_economy_display"),
    Alias: expandMissionText("FT_config_alias"),
    Alive: "_faEconomyConfig",
    Notify: "$update",
    EInt: {
        E0: {
            Name: "_fuelEcos",
            Def: 0,
            Min: 0,
            Max: 255,
            Desc: this._ecos
        },
        Info: "^FT_economy_info"
    },
};
this._rsGovernmentConfig = {
    Name: this.name,
    Display: expandMissionText("FT_fuelstation_governments_display"),
    Alias: expandMissionText("FT_config_alias"),
    Alive: "_rsGovernmentConfig",
    Notify: "$update",
    EInt: {
        E0: {
            Name: "_refuelGovs",
            Def: 0,
            Min: 0,
            Max: 255,
            Desc: this._govs
        },
        Info: "^FT_fuelstation_governments_info"
    },
};
this._rsEconomyConfig = {
    Name: this.name,
    Display: expandMissionText("FT_fuelstation_economies_display"),
    Alias: expandMissionText("FT_config_alias"),
    Alive: "_rsEconomyConfig",
    Notify: "$update",
    EInt: {
        E0: {
            Name: "_refuelEcos",
            Def: 0,
            Min: 0,
            Max: 255,
            Desc: this._ecos
        },
        Info: "^FT_fuelstation_economies_info"
    },
};
//-------------------------------------------------------------------------------------------------------------
this.startUp = function() {
	for (var i = 0; i < 8 ; i++) this._govs.push(String.fromCharCode(i) + " " + this.$governmentDescription(i));
	for (i = 0; i < 8 ; i++) this._ecos.push(String.fromCharCode(23 - i) + " " + this.$economyDescription(i));
    /*
    // sample settings
    this._fuelNormal = false; // turn off normal fuel operations
    this._fuelUseRations = true; // turn on rationing
    // add some controls over fuel availability
    this.$addFuelAvailability([4,5,6,7], [0], 5);
    this.$addFuelAvailability([4,5,6,7], [1], 3);
    this.$addFuelAvailability([3,4,5,6,7], [2,3,4,5,6,7], 0, false);
    
    // add some controls over where refulling stations are present
    this.$addRefuelStationAvailability([4,5], [0], 8);
    this.$addRefuelStationAvailability([4,5], [1], 6);
    this.$addRefuelStationAvailability([4,5,6], [2], 3);
    this.$addRefuelStationAvailability([3,4,5,6], [2,3,4,5,6,7], 2);
    */
    if (missionVariables.FuelTweaks_EmergencyFuel) {
        this._emergencyFuel = JSON.parse(missionVariables.FuelTweaks_EmergencyFuel);
        delete missionVariables.FuelTweaks_EmergencyFuel;
    }
    // only try to load settings if we're actually saving them
    if (missionVariables.FuelTweaks_SaveSettings) {
        this._saveSettings = (this._trueValues.indexOf(missionVariables.FuelTweaks_SaveSettings) >= 0 ? true : false);
    }
    if (this._saveSettings === true) {
        if (missionVariables.FuelTweaks_FuelAvailability) {
            this._fuelAvailability = JSON.parse(missionVariables.FuelTweaks_FuelAvailability);
            //delete missionVariables.FuelTweaks_FuelAvailability;
        }
        if (missionVariables.FuelTweaks_FuelMinTL) {
            this._defaultMinTL = parseInt(missionVariables.FuelTweaks_FuelMinTL);
        }
        if (missionVariables.FuelTweaks_MaxFuelRation) {
            this._maxFuelRation = parseInt(missionVariables.FuelTweaks_MaxFuelRation);
        }
        if (missionVariables.FuelTweaks_Allegiance) {
            this._fuelAllegiance = JSON.parse(missionVariables.FuelTweaks_Allegiance);
            //delete missionVariables.FuelTweaks_Allegiance;
        }
        if (missionVariables.FuelTweaks_FuelSystemOverride) {
            this._fuelSystemOverride = JSON.parse(missionVariables.FuelTweaks_FuelSystemOverride);
            //delete missionVariables.FuelTweaks_FuelSystemOverride;
        }
        if (missionVariables.FuelTweaks_RefuelStationAvailability) {
            this._refuelStationAvailability = JSON.parse(missionVariables.FuelTweaks_RefuelStationAvailability);
            //delete missionVariables.FuelTweaks_RefuelEconomy;
        }
        if (missionVariables.FuelTweaks_RefuelStationSystemOverride) {
            this._refuelStationSystemOverride = JSON.parse(missionVariables.FuelTweaks_RefuelStationSystemOverride);
            //delete missionVariables.FuelTweaks_RefuelStationSystemOverride;
        }
        if (missionVariables.FuelTweaks_RefuelStationCostFactor) {
            this._refuelStationCostFactor = this.$decPlaces(parseFloat(missionVariables.FuelTweaks_RefuelStationCostFactor), 2);
        }
        if (missionVariables.FuelTweaks_RefuelStationMinTL) {
            this._defaultRSMinTL = parseInt(missionVariables.FuelTweaks_RefuelStationMinTL);
        }
        if (missionVariables.FuelTweaks_Normal) {
            this._fuelNormal = (this._trueValues.indexOf(missionVariables.FuelTweaks_Normal) >= 0 ? true : false);
        }
        if (missionVariables.FuelTweaks_UseRations) {
            this._fuelUseRations = (this._trueValues.indexOf(missionVariables.FuelTweaks_UseRations) >= 0 ? true : false);
        }
        if (missionVariables.FuelTweaks_NPCUseStations) {
            this._npcUseStations = (this._trueValues.indexOf(missionVariables.FuelTweaks_NPCUseStations) >= 0 ? true : false);
        }
    }
    this.$updateIsisEquipment();
    delete this.startUp;
}
//-------------------------------------------------------------------------------------------------------------
this.startUpComplete = function() {
    this.$updateBitwiseValues();
    // register our settings, if Lib_Config is present
    if (worldScripts.Lib_Config) {
        worldScripts.Lib_Config._registerSet(this._feConfig);
        worldScripts.Lib_Config._registerSet(this._faAllegianceConfig);
        worldScripts.Lib_Config._registerSet(this._faGovernmentConfig);
        worldScripts.Lib_Config._registerSet(this._faEconomyConfig);
        worldScripts.Lib_Config._registerSet(this._rsGovernmentConfig);
        worldScripts.Lib_Config._registerSet(this._rsEconomyConfig);
    }
    if (worldScripts["oolite-system-data-config"] && worldScripts["CommpressedF7Layout"]) {
        worldScripts["oolite-system-data-config"].addChangeCallback(this.name, "$addInfoToSystemDataScreen");
        delete this.guiScreenWillChange;
        delete this.infoSystemWillChange;
    }
    if (worldScripts.GalCopAdminServices) {
        var ga = worldScripts.GalCopAdminServices;
        ga._purchase_ignore_equip.push("EQ_PIRATE_FUEL");
        ga._purchase_ignore_equip.push("EQ_FUEL_ALT1");
        ga._purchase_ignore_equip.push("EQ_FUEL_ALT2");
        ga._purchase_ignore_equip.push("EQ_FUEL_ALT3");
        ga._purchase_ignore_equip.push("EQ_FUEL_ALT4");
        ga._purchase_ignore_equip.push("EQ_FUEL_ALT5");
        ga._purchase_ignore_equip.push("EQ_FUEL_ALT6");
    }
    // a couple of bug fixes
    var p = player.ship;
    if (p.hasEquipmentProviding("EQ_FUEL_ALT5")) p.removeEquipment("EQ_FUEL_ALT5");
    if (p.hasEquipmentProviding("EQ_FUEL_ALT6")) p.removeEquipment("EQ_FUEL_ALT6");
}
//-------------------------------------------------------------------------------------------------------------
this.playerWillSaveGame = function() {
    if (this._emergencyFuel.length > 0) {
        missionVariables.FuelTweaks_EmergencyFuel = JSON.stringify(this._emergencyFuel);
    } else {
        delete missionVariables.FuelTweaks_EmergencyFuel;
    }
    // only save settings if we're allowed
    missionVariables.FuelTweaks_SaveSettings = this._saveSettings;
    if (this._saveSettings === true) {
        missionVariables.FuelTweaks_FuelAvailability = JSON.stringify(this._fuelAvailability);
        missionVariables.FuelTweaks_FuelMinTL = this._defaultMinTL;
        missionVariables.FuelTweaks_MaxFuelRation = this._maxFuelRation;
        missionVariables.FuelTweaks_Allegiance = JSON.stringify(this._fuelAllegiance);
        missionVariables.FuelTweaks_FuelSystemOverride = JSON.stringify(this._fuelSystemOverride);
        missionVariables.FuelTweaks_RefuelStationAvailability = JSON.stringify(this._refuelStationAvailability);
        missionVariables.FuelTweaks_RefuelStationSystemOverride = JSON.stringify(this._refuelStationSystemOverride);
        missionVariables.FuelTweaks_RefuelStationCostFactor = this._refuelStationCostFactor;
        missionVariables.FuelTweaks_RefuelStationMinTL = this._defaultRSMinTL;
        missionVariables.FuelTweaks_Normal = this._fuelNormal;
        missionVariables.FuelTweaks_UseRations = this._fuelUseRations;
        missionVariables.FuelTweaks_NPCUseStations = this._npcUseStations;
    }
}
//-------------------------------------------------------------------------------------------------------------
this.playerBoughtEquipment = function(equipmentKey) {
    var list = ["EQ_FUEL_ALT1","EQ_FUEL_ALT2","EQ_FUEL_ALT3","EQ_FUEL_ALT4","EQ_FUEL_ALT5","EQ_FUEL_ALT6"];
	if (list.indexOf(equipmentKey) >= 0) {
        var info = EquipmentInfo.infoForKey(equipmentKey);
        var amt = parseInt(info.scriptInfo["fuel_amount"]);
		player.ship.fuel += amt;
        player.ship.removeEquipment(equipmentKey);
        this._emergencyFuel.push(player.ship.dockedStation.displayName); 
    }
    if (equipmentKey === "EQ_PIRATE_FUEL") {
        player.ship.fuel = 7;
        player.ship.removeEquipment(equipmentKey);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.shipWillEnterWitchspace = function(cause, destination) {
    this._emergencyFuel = [];
    if (cause === "galactic jump") {
        // reset fuel system parameters
        if (this._fuelAvailability.length > 1) {
            for (var i = 1; i < this._fuelAvailability.length; i++) this._fuelAvailability.splice(1, 1);
        }
        this._fuelSystemOverride = [];
        if (this._refuelStationAvailability.length > 1) {
            for (var i = 1; i < this._refuelStationAvailability.length; i++) this._refuelStationAvailability.splice(1, 1);
        }
        this._refuelStationSystemOverride = [];
    }
}
//-------------------------------------------------------------------------------------------------------------
this.shipExitedWitchspace = function() {
    if (this._fuelNormal === false && system.ID >= 0) {
        var msg = "";
        var avail = this.$isFuelAvailable(system.ID);
        var stn = (avail === true ? this.$isRefuelStationAvailable(system.ID) : false);
        var rations = (avail === true ? this.$fuelRationsInUse(system.ID) : false);
        if (avail === false) msg = expandDescription("[fuelTweaks_notAvailable]");
        if (avail === true) {
            if (rations === true && stn === false) msg = expandDescription("[fuelTweaks_fuelRationsAvailable]");
        }
        if (msg !== "") {
            var targets = system.shipsWithRole("buoy-witchpoint");
            if (targets.length > 0) {
                for (var i = 0; i < targets.length; i++) {
                    targets[i].commsMessage(msg, player.ship);
                }
            }
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
this.guiScreenWillChange = function(to, from) {
    if (to === "GUI_SCREEN_SYSTEM_DATA") {
		this.$addInfoToSystemDataScreen();
    }
}
//-------------------------------------------------------------------------------------------------------------
this.infoSystemWillChange = function(to, from) {
	if (guiScreen === "GUI_SCREEN_SYSTEM_DATA") {
		this.$addInfoToSystemDataScreen();
	}
}
//-------------------------------------------------------------------------------------------------------------
// adds an availability register to the list
this.$addFuelAvailability = function(ecoList, govList, tl, useRations, maxRation) {
    if (ecoList && Array.isArray(ecoList) === false) {
        throw expandMissionText("FT_error_01");
    }
    if (!ecoList) {
        ecoList = [0, 1, 2, 3, 4, 5, 6, 7];
    } else {
        for (var i = 0; i < ecoList.length; i++) {
            if (ecoList[i] < 0 || ecoList[i] > 7) {
                throw expandMissionText("FT_error_02");
            }
        }
    }
    if (govList && Array.isArray(govList) === false) {
        throw expandMissionText("FT_error_03");
    }
    if (!govList) {
        govList = [0, 1, 2, 3, 4, 5, 6, 7];
    } else {
        for (var i = 0; i < govList.length; i++) {
            if (govList[i] < 0 || govList[i] > 7) {
                throw expandMissionText("FT_error_04");
            }
        }
    }
    if (tl < -1 || tl > 15) {
        throw expandMissionText("FT_error_05");
    }
    // default if not passed
    if (useRations == undefined) useRations = this._fuelUseRations;
    if (maxRation == undefined) {
        maxRation = this._maxFuelRation;
    } else {
        if (isNaN(maxRation) || maxRation < 0 || maxRation > 6) {
            throw expandMissionText("FT_error_06");
        }
    }
    var test = JSON.stringify({eco:ecoList, gov:govList, tl:tl, rations:useRations, max:maxRation});
    var found = false;
    for (var i = 1; i < this._fuelAvailability.length; i++) {
        if (JSON.stringify(this._fuelAvailability[i]) === test) {found = true; break;}
    }
    if (found === false) this._fuelAvailability.push({eco:ecoList, gov:govList, tl:tl, rations:useRations, max:maxRation});
}
//-------------------------------------------------------------------------------------------------------------
// removes a fuel availability register from the list
this.$removeFuelAvailability = function(ecoList, govList, tl, useRations, maxRation) {
    if (ecoList && Array.isArray(ecoList) === false) {
        throw expandMissionText("FT_error_01");
    }
    if (!ecoList) {
        ecoList = [0, 1, 2, 3, 4, 5, 6, 7];
    } else {
        for (var i = 0; i < ecoList.length; i++) {
            if (ecoList[i] < 0 || ecoList[i] > 7) {
                throw expandMissionText("FT_error_02");
            }
        }
    }
    if (govList && Array.isArray(govList) === false) {
        throw expandMissionText("FT_error_03");
    }
    if (!govList) {
        govList = [0, 1, 2, 3, 4, 5, 6, 7];
    } else {
        for (var i = 0; i < govList.length; i++) {
            if (govList[i] < 0 || govList[i] > 7) {
                throw expandMissionText("FT_error_04");
            }
        }
    }
    if (tl < -1 || tl > 15) {
        throw expandMissionText("FT_error_05");
    }
    // default if not passed
    if (useRations == undefined) useRations = this._fuelUseRations;
    if (maxRation == undefined) {
        maxRation = this._maxFuelRation;
    } else {
        if (isNaN(maxRation) || maxRation < 0 || maxRation > 6) {
            throw expandMissionText("FT_error_06");
        }
    }
    // don't remove the default settings
    if (this._fuelAvailability.length > 1) {
        var test = JSON.stringify({eco:ecoList, gov:govList, tl:tl, rations:useRations, max:maxRation});
        for (var i = 1; i < this._fuelAvailability.length; i++) {
            if (JSON.stringify(this._fuelAvailability[i]) === test) {
                this._fuelAvailability.splice(i, 1);
                break;
            }
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$addInfoToSystemDataScreen = function() {
	var sysID = player.ship.targetSystem;
	if (player.ship.hasOwnProperty("infoSystem")) sysID = player.ship.infoSystem;
    // build message
    var msg = "";
    var avail = this.$isFuelAvailable(sysID);
    var stn = (avail === true ? this.$isRefuelStationAvailable(sysID) : false);
    var rations = (avail === true ? this.$fuelRationsInUse(sysID) : false);
    if (avail === false) msg = expandDescription("[fuelTweaks_notAvailable]");
    if (avail === true) {
        if (rations === true && stn === false) msg = expandDescription("[fuelTweaks_fuelRationsAvailable]");
        if (stn === true) msg = expandDescription("[fuelTweaks_fuelStationAvailable]");
    }
    // add message to top part of screen, if possible
    var added = false;
    if (worldScripts["oolite-system-data-config"] && worldScripts["CompressedF7Layout"]) {
        var ln = 0;
        var dc = worldScripts["oolite-system-data-config"];
        for (var i = 16; i >= 1; i--) {
            if (ln === 0 && dc.systemDataLineText(i) != "") {
                ln = i + 1;
            }
            if (dc.systemDataLineOwner(i) === this.name) {
                ln = i;
                break;
            }
        }
        if (ln <= 16 && ln > 0) {
            added = true;
            dc.setSystemDataLine(ln, msg, (msg != "" ? this.name : ""));
        }
    } 
    // if none of the above worked, then just add the message to the bottom part of the screen
    if (added === false) mission.addMessageText(msg);
}
//-------------------------------------------------------------------------------------------------------------
// adds a fuel override to a specific system
this.$addFuelSystemOverride = function(sysID, avail, useRations, maxRation) {
    // default if not passed
    if (!useRations) useRations = this._fuelUseRations;
    if (!maxRation) {
        maxRation = this._maxFuelRation;
    } else {
        if (isNaN(maxRation) || maxRation < 0 || maxRation > 6) {
            throw expandMissionText("FT_error_06");
        }
    }
    
    var found = false;
    for (var i = 0; i < this._fuelSystemOverride.length; i++) {
        if (this._fuelSystemOverride[i].systemID === sysID) {
            this._fuelSystemOverride[i] = {systemID:sysID, available:avail, rations:useRations, max:maxRation};
            found = true;
            break;
        }
    }
    if (found === false) {
        this._fuelSystemOverride.push({systemID:sysID, available:avail, rations:useRations, max:maxRation});
    }
}
//-------------------------------------------------------------------------------------------------------------
// removes a system specific fuel override
this.$removeFuelSystemOverride = function(sysID) {
    if (isNaN(sysID) || sysID < 0 || sysID > 255) {
        throw expandMissionText("FT_error_07");
    }
    for (var i = 0; i < this._fuelSystemOverride.length; i++) {
        if (this._fuelSystemOverride[i].systemID === sysID) {
            this._fuelSystemOverride.splice(i, 1)
            break;
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
// Sets the default maximum amount of fuel that can be purchased through a non-refuelling stations
// Zero (0) means no ration available.
this.$setMaxFuelRation = function(maxFuel) {
	if (isNaN(maxFuel) === true || maxFuel < 0 || maxFuel > 6) {
		throw expandMissionText("FT_error_06");
	}
    this._maxFuelRation = maxFuel;
}
//-------------------------------------------------------------------------------------------------------------
// Sets an array of allegiance types to control what stations can sell fuel.
// empty array means all stations.
this.$setFuelAllegiance = function(alleg) {
	if (Array.isArray(alleg) === false) {
		throw expandMissionText("FT_error_08");
	}
    var poss = this._allegiances;
	for (var i = 0; i < alleg.length; i++) {
		if (poss.indexOf(alleg[i]) === -1) {
			throw expandMissionText("FT_error_09", {invalid: alleg[i], list: this._allegianceDisplay.join()}); 
		}
	}
	this._fuelAllegiance = alleg;
}
//-------------------------------------------------------------------------------------------------------------
// adds a refuel station availability register to the list
this.$addRefuelStationAvailability = function(ecoList, govList, tl, factor) {
    if (ecoList && Array.isArray(ecoList) === false) {
        throw expandMissionText("FT_error_01");
    }
    if (!ecoList) {
        ecoList = [0, 1, 2, 3, 4, 5, 6, 7];
    } else {
        for (var i = 0; i < ecoList.length; i++) {
            if (ecoList[i] < 0 || ecoList[i] > 7) {
                throw expandMissionText("FT_error_02");
            }
        }
    }
    if (govList && Array.isArray(govList) === false) {
        throw expandMissionText("FT_error_03");
    }
    if (!govList) {
        govList = [0, 1, 2, 3, 4, 5, 6, 7];
    } else {
        for (var i = 0; i < govList.length; i++) {
            if (govList[i] < 0 || govList[i] > 7) {
                throw expandMissionText("FT_error_04");
            }
        }
    }
    if (tl < -1 || tl > 15) {
        throw expandMissionText("FT_error_05");
    }
    if (factor && isNaN(factor) === true) {
        throw expandMissionText("FT_error_10");
    }
    var test = JSON.stringify({eco:ecoList, gov:govList, tl:tl});
    var found = false;
    for (var i = 0; i < this._refuelStationAvailability.length; i++) {
        if (JSON.stringify(this._refuelStationAvailability[i]) === test) {found = true; break;}
    }
    if (!factor) factor = this._refuelStationCostFactor;
    if (found === false) this._refuelStationAvailability.push({eco:ecoList, gov:govList, tl:tl, factor:factor});
}
//-------------------------------------------------------------------------------------------------------------
// removes a refuel station availability register from the list
this.$removeRefuelStationAvailability = function(ecoList, govList, tl) {
        if (Array.isArray(ecoList) === false) {
        throw expandMissionText("FT_error_01");
    }
    for (var i = 0; i < ecoList.length; i++) {
        if (ecoList[i] < 0 || ecoList[i] > 7) {
            throw expandMissionText("FT_error_11");
        }
    }
    if (Array.isArray(govList) === false) {
        throw expandMissionText("FT_error_03");
    }
    for (var i = 0; i < govList.length; i++) {
        if (govList[i] < 0 || govList[i] > 7) {
            throw expandMissionText("FT_error_12");
        }
    }
    if (tl < -1 || tl > 15) {
        throw expandMissionText("FT_error_05");
    }
    if (this._refuelStationAvailability.length > 1) {
        var test = JSON.stringify({eco:ecoList, gov:govList, tl:tl});
        for (var i = 0; i < this._refuelStationAvailability.length; i++) {
            if (JSON.stringify(this._refuelStationAvailability[i]) === test) {
                this._refuelStationAvailability.splice(i, 1); 
                break;
            }
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
// Adds a system ID to a list of systems that will be forced to have a refuelling station.
this.$addRefuelStationSystemOverride = function(sysID, avail, costFactor) {
    if (isNaN(sysID) || sysID < 0 || sysID > 255) {
        throw expandMissionText("FT_error_07");
    }
    if (isNaN(costFactor) || costFactor <= 0) {
        throw expandMissionText("FT_error_10");
    }
    var found = false;
    for (var i = 0; i < this._refuelStationSystemOverride.length; i++) {
        if (this._refuelStationSystemOverride[i].systemID === sysID) {
            found = true;
            this._refuelStationSystemOverride[i] = {systemID:sysID, available:avail, factor:costFactor};
            break;
        }
    }
    if (found === false) {
        this._refuelStationSystemOverride.push({systemID:sysID, available:avail, factor:costFactor});
    }
}
//-------------------------------------------------------------------------------------------------------------
// Removes a systemID from the list of systems that will always have a refuelling station.
this.$removeRefuelStationSystemOverride = function(sysID) {
    if (isNaN(sysID) || sysID < 0 || sysID > 255) {
        throw expandMissionText("FT_error_07");
    }
    for (var i = 0; i < this._refuelStationSystemOverride.length; i++) {
        if (this._refuelStationSystemOverride[i].systemID === sysID) {
            this._refuelStationSystemOverride.splice(i, 1);
            break;
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
// sets the default refuelling station cost factor 
this.$setRefuelStationCostFactor = function(cf) {
    if (isNaN(cf) || cf <= 0) {
        throw expandMissionText("FT_error_10");
    }
    this._refuelStationCostFactor = cf;
}
//-------------------------------------------------------------------------------------------------------------
// returns true if fuel rations will be available in a particular system. otherwise false.
this.$isFuelAvailable = function(sysID) {
    if (this._fuelNormal === true) return true;
	if (!sysID) sysID = system.ID;
	var sys = System.infoForSystem(galaxyNumber, sysID);
    // check if we have an override
    var ovr = this.$checkFuelSystemOverride(sysID);
    if (ovr) return ovr.available;
    return this.$checkFuelAvailability(sys.economy, sys.government, sys.techlevel);
}
//-------------------------------------------------------------------------------------------------------------
// returns true if fuel rationing is in use in a system, otherwise false
this.$fuelRationsInUse = function(sysID) {
    if (this._fuelNormal === true) return false;
	if (!sysID) sysID = system.ID;
	var sys = System.infoForSystem(galaxyNumber, sysID);
    // look for an override first
    var ovr = this.$checkFuelSystemOverride(sysID);
    if (ovr) return ovr.rations;
    // check if a refuel station is available here
    if (this.$isRefuelStationAvailable(sysID) === true) return false;
    var inuse = this.$checkFuelRationsInUse(sys.economy, sys.government, sys.techlevel);
    // make sure players who can't scoop fuel can still get a fuel ration
    if (player.ship.hasEquipmentProviding("EQ_FUEL_SCOOPS") === false) {
        if (inuse === false && this.$isFuelAvailable(sysID) === false && this.$isRefuelStationAvailable(sysID) === false) {
            inuse = true;
        }
    }
    return inuse;
}
//-------------------------------------------------------------------------------------------------------------
// checks all fuel availability settings to see if we hit a true condition
this.$checkFuelAvailability = function(ecoID, govID, tl) {
    for (var i = 0; i < this._fuelAvailability.length; i++) {
        var checkCount = 0;
        var itm = this._fuelAvailability[i];
        if (itm.eco.indexOf(ecoID) >= 0) checkCount += 1; // itm.eco.length === 0 || 
        if (itm.gov.indexOf(govID) >= 0) checkCount += 1; // itm.gov.length === 0 || 
        if (itm.tl === -1 || tl >= itm.tl) checkCount += 1;
 
        if (checkCount === 3) {
            return true;
        }
    }
    return false;
}
//-------------------------------------------------------------------------------------------------------------
// checks all fuel availability settings to see whether fuel rations are in use
this.$checkFuelRationsInUse = function(ecoID, govID, tl) {
    var inuse = this._fuelUseRations;
    var itm = this.$getAvailabilityItem(ecoID, govID, tl);
    if (itm != null) inuse = itm.useRation;
    return inuse;
}
//-------------------------------------------------------------------------------------------------------------
// returns the maximum possible fuel ration available for this system
this.$getMaxFuelRation = function(sysID) {
    var max = this._maxFuelRation;
	if (!sysID) sysID = system.ID;
	var sys = System.infoForSystem(galaxyNumber, sysID);
    // look for an override
    var ovr = this.$checkFuelSystemOverride(sysID);
    if (ovr) return ovr.max;
    // look for a general item
    var itm = this.$getAvailabilityItem(sys.economy, sys.government, sys.techlevel);
    if (itm != null) max = itm.maxRation;
    // make sure players who can't scoop fuel can still get a decent fuel ration
    if (player.ship.hasEquipmentProviding("EQ_FUEL_SCOOPS") === false) {
        if (this.$isFuelAvailable(sysID) === false && this.$isRefuelStationAvailable(sysID) === false) {
            max = 4;
        }
    }
    return max;
}
//-------------------------------------------------------------------------------------------------------------
// checks the availability register for a match on eco, gov and tl
this.$getAvailabilityItem = function(ecoID, govID, tl) {
    var item = null;
    for (var i = 0; i < this._fuelAvailability.length; i++) {
        var itm = this._fuelAvailability[i];
        if (((itm.eco.length > 0 && itm.eco.indexOf(ecoID) >= 0)) && //  || itm.eco.length === 0
            ((itm.gov.length > 0 && itm.gov.indexOf(govID) >= 0)) && //  || itm.gov.length === 0
            (itm.tl === -1 || tl >= itm.tl)) {item = itm; break;}
    }
    return item;
}
//-------------------------------------------------------------------------------------------------------------
// checks for a fuel ration system override, returns item or null
this.$checkFuelSystemOverride = function(sysID) {
    if (this._fuelSystemOverride.length > 0) {
        for (var i = 0; i < this._fuelSystemOverride.length; i++) {
            if (this._fuelSystemOverride[i].systemID === sysID) return this._fuelSystemOverride[i];
        }
    }
    return null;
}
//-------------------------------------------------------------------------------------------------------------
// returns true if fuel rations will be available from stations in a particular system. otherwise false
this.$isRefuelStationAvailable = function(sysID) {
    // if the fuel is set to normal operations, don't spawn any refuelling stations - but maybe some discussion is worthwhile here.
    if (this._fuelNormal === true) return false;
	if (!sysID) sysID = system.ID;
	var sys = System.infoForSystem(galaxyNumber, sysID);
    // is fuel allowed to be sold in this system? run relevant fuel availability checks first
    var fuelAvail = true;
    var ovr = this.$checkFuelSystemOverride(sysID);
    // check if we have a "deny" override
    if (ovr) {
        fuelAvail = ovr.available;
    } else {
        // otherwise check for general availability
        fuelAvail = this.$checkFuelAvailability(sys.economy, sys.government, sys.techlevel);
    }
    // check the economy of the current system
    var avail = true;
    // if fuel is available we can now check for refuel stations
    if (fuelAvail === true) {
        // check if we have an override for this system
        ovr = this.$checkRefuelStationSystemOverride(sysID);
        if (ovr) return ovr.available;
        avail = this.$checkRefuelStationAvailability(sys.economy, sys.government, sys.techlevel);
    } else {
        // if no fuel is available, no refuelling stations are available either
        avail = false;
    }
    return avail;
}
//-------------------------------------------------------------------------------------------------------------
// checks all refuel station availability settings to see if we hit a true condition
this.$checkRefuelStationAvailability = function(ecoID, govID, tl) {
    for (var i = 0; i < this._refuelStationAvailability.length; i++) {
        var checkCount = 0;
        var itm = this._refuelStationAvailability[i];
        if (itm.eco.indexOf(ecoID) >= 0) checkCount += 1; // itm.eco.length === 0 || 
        if (itm.gov.indexOf(govID) >= 0) checkCount += 1; // itm.gov.length === 0 || 
        if (itm.tl === -1 || tl >= itm.tl) checkCount += 1;
        // if we completely matched on this item, we're good to go
        if (checkCount === 3) {
            return true;
        }
    }
    return false;
}
//-------------------------------------------------------------------------------------------------------------
// checks the fuel station availability register for a match on eco, gov and tl
this.$getRefuelStationAvailabilityItem = function(ecoID, govID, tl) {
    var item = null;
    for (var i = 0; i < this._refuelStationAvailability.length; i++) {
        var itm = this._refuelStationAvailability[i];
        if (((itm.eco.length > 0 && itm.eco.indexOf(ecoID) >= 0)) && // || itm.eco.length === 0
            ((itm.gov.length > 0 && itm.gov.indexOf(govID) >= 0)) && // || itm.gov.length === 0
            ((itm.tl >= 0 && tl >= itm.tl) || itm.tl === -1)) {item = itm; break;}
    }
    return item;
}
//-------------------------------------------------------------------------------------------------------------
// checks for a fuel ration system override, returns item or null
this.$checkRefuelStationSystemOverride = function(sysID) {
    if (this._refuelStationSystemOverride.length > 0) {
        for (var i = 0; i < this._refuelStationSystemOverride.length; i++) {
            if (this._refuelStationSystemOverride[i].systemID === sysID) return this._refuelStationSystemOverride[i];
        }
    }
    return null;
}
//-------------------------------------------------------------------------------------------------------------
// returns the refuel station cost factor for this system
this.$getRefuelStationCostFactor = function(sysID) {
	if (!sysID) sysID = system.ID;
	var sys = System.infoForSystem(galaxyNumber, sysID);
    // check for an override
    var ovr = this.$checkRefuelStationSystemOverride(sysID);
    if (ovr) return ovr.factor;
    // start with the default
    var result = this._refuelStationCostFactor;
    // see if there's something in the register
    var item = this.$getRefuelStationAvailabilityItem(sys.economy, sys.government, sys.techlevel);
    if (item != null) {
        result = parseFloat(item.factor);
    }
    return result;
}
//-------------------------------------------------------------------------------------------------------------
this.$update = function() {
    this._fuelAllegiance = [];
    var set = 1;
    for (var i = 0; i < this._allegiances.length; i++) {
        if (this._fuelAllegiances & set) {
            this._fuelAllegiance.push(this._allegiances[i])
        }
        set *= 2;
    }
    // fuel availability
    var fa = {
        eco:[],
        gov:[],
        tl:(this._defaultMinTL - 1),
        useRation:this._fuelUseRations,
        maxRation:this._maxFuelRation
    };
    var set = 1;
    for (var i = 0; i < this._govs.length; i++) {
        if (this._fuelGovs & set) {
            fa.gov.push(i)
        }
        set *= 2;
    }
    var set = 1;
    for (var i = 0; i < this._ecos.length; i++) {
        if (this._fuelEcos & set) {
            fa.eco.push(i)
        }
        set *= 2;
    }
    
    if (this._fuelAvailability.length >= 1) {
        this._fuelAvailability[0] = fa;
    } else {
        this._fuelAvailability.push(fa);
    }
    this._refuelStationCostFactor = this.$decPlaces(this._refuelStationCostFactor, 2);
    // refuel stations
    var rs = {
        eco:[],
        gov:[],
        tl:(this._defaultRSMinTL - 1),
        factor:this._refuelStationCostFactor
    }
    var set = 1;
    for (var i = 0; i < this._govs.length; i++) {
        if (this._refuelGovs & set) {
            rs.gov.push(i)
        }
        set *= 2;
    }
    var set = 1;
    for (var i = 0; i < this._ecos.length; i++) {
        if (this._refuelEcos & set) {
            rs.eco.push(i)
        }
        set *= 2;
    }
    if (this._refuelStationAvailability.length >= 1) {
        this._refuelStationAvailability[0] = rs;
    } else {
        this._refuelStationAvailability.push(rs);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$decPlaces = function (number, places) {
	if (!places || places < 0) places = 0;
	if (!number) return 0;
	return ((Math.round(number * Math.pow(10, places))) / Math.pow(10, places));
}
//-------------------------------------------------------------------------------------------------------------
this.$updateBitwiseValues = function() {
    var bitVals = [1, 2, 4, 8, 16, 32, 64, 128, 256];
    this._fuelAllegiances = 0;
    for (var i = 0; i < this._fuelAllegiance.length; i++) {
        var idx = this._allegiances.indexOf(this._fuelAllegiance[i]);
        this._fuelAllegiances += bitVals[idx];
    }
    this._fuelGovs = 0;
    this._fuelEcos = 0;
    if (this._fuelAvailability.length > 0) {
        for (var i = 0; i < this._fuelAvailability[0].gov.length; i++) {
            this._fuelGovs += bitVals[(this._fuelAvailability[0].gov[i])];
        }
        for (var i = 0; i < this._fuelAvailability[0].eco.length; i++) {
            this._fuelEcos += bitVals[(this._fuelAvailability[0].eco[i])];
        }
    }
    this._refuelGovs = 0;
    this._refuelEcos = 0;
    if (this._refuelStationAvailability.length > 0) {
        for (var i = 0; i < this._refuelStationAvailability[0].gov.length; i++) {
            this._refuelGovs += bitVals[(this._refuelStationAvailability[0].gov[i])];
        }
        for (var i = 0; i < this._refuelStationAvailability[0].eco.length; i++) {
            this._refuelEcos += bitVals[(this._refuelStationAvailability[0].eco[i])];
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
// resets all fuel-related data
this.$reset = function() {
    this._saveSettings = false;    
    this._fuelNormal = true;
    this._npcUseStations = false;
    this._fuelUseRations = false;
    this._fuelAvailability = [{eco:[0,1,2,3,4,5,6,7],gov:[0,1,2,3,4,5,6,7],tl:0,rations:false,max:1}];
    this._maxFuelRation = 1;
    this._fuelAllegiance = ["galcop"];
    this._fuelSystemOverride = [];
    this._refuelStationAvailability = [{eco:[0,1,2,3,4,5,6,7],gov:[0,1,2,3,4,5,6,7],tl:0,factor:0.15}];
    this._refuelStationSystemOverride = [];
    this._refuelStationCostFactor = 0.15
    this._defaultRSMinTL = 0;
    this._emergencyFuel = [];
    delete missionVariables.FuelTweaks_FuelAvailability;
    delete missionVariables.Fuel
    delete missionVariables.FuelTweaks_Allegiance;
    delete missionVariables.FuelTweaks_FuelSystemOverride;;
    delete missionVariables.FuelTweaks_RefuelStationAvailability;
    delete missionVariables.FuelTweaks_RefuelStationSystemOverride;
    delete missionVariables.FuelTweaks_RefuelStationCostFactor;
    delete missionVariables.FuelTweaks_RefuelStationMinTL;
    delete missionVariables.FuelTweaks_Normal;
    this.$updateBitwiseValues();
}
//-------------------------------------------------------------------------------------------------------------
this.$governmentDescription = function $governmentDescription(gov) {
	switch (gov) {
		case 0: return expandMissionText("FT_government_anarchy");
		case 1: return expandMissionText("FT_government_feudal");
		case 2: return expandMissionText("FT_government_multigov");
		case 3: return expandMissionText("FT_government_dictatorship");
		case 4: return expandMissionText("FT_government_communist");
		case 5: return expandMissionText("FT_government_confederacy");
		case 6: return expandMissionText("FT_government_democracy");
		case 7: return expandMissionText("FT_government_corpstate");
	}
}
//-------------------------------------------------------------------------------------------------------------
this.$economyDescription = function $economyDescription(eco) {
	if (worldScripts["market_tweak.js"]) {
		switch (eco) {
			case 0: return expandMissionText("FT_SW_extremeind");
			case 1: return expandMissionText("FT_SW_strongind");
			case 2: return expandMissionText("FT_SW_commonind");
			case 3: return expandMissionText("FT_SW_mainlyind");
			case 4: return expandMissionText("FT_SW_mainlyag");
			case 5: return expandMissionText("FT_SW_commonag");
			case 6: return expandMissionText("FT_SW_strongag");
			case 7: return expandMissionText("FT_SW_extremeag");
		}
	} else {
		switch (eco) {
			case 0: return expandMissionText("FT_economy_richind");
			case 1: return expandMissionText("FT_economy_averageind");
			case 2: return expandMissionText("FT_economy_poorind");
			case 3: return expandMissionText("FT_economy_mainlyind");
			case 4: return expandMissionText("FT_economy_mainlyag");
			case 5: return expandMissionText("FT_economy_richag");
			case 6: return expandMissionText("FT_economy_averageag");
			case 7: return expandMissionText("FT_economy_poorag");
		}
	}
}
//-------------------------------------------------------------------------------------------------------------
// this ensures our overrides to EQ_FUEL will get included if Isis Interstellar wins the install race
// if, instead, we win, the Isis script wouldn't be called for EQ_FUEL anyway.
this.$updateIsisEquipment = function() {
    if (worldScripts["oolite-II"]) {
        var ii = worldScripts["oolite-II"];
        ii.$hold_allowAwardEquipment = ii.II_allowAwardEquipment;
        ii.II_allowAwardEquipment = this.$II_allowAwardEquipment;
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$II_allowAwardEquipment = function(equipment, ship, context) {
	if (context == "scripted") return true;
    if (equipment === "EQ_FUEL") {
        if (system.ID === -1) return true;
        var fe = worldScripts.FuelTweaks_FuelEconomy;
        if (fe._fuelNormal === true) return true;
        if (fe.$isFuelAvailable() === true && fe.$fuelRationsInUse() === false && fe.$isRefuelStationAvailable() === false) return true;
        return false;
    }
    return this.$hold_allowAwardEquipment(equipment, ship, context);
}
 | 
                
                    | Scripts/fuelTweaks_quirium.js | "use strict";
this.name = "FuelTweaks_Quirium";
this.author = "phkb";
this.copyright = "2017 phkb";
this.description = "Routines for controlling the collection, sale and transport of scooped Quirium fuel";
this.licence = "CC BY-NC-SA 4.0";
/*
    TODO:
        firing on, or using ecm near, to a cargo pod with Quirium inside will result in a cascade explosion
*/
this._scoopDistanceTimer = null;
this._damagedStorage = 0;
this._preProcessAmount = 0;
this._scoopProcess = 0;
this._fuelScoopStorage = false;
this._chs = false;
this._mo_timer = null;
this._purchase = {};
this._minAmount = 0.1;
this._shipConfig = false;
this._scEquip = [];
this._itemColor = "yellowColor";
this._menuColor = "orangeColor";
this._exitColor = "yellowColor";
this._disabledColor = "darkGrayColor";
this._startCount = 0;
this._secondTimer = null;
this._transferTimer = null;
this._destructTimer = null;
this._damageChance = 0.02; // 0.05 0.1;
this._destructCounter = 0;
this._destructPhase = 0;
this._oneTAmount = 7;                       /// amount of scooped fuel that will be considered "1t"
//this._dumpQuirium = null;
//-------------------------------------------------------------------------------------------------------------
this.startUpComplete = function () {
    if (missionVariables.FuelTweaks_PreProcessAmount) this._preProcessAmount = missionVariables.FuelTweaks_PreProcessAmount;
    if (missionVariables.FuelTweaks_ScoopProcess) this._scoopProcess = missionVariables.FuelTweaks_ScoopProcess;
    if (worldScripts["Coronal Harvester Script"]) this._chs = true;
    if (worldScripts.ShipConfiguration_Core) {
        this._shipConfig = true;
    }
    if (worldScripts["Fuel Collector"]) {
        worldScripts["Fuel Collector"].$CruiseCheck = this.$fuelCollector_CruiseCheck;
        worldScripts["Fuel Collector"].$checkifover01 = this.$fuelCollector_checkifover01;
    }
    this.$initInterface(player.ship.dockedStation);
}
//-------------------------------------------------------------------------------------------------------------
this.shipLaunchedFromStation = function (station) {
    if (player.ship.equipmentStatus("EQ_FUEL_PROCESSOR") === "EQUIPMENT_OK") {
        this._scoopDistanceTimer = new Timer(this, this.$monitorPlayer, 5, 5);
    }
    if (this._shipConfig === true) {
        var sc = worldScripts.ShipConfiguration_Core;
        var eq = EquipmentInfo.infoForKey(sc.$equipmentItemInUse("fuelscoops", player.ship));
        if (eq) this._minAmount = parseFloat(eq.scriptInfo.accumulator_size) + 0.1;
        // grab a copy of sc equipment that will report itself as damaged, so we don't double up during a self-destruct
        this._scEquip = [].concat(sc._engines).concat(sc._boosters).concat(sc._hyperdrive).concat(sc._thrusters)
            .concat(sc._energy).concat(sc._frontshields).concat(sc._aftshields).concat(sc._fuelinjectors)
            .concat(sc._fuelscoops).concat(sc._heatshields);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.playerWillSaveGame = function () {
    missionVariables.FuelTweaks_PreProcessAmount = this._preProcessAmount;
    missionVariables.FuelTweaks_ScoopProcess = this._scoopProcess;
}
//-------------------------------------------------------------------------------------------------------------
this.shipDied = function (whom, why) {
    if (this._scoopDistanceTimer && this._scoopDistanceTimer.isRunning) this._scoopDistanceTimer.stop();
    this._scoopDistanceTimer = null;
    this.$stopTimers();
}
//-------------------------------------------------------------------------------------------------------------
this.shipDockedWithStation = function (station) {
    if (this._scoopDistanceTimer && this._scoopDistanceTimer.isRunning) this._scoopDistanceTimer.stop();
    this._scoopDistanceTimer = null;
    this.$initInterface(station);
    this.$stopTimers();
}
//-------------------------------------------------------------------------------------------------------------
this.equipmentDamaged = function (equipmentKey) {
    // if a full storage container gets damaged, remove a fuel commodity from the player
    if (equipmentKey === "EQ_FUEL_PROCESSOR" || equipmentKey === "EQ_FUEL_STORAGE") {
        var curr = player.ship.manifest["quirium_fuel"];
        var cntr = this.$countOKContainers();
        if (curr > cntr) {
            player.ship.manifest["quirium_fuel"] -= (curr - cntr);
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
this.playerBoughtEquipment = function (equipmentKey) {
    var p = player.ship;
    var refundEq = "";
    if (equipmentKey === "EQ_FUEL_STORAGE_REMOVAL") {
        p.removeEquipment("EQ_FUEL_STORAGE_REMOVAL");
        refundEq = "EQ_FUEL_STORAGE";
    }
    if (equipmentKey === "EQ_FUEL_PROCESSOR_REMOVAL") {
        p.removeEquipment("EQ_FUEL_PROCESSOR_REMOVAL");
        refundEq = "EQ_FUEL_PROCESSOR";
        mission.setInstructions("", this.name);
    }
    if (equipmentKey === "EQ_FUEL_TRANSFER_REMOVAL") {
        p.removeEquipment("EQ_FUEL_TRANSFER_REMOVAL");
        refundEq = "EQ_FUEL_TRANSFER";
    }
    if (equipmentKey === "EQ_FUEL_STORAGE") {
        if (p.equipmentStatus("EQ_FUEL_STORAGE", true)["EQUIPMENT_DAMAGED"] > 0) {
            p.setEquipmentStatus("EQ_FUEL_STORAGE", "EQUIPMENT_OK");
            p.removeEquipment("EQ_FUEL_STORAGE");
        }
    }
    if (equipmentKey === "EQ_FUEL_PROCESSOR") {
        this._preProcessAmount = 0;
        this.$updateManifest();
    }
    if (refundEq !== "") {
        var stn = p.dockedStation;
        var eqSts = p.equipmentStatus(refundEq);
        p.removeEquipment(refundEq);
        var eq = EquipmentInfo.infoForKey(refundEq);
        // refund the cost of the equipment
        if (eqSts === "EQUIPMENT_OK") player.credits += (eq.price / 10) * stn.equipmentPriceFactor;
        if (eqSts === "EQUIPMENT_DAMAGED") player.credits += ((eq.price / 10) * stn.equipmentPriceFactor) / 2;
    }
    if (equipmentKey === "EQ_FUEL_TRANSFER" || equipmentKey === "EQ_FUEL_TRANSFER_REMOVAL") {
        this.$initInterface(player.ship.dockedStation);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.playerBoughtCargo = function (commodity, units, price) {
    if (commodity === "quirium_fuel") {
        var spare = this.$countOKContainers() - player.ship.manifest["quirium_fuel"];
        if (spare < 0) {
            player.consoleMessage(expandMissionText("FT_quirium_unable"), 5);
            player.ship.manifest["quirium_fuel"] -= Math.abs(spare);
            player.ship.dockedStation.setMarketQuantity(commodity, player.ship.dockedStation.market[commodity].quantity + Math.abs(spare));
            player.credits += (Math.abs(spare) * (price / 10));
            if (worldScripts.market_observer3) {
                this._mo_timer = new Timer(this, this.$reverseMOPurchase, 0.5, 0);
                this._purchase = { commodity: commodity, units: units, price: price };
            }
            return;
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
this.shipLaunchedEscapePod = function (escapepod) {
    this.$stopTimers();
}
//-------------------------------------------------------------------------------------------------------------
this.shipScoopedFuel = function () {
    if (this._fuelScoopStorage === true) {
        // send this fuel to storage
        this._preProcessAmount += this._minAmount;
        this.$updateManifest();
        // display some status info ... somewhere ...
        var checkCalc = parseInt(Math.abs(parseFloat(this._preProcessAmount) - parseFloat(this._oneTAmount) * ((this._scoopProcess + 1) * 0.25)) * 100);
        var p = player.ship;
        if (this._scoopProcess === 2 && checkCalc <= 5) {
            player.consoleMessage(expandMissionText("FT_quirium_scoop", { amount: "75%" }), 5);
            this._scoopProcess += 1;
        }
        if (this._scoopProcess === 1 && checkCalc <= 5) {
            player.consoleMessage(expandMissionText("FT_quirium_scoop", { amount: "50%" }), 5);
            this._scoopProcess += 1;
        }
        if (this._scoopProcess === 0 && checkCalc <= 5) {
            player.consoleMessage(expandMissionText("FT_quirium_scoop", { amount: "25%" }), 5);
            this._scoopProcess += 1;
        }
        if (this._preProcessAmount >= this._oneTAmount) {
            p.manifest["quirium_fuel"] += 1;
            this._preProcessAmount = 0;
            this._scoopProcess = 0;
            this.$updateManifest();
            player.consoleMessage(expandMissionText("FT_quirium_processed"), 5);
            // add an extra blank line otherwise the "Fuel scoop active" message will overwrite it
            var curr = p.manifest["quirium_fuel"];
            var cntr = this.$countOKContainers();
            if (curr === cntr) {
                this._fuelScoopStorage = false;
                player.consoleMessage(expandMissionText("FT_quirium_halted"), 5);
                return;
            }
            if (p.cargoSpaceAvailable === 0) {
                this._fuelScoopStorage = false;
                player.consoleMessage(expandMissionText("FT_quirium_capacity"), 5);
                return;
            }
        }
        // subtract the amount from the player's fuel so 
        p.fuel -= this._minAmount;
    }
}
//-------------------------------------------------------------------------------------------------------------
this.shipScoopedOther = function (whom) {
    if (whom.isCargo && whom.commodity === "quirium_fuel") {
        // we automatically gain an qfsu whenever we scoop quirium fuel
        var p = player.ship;
        p.awardEquipment("EQ_FUEL_STORAGE");
        /*var curr = p.manifest["quirium_fuel"];
        var cntr = this.$countOKContainers();
        if (curr > cntr) {
            // if we don't have any quirium on board, but we do have a processor, we don't need to add a separate fuel storage unit
            if (curr === 0 && player.ship.equipmentStatus("EQ_FUEL_PROCESSOR") === "EQUIPMENT_OK") return;
            var diff = curr - cntr;
            //this._dumpQuirium = new Timer(this, this.$dumpQuirium, 1, 0);
            // player picks up fuel storage unit with the fuel if they don't have enough of them 
            for (var i = 0; i < diff; i++) {
                p.awardEquipment("EQ_FUEL_STORAGE");
            }
        }*/
    }
}
//-------------------------------------------------------------------------------------------------------------
this.shipDumpedCargo = function (cargo) {
    if (cargo.commodity === "quirium_fuel") {
        // if we just dumped quirium, we dumped the storage unit with it.
        var result = player.ship.removeEquipment("EQ_FUEL_STORAGE");
    }
}
//-------------------------------------------------------------------------------------------------------------
// not used any more, but kept just in case
/*this.$dumpQuirium = function $dumpQuirium() {
    player.consoleMessage("Unable to store Quirium Fuel safely - auto-ejecting cargo!", 5);
    // hopefully this will dump the just-scooped entity
    player.ship.dumpCargo(1, "quirium_fuel");
}*/
//-------------------------------------------------------------------------------------------------------------
// start the process (after second press)
this.activated = function () {
    if (player.ship.fuel === 7) {
        player.consoleMessage(expandMissionText("FT_quirium_full"));
        return;
    }
    if (player.ship.manifest["quirium_fuel"] === 0) {
        player.consoleMessage(expandMissionText("FT_quirium_nostorage"));
        return;
    }
    var ft = worldScripts.FuelTweaks_Quirium;
    // stop the process, if it's running
    if (ft._transferTimer && ft._transferTimer.isRunning) { ft.mode(); return; }
    // ask the player again before starting
    if (this._startCount === 0) {
        this._startCount = 1;
        ft._secondTimer = new Timer(ft, ft.$cancelStart, 20, 0);
        player.consoleMessage(expandMissionText("FT_quirium_activateagain"));
        return;
    }
    // ok we're really starting now
    if (this._startCount === 1) {
        this._startCount = 0;
        if (ft._secondTimer.isRunning) ft._secondTimer.stop();
        ft._transferTimer = new Timer(ft, ft.$doFuelTransfer, 2, 2);
        player.consoleMessage(expandMissionText("FT_quirium_tfrstarted"), 2);
    }
}
//-------------------------------------------------------------------------------------------------------------
// stop process
this.mode = function () {
    var ft = worldScripts.FuelTweaks_Quirium;
    if (ft._transferTimer && ft._transferTimer.isRunning) {
        player.ship.manifest["quirium_fuel"] -= 1;
        ft._damageChance = 0.02;
        ft._transferTimer.stop();
        player.consoleMessage(expandMissionText("FT_quirium_tfrstopped"));
    }
}
//-------------------------------------------------------------------------------------------------------------
this.playerStartedJumpCountdown = this.shipWillEnterWitchspace = function () {
    // starting a witchspace jump, or entering a wormhole, should now automatically stop any transfer in progress
    this.mode();
}
//-------------------------------------------------------------------------------------------------------------
this.$cancelStart = function $cancelStart() {
    this._startCount = 0;
}
//-------------------------------------------------------------------------------------------------------------
this.$doFuelTransfer = function $doFuelTransfer() {
    var p = player.ship;
    if (p.equipmentStatus("EQ_FUEL_TRANSFER") === "EQUIPMENT_DAMAGED") {
        this.mode();
        return;
    }
    p.fuel += 0.1;
    if (p.fuel >= 7) {
        p.fuel = 7;
        player.consoleMessage(expandMissionText("FT_quirium_complete"));
        this.mode();
        return;
    }
    player.consoleMessage("Fuel transfer in progress", 1.5);
    // will there be damage?
    if (Math.random() < this._damageChance) {
        // yes there is
        // but what type?
        var type = Math.random();
        if (type >= 0 && type < 0.76) {
            // cargo - grab a copy of the array
            var c = p.manifest.list.splice(0);
            // sort it randomly
            c.sort(function (a, b) { return Math.random() - 0.5; });
            var amt = 0;
            var cmdty = "";
            var unit = "t";
            for (var i = 0; i < c.length; i++) {
                if (c[i].quantity > 0 && c[i].unit === "t") {
                    amt = 1;
                    cmdty = c[i].commodity;
                    p.manifest[c[i].commodity] -= 1;
                    break;
                }
                if (c[i].quantity > 0 && c[i].unit !== "t") {
                    amt = Math.floor(Math.random() * c[i].quantity) + 1;
                    cmdty = c[i].commodity;
                    unit = c[i].unit;
                    p.manifest[c[i].commodity] -= amt;
                    break;
                }
            }
            if (cmdty != "") {
                player.consoleMessage(expandMissionText("FT_quirium_warning", { amount: amt, unit: unit, commodity: displayNameForCommodity(cmdty) }));
                var mySound = new SoundSource;
                mySound.sound = "[player-scrape-damage]";
                mySound.loop = false;
                mySound.play();
                // check to see if we've destroyed all the stored quirium fuel 
                if (cmdty === "quirium_fuel" && p.manifest[cmdty] === 0) {
                    this._damageChance = 0.02;
                    this._transferTimer.stop();
                    player.consoleMessage(expandMissionText("FT_quirium_insufficient"));
                }
            } else {
                // theoretically this can never happen - if there's no cargo to destroy, then there's
                // no quirium fuel left, so the process should have been stopped in the clause above
                type = 0.6; // switch to equipment damage if no cargo available
            }
        }
        if (type >= 0.76 && type < 0.9995) {
            // equipment
            this.$performEquipmentDamage();
        }
        if (type >= 0.9995) {
            this._transferTimer.stop();
            p.script._findMe = true;
            // oh dear - the ship!
            player.consoleMessage(expandMissionText("FT_quirium_failure"));
            // start the self-destruct sequence
            this._destructPhase = 0;
            this._destructTimer = new Timer(this, this.$destructSequence, 2, 2);
            // slowly damage every equipment item
            // turn off hud and replace with custom one that only has console at top left corner
            // show a brief series of error messages then either (a) eject the player or (b) destroy their ship.
        }
    }
    this._damageChance += 0.01; // slowly increate the damage chance.
}
this.$testDestruct = function () {
    // oh dear - the ship!
    player.consoleMessage(expandMissionText("FT_quirium_failure"));
    // start the self-destruct sequence
    this._destructPhase = 0;
    this._destructTimer = new Timer(this, this.$destructSequence, 2, 2);
}
//-------------------------------------------------------------------------------------------------------------
this.$destructSequence = function $destructSequence() {
    this.$performEquipmentDamage();
    this._destructCounter += 1;
    if (this._destructCounter > 8) {
        // switch off hud
        this._storeHUD = player.ship.hud;
        player.ship.hud = "destruct_hud.plist";
        // unbreak the breakable IFF scanner (if present and damaged) so the final sequence display is shown clearly
        if (player.ship.equipmentStatus("EQ_BREAKABLE_HUD_IFF_SCANNER") === "EQUIPMENT_DAMAGED") player.ship.setEquipmentStatus("EQ_BREAKABLE_HUD_IFF_SCANNER", "EQUIPMENT_OK");
        this._destructPhase = 1;
        this._destructTimer.stop();
        this._destructCounter = 0;
        this._destructTimer = new Timer(this, $destructFinalSequence, 1, 1);
    }
}
//-------------------------------------------------------------------------------------------------------------
// we're doing this manually, rather than using takeInternalDamage, so we can (a) exclude some items, and (b) only damage equipment
this.$performEquipmentDamage = function () {
    // list of equipment items we don't want to damage (either because they're critical to gameplay, or it just doesn't make sense)
    var noDamage = ["EQ_HULL_REPAIR"];
    var p = player.ship;
    // grab a copy of the equipment list
    var eq = p.equipment.slice(0);
    // randomly sort the list
    eq.sort(function (a, b) { return Math.random() - 0.5; });
    for (var i = 0; i < eq.length; i++) {
        var eqItem = eq[i];
        // find an item to damage (but not the escape pod)
        if (noDamage.indexOf(eqItem.equipmentKey) === -1 && eqItem.provides.indexOf("EQ_ESCAPE_POD") === -1 && p.equipmentStatus(eqItem.equipmentKey) == "EQUIPMENT_OK" && eqItem.damageProbability != 0 && eqItem.isVisible == true && Math.random() <= eqItem.damageProbability) {
            p.setEquipmentStatus(eqItem.equipmentKey, "EQUIPMENT_DAMAGED");
            if (this._scEquip.indexOf(eqItem.equipmentKey) === -1) {
                player.consoleMessage(expandMissionText("FT_quirium_damage", { equipment: eqItem.name }));
            }
            var mySound = new SoundSource;
            mySound.sound = "[player-scrape-damage]";
            mySound.loop = false;
            mySound.play();
            break;
        }
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$destructFinalSequence = function $destructFinalSequence() {
    var msg = [
        "",
        expandMissionText("FT_destruct_seq_1"),
        expandMissionText("FT_destruct_seq_2"),
        expandMissionText("FT_destruct_seq_3"),
        expandMissionText("FT_destruct_seq_4"),
        expandMissionText("FT_destruct_seq_5"),
        expandMissionText("FT_destruct_seq_6")
    ];
    this._destructCounter += 1;
    if (this._destructCounter < msg.length) {
        player.consoleMessage(msg[this._destructCounter]);
        return;
    }
    if (this._destructCounter >= msg.length) {
        if (this._destructPhase === 1) this._destructPhase = 2;
        if (this._destructPhase === 2 && player.ship.hasEquipmentProviding("EQ_ESCAPE_POD") === "EQUIPMENT_OK") {
            player.consoleMessage(expandMissionText("FT_destruct_autoeject"));
            player.ship.throwSpark();
            this._destructPhase = 3;
            player.ship.abandonShip();
            return;
        }
        this._destructTimer.stop();
        this._explodeTimer = new Timer(this, this.$explodeShip, 0.25, 0);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$explodeShip = function $explodeShip() {
    this.$stopTimers();
    player.ship.explode();
    player.ship.hud = this._storeHUD;
}
//-------------------------------------------------------------------------------------------------------------
this.$stopTimers = function () {
    if (this._secondTimer && this._secondTimer.isRunning) this._secondTimer.stop();
    if (this._transferTimer && this._transferTimer.isRunning) this.mode();
    if (this._scoopDistanceTimer && this._scoopDistanceTimer.isRunning) this._scoopDistanceTimer.stop();
    if (this._destructTimer && this._destructTimer.isRunning) this._destructTimer.stop();
    //if (this._dumpQuirium && this._dumpQuirium.isRunning) this._dumpQuirium.stop();
}
//-------------------------------------------------------------------------------------------------------------
// initialise the F4 screen entries
this.$initInterface = function (station) {
    if (player.ship.equipmentStatus("EQ_FUEL_TRANSFER") === "EQUIPMENT_OK") {
        station.setInterface(this.name, {
            title: expandMissionText("FT_quirium_title"),
            category: expandDescription("[interfaces-category-ship-systems]"),
            summary: expandMissionText("FT_quirium_summary"),
            callback: this.$showScreen.bind(this)
        });
    } else {
        station.setInterface(this.name, null);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$showScreen = function () {
    var text = "";
    if (player.ship.manifest["quirium_fuel"] === 0 || player.ship.fuel === 7) {
        text = expandMissionText("FT_quirium_noneavail");
        if (player.ship.fuel === 7) text = expandMissionText("FT_quirium_notrequired");
        mission.runScreen({
            screenID: "oolite-quirium-fuel-map",
            title: expandMissionText("FT_quirium_title"),
            overlay: { name: "fuelTweaks_pump.png", height: 546 },
            message: text,
            exitScreen: "GUI_SCREEN_INTERFACES"
        });
    } else {
        text = expandMissionText("FT_quirium_confirm", { amount: (7 - player.ship.fuel) });
        var curChoices = {};
        curChoices["01_YES"] = { text: expandMissionText("FT_quirium_proceed"), color: this._menuColor };
        curChoices["02_NO"] = { text: expandMissionText("FT_quirium_return"), color: this._menuColor };
        var opts = {
            screenID: "oolite-quirium-transfer-map",
            title: expandMissionText("FT_quirium_confirm_title"),
            overlay: { name: "fuelTweaks_pump.png", height: 546 },
            allowInterrupt: true,
            exitScreen: "GUI_SCREEN_INTERFACES",
            choices: curChoices,
            initialChoicesKey: "02_NO",
            message: text
        };
        mission.runScreen(opts, this.$screenHandler, this);
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$screenHandler = function (choice) {
    if (!choice) return;
    if (choice === "01_YES") {
        var amt = 7 - player.ship.fuel;
        player.ship.fuel = 7;
        player.ship.manifest["quirium_fuel"] -= 1;
        player.consoleMessage(expandMissionText("FT_quirium_result", { amount: amt }));
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$reverseMOPurchase = function () {
    var mo = worldScripts.market_observer3;
    mo.playerSoldCargo(this._purchase.commodity, this._purchase.units, this._purchase.price);
    this._purchase = {};
}
//-------------------------------------------------------------------------------------------------------------
this.$monitorPlayer = function $monitorPlayer() {
    var p = player.ship;
    if (this.$playerWithinFuelScoopRange() === true) {
        // if it's already on, don't start it again
        if (this._fuelScoopStorage === true) return;
        // stay out of the way of the coronal harvester
        if (this._chs) {
            var chs = worldScripts["Coronal Harvester Script"];
            if (chs._vicinitySunTimer && chs._vicinitySunTimer.isRunning) return;
        }
        // do we have a processor?
        if (p.equipmentStatus("EQ_FUEL_PROCESSOR") === "EQUIPMENT_OK") {
            // how much space do we have?
            var curr = p.manifest["quirium_fuel"];
            var cntr = this.$countOKContainers();
            // if we have spare containers, and our fuel tanks are full, we can turn on the storage process
            if (curr < cntr && p.fuel >= 7 && p.cargoSpaceAvailable > 0) {
                // we have free space
                // enable some scooping action
                this._fuelScoopStorage = true;
                p.fuel -= this._minAmount;
            }
        }
    } else {
        // if the fuel process was active, and we're about to turn it off, make sure we give the player their fuel back.
        if (this._fuelScoopStorage === true) player.ship.fuel = 7;
        this._fuelScoopStorage = false;
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$playerWithinFuelScoopRange = function () {
    if (!system.sun) return false;
    if (((system.sun.collisionRadius * system.sun.collisionRadius) / system.sun.position.squaredDistanceTo(player.ship.position)) > 0.75) return true;
    return false;
}
//-------------------------------------------------------------------------------------------------------------
// returns the number of fuel containers
this.$countFuelContainers = function () {
    var fc = 0;
    var eq = player.ship.equipment;
    for (var i = 0; i < eq.length; i++) {
        if (eq[i].equipmentKey === "EQ_FUEL_STORAGE") fc += 1;
    }
    return fc;
}
//-------------------------------------------------------------------------------------------------------------
this.$countOKContainers = function () {
    if (player.ship && player.ship.equipmentStatus("EQ_FUEL_STORAGE", true) != undefined) {
        return player.ship.equipmentStatus("EQ_FUEL_STORAGE", true)["EQUIPMENT_OK"] + (player.ship.equipmentStatus("EQ_FUEL_PROCESSOR") === "EQUIPMENT_OK" ? 1 : 0);
    } else {
        return 0;
    }
}
//-------------------------------------------------------------------------------------------------------------
// fuel collector function overrides to enable fuel collection interface
this.$fuelCollector_checkifover01 = function (fuel_award) {
    this.fuel_below01 += fuel_award;
    var ftq = worldScripts.FuelTweaks_Quirium;
    if (this.fuel_below01 > 1000) {
        // only do something if we're /not/ in fuel scoop range of the sun
        // when we're in scoop range of the sun, the fuel scoop itself will take over
        if (ftq.$playerWithinFuelScoopRange() === false) {
            // if we have full fuel, pass the quirium over to the quirium fuel accumulator
            if (player.ship.fuel === 7) {
                var curr = player.ship.manifest["quirium_fuel"];
                var cntr = ftq.$countOKContainers();
                // are we in fuel scooping range?
                if (ftq._fuelScoopStorage === false && curr < cntr) {
                    ftq._fuelScoopStorage = true;
                    player.consoleMessage(expandMissionText("FT_fuelcollector_quirium"), 10);
                    player.consoleMessage(expandMissionText("FT_gathered"), 10);
                    ftq.shipScoopedFuel();
                    player.ship.fuel = 7;
                    ftq._fuelScoopStorage = false;
                }
            } else if (player.ship.fuel < 7) {
                // otherwise, it's just the normal fuel collector process here.
                player.ship.fuel += 0.1;
                player.consoleMessage(expandMissionText("FT_fuelcollector"), 10);
                player.consoleMessage(expandMissionText("FT_gathered"), 10);
            }
        }
        this.fuel_below01 -= 1000;
    }
}
//-------------------------------------------------------------------------------------------------------------
this.$fuelCollector_CruiseCheck = function () {
    if (player.ship.docked) {
        this.CruiseCheckTimer.stop()
        return // return because we really dont need more checking from here
        //return also saves a few cycles, instead of having the CPU do 3 extra Compares it just jumps to an address in memory
    }
    //if(this.tonearplanet) //if it is zero, then return
    //return
    // we never got here if the fuel collector was not started in the first place which is why
    // we can use explicit OR	
    if (player.ship.equipmentStatus("EQ_FRAME_FUEL_COLLECTOR") != "EQUIPMENT_OK" || player.ship.equipmentStatus("EQ_FUEL_SCOOPS") != "EQUIPMENT_OK") { //is EQ damaged ?
        this.CruiseCheckTimer.stop() // should we stop or keep it running, in order for it to be repaired..
        //i'd say performance is of the essense here, therefore we kill it until next witchspace / station launch
        return // return because we really dont need more checking from here
    }
    //player.ship.consoleMessage("entering cruisecheck", 3) // for testing
    //if(system.isInterstellarSpace) //some person in the future might add a sun in interstellar space
    if (!system.sun) {
        //so if there is a sun present, it will activate the crusing mode collector	
        if (this.ispaceswitch && this.firstrun) {
            this.ispaceswitch = false
            this.firstrun = false
            player.consoleMessage(expandMissionText("FT_fuelcollector"), 3)
            player.consoleMessage(expandMissionText("FT_interstellar_maxspeed"), 3)
        }
        //if there is not a sun there it will extract whatever it can from its surroundings..
        //however only as long as the player is at max speed.
        if (player.ship.speed == player.ship.maxSpeed)
            this.$checkifover01(this.fuel_level_1 * Math.random())
        return
    } else {
        //what distance are we at to the star
        // to close and it will shutdown, to far away it will collect very little
        /* a notice on why it shuts down, when to close
    	
        due to the fine filter of the fuel collector, it will shut down when it
        gets to close to the star so that the filter is having a chance of getting
        cleaned by the subsequent cleaning, which in effect harvest the fuel from
        the filter
    	
        The fuel scoop will then take over shortly after..
        */
        let sun_distance = player.ship.position.distanceTo(system.sun) + system.sun.radius
        /* This is the old shut off if to close to sun..
        // this however didnt take into consideration, the proximity to the planet
        */
        if ((player.ship.speed > player.ship.maxSpeed) || (7 == player.ship.fuel && !worldScripts.FuelTweaks_Quirium)) {//|| means explicit or // injector or warp speed
            return // return because we really dont need more checking from here
        }
        let distancemodifier = 10
        if (sun_distance < this.averagesun)
            distancemodifier = 30
        if (sun_distance < this.nearsun)
            distancemodifier = 50 //this is near the filters saturation limit,..
        let speedp = 100 / player.ship.maxSpeed * player.ship.speed
        if (speedp > 89) {
            this.$checkifover01(this.fuel_level_4 + distancemodifier)
            //player.consoleMessage("speed over 89 %", 3) // for testing
            return
        }
        if (speedp > 49) {
            this.$checkifover01(this.fuel_level_3 + distancemodifier)
            //player.consoleMessage("speed over 49 %",3) // for testing
            return
        }
        if (speedp > 19) {
            this.$checkifover01(this.fuel_level_2 + distancemodifier)
            //player.consoleMessage("speed over 19 %",3) // for testing
            return
        }
    }
}
this.$updateManifest = function $updateManifest() {
    mission.setInstructions(expandMissionText("FT_quirium_instructions", {status: (parseFloat(this._preProcessAmount / this._oneTAmount) * 100).toFixed(1)}), this.name);
} |