Browse Source

fix(HarassCalculator) The logic makes sense again...

main
Jonathan McCaffrey 4 years ago
parent
commit
9843ab93b6
  1. 112
      IGP/Pages/HarassCalculatorPage.razor

112
IGP/Pages/HarassCalculatorPage.razor

@ -15,15 +15,15 @@
<LayoutColumnComponent> <LayoutColumnComponent>
<FormLayoutComponent> <FormLayoutComponent>
<FormDisplayComponent Label="Cost of worker"> <FormDisplayComponent Label="Cost of worker">
<Display>@CostOfWorker</Display> <Display>@costOfWorker</Display>
</FormDisplayComponent> </FormDisplayComponent>
<FormDisplayComponent Label="Alloy mined per second by worker"> <FormDisplayComponent Label="Alloy mined per second by worker">
<Display>@AlloyMinedPerSecondByWorker</Display> <Display>@alloyMinedPerSecondByWorker</Display>
</FormDisplayComponent> </FormDisplayComponent>
<FormDisplayComponent Label="Time to produce worker"> <FormDisplayComponent Label="Time to produce worker">
<Display>@TimeToProduceWorker</Display> <Display>@timeToProduceWorker</Display>
</FormDisplayComponent> </FormDisplayComponent>
</FormLayoutComponent> </FormLayoutComponent>
</LayoutColumnComponent> </LayoutColumnComponent>
@ -31,19 +31,18 @@
<LayoutColumnComponent> <LayoutColumnComponent>
<FormLayoutComponent> <FormLayoutComponent>
<FormNumberComponent Min="1" <FormNumberComponent Min="1"
Value="@((int)NumberOfWorkersLostToHarass)" Value="@((int)numberOfWorkersLostToHarass)"
OnChange="@(e => { NumberOfWorkersLostToHarass = int.Parse(e.Value!.ToString()!); Calculate();})"> OnChange="@(e => { numberOfWorkersLostToHarass = int.Parse(e.Value!.ToString()!); Calculate();})">
<FormLabelComponent>Number of workers lost to harass</FormLabelComponent> <FormLabelComponent>Number of workers lost to harass</FormLabelComponent>
</FormNumberComponent> </FormNumberComponent>
<FormNumberComponent Min="1" <FormNumberComponent Min="1"
Value="@((int)NumberOfTownHallsExisting)" Value="@((int)numberOfTownHallsExisting)"
OnChange="OnTownHallsChanged"> OnChange="OnTownHallsChanged">
<FormLabelComponent>Number of townhalls you have</FormLabelComponent> <FormLabelComponent>Number of townhalls you have</FormLabelComponent>
</FormNumberComponent> </FormNumberComponent>
@{ @{
var index = 0; var index = 0;
} }
@ -54,18 +53,18 @@
{ {
continue; continue;
} }
<FormNumberComponent Min="0" <FormNumberComponent Min="0"
Value="@(travelTime.Value)" Value="@(travelTime.Value)"
OnChange="((e) => { OnTownHallTravelTimeChanged(e, travelTime); })"> OnChange="e => { OnTownHallTravelTimeChanged(e, travelTime); }">
<FormLabelComponent>Worker travel time from other base @(travelTime.Index + 1)</FormLabelComponent> <FormLabelComponent>Worker travel time from other base @(travelTime.Index + 1)</FormLabelComponent>
</FormNumberComponent> </FormNumberComponent>
} }
<FormDisplayComponent Label="Total alloy lost"> <FormDisplayComponent Label="Total alloy lost">
<Display> <Display>
<div style="font-size: 1.5rem; font-weight: 800;"> <div style="font-size: 1.5rem; font-weight: 800;">
@TotalAlloyHarassment @totalAlloyHarassment
</div> </div>
</Display> </Display>
</FormDisplayComponent> </FormDisplayComponent>
@ -123,7 +122,7 @@
</InfoQuestionComponent> </InfoQuestionComponent>
<InfoAnswerComponent> <InfoAnswerComponent>
The Harass Calculator is based on the following calculation. The Harass Calculator is based on the following calculation.
<br/> <br/>
<div class="mathContainer"> <div class="mathContainer">
<div> =c*m+r*g*(t+l) + </div> <div> =c*m+r*g*(t+l) + </div>
@ -154,7 +153,9 @@
<div>l is TravelTime</div> <div>l is TravelTime</div>
<div><i>x</i> is workerProductionIndex</div> <div><i>x</i> is workerProductionIndex</div>
</div> </div>
<br/><br/> <br/>
This logic has since been changed slightly to allow client to enter different travel times per base.
<br/>
</InfoAnswerComponent> </InfoAnswerComponent>
</InfoBodyComponent> </InfoBodyComponent>
<InfoBodyComponent> <InfoBodyComponent>
@ -190,13 +191,13 @@
</style> </style>
@code { @code {
float TotalAlloyHarassment; float totalAlloyHarassment = 0;
readonly float CostOfWorker = 50; readonly float costOfWorker = 50;
readonly float AlloyMinedPerSecondByWorker = 1; readonly float alloyMinedPerSecondByWorker = 1;
readonly float TimeToProduceWorker = 20; readonly float timeToProduceWorker = 20;
float NumberOfWorkersLostToHarass = 1; float numberOfWorkersLostToHarass = 1;
float NumberOfTownHallsExisting = 1; float numberOfTownHallsExisting = 1;
float GetAverageTravelTime() float GetAverageTravelTime()
{ {
@ -211,53 +212,51 @@
{ {
sum += travelTime.Value; sum += travelTime.Value;
} }
Console.WriteLine("NumberOfTownHallsExisting " + NumberOfTownHallsExisting);
return sum / numberOfTownHallsExisting;
return sum / NumberOfTownHallsExisting;
} }
float SimultaneousProductionFloor() float SimultaneousProductionFloor()
{ {
if (NumberOfTownHallsExisting <= 0 || NumberOfWorkersLostToHarass <= 0) if (numberOfTownHallsExisting <= 0 || numberOfWorkersLostToHarass <= 0)
{ {
return 0; return 0;
} }
Console.WriteLine("SimultaneousProductionFloor " + Math.Min(NumberOfTownHallsExisting, NumberOfWorkersLostToHarass)); return numberOfWorkersLostToHarass / Math.Min(numberOfTownHallsExisting, numberOfWorkersLostToHarass);
return (float)Math.Floor(NumberOfWorkersLostToHarass / Math.Min(NumberOfTownHallsExisting, NumberOfWorkersLostToHarass));
}
float LeftOverWorkersToProduceCount()
{
return NumberOfWorkersLostToHarass % Math.Min(NumberOfTownHallsExisting, NumberOfWorkersLostToHarass);
} }
float WorkerReplacementCost() float WorkerReplacementCost()
{ {
return CostOfWorker * NumberOfWorkersLostToHarass; return costOfWorker * numberOfWorkersLostToHarass;
} }
float DelayedMiningCost() float DelayedMiningCost()
{ {
return TotalAlloyHarassment - WorkerReplacementCost(); return totalAlloyHarassment - WorkerReplacementCost();
} }
void Calculate() void Calculate()
{ {
TotalAlloyHarassment = WorkerReplacementCost(); totalAlloyHarassment = WorkerReplacementCost();
for (var workerProductionIndex = 0; workerProductionIndex < SimultaneousProductionFloor(); workerProductionIndex++) for (var workerProductionIndex = 0; workerProductionIndex < SimultaneousProductionFloor(); workerProductionIndex++)
{ {
int townHallIndex = (workerProductionIndex + 1) % TravelTimes.Count; totalAlloyHarassment += alloyMinedPerSecondByWorker * timeToProduceWorker * (workerProductionIndex + 1);
TotalAlloyHarassment += AlloyMinedPerSecondByWorker * (TimeToProduceWorker + TravelTimes[townHallIndex].Value) * (workerProductionIndex + 1); }
var remainder = (int)(numberOfWorkersLostToHarass % SimultaneousProductionFloor());
for (var remainderIndex = 0; remainderIndex < remainder; remainderIndex++)
{
totalAlloyHarassment += alloyMinedPerSecondByWorker * timeToProduceWorker * (SimultaneousProductionFloor() + 1);
} }
TotalAlloyHarassment += LeftOverWorkersToProduceCount() * (TimeToProduceWorker + TravelTimes[0].Value) * AlloyMinedPerSecondByWorker; for (var travelTimeIndex = 0; travelTimeIndex < numberOfWorkersLostToHarass; travelTimeIndex++)
{
var townHallIndex = travelTimeIndex % TravelTimes.Count;
totalAlloyHarassment += alloyMinedPerSecondByWorker * TravelTimes[townHallIndex].Value;
}
} }
protected override void OnInitialized() protected override void OnInitialized()
@ -269,17 +268,17 @@
{ {
Calculate(); Calculate();
} }
public List<TravelTime> TravelTimes { get; set; } = new() {new TravelTime(0, 0)}; public List<TravelTime> TravelTimes { get; set; } = new() { new TravelTime(0, 0) };
private void OnTownHallsChanged(ChangeEventArgs obj) private void OnTownHallsChanged(ChangeEventArgs obj)
{ {
NumberOfTownHallsExisting = int.Parse(obj.Value!.ToString()!); numberOfTownHallsExisting = int.Parse(obj.Value!.ToString()!);
while (TravelTimes.Count > NumberOfTownHallsExisting) while (TravelTimes.Count > numberOfTownHallsExisting)
TravelTimes.Remove(TravelTimes.Last()); TravelTimes.Remove(TravelTimes.Last());
while (TravelTimes.Count < NumberOfTownHallsExisting) while (TravelTimes.Count < numberOfTownHallsExisting)
TravelTimes.Add(new TravelTime(TravelTimes.Count, 0)); TravelTimes.Add(new TravelTime(TravelTimes.Count, 0));
Calculate(); Calculate();
} }
@ -287,8 +286,9 @@
private void OnTownHallTravelTimeChanged(ChangeEventArgs obj, TravelTime travelTime) private void OnTownHallTravelTimeChanged(ChangeEventArgs obj, TravelTime travelTime)
{ {
travelTime.Value = (int)obj.Value!; travelTime.Value = (int)obj.Value!;
Calculate(); Calculate();
StateHasChanged(); StateHasChanged();
} }
} }
Loading…
Cancel
Save