initial commit
[browser-rts.git] / src / tasks / fight.ts
1 import { ArmyQueue } from "../repository/army"
2 import { Task } from "./task";
3 import { CityRepository, City } from "../repository/city";
4 import { MailRepository } from "../repository/mail";
5
6 const cityRepo = new CityRepository();
7 const mailRepo = new MailRepository();
8
9 export const fight = new Task<ArmyQueue>('fights', async (task, job) => {
10     const army = await cityRepo.armyRepository.FindOne({
11         id: job.data.id
12     });
13
14     if(!army) {
15         console.error(`${job.data.id} is not a valid fight`);
16         return;
17     }
18
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})
23     ]);
24
25     if(!attacker) {
26         console.error(`Attacker ${army.your_city} does not exist`);
27         return;
28     }
29
30     if(!attacked) {
31         console.error(`Attacked city ${army.attacked_city} does not exist`);
32         return;
33     }
34
35     // lets do the killing!
36     const attackerPower = await cityRepo.power(army);
37     const defencePower = await cityRepo.power(attacked);
38
39     const ratio = attackerPower/defencePower;
40
41     if(ratio > 0.95) {
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),
49         };
50
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),
61         };
62
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;
68
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);
74
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;
84
85         await Promise.all([
86             cityRepo.save(attacker),
87             cityRepo.save(attacked),
88             cityRepo.armyRepository.Delete({id: army.id}),
89             mailRepo.createSystemMessage(
90                 '-',
91                 attacker.id,
92                 `You assault on (${attacked.location_x}, ${attacked.location_y}) was a success!`,
93                 `
94                 <b>Your assault was a success!</b>
95                 You pillaged:
96                 <table>
97                 <tr>
98                     <th>Gold</th><td>${defenderLosses.gold}</td>
99                 </tr>
100                 <tr>
101                     <th>Logs</th><td>${defenderLosses.logs}</td>
102                 </tr>
103                 <tr>
104                     <th>Ore</th><td>${defenderLosses.ore}</td>
105                 </tr>
106                 <tr>
107                     <th>Land</th><td>${defenderLosses.land}</td>
108                 </tr>
109                 </table?>
110
111
112                 You lost: 
113                 <table>
114                 <tr>
115                     <th>Soldiers</th><td>${attackerLosses.soldiers}</td>
116                 </tr>
117                 <tr>
118                     <th>Attackers</th><td>${attackerLosses.attackers}</td>
119                 </tr>
120                 <tr>
121                     <th>Defenders</th><td>${attackerLosses.defenders}</td>
122                 </tr>
123                 <tr>
124                     <th>Sp. Attackers</th><td>${attackerLosses.sp_attackers}</td>
125                 </tr>
126                 <tr>
127                     <th>Sp. Defenders</th><td>${attackerLosses.sp_defenders}</td>
128                 </tr>
129                 </table>
130                 `
131             ),
132             mailRepo.createSystemMessage(
133                 '-',
134                 attacker.id,
135                 `You were attacked by (${attacker.location_x}, ${attacker.location_y})`,
136                 `
137                 <b>Your army was defeated!</b>
138                 You Lost:
139                 <table>
140                 <tr>
141                     <th>Gold</th><td>${defenderLosses.gold}</td>
142                 </tr>
143                 <tr>
144                     <th>Logs</th><td>${defenderLosses.logs}</td>
145                 </tr>
146                 <tr>
147                     <th>Ore</th><td>${defenderLosses.ore}</td>
148                 </tr>
149                 <tr>
150                     <th>Land</th><td>${defenderLosses.land}</td>
151                 </tr>
152                 <tr>
153                     <th>Soldiers</th><td>${attackerLosses.soldiers}</td>
154                 </tr>
155                 <tr>
156                     <th>Attackers</th><td>${attackerLosses.attackers}</td>
157                 </tr>
158                 <tr>
159                     <th>Defenders</th><td>${attackerLosses.defenders}</td>
160                 </tr>
161                 <tr>
162                     <th>Sp. Attackers</th><td>${attackerLosses.sp_attackers}</td>
163                 </tr>
164                 <tr>
165                     <th>Sp. Defenders</th><td>${attackerLosses.sp_defenders}</td>
166                 </tr>
167                 </table>
168                 `
169             ),
170         ]);
171     }
172     else {
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)
181         };
182
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)
189         };
190
191
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);
197
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;
203
204         await Promise.all([
205             cityRepo.save(attacker),
206             cityRepo.save(attacked),
207             cityRepo.armyRepository.Delete({id: army.id}),
208             mailRepo.createSystemMessage(
209                 '-',
210                 attacker.id,
211                 `You assault on (${attacked.location_x}, ${attacked.location_y}) failed!`,
212                 `
213                 <b>Your assault was repelled!</b>
214                 You lost: 
215                 <table>
216                 <tr>
217                     <th>Soldiers</th><td>${attackerLosses.soldiers}</td>
218                 </tr>
219                 <tr>
220                     <th>Attackers</th><td>${attackerLosses.attackers}</td>
221                 </tr>
222                 <tr>
223                     <th>Defenders</th><td>${attackerLosses.defenders}</td>
224                 </tr>
225                 <tr>
226                     <th>Sp. Attackers</th><td>${attackerLosses.sp_attackers}</td>
227                 </tr>
228                 <tr>
229                     <th>Sp. Defenders</th><td>${attackerLosses.sp_defenders}</td>
230                 </tr>
231                 </table>
232                 `
233             ),
234             mailRepo.createSystemMessage(
235                 '-',
236                 attacked.id,
237                 `You repelled the assault by (${attacker.location_x},${attacker.location_y})`,
238                 `
239                 <b>You successfully repelled the attack!</b>
240                 You Lost <table>
241                 <tr>
242                     <th>Soldiers</th><td>${defenderLosses.soldiers}</td>
243                 </tr>
244                 <tr>
245                     <th>Attackers</th><td>${defenderLosses.attackers}</td>
246                 </tr>
247                 <tr>
248                     <th>Defenders</th><td>${defenderLosses.defenders}</td>
249                 </tr>
250                 <tr>
251                     <th>Sp. Attackers</th><td>${defenderLosses.sp_attackers}</td>
252                 </tr>
253                 <tr>
254                     <th>Sp. Defenders</th><td>${defenderLosses.sp_defenders}</td>
255                 </tr>
256                 </table>:
257                 `
258             )
259         ]);
260     }
261
262 });