diff --git a/package-lock.json b/package-lock.json index 4821f8453..0ab27d7b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "less": "^4.1.3", "less-loader": "^11.1.0", "lint-staged": "^13.2.3", - "prettier": "2.5.1", + "prettier": "^2.8.0", "style-loader": "^3.3.1", "terser-webpack-plugin": "^5.3.6", "ts-loader": "^9.4.2", @@ -10666,15 +10666,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { diff --git a/package.json b/package.json index e264d37d5..9da4d4250 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "less": "^4.1.3", "less-loader": "^11.1.0", "lint-staged": "^13.2.3", - "prettier": "2.5.1", + "prettier": "^2.8.0", "style-loader": "^3.3.1", "terser-webpack-plugin": "^5.3.6", "ts-loader": "^9.4.2", diff --git a/src/data/types.ts b/src/data/types.ts index 4eb2b671a..1c862ee4f 100644 --- a/src/data/types.ts +++ b/src/data/types.ts @@ -1,5 +1,7 @@ import { unitData } from './units'; +export type UnitData = typeof unitData; + // Enables autocomplete for `key` function getKeyValue(obj: T, key: K) { return obj[key]; @@ -10,16 +12,21 @@ const realms = unitData.map((unit) => getKeyValue(unit, 'realm')); const unitNames = unitData.map((unit) => getKeyValue(unit, 'name')); const unitLevels = unitData.map((unit) => getKeyValue(unit, 'level')); -// Create an array containing the possible `creature.type` combinations. -// In `game.ts`: creature.type = realm.toUpperCase() + level, -const creatureTypes = realms.map((realm) => { - for (let i in unitLevels) { - return `${realm}${unitLevels[i]}` as const; - } -}); +/* + * A creature's `type` is defined as `creature.realm` + `creature.level` + * Example: Dark Priest has `type` '--' + * + * This type helper makes it possible to exclude creature `type` combinations that don't actually exist on a creature + * For example: The combinations '-1' and 'A-' currently are not in use by any creature + */ +type ExtractValidCreatureTypes = { + [key in keyof T]: `${T[key]['realm']}${T[key]['level']}`; +}[number]; // Create unions from the various arrays -export type UnitName = typeof unitNames[number]; -export type Realm = typeof realms[number]; -export type Level = typeof unitLevels[number]; -export type CreatureType = typeof creatureTypes[number]; +export type UnitName = (typeof unitNames)[number]; +export type Realm = (typeof realms)[number]; +export type Level = (typeof unitLevels)[number]; + +// Create a union of valid creature `type`s +export type CreatureType = ExtractValidCreatureTypes; diff --git a/src/data/units.ts b/src/data/units.ts index 0ef992bdf..1dcf6a80a 100644 --- a/src/data/units.ts +++ b/src/data/units.ts @@ -1,3 +1,76 @@ +type Stats = { + health: number; + regrowth: number; + endurance: number; + energy: number; + meditation: number; + initiative: number; + offense: number; + defense: number; + movement: number; + pierce: number; + slash: number; + crush: number; + shock: number; + burn: number; + frost: number; + poison: number; + sonic: number; + mental: number; +}; + +type UnitDataStructure = readonly { + id: number; + name: string; + playable: boolean; + level: number | string; + realm: string; + size: number; + stats: Stats; + animation: { walk_speed: number }; + type?: string; + drop?: { name: string } & Partial; + movementType?: 'hover'; + display?: { width: number; height: number; 'offset-x': number; 'offset-y': number }; + set?: 'α' | 'β'; + + ability_info: readonly { + title: string; + desc: string; + info: string; + upgrade?: string; + affectedByMatSickness?: number; + details?: readonly string[]; + effects?: readonly { + special?: string; + regrowth?: number; + offense?: number; + defense?: number; + frost?: number; + }[]; + maxCharge?: number; + requirements?: { plasma: number; energy?: number }; + damages?: { + special?: string; + shock?: number | string; + pure?: number | string; + pierce?: number; + slash?: number; + crush?: number; + burn?: number; + poison?: number; + frost?: number | string; + mental?: number; + sonic?: number; + }; + bonus_damages?: { frost: number; pierce: number }; + damages1?: { burn?: number; pierce?: number; poison?: number }; + costs?: { plasma?: number | string; special?: string; energy?: number; movement?: string }; + range?: { regular: number; upgraded: number; minimum?: number }; + animation_data?: { duration: number; delay: number }; + }[]; +}[]; + export const unitData = [ { id: 0, @@ -3927,7 +4000,7 @@ export const unitData = [ id: 50, name: 'Shadow Leech', playable: false, - level: '1', + level: 1, realm: 'W', size: 1, set: 'α', @@ -3996,4 +4069,4 @@ export const unitData = [ }, ], }, -] as const; +] as const satisfies UnitDataStructure;