2023Collectabot/src/characters.ts

69 lines
2.1 KiB
TypeScript

import { Collection } from 'discord.js'
import charactersJSON from './characters.json';
import { z } from 'zod'
export enum Target {
Self = "self",
Team = "team",
OneTeammate = "oneTeammate",
TrueRandomTeammate = "trueRandomTeammate",
OneOpponent = "oneOpponent",
AllOpponents = "allOpponents",
TrueRandomOpponent = "trueRandomOpponent",
TrueRandom = "trueRandom"
}
const TargetEnum = z.nativeEnum(Target);
type TargetEnum = z.infer<typeof TargetEnum>;
const PotencyStatus = z.object({
duration: z.number().int(),
potency: z.number().int()
}).strict();
export type PotencyStatus = z.infer<typeof PotencyStatus>;
const Effect = z.object({
target: TargetEnum,
accuracy: z.optional(z.number().int()),
damage: z.optional(z.number().int()),
heal: z.optional(z.number().int()),
cure: z.optional(z.boolean()),
dispel: z.optional(z.boolean()),
poison: z.optional(z.number().int()),
regeneration: z.optional(z.number().int()),
burn: z.optional(z.number().int()),
confusion: z.optional(z.number().int()),
stun: z.optional(z.number().int()),
taunt: z.optional(z.number().int()),
resistanceChange: z.optional(PotencyStatus),
accuracyChange: z.optional(PotencyStatus),
speedChange: z.optional(PotencyStatus),
damageChange: z.optional(PotencyStatus),
function: z.optional(z.string())
}).strict();
export type Effect = z.infer<typeof Effect>;
const Skill = z.object({
name: z.string(),
accuracy: z.optional(z.number().int()),
effects: z.array(Effect)
}).strict();
export type Skill = z.infer<typeof Skill>;
const Character = z.object({
id: z.number().int(),
name: z.string(),
nameShort: z.string(),
img: z.string(),
health: z.number().int(),
speed: z.number().int(),
skills: z.tuple([Skill, Skill, Skill])
}).strict();
export type Character = z.infer<typeof Character>;
const CharacterJSON = z.array(Character);
type CharacterJSON = z.infer<typeof CharacterJSON>;
export const CHARACTERS: Collection<number, Character> = (() => {
return new Collection(CharacterJSON.parse(charactersJSON).map((element, index) => {return [element.id, element]}));
})();