├── src ├── vite-env.d.ts ├── ys │ ├── p2p │ │ ├── p2p.wasm │ │ ├── proto │ │ │ ├── Furniture.proto │ │ │ ├── AvatarTeam.proto │ │ │ ├── AvatarEquipAffixInfo.proto │ │ │ ├── StoreType.proto │ │ │ ├── FetterData.proto │ │ │ ├── Material.proto │ │ │ ├── Weapon.proto │ │ │ ├── PropValue.proto │ │ │ ├── AvatarSkillInfo.proto │ │ │ ├── Reliquary.proto │ │ │ ├── Equip.proto │ │ │ ├── AvatarExcelInfo.proto │ │ │ ├── TrialAvatarInfo.proto │ │ │ ├── Item.proto │ │ │ ├── PlayerStoreNotify.proto │ │ │ ├── AvatarExpeditionState.proto │ │ │ ├── AvatarFetterInfo.proto │ │ │ ├── AvatarDataNotify.proto │ │ │ ├── TrialAvatarGrantRecord.proto │ │ │ ├── MaterialDeleteInfo.proto │ │ │ ├── GetPlayerTokenRsp.proto │ │ │ └── AvatarInfo.proto │ │ ├── README.md │ │ ├── excel │ │ │ ├── RelMP.ts │ │ │ ├── Avatar.ts │ │ │ ├── RelSet.ts │ │ │ └── RelAffix.ts │ │ ├── p2p.d.ts │ │ ├── pparser.ts │ │ └── store.ts │ ├── ext │ │ ├── index.ts │ │ └── good.ts │ ├── data │ │ ├── miscData.json │ │ ├── index.ts │ │ ├── defaultSetBonusTable.json │ │ └── defaultAffixWeightTable.json │ ├── README.md │ ├── sort │ │ ├── index.ts │ │ ├── normal.ts │ │ └── defeat.ts │ ├── types.ts │ ├── gacha │ │ ├── reliq.test.ts │ │ └── utils.test.ts │ └── utils │ │ └── index.ts ├── store │ ├── index.ts │ ├── types.ts │ ├── test.ts │ ├── utils.ts │ └── filterRules.ts ├── i18n │ └── index.ts ├── main.ts ├── components │ ├── widgets │ │ ├── TextButton.vue │ │ ├── RangeSlider.vue │ │ ├── SingleSelect.vue │ │ ├── ArtifactList.vue │ │ ├── MultiSelectBase.vue │ │ ├── MultiSelect.vue │ │ └── ValueButton.vue │ ├── sections │ │ └── SectionTitle.vue │ ├── layouts │ │ ├── LayoutRight.vue │ │ └── LayoutTop.vue │ └── dialogs │ │ ├── DatabaseLoader.vue │ │ ├── DefeatList.vue │ │ ├── BuildProbs.vue │ │ ├── EquipProbs.vue │ │ ├── PartialExport.vue │ │ ├── BuildLoader.vue │ │ ├── AlikeLocker.vue │ │ └── PresetLoader.vue ├── style │ └── global.scss └── App.vue ├── public ├── favicon.ico ├── assets │ ├── bg1.webp │ ├── bg4.webp │ ├── bg5.webp │ ├── arrow.webp │ ├── loading.gif │ ├── stars.webp │ ├── forbidden.webp │ ├── star_empty.png │ ├── star_full.png │ ├── star_full.webp │ ├── star_empty.webp │ ├── game_icons │ │ ├── geo.webp │ │ ├── anemo.webp │ │ ├── cryo.webp │ │ ├── hydro.webp │ │ ├── lock.webp │ │ ├── plume.webp │ │ ├── pyro.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── dendro.webp │ │ ├── electro.webp │ │ ├── flower.webp │ │ ├── goblet.webp │ │ └── unlock.webp │ ├── char_faces │ │ ├── Aloy.webp │ │ ├── Amber.webp │ │ ├── Cyno.webp │ │ ├── Dehya.webp │ │ ├── Diluc.webp │ │ ├── Diona.webp │ │ ├── Dori.webp │ │ ├── Eula.webp │ │ ├── Ganyu.webp │ │ ├── Gorou.webp │ │ ├── HuTao.webp │ │ ├── Jean.webp │ │ ├── Kaeya.webp │ │ ├── Kaveh.webp │ │ ├── Klee.webp │ │ ├── Layla.webp │ │ ├── Lisa.webp │ │ ├── Lyney.webp │ │ ├── Mika.webp │ │ ├── Mona.webp │ │ ├── Nilou.webp │ │ ├── Qiqi.webp │ │ ├── Razor.webp │ │ ├── Sayu.webp │ │ ├── Thoma.webp │ │ ├── Venti.webp │ │ ├── Xiao.webp │ │ ├── Yelan.webp │ │ ├── Albedo.webp │ │ ├── Baizhu.webp │ │ ├── Barbara.webp │ │ ├── Beidou.webp │ │ ├── Bennett.webp │ │ ├── Candace.webp │ │ ├── Chongyun.webp │ │ ├── Collei.webp │ │ ├── Faruzan.webp │ │ ├── Fischl.webp │ │ ├── Freminet.webp │ │ ├── Keqing.webp │ │ ├── Kirara.webp │ │ ├── Lynette.webp │ │ ├── Nahida.webp │ │ ├── Noelle.webp │ │ ├── Rosaria.webp │ │ ├── Shenhe.webp │ │ ├── Sucrose.webp │ │ ├── Tighnari.webp │ │ ├── Traveler.webp │ │ ├── Wanderer.webp │ │ ├── Xingqiu.webp │ │ ├── Xinyan.webp │ │ ├── YaeMiko.webp │ │ ├── Yanfei.webp │ │ ├── Yaoyao.webp │ │ ├── Yoimiya.webp │ │ ├── YunJin.webp │ │ ├── Zhongli.webp │ │ ├── default.webp │ │ ├── Alhaitham.webp │ │ ├── KujouSara.webp │ │ ├── Ningguang.webp │ │ ├── Tartaglia.webp │ │ ├── Xiangling.webp │ │ ├── AratakiItto.webp │ │ ├── KamisatoAyaka.webp │ │ ├── KamisatoAyato.webp │ │ ├── KukiShinobu.webp │ │ ├── Neuvillette.webp │ │ ├── RaidenShogun.webp │ │ ├── Wriothesley.webp │ │ ├── KaedeharaKazuha.webp │ │ ├── ShikanoinHeizou.webp │ │ └── SangonomiyaKokomi.webp │ ├── char_sides │ │ ├── Aloy.webp │ │ ├── Amber.webp │ │ ├── Cyno.webp │ │ ├── Dehya.webp │ │ ├── Diluc.webp │ │ ├── Diona.webp │ │ ├── Dori.webp │ │ ├── Eula.webp │ │ ├── Ganyu.webp │ │ ├── Gorou.webp │ │ ├── HuTao.webp │ │ ├── Jean.webp │ │ ├── Kaeya.webp │ │ ├── Kaveh.webp │ │ ├── Klee.webp │ │ ├── Layla.webp │ │ ├── Lisa.webp │ │ ├── Lyney.webp │ │ ├── Mika.webp │ │ ├── Mona.webp │ │ ├── Nilou.webp │ │ ├── Qiqi.webp │ │ ├── Razor.webp │ │ ├── Sayu.webp │ │ ├── Thoma.webp │ │ ├── Venti.webp │ │ ├── Xiao.webp │ │ ├── Yelan.webp │ │ ├── Albedo.webp │ │ ├── Baizhu.webp │ │ ├── Barbara.webp │ │ ├── Beidou.webp │ │ ├── Bennett.webp │ │ ├── Candace.webp │ │ ├── Chongyun.webp │ │ ├── Collei.webp │ │ ├── Faruzan.webp │ │ ├── Fischl.webp │ │ ├── Freminet.webp │ │ ├── Keqing.webp │ │ ├── Kirara.webp │ │ ├── Lynette.webp │ │ ├── Nahida.webp │ │ ├── Noelle.webp │ │ ├── Rosaria.webp │ │ ├── Shenhe.webp │ │ ├── Sucrose.webp │ │ ├── Tighnari.webp │ │ ├── Traveler.webp │ │ ├── Wanderer.webp │ │ ├── Xingqiu.webp │ │ ├── Xinyan.webp │ │ ├── YaeMiko.webp │ │ ├── Yanfei.webp │ │ ├── Yaoyao.webp │ │ ├── Yoimiya.webp │ │ ├── YunJin.webp │ │ ├── Zhongli.webp │ │ ├── Alhaitham.webp │ │ ├── KujouSara.webp │ │ ├── Ningguang.webp │ │ ├── Tartaglia.webp │ │ ├── Xiangling.webp │ │ ├── AratakiItto.webp │ │ ├── KamisatoAyaka.webp │ │ ├── KamisatoAyato.webp │ │ ├── KukiShinobu.webp │ │ ├── Neuvillette.webp │ │ ├── RaidenShogun.webp │ │ ├── Wriothesley.webp │ │ ├── KaedeharaKazuha.webp │ │ ├── ShikanoinHeizou.webp │ │ └── SangonomiyaKokomi.webp │ └── artifacts │ │ ├── Instructor │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── Lavawalker │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── PaleFlame │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── ArchaicPetra │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── GildedDreams │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── GoldenTroupe │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── HeartOfDepth │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── MaidenBeloved │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── NymphsDream │ │ ├── circlet.webp │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ └── sands.webp │ │ ├── OceanHuedClam │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── BlizzardStrayer │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── NoblesseOblige │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── RetracingBolide │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── ThunderingFury │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── Thundersoother │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── VourukashasGlow │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── WanderersTroupe │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── DeepwoodMemories │ │ ├── circlet.webp │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ └── sands.webp │ │ ├── EchoesOfAnOffering │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── GladiatorsFinale │ │ ├── circlet.webp │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ └── sands.webp │ │ ├── MarechausseeHunter │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── ViridescentVenerer │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── BloodstainedChivalry │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── CrimsonWitchOfFlames │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── EmblemOfSeveredFate │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── FlowerOfParadiseLost │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── HuskOfOpulentDreams │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── VermillionHereafter │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ ├── DesertPavilionChronicle │ │ ├── plume.webp │ │ ├── sands.webp │ │ ├── circlet.webp │ │ ├── flower.webp │ │ └── goblet.webp │ │ ├── ShimenawasReminiscence │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp │ │ └── TenacityOfTheMillelith │ │ ├── flower.webp │ │ ├── goblet.webp │ │ ├── plume.webp │ │ ├── sands.webp │ │ └── circlet.webp └── tutorial │ └── img │ ├── 1038.png │ ├── 1849.png │ ├── 1945.png │ ├── 2779.png │ ├── 3136.png │ ├── 3308.png │ ├── 3603.png │ ├── 3604.png │ ├── 3749.png │ ├── 4141.png │ ├── 4525.png │ ├── 5201.png │ ├── 5292.png │ ├── 5446.png │ ├── 6977.png │ ├── 7707.png │ └── 8908.png ├── .vscode └── extensions.json ├── auto-imports.d.ts ├── tsconfig.node.json ├── .gitignore ├── index.html ├── scripts ├── deploy.sh └── reliq.py ├── vite.config.ts ├── tsconfig.json ├── LICENSE ├── package.json └── README.md /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/ys/p2p/p2p.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/src/ys/p2p/p2p.wasm -------------------------------------------------------------------------------- /public/assets/bg1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/bg1.webp -------------------------------------------------------------------------------- /public/assets/bg4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/bg4.webp -------------------------------------------------------------------------------- /public/assets/bg5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/bg5.webp -------------------------------------------------------------------------------- /public/assets/arrow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/arrow.webp -------------------------------------------------------------------------------- /public/assets/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/loading.gif -------------------------------------------------------------------------------- /public/assets/stars.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/stars.webp -------------------------------------------------------------------------------- /public/assets/forbidden.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/forbidden.webp -------------------------------------------------------------------------------- /public/assets/star_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/star_empty.png -------------------------------------------------------------------------------- /public/assets/star_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/star_full.png -------------------------------------------------------------------------------- /public/assets/star_full.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/star_full.webp -------------------------------------------------------------------------------- /public/tutorial/img/1038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/1038.png -------------------------------------------------------------------------------- /public/tutorial/img/1849.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/1849.png -------------------------------------------------------------------------------- /public/tutorial/img/1945.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/1945.png -------------------------------------------------------------------------------- /public/tutorial/img/2779.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/2779.png -------------------------------------------------------------------------------- /public/tutorial/img/3136.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/3136.png -------------------------------------------------------------------------------- /public/tutorial/img/3308.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/3308.png -------------------------------------------------------------------------------- /public/tutorial/img/3603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/3603.png -------------------------------------------------------------------------------- /public/tutorial/img/3604.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/3604.png -------------------------------------------------------------------------------- /public/tutorial/img/3749.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/3749.png -------------------------------------------------------------------------------- /public/tutorial/img/4141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/4141.png -------------------------------------------------------------------------------- /public/tutorial/img/4525.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/4525.png -------------------------------------------------------------------------------- /public/tutorial/img/5201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/5201.png -------------------------------------------------------------------------------- /public/tutorial/img/5292.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/5292.png -------------------------------------------------------------------------------- /public/tutorial/img/5446.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/5446.png -------------------------------------------------------------------------------- /public/tutorial/img/6977.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/6977.png -------------------------------------------------------------------------------- /public/tutorial/img/7707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/7707.png -------------------------------------------------------------------------------- /public/tutorial/img/8908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/tutorial/img/8908.png -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /public/assets/star_empty.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/star_empty.webp -------------------------------------------------------------------------------- /public/assets/game_icons/geo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/geo.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Aloy.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Aloy.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Amber.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Cyno.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Cyno.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Dehya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Dehya.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Diluc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Diluc.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Diona.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Diona.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Dori.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Dori.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Eula.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Eula.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Ganyu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Ganyu.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Gorou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Gorou.webp -------------------------------------------------------------------------------- /public/assets/char_faces/HuTao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/HuTao.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Jean.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Jean.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Kaeya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Kaeya.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Kaveh.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Kaveh.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Klee.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Klee.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Layla.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Layla.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Lisa.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Lisa.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Lyney.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Lyney.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Mika.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Mika.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Mona.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Mona.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Nilou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Nilou.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Qiqi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Qiqi.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Razor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Razor.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Sayu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Sayu.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Thoma.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Thoma.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Venti.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Venti.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Xiao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Xiao.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Yelan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Yelan.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Aloy.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Aloy.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Amber.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Cyno.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Cyno.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Dehya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Dehya.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Diluc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Diluc.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Diona.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Diona.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Dori.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Dori.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Eula.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Eula.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Ganyu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Ganyu.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Gorou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Gorou.webp -------------------------------------------------------------------------------- /public/assets/char_sides/HuTao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/HuTao.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Jean.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Jean.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Kaeya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Kaeya.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Kaveh.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Kaveh.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Klee.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Klee.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Layla.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Layla.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Lisa.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Lisa.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Lyney.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Lyney.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Mika.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Mika.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Mona.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Mona.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Nilou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Nilou.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Qiqi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Qiqi.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Razor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Razor.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Sayu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Sayu.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Thoma.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Thoma.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Venti.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Venti.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Xiao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Xiao.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Yelan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Yelan.webp -------------------------------------------------------------------------------- /public/assets/game_icons/anemo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/anemo.webp -------------------------------------------------------------------------------- /public/assets/game_icons/cryo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/cryo.webp -------------------------------------------------------------------------------- /public/assets/game_icons/hydro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/hydro.webp -------------------------------------------------------------------------------- /public/assets/game_icons/lock.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/lock.webp -------------------------------------------------------------------------------- /public/assets/game_icons/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/plume.webp -------------------------------------------------------------------------------- /public/assets/game_icons/pyro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/pyro.webp -------------------------------------------------------------------------------- /public/assets/game_icons/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/sands.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Albedo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Albedo.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Baizhu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Baizhu.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Barbara.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Barbara.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Beidou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Beidou.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Bennett.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Bennett.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Candace.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Candace.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Chongyun.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Chongyun.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Collei.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Collei.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Faruzan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Faruzan.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Fischl.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Fischl.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Freminet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Freminet.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Keqing.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Keqing.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Kirara.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Kirara.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Lynette.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Lynette.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Nahida.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Nahida.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Noelle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Noelle.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Rosaria.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Rosaria.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Shenhe.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Shenhe.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Sucrose.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Sucrose.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Tighnari.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Tighnari.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Traveler.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Traveler.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Wanderer.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Wanderer.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Xingqiu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Xingqiu.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Xinyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Xinyan.webp -------------------------------------------------------------------------------- /public/assets/char_faces/YaeMiko.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/YaeMiko.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Yanfei.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Yanfei.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Yaoyao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Yaoyao.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Yoimiya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Yoimiya.webp -------------------------------------------------------------------------------- /public/assets/char_faces/YunJin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/YunJin.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Zhongli.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Zhongli.webp -------------------------------------------------------------------------------- /public/assets/char_faces/default.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/default.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Albedo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Albedo.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Baizhu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Baizhu.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Barbara.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Barbara.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Beidou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Beidou.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Bennett.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Bennett.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Candace.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Candace.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Chongyun.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Chongyun.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Collei.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Collei.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Faruzan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Faruzan.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Fischl.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Fischl.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Freminet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Freminet.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Keqing.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Keqing.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Kirara.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Kirara.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Lynette.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Lynette.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Nahida.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Nahida.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Noelle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Noelle.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Rosaria.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Rosaria.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Shenhe.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Shenhe.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Sucrose.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Sucrose.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Tighnari.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Tighnari.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Traveler.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Traveler.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Wanderer.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Wanderer.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Xingqiu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Xingqiu.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Xinyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Xinyan.webp -------------------------------------------------------------------------------- /public/assets/char_sides/YaeMiko.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/YaeMiko.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Yanfei.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Yanfei.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Yaoyao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Yaoyao.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Yoimiya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Yoimiya.webp -------------------------------------------------------------------------------- /public/assets/char_sides/YunJin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/YunJin.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Zhongli.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Zhongli.webp -------------------------------------------------------------------------------- /public/assets/game_icons/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/circlet.webp -------------------------------------------------------------------------------- /public/assets/game_icons/dendro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/dendro.webp -------------------------------------------------------------------------------- /public/assets/game_icons/electro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/electro.webp -------------------------------------------------------------------------------- /public/assets/game_icons/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/flower.webp -------------------------------------------------------------------------------- /public/assets/game_icons/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/goblet.webp -------------------------------------------------------------------------------- /public/assets/game_icons/unlock.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/game_icons/unlock.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Alhaitham.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Alhaitham.webp -------------------------------------------------------------------------------- /public/assets/char_faces/KujouSara.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/KujouSara.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Ningguang.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Ningguang.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Tartaglia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Tartaglia.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Xiangling.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Xiangling.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Alhaitham.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Alhaitham.webp -------------------------------------------------------------------------------- /public/assets/char_sides/KujouSara.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/KujouSara.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Ningguang.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Ningguang.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Tartaglia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Tartaglia.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Xiangling.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Xiangling.webp -------------------------------------------------------------------------------- /public/assets/char_faces/AratakiItto.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/AratakiItto.webp -------------------------------------------------------------------------------- /public/assets/char_faces/KamisatoAyaka.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/KamisatoAyaka.webp -------------------------------------------------------------------------------- /public/assets/char_faces/KamisatoAyato.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/KamisatoAyato.webp -------------------------------------------------------------------------------- /public/assets/char_faces/KukiShinobu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/KukiShinobu.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Neuvillette.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Neuvillette.webp -------------------------------------------------------------------------------- /public/assets/char_faces/RaidenShogun.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/RaidenShogun.webp -------------------------------------------------------------------------------- /public/assets/char_faces/Wriothesley.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/Wriothesley.webp -------------------------------------------------------------------------------- /public/assets/char_sides/AratakiItto.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/AratakiItto.webp -------------------------------------------------------------------------------- /public/assets/char_sides/KamisatoAyaka.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/KamisatoAyaka.webp -------------------------------------------------------------------------------- /public/assets/char_sides/KamisatoAyato.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/KamisatoAyato.webp -------------------------------------------------------------------------------- /public/assets/char_sides/KukiShinobu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/KukiShinobu.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Neuvillette.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Neuvillette.webp -------------------------------------------------------------------------------- /public/assets/char_sides/RaidenShogun.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/RaidenShogun.webp -------------------------------------------------------------------------------- /public/assets/char_sides/Wriothesley.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/Wriothesley.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Instructor/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Instructor/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Instructor/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Instructor/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Lavawalker/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Lavawalker/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Lavawalker/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Lavawalker/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/PaleFlame/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/PaleFlame/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/PaleFlame/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/PaleFlame/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/PaleFlame/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/PaleFlame/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/PaleFlame/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/PaleFlame/sands.webp -------------------------------------------------------------------------------- /public/assets/char_faces/KaedeharaKazuha.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/KaedeharaKazuha.webp -------------------------------------------------------------------------------- /public/assets/char_faces/ShikanoinHeizou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/ShikanoinHeizou.webp -------------------------------------------------------------------------------- /public/assets/char_sides/KaedeharaKazuha.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/KaedeharaKazuha.webp -------------------------------------------------------------------------------- /public/assets/char_sides/ShikanoinHeizou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/ShikanoinHeizou.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ArchaicPetra/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ArchaicPetra/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ArchaicPetra/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ArchaicPetra/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ArchaicPetra/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ArchaicPetra/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ArchaicPetra/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ArchaicPetra/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GildedDreams/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GildedDreams/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GildedDreams/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GildedDreams/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GildedDreams/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GildedDreams/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GildedDreams/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GildedDreams/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GoldenTroupe/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GoldenTroupe/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GoldenTroupe/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GoldenTroupe/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GoldenTroupe/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GoldenTroupe/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GoldenTroupe/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GoldenTroupe/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HeartOfDepth/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HeartOfDepth/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HeartOfDepth/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HeartOfDepth/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HeartOfDepth/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HeartOfDepth/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HeartOfDepth/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HeartOfDepth/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Instructor/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Instructor/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Instructor/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Instructor/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Instructor/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Instructor/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Lavawalker/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Lavawalker/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Lavawalker/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Lavawalker/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Lavawalker/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Lavawalker/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MaidenBeloved/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MaidenBeloved/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MaidenBeloved/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MaidenBeloved/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NymphsDream/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NymphsDream/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NymphsDream/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NymphsDream/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NymphsDream/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NymphsDream/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NymphsDream/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NymphsDream/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NymphsDream/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NymphsDream/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/OceanHuedClam/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/OceanHuedClam/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/OceanHuedClam/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/OceanHuedClam/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/PaleFlame/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/PaleFlame/circlet.webp -------------------------------------------------------------------------------- /public/assets/char_faces/SangonomiyaKokomi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_faces/SangonomiyaKokomi.webp -------------------------------------------------------------------------------- /public/assets/char_sides/SangonomiyaKokomi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/char_sides/SangonomiyaKokomi.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ArchaicPetra/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ArchaicPetra/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BlizzardStrayer/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BlizzardStrayer/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BlizzardStrayer/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BlizzardStrayer/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GildedDreams/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GildedDreams/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GoldenTroupe/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GoldenTroupe/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HeartOfDepth/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HeartOfDepth/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MaidenBeloved/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MaidenBeloved/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MaidenBeloved/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MaidenBeloved/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MaidenBeloved/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MaidenBeloved/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NoblesseOblige/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NoblesseOblige/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NoblesseOblige/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NoblesseOblige/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NoblesseOblige/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NoblesseOblige/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NoblesseOblige/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NoblesseOblige/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/OceanHuedClam/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/OceanHuedClam/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/OceanHuedClam/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/OceanHuedClam/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/OceanHuedClam/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/OceanHuedClam/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/RetracingBolide/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/RetracingBolide/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/RetracingBolide/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/RetracingBolide/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ThunderingFury/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ThunderingFury/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ThunderingFury/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ThunderingFury/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ThunderingFury/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ThunderingFury/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ThunderingFury/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ThunderingFury/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Thundersoother/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Thundersoother/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Thundersoother/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Thundersoother/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Thundersoother/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Thundersoother/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Thundersoother/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Thundersoother/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VourukashasGlow/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VourukashasGlow/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VourukashasGlow/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VourukashasGlow/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/WanderersTroupe/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/WanderersTroupe/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/WanderersTroupe/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/WanderersTroupe/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BlizzardStrayer/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BlizzardStrayer/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BlizzardStrayer/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BlizzardStrayer/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BlizzardStrayer/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BlizzardStrayer/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DeepwoodMemories/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DeepwoodMemories/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DeepwoodMemories/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DeepwoodMemories/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DeepwoodMemories/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DeepwoodMemories/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DeepwoodMemories/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DeepwoodMemories/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DeepwoodMemories/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DeepwoodMemories/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EchoesOfAnOffering/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EchoesOfAnOffering/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EchoesOfAnOffering/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EchoesOfAnOffering/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GladiatorsFinale/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GladiatorsFinale/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GladiatorsFinale/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GladiatorsFinale/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GladiatorsFinale/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GladiatorsFinale/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GladiatorsFinale/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GladiatorsFinale/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/GladiatorsFinale/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/GladiatorsFinale/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MarechausseeHunter/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MarechausseeHunter/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MarechausseeHunter/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MarechausseeHunter/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/NoblesseOblige/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/NoblesseOblige/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/RetracingBolide/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/RetracingBolide/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/RetracingBolide/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/RetracingBolide/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/RetracingBolide/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/RetracingBolide/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ThunderingFury/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ThunderingFury/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/Thundersoother/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/Thundersoother/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ViridescentVenerer/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ViridescentVenerer/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ViridescentVenerer/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ViridescentVenerer/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VourukashasGlow/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VourukashasGlow/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VourukashasGlow/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VourukashasGlow/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VourukashasGlow/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VourukashasGlow/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/WanderersTroupe/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/WanderersTroupe/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/WanderersTroupe/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/WanderersTroupe/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/WanderersTroupe/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/WanderersTroupe/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BloodstainedChivalry/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BloodstainedChivalry/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BloodstainedChivalry/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BloodstainedChivalry/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/CrimsonWitchOfFlames/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/CrimsonWitchOfFlames/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/CrimsonWitchOfFlames/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/CrimsonWitchOfFlames/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EchoesOfAnOffering/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EchoesOfAnOffering/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EchoesOfAnOffering/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EchoesOfAnOffering/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EchoesOfAnOffering/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EchoesOfAnOffering/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EmblemOfSeveredFate/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EmblemOfSeveredFate/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EmblemOfSeveredFate/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EmblemOfSeveredFate/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EmblemOfSeveredFate/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EmblemOfSeveredFate/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EmblemOfSeveredFate/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EmblemOfSeveredFate/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/FlowerOfParadiseLost/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/FlowerOfParadiseLost/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/FlowerOfParadiseLost/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/FlowerOfParadiseLost/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HuskOfOpulentDreams/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HuskOfOpulentDreams/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HuskOfOpulentDreams/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HuskOfOpulentDreams/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HuskOfOpulentDreams/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HuskOfOpulentDreams/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HuskOfOpulentDreams/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HuskOfOpulentDreams/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MarechausseeHunter/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MarechausseeHunter/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MarechausseeHunter/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MarechausseeHunter/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/MarechausseeHunter/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/MarechausseeHunter/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VermillionHereafter/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VermillionHereafter/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VermillionHereafter/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VermillionHereafter/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VermillionHereafter/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VermillionHereafter/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VermillionHereafter/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VermillionHereafter/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ViridescentVenerer/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ViridescentVenerer/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ViridescentVenerer/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ViridescentVenerer/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ViridescentVenerer/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ViridescentVenerer/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BloodstainedChivalry/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BloodstainedChivalry/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BloodstainedChivalry/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BloodstainedChivalry/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/BloodstainedChivalry/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/BloodstainedChivalry/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/CrimsonWitchOfFlames/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/CrimsonWitchOfFlames/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/CrimsonWitchOfFlames/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/CrimsonWitchOfFlames/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/CrimsonWitchOfFlames/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/CrimsonWitchOfFlames/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DesertPavilionChronicle/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DesertPavilionChronicle/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DesertPavilionChronicle/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DesertPavilionChronicle/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/EmblemOfSeveredFate/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/EmblemOfSeveredFate/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/FlowerOfParadiseLost/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/FlowerOfParadiseLost/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/FlowerOfParadiseLost/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/FlowerOfParadiseLost/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/FlowerOfParadiseLost/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/FlowerOfParadiseLost/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/HuskOfOpulentDreams/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/HuskOfOpulentDreams/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ShimenawasReminiscence/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ShimenawasReminiscence/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ShimenawasReminiscence/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ShimenawasReminiscence/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ShimenawasReminiscence/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ShimenawasReminiscence/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ShimenawasReminiscence/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ShimenawasReminiscence/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/TenacityOfTheMillelith/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/TenacityOfTheMillelith/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/TenacityOfTheMillelith/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/TenacityOfTheMillelith/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/TenacityOfTheMillelith/plume.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/TenacityOfTheMillelith/plume.webp -------------------------------------------------------------------------------- /public/assets/artifacts/TenacityOfTheMillelith/sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/TenacityOfTheMillelith/sands.webp -------------------------------------------------------------------------------- /public/assets/artifacts/VermillionHereafter/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/VermillionHereafter/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DesertPavilionChronicle/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DesertPavilionChronicle/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DesertPavilionChronicle/flower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DesertPavilionChronicle/flower.webp -------------------------------------------------------------------------------- /public/assets/artifacts/DesertPavilionChronicle/goblet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/DesertPavilionChronicle/goblet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/ShimenawasReminiscence/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/ShimenawasReminiscence/circlet.webp -------------------------------------------------------------------------------- /public/assets/artifacts/TenacityOfTheMillelith/circlet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ideless/artifact/HEAD/public/assets/artifacts/TenacityOfTheMillelith/circlet.webp -------------------------------------------------------------------------------- /src/ys/p2p/proto/Furniture.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message Furniture { 6 | uint32 count = 1; 7 | } 8 | -------------------------------------------------------------------------------- /auto-imports.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-auto-import 5 | export {} 6 | declare global { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/ys/ext/index.ts: -------------------------------------------------------------------------------- 1 | export { default as GoodFormat } from "./good"; 2 | export { default as MonaFormat } from "./mona"; 3 | export { default as GenmoFormat } from "./genmo"; 4 | -------------------------------------------------------------------------------- /src/store/index.ts: -------------------------------------------------------------------------------- 1 | export { useArtifactStore, SortByKeys } from "./stores/artifactStore"; 2 | export { useUiStore } from "./stores/uiStore"; 3 | export { useYasStore } from "./stores/yasStore"; 4 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarTeam.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message AvatarTeam { 6 | repeated uint64 avatar_guid_list = 1; 7 | string team_name = 2; 8 | } 9 | -------------------------------------------------------------------------------- /src/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import { createI18n } from "vue-i18n"; 2 | import zhCN from "./zhCN.json"; 3 | 4 | export const i18n = createI18n({ 5 | locale: "zhCN", 6 | messages: { 7 | zhCN, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /src/ys/data/miscData.json: -------------------------------------------------------------------------------- 1 | { 2 | "elementKeys": [ 3 | "pyro", 4 | "hydro", 5 | "electro", 6 | "anemo", 7 | "cryo", 8 | "geo", 9 | "dendro" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarEquipAffixInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message AvatarEquipAffixInfo { 6 | uint32 equip_affix_id = 1; 7 | uint32 left_cd_time = 2; 8 | } 9 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/StoreType.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | enum StoreType { 6 | STORE_TYPE_NONE = 0; 7 | STORE_TYPE_PACK = 1; 8 | STORE_TYPE_DEPOT = 2; 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/FetterData.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message FetterData { 6 | uint32 fetter_id = 1; 7 | uint32 fetter_state = 2; 8 | repeated uint32 cond_index_list = 3; 9 | } 10 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/Material.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "MaterialDeleteInfo.proto"; 6 | 7 | message Material { 8 | uint32 count = 1; 9 | MaterialDeleteInfo delete_info = 2; 10 | } 11 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/Weapon.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message Weapon { 6 | uint32 level = 1; 7 | uint32 exp = 2; 8 | uint32 promote_level = 3; 9 | map affix_map = 4; 10 | } 11 | -------------------------------------------------------------------------------- /src/store/types.ts: -------------------------------------------------------------------------------- 1 | export interface IOption { 2 | key: string | number; 3 | label: string; 4 | tip?: string; 5 | icon?: string; 6 | } 7 | 8 | export interface ICharOption { 9 | key: string; 10 | name?: string; 11 | tip?: string; 12 | } 13 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/PropValue.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message PropValue { 6 | uint32 type = 1; 7 | int64 val = 4; 8 | oneof value { 9 | int64 ival = 2; 10 | float fval = 3; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarSkillInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message AvatarSkillInfo { 6 | uint32 pass_cd_time = 1; 7 | repeated uint32 full_cd_time_list = 2; 8 | uint32 max_charge_count = 3; 9 | } 10 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/Reliquary.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message Reliquary { 6 | uint32 level = 1; 7 | uint32 exp = 2; 8 | uint32 promote_level = 3; 9 | uint32 main_prop_id = 4; 10 | repeated uint32 append_prop_id_list = 5; 11 | } 12 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/Equip.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "Reliquary.proto"; 6 | import "Weapon.proto"; 7 | 8 | message Equip { 9 | bool is_locked = 3; 10 | oneof detail { 11 | Reliquary reliquary = 1; 12 | Weapon weapon = 2; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/ys/p2p/README.md: -------------------------------------------------------------------------------- 1 | [deprecated] 2 | 3 | p2p (p2p.wasm, p2p.js, p2p.d.ts) 来自 https://github.com/ideless/p2p 4 | 5 | 更新 proto 后运行 `yarn proto` 以生成对应的 proto.js 和 proto.d.ts 6 | 7 | 注意在生成的 proto.js 文件中添加 8 | ``` 9 | import Long from "long" 10 | $protobuf.util.Long = Long 11 | $protobuf.configure() 12 | ``` 13 | 要不然解析 uint64 会出现错误。当然这只是权宜之计,但至少能用。 -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarExcelInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message AvatarExcelInfo { 6 | uint64 prefab_path_hash = 1; 7 | uint64 prefab_path_remote_hash = 2; 8 | uint64 controller_path_hash = 3; 9 | uint64 controller_path_remote_hash = 4; 10 | uint64 combat_config_hash = 5; 11 | } 12 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/TrialAvatarInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "Item.proto"; 6 | import "TrialAvatarGrantRecord.proto"; 7 | 8 | message TrialAvatarInfo { 9 | uint32 trial_avatar_id = 1; 10 | repeated Item trial_equip_list = 2; 11 | TrialAvatarGrantRecord grant_record = 3; 12 | } 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/Item.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "Equip.proto"; 6 | import "Furniture.proto"; 7 | import "Material.proto"; 8 | 9 | message Item { 10 | uint32 item_id = 1; 11 | uint64 guid = 2; 12 | oneof detail { 13 | Material material = 5; 14 | Equip equip = 6; 15 | Furniture furniture = 7; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/PlayerStoreNotify.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "Item.proto"; 6 | import "StoreType.proto"; 7 | 8 | // CmdId: 609 9 | // EnetChannelId: 0 10 | // EnetIsReliable: true 11 | message PlayerStoreNotify { 12 | StoreType store_type = 4; 13 | repeated Item item_list = 3; 14 | uint32 weight_limit = 15; 15 | } 16 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarExpeditionState.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | enum AvatarExpeditionState { 6 | AVATAR_EXPEDITION_STATE_NONE = 0; 7 | AVATAR_EXPEDITION_STATE_DOING = 1; 8 | AVATAR_EXPEDITION_STATE_FINISH_WAIT_REWARD = 2; 9 | AVATAR_EXPEDITION_STATE_CALLBACK_WAIT_REWARD = 3; 10 | AVATAR_EXPEDITION_STATE_LOCKED = 4; 11 | } 12 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarFetterInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "FetterData.proto"; 6 | 7 | message AvatarFetterInfo { 8 | uint32 exp_number = 1; 9 | uint32 exp_level = 2; 10 | repeated uint32 open_id_list = 3; 11 | repeated uint32 finish_id_list = 4; 12 | repeated uint32 rewarded_fetter_level_list = 5; 13 | repeated FetterData fetter_list = 6; 14 | } 15 | -------------------------------------------------------------------------------- /src/ys/data/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ArtifactData } from "./artifactData.json"; 2 | export { default as CharacterData } from "./characterData.json"; 3 | export { default as PresetData } from "./presetData.json"; 4 | export { default as MiscData } from "./miscData.json"; 5 | export { default as DefaultAffixWeightTable } from "./defaultAffixWeightTable.json"; 6 | export { default as DefaultSetBonusTable } from "./defaultSetBonusTable.json"; 7 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 圣遗物强化助手 11 | 12 | 13 | 14 |
15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/ys/README.md: -------------------------------------------------------------------------------- 1 | # Artifact mechanism 2 | 3 | See `data/artifactData.json` 4 | 5 | References 6 | 7 | - [Genshin Fandom](https://genshin-impact.fandom.com/wiki/Artifact) 8 | 9 | # Character builds 10 | 11 | See `data/characterData.json` 12 | 13 | References 14 | 15 | - [Builds](https://ngabbs.com/read.php?tid=27859119) 16 | 17 | # Minor affix weight presets 18 | 19 | See `data/presetData.json` 20 | 21 | References 22 | 23 | - [Presets](http://spongem.com/ajglz/ys/ys.html) 24 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarDataNotify.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "AvatarInfo.proto"; 6 | import "AvatarTeam.proto"; 7 | 8 | // CmdId: 1695 9 | // EnetChannelId: 0 10 | // EnetIsReliable: true 11 | message AvatarDataNotify { 12 | repeated AvatarInfo avatar_list = 15; 13 | map avatar_team_map = 6; 14 | uint32 cur_avatar_team_id = 2; 15 | uint64 choose_avatar_guid = 11; 16 | repeated uint64 temp_avatar_guid_list = 14; 17 | repeated uint32 owned_flycloak_list = 8; 18 | repeated uint32 owned_costume_list = 7; 19 | } 20 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/TrialAvatarGrantRecord.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message TrialAvatarGrantRecord { 6 | uint32 grant_reason = 1; 7 | uint32 from_parent_quest_id = 2; 8 | 9 | enum GrantReason { 10 | GRANT_REASON_INVALID = 0; 11 | GRANT_REASON_BY_QUEST = 1; 12 | GRANT_REASON_BY_TRIAL_AVATAR_ACTIVITY = 2; 13 | GRANT_REASON_BY_DUNGEON_ELEMENT_CHALLENGE = 3; 14 | GRANT_REASON_BY_MIST_TRIAL_ACTIVITY = 4; 15 | GRANT_REASON_BY_SUMO_ACTIVITY = 5; 16 | GRANT_REASON_ELPMDIEIOHP = 6; 17 | GRANT_REASON_FALPDBLGHJB = 7; 18 | GRANT_REASON_GAMADMGGMBC = 8; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/ys/sort/index.ts: -------------------------------------------------------------------------------- 1 | export * as AffnumSort from "./affnum"; 2 | export * as PBuildSort from "./pbuild"; 3 | export * as DefeatSort from "./defeat"; 4 | export * as PEquipSort from "./pequip"; 5 | export * as NormalSort from "./normal"; 6 | 7 | export type { 8 | ISetBonusTable, 9 | IAffixWeightTable, 10 | IAffnumResult, 11 | IAffnumResults, 12 | } from "./affnum"; 13 | export type { 14 | IBuild, 15 | IPBuildResult, 16 | IPBuildResults, 17 | IPBuildSortBy, 18 | } from "./pbuild"; 19 | export type { IDefeatResult, IDefeatResults } from "./defeat"; 20 | export type { IPEquipResult, IPEquipResults } from "./pequip"; 21 | -------------------------------------------------------------------------------- /src/store/test.ts: -------------------------------------------------------------------------------- 1 | import { Artifact } from "@/ys/artifact"; 2 | import { CharacterData, ArtifactData } from "@/ys/data"; 3 | import { choice } from "@/ys/utils"; 4 | 5 | // const charKeys = ["Traveler"].concat( 6 | // Object.keys(CharacterData).filter((k) => !k.startsWith("Traveler")) 7 | // ); 8 | 9 | const charKeys = ["Lynette", "Lyney", "Freminet", "Wriothesley", "Neuvillette"]; 10 | 11 | const testArts = 12 | process.env.NODE_ENV == "development" 13 | ? charKeys.map((key) => { 14 | let a = Artifact.rand({ set: choice(ArtifactData.setKeys) }); 15 | a.location = key; 16 | return a; 17 | }) 18 | : []; 19 | 20 | export { testArts }; 21 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from "vue"; 2 | import App from "@/App.vue"; 3 | 4 | import { createPinia } from "pinia"; 5 | 6 | import { i18n } from "./i18n"; 7 | 8 | import "element-plus/dist/index.css"; 9 | 10 | import ECharts from "vue-echarts"; 11 | import { use } from "echarts/core"; 12 | import { CanvasRenderer } from "echarts/renderers"; 13 | import { LineChart } from "echarts/charts"; 14 | import { GridComponent, TooltipComponent } from "echarts/components"; 15 | import { fixStorage } from "./store/fixStorage"; 16 | 17 | use([CanvasRenderer, LineChart, GridComponent, TooltipComponent]); 18 | 19 | fixStorage(); 20 | 21 | createApp(App) 22 | .use(createPinia()) 23 | .use(i18n) 24 | .component("v-chart", ECharts) 25 | .mount("#app"); 26 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/MaterialDeleteInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | message MaterialDeleteInfo { 6 | bool has_delete_config = 1; 7 | oneof delete_info { 8 | CountDownDelete count_down_delete = 2; 9 | DateTimeDelete date_delete = 3; 10 | DelayWeekCountDownDelete delay_week_count_down_delete = 4; 11 | } 12 | 13 | message CountDownDelete { 14 | map delete_time_num_map = 1; 15 | uint32 config_count_down_time = 2; 16 | } 17 | 18 | message DateTimeDelete { 19 | uint32 delete_time = 1; 20 | } 21 | 22 | message DelayWeekCountDownDelete { 23 | map delete_time_num_map = 1; 24 | uint32 config_delay_week = 2; 25 | uint32 config_count_down_time = 3; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/ys/p2p/excel/RelMP.ts: -------------------------------------------------------------------------------- 1 | interface IRelMP { 2 | [k: number | string]: string 3 | } 4 | 5 | export default { 6 | "10002": "hp_", 7 | "10004": "atk_", 8 | "10006": "def_", 9 | "10007": "enerRech_", 10 | "10008": "eleMas", 11 | "12001": "atk", 12 | "13002": "hp_", 13 | "13004": "atk_", 14 | "13006": "def_", 15 | "13007": "critRate_", 16 | "13008": "critDMG_", 17 | "13009": "heal_", 18 | "13010": "eleMas", 19 | "14001": "hp", 20 | "15002": "hp_", 21 | "15004": "atk_", 22 | "15006": "def_", 23 | "15007": "eleMas", 24 | "15008": "pyro_dmg_", 25 | "15009": "electro_dmg_", 26 | "15010": "cryo_dmg_", 27 | "15011": "hydro_dmg_", 28 | "15012": "anemo_dmg_", 29 | "15013": "geo_dmg_", 30 | "15015": "physical_dmg_" 31 | } -------------------------------------------------------------------------------- /src/ys/data/defaultSetBonusTable.json: -------------------------------------------------------------------------------- 1 | { 2 | "*": ["circlet_em", "circlet_cr", "circlet_cd"], 3 | "ThunderingFury": ["sands_atkp", "goblet_electroDB"], 4 | "MaidenBeloved": ["sands_hpp", "goblet_hpp", "circlet_hb"], 5 | "ViridescentVenerer": ["sands_em", "goblet_em", "goblet_anemoDB"], 6 | "CrimsonWitchOfFlames": ["sands_atkp", "sands_em", "goblet_pyroDB"], 7 | "BlizzardStrayer": ["sands_atkp", "goblet_cryoDB"], 8 | "HeartOfDepth": ["sands_atkp", "goblet_hydroDB"], 9 | "TenacityOfTheMillelith": ["sands_hpp", "goblet_hpp", "circlet_hpp"], 10 | "PaleFlame": ["sands_atkp", "goblet_physicalDB"], 11 | "OceanHuedClam": ["sands_hpp", "goblet_hpp", "circlet_hb"], 12 | "DeepwoodMemories": ["sands_em", "goblet_em", "goblet_dendroDB"], 13 | "GildedDreams": ["sands_em", "goblet_em"] 14 | } 15 | -------------------------------------------------------------------------------- /src/ys/types.ts: -------------------------------------------------------------------------------- 1 | import { CharacterData, PresetData } from "./data"; 2 | 3 | export interface IWeight { 4 | [key: string]: number; 5 | } 6 | 7 | export type { 8 | // affnum 9 | ISetBonusTable, 10 | IAffixWeightTable, 11 | IAffnumResult, 12 | IAffnumResults, 13 | // pbuild 14 | IBuild, 15 | IPBuildResult, 16 | IPBuildResults, 17 | IPBuildSortBy, 18 | // defeat 19 | IDefeatResults, 20 | // pequip 21 | IPEquipResults, 22 | } from "./sort"; 23 | 24 | export type IMinorAffixKey = 25 | | "hp" 26 | | "atk" 27 | | "def" 28 | | "hpp" 29 | | "atkp" 30 | | "defp" 31 | | "em" 32 | | "er" 33 | | "cr" 34 | | "cd"; 35 | 36 | export type ISlotKey = "flower" | "plume" | "sands" | "goblet" | "circlet"; 37 | 38 | export type ICharKey = keyof typeof CharacterData; 39 | 40 | export type IPresetKey = keyof typeof PresetData; 41 | -------------------------------------------------------------------------------- /scripts/deploy.sh: -------------------------------------------------------------------------------- 1 | set -e 2 | 3 | function info { 4 | echo "$(tput setaf 6)$1$(tput sgr0)" 5 | } 6 | 7 | function error { 8 | echo "$(tput setaf 1)$1$(tput sgr0)" 9 | } 10 | 11 | if [ ! -d "dist" ]; then 12 | error "Run 'yarn build' first" 13 | exit 1 14 | fi 15 | 16 | TARGETS=( 17 | "../ideless.github.io" 18 | "../ideless" 19 | ) 20 | 21 | for TARGET in "${TARGETS[@]}"; do 22 | if [ ! -d "${TARGET}" ]; then 23 | error "Target ${TARGET} does not exist, skipped" 24 | continue 25 | fi 26 | info "Deploying to ${TARGET}" 27 | rm -rf "${TARGET}/artifact" 28 | cp -r dist/ "${TARGET}/artifact" 29 | pushd "${TARGET}" 30 | if [ -n "$(git status --porcelain)" ]; then 31 | git add * 32 | git commit -m "update artifact" 33 | git push -f 34 | else 35 | info "No changes, skipped" 36 | fi 37 | popd 38 | done 39 | -------------------------------------------------------------------------------- /src/components/widgets/TextButton.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 29 | 30 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/GetPlayerTokenRsp.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | // CmdId: 131 6 | // EnetChannelId: 0 7 | // EnetIsReliable: true 8 | message GetPlayerTokenRsp { 9 | int32 retcode = 7; 10 | string msg = 10; 11 | uint32 uid = 2; 12 | string token = 1; 13 | uint32 black_uid_end_time = 15; 14 | uint32 account_type = 12; 15 | string account_uid = 4; 16 | bool is_proficient_player = 5; 17 | string secret_key = 13; 18 | uint32 gm_uid = 14; 19 | uint64 secret_key_seed = 11; 20 | bytes security_cmd_buffer = 6; 21 | uint32 platform_type = 3; 22 | bytes extra_bin_data = 8; 23 | bool is_guest = 9; 24 | uint32 channel_id = 1614; 25 | uint32 sub_channel_id = 1911; 26 | uint32 tag = 1855; 27 | string country_code = 739; 28 | bool is_login_white_list = 977; 29 | string psn_id = 245; 30 | string client_version_random_key = 1387; 31 | uint32 reg_platform = 633; 32 | string client_ip_str = 1238; 33 | string birthday = 1109; 34 | uint32 NNCIBOLDIAI = 1728; 35 | bool FNECFLEAKKO = 1679; 36 | } 37 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import vue from "@vitejs/plugin-vue"; 3 | // element-plus 4 | import AutoImport from "unplugin-auto-import/vite"; 5 | import Components from "unplugin-vue-components/vite"; 6 | import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; 7 | // alias @ 8 | import { resolve } from "path"; 9 | 10 | // https://vitejs.dev/config/ 11 | export default defineConfig({ 12 | base: "", 13 | resolve: { 14 | alias: { 15 | "@": resolve(__dirname, "src"), 16 | }, 17 | }, 18 | plugins: [ 19 | vue(), 20 | AutoImport({ 21 | resolvers: [ElementPlusResolver()], 22 | }), 23 | Components({ 24 | resolvers: [ElementPlusResolver()], 25 | }), 26 | ], 27 | css: { 28 | preprocessorOptions: { 29 | scss: { 30 | additionalData: `@use "./src/style/global.scss" as *;`, 31 | }, 32 | }, 33 | }, 34 | // server: { 35 | // watch: { 36 | // usePolling: true 37 | // } 38 | // }, 39 | }); 40 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "ts-node": { 3 | "transpileOnly": true, 4 | "files": true, 5 | "compilerOptions": { 6 | "module": "commonjs" 7 | } 8 | }, 9 | "compilerOptions": { 10 | "target": "ESNext", 11 | "useDefineForClassFields": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "strict": true, 15 | "jsx": "preserve", 16 | "resolveJsonModule": true, 17 | "isolatedModules": true, 18 | "esModuleInterop": true, 19 | "lib": [ 20 | "ESNext", 21 | "DOM" 22 | ], 23 | "skipLibCheck": true, 24 | "noEmit": true, 25 | "allowJs": true, 26 | "baseUrl": ".", 27 | "paths": { 28 | "@/*": [ 29 | "src/*" 30 | ] 31 | }, 32 | }, 33 | "include": [ 34 | "src/**/*.ts", 35 | "src/**/*.d.ts", 36 | "src/**/*.tsx", 37 | "src/**/*.vue" 38 | ], 39 | "references": [ 40 | { 41 | "path": "./tsconfig.node.json" 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Ideles 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/widgets/RangeSlider.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 27 | 28 | -------------------------------------------------------------------------------- /src/components/sections/SectionTitle.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | -------------------------------------------------------------------------------- /src/store/utils.ts: -------------------------------------------------------------------------------- 1 | export function assign(a: { [k: string]: any }, b: any) { 2 | if (!b || typeof b != "object") return false; 3 | Object.keys(b).forEach((key) => { 4 | if (a.hasOwnProperty(key)) { 5 | (a as any)[key] = b[key]; 6 | } 7 | }); 8 | return true; 9 | } 10 | 11 | export function isSameArray(a: any[], b: any[]) { 12 | if (a.length != b.length) return false; 13 | for (let i = 0; i < a.length; i++) { 14 | if (a[i] != b[i]) return false; 15 | } 16 | return true; 17 | } 18 | 19 | export function isSameObject(a: any, b: any) { 20 | let aKeys = Object.keys(a); 21 | let bKeys = Object.keys(b); 22 | if (aKeys.length != bKeys.length) return false; 23 | for (let i = 0; i < aKeys.length; i++) { 24 | let key = aKeys[i]; 25 | if (bKeys.indexOf(key) < 0) return false; 26 | if (a[key] != b[key]) return false; 27 | } 28 | return true; 29 | } 30 | 31 | export function isSame(a: any, b: any) { 32 | if (a == b) return true; 33 | if (a instanceof Array && b instanceof Array) { 34 | return isSameArray(a, b); 35 | } else if (typeof a == "object" && typeof b == "object") { 36 | return isSameObject(a, b); 37 | } 38 | return false; 39 | } 40 | -------------------------------------------------------------------------------- /src/ys/sort/normal.ts: -------------------------------------------------------------------------------- 1 | import { Artifact } from "../artifact"; 2 | import { ArtifactData } from "../data"; 3 | 4 | class Ord { 5 | private data: { [key: string]: number } = {}; 6 | set(key: string, value: number) { 7 | this.data[key] = value; 8 | } 9 | get(key: string) { 10 | if (key in this.data) return this.data[key]; 11 | else return -1; 12 | } 13 | } 14 | 15 | const SetOrd = new Ord(); 16 | const SlotOrd = new Ord(); 17 | const MainOrd = new Ord(); 18 | 19 | ArtifactData.setKeys.forEach((set, i) => SetOrd.set(set, i)); 20 | ArtifactData.slotKeys.forEach((slot, i) => SlotOrd.set(slot, i)); 21 | ArtifactData.mainKeys.all.forEach((main, i) => MainOrd.set(main, i)); 22 | 23 | /** 24 | * 按套装、部位、主词条、等级为关键字的标准排序 25 | * @param arts 待排序的圣遗物列表,会被修改 26 | */ 27 | export function sort(arts: Artifact[]) { 28 | arts.sort((a, b) => { 29 | let delta = 0; 30 | 31 | delta = SetOrd.get(a.set) - SetOrd.get(b.set); 32 | if (delta) return delta; 33 | 34 | delta = SlotOrd.get(a.slot) - SlotOrd.get(b.slot); 35 | if (delta) return delta; 36 | 37 | delta = MainOrd.get(a.mainKey) - MainOrd.get(b.mainKey); 38 | if (delta) return delta; 39 | 40 | return -a.level + b.level; 41 | }); 42 | } 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "artifact", 3 | "private": false, 4 | "license": "MIT", 5 | "version": "0.0.0", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc && vite build", 9 | "preview": "vite preview", 10 | "proto": "cd src/ys/p2p && pbjs -t static-module -w es6 --force-long -o proto.js proto/*.proto && pbts -o proto.d.ts proto.js", 11 | "deploy": "bash scripts/deploy.sh", 12 | "test": "vitest" 13 | }, 14 | "dependencies": { 15 | "@types/emscripten": "^1.39.6", 16 | "@vueuse/core": "^9.13.0", 17 | "axios": "^1.3.4", 18 | "echarts": "^5.4.1", 19 | "element-plus": "^2.3.0", 20 | "long": "^5.2.1", 21 | "pinia": "^2.0.33", 22 | "protobufjs": "^7.2.2", 23 | "sass": "^1.59.3", 24 | "vue": "^3.2.47", 25 | "vue-echarts": "^6.5.4", 26 | "vue-i18n": "^9.2.2", 27 | "vue-virtual-scroll-grid": "^1.10.1" 28 | }, 29 | "devDependencies": { 30 | "@types/node": "^18.15.3", 31 | "@vitejs/plugin-vue": "^4.1.0", 32 | "typescript": "^5.0.2", 33 | "unplugin-auto-import": "^0.15.1", 34 | "unplugin-vue-components": "^0.24.1", 35 | "vite": "^4.2.0", 36 | "vitest": "^0.29.8", 37 | "vue-tsc": "^1.2.0" 38 | }, 39 | "prettier": { 40 | "tabWidth": 4, 41 | "printWidth": 80 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/ys/p2p/proto/AvatarInfo.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_package = "emu.grasscutter.net.proto"; 4 | 5 | import "AvatarEquipAffixInfo.proto"; 6 | import "AvatarExcelInfo.proto"; 7 | import "AvatarExpeditionState.proto"; 8 | import "AvatarFetterInfo.proto"; 9 | import "AvatarSkillInfo.proto"; 10 | import "PropValue.proto"; 11 | import "TrialAvatarInfo.proto"; 12 | 13 | message AvatarInfo { 14 | uint32 avatar_id = 1; 15 | uint64 guid = 2; 16 | map prop_map = 3; 17 | uint32 life_state = 4; 18 | repeated uint64 equip_guid_list = 5; 19 | repeated uint32 talent_id_list = 6; 20 | map fight_prop_map = 7; 21 | TrialAvatarInfo trial_avatar_info = 9; 22 | map skill_map = 10; 23 | uint32 skill_depot_id = 11; 24 | AvatarFetterInfo fetter_info = 12; 25 | uint32 core_proud_skill_level = 13; 26 | repeated uint32 inherent_proud_skill_list = 14; 27 | map skill_level_map = 15; 28 | AvatarExpeditionState expedition_state = 16; 29 | map proud_skill_extra_level_map = 17; 30 | bool is_focus = 18; 31 | uint32 avatar_type = 19; 32 | repeated uint32 team_resonance_list = 20; 33 | uint32 wearing_flycloak_id = 21; 34 | repeated AvatarEquipAffixInfo equip_affix_list = 22; 35 | uint32 born_time = 23; 36 | repeated uint32 pending_promote_reward_list = 24; 37 | uint32 costume_id = 25; 38 | AvatarExcelInfo excel_info = 26; 39 | uint32 anim_hash = 27; 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue 3 + TypeScript + Vite 2 | 3 | This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` 10 | 11 | 26 | 27 | 55 | -------------------------------------------------------------------------------- /src/ys/p2p/p2p.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /** Above will import declarations from @types/emscripten, including Module etc. */ 3 | 4 | export interface IParser { 5 | new(): IParser 6 | /** 7 | * create a packet stream (don't forget to close it) 8 | * @param verbose default: -1 (do not log at all) 9 | */ 10 | open(data: Uint8Array): void 11 | /** 12 | * close current packet stream 13 | */ 14 | close(): void 15 | /** 16 | * set secret key seed you get from GetPlayerTokenRsp, applied per session 17 | */ 18 | setKeySeed(seed: string): void 19 | /** 20 | * set dispatch key seeds. 21 | * @param seeds array of decimal string of uint64 seeds 22 | */ 23 | setInitSeeds(seeds: string[]): void 24 | /** 25 | * read and decrypt a packet 26 | * @returns decrypted packet, or void if reaches end or if failed 27 | */ 28 | decryptPacket(): IPacket | void 29 | /** 30 | * set log level (log to _stdout) 31 | * @param verbose -1,0,1,2,... 32 | */ 33 | setLogLevel(verbose: number): void 34 | /** 35 | * a highlevel wrapper, do open+iterate+close for you 36 | */ 37 | parse(data: Uint8Array, callback: (packet: IPacket, ctx: IParser) => any): void 38 | } 39 | 40 | export interface IPacket { 41 | id: number 42 | protobuf: Uint8Array 43 | } 44 | 45 | // This will merge to the existing EmscriptenModule interface from @types/emscripten 46 | // If this doesn't work, try globalThis.EmscriptenModule instead. 47 | export interface P2PModule extends EmscriptenModule { 48 | Parser: IParser 49 | } 50 | 51 | export default function Module(): Promise; -------------------------------------------------------------------------------- /src/components/layouts/LayoutTop.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 30 | 31 | 60 | -------------------------------------------------------------------------------- /src/ys/p2p/pparser.ts: -------------------------------------------------------------------------------- 1 | import Module from './p2p'; 2 | import { 3 | GetPlayerTokenRsp, 4 | PlayerStoreNotify, 5 | AvatarDataNotify, 6 | } from './proto'; 7 | import store from './store'; 8 | 9 | const o = { 10 | async parseArtifacts(data: Uint8Array): Promise { 11 | throw new Error('pparser Uninitialized'); 12 | }, 13 | }; 14 | export default o; 15 | 16 | Module().then((p2p) => { 17 | let parser = new p2p.Parser(); 18 | 19 | parser.setInitSeeds(['5030560303351918544']); 20 | parser.setLogLevel(-1); 21 | 22 | o.parseArtifacts = async (data: Uint8Array) => { 23 | let s, a; 24 | parser.parse(data, (pkt, ctx) => { 25 | // console.log(pkt.id) 26 | if (pkt.id == 131) { 27 | let msg = GetPlayerTokenRsp.decode(pkt.protobuf); 28 | // console.log(msg) 29 | // console.log(msg.secretKeySeed.toString()) 30 | ctx.setKeySeed(msg.secretKeySeed.toString()); 31 | } else if (pkt.id == 609) { 32 | let msg = PlayerStoreNotify.decode(pkt.protobuf); 33 | s = PlayerStoreNotify.toObject(msg, { 34 | longs: String, 35 | enums: String, 36 | bytes: String, 37 | }); 38 | } else if (pkt.id == 1695) { 39 | let msg = AvatarDataNotify.decode(pkt.protobuf); 40 | a = AvatarDataNotify.toObject(msg, { 41 | longs: String, 42 | enums: String, 43 | bytes: String, 44 | }); 45 | return 1; // stop parsing 46 | } 47 | }); 48 | return store.toGood(s, a); 49 | }; 50 | }); 51 | -------------------------------------------------------------------------------- /src/ys/p2p/excel/Avatar.ts: -------------------------------------------------------------------------------- 1 | interface IAvatar { 2 | [k: number | string]: string 3 | } 4 | 5 | export default { 6 | "10000002": "KamisatoAyaka", 7 | "10000003": "Jean", 8 | "10000005": "Traveler", 9 | "10000006": "Lisa", 10 | "10000007": "Traveler", 11 | "10000014": "Barbara", 12 | "10000015": "Kaeya", 13 | "10000016": "Diluc", 14 | "10000020": "Razor", 15 | "10000021": "Amber", 16 | "10000022": "Venti", 17 | "10000023": "Xiangling", 18 | "10000024": "Beidou", 19 | "10000025": "Xingqiu", 20 | "10000026": "Xiao", 21 | "10000027": "Ningguang", 22 | "10000029": "Klee", 23 | "10000030": "Zhongli", 24 | "10000031": "Fischl", 25 | "10000032": "Bennett", 26 | "10000033": "Tartaglia", 27 | "10000034": "Noelle", 28 | "10000035": "Qiqi", 29 | "10000036": "Chongyun", 30 | "10000037": "Ganyu", 31 | "10000038": "Albedo", 32 | "10000039": "Diona", 33 | "10000041": "Mona", 34 | "10000042": "Keqing", 35 | "10000043": "Sucrose", 36 | "10000044": "Xinyan", 37 | "10000045": "Rosaria", 38 | "10000046": "HuTao", 39 | "10000047": "KaedeharaKazuha", 40 | "10000048": "Yanfei", 41 | "10000049": "Yoimiya", 42 | "10000050": "Thoma", 43 | "10000051": "Eula", 44 | "10000052": "RaidenShogun", 45 | "10000053": "Sayu", 46 | "10000054": "SangonomiyaKokomi", 47 | "10000055": "Gorou", 48 | "10000056": "KujouSara", 49 | "10000057": "AratakiItto", 50 | "10000058": "YaeMiko", 51 | "10000059": "ShikanoinHeizou", 52 | "10000060": "Yelan", 53 | "10000062": "Aloy", 54 | "10000063": "Shenhe", 55 | "10000064": "YunJin", 56 | "10000065": "KukiShinobu", 57 | "10000066": "KamisatoAyato", 58 | } 59 | 60 | -------------------------------------------------------------------------------- /src/components/dialogs/DatabaseLoader.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 54 | -------------------------------------------------------------------------------- /src/components/widgets/SingleSelect.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 45 | 46 | 76 | -------------------------------------------------------------------------------- /scripts/reliq.py: -------------------------------------------------------------------------------- 1 | from sympy import * 2 | from itertools import permutations, product 3 | 4 | init_printing() 5 | 6 | P_MINOR = { 7 | "hp": Rational(6, 44), 8 | "atk": Rational(6, 44), 9 | "def": Rational(6, 44), 10 | "hpp": Rational(4, 44), 11 | "atkp": Rational(4, 44), 12 | "defp": Rational(4, 44), 13 | "em": Rational(4, 44), 14 | "er": Rational(4, 44), 15 | "cr": Rational(3, 44), 16 | "cd": Rational(3, 44), 17 | } 18 | 19 | 20 | def get_avg_affnum( 21 | main_key: str, 22 | weight: dict[str, float], 23 | n_minors: int, 24 | minor_keys: list[str] 25 | ) -> float: 26 | avg_affnum = 0 27 | 28 | all_minor_keys = [key for key in P_MINOR.keys() 29 | if key != main_key and key not in minor_keys] 30 | p_all = sum(P_MINOR[key] for key in all_minor_keys) 31 | 32 | for new_minor_keys in permutations(all_minor_keys, min(n_minors, 4-len(minor_keys))): 33 | p = 1 34 | p_all_tmp = p_all 35 | for minor_key in new_minor_keys: 36 | p *= P_MINOR[minor_key] / p_all_tmp 37 | p_all_tmp -= P_MINOR[minor_key] 38 | 39 | avg_affnum_tmp = 0 40 | for minor_key in new_minor_keys: 41 | avg_affnum_tmp += weight[minor_key] * Rational(8+9, 20) 42 | 43 | for minor_key in minor_keys + list(new_minor_keys): 44 | avg_affnum_tmp += weight[minor_key] * \ 45 | Rational(8+9, 80) * max(n_minors-4+len(minor_keys), 0) 46 | 47 | avg_affnum += p * avg_affnum_tmp 48 | 49 | return avg_affnum 50 | 51 | 52 | if __name__ == "__main__": 53 | avg_affnum = get_avg_affnum( 54 | "atkp", 55 | { 56 | "hp": 0, 57 | "atk": 0, 58 | "def": 0, 59 | "hpp": 0, 60 | "atkp": 1, 61 | "defp": 0, 62 | "em": 0, 63 | "er": Rational(1, 3), 64 | "cr": Rational(1, 2), 65 | "cd": 1, 66 | }, 67 | 6, 68 | [] 69 | ) 70 | print(avg_affnum) 71 | -------------------------------------------------------------------------------- /src/components/dialogs/DefeatList.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 60 | 61 | 75 | -------------------------------------------------------------------------------- /src/components/dialogs/BuildProbs.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 70 | -------------------------------------------------------------------------------- /src/ys/p2p/excel/RelSet.ts: -------------------------------------------------------------------------------- 1 | interface IRelSet { 2 | [k: string | number]: { 3 | key: string 4 | ord: number 5 | } 6 | } 7 | 8 | export default { 9 | "14001": { 10 | "key": "BlizzardStrayer", 11 | "ord": 54 12 | }, 13 | "14002": { 14 | "key": "Thundersoother", 15 | "ord": 55 16 | }, 17 | "14003": { 18 | "key": "Lavawalker", 19 | "ord": 56 20 | }, 21 | "14004": { 22 | "key": "MaidenBeloved", 23 | "ord": 57 24 | }, 25 | "15001": { 26 | "key": "GladiatorsFinale", 27 | "ord": 58 28 | }, 29 | "15002": { 30 | "key": "ViridescentVenerer", 31 | "ord": 59 32 | }, 33 | "15003": { 34 | "key": "WanderersTroupe", 35 | "ord": 60 36 | }, 37 | "15005": { 38 | "key": "ThunderingFury", 39 | "ord": 61 40 | }, 41 | "15006": { 42 | "key": "CrimsonWitchOfFlames", 43 | "ord": 62 44 | }, 45 | "15007": { 46 | "key": "NoblesseOblige", 47 | "ord": 63 48 | }, 49 | "15008": { 50 | "key": "BloodstainedChivalry", 51 | "ord": 64 52 | }, 53 | "15014": { 54 | "key": "ArchaicPetra", 55 | "ord": 65 56 | }, 57 | "15015": { 58 | "key": "RetracingBolide", 59 | "ord": 66 60 | }, 61 | "15016": { 62 | "key": "HeartOfDepth", 63 | "ord": 67 64 | }, 65 | "15017": { 66 | "key": "TenacityOfTheMillelith", 67 | "ord": 68 68 | }, 69 | "15018": { 70 | "key": "PaleFlame", 71 | "ord": 69 72 | }, 73 | "15019": { 74 | "key": "ShimenawasReminiscence", 75 | "ord": 72 76 | }, 77 | "15020": { 78 | "key": "EmblemOfSeveredFate", 79 | "ord": 73 80 | }, 81 | "15021": { 82 | "key": "HuskOfOpulentDreams", 83 | "ord": 76 84 | }, 85 | "15022": { 86 | "key": "OceanHuedClam", 87 | "ord": 77 88 | }, 89 | "15023": { 90 | "key": "VermillionHereafter", 91 | "ord": 80 92 | }, 93 | "15024": { 94 | "key": "EchoesOfAnOffering", 95 | "ord": 81 96 | } 97 | } -------------------------------------------------------------------------------- /src/ys/gacha/reliq.test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from "vitest"; 2 | import { 3 | getIncreAffnumPdf, 4 | getIncreAffnumMinMaxAvg, 5 | getAffnumPdf, 6 | } from "./reliq"; 7 | import { moment } from "./utils"; 8 | 9 | const weight = { 10 | hp: 0, 11 | atk: 0, 12 | def: 0, 13 | hpp: 0, 14 | atkp: 1, 15 | defp: 0, 16 | em: 0, 17 | er: 1 / 3, 18 | cr: 1 / 2, 19 | cd: 1, 20 | }; 21 | 22 | test("Incremental Affnum PDF", () => { 23 | const pdf1 = getIncreAffnumPdf("atkp", weight, 8); 24 | expect(moment(pdf1, 0)).toBeCloseTo(1); 25 | expect(moment(pdf1, 1)).toBeCloseTo(367406465531 / 34247584800); 26 | const pdf2 = getIncreAffnumPdf("atkp", weight, 0); 27 | expect(moment(pdf2, 0)).toBeCloseTo(1); 28 | expect(moment(pdf2, 1)).toBeCloseTo(0); 29 | const pdf3 = getIncreAffnumPdf("atkp", weight, 1); 30 | expect(moment(pdf3, 0)).toBeCloseTo(1); 31 | expect(moment(pdf3, 1)).toBeCloseTo(119 / 96); 32 | }); 33 | 34 | test("Incremental Affnum PDF with fixed minors", () => { 35 | const pdf1 = getIncreAffnumPdf("atkp", weight, 6, ["cr", "atk"]); 36 | expect(moment(pdf1, 0)).toBeCloseTo(1); 37 | expect(moment(pdf1, 1)).toBeCloseTo(5358179 / 585900); 38 | const pdf2 = getIncreAffnumPdf("atkp", weight, 4, [ 39 | "cr", 40 | "atk", 41 | "hp", 42 | "em", 43 | ]); 44 | expect(moment(pdf2, 0)).toBeCloseTo(1); 45 | expect(moment(pdf2, 1)).toBeCloseTo(17 / 4); 46 | const pdf3 = getIncreAffnumPdf("atkp", weight, 0, ["cr", "atk"]); 47 | expect(moment(pdf3, 0)).toBeCloseTo(1); 48 | expect(moment(pdf3, 1)).toBeCloseTo(0); 49 | }); 50 | 51 | test("Min/max/avg of affnum", () => { 52 | expect(getIncreAffnumMinMaxAvg("atkp", weight, 0, [])).toEqual({ 53 | min: 0, 54 | max: 0, 55 | avg: 0, 56 | }); 57 | const result = getIncreAffnumMinMaxAvg("atkp", weight, 4, []); 58 | expect(result.min).toBeCloseTo(0); 59 | expect(result.max).toBeCloseTo(11 / 6); 60 | expect(result.avg).toBeCloseTo(367406465531 / 34247584800 / 20); 61 | }); 62 | 63 | test("Affnum PDF", () => { 64 | const pdf1 = getAffnumPdf("atkp", weight, 5); 65 | expect(moment(pdf1, 0)).toBeCloseTo(1); 66 | expect(moment(pdf1, 1)).toBeCloseTo( 67 | ((367406465531 / 34247584800) * 41) / 40 68 | ); 69 | const pdf2 = getAffnumPdf("atkp", weight, 3); 70 | expect(moment(pdf2, 0)).toBeCloseTo(1); 71 | expect(moment(pdf2, 1)).toBeCloseTo(2571845258717 / 456634464000); 72 | }); 73 | -------------------------------------------------------------------------------- /src/style/global.scss: -------------------------------------------------------------------------------- 1 | $widget-height: 38px; 2 | $primary-color: #1058ac; 3 | $primary-color-light: #1058ac11; 4 | $right-bgcolor: #f9fcff; 5 | $right-bgcolor-trsp: #f9fcff77; 6 | $green: #66c238; 7 | 8 | %button { 9 | width: 85px; 10 | height: $widget-height; 11 | display: inline-block; 12 | color: $primary-color; 13 | font-weight: bold; 14 | // border-radius: 3px; 15 | // box-shadow: 0 0 2px 0 #0007; 16 | // box-shadow: inset 0 0 0 2px white; 17 | border: 2px solid $primary-color; 18 | line-height: $widget-height - 4px; 19 | text-align: center; 20 | cursor: pointer; 21 | -webkit-user-select: none; 22 | user-select: none; 23 | } 24 | 25 | body { 26 | box-sizing: border-box; 27 | --el-color-primary: #1058ac; 28 | } 29 | 30 | * { 31 | box-sizing: inherit; 32 | padding: 0; 33 | margin: 0; 34 | } 35 | 36 | // 动画 37 | .pop-enter-active, 38 | .pop-leave-active { 39 | transition: all 200ms ease; 40 | } 41 | 42 | .pop-enter-from, 43 | .pop-leave-to { 44 | opacity: 0; 45 | transform: scale(0.9); 46 | } 47 | 48 | .fade-enter-active, 49 | .fade-leave-active { 50 | transition: all 200ms ease; 51 | } 52 | 53 | .fade-enter-from, 54 | .fade-leave-to { 55 | opacity: 0; 56 | } 57 | 58 | .switch-enter-active, 59 | .switch-leave-active { 60 | transition: all 100ms ease; 61 | } 62 | 63 | .switch-enter-from { 64 | opacity: 0; 65 | transform: translateY(50%) scale(0.5); 66 | } 67 | 68 | .switch-leave-to { 69 | opacity: 0; 70 | transform: translateY(-50%) scale(0.5); 71 | } 72 | 73 | .list-enter-from, 74 | .list-leave-to { 75 | opacity: 0; 76 | transform: scale(0.5); 77 | } 78 | 79 | .list-leave-active { 80 | position: absolute; 81 | } 82 | 83 | // 公用类 84 | .section { 85 | padding: 0 40px; 86 | } 87 | 88 | .section-content { 89 | margin-top: 24px; 90 | padding: 0 10px; 91 | } 92 | 93 | .info { 94 | font-size: smaller; 95 | font-weight: normal; 96 | font-style: italic; 97 | color: gray; 98 | // text-align: center; 99 | 100 | &::before { 101 | content: "* "; 102 | } 103 | } 104 | 105 | .small-title { 106 | display: flex; 107 | align-items: center; 108 | 109 | &::before { 110 | content: ""; 111 | display: inline-block; 112 | width: 5px; 113 | height: 15px; 114 | margin-right: 8px; 115 | border-radius: 5px; 116 | background-color: $primary-color; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/ys/sort/defeat.ts: -------------------------------------------------------------------------------- 1 | import { Artifact } from "../artifact"; 2 | 3 | export interface IDefeatResult { 4 | defeat: number; 5 | by: Artifact[]; 6 | } 7 | 8 | export type IDefeatResults = Map; 9 | 10 | const VecIndices: { [key: string]: number } = { 11 | cr: 0, 12 | cd: 1, 13 | em: 2, 14 | er: 3, 15 | atkp: 4, 16 | defp: 5, 17 | hpp: 6, 18 | }; 19 | 20 | /** 21 | * 按上位替代数从小到大排序。圣遗物b是圣遗物a的上位替代,如果它们类型相同, 22 | * 且a的所有副词条(除小攻/小生/小防外)b都有而且数值更大。 23 | * @param arts 圣遗物列表,会被修改 24 | * @returns results 25 | */ 26 | export function sort(arts: Artifact[]): IDefeatResults { 27 | const results = new Map(), 28 | mvecs = new Map(); 29 | 30 | let bins: { [key: string]: Artifact[] } = {}; 31 | // categorize artifacts into bins, and update defeat and mvec for each artifact 32 | for (let a of arts) { 33 | let categoryKey = 34 | a.slot + "," + a.mainKey + "," + Math.floor(a.level / 4); 35 | if (categoryKey in bins) { 36 | bins[categoryKey].push(a); 37 | } else { 38 | bins[categoryKey] = [a]; 39 | } 40 | results.set(a, { defeat: 0, by: [] }); 41 | mvecs.set(a, [0, 0, 0, 0, 0, 0, 0]); 42 | for (let m of a.minors) { 43 | // ignore atk, def and hp 44 | if (m.key in VecIndices) mvecs.get(a)![VecIndices[m.key]] = m.value; 45 | } 46 | } 47 | // enumerate inside each category (O(n^2)) 48 | for (let categoryKey in bins) { 49 | let len = bins[categoryKey].length; 50 | for (let i = 0; i < len - 1; ++i) { 51 | for (let j = i + 1; j < len; ++j) { 52 | let a = bins[categoryKey][i], 53 | b = bins[categoryKey][j]; 54 | // a Pareto comparison 55 | let cnt_a_over_b = 0, 56 | cnt_b_over_a = 0; 57 | for (let k = 0; k < 7; ++k) { 58 | if (mvecs.get(a)![k] >= mvecs.get(b)![k]) cnt_a_over_b++; 59 | if (mvecs.get(b)![k] >= mvecs.get(a)![k]) cnt_b_over_a++; 60 | } 61 | // only if these one cnt is 7 and the other <7, update defeat 62 | if (cnt_a_over_b == 7 && cnt_b_over_a < 7) { 63 | results.get(b)!.defeat++; 64 | results.get(b)!.by.push(a); 65 | } else if (cnt_b_over_a == 7 && cnt_a_over_b < 7) { 66 | results.get(a)!.defeat++; 67 | results.get(a)!.by.push(b); 68 | } 69 | } 70 | } 71 | } 72 | // sort by defeat, break ties arbitrarily 73 | arts.sort((a, b) => results.get(a)!.defeat - results.get(b)!.defeat); 74 | 75 | return results; 76 | } 77 | -------------------------------------------------------------------------------- /src/components/dialogs/EquipProbs.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 77 | 78 | 94 | -------------------------------------------------------------------------------- /src/components/dialogs/PartialExport.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 86 | -------------------------------------------------------------------------------- /src/ys/p2p/store.ts: -------------------------------------------------------------------------------- 1 | import Rel from './excel/Rel' 2 | import RelSet from './excel/RelSet' 3 | import RelMP from './excel/RelMP' 4 | import RelAffix from './excel/RelAffix' 5 | import Avatar from './excel/Avatar' 6 | 7 | interface IR { 8 | itemId: number 9 | guid: string 10 | equip: { 11 | reliquary: { 12 | level: number 13 | mainPropId: number 14 | appendPropIdList: number[] 15 | } 16 | isLocked?: boolean 17 | } 18 | } 19 | 20 | const SlotPrior: { [k: string]: number } = { 21 | flower: 4, 22 | plume: 3, 23 | sands: 2, 24 | goblet: 1, 25 | circlet: 0, 26 | } 27 | 28 | function cmp(v1: any, v2: any) { 29 | if (v1 < v2) throw 1 30 | else if (v1 > v2) throw -1 31 | } 32 | 33 | export default { 34 | toGood(store: any, avatar: any) { 35 | // get map: rel guid => owner 36 | let owner: any = {} 37 | avatar.avatarList.forEach((a: any) => { 38 | a.equipGuidList.forEach((g: string) => { 39 | owner[g] = Avatar[a.avatarId] 40 | }) 41 | }) 42 | // GOOD artifacts 43 | const GOOD: any = { 44 | format: "GOOD", 45 | version: 1, 46 | source: "pcap", 47 | } 48 | GOOD.artifacts = store.itemList 49 | .filter((item: any) => item.itemId in Rel) 50 | .sort((r1: IR, r2: IR) => { 51 | try { 52 | cmp(r1.equip.reliquary.level, r2.equip.reliquary.level) 53 | cmp(RelSet[Rel[r1.itemId].setId].ord, RelSet[Rel[r2.itemId].setId].ord) 54 | cmp(SlotPrior[Rel[r1.itemId].slot], SlotPrior[Rel[r2.itemId].slot]) 55 | cmp(r1.equip.reliquary.appendPropIdList.length, r2.equip.reliquary.appendPropIdList.length) 56 | cmp(r1.guid, r2.guid) 57 | return 0 58 | } catch (c) { 59 | return c 60 | } 61 | }) 62 | .map((r: IR) => { 63 | let a: any = {} 64 | a.setKey = RelSet[Rel[r.itemId].setId].key 65 | a.slotKey = Rel[r.itemId].slot 66 | a.level = r.equip.reliquary.level - 1 67 | a.rarity = 5 68 | a.mainStatKey = RelMP[r.equip.reliquary.mainPropId] 69 | a.lock = r.equip.isLocked ? true : false 70 | let substats: any = {} 71 | r.equip.reliquary.appendPropIdList.forEach(id => { 72 | if (!(RelAffix[id].key in substats)) 73 | substats[RelAffix[id].key] = 0 74 | substats[RelAffix[id].key] += RelAffix[id].val 75 | }) 76 | a.substats = Object.entries(substats).map(([key, value]) => ({ key, value })) 77 | a.location = owner[r.guid] ?? '' 78 | return a 79 | }) 80 | 81 | return GOOD; 82 | } 83 | } -------------------------------------------------------------------------------- /src/components/widgets/ArtifactList.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 90 | 91 | 113 | -------------------------------------------------------------------------------- /src/components/widgets/MultiSelectBase.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 82 | 83 | 113 | -------------------------------------------------------------------------------- /src/ys/data/defaultAffixWeightTable.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "set": "*", 4 | "type": "*", 5 | "label": "", 6 | "weight": { 7 | "hp": 0, 8 | "atk": 0, 9 | "def": 0, 10 | "hpp": 0, 11 | "atkp": 0.25, 12 | "defp": 0, 13 | "em": 0.25, 14 | "er": 0.25, 15 | "cr": 1, 16 | "cd": 1 17 | } 18 | }, 19 | { 20 | "set": "*", 21 | "type": "goblet_em", 22 | "label": "", 23 | "weight": { 24 | "hp": 0, 25 | "atk": 0, 26 | "def": 0, 27 | "hpp": 0, 28 | "atkp": 0.5, 29 | "defp": 0, 30 | "em": 0, 31 | "er": 1, 32 | "cr": 0, 33 | "cd": 0 34 | } 35 | }, 36 | { 37 | "set": "*", 38 | "type": "circlet_em", 39 | "label": "", 40 | "weight": { 41 | "hp": 0, 42 | "atk": 0, 43 | "def": 0, 44 | "hpp": 0, 45 | "atkp": 0.5, 46 | "defp": 0, 47 | "em": 0, 48 | "er": 1, 49 | "cr": 0, 50 | "cd": 0 51 | } 52 | }, 53 | { 54 | "set": "*", 55 | "type": "circlet_hb", 56 | "label": "", 57 | "weight": { 58 | "hp": 0, 59 | "atk": 0, 60 | "def": 0, 61 | "hpp": 1, 62 | "atkp": 0, 63 | "defp": 0, 64 | "em": 0.5, 65 | "er": 0.5, 66 | "cr": 0, 67 | "cd": 0 68 | } 69 | }, 70 | { 71 | "set": "MaidenBeloved", 72 | "type": "*", 73 | "label": "", 74 | "weight": { 75 | "hp": 0, 76 | "atk": 0, 77 | "def": 0, 78 | "hpp": 1, 79 | "atkp": 0, 80 | "defp": 0, 81 | "em": 0.5, 82 | "er": 1, 83 | "cr": 0, 84 | "cd": 0 85 | } 86 | }, 87 | { 88 | "set": "ViridescentVenerer", 89 | "type": "*", 90 | "label": "", 91 | "weight": { 92 | "hp": 0, 93 | "atk": 0, 94 | "def": 0, 95 | "hpp": 0, 96 | "atkp": 0.5, 97 | "defp": 0, 98 | "em": 1, 99 | "er": 1, 100 | "cr": 0, 101 | "cd": 0 102 | } 103 | }, 104 | { 105 | "set": "TenacityOfTheMillelith", 106 | "type": "*", 107 | "label": "", 108 | "weight": { 109 | "hp": 0, 110 | "atk": 0, 111 | "def": 0, 112 | "hpp": 1, 113 | "atkp": 0, 114 | "defp": 0, 115 | "em": 0.25, 116 | "er": 0.5, 117 | "cr": 1, 118 | "cd": 1 119 | } 120 | }, 121 | { 122 | "set": "OceanHuedClam", 123 | "type": "*", 124 | "label": "", 125 | "weight": { 126 | "hp": 0, 127 | "atk": 0, 128 | "def": 0, 129 | "hpp": 1, 130 | "atkp": 0, 131 | "defp": 0, 132 | "em": 0.5, 133 | "er": 1, 134 | "cr": 0, 135 | "cd": 0 136 | } 137 | } 138 | ] 139 | -------------------------------------------------------------------------------- /src/ys/ext/good.ts: -------------------------------------------------------------------------------- 1 | import { Artifact } from "../artifact"; 2 | import { assert, whatis } from "../utils"; 3 | import { ArtifactData } from "../data"; 4 | 5 | interface IGoodFormat { 6 | format: "GOOD"; 7 | version: number; 8 | source: string; 9 | artifacts?: Array<{ 10 | setKey: string; 11 | slotKey: string; 12 | level: number; 13 | rarity: number; 14 | mainStatKey: string; 15 | location: string; 16 | lock: boolean; 17 | substats: Array<{ 18 | key: string; 19 | value: number; 20 | }>; 21 | }>; 22 | } 23 | 24 | const keymap = { 25 | affix: <{ [key: string]: string }>{ 26 | hp: "hp", 27 | atk: "atk", 28 | def: "def", 29 | hpp: "hp_", 30 | atkp: "atk_", 31 | defp: "def_", 32 | em: "eleMas", 33 | er: "enerRech_", 34 | hb: "heal_", 35 | cr: "critRate_", 36 | cd: "critDMG_", 37 | pyroDB: "pyro_dmg_", 38 | hydroDB: "hydro_dmg_", 39 | electroDB: "electro_dmg_", 40 | anemoDB: "anemo_dmg_", 41 | cryoDB: "cryo_dmg_", 42 | geoDB: "geo_dmg_", 43 | physicalDB: "physical_dmg_", 44 | dendroDB: "dendro_dmg_", 45 | }, 46 | }; 47 | 48 | export default { 49 | loads(json: string) { 50 | let good = JSON.parse(json) as IGoodFormat; 51 | assert(typeof good == "object" && "artifacts" in good); 52 | assert(good.artifacts instanceof Array); 53 | let source = (good.source || "*") + "/good"; 54 | let result: Artifact[] = [], 55 | allSetKeys = new Set(ArtifactData.setKeys); 56 | good.artifacts!.forEach((a, i) => { 57 | if (a.rarity < 4) return; 58 | if (!allSetKeys.has(a.setKey)) { 59 | console.warn(`Ignoring unrecognized artifact: ${a.setKey}`); 60 | return; 61 | } 62 | let artifact = new Artifact({ 63 | set: a.setKey, 64 | slot: a.slotKey, 65 | level: a.level, 66 | rarity: a.rarity, 67 | location: a.location, 68 | lock: a.lock, 69 | mainKey: whatis(a.mainStatKey, keymap.affix) as string, 70 | minors: a.substats.map((x) => ({ 71 | key: whatis(x.key, keymap.affix), 72 | value: x.value, 73 | })), 74 | }); 75 | artifact.data.index = i; 76 | artifact.data.source = source; 77 | // artifact.validate() 78 | result.push(artifact); 79 | }); 80 | return result; 81 | }, 82 | dumps(artifacts: Artifact[]) { 83 | let good: IGoodFormat = { 84 | format: "GOOD", 85 | version: 1, 86 | source: "", 87 | artifacts: artifacts.map((a) => ({ 88 | setKey: a.set, 89 | slotKey: a.slot, 90 | level: a.level, 91 | rarity: a.rarity, 92 | lock: a.lock, 93 | location: a.location, 94 | mainStatKey: keymap.affix[a.mainKey], 95 | substats: a.minors.map((m) => ({ 96 | key: keymap.affix[m.key], 97 | value: m.value, 98 | })), 99 | })), 100 | }; 101 | return JSON.stringify(good); 102 | }, 103 | }; 104 | -------------------------------------------------------------------------------- /src/components/widgets/MultiSelect.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 55 | 56 | 120 | -------------------------------------------------------------------------------- /src/components/dialogs/BuildLoader.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | 103 | -------------------------------------------------------------------------------- /src/ys/utils/index.ts: -------------------------------------------------------------------------------- 1 | export function whatis(w: string, dict: { [key: string]: string }) { 2 | for (let key in dict) { 3 | if (dict[key] == w) { 4 | return key 5 | } 6 | } 7 | return undefined 8 | } 9 | 10 | export function assert(p: any, msg?: string) { 11 | if (!p) { 12 | throw new Error(msg) 13 | } 14 | } 15 | 16 | export function argmax(obj: { [key: string]: number }, A: Set): unknown { 17 | let m: number | undefined = undefined, 18 | ma: string | undefined = undefined 19 | A.forEach(a => { 20 | if (a in obj) { 21 | if (m === undefined || obj[a] > m) { 22 | m = obj[a] 23 | ma = a 24 | } 25 | } 26 | }) 27 | return ma 28 | } 29 | 30 | export function argmin(obj: { [key: string]: number }, A: Set): unknown { 31 | let m: number | undefined = undefined, 32 | ma: string | undefined = undefined 33 | A.forEach(a => { 34 | if (a in obj) { 35 | if (m === undefined || obj[a] < m) { 36 | m = obj[a] 37 | ma = a 38 | } 39 | } 40 | }) 41 | return ma 42 | } 43 | 44 | export function swap(arr: any[], i: number, j: number) { 45 | let tmp = arr[i] 46 | arr[i] = arr[j] 47 | arr[j] = tmp 48 | } 49 | 50 | export function choice(m: number): number 51 | export function choice(arr: T[]): T 52 | export function choice(arr: T[], p: number[]): T 53 | export function choice(arr: T[], p: number[], n: number): T[] 54 | export function choice(mOrArr: number | T[], p?: number[], n?: number): number | T | T[] { 55 | if (typeof mOrArr === 'number') { 56 | return Math.floor(Math.random() * mOrArr) 57 | } else if (p == undefined && n == undefined) { 58 | let i = Math.floor(Math.random() * mOrArr.length) 59 | return mOrArr[i] 60 | } else if (p && n == undefined) { 61 | let sum_p = 0 62 | p.forEach(x => sum_p += x) 63 | let acc = 0, r = sum_p * Math.random() 64 | for (let i = 0; i < mOrArr.length; ++i) { 65 | acc += p[i] 66 | if (r <= acc) return mOrArr[i] 67 | } 68 | return mOrArr[0] // 不可能到达这里 69 | } else if (p && n) { 70 | let a = [...mOrArr] 71 | let d = [...p] 72 | let sum_p = 0 73 | p.forEach(x => sum_p += x) 74 | for (let i = 0; i < n; ++i) { 75 | let r = Math.random() * sum_p 76 | let acc = 0 77 | for (let j = i; j < a.length; ++j) { 78 | acc += d[j] 79 | if (r <= acc) { 80 | sum_p -= d[j] 81 | swap(a, i, j) 82 | swap(d, i, j) 83 | break 84 | } 85 | } 86 | } 87 | return a.slice(0, n) 88 | } 89 | return 0 // 不应该到达这里 90 | } 91 | 92 | export class SimpleCache { 93 | cache: { [key: string]: T } = {} 94 | get: (args: A, extra?: E) => T 95 | constructor(calc: (args: A, extra: E) => T) { 96 | this.get = (args: A, extra?: E) => { 97 | let key = JSON.stringify(args) 98 | if (key in this.cache) return this.cache[key] 99 | return this.cache[key] = calc(args, extra!) 100 | } 101 | } 102 | set(args: A, value: T) { 103 | let key = JSON.stringify(args) 104 | this.cache[key] = value 105 | } 106 | clear() { 107 | this.cache = {} 108 | } 109 | } -------------------------------------------------------------------------------- /src/ys/p2p/excel/RelAffix.ts: -------------------------------------------------------------------------------- 1 | interface IRelAffix { 2 | [k: number | string]: { 3 | key: string 4 | val: number 5 | } 6 | } 7 | 8 | export default { 9 | "501021": { 10 | "key": "hp", 11 | "val": 209.13 12 | }, 13 | "501022": { 14 | "key": "hp", 15 | "val": 239 16 | }, 17 | "501023": { 18 | "key": "hp", 19 | "val": 268.88 20 | }, 21 | "501024": { 22 | "key": "hp", 23 | "val": 298.75 24 | }, 25 | "501031": { 26 | "key": "hp_", 27 | "val": 4.08 28 | }, 29 | "501032": { 30 | "key": "hp_", 31 | "val": 4.66 32 | }, 33 | "501033": { 34 | "key": "hp_", 35 | "val": 5.25 36 | }, 37 | "501034": { 38 | "key": "hp_", 39 | "val": 5.83 40 | }, 41 | "501051": { 42 | "key": "atk", 43 | "val": 13.62 44 | }, 45 | "501052": { 46 | "key": "atk", 47 | "val": 15.56 48 | }, 49 | "501053": { 50 | "key": "atk", 51 | "val": 17.51 52 | }, 53 | "501054": { 54 | "key": "atk", 55 | "val": 19.45 56 | }, 57 | "501061": { 58 | "key": "atk_", 59 | "val": 4.08 60 | }, 61 | "501062": { 62 | "key": "atk_", 63 | "val": 4.66 64 | }, 65 | "501063": { 66 | "key": "atk_", 67 | "val": 5.25 68 | }, 69 | "501064": { 70 | "key": "atk_", 71 | "val": 5.83 72 | }, 73 | "501081": { 74 | "key": "def", 75 | "val": 16.2 76 | }, 77 | "501082": { 78 | "key": "def", 79 | "val": 18.52 80 | }, 81 | "501083": { 82 | "key": "def", 83 | "val": 20.83 84 | }, 85 | "501084": { 86 | "key": "def", 87 | "val": 23.15 88 | }, 89 | "501091": { 90 | "key": "def_", 91 | "val": 5.1 92 | }, 93 | "501092": { 94 | "key": "def_", 95 | "val": 5.83 96 | }, 97 | "501093": { 98 | "key": "def_", 99 | "val": 6.56 100 | }, 101 | "501094": { 102 | "key": "def_", 103 | "val": 7.29 104 | }, 105 | "501201": { 106 | "key": "critRate_", 107 | "val": 2.72 108 | }, 109 | "501202": { 110 | "key": "critRate_", 111 | "val": 3.11 112 | }, 113 | "501203": { 114 | "key": "critRate_", 115 | "val": 3.5 116 | }, 117 | "501204": { 118 | "key": "critRate_", 119 | "val": 3.89 120 | }, 121 | "501221": { 122 | "key": "critDMG_", 123 | "val": 5.44 124 | }, 125 | "501222": { 126 | "key": "critDMG_", 127 | "val": 6.22 128 | }, 129 | "501223": { 130 | "key": "critDMG_", 131 | "val": 6.99 132 | }, 133 | "501224": { 134 | "key": "critDMG_", 135 | "val": 7.77 136 | }, 137 | "501231": { 138 | "key": "enerRech_", 139 | "val": 4.53 140 | }, 141 | "501232": { 142 | "key": "enerRech_", 143 | "val": 5.18 144 | }, 145 | "501233": { 146 | "key": "enerRech_", 147 | "val": 5.83 148 | }, 149 | "501234": { 150 | "key": "enerRech_", 151 | "val": 6.48 152 | }, 153 | "501241": { 154 | "key": "eleMas", 155 | "val": 16.32 156 | }, 157 | "501242": { 158 | "key": "eleMas", 159 | "val": 18.65 160 | }, 161 | "501243": { 162 | "key": "eleMas", 163 | "val": 20.98 164 | }, 165 | "501244": { 166 | "key": "eleMas", 167 | "val": 23.31 168 | } 169 | } -------------------------------------------------------------------------------- /src/ys/gacha/utils.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, bench } from "vitest"; 2 | import { 3 | range, 4 | zeros, 5 | product, 6 | permutations, 7 | // combinations, 8 | convolve, 9 | toPDF, 10 | toCDF, 11 | moment, 12 | mix, 13 | dot, 14 | rescale, 15 | } from "./utils"; 16 | 17 | test("range", () => { 18 | expect(range(0)).toEqual([]); 19 | expect(range(1)).toEqual([0]); 20 | expect(range(1, 1)).toEqual([]); 21 | expect(range(1, 2)).toEqual([1]); 22 | expect(range(1, 4, 2)).toEqual([1, 3]); 23 | expect(range(4, 1, -2)).toEqual([4, 2]); 24 | }); 25 | 26 | test("zeros", () => { 27 | expect(zeros(0)).toEqual([]); 28 | expect(zeros(1)).toEqual([0]); 29 | expect(zeros([1, 1])).toEqual([[0]]); 30 | expect(zeros([1, 1, 1])).toEqual([[[0]]]); 31 | expect(zeros([0, 1])).toEqual([]); 32 | expect(zeros([1, 0])).toEqual([]); 33 | }); 34 | 35 | test("product", () => { 36 | expect(product()).toEqual([[]]); 37 | expect(product([])).toEqual([]); 38 | expect(product([1, 2])).toEqual([[1], [2]]); 39 | expect(product([], [1, 2])).toEqual([]); 40 | expect(product([1, 2], [3, 4])).toEqual([ 41 | [1, 3], 42 | [1, 4], 43 | [2, 3], 44 | [2, 4], 45 | ]); 46 | }); 47 | 48 | test("permutations", () => { 49 | expect(permutations([])).toEqual([[]]); 50 | expect(permutations([1])).toEqual([[1]]); 51 | expect(permutations([1, 2])).toEqual([ 52 | [1, 2], 53 | [2, 1], 54 | ]); 55 | const perms = permutations([1, 2, 3]).map((a) => a.join(",")); 56 | expect(perms.length === 6); 57 | expect(new Set(perms).size == 6); 58 | }); 59 | 60 | // test("combinations", () => { 61 | // expect(Array.from(combinations([], 1))).toEqual([]); 62 | // expect(Array.from(combinations([1], 0))).toEqual([[]]); 63 | // expect(Array.from(combinations([1, 2], 1))).toEqual([[1], [2]]); 64 | // expect(Array.from(combinations([1, 2, 3], 2))).toEqual([ 65 | // [1, 2], 66 | // [1, 3], 67 | // [2, 3], 68 | // ]); 69 | // }); 70 | 71 | test("convolve", () => { 72 | expect(convolve()).toEqual([]); 73 | expect(convolve([])).toEqual([]); 74 | expect(convolve([1], [])).toEqual([]); 75 | expect(convolve([0.5, 0.5])).toEqual([0.5, 0.5]); 76 | expect(convolve([0.5, 0.5], [0.2, 0.8])).toEqual([0.1, 0.5, 0.4]); 77 | }); 78 | 79 | test("toPDF", () => { 80 | expect(toPDF([])).toEqual([]); 81 | expect(toPDF([1])).toEqual([1]); 82 | expect(toPDF([0.5, 1])).toEqual([0.5, 0.5]); 83 | }); 84 | 85 | test("toCDF", () => { 86 | expect(toCDF([])).toEqual([]); 87 | expect(toCDF([1])).toEqual([1]); 88 | expect(toCDF([0.5, 0.5])).toEqual([0.5, 1]); 89 | }); 90 | 91 | test("moment", () => { 92 | expect(moment([])).toEqual(0); 93 | expect(moment([0.5, 0.3, 0.2], 0)).toEqual(1); 94 | expect(moment([0.5, 0.3, 0.2], 1)).toEqual(0.7); 95 | expect(moment([0.5, 0.3, 0.2], 2)).toEqual(1.1); 96 | }); 97 | 98 | test("mix", () => { 99 | expect(() => mix([], [])).toThrowError(); 100 | expect(() => mix([], [1])).toThrowError(); 101 | expect(mix([[0.5, 0.5]], [1])).toEqual([0.5, 0.5]); 102 | expect(mix([[0.5, 0.5]], [0.2])).toEqual([0.9, 0.1]); 103 | expect(mix([[0.5, 0.5], [1]], [0.2, 0.8])).toEqual([0.9, 0.1]); 104 | }); 105 | 106 | test("dot", () => { 107 | expect(() => dot()).toThrowError(); 108 | expect(dot([1])).toEqual([1]); 109 | expect(dot([0.5, 0.5], [1])).toEqual([0.5]); 110 | }); 111 | 112 | test("rescale", () => { 113 | expect(rescale([0.5, 0.5], 0.1)).toEqual([1]); 114 | expect(rescale([0.5, 0.5], 2)).toEqual([0.5, 0, 0.5]); 115 | }); 116 | -------------------------------------------------------------------------------- /src/components/dialogs/AlikeLocker.vue: -------------------------------------------------------------------------------- 1 | 100 | 101 | 122 | -------------------------------------------------------------------------------- /src/components/dialogs/PresetLoader.vue: -------------------------------------------------------------------------------- 1 | 74 | 75 | 124 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 68 | 69 | 98 | 99 | 148 | -------------------------------------------------------------------------------- /src/components/widgets/ValueButton.vue: -------------------------------------------------------------------------------- 1 | 79 | 80 | 100 | 101 | 141 | --------------------------------------------------------------------------------