S3-01 + S3-02

This commit is contained in:
2026-03-09 17:50:49 +08:00
parent 793a87c171
commit 88641f17b0
19 changed files with 838 additions and 46 deletions
@@ -6,35 +6,75 @@ namespace GeometryTD.CustomUtility
{
public static class InventoryParticipantUtility
{
public static bool TryAddParticipantTower(BackpackInventoryData inventory, long towerInstanceId, int maxCount)
public static ParticipantTowerAssignResult TryAddParticipantTower(
BackpackInventoryData inventory,
long towerInstanceId,
int maxCount)
{
if (inventory == null || towerInstanceId <= 0)
{
return false;
return new ParticipantTowerAssignResult
{
TowerInstanceId = towerInstanceId,
FailureReason = ParticipantTowerAssignFailureReason.TowerMissing,
ValidationFailureReason = CombatParticipantTowerValidationFailureReason.None
};
}
int resolvedMaxCount = Mathf.Max(1, maxCount);
NormalizeParticipantState(inventory, resolvedMaxCount);
if (!TryGetTowerById(inventory, towerInstanceId, out TowerItemData tower))
CombatParticipantTowerValidationResult validationResult =
CombatParticipantTowerValidationService.ValidateTower(inventory, towerInstanceId);
if (!validationResult.IsValid)
{
return false;
return new ParticipantTowerAssignResult
{
TowerInstanceId = towerInstanceId,
FailureReason = validationResult.FailureReason == CombatParticipantTowerValidationFailureReason.TowerMissing
? ParticipantTowerAssignFailureReason.TowerMissing
: ParticipantTowerAssignFailureReason.InvalidTower,
ValidationFailureReason = validationResult.FailureReason
};
}
inventory.ParticipantTowerInstanceIds ??= new List<long>();
if (inventory.ParticipantTowerInstanceIds.Contains(towerInstanceId))
{
tower.IsParticipatingInCombat = true;
return false;
if (validationResult.Tower != null)
{
validationResult.Tower.IsParticipatingInCombat = true;
}
return new ParticipantTowerAssignResult
{
TowerInstanceId = towerInstanceId,
FailureReason = ParticipantTowerAssignFailureReason.AlreadyAssigned,
ValidationFailureReason = CombatParticipantTowerValidationFailureReason.None
};
}
if (inventory.ParticipantTowerInstanceIds.Count >= resolvedMaxCount)
{
return false;
return new ParticipantTowerAssignResult
{
TowerInstanceId = towerInstanceId,
FailureReason = ParticipantTowerAssignFailureReason.ParticipantAreaFull,
ValidationFailureReason = CombatParticipantTowerValidationFailureReason.None
};
}
inventory.ParticipantTowerInstanceIds.Add(towerInstanceId);
tower.IsParticipatingInCombat = true;
return true;
if (validationResult.Tower != null)
{
validationResult.Tower.IsParticipatingInCombat = true;
}
return new ParticipantTowerAssignResult
{
TowerInstanceId = towerInstanceId,
FailureReason = ParticipantTowerAssignFailureReason.None,
ValidationFailureReason = CombatParticipantTowerValidationFailureReason.None
};
}
public static bool TryRemoveParticipantTower(BackpackInventoryData inventory, long towerInstanceId, int maxCount)