mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 06:07:21 +01:00
Lost Masterclasser Quest Line (#9183)
* fix(sprites): serve animated GIFs Also add new GIF for upcoming quest line * feat(content): Masterclasser capstone quest Also fixes Quests page for clearer lock/unlock display * chore(sprites): compile * feat(achievements): award quest completionist cheevo * feat(quests): Siphoning Void fix Achievements page styling and text spacing fix display of Rage bar on party page * test(quests): Lost Masterclasser * chore(news): Bailey * fix(test): only use Masterclasser in relevant scenario
This commit is contained in:
@@ -117,6 +117,11 @@ let basicAchievs = {
|
||||
titleKey: 'invitedFriend',
|
||||
textKey: 'invitedFriendText',
|
||||
},
|
||||
lostMasterclasser: {
|
||||
icon: 'achievement-lostMasterclasser',
|
||||
titleKey: 'achievementLostMasterclasser',
|
||||
textKey: 'achievementLostMasterclasserText',
|
||||
},
|
||||
};
|
||||
Object.assign(achievementsData, basicAchievs);
|
||||
|
||||
|
||||
@@ -788,6 +788,13 @@ let back = {
|
||||
notes: t('backSpecialSnowdriftVeilNotes'),
|
||||
value: 0,
|
||||
},
|
||||
aetherCloak: {
|
||||
text: t('backSpecialAetherCloakText'),
|
||||
notes: t('backSpecialAetherCloakNotes', { per: 10 }),
|
||||
value: 175,
|
||||
per: 10,
|
||||
canOwn: ownsItem('back_special_aetherCloak'),
|
||||
},
|
||||
};
|
||||
|
||||
let body = {
|
||||
@@ -861,6 +868,14 @@ let body = {
|
||||
return CURRENT_SEASON === 'summer';
|
||||
},
|
||||
},
|
||||
aetherAmulet: {
|
||||
text: t('bodySpecialAetherAmuletText'),
|
||||
notes: t('bodySpecialAetherAmuletNotes', { attrs: 10 }),
|
||||
value: 175,
|
||||
str: 10,
|
||||
con: 10,
|
||||
canOwn: ownsItem('body_special_aetherAmulet'),
|
||||
},
|
||||
};
|
||||
|
||||
let eyewear = {
|
||||
@@ -937,6 +952,13 @@ let eyewear = {
|
||||
value: 0,
|
||||
canOwn: ownsItem('eyewear_special_yellowTopFrame'),
|
||||
},
|
||||
aetherMask: {
|
||||
text: t('eyewearSpecialAetherMaskText'),
|
||||
notes: t('eyewearSpecialAetherMaskNotes', { int: 10 }),
|
||||
value: 175,
|
||||
int: 10,
|
||||
canOwn: ownsItem('eyewear_special_aetherMask'),
|
||||
},
|
||||
};
|
||||
|
||||
let head = {
|
||||
@@ -2566,6 +2588,17 @@ let weapon = {
|
||||
value: 0,
|
||||
canOwn: ownsItem('weapon_special_tachi'),
|
||||
},
|
||||
aetherCrystals: {
|
||||
text: t('weaponSpecialAetherCrystalsText'),
|
||||
notes: t('weaponSpecialAetherCrystalsNotes', { attrs: 10 }),
|
||||
con: 10,
|
||||
int: 10,
|
||||
per: 10,
|
||||
str: 10,
|
||||
value: 175,
|
||||
twoHanded: true,
|
||||
canOwn: ownsItem('weapon_special_aetherCrystals'),
|
||||
},
|
||||
yeti: {
|
||||
event: EVENTS.winter,
|
||||
specialClass: 'warrior',
|
||||
|
||||
@@ -2781,6 +2781,228 @@ let quests = {
|
||||
unlock: t('questHippoUnlockText'),
|
||||
},
|
||||
},
|
||||
lostMasterclasser1: {
|
||||
text: t('questLostMasterclasser1Text'),
|
||||
notes: t('questLostMasterclasser1Notes'),
|
||||
group: 'questGroupLostMasterclasser',
|
||||
completion: t('questLostMasterclasser1Completion'),
|
||||
value: 4,
|
||||
goldValue: 400,
|
||||
category: 'gold',
|
||||
collect: {
|
||||
ancientTome: {
|
||||
text: t('questLostMasterclasser1CollectAncientTomes'),
|
||||
count: 40,
|
||||
},
|
||||
forbiddenTome: {
|
||||
text: t('questLostMasterclasser1CollectForbiddenTomes'),
|
||||
count: 40,
|
||||
},
|
||||
hiddenTome: {
|
||||
text: t('questLostMasterclasser1CollectHiddenTomes'),
|
||||
count: 40,
|
||||
},
|
||||
},
|
||||
drop: {
|
||||
items: [
|
||||
{
|
||||
type: 'food',
|
||||
key: 'Potatoe',
|
||||
text: t('foodPotatoe'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Potatoe',
|
||||
text: t('foodPotatoe'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Potatoe',
|
||||
text: t('foodPotatoe'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Meat',
|
||||
text: t('foodMeat'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Meat',
|
||||
text: t('foodMeat'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Meat',
|
||||
text: t('foodMeat'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Milk',
|
||||
text: t('foodMilk'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Milk',
|
||||
text: t('foodMilk'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Milk',
|
||||
text: t('foodMilk'),
|
||||
},
|
||||
],
|
||||
gp: 0,
|
||||
exp: 200,
|
||||
},
|
||||
},
|
||||
lostMasterclasser2: {
|
||||
text: t('questLostMasterclasser2Text'),
|
||||
notes: t('questLostMasterclasser2Notes'),
|
||||
group: 'questGroupLostMasterclasser',
|
||||
previous: 'lostMasterclasser1',
|
||||
completion: t('questLostMasterclasser2Completion'),
|
||||
value: 4,
|
||||
goldValue: 500,
|
||||
category: 'gold',
|
||||
boss: {
|
||||
name: t('questLostMasterclasser2Boss'),
|
||||
hp: 1500,
|
||||
str: 2.5,
|
||||
},
|
||||
drop: {
|
||||
items: [
|
||||
{
|
||||
type: 'food',
|
||||
key: 'Chocolate',
|
||||
text: t('foodChocolate'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Chocolate',
|
||||
text: t('foodChocolate'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Chocolate',
|
||||
text: t('foodChocolate'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Honey',
|
||||
text: t('foodHoney'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Honey',
|
||||
text: t('foodHoney'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'Honey',
|
||||
text: t('foodHoney'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'RottenMeat',
|
||||
text: t('foodRottenMeat'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'RottenMeat',
|
||||
text: t('foodRottenMeat'),
|
||||
}, {
|
||||
type: 'food',
|
||||
key: 'RottenMeat',
|
||||
text: t('foodRottenMeat'),
|
||||
}, {
|
||||
type: 'gear',
|
||||
key: 'eyewear_special_aetherMask',
|
||||
text: t('questLostMasterclasser2DropEyewear'),
|
||||
},
|
||||
],
|
||||
gp: 0,
|
||||
exp: 1500,
|
||||
},
|
||||
},
|
||||
lostMasterclasser3: {
|
||||
text: t('questLostMasterclasser3Text'),
|
||||
notes: t('questLostMasterclasser3Notes'),
|
||||
group: 'questGroupLostMasterclasser',
|
||||
completion: t('questLostMasterclasser3Completion'),
|
||||
previous: 'lostMasterclasser2',
|
||||
value: 4,
|
||||
goldValue: 600,
|
||||
category: 'gold',
|
||||
boss: {
|
||||
name: t('questLostMasterclasser3Boss'),
|
||||
hp: 2000,
|
||||
str: 3,
|
||||
rage: {
|
||||
title: t('questLostMasterclasser3RageTitle'),
|
||||
description: t('questLostMasterclasser3RageDescription'),
|
||||
value: 25,
|
||||
healing: 0.3,
|
||||
effect: t('questLostMasterclasser3RageEffect'),
|
||||
},
|
||||
},
|
||||
drop: {
|
||||
items: [
|
||||
{
|
||||
type: 'hatchingPotions',
|
||||
key: 'Base',
|
||||
text: t('questLostMasterclasser3DropBasePotion'),
|
||||
}, {
|
||||
type: 'hatchingPotions',
|
||||
key: 'CottonCandyPink',
|
||||
text: t('questLostMasterclasser3DropPinkPotion'),
|
||||
}, {
|
||||
type: 'hatchingPotions',
|
||||
key: 'Golden',
|
||||
text: t('questLostMasterclasser3DropGoldenPotion'),
|
||||
}, {
|
||||
type: 'hatchingPotions',
|
||||
key: 'Shade',
|
||||
text: t('questLostMasterclasser3DropShadePotion'),
|
||||
}, {
|
||||
type: 'hatchingPotions',
|
||||
key: 'Zombie',
|
||||
text: t('questLostMasterclasser3DropZombiePotion'),
|
||||
}, {
|
||||
type: 'gear',
|
||||
key: 'body_special_aetherAmulet',
|
||||
text: t('questLostMasterclasser3DropBodyAccessory'),
|
||||
},
|
||||
],
|
||||
gp: 0,
|
||||
exp: 2000,
|
||||
},
|
||||
},
|
||||
lostMasterclasser4: {
|
||||
text: t('questLostMasterclasser4Text'),
|
||||
notes: t('questLostMasterclasser4Notes'),
|
||||
group: 'questGroupLostMasterclasser',
|
||||
completion: t('questLostMasterclasser4Completion'),
|
||||
previous: 'lostMasterclasser3',
|
||||
value: 4,
|
||||
goldValue: 700,
|
||||
category: 'gold',
|
||||
boss: {
|
||||
name: t('questLostMasterclasser4Boss'),
|
||||
hp: 3000,
|
||||
str: 4,
|
||||
rage: {
|
||||
title: t('questLostMasterclasser4RageTitle'),
|
||||
description: t('questLostMasterclasser4RageDescription'),
|
||||
value: 15,
|
||||
mpDrain: true,
|
||||
effect: t('questLostMasterclasser4RageEffect'),
|
||||
},
|
||||
},
|
||||
drop: {
|
||||
items: [
|
||||
{
|
||||
type: 'mounts',
|
||||
key: 'Aether-Invisible',
|
||||
text: t('questLostMasterclasser4DropMount'),
|
||||
}, {
|
||||
type: 'gear',
|
||||
key: 'back_special_aetherCloak',
|
||||
text: t('questLostMasterclasser4DropBackAccessory'),
|
||||
}, {
|
||||
type: 'gear',
|
||||
key: 'weapon_special_aetherCrystals',
|
||||
text: t('questLostMasterclasser4DropWeapon'),
|
||||
},
|
||||
],
|
||||
gp: 0,
|
||||
exp: 3500,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
each(quests, (v, key) => {
|
||||
|
||||
@@ -85,6 +85,7 @@ let specialMounts = {
|
||||
'MagicalBee-Base': 'magicalBee',
|
||||
'Turkey-Gilded': 'gildedTurkey',
|
||||
'Jackalope-RoyalPurple': 'royalPurpleJackalope',
|
||||
'Aether-Invisible': 'invisibleAether',
|
||||
};
|
||||
|
||||
each(specialPets, (translationString, key) => {
|
||||
|
||||
Reference in New Issue
Block a user