Browse Source

fix(HarassCalculator) Travel time UX now makes sense. Fixed divide by zero errors

main
Jonathan McCaffrey 4 years ago
parent
commit
ab9bffc23f
  1. BIN
      IGP/Database.db
  2. 2
      IGP/Index.razor
  3. 101
      IGP/Pages/HarassCalculatorPage.razor
  4. 2
      IGP/wwwroot/generated/AgileTaskModels.json
  5. 15
      Model/TravelTime.cs

BIN
IGP/Database.db

Binary file not shown.

2
IGP/Index.razor

@ -3,7 +3,7 @@
@layout PageLayout @layout PageLayout
<DevOnlyComponent> <DevOnlyComponent>
<EconomyComparisonPage></EconomyComparisonPage> <HarassCalculatorPage></HarassCalculatorPage>
</DevOnlyComponent> </DevOnlyComponent>
<HomePage/> <HomePage/>

101
IGP/Pages/HarassCalculatorPage.razor

@ -1,6 +1,7 @@
@layout PageLayout @layout PageLayout
@page "/harass-calculator" @page "/harass-calculator"
@using Model
<LayoutMediumContentComponent> <LayoutMediumContentComponent>
<WebsiteTitleComponent>Harass Calculator</WebsiteTitleComponent> <WebsiteTitleComponent>Harass Calculator</WebsiteTitleComponent>
@ -29,24 +30,38 @@
<LayoutColumnComponent> <LayoutColumnComponent>
<FormLayoutComponent> <FormLayoutComponent>
<FormNumberComponent Min="0" <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="0" <FormNumberComponent Min="1"
Value="@((int)NumberOfTownHallsExisting)" Value="@((int)NumberOfTownHallsExisting)"
OnChange="@(e => { NumberOfTownHallsExisting = int.Parse(e.Value!.ToString()!); Calculate();})"> OnChange="OnTownHallsChanged">
<FormLabelComponent>Number of townhalls you have</FormLabelComponent> <FormLabelComponent>Number of townhalls you have</FormLabelComponent>
</FormNumberComponent> </FormNumberComponent>
<FormNumberComponent Min="0"
Value="@((int)TravelTime)"
OnChange="@(e => { TravelTime = int.Parse(e.Value!.ToString()!); Calculate();})"> @{
<FormLabelComponent>Worker travel time to alloy</FormLabelComponent> var index = 0;
</FormNumberComponent> }
@foreach (var travelTime in TravelTimes)
{
index++;
if (index == 1)
{
continue;
}
<FormNumberComponent Min="0"
Value="@(travelTime.Value)"
OnChange="((e) => { OnTownHallTravelTimeChanged(e, travelTime); })">
<FormLabelComponent>Worker travel time from other base @(travelTime.Index + 1)</FormLabelComponent>
</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;">
@ -63,9 +78,11 @@
(<b>Worker replacement costs:</b> @WorkerReplacementCost()) (<b>Worker replacement costs:</b> @WorkerReplacementCost())
</div> </div>
<div> <div>
(<b>Delayed mining time:</b> @DelayedMiningCost()) (<b>Delayed mining time:</b> @DelayedMiningCost())
</div> </div>
<div>
(<b>Average travel time:</b> @GetAverageTravelTime())
</div>
</LayoutColumnComponent> </LayoutColumnComponent>
@ -180,10 +197,31 @@
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 TravelTime = 1;
float NumberOfWorkersLostToHarass = 1; float NumberOfWorkersLostToHarass = 1;
float NumberOfTownHallsExisting = 1; float NumberOfTownHallsExisting = 1;
float GetAverageTravelTime()
{
if (TravelTimes.Count == 0)
{
return 0;
}
var sum = 0;
foreach (var travelTime in TravelTimes)
{
sum += travelTime.Value;
}
Console.WriteLine("NumberOfTownHallsExisting " + NumberOfTownHallsExisting);
return sum / NumberOfTownHallsExisting;
}
float SimultaneousProductionFloor() float SimultaneousProductionFloor()
{ {
if (NumberOfTownHallsExisting <= 0 || NumberOfWorkersLostToHarass <= 0) if (NumberOfTownHallsExisting <= 0 || NumberOfWorkersLostToHarass <= 0)
@ -191,6 +229,8 @@
return 0; return 0;
} }
Console.WriteLine("SimultaneousProductionFloor " + Math.Min(NumberOfTownHallsExisting, NumberOfWorkersLostToHarass));
return (float)Math.Floor(NumberOfWorkersLostToHarass / Math.Min(NumberOfTownHallsExisting, NumberOfWorkersLostToHarass)); return (float)Math.Floor(NumberOfWorkersLostToHarass / Math.Min(NumberOfTownHallsExisting, NumberOfWorkersLostToHarass));
} }
@ -203,8 +243,7 @@
{ {
return CostOfWorker * NumberOfWorkersLostToHarass; return CostOfWorker * NumberOfWorkersLostToHarass;
} }
float DelayedMiningCost() float DelayedMiningCost()
{ {
return TotalAlloyHarassment - WorkerReplacementCost(); return TotalAlloyHarassment - WorkerReplacementCost();
@ -216,10 +255,11 @@
for (var workerProductionIndex = 0; workerProductionIndex < SimultaneousProductionFloor(); workerProductionIndex++) for (var workerProductionIndex = 0; workerProductionIndex < SimultaneousProductionFloor(); workerProductionIndex++)
{ {
TotalAlloyHarassment += AlloyMinedPerSecondByWorker * (TimeToProduceWorker + TravelTime) * (workerProductionIndex + 1); int townHallIndex = (workerProductionIndex + 1) % TravelTimes.Count;
TotalAlloyHarassment += AlloyMinedPerSecondByWorker * (TimeToProduceWorker + TravelTimes[townHallIndex].Value) * (workerProductionIndex + 1);
} }
TotalAlloyHarassment += LeftOverWorkersToProduceCount() * (TimeToProduceWorker + TravelTime) * AlloyMinedPerSecondByWorker; TotalAlloyHarassment += LeftOverWorkersToProduceCount() * (TimeToProduceWorker + TravelTimes[0].Value) * AlloyMinedPerSecondByWorker;
} }
protected override void OnInitialized() protected override void OnInitialized()
@ -231,5 +271,26 @@
{ {
Calculate(); Calculate();
} }
public List<TravelTime> TravelTimes { get; set; } = new() {new TravelTime(0, 0)};
private void OnTownHallsChanged(ChangeEventArgs obj)
{
NumberOfTownHallsExisting = int.Parse(obj.Value!.ToString()!);
while (TravelTimes.Count > NumberOfTownHallsExisting)
TravelTimes.Remove(TravelTimes.Last());
while (TravelTimes.Count < NumberOfTownHallsExisting)
TravelTimes.Add(new TravelTime(TravelTimes.Count, 0));
Calculate();
}
private void OnTownHallTravelTimeChanged(ChangeEventArgs obj, TravelTime travelTime)
{
travelTime.Value = (int)obj.Value!;
Calculate();
StateHasChanged();
}
} }

2
IGP/wwwroot/generated/AgileTaskModels.json

File diff suppressed because one or more lines are too long

15
Model/TravelTime.cs

@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
namespace Model;
public class TravelTime
{
public int Index { get; set; } = 0;
public int Value { get; set; } = 0;
public TravelTime(int index, int value)
{
Index = index;
Value = value;
}
}
Loading…
Cancel
Save