Merge branch 'main' into dependabot/npm_and_yarn/glob-parent-5.1.2

pull/1/head
Made Baruna 2021-08-03 01:00:43 +07:00
commit 75420d47a1
No known key found for this signature in database
GPG Key ID: 5AA5DA16AA5DCEAD
179 changed files with 6343 additions and 405 deletions

View File

@ -486,7 +486,6 @@
detectPlatform();
selectedServer = servers.find((e) => e.value === $server);
});
</script>
{#if processingLog}
@ -663,6 +662,9 @@
</div>
{#if selectedType === 'pc'}
<div class="bg-background rounded-xl px-4 py-2 text-white mb-4 mt-2">
<a href="https://www.youtube.com/watch?v=gsyp6SENJb4" target="_blank" class="text-primary hover:underline">
{$t('wish.import.guide.video')}
</a>
<ol class="list-decimal ml-4">
<li class="my-2">{$t('wish.import.guide.pc.0')}</li>
<li class="my-2">{$t('wish.import.guide.pc.1')}</li>
@ -810,5 +812,4 @@
@apply block;
}
} */
</style>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -158,6 +158,27 @@ export const banners = {
featuredRare: ['fischl', 'sucrose', 'barbara'],
timezoneDependent: true,
},
{
name: 'Leaves in the Wind',
image: 1,
shortName: 'Kazuha',
start: '2021-06-29 18:00:00',
end: '2021-07-20 14:59:59',
color: '#8FFFDE',
featured: ['kaedehara_kazuha'],
featuredRare: ['bennett', 'razor', 'rosaria'],
},
{
name: 'The Herons Court',
image: 1,
shortName: 'Ayaka',
start: '2021-07-21 06:00:00',
end: '2021-08-10 17:59:59',
color: '#FFFBF7',
featured: ['kamisato_ayaka'],
featuredRare: ['chongyun', 'ningguang', 'yanfei'],
timezoneDependent: true,
},
],
weapons: [
{
@ -289,5 +310,26 @@ export const banners = {
featuredRare: ['mitternachts_waltz', 'lions_roar', 'the_bell', 'favonius_lance', 'the_widsith'],
timezoneDependent: true,
},
{
name: 'Epitome Invocation',
image: 14,
start: '2021-06-29 18:00:00',
end: '2021-07-20 14:59:59',
shortName: 'Freedom-Sworn',
color: '#424ef5',
featured: ['freedom-sworn', 'skyward_atlas'],
featuredRare: ['the_alley_flash', 'wine_and_song', 'alley_hunter', 'favonius_greatsword', 'dragons_bane'],
},
{
name: 'Epitome Invocation',
image: 15,
start: '2021-07-21 06:00:00',
end: '2021-08-10 17:59:59',
shortName: 'Mistsplitter',
color: '#b042f5',
featured: ['mistsplitter_reforged', 'skyward_spine'],
featuredRare: ['favonius_sword', 'sacrificial_greatsword', 'favonius_lance', 'favonius_codex', 'the_stringless'],
timezoneDependent: true,
},
],
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -998,6 +998,148 @@ export const characters = {
boss: itemList.spirit_locket_of_boreas,
},
},
kaedehara_kazuha: {
name: 'Kaedehara Kazuha',
id: 'kaedehara_kazuha',
rarity: 5,
element: elements.anemo,
weapon: weapons.sword,
sex: 'male',
nation: 'inazuma',
ascension: [
{
items: [
{ item: itemList.vayuda_turquoise_sliver, amount: 1 },
{ item: itemList.none, amount: null },
{ item: itemList.sea_ganoderma, amount: 3 },
{ item: itemList.treasure_hoarder_insignia, amount: 3 },
],
mora: 20000,
},
{
items: [
{ item: itemList.vayuda_turquoise_fragment, amount: 3 },
{ item: itemList.marionette_core, amount: 2 },
{ item: itemList.sea_ganoderma, amount: 10 },
{ item: itemList.treasure_hoarder_insignia, amount: 15 },
],
mora: 40000,
},
{
items: [
{ item: itemList.vayuda_turquoise_fragment, amount: 6 },
{ item: itemList.marionette_core, amount: 4 },
{ item: itemList.sea_ganoderma, amount: 20 },
{ item: itemList.silver_raven_insignia, amount: 12 },
],
mora: 60000,
},
{
items: [
{ item: itemList.vayuda_turquoise_chunk, amount: 3 },
{ item: itemList.marionette_core, amount: 8 },
{ item: itemList.sea_ganoderma, amount: 30 },
{ item: itemList.silver_raven_insignia, amount: 18 },
],
mora: 80000,
},
{
items: [
{ item: itemList.vayuda_turquoise_chunk, amount: 6 },
{ item: itemList.marionette_core, amount: 12 },
{ item: itemList.sea_ganoderma, amount: 45 },
{ item: itemList.golden_raven_insignia, amount: 12 },
],
mora: 100000,
},
{
items: [
{ item: itemList.vayuda_turquoise_gemstone, amount: 6 },
{ item: itemList.marionette_core, amount: 20 },
{ item: itemList.sea_ganoderma, amount: 60 },
{ item: itemList.golden_raven_insignia, amount: 24 },
],
mora: 120000,
},
],
stats: { hp: 13348, atk: 297, def: 807 },
material: {
book: [itemList.teachings_of_diligence, itemList.guide_to_diligence, itemList.philosophies_of_diligence],
material: [itemList.treasure_hoarder_insignia, itemList.silver_raven_insignia, itemList.golden_raven_insignia],
boss: itemList.gilded_scale,
},
},
kamisato_ayaka: {
name: 'Kamisato Ayaka',
id: 'kamisato_ayaka',
rarity: 5,
element: elements.cryo,
weapon: weapons.sword,
sex: 'female',
nation: 'inazuma',
ascension: [
{
items: [
{ item: itemList.shivada_jade_sliver, amount: 1 },
{ item: itemList.none, amount: null },
{ item: itemList.sakura_bloom, amount: 3 },
{ item: itemList.old_handguard, amount: 3 },
],
mora: 20000,
},
{
items: [
{ item: itemList.shivada_jade_fragment, amount: 3 },
{ item: itemList.perpetual_heart, amount: 2 },
{ item: itemList.sakura_bloom, amount: 10 },
{ item: itemList.old_handguard, amount: 15 },
],
mora: 40000,
},
{
items: [
{ item: itemList.shivada_jade_fragment, amount: 6 },
{ item: itemList.perpetual_heart, amount: 4 },
{ item: itemList.sakura_bloom, amount: 20 },
{ item: itemList.kageuchi_handguard, amount: 12 },
],
mora: 60000,
},
{
items: [
{ item: itemList.shivada_jade_chunk, amount: 3 },
{ item: itemList.perpetual_heart, amount: 8 },
{ item: itemList.sakura_bloom, amount: 30 },
{ item: itemList.kageuchi_handguard, amount: 18 },
],
mora: 80000,
},
{
items: [
{ item: itemList.shivada_jade_chunk, amount: 6 },
{ item: itemList.perpetual_heart, amount: 12 },
{ item: itemList.sakura_bloom, amount: 45 },
{ item: itemList.famed_handguard, amount: 12 },
],
mora: 100000,
},
{
items: [
{ item: itemList.shivada_jade_gemstone, amount: 6 },
{ item: itemList.perpetual_heart, amount: 20 },
{ item: itemList.sakura_bloom, amount: 60 },
{ item: itemList.famed_handguard, amount: 24 },
],
mora: 120000,
},
],
stats: { hp: 11954, atk: 318, def: 729 },
material: {
book: [itemList.teachings_of_elegance, itemList.guide_to_elegance, itemList.philosophies_of_elegance],
material: [itemList.old_handguard, itemList.kageuchi_handguard, itemList.famed_handguard],
boss: itemList.bloodjade_branch,
},
},
keqing: {
name: 'Keqing',
id: 'keqing',
@ -1854,6 +1996,7 @@ export const characters = {
itemList.philosophies_of_ballad,
itemList.philosophies_of_freedom,
itemList.philosophies_of_resistance,
itemList.philosophies_of_ballad,
],
material: [
itemList.divining_scroll,
@ -1864,6 +2007,7 @@ export const characters = {
itemList.forbidden_curse_scroll,
itemList.forbidden_curse_scroll,
itemList.forbidden_curse_scroll,
itemList.forbidden_curse_scroll,
],
boss: itemList.dvalins_sigh,
},
@ -1875,7 +2019,7 @@ export const characters = {
element: elements.geo,
weapon: weapons.sword,
sex: "player's choice",
nation: 'mondstadt',
nation: 'liyue',
ascension: [
{
items: [
@ -1943,6 +2087,7 @@ export const characters = {
itemList.philosophies_of_gold,
itemList.philosophies_of_prosperity,
itemList.philosophies_of_diligence,
itemList.philosophies_of_gold,
],
material: [
itemList.firm_arrowhead,
@ -1953,6 +2098,7 @@ export const characters = {
itemList.weathered_arrowhead,
itemList.weathered_arrowhead,
itemList.weathered_arrowhead,
itemList.weathered_arrowhead,
],
boss: itemList.tail_of_boreas,
},
@ -1966,6 +2112,7 @@ export const characters = {
itemList.philosophies_of_ballad,
itemList.philosophies_of_freedom,
itemList.philosophies_of_resistance,
itemList.philosophies_of_ballad,
],
material: [
itemList.divining_scroll,
@ -1976,10 +2123,103 @@ export const characters = {
itemList.forbidden_curse_scroll,
itemList.forbidden_curse_scroll,
itemList.forbidden_curse_scroll,
itemList.forbidden_curse_scroll,
],
boss: itemList.dvalins_sigh,
},
},
traveler_electro: {
name: 'Traveler (Electro)',
id: 'traveler_electro',
rarity: 5,
element: elements.electro,
weapon: weapons.sword,
sex: "player's choice",
nation: 'inazuma',
ascension: [
{
items: [
{ item: itemList.brilliant_diamond_sliver, amount: 1 },
{ item: itemList.none, amount: null },
{ item: itemList.windwheel_aster, amount: 3 },
{ item: itemList.damaged_mask, amount: 3 },
],
mora: 20000,
},
{
items: [
{ item: itemList.brilliant_diamond_fragment, amount: 3 },
{ item: itemList.none, amount: null },
{ item: itemList.windwheel_aster, amount: 10 },
{ item: itemList.damaged_mask, amount: 15 },
],
mora: 40000,
},
{
items: [
{ item: itemList.brilliant_diamond_fragment, amount: 6 },
{ item: itemList.none, amount: null },
{ item: itemList.windwheel_aster, amount: 20 },
{ item: itemList.stained_mask, amount: 12 },
],
mora: 60000,
},
{
items: [
{ item: itemList.brilliant_diamond_chunk, amount: 3 },
{ item: itemList.none, amount: null },
{ item: itemList.windwheel_aster, amount: 30 },
{ item: itemList.stained_mask, amount: 18 },
],
mora: 80000,
},
{
items: [
{ item: itemList.brilliant_diamond_chunk, amount: 6 },
{ item: itemList.none, amount: null },
{ item: itemList.windwheel_aster, amount: 45 },
{ item: itemList.ominous_mask, amount: 12 },
],
mora: 100000,
},
{
items: [
{ item: itemList.brilliant_diamond_gemstone, amount: 6 },
{ item: itemList.none, amount: null },
{ item: itemList.windwheel_aster, amount: 60 },
{ item: itemList.ominous_mask, amount: 24 },
],
mora: 120000,
},
],
stats: { hp: 10122, atk: 198, def: 635 },
material: {
book: [
itemList.teachings_of_transience,
itemList.guide_to_elegance,
itemList.guide_to_light,
itemList.guide_to_transience,
itemList.guide_to_elegance,
itemList.philosophies_of_light,
itemList.philosophies_of_transience,
itemList.philosophies_of_elegance,
itemList.philosophies_of_light,
],
material: [
itemList.old_handguard,
itemList.kageuchi_handguard,
itemList.kageuchi_handguard,
itemList.kageuchi_handguard,
itemList.kageuchi_handguard,
itemList.famed_handguard,
itemList.famed_handguard,
itemList.famed_handguard,
itemList.famed_handguard,
],
boss: itemList.dragon_lords_crown,
},
},
venti: {
name: 'Venti',
id: 'venti',

105
src/data/friendshipExp.js Normal file
View File

@ -0,0 +1,105 @@
export const friendshipExp = [1000, 1550, 2050, 2600, 3175, 3750, 4350, 4975, 5650];
export const commissionExp = [
25,
25,
25,
25,
30,
30,
30,
30,
30,
35,
35,
35,
35,
35,
35,
35,
35,
35,
35,
40,
40,
40,
40,
40,
45,
45,
45,
45,
45,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
55,
55,
55,
55,
55,
60,
60,
60,
60,
60,
];
export const commissionBonusExp = [
45,
45,
45,
45,
55,
55,
55,
55,
55,
55,
55,
55,
55,
65,
65,
65,
65,
65,
70,
70,
70,
70,
70,
75,
75,
75,
75,
75,
75,
85,
85,
85,
85,
85,
85,
85,
85,
85,
85,
95,
95,
95,
95,
95,
100,
100,
100,
100,
100,
];

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -31,6 +31,21 @@ export const itemGroup = {
items: [itemList.teachings_of_prosperity, itemList.guide_to_prosperity, itemList.philosophies_of_prosperity],
type: 'book',
},
teachings_of_transience: {
name: 'Transience',
items: [itemList.teachings_of_transience, itemList.guide_to_transience, itemList.philosophies_of_transience],
type: 'book',
},
teachings_of_elegance: {
name: 'Elegance',
items: [itemList.teachings_of_elegance, itemList.guide_to_elegance, itemList.philosophies_of_elegance],
type: 'book',
},
teachings_of_light: {
name: 'Light',
items: [itemList.teachings_of_light, itemList.guide_to_light, itemList.philosophies_of_light],
type: 'book',
},
tile_of_decarabians_tower: {
name: 'Decarabian',
items: [
@ -91,6 +106,31 @@ export const itemGroup = {
],
type: 'weapon',
},
coral_branch_of_a_distant_sea: {
name: 'Distant Sea',
items: [
itemList.coral_branch_of_a_distant_sea,
itemList.jeweled_branch_of_a_distant_sea,
itemList.jade_branch_of_a_distant_sea,
itemList.golden_branch_of_a_distant_sea,
],
type: 'weapon',
},
narukamis_wisdom: {
name: 'Narukami',
items: [itemList.narukamis_wisdom, itemList.narukamis_joy, itemList.narukamis_affection, itemList.narukamis_valor],
type: 'weapon',
},
mask_of_the_wicked_lieutenant: {
name: 'Mask',
items: [
itemList.mask_of_the_wicked_lieutenant,
itemList.mask_of_the_tigers_bite,
itemList.mask_of_the_one_horned,
itemList.mask_of_the_kijin,
],
type: 'weapon',
},
agnidus_agate_sliver: {
name: 'Agnidus Agate',
items: [
@ -163,66 +203,36 @@ export const itemGroup = {
},
juvenile_jade: {
name: 'Juvenile Jade',
items: [
itemList.juvenile_jade
],
items: [itemList.juvenile_jade],
type: 'ascension_gem',
},
chaos_device: {
name: 'Chaos',
items: [
itemList.chaos_device,
itemList.chaos_circuit,
itemList.chaos_core,
],
items: [itemList.chaos_device, itemList.chaos_circuit, itemList.chaos_core],
},
damaged_mask: {
name: 'Mask',
items: [
itemList.damaged_mask,
itemList.stained_mask,
itemList.ominous_mask,
],
items: [itemList.damaged_mask, itemList.stained_mask, itemList.ominous_mask],
},
dead_ley_line_branch: {
name: 'Dead Ley Line',
items: [
itemList.dead_ley_line_branch,
itemList.dead_ley_line_leaves,
itemList.ley_line_sprouts,
],
items: [itemList.dead_ley_line_branch, itemList.dead_ley_line_leaves, itemList.ley_line_sprouts],
},
divining_scroll: {
name: 'Scroll',
items: [
itemList.divining_scroll,
itemList.sealed_scroll,
itemList.forbidden_curse_scroll,
],
items: [itemList.divining_scroll, itemList.sealed_scroll, itemList.forbidden_curse_scroll],
},
firm_arrowhead: {
name: 'Arrowhead',
items: [
itemList.firm_arrowhead,
itemList.sharp_arrowhead,
itemList.weathered_arrowhead,
],
items: [itemList.firm_arrowhead, itemList.sharp_arrowhead, itemList.weathered_arrowhead],
},
fragile_bone_shard: {
name: 'Bone Shard',
items: [
itemList.fragile_bone_shard,
itemList.sturdy_bone_shard,
itemList.fossilized_bone_shard,
],
items: [itemList.fragile_bone_shard, itemList.sturdy_bone_shard, itemList.fossilized_bone_shard],
},
heavy_horn: {
name: 'Horn',
items: [
itemList.heavy_horn,
itemList.black_bronze_horn,
itemList.black_crystal_horn,
],
items: [itemList.heavy_horn, itemList.black_bronze_horn, itemList.black_crystal_horn],
},
hunters_sacrificial_knife: {
name: 'Knife',
@ -234,42 +244,38 @@ export const itemGroup = {
},
mist_grass_pollen: {
name: 'Mist Grass',
items: [
itemList.mist_grass_pollen,
itemList.mist_grass,
itemList.mist_grass_wick,
],
items: [itemList.mist_grass_pollen, itemList.mist_grass, itemList.mist_grass_wick],
},
recruits_insignia: {
name: 'Insignia',
items: [
itemList.recruits_insignia,
itemList.sergeants_insignia,
itemList.lieutenants_insignia,
],
items: [itemList.recruits_insignia, itemList.sergeants_insignia, itemList.lieutenants_insignia],
},
slime_condensate: {
name: 'Slime',
items: [
itemList.slime_condensate,
itemList.slime_secretions,
itemList.slime_concentrate,
],
items: [itemList.slime_condensate, itemList.slime_secretions, itemList.slime_concentrate],
},
treasure_hoarder_insignia: {
name: 'Treasure Hoarder Insignia',
items: [
itemList.treasure_hoarder_insignia,
itemList.silver_raven_insignia,
itemList.golden_raven_insignia,
],
items: [itemList.treasure_hoarder_insignia, itemList.silver_raven_insignia, itemList.golden_raven_insignia],
},
whopperflower_nectar: {
name: 'Nectar',
items: [
itemList.whopperflower_nectar,
itemList.shimmering_nectar,
itemList.energy_nectar,
],
items: [itemList.whopperflower_nectar, itemList.shimmering_nectar, itemList.energy_nectar],
},
chaos_gear: {
name: 'Chaos Gear',
items: [itemList.chaos_gear, itemList.chaos_axis, itemList.chaos_oculus],
},
old_handguard: {
name: 'Hanguard',
items: [itemList.old_handguard, itemList.kageuchi_handguard, itemList.famed_handguard],
},
chaos_gear: {
name: 'Gear',
items: [itemList.chaos_gear, itemList.chaos_axis, itemList.chaos_oculus],
},
dismal_prism: {
name: 'Prism',
items: [itemList.dismal_prism, itemList.crystal_prism, itemList.polarizing_prism],
},
};

View File

@ -637,5 +637,175 @@ export const itemList = {
juvenile_jade: { id: 'juvenile_jade', name: 'Juvenile Jade', rarity: 5 },
bloodjade_branch: { id: 'bloodjade_branch', name: 'Bloodjade Branch', rarity: 5 },
crystalline_bloom: { id: 'crystalline_bloom', name: 'Crystalline Bloom', rarity: 5 },
dragon_lords_crown: { id: 'dragon_lords_crown', name: "Dragon Lord's Crown", rarity: 5 }
dragon_lords_crown: { id: 'dragon_lords_crown', name: "Dragon Lord's Crown", rarity: 5 },
sea_ganoderma: { id: 'sea_ganoderma', name: 'Sea Ganoderma' },
marionette_core: { id: 'marionette_core', name: 'Marionette Core', rarity: 4 },
gilded_scale: { id: 'gilded_scale', name: 'Gilded Scale', rarity: 5 },
coral_branch_of_a_distant_sea: {
id: 'coral_branch_of_a_distant_sea',
name: 'Coral Branch of a Distant Sea',
day: ['monday', 'thursday'],
rarity: 1,
},
jeweled_branch_of_a_distant_sea: {
id: 'jeweled_branch_of_a_distant_sea',
name: 'Jeweled Branch of a Distant Sea',
day: ['monday', 'thursday'],
rarity: 2,
parent: 'coral_branch_of_a_distant_sea',
},
jade_branch_of_a_distant_sea: {
id: 'jade_branch_of_a_distant_sea',
name: 'Jade Branch of a Distant Sea',
day: ['monday', 'thursday'],
rarity: 3,
parent: 'coral_branch_of_a_distant_sea',
},
golden_branch_of_a_distant_sea: {
id: 'golden_branch_of_a_distant_sea',
name: 'Golden Branck of a Golden Sea',
day: ['monday', 'thursday'],
rarity: 4,
parent: 'coral_branch_of_a_distant_sea',
},
narukamis_wisdom: {
id: 'narukamis_wisdom',
name: "Narukami's Wisdom",
day: ['tuesday', 'friday'],
rarity: 1,
},
narukamis_joy: {
id: 'narukamis_joy',
name: "Narukami's Joy",
day: ['tuesday', 'friday'],
rarity: 2,
parent: 'narukamis_wisdom',
},
narukamis_affection: {
id: 'narukamis_affection',
name: "Narukami's Affection",
day: ['tuesday', 'friday'],
rarity: 3,
parent: 'narukamis_wisdom',
},
narukamis_valor: {
id: 'narukamis_valor',
name: "Narukami's Valor",
day: ['tuesday', 'friday'],
rarity: 4,
parent: 'narukamis_wisdom',
},
mask_of_the_wicked_lieutenant: {
id: 'mask_of_the_wicked_lieutenant',
name: 'Mask of the Wicked Lieutenant',
day: ['wednesday', 'saturday'],
rarity: 1,
},
mask_of_the_tigers_bite: {
id: 'mask_of_the_tigers_bite',
name: "Mask of the Tiger's Bite",
day: ['wednesday', 'saturday'],
rarity: 2,
parent: 'mask_of_the_wicked_lieutenant',
},
mask_of_the_one_horned: {
id: 'mask_of_the_one_horned',
name: 'Mask of the One-Horned',
day: ['wednesday', 'saturday'],
rarity: 3,
parent: 'mask_of_the_wicked_lieutenant',
},
mask_of_the_kijin: {
id: 'mask_of_the_kijin',
name: 'Mask of the Kijin',
day: ['wednesday', 'saturday'],
rarity: 4,
parent: 'mask_of_the_wicked_lieutenant',
},
teachings_of_transience: {
id: 'teachings_of_transience',
name: 'Teachings of Transience',
day: ['monday', 'thursday'],
rarity: 1,
},
guide_to_transience: {
id: 'guide_to_transience',
name: 'Guide to Transience',
day: ['monday', 'thursday'],
rarity: 2,
parent: 'teachings_of_transience',
},
philosophies_of_transience: {
id: 'philosophies_of_transience',
name: 'Philosophies of Transience',
day: ['monday', 'thursday'],
rarity: 3,
parent: 'guide_to_transience',
},
teachings_of_elegance: {
id: 'teachings_of_elegance',
name: 'Teachings of Elegance',
day: ['tuesday', 'friday'],
rarity: 1,
},
guide_to_elegance: {
id: 'guide_to_elegance',
name: 'Guide to Elegance',
day: ['tuesday', 'friday'],
rarity: 2,
parent: 'teachings_of_elegance',
},
philosophies_of_elegance: {
id: 'philosophies_of_elegance',
name: 'Philosophies of Elegance',
day: ['tuesday', 'friday'],
rarity: 3,
parent: 'teachings_of_elegance',
},
teachings_of_light: {
id: 'teachings_of_light',
name: 'Teachings of Light',
day: ['wednesday', 'saturday'],
rarity: 1,
},
guide_to_light: {
id: 'guide_to_light',
name: 'Guide to Light',
day: ['wednesday', 'saturday'],
rarity: 2,
parent: 'teachings_of_light',
},
philosophies_of_light: {
id: 'philosophies_of_light',
name: 'Philosophies of Light',
day: ['wednesday', 'saturday'],
rarity: 3,
parent: 'teachings_of_light',
},
perpetual_heart: { id: 'perpetual_heart', name: 'Perpetual Heart', rarity: 5 },
smoldering_pearl: { id: 'smoldering_pearl', name: 'Smoldering Pearl', rarity: 5 },
old_handguard: { id: 'old_handguard', name: 'Old Handguard' },
kageuchi_handguard: { id: 'kageuchi_handguard', name: 'Kageuchi Handguard' },
famed_handguard: { id: 'famed_handguard', name: 'Famed Handguard' },
chaos_gear: { id: 'chaos_gear', name: 'Chaos Gear' },
chaos_axis: { id: 'chaos_axis', name: 'Chaos Axis' },
chaos_oculus: { id: 'chaos_oculus', name: 'Chaos Oculus' },
dismal_prism: { id: 'dismal_prism', name: 'Dismal Prism' },
crystal_prism: { id: 'crystal_prism', name: 'Crystal Prism' },
polarizing_prism: { id: 'polarizing_prism', name: 'Polarizing Prism' },
sakura_bloom: { id: 'sakura_bloom', name: 'Sakura Bloom' },
crystal_marrow: { id: 'crystal_marrow', name: 'Crystal Marrow' },
dendrobium: { id: 'dendrobium', name: 'Dendrobium' },
naku_weed: { id: 'naku_weed', name: 'Naku Weed' },
okinabuto: { id: 'okinabuto', name: 'Okinabuto' },
};

View File

@ -1,97 +1,52 @@
export const eventsData = [
[
{
name: 'To the Stars Once More',
pos: '20% 15%',
image: 'to_the_stars_once_more.jpg',
start: '2021-04-28 13:00:00',
end: '2021-05-17 23:59:59',
color: '#DDC59A',
zoom: '180%',
url: 'https://genshin.mihoyo.com/en/news/detail/12368',
name: "Traveler's Picture Book Web Event",
pos: '50% 83%',
image: 'traveler_picture_book.jpg',
start: '2021-07-03 11:00:00',
end: '2021-07-13 03:59:59',
color: '#F3EFC9',
zoom: '150%',
url: 'https://www.hoyolab.com/genshin/article/512380',
showOnHome: true,
},
{
name: 'Mysterious Voyage Web Event',
pos: '70% 50%',
image: 'mysterious_voyage.jpg',
start: '2021-07-13 04:00:00',
end: '2021-07-20 23:59:59',
color: '#FFBE7D',
zoom: '120%',
url: 'https://www.hoyolab.com/genshin/article/543290',
showOnHome: true,
},
],
[
{
name: 'Legend of the Vagabond Sword',
pos: '0% 45%',
image: 'legend_of_the_vagabond.jpg',
image: 'legend_of_the_vagabond_sword.png',
start: '2021-06-25 10:00:00',
end: '2021-07-08 03:59:59',
color: '#7A92FF',
zoom: '180%',
showOnHome: true,
},
],
[
{
name: 'Windtrace',
pos: '0% 80%',
image: 'windtrace.jpg',
start: '2021-05-14 10:00:00',
end: '2021-05-24 04:00:00',
color: '#E8D8B7',
zoom: '190%',
url: 'https://genshin.mihoyo.com/en/news/detail/12281',
name: 'Lost Riches',
pos: '0% 40%',
image: 'lost_riches.jpg',
start: '2021-08-06 10:00:00',
end: '2021-08-16 03:59:59',
color: '#FFF2DC',
zoom: '100%',
url: 'https://genshin.mihoyo.com/en/news/detail/14337',
showOnHome: true,
},
{
name: 'Mimi Tomo',
pos: '0% 35%',
image: 'mimi_tomo_update.jpg',
start: '2021-05-27 10:00:00',
end: '2021-06-06 04:00:00',
color: '#E5C18B',
zoom: '200%',
url: 'https://www.hoyolab.com/genshin/article/387817',
showOnHome: true,
},
{
name: 'Echoing Tales',
pos: '0% 15%',
image: 'echoing_tales.png',
start: '2021-06-09 11:00:00',
end: '2021-07-21 15:00:00',
color: '#90CEF5',
zoom: '230%',
url: 'https://www.hoyolab.com/genshin/article/415684',
showOnHome: true,
timezoneDependent: true,
},
],
[
{
name: 'Energy Amplifier Initiation',
pos: '0% 25%',
image: 'energy_amplifier_initiation.jpg',
start: '2021-04-30 10:00:00',
end: '2021-05-17 04:00:00',
color: '#5CB8FE',
zoom: '220%',
url: 'https://www.hoyolab.com/genshin/article/329821',
showOnHome: true,
},
{
name: 'Battlefront: Misty Dungeon',
pos: '0% 45%',
image: 'battlefront_misty_dungeon.jpg',
start: '2021-05-21 10:00:00',
end: '2021-05-31 04:00:00',
color: '#95C9B9',
zoom: '200%',
url: 'https://www.hoyolab.com/genshin/article/377249',
showOnHome: true,
},
{
name: 'Overflowing Mastery',
pos: '0% 50%',
image: 'overflowing_mastery.jpg',
start: '2021-05-31 04:00:00',
end: '2021-06-07 04:00:00',
color: '#FFF76C',
zoom: '200%',
url: 'https://www.hoyolab.com/genshin/article/394841',
showOnHome: true,
},
{
name: 'Midsummer Island Adventure',
pos: '50% 35%',
@ -104,35 +59,30 @@ export const eventsData = [
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Kaboomball Kombat',
pos: '0% 15%',
image: 'kaboomball_kombat.png',
start: '2021-07-02 10:00:00',
end: '2021-07-12 04:00:00',
color: '#A8E4FC',
zoom: '150%',
url: 'https://www.hoyolab.com/genshin/article/503383',
showOnHome: true,
},
{
name: 'Thunder Sojourn',
pos: '0% 25%',
image: 'thunder_sojourn.jpg',
start: '2021-07-22 10:00:00',
end: '2021-08-09 03:59:59',
color: '#F0DBFF',
zoom: '200%',
url: 'https://genshin.mihoyo.com/en/news/detail/14337',
showOnHome: true,
},
],
[
{
name: 'Act I',
start: '2021-04-30 10:00:00',
end: '2021-05-03 04:00:00',
color: '#5CB8FE',
url: 'https://www.hoyolab.com/genshin/article/329821',
startOnly: true,
},
{
name: 'Act II',
start: '2021-05-03 04:00:00',
end: '2021-05-06 04:00:00',
color: '#5CB8FE',
url: 'https://www.hoyolab.com/genshin/article/329821',
startOnly: true,
},
{
name: 'Act III',
start: '2021-05-06 04:00:00',
end: '2021-05-17 04:00:00',
color: '#5CB8FE',
url: 'https://www.hoyolab.com/genshin/article/329821',
zoom: '220%',
pos: '0% 25%',
image: 'energy_amplifier_initiation.jpg',
startOnly: true,
},
{
name: 'Act I',
start: '2021-06-09 11:00:00',
@ -170,30 +120,55 @@ export const eventsData = [
pos: '50% 35%',
startOnly: true,
},
{
name: 'Never-Ending Battle',
pos: '0% 55%',
image: 'neverending_battle.png',
start: '2021-07-09 10:00:00',
end: '2021-07-19 04:00:00',
color: '#CCFFCB',
zoom: '160%',
url: 'https://twitter.com/GenshinImpact/status/1409001038758121478',
showOnHome: true,
},
{
name: 'Act I',
start: '2021-07-22 10:00:00',
end: '2021-07-24 04:00:00',
color: '#F0DBFF',
url: 'https://www.hoyolab.com/genshin/article/567649',
startOnly: true,
timezoneDependent: true,
},
{
name: 'Act II',
start: '2021-07-24 04:00:00',
end: '2021-07-27 04:00:00',
color: '#F0DBFF',
url: 'https://www.hoyolab.com/genshin/article/567649',
startOnly: true,
},
{
name: 'Act III',
start: '2021-07-27 04:00:00',
end: '2021-07-30 04:00:00',
color: '#F0DBFF',
url: 'https://www.hoyolab.com/genshin/article/567649',
startOnly: true,
},
{
name: 'Act IV',
start: '2021-07-30 04:00:00',
end: '2021-08-09 03:59:59',
color: '#F0DBFF',
url: 'https://www.hoyolab.com/genshin/article/567649',
image: 'thunder_sojourn.jpg',
zoom: '200%',
pos: '0% 25%',
startOnly: true,
},
],
[
{
name: 'Gentry of Hermitage - Zhongli Banner',
pos: '30% 15%',
image: 'gentry_of_hermitage_2.jpg',
start: '2021-04-28 06:00:00',
end: '2021-05-18 17:59:59',
color: '#FDFB80',
url: 'https://genshin.mihoyo.com/en/news/detail/12265',
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Born of Ocean Swell - Eula Banner',
pos: '30% 22%',
image: 'born_of_ocean_swell.jpg',
start: '2021-05-18 18:00:00',
end: '2021-06-08 14:59:59',
color: '#A6D6E0',
url: 'https://genshin.mihoyo.com/en/news/detail/12736',
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Sparkling Steps - Klee Banner',
pos: '30% 22%',
@ -205,32 +180,30 @@ export const eventsData = [
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Leaves in the Wind - Kazuha Banner',
pos: '30% 15%',
image: 'leaves_in_the_wind.png',
start: '2021-06-29 18:00:00',
end: '2021-07-20 14:59:59',
color: '#8FFFDE',
url: 'https://genshin.mihoyo.com/en/news/detail/13657',
showOnHome: true,
},
{
name: "The Heron's Court - Ayaka Banner",
pos: '30% 20%',
zoom: '180%',
image: 'the_herons_court.jpg',
start: '2021-07-21 10:00:00',
end: '2021-08-10 17:59:59',
color: '#FFFBF7',
url: 'https://genshin.mihoyo.com/en/news/detail/14330',
showOnHome: true,
timezoneDependent: true,
},
],
[
{
name: 'Epitome Invocation - Weapon Banner',
image: 'epitome_invocation_11.jpg',
pos: '30% 30%',
start: '2021-04-28 06:00:00',
end: '2021-05-18 17:59:59',
color: '#FFAA4B',
zoom: '170%',
url: 'https://genshin.mihoyo.com/en/news/detail/12270',
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Epitome Invocation - Weapon Banner',
image: 'epitome_invocation_12.jpg',
pos: '30% 30%',
start: '2021-05-18 18:00:00',
end: '2021-06-08 14:59:59',
color: '#FFAA4B',
zoom: '170%',
url: 'https://genshin.mihoyo.com/en/news/detail/12749',
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Epitome Invocation - Weapon Banner',
image: 'epitome_invocation_13.png',
@ -243,37 +216,30 @@ export const eventsData = [
showOnHome: true,
timezoneDependent: true,
},
{
name: 'Epitome Invocation - Weapon Banner',
image: 'epitome_invocation_14.png',
pos: '30% 30%',
start: '2021-06-29 18:00:00',
end: '2021-07-20 14:59:59',
color: '#FFAA4B',
zoom: '170%',
url: 'https://genshin.mihoyo.com/en/news/detail/13666',
showOnHome: true,
},
{
name: 'Epitome Invocation - Weapon Banner',
pos: '30% 30%',
image: 'epitome_invocation_15.jpg',
start: '2021-07-21 10:00:00',
end: '2021-08-10 17:59:59',
color: '#FFAA4B',
url: 'https://genshin.mihoyo.com/en/news/detail/14329',
showOnHome: true,
timezoneDependent: true,
},
],
[
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
pos: '50% 20%',
start: '2021-04-16 04:00:00',
end: '2021-05-01 04:00:00',
color: '#4299E1',
description: 'Hitting an opponent with a Plunging Attack decreases their DEF by 40% for 10s.',
},
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
pos: '50% 20%',
start: '2021-05-01 04:00:00',
end: '2021-05-16 04:00:00',
color: '#4299E1',
description:
"When a character scores consecutive hits on an opponent with Normal Attacks within 2s, this character's Physical DMG is increased by 5% for 10s. This effect stacks up to 5 times, and only 1 stack is added at a time regardless of how many enemies are hit in one strike. When 5 stacks have been obtained, further hits on opponents will unleash shockwaves that deal AoE DMG. A shockwave can be created in this manner once every 1s.",
},
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
pos: '50% 20%',
start: '2021-05-16 04:00:00',
end: '2021-06-01 04:00:00',
color: '#4299E1',
description:
'A backlash will occur when opponents hit a character protected by a shield, unleashing a shockwave that deals AoE DMG. Can occur once every 6s.',
},
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
@ -314,28 +280,38 @@ export const eventsData = [
description:
'When an active character triggers a Swirl reaction on a nearby opponent, a Brumous Aura that lasts 8s will be left at the location where the reaction took place. The Aura will inflict one count of DMG to opponents within it once every 2s. A Brumous Aura can be generated once every 9s.',
},
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
pos: '50% 20%',
start: '2021-08-01 04:00:00',
end: '2021-08-16 04:00:00',
color: '#4299E1',
description:
"When an active character's Elemental Energy is fully charged, the DEF of opponents hit by the character's Normal, Charged or Plunging Attacks will be decreased by 7% for 10 seconds. Max 5 stacks. Each stack has an independent duration.",
},
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
pos: '50% 20%',
start: '2021-08-16 04:00:00',
end: '2021-09-01 04:00:00',
color: '#4299E1',
description:
'When an active character obtains an Elemental Orb or Elemental Particle, the character will unleash a shockwave that deals DMG to surrounding opponents. This kind of shockwave can be unleashed once every 4s.',
},
{
name: 'Spiral Abyss',
image: 'spiral_abyss.jpg',
pos: '50% 20%',
start: '2021-09-01 04:00:00',
end: '2021-09-16 04:00:00',
color: '#4299E1',
description:
'After unleashing an Elemental Burst, the ATK of every character in the party will be increased by 20% for 10s. Max 3 stacks. Each stack has an independent duration.',
},
],
[
{
name: "Paimon's Bargain - Razor, Amber, and Royal",
pos: '0% 50%',
zoom: '150%',
start: '2021-04-01 04:00:00',
end: '2021-05-01 04:00:00',
color: '#B6A1EA',
image: 'paimon_bargain.png',
description: 'Now selling: Razor, Amber, and Royal Weapons.',
},
{
name: "Paimon's Bargain - Bennett, Lisa, and Blackcliff",
pos: '0% 50%',
zoom: '150%',
start: '2021-05-01 04:00:00',
end: '2021-06-01 04:00:00',
color: '#B6A1EA',
image: 'paimon_bargain.png',
description: 'Now selling: Bennett, Lisa, and Blackcliff Weapons.',
},
{
name: "Paimon's Bargain - Barbara, Kaeya, and Royal",
pos: '0% 50%',
@ -346,17 +322,18 @@ export const eventsData = [
image: 'paimon_bargain.png',
description: 'Now selling: Barbara, Kaeya, and Royal Weapons.',
},
{
name: "Paimon's Bargain - Fischl, Xiangling, and Blackcliff",
pos: '0% 50%',
zoom: '150%',
start: '2021-07-01 04:00:00',
end: '2021-08-01 04:00:00',
color: '#B6A1EA',
image: 'paimon_bargain.png',
description: 'Now selling: Fischl, Xiangling, and Blackcliff Weapons.',
},
],
[
{
name: 'Battle Pass',
image: 'realm_of_diversion.jpg',
pos: '0% 12%',
start: '2021-04-28 06:00:00',
end: '2021-06-07 04:00:00',
color: '#68D391',
timezoneDependent: true,
},
{
name: 'Battle Pass',
image: 'marine_hues.png',
@ -366,5 +343,29 @@ export const eventsData = [
color: '#4EB3D6',
timezoneDependent: true,
},
{
name: 'Battle Pass - Divine Thunder',
pos: '0% 12%',
image: 'divine_thunder.jpg',
start: '2021-07-21 10:00:00',
end: '2021-08-30 03:59:59',
color: '#9F94FF',
url: 'https://genshin.mihoyo.com/en/news/detail/14337',
timezoneDependent: true,
},
],
[
{
name: 'Echoing Tales',
pos: '0% 15%',
image: 'echoing_tales.png',
start: '2021-06-09 11:00:00',
end: '2021-07-21 06:00:00',
color: '#90CEF5',
zoom: '230%',
url: 'https://www.hoyolab.com/genshin/article/415684',
showOnHome: true,
timezoneDependent: true,
},
],
];

View File

@ -6551,4 +6551,417 @@ export const weaponList = {
},
],
},
'freedom-sworn': {
name: 'Freedom-Sworn',
id: 'freedom-sworn',
rarity: 5,
atk: 46,
secondary: 'Elemental Mastery',
type: weapons.sword,
source: 'wish',
ascension: [
{
items: [
{ item: itemList.fetters_of_the_dandelion_gladiator, amount: 5 },
{ item: itemList.chaos_device, amount: 5 },
{ item: itemList.divining_scroll, amount: 3 },
],
mora: 10000,
},
{
items: [
{ item: itemList.chains_of_the_dandelion_gladiator, amount: 5 },
{ item: itemList.chaos_device, amount: 18 },
{ item: itemList.divining_scroll, amount: 12 },
],
mora: 20000,
},
{
items: [
{ item: itemList.chains_of_the_dandelion_gladiator, amount: 9 },
{ item: itemList.chaos_circuit, amount: 9 },
{ item: itemList.sealed_scroll, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.shackles_of_the_dandelion_gladiator, amount: 5 },
{ item: itemList.chaos_circuit, amount: 18 },
{ item: itemList.sealed_scroll, amount: 14 },
],
mora: 45000,
},
{
items: [
{ item: itemList.shackles_of_the_dandelion_gladiator, amount: 9 },
{ item: itemList.chaos_core, amount: 14 },
{ item: itemList.forbidden_curse_scroll, amount: 9 },
],
mora: 55000,
},
{
items: [
{ item: itemList.dream_of_the_dandelion_gladiator, amount: 6 },
{ item: itemList.chaos_core, amount: 27 },
{ item: itemList.forbidden_curse_scroll, amount: 18 },
],
mora: 65000,
},
],
},
mistsplitter_reforged: {
name: 'Mistsplitter Reforged',
id: 'mistsplitter_reforged',
rarity: 5,
atk: 48,
secondary: 'CRIT DMG',
type: weapons.sword,
source: 'wish',
ascension: [
{
items: [
{ item: itemList.coral_branch_of_a_distant_sea, amount: 5 },
{ item: itemList.chaos_gear, amount: 5 },
{ item: itemList.old_handguard, amount: 3 },
],
mora: 10000,
},
{
items: [
{ item: itemList.jeweled_branch_of_a_distant_sea, amount: 5 },
{ item: itemList.chaos_gear, amount: 18 },
{ item: itemList.old_handguard, amount: 12 },
],
mora: 20000,
},
{
items: [
{ item: itemList.jeweled_branch_of_a_distant_sea, amount: 9 },
{ item: itemList.chaos_axis, amount: 9 },
{ item: itemList.kageuchi_handguard, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.jade_branch_of_a_distant_sea, amount: 5 },
{ item: itemList.chaos_axis, amount: 18 },
{ item: itemList.kageuchi_handguard, amount: 14 },
],
mora: 45000,
},
{
items: [
{ item: itemList.jade_branch_of_a_distant_sea, amount: 9 },
{ item: itemList.chaos_oculus, amount: 14 },
{ item: itemList.famed_handguard, amount: 9 },
],
mora: 55000,
},
{
items: [
{ item: itemList.golden_branch_of_a_distant_sea, amount: 6 },
{ item: itemList.chaos_oculus, amount: 27 },
{ item: itemList.famed_handguard, amount: 18 },
],
mora: 65000,
},
],
},
amenoma_kageuchi: {
name: 'Amenoma Kageuchi',
id: 'amenoma_kageuchi',
rarity: 4,
atk: 41,
secondary: 'ATK',
type: weapons.sword,
source: 'forging',
ascension: [
{
items: [
{ item: itemList.coral_branch_of_a_distant_sea, amount: 3 },
{ item: itemList.chaos_gear, amount: 3 },
{ item: itemList.old_handguard, amount: 2 },
],
mora: 5000,
},
{
items: [
{ item: itemList.jeweled_branch_of_a_distant_sea, amount: 3 },
{ item: itemList.chaos_gear, amount: 12 },
{ item: itemList.old_handguard, amount: 8 },
],
mora: 15000,
},
{
items: [
{ item: itemList.jeweled_branch_of_a_distant_sea, amount: 6 },
{ item: itemList.chaos_axis, amount: 6 },
{ item: itemList.kageuchi_handguard, amount: 6 },
],
mora: 20000,
},
{
items: [
{ item: itemList.jade_branch_of_a_distant_sea, amount: 3 },
{ item: itemList.chaos_axis, amount: 12 },
{ item: itemList.kageuchi_handguard, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.jade_branch_of_a_distant_sea, amount: 6 },
{ item: itemList.chaos_oculus, amount: 9 },
{ item: itemList.famed_handguard, amount: 6 },
],
mora: 35000,
},
{
items: [
{ item: itemList.golden_branch_of_a_distant_sea, amount: 4 },
{ item: itemList.chaos_oculus, amount: 18 },
{ item: itemList.famed_handguard, amount: 12 },
],
mora: 45000,
},
],
},
hakushin_ring: {
name: 'Hakushin Ring',
id: 'hakushin_ring',
rarity: 4,
atk: 44,
secondary: 'Energy Recharge',
type: weapons.catalyst,
source: 'forging',
ascension: [
{
items: [
{ item: itemList.coral_branch_of_a_distant_sea, amount: 3 },
{ item: itemList.dismal_prism, amount: 3 },
{ item: itemList.divining_scroll, amount: 2 },
],
mora: 5000,
},
{
items: [
{ item: itemList.jeweled_branch_of_a_distant_sea, amount: 3 },
{ item: itemList.dismal_prism, amount: 12 },
{ item: itemList.divining_scroll, amount: 8 },
],
mora: 15000,
},
{
items: [
{ item: itemList.jeweled_branch_of_a_distant_sea, amount: 6 },
{ item: itemList.crystal_prism, amount: 6 },
{ item: itemList.sealed_scroll, amount: 6 },
],
mora: 20000,
},
{
items: [
{ item: itemList.jade_branch_of_a_distant_sea, amount: 3 },
{ item: itemList.crystal_prism, amount: 12 },
{ item: itemList.sealed_scroll, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.jade_branch_of_a_distant_sea, amount: 6 },
{ item: itemList.polarizing_prism, amount: 9 },
{ item: itemList.forbidden_curse_scroll, amount: 6 },
],
mora: 35000,
},
{
items: [
{ item: itemList.golden_branch_of_a_distant_sea, amount: 4 },
{ item: itemList.polarizing_prism, amount: 18 },
{ item: itemList.forbidden_curse_scroll, amount: 12 },
],
mora: 45000,
},
],
},
hamayumi: {
name: 'Hamayumi',
id: 'hamayumi',
rarity: 4,
atk: 41,
secondary: 'ATK',
type: weapons.bow,
source: 'forging',
ascension: [
{
items: [
{ item: itemList.narukamis_wisdom, amount: 3 },
{ item: itemList.dismal_prism, amount: 3 },
{ item: itemList.firm_arrowhead, amount: 2 },
],
mora: 5000,
},
{
items: [
{ item: itemList.narukamis_joy, amount: 3 },
{ item: itemList.dismal_prism, amount: 12 },
{ item: itemList.firm_arrowhead, amount: 8 },
],
mora: 15000,
},
{
items: [
{ item: itemList.narukamis_joy, amount: 6 },
{ item: itemList.crystal_prism, amount: 6 },
{ item: itemList.sharp_arrowhead, amount: 6 },
],
mora: 20000,
},
{
items: [
{ item: itemList.narukamis_affection, amount: 3 },
{ item: itemList.crystal_prism, amount: 12 },
{ item: itemList.sharp_arrowhead, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.narukamis_affection, amount: 6 },
{ item: itemList.polarizing_prism, amount: 9 },
{ item: itemList.weathered_arrowhead, amount: 6 },
],
mora: 35000,
},
{
items: [
{ item: itemList.narukamis_valor, amount: 4 },
{ item: itemList.polarizing_prism, amount: 18 },
{ item: itemList.weathered_arrowhead, amount: 12 },
],
mora: 45000,
},
],
},
katsuragikiri_nagamasa: {
name: 'Katsuragikiri Nagamasa',
id: 'katsuragikiri_nagamasa',
rarity: 4,
atk: 42,
secondary: 'Energy Recharge',
type: weapons.claymore,
source: 'forging',
ascension: [
{
items: [
{ item: itemList.narukamis_wisdom, amount: 3 },
{ item: itemList.chaos_gear, amount: 3 },
{ item: itemList.old_handguard, amount: 2 },
],
mora: 5000,
},
{
items: [
{ item: itemList.narukamis_joy, amount: 3 },
{ item: itemList.chaos_gear, amount: 12 },
{ item: itemList.old_handguard, amount: 8 },
],
mora: 15000,
},
{
items: [
{ item: itemList.narukamis_joy, amount: 6 },
{ item: itemList.chaos_axis, amount: 6 },
{ item: itemList.kageuchi_handguard, amount: 6 },
],
mora: 20000,
},
{
items: [
{ item: itemList.narukamis_affection, amount: 3 },
{ item: itemList.chaos_axis, amount: 12 },
{ item: itemList.kageuchi_handguard, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.narukamis_affection, amount: 6 },
{ item: itemList.chaos_oculus, amount: 9 },
{ item: itemList.famed_handguard, amount: 6 },
],
mora: 35000,
},
{
items: [
{ item: itemList.narukamis_valor, amount: 4 },
{ item: itemList.chaos_oculus, amount: 18 },
{ item: itemList.famed_handguard, amount: 12 },
],
mora: 45000,
},
],
},
kitain_cross_spear: {
name: 'Kitain Cross Spear',
id: 'kitain_cross_spear',
rarity: 4,
atk: 44,
secondary: 'Elemental Mastery',
type: weapons.claymore,
source: 'forging',
ascension: [
{
items: [
{ item: itemList.mask_of_the_wicked_lieutenant, amount: 3 },
{ item: itemList.chaos_gear, amount: 3 },
{ item: itemList.treasure_hoarder_insignia, amount: 2 },
],
mora: 5000,
},
{
items: [
{ item: itemList.mask_of_the_tigers_bite, amount: 3 },
{ item: itemList.chaos_gear, amount: 12 },
{ item: itemList.treasure_hoarder_insignia, amount: 8 },
],
mora: 15000,
},
{
items: [
{ item: itemList.mask_of_the_tigers_bite, amount: 6 },
{ item: itemList.chaos_axis, amount: 6 },
{ item: itemList.silver_raven_insignia, amount: 6 },
],
mora: 20000,
},
{
items: [
{ item: itemList.mask_of_the_one_horned, amount: 3 },
{ item: itemList.chaos_axis, amount: 12 },
{ item: itemList.silver_raven_insignia, amount: 9 },
],
mora: 30000,
},
{
items: [
{ item: itemList.mask_of_the_one_horned, amount: 6 },
{ item: itemList.chaos_oculus, amount: 9 },
{ item: itemList.golden_raven_insignia, amount: 6 },
],
mora: 35000,
},
{
items: [
{ item: itemList.mask_of_the_kijin, amount: 4 },
{ item: itemList.chaos_oculus, amount: 18 },
{ item: itemList.golden_raven_insignia, amount: 12 },
],
mora: 45000,
},
],
},
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -55,30 +55,30 @@ async function addBanners(workbook) {
const sheet = workbook.getWorksheet('Banner List');
sheet.columns = [
{ header: 'Image', key: 'image', width: 29 },
// { header: 'Image', key: 'image', width: 29 },
{ header: 'Name', key: 'name', width: 32 },
{ header: 'Start', key: 'start', width: 19 },
{ header: 'End', key: 'end', width: 19 },
];
const diff = 8 - getTimeOffset();
const icons = {};
// const icons = {};
for (const [_, category] of Object.entries(banners)) {
for (const banner of category) {
const res = await fetch(`/images/banners/${banner.name} ${banner.image}.png`, {
method: 'GET',
});
// const res = await fetch(`/images/banners/${banner.name} ${banner.image}.png`, {
// method: 'GET',
// });
const imageBlob = await res.blob();
const imageB64 = await convertBlobToBase64(imageBlob);
// const imageBlob = await res.blob();
// const imageB64 = await convertBlobToBase64(imageBlob);
const imageId = workbook.addImage({
base64: imageB64,
extension: 'png',
});
// const imageId = workbook.addImage({
// base64: imageB64,
// extension: 'png',
// });
icons[`/images/banners/${banner.name} ${banner.image}.png`] = imageId;
// icons[`/images/banners/${banner.name} ${banner.image}.png`] = imageId;
const row = sheet.addRow({
name: banner.name,
@ -86,16 +86,16 @@ async function addBanners(workbook) {
end: dayjs(banner.end).subtract(diff, 'hour').format('YYYY-MM-DD HH:mm:ss'),
});
row.height = 98;
// row.height = 98;
sheet.addImage(imageId, {
tl: { col: 0, row: row.number - 1 },
ext: { width: 200, height: 100 },
});
// sheet.addImage(imageId, {
// tl: { col: 0, row: row.number - 1 },
// ext: { width: 200, height: 100 },
// });
}
}
return icons;
// return icons;
}
/**
@ -115,7 +115,7 @@ async function addInformation(workbook) {
};
sheet.addRow(['Paimon.moe Wish History Export']);
sheet.addRow(['Version', 2]);
sheet.addRow(['Version', 3]);
sheet.addRow(['Export Date', dayjs().format('YYYY-MM-DD HH:mm:ss')]);
sheet.mergeCells('A1:B1');
@ -126,9 +126,8 @@ async function addInformation(workbook) {
* @param {Workbook} workbook
* @param {Array} icons
*/
async function addWishHistory(workbook, icons) {
async function addWishHistory(workbook) {
for (const [id, category] of Object.entries(bannerCategories)) {
const sheet = workbook.getWorksheet(category);
sheet.columns = [
{ header: 'Type', width: 9 },
@ -139,13 +138,13 @@ async function addWishHistory(workbook, icons) {
{ header: '#Roll', width: 7, style: { alignment: { horizontal: 'center' } } },
{ header: 'Group', width: 7, style: { alignment: { horizontal: 'center' } } },
{ header: 'Banner', width: 24 },
{ header: 'Icon', width: 5.5 },
// { header: 'Icon', width: 5.5 },
];
sheet.getRow(1).font = {
bold: true,
};
const data = await process(id);
if (data === null) continue;
@ -196,10 +195,10 @@ async function addWishHistory(workbook, icons) {
right: { style: 'thin', color: { argb: 'ffdddddd' } },
};
sheet.addImage(icons[pull.banner.image], {
tl: { col: 8, row: row.number - 1 },
ext: { width: 40, height: 20 },
});
// sheet.addImage(icons[pull.banner.image], {
// tl: { col: 8, row: row.number - 1 },
// ext: { width: 40, height: 20 },
// });
}
}
}
@ -226,9 +225,8 @@ export async function exportToExcel() {
const workbook = createWorkbook();
addSheet(workbook);
const icons = await addBanners(workbook);
await addBanners(workbook);
await addInformation(workbook);
await addWishHistory(workbook, icons);
await addWishHistory(workbook);
await downloadFile(workbook);
}

View File

@ -19,7 +19,9 @@
"welcome": "Welcome to Paimon.moe! 👋",
"message": "Your best Genshin Impact companion! Help you plan what to farm with ascension calculator, also track your progress with todo and wish counter.",
"banner": {
"featured": ["Eula"],
"featured": [
"Eula"
],
"summoned": "Summoned",
"percentage": "from all {rarity}",
"avg": "Pity average",
@ -124,7 +126,10 @@
"manualButton": "Enable Manual Input",
"errorBanner": "Banner time missmatch! Please adjust your server on settings page. Still not working? please leave a message on Discord 😅",
"globalWishTally": "Global Wish Tally",
"pityTooltip": ["Shows your current {rarity} pity", "{count} pulls to guaranteed {rarity}"],
"pityTooltip": [
"Shows your current {rarity} pity",
"{count} pulls to guaranteed {rarity}"
],
"import": {
"title": "Import Wish History",
"faqsButton": "FAQ - READ FIRST",
@ -153,7 +158,11 @@
"server": "Select your server:",
"wishTallyCheck": "Submit pity for global wish tally",
"wishTally": "We are doing a global wish tally! You can submit your wish tally to participate. All pity data will be aggregated to know what is the average pity of paimon.moe users.",
"wishTallyCollected": ["What will be collected:", "and", "pity from your wish history"],
"wishTallyCollected": [
"What will be collected:",
"and",
"pity from your wish history"
],
"faqs": {
"title": "Import Wish History FAQ",
"q1": "How does it work?",
@ -226,7 +235,7 @@
"If you are not comfortable passing around your feedback url, you can use this option to process the wish on your pc locally. This script will read the log file on your pc to get the wish history url.",
"Open Start, then search for Powershell",
"Open Windows Powershell, then copy & paste the script below to the Powershell",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"You can review the script",
"here",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
@ -275,7 +284,11 @@
"exportFinish": "Export success, please wait until the browser download the file!",
"wishTallyTitle": "Submit Wish Tally",
"wishTally": "We are doing a global wish tally! You can submit your wish tally to participate. All pity data will be aggregated to know what is the average pity of paimon.moe users.",
"wishTallyCollected": ["What will be collected:", "and", "pity from your wish history"],
"wishTallyCollected": [
"What will be collected:",
"and",
"pity from your wish history"
],
"wishTallySubmit": "Submit Wish Tally",
"wishTallyThankyou": "Thankyou for participating!",
"manualTitle": "Manual Input Setting",
@ -287,13 +300,22 @@
"subtitle": "After a 1x Wish:",
"pressWhenYouGet": "Press {button} when you get {rarity}★",
"p1": "It will automatically add the lifetime pulls, 5★, and 4★ pity",
"p2": ["When the", "pity reaches 10, it will automatically be reset to 0"],
"p3": ["When the", "pity reaches 90, it will automatically be reset to 0"],
"p2": [
"When the",
"pity reaches 10, it will automatically be reset to 0"
],
"p3": [
"When the",
"pity reaches 90, it will automatically be reset to 0"
],
"p4": [
"After a 10x Wish, press",
"but keep in mind that the pity counter might not be accurate, because there is no way to tell when the drop occured (maybe you got it on the 1st or even the 10th pull). To ensure that the counter is still accurate, you need to check the history table and add it one-by-one like you do 1x Wishes."
],
"p5": ["You can also press the", "button to edit the values manually!"],
"p5": [
"You can also press the",
"button to edit the values manually!"
],
"p6": [
"Press the arrow on the bottom to see your pulls' details. A popup will show up when you get a",
"or",
@ -349,6 +371,8 @@
"titleWeapon": "Weapon Calculator",
"titleCharacter": "Character Calculator",
"titleResin": "Resin Calculator",
"titleFriendship": "Friendship Exp Calculator",
"titleFate": "Fate Price Calculator",
"goto": "Go To {where}",
"howToUse": "How to Use",
"guide": {
@ -386,7 +410,11 @@
"calculateTalent": "Calculate Talent Material?",
"inputTalentLevel": "Input the 1st, 2nd & 3rd current talent level",
"inputTalentNotice": "If it has different color, substract it by 3",
"inputTalent": ["1st talent lvl", "2nd talent lvl", "3rd talent lvl"],
"inputTalent": [
"1st talent lvl",
"2nd talent lvl",
"3rd talent lvl"
],
"talentToLevel": "to level",
"calculate": "Calculate",
"unknownInformation": "There are some unknown information",
@ -395,7 +423,11 @@
"expWasted": "EXP Wasted",
"addToTodo": "Add to Todo List",
"addedToTodo": "Added to Todo List",
"talent": ["Attack", "Skill", "Burst"]
"talent": [
"Attack",
"Skill",
"Burst"
]
},
"expTable": {
"level": "Level",
@ -420,6 +452,30 @@
"hours": "hours",
"minutes": "minutes",
"seconds": "seconds"
},
"friendship": {
"currentLevel": "Current Friendship Level",
"currentExp": "Current Exp Bar (Drag the Bar)",
"randomEventFarm": "How many Random Event you farm everyday?",
"calculate": "Calculate",
"based": "Based on AR:{ar}",
"change": "(change on settings)",
"result": "To reach Friendship level 10 if you complete all daily commission and use 180 resin everyday",
"resultSerenitea": "If you also place the character in the Serenitea Pot (Max Adeptal Energy)",
"resultDay": "{result} Days"
},
"fate": {
"currency": "Select Currency...",
"firstTime": "First Time",
"amount": "Amount",
"genesis": "Genesis",
"first": "Bonus2x",
"total": "Total",
"price": "Price",
"totalGenesis": "Total Genesis",
"totalPrice": "Total Price",
"calculate": "Calculate how many Genesis Crystal I can get with {currency}{value}",
"calculateFate": "Calculate how much money I need for {value}"
}
},
"items": {
@ -450,7 +506,10 @@
"todo": {
"title": "Todo List",
"summary": "Summary",
"empty": ["Nothing to do yet 😀", "Add some from the Items page or the Calculator!"],
"empty": [
"Nothing to do yet 😀",
"Add some from the Items page or the Calculator!"
],
"farmableToday": "Farmable Today",
"resin": "Resin needed",
"based": "Based on AR:{ar} and WL:{wl}",
@ -653,4 +712,4 @@
"lvl": "LVL",
"baseAtk": "Base ATK"
}
}
}

View File

@ -223,7 +223,7 @@
"Si vous ne souhaitez pas laissez traîner votre URL de commentaire, vous pouvez utiliser cette option pour traiter votre historique de voeux localement sur votre ordinateur. Ce script lira les fichiers de log sur votre ordinateur pour obtenir l'URL de votre historique.",
"Ouvrez le menu Démarrer et cherchez Powershell",
"Ouvrez Windows Powershell, et copier coller le lien sur Powershell",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"Vous pouvez lire le script",
"ici",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
@ -597,4 +597,4 @@
"exteriorNum": "Zone {number}",
"corridor": "Corridor"
}
}
}

View File

@ -96,7 +96,10 @@
"manualButton": "Nyalakan Input Manual",
"errorBanner": "Waktu banner salah! Coba sesuaikan server di halaman settings. Masih gak bisa? tolong chat di Discord 😅",
"globalWishTally": "Perhitungan Pity Wish Global",
"pityTooltip": ["Ini adalah pity {rarity} sekarang", "{count}x wish lagi untuk dijamin {rarity}"],
"pityTooltip": [
"Ini adalah pity {rarity} sekarang",
"{count}x wish lagi untuk dijamin {rarity}"
],
"import": {
"title": "Import Riwayat Wish",
"faqsButton": "FAQS - BACA DULU",
@ -125,7 +128,11 @@
"server": "Pilih server mu:",
"wishTallyCheck": "Submit pity untuk perhitungan pity global",
"wishTally": "Kita sedang melakukan perhitungan pity global! Kamu bisa mensubmit pity mu untuk berpartisipasi. Semua data pity akan dikumpulkan untuk mengetahui berapa pity rata-rata pengguna paimon.moe.",
"wishTallyCollected": ["Yang dikumpulkan:", "dan", "pity dari riwayat wish mu"],
"wishTallyCollected": [
"Yang dikumpulkan:",
"dan",
"pity dari riwayat wish mu"
],
"faqs": {
"title": "Import Riwayat Wish FAQS",
"q1": "Cara kerjanya gimana?",
@ -198,7 +205,7 @@
"Jika kamu tidak nyaman dengan menaruh link feedback disini, kamu bisa memproses riwayat wish di pc mu secara lokal. Script ini akan membaca file log di pc mu untuk memproses riwayat history mu.",
"Buka Start, kemudian cari Powershell",
"Buka Windows Powershell, kemudian copy & paste script berikut di Powershell nya",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"Kamu bisa me-review script nya",
"disini",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
@ -247,7 +254,11 @@
"exportFinish": "Export berhasil, harap tunggu sampai file nya sudah ter-download!",
"wishTallyTitle": "Submit Perhitungan Pity Wish",
"wishTally": "Kita sedang melakukan perhitungan pity global! Kamu bisa mensubmit pity mu untuk berpartisipasi. Semua data pity akan dikumpulkan untuk mengetahui berapa pity rata-rata pengguna paimon.moe.",
"wishTallyCollected": ["Yang dikumpulkan:", "dan", "pity dari riwayat wish mu"],
"wishTallyCollected": [
"Yang dikumpulkan:",
"dan",
"pity dari riwayat wish mu"
],
"wishTallySubmit": "Submit Perhitungan Pity Wish",
"wishTallyThankyou": "Terimakasih sudah berpartisipasi!",
"manualTitle": "Pengaturan Manual Input",
@ -259,13 +270,22 @@
"subtitle": "Setelah kamu melakukan x1 pull wish:",
"pressWhenYouGet": "Tekan {button} ketika kamu mendapatkan {rarity}★",
"p1": "Itu akan otomatis menambahkan total pull, 5★ dan, 4★ pity",
"p2": ["Ketika", "pity mencapai 10, angkanya akan otomatis reset menjadi 0"],
"p3": ["Ketika", "pity mencapai 90, angkanya akan otomatis reset menjadi 0"],
"p2": [
"Ketika",
"pity mencapai 10, angkanya akan otomatis reset menjadi 0"
],
"p3": [
"Ketika",
"pity mencapai 90, angkanya akan otomatis reset menjadi 0"
],
"p4": [
"Ketika kamu melakukan wish x10 pull, tekan",
"tapi counter pity nya tidak akan akurat, karena tidak tahu kapan drop nya terjadi (bisa saja kamu dapat nya saat pull ke 1 atau bisa saja ke 10). Untuk membuat counter nya akurat, kamu perlu mengecek nya di tabel riwayat wish mu dan tabahkan 1-per-1 seperti kamu melakukan 1x pull wish."
],
"p5": ["Kamu juga bisa menekan", "untuk mengedit nilai nya secara manual!"],
"p5": [
"Kamu juga bisa menekan",
"untuk mengedit nilai nya secara manual!"
],
"p6": [
"Tekan tombol panah dibawah untuk melihat detail riwayat mu. Sebuah form akan muncul ketika kamu mendapat",
"atau",
@ -356,7 +376,11 @@
"calculateTalent": "Hitung Material Talent?",
"inputTalentLevel": "Masukkan level talent ke 1, 2 dan 3 saat ini",
"inputTalentNotice": "Jika warna level nya berbeda, kurangi 3",
"inputTalent": ["lvl talent ke 1", "lvl talent ke 2", "lvl talent ke 3"],
"inputTalent": [
"lvl talent ke 1",
"lvl talent ke 2",
"lvl talent ke 3"
],
"talentToLevel": "ke level",
"calculate": "Hitung",
"unknownInformation": "Ada beberapa informasi yang tidak diketahui",
@ -389,6 +413,30 @@
"hours": "jam",
"minutes": "menit",
"seconds": "detik"
},
"friendship": {
"currentLevel": "Friendship Level Sekarang",
"currentExp": "Exp Bar Sekarang (Drag Bar-nya)",
"randomEventFarm": "Berapa banyak Random Event yang kamu farm tiap hari?",
"calculate": "Hitung",
"based": "Berdasarkan AR:{ar}",
"change": "(ganti di settings)",
"result": "Untuk mencapai Friendship level 10 jika kamu menyelesaikan semua daily commission dan menggunakan 180 resin tiap hari",
"resultSerenitea": "Jika kamu juga menaruh karakternya di Serenitea Pot (Adeptal Energy Max)",
"resultDay": "{result} Hari"
},
"fate": {
"currency": "Pilih Mata Uang...",
"firstTime": "Pertama Kali",
"amount": "Jumlah",
"genesis": "Genesis",
"first": "Bonus2x",
"total": "Total",
"price": "Price",
"totalGenesis": "Total Genesis",
"totalPrice": "Total Harga",
"calculate": "Hitung berapa banyak Genesis Crystal yang bisa didapatkan dengan {currency}{value}",
"calculateFate": "Hitung berapa uang yang diperlukan untuk {value}"
}
},
"items": {
@ -419,7 +467,10 @@
"todo": {
"title": "Todo List",
"summary": "Summary",
"empty": ["Belum ada yang ditambahkan 😀", "Tambahkan todo dari halaman Items atau dari Kalkulator!"],
"empty": [
"Belum ada yang ditambahkan 😀",
"Tambahkan todo dari halaman Items atau dari Kalkulator!"
],
"farmableToday": "Bisa di farm hari ini",
"resin": "resin diperlukan",
"based": "Berdasarkan AR:{ar} and WL:{wl}",
@ -595,4 +646,4 @@
"used": "Digunakan di set lain"
}
}
}
}

View File

@ -222,7 +222,7 @@
"피드백 페이지 주소를 이용한 방법이 불편하다면, 이 방법을 이용해 PC에서 자체적으로 처리할 수 있습니다. 이 스크립트가 PC 내의 로그 파일을 읽어 기원 기록 주소를 가져옵니다.",
"시작 버튼을 누르고, Powershell을 검색합니다.",
"Windows Powershell을 실행하고, 아래 스크립트를 복사해 Powershell에 붙여넣기합니다.",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"스크립트의 내용을 확인하려면",
"여기",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
@ -576,4 +576,4 @@
"title": "업적",
"of": "/"
}
}
}

View File

@ -226,7 +226,7 @@
"Se você não se sente confortável em compartilhar sua URL de feedback, você pode usar esta opção para processar seu histórico de orações em seu PC localmente. Este script irá ler o log em seu PC para gerar a URL do histórico de orações.",
"Abra o menu Iniciar, e então procure por Powershell",
"Abra o Powershell do Windows, e então copie & cole o script abaixo no Powershell",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"Você pode revisar o script",
"aqui",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",

View File

@ -19,7 +19,9 @@
"welcome": "Добро пожаловать на Paimon.moe! 👋",
"message": "Твой лучший компаньон в Genshin Impact! Поможет тебе распланировать что фармить в калькуляторе возвышения, а также отслеживать свой прогресс с помощью счетчика молитв и cписка дел",
"banner": {
"featured": ["Кли"],
"featured": [
"Кли"
],
"summoned": "Призывов",
"percentage": "из всех {rarity}",
"avg": "Среднее число молитв",
@ -65,6 +67,10 @@
"achievement": {
"title": "🏆 Просматривайте и отмечайте список своих достижений здесь",
"detail": "Достижения"
},
"furnishing": {
"title": "Проверьте какую мебель вам нужно сделать, чтобы завершить набор. Также вы можете посмотреть нагрузку каждого предмета мебели.",
"detail": "Мебель"
}
},
"characters": {
@ -120,7 +126,10 @@
"manualButton": "Включить ручной ввод",
"errorBanner": "Несоответствие времени баннера! Пожалуйста, настройте свой сервер на странице настроек. Все еще не работает? Напишите нам в дискорд!",
"globalWishTally": "Глобальная статистика молитв",
"pityTooltip": ["Отображает ваши текущие {rarity} молитвы", "{count} молитв до гарантированного {rarity}"],
"pityTooltip": [
"Отображает ваши текущие {rarity} молитвы",
"{count} молитв до гарантированного {rarity}"
],
"import": {
"title": "Импорт истории молитв",
"faqsButton": "FAQ - ПРОЧЕСТЬ В ПЕРВУЮ ОЧЕРЕДЬ",
@ -149,7 +158,11 @@
"server": "Выберите ваш сервер:",
"wishTallyCheck": "Отправить данные о молитвах для глобальной статистики",
"wishTally": "Мы собираем глобальную статистику молитв! Вы можете отправить свои молитвы чтобы помочь нам. Все данные будут собраны чтобы узнать средний гарант у пользователей paimon.moe.",
"wishTallyCollected": ["Какие данные будут сохранены:", "и", "гаранты из вашей истории молитв"],
"wishTallyCollected": [
"Какие данные будут сохранены:",
"и",
"гаранты из вашей истории молитв"
],
"faqs": {
"title": "FAQ Импорт истории молитв",
"q1": "Как это работает?",
@ -222,7 +235,7 @@
"Если вам неудобно передавать URL-адрес обратной связи, вы можете использовать эту опцию для локальной обработки запроса на вашем компьютере. Этот скрипт прочитает файл журнала на вашем компьютере, чтобы получить URL-адрес истории молитв.",
"Откройте ПУСК, затем найдите Powershell",
"Откройте Windows Powershell, затем скопируйте и вставьте приведенный ниже скрипт в Powershell",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"Вы можете изучить скрипт",
"здесь",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
@ -271,7 +284,11 @@
"exportFinish": "Успешный экспорт, пожалуйста подождите пока браузер загрузит файл!",
"wishTallyTitle": "Отправить данные о молитвах для глобальной статистики",
"wishTally": "Мы собираем глобальную статистику молитв! Вы можете отправить свои молитвы чтобы помочь нам. Все данные будут собраны чтобы узнать средний гарант у пользователей paimon.moe.",
"wishTallyCollected": ["Какие данные будут сохранены:", "и", "гаранты из вашей истории молитв"],
"wishTallyCollected": [
"Какие данные будут сохранены:",
"и",
"гаранты из вашей истории молитв"
],
"wishTallySubmit": "Отправить данные о молитвах для глобальной статистики",
"wishTallyThankyou": "Спасибо за участие!!",
"manualTitle": "Настройки ручного ввода",
@ -283,13 +300,22 @@
"subtitle": "После 1 молитвы:",
"pressWhenYouGet": "Нажмите {button} когда вы получили {rarity}★",
"p1": "Это автоматически добавит его в счетчик молитв за все время, 5★, и 4★ Гарант",
"p2": ["Когда", "гарант достигнет 10, он автоматически сбросится до 0"],
"p3": ["Когда", "гарант достигнет 90, он автоматически сбросится до 0"],
"p2": [
"Когда",
"гарант достигнет 10, он автоматически сбросится до 0"
],
"p3": [
"Когда",
"гарант достигнет 90, он автоматически сбросится до 0"
],
"p4": [
"После 10 молитв",
"но имейте в виду, что счетчик гаранта может быть неточным, потому что нет способа определить, когда выпал гарант (возможно, он выпал на 1 или даже 10 попытке). Чтобы убедиться, что счетчик по-прежнему точен, вам нужно проверить таблицу истории и добавлять по 1х молитве."
],
"p5": ["Вы также можете нажать", "кнопку чтобы редактировать значения вручную!"],
"p5": [
"Вы также можете нажать",
"кнопку чтобы редактировать значения вручную!"
],
"p6": [
"Нажмите на стрелку ниже, чтобы увидеть подробности о ваших молитвах. Всплывающее окно появится, когда вы получите",
"или",
@ -382,7 +408,11 @@
"calculateTalent": "Рассчитать материалы для талантов?",
"inputTalentLevel": "Введите текущий уровень 1, 2 и 3 таланта",
"inputTalentNotice": "Если он имеет другой цвет, вычтите из него 3",
"inputTalent": ["Уровень первого таланта", "Уровень второго таланта", "Уровень третьего таланта"],
"inputTalent": [
"Уровень первого таланта",
"Уровень второго таланта",
"Уровень третьего таланта"
],
"talentToLevel": "до уровня",
"calculate": "Рассчитать",
"unknownInformation": "Здесь какая-то неизвестная информация...",
@ -391,7 +421,11 @@
"expWasted": "EXP потеряно",
"addToTodo": "Добавить в список дел",
"addedToTodo": "Добавлено в список дел",
"talent": ["Обычн.Атака", "Элем.Навык", "Взрыв Стихии"]
"talent": [
"Обычн.Атака",
"Элем.Навык",
"Взрыв Стихии"
]
},
"expTable": {
"level": "Уровень",
@ -446,7 +480,10 @@
"todo": {
"title": "Список дел",
"summary": "Сводка",
"empty": ["Ничего нет 😀", "Добавьте что-нибудь со страницы предметов или калькулятора!"],
"empty": [
"Ничего нет 😀",
"Добавьте что-нибудь со страницы предметов или калькулятора!"
],
"farmableToday": "Можно фармить сегодня",
"resin": "Смолы необходимо",
"based": "Основываясь на ранге приключений :{ar} и уровне мира:{wl}",
@ -598,13 +635,30 @@
"interior": "Интерьер",
"exterior": "Экстерьер",
"info": [
"Это показывает, какую нагрузку может выдержать участок. Каждая мебель имеет скрытое значение нагрузки, которое можно посмотреть ниже.",
"Здесь отображено, какую нагрузку может выдержать участок. Каждая мебель имеет скрытое значение нагрузки, которое можно посмотреть ниже.",
"(максимальное значение еще не подтверждено!)"
],
"hall": "Зал",
"room": "Комната {number}",
"exteriorNum": "Регион {number}",
"corridor": "Коридор"
"corridor": "Коридор",
"inventoryButton": "Инвентарь",
"listButton": "Список",
"inventory": {
"title": "Мебельный инвентарь",
"subtitle": "Некоторые специальные категории, например - стены, не отображаются",
"all": "Все",
"openSets": "Открыть наборы"
},
"sets": {
"title": "Наборы мебели",
"subtitle": "Нажмите на значок мебели для получения подробной информации, также вы можете щелкнуть на значок персонажа, чтобы отметить его! Откройте меню Инвентаря выше, чтобы заполнить количество предметов мебели.",
"setPlaced": "Установить как размещенный",
"setUnplaced": "Установить как не размещенный",
"inInventory": "В инвентаре",
"available": "Доступно",
"used": "Используется в другом наборе"
}
},
"weapon": {
"title": "Список оружия",
@ -632,4 +686,4 @@
"lvl": "Уровень",
"baseAtk": "Базовая атака"
}
}
}

View File

@ -11,6 +11,7 @@
"todoList": "Todo 规划",
"timeline": "时间线",
"furnishing": "家具",
"weapons": "武器",
"settings": "设置",
"donate": "赞助"
},
@ -19,7 +20,7 @@
"message": "你最好的原神伙伴! 帮助你规划材料消耗与刷本, 追踪你的游戏进度与抽卡结果.",
"banner": {
"featured": [
"优菈"
"可莉"
],
"summoned": "被抽到",
"percentage": "占比于 {rarity}",
@ -66,6 +67,10 @@
"achievement": {
"title": "🏆 查看追踪你的成就完成状态",
"detail": "成就"
},
"furnishing": {
"title": "查看套装需要哪些家具. 同时你也可以查看不同家具的负载.",
"detail": "家具"
}
},
"characters": {
@ -78,6 +83,7 @@
"talents": "天赋",
"passiveTalents": "被动天赋",
"constellations": "命之座",
"const": "命",
"asc": "突破",
"lvl": "等级",
"hp": "生命",
@ -98,7 +104,8 @@
"cryoDamageBonus": "冰元素伤害加成",
"anemoDamageBonus": "风元素伤害加成",
"physicalDamageBonus": "物理伤害加成",
"geoDamageBonus": "岩元素伤害加成"
"geoDamageBonus": "岩元素伤害加成",
"sortBy": "排序方式..."
},
"wish": {
"title": "祈愿统计",
@ -226,7 +233,7 @@
"如果你不想提供你的url你可以使用这个选项在你的电脑上本地处理祈愿历史记录。此脚本将读取您电脑上的日志文件以获取祈愿url。",
"打开开始菜单, 搜索powershell",
"打开windows powershell, 然后复制粘贴脚本到powershell里",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/cdfead30f830b897e8822a40f98fea5340dbd62e/importer.ps1'))",
"iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18/raw/a281cb0c131e1402885cc7201b73ceacdb139f94/importer.ps1'))",
"你可以查看这个脚本",
"这里",
"https://gist.github.com/MadeBaruna/9ff8b7a2af11f3002395af7963b5ed18",
@ -383,7 +390,12 @@
"mora": "摩拉 (误差 ±40)",
"expWasted": "溢出经验",
"addToTodo": "添加到Todo",
"addedToTodo": "已添加到Todo"
"addedToTodo": "已添加到Todo",
"talent": [
"普攻",
"战技",
"爆发"
]
},
"expTable": {
"level": "等级",
@ -598,6 +610,49 @@
"hall": "大厅",
"room": "屋子 {number}",
"exteriorNum": "区域 {number}",
"corridor": "走廊"
"corridor": "走廊",
"inventoryButton": "仓库",
"listButton": "列表",
"inventory": {
"title": "家具仓库",
"subtitle": "并未显示一些特殊分类例如墙壁",
"all": "全部",
"openSets": "打开套装"
},
"sets": {
"title": "家具套装",
"subtitle": "点击家具图标查看详情, 然后可以点击角色图标来标记! 打开上面库存按钮可以填写你拥有的家具数量.",
"setPlaced": "设为已放置",
"setUnplaced": "设为未放置",
"inInventory": "在库存中",
"available": "可用",
"used": "已在其他套装使用"
}
},
"weapon": {
"title": "武器列表",
"subtitle": "数据取自最高等级",
"name": "名称",
"type": "类型",
"rarity": "稀有度",
"atk": "攻击",
"secondary": "副属性",
"critRate": "暴击率",
"critDamage": "暴击伤害",
"em": "元素精通",
"er": "元素充能",
"atkPercent": "攻击",
"hpPercent": "生命",
"defPercent": "防御",
"physicalDamage": "物理伤害加成",
"bow": "弓",
"polearm": "长柄",
"sword": "单手剑",
"catalyst": "法器",
"claymore": "双手剑",
"ascensionMaterial": "突破材料",
"asc": "突破",
"lvl": "等级",
"baseAtk": "基础攻击"
}
}

View File

@ -13,15 +13,15 @@
const dispatch = createEventDispatcher();
const featured = {
klee: {
kamisato_ayaka: {
rarity: 'legendary',
count: 0,
average: '...',
percentage: '...',
},
};
const bannerId = 300014;
const image = 'klee.png';
const bannerId = 300016;
const image = 'ayaka.png';
let loading = true;
let user = '';
@ -48,6 +48,8 @@
}
}
console.log(featured);
loading = false;
} catch (err) {
console.error(err);
@ -59,7 +61,6 @@
await tick();
dispatch('done');
});
</script>
<div class="bg-item rounded-xl p-4 flex flex-col">
@ -80,7 +81,7 @@
{/if}
</h3>
<p class="ml-6 font-sm leading-2">
<span class="font-semibold">Klee</span>
<span class="font-semibold">Ayaka</span>
{$t('home.banner.summoned')}
</p>
</div>

View File

@ -242,10 +242,12 @@
function calculateTalentTraveler() {
Object.keys(currentTalentLevel).forEach((i) => {
for (let j = currentTalentLevel[i] - 1; j < maxTalentLevel; j++) {
for (let j = currentTalentLevel[i] - 1; j < targetTalentLevel[i] - 1; j++) {
let currentBook = selectedCharacter.material.book[j];
let currentMaterial = selectedCharacter.material.material[j];
console.log(j, currentBook);
if (selectedCharacter.id === characters.traveler_geo.id && i === 'first') {
currentBook = selectedCharacter.material_atk.book[j];
currentMaterial = selectedCharacter.material_atk.material[j];
@ -402,7 +404,8 @@
if (withTalent) {
if (
selectedCharacter.id === characters.traveler_anemo.id ||
selectedCharacter.id === characters.traveler_geo.id
selectedCharacter.id === characters.traveler_geo.id ||
selectedCharacter.id === characters.traveler_electro.id
) {
calculateTalentTraveler();
} else {
@ -460,7 +463,6 @@
addedToTodo = false;
}, 2000);
}
</script>
<div class="bg-item rounded-xl p-4">

View File

@ -0,0 +1,306 @@
<script>
import { fade } from 'svelte/transition';
import { mdiCheck, mdiClose } from '@mdi/js';
import { t } from 'svelte-i18n';
import Button from '../../components/Button.svelte';
import Check from '../../components/Check.svelte';
import Icon from '../../components/Icon.svelte';
import Input from '../../components/Input.svelte';
import Select from '../../components/Select.svelte';
const numberFormat = Intl.NumberFormat('en', {
maximumFractionDigits: 2,
minimumFractionDigits: 0,
});
const values = [
{ amount: 60, bonus: 0, firstTime: true },
{ amount: 300, bonus: 30, firstTime: true },
{ amount: 980, bonus: 110, firstTime: true },
{ amount: 1980, bonus: 260, firstTime: true },
{ amount: 3280, bonus: 600, firstTime: true },
{ amount: 6480, bonus: 1600, firstTime: true },
];
const prices = {
USD: {
currency: '$',
values: [0.99, 4.99, 14.99, 29.99, 49.99, 99.99],
},
IDR: {
currency: 'Rp',
values: [16000, 79000, 249000, 479000, 799000, 1599000],
},
EUR: {
currency: '€',
values: [1.19, 5.49, 16.99, 32.99, 54.99, 109.99],
},
BRL: {
currency: 'R$',
values: [4.9, 27.9, 84.9, 169.9, 279.9, 549.9],
},
MYR: {
currency: 'RM',
values: [3.9, 19.9, 59.9, 129.9, 199.9, 399.9],
},
GBP: {
currency: '£',
values: [0.99, 4.99, 14.99, 29.99, 49.99, 99.99],
},
CNY: {
currency: '¥',
values: [6.0, 30.0, 98.0, 198.0, 328.0, 648.0],
},
Custom: {
currency: 'Custom',
values: [0.99, 4.99, 14.99, 29.99, 49.99, 99.99],
},
};
let usable = [];
let currencyLabel = '';
let usedPrices = [];
const currencies = [
{ label: 'USD ($)', value: 'USD' },
{ label: 'IDR (Rp)', value: 'IDR' },
{ label: 'EUR (€)', value: 'EUR' },
{ label: 'BRL (R$)', value: 'BRL' },
{ label: 'MYR (RM)', value: 'MYR' },
{ label: 'GBP (£)', value: 'GBP' },
{ label: 'CNY (¥)', value: 'CNY' },
{ label: 'Custom', value: 'Custom' },
];
let selected = null;
let money = 200;
let fate = 80;
let result = null;
let resultTotal = null;
let resultTotalPrice = null;
function onCurrencyChange() {
usedPrices = prices[selected.value].values.slice();
currencyLabel = prices[selected.value].currency;
onChange();
}
function onChange() {
result = null;
}
function calculateUsable() {
usable = usable
.slice()
.map((e) => {
const total = e.amount + (e.firstTime ? e.amount : e.bonus);
return { ...e, total, perItem: e.price / total };
})
.sort((a, b) => a.perItem - b.perItem);
}
async function calculate() {
onChange();
usable = values.slice().map((e, i) => ({ ...e, price: usedPrices[i] }));
calculateUsable();
let currentMoney = money;
const used = [];
let total = 0;
let totalPrice = 0;
while (usable.length > 0) {
const currentUsable = usable[0];
if (currentMoney - currentUsable.price >= 0) {
currentMoney -= currentUsable.price;
total += currentUsable.amount + (currentUsable.firstTime ? currentUsable.amount : currentUsable.bonus);
totalPrice += currentUsable.price;
const usedItem = used.find((e) => e.amount === currentUsable.amount && e.firstTime === currentUsable.firstTime);
if (usedItem) {
usedItem.qty++;
} else {
used.push({ ...currentUsable, qty: 1 });
}
if (currentUsable.firstTime) {
currentUsable.firstTime = false;
calculateUsable();
}
} else {
usable.shift();
}
}
result = used;
resultTotal = total;
resultTotalPrice = totalPrice;
}
async function calculateFate() {
onChange();
usable = values.slice().map((e, i) => ({ ...e, price: usedPrices[i] }));
calculateUsable();
const usableTemp = usable.slice();
let currentGenesis = fate * 160;
const used = [];
let total = 0;
let totalPrice = 0;
while (currentGenesis > 0 && usable.length > 0) {
const currentUsable = usable[0];
const totalGenesis =
currentUsable.amount + (currentUsable.firstTime ? currentUsable.amount : currentUsable.bonus);
if (currentGenesis - totalGenesis >= 0) {
currentGenesis -= totalGenesis;
total += totalGenesis;
totalPrice += currentUsable.price;
const usedItem = used.find((e) => e.amount === currentUsable.amount && e.firstTime === currentUsable.firstTime);
if (usedItem) {
usedItem.qty++;
} else {
used.push({ ...currentUsable, qty: 1 });
}
if (currentUsable.firstTime) {
currentUsable.firstTime = false;
usableTemp.find((e) => e.amount === currentUsable.amount).firstTime = false;
calculateUsable();
}
} else {
usable.shift();
}
}
let min = Number.MAX_SAFE_INTEGER;
let current = null;
for (const u of usableTemp) {
const usageAmount = u.amount + (u.firstTime ? u.amount : u.bonus);
if (Math.abs(currentGenesis - usageAmount) < min) {
current = u;
min = Math.abs(currentGenesis - usageAmount);
}
}
total += current.amount + (current.firstTime ? current.amount : current.bonus);
totalPrice += current.price;
const usedItem = used.find((e) => e.amount === current.amount && e.firstTime === current.firstTime);
if (usedItem) {
usedItem.qty++;
} else {
used.push({ ...current, qty: 1 });
}
result = used;
resultTotal = total;
resultTotalPrice = totalPrice;
}
</script>
<div class="bg-item rounded-xl p-4">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 gap-4">
<div>
<Select
options={currencies}
on:change={onCurrencyChange}
bind:selected
placeholder={$t('calculator.fate.currency')}
/>
{#if selected !== null}
<div class="mt-2">
{#each values as value, i}
<div class="mb-1 rounded-xl border-background border p-2">
<div class="flex flex-row items-center mb-1">
<img src="/images/genesis_crystal.png" alt="Genesis Crystal" class="w-6 mr-2" />
<p class="text-white">
{numberFormat.format(value.amount)} + {numberFormat.format(
value.firstTime ? value.amount : value.bonus,
)} = {numberFormat.format(value.amount + (value.firstTime ? value.amount : value.bonus))}
</p>
</div>
<div class="flex flex-row items-center">
<div class="w-32">
<Input className="text-center" bind:value={usedPrices[i]} type="number" />
</div>
<div class="flex flex-row items-center">
<Check inverted bind:checked={value.firstTime} on:change={onChange} />
<p class="text-white">{$t('calculator.fate.firstTime')}</p>
</div>
</div>
</div>
{/each}
</div>
{/if}
</div>
{#if selected !== null}
<div>
<Input placeholder="Total Money" bind:value={money} type="number" on:change={onChange} />
<div class="mb-1" />
<Button className="w-full" on:click={calculate}>
{$t('calculator.fate.calculate', { values: { currency: currencyLabel, value: numberFormat.format(money) } })}
</Button>
<p class="text-white my-6 text-center">OR</p>
<Input placeholder="Total Fate" bind:value={fate} type="number" on:change={onChange} />
<div class="mb-1" />
<Button className="w-full" on:click={calculateFate}>
{$t('calculator.fate.calculateFate', { values: { value: fate } })}
<img class="ml-1 w-6 inline" src="/images/intertwined_fate.png" alt="Fate" />
</Button>
</div>
{/if}
{#if result !== null}
<div
transition:fade={{ duration: 100 }}
class="rounded-xl bg-background p-4 block md:inline-block"
style="height: fit-content; width: fit-content;"
>
<table>
<tr>
<th class="text-white pr-2 text-right">{$t('calculator.fate.amount')}</th>
<th class="text-white pr-2 text-right">{$t('calculator.fate.genesis')}</th>
<th class="text-white pr-2 text-center">{$t('calculator.fate.first')}</th>
<th class="text-white pr-2 text-right">{$t('calculator.fate.total')}</th>
<th class="text-white text-right">{$t('calculator.fate.price')}</th>
</tr>
{#each result as res}
<tr>
<td class="border-t border-gray-700 text-white pr-2 text-right">
{res.qty}
<Icon size={0.5} path={mdiClose} />
</td>
<td class="border-t border-gray-700 text-white pr-2 text-right">{res.amount}</td>
<td class="border-t border-gray-700 text-white pr-2 text-center">
<Icon size={0.8} path={res.firstTime ? mdiCheck : mdiClose} />
</td>
<td class="border-t border-gray-700 text-white pr-2 text-right">
{numberFormat.format((res.amount + (res.firstTime ? res.amount : res.bonus)) * res.qty)}
</td>
<td class="border-t border-gray-700 text-white text-right">
{numberFormat.format(res.price * res.qty)}
</td>
</tr>
{/each}
<tr>
<td class="border-t border-gray-700 text-white text-right whitespace-no-wrap" colspan={5}>
{$t('calculator.fate.totalGenesis')}
{numberFormat.format(resultTotal)}
<img class="mr-1 w-6 inline" src="/images/genesis_crystal.png" alt="Genesis" />
({Math.floor(resultTotal / 160)}
<img class="w-6 inline" src="/images/intertwined_fate.png" alt="Fate" />)
</td>
</tr>
<tr>
<td class="border-t border-gray-700 text-white text-right whitespace-no-wrap" colspan={5}>
{$t('calculator.fate.totalPrice')}
{currencyLabel}{numberFormat.format(resultTotalPrice)}
</td>
</tr>
</table>
</div>
{/if}
</div>
</div>

View File

@ -0,0 +1,126 @@
<script>
import { fade } from 'svelte/transition';
import { t } from 'svelte-i18n';
import Select from '../../components/Select.svelte';
import Button from '../../components/Button.svelte';
import { commissionBonusExp, commissionExp, friendshipExp } from '../../data/friendshipExp';
import { ar } from '../../stores/server';
import Icon from '../../components/Icon.svelte';
import { mdiMinus, mdiPlus } from '@mdi/js';
let selectOptions = [...new Array(9)].map((e, i) => ({ label: i + 1, value: i + 1 }));
let level = null;
let randomEvent = 0;
let canCalculate = false;
let currentExp = 20;
let changed = true;
let result = 0;
let resultSerenitea = 0;
function calculate() {
let expNeeded = friendshipExp.slice(level.value - 1).reduce((prev, cur) => prev + cur, 0);
expNeeded -= (currentExp / 100) * friendshipExp[level.value - 1];
const currentAR = $ar;
const commisExpDaily = commissionExp[currentAR - 12] * 4 + commissionBonusExp[currentAR - 12];
const dailyResinExp = currentAR >= 35 ? 180 : 135;
const randomEventExp = randomEvent * 10;
const total = commisExpDaily + dailyResinExp + randomEventExp;
console.log(expNeeded, commisExpDaily, dailyResinExp, randomEventExp, total);
result = Math.ceil(expNeeded / total);
resultSerenitea = Math.ceil(expNeeded / (total + 5 * 24));
changed = false;
}
function changeRandomEvent(count) {
randomEvent += count;
if (randomEvent < 0) randomEvent = 0;
if (randomEvent > 10) randomEvent = 10;
changed = true;
}
function onChange() {
changed = true;
}
$: canCalculate = level !== null;
</script>
<div class="bg-item rounded-xl p-4">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 gap-4">
<div>
<Select
options={selectOptions}
on:change={onChange}
bind:selected={level}
placeholder={$t('calculator.friendship.currentLevel')}
/>
<p class="text-white mt-4 text-center">{$t('calculator.friendship.currentExp')} - {currentExp}%</p>
<input
type="range"
min={0}
max={100}
class="slider"
style="background: linear-gradient(to right, #b3a2f8 0%, #b3a2f8 {currentExp}%, #202442 {currentExp}%, #202442 100%);"
on:change={onChange}
bind:value={currentExp}
/>
<p class="text-white mt-4 text-center">{$t('calculator.friendship.randomEventFarm')}</p>
<div class="flex justify-center">
<Button on:click={() => changeRandomEvent(-1)}><Icon path={mdiMinus} /></Button>
<p class="mx-2 bg-background rounded-xl text-bold text-white py-4 w-16 text-center">{randomEvent}</p>
<Button on:click={() => changeRandomEvent(1)}><Icon path={mdiPlus} /></Button>
</div>
</div>
<div class="md:col-span-2 xl:col-span-1">
<Button disabled={!canCalculate} className="block w-full md:w-auto" on:click={calculate}>
{$t('calculator.friendship.calculate')}
</Button>
{#if !changed}
<div transition:fade={{ duration: 100 }} class="bg-background rounded-xl p-4 mt-2 block xl:inline-block">
<p class="block text-center text-gray-400">{$t('calculator.friendship.based', { values: { ar: $ar } })}</p>
<table class="text-gray-200">
<tr>
<td class="text-xl font-bold text-primary whitespace-no-wrap pr-4 border-b border-gray-700 pb-1">
{$t('calculator.friendship.resultDay', { values: { result } })}
</td>
<td class="border-b border-gray-700 pb-1">{$t('calculator.friendship.result')}</td>
</tr>
<tr>
<td class="text-xl font-bold text-primary whitespace-no-wrap pr-4 pt-1">
{$t('calculator.friendship.resultDay', { values: { result: resultSerenitea } })}
</td>
<td class="pt-1">{$t('calculator.friendship.resultSerenitea')}</td>
</tr>
</table>
</div>
{/if}
</div>
</div>
</div>
<style>
.slider {
@apply w-full h-4 rounded-xl;
-webkit-appearance: none;
appearance: none;
outline: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 1px;
background: #b3a2f8;
}
.slider::-moz-range-thumb {
width: 0px;
background: #b3a2f8;
}
/* .slider:focus {
-webkit-appearance: none;
} */
</style>

View File

@ -8,6 +8,8 @@
import CharacterCalculator from './_character.svelte';
import LevelUpTable from './_characterTable.svelte';
import ResinCalculator from './_resin.svelte';
import FriendshipCalculator from './_friendship.svelte';
import FatesCalculator from './_fates.svelte';
import ResinTable from './_resinTable.svelte';
import Button from '../../components/Button.svelte';
import Icon from '../../components/Icon.svelte';
@ -113,6 +115,36 @@
</h1>
</div>
<ResinCalculator />
<div
id="friendship"
class="flex flex-col items-center md:flex-row-reverse md:justify-end md:items-start lg:items-center mt-8 mb-2"
>
<Button on:click={() => findPos('character')}>
<Icon size={0.8} path={mdiArrowUp} />
{$t('calculator.goto', { values: { where: $t('calculator.titleCharacter') } })}
</Button>
<h1
class="font-display font-black text-center mt-2 md:mt-0 md:mr-2 xl:mr-8 text-3xl lg:text-left lg:text-5xl text-white"
>
{$t('calculator.titleFriendship')}
</h1>
</div>
<FriendshipCalculator />
<div
id="friendship"
class="flex flex-col items-center md:flex-row-reverse md:justify-end md:items-start lg:items-center mt-8 mb-2"
>
<Button on:click={() => findPos('character')}>
<Icon size={0.8} path={mdiArrowUp} />
{$t('calculator.goto', { values: { where: $t('calculator.titleCharacter') } })}
</Button>
<h1
class="font-display font-black text-center mt-2 md:mt-0 md:mr-2 xl:mr-8 text-3xl lg:text-left lg:text-5xl text-white"
>
{$t('calculator.titleFate')}
</h1>
</div>
<FatesCalculator />
<div class="mt-8 space-y-4 grid md:grid-cols-2 md:gap-4 md:space-y-0">
<LevelUpTable />
<ResinTable />

View File

@ -210,7 +210,6 @@
onMount(async () => {
await getConstellation();
});
</script>
<svelte:head>
@ -498,5 +497,4 @@
padding-top: 0.85rem;
padding-bottom: 0.85rem;
}
</style>

View File

@ -3,7 +3,6 @@
export async function preload() {
return { data };
}
</script>
<script>
@ -34,7 +33,7 @@
function process() {
const _weapons = [];
for (const [id, weapon] of Object.entries(data)) {
if (['amber_bead', 'ebony_bow', 'quartz', 'the_flagstaff', 'freedom-sworn'].includes(id)) continue;
if (['amber_bead', 'ebony_bow', 'quartz', 'the_flagstaff'].includes(id)) continue;
_weapons.push({
id,
@ -101,7 +100,6 @@
changeLocale(val);
});
});
</script>
<svelte:head>

View File

@ -1,6 +1,6 @@
<script>
import { t } from 'svelte-i18n';
import { Workbook } from 'exceljs';
import { Workbook, ValueType } from 'exceljs';
import dayjs from 'dayjs';
import Button from '../../components/Button.svelte';
@ -203,8 +203,15 @@
sheet.eachRow((row, index) => {
if (index === 1) return;
const type = row.getCell(1).text.toLowerCase();
const time = row.getCell(3).text;
let time = row.getCell(3);
const fullName = row.getCell(2).text;
if (time.type === ValueType.Date) {
time = dayjs.utc(time.value).format('YYYY-MM-DD HH:mm:ss');
} else {
time = time.text;
}
let name = '';
if (type === 'weapon') {
name = weapons.find((e) => e.name === fullName).id;
@ -246,8 +253,15 @@
sheet.eachRow((row, index) => {
if (index === 1) return;
const type = row.getCell(3).text.toLowerCase();
const time = row.getCell(1).text;
let time = row.getCell(1);
const fullName = row.getCell(2).text;
if (time.type === ValueType.Date) {
time = dayjs.utc(time.value).format('YYYY-MM-DD HH:mm:ss');
} else {
time = time.text;
}
let name = '';
if (type === 'weapon') {
name = weapons.find((e) => e.name === fullName).id;
@ -300,7 +314,10 @@
function checkFile(file) {
console.log(file.type);
if (file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
if (
file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
file.type === 'application/wps-office.xlsx'
) {
readExcel(file);
} else {
pushToast($t('wish.excel.errorInvalidFile'), 'error');
@ -349,7 +366,6 @@
};
reader.readAsArrayBuffer(file);
});
</script>
<div>
@ -434,5 +450,4 @@
@apply text-background;
}
}
</style>

View File

@ -10,7 +10,6 @@
function showOldTally(index) {
showOld[index] = true;
}
</script>
<svelte:head>
@ -26,6 +25,15 @@
</p>
<div class="px-4 md:px-8">
<ItemNew type="character" banner={banners.characters[15]} id={300016} featured={['kamisato_ayaka']} />
<ItemNew
type="weapon"
banner={banners.weapons[14]}
id={400015}
featured={['mistsplitter_reforged', 'skyward_spine']}
/>
<ItemNew type="character" banner={banners.characters[14]} id={300015} featured={['kaedehara_kazuha']} />
<ItemNew type="weapon" banner={banners.weapons[13]} id={400014} featured={['freedom-sworn', 'skyward_atlas']} />
<ItemNew type="character" banner={banners.characters[13]} id={300014} featured={['klee']} />
<ItemNew
type="weapon"
@ -33,15 +41,23 @@
id={400013}
featured={['lost_prayer_to_the_sacred_winds', 'skyward_pride']}
/>
<ItemNew type="character" banner={banners.characters[12]} id={300013} featured={['eula']} />
<ItemNew
type="weapon"
banner={banners.weapons[11]}
id={400012}
featured={['song_of_broken_pines', 'aquila_favonia']}
/>
<ItemNew type="character" banner={banners.standard[0]} id={200001} />
{#if showOld[0]}
<ItemNew type="character" banner={banners.characters[12]} id={300013} featured={['eula']} />
<ItemNew
type="weapon"
banner={banners.weapons[11]}
id={400012}
featured={['song_of_broken_pines', 'aquila_favonia']}
/>
{:else}
<Button on:click={() => showOldTally(0)}>
{$t('wish.tally.show')}
{banners.characters[12].name} & {banners.weapons[11].name}
</Button>
<div class="mb-2" />
{/if}
{#if showOld[1]}
<ItemNew type="character" banner={banners.characters[11]} id={300012} featured={['zhongli', 'yanfei']} />
<ItemNew
type="weapon"
@ -50,13 +66,13 @@
featured={['summit_shaper', 'memory_of_dust']}
/>
{:else}
<Button on:click={() => showOldTally(0)}>
<Button on:click={() => showOldTally(1)}>
{$t('wish.tally.show')}
{banners.characters[11].name} & {banners.weapons[10].name}
</Button>
<div class="mb-2" />
{/if}
{#if showOld[1]}
{#if showOld[2]}
<Item type="character" banner={banners.characters[10]} id={300011} featured={['tartaglia', 'rosaria']} />
<Item
type="weapon"
@ -65,13 +81,13 @@
featured={['skyward_harp', 'lost_prayer_to_the_sacred_winds']}
/>
{:else}
<Button on:click={() => showOldTally(1)}>
<Button on:click={() => showOldTally(2)}>
{$t('wish.tally.show')}
{banners.characters[10].name} & {banners.weapons[9].name}
</Button>
<div class="mb-2" />
{/if}
{#if showOld[2]}
{#if showOld[3]}
<Item type="character" banner={banners.characters[9]} id={300010} featured={['venti']} />
<Item
type="weapon"
@ -80,17 +96,17 @@
featured={['skyward_harp', 'lost_prayer_to_the_sacred_winds']}
/>
{:else}
<Button on:click={() => showOldTally(2)}>
<Button on:click={() => showOldTally(3)}>
{$t('wish.tally.show')}
{banners.characters[9].name} & {banners.weapons[8].name}
</Button>
<div class="mb-2" />
{/if}
{#if showOld[3]}
{#if showOld[4]}
<Item type="character" banner={banners.characters[8]} id={300009} featured={['hu_tao']} />
<Item type="weapon" banner={banners.weapons[7]} id={400008} featured={['wolfs_gravestone', 'staff_of_homa']} />
{:else}
<Button on:click={() => showOldTally(3)}>
<Button on:click={() => showOldTally(4)}>
{$t('wish.tally.show')}
{banners.characters[8].name} & {banners.weapons[7].name}
</Button>

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Some files were not shown because too many files have changed in this diff Show More