diff --git a/libs/sr-consts/src/character.ts b/libs/sr-consts/src/character.ts index cdd5bce81d..0a9fa9c685 100644 --- a/libs/sr-consts/src/character.ts +++ b/libs/sr-consts/src/character.ts @@ -2,31 +2,46 @@ export const allGenderKeys = ['F', 'M'] as const export type GenderKey = (typeof allGenderKeys)[number] export const nonTrailblazerCharacterKeys = [ + 'Argenti', 'Arlan', 'Asta', 'Bailu', + 'Blade', 'Bronya', 'Clara', 'DanHeng', + 'DanHengImbibitorLunae', + 'DrRatio', + 'FuXuan', 'Gepard', + 'Guinaifen', + 'Hanya', 'Herta', 'Himeko', 'Hook', + 'Huohuo', 'JingYuan', + 'Jingliu', 'Kafka', + 'Luka', 'Luocha', + 'Lynx', 'March7th', 'Natasha', 'Pela', 'Qingque', + 'RuanMei', 'Sampo', 'Seele', 'Serval', 'SilverWolf', 'Sushang', 'Tingyun', + 'TopazAndNumby', 'Welt', + 'Xueyi', 'Yanqing', + 'Yukong', ] as const export type NonTrailblazerCharacterKey = (typeof nonTrailblazerCharacterKeys)[number] diff --git a/libs/sr-consts/src/lightCone.ts b/libs/sr-consts/src/lightCone.ts index 0b9389b815..59e0487217 100644 --- a/libs/sr-consts/src/lightCone.ts +++ b/libs/sr-consts/src/lightCone.ts @@ -2,8 +2,12 @@ export const allLightConeKeys = [ 'ASecretVow', 'Adversarial', 'Amber', + 'AnInstantBeforeAGaze', 'Arrows', + 'BaptismOfPureThought', 'BeforeDawn', + 'BeforeTheTutorialMissionStarts', + 'BrighterThanTheSun', 'ButTheBattleIsntOver', 'CarveTheMoonWeaveTheClouds', 'Chorus', @@ -15,14 +19,18 @@ export const allLightConeKeys = [ 'DataBank', 'DayOneOfMyNewLife', 'Defense', + 'EchoesOfTheCoffin', 'EyesOfThePrey', 'Fermata', 'FineFruit', 'GeniusesRepose', 'GoodNightAndSleepWell', + 'HeyOverHere', 'HiddenShadow', + 'IShallBeMyOwnSword', 'InTheNameOfTheWorld', 'InTheNight', + 'IncessantRain', 'LandausChoice', 'Loop', 'MakeTheWorldClamor', @@ -32,12 +40,15 @@ export const allLightConeKeys = [ 'MomentOfVictory', 'Multiplication', 'MutualDemise', + 'NightOfFright', 'NightOnTheMilkyWay', 'NowhereToRun', 'OnTheFallOfAnAeon', 'OnlySilenceRemains', 'Passkey', + 'PastSelfInMirror', 'PastAndFuture', + 'PatienceIsAllYouNeed', 'PerfectTiming', 'Pioneering', 'PlanetaryRendezvous', @@ -49,7 +60,9 @@ export const allLightConeKeys = [ 'Sagacity', 'SharedFeeling', 'ShatteredHome', + 'SheAlreadyShutHerEyes', 'SleepLikeTheDead', + 'SolitaryHealing', 'SomethingIrreplaceable', 'SubscribeForMore', 'Swordplay', @@ -57,6 +70,7 @@ export const allLightConeKeys = [ 'TheBirthOfTheSelf', 'TheMolesWelcomeYou', 'TheSeriousnessOfBreakfast', + 'TheUnreachableSide', 'ThisIsMe', 'TimeWaitsForNoOne', 'TodayIsAnotherPeacefulDay', @@ -67,6 +81,7 @@ export const allLightConeKeys = [ 'WeAreWildfire', 'WeWillMeetAgain', 'WoofWalkTime', + 'WorrisomeBlissful', ] as const export type LightConeKey = (typeof allLightConeKeys)[number] diff --git a/libs/sr-consts/src/relic.ts b/libs/sr-consts/src/relic.ts index 5753105949..1f4e2d5abc 100644 --- a/libs/sr-consts/src/relic.ts +++ b/libs/sr-consts/src/relic.ts @@ -19,9 +19,12 @@ export const allRelicCavernSetKeys = [ 'GuardOfWutheringSnow', 'HunterOfGlacialForest', 'KnightOfPurityPalace', + 'LongevousDisciple', + 'MessengerTraversingHackerspace', 'MusketeerOfWildWheat', 'PasserbyOfWanderingCloud', 'PrisonerInDeepConfinement', + 'TheAshblazingGrandDuke', 'ThiefOfShootingMeteor', 'WastelanderOfBanditryDesert', ] as const @@ -29,11 +32,14 @@ export type RelicCavernSetKey = (typeof allRelicCavernSetKeys)[number] export const allRelicPlanarSetKeys = [ 'BelobogOfTheArchitects', + 'BrokenKeel', 'CelestialDifferentiator', 'FirmamentFrontlineGlamoth', 'FleetOfTheAgeless', 'InertSalsotto', 'PanGalacticCommercialEnterprise', + 'PenaconyLandOfTheDreams', + 'RutilantArena', 'SpaceSealingStation', 'SprightlyVonwacq', 'TaliaKingdomOfBanditry', diff --git a/libs/sr-dm/src/mapping/character.ts b/libs/sr-dm/src/mapping/character.ts index 687158208d..5c87b58712 100644 --- a/libs/sr-dm/src/mapping/character.ts +++ b/libs/sr-dm/src/mapping/character.ts @@ -12,35 +12,50 @@ export const characterIdMap: Record< string, NonTrailblazerCharacterKey | TrailblazerGenderedKey > = { - '1001': 'March7th', - '1002': 'DanHeng', - '1003': 'Himeko', - '1004': 'Welt', - '1005': 'Kafka', - '1006': 'SilverWolf', - '1008': 'Arlan', - '1009': 'Asta', - '1013': 'Herta', - '1101': 'Bronya', - '1102': 'Seele', - '1103': 'Serval', - '1104': 'Gepard', - '1105': 'Natasha', - '1106': 'Pela', - '1107': 'Clara', - '1108': 'Sampo', - '1109': 'Hook', - '1201': 'Qingque', - '1202': 'Tingyun', - '1203': 'Luocha', - '1204': 'JingYuan', - '1206': 'Sushang', - '1209': 'Yanqing', - '1211': 'Bailu', - '8001': 'TrailblazerPhysicalM', - '8002': 'TrailblazerPhysicalF', - '8003': 'TrailblazerFireM', - '8004': 'TrailblazerFireF', + 1001: 'March7th', + 1002: 'DanHeng', + 1003: 'Himeko', + 1004: 'Welt', + 1005: 'Kafka', + 1006: 'SilverWolf', + 1008: 'Arlan', + 1009: 'Asta', + 1013: 'Herta', + 1101: 'Bronya', + 1102: 'Seele', + 1103: 'Serval', + 1104: 'Gepard', + 1105: 'Natasha', + 1106: 'Pela', + 1107: 'Clara', + 1108: 'Sampo', + 1109: 'Hook', + 1110: 'Lynx', + 1111: 'Luka', + 1112: 'TopazAndNumby', + 1201: 'Qingque', + 1202: 'Tingyun', + 1203: 'Luocha', + 1204: 'JingYuan', + 1205: 'Blade', + 1206: 'Sushang', + 1207: 'Yukong', + 1208: 'FuXuan', + 1209: 'Yanqing', + 1210: 'Guinaifen', + 1211: 'Bailu', + 1212: 'Jingliu', + 1213: 'DanHengImbibitorLunae', + 1214: 'Xueyi', + 1215: 'Hanya', + 1217: 'Huohuo', + 1302: 'Argenti', + 1303: 'RuanMei', + 1305: 'DrRatio', + 8001: 'TrailblazerPhysicalM', + 8002: 'TrailblazerPhysicalF', + 8003: 'TrailblazerFireM', + 8004: 'TrailblazerFireF', } as const export type AvatarId = keyof typeof characterIdMap diff --git a/libs/sr-dm/src/mapping/lightCone.ts b/libs/sr-dm/src/mapping/lightCone.ts index 25808c2911..0d068f8904 100644 --- a/libs/sr-dm/src/mapping/lightCone.ts +++ b/libs/sr-dm/src/mapping/lightCone.ts @@ -2,74 +2,89 @@ import type { LightConeKey } from '@genshin-optimizer/sr-consts' import type { EquipmentConfig } from '../dm' export const lightConeIdMap: Record = { - '20000': 'Arrows', - '20001': 'Cornucopia', - '20002': 'CollapsingSky', - '20003': 'Amber', - '20004': 'Void', - '20005': 'Chorus', - '20006': 'DataBank', - '20007': 'DartingArrow', - '20008': 'FineFruit', - '20009': 'ShatteredHome', - '20010': 'Defense', - '20011': 'Loop', - '20012': 'MeshingCogs', - '20013': 'Passkey', - '20014': 'Adversarial', - '20015': 'Multiplication', - '20016': 'MutualDemise', - '20017': 'Pioneering', - '20018': 'HiddenShadow', - '20019': 'Mediation', - '20020': 'Sagacity', - '21000': 'PostOpConversation', - '21001': 'GoodNightAndSleepWell', - '21002': 'DayOneOfMyNewLife', - '21003': 'OnlySilenceRemains', - '21004': 'MemoriesOfThePast', - '21005': 'TheMolesWelcomeYou', - '21006': 'TheBirthOfTheSelf', - '21007': 'SharedFeeling', - '21008': 'EyesOfThePrey', - '21009': 'LandausChoice', - '21010': 'Swordplay', - '21011': 'PlanetaryRendezvous', - '21012': 'ASecretVow', - '21013': 'MakeTheWorldClamor', - '21014': 'PerfectTiming', - '21015': 'ResolutionShinesAsPearlsOfSweat', - '21016': 'TrendOfTheUniversalMarket', - '21017': 'SubscribeForMore', - '21018': 'DanceDanceDance', - '21019': 'UnderTheBlueSky', - '21020': 'GeniusesRepose', - '21021': 'QuidProQuo', - '21022': 'Fermata', - '21023': 'WeAreWildfire', - '21024': 'RiverFlowsInSpring', - '21025': 'PastAndFuture', - '21026': 'WoofWalkTime', - '21027': 'TheSeriousnessOfBreakfast', - '21028': 'WarmthShortensColdNights', - '21029': 'WeWillMeetAgain', - '21030': 'ThisIsMe', - '21031': 'ReturnToDarkness', - '21032': 'CarveTheMoonWeaveTheClouds', - '21033': 'NowhereToRun', - '21034': 'TodayIsAnotherPeacefulDay', - '23000': 'NightOnTheMilkyWay', - '23001': 'InTheNight', - '23002': 'SomethingIrreplaceable', - '23003': 'ButTheBattleIsntOver', - '23004': 'InTheNameOfTheWorld', - '23005': 'MomentOfVictory', - '23010': 'BeforeDawn', - '23012': 'SleepLikeTheDead', - '23013': 'TimeWaitsForNoOne', - '24000': 'OnTheFallOfAnAeon', - '24001': 'CruisingInTheStellarSea', - '24002': 'TextureOfMemories', + 20000: 'Arrows', + 20001: 'Cornucopia', + 20002: 'CollapsingSky', + 20003: 'Amber', + 20004: 'Void', + 20005: 'Chorus', + 20006: 'DataBank', + 20007: 'DartingArrow', + 20008: 'FineFruit', + 20009: 'ShatteredHome', + 20010: 'Defense', + 20011: 'Loop', + 20012: 'MeshingCogs', + 20013: 'Passkey', + 20014: 'Adversarial', + 20015: 'Multiplication', + 20016: 'MutualDemise', + 20017: 'Pioneering', + 20018: 'HiddenShadow', + 20019: 'Mediation', + 20020: 'Sagacity', + 21000: 'PostOpConversation', + 21001: 'GoodNightAndSleepWell', + 21002: 'DayOneOfMyNewLife', + 21003: 'OnlySilenceRemains', + 21004: 'MemoriesOfThePast', + 21005: 'TheMolesWelcomeYou', + 21006: 'TheBirthOfTheSelf', + 21007: 'SharedFeeling', + 21008: 'EyesOfThePrey', + 21009: 'LandausChoice', + 21010: 'Swordplay', + 21011: 'PlanetaryRendezvous', + 21012: 'ASecretVow', + 21013: 'MakeTheWorldClamor', + 21014: 'PerfectTiming', + 21015: 'ResolutionShinesAsPearlsOfSweat', + 21016: 'TrendOfTheUniversalMarket', + 21017: 'SubscribeForMore', + 21018: 'DanceDanceDance', + 21019: 'UnderTheBlueSky', + 21020: 'GeniusesRepose', + 21021: 'QuidProQuo', + 21022: 'Fermata', + 21023: 'WeAreWildfire', + 21024: 'RiverFlowsInSpring', + 21025: 'PastAndFuture', + 21026: 'WoofWalkTime', + 21027: 'TheSeriousnessOfBreakfast', + 21028: 'WarmthShortensColdNights', + 21029: 'WeWillMeetAgain', + 21030: 'ThisIsMe', + 21031: 'ReturnToDarkness', + 21032: 'CarveTheMoonWeaveTheClouds', + 21033: 'NowhereToRun', + 21034: 'TodayIsAnotherPeacefulDay', + 22000: 'BeforeTheTutorialMissionStarts', + 22001: 'HeyOverHere', + 23000: 'NightOnTheMilkyWay', + 23001: 'InTheNight', + 23002: 'SomethingIrreplaceable', + 23003: 'ButTheBattleIsntOver', + 23004: 'InTheNameOfTheWorld', + 23005: 'MomentOfVictory', + 23006: 'PatienceIsAllYouNeed', + 23007: 'IncessantRain', + 23008: 'EchoesOfTheCoffin', + 23009: 'TheUnreachableSide', + 23010: 'BeforeDawn', + 23011: 'SheAlreadyShutHerEyes', + 23012: 'SleepLikeTheDead', + 23013: 'TimeWaitsForNoOne', + 23014: 'IShallBeMyOwnSword', + 23015: 'BrighterThanTheSun', + 23016: 'WorrisomeBlissful', + 23017: 'NightOfFright', + 23018: 'AnInstantBeforeAGaze', + 23019: 'PastSelfInMirror', + 23020: 'BaptismOfPureThought', + 24000: 'OnTheFallOfAnAeon', + 24001: 'CruisingInTheStellarSea', + 24002: 'TextureOfMemories', + 24003: 'SolitaryHealing', } export type LightConeId = keyof typeof lightConeIdMap diff --git a/libs/sr-dm/src/mapping/relic.ts b/libs/sr-dm/src/mapping/relic.ts index f54473ad45..c012b61133 100644 --- a/libs/sr-dm/src/mapping/relic.ts +++ b/libs/sr-dm/src/mapping/relic.ts @@ -13,6 +13,9 @@ export const relicSetIdMap: Record = { 110: 'EagleOfTwilightLine', 111: 'ThiefOfShootingMeteor', 112: 'WastelanderOfBanditryDesert', + 113: 'LongevousDisciple', + 114: 'MessengerTraversingHackerspace', + 115: 'TheAshblazingGrandDuke', 116: 'PrisonerInDeepConfinement', 301: 'SpaceSealingStation', @@ -23,7 +26,10 @@ export const relicSetIdMap: Record = { 306: 'InertSalsotto', 307: 'TaliaKingdomOfBanditry', 308: 'SprightlyVonwacq', + 309: 'RutilantArena', + 310: 'BrokenKeel', 311: 'FirmamentFrontlineGlamoth', + 312: 'PenaconyLandOfTheDreams', } export type RelicSetId = keyof typeof relicSetIdMap diff --git a/libs/sr-formula/README.md b/libs/sr-formula/README.md index fef5be92e2..220c2bcad9 100644 --- a/libs/sr-formula/README.md +++ b/libs/sr-formula/README.md @@ -6,6 +6,16 @@ This library was generated with [Nx](https://nx.dev). Run `nx build sr-formula` to build the library. +## Generating descriptor file + +Run `nx run sr-formula:gen-file` to generate the `meta.ts` descriptor file. + +## Generating template sheets + +Run `nx generate @genshin-optimizer/sr-formula:gen-sheet ` to generate a single template. + +Run `nx generate @genshin-optimizer/sr-formula:gen-all-sheets` to generate all missing templates. + ## Running unit tests Run `nx test sr-formula` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/sr-formula/executors.json b/libs/sr-formula/executors.json new file mode 100644 index 0000000000..7e3fac96fb --- /dev/null +++ b/libs/sr-formula/executors.json @@ -0,0 +1,9 @@ +{ + "executors": { + "gen-desc": { + "implementation": "./src/executors/gen-desc/executor", + "schema": "./src/executors/gen-desc/schema.json", + "description": "gen-desc executor" + } + } +} diff --git a/libs/sr-formula/generators.json b/libs/sr-formula/generators.json new file mode 100644 index 0000000000..89e771af14 --- /dev/null +++ b/libs/sr-formula/generators.json @@ -0,0 +1,14 @@ +{ + "generators": { + "gen-sheet": { + "factory": "./src/generators/gen-sheet/single-generator", + "schema": "./src/generators/gen-sheet/single-schema.json", + "description": "Generate a single sheet" + }, + "gen-all-sheets": { + "factory": "./src/generators/gen-sheet/all-generator", + "schema": "./src/generators/gen-sheet/all-schema.json", + "description": "Generate all sheets" + } + } +} diff --git a/libs/sr-formula/package.json b/libs/sr-formula/package.json index f664c28c0a..d5a0dc2103 100644 --- a/libs/sr-formula/package.json +++ b/libs/sr-formula/package.json @@ -1,5 +1,7 @@ { "name": "@genshin-optimizer/sr-formula", "version": "0.0.1", + "executors": "./executors.json", + "generators": "./generators.json", "type": "commonjs" } diff --git a/libs/sr-formula/project.json b/libs/sr-formula/project.json index d8a15bbf9a..c01dc07322 100644 --- a/libs/sr-formula/project.json +++ b/libs/sr-formula/project.json @@ -10,6 +10,12 @@ "updateBuildableProjectDepsInPackageJson": true } }, + "gen-file": { + "executor": "@genshin-optimizer/sr-formula:gen-desc", + "options": { + "outputPath": "libs/sr-formula/src/meta.ts" + } + }, "lint": {}, "test": { "executor": "@nx/vite:test", diff --git a/libs/sr-formula/src/data/char/Argenti.ts b/libs/sr-formula/src/data/char/Argenti.ts new file mode 100644 index 0000000000..ecca9097ea --- /dev/null +++ b/libs/sr-formula/src/data/char/Argenti.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Argenti' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Arlan.ts b/libs/sr-formula/src/data/char/Arlan.ts new file mode 100644 index 0000000000..0d7ff59ae6 --- /dev/null +++ b/libs/sr-formula/src/data/char/Arlan.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Arlan' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Asta.ts b/libs/sr-formula/src/data/char/Asta.ts new file mode 100644 index 0000000000..6020edee12 --- /dev/null +++ b/libs/sr-formula/src/data/char/Asta.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Asta' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Bailu.ts b/libs/sr-formula/src/data/char/Bailu.ts new file mode 100644 index 0000000000..a9d538bb7a --- /dev/null +++ b/libs/sr-formula/src/data/char/Bailu.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Bailu' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Blade.ts b/libs/sr-formula/src/data/char/Blade.ts new file mode 100644 index 0000000000..1daa49cfcc --- /dev/null +++ b/libs/sr-formula/src/data/char/Blade.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Blade' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Bronya.ts b/libs/sr-formula/src/data/char/Bronya.ts new file mode 100644 index 0000000000..cf1c830f0a --- /dev/null +++ b/libs/sr-formula/src/data/char/Bronya.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Bronya' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Clara.ts b/libs/sr-formula/src/data/char/Clara.ts new file mode 100644 index 0000000000..8f3297348e --- /dev/null +++ b/libs/sr-formula/src/data/char/Clara.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Clara' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/DanHeng.ts b/libs/sr-formula/src/data/char/DanHeng.ts new file mode 100644 index 0000000000..334ba52f6a --- /dev/null +++ b/libs/sr-formula/src/data/char/DanHeng.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'DanHeng' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/DanHengImbibitorLunae.ts b/libs/sr-formula/src/data/char/DanHengImbibitorLunae.ts new file mode 100644 index 0000000000..a9061330a1 --- /dev/null +++ b/libs/sr-formula/src/data/char/DanHengImbibitorLunae.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'DanHengImbibitorLunae' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/DrRatio.ts b/libs/sr-formula/src/data/char/DrRatio.ts new file mode 100644 index 0000000000..f82d3f8513 --- /dev/null +++ b/libs/sr-formula/src/data/char/DrRatio.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'DrRatio' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/FuXuan.ts b/libs/sr-formula/src/data/char/FuXuan.ts new file mode 100644 index 0000000000..b6fbacc814 --- /dev/null +++ b/libs/sr-formula/src/data/char/FuXuan.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'FuXuan' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Gepard.ts b/libs/sr-formula/src/data/char/Gepard.ts new file mode 100644 index 0000000000..faf635d785 --- /dev/null +++ b/libs/sr-formula/src/data/char/Gepard.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Gepard' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Guinaifen.ts b/libs/sr-formula/src/data/char/Guinaifen.ts new file mode 100644 index 0000000000..ae16ebd59b --- /dev/null +++ b/libs/sr-formula/src/data/char/Guinaifen.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Guinaifen' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Hanya.ts b/libs/sr-formula/src/data/char/Hanya.ts new file mode 100644 index 0000000000..d2686ff76c --- /dev/null +++ b/libs/sr-formula/src/data/char/Hanya.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Hanya' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Herta.ts b/libs/sr-formula/src/data/char/Herta.ts new file mode 100644 index 0000000000..45287424aa --- /dev/null +++ b/libs/sr-formula/src/data/char/Herta.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Herta' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Himeko.ts b/libs/sr-formula/src/data/char/Himeko.ts new file mode 100644 index 0000000000..3443fbbb19 --- /dev/null +++ b/libs/sr-formula/src/data/char/Himeko.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Himeko' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Hook.ts b/libs/sr-formula/src/data/char/Hook.ts new file mode 100644 index 0000000000..273b18e35e --- /dev/null +++ b/libs/sr-formula/src/data/char/Hook.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Hook' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Huohuo.ts b/libs/sr-formula/src/data/char/Huohuo.ts new file mode 100644 index 0000000000..826c1241d6 --- /dev/null +++ b/libs/sr-formula/src/data/char/Huohuo.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Huohuo' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/JingYuan.ts b/libs/sr-formula/src/data/char/JingYuan.ts new file mode 100644 index 0000000000..654556c97a --- /dev/null +++ b/libs/sr-formula/src/data/char/JingYuan.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'JingYuan' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Jingliu.ts b/libs/sr-formula/src/data/char/Jingliu.ts new file mode 100644 index 0000000000..bbeae3cd10 --- /dev/null +++ b/libs/sr-formula/src/data/char/Jingliu.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Jingliu' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Kafka.ts b/libs/sr-formula/src/data/char/Kafka.ts new file mode 100644 index 0000000000..2674a47643 --- /dev/null +++ b/libs/sr-formula/src/data/char/Kafka.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Kafka' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Luka.ts b/libs/sr-formula/src/data/char/Luka.ts new file mode 100644 index 0000000000..d0f798687a --- /dev/null +++ b/libs/sr-formula/src/data/char/Luka.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Luka' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Luocha.ts b/libs/sr-formula/src/data/char/Luocha.ts new file mode 100644 index 0000000000..82665a15b5 --- /dev/null +++ b/libs/sr-formula/src/data/char/Luocha.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Luocha' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Lynx.ts b/libs/sr-formula/src/data/char/Lynx.ts new file mode 100644 index 0000000000..0cac977316 --- /dev/null +++ b/libs/sr-formula/src/data/char/Lynx.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Lynx' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Natasha.ts b/libs/sr-formula/src/data/char/Natasha.ts new file mode 100644 index 0000000000..c465ad61ec --- /dev/null +++ b/libs/sr-formula/src/data/char/Natasha.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Natasha' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Pela.ts b/libs/sr-formula/src/data/char/Pela.ts new file mode 100644 index 0000000000..bcb7be90f7 --- /dev/null +++ b/libs/sr-formula/src/data/char/Pela.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Pela' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Qingque.ts b/libs/sr-formula/src/data/char/Qingque.ts new file mode 100644 index 0000000000..725bd270a7 --- /dev/null +++ b/libs/sr-formula/src/data/char/Qingque.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Qingque' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/RuanMei.ts b/libs/sr-formula/src/data/char/RuanMei.ts new file mode 100644 index 0000000000..5de554bd95 --- /dev/null +++ b/libs/sr-formula/src/data/char/RuanMei.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'RuanMei' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Sampo.ts b/libs/sr-formula/src/data/char/Sampo.ts new file mode 100644 index 0000000000..f9f177f0bb --- /dev/null +++ b/libs/sr-formula/src/data/char/Sampo.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Sampo' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Seele.ts b/libs/sr-formula/src/data/char/Seele.ts new file mode 100644 index 0000000000..4ddb538143 --- /dev/null +++ b/libs/sr-formula/src/data/char/Seele.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Seele' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Serval.ts b/libs/sr-formula/src/data/char/Serval.ts index 1d718d10b5..1aec71c83f 100644 --- a/libs/sr-formula/src/data/char/Serval.ts +++ b/libs/sr-formula/src/data/char/Serval.ts @@ -1,21 +1,21 @@ -import { cmpGE, prod } from '@genshin-optimizer/pando' +import { cmpGE } from '@genshin-optimizer/pando' import { type CharacterKey } from '@genshin-optimizer/sr-consts' import { allStats } from '@genshin-optimizer/sr-stats' -import type { DmgTag } from '../util' import { allBoolConditionals, - customDmg, - percent, + allListConditionals, + allNumConditionals, + enemyDebuff, register, self, selfBuff, + teamBuff, } from '../util' import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' const key: CharacterKey = 'Serval' const data_gen = allStats.char[key] const baseTag = getBaseTag(data_gen) -const shockTag: DmgTag = { ...baseTag, damageType1: 'dot' } const { basic, skill, ult, talent, technique, eidolon } = scalingParams(data_gen) @@ -23,86 +23,47 @@ let s = 0, u = 0, ta = 0, te = 0 +// TODO: Load scalings const dm = { basic: { dmg: basic[0], }, skill: { - dmgPrimary: skill[s++], - dmgBlast: skill[s++], - shockChance: skill[s++][0], - shockDuration: skill[s++][0], - shockDmg: skill[s++], + dmg: skill[s++], }, ult: { dmg: ult[u++], - shockDurationInc: ult[u++][0], }, talent: { dmg: talent[ta++], }, technique: { - shockChance: technique[te++][0], - dmg: technique[te++][0], - shockDuration: technique[te++][0], - shockDmg: technique[te++][0], + dmg: (technique[te++] ?? [0])[0], }, e1: { - dmg: eidolon[1][0], - }, - e2: { - energyRegen: eidolon[2][0], - }, - e4: { - shockChance: eidolon[4][0], - }, - e6: { - dmg_: eidolon[6][0], + dmg: eidolon[1][0] ?? 0, }, } as const const { char } = self -const { c6Shocked } = allBoolConditionals(key) +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) const sheet = register( key, // Handles base stats, StatBoosts and Eidolon 3 + 5 entriesForChar(data_gen), + // TODO: Add formulas/buffs // Formulas ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), - ...dmg('skillDmgPrimary', baseTag, 'atk', dm.skill.dmgPrimary, 'skill'), - ...dmg('skillDmgBlast', baseTag, 'atk', dm.skill.dmgBlast, 'skill'), - ...dmg('skillShockDmg', shockTag, 'atk', dm.skill.shockDmg, 'skill'), - ...dmg('ultDmg', baseTag, 'atk', dm.ult.dmg, 'ult'), - ...dmg( - 'talentDmg', - { damageType1: 'elemental', ...baseTag }, - 'atk', - dm.talent.dmg, - 'talent' - ), - ...customDmg( - 'techniqueDmg', - { damageType1: 'technique', ...baseTag }, - prod(self.final.atk, percent(dm.technique.dmg)) - ), - ...customDmg( - 'techniqueShockDmg', - shockTag, - prod(self.final.atk, percent(dm.technique.shockDmg)) - ), - // Eidolon formulas - ...customDmg( - 'e1Dmg', - { damageType1: 'elemental', ...baseTag }, - prod(self.final.atk, percent(dm.e1.dmg)), - undefined, - { cond: cmpGE(char.eidolon, 1, 'unique', '') } - ), - // Eidolon buffs - selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, c6Shocked.ifOn(dm.e6.dmg_))) + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) ) export default sheet diff --git a/libs/sr-formula/src/data/char/SilverWolf.ts b/libs/sr-formula/src/data/char/SilverWolf.ts new file mode 100644 index 0000000000..7f1c0d072d --- /dev/null +++ b/libs/sr-formula/src/data/char/SilverWolf.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'SilverWolf' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Sushang.ts b/libs/sr-formula/src/data/char/Sushang.ts new file mode 100644 index 0000000000..7b611c22c6 --- /dev/null +++ b/libs/sr-formula/src/data/char/Sushang.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Sushang' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Tingyun.ts b/libs/sr-formula/src/data/char/Tingyun.ts new file mode 100644 index 0000000000..9ca6dfbe84 --- /dev/null +++ b/libs/sr-formula/src/data/char/Tingyun.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Tingyun' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/TopazAndNumby.ts b/libs/sr-formula/src/data/char/TopazAndNumby.ts new file mode 100644 index 0000000000..5259e79c37 --- /dev/null +++ b/libs/sr-formula/src/data/char/TopazAndNumby.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'TopazAndNumby' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Welt.ts b/libs/sr-formula/src/data/char/Welt.ts new file mode 100644 index 0000000000..57658a786c --- /dev/null +++ b/libs/sr-formula/src/data/char/Welt.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Welt' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Xueyi.ts b/libs/sr-formula/src/data/char/Xueyi.ts new file mode 100644 index 0000000000..d3979f31ab --- /dev/null +++ b/libs/sr-formula/src/data/char/Xueyi.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Xueyi' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Yanqing.ts b/libs/sr-formula/src/data/char/Yanqing.ts new file mode 100644 index 0000000000..dd14b8fbd7 --- /dev/null +++ b/libs/sr-formula/src/data/char/Yanqing.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Yanqing' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/Yukong.ts b/libs/sr-formula/src/data/char/Yukong.ts new file mode 100644 index 0000000000..94dfdd5a3b --- /dev/null +++ b/libs/sr-formula/src/data/char/Yukong.ts @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = 'Yukong' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/char/index.ts b/libs/sr-formula/src/data/char/index.ts index 8ffb2cb09f..2810ff7e62 100644 --- a/libs/sr-formula/src/data/char/index.ts +++ b/libs/sr-formula/src/data/char/index.ts @@ -1,53 +1,85 @@ -import { constant, prod, subscript, sum } from '@genshin-optimizer/pando' -import type { NonTrailblazerCharacterKey } from '@genshin-optimizer/sr-consts' -import { nonTrailblazerCharacterKeys } from '@genshin-optimizer/sr-consts' -import { allStats } from '@genshin-optimizer/sr-stats' -import { register, self, selfBuff, type TagMapNodeEntries } from '../util' +import type { TagMapNodeEntries } from '../util' +import Argenti from './Argenti' +import Arlan from './Arlan' +import Asta from './Asta' +import Bailu from './Bailu' +import Blade from './Blade' +import Bronya from './Bronya' +import Clara from './Clara' +import DanHeng from './DanHeng' +import DanHengImbibitorLunae from './DanHengImbibitorLunae' +import DrRatio from './DrRatio' +import FuXuan from './FuXuan' +import Gepard from './Gepard' +import Guinaifen from './Guinaifen' +import Hanya from './Hanya' +import Herta from './Herta' +import Himeko from './Himeko' +import Hook from './Hook' +import Huohuo from './Huohuo' +import JingYuan from './JingYuan' +import Jingliu from './Jingliu' +import Kafka from './Kafka' +import Luka from './Luka' +import Luocha from './Luocha' +import Lynx from './Lynx' import March7th from './March7th' +import Natasha from './Natasha' +import Pela from './Pela' +import Qingque from './Qingque' +import RuanMei from './RuanMei' +import Sampo from './Sampo' +import Seele from './Seele' import Serval from './Serval' - -// Attach the base stats from the generated datamine -function handleCharacterGen( - src: NonTrailblazerCharacterKey -): TagMapNodeEntries { - const chardataGen = allStats.char[src] - const { ascension } = self.char - // The "add" only applies to currLvl - 1, since "base" is stat at lvl 1 - const readLvl = sum(constant(-1), self.char.lvl) - return register(src, [ - ...(['hp', 'atk', 'def'] as const).map((sk) => { - const basePerAsc = chardataGen.ascension.map((p) => p[sk].base) - const addPerAsc = chardataGen.ascension.map((p) => p[sk].add) - return selfBuff.base[sk].add( - sum( - subscript(ascension, basePerAsc), - prod(readLvl, subscript(ascension, addPerAsc)) - ) - ) - }), - ...(['crit_', 'crit_dmg_'] as const).map((sk) => { - const statAsc = chardataGen.ascension.map((p) => p[sk]) - return selfBuff.premod[sk].add(subscript(ascension, statAsc)) - }), - selfBuff.premod.spd.add( - subscript( - ascension, - chardataGen.ascension.map((p) => p.spd) - ) - ), - ]) -} +import SilverWolf from './SilverWolf' +import Sushang from './Sushang' +import Tingyun from './Tingyun' +import TopazAndNumby from './TopazAndNumby' +import Welt from './Welt' +import Xueyi from './Xueyi' +import Yanqing from './Yanqing' +import Yukong from './Yukong' const data: TagMapNodeEntries[] = [ - nonTrailblazerCharacterKeys.flatMap((key) => { - switch (key) { - case 'March7th': - return March7th - case 'Serval': - return Serval - default: - return handleCharacterGen(key) - } - }), + Argenti, + Arlan, + Asta, + Bailu, + Blade, + Bronya, + Clara, + DanHeng, + DanHengImbibitorLunae, + DrRatio, + FuXuan, + Gepard, + Guinaifen, + Hanya, + Herta, + Himeko, + Hook, + Huohuo, + JingYuan, + Jingliu, + Kafka, + Luka, + Luocha, + Lynx, + March7th, + Natasha, + Pela, + Qingque, + RuanMei, + Sampo, + Seele, + Serval, + SilverWolf, + Sushang, + Tingyun, + TopazAndNumby, + Welt, + Xueyi, + Yanqing, + Yukong, ] export default data.flat() diff --git a/libs/sr-formula/src/data/index.ts b/libs/sr-formula/src/data/index.ts index 5502f883d4..88ad732785 100644 --- a/libs/sr-formula/src/data/index.ts +++ b/libs/sr-formula/src/data/index.ts @@ -14,7 +14,7 @@ import charData from './char' import common from './common' import lcData from './lightCone' -const data: TagMapNodeEntries = [...charData, ...lcData, ...common] +export const data: TagMapNodeEntries = [...charData, ...lcData, ...common] export const keys = compileTagMapKeys([ { category: 'qt', values: queryTypes }, { category: 'q', values: usedQ }, diff --git a/libs/sr-formula/src/data/lightCone/ASecretVow.ts b/libs/sr-formula/src/data/lightCone/ASecretVow.ts new file mode 100644 index 0000000000..2779fa9dd3 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/ASecretVow.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'ASecretVow' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Adversarial.ts b/libs/sr-formula/src/data/lightCone/Adversarial.ts new file mode 100644 index 0000000000..17188a9ba9 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Adversarial.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Adversarial' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Amber.ts b/libs/sr-formula/src/data/lightCone/Amber.ts new file mode 100644 index 0000000000..bd8b9c768b --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Amber.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Amber' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/AnInstantBeforeAGaze.ts b/libs/sr-formula/src/data/lightCone/AnInstantBeforeAGaze.ts new file mode 100644 index 0000000000..526f1bc2bd --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/AnInstantBeforeAGaze.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'AnInstantBeforeAGaze' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Arrows.ts b/libs/sr-formula/src/data/lightCone/Arrows.ts new file mode 100644 index 0000000000..f1794e88a1 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Arrows.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Arrows' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/BaptismOfPureThought.ts b/libs/sr-formula/src/data/lightCone/BaptismOfPureThought.ts new file mode 100644 index 0000000000..ce4ea63fff --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/BaptismOfPureThought.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'BaptismOfPureThought' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/BeforeDawn.ts b/libs/sr-formula/src/data/lightCone/BeforeDawn.ts new file mode 100644 index 0000000000..8afaeb72b3 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/BeforeDawn.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'BeforeDawn' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/BeforeTheTutorialMissionStarts.ts b/libs/sr-formula/src/data/lightCone/BeforeTheTutorialMissionStarts.ts new file mode 100644 index 0000000000..9acf4ecb60 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/BeforeTheTutorialMissionStarts.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'BeforeTheTutorialMissionStarts' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/BrighterThanTheSun.ts b/libs/sr-formula/src/data/lightCone/BrighterThanTheSun.ts new file mode 100644 index 0000000000..bc1a1830aa --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/BrighterThanTheSun.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'BrighterThanTheSun' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/ButTheBattleIsntOver.ts b/libs/sr-formula/src/data/lightCone/ButTheBattleIsntOver.ts new file mode 100644 index 0000000000..af7e827311 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/ButTheBattleIsntOver.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'ButTheBattleIsntOver' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/CarveTheMoonWeaveTheClouds.ts b/libs/sr-formula/src/data/lightCone/CarveTheMoonWeaveTheClouds.ts new file mode 100644 index 0000000000..5dbc848fe9 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/CarveTheMoonWeaveTheClouds.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'CarveTheMoonWeaveTheClouds' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Chorus.ts b/libs/sr-formula/src/data/lightCone/Chorus.ts new file mode 100644 index 0000000000..76f4e7b94d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Chorus.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Chorus' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/CollapsingSky.ts b/libs/sr-formula/src/data/lightCone/CollapsingSky.ts new file mode 100644 index 0000000000..3e88eedc81 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/CollapsingSky.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'CollapsingSky' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Cornucopia.ts b/libs/sr-formula/src/data/lightCone/Cornucopia.ts new file mode 100644 index 0000000000..30ced5da8d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Cornucopia.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Cornucopia' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/CruisingInTheStellarSea.ts b/libs/sr-formula/src/data/lightCone/CruisingInTheStellarSea.ts new file mode 100644 index 0000000000..e6cbf6bb35 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/CruisingInTheStellarSea.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'CruisingInTheStellarSea' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/DanceDanceDance.ts b/libs/sr-formula/src/data/lightCone/DanceDanceDance.ts new file mode 100644 index 0000000000..172604c89e --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/DanceDanceDance.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'DanceDanceDance' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/DartingArrow.ts b/libs/sr-formula/src/data/lightCone/DartingArrow.ts new file mode 100644 index 0000000000..146521b87d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/DartingArrow.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'DartingArrow' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/DataBank.ts b/libs/sr-formula/src/data/lightCone/DataBank.ts new file mode 100644 index 0000000000..059ca49418 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/DataBank.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'DataBank' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/DayOneOfMyNewLife.ts b/libs/sr-formula/src/data/lightCone/DayOneOfMyNewLife.ts new file mode 100644 index 0000000000..928b9dd8d6 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/DayOneOfMyNewLife.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'DayOneOfMyNewLife' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Defense.ts b/libs/sr-formula/src/data/lightCone/Defense.ts new file mode 100644 index 0000000000..39a9d2ed64 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Defense.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Defense' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/EchoesOfTheCoffin.ts b/libs/sr-formula/src/data/lightCone/EchoesOfTheCoffin.ts new file mode 100644 index 0000000000..bc3716fbf8 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/EchoesOfTheCoffin.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'EchoesOfTheCoffin' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/EyesOfThePrey.ts b/libs/sr-formula/src/data/lightCone/EyesOfThePrey.ts new file mode 100644 index 0000000000..3d3fae883e --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/EyesOfThePrey.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'EyesOfThePrey' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Fermata.ts b/libs/sr-formula/src/data/lightCone/Fermata.ts new file mode 100644 index 0000000000..956c2bb47f --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Fermata.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Fermata' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/FineFruit.ts b/libs/sr-formula/src/data/lightCone/FineFruit.ts new file mode 100644 index 0000000000..8fbaddf560 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/FineFruit.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'FineFruit' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/GeniusesRepose.ts b/libs/sr-formula/src/data/lightCone/GeniusesRepose.ts new file mode 100644 index 0000000000..c0b5830cbd --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/GeniusesRepose.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'GeniusesRepose' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/GoodNightAndSleepWell.ts b/libs/sr-formula/src/data/lightCone/GoodNightAndSleepWell.ts new file mode 100644 index 0000000000..88c03b214a --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/GoodNightAndSleepWell.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'GoodNightAndSleepWell' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/HeyOverHere.ts b/libs/sr-formula/src/data/lightCone/HeyOverHere.ts new file mode 100644 index 0000000000..82065840a9 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/HeyOverHere.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'HeyOverHere' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/HiddenShadow.ts b/libs/sr-formula/src/data/lightCone/HiddenShadow.ts new file mode 100644 index 0000000000..57e558bf95 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/HiddenShadow.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'HiddenShadow' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/IShallBeMyOwnSword.ts b/libs/sr-formula/src/data/lightCone/IShallBeMyOwnSword.ts new file mode 100644 index 0000000000..390361ccec --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/IShallBeMyOwnSword.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'IShallBeMyOwnSword' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/InTheNameOfTheWorld.ts b/libs/sr-formula/src/data/lightCone/InTheNameOfTheWorld.ts new file mode 100644 index 0000000000..ea4da77287 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/InTheNameOfTheWorld.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'InTheNameOfTheWorld' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/InTheNight.ts b/libs/sr-formula/src/data/lightCone/InTheNight.ts new file mode 100644 index 0000000000..2c8f109cc9 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/InTheNight.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'InTheNight' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/IncessantRain.ts b/libs/sr-formula/src/data/lightCone/IncessantRain.ts new file mode 100644 index 0000000000..019ed773ec --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/IncessantRain.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'IncessantRain' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/LandausChoice.ts b/libs/sr-formula/src/data/lightCone/LandausChoice.ts new file mode 100644 index 0000000000..9b67e92afa --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/LandausChoice.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'LandausChoice' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Loop.ts b/libs/sr-formula/src/data/lightCone/Loop.ts new file mode 100644 index 0000000000..2fa4c89ca1 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Loop.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Loop' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/MakeTheWorldClamor.ts b/libs/sr-formula/src/data/lightCone/MakeTheWorldClamor.ts new file mode 100644 index 0000000000..35d8c6ae43 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/MakeTheWorldClamor.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'MakeTheWorldClamor' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Mediation.ts b/libs/sr-formula/src/data/lightCone/Mediation.ts new file mode 100644 index 0000000000..41e65022b8 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Mediation.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Mediation' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/MemoriesOfThePast.ts b/libs/sr-formula/src/data/lightCone/MemoriesOfThePast.ts new file mode 100644 index 0000000000..70d72c6b2f --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/MemoriesOfThePast.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'MemoriesOfThePast' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/MeshingCogs.ts b/libs/sr-formula/src/data/lightCone/MeshingCogs.ts new file mode 100644 index 0000000000..d81790b520 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/MeshingCogs.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'MeshingCogs' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/MomentOfVictory.ts b/libs/sr-formula/src/data/lightCone/MomentOfVictory.ts new file mode 100644 index 0000000000..ac9551e8d1 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/MomentOfVictory.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'MomentOfVictory' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Multiplication.ts b/libs/sr-formula/src/data/lightCone/Multiplication.ts new file mode 100644 index 0000000000..abb86da87b --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Multiplication.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Multiplication' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/MutualDemise.ts b/libs/sr-formula/src/data/lightCone/MutualDemise.ts new file mode 100644 index 0000000000..aa9fcea33d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/MutualDemise.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'MutualDemise' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/NightOfFright.ts b/libs/sr-formula/src/data/lightCone/NightOfFright.ts new file mode 100644 index 0000000000..8aee96a13c --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/NightOfFright.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'NightOfFright' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/NightOnTheMilkyWay.ts b/libs/sr-formula/src/data/lightCone/NightOnTheMilkyWay.ts new file mode 100644 index 0000000000..655c3d885a --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/NightOnTheMilkyWay.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'NightOnTheMilkyWay' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/NowhereToRun.ts b/libs/sr-formula/src/data/lightCone/NowhereToRun.ts new file mode 100644 index 0000000000..b847e7043f --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/NowhereToRun.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'NowhereToRun' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/OnTheFallOfAnAeon.ts b/libs/sr-formula/src/data/lightCone/OnTheFallOfAnAeon.ts new file mode 100644 index 0000000000..39af8e654d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/OnTheFallOfAnAeon.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'OnTheFallOfAnAeon' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/OnlySilenceRemains.ts b/libs/sr-formula/src/data/lightCone/OnlySilenceRemains.ts new file mode 100644 index 0000000000..ada52d03d9 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/OnlySilenceRemains.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'OnlySilenceRemains' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Passkey.ts b/libs/sr-formula/src/data/lightCone/Passkey.ts new file mode 100644 index 0000000000..1cbe323d79 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Passkey.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Passkey' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/PastAndFuture.ts b/libs/sr-formula/src/data/lightCone/PastAndFuture.ts new file mode 100644 index 0000000000..05fb18fa8a --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/PastAndFuture.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'PastAndFuture' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/PastSelfInMirror.ts b/libs/sr-formula/src/data/lightCone/PastSelfInMirror.ts new file mode 100644 index 0000000000..73298f44da --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/PastSelfInMirror.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'PastSelfInMirror' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/PatienceIsAllYouNeed.ts b/libs/sr-formula/src/data/lightCone/PatienceIsAllYouNeed.ts new file mode 100644 index 0000000000..04219343eb --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/PatienceIsAllYouNeed.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'PatienceIsAllYouNeed' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/PerfectTiming.ts b/libs/sr-formula/src/data/lightCone/PerfectTiming.ts new file mode 100644 index 0000000000..103b53a3f4 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/PerfectTiming.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'PerfectTiming' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Pioneering.ts b/libs/sr-formula/src/data/lightCone/Pioneering.ts new file mode 100644 index 0000000000..a31316c676 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Pioneering.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Pioneering' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/PlanetaryRendezvous.ts b/libs/sr-formula/src/data/lightCone/PlanetaryRendezvous.ts new file mode 100644 index 0000000000..46433d8742 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/PlanetaryRendezvous.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'PlanetaryRendezvous' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/PostOpConversation.ts b/libs/sr-formula/src/data/lightCone/PostOpConversation.ts new file mode 100644 index 0000000000..a8d48a57c4 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/PostOpConversation.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'PostOpConversation' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/QuidProQuo.ts b/libs/sr-formula/src/data/lightCone/QuidProQuo.ts new file mode 100644 index 0000000000..cb7808d4e4 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/QuidProQuo.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'QuidProQuo' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/ResolutionShinesAsPearlsOfSweat.ts b/libs/sr-formula/src/data/lightCone/ResolutionShinesAsPearlsOfSweat.ts new file mode 100644 index 0000000000..74cca03156 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/ResolutionShinesAsPearlsOfSweat.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'ResolutionShinesAsPearlsOfSweat' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/ReturnToDarkness.ts b/libs/sr-formula/src/data/lightCone/ReturnToDarkness.ts new file mode 100644 index 0000000000..9a0cd15102 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/ReturnToDarkness.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'ReturnToDarkness' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/RiverFlowsInSpring.ts b/libs/sr-formula/src/data/lightCone/RiverFlowsInSpring.ts new file mode 100644 index 0000000000..25d3ddd86d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/RiverFlowsInSpring.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'RiverFlowsInSpring' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Sagacity.ts b/libs/sr-formula/src/data/lightCone/Sagacity.ts new file mode 100644 index 0000000000..3bb5f42f3d --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Sagacity.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Sagacity' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/SharedFeeling.ts b/libs/sr-formula/src/data/lightCone/SharedFeeling.ts new file mode 100644 index 0000000000..22a309963b --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/SharedFeeling.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'SharedFeeling' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/ShatteredHome.ts b/libs/sr-formula/src/data/lightCone/ShatteredHome.ts new file mode 100644 index 0000000000..a926a94d4b --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/ShatteredHome.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'ShatteredHome' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/SheAlreadyShutHerEyes.ts b/libs/sr-formula/src/data/lightCone/SheAlreadyShutHerEyes.ts new file mode 100644 index 0000000000..66d7b19ce9 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/SheAlreadyShutHerEyes.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'SheAlreadyShutHerEyes' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/SleepLikeTheDead.ts b/libs/sr-formula/src/data/lightCone/SleepLikeTheDead.ts new file mode 100644 index 0000000000..b46cd23c1e --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/SleepLikeTheDead.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'SleepLikeTheDead' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/SolitaryHealing.ts b/libs/sr-formula/src/data/lightCone/SolitaryHealing.ts new file mode 100644 index 0000000000..abafc4ebe6 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/SolitaryHealing.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'SolitaryHealing' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/SomethingIrreplaceable.ts b/libs/sr-formula/src/data/lightCone/SomethingIrreplaceable.ts new file mode 100644 index 0000000000..ab47594bdb --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/SomethingIrreplaceable.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'SomethingIrreplaceable' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/SubscribeForMore.ts b/libs/sr-formula/src/data/lightCone/SubscribeForMore.ts new file mode 100644 index 0000000000..0ce5c4ffe4 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/SubscribeForMore.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'SubscribeForMore' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Swordplay.ts b/libs/sr-formula/src/data/lightCone/Swordplay.ts new file mode 100644 index 0000000000..2da3ca52e5 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Swordplay.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Swordplay' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TextureOfMemories.ts b/libs/sr-formula/src/data/lightCone/TextureOfMemories.ts new file mode 100644 index 0000000000..27586414c2 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TextureOfMemories.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TextureOfMemories' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TheBirthOfTheSelf.ts b/libs/sr-formula/src/data/lightCone/TheBirthOfTheSelf.ts new file mode 100644 index 0000000000..bd93936fc7 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TheBirthOfTheSelf.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TheBirthOfTheSelf' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TheMolesWelcomeYou.ts b/libs/sr-formula/src/data/lightCone/TheMolesWelcomeYou.ts new file mode 100644 index 0000000000..65f84a88c0 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TheMolesWelcomeYou.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TheMolesWelcomeYou' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TheUnreachableSide.ts b/libs/sr-formula/src/data/lightCone/TheUnreachableSide.ts new file mode 100644 index 0000000000..d5ccd44660 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TheUnreachableSide.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TheUnreachableSide' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/ThisIsMe.ts b/libs/sr-formula/src/data/lightCone/ThisIsMe.ts new file mode 100644 index 0000000000..58aee33b4c --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/ThisIsMe.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'ThisIsMe' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TimeWaitsForNoOne.ts b/libs/sr-formula/src/data/lightCone/TimeWaitsForNoOne.ts new file mode 100644 index 0000000000..cd417fcbb6 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TimeWaitsForNoOne.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TimeWaitsForNoOne' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TodayIsAnotherPeacefulDay.ts b/libs/sr-formula/src/data/lightCone/TodayIsAnotherPeacefulDay.ts new file mode 100644 index 0000000000..8ffa3c4daa --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TodayIsAnotherPeacefulDay.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TodayIsAnotherPeacefulDay' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/TrendOfTheUniversalMarket.ts b/libs/sr-formula/src/data/lightCone/TrendOfTheUniversalMarket.ts new file mode 100644 index 0000000000..f635877beb --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/TrendOfTheUniversalMarket.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'TrendOfTheUniversalMarket' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/UnderTheBlueSky.ts b/libs/sr-formula/src/data/lightCone/UnderTheBlueSky.ts new file mode 100644 index 0000000000..88de7320f7 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/UnderTheBlueSky.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'UnderTheBlueSky' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/Void.ts b/libs/sr-formula/src/data/lightCone/Void.ts new file mode 100644 index 0000000000..8648c1e5e1 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/Void.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'Void' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/WarmthShortensColdNights.ts b/libs/sr-formula/src/data/lightCone/WarmthShortensColdNights.ts new file mode 100644 index 0000000000..7c3fe8b7a1 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/WarmthShortensColdNights.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'WarmthShortensColdNights' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/WeAreWildfire.ts b/libs/sr-formula/src/data/lightCone/WeAreWildfire.ts new file mode 100644 index 0000000000..3152df941c --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/WeAreWildfire.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'WeAreWildfire' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/WeWillMeetAgain.ts b/libs/sr-formula/src/data/lightCone/WeWillMeetAgain.ts new file mode 100644 index 0000000000..81a5fa145b --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/WeWillMeetAgain.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'WeWillMeetAgain' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/WoofWalkTime.ts b/libs/sr-formula/src/data/lightCone/WoofWalkTime.ts new file mode 100644 index 0000000000..ed57a669f1 --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/WoofWalkTime.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'WoofWalkTime' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/WorrisomeBlissful.ts b/libs/sr-formula/src/data/lightCone/WorrisomeBlissful.ts new file mode 100644 index 0000000000..9a4b779b9b --- /dev/null +++ b/libs/sr-formula/src/data/lightCone/WorrisomeBlissful.ts @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = 'WorrisomeBlissful' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/lightCone/index.ts b/libs/sr-formula/src/data/lightCone/index.ts index 04226f4388..d4ae0931fc 100644 --- a/libs/sr-formula/src/data/lightCone/index.ts +++ b/libs/sr-formula/src/data/lightCone/index.ts @@ -1,18 +1,172 @@ -import type { LightConeKey } from '@genshin-optimizer/sr-consts' -import { allLightConeKeys } from '@genshin-optimizer/sr-consts' -import { allStats } from '@genshin-optimizer/sr-stats' -import { register, type TagMapNodeEntries } from '../util' +import type { TagMapNodeEntries } from '../util' +import ASecretVow from './ASecretVow' +import Adversarial from './Adversarial' +import Amber from './Amber' +import AnInstantBeforeAGaze from './AnInstantBeforeAGaze' +import Arrows from './Arrows' +import BaptismOfPureThought from './BaptismOfPureThought' +import BeforeDawn from './BeforeDawn' +import BeforeTheTutorialMissionStarts from './BeforeTheTutorialMissionStarts' +import BrighterThanTheSun from './BrighterThanTheSun' +import ButTheBattleIsntOver from './ButTheBattleIsntOver' +import CarveTheMoonWeaveTheClouds from './CarveTheMoonWeaveTheClouds' +import Chorus from './Chorus' +import CollapsingSky from './CollapsingSky' +import Cornucopia from './Cornucopia' +import CruisingInTheStellarSea from './CruisingInTheStellarSea' +import DanceDanceDance from './DanceDanceDance' +import DartingArrow from './DartingArrow' +import DataBank from './DataBank' +import DayOneOfMyNewLife from './DayOneOfMyNewLife' +import Defense from './Defense' +import EchoesOfTheCoffin from './EchoesOfTheCoffin' +import EyesOfThePrey from './EyesOfThePrey' +import Fermata from './Fermata' +import FineFruit from './FineFruit' +import GeniusesRepose from './GeniusesRepose' +import GoodNightAndSleepWell from './GoodNightAndSleepWell' +import HeyOverHere from './HeyOverHere' +import HiddenShadow from './HiddenShadow' +import IShallBeMyOwnSword from './IShallBeMyOwnSword' +import InTheNameOfTheWorld from './InTheNameOfTheWorld' +import InTheNight from './InTheNight' +import IncessantRain from './IncessantRain' +import LandausChoice from './LandausChoice' +import Loop from './Loop' +import MakeTheWorldClamor from './MakeTheWorldClamor' +import Mediation from './Mediation' +import MemoriesOfThePast from './MemoriesOfThePast' +import MeshingCogs from './MeshingCogs' +import MomentOfVictory from './MomentOfVictory' +import Multiplication from './Multiplication' +import MutualDemise from './MutualDemise' +import NightOfFright from './NightOfFright' +import NightOnTheMilkyWay from './NightOnTheMilkyWay' +import NowhereToRun from './NowhereToRun' +import OnTheFallOfAnAeon from './OnTheFallOfAnAeon' +import OnlySilenceRemains from './OnlySilenceRemains' +import Passkey from './Passkey' +import PastSelfInMirror from './PastSelfInMirror' +import PastAndFuture from './PastAndFuture' +import PatienceIsAllYouNeed from './PatienceIsAllYouNeed' +import PerfectTiming from './PerfectTiming' +import Pioneering from './Pioneering' +import PlanetaryRendezvous from './PlanetaryRendezvous' +import PostOpConversation from './PostOpConversation' +import QuidProQuo from './QuidProQuo' +import ResolutionShinesAsPearlsOfSweat from './ResolutionShinesAsPearlsOfSweat' +import ReturnToDarkness from './ReturnToDarkness' +import RiverFlowsInSpring from './RiverFlowsInSpring' +import Sagacity from './Sagacity' +import SharedFeeling from './SharedFeeling' +import ShatteredHome from './ShatteredHome' +import SheAlreadyShutHerEyes from './SheAlreadyShutHerEyes' +import SleepLikeTheDead from './SleepLikeTheDead' +import SolitaryHealing from './SolitaryHealing' +import SomethingIrreplaceable from './SomethingIrreplaceable' +import SubscribeForMore from './SubscribeForMore' +import Swordplay from './Swordplay' +import TextureOfMemories from './TextureOfMemories' +import TheBirthOfTheSelf from './TheBirthOfTheSelf' +import TheMolesWelcomeYou from './TheMolesWelcomeYou' import TheSeriousnessOfBreakfast from './TheSeriousnessOfBreakfast' -import { entriesForLightCone } from './util' +import TheUnreachableSide from './TheUnreachableSide' +import ThisIsMe from './ThisIsMe' +import TimeWaitsForNoOne from './TimeWaitsForNoOne' +import TodayIsAnotherPeacefulDay from './TodayIsAnotherPeacefulDay' +import TrendOfTheUniversalMarket from './TrendOfTheUniversalMarket' +import UnderTheBlueSky from './UnderTheBlueSky' +import Void from './Void' +import WarmthShortensColdNights from './WarmthShortensColdNights' +import WeAreWildfire from './WeAreWildfire' +import WeWillMeetAgain from './WeWillMeetAgain' +import WoofWalkTime from './WoofWalkTime' +import WorrisomeBlissful from './WorrisomeBlissful' -// Attach the base stats from the generated datamine -export function lightConeBaseStats(src: LightConeKey): TagMapNodeEntries { - const dataGen = allStats.lightCone[src] - return register(src, entriesForLightCone(dataGen)) -} -const data: TagMapNodeEntries = allLightConeKeys.flatMap((key) => - key === 'TheSeriousnessOfBreakfast' - ? TheSeriousnessOfBreakfast - : lightConeBaseStats(key) -) -export default data +const data: TagMapNodeEntries[] = [ + ASecretVow, + Adversarial, + Amber, + AnInstantBeforeAGaze, + Arrows, + BaptismOfPureThought, + BeforeDawn, + BeforeTheTutorialMissionStarts, + BrighterThanTheSun, + ButTheBattleIsntOver, + CarveTheMoonWeaveTheClouds, + Chorus, + CollapsingSky, + Cornucopia, + CruisingInTheStellarSea, + DanceDanceDance, + DartingArrow, + DataBank, + DayOneOfMyNewLife, + Defense, + EchoesOfTheCoffin, + EyesOfThePrey, + Fermata, + FineFruit, + GeniusesRepose, + GoodNightAndSleepWell, + HeyOverHere, + HiddenShadow, + IShallBeMyOwnSword, + InTheNameOfTheWorld, + InTheNight, + IncessantRain, + LandausChoice, + Loop, + MakeTheWorldClamor, + Mediation, + MemoriesOfThePast, + MeshingCogs, + MomentOfVictory, + Multiplication, + MutualDemise, + NightOfFright, + NightOnTheMilkyWay, + NowhereToRun, + OnTheFallOfAnAeon, + OnlySilenceRemains, + Passkey, + PastSelfInMirror, + PastAndFuture, + PatienceIsAllYouNeed, + PerfectTiming, + Pioneering, + PlanetaryRendezvous, + PostOpConversation, + QuidProQuo, + ResolutionShinesAsPearlsOfSweat, + ReturnToDarkness, + RiverFlowsInSpring, + Sagacity, + SharedFeeling, + ShatteredHome, + SheAlreadyShutHerEyes, + SleepLikeTheDead, + SolitaryHealing, + SomethingIrreplaceable, + SubscribeForMore, + Swordplay, + TextureOfMemories, + TheBirthOfTheSelf, + TheMolesWelcomeYou, + TheSeriousnessOfBreakfast, + TheUnreachableSide, + ThisIsMe, + TimeWaitsForNoOne, + TodayIsAnotherPeacefulDay, + TrendOfTheUniversalMarket, + UnderTheBlueSky, + Void, + WarmthShortensColdNights, + WeAreWildfire, + WeWillMeetAgain, + WoofWalkTime, + WorrisomeBlissful, +] + +export default data.flat() diff --git a/libs/sr-formula/src/data/relic/BandOfSizzlingThunder.ts b/libs/sr-formula/src/data/relic/BandOfSizzlingThunder.ts new file mode 100644 index 0000000000..1b343e77ee --- /dev/null +++ b/libs/sr-formula/src/data/relic/BandOfSizzlingThunder.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'BandOfSizzlingThunder' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/BelobogOfTheArchitects.ts b/libs/sr-formula/src/data/relic/BelobogOfTheArchitects.ts new file mode 100644 index 0000000000..a6ce20c252 --- /dev/null +++ b/libs/sr-formula/src/data/relic/BelobogOfTheArchitects.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'BelobogOfTheArchitects' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/BrokenKeel.ts b/libs/sr-formula/src/data/relic/BrokenKeel.ts new file mode 100644 index 0000000000..3c04fba8b4 --- /dev/null +++ b/libs/sr-formula/src/data/relic/BrokenKeel.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'BrokenKeel' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/CelestialDifferentiator.ts b/libs/sr-formula/src/data/relic/CelestialDifferentiator.ts new file mode 100644 index 0000000000..04f32a0897 --- /dev/null +++ b/libs/sr-formula/src/data/relic/CelestialDifferentiator.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'CelestialDifferentiator' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/ChampionOfStreetwiseBoxing.ts b/libs/sr-formula/src/data/relic/ChampionOfStreetwiseBoxing.ts new file mode 100644 index 0000000000..5336f4aaa2 --- /dev/null +++ b/libs/sr-formula/src/data/relic/ChampionOfStreetwiseBoxing.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'ChampionOfStreetwiseBoxing' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/EagleOfTwilightLine.ts b/libs/sr-formula/src/data/relic/EagleOfTwilightLine.ts new file mode 100644 index 0000000000..8a41675196 --- /dev/null +++ b/libs/sr-formula/src/data/relic/EagleOfTwilightLine.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'EagleOfTwilightLine' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/FiresmithOfLavaForging.ts b/libs/sr-formula/src/data/relic/FiresmithOfLavaForging.ts new file mode 100644 index 0000000000..f605df8709 --- /dev/null +++ b/libs/sr-formula/src/data/relic/FiresmithOfLavaForging.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'FiresmithOfLavaForging' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/FleetOfTheAgeless.ts b/libs/sr-formula/src/data/relic/FleetOfTheAgeless.ts new file mode 100644 index 0000000000..cda5e7a249 --- /dev/null +++ b/libs/sr-formula/src/data/relic/FleetOfTheAgeless.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'FleetOfTheAgeless' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/GeniusOfBrilliantStars.ts b/libs/sr-formula/src/data/relic/GeniusOfBrilliantStars.ts new file mode 100644 index 0000000000..95bb580292 --- /dev/null +++ b/libs/sr-formula/src/data/relic/GeniusOfBrilliantStars.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'GeniusOfBrilliantStars' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/GuardOfWutheringSnow.ts b/libs/sr-formula/src/data/relic/GuardOfWutheringSnow.ts new file mode 100644 index 0000000000..220ab610a2 --- /dev/null +++ b/libs/sr-formula/src/data/relic/GuardOfWutheringSnow.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'GuardOfWutheringSnow' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/HunterOfGlacialForest.ts b/libs/sr-formula/src/data/relic/HunterOfGlacialForest.ts new file mode 100644 index 0000000000..33068148b2 --- /dev/null +++ b/libs/sr-formula/src/data/relic/HunterOfGlacialForest.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'HunterOfGlacialForest' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/InertSalsotto.ts b/libs/sr-formula/src/data/relic/InertSalsotto.ts new file mode 100644 index 0000000000..f78d2df994 --- /dev/null +++ b/libs/sr-formula/src/data/relic/InertSalsotto.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'InertSalsotto' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/KnightOfPurityPalace.ts b/libs/sr-formula/src/data/relic/KnightOfPurityPalace.ts new file mode 100644 index 0000000000..3bc557e8bf --- /dev/null +++ b/libs/sr-formula/src/data/relic/KnightOfPurityPalace.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'KnightOfPurityPalace' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/LongevousDisciple.ts b/libs/sr-formula/src/data/relic/LongevousDisciple.ts new file mode 100644 index 0000000000..ecc1ea6f31 --- /dev/null +++ b/libs/sr-formula/src/data/relic/LongevousDisciple.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'LongevousDisciple' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/MessengerTraversingHackerspace.ts b/libs/sr-formula/src/data/relic/MessengerTraversingHackerspace.ts new file mode 100644 index 0000000000..7c50d3050a --- /dev/null +++ b/libs/sr-formula/src/data/relic/MessengerTraversingHackerspace.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'MessengerTraversingHackerspace' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/MusketeerOfWildWheat.ts b/libs/sr-formula/src/data/relic/MusketeerOfWildWheat.ts new file mode 100644 index 0000000000..8c18fdce05 --- /dev/null +++ b/libs/sr-formula/src/data/relic/MusketeerOfWildWheat.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'MusketeerOfWildWheat' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/PanGalacticCommercialEnterprise.ts b/libs/sr-formula/src/data/relic/PanGalacticCommercialEnterprise.ts new file mode 100644 index 0000000000..84e10e7e58 --- /dev/null +++ b/libs/sr-formula/src/data/relic/PanGalacticCommercialEnterprise.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'PanGalacticCommercialEnterprise' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/PasserbyOfWanderingCloud.ts b/libs/sr-formula/src/data/relic/PasserbyOfWanderingCloud.ts new file mode 100644 index 0000000000..42e2bc5e37 --- /dev/null +++ b/libs/sr-formula/src/data/relic/PasserbyOfWanderingCloud.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'PasserbyOfWanderingCloud' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/PenaconyLandOfTheDreams.ts b/libs/sr-formula/src/data/relic/PenaconyLandOfTheDreams.ts new file mode 100644 index 0000000000..d389bbdb54 --- /dev/null +++ b/libs/sr-formula/src/data/relic/PenaconyLandOfTheDreams.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'PenaconyLandOfTheDreams' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/RutilantArena.ts b/libs/sr-formula/src/data/relic/RutilantArena.ts new file mode 100644 index 0000000000..ab44f72a6a --- /dev/null +++ b/libs/sr-formula/src/data/relic/RutilantArena.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'RutilantArena' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/SpaceSealingStation.ts b/libs/sr-formula/src/data/relic/SpaceSealingStation.ts new file mode 100644 index 0000000000..91144345dc --- /dev/null +++ b/libs/sr-formula/src/data/relic/SpaceSealingStation.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'SpaceSealingStation' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/SprightlyVonwacq.ts b/libs/sr-formula/src/data/relic/SprightlyVonwacq.ts new file mode 100644 index 0000000000..4174be0cc0 --- /dev/null +++ b/libs/sr-formula/src/data/relic/SprightlyVonwacq.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'SprightlyVonwacq' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/TaliaKingdomOfBanditry.ts b/libs/sr-formula/src/data/relic/TaliaKingdomOfBanditry.ts new file mode 100644 index 0000000000..3b88cb8797 --- /dev/null +++ b/libs/sr-formula/src/data/relic/TaliaKingdomOfBanditry.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'TaliaKingdomOfBanditry' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/TheAshblazingGrandDuke.ts b/libs/sr-formula/src/data/relic/TheAshblazingGrandDuke.ts new file mode 100644 index 0000000000..c9345fb98c --- /dev/null +++ b/libs/sr-formula/src/data/relic/TheAshblazingGrandDuke.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'TheAshblazingGrandDuke' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/ThiefOfShootingMeteor.ts b/libs/sr-formula/src/data/relic/ThiefOfShootingMeteor.ts new file mode 100644 index 0000000000..f23a2b5a56 --- /dev/null +++ b/libs/sr-formula/src/data/relic/ThiefOfShootingMeteor.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'ThiefOfShootingMeteor' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/WastelanderOfBanditryDesert.ts b/libs/sr-formula/src/data/relic/WastelanderOfBanditryDesert.ts new file mode 100644 index 0000000000..3e202fd760 --- /dev/null +++ b/libs/sr-formula/src/data/relic/WastelanderOfBanditryDesert.ts @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = 'WastelanderOfBanditryDesert' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/data/relic/index.ts b/libs/sr-formula/src/data/relic/index.ts index f79b70d800..48ac823612 100644 --- a/libs/sr-formula/src/data/relic/index.ts +++ b/libs/sr-formula/src/data/relic/index.ts @@ -1,18 +1,61 @@ -import { allRelicSetKeys } from '@genshin-optimizer/sr-consts' -import { allStats } from '@genshin-optimizer/sr-stats' import type { TagMapNodeEntries } from '../util' -import FirmamentFrontlineGlamoth from './FirmamentFrontlineGlamoth' +import BandOfSizzlingThunder from './BandOfSizzlingThunder' +import ChampionOfStreetwiseBoxing from './ChampionOfStreetwiseBoxing' +import EagleOfTwilightLine from './EagleOfTwilightLine' +import FiresmithOfLavaForging from './FiresmithOfLavaForging' +import GeniusOfBrilliantStars from './GeniusOfBrilliantStars' +import GuardOfWutheringSnow from './GuardOfWutheringSnow' +import HunterOfGlacialForest from './HunterOfGlacialForest' +import KnightOfPurityPalace from './KnightOfPurityPalace' +import LongevousDisciple from './LongevousDisciple' +import MessengerTraversingHackerspace from './MessengerTraversingHackerspace' +import MusketeerOfWildWheat from './MusketeerOfWildWheat' +import PasserbyOfWanderingCloud from './PasserbyOfWanderingCloud' import PrisonerInDeepConfinement from './PrisonerInDeepConfinement' -import { entriesForRelic } from './util' +import TheAshblazingGrandDuke from './TheAshblazingGrandDuke' +import ThiefOfShootingMeteor from './ThiefOfShootingMeteor' +import WastelanderOfBanditryDesert from './WastelanderOfBanditryDesert' +import BelobogOfTheArchitects from './BelobogOfTheArchitects' +import BrokenKeel from './BrokenKeel' +import CelestialDifferentiator from './CelestialDifferentiator' +import FirmamentFrontlineGlamoth from './FirmamentFrontlineGlamoth' +import FleetOfTheAgeless from './FleetOfTheAgeless' +import InertSalsotto from './InertSalsotto' +import PanGalacticCommercialEnterprise from './PanGalacticCommercialEnterprise' +import PenaconyLandOfTheDreams from './PenaconyLandOfTheDreams' +import RutilantArena from './RutilantArena' +import SpaceSealingStation from './SpaceSealingStation' +import SprightlyVonwacq from './SprightlyVonwacq' +import TaliaKingdomOfBanditry from './TaliaKingdomOfBanditry' -const data: TagMapNodeEntries = allRelicSetKeys.flatMap((key) => { - switch (key) { - case 'FirmamentFrontlineGlamoth': - return FirmamentFrontlineGlamoth - case 'PrisonerInDeepConfinement': - return PrisonerInDeepConfinement - default: - return entriesForRelic(key, allStats.relic[key]) - } -}) -export default data +const data: TagMapNodeEntries[] = [ + BandOfSizzlingThunder, + ChampionOfStreetwiseBoxing, + EagleOfTwilightLine, + FiresmithOfLavaForging, + GeniusOfBrilliantStars, + GuardOfWutheringSnow, + HunterOfGlacialForest, + KnightOfPurityPalace, + LongevousDisciple, + MessengerTraversingHackerspace, + MusketeerOfWildWheat, + PasserbyOfWanderingCloud, + PrisonerInDeepConfinement, + TheAshblazingGrandDuke, + ThiefOfShootingMeteor, + WastelanderOfBanditryDesert, + BelobogOfTheArchitects, + BrokenKeel, + CelestialDifferentiator, + FirmamentFrontlineGlamoth, + FleetOfTheAgeless, + InertSalsotto, + PanGalacticCommercialEnterprise, + PenaconyLandOfTheDreams, + RutilantArena, + SpaceSealingStation, + SprightlyVonwacq, + TaliaKingdomOfBanditry, +] +export default data.flat() diff --git a/libs/sr-formula/src/data/util/tag.ts b/libs/sr-formula/src/data/util/tag.ts index aa1afa09df..a6f6f0d3e5 100644 --- a/libs/sr-formula/src/data/util/tag.ts +++ b/libs/sr-formula/src/data/util/tag.ts @@ -185,12 +185,11 @@ export const allBoolConditionals = (src: Source) => })) export const allListConditionals = (src: Source, list: T[]) => allCustoms(src, 'cond', { type: 'list', list }, ({ max: r }) => ({ - map: (table: Record, def = 0) => { + map: (table: Record, def = 0) => subscript( r, list.map((v) => table[v] ?? def) - ) - }, + ), value: r, })) export const allNumConditionals = ( diff --git a/libs/sr-formula/src/executors/gen-desc/executor.ts b/libs/sr-formula/src/executors/gen-desc/executor.ts new file mode 100644 index 0000000000..50e520059c --- /dev/null +++ b/libs/sr-formula/src/executors/gen-desc/executor.ts @@ -0,0 +1,106 @@ +import { workspaceRoot } from '@nx/devkit' +import { writeFileSync } from 'fs' +import * as path from 'path' +import type { GenDescExecutorSchema } from './schema' + +// Note: +// It is important that `data` has NOT been loaded at this point +// as we are injecting `conditionals` to "collect" the metadata +import * as prettier from 'prettier' +import type { data as Data } from '../../data' +import { metaList } from '../../data/util' +metaList.conditionals = {} + +export default async function runExecutor( + options: GenDescExecutorSchema +): Promise<{ success: boolean }> { + // Defer loading of `data` to here so that the `metaList` trick above works + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { data } = require('../../data') + const { outputPath } = options + const { conditionals } = metaList + const formulas: Record> = {} + + // Massage data from `metaList` + for (const [src, entries] of Object.entries(conditionals!)) { + for (const [name, obj] of Object.entries(entries!)) { + entries![name] = { src, name, tag: { src, name }, ...obj } + } + } + + // Crawl for formulas in sheet-specific formula listing + for (const { tag, value } of data as typeof Data) { + if ( + // sheet-specific + tag['src'] != 'agg' && + // formula listing + tag['qt'] == 'listing' && + tag['q'] == 'formulas' && + // pattern from `registerFormula` + value['op'] == 'tag' && + 'name' in value.tag && + 'q' in value.tag + ) { + const src = tag.src! + const name = value.tag['name']! + if (!formulas[src]) formulas[src] = {} + if (formulas[src][name]) + console.error(`Duplicated formula definition for ${src}:${name}`) + formulas[src][name] = { src, name, tag: { ...tag, ...value.tag } } + } + } + + const cwd = path.join(workspaceRoot, outputPath) + const prettierRc = await prettier.resolveConfig(cwd) + const str = prettier.format( + ` +type Tag = Record + +export type IConditionalData = + | IBoolConditionalData + | IListConditionalData + | INumConditionalData +export type IFormulaData = { + src: string // entity + name: string // formula name + tag: Tag // tag used to access value +} + +/// Conditional whose values are True (1.0) and False (0.0) +export type IBoolConditionalData = { + type: 'bool' // type discriminator + src: string // entity + name: string // conditional name + tag: Tag // tag used to access value +} +/// Conditional whose values are those in the list. When inputting the +/// entry, use the (0-based) position in the list +export type IListConditionalData = { + type: 'list' // type discriminator + src: string // entity + name: string // conditional name + tag: Tag // tag used to access value + + list: [string] // feasible values +} +/// Conditional whose values are regular numbers +export type INumConditionalData = { + type: 'num' // type discriminator + src: string // entity + name: string // conditional name + tag: Tag // tag used to access value + + int_only: boolean // whether the value must be an integer + min?: number // smallest feasible value, if applicable + max?: number // largest feasible value, if applicable +} + +export const conditionals = ${JSON.stringify(conditionals)} +export const formulas = ${JSON.stringify(formulas)} + `, + { ...prettierRc, parser: 'typescript' } + ) + writeFileSync(cwd, str) + + return { success: true } +} diff --git a/libs/sr-formula/src/executors/gen-desc/schema.d.ts b/libs/sr-formula/src/executors/gen-desc/schema.d.ts new file mode 100644 index 0000000000..8552056bbb --- /dev/null +++ b/libs/sr-formula/src/executors/gen-desc/schema.d.ts @@ -0,0 +1,3 @@ +export interface GenDescExecutorSchema { + outputPath: string +} diff --git a/libs/sr-formula/src/executors/gen-desc/schema.json b/libs/sr-formula/src/executors/gen-desc/schema.json new file mode 100644 index 0000000000..40be4bbb68 --- /dev/null +++ b/libs/sr-formula/src/executors/gen-desc/schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/schema", + "version": 2, + "title": "GenDesc executor", + "description": "", + "type": "object", + "properties": { + "outputPath": { + "type": "string", + "description": "n/a" + } + }, + "required": [] +} diff --git a/libs/sr-formula/src/generators/gen-sheet/all-generator.ts b/libs/sr-formula/src/generators/gen-sheet/all-generator.ts new file mode 100644 index 0000000000..1bcb8efead --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/all-generator.ts @@ -0,0 +1,22 @@ +import { + allCharacterKeys, + allLightConeKeys, + allRelicSetKeys, +} from '@genshin-optimizer/sr-consts' +import type { Tree } from '@nx/devkit' +import genIndex from './genIndex' +import genSheet from './genSheet' +export default async function genSheetGenerator(tree: Tree) { + // TODO: Add Trailblazer support + for (const src of allCharacterKeys.filter( + (key) => !key.includes('Trailblazer') + )) + await genSheet(tree, { sheet_type: 'char', src }) + for (const src of allRelicSetKeys) + await genSheet(tree, { sheet_type: 'relic', src }) + for (const src of allLightConeKeys) + await genSheet(tree, { sheet_type: 'lightCone', src }) + await genIndex(tree, 'char') + await genIndex(tree, 'relic') + await genIndex(tree, 'lightCone') +} diff --git a/libs/sr-formula/src/generators/gen-sheet/all-schema.json b/libs/sr-formula/src/generators/gen-sheet/all-schema.json new file mode 100644 index 0000000000..bfdd1b328f --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/all-schema.json @@ -0,0 +1,8 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "GenSheets", + "title": "", + "type": "object", + "properties": {}, + "required": [] +} diff --git a/libs/sr-formula/src/generators/gen-sheet/char/__src__.ts.template b/libs/sr-formula/src/generators/gen-sheet/char/__src__.ts.template new file mode 100644 index 0000000000..d14cf0e77f --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/char/__src__.ts.template @@ -0,0 +1,69 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import { type CharacterKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { dmg, entriesForChar, getBaseTag, scalingParams } from './util' + +const key: CharacterKey = '<%= src %>' +const data_gen = allStats.char[key] +const baseTag = getBaseTag(data_gen) +const { basic, skill, ult, talent, technique, eidolon } = + scalingParams(data_gen) + +let s = 0, + u = 0, + ta = 0, + te = 0 +// TODO: Load scalings +const dm = { + basic: { + dmg: basic[0], + }, + skill: { + dmg: skill[s++], + }, + ult: { + dmg: ult[u++], + }, + talent: { + dmg: talent[ta++], + }, + technique: { + dmg: (technique[te++] ?? [0])[0], + }, + e1: { + dmg: eidolon[1][0] ?? 0, + }, +} as const + +const { char } = self + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats, StatBoosts and Eidolon 3 + 5 + entriesForChar(data_gen), + + // TODO: Add formulas/buffs + // Formulas + ...dmg('basicDmg', baseTag, 'atk', dm.basic.dmg, 'basic'), + + // Buffs + selfBuff.premod.dmg_.add(cmpGE(char.eidolon, 6, boolConditional.ifOn(1))), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/generators/gen-sheet/genIndex.ts b/libs/sr-formula/src/generators/gen-sheet/genIndex.ts new file mode 100644 index 0000000000..9b79965d91 --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/genIndex.ts @@ -0,0 +1,85 @@ +import { + allCharacterKeys, + allLightConeKeys, + allRelicSetKeys, +} from '@genshin-optimizer/sr-consts' +import type { Tree } from '@nx/devkit' +import { workspaceRoot } from '@nx/devkit' +import { writeFileSync } from 'fs' +import * as prettier from 'prettier' + +export default async function genIndex(tree: Tree, sheet_type: string) { + const file_location = `${workspaceRoot}/libs/sr-formula/src/data/${sheet_type}/index.ts` + switch (sheet_type) { + case 'char': + await writeCharIndex(file_location) + break + case 'relic': + await writeRelicIndex(file_location) + break + case 'lightCone': + await writeLightConeIndex(file_location) + break + } +} + +async function writeCharIndex(path: string) { + const prettierRc = await prettier.resolveConfig(path) + // TODO: Add Trailblazer support + const keys = allCharacterKeys.filter((key) => !key.includes('Trailblazer')) + const index = prettier.format( + ` +import type { TagMapNodeEntries } from '../util' +${keys.map((charKey) => `import ${charKey} from './${charKey}'`).join('\n')} + +const data: TagMapNodeEntries[] = [ + ${keys.join('\n, ')} +] +export default data.flat() + + `, + { ...prettierRc, parser: 'typescript' } + ) + writeFileSync(path, index) +} + +async function writeRelicIndex(path: string) { + const prettierRc = await prettier.resolveConfig(path) + const index = prettier.format( + ` +import type { TagMapNodeEntries } from '../util' +${allRelicSetKeys + .map((setKey) => `import ${setKey} from './${setKey}'`) + .join('\n')} + +const data: TagMapNodeEntries[] = [ + ${allRelicSetKeys.join('\n, ')} +] +export default data.flat() + + `, + { ...prettierRc, parser: 'typescript' } + ) + writeFileSync(path, index) +} + +async function writeLightConeIndex(path: string) { + const prettierRc = await prettier.resolveConfig(path) + const index = prettier.format( + ` +import type { TagMapNodeEntries } from '../util' +${allLightConeKeys + .map((lightConeKey) => `import ${lightConeKey} from './${lightConeKey}'`) + .join('\n')} + +const data: TagMapNodeEntries[] = [ + ${allLightConeKeys.join(',\n ')} +] + +export default data.flat() + + `, + { ...prettierRc, parser: 'typescript' } + ) + writeFileSync(path, index) +} diff --git a/libs/sr-formula/src/generators/gen-sheet/genSheet.ts b/libs/sr-formula/src/generators/gen-sheet/genSheet.ts new file mode 100644 index 0000000000..6b06b3ecfa --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/genSheet.ts @@ -0,0 +1,27 @@ +import type { Tree } from '@nx/devkit' +import { formatFiles, generateFiles } from '@nx/devkit' +import { existsSync } from 'fs' +import * as path from 'path' +import type { GenSheetGeneratorSchema } from './schema' + +export default async function genSheet( + tree: Tree, + options: GenSheetGeneratorSchema, + verbose = false +) { + const { sheet_type } = options + const file_location = `libs/sr-formula/src/data/${sheet_type}` + const dest = path.join(tree.root, file_location, `${options.src}.ts`) + if (existsSync(dest)) { + verbose && + console.warn( + `Sheet at ${path.join( + file_location, + `${options.src}.ts` + )} already exists.` + ) + return + } + generateFiles(tree, path.join(__dirname, sheet_type), file_location, options) + await formatFiles(tree) +} diff --git a/libs/sr-formula/src/generators/gen-sheet/lightCone/__src__.ts.template b/libs/sr-formula/src/generators/gen-sheet/lightCone/__src__.ts.template new file mode 100644 index 0000000000..883173d4e4 --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/lightCone/__src__.ts.template @@ -0,0 +1,45 @@ +import { subscript } from '@genshin-optimizer/pando' +import type { LightConeKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForLightCone } from './util' + +const key: LightConeKey = '<%= src %>' +const data_gen = allStats.lightCone[key] + +let i = 0 +// TODO: Load scalings +const dm = { + dmg: data_gen.superimpose.otherStats[i++] ?? [1, 2, 3, 4, 5], +} + +const { superimpose } = self.lightCone + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles base stats and passive buffs + entriesForLightCone(data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(subscript(superimpose, dm.dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/generators/gen-sheet/relic/__src__.ts.template b/libs/sr-formula/src/generators/gen-sheet/relic/__src__.ts.template new file mode 100644 index 0000000000..14c0a7d6cd --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/relic/__src__.ts.template @@ -0,0 +1,51 @@ +import { cmpGE } from '@genshin-optimizer/pando' +import type { RelicSetKey } from '@genshin-optimizer/sr-consts' +import { allStats } from '@genshin-optimizer/sr-stats' +import { + allBoolConditionals, + allListConditionals, + allNumConditionals, + enemyDebuff, + register, + self, + selfBuff, + teamBuff, +} from '../util' +import { entriesForRelic } from './util' + +const key: RelicSetKey = '<%= src %>' +const data_gen = allStats.relic[key] + +let t = 0, + f = 0 +// TODO: Load scalings +const dm = { + 2: { + dmg: data_gen.setEffects[0].otherStats[t++] ?? 1, + }, + 4: { + dmg: data_gen.setEffects[1].otherStats[f++] ?? 1, + }, +} + +const relicCount = self.common.count.src(key) + +// TODO: Add conditionals +const { boolConditional } = allBoolConditionals(key) +const { listConditional } = allListConditionals(key, ['val1', 'val2']) +const { numConditional } = allNumConditionals(key, 'sum', true, 0, 2) + +const sheet = register( + key, + // Handles passive buffs + entriesForRelic(key, data_gen), + + // TODO: Add formulas/buffs + // Conditional buffs + selfBuff.premod.dmg_.add( + boolConditional.ifOn(cmpGE(relicCount, 4, dm[4].dmg)) + ), + teamBuff.premod.dmg_.add(listConditional.map({ val1: 1, val2: 2 })), + enemyDebuff.common.defIgn_.add(numConditional) +) +export default sheet diff --git a/libs/sr-formula/src/generators/gen-sheet/schema.d.ts b/libs/sr-formula/src/generators/gen-sheet/schema.d.ts new file mode 100644 index 0000000000..412514cc92 --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/schema.d.ts @@ -0,0 +1,4 @@ +export interface GenSheetGeneratorSchema { + sheet_type: string + src: string +} diff --git a/libs/sr-formula/src/generators/gen-sheet/single-generator.ts b/libs/sr-formula/src/generators/gen-sheet/single-generator.ts new file mode 100644 index 0000000000..413fab3967 --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/single-generator.ts @@ -0,0 +1,36 @@ +import { + allCharacterKeys, + allLightConeKeys, + allRelicSetKeys, +} from '@genshin-optimizer/sr-consts' +import { isIn } from '@genshin-optimizer/util' +import type { Tree } from '@nx/devkit' +import genIndex from './genIndex' +import genSheet from './genSheet' +import type { GenSheetGeneratorSchema } from './schema' +export default async function genSheetGenerator( + tree: Tree, + options: GenSheetGeneratorSchema +) { + const { sheet_type, src } = options + switch (sheet_type) { + case 'char': + if (!isIn(allCharacterKeys, src)) + return console.error(`Character with key ${src} does not exist.`) + break + case 'lightCone': + if (!isIn(allLightConeKeys, src)) + return console.error(`Light Cone with key ${src} does not exist.`) + break + case 'relic': + if (!isIn(allRelicSetKeys, src)) + return console.error(`Relic set with key ${src} does not exist.`) + break + default: + console.error('Invalid sheet type') + return + } + await genSheet(tree, options, true) + await genIndex(tree, sheet_type) + console.log('Generated sheet and index file.') +} diff --git a/libs/sr-formula/src/generators/gen-sheet/single-schema.json b/libs/sr-formula/src/generators/gen-sheet/single-schema.json new file mode 100644 index 0000000000..9fa33f6d04 --- /dev/null +++ b/libs/sr-formula/src/generators/gen-sheet/single-schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "GenSheet", + "title": "", + "type": "object", + "properties": { + "sheet_type": { + "type": "string", + "description": "Type of sheet (char/relic/lightCone)", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What is the sheet type (char/relic/lightCone)?" + }, + "src": { + "type": "string", + "description": "Sheet name", + "$default": { + "$source": "argv", + "index": 1 + }, + "x-prompt": "What is the sheet name?" + } + }, + "required": ["sheet_type", "src"] +} diff --git a/libs/sr-formula/src/meta.ts b/libs/sr-formula/src/meta.ts new file mode 100644 index 0000000000..6c8477347e --- /dev/null +++ b/libs/sr-formula/src/meta.ts @@ -0,0 +1,3590 @@ +type Tag = Record + +export type IConditionalData = + | IBoolConditionalData + | IListConditionalData + | INumConditionalData +export type IFormulaData = { + src: string // entity + name: string // formula name + tag: Tag // tag used to access value +} + +/// Conditional whose values are True (1.0) and False (0.0) +export type IBoolConditionalData = { + type: 'bool' // type discriminator + src: string // entity + name: string // conditional name + tag: Tag // tag used to access value +} +/// Conditional whose values are those in the list. When inputting the +/// entry, use the (0-based) position in the list +export type IListConditionalData = { + type: 'list' // type discriminator + src: string // entity + name: string // conditional name + tag: Tag // tag used to access value + + list: [string] // feasible values +} +/// Conditional whose values are regular numbers +export type INumConditionalData = { + type: 'num' // type discriminator + src: string // entity + name: string // conditional name + tag: Tag // tag used to access value + + int_only: boolean // whether the value must be an integer + min?: number // smallest feasible value, if applicable + max?: number // largest feasible value, if applicable +} + +export const conditionals = { + Argenti: { + boolConditional: { + src: 'Argenti', + name: 'boolConditional', + tag: { src: 'Argenti', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Argenti', + name: 'listConditional', + tag: { src: 'Argenti', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Argenti', + name: 'numConditional', + tag: { src: 'Argenti', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Arlan: { + boolConditional: { + src: 'Arlan', + name: 'boolConditional', + tag: { src: 'Arlan', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Arlan', + name: 'listConditional', + tag: { src: 'Arlan', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Arlan', + name: 'numConditional', + tag: { src: 'Arlan', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Asta: { + boolConditional: { + src: 'Asta', + name: 'boolConditional', + tag: { src: 'Asta', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Asta', + name: 'listConditional', + tag: { src: 'Asta', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Asta', + name: 'numConditional', + tag: { src: 'Asta', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Bailu: { + boolConditional: { + src: 'Bailu', + name: 'boolConditional', + tag: { src: 'Bailu', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Bailu', + name: 'listConditional', + tag: { src: 'Bailu', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Bailu', + name: 'numConditional', + tag: { src: 'Bailu', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Blade: { + boolConditional: { + src: 'Blade', + name: 'boolConditional', + tag: { src: 'Blade', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Blade', + name: 'listConditional', + tag: { src: 'Blade', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Blade', + name: 'numConditional', + tag: { src: 'Blade', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Bronya: { + boolConditional: { + src: 'Bronya', + name: 'boolConditional', + tag: { src: 'Bronya', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Bronya', + name: 'listConditional', + tag: { src: 'Bronya', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Bronya', + name: 'numConditional', + tag: { src: 'Bronya', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Clara: { + boolConditional: { + src: 'Clara', + name: 'boolConditional', + tag: { src: 'Clara', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Clara', + name: 'listConditional', + tag: { src: 'Clara', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Clara', + name: 'numConditional', + tag: { src: 'Clara', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DanHeng: { + boolConditional: { + src: 'DanHeng', + name: 'boolConditional', + tag: { src: 'DanHeng', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DanHeng', + name: 'listConditional', + tag: { src: 'DanHeng', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DanHeng', + name: 'numConditional', + tag: { src: 'DanHeng', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DanHengImbibitorLunae: { + boolConditional: { + src: 'DanHengImbibitorLunae', + name: 'boolConditional', + tag: { src: 'DanHengImbibitorLunae', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DanHengImbibitorLunae', + name: 'listConditional', + tag: { src: 'DanHengImbibitorLunae', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DanHengImbibitorLunae', + name: 'numConditional', + tag: { src: 'DanHengImbibitorLunae', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DrRatio: { + boolConditional: { + src: 'DrRatio', + name: 'boolConditional', + tag: { src: 'DrRatio', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DrRatio', + name: 'listConditional', + tag: { src: 'DrRatio', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DrRatio', + name: 'numConditional', + tag: { src: 'DrRatio', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + FuXuan: { + boolConditional: { + src: 'FuXuan', + name: 'boolConditional', + tag: { src: 'FuXuan', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'FuXuan', + name: 'listConditional', + tag: { src: 'FuXuan', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'FuXuan', + name: 'numConditional', + tag: { src: 'FuXuan', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Gepard: { + boolConditional: { + src: 'Gepard', + name: 'boolConditional', + tag: { src: 'Gepard', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Gepard', + name: 'listConditional', + tag: { src: 'Gepard', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Gepard', + name: 'numConditional', + tag: { src: 'Gepard', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Guinaifen: { + boolConditional: { + src: 'Guinaifen', + name: 'boolConditional', + tag: { src: 'Guinaifen', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Guinaifen', + name: 'listConditional', + tag: { src: 'Guinaifen', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Guinaifen', + name: 'numConditional', + tag: { src: 'Guinaifen', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Hanya: { + boolConditional: { + src: 'Hanya', + name: 'boolConditional', + tag: { src: 'Hanya', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Hanya', + name: 'listConditional', + tag: { src: 'Hanya', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Hanya', + name: 'numConditional', + tag: { src: 'Hanya', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Herta: { + boolConditional: { + src: 'Herta', + name: 'boolConditional', + tag: { src: 'Herta', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Herta', + name: 'listConditional', + tag: { src: 'Herta', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Herta', + name: 'numConditional', + tag: { src: 'Herta', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Himeko: { + boolConditional: { + src: 'Himeko', + name: 'boolConditional', + tag: { src: 'Himeko', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Himeko', + name: 'listConditional', + tag: { src: 'Himeko', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Himeko', + name: 'numConditional', + tag: { src: 'Himeko', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Hook: { + boolConditional: { + src: 'Hook', + name: 'boolConditional', + tag: { src: 'Hook', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Hook', + name: 'listConditional', + tag: { src: 'Hook', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Hook', + name: 'numConditional', + tag: { src: 'Hook', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Huohuo: { + boolConditional: { + src: 'Huohuo', + name: 'boolConditional', + tag: { src: 'Huohuo', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Huohuo', + name: 'listConditional', + tag: { src: 'Huohuo', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Huohuo', + name: 'numConditional', + tag: { src: 'Huohuo', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + JingYuan: { + boolConditional: { + src: 'JingYuan', + name: 'boolConditional', + tag: { src: 'JingYuan', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'JingYuan', + name: 'listConditional', + tag: { src: 'JingYuan', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'JingYuan', + name: 'numConditional', + tag: { src: 'JingYuan', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Jingliu: { + boolConditional: { + src: 'Jingliu', + name: 'boolConditional', + tag: { src: 'Jingliu', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Jingliu', + name: 'listConditional', + tag: { src: 'Jingliu', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Jingliu', + name: 'numConditional', + tag: { src: 'Jingliu', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Kafka: { + boolConditional: { + src: 'Kafka', + name: 'boolConditional', + tag: { src: 'Kafka', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Kafka', + name: 'listConditional', + tag: { src: 'Kafka', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Kafka', + name: 'numConditional', + tag: { src: 'Kafka', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Luka: { + boolConditional: { + src: 'Luka', + name: 'boolConditional', + tag: { src: 'Luka', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Luka', + name: 'listConditional', + tag: { src: 'Luka', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Luka', + name: 'numConditional', + tag: { src: 'Luka', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Luocha: { + boolConditional: { + src: 'Luocha', + name: 'boolConditional', + tag: { src: 'Luocha', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Luocha', + name: 'listConditional', + tag: { src: 'Luocha', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Luocha', + name: 'numConditional', + tag: { src: 'Luocha', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Lynx: { + boolConditional: { + src: 'Lynx', + name: 'boolConditional', + tag: { src: 'Lynx', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Lynx', + name: 'listConditional', + tag: { src: 'Lynx', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Lynx', + name: 'numConditional', + tag: { src: 'Lynx', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Natasha: { + boolConditional: { + src: 'Natasha', + name: 'boolConditional', + tag: { src: 'Natasha', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Natasha', + name: 'listConditional', + tag: { src: 'Natasha', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Natasha', + name: 'numConditional', + tag: { src: 'Natasha', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Pela: { + boolConditional: { + src: 'Pela', + name: 'boolConditional', + tag: { src: 'Pela', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Pela', + name: 'listConditional', + tag: { src: 'Pela', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Pela', + name: 'numConditional', + tag: { src: 'Pela', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Qingque: { + boolConditional: { + src: 'Qingque', + name: 'boolConditional', + tag: { src: 'Qingque', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Qingque', + name: 'listConditional', + tag: { src: 'Qingque', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Qingque', + name: 'numConditional', + tag: { src: 'Qingque', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + RuanMei: { + boolConditional: { + src: 'RuanMei', + name: 'boolConditional', + tag: { src: 'RuanMei', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'RuanMei', + name: 'listConditional', + tag: { src: 'RuanMei', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'RuanMei', + name: 'numConditional', + tag: { src: 'RuanMei', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Sampo: { + boolConditional: { + src: 'Sampo', + name: 'boolConditional', + tag: { src: 'Sampo', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Sampo', + name: 'listConditional', + tag: { src: 'Sampo', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Sampo', + name: 'numConditional', + tag: { src: 'Sampo', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Seele: { + boolConditional: { + src: 'Seele', + name: 'boolConditional', + tag: { src: 'Seele', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Seele', + name: 'listConditional', + tag: { src: 'Seele', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Seele', + name: 'numConditional', + tag: { src: 'Seele', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Serval: { + boolConditional: { + src: 'Serval', + name: 'boolConditional', + tag: { src: 'Serval', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Serval', + name: 'listConditional', + tag: { src: 'Serval', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Serval', + name: 'numConditional', + tag: { src: 'Serval', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SilverWolf: { + boolConditional: { + src: 'SilverWolf', + name: 'boolConditional', + tag: { src: 'SilverWolf', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SilverWolf', + name: 'listConditional', + tag: { src: 'SilverWolf', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SilverWolf', + name: 'numConditional', + tag: { src: 'SilverWolf', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Sushang: { + boolConditional: { + src: 'Sushang', + name: 'boolConditional', + tag: { src: 'Sushang', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Sushang', + name: 'listConditional', + tag: { src: 'Sushang', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Sushang', + name: 'numConditional', + tag: { src: 'Sushang', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Tingyun: { + boolConditional: { + src: 'Tingyun', + name: 'boolConditional', + tag: { src: 'Tingyun', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Tingyun', + name: 'listConditional', + tag: { src: 'Tingyun', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Tingyun', + name: 'numConditional', + tag: { src: 'Tingyun', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TopazAndNumby: { + boolConditional: { + src: 'TopazAndNumby', + name: 'boolConditional', + tag: { src: 'TopazAndNumby', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TopazAndNumby', + name: 'listConditional', + tag: { src: 'TopazAndNumby', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TopazAndNumby', + name: 'numConditional', + tag: { src: 'TopazAndNumby', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Welt: { + boolConditional: { + src: 'Welt', + name: 'boolConditional', + tag: { src: 'Welt', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Welt', + name: 'listConditional', + tag: { src: 'Welt', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Welt', + name: 'numConditional', + tag: { src: 'Welt', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Xueyi: { + boolConditional: { + src: 'Xueyi', + name: 'boolConditional', + tag: { src: 'Xueyi', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Xueyi', + name: 'listConditional', + tag: { src: 'Xueyi', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Xueyi', + name: 'numConditional', + tag: { src: 'Xueyi', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Yanqing: { + boolConditional: { + src: 'Yanqing', + name: 'boolConditional', + tag: { src: 'Yanqing', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Yanqing', + name: 'listConditional', + tag: { src: 'Yanqing', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Yanqing', + name: 'numConditional', + tag: { src: 'Yanqing', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Yukong: { + boolConditional: { + src: 'Yukong', + name: 'boolConditional', + tag: { src: 'Yukong', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Yukong', + name: 'listConditional', + tag: { src: 'Yukong', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Yukong', + name: 'numConditional', + tag: { src: 'Yukong', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + ASecretVow: { + boolConditional: { + src: 'ASecretVow', + name: 'boolConditional', + tag: { src: 'ASecretVow', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'ASecretVow', + name: 'listConditional', + tag: { src: 'ASecretVow', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'ASecretVow', + name: 'numConditional', + tag: { src: 'ASecretVow', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Adversarial: { + boolConditional: { + src: 'Adversarial', + name: 'boolConditional', + tag: { src: 'Adversarial', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Adversarial', + name: 'listConditional', + tag: { src: 'Adversarial', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Adversarial', + name: 'numConditional', + tag: { src: 'Adversarial', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Amber: { + boolConditional: { + src: 'Amber', + name: 'boolConditional', + tag: { src: 'Amber', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Amber', + name: 'listConditional', + tag: { src: 'Amber', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Amber', + name: 'numConditional', + tag: { src: 'Amber', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + AnInstantBeforeAGaze: { + boolConditional: { + src: 'AnInstantBeforeAGaze', + name: 'boolConditional', + tag: { src: 'AnInstantBeforeAGaze', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'AnInstantBeforeAGaze', + name: 'listConditional', + tag: { src: 'AnInstantBeforeAGaze', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'AnInstantBeforeAGaze', + name: 'numConditional', + tag: { src: 'AnInstantBeforeAGaze', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Arrows: { + boolConditional: { + src: 'Arrows', + name: 'boolConditional', + tag: { src: 'Arrows', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Arrows', + name: 'listConditional', + tag: { src: 'Arrows', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Arrows', + name: 'numConditional', + tag: { src: 'Arrows', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + BaptismOfPureThought: { + boolConditional: { + src: 'BaptismOfPureThought', + name: 'boolConditional', + tag: { src: 'BaptismOfPureThought', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'BaptismOfPureThought', + name: 'listConditional', + tag: { src: 'BaptismOfPureThought', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'BaptismOfPureThought', + name: 'numConditional', + tag: { src: 'BaptismOfPureThought', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + BeforeDawn: { + boolConditional: { + src: 'BeforeDawn', + name: 'boolConditional', + tag: { src: 'BeforeDawn', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'BeforeDawn', + name: 'listConditional', + tag: { src: 'BeforeDawn', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'BeforeDawn', + name: 'numConditional', + tag: { src: 'BeforeDawn', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + BeforeTheTutorialMissionStarts: { + boolConditional: { + src: 'BeforeTheTutorialMissionStarts', + name: 'boolConditional', + tag: { src: 'BeforeTheTutorialMissionStarts', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'BeforeTheTutorialMissionStarts', + name: 'listConditional', + tag: { src: 'BeforeTheTutorialMissionStarts', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'BeforeTheTutorialMissionStarts', + name: 'numConditional', + tag: { src: 'BeforeTheTutorialMissionStarts', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + BrighterThanTheSun: { + boolConditional: { + src: 'BrighterThanTheSun', + name: 'boolConditional', + tag: { src: 'BrighterThanTheSun', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'BrighterThanTheSun', + name: 'listConditional', + tag: { src: 'BrighterThanTheSun', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'BrighterThanTheSun', + name: 'numConditional', + tag: { src: 'BrighterThanTheSun', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + ButTheBattleIsntOver: { + boolConditional: { + src: 'ButTheBattleIsntOver', + name: 'boolConditional', + tag: { src: 'ButTheBattleIsntOver', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'ButTheBattleIsntOver', + name: 'listConditional', + tag: { src: 'ButTheBattleIsntOver', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'ButTheBattleIsntOver', + name: 'numConditional', + tag: { src: 'ButTheBattleIsntOver', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + CarveTheMoonWeaveTheClouds: { + boolConditional: { + src: 'CarveTheMoonWeaveTheClouds', + name: 'boolConditional', + tag: { src: 'CarveTheMoonWeaveTheClouds', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'CarveTheMoonWeaveTheClouds', + name: 'listConditional', + tag: { src: 'CarveTheMoonWeaveTheClouds', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'CarveTheMoonWeaveTheClouds', + name: 'numConditional', + tag: { src: 'CarveTheMoonWeaveTheClouds', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Chorus: { + boolConditional: { + src: 'Chorus', + name: 'boolConditional', + tag: { src: 'Chorus', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Chorus', + name: 'listConditional', + tag: { src: 'Chorus', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Chorus', + name: 'numConditional', + tag: { src: 'Chorus', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + CollapsingSky: { + boolConditional: { + src: 'CollapsingSky', + name: 'boolConditional', + tag: { src: 'CollapsingSky', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'CollapsingSky', + name: 'listConditional', + tag: { src: 'CollapsingSky', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'CollapsingSky', + name: 'numConditional', + tag: { src: 'CollapsingSky', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Cornucopia: { + boolConditional: { + src: 'Cornucopia', + name: 'boolConditional', + tag: { src: 'Cornucopia', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Cornucopia', + name: 'listConditional', + tag: { src: 'Cornucopia', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Cornucopia', + name: 'numConditional', + tag: { src: 'Cornucopia', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + CruisingInTheStellarSea: { + boolConditional: { + src: 'CruisingInTheStellarSea', + name: 'boolConditional', + tag: { src: 'CruisingInTheStellarSea', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'CruisingInTheStellarSea', + name: 'listConditional', + tag: { src: 'CruisingInTheStellarSea', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'CruisingInTheStellarSea', + name: 'numConditional', + tag: { src: 'CruisingInTheStellarSea', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DanceDanceDance: { + boolConditional: { + src: 'DanceDanceDance', + name: 'boolConditional', + tag: { src: 'DanceDanceDance', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DanceDanceDance', + name: 'listConditional', + tag: { src: 'DanceDanceDance', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DanceDanceDance', + name: 'numConditional', + tag: { src: 'DanceDanceDance', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DartingArrow: { + boolConditional: { + src: 'DartingArrow', + name: 'boolConditional', + tag: { src: 'DartingArrow', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DartingArrow', + name: 'listConditional', + tag: { src: 'DartingArrow', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DartingArrow', + name: 'numConditional', + tag: { src: 'DartingArrow', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DataBank: { + boolConditional: { + src: 'DataBank', + name: 'boolConditional', + tag: { src: 'DataBank', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DataBank', + name: 'listConditional', + tag: { src: 'DataBank', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DataBank', + name: 'numConditional', + tag: { src: 'DataBank', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + DayOneOfMyNewLife: { + boolConditional: { + src: 'DayOneOfMyNewLife', + name: 'boolConditional', + tag: { src: 'DayOneOfMyNewLife', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'DayOneOfMyNewLife', + name: 'listConditional', + tag: { src: 'DayOneOfMyNewLife', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'DayOneOfMyNewLife', + name: 'numConditional', + tag: { src: 'DayOneOfMyNewLife', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Defense: { + boolConditional: { + src: 'Defense', + name: 'boolConditional', + tag: { src: 'Defense', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Defense', + name: 'listConditional', + tag: { src: 'Defense', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Defense', + name: 'numConditional', + tag: { src: 'Defense', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + EchoesOfTheCoffin: { + boolConditional: { + src: 'EchoesOfTheCoffin', + name: 'boolConditional', + tag: { src: 'EchoesOfTheCoffin', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'EchoesOfTheCoffin', + name: 'listConditional', + tag: { src: 'EchoesOfTheCoffin', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'EchoesOfTheCoffin', + name: 'numConditional', + tag: { src: 'EchoesOfTheCoffin', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + EyesOfThePrey: { + boolConditional: { + src: 'EyesOfThePrey', + name: 'boolConditional', + tag: { src: 'EyesOfThePrey', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'EyesOfThePrey', + name: 'listConditional', + tag: { src: 'EyesOfThePrey', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'EyesOfThePrey', + name: 'numConditional', + tag: { src: 'EyesOfThePrey', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Fermata: { + boolConditional: { + src: 'Fermata', + name: 'boolConditional', + tag: { src: 'Fermata', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Fermata', + name: 'listConditional', + tag: { src: 'Fermata', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Fermata', + name: 'numConditional', + tag: { src: 'Fermata', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + FineFruit: { + boolConditional: { + src: 'FineFruit', + name: 'boolConditional', + tag: { src: 'FineFruit', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'FineFruit', + name: 'listConditional', + tag: { src: 'FineFruit', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'FineFruit', + name: 'numConditional', + tag: { src: 'FineFruit', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + GeniusesRepose: { + boolConditional: { + src: 'GeniusesRepose', + name: 'boolConditional', + tag: { src: 'GeniusesRepose', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'GeniusesRepose', + name: 'listConditional', + tag: { src: 'GeniusesRepose', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'GeniusesRepose', + name: 'numConditional', + tag: { src: 'GeniusesRepose', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + GoodNightAndSleepWell: { + boolConditional: { + src: 'GoodNightAndSleepWell', + name: 'boolConditional', + tag: { src: 'GoodNightAndSleepWell', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'GoodNightAndSleepWell', + name: 'listConditional', + tag: { src: 'GoodNightAndSleepWell', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'GoodNightAndSleepWell', + name: 'numConditional', + tag: { src: 'GoodNightAndSleepWell', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + HeyOverHere: { + boolConditional: { + src: 'HeyOverHere', + name: 'boolConditional', + tag: { src: 'HeyOverHere', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'HeyOverHere', + name: 'listConditional', + tag: { src: 'HeyOverHere', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'HeyOverHere', + name: 'numConditional', + tag: { src: 'HeyOverHere', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + HiddenShadow: { + boolConditional: { + src: 'HiddenShadow', + name: 'boolConditional', + tag: { src: 'HiddenShadow', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'HiddenShadow', + name: 'listConditional', + tag: { src: 'HiddenShadow', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'HiddenShadow', + name: 'numConditional', + tag: { src: 'HiddenShadow', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + IShallBeMyOwnSword: { + boolConditional: { + src: 'IShallBeMyOwnSword', + name: 'boolConditional', + tag: { src: 'IShallBeMyOwnSword', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'IShallBeMyOwnSword', + name: 'listConditional', + tag: { src: 'IShallBeMyOwnSword', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'IShallBeMyOwnSword', + name: 'numConditional', + tag: { src: 'IShallBeMyOwnSword', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + InTheNameOfTheWorld: { + boolConditional: { + src: 'InTheNameOfTheWorld', + name: 'boolConditional', + tag: { src: 'InTheNameOfTheWorld', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'InTheNameOfTheWorld', + name: 'listConditional', + tag: { src: 'InTheNameOfTheWorld', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'InTheNameOfTheWorld', + name: 'numConditional', + tag: { src: 'InTheNameOfTheWorld', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + InTheNight: { + boolConditional: { + src: 'InTheNight', + name: 'boolConditional', + tag: { src: 'InTheNight', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'InTheNight', + name: 'listConditional', + tag: { src: 'InTheNight', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'InTheNight', + name: 'numConditional', + tag: { src: 'InTheNight', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + IncessantRain: { + boolConditional: { + src: 'IncessantRain', + name: 'boolConditional', + tag: { src: 'IncessantRain', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'IncessantRain', + name: 'listConditional', + tag: { src: 'IncessantRain', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'IncessantRain', + name: 'numConditional', + tag: { src: 'IncessantRain', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + LandausChoice: { + boolConditional: { + src: 'LandausChoice', + name: 'boolConditional', + tag: { src: 'LandausChoice', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'LandausChoice', + name: 'listConditional', + tag: { src: 'LandausChoice', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'LandausChoice', + name: 'numConditional', + tag: { src: 'LandausChoice', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Loop: { + boolConditional: { + src: 'Loop', + name: 'boolConditional', + tag: { src: 'Loop', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Loop', + name: 'listConditional', + tag: { src: 'Loop', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Loop', + name: 'numConditional', + tag: { src: 'Loop', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + MakeTheWorldClamor: { + boolConditional: { + src: 'MakeTheWorldClamor', + name: 'boolConditional', + tag: { src: 'MakeTheWorldClamor', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'MakeTheWorldClamor', + name: 'listConditional', + tag: { src: 'MakeTheWorldClamor', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'MakeTheWorldClamor', + name: 'numConditional', + tag: { src: 'MakeTheWorldClamor', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Mediation: { + boolConditional: { + src: 'Mediation', + name: 'boolConditional', + tag: { src: 'Mediation', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Mediation', + name: 'listConditional', + tag: { src: 'Mediation', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Mediation', + name: 'numConditional', + tag: { src: 'Mediation', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + MemoriesOfThePast: { + boolConditional: { + src: 'MemoriesOfThePast', + name: 'boolConditional', + tag: { src: 'MemoriesOfThePast', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'MemoriesOfThePast', + name: 'listConditional', + tag: { src: 'MemoriesOfThePast', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'MemoriesOfThePast', + name: 'numConditional', + tag: { src: 'MemoriesOfThePast', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + MeshingCogs: { + boolConditional: { + src: 'MeshingCogs', + name: 'boolConditional', + tag: { src: 'MeshingCogs', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'MeshingCogs', + name: 'listConditional', + tag: { src: 'MeshingCogs', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'MeshingCogs', + name: 'numConditional', + tag: { src: 'MeshingCogs', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + MomentOfVictory: { + boolConditional: { + src: 'MomentOfVictory', + name: 'boolConditional', + tag: { src: 'MomentOfVictory', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'MomentOfVictory', + name: 'listConditional', + tag: { src: 'MomentOfVictory', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'MomentOfVictory', + name: 'numConditional', + tag: { src: 'MomentOfVictory', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Multiplication: { + boolConditional: { + src: 'Multiplication', + name: 'boolConditional', + tag: { src: 'Multiplication', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Multiplication', + name: 'listConditional', + tag: { src: 'Multiplication', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Multiplication', + name: 'numConditional', + tag: { src: 'Multiplication', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + MutualDemise: { + boolConditional: { + src: 'MutualDemise', + name: 'boolConditional', + tag: { src: 'MutualDemise', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'MutualDemise', + name: 'listConditional', + tag: { src: 'MutualDemise', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'MutualDemise', + name: 'numConditional', + tag: { src: 'MutualDemise', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + NightOfFright: { + boolConditional: { + src: 'NightOfFright', + name: 'boolConditional', + tag: { src: 'NightOfFright', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'NightOfFright', + name: 'listConditional', + tag: { src: 'NightOfFright', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'NightOfFright', + name: 'numConditional', + tag: { src: 'NightOfFright', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + NightOnTheMilkyWay: { + boolConditional: { + src: 'NightOnTheMilkyWay', + name: 'boolConditional', + tag: { src: 'NightOnTheMilkyWay', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'NightOnTheMilkyWay', + name: 'listConditional', + tag: { src: 'NightOnTheMilkyWay', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'NightOnTheMilkyWay', + name: 'numConditional', + tag: { src: 'NightOnTheMilkyWay', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + NowhereToRun: { + boolConditional: { + src: 'NowhereToRun', + name: 'boolConditional', + tag: { src: 'NowhereToRun', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'NowhereToRun', + name: 'listConditional', + tag: { src: 'NowhereToRun', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'NowhereToRun', + name: 'numConditional', + tag: { src: 'NowhereToRun', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + OnTheFallOfAnAeon: { + boolConditional: { + src: 'OnTheFallOfAnAeon', + name: 'boolConditional', + tag: { src: 'OnTheFallOfAnAeon', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'OnTheFallOfAnAeon', + name: 'listConditional', + tag: { src: 'OnTheFallOfAnAeon', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'OnTheFallOfAnAeon', + name: 'numConditional', + tag: { src: 'OnTheFallOfAnAeon', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + OnlySilenceRemains: { + boolConditional: { + src: 'OnlySilenceRemains', + name: 'boolConditional', + tag: { src: 'OnlySilenceRemains', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'OnlySilenceRemains', + name: 'listConditional', + tag: { src: 'OnlySilenceRemains', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'OnlySilenceRemains', + name: 'numConditional', + tag: { src: 'OnlySilenceRemains', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Passkey: { + boolConditional: { + src: 'Passkey', + name: 'boolConditional', + tag: { src: 'Passkey', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Passkey', + name: 'listConditional', + tag: { src: 'Passkey', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Passkey', + name: 'numConditional', + tag: { src: 'Passkey', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + PastSelfInMirror: { + boolConditional: { + src: 'PastSelfInMirror', + name: 'boolConditional', + tag: { src: 'PastSelfInMirror', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'PastSelfInMirror', + name: 'listConditional', + tag: { src: 'PastSelfInMirror', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'PastSelfInMirror', + name: 'numConditional', + tag: { src: 'PastSelfInMirror', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + PastAndFuture: { + boolConditional: { + src: 'PastAndFuture', + name: 'boolConditional', + tag: { src: 'PastAndFuture', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'PastAndFuture', + name: 'listConditional', + tag: { src: 'PastAndFuture', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'PastAndFuture', + name: 'numConditional', + tag: { src: 'PastAndFuture', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + PatienceIsAllYouNeed: { + boolConditional: { + src: 'PatienceIsAllYouNeed', + name: 'boolConditional', + tag: { src: 'PatienceIsAllYouNeed', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'PatienceIsAllYouNeed', + name: 'listConditional', + tag: { src: 'PatienceIsAllYouNeed', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'PatienceIsAllYouNeed', + name: 'numConditional', + tag: { src: 'PatienceIsAllYouNeed', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + PerfectTiming: { + boolConditional: { + src: 'PerfectTiming', + name: 'boolConditional', + tag: { src: 'PerfectTiming', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'PerfectTiming', + name: 'listConditional', + tag: { src: 'PerfectTiming', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'PerfectTiming', + name: 'numConditional', + tag: { src: 'PerfectTiming', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Pioneering: { + boolConditional: { + src: 'Pioneering', + name: 'boolConditional', + tag: { src: 'Pioneering', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Pioneering', + name: 'listConditional', + tag: { src: 'Pioneering', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Pioneering', + name: 'numConditional', + tag: { src: 'Pioneering', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + PlanetaryRendezvous: { + boolConditional: { + src: 'PlanetaryRendezvous', + name: 'boolConditional', + tag: { src: 'PlanetaryRendezvous', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'PlanetaryRendezvous', + name: 'listConditional', + tag: { src: 'PlanetaryRendezvous', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'PlanetaryRendezvous', + name: 'numConditional', + tag: { src: 'PlanetaryRendezvous', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + PostOpConversation: { + boolConditional: { + src: 'PostOpConversation', + name: 'boolConditional', + tag: { src: 'PostOpConversation', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'PostOpConversation', + name: 'listConditional', + tag: { src: 'PostOpConversation', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'PostOpConversation', + name: 'numConditional', + tag: { src: 'PostOpConversation', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + QuidProQuo: { + boolConditional: { + src: 'QuidProQuo', + name: 'boolConditional', + tag: { src: 'QuidProQuo', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'QuidProQuo', + name: 'listConditional', + tag: { src: 'QuidProQuo', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'QuidProQuo', + name: 'numConditional', + tag: { src: 'QuidProQuo', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + ResolutionShinesAsPearlsOfSweat: { + boolConditional: { + src: 'ResolutionShinesAsPearlsOfSweat', + name: 'boolConditional', + tag: { src: 'ResolutionShinesAsPearlsOfSweat', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'ResolutionShinesAsPearlsOfSweat', + name: 'listConditional', + tag: { src: 'ResolutionShinesAsPearlsOfSweat', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'ResolutionShinesAsPearlsOfSweat', + name: 'numConditional', + tag: { src: 'ResolutionShinesAsPearlsOfSweat', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + ReturnToDarkness: { + boolConditional: { + src: 'ReturnToDarkness', + name: 'boolConditional', + tag: { src: 'ReturnToDarkness', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'ReturnToDarkness', + name: 'listConditional', + tag: { src: 'ReturnToDarkness', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'ReturnToDarkness', + name: 'numConditional', + tag: { src: 'ReturnToDarkness', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + RiverFlowsInSpring: { + boolConditional: { + src: 'RiverFlowsInSpring', + name: 'boolConditional', + tag: { src: 'RiverFlowsInSpring', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'RiverFlowsInSpring', + name: 'listConditional', + tag: { src: 'RiverFlowsInSpring', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'RiverFlowsInSpring', + name: 'numConditional', + tag: { src: 'RiverFlowsInSpring', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Sagacity: { + boolConditional: { + src: 'Sagacity', + name: 'boolConditional', + tag: { src: 'Sagacity', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Sagacity', + name: 'listConditional', + tag: { src: 'Sagacity', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Sagacity', + name: 'numConditional', + tag: { src: 'Sagacity', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SharedFeeling: { + boolConditional: { + src: 'SharedFeeling', + name: 'boolConditional', + tag: { src: 'SharedFeeling', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SharedFeeling', + name: 'listConditional', + tag: { src: 'SharedFeeling', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SharedFeeling', + name: 'numConditional', + tag: { src: 'SharedFeeling', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + ShatteredHome: { + boolConditional: { + src: 'ShatteredHome', + name: 'boolConditional', + tag: { src: 'ShatteredHome', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'ShatteredHome', + name: 'listConditional', + tag: { src: 'ShatteredHome', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'ShatteredHome', + name: 'numConditional', + tag: { src: 'ShatteredHome', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SheAlreadyShutHerEyes: { + boolConditional: { + src: 'SheAlreadyShutHerEyes', + name: 'boolConditional', + tag: { src: 'SheAlreadyShutHerEyes', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SheAlreadyShutHerEyes', + name: 'listConditional', + tag: { src: 'SheAlreadyShutHerEyes', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SheAlreadyShutHerEyes', + name: 'numConditional', + tag: { src: 'SheAlreadyShutHerEyes', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SleepLikeTheDead: { + boolConditional: { + src: 'SleepLikeTheDead', + name: 'boolConditional', + tag: { src: 'SleepLikeTheDead', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SleepLikeTheDead', + name: 'listConditional', + tag: { src: 'SleepLikeTheDead', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SleepLikeTheDead', + name: 'numConditional', + tag: { src: 'SleepLikeTheDead', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SolitaryHealing: { + boolConditional: { + src: 'SolitaryHealing', + name: 'boolConditional', + tag: { src: 'SolitaryHealing', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SolitaryHealing', + name: 'listConditional', + tag: { src: 'SolitaryHealing', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SolitaryHealing', + name: 'numConditional', + tag: { src: 'SolitaryHealing', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SomethingIrreplaceable: { + boolConditional: { + src: 'SomethingIrreplaceable', + name: 'boolConditional', + tag: { src: 'SomethingIrreplaceable', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SomethingIrreplaceable', + name: 'listConditional', + tag: { src: 'SomethingIrreplaceable', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SomethingIrreplaceable', + name: 'numConditional', + tag: { src: 'SomethingIrreplaceable', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + SubscribeForMore: { + boolConditional: { + src: 'SubscribeForMore', + name: 'boolConditional', + tag: { src: 'SubscribeForMore', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'SubscribeForMore', + name: 'listConditional', + tag: { src: 'SubscribeForMore', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'SubscribeForMore', + name: 'numConditional', + tag: { src: 'SubscribeForMore', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Swordplay: { + boolConditional: { + src: 'Swordplay', + name: 'boolConditional', + tag: { src: 'Swordplay', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Swordplay', + name: 'listConditional', + tag: { src: 'Swordplay', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Swordplay', + name: 'numConditional', + tag: { src: 'Swordplay', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TextureOfMemories: { + boolConditional: { + src: 'TextureOfMemories', + name: 'boolConditional', + tag: { src: 'TextureOfMemories', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TextureOfMemories', + name: 'listConditional', + tag: { src: 'TextureOfMemories', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TextureOfMemories', + name: 'numConditional', + tag: { src: 'TextureOfMemories', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TheBirthOfTheSelf: { + boolConditional: { + src: 'TheBirthOfTheSelf', + name: 'boolConditional', + tag: { src: 'TheBirthOfTheSelf', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TheBirthOfTheSelf', + name: 'listConditional', + tag: { src: 'TheBirthOfTheSelf', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TheBirthOfTheSelf', + name: 'numConditional', + tag: { src: 'TheBirthOfTheSelf', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TheMolesWelcomeYou: { + boolConditional: { + src: 'TheMolesWelcomeYou', + name: 'boolConditional', + tag: { src: 'TheMolesWelcomeYou', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TheMolesWelcomeYou', + name: 'listConditional', + tag: { src: 'TheMolesWelcomeYou', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TheMolesWelcomeYou', + name: 'numConditional', + tag: { src: 'TheMolesWelcomeYou', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TheSeriousnessOfBreakfast: { + stackCount: { + src: 'TheSeriousnessOfBreakfast', + name: 'stackCount', + tag: { src: 'TheSeriousnessOfBreakfast', name: 'stackCount' }, + type: 'num', + int_only: true, + min: 0, + max: -1, + }, + }, + TheUnreachableSide: { + boolConditional: { + src: 'TheUnreachableSide', + name: 'boolConditional', + tag: { src: 'TheUnreachableSide', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TheUnreachableSide', + name: 'listConditional', + tag: { src: 'TheUnreachableSide', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TheUnreachableSide', + name: 'numConditional', + tag: { src: 'TheUnreachableSide', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + ThisIsMe: { + boolConditional: { + src: 'ThisIsMe', + name: 'boolConditional', + tag: { src: 'ThisIsMe', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'ThisIsMe', + name: 'listConditional', + tag: { src: 'ThisIsMe', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'ThisIsMe', + name: 'numConditional', + tag: { src: 'ThisIsMe', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TimeWaitsForNoOne: { + boolConditional: { + src: 'TimeWaitsForNoOne', + name: 'boolConditional', + tag: { src: 'TimeWaitsForNoOne', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TimeWaitsForNoOne', + name: 'listConditional', + tag: { src: 'TimeWaitsForNoOne', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TimeWaitsForNoOne', + name: 'numConditional', + tag: { src: 'TimeWaitsForNoOne', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TodayIsAnotherPeacefulDay: { + boolConditional: { + src: 'TodayIsAnotherPeacefulDay', + name: 'boolConditional', + tag: { src: 'TodayIsAnotherPeacefulDay', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TodayIsAnotherPeacefulDay', + name: 'listConditional', + tag: { src: 'TodayIsAnotherPeacefulDay', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TodayIsAnotherPeacefulDay', + name: 'numConditional', + tag: { src: 'TodayIsAnotherPeacefulDay', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + TrendOfTheUniversalMarket: { + boolConditional: { + src: 'TrendOfTheUniversalMarket', + name: 'boolConditional', + tag: { src: 'TrendOfTheUniversalMarket', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'TrendOfTheUniversalMarket', + name: 'listConditional', + tag: { src: 'TrendOfTheUniversalMarket', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'TrendOfTheUniversalMarket', + name: 'numConditional', + tag: { src: 'TrendOfTheUniversalMarket', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + UnderTheBlueSky: { + boolConditional: { + src: 'UnderTheBlueSky', + name: 'boolConditional', + tag: { src: 'UnderTheBlueSky', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'UnderTheBlueSky', + name: 'listConditional', + tag: { src: 'UnderTheBlueSky', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'UnderTheBlueSky', + name: 'numConditional', + tag: { src: 'UnderTheBlueSky', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + Void: { + boolConditional: { + src: 'Void', + name: 'boolConditional', + tag: { src: 'Void', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'Void', + name: 'listConditional', + tag: { src: 'Void', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'Void', + name: 'numConditional', + tag: { src: 'Void', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + WarmthShortensColdNights: { + boolConditional: { + src: 'WarmthShortensColdNights', + name: 'boolConditional', + tag: { src: 'WarmthShortensColdNights', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'WarmthShortensColdNights', + name: 'listConditional', + tag: { src: 'WarmthShortensColdNights', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'WarmthShortensColdNights', + name: 'numConditional', + tag: { src: 'WarmthShortensColdNights', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + WeAreWildfire: { + boolConditional: { + src: 'WeAreWildfire', + name: 'boolConditional', + tag: { src: 'WeAreWildfire', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'WeAreWildfire', + name: 'listConditional', + tag: { src: 'WeAreWildfire', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'WeAreWildfire', + name: 'numConditional', + tag: { src: 'WeAreWildfire', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + WeWillMeetAgain: { + boolConditional: { + src: 'WeWillMeetAgain', + name: 'boolConditional', + tag: { src: 'WeWillMeetAgain', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'WeWillMeetAgain', + name: 'listConditional', + tag: { src: 'WeWillMeetAgain', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'WeWillMeetAgain', + name: 'numConditional', + tag: { src: 'WeWillMeetAgain', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + WoofWalkTime: { + boolConditional: { + src: 'WoofWalkTime', + name: 'boolConditional', + tag: { src: 'WoofWalkTime', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'WoofWalkTime', + name: 'listConditional', + tag: { src: 'WoofWalkTime', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'WoofWalkTime', + name: 'numConditional', + tag: { src: 'WoofWalkTime', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, + WorrisomeBlissful: { + boolConditional: { + src: 'WorrisomeBlissful', + name: 'boolConditional', + tag: { src: 'WorrisomeBlissful', name: 'boolConditional' }, + type: 'bool', + }, + listConditional: { + src: 'WorrisomeBlissful', + name: 'listConditional', + tag: { src: 'WorrisomeBlissful', name: 'listConditional' }, + type: 'list', + list: ['val1', 'val2'], + }, + numConditional: { + src: 'WorrisomeBlissful', + name: 'numConditional', + tag: { src: 'WorrisomeBlissful', name: 'numConditional' }, + type: 'num', + int_only: true, + min: 0, + max: 2, + }, + }, +} +export const formulas = { + Argenti: { + basicDmg_0: { + src: 'Argenti', + name: 'basicDmg_0', + tag: { + src: 'Argenti', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Arlan: { + basicDmg_0: { + src: 'Arlan', + name: 'basicDmg_0', + tag: { + src: 'Arlan', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Asta: { + basicDmg_0: { + src: 'Asta', + name: 'basicDmg_0', + tag: { + src: 'Asta', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Bailu: { + basicDmg_0: { + src: 'Bailu', + name: 'basicDmg_0', + tag: { + src: 'Bailu', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Blade: { + basicDmg_0: { + src: 'Blade', + name: 'basicDmg_0', + tag: { + src: 'Blade', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Bronya: { + basicDmg_0: { + src: 'Bronya', + name: 'basicDmg_0', + tag: { + src: 'Bronya', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Clara: { + basicDmg_0: { + src: 'Clara', + name: 'basicDmg_0', + tag: { + src: 'Clara', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + DanHeng: { + basicDmg_0: { + src: 'DanHeng', + name: 'basicDmg_0', + tag: { + src: 'DanHeng', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + DanHengImbibitorLunae: { + basicDmg_0: { + src: 'DanHengImbibitorLunae', + name: 'basicDmg_0', + tag: { + src: 'DanHengImbibitorLunae', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + DrRatio: { + basicDmg_0: { + src: 'DrRatio', + name: 'basicDmg_0', + tag: { + src: 'DrRatio', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + FuXuan: { + basicDmg_0: { + src: 'FuXuan', + name: 'basicDmg_0', + tag: { + src: 'FuXuan', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Gepard: { + basicDmg_0: { + src: 'Gepard', + name: 'basicDmg_0', + tag: { + src: 'Gepard', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Guinaifen: { + basicDmg_0: { + src: 'Guinaifen', + name: 'basicDmg_0', + tag: { + src: 'Guinaifen', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Hanya: { + basicDmg_0: { + src: 'Hanya', + name: 'basicDmg_0', + tag: { + src: 'Hanya', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Herta: { + basicDmg_0: { + src: 'Herta', + name: 'basicDmg_0', + tag: { + src: 'Herta', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Himeko: { + basicDmg_0: { + src: 'Himeko', + name: 'basicDmg_0', + tag: { + src: 'Himeko', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Hook: { + basicDmg_0: { + src: 'Hook', + name: 'basicDmg_0', + tag: { + src: 'Hook', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Huohuo: { + basicDmg_0: { + src: 'Huohuo', + name: 'basicDmg_0', + tag: { + src: 'Huohuo', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + JingYuan: { + basicDmg_0: { + src: 'JingYuan', + name: 'basicDmg_0', + tag: { + src: 'JingYuan', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Jingliu: { + basicDmg_0: { + src: 'Jingliu', + name: 'basicDmg_0', + tag: { + src: 'Jingliu', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Kafka: { + basicDmg_0: { + src: 'Kafka', + name: 'basicDmg_0', + tag: { + src: 'Kafka', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Luka: { + basicDmg_0: { + src: 'Luka', + name: 'basicDmg_0', + tag: { + src: 'Luka', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Luocha: { + basicDmg_0: { + src: 'Luocha', + name: 'basicDmg_0', + tag: { + src: 'Luocha', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Lynx: { + basicDmg_0: { + src: 'Lynx', + name: 'basicDmg_0', + tag: { + src: 'Lynx', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + March7th: { + basicDmg_0: { + src: 'March7th', + name: 'basicDmg_0', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + skillShield: { + src: 'March7th', + name: 'skillShield', + tag: { + src: 'March7th', + qt: 'formula', + q: 'shield', + et: 'self', + name: 'skillShield', + }, + }, + ultDmg_0: { + src: 'March7th', + name: 'ultDmg_0', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'ultDmg_0', + }, + }, + ultDmg_1: { + src: 'March7th', + name: 'ultDmg_1', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'ultDmg_1', + }, + }, + ultDmg_2: { + src: 'March7th', + name: 'ultDmg_2', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'ultDmg_2', + }, + }, + ultDmg_3: { + src: 'March7th', + name: 'ultDmg_3', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'ultDmg_3', + }, + }, + ultFreeze_0: { + src: 'March7th', + name: 'ultFreeze_0', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'ultFreeze_0', + }, + }, + talentDmg_0: { + src: 'March7th', + name: 'talentDmg_0', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'talentDmg_0', + }, + }, + techniqueFreeze_0: { + src: 'March7th', + name: 'techniqueFreeze_0', + tag: { + src: 'March7th', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'techniqueFreeze_0', + }, + }, + e1Shield: { + src: 'March7th', + name: 'e1Shield', + tag: { + src: 'March7th', + qt: 'formula', + q: 'shield', + et: 'self', + name: 'e1Shield', + }, + }, + e6Heal: { + src: 'March7th', + name: 'e6Heal', + tag: { + src: 'March7th', + qt: 'formula', + q: 'heal', + et: 'self', + name: 'e6Heal', + }, + }, + }, + Natasha: { + basicDmg_0: { + src: 'Natasha', + name: 'basicDmg_0', + tag: { + src: 'Natasha', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Pela: { + basicDmg_0: { + src: 'Pela', + name: 'basicDmg_0', + tag: { + src: 'Pela', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Qingque: { + basicDmg_0: { + src: 'Qingque', + name: 'basicDmg_0', + tag: { + src: 'Qingque', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + RuanMei: { + basicDmg_0: { + src: 'RuanMei', + name: 'basicDmg_0', + tag: { + src: 'RuanMei', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Sampo: { + basicDmg_0: { + src: 'Sampo', + name: 'basicDmg_0', + tag: { + src: 'Sampo', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Seele: { + basicDmg_0: { + src: 'Seele', + name: 'basicDmg_0', + tag: { + src: 'Seele', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Serval: { + basicDmg_0: { + src: 'Serval', + name: 'basicDmg_0', + tag: { + src: 'Serval', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + SilverWolf: { + basicDmg_0: { + src: 'SilverWolf', + name: 'basicDmg_0', + tag: { + src: 'SilverWolf', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Sushang: { + basicDmg_0: { + src: 'Sushang', + name: 'basicDmg_0', + tag: { + src: 'Sushang', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Tingyun: { + basicDmg_0: { + src: 'Tingyun', + name: 'basicDmg_0', + tag: { + src: 'Tingyun', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + TopazAndNumby: { + basicDmg_0: { + src: 'TopazAndNumby', + name: 'basicDmg_0', + tag: { + src: 'TopazAndNumby', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Welt: { + basicDmg_0: { + src: 'Welt', + name: 'basicDmg_0', + tag: { + src: 'Welt', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Xueyi: { + basicDmg_0: { + src: 'Xueyi', + name: 'basicDmg_0', + tag: { + src: 'Xueyi', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Yanqing: { + basicDmg_0: { + src: 'Yanqing', + name: 'basicDmg_0', + tag: { + src: 'Yanqing', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, + Yukong: { + basicDmg_0: { + src: 'Yukong', + name: 'basicDmg_0', + tag: { + src: 'Yukong', + qt: 'formula', + q: 'dmg', + et: 'self', + name: 'basicDmg_0', + }, + }, + }, +} diff --git a/libs/sr-formula/tsconfig.lib.json b/libs/sr-formula/tsconfig.lib.json index f642dfbee1..ae0cc4e279 100644 --- a/libs/sr-formula/tsconfig.lib.json +++ b/libs/sr-formula/tsconfig.lib.json @@ -4,6 +4,6 @@ "outDir": "../../dist/out-tsc", "types": ["node", "object-overrides"] }, - "include": ["src/**/*.ts"], + "include": ["src/**/*.ts", "src/generators/**/*.ts", "src/executors/**/*.ts"], "exclude": ["vitest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] } diff --git a/libs/sr-stats/Data/Characters/Argenti.json b/libs/sr-stats/Data/Characters/Argenti.json new file mode 100644 index 0000000000..c86fae03f6 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Argenti.json @@ -0,0 +1,470 @@ +{ + "rarity": 5, + "damageType": "Physical", + "path": "Erudition", + "skillTreeList": [ + { + "pointId": "1302001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1302002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.6, + 0.66, + 0.72, + 0.78, + 0.84, + 0.9, + 0.975, + 1.05, + 1.125, + 1.2, + 1.26, + 1.32, + 1.38, + 1.44, + 1.5 + ] + ] + }, + { + "pointId": "1302003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.96, + 1.024, + 1.088, + 1.152, + 1.216, + 1.28, + 1.36, + 1.44, + 1.52, + 1.6, + 1.664, + 1.728, + 1.792, + 1.856, + 1.92 + ], + [ + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90 + ] + ] + }, + { + "pointId": "1302004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ], + [ + 0.01, + 0.0115, + 0.013, + 0.0145, + 0.016, + 0.0175, + 0.019375, + 0.02125, + 0.023125, + 0.025, + 0.0265, + 0.028, + 0.0295, + 0.031, + 0.0325 + ], + [ + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10, + 10 + ] + ] + }, + { + "pointId": "1302007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 10 + ], + [ + 0.8 + ], + [ + 15 + ] + ] + }, + { + "pointId": "1302101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1302102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1302103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1302201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "physical_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "physical_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "physical_dmg_": 0.064 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1302210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "atk_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 100.32, + "add": 5.016 + }, + "def": { + "base": 49.5, + "add": 2.475 + }, + "hp": { + "base": 142.56, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 140.448, + "add": 5.016 + }, + "def": { + "base": 69.3, + "add": 2.475 + }, + "hp": { + "base": 199.584, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 180.576, + "add": 5.016 + }, + "def": { + "base": 89.1, + "add": 2.475 + }, + "hp": { + "base": 256.608, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 220.704, + "add": 5.016 + }, + "def": { + "base": 108.9, + "add": 2.475 + }, + "hp": { + "base": 313.632, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 260.832, + "add": 5.016 + }, + "def": { + "base": 128.7, + "add": 2.475 + }, + "hp": { + "base": 370.656, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 300.96, + "add": 5.016 + }, + "def": { + "base": 148.5, + "add": 2.475 + }, + "hp": { + "base": 427.68, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 341.088, + "add": 5.016 + }, + "def": { + "base": 168.3, + "add": 2.475 + }, + "hp": { + "base": 484.704, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.04 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 3, + 0.4, + 1 + ] + }, + "3": { + "skillTypeAddLevel": { + "skill": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 2, + 2 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "ult": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.3 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Blade.json b/libs/sr-stats/Data/Characters/Blade.json new file mode 100644 index 0000000000..19e81b15cd --- /dev/null +++ b/libs/sr-stats/Data/Characters/Blade.json @@ -0,0 +1,619 @@ +{ + "rarity": 5, + "damageType": "Wind", + "path": "Destruction", + "skillTreeList": [ + { + "pointId": "1205001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1205002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.12, + 0.148, + 0.176, + 0.204, + 0.232, + 0.26, + 0.295, + 0.33, + 0.365, + 0.4, + 0.428, + 0.456, + 0.484, + 0.512, + 0.54 + ] + ] + }, + { + "pointId": "1205003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.24, + 0.256, + 0.272, + 0.288, + 0.304, + 0.32, + 0.34, + 0.36, + 0.38, + 0.4, + 0.416, + 0.432, + 0.448, + 0.464, + 0.48 + ], + [ + 0.6, + 0.64, + 0.68, + 0.72, + 0.76, + 0.8, + 0.85, + 0.9, + 0.95, + 1, + 1.04, + 1.08, + 1.12, + 1.16, + 1.2 + ], + [ + 0.096, + 0.1024, + 0.1088, + 0.1152, + 0.1216, + 0.128, + 0.136, + 0.144, + 0.152, + 0.16, + 0.1664, + 0.1728, + 0.1792, + 0.1856, + 0.192 + ], + [ + 0.24, + 0.256, + 0.272, + 0.288, + 0.304, + 0.32, + 0.34, + 0.36, + 0.38, + 0.4, + 0.416, + 0.432, + 0.448, + 0.464, + 0.48 + ], + [ + 0.6, + 0.64, + 0.68, + 0.72, + 0.76, + 0.8, + 0.85, + 0.9, + 0.95, + 1, + 1.04, + 1.08, + 1.12, + 1.16, + 1.2 + ], + [ + 0.24, + 0.256, + 0.272, + 0.288, + 0.304, + 0.32, + 0.34, + 0.36, + 0.38, + 0.4, + 0.416, + 0.432, + 0.448, + 0.464, + 0.48 + ], + [ + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9 + ] + ] + }, + { + "pointId": "1205004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ], + [ + 0.22, + 0.242, + 0.264, + 0.286, + 0.308, + 0.33, + 0.3575, + 0.385, + 0.4125, + 0.44, + 0.462, + 0.484, + 0.506, + 0.528, + 0.55 + ], + [ + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25 + ], + [ + 0.55, + 0.605, + 0.66, + 0.715, + 0.77, + 0.825, + 0.89375, + 0.9625, + 1.03125, + 1.1, + 1.155, + 1.21, + 1.265, + 1.32, + 1.375 + ] + ] + }, + { + "pointId": "1205007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 0.4 + ], + [ + 0.2 + ] + ] + }, + { + "pointId": "1205101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1205102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1205103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1205201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "crit_": 0.027 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "eff_res_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "crit_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "eff_res_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "crit_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1205210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "hp_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 73.92, + "add": 3.696 + }, + "def": { + "base": 66, + "add": 3.3 + }, + "hp": { + "base": 184.8, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 103.488, + "add": 3.696 + }, + "def": { + "base": 92.4, + "add": 3.3 + }, + "hp": { + "base": 258.72, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 133.056, + "add": 3.696 + }, + "def": { + "base": 118.8, + "add": 3.3 + }, + "hp": { + "base": 332.64, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 162.624, + "add": 3.696 + }, + "def": { + "base": 145.2, + "add": 3.3 + }, + "hp": { + "base": 406.56, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 192.192, + "add": 3.696 + }, + "def": { + "base": 171.6, + "add": 3.3 + }, + "hp": { + "base": 480.48, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 221.76, + "add": 3.696 + }, + "def": { + "base": 198, + "add": 3.3 + }, + "hp": { + "base": 554.4, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 251.328, + "add": 3.696 + }, + "def": { + "base": 224.4, + "add": 3.3 + }, + "hp": { + "base": 628.32, + "add": 9.24 + }, + "spd": 97, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 1.5, + 0.9 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.15 + ] + }, + "3": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.2, + 2 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.5 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/DanHengImbibitorLunae.json b/libs/sr-stats/Data/Characters/DanHengImbibitorLunae.json new file mode 100644 index 0000000000..c72c9bd079 --- /dev/null +++ b/libs/sr-stats/Data/Characters/DanHengImbibitorLunae.json @@ -0,0 +1,498 @@ +{ + "rarity": 5, + "damageType": "Imaginary", + "path": "Destruction", + "skillTreeList": [ + { + "pointId": "1213001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1213002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.06, + 0.066, + 0.072, + 0.078, + 0.084, + 0.09, + 0.0975, + 0.105, + 0.1125, + 0.12, + 0.126, + 0.132, + 0.138, + 0.144, + 0.15 + ], + [ + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 + ] + ] + }, + { + "pointId": "1213003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 1.8, + 1.92, + 2.04, + 2.16, + 2.28, + 2.4, + 2.55, + 2.7, + 2.85, + 3, + 3.12, + 3.24, + 3.36, + 3.48, + 3.6 + ], + [ + 0.84, + 0.896, + 0.952, + 1.008, + 1.064, + 1.12, + 1.19, + 1.26, + 1.33, + 1.4, + 1.456, + 1.512, + 1.568, + 1.624, + 1.68 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ] + ] + }, + { + "pointId": "1213004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 0.05, + 0.055, + 0.06, + 0.065, + 0.07, + 0.075, + 0.08125, + 0.0875, + 0.09375, + 0.1, + 0.105, + 0.11, + 0.115, + 0.12, + 0.125 + ], + [ + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6 + ] + ] + }, + { + "pointId": "1213007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 1 + ], + [ + 20 + ], + [ + 1.2 + ] + ] + }, + { + "pointId": "1213101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1213102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1213103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1213201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "crit_": 0.027 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "crit_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "crit_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1213210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.064 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 95.04, + "add": 4.752 + }, + "def": { + "base": 49.5, + "add": 2.475 + }, + "hp": { + "base": 168.96, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 133.056, + "add": 4.752 + }, + "def": { + "base": 69.3, + "add": 2.475 + }, + "hp": { + "base": 236.544, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 171.072, + "add": 4.752 + }, + "def": { + "base": 89.1, + "add": 2.475 + }, + "hp": { + "base": 304.128, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 209.088, + "add": 4.752 + }, + "def": { + "base": 108.9, + "add": 2.475 + }, + "hp": { + "base": 371.712, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 247.104, + "add": 4.752 + }, + "def": { + "base": 128.7, + "add": 2.475 + }, + "hp": { + "base": 439.296, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 285.12, + "add": 4.752 + }, + "def": { + "base": 148.5, + "add": 2.475 + }, + "hp": { + "base": 506.88, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 323.136, + "add": 4.752 + }, + "def": { + "base": 168.3, + "add": 2.475 + }, + "hp": { + "base": 574.464, + "add": 8.448 + }, + "spd": 102, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 4 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.2, + 3 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/DrRatio.json b/libs/sr-stats/Data/Characters/DrRatio.json new file mode 100644 index 0000000000..113559f9e0 --- /dev/null +++ b/libs/sr-stats/Data/Characters/DrRatio.json @@ -0,0 +1,473 @@ +{ + "rarity": 5, + "damageType": "Imaginary", + "path": "TheHunt", + "skillTreeList": [ + { + "pointId": "1305001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1305002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.75, + 0.825, + 0.9, + 0.975, + 1.05, + 1.125, + 1.21875, + 1.3125, + 1.40625, + 1.5, + 1.575, + 1.65, + 1.725, + 1.8, + 1.875 + ] + ] + }, + { + "pointId": "1305003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 1.44, + 1.536, + 1.632, + 1.728, + 1.824, + 1.92, + 2.04, + 2.16, + 2.28, + 2.4, + 2.496, + 2.592, + 2.688, + 2.784, + 2.88 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1305004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 1.35, + 1.485, + 1.62, + 1.755, + 1.89, + 2.025, + 2.19375, + 2.3625, + 2.53125, + 2.7, + 2.835, + 2.97, + 3.105, + 3.24, + 3.375 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "pointId": "1305007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 10 + ], + [ + 1 + ], + [ + 0.15 + ], + [ + 2 + ] + ] + }, + { + "pointId": "1305101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1305102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1305103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1305201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "crit_": 0.027 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "def_": 0.05 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "crit_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "def_": 0.075 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "crit_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1305210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "atk_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 105.6, + "add": 5.28 + }, + "def": { + "base": 62.7, + "add": 3.135 + }, + "hp": { + "base": 142.56, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 147.84, + "add": 5.28 + }, + "def": { + "base": 87.78, + "add": 3.135 + }, + "hp": { + "base": 199.584, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 190.08, + "add": 5.28 + }, + "def": { + "base": 112.86, + "add": 3.135 + }, + "hp": { + "base": 256.608, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 232.32, + "add": 5.28 + }, + "def": { + "base": 137.94, + "add": 3.135 + }, + "hp": { + "base": 313.632, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 274.56, + "add": 5.28 + }, + "def": { + "base": 163.02, + "add": 3.135 + }, + "hp": { + "base": 370.656, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 316.8, + "add": 5.28 + }, + "def": { + "base": 188.1, + "add": 3.135 + }, + "hp": { + "base": 427.68, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 359.04, + "add": 5.28 + }, + "def": { + "base": 213.18, + "add": 3.135 + }, + "hp": { + "base": 484.704, + "add": 7.128 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 4, + 4 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.2, + 4 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "ult": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 15 + ] + }, + "5": { + "skillTypeAddLevel": { + "skill": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 1, + 0.5 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/FuXuan.json b/libs/sr-stats/Data/Characters/FuXuan.json new file mode 100644 index 0000000000..76375ca23e --- /dev/null +++ b/libs/sr-stats/Data/Characters/FuXuan.json @@ -0,0 +1,516 @@ +{ + "rarity": 5, + "damageType": "Quantum", + "path": "Preservation", + "skillTreeList": [ + { + "pointId": "1208001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.25, + 0.3, + 0.35, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 0.65 + ] + ] + }, + { + "pointId": "1208002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ], + [ + 0.03, + 0.033, + 0.036, + 0.039, + 0.042, + 0.045, + 0.04875, + 0.0525, + 0.05625, + 0.06, + 0.063, + 0.066, + 0.069, + 0.072, + 0.075 + ], + [ + 0.06, + 0.066, + 0.072, + 0.078, + 0.084, + 0.09, + 0.0975, + 0.105, + 0.1125, + 0.12, + 0.126, + 0.132, + 0.138, + 0.144, + 0.15 + ] + ] + }, + { + "pointId": "1208003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.6, + 0.64, + 0.68, + 0.72, + 0.76, + 0.8, + 0.85, + 0.9, + 0.95, + 1, + 1.04, + 1.08, + 1.12, + 1.16, + 1.2 + ] + ] + }, + { + "pointId": "1208004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 0.1, + 0.108, + 0.116, + 0.124, + 0.132, + 0.14, + 0.15, + 0.16, + 0.17, + 0.18, + 0.188, + 0.196, + 0.204, + 0.212, + 0.22 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.8, + 0.81, + 0.82, + 0.83, + 0.84, + 0.85, + 0.8625, + 0.875, + 0.8875, + 0.9, + 0.91, + 0.92, + 0.93, + 0.94, + 0.95 + ] + ] + }, + { + "pointId": "1208007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 20 + ], + [ + 2 + ] + ] + }, + { + "pointId": "1208101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1208102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1208103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1208201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "crit_": 0.027 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "crit_": 0.027 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "eff_res_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "crit_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "crit_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "eff_res_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "hp_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1208210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "crit_": 0.053 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 63.36, + "add": 3.168 + }, + "def": { + "base": 82.5, + "add": 4.125 + }, + "hp": { + "base": 200.64, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + }, + { + "atk": { + "base": 88.704, + "add": 3.168 + }, + "def": { + "base": 115.5, + "add": 4.125 + }, + "hp": { + "base": 280.896, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + }, + { + "atk": { + "base": 114.048, + "add": 3.168 + }, + "def": { + "base": 148.5, + "add": 4.125 + }, + "hp": { + "base": 361.152, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + }, + { + "atk": { + "base": 139.392, + "add": 3.168 + }, + "def": { + "base": 181.5, + "add": 4.125 + }, + "hp": { + "base": 441.408, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + }, + { + "atk": { + "base": 164.736, + "add": 3.168 + }, + "def": { + "base": 214.5, + "add": 4.125 + }, + "hp": { + "base": 521.664, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + }, + { + "atk": { + "base": 190.08, + "add": 3.168 + }, + "def": { + "base": 247.5, + "add": 4.125 + }, + "hp": { + "base": 601.92, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + }, + { + "atk": { + "base": 215.424, + "add": 3.168 + }, + "def": { + "base": 280.5, + "add": 4.125 + }, + "hp": { + "base": 682.176, + "add": 10.032 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 150 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.3 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.7 + ] + }, + "3": { + "skillTypeAddLevel": { + "skill": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 5 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "ult": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 2, + 1.2 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Guinaifen.json b/libs/sr-stats/Data/Characters/Guinaifen.json new file mode 100644 index 0000000000..2c9b06c9f8 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Guinaifen.json @@ -0,0 +1,588 @@ +{ + "rarity": 4, + "damageType": "Fire", + "path": "Nihility", + "skillTreeList": [ + { + "pointId": "1210001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1210002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.6, + 0.66, + 0.72, + 0.78, + 0.84, + 0.9, + 0.975, + 1.05, + 1.125, + 1.2, + 1.26, + 1.32, + 1.38, + 1.44, + 1.5 + ], + [ + 0.2, + 0.22, + 0.24, + 0.26, + 0.28, + 0.3, + 0.325, + 0.35, + 0.375, + 0.4, + 0.42, + 0.44, + 0.46, + 0.48, + 0.5 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.83904, + 0.92298, + 1.00692, + 1.09086, + 1.1748, + 1.30071, + 1.46859, + 1.67844, + 1.93026, + 2.18208, + 2.291202, + 2.400324, + 2.509446, + 2.618568, + 2.72769 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1210003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.72, + 0.768, + 0.816, + 0.864, + 0.912, + 0.96, + 1.02, + 1.08, + 1.14, + 1.2, + 1.248, + 1.296, + 1.344, + 1.392, + 1.44 + ], + [ + 0.72, + 0.74, + 0.76, + 0.78, + 0.8, + 0.82, + 0.845, + 0.87, + 0.895, + 0.92, + 0.94, + 0.96, + 0.98, + 1, + 1.02 + ] + ] + }, + { + "pointId": "1210004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0.04, + 0.043, + 0.046, + 0.049, + 0.052, + 0.055, + 0.05875, + 0.0625, + 0.06625, + 0.07, + 0.073, + 0.076, + 0.079, + 0.082, + 0.085 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ] + ] + }, + { + "pointId": "1210007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 0.5 + ], + [ + 4 + ], + [ + 1 + ] + ] + }, + { + "pointId": "1210101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1210102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1210103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1210201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "fire_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "brEff_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "fire_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "eff_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "fire_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "brEff_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "fire_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "eff_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "brEff_": 0.107 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1210210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "fire_dmg_": 0.064 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 79.2, + "add": 3.96 + }, + "def": { + "base": 60, + "add": 3 + }, + "hp": { + "base": 120, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 110.88, + "add": 3.96 + }, + "def": { + "base": 84, + "add": 3 + }, + "hp": { + "base": 168, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 142.56, + "add": 3.96 + }, + "def": { + "base": 108, + "add": 3 + }, + "hp": { + "base": 216, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 174.24, + "add": 3.96 + }, + "def": { + "base": 132, + "add": 3 + }, + "hp": { + "base": 264, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 205.92, + "add": 3.96 + }, + "def": { + "base": 156, + "add": 3 + }, + "hp": { + "base": 312, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 237.6, + "add": 3.96 + }, + "def": { + "base": 180, + "add": 3 + }, + "hp": { + "base": 360, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 269.28, + "add": 3.96 + }, + "def": { + "base": 204, + "add": 3 + }, + "hp": { + "base": 408, + "add": 6 + }, + "spd": 106, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 1, + 0.1, + 2 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.4 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 2 + ] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 1 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Hanya.json b/libs/sr-stats/Data/Characters/Hanya.json new file mode 100644 index 0000000000..0a6e1d8d0d --- /dev/null +++ b/libs/sr-stats/Data/Characters/Hanya.json @@ -0,0 +1,476 @@ +{ + "rarity": 4, + "damageType": "Physical", + "path": "Harmony", + "skillTreeList": [ + { + "pointId": "1215001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1215002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 1.2, + 1.32, + 1.44, + 1.56, + 1.68, + 1.8, + 1.95, + 2.1, + 2.25, + 2.4, + 2.52, + 2.64, + 2.76, + 2.88, + 3 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1215003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.36, + 0.384, + 0.408, + 0.432, + 0.456, + 0.48, + 0.51, + 0.54, + 0.57, + 0.6, + 0.624, + 0.648, + 0.672, + 0.696, + 0.72 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 0.15, + 0.155, + 0.16, + 0.165, + 0.17, + 0.175, + 0.18125, + 0.1875, + 0.19375, + 0.2, + 0.205, + 0.21, + 0.215, + 0.22, + 0.225 + ] + ] + }, + { + "pointId": "1215004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 0.15, + 0.165, + 0.18, + 0.195, + 0.21, + 0.225, + 0.24375, + 0.2625, + 0.28125, + 0.3, + 0.315, + 0.33, + 0.345, + 0.36, + 0.375 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1215007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [] + }, + { + "pointId": "1215101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1215102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1215103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1215201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "spd": 2 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "spd": 3 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "spd": 4 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1215210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "atk_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 76.8, + "add": 3.84 + }, + "def": { + "base": 48, + "add": 2.4 + }, + "hp": { + "base": 124.8, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 107.52, + "add": 3.84 + }, + "def": { + "base": 67.2, + "add": 2.4 + }, + "hp": { + "base": 174.72, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 138.24, + "add": 3.84 + }, + "def": { + "base": 86.4, + "add": 2.4 + }, + "hp": { + "base": 224.64, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 168.96, + "add": 3.84 + }, + "def": { + "base": 105.6, + "add": 2.4 + }, + "hp": { + "base": 274.56, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 199.68, + "add": 3.84 + }, + "def": { + "base": 124.8, + "add": 2.4 + }, + "hp": { + "base": 324.48, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 230.4, + "add": 3.84 + }, + "def": { + "base": 144, + "add": 2.4 + }, + "hp": { + "base": 374.4, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 261.12, + "add": 3.84 + }, + "def": { + "base": 163.2, + "add": 2.4 + }, + "hp": { + "base": 424.32, + "add": 6.24 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.15, + 1 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.2, + 1 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 1 + ] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.1 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Huohuo.json b/libs/sr-stats/Data/Characters/Huohuo.json new file mode 100644 index 0000000000..ca31ea4d34 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Huohuo.json @@ -0,0 +1,626 @@ +{ + "rarity": 5, + "damageType": "Wind", + "path": "Abundance", + "skillTreeList": [ + { + "pointId": "1217001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.25, + 0.3, + 0.35, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 0.65 + ] + ] + }, + { + "pointId": "1217002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.14, + 0.14875, + 0.1575, + 0.16625, + 0.175, + 0.182, + 0.189, + 0.196, + 0.203, + 0.21, + 0.217, + 0.224, + 0.231, + 0.238, + 0.245 + ], + [ + 140, + 224, + 287, + 350, + 392, + 434, + 465.5, + 497, + 528.5, + 560, + 591.5, + 623, + 654.5, + 686, + 717.5 + ], + [ + 0.112, + 0.119, + 0.126, + 0.133, + 0.14, + 0.1456, + 0.1512, + 0.1568, + 0.1624, + 0.168, + 0.1736, + 0.1792, + 0.1848, + 0.1904, + 0.196 + ], + [ + 112, + 179.2, + 229.6, + 280, + 313.6, + 347.2, + 372.4, + 397.6, + 422.8, + 448, + 473.2, + 498.4, + 523.6, + 548.8, + 574 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + }, + { + "pointId": "1217003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.15, + 0.155, + 0.16, + 0.165, + 0.17, + 0.175, + 0.18125, + 0.1875, + 0.19375, + 0.2, + 0.205, + 0.21, + 0.215, + 0.22, + 0.225 + ], + [ + 0.24, + 0.256, + 0.272, + 0.288, + 0.304, + 0.32, + 0.34, + 0.36, + 0.38, + 0.4, + 0.416, + 0.432, + 0.448, + 0.464, + 0.48 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1217004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.03, + 0.031875, + 0.03375, + 0.035625, + 0.0375, + 0.039, + 0.0405, + 0.042, + 0.0435, + 0.045, + 0.0465, + 0.048, + 0.0495, + 0.051, + 0.0525 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 30, + 48, + 61.5, + 75, + 84, + 93, + 99.75, + 106.5, + 113.25, + 120, + 126.75, + 133.5, + 140.25, + 147, + 153.75 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6 + ] + ] + }, + { + "pointId": "1217007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 1 + ], + [ + 0.25 + ], + [ + 2 + ], + [ + 10 + ] + ] + }, + { + "pointId": "1217101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1217102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1217103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1217201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "eff_res_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "spd": 2 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "eff_res_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "spd": 3 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "eff_res_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1217210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "hp_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 81.84, + "add": 4.092 + }, + "def": { + "base": 69.3, + "add": 3.465 + }, + "hp": { + "base": 184.8, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 114.576, + "add": 4.092 + }, + "def": { + "base": 97.02, + "add": 3.465 + }, + "hp": { + "base": 258.72, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 147.312, + "add": 4.092 + }, + "def": { + "base": 124.74, + "add": 3.465 + }, + "hp": { + "base": 332.64, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 180.048, + "add": 4.092 + }, + "def": { + "base": 152.46, + "add": 3.465 + }, + "hp": { + "base": 406.56, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 212.784, + "add": 4.092 + }, + "def": { + "base": 180.18, + "add": 3.465 + }, + "hp": { + "base": 480.48, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 245.52, + "add": 4.092 + }, + "def": { + "base": 207.9, + "add": 3.465 + }, + "hp": { + "base": 554.4, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 278.256, + "add": 4.092 + }, + "def": { + "base": 235.62, + "add": 3.465 + }, + "hp": { + "base": 628.32, + "add": 9.24 + }, + "spd": 98, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.12, + 1 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.5, + 2 + ] + }, + "3": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.8 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.5, + 2 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Jingliu.json b/libs/sr-stats/Data/Characters/Jingliu.json new file mode 100644 index 0000000000..2e5aaa4337 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Jingliu.json @@ -0,0 +1,599 @@ +{ + "rarity": 5, + "damageType": "Ice", + "path": "Destruction", + "skillTreeList": [ + { + "pointId": "1212001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1212002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 1, + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.625, + 1.75, + 1.875, + 2, + 2.1, + 2.2, + 2.3, + 2.4, + 2.5 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + }, + { + "pointId": "1212003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 1.8, + 1.92, + 2.04, + 2.16, + 2.28, + 2.4, + 2.55, + 2.7, + 2.85, + 3, + 3.12, + 3.24, + 3.36, + 3.48, + 3.6 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.9, + 0.96, + 1.02, + 1.08, + 1.14, + 1.2, + 1.275, + 1.35, + 1.425, + 1.5, + 1.56, + 1.62, + 1.68, + 1.74, + 1.8 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + }, + { + "pointId": "1212004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04 + ], + [ + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4, + 5.4 + ], + [ + 0.9, + 0.99, + 1.08, + 1.17, + 1.26, + 1.35, + 1.4625, + 1.575, + 1.6875, + 1.8, + 1.89, + 1.98, + 2.07, + 2.16, + 2.25 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.4, + 0.41, + 0.42, + 0.43, + 0.44, + 0.45, + 0.4625, + 0.475, + 0.4875, + 0.5, + 0.51, + 0.52, + 0.53, + 0.54, + 0.55 + ] + ] + }, + { + "pointId": "1212007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 1 + ], + [ + 1 + ], + [ + 20 + ], + [ + 1 + ], + [ + 0.8 + ], + [ + 15 + ] + ] + }, + { + "pointId": "1212101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1212102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1212103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1212201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "crit_dmg_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "spd": 2 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "crit_dmg_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "crit_dmg_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "spd": 3 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "crit_dmg_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "spd": 4 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1212210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "crit_dmg_": 0.107 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 92.4, + "add": 4.62 + }, + "def": { + "base": 66, + "add": 3.3 + }, + "hp": { + "base": 195.36, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 129.36, + "add": 4.62 + }, + "def": { + "base": 92.4, + "add": 3.3 + }, + "hp": { + "base": 273.504, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 166.32, + "add": 4.62 + }, + "def": { + "base": 118.8, + "add": 3.3 + }, + "hp": { + "base": 351.648, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 203.28, + "add": 4.62 + }, + "def": { + "base": 145.2, + "add": 3.3 + }, + "hp": { + "base": 429.792, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 240.24, + "add": 4.62 + }, + "def": { + "base": 171.6, + "add": 3.3 + }, + "hp": { + "base": 507.936, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 277.2, + "add": 4.62 + }, + "def": { + "base": 198, + "add": 3.3 + }, + "hp": { + "base": 586.08, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 314.16, + "add": 4.62 + }, + "def": { + "base": 224.4, + "add": 3.3 + }, + "hp": { + "base": 664.224, + "add": 9.768 + }, + "spd": 96, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.24, + 1, + 1 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.8 + ] + }, + "3": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.9, + 0.3 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 1, + 0.5 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Luka.json b/libs/sr-stats/Data/Characters/Luka.json new file mode 100644 index 0000000000..e55ab94fcd --- /dev/null +++ b/libs/sr-stats/Data/Characters/Luka.json @@ -0,0 +1,568 @@ +{ + "rarity": 4, + "damageType": "Physical", + "path": "Nihility", + "skillTreeList": [ + { + "pointId": "1111001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1111002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.6, + 0.66, + 0.72, + 0.78, + 0.84, + 0.9, + 0.975, + 1.05, + 1.125, + 1.2, + 1.26, + 1.32, + 1.38, + 1.44, + 1.5 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ], + [ + 1.3, + 1.43, + 1.56, + 1.69, + 1.82, + 2.015, + 2.275, + 2.6, + 2.99, + 3.38, + 3.549, + 3.718, + 3.887, + 4.056, + 4.225 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ] + ] + }, + { + "pointId": "1111003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 1.98, + 2.112, + 2.244, + 2.376, + 2.508, + 2.64, + 2.805, + 2.97, + 3.135, + 3.3, + 3.432, + 3.564, + 3.696, + 3.828, + 3.96 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.12, + 0.128, + 0.136, + 0.144, + 0.152, + 0.16, + 0.17, + 0.18, + 0.19, + 0.2, + 0.208, + 0.216, + 0.224, + 0.232, + 0.24 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1111004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.68, + 0.697, + 0.714, + 0.731, + 0.748, + 0.765, + 0.78625, + 0.8075, + 0.82875, + 0.85, + 0.867, + 0.884, + 0.901, + 0.918, + 0.935 + ] + ] + }, + { + "pointId": "1111007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 0.5 + ], + [ + 1 + ] + ] + }, + { + "pointId": "1111101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1111102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1111103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1111201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "eff_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "def_": 0.05 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "eff_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "def_": 0.075 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "eff_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1111210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "atk_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 79.2, + "add": 3.96 + }, + "def": { + "base": 66, + "add": 3.3 + }, + "hp": { + "base": 124.8, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 110.88, + "add": 3.96 + }, + "def": { + "base": 92.4, + "add": 3.3 + }, + "hp": { + "base": 174.72, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 142.56, + "add": 3.96 + }, + "def": { + "base": 118.8, + "add": 3.3 + }, + "hp": { + "base": 224.64, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 174.24, + "add": 3.96 + }, + "def": { + "base": 145.2, + "add": 3.3 + }, + "hp": { + "base": 274.56, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 205.92, + "add": 3.96 + }, + "def": { + "base": 171.6, + "add": 3.3 + }, + "hp": { + "base": 324.48, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 237.6, + "add": 3.96 + }, + "def": { + "base": 198, + "add": 3.3 + }, + "hp": { + "base": 374.4, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 269.28, + "add": 3.96 + }, + "def": { + "base": 224.4, + "add": 3.3 + }, + "hp": { + "base": 424.32, + "add": 6.24 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.15, + 2 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 1 + ] + }, + "3": { + "skillTypeAddLevel": { + "skill": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.05, + 4 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "ult": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.08 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Lynx.json b/libs/sr-stats/Data/Characters/Lynx.json new file mode 100644 index 0000000000..2bd82db200 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Lynx.json @@ -0,0 +1,600 @@ +{ + "rarity": 4, + "damageType": "Quantum", + "path": "Abundance", + "skillTreeList": [ + { + "pointId": "1110001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.25, + 0.3, + 0.35, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6, + 0.65 + ] + ] + }, + { + "pointId": "1110002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.05, + 0.0525, + 0.055, + 0.0575, + 0.06, + 0.0625, + 0.065625, + 0.06875, + 0.071875, + 0.075, + 0.0775, + 0.08, + 0.0825, + 0.085, + 0.0875 + ], + [ + 50, + 80, + 102.5, + 125, + 140, + 155, + 166.25, + 177.5, + 188.75, + 200, + 211.25, + 222.5, + 233.75, + 245, + 256.25 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 0.08, + 0.085, + 0.09, + 0.095, + 0.1, + 0.104, + 0.108, + 0.112, + 0.116, + 0.12, + 0.124, + 0.128, + 0.132, + 0.136, + 0.14 + ], + [ + 80, + 128, + 164, + 200, + 224, + 248, + 266, + 284, + 302, + 320, + 338, + 356, + 374, + 392, + 410 + ], + [ + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ] + ] + }, + { + "pointId": "1110003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 0.09, + 0.095625, + 0.10125, + 0.106875, + 0.1125, + 0.117, + 0.1215, + 0.126, + 0.1305, + 0.135, + 0.1395, + 0.144, + 0.1485, + 0.153, + 0.1575 + ], + [ + 90, + 144, + 184.5, + 225, + 252, + 279, + 299.25, + 319.5, + 339.75, + 360, + 380.25, + 400.5, + 420.75, + 441, + 461.25 + ] + ] + }, + { + "pointId": "1110004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 0.024, + 0.0255, + 0.027, + 0.0285, + 0.03, + 0.0312, + 0.0324, + 0.0336, + 0.0348, + 0.036, + 0.0372, + 0.0384, + 0.0396, + 0.0408, + 0.042 + ], + [ + 24, + 38.4, + 49.2, + 60, + 67.2, + 74.4, + 79.8, + 85.2, + 90.6, + 96, + 101.4, + 106.8, + 112.2, + 117.6, + 123 + ], + [ + 0.03, + 0.031875, + 0.03375, + 0.035625, + 0.0375, + 0.039, + 0.0405, + 0.042, + 0.0435, + 0.045, + 0.0465, + 0.048, + 0.0495, + 0.051, + 0.0525 + ], + [ + 30, + 48, + 61.5, + 75, + 84, + 93, + 99.75, + 106.5, + 113.25, + 120, + 126.75, + 133.5, + 140.25, + 147, + 153.75 + ] + ] + }, + { + "pointId": "1110007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 2 + ] + ] + }, + { + "pointId": "1110101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1110102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1110103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1110201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "def_": 0.05 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "eff_res_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "def_": 0.075 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "eff_res_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "def_": 0.1 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1110210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "hp_": 0.08 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 67.2, + "add": 3.36 + }, + "def": { + "base": 75, + "add": 3.75 + }, + "hp": { + "base": 144, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 94.08, + "add": 3.36 + }, + "def": { + "base": 105, + "add": 3.75 + }, + "hp": { + "base": 201.6, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 120.96, + "add": 3.36 + }, + "def": { + "base": 135, + "add": 3.75 + }, + "hp": { + "base": 259.2, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 147.84, + "add": 3.36 + }, + "def": { + "base": 165, + "add": 3.75 + }, + "hp": { + "base": 316.8, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 174.72, + "add": 3.36 + }, + "def": { + "base": 195, + "add": 3.75 + }, + "hp": { + "base": 374.4, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 201.6, + "add": 3.36 + }, + "def": { + "base": 225, + "add": 3.75 + }, + "hp": { + "base": 432, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 228.48, + "add": 3.36 + }, + "def": { + "base": 255, + "add": 3.75 + }, + "hp": { + "base": 489.6, + "add": 7.2 + }, + "spd": 100, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.5, + 0.2 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 1 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.03, + 1 + ] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 0.06, + 0.3 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/RuanMei.json b/libs/sr-stats/Data/Characters/RuanMei.json new file mode 100644 index 0000000000..690fac3356 --- /dev/null +++ b/libs/sr-stats/Data/Characters/RuanMei.json @@ -0,0 +1,540 @@ +{ + "rarity": 5, + "damageType": "Ice", + "path": "Harmony", + "skillTreeList": [ + { + "pointId": "1303001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1303002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.16, + 0.176, + 0.192, + 0.208, + 0.224, + 0.24, + 0.26, + 0.28, + 0.3, + 0.32, + 0.336, + 0.352, + 0.368, + 0.384, + 0.4 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3 + ] + ] + }, + { + "pointId": "1303003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.15, + 0.16, + 0.17, + 0.18, + 0.19, + 0.2, + 0.2125, + 0.225, + 0.2375, + 0.25, + 0.26, + 0.27, + 0.28, + 0.29, + 0.3 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.3, + 0.32, + 0.34, + 0.36, + 0.38, + 0.4, + 0.425, + 0.45, + 0.475, + 0.5, + 0.52, + 0.54, + 0.56, + 0.58, + 0.6 + ] + ] + }, + { + "pointId": "1303004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 0.08, + 0.082, + 0.084, + 0.086, + 0.088, + 0.09, + 0.0925, + 0.095, + 0.0975, + 0.1, + 0.102, + 0.104, + 0.106, + 0.108, + 0.11 + ], + [ + 0.6, + 0.66, + 0.72, + 0.78, + 0.84, + 0.9, + 0.975, + 1.05, + 1.125, + 1.2, + 1.26, + 1.32, + 1.38, + 1.44, + 1.5 + ] + ] + }, + { + "pointId": "1303007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 20 + ] + ] + }, + { + "pointId": "1303101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1303102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1303103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1303201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "brEff_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "def_": 0.05 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "brEff_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "spd": 2 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "brEff_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "def_": 0.075 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "brEff_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "spd": 3 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "def_": 0.1 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1303210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "brEff_": 0.107 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 89.76, + "add": 4.488 + }, + "def": { + "base": 66, + "add": 3.3 + }, + "hp": { + "base": 147.84, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 125.664, + "add": 4.488 + }, + "def": { + "base": 92.4, + "add": 3.3 + }, + "hp": { + "base": 206.976, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 161.568, + "add": 4.488 + }, + "def": { + "base": 118.8, + "add": 3.3 + }, + "hp": { + "base": 266.112, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 197.472, + "add": 4.488 + }, + "def": { + "base": 145.2, + "add": 3.3 + }, + "hp": { + "base": 325.248, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 233.376, + "add": 4.488 + }, + "def": { + "base": 171.6, + "add": 3.3 + }, + "hp": { + "base": 384.384, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 269.28, + "add": 4.488 + }, + "def": { + "base": 198, + "add": 3.3 + }, + "hp": { + "base": 443.52, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 305.184, + "add": 4.488 + }, + "def": { + "base": 224.4, + "add": 3.3 + }, + "hp": { + "base": 502.656, + "add": 7.392 + }, + "spd": 104, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.2 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.4 + ] + }, + "3": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 1, + 3 + ] + }, + "5": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 1, + 2 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/TopazAndNumby.json b/libs/sr-stats/Data/Characters/TopazAndNumby.json new file mode 100644 index 0000000000..50bb0bd8a4 --- /dev/null +++ b/libs/sr-stats/Data/Characters/TopazAndNumby.json @@ -0,0 +1,517 @@ +{ + "rarity": 5, + "damageType": "Fire", + "path": "TheHunt", + "skillTreeList": [ + { + "pointId": "1112001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1112002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.75, + 0.825, + 0.9, + 0.975, + 1.05, + 1.125, + 1.21875, + 1.3125, + 1.40625, + 1.5, + 1.575, + 1.65, + 1.725, + 1.8, + 1.875 + ], + [ + 0.25, + 0.275, + 0.3, + 0.325, + 0.35, + 0.375, + 0.40625, + 0.4375, + 0.46875, + 0.5, + 0.525, + 0.55, + 0.575, + 0.6, + 0.625 + ] + ] + }, + { + "pointId": "1112003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 0.75, + 0.825, + 0.9, + 0.975, + 1.05, + 1.125, + 1.21875, + 1.3125, + 1.40625, + 1.5, + 1.575, + 1.65, + 1.725, + 1.8, + 1.875 + ], + [ + 0.125, + 0.1375, + 0.15, + 0.1625, + 0.175, + 0.1875, + 0.203125, + 0.21875, + 0.234375, + 0.25, + 0.2625, + 0.275, + 0.2875, + 0.3, + 0.3125 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ] + }, + { + "pointId": "1112004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80 + ], + [ + 0.75, + 0.825, + 0.9, + 0.975, + 1.05, + 1.125, + 1.21875, + 1.3125, + 1.40625, + 1.5, + 1.575, + 1.65, + 1.725, + 1.8, + 1.875 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "pointId": "1112007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 60 + ], + [ + 10000 + ] + ] + }, + { + "pointId": "1112101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1112102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1112103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1112201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "fire_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "crit_": 0.027 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "fire_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "fire_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "crit_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "fire_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "crit_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1112210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "fire_dmg_": 0.064 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 84.48, + "add": 4.224 + }, + "def": { + "base": 56.1, + "add": 2.805 + }, + "hp": { + "base": 126.72, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 118.272, + "add": 4.224 + }, + "def": { + "base": 78.54, + "add": 2.805 + }, + "hp": { + "base": 177.408, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 152.064, + "add": 4.224 + }, + "def": { + "base": 100.98, + "add": 2.805 + }, + "hp": { + "base": 228.096, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 185.856, + "add": 4.224 + }, + "def": { + "base": 123.42, + "add": 2.805 + }, + "hp": { + "base": 278.784, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 219.648, + "add": 4.224 + }, + "def": { + "base": 145.86, + "add": 2.805 + }, + "hp": { + "base": 329.472, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 253.44, + "add": 4.224 + }, + "def": { + "base": 168.3, + "add": 2.805 + }, + "hp": { + "base": 380.16, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + }, + { + "atk": { + "base": 287.232, + "add": 4.224 + }, + "def": { + "base": 190.74, + "add": 2.805 + }, + "hp": { + "base": 430.848, + "add": 6.336 + }, + "spd": 110, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 75 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.25, + 2 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 5 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.2 + ] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 1, + 0.1 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Xueyi.json b/libs/sr-stats/Data/Characters/Xueyi.json new file mode 100644 index 0000000000..6dad418e90 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Xueyi.json @@ -0,0 +1,496 @@ +{ + "rarity": 4, + "damageType": "Quantum", + "path": "Destruction", + "skillTreeList": [ + { + "pointId": "1214001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1214002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 0.7, + 0.77, + 0.84, + 0.91, + 0.98, + 1.05, + 1.1375, + 1.225, + 1.3125, + 1.4, + 1.47, + 1.54, + 1.61, + 1.68, + 1.75 + ], + [ + 0.35, + 0.385, + 0.42, + 0.455, + 0.49, + 0.525, + 0.56875, + 0.6125, + 0.65625, + 0.7, + 0.735, + 0.77, + 0.805, + 0.84, + 0.875 + ] + ] + }, + { + "pointId": "1214003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 1.5, + 1.6, + 1.7, + 1.8, + 1.9, + 2, + 2.125, + 2.25, + 2.375, + 2.5, + 2.6, + 2.7, + 2.8, + 2.9, + 3 + ], + [ + 0.09, + 0.096, + 0.102, + 0.108, + 0.114, + 0.12, + 0.1275, + 0.135, + 0.1425, + 0.15, + 0.156, + 0.162, + 0.168, + 0.174, + 0.18 + ], + [ + 0.36, + 0.384, + 0.408, + 0.432, + 0.456, + 0.48, + 0.51, + 0.54, + 0.57, + 0.6, + 0.624, + 0.648, + 0.672, + 0.696, + 0.72 + ] + ] + }, + { + "pointId": "1214004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ], + [ + 0.45, + 0.495, + 0.54, + 0.585, + 0.63, + 0.675, + 0.73125, + 0.7875, + 0.84375, + 0.9, + 0.945, + 0.99, + 1.035, + 1.08, + 1.125 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + }, + { + "pointId": "1214007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 0.8 + ] + ] + }, + { + "pointId": "1214101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1214102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1214103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1214201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "brEff_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "brEff_": 0.053 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "quantum_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "brEff_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "brEff_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "quantum_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "hp_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1214210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "brEff_": 0.107 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 81.6, + "add": 4.08 + }, + "def": { + "base": 54, + "add": 2.7 + }, + "hp": { + "base": 144, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 114.24, + "add": 4.08 + }, + "def": { + "base": 75.6, + "add": 2.7 + }, + "hp": { + "base": 201.6, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 146.88, + "add": 4.08 + }, + "def": { + "base": 97.2, + "add": 2.7 + }, + "hp": { + "base": 259.2, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 179.52, + "add": 4.08 + }, + "def": { + "base": 118.8, + "add": 2.7 + }, + "hp": { + "base": 316.8, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 212.16, + "add": 4.08 + }, + "def": { + "base": 140.4, + "add": 2.7 + }, + "hp": { + "base": 374.4, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 244.8, + "add": 4.08 + }, + "def": { + "base": 162, + "add": 2.7 + }, + "hp": { + "base": 432, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + }, + { + "atk": { + "base": 277.44, + "add": 4.08 + }, + "def": { + "base": 183.6, + "add": 2.7 + }, + "hp": { + "base": 489.6, + "add": 7.2 + }, + "spd": 103, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 125 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.4 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 0.05 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.4, + 2 + ] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 6 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Characters/Yukong.json b/libs/sr-stats/Data/Characters/Yukong.json new file mode 100644 index 0000000000..9d849d58d1 --- /dev/null +++ b/libs/sr-stats/Data/Characters/Yukong.json @@ -0,0 +1,502 @@ +{ + "rarity": 4, + "damageType": "Imaginary", + "path": "Harmony", + "skillTreeList": [ + { + "pointId": "1207001", + "anchor": "Point01", + "pointType": 2, + "skillParamList": [ + [ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3 + ] + ] + }, + { + "pointId": "1207002", + "anchor": "Point02", + "pointType": 2, + "skillParamList": [ + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + [ + 0.4, + 0.44, + 0.48, + 0.52, + 0.56, + 0.6, + 0.65, + 0.7, + 0.75, + 0.8, + 0.84, + 0.88, + 0.92, + 0.96, + 1 + ] + ] + }, + { + "pointId": "1207003", + "anchor": "Point03", + "pointType": 2, + "skillParamList": [ + [ + 2.28, + 2.432, + 2.584, + 2.736, + 2.888, + 3.04, + 3.23, + 3.42, + 3.61, + 3.8, + 3.952, + 4.104, + 4.256, + 4.408, + 4.56 + ], + [ + 0.21, + 0.217, + 0.224, + 0.231, + 0.238, + 0.245, + 0.25375, + 0.2625, + 0.27125, + 0.28, + 0.287, + 0.294, + 0.301, + 0.308, + 0.315 + ], + [ + 0.39, + 0.416, + 0.442, + 0.468, + 0.494, + 0.52, + 0.5525, + 0.585, + 0.6175, + 0.65, + 0.676, + 0.702, + 0.728, + 0.754, + 0.78 + ] + ] + }, + { + "pointId": "1207004", + "anchor": "Point04", + "pointType": 2, + "skillParamList": [ + [ + 0.4, + 0.44, + 0.48, + 0.52, + 0.56, + 0.6, + 0.65, + 0.7, + 0.75, + 0.8, + 0.84, + 0.88, + 0.92, + 0.96, + 1 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + }, + { + "pointId": "1207007", + "anchor": "Point05", + "pointType": 2, + "skillParamList": [ + [ + 20 + ], + [ + 0.35 + ], + [ + 2 + ] + ] + }, + { + "pointId": "1207101", + "anchor": "Point06", + "pointType": 3 + }, + { + "pointId": "1207102", + "anchor": "Point07", + "pointType": 3 + }, + { + "pointId": "1207103", + "anchor": "Point08", + "pointType": 3 + }, + { + "pointId": "1207201", + "anchor": "Point09", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207202", + "anchor": "Point10", + "levels": [ + { + "stats": { + "hp_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207203", + "anchor": "Point11", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.032 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207204", + "anchor": "Point12", + "levels": [ + { + "stats": { + "atk_": 0.04 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207205", + "anchor": "Point13", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207206", + "anchor": "Point14", + "levels": [ + { + "stats": { + "hp_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207207", + "anchor": "Point15", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.048 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207208", + "anchor": "Point16", + "levels": [ + { + "stats": { + "atk_": 0.06 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207209", + "anchor": "Point17", + "levels": [ + { + "stats": { + "hp_": 0.08 + } + } + ], + "pointType": 1 + }, + { + "pointId": "1207210", + "anchor": "Point18", + "levels": [ + { + "stats": { + "imaginary_dmg_": 0.064 + } + } + ], + "pointType": 1 + } + ], + "ascension": [ + { + "atk": { + "base": 81.6, + "add": 4.08 + }, + "def": { + "base": 51, + "add": 2.55 + }, + "hp": { + "base": 124.8, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 114.24, + "add": 4.08 + }, + "def": { + "base": 71.4, + "add": 2.55 + }, + "hp": { + "base": 174.72, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 146.88, + "add": 4.08 + }, + "def": { + "base": 91.8, + "add": 2.55 + }, + "hp": { + "base": 224.64, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 179.52, + "add": 4.08 + }, + "def": { + "base": 112.2, + "add": 2.55 + }, + "hp": { + "base": 274.56, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 212.16, + "add": 4.08 + }, + "def": { + "base": 132.6, + "add": 2.55 + }, + "hp": { + "base": 324.48, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 244.8, + "add": 4.08 + }, + "def": { + "base": 153, + "add": 2.55 + }, + "hp": { + "base": 374.4, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + }, + { + "atk": { + "base": 277.44, + "add": 4.08 + }, + "def": { + "base": 173.4, + "add": 2.55 + }, + "hp": { + "base": 424.32, + "add": 6.24 + }, + "spd": 107, + "crit_": 0.05, + "crit_dmg_": 0.5, + "taunt": 100 + } + ], + "rankMap": { + "1": { + "skillTypeAddLevel": {}, + "params": [ + 0.1, + 2 + ] + }, + "2": { + "skillTypeAddLevel": {}, + "params": [ + 5 + ] + }, + "3": { + "skillTypeAddLevel": { + "basic": 1, + "skill": 2 + }, + "params": [] + }, + "4": { + "skillTypeAddLevel": {}, + "params": [ + 0.3 + ] + }, + "5": { + "skillTypeAddLevel": { + "ult": 2, + "talent": 2 + }, + "params": [] + }, + "6": { + "skillTypeAddLevel": {}, + "params": [ + 1 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/ASecretVow.json b/libs/sr-stats/Data/LightCone/ASecretVow.json index bea0294ebd..8173b21959 100644 --- a/libs/sr-stats/Data/LightCone/ASecretVow.json +++ b/libs/sr-stats/Data/LightCone/ASecretVow.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -111,6 +112,7 @@ 0.40000000037252903 ], [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -120,6 +122,7 @@ ], "passiveStats": { "physical_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -127,6 +130,7 @@ 0.40000000037252903 ], "fire_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -134,6 +138,7 @@ 0.40000000037252903 ], "ice_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -141,6 +146,7 @@ 0.40000000037252903 ], "wind_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -148,6 +154,7 @@ 0.40000000037252903 ], "lightning_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -155,6 +162,7 @@ 0.40000000037252903 ], "quantum_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -162,6 +170,7 @@ 0.40000000037252903 ], "imaginary_dmg_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, diff --git a/libs/sr-stats/Data/LightCone/Adversarial.json b/libs/sr-stats/Data/LightCone/Adversarial.json index d3a52e411b..40f0d57f50 100644 --- a/libs/sr-stats/Data/LightCone/Adversarial.json +++ b/libs/sr-stats/Data/LightCone/Adversarial.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.10000000009313226, 0.12000000011175871, 0.14000000013038516, @@ -111,6 +112,7 @@ 0.18000000016763806 ], [ + -1, 2, 2, 2, diff --git a/libs/sr-stats/Data/LightCone/Amber.json b/libs/sr-stats/Data/LightCone/Amber.json index ed0d30fbaf..b69ea29ad7 100644 --- a/libs/sr-stats/Data/LightCone/Amber.json +++ b/libs/sr-stats/Data/LightCone/Amber.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.5000000004656613, 0.5000000004656613, 0.5000000004656613, @@ -118,6 +120,7 @@ 0.5000000004656613 ], [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -127,6 +130,7 @@ ], "passiveStats": { "def_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/AnInstantBeforeAGaze.json b/libs/sr-stats/Data/LightCone/AnInstantBeforeAGaze.json new file mode 100644 index 0000000000..bdb06f48e5 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/AnInstantBeforeAGaze.json @@ -0,0 +1,142 @@ +{ + "rarity": 5, + "path": "Erudition", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 21, + "add": 3.1500000001396984 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 46.200000000186265, + "add": 3.1500000001396984 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 79.80000000074506, + "add": 3.1500000001396984 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 113.40000000037253, + "add": 3.1500000001396984 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 147, + "add": 3.1500000001396984 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 180.6000000005588, + "add": 3.1500000001396984 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 214.20000000018626, + "add": 3.1500000001396984 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.3600000003352761, + 0.4200000003911555, + 0.48000000044703484, + 0.5400000005029142, + 0.6000000005587935 + ], + [ + -1, + 0.0036000001709908247, + 0.0042, + 0.0048, + 0.005399999907240272, + 0.005999999586492777 + ], + [ + -1, + 180, + 180, + 180, + 180, + 180 + ] + ], + "passiveStats": { + "crit_dmg_": [ + -1, + 0.3600000003352761, + 0.4200000003911555, + 0.48000000044703484, + 0.5400000005029142, + 0.6000000005587935 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/Arrows.json b/libs/sr-stats/Data/LightCone/Arrows.json index 38ef0977cb..6dd3eb52d6 100644 --- a/libs/sr-stats/Data/LightCone/Arrows.json +++ b/libs/sr-stats/Data/LightCone/Arrows.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -111,6 +112,7 @@ 0.24000000022351742 ], [ + -1, 3, 3, 3, diff --git a/libs/sr-stats/Data/LightCone/BaptismOfPureThought.json b/libs/sr-stats/Data/LightCone/BaptismOfPureThought.json new file mode 100644 index 0000000000..fbece4e8e9 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/BaptismOfPureThought.json @@ -0,0 +1,166 @@ +{ + "rarity": 5, + "path": "TheHunt", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 24, + "add": 3.6000000005587935 + }, + "hp": { + "base": 43.200000000186265, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 52.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 95.04000000003725, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 91.20000000018626, + "add": 3.6000000005587935 + }, + "hp": { + "base": 164.160000000149, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 129.6000000005588, + "add": 3.6000000005587935 + }, + "hp": { + "base": 233.28000000026077, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 168, + "add": 3.6000000005587935 + }, + "hp": { + "base": 302.40000000037253, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 206.40000000037253, + "add": 3.6000000005587935 + }, + "hp": { + "base": 371.5200000004843, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 244.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 440.64000000059605, + "add": 6.480000000447035 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.20000000018626451, + 0.2300000002142042, + 0.26000000024214387, + 0.29000000027008355, + 0.3200000002980232 + ], + [ + -1, + 0.0800000000745058, + 0.09000000008381903, + 0.10000000009313226, + 0.11000000010244548, + 0.12000000011175871 + ], + [ + -1, + 3, + 3, + 3, + 3, + 3 + ], + [ + -1, + 0.3600000003352761, + 0.4200000003911555, + 0.48000000044703484, + 0.5400000005029142, + 0.6000000005587935 + ], + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ] + ], + "passiveStats": { + "crit_dmg_": [ + -1, + 0.20000000018626451, + 0.2300000002142042, + 0.26000000024214387, + 0.29000000027008355, + 0.3200000002980232 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/BeforeDawn.json b/libs/sr-stats/Data/LightCone/BeforeDawn.json index c8535eeed6..edca1c4f48 100644 --- a/libs/sr-stats/Data/LightCone/BeforeDawn.json +++ b/libs/sr-stats/Data/LightCone/BeforeDawn.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.3600000003352761, 0.4200000003911555, 0.48000000044703484, @@ -111,6 +112,7 @@ 0.6000000005587935 ], [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, @@ -118,6 +120,7 @@ 0.3000000002793968 ], [ + -1, 0.48000000044703484, 0.5600000005215406, 0.6400000005960464, @@ -127,6 +130,7 @@ ], "passiveStats": { "crit_dmg_": [ + -1, 0.3600000003352761, 0.4200000003911555, 0.48000000044703484, diff --git a/libs/sr-stats/Data/LightCone/BeforeTheTutorialMissionStarts.json b/libs/sr-stats/Data/LightCone/BeforeTheTutorialMissionStarts.json new file mode 100644 index 0000000000..19448671a4 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/BeforeTheTutorialMissionStarts.json @@ -0,0 +1,134 @@ +{ + "rarity": 4, + "path": "Nihility", + "ascension": [ + { + "atk": { + "base": 21.600000000558794, + "add": 3.2400000002235174 + }, + "def": { + "base": 15, + "add": 2.2500000002328306 + }, + "hp": { + "base": 43.200000000186265, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 47.52000000048429, + "add": 3.2400000002235174 + }, + "def": { + "base": 33, + "add": 2.2500000002328306 + }, + "hp": { + "base": 95.04000000003725, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 82.0800000000745, + "add": 3.2400000002235174 + }, + "def": { + "base": 57, + "add": 2.2500000002328306 + }, + "hp": { + "base": 164.160000000149, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 116.64000000059605, + "add": 3.2400000002235174 + }, + "def": { + "base": 81, + "add": 2.2500000002328306 + }, + "hp": { + "base": 233.28000000026077, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 151.20000000018626, + "add": 3.2400000002235174 + }, + "def": { + "base": 105, + "add": 2.2500000002328306 + }, + "hp": { + "base": 302.40000000037253, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 185.7600000007078, + "add": 3.2400000002235174 + }, + "def": { + "base": 129, + "add": 2.2500000002328306 + }, + "hp": { + "base": 371.5200000004843, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 220.32000000029802, + "add": 3.2400000002235174 + }, + "def": { + "base": 153, + "add": 2.2500000002328306 + }, + "hp": { + "base": 440.64000000059605, + "add": 6.480000000447035 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.20000000018626451, + 0.25000000023283064, + 0.3000000002793968, + 0.3500000003259629, + 0.40000000037252903 + ], + [ + -1, + 4, + 5, + 6, + 7, + 8 + ] + ], + "passiveStats": { + "eff_": [ + -1, + 0.20000000018626451, + 0.25000000023283064, + 0.3000000002793968, + 0.3500000003259629, + 0.40000000037252903 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/BrighterThanTheSun.json b/libs/sr-stats/Data/LightCone/BrighterThanTheSun.json new file mode 100644 index 0000000000..38a2bbd04b --- /dev/null +++ b/libs/sr-stats/Data/LightCone/BrighterThanTheSun.json @@ -0,0 +1,158 @@ +{ + "rarity": 5, + "path": "Destruction", + "ascension": [ + { + "atk": { + "base": 28.800000000745058, + "add": 4.320000000298023 + }, + "def": { + "base": 18, + "add": 2.700000000651926 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 63.360000000335276, + "add": 4.320000000298023 + }, + "def": { + "base": 39.60000000055879, + "add": 2.700000000651926 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 109.44000000040978, + "add": 4.320000000298023 + }, + "def": { + "base": 68.40000000037253, + "add": 2.700000000651926 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 155.5200000004843, + "add": 4.320000000298023 + }, + "def": { + "base": 97.20000000018626, + "add": 2.700000000651926 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 201.6000000005588, + "add": 4.320000000298023 + }, + "def": { + "base": 126, + "add": 2.700000000651926 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 247.6800000006333, + "add": 4.320000000298023 + }, + "def": { + "base": 154.80000000074506, + "add": 2.700000000651926 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 293.7600000007078, + "add": 4.320000000298023 + }, + "def": { + "base": 183.6000000005588, + "add": 2.700000000651926 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ], + [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ], + [ + -1, + 0.060000000055879354, + 0.07000000006519258, + 0.0800000000745058, + 0.09000000008381903, + 0.10000000009313226 + ] + ], + "passiveStats": { + "crit_": [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/ButTheBattleIsntOver.json b/libs/sr-stats/Data/LightCone/ButTheBattleIsntOver.json index 4beb5a0886..253924341f 100644 --- a/libs/sr-stats/Data/LightCone/ButTheBattleIsntOver.json +++ b/libs/sr-stats/Data/LightCone/ButTheBattleIsntOver.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.10000000009313226, 0.12000000011175871, 0.14000000013038516, @@ -111,6 +112,7 @@ 0.18000000016763806 ], [ + -1, 0.3000000002793968, 0.3500000003259629, 0.40000000037252903, @@ -118,6 +120,7 @@ 0.5000000004656613 ], [ + -1, 1, 1, 1, @@ -127,6 +130,7 @@ ], "passiveStats": { "enerRegen_": [ + -1, 0.10000000009313226, 0.12000000011175871, 0.14000000013038516, diff --git a/libs/sr-stats/Data/LightCone/CarveTheMoonWeaveTheClouds.json b/libs/sr-stats/Data/LightCone/CarveTheMoonWeaveTheClouds.json index f7f563f0c6..953f8291f3 100644 --- a/libs/sr-stats/Data/LightCone/CarveTheMoonWeaveTheClouds.json +++ b/libs/sr-stats/Data/LightCone/CarveTheMoonWeaveTheClouds.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.10000000009313226, 0.12499999976716936, 0.1500000001396984, @@ -111,6 +112,7 @@ 0.20000000018626451 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -118,6 +120,7 @@ 0.24000000022351742 ], [ + -1, 0.060000000055879354, 0.07499999972060323, 0.09000000008381903, diff --git a/libs/sr-stats/Data/LightCone/Chorus.json b/libs/sr-stats/Data/LightCone/Chorus.json index 26e7c7d790..369d62dd15 100644 --- a/libs/sr-stats/Data/LightCone/Chorus.json +++ b/libs/sr-stats/Data/LightCone/Chorus.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.09000000008381903, 0.10000000009313226, diff --git a/libs/sr-stats/Data/LightCone/CollapsingSky.json b/libs/sr-stats/Data/LightCone/CollapsingSky.json index 098cc9144d..b7d4b1988f 100644 --- a/libs/sr-stats/Data/LightCone/CollapsingSky.json +++ b/libs/sr-stats/Data/LightCone/CollapsingSky.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, diff --git a/libs/sr-stats/Data/LightCone/Cornucopia.json b/libs/sr-stats/Data/LightCone/Cornucopia.json index 55c5e0fb23..21a822ebe2 100644 --- a/libs/sr-stats/Data/LightCone/Cornucopia.json +++ b/libs/sr-stats/Data/LightCone/Cornucopia.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/CruisingInTheStellarSea.json b/libs/sr-stats/Data/LightCone/CruisingInTheStellarSea.json index f7eb60aa66..52700106b8 100644 --- a/libs/sr-stats/Data/LightCone/CruisingInTheStellarSea.json +++ b/libs/sr-stats/Data/LightCone/CruisingInTheStellarSea.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -111,6 +112,7 @@ 0.1600000001490116 ], [ + -1, 0.5000000004656613, 0.5000000004656613, 0.5000000004656613, @@ -118,6 +120,7 @@ 0.5000000004656613 ], [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -125,6 +128,7 @@ 0.1600000001490116 ], [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -132,6 +136,7 @@ 0.40000000037252903 ], [ + -1, 2, 2, 2, @@ -141,6 +146,7 @@ ], "passiveStats": { "crit_": [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, diff --git a/libs/sr-stats/Data/LightCone/DanceDanceDance.json b/libs/sr-stats/Data/LightCone/DanceDanceDance.json index 0d760de431..5d125fd031 100644 --- a/libs/sr-stats/Data/LightCone/DanceDanceDance.json +++ b/libs/sr-stats/Data/LightCone/DanceDanceDance.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.18000000016763806, 0.20000000018626451, diff --git a/libs/sr-stats/Data/LightCone/DartingArrow.json b/libs/sr-stats/Data/LightCone/DartingArrow.json index c8d47ae912..9a9c7a4532 100644 --- a/libs/sr-stats/Data/LightCone/DartingArrow.json +++ b/libs/sr-stats/Data/LightCone/DartingArrow.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -111,6 +112,7 @@ 0.48000000044703484 ], [ + -1, 3, 3, 3, diff --git a/libs/sr-stats/Data/LightCone/DataBank.json b/libs/sr-stats/Data/LightCone/DataBank.json index 8a81569180..0f0c4d1f70 100644 --- a/libs/sr-stats/Data/LightCone/DataBank.json +++ b/libs/sr-stats/Data/LightCone/DataBank.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.2800000002607703, 0.3500000003259629, 0.4200000003911555, diff --git a/libs/sr-stats/Data/LightCone/DayOneOfMyNewLife.json b/libs/sr-stats/Data/LightCone/DayOneOfMyNewLife.json index ee9505081c..174bdba607 100644 --- a/libs/sr-stats/Data/LightCone/DayOneOfMyNewLife.json +++ b/libs/sr-stats/Data/LightCone/DayOneOfMyNewLife.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.18000000016763806, 0.20000000018626451, @@ -111,6 +112,7 @@ 0.24000000022351742 ], [ + -1, 0.0800000000745058, 0.09000000008381903, 0.10000000009313226, @@ -120,6 +122,7 @@ ], "passiveStats": { "def_": [ + -1, 0.1600000001490116, 0.18000000016763806, 0.20000000018626451, diff --git a/libs/sr-stats/Data/LightCone/Defense.json b/libs/sr-stats/Data/LightCone/Defense.json index 1913195ea3..e0e6c71632 100644 --- a/libs/sr-stats/Data/LightCone/Defense.json +++ b/libs/sr-stats/Data/LightCone/Defense.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/EchoesOfTheCoffin.json b/libs/sr-stats/Data/LightCone/EchoesOfTheCoffin.json new file mode 100644 index 0000000000..b8e32cedfc --- /dev/null +++ b/libs/sr-stats/Data/LightCone/EchoesOfTheCoffin.json @@ -0,0 +1,150 @@ +{ + "rarity": 5, + "path": "Abundance", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 18, + "add": 2.700000000651926 + }, + "hp": { + "base": 52.80000000074506, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 39.60000000055879, + "add": 2.700000000651926 + }, + "hp": { + "base": 116.16000000014901, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 68.40000000037253, + "add": 2.700000000651926 + }, + "hp": { + "base": 200.64000000059605, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 97.20000000018626, + "add": 2.700000000651926 + }, + "hp": { + "base": 285.12000000011176, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 126, + "add": 2.700000000651926 + }, + "hp": { + "base": 369.6000000005588, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 154.80000000074506, + "add": 2.700000000651926 + }, + "hp": { + "base": 454.0800000000745, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 183.6000000005588, + "add": 2.700000000651926 + }, + "hp": { + "base": 538.5600000005215, + "add": 7.920000000856817 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + [ + -1, + 12, + 14, + 16, + 18, + 20 + ], + [ + -1, + 3, + 3.5000000004656613, + 4, + 4.500000000465661, + 5 + ], + [ + -1, + 3, + 3, + 3, + 3, + 3 + ] + ], + "passiveStats": { + "atk_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/EyesOfThePrey.json b/libs/sr-stats/Data/LightCone/EyesOfThePrey.json index ccd442d115..09a64efa3f 100644 --- a/libs/sr-stats/Data/LightCone/EyesOfThePrey.json +++ b/libs/sr-stats/Data/LightCone/EyesOfThePrey.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -111,6 +112,7 @@ 0.40000000037252903 ], [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -120,6 +122,7 @@ ], "passiveStats": { "eff_": [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, diff --git a/libs/sr-stats/Data/LightCone/Fermata.json b/libs/sr-stats/Data/LightCone/Fermata.json index 771f248e62..fa1498e3b4 100644 --- a/libs/sr-stats/Data/LightCone/Fermata.json +++ b/libs/sr-stats/Data/LightCone/Fermata.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -120,6 +122,7 @@ ], "passiveStats": { "brEff_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/FineFruit.json b/libs/sr-stats/Data/LightCone/FineFruit.json index 2e9cdc8680..041516c64d 100644 --- a/libs/sr-stats/Data/LightCone/FineFruit.json +++ b/libs/sr-stats/Data/LightCone/FineFruit.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 6, 7.500000000465661, 9, diff --git a/libs/sr-stats/Data/LightCone/GeniusesRepose.json b/libs/sr-stats/Data/LightCone/GeniusesRepose.json index 8b8e173f9b..6c1f9790bd 100644 --- a/libs/sr-stats/Data/LightCone/GeniusesRepose.json +++ b/libs/sr-stats/Data/LightCone/GeniusesRepose.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -118,6 +120,7 @@ 0.48000000044703484 ], [ + -1, 3, 3, 3, @@ -127,6 +130,7 @@ ], "passiveStats": { "atk_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/GoodNightAndSleepWell.json b/libs/sr-stats/Data/LightCone/GoodNightAndSleepWell.json index 22006b392c..57e9f66dbe 100644 --- a/libs/sr-stats/Data/LightCone/GoodNightAndSleepWell.json +++ b/libs/sr-stats/Data/LightCone/GoodNightAndSleepWell.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -111,6 +112,7 @@ 0.24000000022351742 ], [ + -1, 3, 3, 3, diff --git a/libs/sr-stats/Data/LightCone/HeyOverHere.json b/libs/sr-stats/Data/LightCone/HeyOverHere.json new file mode 100644 index 0000000000..00c799c9b3 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/HeyOverHere.json @@ -0,0 +1,142 @@ +{ + "rarity": 4, + "path": "Abundance", + "ascension": [ + { + "atk": { + "base": 19.200000000186265, + "add": 2.880000000819564 + }, + "def": { + "base": 18, + "add": 2.700000000651926 + }, + "hp": { + "base": 43.200000000186265, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 42.24000000022352, + "add": 2.880000000819564 + }, + "def": { + "base": 39.60000000055879, + "add": 2.700000000651926 + }, + "hp": { + "base": 95.04000000003725, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 72.96000000089407, + "add": 2.880000000819564 + }, + "def": { + "base": 68.40000000037253, + "add": 2.700000000651926 + }, + "hp": { + "base": 164.160000000149, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 103.6800000006333, + "add": 2.880000000819564 + }, + "def": { + "base": 97.20000000018626, + "add": 2.700000000651926 + }, + "hp": { + "base": 233.28000000026077, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 134.40000000037253, + "add": 2.880000000819564 + }, + "def": { + "base": 126, + "add": 2.700000000651926 + }, + "hp": { + "base": 302.40000000037253, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 165.12000000011176, + "add": 2.880000000819564 + }, + "def": { + "base": 154.80000000074506, + "add": 2.700000000651926 + }, + "hp": { + "base": 371.5200000004843, + "add": 6.480000000447035 + } + }, + { + "atk": { + "base": 195.8400000007823, + "add": 2.880000000819564 + }, + "def": { + "base": 183.6000000005588, + "add": 2.700000000651926 + }, + "hp": { + "base": 440.64000000059605, + "add": 6.480000000447035 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.0800000000745058, + 0.09000000008381903, + 0.10000000009313226, + 0.11000000010244548, + 0.12000000011175871 + ], + [ + -1, + 0.1600000001490116, + 0.1900000001769513, + 0.22000000020489097, + 0.25000000023283064, + 0.2800000002607703 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ] + ], + "passiveStats": { + "hp_": [ + -1, + 0.0800000000745058, + 0.09000000008381903, + 0.10000000009313226, + 0.11000000010244548, + 0.12000000011175871 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/HiddenShadow.json b/libs/sr-stats/Data/LightCone/HiddenShadow.json index 89833fbe43..c2723e0d50 100644 --- a/libs/sr-stats/Data/LightCone/HiddenShadow.json +++ b/libs/sr-stats/Data/LightCone/HiddenShadow.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.6000000005587935, 0.7500000006984919, 0.9000000008381903, diff --git a/libs/sr-stats/Data/LightCone/IShallBeMyOwnSword.json b/libs/sr-stats/Data/LightCone/IShallBeMyOwnSword.json new file mode 100644 index 0000000000..120d6d1993 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/IShallBeMyOwnSword.json @@ -0,0 +1,150 @@ +{ + "rarity": 5, + "path": "Destruction", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 18, + "add": 2.700000000651926 + }, + "hp": { + "base": 52.80000000074506, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 39.60000000055879, + "add": 2.700000000651926 + }, + "hp": { + "base": 116.16000000014901, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 68.40000000037253, + "add": 2.700000000651926 + }, + "hp": { + "base": 200.64000000059605, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 97.20000000018626, + "add": 2.700000000651926 + }, + "hp": { + "base": 285.12000000011176, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 126, + "add": 2.700000000651926 + }, + "hp": { + "base": 369.6000000005588, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 154.80000000074506, + "add": 2.700000000651926 + }, + "hp": { + "base": 454.0800000000745, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 183.6000000005588, + "add": 2.700000000651926 + }, + "hp": { + "base": 538.5600000005215, + "add": 7.920000000856817 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.20000000018626451, + 0.2300000002142042, + 0.26000000024214387, + 0.29000000027008355, + 0.3200000002980232 + ], + [ + -1, + 3, + 3, + 3, + 3, + 3 + ], + [ + -1, + 0.14000000013038516, + 0.16499999980442226, + 0.1900000001769513, + 0.2149999998509884, + 0.24000000022351742 + ], + [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ] + ], + "passiveStats": { + "crit_dmg_": [ + -1, + 0.20000000018626451, + 0.2300000002142042, + 0.26000000024214387, + 0.29000000027008355, + 0.3200000002980232 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/InTheNameOfTheWorld.json b/libs/sr-stats/Data/LightCone/InTheNameOfTheWorld.json index ffd6fffba0..bd8f9a96cb 100644 --- a/libs/sr-stats/Data/LightCone/InTheNameOfTheWorld.json +++ b/libs/sr-stats/Data/LightCone/InTheNameOfTheWorld.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -111,6 +112,7 @@ 0.40000000037252903 ], [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, @@ -118,6 +120,7 @@ 0.3000000002793968 ], [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, diff --git a/libs/sr-stats/Data/LightCone/InTheNight.json b/libs/sr-stats/Data/LightCone/InTheNight.json index b8b3ac349a..469fef11a9 100644 --- a/libs/sr-stats/Data/LightCone/InTheNight.json +++ b/libs/sr-stats/Data/LightCone/InTheNight.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3000000002793968 ], [ + -1, 10, 10, 10, @@ -118,6 +120,7 @@ 10 ], [ + -1, 0.060000000055879354, 0.07000000006519258, 0.0800000000745058, @@ -125,6 +128,7 @@ 0.10000000009313226 ], [ + -1, 0.12000000011175871, 0.14000000013038516, 0.1600000001490116, @@ -132,6 +136,7 @@ 0.20000000018626451 ], [ + -1, 6, 6, 6, @@ -141,6 +146,7 @@ ], "passiveStats": { "crit_": [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/IncessantRain.json b/libs/sr-stats/Data/LightCone/IncessantRain.json new file mode 100644 index 0000000000..f62d2d3633 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/IncessantRain.json @@ -0,0 +1,158 @@ +{ + "rarity": 5, + "path": "Nihility", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 21, + "add": 3.1500000001396984 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 46.200000000186265, + "add": 3.1500000001396984 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 79.80000000074506, + "add": 3.1500000001396984 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 113.40000000037253, + "add": 3.1500000001396984 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 147, + "add": 3.1500000001396984 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 180.6000000005588, + "add": 3.1500000001396984 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 214.20000000018626, + "add": 3.1500000001396984 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + [ + -1, + 1, + 1, + 1, + 1, + 1 + ], + [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ], + [ + -1, + 3, + 3, + 3, + 3, + 3 + ], + [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ] + ], + "passiveStats": { + "eff_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/LandausChoice.json b/libs/sr-stats/Data/LightCone/LandausChoice.json index cbe1a87ee7..c4b6900851 100644 --- a/libs/sr-stats/Data/LightCone/LandausChoice.json +++ b/libs/sr-stats/Data/LightCone/LandausChoice.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 2, 2, 2, @@ -111,6 +112,7 @@ 2 ], [ + -1, 0.1600000001490116, 0.18000000016763806, 0.20000000018626451, diff --git a/libs/sr-stats/Data/LightCone/Loop.json b/libs/sr-stats/Data/LightCone/Loop.json index 30e708a03b..b11ef3a301 100644 --- a/libs/sr-stats/Data/LightCone/Loop.json +++ b/libs/sr-stats/Data/LightCone/Loop.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, diff --git a/libs/sr-stats/Data/LightCone/MakeTheWorldClamor.json b/libs/sr-stats/Data/LightCone/MakeTheWorldClamor.json index 05e4521f23..d1b6cac9c0 100644 --- a/libs/sr-stats/Data/LightCone/MakeTheWorldClamor.json +++ b/libs/sr-stats/Data/LightCone/MakeTheWorldClamor.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.3200000002980232, 0.40000000037252903, 0.48000000044703484, @@ -111,6 +112,7 @@ 0.6400000005960464 ], [ + -1, 20, 23, 26, diff --git a/libs/sr-stats/Data/LightCone/Mediation.json b/libs/sr-stats/Data/LightCone/Mediation.json index dc5ca496c9..3a8cdc2379 100644 --- a/libs/sr-stats/Data/LightCone/Mediation.json +++ b/libs/sr-stats/Data/LightCone/Mediation.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 12, 14, 16, @@ -111,6 +112,7 @@ 20 ], [ + -1, 1, 1, 1, diff --git a/libs/sr-stats/Data/LightCone/MemoriesOfThePast.json b/libs/sr-stats/Data/LightCone/MemoriesOfThePast.json index f925770684..c1c6d55adb 100644 --- a/libs/sr-stats/Data/LightCone/MemoriesOfThePast.json +++ b/libs/sr-stats/Data/LightCone/MemoriesOfThePast.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.2800000002607703, 0.3500000003259629, 0.4200000003911555, @@ -111,6 +112,7 @@ 0.5600000005215406 ], [ + -1, 4, 5, 6, @@ -120,6 +122,7 @@ ], "passiveStats": { "brEff_": [ + -1, 0.2800000002607703, 0.3500000003259629, 0.4200000003911555, diff --git a/libs/sr-stats/Data/LightCone/MeshingCogs.json b/libs/sr-stats/Data/LightCone/MeshingCogs.json index d47c91f9e5..5a9b160093 100644 --- a/libs/sr-stats/Data/LightCone/MeshingCogs.json +++ b/libs/sr-stats/Data/LightCone/MeshingCogs.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 4, 5, 6, diff --git a/libs/sr-stats/Data/LightCone/MomentOfVictory.json b/libs/sr-stats/Data/LightCone/MomentOfVictory.json index 516a47340f..8b05726338 100644 --- a/libs/sr-stats/Data/LightCone/MomentOfVictory.json +++ b/libs/sr-stats/Data/LightCone/MomentOfVictory.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 2, 2, 2, @@ -111,6 +112,7 @@ 2 ], [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -118,6 +120,7 @@ 0.40000000037252903 ], [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -125,6 +128,7 @@ 0.40000000037252903 ], [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -134,6 +138,7 @@ ], "passiveStats": { "def_": [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -141,6 +146,7 @@ 0.40000000037252903 ], "eff_": [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, diff --git a/libs/sr-stats/Data/LightCone/Multiplication.json b/libs/sr-stats/Data/LightCone/Multiplication.json index 16d7ce9ebf..76af67c652 100644 --- a/libs/sr-stats/Data/LightCone/Multiplication.json +++ b/libs/sr-stats/Data/LightCone/Multiplication.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.14000000013038516, 0.1600000001490116, diff --git a/libs/sr-stats/Data/LightCone/MutualDemise.json b/libs/sr-stats/Data/LightCone/MutualDemise.json index 39a12fe90a..0838e35b19 100644 --- a/libs/sr-stats/Data/LightCone/MutualDemise.json +++ b/libs/sr-stats/Data/LightCone/MutualDemise.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.8000000007450581, 0.8000000007450581, 0.8000000007450581, @@ -111,6 +112,7 @@ 0.8000000007450581 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/NightOfFright.json b/libs/sr-stats/Data/LightCone/NightOfFright.json new file mode 100644 index 0000000000..0e248d2be2 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/NightOfFright.json @@ -0,0 +1,158 @@ +{ + "rarity": 5, + "path": "Abundance", + "ascension": [ + { + "atk": { + "base": 21.600000000558794, + "add": 3.2400000002235174 + }, + "def": { + "base": 24, + "add": 3.6000000005587935 + }, + "hp": { + "base": 52.80000000074506, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 47.52000000048429, + "add": 3.2400000002235174 + }, + "def": { + "base": 52.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 116.16000000014901, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 82.0800000000745, + "add": 3.2400000002235174 + }, + "def": { + "base": 91.20000000018626, + "add": 3.6000000005587935 + }, + "hp": { + "base": 200.64000000059605, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 116.64000000059605, + "add": 3.2400000002235174 + }, + "def": { + "base": 129.6000000005588, + "add": 3.6000000005587935 + }, + "hp": { + "base": 285.12000000011176, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 151.20000000018626, + "add": 3.2400000002235174 + }, + "def": { + "base": 168, + "add": 3.6000000005587935 + }, + "hp": { + "base": 369.6000000005588, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 185.7600000007078, + "add": 3.2400000002235174 + }, + "def": { + "base": 206.40000000037253, + "add": 3.6000000005587935 + }, + "hp": { + "base": 454.0800000000745, + "add": 7.920000000856817 + } + }, + { + "atk": { + "base": 220.32000000029802, + "add": 3.2400000002235174 + }, + "def": { + "base": 244.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 538.5600000005215, + "add": 7.920000000856817 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ], + [ + -1, + 0.10000000009313226, + 0.11000000010244548, + 0.12000000011175871, + 0.13000000012107193, + 0.14000000013038516 + ], + [ + -1, + 0.02399999974295497, + 0.027999999467283487, + 0.031999999890103936, + 0.035999999614432454, + 0.0400000000372529 + ], + [ + -1, + 5, + 5, + 5, + 5, + 5 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ] + ], + "passiveStats": { + "enerRegen_": [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/NightOnTheMilkyWay.json b/libs/sr-stats/Data/LightCone/NightOnTheMilkyWay.json index ec347bf04a..c437030c05 100644 --- a/libs/sr-stats/Data/LightCone/NightOnTheMilkyWay.json +++ b/libs/sr-stats/Data/LightCone/NightOnTheMilkyWay.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.3000000002793968, 0.3500000003259629, 0.40000000037252903, @@ -111,6 +112,7 @@ 0.5000000004656613 ], [ + -1, 0.09000000008381903, 0.1049999997485429, 0.12000000011175871, diff --git a/libs/sr-stats/Data/LightCone/NowhereToRun.json b/libs/sr-stats/Data/LightCone/NowhereToRun.json index 0c6840bc4c..ecb9399477 100644 --- a/libs/sr-stats/Data/LightCone/NowhereToRun.json +++ b/libs/sr-stats/Data/LightCone/NowhereToRun.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -111,6 +112,7 @@ 0.48000000044703484 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -120,6 +122,7 @@ ], "passiveStats": { "atk_": [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, diff --git a/libs/sr-stats/Data/LightCone/OnTheFallOfAnAeon.json b/libs/sr-stats/Data/LightCone/OnTheFallOfAnAeon.json index e4099d6946..6b43838db8 100644 --- a/libs/sr-stats/Data/LightCone/OnTheFallOfAnAeon.json +++ b/libs/sr-stats/Data/LightCone/OnTheFallOfAnAeon.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -111,6 +112,7 @@ 0.1600000001490116 ], [ + -1, 4, 4, 4, @@ -118,6 +120,7 @@ 4 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -125,6 +128,7 @@ 0.24000000022351742 ], [ + -1, 2, 2, 2, diff --git a/libs/sr-stats/Data/LightCone/OnlySilenceRemains.json b/libs/sr-stats/Data/LightCone/OnlySilenceRemains.json index 288a5b46e6..1eee3714a4 100644 --- a/libs/sr-stats/Data/LightCone/OnlySilenceRemains.json +++ b/libs/sr-stats/Data/LightCone/OnlySilenceRemains.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -120,6 +122,7 @@ ], "passiveStats": { "atk_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/Passkey.json b/libs/sr-stats/Data/LightCone/Passkey.json index b1c4fa6b83..741b1da468 100644 --- a/libs/sr-stats/Data/LightCone/Passkey.json +++ b/libs/sr-stats/Data/LightCone/Passkey.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 8, 9, 10, diff --git a/libs/sr-stats/Data/LightCone/PastAndFuture.json b/libs/sr-stats/Data/LightCone/PastAndFuture.json index 192767076e..895c52e4c0 100644 --- a/libs/sr-stats/Data/LightCone/PastAndFuture.json +++ b/libs/sr-stats/Data/LightCone/PastAndFuture.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 1, 1, 1, diff --git a/libs/sr-stats/Data/LightCone/PastSelfInMirror.json b/libs/sr-stats/Data/LightCone/PastSelfInMirror.json new file mode 100644 index 0000000000..25992e57b9 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/PastSelfInMirror.json @@ -0,0 +1,158 @@ +{ + "rarity": 5, + "path": "Harmony", + "ascension": [ + { + "atk": { + "base": 24, + "add": 3.6000000005587935 + }, + "def": { + "base": 24, + "add": 3.6000000005587935 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 52.80000000074506, + "add": 3.6000000005587935 + }, + "def": { + "base": 52.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 91.20000000018626, + "add": 3.6000000005587935 + }, + "def": { + "base": 91.20000000018626, + "add": 3.6000000005587935 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 129.6000000005588, + "add": 3.6000000005587935 + }, + "def": { + "base": 129.6000000005588, + "add": 3.6000000005587935 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 168, + "add": 3.6000000005587935 + }, + "def": { + "base": 168, + "add": 3.6000000005587935 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 206.40000000037253, + "add": 3.6000000005587935 + }, + "def": { + "base": 206.40000000037253, + "add": 3.6000000005587935 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 244.80000000074506, + "add": 3.6000000005587935 + }, + "def": { + "base": 244.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1 + ], + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + [ + -1, + 3, + 3, + 3, + 3, + 3 + ], + [ + -1, + 1.5000000004656613, + 1.5000000004656613, + 1.5000000004656613, + 1.5000000004656613, + 1.5000000004656613 + ], + [ + -1, + 10, + 12.500000000465661, + 15, + 17.50000000046566, + 20 + ] + ], + "passiveStats": { + "brEff_": [ + -1, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/PatienceIsAllYouNeed.json b/libs/sr-stats/Data/LightCone/PatienceIsAllYouNeed.json new file mode 100644 index 0000000000..16000ff43a --- /dev/null +++ b/libs/sr-stats/Data/LightCone/PatienceIsAllYouNeed.json @@ -0,0 +1,206 @@ +{ + "rarity": 5, + "path": "Nihility", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 21, + "add": 3.1500000001396984 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 46.200000000186265, + "add": 3.1500000001396984 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 79.80000000074506, + "add": 3.1500000001396984 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 113.40000000037253, + "add": 3.1500000001396984 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 147, + "add": 3.1500000001396984 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 180.6000000005588, + "add": 3.1500000001396984 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 214.20000000018626, + "add": 3.1500000001396984 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1 + ], + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + [ + -1, + 0.04799999948590994, + 0.055999999633058906, + 0.06399999978020787, + 0.07199999992735684, + 0.0800000000745058 + ], + [ + -1, + 3, + 3, + 3, + 3, + 3 + ], + [ + -1, + 1, + 1, + 1, + 1, + 1 + ] + ], + "passiveStats": { + "physical_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "fire_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "ice_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "wind_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "lightning_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "quantum_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "imaginary_dmg_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/PerfectTiming.json b/libs/sr-stats/Data/LightCone/PerfectTiming.json index 6b97220661..6a6a669507 100644 --- a/libs/sr-stats/Data/LightCone/PerfectTiming.json +++ b/libs/sr-stats/Data/LightCone/PerfectTiming.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.33000000030733645, 0.3600000003352761, 0.3900000003632158, @@ -118,6 +120,7 @@ 0.45000000041909516 ], [ + -1, 0.1500000001396984, 0.18000000016763806, 0.21000000019557774, @@ -127,6 +130,7 @@ ], "passiveStats": { "eff_res_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/Pioneering.json b/libs/sr-stats/Data/LightCone/Pioneering.json index b991ae85e9..cba4ed82f0 100644 --- a/libs/sr-stats/Data/LightCone/Pioneering.json +++ b/libs/sr-stats/Data/LightCone/Pioneering.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.14000000013038516, 0.1600000001490116, diff --git a/libs/sr-stats/Data/LightCone/PlanetaryRendezvous.json b/libs/sr-stats/Data/LightCone/PlanetaryRendezvous.json index 87b7fd106d..b47dda7528 100644 --- a/libs/sr-stats/Data/LightCone/PlanetaryRendezvous.json +++ b/libs/sr-stats/Data/LightCone/PlanetaryRendezvous.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/PostOpConversation.json b/libs/sr-stats/Data/LightCone/PostOpConversation.json index ec3cb02d0b..7dd8d52b60 100644 --- a/libs/sr-stats/Data/LightCone/PostOpConversation.json +++ b/libs/sr-stats/Data/LightCone/PostOpConversation.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -111,6 +112,7 @@ 0.1600000001490116 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -120,6 +122,7 @@ ], "passiveStats": { "enerRegen_": [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, diff --git a/libs/sr-stats/Data/LightCone/QuidProQuo.json b/libs/sr-stats/Data/LightCone/QuidProQuo.json index 4afdf730ba..821ff0d2ba 100644 --- a/libs/sr-stats/Data/LightCone/QuidProQuo.json +++ b/libs/sr-stats/Data/LightCone/QuidProQuo.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.5000000004656613, 0.5000000004656613, 0.5000000004656613, @@ -111,6 +112,7 @@ 0.5000000004656613 ], [ + -1, 8, 10, 12, diff --git a/libs/sr-stats/Data/LightCone/ResolutionShinesAsPearlsOfSweat.json b/libs/sr-stats/Data/LightCone/ResolutionShinesAsPearlsOfSweat.json index 18973eed34..421e8a9b38 100644 --- a/libs/sr-stats/Data/LightCone/ResolutionShinesAsPearlsOfSweat.json +++ b/libs/sr-stats/Data/LightCone/ResolutionShinesAsPearlsOfSweat.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.6000000005587935, 0.7000000006519258, 0.8000000007450581, @@ -111,6 +112,7 @@ 1 ], [ + -1, 0.12000000011175871, 0.13000000012107193, 0.14000000013038516, @@ -118,6 +120,7 @@ 0.1600000001490116 ], [ + -1, 1, 1, 1, diff --git a/libs/sr-stats/Data/LightCone/ReturnToDarkness.json b/libs/sr-stats/Data/LightCone/ReturnToDarkness.json index 2cb56fa334..e7ae564704 100644 --- a/libs/sr-stats/Data/LightCone/ReturnToDarkness.json +++ b/libs/sr-stats/Data/LightCone/ReturnToDarkness.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -111,6 +112,7 @@ 0.24000000022351742 ], [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -120,6 +122,7 @@ ], "passiveStats": { "crit_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/RiverFlowsInSpring.json b/libs/sr-stats/Data/LightCone/RiverFlowsInSpring.json index 2acd9e246f..b0c57e456b 100644 --- a/libs/sr-stats/Data/LightCone/RiverFlowsInSpring.json +++ b/libs/sr-stats/Data/LightCone/RiverFlowsInSpring.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.09000000008381903, 0.10000000009313226, @@ -111,6 +112,7 @@ 0.12000000011175871 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/Sagacity.json b/libs/sr-stats/Data/LightCone/Sagacity.json index ba02ac31e3..1e1f4148ec 100644 --- a/libs/sr-stats/Data/LightCone/Sagacity.json +++ b/libs/sr-stats/Data/LightCone/Sagacity.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -111,6 +112,7 @@ 0.48000000044703484 ], [ + -1, 2, 2, 2, diff --git a/libs/sr-stats/Data/LightCone/SharedFeeling.json b/libs/sr-stats/Data/LightCone/SharedFeeling.json index 8cfb2616b4..f636052e69 100644 --- a/libs/sr-stats/Data/LightCone/SharedFeeling.json +++ b/libs/sr-stats/Data/LightCone/SharedFeeling.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.10000000009313226, 0.12499999976716936, 0.1500000001396984, @@ -111,6 +112,7 @@ 0.20000000018626451 ], [ + -1, 2, 2.5000000004656613, 3, @@ -120,6 +122,7 @@ ], "passiveStats": { "heal_": [ + -1, 0.10000000009313226, 0.12499999976716936, 0.1500000001396984, diff --git a/libs/sr-stats/Data/LightCone/ShatteredHome.json b/libs/sr-stats/Data/LightCone/ShatteredHome.json index ed9e7f3a89..ef045a1009 100644 --- a/libs/sr-stats/Data/LightCone/ShatteredHome.json +++ b/libs/sr-stats/Data/LightCone/ShatteredHome.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.5000000004656613, 0.5000000004656613, 0.5000000004656613, @@ -111,6 +112,7 @@ 0.5000000004656613 ], [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, diff --git a/libs/sr-stats/Data/LightCone/SheAlreadyShutHerEyes.json b/libs/sr-stats/Data/LightCone/SheAlreadyShutHerEyes.json new file mode 100644 index 0000000000..8d386feb2f --- /dev/null +++ b/libs/sr-stats/Data/LightCone/SheAlreadyShutHerEyes.json @@ -0,0 +1,166 @@ +{ + "rarity": 5, + "path": "Preservation", + "ascension": [ + { + "atk": { + "base": 19.200000000186265, + "add": 2.880000000819564 + }, + "def": { + "base": 24, + "add": 3.6000000005587935 + }, + "hp": { + "base": 57.60000000055879, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 42.24000000022352, + "add": 2.880000000819564 + }, + "def": { + "base": 52.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 126.72000000067055, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 72.96000000089407, + "add": 2.880000000819564 + }, + "def": { + "base": 91.20000000018626, + "add": 3.6000000005587935 + }, + "hp": { + "base": 218.88000000081956, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 103.6800000006333, + "add": 2.880000000819564 + }, + "def": { + "base": 129.6000000005588, + "add": 3.6000000005587935 + }, + "hp": { + "base": 311.04000000003725, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 134.40000000037253, + "add": 2.880000000819564 + }, + "def": { + "base": 168, + "add": 3.6000000005587935 + }, + "hp": { + "base": 403.20000000018626, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 165.12000000011176, + "add": 2.880000000819564 + }, + "def": { + "base": 206.40000000037253, + "add": 3.6000000005587935 + }, + "hp": { + "base": 495.3600000003353, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 195.8400000007823, + "add": 2.880000000819564 + }, + "def": { + "base": 244.80000000074506, + "add": 3.6000000005587935 + }, + "hp": { + "base": 587.5200000004843, + "add": 8.640000000596046 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + [ + -1, + 0.09000000008381903, + 0.1049999997485429, + 0.12000000011175871, + 0.13499999977648258, + 0.1500000001396984 + ], + [ + -1, + 0.8000000007450581, + 0.8500000007916242, + 0.9000000008381903, + 0.9500000008847564, + 1 + ], + [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ] + ], + "passiveStats": { + "hp_": [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ], + "enerRegen_": [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/SleepLikeTheDead.json b/libs/sr-stats/Data/LightCone/SleepLikeTheDead.json index 3b6665978a..46df11077b 100644 --- a/libs/sr-stats/Data/LightCone/SleepLikeTheDead.json +++ b/libs/sr-stats/Data/LightCone/SleepLikeTheDead.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.3000000002793968, 0.3500000003259629, 0.40000000037252903, @@ -111,6 +112,7 @@ 0.5000000004656613 ], [ + -1, 0.3600000003352761, 0.4200000003911555, 0.48000000044703484, @@ -118,6 +120,7 @@ 0.6000000005587935 ], [ + -1, 1, 1, 1, @@ -125,6 +128,7 @@ 1 ], [ + -1, 3, 3, 3, @@ -134,6 +138,7 @@ ], "passiveStats": { "crit_dmg_": [ + -1, 0.3000000002793968, 0.3500000003259629, 0.40000000037252903, diff --git a/libs/sr-stats/Data/LightCone/SolitaryHealing.json b/libs/sr-stats/Data/LightCone/SolitaryHealing.json new file mode 100644 index 0000000000..87d21a9ebd --- /dev/null +++ b/libs/sr-stats/Data/LightCone/SolitaryHealing.json @@ -0,0 +1,150 @@ +{ + "rarity": 5, + "path": "Nihility", + "ascension": [ + { + "atk": { + "base": 24, + "add": 3.6000000005587935 + }, + "def": { + "base": 18, + "add": 2.700000000651926 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 52.80000000074506, + "add": 3.6000000005587935 + }, + "def": { + "base": 39.60000000055879, + "add": 2.700000000651926 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 91.20000000018626, + "add": 3.6000000005587935 + }, + "def": { + "base": 68.40000000037253, + "add": 2.700000000651926 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 129.6000000005588, + "add": 3.6000000005587935 + }, + "def": { + "base": 97.20000000018626, + "add": 2.700000000651926 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 168, + "add": 3.6000000005587935 + }, + "def": { + "base": 126, + "add": 2.700000000651926 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 206.40000000037253, + "add": 3.6000000005587935 + }, + "def": { + "base": 154.80000000074506, + "add": 2.700000000651926 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 244.80000000074506, + "add": 3.6000000005587935 + }, + "def": { + "base": 183.6000000005588, + "add": 2.700000000651926 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.20000000018626451, + 0.25000000023283064, + 0.3000000002793968, + 0.3500000003259629, + 0.40000000037252903 + ], + [ + -1, + 0.24000000022351742, + 0.3000000002793968, + 0.3600000003352761, + 0.4200000003911555, + 0.48000000044703484 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ], + [ + -1, + 4, + 4.500000000465661, + 5, + 5.500000000465661, + 6 + ] + ], + "passiveStats": { + "brEff_": [ + -1, + 0.20000000018626451, + 0.25000000023283064, + 0.3000000002793968, + 0.3500000003259629, + 0.40000000037252903 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/SomethingIrreplaceable.json b/libs/sr-stats/Data/LightCone/SomethingIrreplaceable.json index e108092341..5515da2d80 100644 --- a/libs/sr-stats/Data/LightCone/SomethingIrreplaceable.json +++ b/libs/sr-stats/Data/LightCone/SomethingIrreplaceable.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -111,6 +112,7 @@ 0.40000000037252903 ], [ + -1, 0.0800000000745058, 0.09000000008381903, 0.10000000009313226, @@ -118,6 +120,7 @@ 0.12000000011175871 ], [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, @@ -127,6 +130,7 @@ ], "passiveStats": { "atk_": [ + -1, 0.24000000022351742, 0.2800000002607703, 0.3200000002980232, diff --git a/libs/sr-stats/Data/LightCone/SubscribeForMore.json b/libs/sr-stats/Data/LightCone/SubscribeForMore.json index 7eb404f86a..246ea74417 100644 --- a/libs/sr-stats/Data/LightCone/SubscribeForMore.json +++ b/libs/sr-stats/Data/LightCone/SubscribeForMore.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -111,6 +112,7 @@ 0.48000000044703484 ], [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, diff --git a/libs/sr-stats/Data/LightCone/Swordplay.json b/libs/sr-stats/Data/LightCone/Swordplay.json index f402ad4832..cff04d68f1 100644 --- a/libs/sr-stats/Data/LightCone/Swordplay.json +++ b/libs/sr-stats/Data/LightCone/Swordplay.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -111,6 +112,7 @@ 0.1600000001490116 ], [ + -1, 5, 5, 5, diff --git a/libs/sr-stats/Data/LightCone/TextureOfMemories.json b/libs/sr-stats/Data/LightCone/TextureOfMemories.json index e30b57d2d5..383711ab8b 100644 --- a/libs/sr-stats/Data/LightCone/TextureOfMemories.json +++ b/libs/sr-stats/Data/LightCone/TextureOfMemories.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -111,6 +112,7 @@ 0.1600000001490116 ], [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -118,6 +120,7 @@ 0.3200000002980232 ], [ + -1, 2, 2, 2, @@ -125,6 +128,7 @@ 2 ], [ + -1, 3, 3, 3, @@ -132,6 +136,7 @@ 3 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -141,6 +146,7 @@ ], "passiveStats": { "eff_res_": [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, diff --git a/libs/sr-stats/Data/LightCone/TheBirthOfTheSelf.json b/libs/sr-stats/Data/LightCone/TheBirthOfTheSelf.json index f93ad5d550..5d1cc701c8 100644 --- a/libs/sr-stats/Data/LightCone/TheBirthOfTheSelf.json +++ b/libs/sr-stats/Data/LightCone/TheBirthOfTheSelf.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, @@ -111,6 +112,7 @@ 0.48000000044703484 ], [ + -1, 0.5000000004656613, 0.5000000004656613, 0.5000000004656613, @@ -118,6 +120,7 @@ 0.5000000004656613 ], [ + -1, 0.24000000022351742, 0.3000000002793968, 0.3600000003352761, diff --git a/libs/sr-stats/Data/LightCone/TheMolesWelcomeYou.json b/libs/sr-stats/Data/LightCone/TheMolesWelcomeYou.json index a369fbe49e..f8420b14e1 100644 --- a/libs/sr-stats/Data/LightCone/TheMolesWelcomeYou.json +++ b/libs/sr-stats/Data/LightCone/TheMolesWelcomeYou.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/TheSeriousnessOfBreakfast.json b/libs/sr-stats/Data/LightCone/TheSeriousnessOfBreakfast.json index 2b89304117..a2a20031f8 100644 --- a/libs/sr-stats/Data/LightCone/TheSeriousnessOfBreakfast.json +++ b/libs/sr-stats/Data/LightCone/TheSeriousnessOfBreakfast.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -111,6 +112,7 @@ 0.24000000022351742 ], [ + -1, 0.0400000000372529, 0.05000000004656613, 0.060000000055879354, @@ -118,6 +120,7 @@ 0.0800000000745058 ], [ + -1, 3, 3, 3, @@ -127,6 +130,7 @@ ], "passiveStats": { "physical_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -134,6 +138,7 @@ 0.24000000022351742 ], "fire_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -141,6 +146,7 @@ 0.24000000022351742 ], "ice_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -148,6 +154,7 @@ 0.24000000022351742 ], "wind_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -155,6 +162,7 @@ 0.24000000022351742 ], "lightning_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -162,6 +170,7 @@ 0.24000000022351742 ], "quantum_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -169,6 +178,7 @@ 0.24000000022351742 ], "imaginary_dmg_": [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, diff --git a/libs/sr-stats/Data/LightCone/TheUnreachableSide.json b/libs/sr-stats/Data/LightCone/TheUnreachableSide.json new file mode 100644 index 0000000000..03ed664643 --- /dev/null +++ b/libs/sr-stats/Data/LightCone/TheUnreachableSide.json @@ -0,0 +1,150 @@ +{ + "rarity": 5, + "path": "Destruction", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 15, + "add": 2.2500000002328306 + }, + "hp": { + "base": 57.60000000055879, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 33, + "add": 2.2500000002328306 + }, + "hp": { + "base": 126.72000000067055, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 57, + "add": 2.2500000002328306 + }, + "hp": { + "base": 218.88000000081956, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 81, + "add": 2.2500000002328306 + }, + "hp": { + "base": 311.04000000003725, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 105, + "add": 2.2500000002328306 + }, + "hp": { + "base": 403.20000000018626, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 129, + "add": 2.2500000002328306 + }, + "hp": { + "base": 495.3600000003353, + "add": 8.640000000596046 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 153, + "add": 2.2500000002328306 + }, + "hp": { + "base": 587.5200000004843, + "add": 8.640000000596046 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ], + [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ], + [ + -1, + 0.24000000022351742, + 0.2800000002607703, + 0.3200000002980232, + 0.3600000003352761, + 0.40000000037252903 + ] + ], + "passiveStats": { + "crit_": [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ], + "hp_": [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/LightCone/ThisIsMe.json b/libs/sr-stats/Data/LightCone/ThisIsMe.json index 974725be22..69c4815de0 100644 --- a/libs/sr-stats/Data/LightCone/ThisIsMe.json +++ b/libs/sr-stats/Data/LightCone/ThisIsMe.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.6000000005587935, 0.7500000006984919, 0.9000000008381903, @@ -120,6 +122,7 @@ ], "passiveStats": { "def_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/TimeWaitsForNoOne.json b/libs/sr-stats/Data/LightCone/TimeWaitsForNoOne.json index e7b661cb63..18a4d43a71 100644 --- a/libs/sr-stats/Data/LightCone/TimeWaitsForNoOne.json +++ b/libs/sr-stats/Data/LightCone/TimeWaitsForNoOne.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3000000002793968 ], [ + -1, 0.12000000011175871, 0.14000000013038516, 0.1600000001490116, @@ -118,6 +120,7 @@ 0.20000000018626451 ], [ + -1, 0.3600000003352761, 0.4200000003911555, 0.48000000044703484, @@ -127,6 +130,7 @@ ], "passiveStats": { "hp_": [ + -1, 0.18000000016763806, 0.21000000019557774, 0.24000000022351742, @@ -134,6 +138,7 @@ 0.3000000002793968 ], "heal_": [ + -1, 0.12000000011175871, 0.14000000013038516, 0.1600000001490116, diff --git a/libs/sr-stats/Data/LightCone/TodayIsAnotherPeacefulDay.json b/libs/sr-stats/Data/LightCone/TodayIsAnotherPeacefulDay.json index a5efbded57..934d1b0e9d 100644 --- a/libs/sr-stats/Data/LightCone/TodayIsAnotherPeacefulDay.json +++ b/libs/sr-stats/Data/LightCone/TodayIsAnotherPeacefulDay.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.001999999862164259, 0.002500000176951289, 0.0029999997932463884, @@ -111,6 +112,7 @@ 0.003999999724328518 ], [ + -1, 160, 160, 160, diff --git a/libs/sr-stats/Data/LightCone/TrendOfTheUniversalMarket.json b/libs/sr-stats/Data/LightCone/TrendOfTheUniversalMarket.json index 35c402137c..2b1db2e0a1 100644 --- a/libs/sr-stats/Data/LightCone/TrendOfTheUniversalMarket.json +++ b/libs/sr-stats/Data/LightCone/TrendOfTheUniversalMarket.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 1, 1.0500000000465661, 1.1000000000931323, @@ -118,6 +120,7 @@ 1.2000000001862645 ], [ + -1, 0.40000000037252903, 0.5000000004656613, 0.6000000005587935, @@ -125,6 +128,7 @@ 0.8000000007450581 ], [ + -1, 2, 2, 2, @@ -134,6 +138,7 @@ ], "passiveStats": { "def_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/UnderTheBlueSky.json b/libs/sr-stats/Data/LightCone/UnderTheBlueSky.json index fcd91406de..f04e4e6b17 100644 --- a/libs/sr-stats/Data/LightCone/UnderTheBlueSky.json +++ b/libs/sr-stats/Data/LightCone/UnderTheBlueSky.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.12000000011175871, 0.1500000001396984, 0.18000000016763806, @@ -118,6 +120,7 @@ 0.24000000022351742 ], [ + -1, 3, 3, 3, @@ -127,6 +130,7 @@ ], "passiveStats": { "atk_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/Void.json b/libs/sr-stats/Data/LightCone/Void.json index 450d27c810..55c16df1e6 100644 --- a/libs/sr-stats/Data/LightCone/Void.json +++ b/libs/sr-stats/Data/LightCone/Void.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.20000000018626451, 0.25000000023283064, 0.3000000002793968, @@ -111,6 +112,7 @@ 0.40000000037252903 ], [ + -1, 3, 3, 3, diff --git a/libs/sr-stats/Data/LightCone/WarmthShortensColdNights.json b/libs/sr-stats/Data/LightCone/WarmthShortensColdNights.json index f22f02fe0f..1ab728bebd 100644 --- a/libs/sr-stats/Data/LightCone/WarmthShortensColdNights.json +++ b/libs/sr-stats/Data/LightCone/WarmthShortensColdNights.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -111,6 +112,7 @@ 0.3200000002980232 ], [ + -1, 0.02000000001862645, 0.0249999996740371, 0.030000000027939677, @@ -120,6 +122,7 @@ ], "passiveStats": { "hp_": [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, diff --git a/libs/sr-stats/Data/LightCone/WeAreWildfire.json b/libs/sr-stats/Data/LightCone/WeAreWildfire.json index 2457a3284e..23cddf9a1a 100644 --- a/libs/sr-stats/Data/LightCone/WeAreWildfire.json +++ b/libs/sr-stats/Data/LightCone/WeAreWildfire.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.3000000002793968, 0.3500000003259629, 0.40000000037252903, @@ -111,6 +112,7 @@ 0.5000000004656613 ], [ + -1, 0.0800000000745058, 0.10000000009313226, 0.12000000011175871, @@ -118,6 +120,7 @@ 0.1600000001490116 ], [ + -1, 5, 5, 5, diff --git a/libs/sr-stats/Data/LightCone/WeWillMeetAgain.json b/libs/sr-stats/Data/LightCone/WeWillMeetAgain.json index f87e4cf9dd..ee98c902fb 100644 --- a/libs/sr-stats/Data/LightCone/WeWillMeetAgain.json +++ b/libs/sr-stats/Data/LightCone/WeWillMeetAgain.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.48000000044703484, 0.6000000005587935, 0.7200000006705523, diff --git a/libs/sr-stats/Data/LightCone/WoofWalkTime.json b/libs/sr-stats/Data/LightCone/WoofWalkTime.json index 7c26c6e413..132d331095 100644 --- a/libs/sr-stats/Data/LightCone/WoofWalkTime.json +++ b/libs/sr-stats/Data/LightCone/WoofWalkTime.json @@ -104,6 +104,7 @@ "superimpose": { "otherStats": [ [ + -1, 0.10000000009313226, 0.12499999976716936, 0.1500000001396984, @@ -111,6 +112,7 @@ 0.20000000018626451 ], [ + -1, 0.1600000001490116, 0.20000000018626451, 0.24000000022351742, @@ -120,6 +122,7 @@ ], "passiveStats": { "atk_": [ + -1, 0.10000000009313226, 0.12499999976716936, 0.1500000001396984, diff --git a/libs/sr-stats/Data/LightCone/WorrisomeBlissful.json b/libs/sr-stats/Data/LightCone/WorrisomeBlissful.json new file mode 100644 index 0000000000..d27a361bfd --- /dev/null +++ b/libs/sr-stats/Data/LightCone/WorrisomeBlissful.json @@ -0,0 +1,150 @@ +{ + "rarity": 5, + "path": "TheHunt", + "ascension": [ + { + "atk": { + "base": 26.40000000037253, + "add": 3.9600000008940697 + }, + "def": { + "base": 21, + "add": 3.1500000001396984 + }, + "hp": { + "base": 48, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 58.080000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 46.200000000186265, + "add": 3.1500000001396984 + }, + "hp": { + "base": 105.6000000005588, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 100.32000000029802, + "add": 3.9600000008940697 + }, + "def": { + "base": 79.80000000074506, + "add": 3.1500000001396984 + }, + "hp": { + "base": 182.40000000037253, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 142.56000000052154, + "add": 3.9600000008940697 + }, + "def": { + "base": 113.40000000037253, + "add": 3.1500000001396984 + }, + "hp": { + "base": 259.20000000018626, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 184.80000000074506, + "add": 3.9600000008940697 + }, + "def": { + "base": 147, + "add": 3.1500000001396984 + }, + "hp": { + "base": 336, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 227.04000000003725, + "add": 3.9600000008940697 + }, + "def": { + "base": 180.6000000005588, + "add": 3.1500000001396984 + }, + "hp": { + "base": 412.80000000074506, + "add": 7.2000000001862645 + } + }, + { + "atk": { + "base": 269.28000000026077, + "add": 3.9600000008940697 + }, + "def": { + "base": 214.20000000018626, + "add": 3.1500000001396984 + }, + "hp": { + "base": 489.6000000005588, + "add": 7.2000000001862645 + } + } + ], + "superimpose": { + "otherStats": [ + [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ], + [ + -1, + 0.3000000002793968, + 0.3500000003259629, + 0.40000000037252903, + 0.45000000041909516, + 0.5000000004656613 + ], + [ + -1, + 0.12000000011175871, + 0.14000000013038516, + 0.1600000001490116, + 0.18000000016763806, + 0.20000000018626451 + ], + [ + -1, + 2, + 2, + 2, + 2, + 2 + ] + ], + "passiveStats": { + "crit_": [ + -1, + 0.18000000016763806, + 0.21000000019557774, + 0.24000000022351742, + 0.2700000002514571, + 0.3000000002793968 + ] + } + } +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Relic/BrokenKeel.json b/libs/sr-stats/Data/Relic/BrokenKeel.json new file mode 100644 index 0000000000..3a35a51b99 --- /dev/null +++ b/libs/sr-stats/Data/Relic/BrokenKeel.json @@ -0,0 +1,15 @@ +{ + "setEffects": [ + { + "numRequired": 2, + "passiveStats": { + "eff_res_": 0.10000000009313226 + }, + "otherStats": [ + 0.10000000009313226, + 0.3000000002793968, + 0.10000000009313226 + ] + } + ] +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Relic/LongevousDisciple.json b/libs/sr-stats/Data/Relic/LongevousDisciple.json new file mode 100644 index 0000000000..175924eecc --- /dev/null +++ b/libs/sr-stats/Data/Relic/LongevousDisciple.json @@ -0,0 +1,22 @@ +{ + "setEffects": [ + { + "numRequired": 2, + "passiveStats": { + "hp_": 0.12000000011175871 + }, + "otherStats": [ + 0.12000000011175871 + ] + }, + { + "numRequired": 4, + "passiveStats": {}, + "otherStats": [ + 0.0800000000745058, + 2, + 2 + ] + } + ] +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Relic/MessengerTraversingHackerspace.json b/libs/sr-stats/Data/Relic/MessengerTraversingHackerspace.json new file mode 100644 index 0000000000..2df46cec04 --- /dev/null +++ b/libs/sr-stats/Data/Relic/MessengerTraversingHackerspace.json @@ -0,0 +1,21 @@ +{ + "setEffects": [ + { + "numRequired": 2, + "passiveStats": { + "undefined": 0.060000000055879354 + }, + "otherStats": [ + 0.060000000055879354 + ] + }, + { + "numRequired": 4, + "passiveStats": {}, + "otherStats": [ + 0.12000000011175871, + 1 + ] + } + ] +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Relic/PenaconyLandOfTheDreams.json b/libs/sr-stats/Data/Relic/PenaconyLandOfTheDreams.json new file mode 100644 index 0000000000..ecf3f9b845 --- /dev/null +++ b/libs/sr-stats/Data/Relic/PenaconyLandOfTheDreams.json @@ -0,0 +1,14 @@ +{ + "setEffects": [ + { + "numRequired": 2, + "passiveStats": { + "enerRegen_": 0.05000000004656613 + }, + "otherStats": [ + 0.05000000004656613, + 0.10000000009313226 + ] + } + ] +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Relic/RutilantArena.json b/libs/sr-stats/Data/Relic/RutilantArena.json new file mode 100644 index 0000000000..d6a1aa5e7f --- /dev/null +++ b/libs/sr-stats/Data/Relic/RutilantArena.json @@ -0,0 +1,15 @@ +{ + "setEffects": [ + { + "numRequired": 2, + "passiveStats": { + "crit_": 0.0800000000745058 + }, + "otherStats": [ + 0.0800000000745058, + 0.7000000006519258, + 0.20000000018626451 + ] + } + ] +} \ No newline at end of file diff --git a/libs/sr-stats/Data/Relic/TheAshblazingGrandDuke.json b/libs/sr-stats/Data/Relic/TheAshblazingGrandDuke.json new file mode 100644 index 0000000000..3fbd4cfa4c --- /dev/null +++ b/libs/sr-stats/Data/Relic/TheAshblazingGrandDuke.json @@ -0,0 +1,20 @@ +{ + "setEffects": [ + { + "numRequired": 2, + "passiveStats": {}, + "otherStats": [ + 0.20000000018626451 + ] + }, + { + "numRequired": 4, + "passiveStats": {}, + "otherStats": [ + 0.060000000055879354, + 8, + 3 + ] + } + ] +} \ No newline at end of file diff --git a/libs/sr-stats/src/executors/gen-stats/src/lightConeData.ts b/libs/sr-stats/src/executors/gen-stats/src/lightConeData.ts index 141e36c7f3..d2027ae93a 100644 --- a/libs/sr-stats/src/executors/gen-stats/src/lightConeData.ts +++ b/libs/sr-stats/src/executors/gen-stats/src/lightConeData.ts @@ -104,13 +104,19 @@ export default function LightConeData(): LightConeDatas { }) ), superimpose: { - otherStats: expandedConfig.ParamList.map((superimpose) => - superimpose.map((param) => extrapolateFloat(param.Value)) - ), + otherStats: expandedConfig.ParamList.map((superimpose) => [ + -1, + ...superimpose.map((param) => extrapolateFloat(param.Value)), + ]), passiveStats: Object.fromEntries( expandedConfig.AbilityProperty.map((superimpose) => [ superimpose[0].key, - superimpose.map((prop) => extrapolateFloat(prop.Value.Value)), + [ + -1, + ...superimpose.map((prop) => + extrapolateFloat(prop.Value.Value) + ), + ], ]) ), },