From 2d199bd5a3f6a6185293efa4152e4d50bb3f0afc Mon Sep 17 00:00:00 2001 From: apache1123 Date: Fri, 22 Dec 2023 13:14:16 +1300 Subject: [PATCH] Add Nyan Meow --- .github/workflows/playwright.yml | 2 +- package.json | 2 +- public/icons/weapons/yan-miao.png | Bin 0 -> 15132 bytes src/constants/changelog.tsx | 5 ++ src/constants/matrix-set-definitions.ts | 32 +++++++++ src/constants/weapon-definitions.ts | 78 ++++++++++++--------- src/features/gear-comparer/BuffSummary.tsx | 4 +- src/models/loadout-matrix-set-buffs.ts | 4 +- src/models/loadout-weapon-buffs.ts | 11 +-- src/models/team.ts | 48 ++++--------- src/models/weapon-buff-definition.ts | 12 ++-- src/models/weapon-definition.ts | 5 +- 12 files changed, 120 insertions(+), 83 deletions(-) create mode 100644 public/icons/weapons/yan-miao.png diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index fea8622f..d4d2d712 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -12,7 +12,7 @@ jobs: id: waitForDeploy with: token: ${{ secrets.GITHUB_TOKEN }} - max_timeout: 120 + max_timeout: 180 - name: Checkout uses: actions/checkout@v3 diff --git a/package.json b/package.json index 2ba8d21c..5e910a4b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tof-tools", - "version": "3.1.1", + "version": "3.2.0", "private": true, "scripts": { "dev": "next dev", diff --git a/public/icons/weapons/yan-miao.png b/public/icons/weapons/yan-miao.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd7614a6d4923fdeb30733312e9a57a26cd36ca GIT binary patch literal 15132 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 = [ 'Tian Lang 2pc', 'Tsubasa 2pc', 'Umi 2pc', + 'Yan Miao 2pc', 'Yu Lan 2pc', 'Zero 2pc', ]; @@ -120,6 +122,7 @@ export const matrixSet4pcOrder: DataAllIds = [ 'Tian Lang 4pc', 'Tsubasa 4pc', 'Umi 4pc', + 'Yan Miao 4pc', 'Yu Lan 4pc', 'Zero 4pc', ]; @@ -611,6 +614,27 @@ export const matrixSetDefinitionsLookup: DataById< critRateBuffs: [], critDamageBuffs: [], }, + 'Yan Miao 2pc': { + id: 'Yan Miao 2pc', + displayName: 'Yan Miao 2pc', + pieces: 2, + attackPercentBuffs: [ + { + description: 'Increase physical and flame ATK, works off-hand', + starValues: [ + { star: 0, value: 0.19 }, + { star: 1, value: 0.21 }, + { star: 2, value: 0.23 }, + { star: 3, value: 0.25 }, + ], + elementalTypes: ['Flame', 'Physical'], + canStack: false, + isActivePassively: true, + }, + ], + critRateBuffs: [], + critDamageBuffs: [], + }, 'Yu Lan 2pc': { id: 'Yu Lan 2pc', displayName: 'Yu Lan 2pc', @@ -999,6 +1023,14 @@ export const matrixSetDefinitionsLookup: DataById< critRateBuffs: [], critDamageBuffs: [], }, + 'Yan Miao 4pc': { + id: 'Yan Miao 4pc', + displayName: 'Yan Miao 4pc', + pieces: 4, + attackPercentBuffs: [], + critRateBuffs: [], + critDamageBuffs: [], + }, 'Yu Lan 4pc': { id: 'Yu Lan 4pc', displayName: 'Yu Lan 4pc', diff --git a/src/constants/weapon-definitions.ts b/src/constants/weapon-definitions.ts index 5f391278..4172ba1a 100644 --- a/src/constants/weapon-definitions.ts +++ b/src/constants/weapon-definitions.ts @@ -34,6 +34,7 @@ export type WeaponName = | 'Tian Lang' | 'Tsubasa' | 'Umi' + | 'Yan Miao' | 'Yu Lan' | 'Zero'; @@ -71,6 +72,7 @@ export const weaponDefinitions: Data = { 'Tian Lang', 'Tsubasa', 'Umi', + 'Yan Miao', 'Yu Lan', 'Zero', ], @@ -78,7 +80,7 @@ export const weaponDefinitions: Data = { ['Alyss']: { id: 'Alyss', displayName: 'Alyss', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [ { @@ -99,7 +101,7 @@ export const weaponDefinitions: Data = { ['Annabella']: { id: 'Annabella', displayName: 'Annabella', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'DPS', attackPercentBuffs: [ { @@ -143,7 +145,7 @@ export const weaponDefinitions: Data = { ['Claudia']: { id: 'Claudia', displayName: 'Claudia', - elementalType: 'Physical', + elementalTypes: ['Physical'], type: 'DPS', attackPercentBuffs: [ { @@ -165,7 +167,7 @@ export const weaponDefinitions: Data = { ['Cobalt-B']: { id: 'Cobalt-B', displayName: 'Cobalt-B', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'DPS', attackPercentBuffs: [ { @@ -186,7 +188,7 @@ export const weaponDefinitions: Data = { ['Cocoritter']: { id: 'Cocoritter', displayName: 'Cocoritter', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'Support', attackPercentBuffs: [ { @@ -220,7 +222,7 @@ export const weaponDefinitions: Data = { ['Crow']: { id: 'Crow', displayName: 'Crow', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'DPS', attackPercentBuffs: [], critRateBuffs: [], @@ -228,7 +230,7 @@ export const weaponDefinitions: Data = { ['Fei Se']: { id: 'Fei Se', displayName: 'Fei Se', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'DPS', attackPercentBuffs: [ { @@ -249,7 +251,7 @@ export const weaponDefinitions: Data = { ['Fenrir']: { id: 'Fenrir', displayName: 'Fenrir', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'DPS', attackPercentBuffs: [ { @@ -294,7 +296,7 @@ export const weaponDefinitions: Data = { ['Fiona']: { id: 'Fiona', displayName: 'Fiona', - elementalType: 'Altered', + elementalTypes: ['Altered'], type: 'Support', attackPercentBuffs: [ { @@ -327,7 +329,7 @@ export const weaponDefinitions: Data = { ['Frigg']: { id: 'Frigg', displayName: 'Frigg', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [ { @@ -370,7 +372,7 @@ export const weaponDefinitions: Data = { ['Gnonno']: { id: 'Gnonno', displayName: 'Gnonno', - elementalType: 'Physical', + elementalTypes: ['Physical'], type: 'DPS', attackPercentBuffs: [ { @@ -392,7 +394,7 @@ export const weaponDefinitions: Data = { ['Huang (Mimi)']: { id: 'Huang (Mimi)', displayName: 'Huang (Mimi)', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'Defense', attackPercentBuffs: [ { @@ -413,7 +415,7 @@ export const weaponDefinitions: Data = { ['Huma']: { id: 'Huma', displayName: 'Huma', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'Defense', attackPercentBuffs: [], critRateBuffs: [], @@ -421,7 +423,7 @@ export const weaponDefinitions: Data = { ['Icarus']: { id: 'Icarus', displayName: 'Icarus', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [ { @@ -442,7 +444,7 @@ export const weaponDefinitions: Data = { ['King']: { id: 'King', displayName: 'King', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'DPS', attackPercentBuffs: [], critRateBuffs: [], @@ -450,7 +452,7 @@ export const weaponDefinitions: Data = { ['Lan']: { id: 'Lan', displayName: 'Lan', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'Defense', attackPercentBuffs: [ { @@ -471,7 +473,7 @@ export const weaponDefinitions: Data = { ['Lin']: { id: 'Lin', displayName: 'Lin', - elementalType: 'Altered', + elementalTypes: ['Altered'], type: 'DPS', attackPercentBuffs: [ { @@ -527,7 +529,7 @@ export const weaponDefinitions: Data = { ['Ling Han']: { id: 'Ling Han', displayName: 'Ling Han', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [ { @@ -559,7 +561,7 @@ export const weaponDefinitions: Data = { ['Liu Huo']: { id: 'Liu Huo', displayName: 'Liu Huo', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'DPS', attackPercentBuffs: [ { @@ -580,7 +582,7 @@ export const weaponDefinitions: Data = { ['Lyra']: { id: 'Lyra', displayName: 'Lyra', - elementalType: 'Physical', + elementalTypes: ['Physical'], type: 'Support', attackPercentBuffs: [ { @@ -615,7 +617,7 @@ export const weaponDefinitions: Data = { ['Meryl']: { id: 'Meryl', displayName: 'Meryl', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'Defense', attackPercentBuffs: [], critRateBuffs: [], @@ -623,7 +625,7 @@ export const weaponDefinitions: Data = { ['Ming Jing']: { id: 'Ming Jing', displayName: 'Ming Jing (Zeke)', - elementalType: 'Physical', + elementalTypes: ['Physical', 'Flame'], type: 'DPS', attackPercentBuffs: [ { @@ -657,7 +659,7 @@ export const weaponDefinitions: Data = { ['Nan Yin']: { id: 'Nan Yin', displayName: 'Nan Yin', - elementalType: 'Altered', + elementalTypes: ['Altered'], type: 'DPS', attackPercentBuffs: [ { @@ -684,7 +686,7 @@ export const weaponDefinitions: Data = { ['Nemesis']: { id: 'Nemesis', displayName: 'Nemesis', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'Support', attackPercentBuffs: [ { @@ -740,7 +742,7 @@ export const weaponDefinitions: Data = { ['Rubilia']: { id: 'Rubilia', displayName: 'Rubilia', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'DPS', attackPercentBuffs: [ { @@ -761,7 +763,7 @@ export const weaponDefinitions: Data = { ['Ruby']: { id: 'Ruby', displayName: 'Ruby', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'DPS', attackPercentBuffs: [ { @@ -793,7 +795,7 @@ export const weaponDefinitions: Data = { ['Saki Fuwa']: { id: 'Saki Fuwa', displayName: 'Saki Fuwa', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [ { @@ -814,7 +816,7 @@ export const weaponDefinitions: Data = { ['Samir']: { id: 'Samir', displayName: 'Samir', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'DPS', attackPercentBuffs: [], critRateBuffs: [], @@ -822,7 +824,7 @@ export const weaponDefinitions: Data = { ['Shiro']: { id: 'Shiro', displayName: 'Shiro', - elementalType: 'Physical', + elementalTypes: ['Physical'], type: 'DPS', attackPercentBuffs: [], critRateBuffs: [], @@ -830,7 +832,7 @@ export const weaponDefinitions: Data = { ['Tian Lang']: { id: 'Tian Lang', displayName: 'Tian Lang', - elementalType: 'Volt', + elementalTypes: ['Volt'], type: 'DPS', attackPercentBuffs: [ { @@ -864,7 +866,7 @@ export const weaponDefinitions: Data = { ['Tsubasa']: { id: 'Tsubasa', displayName: 'Tsubasa', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [], critRateBuffs: [], @@ -872,7 +874,7 @@ export const weaponDefinitions: Data = { ['Umi']: { id: 'Umi', displayName: 'Umi', - elementalType: 'Physical', + elementalTypes: ['Physical'], type: 'DPS', attackPercentBuffs: [ { @@ -891,10 +893,18 @@ export const weaponDefinitions: Data = { ], critRateBuffs: [], }, + ['Yan Miao']: { + id: 'Yan Miao', + displayName: 'Yan Miao', + elementalTypes: ['Physical', 'Flame'], + type: 'DPS', + attackPercentBuffs: [], + critRateBuffs: [], + }, ['Yu Lan']: { id: 'Yu Lan', displayName: 'Yu Lan', - elementalType: 'Frost', + elementalTypes: ['Frost'], type: 'DPS', attackPercentBuffs: [ { @@ -915,7 +925,7 @@ export const weaponDefinitions: Data = { ['Zero']: { id: 'Zero', displayName: 'Zero', - elementalType: 'Flame', + elementalTypes: ['Flame'], type: 'Support', attackPercentBuffs: [ { diff --git a/src/features/gear-comparer/BuffSummary.tsx b/src/features/gear-comparer/BuffSummary.tsx index 8214b298..560f0c71 100644 --- a/src/features/gear-comparer/BuffSummary.tsx +++ b/src/features/gear-comparer/BuffSummary.tsx @@ -10,7 +10,7 @@ export function BuffSummary() { const { selectedLoadout: { elementalType, - team: { elementalResonance, weaponResonance }, + team: { elementalResonances, weaponResonance }, weaponBuffs, matrixSetBuffs, attackBuffTotal, @@ -111,7 +111,7 @@ export function BuffSummary() { Elemental / Weapon resonance - {elementalResonance} / {weaponResonance} + {elementalResonances.join(' & ')} / {weaponResonance} diff --git a/src/models/loadout-matrix-set-buffs.ts b/src/models/loadout-matrix-set-buffs.ts index fa9ad0f5..d784993e 100644 --- a/src/models/loadout-matrix-set-buffs.ts +++ b/src/models/loadout-matrix-set-buffs.ts @@ -140,8 +140,8 @@ export class LoadoutMatrixSetBuffs { // TODO: This is duplicated in loadout-weapon-buffs.ts if (elementalWeaponsRequirements) { const { weapon1, weapon2, weapon3 } = this._loadout.team; - const weaponElementalTypes = [weapon1, weapon2, weapon3].map((weapon) => - weapon ? weapon.definition.elementalType : undefined + const weaponElementalTypes = [weapon1, weapon2, weapon3].flatMap( + (weapon) => (weapon ? weapon.definition.elementalTypes : []) ); let hasMetElementalWeaponsRequirement = false; diff --git a/src/models/loadout-weapon-buffs.ts b/src/models/loadout-weapon-buffs.ts index c4b933ab..37438208 100644 --- a/src/models/loadout-weapon-buffs.ts +++ b/src/models/loadout-weapon-buffs.ts @@ -105,13 +105,14 @@ export class LoadoutWeaponBuffs { elementalWeaponsRequirements, } = buffDefinition; const { stars } = weapon; - const { elementalResonance, weaponResonance } = this._loadout.team; + const { elementalResonances, weaponResonance } = this._loadout.team; if (stars < minStarRequirement || stars > maxStarRequirement) return false; if ( elementalResonanceRequirements && - (!elementalResonance || - !elementalResonanceRequirements.includes(elementalResonance)) + elementalResonanceRequirements.every( + (x) => !elementalResonances.includes(x) + ) ) return false; if ( @@ -124,8 +125,8 @@ export class LoadoutWeaponBuffs { // TODO: This is duplicated in loadout-matrix-set-buffs.ts if (elementalWeaponsRequirements) { const { weapon1, weapon2, weapon3 } = this._loadout.team; - const weaponElementalTypes = [weapon1, weapon2, weapon3].map((weapon) => - weapon ? weapon.definition.elementalType : undefined + const weaponElementalTypes = [weapon1, weapon2, weapon3].flatMap( + (weapon) => (weapon ? weapon.definition.elementalTypes : []) ); let hasMetElementalWeaponsRequirement = false; diff --git a/src/models/team.ts b/src/models/team.ts index 7e202984..f7bb6066 100644 --- a/src/models/team.ts +++ b/src/models/team.ts @@ -1,4 +1,7 @@ +import groupBy from 'lodash.groupby'; + import type { ElementalResonance } from '../constants/elemental-resonance'; +import type { WeaponElementalType } from '../constants/elemental-type'; import type { WeaponResonance } from '../constants/weapon-resonance'; import type { Dto } from './dto'; import type { Persistable } from './persistable'; @@ -11,41 +14,20 @@ export class Team implements Persistable { public weapon2: WeaponSlot; public weapon3: WeaponSlot; - public get elementalResonance(): ElementalResonance { + public get elementalResonances(): ElementalResonance[] { const { weapon1, weapon2, weapon3 } = this; - const elementalTypes = [weapon1, weapon2, weapon3].map((weapon) => { - if (!weapon) return undefined; - const definition = weapon.definition; - return definition.elementalType; - }); + const elementalTypes = [weapon1, weapon2, weapon3].flatMap((weapon) => + weapon ? weapon.definition.elementalTypes : [] + ); + + const elementalTypeGroups = groupBy(elementalTypes); + const elementalResonances = ( + Object.keys(elementalTypeGroups) as WeaponElementalType[] + ).flatMap((elementalType) => + elementalTypeGroups[elementalType].length > 1 ? elementalType : [] + ); - if ( - elementalTypes.filter((elementalType) => elementalType === 'Altered') - .length > 1 - ) - return 'Altered'; - if ( - elementalTypes.filter((elementalType) => elementalType === 'Flame') - .length > 1 - ) - return 'Flame'; - if ( - elementalTypes.filter((elementalType) => elementalType === 'Frost') - .length > 1 - ) - return 'Frost'; - if ( - elementalTypes.filter((elementalType) => elementalType === 'Physical') - .length > 1 - ) - return 'Physical'; - if ( - elementalTypes.filter((elementalType) => elementalType === 'Volt') - .length > 1 - ) - return 'Volt'; - - return 'None'; + return elementalResonances.length ? elementalResonances : ['None']; } public get weaponResonance(): WeaponResonance { diff --git a/src/models/weapon-buff-definition.ts b/src/models/weapon-buff-definition.ts index cfb2d60d..991077b1 100644 --- a/src/models/weapon-buff-definition.ts +++ b/src/models/weapon-buff-definition.ts @@ -8,15 +8,19 @@ export interface WeaponBuffDefinition { description: string; value: number; canStack: boolean; - isActivePassively: boolean; // always active and is included in the relevant stat in the character sheet naturally. The opposite of this is "conditional" buff + /** always active and is included in the relevant stat in the character sheet naturally. The opposite of this is "conditional" buff */ + isActivePassively: boolean; minStarRequirement: number; maxStarRequirement: number; - elementalResonanceRequirements?: ElementalResonance[]; // "OR" requirements - weaponResonanceRequirements?: WeaponResonance[]; // "OR" requirements + /** "OR" requirements */ + elementalResonanceRequirements?: ElementalResonance[]; + /** "OR" requirements */ + weaponResonanceRequirements?: WeaponResonance[]; + /** "OR" requirements */ elementalWeaponsRequirements?: { weaponElementalType: WeaponElementalType; minNumOfWeapons: 1 | 2 | 3; - }[]; // "OR" requirements; + }[]; } export interface WeaponAttackPercentBuffDefinition diff --git a/src/models/weapon-definition.ts b/src/models/weapon-definition.ts index 631b1dd4..3fe31d4f 100644 --- a/src/models/weapon-definition.ts +++ b/src/models/weapon-definition.ts @@ -9,7 +9,10 @@ import type { export interface WeaponDefinition { id: WeaponName; displayName: string; - elementalType: WeaponElementalType; + /** The elemental type the weapon is considered to be for the purposes of elemental resonance, matrix effects etc. (not the damage dealing elemental type) + * E.g. For Yan Miao, her weapon is considered to be both Physical and Flame to trigger Physical resonance and Flame resonance, but deals (mainly) physical damage. + */ + elementalTypes: WeaponElementalType[]; type: WeaponType; attackPercentBuffs: WeaponAttackPercentBuffDefinition[]; critRateBuffs: WeaponCritRateBuffDefinition[];