float EqualisedPower(PowerConsumerInterface them)
        {
            var sumCapacity = Capacity + them.GetMaxPower();
            var sumPower    = Power + them.GetMaxPower() - them.GetRemainingPowerCapacity();

            return(Capacity * sumPower / sumCapacity);
        }
Пример #2
0
    protected float attemptTransferPower()
    {
        VicisMod.log(getPrefix(), "Running LFU");
        lastSearch -= LowFrequencyThread.mrPreviousUpdateTimeStep;
        // Nothing to do
        if (currentPower <= 0)
        {
            return(0);
        }
        lastTransfer1 -= LowFrequencyThread.mrPreviousUpdateTimeStep;
        if (lastTransfer1 > 0)
        {
            return(0);
        }
        lastTransfer1 += transferFrequency;
        VicisMod.log(getPrefix(), "Currently have " + currentPower + " Power");
        cullPCIs();
        if (lastSearch <= 0)
        {
            VicisMod.log(getPrefix(), "Finding PCIs");
            findPCIs();
            lastSearch = scanFrequency;
        }

        VicisMod.log(getPrefix(), "Aware of " + pcis.Count + " PCIs");
        // Now lets charge these guys up!
        float transferedThisTime = 0;

        for (int i = 0; i < pcis.Count; ++i)
        {
            PowerConsumerInterface pci = pcis[i];
            if (pci.WantsPowerFromEntity(this))
            {
                float transfer = transferCap;
                transfer = Math.Min(transfer, currentPower);
                transfer = Math.Min(transfer, pci.GetMaximumDeliveryRate());
                transfer = Math.Min(transfer, pci.GetRemainingPowerCapacity());
                if (transfer > 0 && pci.DeliverPower(transfer))
                {
                    VicisMod.log(getPrefix(), "Adding " + transfer + " to PCI " + pci.ToString());
                    currentPower       -= transfer;
                    totalTransfered    += transfer;
                    transferedThisTime += transfer;
                    // And we're done
                    if (currentPower == 0)
                    {
                        return(transferedThisTime);
                    }
                }
            }
        }
        return(transferedThisTime);
    }
        protected override Byte CalculateOutput(SegmentEntity entity, UInt16 data)
        {
            PowerConsumerInterface powerConsumerInterface = entity as PowerConsumerInterface;

            if (powerConsumerInterface == null)
            {
                return(0);
            }
            Double remainingPower = Math.Round(powerConsumerInterface.GetRemainingPowerCapacity(), MidpointRounding.AwayFromZero);
            Double maxPower       = Math.Round(powerConsumerInterface.GetMaxPower(), MidpointRounding.AwayFromZero);

            return((Byte)((1f - remainingPower / maxPower) * 255f));
        }
        void FeedConsumer(PowerConsumerInterface consumer, float ticks)
        {
            var powerToHoldOn = 0f;

            if (consumer as PowerStorageInterface != null)
            {
                powerToHoldOn = EqualisedPower(consumer);
            }
            if (Power > powerToHoldOn)
            {
                var transferAmount = new [] {
                    OutputRate *ticks,
                    Power - powerToHoldOn,
                    consumer.GetRemainingPowerCapacity(),
                    consumer.GetMaximumDeliveryRate() *ticks,
                }.Min();
                if (consumer.DeliverPower(transferAmount))
                {
                    Power -= transferAmount;
                }
            }
        }
 static float NormalizedPower(PowerConsumerInterface powerHolder)
 {
     return(1f - powerHolder.GetRemainingPowerCapacity() / powerHolder.GetMaxPower());
 }