1 import { ArmyQueue } from "../repository/army"
2 import { Task } from "./task";
3 import { CityRepository, City } from "../repository/city";
4 import { MailRepository } from "../repository/mail";
6 const cityRepo = new CityRepository();
7 const mailRepo = new MailRepository();
9 export const fight = new Task<ArmyQueue>('fights', async (task, job) => {
10 const army = await cityRepo.armyRepository.FindOne({
15 console.error(`${job.data.id} is not a valid fight`);
19 // lets get the two cities!
20 const [attacker, attacked] = await Promise.all<City>([
21 cityRepo.FindOne({id: army.your_city}),
22 cityRepo.FindOne({id: army.attacked_city})
26 console.error(`Attacker ${army.your_city} does not exist`);
31 console.error(`Attacked city ${army.attacked_city} does not exist`);
35 // lets do the killing!
36 const attackerPower = await cityRepo.power(army);
37 const defencePower = await cityRepo.power(attacked);
39 const ratio = attackerPower/defencePower;
42 // you've won, here are your spoils
43 const attackerLosses = {
44 soldiers: Math.floor(army.soldiers * 0.07),
45 attackers: Math.floor(army.attackers * 0.07),
46 defenders: Math.floor(army.defenders * 0.07),
47 sp_attackers: Math.floor(army.sp_attackers * 0.07),
48 sp_defenders: Math.floor(army.sp_defenders * 0.07),
51 const defenderLosses = {
52 soldiers: Math.floor(attacked.soldiers * 0.05),
53 attackers: Math.floor(attacked.attackers * 0.05),
54 defenders: Math.floor(attacked.defenders * 0.05),
55 sp_attackers: Math.floor(attacked.sp_attackers * 0.05),
56 sp_defenders: Math.floor(attacked.sp_defenders * 0.05),
57 gold: Math.floor(attacked.gold * 0.2),
58 logs: Math.floor(attacked.logs * 0.2),
59 ore: Math.floor(attacked.ore * 0.2),
60 land: Math.floor(attacked.totalSpace * 0.15),
63 // ok you have everything, lets return you home
64 attacker.gold += defenderLosses.gold;
65 attacker.logs += defenderLosses.gold;
66 attacker.ore += defenderLosses.ore;
67 attacker.totalSpace += defenderLosses.land;
69 attacker.soldiers += (army.soldiers - attackerLosses.soldiers);
70 attacker.attackers += (army.attackers - attackerLosses.attackers);
71 attacker.defenders += (army.defenders - attackerLosses.defenders);
72 attacker.sp_attackers += (army.sp_attackers - attackerLosses.sp_attackers);
73 attacker.sp_defenders += (army.sp_defenders - attackerLosses.sp_defenders);
75 attacked.soldiers -= defenderLosses.soldiers;
76 attacked.attackers -= defenderLosses.attackers;
77 attacked.defenders -= defenderLosses.defenders;
78 attacked.sp_attackers -= defenderLosses.sp_attackers;
79 attacked.sp_defenders -= defenderLosses.sp_defenders;
80 attacked.gold -= defenderLosses.gold;
81 attacked.logs -= defenderLosses.logs;
82 attacked.ore -= defenderLosses.ore;
83 attacked.totalSpace -= defenderLosses.land;
86 cityRepo.save(attacker),
87 cityRepo.save(attacked),
88 cityRepo.armyRepository.Delete({id: army.id}),
89 mailRepo.createSystemMessage(
92 `You assault on (${attacked.location_x}, ${attacked.location_y}) was a success!`,
94 <b>Your assault was a success!</b>
98 <th>Gold</th><td>${defenderLosses.gold}</td>
101 <th>Logs</th><td>${defenderLosses.logs}</td>
104 <th>Ore</th><td>${defenderLosses.ore}</td>
107 <th>Land</th><td>${defenderLosses.land}</td>
115 <th>Soldiers</th><td>${attackerLosses.soldiers}</td>
118 <th>Attackers</th><td>${attackerLosses.attackers}</td>
121 <th>Defenders</th><td>${attackerLosses.defenders}</td>
124 <th>Sp. Attackers</th><td>${attackerLosses.sp_attackers}</td>
127 <th>Sp. Defenders</th><td>${attackerLosses.sp_defenders}</td>
132 mailRepo.createSystemMessage(
135 `You were attacked by (${attacker.location_x}, ${attacker.location_y})`,
137 <b>Your army was defeated!</b>
141 <th>Gold</th><td>${defenderLosses.gold}</td>
144 <th>Logs</th><td>${defenderLosses.logs}</td>
147 <th>Ore</th><td>${defenderLosses.ore}</td>
150 <th>Land</th><td>${defenderLosses.land}</td>
153 <th>Soldiers</th><td>${attackerLosses.soldiers}</td>
156 <th>Attackers</th><td>${attackerLosses.attackers}</td>
159 <th>Defenders</th><td>${attackerLosses.defenders}</td>
162 <th>Sp. Attackers</th><td>${attackerLosses.sp_attackers}</td>
165 <th>Sp. Defenders</th><td>${attackerLosses.sp_defenders}</td>
173 // you lost, lets kill a larger percent of your atm
174 // you've won, here are your spoils
175 const attackerLosses = {
176 soldiers: Math.floor(army.soldiers * 0.12),
177 attackers: Math.floor(army.attackers * 0.12),
178 defenders: Math.floor(army.defenders * 0.12),
179 sp_attackers: Math.floor(army.sp_attackers * 0.12),
180 sp_defenders: Math.floor(army.sp_defenders * 0.12)
183 const defenderLosses = {
184 soldiers: Math.floor(attacked.soldiers * 0.03),
185 attackers: Math.floor(attacked.attackers * 0.03),
186 defenders: Math.floor(attacked.defenders * 0.03),
187 sp_attackers: Math.floor(attacked.sp_attackers * 0.03),
188 sp_defenders: Math.floor(attacked.sp_defenders * 0.03)
192 attacker.soldiers += (army.soldiers - attackerLosses.soldiers);
193 attacker.attackers += (army.attackers - attackerLosses.attackers);
194 attacker.defenders += (army.defenders - attackerLosses.defenders);
195 attacker.sp_attackers += (army.sp_attackers - attackerLosses.sp_attackers);
196 attacker.sp_defenders += (army.sp_defenders - attackerLosses.sp_defenders);
198 attacked.soldiers -= defenderLosses.soldiers;
199 attacked.attackers -= defenderLosses.attackers;
200 attacked.defenders -= defenderLosses.defenders;
201 attacked.sp_attackers -= defenderLosses.sp_attackers;
202 attacked.sp_defenders -= defenderLosses.sp_defenders;
205 cityRepo.save(attacker),
206 cityRepo.save(attacked),
207 cityRepo.armyRepository.Delete({id: army.id}),
208 mailRepo.createSystemMessage(
211 `You assault on (${attacked.location_x}, ${attacked.location_y}) failed!`,
213 <b>Your assault was repelled!</b>
217 <th>Soldiers</th><td>${attackerLosses.soldiers}</td>
220 <th>Attackers</th><td>${attackerLosses.attackers}</td>
223 <th>Defenders</th><td>${attackerLosses.defenders}</td>
226 <th>Sp. Attackers</th><td>${attackerLosses.sp_attackers}</td>
229 <th>Sp. Defenders</th><td>${attackerLosses.sp_defenders}</td>
234 mailRepo.createSystemMessage(
237 `You repelled the assault by (${attacker.location_x},${attacker.location_y})`,
239 <b>You successfully repelled the attack!</b>
242 <th>Soldiers</th><td>${defenderLosses.soldiers}</td>
245 <th>Attackers</th><td>${defenderLosses.attackers}</td>
248 <th>Defenders</th><td>${defenderLosses.defenders}</td>
251 <th>Sp. Attackers</th><td>${defenderLosses.sp_attackers}</td>
254 <th>Sp. Defenders</th><td>${defenderLosses.sp_defenders}</td>