Updating peasants

This commit is contained in:
hz
2026-05-20 04:09:32 -05:00
parent 864835a8f9
commit 194dae43da
13 changed files with 557 additions and 62 deletions
@@ -7,6 +7,7 @@ public class UnitTrainingService
{
private const string ScoutUnitType = "Scout";
private const string ArcherUnitType = "Archer";
private const string PeasantUnitType = "Peasant";
private readonly IMongoCollection<UnitTraining> _training;
private readonly IMongoCollection<UnitInstance> _units;
@@ -16,8 +17,10 @@ public class UnitTrainingService
private readonly int _scoutGoldCost;
private readonly int _archerGoldCost;
private readonly int _archerWoodCost;
private readonly int _peasantGoldCost;
private readonly int _defaultScoutTrainingSeconds;
private readonly int _defaultArcherTrainingSeconds;
private readonly int _defaultPeasantTrainingSeconds;
private readonly int _visibilityDepth;
public UnitTrainingService(IConfiguration cfg, ResourceService resources, GameSettingsService settings)
@@ -34,12 +37,16 @@ public class UnitTrainingService
_scoutGoldCost = int.TryParse(cfg["Units:ScoutGoldCost"], out var scoutGoldCost) ? Math.Max(0, scoutGoldCost) : 50;
_archerGoldCost = int.TryParse(cfg["Units:ArcherGoldCost"], out var archerGoldCost) ? Math.Max(0, archerGoldCost) : 100;
_archerWoodCost = int.TryParse(cfg["Units:ArcherWoodCost"], out var archerWoodCost) ? Math.Max(0, archerWoodCost) : 100;
_peasantGoldCost = int.TryParse(cfg["Units:PeasantGoldCost"], out var peasantGoldCost) ? Math.Max(0, peasantGoldCost) : 25;
_defaultScoutTrainingSeconds = int.TryParse(cfg["Units:ScoutTrainingSeconds"], out var scoutTrainingSeconds)
? Math.Max(1, scoutTrainingSeconds)
: 60;
_defaultArcherTrainingSeconds = int.TryParse(cfg["Units:ArcherTrainingSeconds"], out var archerTrainingSeconds)
? Math.Max(1, archerTrainingSeconds)
: 60;
_defaultPeasantTrainingSeconds = int.TryParse(cfg["Units:PeasantTrainingSeconds"], out var peasantTrainingSeconds)
? Math.Max(1, peasantTrainingSeconds)
: 60;
_visibilityDepth = int.TryParse(cfg["World:VisibilityDepth"], out var visibilityDepth) ? Math.Max(0, visibilityDepth) : 3;
_training.Indexes.CreateOne(new CreateIndexModel<UnitTraining>(
@@ -64,6 +71,7 @@ public class UnitTrainingService
var allUnits = await _units.Find(x => x.Username == username).ToListAsync();
var completedScouts = allTraining.Count(x => x.UnitType == ScoutUnitType && x.Status == "Completed");
var completedArchers = allUnits.Count(x => x.UnitType == ArcherUnitType);
var completedPeasants = allUnits.Count(x => x.UnitType == PeasantUnitType && x.Status == "Idle");
var activeTraining = allTraining
.Where(x => x.Status == "Training")
.OrderBy(x => x.CompletesAtUtc)
@@ -74,6 +82,7 @@ public class UnitTrainingService
{
CompletedScouts = completedScouts,
CompletedArchers = completedArchers,
CompletedPeasants = completedPeasants,
Training = activeTraining,
Units = allUnits
.OrderBy(x => x.Q)
@@ -106,10 +115,20 @@ public class UnitTrainingService
throw new InvalidOperationException("A completed Barracks is required to train Archers.");
}
}
else if (normalizedUnitType == PeasantUnitType)
{
origin = await _locations.Find(x => x.OwnerUsername == username && x.Kind == "Home").FirstOrDefaultAsync();
if (origin is null)
{
throw new InvalidOperationException("A town hall is required to train Peasants.");
}
}
var goldCost = normalizedUnitType == ArcherUnitType
? await _settings.GetNonNegativeIntAsync(GameSettingsService.ArcherGoldCost, _archerGoldCost)
: await _settings.GetNonNegativeIntAsync(GameSettingsService.ScoutGoldCost, _scoutGoldCost);
: normalizedUnitType == PeasantUnitType
? await _settings.GetNonNegativeIntAsync(GameSettingsService.PeasantGoldCost, _peasantGoldCost)
: await _settings.GetNonNegativeIntAsync(GameSettingsService.ScoutGoldCost, _scoutGoldCost);
var woodCost = normalizedUnitType == ArcherUnitType
? await _settings.GetNonNegativeIntAsync(GameSettingsService.ArcherWoodCost, _archerWoodCost)
: 0;
@@ -124,6 +143,8 @@ public class UnitTrainingService
var now = DateTime.UtcNow;
var trainingSeconds = normalizedUnitType == ArcherUnitType
? await _settings.GetIntAsync(GameSettingsService.ArcherTrainingSeconds, _defaultArcherTrainingSeconds)
: normalizedUnitType == PeasantUnitType
? await _settings.GetIntAsync(GameSettingsService.PeasantTrainingSeconds, _defaultPeasantTrainingSeconds)
: await _settings.GetIntAsync(GameSettingsService.ScoutTrainingSeconds, _defaultScoutTrainingSeconds);
var training = new UnitTraining
{
@@ -350,7 +371,7 @@ public class UnitTrainingService
ReturnDocument = ReturnDocument.After
});
if (completed is null || completed.UnitType != ArcherUnitType)
if (completed is null || (completed.UnitType != ArcherUnitType && completed.UnitType != PeasantUnitType))
{
continue;
}
@@ -358,7 +379,7 @@ public class UnitTrainingService
var unit = new UnitInstance
{
Username = completed.Username,
UnitType = ArcherUnitType,
UnitType = completed.UnitType,
Q = completed.OriginQ ?? 0,
R = completed.OriginR ?? 0,
Status = "Idle",
@@ -384,6 +405,7 @@ public class UnitTrainingService
{
"scout" => ScoutUnitType,
"archer" => ArcherUnitType,
"peasant" => PeasantUnitType,
_ => null
};
}