RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
CombatSpell.java
1package com.osroyale.game.world.entity.combat.magic;
2
3import com.osroyale.content.skill.impl.magic.Spellbook;
4import com.osroyale.game.Animation;
5import com.osroyale.game.Graphic;
6import com.osroyale.game.world.entity.combat.CombatImpact;
7import com.osroyale.game.world.entity.combat.projectile.CombatProjectile;
8import com.osroyale.game.world.entity.mob.Mob;
9import com.osroyale.game.world.items.Item;
10
11import java.util.HashMap;
12import java.util.Map;
13import java.util.Optional;
14
15import static com.osroyale.game.world.entity.combat.projectile.CombatProjectile.getDefinition;
16
35
36public enum CombatSpell {
37 WIND_STRIKE(Spellbook.MODERN, 1152, 1, 5.5f, null,
38 getDefinition("Wind Strike"),
39 new RequiredRune[]{
40 new RequiredRune(MagicRune.AIR_RUNE, 1),
41 new RequiredRune(MagicRune.MIND_RUNE, 1)
42 }
43 ),
44
45 WATER_STRIKE(Spellbook.MODERN, 1154, 5, 7.5f, null,
46 getDefinition("Water Strike"),
47 new RequiredRune[]{
48 new RequiredRune(MagicRune.AIR_RUNE, 1),
49 new RequiredRune(MagicRune.MIND_RUNE, 1),
50 new RequiredRune(MagicRune.WATER_RUNE, 1)
51 }
52 ),
53
54 EARTH_STRIKE(Spellbook.MODERN, 1156, 9, 9.5f, null,
55 getDefinition("Earth Strike"),
56 new RequiredRune[]{
57 new RequiredRune(MagicRune.AIR_RUNE, 1),
58 new RequiredRune(MagicRune.MIND_RUNE, 1),
59 new RequiredRune(MagicRune.EARTH_RUNE, 2)
60 }
61 ),
62
63 FIRE_STRIKE(Spellbook.MODERN, 1158, 13, 11.5f, null,
64 getDefinition("Fire Strike"),
65 new RequiredRune[]{
66 new RequiredRune(MagicRune.AIR_RUNE, 2),
67 new RequiredRune(MagicRune.MIND_RUNE, 1),
68 new RequiredRune(MagicRune.FIRE_RUNE, 3)
69 }
70 ),
71
72 WIND_BOLT(Spellbook.MODERN, 1160, 17, 13.5f, null,
73 getDefinition("Wind Bolt"),
74 new RequiredRune[]{
75 new RequiredRune(MagicRune.AIR_RUNE, 2),
76 new RequiredRune(MagicRune.CHAOS_RUNE, 1)
77 }
78 ),
79
80 WATER_BOLT(Spellbook.MODERN, 1163, 23, 16.5f, null,
81 getDefinition("Water Bolt"),
82 new RequiredRune[]{
83 new RequiredRune(MagicRune.AIR_RUNE, 2),
84 new RequiredRune(MagicRune.CHAOS_RUNE, 1),
85 new RequiredRune(MagicRune.WATER_RUNE, 2)
86 }
87 ),
88
89 EARTH_BOLT(Spellbook.MODERN, 1166, 29, 19.5f, null,
90 getDefinition("Earth Bolt"),
91 new RequiredRune[]{
92 new RequiredRune(MagicRune.AIR_RUNE, 2),
93 new RequiredRune(MagicRune.CHAOS_RUNE, 1),
94 new RequiredRune(MagicRune.EARTH_RUNE, 3)
95 }
96 ),
97
98 FIRE_BOLT(Spellbook.MODERN, 1169, 35, 22.5f, null,
99 getDefinition("Fire Bolt"),
100 new RequiredRune[]{
101 new RequiredRune(MagicRune.AIR_RUNE, 3),
102 new RequiredRune(MagicRune.CHAOS_RUNE, 1),
103 new RequiredRune(MagicRune.FIRE_RUNE, 4)
104 }
105 ),
106
107 CRUMBLE_UNDEAD(Spellbook.MODERN, 1171, 39, 24.0f, null,
108 getDefinition("Crumble Undead"),
109 new RequiredRune[]{
110 new RequiredRune(MagicRune.EARTH_RUNE, 2),
111 new RequiredRune(MagicRune.AIR_RUNE, 2),
112 new RequiredRune(MagicRune.CHAOS_RUNE, 1)
113 }),
114
115 WIND_BLAST(Spellbook.MODERN, 1172, 41, 25.5f, null,
116 getDefinition("Wind Blast"),
117 new RequiredRune[]{
118 new RequiredRune(MagicRune.AIR_RUNE, 3),
119 new RequiredRune(MagicRune.DEATH_RUNE, 1)
120 }
121 ),
122
123 WATER_BLAST(Spellbook.MODERN, 1175, 47, 28.5f, null,
124 getDefinition("Water Blast"),
125 new RequiredRune[]{
126 new RequiredRune(MagicRune.AIR_RUNE, 3),
127 new RequiredRune(MagicRune.WATER_RUNE, 3),
128 new RequiredRune(MagicRune.DEATH_RUNE, 1)
129 }
130 ),
131
132 EARTH_BLAST(Spellbook.MODERN, 1177, 53, 31.5f, null,
133 getDefinition("Earth Blast"),
134 new RequiredRune[]{
135 new RequiredRune(MagicRune.AIR_RUNE, 3),
136 new RequiredRune(MagicRune.EARTH_RUNE, 4),
137 new RequiredRune(MagicRune.DEATH_RUNE, 1)
138 }
139 ),
140
141 FIRE_BLAST(Spellbook.MODERN, 1181, 59, 34.5f, null,
142 getDefinition("Fire Blast"),
143 new RequiredRune[]{
144 new RequiredRune(MagicRune.AIR_RUNE, 4),
145 new RequiredRune(MagicRune.FIRE_RUNE, 5),
146 new RequiredRune(MagicRune.DEATH_RUNE, 1)
147 }
148 ),
149
150 WIND_WAVE(Spellbook.MODERN, 1183, 62, 36.0f, null,
151 getDefinition("Wind Wave"),
152 new RequiredRune[]{
153 new RequiredRune(MagicRune.AIR_RUNE, 5),
154 new RequiredRune(MagicRune.BLOOD_RUNE, 1)
155 }
156 ),
157
158 WATER_WAVE(Spellbook.MODERN, 1185, 65, 37.5f, null,
159 getDefinition("Water Wave"),
160 new RequiredRune[]{
161 new RequiredRune(MagicRune.AIR_RUNE, 5),
162 new RequiredRune(MagicRune.BLOOD_RUNE, 1),
163 new RequiredRune(MagicRune.WATER_RUNE, 7)
164 }
165 ),
166
167 EARTH_WAVE(Spellbook.MODERN, 1188, 70, 40.0f, null,
168 getDefinition("Earth Wave"),
169 new RequiredRune[]{
170 new RequiredRune(MagicRune.AIR_RUNE, 5),
171 new RequiredRune(MagicRune.BLOOD_RUNE, 1),
172 new RequiredRune(MagicRune.EARTH_RUNE, 7)
173 }
174 ),
175
176 FIRE_WAVE(Spellbook.MODERN, 1189, 75, 42.5f, null,
177 getDefinition("Fire Wave"),
178 new RequiredRune[]{
179 new RequiredRune(MagicRune.AIR_RUNE, 5),
180 new RequiredRune(MagicRune.BLOOD_RUNE, 1),
181 new RequiredRune(MagicRune.FIRE_RUNE, 7)
182 }
183 ),
184
185 SARADOMIN_STRIKE(Spellbook.MODERN, 1190, 60, 20.0f, null,
186 getDefinition("Saradomin Strike"),
187 new RequiredRune[]{
188 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
189 new RequiredRune(MagicRune.FIRE_RUNE, 2),
190 new RequiredRune(MagicRune.AIR_RUNE, 4)
191 }
192 ),
193
194 CLAWS_OF_GUTHIX(Spellbook.MODERN, 1191, 60, 20.0f, null,
195 getDefinition("Claws of Guthix"),
196 new RequiredRune[]{
197 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
198 new RequiredRune(MagicRune.FIRE_RUNE, 2),
199 new RequiredRune(MagicRune.AIR_RUNE, 4)
200 }
201 ),
202
203 FLAMES_OF_ZAMORAK(Spellbook.MODERN, 1192, 60, 20.0f, null,
204 getDefinition("Flames of Zamorak"),
205 new RequiredRune[]{
206 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
207 new RequiredRune(MagicRune.FIRE_RUNE, 2),
208 new RequiredRune(MagicRune.AIR_RUNE, 4)
209 }
210 ),
211
212 BIND(Spellbook.MODERN, 1572, 20, 30.0f, null,
213 getDefinition("Bind"),
214 new RequiredRune[]{
215 new RequiredRune(MagicRune.NATURE_RUNE, 2),
216 new RequiredRune(MagicRune.EARTH_RUNE, 3),
217 new RequiredRune(MagicRune.WATER_RUNE, 3)
218 }
219 ),
220
221 IBAN_BLAST(Spellbook.MODERN, 1539, 50, 30.0f, new Item(1409),
222 getDefinition("Iban Blast"),
223 new RequiredRune[]{
224 new RequiredRune(MagicRune.FIRE_RUNE, 5),
225 new RequiredRune(MagicRune.DEATH_RUNE, 1)
226 }
227 ),
228
229 MAGIC_DART(Spellbook.MODERN, 12037, 50, 30.0f, new Item(4170),
230 getDefinition("Magic Dart"),
231 new RequiredRune[]{
232 new RequiredRune(MagicRune.DEATH_RUNE, 1),
233 new RequiredRune(MagicRune.MIND_RUNE, 4),
234 }
235 ),
236
237 SNARE(Spellbook.MODERN, 1582, 50, 60.0f, null,
238 getDefinition("Snare"),
239 new RequiredRune[]{
240 new RequiredRune(MagicRune.NATURE_RUNE, 3),
241 new RequiredRune(MagicRune.EARTH_RUNE, 4),
242 new RequiredRune(MagicRune.WATER_RUNE, 4)
243 }
244 ),
245
246 ENTANGLE(Spellbook.MODERN, 1592, 79, 89.0f, null,
247 getDefinition("Entangle"),
248 new RequiredRune[]{
249 new RequiredRune(MagicRune.NATURE_RUNE, 4),
250 new RequiredRune(MagicRune.EARTH_RUNE, 5),
251 new RequiredRune(MagicRune.WATER_RUNE, 5)
252 }
253 ),
254
255 CONFUSE(Spellbook.MODERN, 1153, 3, 13.0f, null,
256 getDefinition("Confuse"),
257 new RequiredRune[]{
258 new RequiredRune(MagicRune.WATER_RUNE, 3),
259 new RequiredRune(MagicRune.EARTH_RUNE, 2),
260 new RequiredRune(MagicRune.BODY_RUNE, 1)
261 }
262 ),
263
264 WEAKEN(Spellbook.MODERN, 1157, 11, 20.5f, null,
265 getDefinition("Weaken"),
266 new RequiredRune[]{
267 new RequiredRune(MagicRune.WATER_RUNE, 3),
268 new RequiredRune(MagicRune.EARTH_RUNE, 2),
269 new RequiredRune(MagicRune.BODY_RUNE, 1)
270 }
271 ),
272
273 CURSE(Spellbook.MODERN, 1161, 19, 29.0f, null,
274 getDefinition("Curse"),
275 new RequiredRune[]{
276 new RequiredRune(MagicRune.WATER_RUNE, 2),
277 new RequiredRune(MagicRune.EARTH_RUNE, 3),
278 new RequiredRune(MagicRune.BODY_RUNE, 1)
279 }
280 ),
281
282 VULNERABILITY(Spellbook.MODERN, 1542, 66, 76.0f, null,
283 getDefinition("Vulnerability"),
284 new RequiredRune[]{
285 new RequiredRune(MagicRune.WATER_RUNE, 5),
286 new RequiredRune(MagicRune.EARTH_RUNE, 5),
287 new RequiredRune(MagicRune.SOUL_RUNE, 1)
288 }
289 ),
290
291 ENFEEBLE(Spellbook.MODERN, 1543, 73, 83.0f, null,
292 getDefinition("Enfeeble"),
293 new RequiredRune[]{
294 new RequiredRune(MagicRune.WATER_RUNE, 8),
295 new RequiredRune(MagicRune.EARTH_RUNE, 8),
296 new RequiredRune(MagicRune.SOUL_RUNE, 1)
297 }
298 ),
299
300 STUN(Spellbook.MODERN, 1562, 73, 90.0f, null,
301 getDefinition("Stun"),
302 new RequiredRune[]{
303 new RequiredRune(MagicRune.WATER_RUNE, 12),
304 new RequiredRune(MagicRune.EARTH_RUNE, 12),
305 new RequiredRune(MagicRune.SOUL_RUNE, 1)
306 }
307 ),
308
309 TELE_BLOCK(Spellbook.MODERN, 12445, 85, 42.5f, null,
310 getDefinition("Teleblock"),
311 new RequiredRune[]{
312 new RequiredRune(MagicRune.LAW_RUNE, 1),
313 new RequiredRune(MagicRune.DEATH_RUNE, 1),
314 new RequiredRune(MagicRune.CHAOS_RUNE, 1)
315 }
316 ),
317
318 WIND_SURGE(Spellbook.MODERN, 40140, 82, 44.5f, null,
319 getDefinition("Wind Surge"),
320 new RequiredRune[]{
321 new RequiredRune(MagicRune.AIR_RUNE, 7),
322 new RequiredRune(MagicRune.WRATH_RUNE, 1)
323 }
324 ),
325
326 WATER_SURGE(Spellbook.MODERN, 40150, 85, 46.5f, null,
327 getDefinition("Water Surge"),
328 new RequiredRune[]{
329 new RequiredRune(MagicRune.AIR_RUNE, 7),
330 new RequiredRune(MagicRune.WATER_RUNE, 10),
331 new RequiredRune(MagicRune.WRATH_RUNE, 1)
332 }
333 ),
334
335 EARTH_SURGE(Spellbook.MODERN, 40170, 90, 48.5f, null,
336 getDefinition("Earth Surge"),
337 new RequiredRune[]{
338 new RequiredRune(MagicRune.AIR_RUNE, 7),
339 new RequiredRune(MagicRune.EARTH_RUNE, 10),
340 new RequiredRune(MagicRune.WRATH_RUNE, 1)
341 }
342 ),
343
344 FIRE_SURGE(Spellbook.MODERN, 40190, 95, 50.5f, null,
345 getDefinition("Fire Surge"),
346 new RequiredRune[] {
347 new RequiredRune(MagicRune.AIR_RUNE, 7),
348 new RequiredRune(MagicRune.FIRE_RUNE, 10),
349 new RequiredRune(MagicRune.WRATH_RUNE, 1)
350 }
351 ),
352
353 ICE_RUSH(Spellbook.ANCIENT, 12861, 58, 34.0f, null,
354 getDefinition("Ice Rush"),
355 new RequiredRune[]{
356 new RequiredRune(MagicRune.WATER_RUNE, 2),
357 new RequiredRune(MagicRune.DEATH_RUNE, 2),
358 new RequiredRune(MagicRune.CHAOS_RUNE, 2)
359 }
360 ),
361
362 ICE_BLITZ(Spellbook.ANCIENT, 12871, 82, 46.0f, null,
363 getDefinition("Ice Blitz"),
364 new RequiredRune[]{
365 new RequiredRune(MagicRune.WATER_RUNE, 3),
366 new RequiredRune(MagicRune.DEATH_RUNE, 2),
367 new RequiredRune(MagicRune.BLOOD_RUNE, 2)
368 }
369 ),
370
371 ICE_BURST(Spellbook.ANCIENT, 12881, 70, 40.0f, null,
372 getDefinition("Ice Burst"),
373 new RequiredRune[]{
374 new RequiredRune(MagicRune.WATER_RUNE, 4),
375 new RequiredRune(MagicRune.DEATH_RUNE, 2),
376 new RequiredRune(MagicRune.CHAOS_RUNE, 4)
377 }
378 ),
379
380 ICE_BARRAGE(Spellbook.ANCIENT, 12891, 94, 52.0f, null,
381 getDefinition("Ice Barrage"),
382 new RequiredRune[]{
383 new RequiredRune(MagicRune.DEATH_RUNE, 4),
384 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
385 new RequiredRune(MagicRune.WATER_RUNE, 6)
386 }
387 ),
388
389 BLOOD_RUSH(Spellbook.ANCIENT, 12901, 56, 33.0f, null,
390 getDefinition("Blood Rush"),
391 new RequiredRune[]{
392 new RequiredRune(MagicRune.BLOOD_RUNE, 1),
393 new RequiredRune(MagicRune.DEATH_RUNE, 2),
394 new RequiredRune(MagicRune.CHAOS_RUNE, 2)
395 }
396 ),
397
398 BLOOD_BLITZ(Spellbook.ANCIENT, 12911, 80, 45.0f, null,
399 getDefinition("Blood Blitz"),
400 new RequiredRune[]{
401 new RequiredRune(MagicRune.DEATH_RUNE, 2),
402 new RequiredRune(MagicRune.BLOOD_RUNE, 4)
403 }
404 ),
405
406 BLOOD_BURST(Spellbook.ANCIENT, 12919, 68, 39.0f, null,
407 getDefinition("Blood Burst"),
408 new RequiredRune[]{
409 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
410 new RequiredRune(MagicRune.DEATH_RUNE, 2),
411 new RequiredRune(MagicRune.CHAOS_RUNE, 4)
412 }
413 ),
414
415 BLOOD_BARRAGE(Spellbook.ANCIENT, 12929, 92, 51.0f, null,
416 getDefinition("Blood Barrage"),
417 new RequiredRune[]{
418 new RequiredRune(MagicRune.DEATH_RUNE, 4),
419 new RequiredRune(MagicRune.BLOOD_RUNE, 4),
420 new RequiredRune(MagicRune.SOUL_RUNE, 1)
421 }
422 ),
423
424 SMOKE_RUSH(Spellbook.ANCIENT, 12939, 50, 30.0f, null,
425 getDefinition("Smoke Rush"),
426 new RequiredRune[]{
427 new RequiredRune(MagicRune.DEATH_RUNE, 2),
428 new RequiredRune(MagicRune.CHAOS_RUNE, 2),
429 new RequiredRune(MagicRune.FIRE_RUNE, 1),
430 new RequiredRune(MagicRune.AIR_RUNE, 1)
431 }
432 ),
433
434 SMOKE_BLITZ(Spellbook.ANCIENT, 12951, 74, 42.0f, null,
435 getDefinition("Smoke Blitz"),
436 new RequiredRune[]{
437 new RequiredRune(MagicRune.DEATH_RUNE, 2),
438 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
439 new RequiredRune(MagicRune.FIRE_RUNE, 2),
440 new RequiredRune(MagicRune.AIR_RUNE, 2)
441 }
442 ),
443
444 SMOKE_BURST(Spellbook.ANCIENT, 12963, 62, 36.0f, null,
445 getDefinition("Smoke Burst"),
446 new RequiredRune[]{
447 new RequiredRune(MagicRune.DEATH_RUNE, 2),
448 new RequiredRune(MagicRune.CHAOS_RUNE, 4),
449 new RequiredRune(MagicRune.FIRE_RUNE, 2),
450 new RequiredRune(MagicRune.AIR_RUNE, 2)
451 }
452 ),
453
454 SMOKE_BARRAGE(Spellbook.ANCIENT, 12975, 86, 48.0f, null,
455 getDefinition("Smoke Barrage"),
456 new RequiredRune[]{
457 new RequiredRune(MagicRune.DEATH_RUNE, 4),
458 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
459 new RequiredRune(MagicRune.FIRE_RUNE, 4),
460 new RequiredRune(MagicRune.AIR_RUNE, 4)
461 }
462 ),
463
464 SHADOW_RUSH(Spellbook.ANCIENT, 12987, 52, 31.0f, null,
465 getDefinition("Shadow Rush"),
466 new RequiredRune[]{
467 new RequiredRune(MagicRune.DEATH_RUNE, 2),
468 new RequiredRune(MagicRune.CHAOS_RUNE, 2),
469 new RequiredRune(MagicRune.SOUL_RUNE, 1),
470 new RequiredRune(MagicRune.AIR_RUNE, 1)
471 }
472 ),
473
474 SHADOW_BLITZ(Spellbook.ANCIENT, 12999, 76, 43.0f, null,
475 getDefinition("Shadow Blitz"),
476 new RequiredRune[]{
477 new RequiredRune(MagicRune.DEATH_RUNE, 2),
478 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
479 new RequiredRune(MagicRune.SOUL_RUNE, 2),
480 new RequiredRune(MagicRune.AIR_RUNE, 2)
481 }
482 ),
483
484 SHADOW_BURST(Spellbook.ANCIENT, 13011, 64, 37.0f, null,
485 getDefinition("Shadow Burst"),
486 new RequiredRune[]{
487 new RequiredRune(MagicRune.SOUL_RUNE, 2),
488 new RequiredRune(MagicRune.DEATH_RUNE, 2),
489 new RequiredRune(MagicRune.CHAOS_RUNE, 4),
490 new RequiredRune(MagicRune.AIR_RUNE, 1)
491 }
492 ),
493
494 SHADOW_BARRAGE(Spellbook.ANCIENT, 13023, 88, 49.0f, null,
495 getDefinition("Shadow Barrage"),
496 new RequiredRune[]{
497 new RequiredRune(MagicRune.SOUL_RUNE, 3),
498 new RequiredRune(MagicRune.BLOOD_RUNE, 2),
499 new RequiredRune(MagicRune.DEATH_RUNE, 4),
500 new RequiredRune(MagicRune.AIR_RUNE, 4)
501 }
502 );
503
504 private final int id;
505 private final MagicSpell spell;
506 private final CombatProjectile combatProjectile;
507 private final Spellbook spellbook;
508
509 private final static Map<Integer, CombatSpell> SPELLS;
510
511 static {
512 CombatSpell[] spells = CombatSpell.values();
513 SPELLS = new HashMap<>(spells.length);
514
515 for (CombatSpell spell : spells) {
516 SPELLS.put(spell.id, spell);
517 }
518 }
519
520 CombatSpell(Spellbook spellbook, int id, int level, float baseExperience, Item weapon, CombatProjectile combatProjectile, RequiredRune[] runes) {
521 this.spellbook = spellbook;
522 this.id = id;
523 this.spell = new MagicSpell(level, baseExperience, runes) {
524 @Override
525 public Optional<Item[]> equipmentRequired() {
526 return weapon == null ? Optional.empty() : Optional.of(new Item[]{weapon});
527 }
528 };
529 this.combatProjectile = combatProjectile;
530 }
531
532 public int getId() {
533 return id;
534 }
535
536 public String getName() {
537 return combatProjectile.getName();
538 }
539
540 public int getLevel() {
541 return spell.level;
542 }
543
544 public CombatProjectile getCombatProjectile() {
545 return combatProjectile == null ? null : CombatProjectile.getDefinition(combatProjectile.getName());
546 }
547
548 public double getBaseExperience() {
549 return spell.baseExperience;
550 }
551
552 public Optional<CombatImpact> getEffect() {
553 return combatProjectile.getEffect();
554 }
555
556 public RequiredRune[] getRunes() {
557 return spell.runes;
558 }
559
560 public Optional<Animation> getAnimation() {
561 return CombatProjectile.getDefinition(combatProjectile.getName()).getAnimation();//combatProjectile.getAnimation();
562 }
563
564 public Optional<Graphic> getStart() {
565 return CombatProjectile.getDefinition(combatProjectile.getName()).getStart();//combatProjectile.getStart();
566 }
567
568 public Optional<Graphic> getEnd() {
569 return CombatProjectile.getDefinition(combatProjectile.getName()).getEnd();//combatProjectile.getEnd();
570 }
571
572 public Spellbook getSpellbook() {
573 return spellbook;
574 }
575
576 public int sendProjectile(Mob attacker, Mob defender) {
577 final CombatProjectile combatProjectile = getCombatProjectile();
578 return combatProjectile == null ? 0 : combatProjectile.sendProjectile(attacker, defender);
579 }
580
581 public boolean canCast(Mob attacker, Mob defender) {
582 return spell.canCast(attacker, Optional.ofNullable(defender));
583 }
584
585 public static CombatSpell get(int id) {
586 return SPELLS.getOrDefault(id, WIND_STRIKE);
587 }
588
589}