Discount Bundled Quests (#8731)
* refactor(content): split quests file * feat(purchases): sell bundled quests * fix(style): address linting errors * test(bundles): shop and purchase tests * fix(test): remove only * test(bundles): check balance deduction * docs(content): comment bundle structure * fix(test): account for cumulative balance
This commit is contained in:
@@ -56,6 +56,7 @@ export const ITEM_LIST = {
|
||||
quests: { localeKey: 'quest', isEquipment: false },
|
||||
food: { localeKey: 'foodText', isEquipment: false },
|
||||
Saddle: { localeKey: 'foodSaddleText', isEquipment: false },
|
||||
bundles: { localeKey: 'discountBundle', isEquipment: false },
|
||||
};
|
||||
|
||||
export const USER_CAN_OWN_QUEST_CATEGORIES = [
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -114,6 +114,79 @@ shops.getMarketCategories = function getMarket (user, language) {
|
||||
shops.getQuestShopCategories = function getQuestShopCategories (user, language) {
|
||||
let categories = [];
|
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------
|
||||
* Quest Bundles
|
||||
* ---------------------------------------------------------------
|
||||
*
|
||||
* These appear in the Content index.js as follows:
|
||||
* {
|
||||
* bundleName: {
|
||||
* key: 'bundleName',
|
||||
* text: t('bundleNameText'),
|
||||
* notes: t('bundleNameNotes'),
|
||||
* bundleKeys: [
|
||||
* 'quest1',
|
||||
* 'quest2',
|
||||
* 'quest3',
|
||||
* ],
|
||||
* canBuy () {
|
||||
* return true when bundle is available for purchase;
|
||||
* },
|
||||
* type: 'quests',
|
||||
* value: 7,
|
||||
* },
|
||||
* secondBundleName: {
|
||||
* ...
|
||||
* },
|
||||
* }
|
||||
*
|
||||
* After filtering and mapping, the Shop will produce:
|
||||
*
|
||||
* [
|
||||
* {
|
||||
* identifier: 'bundle',
|
||||
* text: 'i18ned string for bundles category',
|
||||
* items: [
|
||||
* {
|
||||
* key: 'bundleName',
|
||||
* text: 'i18ned string for bundle title',
|
||||
* notes: 'i18ned string for bundle description',
|
||||
* value: 7,
|
||||
* currency: 'gems',
|
||||
* class: 'quest_bundle_bundleName',
|
||||
* purchaseType: 'bundles',
|
||||
* },
|
||||
* { second bundle },
|
||||
* ],
|
||||
* },
|
||||
* { main quest category 1 },
|
||||
* ...
|
||||
* ]
|
||||
*
|
||||
*/
|
||||
|
||||
let bundleCategory = {
|
||||
identifier: 'bundle',
|
||||
text: i18n.t('questBundles', language),
|
||||
};
|
||||
|
||||
bundleCategory.items = sortBy(values(content.bundles)
|
||||
.filter(bundle => bundle.type === 'quests' && bundle.canBuy())
|
||||
.map(bundle => {
|
||||
return {
|
||||
key: bundle.key,
|
||||
text: bundle.text(language),
|
||||
notes: bundle.notes(language),
|
||||
value: bundle.value,
|
||||
currency: 'gems',
|
||||
class: `quest_bundle_${bundle.key}`,
|
||||
purchaseType: 'bundles',
|
||||
};
|
||||
}));
|
||||
|
||||
categories.push(bundleCategory);
|
||||
|
||||
each(content.userCanOwnQuestCategories, type => {
|
||||
let category = {
|
||||
identifier: type,
|
||||
|
||||
@@ -2,6 +2,7 @@ import content from '../content/index';
|
||||
import i18n from '../i18n';
|
||||
import get from 'lodash/get';
|
||||
import pick from 'lodash/pick';
|
||||
import forEach from 'lodash/forEach';
|
||||
import splitWhitespace from '../libs/splitWhitespace';
|
||||
import planGemLimits from '../libs/planGemLimits';
|
||||
import {
|
||||
@@ -62,7 +63,7 @@ module.exports = function purchase (user, req = {}, analytics) {
|
||||
];
|
||||
}
|
||||
|
||||
let acceptedTypes = ['eggs', 'hatchingPotions', 'food', 'quests', 'gear'];
|
||||
let acceptedTypes = ['eggs', 'hatchingPotions', 'food', 'quests', 'gear', 'bundles'];
|
||||
if (acceptedTypes.indexOf(type) === -1) {
|
||||
throw new NotFound(i18n.t('notAccteptedType', req.language));
|
||||
}
|
||||
@@ -101,6 +102,14 @@ module.exports = function purchase (user, req = {}, analytics) {
|
||||
|
||||
if (type === 'gear') {
|
||||
user.items.gear.owned[key] = true;
|
||||
} else if (type === 'bundles') {
|
||||
let subType = item.type;
|
||||
forEach(item.bundleKeys, function addBundledItems (bundledKey) {
|
||||
if (!user.items[subType][bundledKey] || user.items[subType][key] < 0) {
|
||||
user.items[subType][bundledKey] = 0;
|
||||
}
|
||||
user.items[subType][bundledKey]++;
|
||||
});
|
||||
} else {
|
||||
if (!user.items[type][key] || user.items[type][key] < 0) {
|
||||
user.items[type][key] = 0;
|
||||
|
||||
Reference in New Issue
Block a user