-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBattleReportGenerator.cs
More file actions
115 lines (103 loc) · 4.29 KB
/
BattleReportGenerator.cs
File metadata and controls
115 lines (103 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using BrowserGameEngine.GameDefinition;
using BrowserGameEngine.GameModel;
using BrowserGameEngine.StatefulGameServer.Notifications;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BrowserGameEngine.StatefulGameServer {
public class BattleReportGenerator {
private readonly PlayerRepository playerRepository;
private readonly MessageRepositoryWrite messageRepositoryWrite;
private readonly GameDef gameDef;
private readonly IPlayerNotificationService playerNotificationService;
public BattleReportGenerator(
PlayerRepository playerRepository,
MessageRepositoryWrite messageRepositoryWrite,
GameDef gameDef,
IPlayerNotificationService playerNotificationService
) {
this.playerRepository = playerRepository;
this.messageRepositoryWrite = messageRepositoryWrite;
this.gameDef = gameDef;
this.playerNotificationService = playerNotificationService;
}
public void GenerateReports(BattleResult battleResult) {
var attacker = playerRepository.Get(battleResult.Attacker);
var defender = playerRepository.Get(battleResult.Defender);
var attackerRace = GetRaceName(attacker.PlayerType);
var defenderRace = GetRaceName(defender.PlayerType);
bool attackerWon = !battleResult.BtlResult.DefendingUnitsSurvived.Any()
&& battleResult.BtlResult.AttackingUnitsSurvived.Any();
bool draw = !battleResult.BtlResult.AttackingUnitsSurvived.Any() && !battleResult.BtlResult.DefendingUnitsSurvived.Any();
string outcome = attackerWon ? "Attacker won" : draw ? "Draw" : "Defender won";
var resourcesStolen = battleResult.BtlResult.ResourcesStolen
.SelectMany(c => c.Resources)
.GroupBy(x => x.Key.Id)
.ToDictionary(g => g.Key, g => g.Sum(x => x.Value));
string body = BuildBody(
attacker.Name, attackerRace,
defender.Name, defenderRace,
outcome,
(int)battleResult.BtlResult.LandTransferred,
battleResult.BtlResult.WorkersCaptured,
resourcesStolen,
battleResult.BtlResult.AttackingUnitsDestroyed,
battleResult.BtlResult.DefendingUnitsDestroyed
);
messageRepositoryWrite.SendMessage(
battleResult.Attacker,
$"Battle Report vs {defender.Name}",
body
);
messageRepositoryWrite.SendMessage(
battleResult.Defender,
$"Battle Report vs {attacker.Name}",
body
);
if (defender.UserId != null) {
playerNotificationService.Push(defender.UserId, $"Your base was attacked by {attacker.Name}! ({outcome})", NotificationKind.Warning);
}
if (attacker.UserId != null) {
string pillageNote = resourcesStolen.Count > 0
? $" Pillaged: {string.Join(", ", resourcesStolen.Select(kv => $"{kv.Value} {kv.Key}"))}"
: string.Empty;
playerNotificationService.Push(attacker.UserId, $"Battle vs {defender.Name}: {outcome}.{pillageNote}", attackerWon ? NotificationKind.Info : NotificationKind.Warning);
}
}
private string GetRaceName(PlayerTypeDefId playerTypeDefId) {
return gameDef.PlayerTypes.SingleOrDefault(x => x.Id.Equals(playerTypeDefId))?.Name ?? playerTypeDefId.Id;
}
private string BuildBody(
string attackerName, string attackerRace,
string defenderName, string defenderRace,
string outcome,
int landTransferred,
int workersCaptured,
Dictionary<string, decimal> resourcesStolen,
List<UnitCount> attackerLosses,
List<UnitCount> defenderLosses
) {
var sb = new StringBuilder();
sb.AppendLine($"Attacker: {attackerName} ({attackerRace})");
sb.AppendLine($"Defender: {defenderName} ({defenderRace})");
sb.AppendLine($"Outcome: {outcome}");
sb.AppendLine($"Land transferred: {landTransferred}");
if (workersCaptured > 0) sb.AppendLine($"Workers captured: {workersCaptured}");
if (resourcesStolen.Count > 0) {
var stolen = string.Join(", ", resourcesStolen.Select(kv => $"{kv.Value} {kv.Key}"));
sb.AppendLine($"Resources pillaged: {stolen}");
}
sb.AppendLine($"Attacker losses: {FormatUnitBreakdown(attackerLosses)}");
sb.AppendLine($"Defender losses: {FormatUnitBreakdown(defenderLosses)}");
return sb.ToString();
}
private string FormatUnitBreakdown(List<UnitCount> unitCounts) {
if (!unitCounts.Any()) return "none";
return string.Join(", ", unitCounts.Select(uc => {
var unitDef = gameDef.GetUnitDef(uc.UnitDefId);
var name = unitDef?.Name ?? uc.UnitDefId.Id;
return $"{uc.Count}x {name}";
}));
}
}
}