sescripts/MissileLauncher/Program.cs

193 lines
6 KiB
C#

using Sandbox.Game.Entities.Cube;
using Sandbox.Game.EntityComponents;
using Sandbox.Game.GameSystems;
using Sandbox.ModAPI.Ingame;
using Sandbox.ModAPI.Interfaces;
using SpaceEngineers.Game.ModAPI.Ingame;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using VRage;
using VRage.Collections;
using VRage.Game;
using VRage.Game.Components;
using VRage.Game.GUI.TextPanel;
using VRage.Game.ModAPI.Ingame;
using VRage.Game.ModAPI.Ingame.Utilities;
using VRage.Game.ObjectBuilders.Definitions;
using VRageMath;
using static VRageRender.Utils.MyWingedEdgeMesh;
namespace IngameScript
{
enum State
{
NORMAL,
STARTING_SEQUENCE,
FILLING_TANK,
LAUNCHING,
}
class Missile
{
string prefix;
readonly string tankName = "Hydrogen Tank";
readonly string connectorName = "Connector";
readonly string mergeBlockName = "Merge Block";
readonly string programmableBlockName = "Programmable Block";
State currentState = State.NORMAL;
IMyGridTerminalSystem gridTerminalSystem;
IMyGasTank tank = null;
IMyShipConnector connector = null;
IMyShipMergeBlock mergeBlock = null;
IMyProgrammableBlock programmableBlock = null;
// bool loop = false; // Not used for the moment.
public Missile(string prefix, IMyGridTerminalSystem gridTerminalSystem)
{
this.prefix = prefix;
this.gridTerminalSystem = gridTerminalSystem;
}
}
partial class Program : MyGridProgram
{
const string GRID_PREFIX = "[PML]";
const string MISSILE_GRID_PREFIX = "[PM]";
const double HYDRO_TANK_FILLED_PERCENT = 20;
const float EPSILON = 0.05f;
readonly Output output;
public Program()
{
var output = this.Me.GetSurface(0);
this.output = new Output(output);
this.output.Print("Missile launcher system starting...");
this.Runtime.UpdateFrequency = UpdateFrequency.Update100;
this.output.Print("Missile launcher system started");
}
void UpdateState()
{
switch (this.currentState)
{
case State.STARTING_SEQUENCE:
this.tank = this.GridTerminalSystem.GetBlockWithName("[PM] Hydrogen Tank") as IMyGasTank;
if (this.tank == null)
{
this.output.Print("Cannot find the missile hydrogen tank");
break;
}
this.connector = this.GridTerminalSystem.GetBlockWithName("[PM] Connector") as IMyShipConnector;
if (this.connector == null)
{
this.output.Print("Cannot find the missile connector");
break;
}
this.mergeBlock = this.GridTerminalSystem.GetBlockWithName("[PM] Merge Block") as IMyShipMergeBlock;
if (this.mergeBlock == null)
{
this.output.Print("Cannot find the missile merge block");
break;
}
this.programmableBlock = this.GridTerminalSystem.GetBlockWithName("[PM] Programmable Block") as IMyProgrammableBlock;
if (this.programmableBlock == null)
{
this.output.Print("Cannot find the missile programmable block");
break;
}
this.tank.Stockpile = true;
this.connector.Connect();
this.currentState = State.FILLING_TANK;
break; ;
case State.FILLING_TANK:
this.output.Print("Waiting missile tank filled...");
if (this.tank.FilledRatio >= HYDRO_TANK_FILLED_PERCENT / 100)
{
this.tank.Stockpile = false;
this.currentState = State.LAUNCHING;
}
break;
case State.LAUNCHING:
this.output.Print("Launching missile...");
if (this.programmableBlock.TryRun("START"))
this.output.Print("Missile launched!");
else
this.output.Print("ERROR: Can't send START command to missile");
this.mergeBlock.Enabled = false;
this.connector.Disconnect();
if (this.loop)
this.currentState = State.STARTING_SEQUENCE;
else
this.currentState = State.NORMAL;
break;
case State.NORMAL:
break; // Nothing;
}
}
public void Save()
{
}
public void Main(string argument, UpdateType updateSource)
{
if ((updateSource & UpdateType.Update100) != 0)
{
this.UpdateState();
}
else if ((updateSource & (UpdateType.Terminal | UpdateType.Trigger)) != 0)
{
switch (argument)
{
case "LAUNCH ONE":
this.loop = false;
this.currentState = State.STARTING_SEQUENCE;
break;
case "LAUNCH SOME":
this.loop = true;
this.currentState = State.STARTING_SEQUENCE;
break;
case "STOP":
this.loop = false;
this.currentState = State.NORMAL;
break;
default:
this.output.Print($"Uknown command: {argument}");
break;
}
}
}
}
}