From d6ee42b66d0262adef71fba8189b39d21a57d46d Mon Sep 17 00:00:00 2001 From: 6d486f49 <76097bcc@gmail.com> Date: Fri, 12 Jun 2026 17:09:00 -0400 Subject: [PATCH] Day 3 vibes --- ET/Web/Pages/Simulation.razor | 47 +++++++++++++++- ET/Web/Services/GameSimulationService.cs | 70 ++++++++++++++---------- 2 files changed, 86 insertions(+), 31 deletions(-) diff --git a/ET/Web/Pages/Simulation.razor b/ET/Web/Pages/Simulation.razor index 8021e2a..0a3b565 100644 --- a/ET/Web/Pages/Simulation.razor +++ b/ET/Web/Pages/Simulation.razor @@ -99,7 +99,7 @@ else stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/> } - @foreach (var region in currentRegions) + @foreach (var region in currentRegions) { var isActivated = activatedRegionNames.Contains(region.Name); var terrainColor = GetTerrainColor(region.Terrain); @@ -109,12 +109,57 @@ else var dr = prev != null ? region.PreyMeeples - prev.PreyMeeples : 0; var df = prev != null ? region.FloraMeeples - prev.FloraMeeples : 0; var hasDelta = dp != 0 || dr != 0 || df != 0; + + // Meeple dot counts (max 3 visible per type) + var pdots = Math.Min(region.PredatorMeeples, 3); + var rdots = Math.Min(region.PreyMeeples, 3); + var fdots = Math.Min(region.FloraMeeples, 3); + var dotR = 3; + var dotGap = 7; + + + @* Predator dots (red, top row) *@ + @for (int d = 0; d < pdots; d++) + { + var dx = region.X + (d - (pdots - 1) * 0.5) * dotGap; + var dy = region.Y - 7; + + } + @if (region.PredatorMeeples > 3) + { + @((MarkupString)$"+{region.PredatorMeeples - 3}") + } + + @* Prey dots (yellow, middle row) *@ + @for (int d = 0; d < rdots; d++) + { + var dx = region.X + (d - (rdots - 1) * 0.5) * dotGap; + var dy = region.Y; + + } + @if (region.PreyMeeples > 3) + { + @((MarkupString)$"+{region.PreyMeeples - 3}") + } + + @* Flora dots (green, bottom row) *@ + @for (int d = 0; d < fdots; d++) + { + var dx = region.X + (d - (fdots - 1) * 0.5) * dotGap; + var dy = region.Y + 7; + + } + @if (region.FloraMeeples > 3) + { + @((MarkupString)$"+{region.FloraMeeples - 3}") + } + @region.Name diff --git a/ET/Web/Services/GameSimulationService.cs b/ET/Web/Services/GameSimulationService.cs index ecaf2f9..3f49317 100644 --- a/ET/Web/Services/GameSimulationService.cs +++ b/ET/Web/Services/GameSimulationService.cs @@ -76,12 +76,7 @@ public class GameSimulationService public void RandomizeEvents() { - var initialRegions = Data.InitialRegions; - Data = new SimulationData(); - Data.Regions = initialRegions.Select(r => r.Clone()).ToList(); - Data.InitialRegions = initialRegions; - GenerateAndApplyEvents(); - Data.IsInitialized = true; + RunSimulation(); } public List GetCurrentState() @@ -181,22 +176,25 @@ public class GameSimulationService if (region.PredatorMeeples <= 0) return; - if (region.PreyMeeples > 0) + int total = region.PredatorMeeples; + int canEat = Math.Min(total, region.PreyMeeples); + int mustTravel = total - canEat; + + if (canEat > 0) { - int eaten = Math.Min(region.PredatorMeeples, region.PreyMeeples); - region.PreyMeeples -= eaten; - region.PredatorMeeples += eaten; - details.Add($"{region.Name}: Predators ate {eaten} prey, now {region.PredatorMeeples}P / {region.PreyMeeples}R"); + region.PreyMeeples -= canEat; + region.PredatorMeeples += canEat; + details.Add($"{region.Name}: {canEat} predators ate prey, +{canEat} new predators"); } - else + + if (mustTravel > 0) { var target = FindBestTravelTarget(region, r => r.PreyMeeples); if (target != null) { - int traveling = region.PredatorMeeples; - target.PredatorMeeples += traveling; - region.PredatorMeeples = 0; - details.Add($"{region.Name}: {traveling} predators traveled to {target.Name}"); + region.PredatorMeeples -= mustTravel; + target.PredatorMeeples += mustTravel; + details.Add($"{region.Name}: {mustTravel} predators traveled to {target.Name}"); } } } @@ -206,22 +204,25 @@ public class GameSimulationService if (region.PreyMeeples <= 0) return; - if (region.FloraMeeples > 0) + int total = region.PreyMeeples; + int canEat = Math.Min(total, region.FloraMeeples); + int mustTravel = total - canEat; + + if (canEat > 0) { - int consumed = Math.Min(region.PreyMeeples, region.FloraMeeples); - region.FloraMeeples -= consumed; - region.PreyMeeples += consumed; - details.Add($"{region.Name}: Prey consumed {consumed} flora, now {region.PreyMeeples}R / {region.FloraMeeples}F"); + region.FloraMeeples -= canEat; + region.PreyMeeples += canEat; + details.Add($"{region.Name}: {canEat} prey ate flora, +{canEat} new prey"); } - else + + if (mustTravel > 0) { var target = FindBestTravelTarget(region, r => r.FloraMeeples); if (target != null) { - int traveling = region.PreyMeeples; - target.PreyMeeples += traveling; - region.PreyMeeples = 0; - details.Add($"{region.Name}: {traveling} prey traveled to {target.Name}"); + region.PreyMeeples -= mustTravel; + target.PreyMeeples += mustTravel; + details.Add($"{region.Name}: {mustTravel} prey traveled to {target.Name}"); } } } @@ -314,14 +315,23 @@ public class GameSimulationService } } } + + var excluded = new HashSet + { + "Grass 1", "Grass 2", "Wasteland 1", + "Mountain 1", "Mountain 2", "Mountain 3", "Mountain 4", "Mountain 5" + }; var shuffled = combos.OrderBy(_ => _rng.Next()).ToList(); for (int i = 0; i < Data.Regions.Count; i++) { - var (p, r, f) = shuffled[i % shuffled.Count]; - Data.Regions[i].PredatorMeeples = p; - Data.Regions[i].PreyMeeples = r; - Data.Regions[i].FloraMeeples = f; + if (!excluded.Contains(Data.Regions[i].Name)) + { + var (p, r, f) = shuffled[i % shuffled.Count]; + Data.Regions[i].PredatorMeeples = p; + Data.Regions[i].PreyMeeples = r; + Data.Regions[i].FloraMeeples += f; + } } }