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:
Sabe Jones
2017-10-13 20:32:55 -05:00
committed by GitHub
parent fac1889776
commit 6d0496fbd0
94 changed files with 9872 additions and 9326 deletions
@@ -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',
+222
View File
@@ -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) => {
+1
View File
@@ -85,6 +85,7 @@ let specialMounts = {
'MagicalBee-Base': 'magicalBee',
'Turkey-Gilded': 'gildedTurkey',
'Jackalope-RoyalPurple': 'royalPurpleJackalope',
'Aether-Invisible': 'invisibleAether',
};
each(specialPets, (translationString, key) => {
@@ -183,6 +183,7 @@ function _getBasicAchievements (user, language) {
_addSimple(result, user, {path: 'royallyLoyal', language});
_addSimple(result, user, {path: 'joinedChallenge', language});
_addSimple(result, user, {path: 'invitedFriend', language});
_addSimple(result, user, {path: 'lostMasterclasser', language});
_addSimpleWithMasterCount(result, user, {path: 'beastMaster', language});
_addSimpleWithMasterCount(result, user, {path: 'mountMaster', language});
@@ -9,6 +9,7 @@ import getOfficialPinnedItems from './getOfficialPinnedItems';
import _mapValues from 'lodash/mapValues';
function lockQuest (quest, user) {
if (quest.key === 'lostMasterclasser1') return !(user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 && user.achievements.quests.taskwoodsTerror3);
if (quest.lvl && user.stats.lvl < quest.lvl) return true;
if (quest.unlockCondition && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) {
return user.loginIncentives < quest.unlockCondition.incentiveThreshold;
@@ -132,6 +133,7 @@ module.exports = function getItemInfo (user, type, item, officialPinnedItems, la
value: item.goldValue ? item.goldValue : item.value,
currency: item.goldValue ? 'gold' : 'gems',
locked,
previous: content.quests[item.previous] ? content.quests[item.previous].text(language) : null,
unlockCondition: item.unlockCondition,
drop: item.drop,
boss: item.boss,
+4
View File
@@ -15,6 +15,10 @@ module.exports = function buyQuest (user, req = {}, analytics) {
let item = content.quests[key];
if (!item) throw new NotFound(i18n.t('questNotFound', {key}, req.language));
if (key === 'lostMasterclasser1' && !(user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 && user.achievements.quests.taskwoodsTerror3)) {
throw new NotAuthorized(i18n.t('questUnlockLostMasterclasser', req.language));
}
if (!(item.category === 'gold' && item.goldValue)) {
throw new NotAuthorized(i18n.t('questNotGoldPurchasable', {key}, req.language));
}