diff --git a/apps/frontend/src/app/Data/Artifacts/NighttimeWhispersInTheEchoingWoods/index.tsx b/apps/frontend/src/app/Data/Artifacts/NighttimeWhispersInTheEchoingWoods/index.tsx new file mode 100644 index 0000000000..9e49d063da --- /dev/null +++ b/apps/frontend/src/app/Data/Artifacts/NighttimeWhispersInTheEchoingWoods/index.tsx @@ -0,0 +1,83 @@ +import type { ArtifactSetKey } from '@genshin-optimizer/consts' +import { input } from '../../../Formula' +import type { Data } from '../../../Formula/type' +import { equal, greaterEq, sum } from '../../../Formula/utils' +import KeyMap from '../../../KeyMap' +import { cond, st } from '../../SheetUtil' +import { ArtifactSheet, setHeaderTemplate } from '../ArtifactSheet' +import type { IArtifactSheet } from '../IArtifactSheet' +import { dataObjForArtifactSheet } from '../dataUtil' + +const key: ArtifactSetKey = 'NighttimeWhispersInTheEchoingWoods' +const setHeader = setHeaderTemplate(key) + +const set2 = greaterEq(input.artSet.NighttimeWhispersInTheEchoingWoods, 2, 0.18) + +const [condAfterSkillPath, condAfterSkill] = cond(key, 'afterSkill') +const afterSkill_geo_dmg_ = greaterEq( + input.artSet.NighttimeWhispersInTheEchoingWoods, + 4, + equal(condAfterSkill, 'on', 0.2, KeyMap.info('geo_dmg_')) +) + +const [condCrystallizePath, condCrystallize] = cond(key, 'crystallize') +const crystallize_geo_dmg_ = greaterEq( + input.artSet.NighttimeWhispersInTheEchoingWoods, + 4, + equal( + condAfterSkill, + 'on', + equal(condCrystallize, 'on', 0.2 * 1.5, KeyMap.info('geo_dmg_')) + ) +) + +export const data: Data = dataObjForArtifactSheet(key, { + premod: { + atk_: set2, + geo_dmg_: sum(afterSkill_geo_dmg_, crystallize_geo_dmg_), + }, +}) + +const sheet: IArtifactSheet = { + name: 'Nighttime Whispers In The Echoing Woods', + rarity: [4, 5], + setEffects: { + 2: { document: [{ header: setHeader(2), fields: [{ node: set2 }] }] }, + 4: { + document: [ + { + header: setHeader(4), + value: condAfterSkill, + path: condAfterSkillPath, + name: st('hitOp.skill'), + states: { + on: { + fields: [ + { + node: afterSkill_geo_dmg_, + }, + ], + }, + }, + }, + { + header: setHeader(4), + value: condCrystallize, + path: condCrystallizePath, + canShow: equal(condAfterSkill, 'on', 1), + name: st('protectedByShieldCrystal'), + states: { + on: { + fields: [ + { + node: crystallize_geo_dmg_, + }, + ], + }, + }, + }, + ], + }, + }, +} +export default new ArtifactSheet(key, sheet, data) diff --git a/apps/frontend/src/app/Data/Artifacts/SongOfDaysPast/index.tsx b/apps/frontend/src/app/Data/Artifacts/SongOfDaysPast/index.tsx new file mode 100644 index 0000000000..fb30793fe6 --- /dev/null +++ b/apps/frontend/src/app/Data/Artifacts/SongOfDaysPast/index.tsx @@ -0,0 +1,91 @@ +import type { ArtifactSetKey } from '@genshin-optimizer/consts' +import { objKeyMap, range } from '@genshin-optimizer/util' +import { input } from '../../../Formula' +import type { Data } from '../../../Formula/type' +import { constant, greaterEq, lookup, naught } from '../../../Formula/utils' +import { cond, st, stg, trans } from '../../SheetUtil' +import { ArtifactSheet, setHeaderTemplate } from '../ArtifactSheet' +import type { IArtifactSheet } from '../IArtifactSheet' +import { dataObjForArtifactSheet } from '../dataUtil' + +const key: ArtifactSetKey = 'SongOfDaysPast' +const setHeader = setHeaderTemplate(key) +const [, trm] = trans('artifact', key) + +const set2 = greaterEq(input.artSet.SongOfDaysPast, 2, 0.15) + +const healingArr = range(1000, 15000, 1000) +const [condHealingPath, condHealing] = cond(key, 'healing') +const healing_dmgInc = greaterEq( + input.artSet.SongOfDaysPast, + 4, + lookup( + condHealing, + objKeyMap(healingArr, (healAmt) => constant(healAmt * 0.08)), + naught + ) +) +const normal_dmgInc = { ...healing_dmgInc } +const charged_dmgInc = { ...healing_dmgInc } +const plunging_dmgInc = { ...healing_dmgInc } +const skill_dmgInc = { ...healing_dmgInc } +const burst_dmgInc = { ...healing_dmgInc } + +export const data: Data = dataObjForArtifactSheet(key, { + premod: { + heal_: set2, + normal_dmgInc, + charged_dmgInc, + plunging_dmgInc, + skill_dmgInc, + burst_dmgInc, + }, +}) + +const sheet: IArtifactSheet = { + name: 'Song of Days Past', + rarity: [4, 5], + setEffects: { + 2: { document: [{ header: setHeader(2), fields: [{ node: set2 }] }] }, + 4: { + document: [ + { + header: setHeader(4), + value: condHealing, + path: condHealingPath, + name: trm('condName'), + states: objKeyMap(healingArr, (heal) => ({ + name: `${heal}`, + fields: [ + { + node: normal_dmgInc, + }, + { + node: charged_dmgInc, + }, + { + node: plunging_dmgInc, + }, + { + node: skill_dmgInc, + }, + { + node: burst_dmgInc, + }, + { + text: st('triggerQuota'), + value: 5, + }, + { + text: stg('duration'), + value: 10, + unit: 's', + }, + ], + })), + }, + ], + }, + }, +} +export default new ArtifactSheet(key, sheet, data) diff --git a/apps/frontend/src/app/Data/Artifacts/index.ts b/apps/frontend/src/app/Data/Artifacts/index.ts index 2d2507d5c3..5d0f7d56aa 100644 --- a/apps/frontend/src/app/Data/Artifacts/index.ts +++ b/apps/frontend/src/app/Data/Artifacts/index.ts @@ -33,6 +33,7 @@ import LuckyDog from './LuckyDog' import MaidenBeloved from './MaidenBeloved' import MarechausseeHunter from './MarechausseeHunter' import MartialArtist from './MartialArtist' +import NighttimeWhispersInTheEchoingWoods from './NighttimeWhispersInTheEchoingWoods' import NoblesseOblige from './NoblesseOblige' import NymphsDream from './NymphsDream' import OceanHuedClam from './OceanHuedClam' @@ -45,6 +46,7 @@ import ResolutionOfSojourner from './ResolutionOfSojourner' import RetracingBolide from './RetracingBolide' import Scholar from './Scholar' import ShimenawasReminiscence from './ShimenawasReminiscence' +import SongOfDaysPast from './SongOfDaysPast' import TenacityOfTheMillelith from './TenacityOfTheMillelith' import TheExile from './TheExile' import ThunderingFury from './ThunderingFury' @@ -82,6 +84,7 @@ const artifacts: Record = { MaidenBeloved, MarechausseeHunter, MartialArtist, + NighttimeWhispersInTheEchoingWoods, NoblesseOblige, NymphsDream, OceanHuedClam, @@ -94,6 +97,7 @@ const artifacts: Record = { RetracingBolide, Scholar, ShimenawasReminiscence, + SongOfDaysPast, TenacityOfTheMillelith, TheExile, ThunderingFury, diff --git a/apps/frontend/src/app/Data/Characters/Navia/index.tsx b/apps/frontend/src/app/Data/Characters/Navia/index.tsx new file mode 100644 index 0000000000..350b81875c --- /dev/null +++ b/apps/frontend/src/app/Data/Characters/Navia/index.tsx @@ -0,0 +1,529 @@ +import type { + CharacterKey, + ElementKey, + RegionKey, +} from '@genshin-optimizer/consts' +import { allStats } from '@genshin-optimizer/gi-stats' +import { ColorText } from '@genshin-optimizer/ui-common' +import { objKeyMap, range } from '@genshin-optimizer/util' +import { input, tally } from '../../../Formula' +import { + constant, + equal, + equalStr, + greaterEq, + greaterEqStr, + infoMut, + lookup, + naught, + one, + percent, + sum, + threshold, + unequal, +} from '../../../Formula/utils' +import { cond, st, stg } from '../../SheetUtil' +import CharacterSheet from '../CharacterSheet' +import type { ICharacterSheet } from '../ICharacterSheet' +import { charTemplates } from '../charTemplates' +import { dataObjForCharacterSheet, dmgNode } from '../dataUtil' + +const key: CharacterKey = 'Navia' +const data_gen = allStats.char.data[key] +const skillParam_gen = allStats.char.skillParam[key] +const ct = charTemplates(key, data_gen.weaponType) + +let a = 0, + s = 0, + b = 0 +const dm = { + normal: { + hitArr: [ + skillParam_gen.auto[a++], // 1 + skillParam_gen.auto[a++], // 2 + skillParam_gen.auto[a++], // 3x3 + skillParam_gen.auto[a++], // 4 + ], + }, + charged: { + cyclicDmg: skillParam_gen.auto[a++], + finalDmg: skillParam_gen.auto[a++], + stam: skillParam_gen.auto[a++][0], + duration: skillParam_gen.auto[a++][0], + }, + plunging: { + dmg: skillParam_gen.auto[a++], + low: skillParam_gen.auto[a++], + high: skillParam_gen.auto[a++], + }, + skill: { + baseShardDmg: skillParam_gen.skill[s++], + addlCharge_dmg_: skillParam_gen.skill[s++][0], + shrapnelDuration: skillParam_gen.skill[s++][0], + cd: skillParam_gen.skill[s++][0], + bladeDmg: skillParam_gen.skill[s++], + bladeInterval: skillParam_gen.skill[s++][0], + }, + burst: { + skillDmg: skillParam_gen.burst[b++], + supportDmg: skillParam_gen.burst[b++], + duration: skillParam_gen.burst[b++][0], + cd: skillParam_gen.burst[b++][0], + enerCost: skillParam_gen.burst[b++][0], + }, + passive1: { + auto_dmg_: skillParam_gen.passive1[0][0], + duration: skillParam_gen.passive1[1][0], + }, + passive2: { + atk_: skillParam_gen.passive2[0][0], + }, + constellation1: { + energyRegen: skillParam_gen.constellation1[0], + cdReduction: skillParam_gen.constellation1[1], + }, + constellation2: { + critRate_: skillParam_gen.constellation2[0], + }, + constellation4: { + geo_enemyRes_: skillParam_gen.constellation4[0], + duration: skillParam_gen.constellation4[1], + }, + constellation6: { + shot_critDMG_: skillParam_gen.constellation6[0], + }, +} as const + +const skillChargesArr = range(1, 6) +const [condSkillChargesPath, condSkillCharges] = cond(key, 'skillCharges') +const skillShotsFired = lookup( + condSkillCharges, + { + 1: constant(7), + 2: constant(9), + 3: constant(11), + 4: constant(11), + 5: constant(11), + 6: constant(11), + }, + constant(5) +) +const shotsHitArr = range(1, 11) +// TODO: Verify this +const shotsHit_mult_map = { + 1: 0, + 2: 0.05, + 3: 0.1, + 4: 0.15, + 5: 0.2, + 6: 0.36, + 7: 0.4, + 8: 0.6, + 9: 0.66, + 10: 0.9, + 11: 1, +} +const [condShotsHitPath, condShotsHit] = cond(key, 'shotsHit') +const shotsHit_shot_mult_ = lookup( + condShotsHit, + objKeyMap(shotsHitArr, (shot) => + greaterEq(skillShotsFired, shot, percent(shotsHit_mult_map[shot])) + ), + naught +) +const excessSkillCharges_skill_dmg_ = lookup( + condSkillCharges, + objKeyMap(skillChargesArr, (charge) => + charge > 3 ? constant((charge - 3) * dm.skill.addlCharge_dmg_) : undefined + ), + naught +) + +const [condA1AfterSkillPath, condA1AfterSkill] = cond(key, 'a1AfterSkill') +const a1AfterSkillInfusion = greaterEqStr( + input.asc, + 1, + equalStr(condA1AfterSkill, 'on', constant('geo')) +) +const a1AfterSkill_auto_dmg_ = greaterEq( + input.asc, + 1, + equal(condA1AfterSkill, 'on', dm.passive1.auto_dmg_) +) +const a1AfterSkill_normal_dmg_ = { ...a1AfterSkill_auto_dmg_ } +const a1AfterSkill_charged_dmg_ = { ...a1AfterSkill_auto_dmg_ } +const a1AfterSkill_plunging_dmg_ = { ...a1AfterSkill_auto_dmg_ } + +const a4ElementArr = ['pyro', 'electro', 'cryo', 'hydro'] +const numTeammates = sum(...a4ElementArr.map((ele) => tally[ele])) +const a4Element_atk_ = greaterEq( + input.asc, + 4, + threshold( + numTeammates, + 2, + dm.passive2.atk_ * 2, + greaterEq(numTeammates, 1, dm.passive2.atk_) + ) +) + +const c2Shot_critRate_ = greaterEq( + input.constellation, + 2, + lookup( + condSkillCharges, + objKeyMap(skillChargesArr, (charge) => + percent(Math.min(charge, 3) * dm.constellation2.critRate_) + ), + naught + ) +) + +const [condC4AfterBurstHitPath, condC4AfterBurstHit] = cond( + key, + 'c4AfterBurstHit' +) +const c4AfterBurstHit_geo_enemyRes_ = greaterEq( + input.constellation, + 4, + equal(condC4AfterBurstHit, 'on', -dm.constellation4.geo_enemyRes_) +) + +const c6Shot_critDMG_ = greaterEq( + input.constellation, + 6, + lookup( + condSkillCharges, + objKeyMap(skillChargesArr, (charge) => + charge > 3 + ? percent((charge - 3) * dm.constellation6.shot_critDMG_) + : undefined + ), + naught + ) +) + +const dmgFormulas = { + normal: { + ...Object.fromEntries( + dm.normal.hitArr.map((arr, i) => [i, dmgNode('atk', arr, 'normal')]) + ), + }, + charged: { + cyclicDmg: dmgNode('atk', dm.charged.cyclicDmg, 'charged'), + finalDmg: dmgNode('atk', dm.charged.finalDmg, 'charged'), + }, + plunging: Object.fromEntries( + Object.entries(dm.plunging).map(([key, value]) => [ + key, + dmgNode('atk', value, 'plunging'), + ]) + ), + skill: { + totalShardDmg: dmgNode( + 'atk', + dm.skill.baseShardDmg, + 'skill', + { + premod: { + skill_critRate_: c2Shot_critRate_, + skill_critDMG_: c6Shot_critDMG_, + }, + }, + infoMut(sum(shotsHit_shot_mult_, one), { + name: ct.ch('shot_mult_'), + asConst: true, + unit: '%', + }) + ), + bladeDmg: dmgNode('atk', dm.skill.bladeDmg, 'skill'), + }, + burst: { + skillDmg: dmgNode('atk', dm.burst.skillDmg, 'burst'), + supportDmg: dmgNode('atk', dm.burst.supportDmg, 'burst'), + }, +} +const skillC3 = greaterEq(input.constellation, 3, 3) +const burstC5 = greaterEq(input.constellation, 5, 3) + +export const data = dataObjForCharacterSheet( + key, + data_gen.ele as ElementKey, + data_gen.region as RegionKey, + data_gen, + dmgFormulas, + { + premod: { + skillBoost: skillC3, + burstBoost: burstC5, + normal_dmg_: a1AfterSkill_normal_dmg_, + charged_dmg_: a1AfterSkill_charged_dmg_, + plunging_dmg_: a1AfterSkill_plunging_dmg_, + atk_: a4Element_atk_, + skill_dmg_: excessSkillCharges_skill_dmg_, + }, + infusion: { + nonOverridableSelf: a1AfterSkillInfusion, + }, + teamBuff: { + premod: { + geo_enemyRes_: c4AfterBurstHit_geo_enemyRes_, + }, + }, + } +) + +const sheet: ICharacterSheet = { + key, + name: ct.name, + rarity: data_gen.rarity, + elementKey: data_gen.ele!, + weaponTypeKey: data_gen.weaponType, + gender: 'F', + constellationName: ct.chg('constellationName'), + title: ct.chg('title'), + talent: { + auto: ct.talentTem('auto', [ + { + text: ct.chg('auto.fields.normal'), + }, + { + fields: dm.normal.hitArr.map((_, i) => ({ + node: infoMut(dmgFormulas.normal[i], { + name: ct.chg(`auto.skillParams.${i}`), + }), + })), + }, + { + text: ct.chg('auto.fields.charged'), + }, + { + fields: [ + { + node: infoMut(dmgFormulas.charged.cyclicDmg, { + name: ct.chg(`auto.skillParams.4`), + }), + }, + { + node: infoMut(dmgFormulas.charged.finalDmg, { + name: ct.chg(`auto.skillParams.5`), + }), + }, + { + text: ct.chg('auto.skillParams.6'), + value: dm.charged.stam, + unit: '/s', + }, + { + text: ct.chg('auto.skillParams.7'), + value: dm.charged.duration, + unit: 's', + }, + ], + }, + { + text: ct.chg('auto.fields.plunging'), + }, + { + fields: [ + { + node: infoMut(dmgFormulas.plunging.dmg, { + name: stg('plunging.dmg'), + }), + }, + { + node: infoMut(dmgFormulas.plunging.low, { + name: stg('plunging.low'), + }), + }, + { + node: infoMut(dmgFormulas.plunging.high, { + name: stg('plunging.high'), + }), + }, + ], + }, + ct.condTem('passive1', { + value: condA1AfterSkill, + path: condA1AfterSkillPath, + name: st('afterUse.skill'), + states: { + on: { + fields: [ + { + text: {st('infusion.geo')}, + }, + { + node: a1AfterSkill_normal_dmg_, + }, + { + node: a1AfterSkill_charged_dmg_, + }, + { + node: a1AfterSkill_plunging_dmg_, + }, + { + text: stg('duration'), + value: dm.passive1.duration, + unit: 's', + }, + ], + }, + }, + }), + ]), + + skill: ct.talentTem('skill', [ + { + fields: [ + { + node: infoMut(dmgFormulas.skill.totalShardDmg, { + name: ct.ch(`skillTotalShardDmg`), + }), + }, + { + text: ct.chg('skill.skillParams.1'), + value: dm.skill.shrapnelDuration, + unit: 's', + }, + { + node: infoMut(dmgFormulas.skill.bladeDmg, { + name: ct.chg(`skill.skillParams.2`), + }), + }, + { + text: ct.chg('skill.skillParams.3'), + value: dm.skill.bladeInterval, + unit: 's', + }, + { + text: stg('cd'), + value: dm.skill.cd, + unit: 's', + }, + ], + }, + ct.condTem('skill', { + value: condSkillCharges, + path: condSkillChargesPath, + name: ct.ch('chargesCond'), + states: objKeyMap(skillChargesArr, (charge) => ({ + name: `${charge}`, + fields: [ + { + node: infoMut(skillShotsFired, { name: ct.ch('shotsFired') }), + }, + { + canShow: (data) => + data.get(excessSkillCharges_skill_dmg_).value > 0, + node: excessSkillCharges_skill_dmg_, + }, + ], + })), + }), + ct.condTem('skill', { + value: condShotsHit, + path: condShotsHitPath, + name: ct.ch('shotsHitCond'), + states: (data) => + objKeyMap(range(1, data.get(skillShotsFired).value), (shot) => ({ + name: `${shot}`, + fields: [ + { + node: infoMut(shotsHit_shot_mult_, { + name: ct.ch('shot_mult_'), + unit: '%', + }), + }, + ], + })), + }), + ct.headerTem('constellation2', { + canShow: unequal(condSkillCharges, undefined, 1), + fields: [ + { + node: infoMut(c2Shot_critRate_, { + name: ct.ch('shot_critRate_'), + unit: '%', + }), + }, + ], + }), + ct.headerTem('constellation6', { + canShow: unequal(c6Shot_critDMG_, naught, 1), + fields: [ + { + node: infoMut(c6Shot_critDMG_, { + name: ct.ch('shot_critDMG_'), + unit: '%', + }), + }, + ], + }), + ]), + + burst: ct.talentTem('burst', [ + { + fields: [ + { + node: infoMut(dmgFormulas.burst.skillDmg, { + name: ct.chg(`burst.skillParams.0`), + }), + }, + { + node: infoMut(dmgFormulas.burst.supportDmg, { + name: ct.chg(`burst.skillParams.1`), + }), + }, + { + text: ct.chg('burst.skillParams.2'), + value: dm.burst.duration, + unit: 's', + }, + { + text: stg('cd'), + value: dm.burst.cd, + unit: 's', + }, + { + text: stg('energyCost'), + value: dm.burst.enerCost, + }, + ], + }, + ]), + + passive1: ct.talentTem('passive1'), + passive2: ct.talentTem('passive2', [ + { fields: [{ node: a4Element_atk_ }] }, + ]), + passive3: ct.talentTem('passive3'), + constellation1: ct.talentTem('constellation1'), + constellation2: ct.talentTem('constellation2'), + constellation3: ct.talentTem('constellation3', [ + { fields: [{ node: skillC3 }] }, + ]), + constellation4: ct.talentTem('constellation4', [ + ct.condTem('constellation4', { + value: condC4AfterBurstHit, + path: condC4AfterBurstHitPath, + name: st('hitOp.burst'), + teamBuff: true, + states: { + on: { + fields: [ + { + node: c4AfterBurstHit_geo_enemyRes_, + }, + ], + }, + }, + }), + ]), + constellation5: ct.talentTem('constellation5', [ + { fields: [{ node: burstC5 }] }, + ]), + constellation6: ct.talentTem('constellation6'), + }, +} +export default new CharacterSheet(sheet, data) diff --git a/apps/frontend/src/app/Data/Characters/index.ts b/apps/frontend/src/app/Data/Characters/index.ts index d98e9b83b5..b7d3a47a4b 100644 --- a/apps/frontend/src/app/Data/Characters/index.ts +++ b/apps/frontend/src/app/Data/Characters/index.ts @@ -51,6 +51,7 @@ import Lyney from './Lyney' import Mika from './Mika' import Mona from './Mona' import Nahida from './Nahida' +import Navia from './Navia' import Neuvillette from './Neuvillette' import Nilou from './Nilou' import Ningguang from './Ningguang' @@ -138,6 +139,7 @@ const characters: Record = { Mika, Mona, Nahida, + Navia, Neuvillette, Nilou, Ningguang, diff --git a/apps/frontend/src/app/Data/Weapons/Claymore/UltimateOverlordsMegaMagicSword/index.tsx b/apps/frontend/src/app/Data/Weapons/Claymore/UltimateOverlordsMegaMagicSword/index.tsx new file mode 100644 index 0000000000..7279a4facd --- /dev/null +++ b/apps/frontend/src/app/Data/Weapons/Claymore/UltimateOverlordsMegaMagicSword/index.tsx @@ -0,0 +1,77 @@ +import { type WeaponKey } from '@genshin-optimizer/consts' +import { allStats } from '@genshin-optimizer/gi-stats' +import { objKeyMap, range } from '@genshin-optimizer/util' +import { input } from '../../../../Formula' +import { + equal, + lookup, + naught, + prod, + subscript, + sum, +} from '../../../../Formula/utils' +import { cond, st, trans } from '../../../SheetUtil' +import type { IWeaponSheet } from '../../IWeaponSheet' +import WeaponSheet, { headerTemplate } from '../../WeaponSheet' +import { dataObjForWeaponSheet } from '../../util' +import KeyMap from '../../../../KeyMap' + +const key: WeaponKey = 'UltimateOverlordsMegaMagicSword' +const data_gen = allStats.weapon.data[key] +const [, trm] = trans('weapon', key) + +const atk_arr = data_gen.refinementBonus.atk_ +const atk2_arr = [-1, 0.01, 0.0125, 0.015, 0.0175, 0.02] + +const atk_ = equal( + input.weapon.key, + key, + subscript(input.weapon.refinement, atk_arr), + KeyMap.info('atk_') +) + +const [condMelusinesPath, condMelusines] = cond(key, 'melusines') +// TODO: Verify this number +const melusinesArr = range(1, 12) +const atk_2 = lookup( + condMelusines, + objKeyMap(melusinesArr, (stack) => + prod(stack, subscript(input.weapon.refinement, atk2_arr, { unit: '%' })) + ), + naught, + KeyMap.info('atk_') +) + +const data = dataObjForWeaponSheet(key, data_gen, { + premod: { + atk_: sum(atk_, atk_2), + }, +}) + +const sheet: IWeaponSheet = { + document: [ + { + header: headerTemplate(key, st('base')), + fields: [ + { + node: atk_, + }, + ], + }, + { + value: condMelusines, + path: condMelusinesPath, + header: headerTemplate(key, st('stacks')), + name: trm('condName'), + states: objKeyMap(melusinesArr, (melusines) => ({ + name: `${melusines}`, + fields: [ + { + node: atk_2, + }, + ], + })), + }, + ], +} +export default new WeaponSheet(key, sheet, data_gen, data) diff --git a/apps/frontend/src/app/Data/Weapons/Claymore/Verdict/index.tsx b/apps/frontend/src/app/Data/Weapons/Claymore/Verdict/index.tsx new file mode 100644 index 0000000000..eece805642 --- /dev/null +++ b/apps/frontend/src/app/Data/Weapons/Claymore/Verdict/index.tsx @@ -0,0 +1,76 @@ +import { type WeaponKey } from '@genshin-optimizer/consts' +import { allStats } from '@genshin-optimizer/gi-stats' +import { objKeyMap, range } from '@genshin-optimizer/util' +import { input } from '../../../../Formula' +import { + equal, + lookup, + naught, + prod, + subscript, +} from '../../../../Formula/utils' +import { cond, st, trans } from '../../../SheetUtil' +import type { IWeaponSheet } from '../../IWeaponSheet' +import WeaponSheet, { headerTemplate } from '../../WeaponSheet' +import { dataObjForWeaponSheet } from '../../util' + +const key: WeaponKey = 'Verdict' +const data_gen = allStats.weapon.data[key] +const [, trm] = trans('weapon', key) + +const atk_arr = data_gen.refinementBonus.atk_ +const skill_dmg_arr = [-1, 0.18, 0.225, 0.27, 0.315, 0.36] + +const atk_ = equal( + input.weapon.key, + key, + subscript(input.weapon.refinement, atk_arr) +) + +const [condSealsPath, condSeals] = cond(key, 'seals') +const sealsArr = range(1, 2) +const skill_dmg_ = lookup( + condSeals, + objKeyMap(sealsArr, (stack) => + prod( + stack, + subscript(input.weapon.refinement, skill_dmg_arr, { unit: '%' }) + ) + ), + naught +) + +const data = dataObjForWeaponSheet(key, data_gen, { + premod: { + atk_, + skill_dmg_, + }, +}) + +const sheet: IWeaponSheet = { + document: [ + { + header: headerTemplate(key, st('base')), + fields: [ + { + node: atk_, + }, + ], + }, + { + value: condSeals, + path: condSealsPath, + header: headerTemplate(key, st('stacks')), + name: trm('condName'), + states: objKeyMap(sealsArr, (seals) => ({ + name: `${seals}`, + fields: [ + { + node: skill_dmg_, + }, + ], + })), + }, + ], +} +export default new WeaponSheet(key, sheet, data_gen, data) diff --git a/apps/frontend/src/app/Data/Weapons/Claymore/index.ts b/apps/frontend/src/app/Data/Weapons/Claymore/index.ts index 28ea771c20..3c47f7abeb 100644 --- a/apps/frontend/src/app/Data/Weapons/Claymore/index.ts +++ b/apps/frontend/src/app/Data/Weapons/Claymore/index.ts @@ -29,6 +29,8 @@ import TalkingStick from './TalkingStick' import TheBell from './TheBell' import TheUnforged from './TheUnforged' import TidalShadow from './TidalShadow' +import UltimateOverlordsMegaMagicSword from './UltimateOverlordsMegaMagicSword' +import Verdict from './Verdict' import WasterGreatsword from './WasterGreatsword' import Whiteblind from './Whiteblind' import WhiteIronGreatsword from './WhiteIronGreatsword' @@ -63,6 +65,8 @@ const claymore: Record = { TheBell, TheUnforged, TidalShadow, + UltimateOverlordsMegaMagicSword, + Verdict, WasterGreatsword, Whiteblind, WhiteIronGreatsword, diff --git a/libs/char-cards/src/Character_Navia_Card.jpg b/libs/char-cards/src/Character_Navia_Card.jpg new file mode 100644 index 0000000000..3dfffc0395 Binary files /dev/null and b/libs/char-cards/src/Character_Navia_Card.jpg differ diff --git a/libs/char-cards/src/index.ts b/libs/char-cards/src/index.ts index 8aaa3d421b..918b7c8463 100644 --- a/libs/char-cards/src/index.ts +++ b/libs/char-cards/src/index.ts @@ -43,6 +43,7 @@ import Lynette from './Character_Lynette_Card.jpg' import Mika from './Character_Mika_Card.jpg' import Mona from './Character_Mona_Card.jpg' import Nahida from './Character_Nahida_Card.jpeg' +import Navia from './Character_Navia_Card.jpg' import Neuvillette from './Character_Neuvillette_Card.jpg' import Nilou from './Character_Nilou_Card.jpg' import Ningguang from './Character_Ningguang_Card.jpg' @@ -122,6 +123,7 @@ const charCards = { Mika, Mona, Nahida, + Navia, Neuvillette, Nilou, Ningguang, diff --git a/libs/consts/src/artifact.ts b/libs/consts/src/artifact.ts index d4bc10de24..9e6dc5c274 100644 --- a/libs/consts/src/artifact.ts +++ b/libs/consts/src/artifact.ts @@ -26,6 +26,7 @@ export const allArtifactSetKeys = [ 'MaidenBeloved', 'MarechausseeHunter', 'MartialArtist', + 'NighttimeWhispersInTheEchoingWoods', 'NoblesseOblige', 'NymphsDream', 'OceanHuedClam', @@ -38,6 +39,7 @@ export const allArtifactSetKeys = [ 'RetracingBolide', 'Scholar', 'ShimenawasReminiscence', + 'SongOfDaysPast', 'TenacityOfTheMillelith', 'TheExile', 'ThunderingFury', diff --git a/libs/consts/src/character.ts b/libs/consts/src/character.ts index 5f630702fe..6277c29ebf 100644 --- a/libs/consts/src/character.ts +++ b/libs/consts/src/character.ts @@ -108,6 +108,7 @@ export const nonTravelerCharacterKeys = [ 'Mika', 'Mona', 'Nahida', + 'Navia', 'Neuvillette', 'Nilou', 'Ningguang', diff --git a/libs/consts/src/weapon.ts b/libs/consts/src/weapon.ts index ed10fe5429..669f1b2e5a 100644 --- a/libs/consts/src/weapon.ts +++ b/libs/consts/src/weapon.ts @@ -84,6 +84,8 @@ export const allWeaponClaymoreKeys = [ 'TheBell', 'TheUnforged', 'TidalShadow', + 'UltimateOverlordsMegaMagicSword', + 'Verdict', 'WasterGreatsword', 'Whiteblind', 'WhiteIronGreatsword', diff --git a/libs/dm/src/mapping/artifact.ts b/libs/dm/src/mapping/artifact.ts index 9921c7afb7..2c2f5271c5 100644 --- a/libs/dm/src/mapping/artifact.ts +++ b/libs/dm/src/mapping/artifact.ts @@ -48,6 +48,8 @@ export const artifactIdMap: Record = { 15030: 'VourukashasGlow', 15031: 'MarechausseeHunter', 15032: 'GoldenTroupe', + 15033: 'SongOfDaysPast', + 15034: 'NighttimeWhispersInTheEchoingWoods', } as const export const artifactSlotMap = { diff --git a/libs/dm/src/mapping/character.ts b/libs/dm/src/mapping/character.ts index 17d3329dde..4c49bffbcd 100644 --- a/libs/dm/src/mapping/character.ts +++ b/libs/dm/src/mapping/character.ts @@ -141,6 +141,7 @@ export const characterIdMap: Record< 10000087: 'Neuvillette', 10000088: 'Charlotte', 10000089: 'Furina', + 10000091: 'Navia', // 11000008: "TEMPLATE", // 11000009: "TEMPLATE", // 11000010: "TEMPLATE", diff --git a/libs/dm/src/mapping/weapon.ts b/libs/dm/src/mapping/weapon.ts index 59e231faa0..adcfb953ec 100644 --- a/libs/dm/src/mapping/weapon.ts +++ b/libs/dm/src/mapping/weapon.ts @@ -78,6 +78,7 @@ export const weaponIdMap: Record = { 12418: 'MailedFlower', 12424: 'TalkingStick', 12425: 'TidalShadow', + 12426: 'UltimateOverlordsMegaMagicSword', 12427: 'PortablePowerSaw', 11428: 'SwordOfNarzissenkreuz', 12501: 'SkywardPride', @@ -89,6 +90,7 @@ export const weaponIdMap: Record = { // 12508: "", 12510: 'RedhornStonethresher', 12511: 'BeaconOfTheReedSea', + 12512: 'Verdict', //polearm 13101: 'BeginnersProtector', diff --git a/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_1.png b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_1.png new file mode 100644 index 0000000000..53b934072a Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_1.png differ diff --git a/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_2.png b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_2.png new file mode 100644 index 0000000000..a186193b08 Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_2.png differ diff --git a/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_3.png b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_3.png new file mode 100644 index 0000000000..77bb577b34 Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_3.png differ diff --git a/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_4.png b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_4.png new file mode 100644 index 0000000000..f582d1b3cf Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_4.png differ diff --git a/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_5.png b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_5.png new file mode 100644 index 0000000000..8ea73569c7 Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/UI_RelicIcon_15034_5.png differ diff --git a/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/index.ts b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/index.ts new file mode 100644 index 0000000000..ac4a8979c0 --- /dev/null +++ b/libs/gi-assets/src/gen/artifacts/NighttimeWhispersInTheEchoingWoods/index.ts @@ -0,0 +1,15 @@ +// This is a generated index file. +import circlet from './UI_RelicIcon_15034_3.png' +import flower from './UI_RelicIcon_15034_4.png' +import goblet from './UI_RelicIcon_15034_1.png' +import plume from './UI_RelicIcon_15034_2.png' +import sands from './UI_RelicIcon_15034_5.png' + +const data = { + circlet, + flower, + goblet, + plume, + sands, +} as const +export default data diff --git a/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_1.png b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_1.png new file mode 100644 index 0000000000..94f94aff34 Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_1.png differ diff --git a/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_2.png b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_2.png new file mode 100644 index 0000000000..a2f256194b Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_2.png differ diff --git a/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_3.png b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_3.png new file mode 100644 index 0000000000..529094bb6d Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_3.png differ diff --git a/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_4.png b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_4.png new file mode 100644 index 0000000000..29e8871e39 Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_4.png differ diff --git a/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_5.png b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_5.png new file mode 100644 index 0000000000..f363a7fbad Binary files /dev/null and b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/UI_RelicIcon_15033_5.png differ diff --git a/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/index.ts b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/index.ts new file mode 100644 index 0000000000..8b1e31df1d --- /dev/null +++ b/libs/gi-assets/src/gen/artifacts/SongOfDaysPast/index.ts @@ -0,0 +1,15 @@ +// This is a generated index file. +import circlet from './UI_RelicIcon_15033_3.png' +import flower from './UI_RelicIcon_15033_4.png' +import goblet from './UI_RelicIcon_15033_1.png' +import plume from './UI_RelicIcon_15033_2.png' +import sands from './UI_RelicIcon_15033_5.png' + +const data = { + circlet, + flower, + goblet, + plume, + sands, +} as const +export default data diff --git a/libs/gi-assets/src/gen/artifacts/index.ts b/libs/gi-assets/src/gen/artifacts/index.ts index 42626a5a60..15dffe512f 100644 --- a/libs/gi-assets/src/gen/artifacts/index.ts +++ b/libs/gi-assets/src/gen/artifacts/index.ts @@ -24,6 +24,7 @@ import LuckyDog from './LuckyDog' import MaidenBeloved from './MaidenBeloved' import MarechausseeHunter from './MarechausseeHunter' import MartialArtist from './MartialArtist' +import NighttimeWhispersInTheEchoingWoods from './NighttimeWhispersInTheEchoingWoods' import NoblesseOblige from './NoblesseOblige' import NymphsDream from './NymphsDream' import OceanHuedClam from './OceanHuedClam' @@ -36,6 +37,7 @@ import ResolutionOfSojourner from './ResolutionOfSojourner' import RetracingBolide from './RetracingBolide' import Scholar from './Scholar' import ShimenawasReminiscence from './ShimenawasReminiscence' +import SongOfDaysPast from './SongOfDaysPast' import TenacityOfTheMillelith from './TenacityOfTheMillelith' import TheExile from './TheExile' import ThunderingFury from './ThunderingFury' @@ -73,6 +75,7 @@ const data = { MaidenBeloved, MarechausseeHunter, MartialArtist, + NighttimeWhispersInTheEchoingWoods, NoblesseOblige, NymphsDream, OceanHuedClam, @@ -85,6 +88,7 @@ const data = { RetracingBolide, Scholar, ShimenawasReminiscence, + SongOfDaysPast, TenacityOfTheMillelith, TheExile, ThunderingFury, diff --git a/libs/gi-assets/src/gen/chars/Navia/Skill_E_Navia_01_HD.png b/libs/gi-assets/src/gen/chars/Navia/Skill_E_Navia_01_HD.png new file mode 100644 index 0000000000..f82a0e3d35 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/Skill_E_Navia_01_HD.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/Skill_S_Navia_01.png b/libs/gi-assets/src/gen/chars/Navia/Skill_S_Navia_01.png new file mode 100644 index 0000000000..3c8ceef029 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/Skill_S_Navia_01.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_AvatarIcon_Navia.png b/libs/gi-assets/src/gen/chars/Navia/UI_AvatarIcon_Navia.png new file mode 100644 index 0000000000..1eac41629f Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_AvatarIcon_Navia.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_AvatarIcon_Side_Navia.png b/libs/gi-assets/src/gen/chars/Navia/UI_AvatarIcon_Side_Navia.png new file mode 100644 index 0000000000..889f5ad6c7 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_AvatarIcon_Side_Navia.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_NameCardPic_Navia_Alpha.png b/libs/gi-assets/src/gen/chars/Navia/UI_NameCardPic_Navia_Alpha.png new file mode 100644 index 0000000000..8abeb3b6a5 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_NameCardPic_Navia_Alpha.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_NameCardPic_Navia_P.png b/libs/gi-assets/src/gen/chars/Navia/UI_NameCardPic_Navia_P.png new file mode 100644 index 0000000000..45b76caea9 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_NameCardPic_Navia_P.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_01.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_01.png new file mode 100644 index 0000000000..b6dd502bef Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_01.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_02.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_02.png new file mode 100644 index 0000000000..f6e1155346 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_02.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_03.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_03.png new file mode 100644 index 0000000000..d2deb72bef Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_03.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_04.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_04.png new file mode 100644 index 0000000000..158bf027ca Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_04.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_05.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_05.png new file mode 100644 index 0000000000..eb16017224 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_05.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_06.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_06.png new file mode 100644 index 0000000000..1223879cd5 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_06.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_07.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_07.png new file mode 100644 index 0000000000..d8d9017678 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_S_Navia_07.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_U_Navia_01.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_U_Navia_01.png new file mode 100644 index 0000000000..ff6a145434 Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_U_Navia_01.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/UI_Talent_U_Navia_02.png b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_U_Navia_02.png new file mode 100644 index 0000000000..efde15271e Binary files /dev/null and b/libs/gi-assets/src/gen/chars/Navia/UI_Talent_U_Navia_02.png differ diff --git a/libs/gi-assets/src/gen/chars/Navia/index.ts b/libs/gi-assets/src/gen/chars/Navia/index.ts new file mode 100644 index 0000000000..857058fe88 --- /dev/null +++ b/libs/gi-assets/src/gen/chars/Navia/index.ts @@ -0,0 +1,35 @@ +// This is a generated index file. +import banner from './UI_NameCardPic_Navia_P.png' +import bar from './UI_NameCardPic_Navia_Alpha.png' +import burst from './Skill_E_Navia_01_HD.png' +import constellation1 from './UI_Talent_S_Navia_01.png' +import constellation2 from './UI_Talent_S_Navia_02.png' +import constellation3 from './UI_Talent_U_Navia_01.png' +import constellation4 from './UI_Talent_S_Navia_03.png' +import constellation5 from './UI_Talent_U_Navia_02.png' +import constellation6 from './UI_Talent_S_Navia_04.png' +import icon from './UI_AvatarIcon_Navia.png' +import iconSide from './UI_AvatarIcon_Side_Navia.png' +import passive1 from './UI_Talent_S_Navia_05.png' +import passive2 from './UI_Talent_S_Navia_06.png' +import passive3 from './UI_Talent_S_Navia_07.png' +import skill from './Skill_S_Navia_01.png' + +const data = { + banner, + bar, + burst, + constellation1, + constellation2, + constellation3, + constellation4, + constellation5, + constellation6, + icon, + iconSide, + passive1, + passive2, + passive3, + skill, +} as const +export default data diff --git a/libs/gi-assets/src/gen/chars/index.ts b/libs/gi-assets/src/gen/chars/index.ts index 5718c67759..3a9940a602 100644 --- a/libs/gi-assets/src/gen/chars/index.ts +++ b/libs/gi-assets/src/gen/chars/index.ts @@ -43,6 +43,7 @@ import Lyney from './Lyney' import Mika from './Mika' import Mona from './Mona' import Nahida from './Nahida' +import Navia from './Navia' import Neuvillette from './Neuvillette' import Nilou from './Nilou' import Ningguang from './Ningguang' @@ -127,6 +128,7 @@ const data = { Mika, Mona, Nahida, + Navia, Neuvillette, Nilou, Ningguang, diff --git a/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/UI_EquipIcon_Claymore_Champion.png b/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/UI_EquipIcon_Claymore_Champion.png new file mode 100644 index 0000000000..b34abda2a2 Binary files /dev/null and b/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/UI_EquipIcon_Claymore_Champion.png differ diff --git a/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/UI_EquipIcon_Claymore_Champion_Awaken.png b/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/UI_EquipIcon_Claymore_Champion_Awaken.png new file mode 100644 index 0000000000..5978933ada Binary files /dev/null and b/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/UI_EquipIcon_Claymore_Champion_Awaken.png differ diff --git a/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/index.ts b/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/index.ts new file mode 100644 index 0000000000..8765db1738 --- /dev/null +++ b/libs/gi-assets/src/gen/weapons/UltimateOverlordsMegaMagicSword/index.ts @@ -0,0 +1,9 @@ +// This is a generated index file. +import awakenIcon from './UI_EquipIcon_Claymore_Champion_Awaken.png' +import icon from './UI_EquipIcon_Claymore_Champion.png' + +const data = { + awakenIcon, + icon, +} as const +export default data diff --git a/libs/gi-assets/src/gen/weapons/Verdict/UI_EquipIcon_Claymore_GoldenVerdict.png b/libs/gi-assets/src/gen/weapons/Verdict/UI_EquipIcon_Claymore_GoldenVerdict.png new file mode 100644 index 0000000000..1c1d7ec4f2 Binary files /dev/null and b/libs/gi-assets/src/gen/weapons/Verdict/UI_EquipIcon_Claymore_GoldenVerdict.png differ diff --git a/libs/gi-assets/src/gen/weapons/Verdict/UI_EquipIcon_Claymore_GoldenVerdict_Awaken.png b/libs/gi-assets/src/gen/weapons/Verdict/UI_EquipIcon_Claymore_GoldenVerdict_Awaken.png new file mode 100644 index 0000000000..c303551d8d Binary files /dev/null and b/libs/gi-assets/src/gen/weapons/Verdict/UI_EquipIcon_Claymore_GoldenVerdict_Awaken.png differ diff --git a/libs/gi-assets/src/gen/weapons/Verdict/index.ts b/libs/gi-assets/src/gen/weapons/Verdict/index.ts new file mode 100644 index 0000000000..80334786f2 --- /dev/null +++ b/libs/gi-assets/src/gen/weapons/Verdict/index.ts @@ -0,0 +1,9 @@ +// This is a generated index file. +import awakenIcon from './UI_EquipIcon_Claymore_GoldenVerdict_Awaken.png' +import icon from './UI_EquipIcon_Claymore_GoldenVerdict.png' + +const data = { + awakenIcon, + icon, +} as const +export default data diff --git a/libs/gi-assets/src/gen/weapons/index.ts b/libs/gi-assets/src/gen/weapons/index.ts index 44041a3edc..fc15b7d4b1 100644 --- a/libs/gi-assets/src/gen/weapons/index.ts +++ b/libs/gi-assets/src/gen/weapons/index.ts @@ -164,6 +164,8 @@ import ToukabouShigure from './ToukabouShigure' import TravelersHandySword from './TravelersHandySword' import TulaytullahsRemembrance from './TulaytullahsRemembrance' import TwinNephrite from './TwinNephrite' +import UltimateOverlordsMegaMagicSword from './UltimateOverlordsMegaMagicSword' +import Verdict from './Verdict' import VortexVanquisher from './VortexVanquisher' import WanderingEvenstar from './WanderingEvenstar' import WasterGreatsword from './WasterGreatsword' @@ -343,6 +345,8 @@ const data = { TravelersHandySword, TulaytullahsRemembrance, TwinNephrite, + UltimateOverlordsMegaMagicSword, + Verdict, VortexVanquisher, WanderingEvenstar, WasterGreatsword, diff --git a/libs/gi-localization/assets/locales/en/artifact_SongOfDaysPast.json b/libs/gi-localization/assets/locales/en/artifact_SongOfDaysPast.json new file mode 100644 index 0000000000..eaee8b0ac0 --- /dev/null +++ b/libs/gi-localization/assets/locales/en/artifact_SongOfDaysPast.json @@ -0,0 +1,3 @@ +{ + "condName": "Yearning effect amount" +} diff --git a/libs/gi-localization/assets/locales/en/char_Navia.json b/libs/gi-localization/assets/locales/en/char_Navia.json new file mode 100644 index 0000000000..1e1342cdb2 --- /dev/null +++ b/libs/gi-localization/assets/locales/en/char_Navia.json @@ -0,0 +1,10 @@ +{ + "skillTotalShardDmg": "Rosula Shardshot Total DMG", + "shot_dmg_": "Rosula Shardshot DMG Bonus", + "shot_mult_": "Rosula Shardshot Multiplier", + "shot_critRate_": "Rosula Shardshot CRIT Rate", + "shot_critDMG_": "Rosula Shardshot CRIT DMG", + "chargesCond": "Crystal Shrapnel charges consumed", + "shotsFired": "Rosula Shardshots Fired", + "shotsHitCond": "Rosula Shardshots hit" +} diff --git a/libs/gi-localization/assets/locales/en/weapon_UltimateOverlordsMegaMagicSword.json b/libs/gi-localization/assets/locales/en/weapon_UltimateOverlordsMegaMagicSword.json new file mode 100644 index 0000000000..26bc0d4c86 --- /dev/null +++ b/libs/gi-localization/assets/locales/en/weapon_UltimateOverlordsMegaMagicSword.json @@ -0,0 +1,3 @@ +{ + "condName": "Melusines helped" +} diff --git a/libs/gi-localization/assets/locales/en/weapon_Verdict.json b/libs/gi-localization/assets/locales/en/weapon_Verdict.json new file mode 100644 index 0000000000..841912eba3 --- /dev/null +++ b/libs/gi-localization/assets/locales/en/weapon_Verdict.json @@ -0,0 +1,3 @@ +{ + "condName": "Seals" +} diff --git a/libs/gi-stats/Data/Artifacts/artifact_set.json b/libs/gi-stats/Data/Artifacts/artifact_set.json index 932688a21b..e05255326b 100644 --- a/libs/gi-stats/Data/Artifacts/artifact_set.json +++ b/libs/gi-stats/Data/Artifacts/artifact_set.json @@ -780,5 +780,39 @@ "flower", "sands" ] + }, + "SongOfDaysPast": { + "setNum": [ + 2, + 4 + ], + "rarities": [ + 4, + 5 + ], + "slots": [ + "goblet", + "plume", + "circlet", + "flower", + "sands" + ] + }, + "NighttimeWhispersInTheEchoingWoods": { + "setNum": [ + 2, + 4 + ], + "rarities": [ + 4, + 5 + ], + "slots": [ + "goblet", + "plume", + "circlet", + "flower", + "sands" + ] } } \ No newline at end of file diff --git a/libs/gi-stats/Data/Characters/Navia/data.json b/libs/gi-stats/Data/Characters/Navia/data.json new file mode 100644 index 0000000000..a350657b21 --- /dev/null +++ b/libs/gi-stats/Data/Characters/Navia/data.json @@ -0,0 +1,66 @@ +{ + "key": "Navia", + "ele": "geo", + "region": "fontaine", + "weaponType": "claymore", + "birthday": { + "month": 8, + "day": 16 + }, + "rarity": 5, + "lvlCurves": [ + { + "key": "hp", + "base": 984.779541015625, + "curve": "GROW_CURVE_HP_S5" + }, + { + "key": "atk", + "base": 27.371400833129883, + "curve": "GROW_CURVE_ATTACK_S5" + }, + { + "key": "def", + "base": 61.74456024169922, + "curve": "GROW_CURVE_HP_S5" + } + ], + "ascensionBonus": { + "hp": [ + 0, + 844.3594360351562, + 1444.299072265625, + 2244.218505859375, + 2844.157958984375, + 3444.09765625, + 4044.037353515625 + ], + "def": [ + 0, + 52.94160079956055, + 90.55799865722656, + 140.71319580078125, + 178.32960510253906, + 215.9459991455078, + 253.56239318847656 + ], + "atk": [ + 0, + 23.466785430908203, + 40.14055633544922, + 62.37224578857422, + 79.04601287841797, + 95.71978759765625, + 112.3935546875 + ], + "critDMG_": [ + 0, + 0, + 0.09600000083446503, + 0.19200000166893005, + 0.19200000166893005, + 0.2879999876022339, + 0.3840000033378601 + ] + } +} \ No newline at end of file diff --git a/libs/gi-stats/Data/Characters/Navia/skillParam.json b/libs/gi-stats/Data/Characters/Navia/skillParam.json new file mode 100644 index 0000000000..e78cd5cc50 --- /dev/null +++ b/libs/gi-stats/Data/Characters/Navia/skillParam.json @@ -0,0 +1,429 @@ +{ + "auto": [ + [ + 0.93519, + 1.01131, + 1.08743, + 1.196173, + 1.272293, + 1.359287, + 1.478905, + 1.598522, + 1.718139, + 1.848631, + 1.979123, + 2.109614, + 2.240106, + 2.370597, + 2.501089 + ], + [ + 0.865065, + 0.935478, + 1.00589, + 1.106479, + 1.176891, + 1.257362, + 1.36801, + 1.478658, + 1.589306, + 1.710013, + 1.83072, + 1.951427, + 2.072133, + 2.19284, + 2.313547 + ], + [ + 0.348859, + 0.377255, + 0.40565, + 0.446215, + 0.47461, + 0.507062, + 0.551684, + 0.596306, + 0.640927, + 0.689605, + 0.738283, + 0.786961, + 0.835639, + 0.884317, + 0.932995 + ], + [ + 1.334316, + 1.442923, + 1.55153, + 1.706683, + 1.81529, + 1.939412, + 2.110081, + 2.280749, + 2.451417, + 2.637601, + 2.823785, + 3.009968, + 3.196152, + 3.382335, + 3.568519 + ], + [ + 0.62522, + 0.67611, + 0.727, + 0.7997, + 0.85059, + 0.90875, + 0.98872, + 1.06869, + 1.14866, + 1.2359, + 1.32314, + 1.41038, + 1.49762, + 1.58486, + 1.6721 + ], + [ + 1.1309, + 1.22295, + 1.315, + 1.4465, + 1.53855, + 1.64375, + 1.7884, + 1.93305, + 2.0777, + 2.2355, + 2.3933, + 2.5511, + 2.7089, + 2.8667, + 3.0245 + ], + [ + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40, + 40 + ], + [ + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ], + [ + 0.745878, + 0.806589, + 0.8673, + 0.95403, + 1.014741, + 1.084125, + 1.179528, + 1.274931, + 1.370334, + 1.47441, + 1.578486, + 1.682562, + 1.786638, + 1.890714, + 1.99479 + ], + [ + 1.49144, + 1.612836, + 1.734233, + 1.907656, + 2.029052, + 2.167791, + 2.358556, + 2.549322, + 2.740087, + 2.948195, + 3.156303, + 3.364411, + 3.572519, + 3.780627, + 3.988735 + ], + [ + 1.862889, + 2.01452, + 2.16615, + 2.382765, + 2.534396, + 2.707688, + 2.945964, + 3.184241, + 3.422517, + 3.682455, + 3.942393, + 4.202331, + 4.462269, + 4.722207, + 4.982145 + ] + ], + "skill": [ + [ + 3.948, + 4.2441, + 4.5402, + 4.935, + 5.2311, + 5.5272, + 5.922, + 6.3168, + 6.7116, + 7.1064, + 7.5012, + 7.896, + 8.3895, + 8.883, + 9.3765 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300, + 300 + ], + [ + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9 + ], + [ + 0.36, + 0.387, + 0.414, + 0.45, + 0.477, + 0.504, + 0.54, + 0.576, + 0.612, + 0.648, + 0.684, + 0.72, + 0.765, + 0.81, + 0.855 + ], + [ + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7 + ] + ], + "burst": [ + [ + 0.752, + 0.8084, + 0.8648, + 0.94, + 0.9964, + 1.0528, + 1.128, + 1.2032, + 1.2784, + 1.3536, + 1.4288, + 1.504, + 1.598, + 1.692, + 1.786 + ], + [ + 0.4315, + 0.463863, + 0.496225, + 0.539375, + 0.571738, + 0.6041, + 0.64725, + 0.6904, + 0.73355, + 0.7767, + 0.81985, + 0.863, + 0.916938, + 0.970875, + 1.024813 + ], + [ + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12 + ], + [ + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15 + ], + [ + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60, + 60 + ], + [ + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4 + ] + ], + "passive1": [ + [ + 0.4 + ], + [ + 4 + ] + ], + "passive2": [ + [ + 0.2 + ] + ], + "passive3": [], + "constellation1": [ + 3, + 1 + ], + "constellation2": [ + 0.12 + ], + "constellation3": [], + "constellation4": [ + 0.2, + 8 + ], + "constellation5": [], + "constellation6": [ + 0.45 + ] +} \ No newline at end of file diff --git a/libs/gi-stats/Data/Materials/material.json b/libs/gi-stats/Data/Materials/material.json index 712cf553d8..f49d55b17c 100644 --- a/libs/gi-stats/Data/Materials/material.json +++ b/libs/gi-stats/Data/Materials/material.json @@ -64,6 +64,8 @@ "EnigmaticCopperMainspring": {}, "PoetryGalaFervor": {}, "ThelxiesBadge": {}, + "TheaterTickets": {}, + "FilmForFun": {}, "Primogem": { "type": "MATERIAL_ADSORBATE" }, @@ -261,7 +263,7 @@ "type": "MATERIAL_GCG_CARD_FACE" }, "Gorou": { - "type": "MATERIAL_AVATAR" + "type": "MATERIAL_GCG_CARD_FACE" }, "KujouSara": { "type": "MATERIAL_GCG_CARD_FACE" @@ -276,7 +278,7 @@ "type": "MATERIAL_AVATAR" }, "Yelan": { - "type": "MATERIAL_AVATAR" + "type": "MATERIAL_GCG_CARD_FACE" }, "Kirara": { "type": "MATERIAL_AVATAR" @@ -318,7 +320,7 @@ "type": "MATERIAL_GCG_CARD_FACE" }, "Layla": { - "type": "MATERIAL_AVATAR" + "type": "MATERIAL_GCG_CARD_FACE" }, "Wanderer": { "type": "MATERIAL_GCG_CARD_FACE" @@ -330,7 +332,7 @@ "type": "MATERIAL_GCG_CARD_FACE" }, "Alhaitham": { - "type": "MATERIAL_AVATAR" + "type": "MATERIAL_GCG_CARD_FACE" }, "Dehya": { "type": "MATERIAL_GCG_CARD_FACE" @@ -345,10 +347,10 @@ "type": "MATERIAL_GCG_CARD_FACE" }, "Lynette": { - "type": "MATERIAL_AVATAR" + "type": "MATERIAL_GCG_CARD_FACE" }, "Lyney": { - "type": "MATERIAL_AVATAR" + "type": "MATERIAL_GCG_CARD_FACE" }, "Freminet": { "type": "MATERIAL_AVATAR" @@ -365,6 +367,12 @@ "Furina": { "type": "MATERIAL_AVATAR" }, + "Chevreuse": { + "type": "MATERIAL_AVATAR" + }, + "Navia": { + "type": "MATERIAL_AVATAR" + }, "KamisatoAyakasStellaFortuna": { "type": "MATERIAL_TALENT" }, @@ -593,6 +601,12 @@ "FurinasStellaFortuna": { "type": "MATERIAL_TALENT" }, + "ChevreusesStellaFortuna": { + "type": "MATERIAL_TALENT" + }, + "NaviasStellaFortuna": { + "type": "MATERIAL_TALENT" + }, "GnosticHymnOldNotes": { "type": "MATERIAL_CONSUME" }, @@ -6296,7 +6310,7 @@ "type": "MATERIAL_FOOD" }, "FishAndChips": { - "type": "MATERIAL_FOOD" + "type": "MATERIAL_GCG_CARD_FACE" }, "DeliciousFishAndChips": { "type": "MATERIAL_FOOD" @@ -6559,6 +6573,39 @@ "ExclusiveScoopGourmetColumn": { "type": "MATERIAL_FOOD" }, + "SuspiciousFeastOs": { + "type": "MATERIAL_FOOD" + }, + "FeastOs": { + "type": "MATERIAL_FOOD" + }, + "DeliciousFeastOs": { + "type": "MATERIAL_FOOD" + }, + "SuspiciousRainbowMacarons": { + "type": "MATERIAL_FOOD" + }, + "RainbowMacarons": { + "type": "MATERIAL_FOOD" + }, + "DeliciousRainbowMacarons": { + "type": "MATERIAL_FOOD" + }, + "SinTheKindThatDoesntNeedToBeDealtWith": { + "type": "MATERIAL_FOOD" + }, + "PickWhatYouLike": { + "type": "MATERIAL_FOOD" + }, + "SuspiciousFontinaliaMousse": { + "type": "MATERIAL_FOOD" + }, + "FontinaliaMousse": { + "type": "MATERIAL_FOOD" + }, + "DeliciousFontinaliaMousse": { + "type": "MATERIAL_FOOD" + }, "RecipeItem": { "type": "MATERIAL_CONSUME" }, @@ -7084,6 +7131,15 @@ "RecipeBlubberProfiterole": { "type": "MATERIAL_CONSUME" }, + "RecipeFeastOs": { + "type": "MATERIAL_CONSUME" + }, + "RecipeRainbowMacarons": { + "type": "MATERIAL_CONSUME" + }, + "RecipeFontinaliaMousse": { + "type": "MATERIAL_CONSUME" + }, "CraftedItems": { "type": "MATERIAL_EXCHANGE" }, @@ -8977,6 +9033,15 @@ "TalesOfASnowWingedGooseIII": { "type": "MATERIAL_QUEST" }, + "TheTwoMusketeersI": { + "type": "MATERIAL_QUEST" + }, + "TheTwoMusketeersII": { + "type": "MATERIAL_QUEST" + }, + "TheTwoMusketeersIII": { + "type": "MATERIAL_QUEST" + }, "GiftOfParting": { "type": "MATERIAL_QUEST" }, @@ -9256,7 +9321,7 @@ "SkirmishersNotes": { "type": "MATERIAL_QUEST" }, - "34thIndependentInvestigativeSquadDeploymentInMontEsusEasternQuadrantDisplinaryProcedures": { + "34thIndependentInvestigativeSquadDeploymentInMontEsusEasternQuadrantDisciplinaryProcedures": { "type": "MATERIAL_QUEST" }, "TravelersExclusiveInterviewHandbook": { @@ -9472,6 +9537,9 @@ "SimpleVaultKeyIII": { "type": "MATERIAL_QUEST" }, + "AratakiGangsInstantRamen": { + "type": "MATERIAL_QUEST" + }, "FoggyForestBranch": { "type": "MATERIAL_QUEST" }, @@ -9496,9 +9564,15 @@ "StrangeMessage": { "type": "MATERIAL_QUEST" }, + "AutumnsGift": { + "type": "MATERIAL_QUEST" + }, "MysteriousXenochromaticCrystal": { "type": "MATERIAL_QUEST" }, + "RecruitmentNotice": { + "type": "MATERIAL_QUEST" + }, "MapFragment": { "type": "MATERIAL_QUEST" }, @@ -9526,6 +9600,18 @@ "Log": { "type": "MATERIAL_QUEST" }, + "ShootingPracticeOpticalLenses": { + "type": "MATERIAL_QUEST" + }, + "HelpMePlease": { + "type": "MATERIAL_QUEST" + }, + "BracarisGeneralStoreReceipt": { + "type": "MATERIAL_QUEST" + }, + "PackageForTheLeroyFamily": { + "type": "MATERIAL_QUEST" + }, "TearsAmongTheStars": { "type": "MATERIAL_QUEST" }, @@ -10237,6 +10323,9 @@ "SurgingSacredChalice": { "type": "MATERIAL_AVATAR_MATERIAL" }, + "SuperDuperInvincibleShiningSparklyMagicCrystal": { + "type": "MATERIAL_AVATAR_MATERIAL" + }, "FalconsDance": { "type": "MATERIAL_CHANNELLER_SLAB_BUFF" }, @@ -10921,6 +11010,15 @@ "TravelNotesWhirlingWaltz": { "type": "MATERIAL_NAMECARD" }, + "NaviaRosula": { + "type": "MATERIAL_NAMECARD" + }, + "ChevreuseTypeII": { + "type": "MATERIAL_NAMECARD" + }, + "TravelNotesTimeInscribed": { + "type": "MATERIAL_NAMECARD" + }, "AnemoculusResonanceStone": { "type": "MATERIAL_WIDGET" }, @@ -11009,7 +11107,7 @@ "type": "MATERIAL_WIDGET" }, "SeedDispensary": { - "type": "MATERIAL_WIDGET" + "type": "MATERIAL_GCG_CARD_FACE" }, "ElectroTreasureCompass": { "type": "MATERIAL_WIDGET" @@ -11018,7 +11116,7 @@ "type": "MATERIAL_GCG_CARD_FACE" }, "MementoLens": { - "type": "MATERIAL_WIDGET" + "type": "MATERIAL_GCG_CARD_FACE" }, "MiniSeelieViola": { "type": "MATERIAL_WIDGET" @@ -11158,6 +11256,9 @@ "ImageSamplingKamera": { "type": "MATERIAL_WIDGET" }, + "MiniSeelieBrilliance": { + "type": "MATERIAL_WIDGET" + }, "InstructionsAnemoculusResonanceStone": { "type": "MATERIAL_CONSUME" }, @@ -11287,6 +11388,9 @@ "NaturesTrueFruit": { "type": "MATERIAL_CONSUME" }, + "SwirlingSceneInABottle": { + "type": "MATERIAL_CONSUME" + }, "TheMountainCloudsLetDownGoldenRain": { "type": "MATERIAL_FIREWORKS" }, @@ -11368,6 +11472,21 @@ "ElectroHypostasis": { "type": "MATERIAL_GCG_CARD_FACE" }, + "LaSignora": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "Azhdaha": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "EremiteScorchingLoremaster": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "ThunderManifestation": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "Dvalin": { + "type": "MATERIAL_GCG_CARD_FACE" + }, "UndividedHeart": { "type": "MATERIAL_GCG_CARD_FACE" }, @@ -11548,6 +11667,39 @@ "AllThingsAreOfTheEarth": { "type": "MATERIAL_GCG_CARD_FACE" }, + "LightsRemit": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "TurnControl": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "ConclusiveOvation": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "AColdBladeLikeAShadow": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "RushingHoundSwiftAsTheWind": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "Structuration": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "PainForPain": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "Scorpocalypse": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "GrievingEcho": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "RendingVortex": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "LunarCyclesUnending": { + "type": "MATERIAL_GCG_CARD_FACE" + }, "MagicGuide": { "type": "MATERIAL_GCG_CARD_FACE" }, @@ -11722,6 +11874,36 @@ "ShadowOfTheSandKing": { "type": "MATERIAL_GCG_CARD_FACE" }, + "LostPrayerToTheSacredWinds": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "TulaytullahsRemembrance": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "BeaconOfTheReedSea": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "PrimordialJadeWingedSpear": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "LightOfFoliarIncision": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "GildedDreams": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "FlowingRings": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "EchoesOfAnOffering": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "HeartOfKhvarenasBrilliance": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "VourukashasGlow": { + "type": "MATERIAL_GCG_CARD_FACE" + }, "LiyueHarborWharf": { "type": "MATERIAL_GCG_CARD_FACE" }, @@ -11830,6 +12012,15 @@ "StormterrorsLair": { "type": "MATERIAL_GCG_CARD_FACE" }, + "WeepingWillowOfTheLake": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "OperaEpiclese": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "Mamere": { + "type": "MATERIAL_GCG_CARD_FACE" + }, "ElementalResonanceWovenIce": { "type": "MATERIAL_GCG_CARD_FACE" }, @@ -11971,6 +12162,18 @@ "Lyresong": { "type": "MATERIAL_GCG_CARD_FACE" }, + "PassingOfJudgment": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "TheBoarPrincess": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "FallsAndFortune": { + "type": "MATERIAL_GCG_CARD_FACE" + }, + "FlickeringFourLeafSigil": { + "type": "MATERIAL_GCG_CARD_FACE" + }, "Origin": { "type": "MATERIAL_GCG_CARD_BACK" }, @@ -11999,7 +12202,7 @@ "type": "MATERIAL_GCG_CARD_BACK" }, "Fontaine": { - "type": "MATERIAL_GCG_CARD_BACK" + "type": "MATERIAL_GCG_FIELD" }, "TheFortressOfMeropide": { "type": "MATERIAL_GCG_CARD_BACK" @@ -12010,6 +12213,9 @@ "DragonspineCrown": { "type": "MATERIAL_GCG_CARD_BACK" }, + "TheChasmSolidIron": { + "type": "MATERIAL_GCG_CARD_BACK" + }, "BeginnerPlayerBadge": { "type": "MATERIAL_QUEST" }, @@ -12280,6 +12486,45 @@ "ChorusOfDesertAndWood": { "type": "MATERIAL_FURNITURE_SUITE_FORMULA" }, + "KeyToAStableWorkRestCycle": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "StrictAdherenceToOfficeCodes": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "GarbForGloriousGourmet": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "PerfectlyDrawnFocus": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "ContinuousClockworkInspiration": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "WellspringOfRuleViolationPrevention": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "CourtOfJusticesPlacidDays": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "CourtOfJusticesBoomingCommerce": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "CourtOfJusticesFreshMist": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "PoissonTheUnassuming": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "UnderseaMeruseasLuster": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "FullForceForwardInTheForbiddenFortress": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, + "TheNationOfHydrosMottledColors": { + "type": "MATERIAL_FURNITURE_SUITE_FORMULA" + }, "TimberWallWithJadeEaves": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12292,6 +12537,9 @@ "SimpleBrightwoodCarvedWall": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "AnnexsGoldenMosaic": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "TraditionalCedarFlooring": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12304,6 +12552,9 @@ "DarkBrightwoodFlooring": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "AnnexsMirrorSheenFloorTile": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "CheckeredCedarCeiling": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12316,6 +12567,9 @@ "BrightwoodChiseledCeiling": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "AnnexsSpotlessDome": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "TwoTierCandleChandelier": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12430,9 +12684,18 @@ "ShinyShell": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "ForbiddenZoneFloorLampIronhammer": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "ForbiddenZoneFloorLampNightlight": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "EfflorescentIllumination": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "AnnexsSwirlingLight": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "NorthernBirchFoldingCounter": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12469,6 +12732,9 @@ "AthelPotteryShelf": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "MallowWoodMultiModelWardrobe": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "TwoTierLibraryBookshelf": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12523,6 +12789,9 @@ "MaisonCardinalicesLittleHelper": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "AThousandTextsInTheCentralHub": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "SturdyLibraryTable": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12607,6 +12876,15 @@ "MaisonCardinalicesFocus": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "StableWorkStationInTheCentralHub": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "RestTimeInTheCentralHub": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "TheLeisureOfDailyMeetings": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "BreezeBlessedBed": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12649,6 +12927,9 @@ "WitnessOfTavernAffairs": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "CelebrationOfAnAdHocPerformance": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "SoftLoungeSofa": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12706,6 +12987,15 @@ "ElationOfSocialDrinking": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "MallowWoodViewingRitesChair": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "LindenWoodSubduingSeatBackedChair": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "MomentaryRestInTheCentralHub": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "NorthernStoneHearth": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -12862,6 +13152,9 @@ "BurdenOfTheForbiddenFortress": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "StandardMusicStandAccurateTuning": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "MondstadtRugCrimsonArdor": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -13093,6 +13386,9 @@ "ModelContraptionReasonableRoundabout": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "CommonUseNoteHolder": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "RealizationsFromTheLandOfWisdom": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -13189,6 +13485,9 @@ "AthelwoodMetalCombatShield": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "IndoorLampTheTwilightSea": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "LingeringMoment": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -13354,6 +13653,12 @@ "PassagesPrinciplesOfPunctuality": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "QuickTemporaryWorkshed": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "PoissonsSeasonalProduce": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "HilichurlOutpostHut": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -13666,6 +13971,9 @@ "DistributedForwardSupplyDepot": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "CourtyardPavilionAmidstTheRivers": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "CourtOfJusticesAuthenticity": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -13681,6 +13989,15 @@ "SmallStonecrab": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "TheArenaWhereFistsReemerge": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "TheWisdomOfPoisson": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "ASimpleResidenceInPoisson": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "BirdAndBlossomDesignFountain": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -13915,6 +14232,18 @@ "TexturedWhitestoneStairs": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "CourtyardCorridorTheMoraDividend": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "CourtyardCorridorManifoldCorners": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "CourtyardArchwayMomentOfGlory": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "CourtyardWallABitOfScenery": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "FoundationsOfStoneFortunateTimes": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -14128,6 +14457,9 @@ "ModelContraptionRockcrackerAnchor": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "BoxingTargetOfTheForbiddenFortress": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "PottedPlantVerdantVastness": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -14455,6 +14787,27 @@ "ASistersDuty": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "OverburdeningOfTheForbiddenFortress": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "AreaMarkerUpward": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "AreaMarkerDownward": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "PoissonDoorFrame": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "BookshelfFreeReading": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "BookshelfSpeedyBrowsing": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "BookshelfFocusedEffect": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "PoolOfSapphireGrace": { "type": "MATERIAL_FURNITURE_FORMULA" }, @@ -14581,6 +14934,12 @@ "PassagesPristineRoundTable": { "type": "MATERIAL_FURNITURE_FORMULA" }, + "ProductionRackTheBasics": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, + "ProductionRackCustomBuild": { + "type": "MATERIAL_FURNITURE_FORMULA" + }, "WineShopDisplayCounterToYourHeartsContent": { "type": "MATERIAL_FURNITURE_FORMULA" }, diff --git a/libs/gi-stats/Data/Weapons/Claymore/UltimateOverlordsMegaMagicSword/data.json b/libs/gi-stats/Data/Weapons/Claymore/UltimateOverlordsMegaMagicSword/data.json new file mode 100644 index 0000000000..3babbf1150 --- /dev/null +++ b/libs/gi-stats/Data/Weapons/Claymore/UltimateOverlordsMegaMagicSword/data.json @@ -0,0 +1,47 @@ +{ + "weaponType": "claymore", + "rarity": 4, + "mainStat": { + "type": "atk", + "base": 43.7349, + "curve": "GROW_CURVE_ATTACK_202" + }, + "subStat": { + "type": "enerRech_", + "base": 0.066667, + "curve": "GROW_CURVE_CRITICAL_201" + }, + "lvlCurves": [ + { + "key": "atk", + "base": 43.7349, + "curve": "GROW_CURVE_ATTACK_202" + }, + { + "key": "enerRech_", + "base": 0.066667, + "curve": "GROW_CURVE_CRITICAL_201" + } + ], + "refinementBonus": { + "atk_": [ + -1, + 0.12, + 0.15, + 0.18, + 0.21, + 0.24 + ] + }, + "ascensionBonus": { + "atk": [ + 0, + 25.9, + 51.9, + 77.8, + 103.7, + 129.7, + 155.6 + ] + } +} \ No newline at end of file diff --git a/libs/gi-stats/Data/Weapons/Claymore/Verdict/data.json b/libs/gi-stats/Data/Weapons/Claymore/Verdict/data.json new file mode 100644 index 0000000000..72a4ce7442 --- /dev/null +++ b/libs/gi-stats/Data/Weapons/Claymore/Verdict/data.json @@ -0,0 +1,47 @@ +{ + "weaponType": "claymore", + "rarity": 5, + "mainStat": { + "type": "atk", + "base": 47.537, + "curve": "GROW_CURVE_ATTACK_302" + }, + "subStat": { + "type": "critRate_", + "base": 0.048, + "curve": "GROW_CURVE_CRITICAL_301" + }, + "lvlCurves": [ + { + "key": "atk", + "base": 47.537, + "curve": "GROW_CURVE_ATTACK_302" + }, + { + "key": "critRate_", + "base": 0.048, + "curve": "GROW_CURVE_CRITICAL_301" + } + ], + "refinementBonus": { + "atk_": [ + -1, + 0.2, + 0.25, + 0.3, + 0.35, + 0.4 + ] + }, + "ascensionBonus": { + "atk": [ + 0, + 31.1, + 62.2, + 93.4, + 124.5, + 155.6, + 186.7 + ] + } +} \ No newline at end of file