|
1 |
| -import { EmbedBuilder } from 'discord.js'; |
| 1 | +import { Colors, EmbedBuilder } from 'discord.js'; |
2 | 2 | import { CrouchCancelCalculator } from '../calculation/crouch-cancel-calculator';
|
3 | 3 | import { Character } from '../models/character';
|
4 | 4 | import { Move } from '../models/move';
|
5 | 5 | import { BaseEmbedCreator } from './base-embed-creator';
|
6 | 6 | import { InfoLine } from './formatting/info-line';
|
| 7 | +import { CharacterEmoji } from '../utils/character-emoji'; |
| 8 | +import { Loader } from '../data/loader'; |
7 | 9 |
|
8 | 10 | export class CrouchCancelEmbedCreator extends BaseEmbedCreator {
|
9 |
| - public static create(character: Character, move: Move, target: Character | undefined): EmbedBuilder[] { |
| 11 | + public static create(character: Character, move: Move, target: Character | undefined, dataLoader: Loader): EmbedBuilder[] { |
10 | 12 | const embedCreator = this.baseEmbed();
|
11 | 13 |
|
12 |
| - const hitboxMap = new Map<string, string>(); |
13 |
| - if (target) { |
14 |
| - embedCreator.setTitle(`${character.name} - ${move.name} vs ${target.name}`); |
| 14 | + if (move.gifUrl) { |
| 15 | + embedCreator.setImage(move.gifUrl); |
15 | 16 | } else {
|
16 |
| - embedCreator.setTitle(`${character.name} - ${move.name}`); |
| 17 | + embedCreator.addFields({ |
| 18 | + name: 'No GIF available', |
| 19 | + value: 'There is no GIF available for this move. Visit https://www.fightcore.gg to help us out.', |
| 20 | + }); |
| 21 | + } |
| 22 | + embedCreator.setURL( |
| 23 | + `https://fightcore.gg/characters/${character.fightCoreId}/${character.normalizedName}/moves/${move.id}/${move.normalizedName}/?utm_source=fightcore_bot` |
| 24 | + ); |
| 25 | + |
| 26 | + if (target) { |
| 27 | + return this.createForTarget(character, move, target, embedCreator); |
17 | 28 | }
|
| 29 | + |
| 30 | + return this.createForAll(character, move, embedCreator, dataLoader); |
| 31 | + } |
| 32 | + |
| 33 | + private static createForTarget( |
| 34 | + character: Character, |
| 35 | + move: Move, |
| 36 | + target: Character, |
| 37 | + embedBuilder: EmbedBuilder |
| 38 | + ): EmbedBuilder[] { |
| 39 | + const hitboxMap = new Map<string, string>(); |
| 40 | + const characterEmote = CharacterEmoji.getEmoteId(character.normalizedName); |
| 41 | + const targetEmote = CharacterEmoji.getEmoteId(target.normalizedName); |
| 42 | + embedBuilder.setTitle(`${characterEmote} ${character.name} - ${move.name} vs ${target.name} ${targetEmote} `); |
18 | 43 | for (const hitbox of move.hitboxes) {
|
19 |
| - const crouchCancelPercentage = CrouchCancelCalculator.calculateCrouchCancel(hitbox, target!).toFixed(2); |
20 |
| - hitboxMap.set(hitbox.name, crouchCancelPercentage); |
| 44 | + if (hitbox.angle > 179 && hitbox.angle != 361) { |
| 45 | + hitboxMap.set(hitbox.name, `Can not be CCed due to angle being higher than 179 (${hitbox.angle})`); |
| 46 | + } else if (hitbox.angle === 0) { |
| 47 | + hitboxMap.set(hitbox.name, `Can not be CCed due to angle being 0`); |
| 48 | + } else { |
| 49 | + const crouchCancelPercentage = CrouchCancelCalculator.calculateCrouchCancel(hitbox, target).toFixed(2); |
| 50 | + hitboxMap.set(hitbox.name, crouchCancelPercentage); |
| 51 | + } |
21 | 52 | }
|
22 | 53 | let result = 'Crouch cancel breaks at the following percentages for each hitbox.\n';
|
23 | 54 | for (const keyValuePair of hitboxMap) {
|
24 | 55 | result += InfoLine.createLineWithTitle(keyValuePair[0], keyValuePair[1]) + '\n';
|
25 | 56 | }
|
26 |
| - embedCreator.setDescription(result); |
| 57 | + embedBuilder.addFields({ name: 'Crouch Cancel Percentage', value: result }); |
| 58 | + return [embedBuilder]; |
| 59 | + } |
| 60 | + |
| 61 | + private static createForAll(character: Character, move: Move, embedBuilder: EmbedBuilder, dataLoader: Loader): EmbedBuilder[] { |
| 62 | + const characterEmote = CharacterEmoji.getEmoteId(character.normalizedName); |
| 63 | + embedBuilder.setTitle(`${characterEmote} ${character.name} - ${move.name}`); |
| 64 | + |
| 65 | + for (const hitbox of move.hitboxes) { |
| 66 | + if (hitbox.angle > 179 && hitbox.angle != 361) { |
| 67 | + embedBuilder.addFields({ |
| 68 | + name: hitbox.name, |
| 69 | + value: `Can not be CCed due to angle being higher than 179 (${hitbox.angle})`, |
| 70 | + }); |
| 71 | + continue; |
| 72 | + } else if (hitbox.angle === 0) { |
| 73 | + embedBuilder.addFields({ name: hitbox.name, value: `Can not be CCed due to angle being 0` }); |
| 74 | + continue; |
| 75 | + } |
| 76 | + |
| 77 | + const hitboxMap = new Map<Character, string>(); |
| 78 | + for (const target of dataLoader.data) { |
| 79 | + const crouchCancelPercentage = CrouchCancelCalculator.calculateCrouchCancel(hitbox, target).toFixed(2); |
| 80 | + hitboxMap.set(target, crouchCancelPercentage); |
| 81 | + } |
27 | 82 |
|
28 |
| - return [embedCreator]; |
| 83 | + let fieldText = ''; |
| 84 | + let iterator = 0; |
| 85 | + for (const keyValuePair of hitboxMap) { |
| 86 | + const emote = CharacterEmoji.getEmoteId(keyValuePair[0].normalizedName); |
| 87 | + fieldText += `${emote} ${keyValuePair[1]}% `; |
| 88 | + iterator++; |
| 89 | + if (iterator === 4) { |
| 90 | + iterator = 0; |
| 91 | + fieldText += '\n'; |
| 92 | + } |
| 93 | + } |
| 94 | + |
| 95 | + embedBuilder.addFields({ name: hitbox.name, value: fieldText }); |
| 96 | + } |
| 97 | + if (embedBuilder.length >= 6000) { |
| 98 | + const errorEmbed = this.baseEmbed(); |
| 99 | + errorEmbed.setColor(Colors.DarkRed); |
| 100 | + errorEmbed.setTitle(embedBuilder.data.title!); |
| 101 | + errorEmbed.addFields({ |
| 102 | + name: 'Too many hitboxes', |
| 103 | + value: `This move has too many hitboxes to be displayed on Discord, either supply a target character or visit our [website](${embedBuilder |
| 104 | + .data.url!})`, |
| 105 | + }); |
| 106 | + |
| 107 | + return [errorEmbed]; |
| 108 | + } |
| 109 | + return [embedBuilder]; |
29 | 110 | }
|
30 | 111 | }
|
0 commit comments