XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

AutoMiningScript

【SpaceEngineer】全自动挖矿脚本

公开
关注 0 Fork 0 Star 0
UTF-8
using System;
using System.Collections.Generic;
using System.Reflection;
using Sandbox.ModAPI.Ingame;
using VRage;
using VRage.Game.ModAPI.Ingame;
using Xunit;
using P = AutoMiningScript.Program;

namespace AutoMiningScript.Tests
{
    public class DockedServiceTests
    {
        static void Write(object target, string name, object value)
        { target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(target, value); }

        [Theory]
        [InlineData(false, false, false, 0)]
        [InlineData(true, false, false, 1)]
        [InlineData(false, true, false, 2)]
        [InlineData(true, true, false, 3)]
        [InlineData(false, false, true, 2)]
        [InlineData(true, false, true, 3)]
        public void DockedMinerReportsActualServiceAndFinishesWithoutANextJob(bool ore, bool batteryLow, bool hydrogenLow, int expected)
        {
            var r = new MinerStateTests.MinerRig(); r.PrepareDeparture("valid-lease");
            Write(r.Miner, "job", null); Write(r.Miner, "running", false);
            var battery = TestRig.Battery(r.Program, batteryLow ? 2 : 10, 10);
            r.Hardware.Batteries.Clear(); r.Hardware.Batteries.Add(battery.Value);
            var tank = new Stub<IMyGasTank>().Set("CubeGrid", r.Program.Me.CubeGrid).Set("IsFunctional", true)
                .Set("Capacity", 10000f).Set("FilledRatio", hydrogenLow ? .2d : 1d);
            r.Hardware.UsesHydrogen = true; r.Hardware.Tanks.Add(tank.Value);
            object item = default(MyInventoryItem);
            typeof(MyInventoryItem).GetField("Type").SetValue(item, MyItemType.MakeOre("Stone"));
            typeof(MyInventoryItem).GetField("Amount").SetValue(item, (MyFixedPoint)1);
            bool hasOre = ore;
            r.CargoInventory.Method("GetItems", a => { if (hasOre) ((List<MyInventoryItem>)a[0]).Add((MyInventoryItem)item); return null; });
            r.Resources.Update(.5, P.FlightState.Servicing, 0, 0); r.Miner.Tick(.1);
            var t = P.Telemetry.FromIni(r.Miner.GetTelemetry()[0].ToIni());
            Assert.True(t.Connected); Assert.Equal(expected, t.ServiceFlags);
            Assert.Equal(P.L.Service(expected), P.L.State(t)); Assert.Equal(P.L.Service(expected), t.Reason);
            // Base transfers and replenishment complete while the miner remains stopped.
            hasOre = false; battery.Set("CurrentStoredPower", 10f); tank.Set("FilledRatio", 1d);
            r.Resources.Update(.5, P.FlightState.Servicing, 0, 0); r.Miner.Tick(.1);
            t = P.Telemetry.FromIni(r.Miner.GetTelemetry()[0].ToIni());
            Assert.Equal(0, t.ServiceFlags); Assert.Equal(P.L.DisplayStateStandby, P.L.State(t));
            Assert.False(r.Resources.NeedsCharge); Assert.False(r.Resources.NeedsHydrogen);
        }

        [Fact]
        public void ChargingAboveTargetStillHonorsThePendingSortieBudget()
        {
            var r = new MinerStateTests.MinerRig(); r.PrepareDeparture("valid-lease");
            r.Resources.NeedsCharge = true; r.Resources.Battery = .91;
            r.Resources.StoredMWh = 9.1; r.Resources.SortieBudgetMWh = 9.5;
            r.Resources.Service(.1); Assert.True(r.Resources.NeedsCharge);
            r.Resources.Battery = .96; r.Resources.StoredMWh = 9.6;
            r.Resources.Service(.1); Assert.False(r.Resources.NeedsCharge);
        }

        [Fact]
        public void FailedInventoryScanDoesNotClaimStandbyAndFaultStateStaysVisible()
        {
            var r = new MinerStateTests.MinerRig(); r.PrepareDeparture("valid-lease");
            r.Resources.ScanProblem = "inventory unavailable"; r.Miner.Tick(.1);
            var t = r.Miner.GetTelemetry()[0]; Assert.Equal(-1, t.ServiceFlags);
            Assert.Equal("inventory unavailable", t.Reason);
            t.State = P.FlightState.Fault; t.ServiceFlags = 0;
            Assert.Equal(P.L.DisplayStateFault, P.L.State(t));
        }

        [Fact]
        public void OldTelemetryAndDisconnectedShipsKeepFlightStateLabels()
        {
            var packet = new P.Telemetry { Connected = true, State = P.FlightState.Docked }.ToIni();
            packet.Delete("telemetry", "ServiceFlags");
            var t = P.Telemetry.FromIni(packet); Assert.Equal(-1, t.ServiceFlags);
            Assert.Equal(P.L.DisplayStateDocked, P.L.State(t));
            t.Connected = false; t.State = P.FlightState.Departing; t.ServiceFlags = 3;
            Assert.Equal(P.L.DisplayStateDeparting, P.L.State(t));
            packet.Set("telemetry", "ServiceFlags", 4);
            Assert.ThrowsAny<Exception>(() => P.Telemetry.FromIni(packet));
        }
    }
}