Back to Index Page generated: Jul 27, 2025, 4:28:30 AM

Expansion Combat Simulator

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Adds a combat simulator to the interfaces screen of some high-tech stations where you can set up controlled battles against particular opponents. Requires Ship Storage Helper. Adds a combat simulator to the interfaces screen of some high-tech stations where you can set up controlled battles against particular opponents. Requires Ship Storage Helper.
Identifier oolite.oxp.cim.combat-simulator oolite.oxp.cim.combat-simulator
Title Combat Simulator Combat Simulator
Category Activities Activities
Author cim cim
Version 1.2 1.2
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
  • oolite.oxp.CaptMurphy.ShipStorageHelper:0.21
  • oolite.oxp.CaptMurphy.ShipStorageHelper:0.21
  • Optional Expansions
    Conflict Expansions
    Information URL http://wiki.alioth.net/index.php/Combat_Simulator_OXP n/a
    Download URL https://wiki.alioth.net/img_auth.php/c/ce/CombatSimulator_1.2.oxz http://compsoc.dur.ac.uk/~cim/oolite/Combat_Simulator_1.1.oxz
    License CC-BY-SA 3.0 CC-BY-SA 3.0
    File Size n/a
    Upload date 1751320048

    Documentation

    Also read http://wiki.alioth.net/index.php/Combat%20Simulator

    Equipment

    This expansion declares no equipment.

    Ships

    Name
    combatsimulator-buoy
    Simulator Fighter: Cobra Mk I
    Simulator Fighter: Cobra Mk III
    Simulator Fighter: Gecko
    Simulator Fighter: Krait
    Simulator Fighter: Mamba
    Simulator Fighter: Python
    Simulator Fighter: Sidewinder
    Simulator Fighter: Sidewinder Escort
    Simulator Fighter: Iron Sidewinder

    Models

    This expansion declares no models.

    Scripts

    Path
    Scripts/combatsimulator.js
    "use strict";
    this.author = "cim";
    this.copyright = "� 2011-2014 cim.";
    this.licence = "CC-BY-SA 3.0";
    this.version = "1.2";
    this.name = "Combat Simulator";
    this.description = "Combat Simulator";
    
    
    this.startUp = this.shipWillExitWitchspace = function () {
    	if (!worldScripts["Ship_Storage_Helper.js"]) {
    		log(this.name, expandDescription("[combatsim_ssh_not_installed]"));
    		player.commsMessage(expandDescription("[combatsim_check_logs]"), 10);
    		delete this.startUp;
    		delete this.shipWillExitWitchspace;
    		return;
    	}
    
    	if (!system.isInterstellarSpace && system.mainStation && (system.ID == 7 || system.info.techlevel >= 9)) {
    		system.mainStation.setInterface(this.name, {
    			title: expandDescription("[combatsim_interface_title]"),
    			category: expandDescription("[combatsim_interface_category]"),
    			summary: expandDescription("[combatsim_interface_summary]"),
    			callback: this._setUpFight.bind(this)
    		});
    	}
    }
    
    this.startUpComplete = function () {
    	worldScripts["oolite-libPriorityAI"]._setCommunication("_combatSimulator", "generic", "oolite_beginningAttack", "[combatSimulator_beginningAttack]");
    	worldScripts["oolite-libPriorityAI"]._setCommunication("_combatSimulator", "generic", "oolite_hitTarget", "[combatSimulator_hitTarget]");
    	worldScripts["oolite-libPriorityAI"]._setCommunication("_combatSimulator", "generic", "oolite_attackLowEnergy", "[combatSimulator_attackLowEnergy]");
    	worldScripts["oolite-libPriorityAI"]._setCommunication("_combatSimulator", "generic", "oolite_incomingMissile", "[combatSimulator_incomingMissile]");
    }
    
    this.missionScreenEnded = function () {
    	if (player.ship.hudHidden == true) player.ship.hudHidden = false;
    }
    
    this._setUpFight = function () {
    	this.$fight = new Object;
    
    	if (!player.ship.hudAllowsBigGui) player.ship.hudHidden = true;
    
    	mission.runScreen({
    		"titleKey": "CombatSimulator_Stage1_Header",
    		"messageKey": "CombatSimulator_Text",
    		"choicesKey": "CombatSimulator_Stage1_Choice"
    	},
    		function (choice) {
    			if (choice == "combatsimulator-4") return;
    			this.$fight.role = choice;
    			mission.runScreen({
    				"titleKey": "CombatSimulator_Stage2_Header",
    				"messageKey": "CombatSimulator_Text",
    				"choicesKey": "CombatSimulator_Stage2_Choice"
    			},
    				function (choice) {
    					if (choice == "7acc0") return;
    					this.$fight.skill = parseInt(choice.slice(4));
    					mission.runScreen({
    						"titleKey": "CombatSimulator_Stage3_Header",
    						"messageKey": "CombatSimulator_Text",
    						"choicesKey": "CombatSimulator_Stage3_Choice"
    					},
    						function (choice) {
    							if (choice == "7") return;
    							this.$fight.number = parseInt(choice);
    							this._startFight();
    						}, this)
    				}, this)
    		}, this);
    }
    
    this._startFight = function () {
    	worldScripts["Ship_Storage_Helper.js"].disableTCATPBNSFunc();
    	this.$shipState = worldScripts["Ship_Storage_Helper.js"].storeCurrentShip();
    	this._setUpHandlers();
    	this._setUpEnvironment();
    	player.ship.removeEquipment("EQ_ESCAPE_POD");
    	player.ship.launch();
    }
    
    this._endFight = function () {
    	system.mainStation.dockPlayer();
    	this._removeHandlers();
    	this._removeEnvironment();
    }
    
    
    this._setUpHandlers = function () {
    	this.shipTakingDamage = function (amount, whom, type) {
    		if (amount >= player.ship.energy - 2) {
    			player.ship.energy = player.ship.maxEnergy;
    			this._endFight();
    		}
    	};
    	this.shipWillLaunchFromStation = function (station) {
    		player.ship.position = this.$simpos.add([3E3, 0, 0]);
    	};
    	this.shipLaunchedFromStation = function (station) {
    		for (var i = 0; i < this.$simulator.ships.length; i++) {
    			var s = this.$simulator.ships[i];
    			s.target = player.ship;
    			s.accuracy = this.$fight.skill;
    			for (var j = 0; j < s.subEntities.length; j++) {
    				s.subEntities[j].forwardWeapon = "EQ_WEAPON_NONE";
    			}
    		}
    		player.ship.forwardShield = player.ship.maxForwardShield;
    		player.ship.aftShield = player.ship.maxAftShield;
    		player.ship.energy = player.ship.maxEnergy;
    	};
    	// should never get to this step
    	this.shipWillEnterWitchspace = function () {
    		this._removeHandlers();
    	}
    	this.shipDockedWithStation = function () {
    		worldScripts["Ship_Storage_Helper.js"].restoreStoredShip(this.$shipState);
    		worldScripts["Ship_Storage_Helper.js"].enableTCATPBNSFunc();
    		delete this.shipDockedWithStation;
    	}
    	this.playerStartedJumpCountdown = function () {
    		this.$cancel = new Timer(this, function () { player.ship.cancelHyperspaceCountdown(); }, 2);
    	}
    	this.$checkFight = new Timer(this, function () {
    		if (!this.$simulator || this.$simulator.count == 0 || !this.$buoy.isValid || player.ship.position.distanceTo(this.$buoy.position) > 26E3) {
    			this._endFight();
    		}
    	}, 5, 5);
    }
    
    this._setUpEnvironment = function () {
    	this.$simpos = system.sun.position.cross(system.mainPlanet.position).direction().multiply(4E9).subtract(system.mainPlanet.position);
    
    	this.$buoy = system.addShips("combatsimulator-buoy", 1, this.$simpos, 0)[0];
    	this.$simulator = system.addGroup(this.$fight.role, this.$fight.number, this.$simpos, 12E3);
    }
    
    this._removeEnvironment = function () {
    	if (this.$buoy.isValid) {
    		this.$buoy.remove(true);
    	}
    	for (var i = this.$simulator.count - 1; i >= 0; i--) {
    		this.$simulator.ships[i].remove(true);
    	}
    }
    
    this._removeHandlers = function () {
    	if (this.$checkFight) {
    		this.$checkFight.stop();
    		delete this.$checkFight;
    	}
    	delete this.shipTakingDamage;
    	delete this.shipWillLaunchFromStation;
    	delete this.shipLaunchedFromStation;
    	delete this.shipWillEnterWitchspace;
    	delete this.playerStartedJumpCountdown;
    }