Back to Index Page generated: Jun 29, 2025, 6:16:42 AM

Expansion Fuel Station Facelift

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Updates the models and textures of Fuel Stations and Fuel Satellites. Updates the models and textures of Fuel Stations and Fuel Satellites.
Identifier oolite.oxp.phkb.FuelStation_Facelift oolite.oxp.phkb.FuelStation_Facelift
Title Fuel Station Facelift Fuel Station Facelift
Category Retextures Retextures
Author phkb, Thargoid phkb, Thargoid
Version 1.1 1.1
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
  • oolite.oxp.Thargoid.FuelStation:2.3
  • oolite.oxp.Thargoid.FuelStation:2.3
  • Optional Expansions
    Conflict Expansions
    Information URL http://wiki.alioth.net/index.php/Fuel_Station_OXP n/a
    Download URL https://wiki.alioth.net/img_auth.php/2/20/FuelStation_Facelift.oxz n/a
    License Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license with clauses - see readme file Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license with clauses - see readme file
    File Size n/a
    Upload date 1746849213

    Documentation

    Also read http://wiki.alioth.net/index.php/Fuel%20Station%20Facelift

    Equipment

    This expansion declares no equipment.

    Ships

    This expansion declares no ships.

    Models

    This expansion declares no models.

    Scripts

    Path
    Config/script.js
    "use strict";
    this.name = "FuelStation_Facelift";
    this.author = "phkb";
    this.copyright = "CC-BY-NA-NC 4.0";
    this.description = "Holds variables for the alert fx";
    
    this._fxScale = 0.2;
    this._fxForward = 200;
    this._fxUp = 20;
    
    this.startUpComplete = function() {
        if (worldScripts.WireframeShipImages) {
            var ws = worldScripts.WireframeShipImages;
            ws._gameShips["Fuel Station"] = "fuel_station2";
        }
    }
    Scripts/fuelStation_alertFX.js
    "use strict";
    this.name = "fuelStation_alertFX";
    this.author = "Svengali & Thargoid, phkb";
    this.copyright = "CC-by";
    this.description = "FX script";
    this.version = "1.0";
    
    this.effectSpawned = function () {
    	var scr = worldScripts.FuelStation_Facelift;
    	this.getRid = 0;
    	// size and align ve
    	this.visualEffect.scale(scr._fxScale);
    	var p = player.ship;
        this.visualEffect.position = p.position.add(p.vectorForward.multiply(scr._fxForward)).add(p.vectorUp.multiply(scr._fxUp));
    	this.visualEffect.orientation = p.orientation;
    	// start the frame callback
    	this.ovFCBID = addFrameCallback(this.repos.bind(this));
    }
    
    this.effectRemoved = function () {
    	removeFrameCallback(this.ovFCBID);
    }
    
    this.repos = function (delta) {
    	var p = player.ship;
    	if (!p.isValid || this.getRid > 6) {
    		this.visualEffect.remove();
    		return;
    	}
    	var scr = worldScripts.FuelStation_Facelift;
    
        this.visualEffect.position = p.position.add(p.vectorForward.multiply(scr._fxForward)).add(p.vectorUp.multiply(scr._fxUp));
        this.visualEffect.orientation = p.orientation;
    
    	this.getRid += delta;
    	return;
    }
    
    Scripts/fuelStation_satelliteNew.js
    "use strict";
    this.name = "FuelSatellite";
    this.author = "Thargoid";
    this.copyright = "Creative Commons: attribution, non-commercial, sharealike with clauses - see readme.txt";
    this.description = "Script for fuel satellite";
    this.version = "2.3";
    
    this.shipSpawned = function () { //  line the station up with the route one. Code borrowed from Anarchies for convenience.
    	this.ship.scannerDisplayColor1 = "greenColor";
    	this.ship.scannerDisplayColor2 = "darkGrayColor";
    
    	if (system.isInterstellarSpace || !system.mainPlanet) { return; }
    	var targetVector = system.mainPlanet.position.subtract(this.ship.position).direction()
    	var angle = this.ship.heading.angleTo(targetVector)
    	var cross = this.ship.heading.cross(targetVector).direction()
    	this.ship.orientation = this.ship.orientation.rotate(cross, -angle);
    	// this.setColour();
    	this.setPrice();
    	this.maxAmount = worldScripts["FuelStation-Setup"].maxSatelliteAmount;
    	this.dispensed = 0;
    }
    
    //this.setColour = function()
    //	{
    //	this.colRand = system.scrambledPseudoRandomNumber(45.32)
    //	colName = "yellowColor";
    //	if(this.colRand < 0.25) { colName = "blueColor"; }
    //	if(this.colRand < 0.75) { colName = "redColor"; }
    //	if(this.colRand > 0.25 && this.colRand < 0.5) { colName = "magentaColor"; }
    //	this.ship.setMaterials({"fuelStation_satellite.png": { diffuse: colName }});
    //	}	
    
    this.setPrice = function () {
    	this.fuelPrice = 0.15 * EquipmentInfo.infoForKey("EQ_FUEL").price * player.ship.fuelChargeRate; // price per 0.1LY of fuel
    	if (system.economy === 0 || system.economy === 5) { this.fuelPrice *= 1.2; } //  rich industrial or agricultural
    	if (system.techLevel > 4 && system.techLevel < 11) { this.fuelPrice *= 1.1; } //  mid-tech level
    	this.fuelPrice = this.decPlaces(this.fuelPrice, 2);
    }
    
    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.playerDetected = function () {
    	if (this.dispensed >= this.maxAmount) {
    		if (this.scanTimer && this.scanTimer.isRunning) this.scanTimer.stop();
    		return;
    	}
    	this.firstMessage = true;
    	this.secondMessage = true;
    	this.thirdMessage = true;
    	this.fuelTransferred = 0; // how many 0.1LY units are transferred
    	this.fuelBill = 0;
    	var msg = "Greetings Commander " + player.name + ". Refuel here for only " + this.decPlaces((10 * this.fuelPrice), 1) + " credits per ly.";
    	if (this.maxAmount < 7) {
    		msg += " Limit of " + this.maxAmount + "ly per ship.";
    	}
    	this.ship.commsMessage(msg, player.ship);
    	if (this.scanTimer) {
    		this.scanTimer.start();
    	} else {
    		this.scanTimer = new Timer(this, this.locatePlayer, 0, 0.50);
    	}
    }
    
    this.locatePlayer = function () {
    	if (!this.ship || !this.ship.isValid || !this.ship.position || !player.ship.isValid) { // if the ship no longer exists but timer is running, e.g. if player has jumped whilst near a satellite into a system without one
    		this.$stopSound();
    		this.playerGone();
    		return;
    	}
    
    	if (this.ship.position.distanceTo(player.ship.position) < 150) { // player ship within 150m of the centre of the satellite
    		if (player.ship.fuel < 7 && this.dispensed < this.maxAmount) {
    			if (player.credits > this.fuelBill) { // player in place, fuel tank not full and credit balance not empty
    				player.ship.fuel += 0.1;
    				this.dispensed += 0.1;
    				this.fuelBill += this.fuelPrice;
    				this.fuelTransferred++;
    
    				if (this.firstMessage) {
    					this.$playSound("fuelflow");
    					player.consoleMessage("Fuel transfer is underway, please come to a halt.", 6);
    					this.firstMessage = false;
    				}
    				return;
    			} else { // not enough funds left
    				if (this.secondMessage) {
    					player.consoleMessage("Insufficient credits remaining for further transfer.", 6);
    					this.$playSound("fuelshutoff");
    					this.secondMessage = false;
    				}
    				return;
    			}
    		} else { // Fuel tank full
    			if (player.ship.fuel < 7) {
    				if (this.thirdMessage) {
    					player.consoleMessage("Ship transfer limit reached.", 6);
    					this.$playSound("fuelshutoff");
    					this.thirdMessage = false;
    				}
    			} else {
    				if (this.thirdMessage) {
    					player.consoleMessage("Fuel tanks are full.", 6);
    					this.$playSound("fuelshutoff");
    					this.thirdMessage = false;
    				}
    			}
    			return;
    		}
    	} else {
    		if (this.fuelTransferred > 0) {
    			this.fuelBill = this.decPlaces(this.fuelPrice * this.fuelTransferred, 1);
    			player.consoleMessage("Summary - " + (this.fuelTransferred / 10) + " ly transferred, " + this.fuelBill + " credits charged.", 6);
    			player.credits -= this.fuelBill;
    			this.fuelTransferred = 0;
    			this.fuelBill = 0;
    			this.firstMessage = true;
    			this.secondMessage = true;
    			this.thirdMessage = true;
    		}
    	}
    }
    
    this.playerWillEnterWitchspace = this.playerGone = function () {
    	if (this.scanTimer) {
    		this.scanTimer.stop();
    		delete this.scanTimer;
    	}
    }
    
    this.shipDied = function (whom, why) {
    	this.playerGone();
    	this.fuelCount = (Math.ceil(Math.random() * 30) + 30);
    	this.ship.spawn("fuelStation_burningFuel", this.fuelCount); // lets make this go with a bang!
    
    	if (whom && whom.isPlayer) {
    		player.consoleMessage("CCTV beam towards the main station detected.", 6);
    		player.score -= 1; // don't condone vandalism!
    		player.bounty += 20;
    	}
    }
    
    this.attackedMessage = function () {
    	this.ship.commsMessage("ALERT - fuel satellite under attack, explosion danger!");
    }
    
    //-------------------------------------------------------------------------------------------------------------
    // plays the sound of the fuel being filled
    this.$playSound = function $playSound(type) {
    	if (this._mySound && this._mySound.isPlaying) this._mySound.stop();
    	this._mySound = new SoundSource;
        switch (type) {
            case "fuelflow":
                this._mySound.sound = "fs_fuelflow.ogg";
    			this._mySound.loop = true;
                break;
    		case "fuelshutoff":
                this._mySound.sound = "fs_fuelshutoff.ogg";
    			this._mySound.loop = false;
        }
    	this._mySound.play();
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.$stopSound = function() {
    	if (this._mySound && this._mySound.isPlaying) {
    		this._mySound.stop();
    	}
    	this._mySound = null;
    }
    
    Scripts/fuelStation_stationNew.js
    "use strict";
    this.name = "FuelStation_StationNew";
    this.author = "Thargoid";
    this.copyright = "Creative Commons: attribution, non-commercial, sharealike with clauses - see readme.txt";
    this.description = "Script for fuel station";
    
    this._mySound = null;
    
    //-------------------------------------------------------------------------------------------------------------
    this.shipSpawned = function () {
    	this.ship.scannerDisplayColor1 = "greenColor";
    	this.ship.scannerDisplayColor2 = "lightGrayColor";
    
    	if (worldScripts["FuelStation-Setup"].extraB) {
    		var traders = system.shipsWithPrimaryRole("trader", this.ship, 50E3)
    		if (traders.length > 0 && traders[0].AIState == "HEAD_FOR_PLANET") {
    			traders[0].script.checkFuelStationDistance = this.checkFuelStationDistance; // attach function to script.
    			traders[0].script.checkUsage = this.checkUsage; // attach function to script.
    			traders[0].setAI("fuelStation_gotoFuelStationAI.plist");
    		}
    	}
    
    	//  line the station up with the route one. Code borrowed from Anarchies for convenience.
    	if (system.isInterstellarSpace || !system.mainPlanet) return;
    	var targetVector = system.mainPlanet.position.subtract(this.ship.position).direction();
    	var angle = this.ship.heading.angleTo(targetVector);
    	var cross = this.ship.heading.cross(targetVector).direction();
    	this.ship.orientation = this.ship.orientation.rotate(cross, -angle);
    	this.setColour("green");
    	this.setPrice();
    	this.maxAmount = worldScripts["FuelStation-Setup"].maxStationAmount;
    	this.dispensed = 0;
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.setColour = function (colName) {
    	var rgb = [];
    	switch (colName) {
    		case "red":
    			rgb = [255, 0, 0];
    			break;
    		case "orange":
    			rgb = [255, 106, 0];
    			break;
    		case "green":
    			rgb = [0, 255, 0];
    	}
    	for (var i = 65; i < this.ship.flashers.length; i++) {
    		this.ship.flashers[i].color = rgb;
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.setPrice = function () {
    	this.fuelPrice = 0.15 * EquipmentInfo.infoForKey("EQ_FUEL").price * player.ship.fuelChargeRate; // price per 0.1LY of fuel
    	if (system.economy === 0 || system.economy === 5) { this.fuelPrice *= 1.2; } //  rich industrial or agricultural
    	if (system.techLevel > 4 && system.techLevel < 11) { this.fuelPrice *= 1.1; } //  mid-tech level
    	this.fuelPrice = this.decPlaces(this.fuelPrice, 2);
    }
    
    //-------------------------------------------------------------------------------------------------------------
    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.playerDetected = function () {
    	if (this.dispensed >= this.maxAmount) {
    		if (this.scanTimer && this.scanTimer.isRunning) this.scanTimer.stop();
    		return;
    	}
    	this.firstMessage = true;
    	this.fuelTransferred = 0; // how many 0.1LY units are transferred
    	this.fuelBill = 0;
    	var msg = "Greetings Commander " + player.name + ". Refuel here for only " + this.decPlaces((10 * this.fuelPrice), 1) + " credits per ly.";
    	if (this.maxAmount < 7) {
    		msg += " Limit of " + this.maxAmount + "ly per ship.";
    	}
    	this.ship.commsMessage(msg, player.ship);
    	if (this.scanTimer) {
    		this.scanTimer.start();
    	} else {
    		this.scanTimer = new Timer(this, this.locatePlayer, 0, 0.50);
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.locatePlayer = function locatePlayer() {
    	if (!this.ship || !this.ship.isValid || !this.ship.position || !player.ship.isValid) {
    		// if the ship no longer exists but timer is running, e.g. if player has jumped whilst near a satellite into a system without one
    		this.$stopSound();
    		this.ship.flashers[40].active = true;
    		this.playerGone();
    		return;
    	}
    	var p = player.ship;
    	var d = this.ship.position.distanceTo(p);
    
    	if (d >= 150 && d < 700) {
    		this.setColour("orange");
    	}
    
    	if (d < 150) {
    		// player ship within 150m of the centre of the fuel station
    		if (player.ship.fuel < 7 && this.dispensed < this.maxAmount) {
    			if (player.credits > this.fuelBill) {
    				// player in place, fuel tank not full and credit balance not empty
    				player.ship.fuel += 0.1;
    				this.dispensed += 0.1;
    				this.fuelBill += this.fuelPrice;
    				this.fuelTransferred++;
    
    				if (this.firstMessage) {
    					this.$playSound("fuelflow");
    					var scr = worldScripts.FuelStation_Facelift;
    					this.ship.flashers[40].active = false;
    					system.addVisualEffect("fuelStation_alertFX", p.position.add(p.vectorForward.multiply(scr._fxForward)).add(p.vectorUp.multiply(scr._fxUp)));
    					player.consoleMessage("Fuel transfer is underway, please come to a halt.", 6);
    					this.firstMessage = false;
    					this.setColour("red");
    				}
    				return;
    			} else { // not enough funds left
    				player.consoleMessage("Insufficient credits remaining, transfer terminated.", 6);
    				this.ship.flashers[40].active = true;
    				this.setColor("green");
    				this.$playSound("fuelshutoff");
    				this.scanTimer.stop();
    				return;
    			}
    		} else { // Fuel tank full or max limit reached
    			if (player.ship.fuel < 7) {
    				player.consoleMessage("Fuel transfer limit reached.", 6);
    			} else {
    				player.consoleMessage("Fuel tanks are full.", 6);
    			}
    			this.ship.flashers[40].active = true;
    			this.setColour("green");
    			this.$playSound("fuelshutoff");
    			this.scanTimer.stop();
    			return;
    		}
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.shipTraversePositiveZ = this.shipTraverseNegativeZ = function (ship) {
    	if (ship.isPlayer) this.playerLeaving()
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.playerLeaving = function () {
    	this.fuelBill = this.decPlaces(this.fuelPrice * this.fuelTransferred, 1);
    	player.consoleMessage("Summary - " + (this.fuelTransferred / 10) + " ly transferred, " + this.fuelBill + " credits charged.", 6);
    	this.setColour("green");
    	player.credits -= this.fuelBill;
    	this.fuelTransferred = 0;
    	this.fuelBill = 0;
    	this.firstMessage = true;
    	if (this.maxAmount == 7) this.dispensed = 0;
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.playerWillEnterWitchspace = this.playerGone = function () {
    	if (this.scanTimer) {
    		this.scanTimer.stop();
    		delete this.scanTimer;
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.shipDied = function (whom, why) {
    	this.playerGone();
    	if (Math.random() < 0.4) {
    		this.ship.becomeCascadeExplosion();
    	} else {
    		this.fuelCount = (Math.ceil(Math.random() * 30) + 30);
    		this.ship.spawn("fuelTweaks_burningFuel", this.fuelCount); // lets make this go with a bang!
    	}
    
    	if (whom && whom.isPlayer) {
    		player.consoleMessage("CCTV beam towards the main station detected.", 6);
    		player.score -= 1; // don't condone vandalism!
    		player.ship.setBounty(player.bounty + 20, "damaged property");
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    // plays the sound of the fuel being filled
    this.$playSound = function $playSound(type) {
    	if (this._mySound && this._mySound.isPlaying) this._mySound.stop();
    	this._mySound = new SoundSource;
        switch (type) {
            case "fuelflow":
                this._mySound.sound = "fs_fuelflow.ogg";
    			this._mySound.loop = true;
                break;
    		case "fuelshutoff":
                this._mySound.sound = "fs_fuelshutoff.ogg";
    			this._mySound.loop = false;
        }
    	this._mySound.play();
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.$stopSound = function() {
    	if (this._mySound && this._mySound.isPlaying) {
    		this._mySound.stop();
    	}
    	this._mySound = null;
    }
    
    //-------------------------------------------------------------------------------------------------------------
    // below not used by stationscript but is attached to traderscript.
    this.checkFuelStationDistance = function () {
    	if (this.ship.position.distanceTo(this.ship.target) > 50E3) {
    		this.ship.reactToAIMessage("NEXT_FUELSTATION")
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.checkUsage = function () {
    	if (this.ship.target.position.distanceTo(player.ship) < 1000) {
    		this.ship.reactToAIMessage("NEXT_FUELSTATION")
    	} else {
    		this.ship.reactToAIMessage("STATION_CLEAR")
    	}
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.attackedMessage = function () {
    	this.ship.commsMessage("ALERT - fuel station under attack, explosion danger!");
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.collisionMessage = function () {
    	this.ship.commsMessage("ALERT - proximity detection, please take evasive action");
    }