Parameterize surface interactions
This commit is contained in:
@@ -296,107 +296,64 @@ public sealed class SimulationEngine
|
||||
{
|
||||
var surfaceA = level.GetSurface(a);
|
||||
var surfaceB = level.GetSurface(b);
|
||||
FlowBetween(level, a, b, surfaceA.Fuel, surfaceB.Fuel, EPairEffect.FuelFlow, deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Coolant, surfaceB.Coolant, EPairEffect.CoolFlow, deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Electricity, surfaceB.Electricity, EPairEffect.ChargeFlow, deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Heat, surfaceB.Heat, EPairEffect.HeatFlow, deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Fuel, surfaceB.Fuel, Balancing.Current.FlowInteraction(ESurfaceQuantity.Fuel), deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Coolant, surfaceB.Coolant, Balancing.Current.FlowInteraction(ESurfaceQuantity.Coolant), deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Electricity, surfaceB.Electricity, Balancing.Current.FlowInteraction(ESurfaceQuantity.Electricity), deltas);
|
||||
FlowBetween(level, a, b, surfaceA.Heat, surfaceB.Heat, Balancing.Current.FlowInteraction(ESurfaceQuantity.Heat), deltas);
|
||||
}
|
||||
|
||||
private static void ApplyPair(LevelState level, GridPosition a, GridPosition b, ECarrierType? rowCarrier, EBand rowBand, ECarrierType? colCarrier, EBand colBand, SurfaceDelta[] deltas)
|
||||
{
|
||||
ApplyEffect(level, a, b, PairEffect(rowCarrier, rowBand, colCarrier, colBand), deltas);
|
||||
ApplyEffect(level, a, Balancing.Current.SameCellInteraction(rowCarrier, rowBand, colCarrier, colBand), deltas);
|
||||
}
|
||||
|
||||
private static EPairEffect PairEffect(ECarrierType? rowCarrier, EBand rowBand, ECarrierType? colCarrier, EBand colBand)
|
||||
private static void ApplyEffect(LevelState level, GridPosition position, SurfaceInteractionEffect effect, SurfaceDelta[] deltas)
|
||||
{
|
||||
if (rowBand == EBand.Safe && colBand == EBand.Safe)
|
||||
return EPairEffect.Hold;
|
||||
|
||||
if (rowCarrier == colCarrier)
|
||||
return rowCarrier switch {
|
||||
ECarrierType.Fuel => EPairEffect.FuelFlow,
|
||||
ECarrierType.Coolant => EPairEffect.CoolFlow,
|
||||
ECarrierType.Electricity => EPairEffect.ChargeFlow,
|
||||
_ => EPairEffect.HeatFlow
|
||||
};
|
||||
|
||||
if (rowCarrier == ECarrierType.Fuel && colCarrier == ECarrierType.Electricity)
|
||||
return rowBand == EBand.Critical || colBand == EBand.Critical ? EPairEffect.Ignite2 : EPairEffect.Ignite1;
|
||||
|
||||
if (rowCarrier == ECarrierType.Fuel && colCarrier is null)
|
||||
return rowBand == EBand.Critical || colBand == EBand.Critical ? EPairEffect.Ignite2 : EPairEffect.Warm1;
|
||||
|
||||
if (rowCarrier == ECarrierType.Coolant && colCarrier == ECarrierType.Electricity)
|
||||
return rowBand == EBand.Critical || colBand == EBand.Critical ? EPairEffect.Short2 : EPairEffect.Short1;
|
||||
|
||||
if (rowCarrier == ECarrierType.Coolant && colCarrier is null)
|
||||
return rowBand == EBand.Critical || colBand == EBand.Critical ? EPairEffect.Quench2 : EPairEffect.Quench1;
|
||||
|
||||
return EPairEffect.Hold;
|
||||
}
|
||||
|
||||
private static void ApplyEffect(LevelState level, GridPosition a, GridPosition b, EPairEffect effect, SurfaceDelta[] deltas)
|
||||
{
|
||||
var index = level.Index(a);
|
||||
switch (effect)
|
||||
var index = level.Index(position);
|
||||
switch (effect.Verb)
|
||||
{
|
||||
case EPairEffect.Warm1:
|
||||
deltas[index].Heat += Balancing.Current.Warm1Amount;
|
||||
case ESurfaceInteractionVerb.Warm:
|
||||
deltas[index].Heat += effect.Amount;
|
||||
break;
|
||||
case EPairEffect.Warm2:
|
||||
deltas[index].Heat += Balancing.Current.Warm2Amount;
|
||||
case ESurfaceInteractionVerb.Quench:
|
||||
deltas[index].Heat -= effect.Amount;
|
||||
break;
|
||||
case EPairEffect.Quench1:
|
||||
deltas[index].Heat -= Balancing.Current.Quench1Amount;
|
||||
case ESurfaceInteractionVerb.Short:
|
||||
deltas[index].Heat += effect.Amount;
|
||||
deltas[index].Electricity -= effect.SecondaryAmount;
|
||||
break;
|
||||
case EPairEffect.Quench2:
|
||||
deltas[index].Heat -= Balancing.Current.Quench2Amount;
|
||||
break;
|
||||
case EPairEffect.Short1:
|
||||
deltas[index].Heat += Balancing.Current.Short1Heat;
|
||||
deltas[index].Electricity -= Balancing.Current.Short1Discharge;
|
||||
break;
|
||||
case EPairEffect.Short2:
|
||||
deltas[index].Heat += Balancing.Current.Short2Heat;
|
||||
deltas[index].Electricity -= Balancing.Current.Short2Discharge;
|
||||
break;
|
||||
case EPairEffect.Ignite1:
|
||||
deltas[index].Heat += Balancing.Current.Ignite1Heat;
|
||||
deltas[index].Fuel -= Balancing.Current.Ignite1FuelConsumption;
|
||||
break;
|
||||
case EPairEffect.Ignite2:
|
||||
deltas[index].Heat += Balancing.Current.Ignite2Heat;
|
||||
deltas[index].Fuel -= Balancing.Current.Ignite2FuelConsumption;
|
||||
case ESurfaceInteractionVerb.Ignite:
|
||||
deltas[index].Heat += effect.Amount;
|
||||
deltas[index].Fuel -= effect.SecondaryAmount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static void FlowBetween(LevelState level, GridPosition a, GridPosition b, float valueA, float valueB, EPairEffect effect, SurfaceDelta[] deltas)
|
||||
private static void FlowBetween(LevelState level, GridPosition a, GridPosition b, float valueA, float valueB, SurfaceInteractionEffect effect, SurfaceDelta[] deltas)
|
||||
{
|
||||
var difference = valueA - valueB;
|
||||
if (Math.Abs(difference) < 0.01f)
|
||||
return;
|
||||
|
||||
var amount = difference * (effect == EPairEffect.HeatFlow2 ? Balancing.Current.StrongFlowTransferRatio : Balancing.Current.FlowTransferRatio);
|
||||
var amount = difference * effect.Amount;
|
||||
var indexA = level.Index(a);
|
||||
var indexB = level.Index(b);
|
||||
|
||||
switch (effect)
|
||||
switch (effect.Quantity)
|
||||
{
|
||||
case EPairEffect.FuelFlow:
|
||||
case ESurfaceQuantity.Fuel:
|
||||
deltas[indexA].Fuel -= amount;
|
||||
deltas[indexB].Fuel += amount;
|
||||
break;
|
||||
case EPairEffect.CoolFlow:
|
||||
case ESurfaceQuantity.Coolant:
|
||||
deltas[indexA].Coolant -= amount;
|
||||
deltas[indexB].Coolant += amount;
|
||||
break;
|
||||
case EPairEffect.ChargeFlow:
|
||||
case ESurfaceQuantity.Electricity:
|
||||
deltas[indexA].Electricity -= amount;
|
||||
deltas[indexB].Electricity += amount;
|
||||
break;
|
||||
case EPairEffect.HeatFlow:
|
||||
case EPairEffect.HeatFlow2:
|
||||
case ESurfaceQuantity.Heat:
|
||||
deltas[indexA].Heat -= amount;
|
||||
deltas[indexB].Heat += amount;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user