Merge pull request #376 from HabitRPG/block-subs

Block Subscriptions
This commit is contained in:
Tyler Renelle
2014-12-03 16:02:14 -07:00
37 changed files with 4860 additions and 4493 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+240 -59
View File
@@ -9793,7 +9793,7 @@ process.chdir = function (dir) {
}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],5:[function(require,module,exports){
var api, classes, diminishingReturns, events, gear, gearTypes, i18n, moment, mystery, repeat, t, _;
var api, classes, diminishingReturns, events, gear, gearTypes, i18n, moment, repeat, t, _;
_ = require('lodash');
@@ -9856,46 +9856,66 @@ events = {
}
};
mystery = {
api.mystery = {
201402: {
start: '2014-02-22',
end: '2014-02-28'
end: '2014-02-28',
text: 'Winged Messenger Set'
},
201403: {
start: '2014-03-24',
end: '2014-04-02'
end: '2014-04-02',
text: 'Forest Walker Set'
},
201404: {
start: '2014-04-24',
end: '2014-05-02'
end: '2014-05-02',
text: 'Twilight Butterfly Set'
},
201405: {
start: '2014-05-21',
end: '2014-06-02'
end: '2014-06-02',
text: 'Flame Wielder Set'
},
201406: {
start: '2014-06-23',
end: '2014-07-02'
end: '2014-07-02',
text: 'Octomage Set'
},
201407: {
start: '2014-07-23',
end: '2014-08-02'
end: '2014-08-02',
text: 'Undersea Explorer Set'
},
201408: {
start: '2014-08-23',
end: '2014-09-02'
end: '2014-09-02',
text: 'Sun Sorcerer Set'
},
201409: {
start: '2014-09-24',
end: '2014-10-02'
end: '2014-10-02',
text: 'Autumn Strider Item Set'
},
201410: {
start: '2014-10-24',
end: '2014-11-02'
end: '2014-11-02',
text: 'Winged Goblin Set'
},
201411: {
start: '2014-11-24',
end: '2014-12-02'
end: '2014-12-02',
text: 'Feast and Fun Set'
},
301404: {
start: '3014-03-24',
end: '3014-04-02',
text: 'Steampunk Standard Set'
},
301405: {
start: '3014-04-24',
end: '3014-05-02',
text: 'Steampunk Accessories Set'
},
wondercon: {
start: '2014-03-24',
@@ -9903,6 +9923,10 @@ mystery = {
}
};
_.each(api.mystery, function(v, k) {
return v.key = k;
});
gear = {
weapon: {
base: {
@@ -10401,7 +10425,13 @@ gear = {
201411: {
text: t('weaponMystery201411Text'),
notes: t('weaponMystery201411Notes'),
mystery: mystery['201411'],
mystery: '201411',
value: 0
},
301404: {
text: t('weaponMystery301404Text'),
notes: t('weaponMystery301404Notes'),
mystery: '301404',
value: 0
}
}
@@ -10804,49 +10834,55 @@ gear = {
201402: {
text: t('armorMystery201402Text'),
notes: t('armorMystery201402Notes'),
mystery: mystery['201402'],
mystery: '201402',
value: 0
},
201403: {
text: t('armorMystery201403Text'),
notes: t('armorMystery201403Notes'),
mystery: mystery['201403'],
mystery: '201403',
value: 0
},
201405: {
text: t('armorMystery201405Text'),
notes: t('armorMystery201405Notes'),
mystery: mystery['201405'],
mystery: '201405',
value: 0
},
201406: {
text: t('armorMystery201406Text'),
notes: t('armorMystery201406Notes'),
mystery: mystery['201406'],
mystery: '201406',
value: 0
},
201407: {
text: t('armorMystery201407Text'),
notes: t('armorMystery201407Notes'),
mystery: mystery['201407'],
mystery: '201407',
value: 0
},
201408: {
text: t('armorMystery201408Text'),
notes: t('armorMystery201408Notes'),
mystery: mystery['201408'],
mystery: '201408',
value: 0
},
201409: {
text: t('armorMystery201409Text'),
notes: t('armorMystery201409Notes'),
mystery: mystery['201409'],
mystery: '201409',
value: 0
},
201410: {
text: t('armorMystery201410Text'),
notes: t('armorMystery201410Notes'),
mystery: mystery['201410'],
mystery: '201410',
value: 0
},
301404: {
text: t('armorMystery301404Text'),
notes: t('armorMystery301404Notes'),
mystery: '301404',
value: 0
}
}
@@ -11249,37 +11285,49 @@ gear = {
201402: {
text: t('headMystery201402Text'),
notes: t('headMystery201402Notes'),
mystery: mystery['201402'],
mystery: '201402',
value: 0
},
201405: {
text: t('headMystery201405Text'),
notes: t('headMystery201405Notes'),
mystery: mystery['201405'],
mystery: '201405',
value: 0
},
201406: {
text: t('headMystery201406Text'),
notes: t('headMystery201406Notes'),
mystery: mystery['201406'],
mystery: '201406',
value: 0
},
201407: {
text: t('headMystery201407Text'),
notes: t('headMystery201407Notes'),
mystery: mystery['201407'],
mystery: '201407',
value: 0
},
201408: {
text: t('headMystery201408Text'),
notes: t('headMystery201408Notes'),
mystery: mystery['201408'],
mystery: '201408',
value: 0
},
201411: {
text: t('headMystery201411Text'),
notes: t('headMystery201411Notes'),
mystery: mystery['201411'],
mystery: '201411',
value: 0
},
301404: {
text: t('headMystery301404Text'),
notes: t('headMystery301404Notes'),
mystery: '301404',
value: 0
},
301405: {
text: t('headMystery301405Text'),
notes: t('headMystery301405Notes'),
mystery: '301405',
value: 0
}
}
@@ -11596,6 +11644,14 @@ gear = {
value: 70,
con: 9
}
},
mystery: {
301405: {
text: t('shieldMystery301405Text'),
notes: t('shieldMystery301405Notes'),
mystery: '301405',
value: 0
}
}
},
back: {
@@ -11610,19 +11666,19 @@ gear = {
201402: {
text: t('backMystery201402Text'),
notes: t('backMystery201402Notes'),
mystery: mystery['201402'],
mystery: '201402',
value: 0
},
201404: {
text: t('backMystery201404Text'),
notes: t('backMystery201404Notes'),
mystery: mystery['201404'],
mystery: '201404',
value: 0
},
201410: {
text: t('backMystery201410Text'),
notes: t('backMystery201410Notes'),
mystery: mystery['201410'],
mystery: '201410',
value: 0
}
},
@@ -11631,13 +11687,13 @@ gear = {
text: t('backSpecialWonderconRedText'),
notes: t('backSpecialWonderconRedNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
},
wondercon_black: {
text: t('backSpecialWonderconBlackText'),
notes: t('backSpecialWonderconBlackNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
}
}
},
@@ -11654,19 +11710,19 @@ gear = {
text: t('bodySpecialWonderconRedText'),
notes: t('bodySpecialWonderconRedNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
},
wondercon_gold: {
text: t('bodySpecialWonderconGoldText'),
notes: t('bodySpecialWonderconGoldNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
},
wondercon_black: {
text: t('bodySpecialWonderconBlackText'),
notes: t('bodySpecialWonderconBlackNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
},
summerHealer: {
event: events.summer,
@@ -11727,19 +11783,25 @@ gear = {
201403: {
text: t('headAccessoryMystery201403Text'),
notes: t('headAccessoryMystery201403Notes'),
mystery: mystery['201403'],
mystery: '201403',
value: 0
},
201404: {
text: t('headAccessoryMystery201404Text'),
notes: t('headAccessoryMystery201404Notes'),
mystery: mystery['201404'],
mystery: '201404',
value: 0
},
201409: {
text: t('headAccessoryMystery201409Text'),
notes: t('headAccessoryMystery201409Notes'),
mystery: mystery['201409'],
mystery: '201409',
value: 0
},
301405: {
text: t('headAccessoryMystery301405Text'),
notes: t('headAccessoryMystery301405Notes'),
mystery: '301405',
value: 0
}
}
@@ -11758,13 +11820,13 @@ gear = {
text: t('eyewearSpecialWonderconRedText'),
notes: t('eyewearSpecialWonderconRedNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
},
wondercon_black: {
text: t('eyewearSpecialWonderconBlackText'),
notes: t('eyewearSpecialWonderconBlackNotes'),
value: 0,
mystery: mystery.wondercon
mystery: 'wondercon'
},
summerRogue: {
event: events.summer,
@@ -11780,6 +11842,20 @@ gear = {
notes: t('eyewearSpecialSummerWarriorNotes'),
value: 20
}
},
mystery: {
301404: {
text: t('eyewearMystery301404Text'),
notes: t('eyewearMystery301404Notes'),
mystery: '301404',
value: 0
},
301405: {
text: t('eyewearMystery301405Text'),
notes: t('eyewearMystery301405Notes'),
mystery: '301405',
value: 0
}
}
}
};
@@ -11829,6 +11905,29 @@ _.each(gearTypes, function(type) {
});
/*
Time Traveler Store, mystery sets need their items mapped in
*/
_.each(api.mystery, function(v, k) {
return v.items = _.where(api.gear.flat, {
mystery: k
});
});
api.timeTravelerStore = function(owned) {
var ownedKeys;
ownedKeys = _.keys((typeof owned.toObject === "function" ? owned.toObject() : void 0) || owned);
return _.reduce(api.mystery, function(m, v, k) {
if (k === 'wondercon' || ~ownedKeys.indexOf(v.items[0].key)) {
return m;
}
m[k] = v;
return m;
}, {});
};
/*
---------------------------------------------------------------
Potion
@@ -13621,6 +13720,43 @@ api.backgrounds = {
text: t('backgroundStarrySkiesText'),
notes: t('backgroundStarrySkiesNotes')
}
},
backgrounds122014: {
iceberg: {
text: t('backgroundIcebergText'),
notes: t('backgroundIcebergNotes')
},
twinkly_lights: {
text: t('backgroundTwinklyLightsText'),
notes: t('backgroundTwinklyLightsNotes')
},
south_pole: {
text: t('backgroundSouthPoleText'),
notes: t('backgroundSouthPoleNotes')
}
}
};
api.subscriptionBlocks = {
"1": {
months: 1,
price: 5,
key: 'basic_earned'
},
"3": {
months: 3,
price: 15,
key: 'basic_3mo'
},
"6": {
months: 6,
price: 30,
key: 'basic_6mo'
},
"12": {
months: 12,
price: 48,
key: 'basic_12mo'
}
};
@@ -14926,11 +15062,12 @@ api.wrap = function(user, main) {
return typeof cb === "function" ? cb(null, _.pick(user, $w('items stats'))) : void 0;
},
purchase: function(req, cb, ga) {
var convCap, convRate, item, key, type, _ref, _ref1, _ref2, _ref3;
var convCap, convRate, item, key, type, _ref, _ref1, _ref2;
_ref = req.params, type = _ref.type, key = _ref.key;
if (type === 'gems' && key === 'gem') {
_ref1 = api.planGemLimits, convRate = _ref1.convRate, convCap = _ref1.convCap;
if (!((_ref2 = user.purchased) != null ? (_ref3 = _ref2.plan) != null ? _ref3.planId : void 0 : void 0)) {
convRate = api.planGemLimits.convRate;
convCap = api.planGemLimits + user.purchased.plan.consecutive.gemCapExtra;
if (!((_ref1 = user.purchased) != null ? (_ref2 = _ref1.plan) != null ? _ref2.planId : void 0 : void 0)) {
return typeof cb === "function" ? cb({
code: 401,
message: "Must subscribe to purchase gems with GP"
@@ -15073,6 +15210,33 @@ api.wrap = function(user, main) {
message: message
}, _.pick(user, $w('items achievements stats'))) : void 0;
},
buyMysterySet: function(req, cb) {
var mysterySet, _ref;
if (!(user.purchased.plan.consecutive.trinkets > 0)) {
return typeof cb === "function" ? cb({
code: 401,
message: "You don't have enough Mystic Hourglasses"
}) : void 0;
}
mysterySet = (_ref = content.timeTravelerStore(user.items.gear.owned)) != null ? _ref[req.params.key] : void 0;
if ((typeof window !== "undefined" && window !== null ? window.confirm : void 0) != null) {
if (!window.confirm("Buy this full set of items for 1 Mystic Hourglass?")) {
return;
}
}
if (!mysterySet) {
return typeof cb === "function" ? cb({
code: 404,
message: "Mystery set not found, or set already owned"
}) : void 0;
}
_.each(mysterySet.items, function(i) {
return user.items.gear.owned[i.key] = true;
});
console.log(user.items.gear.owned);
user.purchased.plan.consecutive.trinkets--;
return typeof cb === "function" ? cb(null, _.pick(user, $w('items purchased.plan.consecutive'))) : void 0;
},
sell: function(req, cb) {
var key, type, _ref;
_ref = req.params, key = _ref.key, type = _ref.type;
@@ -15822,7 +15986,7 @@ api.wrap = function(user, main) {
{user}
*/
cron: function(options) {
var clearBuffs, daysMissed, expTally, lvl, lvlDiv2, now, perfect, plan, progress, todoTally, _base, _base1, _base2, _base3, _progress, _ref, _ref1, _ref2, _ref3, _ref4;
var clearBuffs, daysMissed, expTally, lvl, lvlDiv2, now, perfect, plan, progress, todoTally, _base, _base1, _base2, _base3, _progress, _ref, _ref1, _ref2;
if (options == null) {
options = {};
}
@@ -15838,12 +16002,6 @@ api.wrap = function(user, main) {
if (user.items.lastDrop.count > 0) {
user.items.lastDrop.count = 0;
}
if ((_ref = user.purchased) != null ? (_ref1 = _ref.plan) != null ? _ref1.customerId : void 0 : void 0) {
if (moment(user.purchased.plan.dateUpdated).format('MMYYYY') !== moment().format('MMYYYY')) {
user.purchased.plan.gemsBought = 0;
user.purchased.plan.dateUpdated = new Date();
}
}
perfect = true;
clearBuffs = {
str: 0,
@@ -15942,7 +16100,7 @@ api.wrap = function(user, main) {
date: now,
value: expTally
});
if (!((_ref2 = user.purchased) != null ? (_ref3 = _ref2.plan) != null ? _ref3.customerId : void 0 : void 0)) {
if (!((_ref = user.purchased) != null ? (_ref1 = _ref.plan) != null ? _ref1.customerId : void 0 : void 0)) {
user.fns.preenUserHistory();
if (typeof user.markModified === "function") {
user.markModified('history');
@@ -15963,14 +16121,37 @@ api.wrap = function(user, main) {
if (user.stats.mp > user._statsComputed.maxMP) {
user.stats.mp = user._statsComputed.maxMP;
}
plan = (_ref4 = user.purchased) != null ? _ref4.plan : void 0;
if (plan && plan.customerId && plan.dateTerminated && moment(plan.dateTerminated).isBefore(+(new Date))) {
_.merge(user.purchased.plan, {
planId: null,
customerId: null,
paymentMethod: null
});
user.markModified('purchased.plan');
plan = (_ref2 = user.purchased) != null ? _ref2.plan : void 0;
if (plan != null ? plan.customerId : void 0) {
if (moment(plan.dateUpdated).format('MMYYYY') !== moment().format('MMYYYY')) {
plan.gemsBought = 0;
plan.dateUpdated = new Date();
plan.consecutive.count++;
if (plan.consecutive.offset > 0) {
plan.consecutive.offset--;
} else if (plan.consecutive.count % 3 === 0) {
plan.consecutive.trinkets++;
plan.consecutive.gemCapExtra += 5;
if (plan.consecutive.gemCapExtra > 25) {
plan.consecutive.gemCapExtra = 25;
}
}
}
if (plan.dateTerminated && moment(plan.dateTerminated).isBefore(+(new Date))) {
_.merge(plan, {
planId: null,
customerId: null,
paymentMethod: null
});
_.merge(plan.consecutive, {
count: 0,
offset: 0,
gemCapExtra: 0
});
if (typeof user.markModified === "function") {
user.markModified('purchased.plan');
}
}
}
progress = user.party.quest.progress;
_progress = _.cloneDeep(progress);
+93 -57
View File
@@ -1464,25 +1464,25 @@
}
.hair_mustache_1_porange {
background-image: url(spritesmith0.png);
background-position: -706px -296px;
background-position: -637px -1138px;
width: 90px;
height: 90px;
}
.customize-option.hair_mustache_1_porange {
background-image: url(spritesmith0.png);
background-position: -731px -311px;
background-position: -662px -1153px;
width: 60px;
height: 60px;
}
.hair_mustache_1_ppink {
background-image: url(spritesmith0.png);
background-position: -728px -1138px;
background-position: -706px -296px;
width: 90px;
height: 90px;
}
.customize-option.hair_mustache_1_ppink {
background-image: url(spritesmith0.png);
background-position: -753px -1153px;
background-position: -731px -311px;
width: 60px;
height: 60px;
}
@@ -2892,323 +2892,359 @@
}
.hair_bangs_3_pyellow {
background-image: url(spritesmith0.png);
background-position: -637px -1138px;
background-position: -546px -1502px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_pyellow {
background-image: url(spritesmith0.png);
background-position: -662px -1153px;
background-position: -571px -1517px;
width: 60px;
height: 60px;
}
.hair_bangs_3_rainbow {
background-image: url(spritesmith0.png);
background-position: -91px -592px;
background-position: -637px -1502px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_rainbow {
background-image: url(spritesmith0.png);
background-position: -116px -607px;
background-position: -662px -1517px;
width: 60px;
height: 60px;
}
.hair_bangs_3_red {
background-image: url(spritesmith0.png);
background-position: 0px -592px;
background-position: -728px -1502px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_red {
background-image: url(spritesmith0.png);
background-position: -25px -607px;
background-position: -753px -1517px;
width: 60px;
height: 60px;
}
.hair_bangs_3_white {
background-image: url(spritesmith0.png);
background-position: -565px -444px;
background-position: -728px -1138px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_white {
background-image: url(spritesmith0.png);
background-position: -590px -459px;
background-position: -753px -1153px;
width: 60px;
height: 60px;
}
.hair_bangs_3_winternight {
background-image: url(spritesmith0.png);
background-position: -706px -478px;
background-position: -91px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_winternight {
background-image: url(spritesmith0.png);
background-position: -731px -493px;
background-position: -116px -607px;
width: 60px;
height: 60px;
}
.hair_bangs_3_yellow {
background-image: url(spritesmith0.png);
background-position: -706px -387px;
background-position: 0px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_yellow {
background-image: url(spritesmith0.png);
background-position: -731px -402px;
background-position: -25px -607px;
width: 60px;
height: 60px;
}
.hair_bangs_3_zombie {
background-image: url(spritesmith0.png);
background-position: -848px -364px;
background-position: -565px -444px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_zombie {
background-image: url(spritesmith0.png);
background-position: -873px -379px;
background-position: -590px -459px;
width: 60px;
height: 60px;
}
.hair_base_1_TRUred {
background-image: url(spritesmith0.png);
background-position: -848px -273px;
background-position: -706px -478px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_TRUred {
background-image: url(spritesmith0.png);
background-position: -873px -288px;
background-position: -731px -493px;
width: 60px;
height: 60px;
}
.hair_base_1_black {
background-image: url(spritesmith0.png);
background-position: -848px -182px;
background-position: -706px -387px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_black {
background-image: url(spritesmith0.png);
background-position: -873px -197px;
background-position: -731px -402px;
width: 60px;
height: 60px;
}
.hair_base_1_blond {
background-image: url(spritesmith0.png);
background-position: -848px -91px;
background-position: -848px -364px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_blond {
background-image: url(spritesmith0.png);
background-position: -873px -106px;
background-position: -873px -379px;
width: 60px;
height: 60px;
}
.hair_base_1_blue {
background-image: url(spritesmith0.png);
background-position: -848px 0px;
background-position: -848px -273px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_blue {
background-image: url(spritesmith0.png);
background-position: -873px -15px;
background-position: -873px -288px;
width: 60px;
height: 60px;
}
.hair_base_1_brown {
background-image: url(spritesmith0.png);
background-position: -728px -683px;
background-position: -848px -182px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_brown {
background-image: url(spritesmith0.png);
background-position: -753px -698px;
background-position: -873px -197px;
width: 60px;
height: 60px;
}
.hair_base_1_candycane {
background-image: url(spritesmith0.png);
background-position: -637px -683px;
background-position: -848px -91px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_candycane {
background-image: url(spritesmith0.png);
background-position: -662px -698px;
background-position: -873px -106px;
width: 60px;
height: 60px;
}
.hair_base_1_candycorn {
background-image: url(spritesmith0.png);
background-position: -546px -683px;
background-position: -848px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_candycorn {
background-image: url(spritesmith0.png);
background-position: -571px -698px;
background-position: -873px -15px;
width: 60px;
height: 60px;
}
.hair_base_1_frost {
background-image: url(spritesmith0.png);
background-position: -455px -683px;
background-position: -728px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_frost {
background-image: url(spritesmith0.png);
background-position: -480px -698px;
background-position: -753px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_ghostwhite {
background-image: url(spritesmith0.png);
background-position: -364px -683px;
background-position: -637px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_ghostwhite {
background-image: url(spritesmith0.png);
background-position: -389px -698px;
background-position: -662px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_green {
background-image: url(spritesmith0.png);
background-position: -273px -683px;
background-position: -546px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_green {
background-image: url(spritesmith0.png);
background-position: -298px -698px;
background-position: -571px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_halloween {
background-image: url(spritesmith0.png);
background-position: -182px -683px;
background-position: -455px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_halloween {
background-image: url(spritesmith0.png);
background-position: -207px -698px;
background-position: -480px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_holly {
background-image: url(spritesmith0.png);
background-position: -91px -683px;
background-position: -364px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_holly {
background-image: url(spritesmith0.png);
background-position: -116px -698px;
background-position: -389px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_midnight {
background-image: url(spritesmith0.png);
background-position: 0px -683px;
background-position: -273px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_midnight {
background-image: url(spritesmith0.png);
background-position: -25px -698px;
background-position: -298px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_pblue {
background-image: url(spritesmith0.png);
background-position: -728px -592px;
background-position: -182px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_pblue {
background-image: url(spritesmith0.png);
background-position: -753px -607px;
background-position: -207px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_pgreen {
background-image: url(spritesmith0.png);
background-position: -637px -592px;
background-position: -91px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_pgreen {
background-image: url(spritesmith0.png);
background-position: -662px -607px;
background-position: -116px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_porange {
background-image: url(spritesmith0.png);
background-position: -546px -592px;
background-position: 0px -683px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_porange {
background-image: url(spritesmith0.png);
background-position: -571px -607px;
background-position: -25px -698px;
width: 60px;
height: 60px;
}
.hair_base_1_ppink {
background-image: url(spritesmith0.png);
background-position: -455px -592px;
background-position: -728px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_ppink {
background-image: url(spritesmith0.png);
background-position: -480px -607px;
background-position: -753px -607px;
width: 60px;
height: 60px;
}
.hair_base_1_ppurple {
background-image: url(spritesmith0.png);
background-position: -364px -592px;
background-position: -637px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_ppurple {
background-image: url(spritesmith0.png);
background-position: -389px -607px;
background-position: -662px -607px;
width: 60px;
height: 60px;
}
.hair_base_1_pumpkin {
background-image: url(spritesmith0.png);
background-position: -273px -592px;
background-position: -546px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_pumpkin {
background-image: url(spritesmith0.png);
background-position: -298px -607px;
background-position: -571px -607px;
width: 60px;
height: 60px;
}
.hair_base_1_purple {
background-image: url(spritesmith0.png);
background-position: -182px -592px;
background-position: -455px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_purple {
background-image: url(spritesmith0.png);
background-position: -480px -607px;
width: 60px;
height: 60px;
}
.hair_base_1_pyellow {
background-image: url(spritesmith0.png);
background-position: -364px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_pyellow {
background-image: url(spritesmith0.png);
background-position: -389px -607px;
width: 60px;
height: 60px;
}
.hair_base_1_rainbow {
background-image: url(spritesmith0.png);
background-position: -273px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_rainbow {
background-image: url(spritesmith0.png);
background-position: -298px -607px;
width: 60px;
height: 60px;
}
.hair_base_1_red {
background-image: url(spritesmith0.png);
background-position: -182px -592px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_1_red {
background-image: url(spritesmith0.png);
background-position: -207px -607px;
width: 60px;
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 150 KiB

+2051 -2051
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 87 KiB

+482 -458
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 104 KiB

+1032 -1014
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

After

Width:  |  Height:  |  Size: 272 KiB

+332 -308
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 210 KiB

+507 -489
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

+19 -3
View File
@@ -111,6 +111,8 @@
"weaponMystery201411Text": "Pitchfork of Feasting",
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
"weaponMystery301404Text": "Steampunk Cane",
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
"armorBase0Text": "Plain Clothing",
"armorBase0Notes": "Ordinary clothing. Confers no benefit.",
@@ -223,6 +225,8 @@
"armorMystery201409Notes": "A leaf-covered vest that camouflages the wearer. Confers no benefit. September 2014 Subscriber Item.",
"armorMystery201410Text": "Goblin Gear",
"armorMystery201410Notes": "Scaly, slimy, and strong! Confers no benefit. October 2014 Subscriber Item.",
"armorMystery301404Text": "Steampunk Suit",
"armorMystery301404Notes": "Dapper and dashing, wot! February 3015 Subscriber Item. Confers no benefit.",
"headBase0Text": "No Helm",
"headBase0Notes": "No headgear.",
@@ -321,7 +325,6 @@
"headMystery201402Text": "Winged Helm",
"headMystery201402Notes": "This winged circlet imbues the wearer with the speed of the wind! Confers no benefit. February 2014 Subscriber Item.",
"headMystery201405Text": "Flame of Mind",
"headMystery201405Notes": "Burn away the procrastination! Confers no benefit. May 2014 Subscriber Item.",
"headMystery201406Text": "Crown of Tentacles",
@@ -332,6 +335,10 @@
"headMystery201408Notes": "This blazing crown gives its wearer great strength of will. Confers no benefit. August 2014 Subscriber Item.",
"headMystery201411Text": "Steel Helm of Sporting",
"headMystery201411Notes": "This is the traditional helmet worn in the beloved Habitican sport of Balance Ball, which consists of covering yourself with heavy protective gear and then committing to a healthy work-life balance..... WHILE PURSUED BY HIPPOGRIFFS. Confers no benefit. November 2014 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
"headMystery301405Text": "Basic Top Hat",
"headMystery301405Notes": "A basic top hat, just begging to be paired with some fancy head accessories. May 3015 Subscriber Item. Confers no benefit.",
"shieldBase0Text": "No Off-Hand Equipment",
"shieldBase0Notes": "No shield or second weapon.",
@@ -392,6 +399,9 @@
"shieldSpecialFallHealerText": "Jeweled Shield",
"shieldSpecialFallHealerNotes": "This glittery shield was found in an ancient tomb. Increases Constitution by <%= con %>. Limited Edition 2014 Autumn Gear.",
"shieldMystery301405Text": "Clock Shield",
"shieldMystery301405Notes": "Time is on your side with this towering clock shield! June 3015 Subscriber Item. Confers no benefit.",
"backBase0Text": "No Back Accessory",
"backBase0Notes": "No Back Accessory.",
@@ -438,10 +448,11 @@
"headAccessoryMystery201403Notes": "These antlers shimmer with moss and lichen. Confers no benefit. March 2014 Subscriber Item.",
"headAccessoryMystery201404Text": "Twilight Butterfly Antennae",
"headAccessoryMystery201404Notes": "These antennae help the wearer sense dangerous distractions!",
"headAccessoryMystery201404Notes": "These antennae help the wearer sense dangerous distractions! Confers no benefit. April 2014 Subscriber Item.",
"headAccessoryMystery201409Text": "Autumn Antlers",
"headAccessoryMystery201409Notes": "These powerful antlers change colors with the leaves. Confers no benefit. September 2014 Subscriber Item.",
"headAccessoryMystery301405Text": "Headwear Goggles",
"headAccessoryMystery301405Notes": "\"Goggles are for your eyes,\" they said. \"Nobody wants goggles that you can only wear on your head,\" they said. Hah! You sure showed them! August 3015 Subscriber Item. Confers no benefit.",
"eyewearBase0Text": "No Eyewear",
"eyewearBase0Notes": "No Eyewear.",
@@ -454,5 +465,10 @@
"eyewearSpecialWonderconRedText": "Mighty Mask",
"eyewearSpecialWonderconRedNotes": "What a powerful face accessory! Confers no benefit. Special Edition Convention Item.",
"eyewearSpecialWonderconBlackText": "Sneaky Mask",
"eyewearSpecialWonderconBlackNotes": "Your motives are definitely legitimate. Confers no benefit. Special Edition Convention Item."
"eyewearSpecialWonderconBlackNotes": "Your motives are definitely legitimate. Confers no benefit. Special Edition Convention Item.",
"eyewearMystery301404Text": "Eyewear Goggles",
"eyewearMystery301404Notes": "No eyewear could be fancier than a pair of goggles - except, perhaps, for a monocle. April 3015 Subscriber Item. Confers no benefit.",
"eyewearMystery301405Text": "Monocle",
"eyewearMystery301405Notes": "No eyewear could be fancier than a monocle - except, perhaps, for a pair of goggles. July 3015 Subscriber Item. Confers no benefit."
}
+69 -39
View File
@@ -27,18 +27,21 @@ events =
gaymerx: {start:'2014-07-02',end:'2014-08-01'}
fall: {start:'2014-09-21',end:'2014-11-01'}
mystery =
201402: {start:'2014-02-22',end:'2014-02-28'}
201403: {start:'2014-03-24',end:'2014-04-02'}
201404: {start:'2014-04-24',end:'2014-05-02'}
201405: {start:'2014-05-21',end:'2014-06-02'}
201406: {start:'2014-06-23',end:'2014-07-02'}
201407: {start:'2014-07-23',end:'2014-08-02'}
201408: {start:'2014-08-23',end:'2014-09-02'}
201409: {start:'2014-09-24',end:'2014-10-02'}
201410: {start:'2014-10-24',end:'2014-11-02'}
201411: {start:'2014-11-24',end:'2014-12-02'}
api.mystery =
201402: {start:'2014-02-22',end:'2014-02-28', text:'Winged Messenger Set'}
201403: {start:'2014-03-24',end:'2014-04-02', text:'Forest Walker Set'}
201404: {start:'2014-04-24',end:'2014-05-02', text:'Twilight Butterfly Set'}
201405: {start:'2014-05-21',end:'2014-06-02', text:'Flame Wielder Set'}
201406: {start:'2014-06-23',end:'2014-07-02', text:'Octomage Set'}
201407: {start:'2014-07-23',end:'2014-08-02', text:'Undersea Explorer Set'}
201408: {start:'2014-08-23',end:'2014-09-02', text:'Sun Sorcerer Set'}
201409: {start:'2014-09-24',end:'2014-10-02', text:'Autumn Strider Item Set'}
201410: {start:'2014-10-24',end:'2014-11-02', text:'Winged Goblin Set'}
201411: {start:'2014-11-24',end:'2014-12-02', text:'Feast and Fun Set'}
301404: {start:'3014-03-24',end:'3014-04-02', text:'Steampunk Standard Set'}
301405: {start:'3014-04-24',end:'3014-05-02', text:'Steampunk Accessories Set'}
wondercon: {start:'2014-03-24',end:'2014-04-01'} # not really, but the mechanic works
_.each api.mystery, (v,k)->v.key = k
gear =
weapon:
@@ -112,7 +115,8 @@ gear =
fallMage: event: events.fall, specialClass: 'wizard', twoHanded:true, text: t('weaponSpecialFallMageText'), notes: t('weaponSpecialFallMageNotes', {int: 15, per: 7}), value: 160, int:15, per:7
fallHealer: event: events.fall, specialClass: 'healer', text: t('weaponSpecialFallHealerText'), notes: t('weaponSpecialFallHealerNotes', {int: 9}), value: 90, int: 9
mystery:
201411: text: t('weaponMystery201411Text'), notes: t('weaponMystery201411Notes'), mystery:mystery['201411'], value: 0
201411: text: t('weaponMystery201411Text'), notes: t('weaponMystery201411Notes'), mystery:'201411', value: 0
301404: text: t('weaponMystery301404Text'), notes: t('weaponMystery301404Notes'), mystery:'301404', value: 0
armor:
base:
@@ -173,14 +177,15 @@ gear =
# Other
gaymerx: event: events.gaymerx, text: t('armorSpecialGaymerxText'), notes: t('armorSpecialGaymerxNotes'), value: 0
mystery:
201402: text: t('armorMystery201402Text'), notes: t('armorMystery201402Notes'), mystery:mystery['201402'], value: 0
201403: text: t('armorMystery201403Text'), notes: t('armorMystery201403Notes'), mystery:mystery['201403'], value: 0
201405: text: t('armorMystery201405Text'), notes: t('armorMystery201405Notes'), mystery:mystery['201405'], value: 0
201406: text: t('armorMystery201406Text'), notes: t('armorMystery201406Notes'), mystery:mystery['201406'], value: 0
201407: text: t('armorMystery201407Text'), notes: t('armorMystery201407Notes'), mystery:mystery['201407'], value: 0
201408: text: t('armorMystery201408Text'), notes: t('armorMystery201408Notes'), mystery:mystery['201408'], value: 0
201409: text: t('armorMystery201409Text'), notes: t('armorMystery201409Notes'), mystery:mystery['201409'], value: 0
201410: text: t('armorMystery201410Text'), notes: t('armorMystery201410Notes'), mystery:mystery['201410'], value: 0
201402: text: t('armorMystery201402Text'), notes: t('armorMystery201402Notes'), mystery:'201402', value: 0
201403: text: t('armorMystery201403Text'), notes: t('armorMystery201403Notes'), mystery:'201403', value: 0
201405: text: t('armorMystery201405Text'), notes: t('armorMystery201405Notes'), mystery:'201405', value: 0
201406: text: t('armorMystery201406Text'), notes: t('armorMystery201406Notes'), mystery:'201406', value: 0
201407: text: t('armorMystery201407Text'), notes: t('armorMystery201407Notes'), mystery:'201407', value: 0
201408: text: t('armorMystery201408Text'), notes: t('armorMystery201408Notes'), mystery:'201408', value: 0
201409: text: t('armorMystery201409Text'), notes: t('armorMystery201409Notes'), mystery:'201409', value: 0
201410: text: t('armorMystery201410Text'), notes: t('armorMystery201410Notes'), mystery:'201410', value: 0
301404: text: t('armorMystery301404Text'), notes: t('armorMystery301404Notes'), mystery:'301404', value: 0
head:
base:
@@ -241,12 +246,14 @@ gear =
# Other
gaymerx: event: events.gaymerx, text: t('headSpecialGaymerxText'), notes: t('headSpecialGaymerxNotes'), value: 0
mystery:
201402: text: t('headMystery201402Text'), notes: t('headMystery201402Notes'), mystery:mystery['201402'], value: 0
201405: text: t('headMystery201405Text'), notes: t('headMystery201405Notes'), mystery:mystery['201405'], value: 0
201406: text: t('headMystery201406Text'), notes: t('headMystery201406Notes'), mystery:mystery['201406'], value: 0
201407: text: t('headMystery201407Text'), notes: t('headMystery201407Notes'), mystery:mystery['201407'], value: 0
201408: text: t('headMystery201408Text'), notes: t('headMystery201408Notes'), mystery:mystery['201408'], value: 0
201411: text: t('headMystery201411Text'), notes: t('headMystery201411Notes'), mystery:mystery['201411'], value: 0
201402: text: t('headMystery201402Text'), notes: t('headMystery201402Notes'), mystery:'201402', value: 0
201405: text: t('headMystery201405Text'), notes: t('headMystery201405Notes'), mystery:'201405', value: 0
201406: text: t('headMystery201406Text'), notes: t('headMystery201406Notes'), mystery:'201406', value: 0
201407: text: t('headMystery201407Text'), notes: t('headMystery201407Notes'), mystery:'201407', value: 0
201408: text: t('headMystery201408Text'), notes: t('headMystery201408Notes'), mystery:'201408', value: 0
201411: text: t('headMystery201411Text'), notes: t('headMystery201411Notes'), mystery:'201411', value: 0
301404: text: t('headMystery301404Text'), notes: t('headMystery301404Notes'), mystery:'301404', value: 0
301405: text: t('headMystery301405Text'), notes: t('headMystery301405Notes'), mystery:'301405', value: 0
shield:
base:
@@ -296,25 +303,27 @@ gear =
fallRogue: event: events.fall, specialClass: 'rogue', text: t('shieldSpecialFallRogueText'), notes: t('shieldSpecialFallRogueNotes', {str: 8}), value: 80, str: 8
fallWarrior: event: events.fall, specialClass: 'warrior', text: t('shieldSpecialFallWarriorText'), notes: t('shieldSpecialFallWarriorNotes', {con: 7}), value: 70, con: 7
fallHealer: event: events.fall, specialClass: 'healer', text: t('shieldSpecialFallHealerText'), notes: t('shieldSpecialFallHealerNotes', {con: 9}), value: 70, con: 9
mystery:
301405: text: t('shieldMystery301405Text'), notes: t('shieldMystery301405Notes'), mystery:'301405', value: 0
back:
base:
0: text: t('backBase0Text'), notes: t('backBase0Notes'), value:0
mystery:
201402: text: t('backMystery201402Text'), notes: t('backMystery201402Notes'), mystery:mystery['201402'], value: 0
201404: text: t('backMystery201404Text'), notes: t('backMystery201404Notes'), mystery:mystery['201404'], value: 0
201410: text: t('backMystery201410Text'), notes: t('backMystery201410Notes'), mystery:mystery['201410'], value: 0
201402: text: t('backMystery201402Text'), notes: t('backMystery201402Notes'), mystery:'201402', value: 0
201404: text: t('backMystery201404Text'), notes: t('backMystery201404Notes'), mystery:'201404', value: 0
201410: text: t('backMystery201410Text'), notes: t('backMystery201410Notes'), mystery:'201410', value: 0
special:
wondercon_red: text: t('backSpecialWonderconRedText'), notes: t('backSpecialWonderconRedNotes'), value: 0, mystery:mystery.wondercon
wondercon_black: text: t('backSpecialWonderconBlackText'), notes: t('backSpecialWonderconBlackNotes'), value: 0, mystery:mystery.wondercon
wondercon_red: text: t('backSpecialWonderconRedText'), notes: t('backSpecialWonderconRedNotes'), value: 0, mystery:'wondercon'
wondercon_black: text: t('backSpecialWonderconBlackText'), notes: t('backSpecialWonderconBlackNotes'), value: 0, mystery:'wondercon'
body:
base:
0: text: t('bodyBase0Text'), notes:t('bodyBase0Notes'), value:0
special:
wondercon_red: text: t('bodySpecialWonderconRedText'), notes: t('bodySpecialWonderconRedNotes'), value: 0, mystery:mystery.wondercon
wondercon_gold: text: t('bodySpecialWonderconGoldText'), notes: t('bodySpecialWonderconGoldNotes'), value: 0, mystery:mystery.wondercon
wondercon_black: text: t('bodySpecialWonderconBlackText'), notes: t('bodySpecialWonderconBlackNotes'), value: 0, mystery:mystery.wondercon
wondercon_red: text: t('bodySpecialWonderconRedText'), notes: t('bodySpecialWonderconRedNotes'), value: 0, mystery:'wondercon'
wondercon_gold: text: t('bodySpecialWonderconGoldText'), notes: t('bodySpecialWonderconGoldNotes'), value: 0, mystery:'wondercon'
wondercon_black: text: t('bodySpecialWonderconBlackText'), notes: t('bodySpecialWonderconBlackNotes'), value: 0, mystery:'wondercon'
# Summer
summerHealer: event: events.summer, specialClass: 'healer', text: t('bodySpecialSummerHealerText'), notes: t('bodySpecialSummerHealerNotes'), value: 20
summerMage: event: events.summer, specialClass: 'wizard', text: t('bodySpecialSummerMageText'), notes: t('bodySpecialSummerMageNotes'), value: 20
@@ -330,19 +339,23 @@ gear =
springHealer: event: events.spring, specialClass: 'healer', text: t('headAccessorySpecialSpringHealerText'), notes: t('headAccessorySpecialSpringHealerNotes'), value: 20
mystery:
201403: text: t('headAccessoryMystery201403Text'), notes: t('headAccessoryMystery201403Notes'), mystery:mystery['201403'], value: 0
201404: text: t('headAccessoryMystery201404Text'), notes: t('headAccessoryMystery201404Notes'), mystery:mystery['201404'], value: 0
201409: text: t('headAccessoryMystery201409Text'), notes: t('headAccessoryMystery201409Notes'), mystery:mystery['201409'], value: 0
201403: text: t('headAccessoryMystery201403Text'), notes: t('headAccessoryMystery201403Notes'), mystery:'201403', value: 0
201404: text: t('headAccessoryMystery201404Text'), notes: t('headAccessoryMystery201404Notes'), mystery:'201404', value: 0
201409: text: t('headAccessoryMystery201409Text'), notes: t('headAccessoryMystery201409Notes'), mystery:'201409', value: 0
301405: text: t('headAccessoryMystery301405Text'), notes: t('headAccessoryMystery301405Notes'), mystery:'301405', value: 0
eyewear:
base:
0: text: t('eyewearBase0Text'), notes: t('eyewearBase0Notes'), value: 0, last: true
special:
wondercon_red: text: t('eyewearSpecialWonderconRedText'), notes: t('eyewearSpecialWonderconRedNotes'), value: 0, mystery:mystery.wondercon
wondercon_black: text: t('eyewearSpecialWonderconBlackText'), notes: t('eyewearSpecialWonderconBlackNotes'), value: 0, mystery:mystery.wondercon
wondercon_red: text: t('eyewearSpecialWonderconRedText'), notes: t('eyewearSpecialWonderconRedNotes'), value: 0, mystery:'wondercon'
wondercon_black: text: t('eyewearSpecialWonderconBlackText'), notes: t('eyewearSpecialWonderconBlackNotes'), value: 0, mystery:'wondercon'
#Summer
summerRogue: event: events.summer, specialClass: 'rogue', text: t('eyewearSpecialSummerRogueText'), notes: t('eyewearSpecialSummerRogueNotes'), value: 20
summerWarrior: event: events.summer, specialClass: 'warrior', text: t('eyewearSpecialSummerWarriorText'), notes: t('eyewearSpecialSummerWarriorNotes'), value: 20
mystery:
301404: text: t('eyewearMystery301404Text'), notes: t('eyewearMystery301404Notes'), mystery:'301404', value: 0
301405: text: t('eyewearMystery301405Text'), notes: t('eyewearMystery301405Notes'), mystery:'301405', value: 0
###
The gear is exported as a tree (defined above), and a flat list (eg, {weapon_healer_1: .., shield_special_0: ...}) since
@@ -373,6 +386,17 @@ _.each gearTypes, (type) ->
api.gear.flat[key] = item
###
Time Traveler Store, mystery sets need their items mapped in
###
_.each api.mystery, (v,k)-> v.items = _.where api.gear.flat, {mystery:k}
api.timeTravelerStore = (owned) ->
ownedKeys = _.keys owned.toObject?() or owned # mongoose workaround
_.reduce api.mystery, (m,v,k)->
return m if k=='wondercon' or ~ownedKeys.indexOf(v.items[0].key) # skip wondercon and already-owned sets
m[k] = v;m
, {}
###
---------------------------------------------------------------
Potion
@@ -1371,6 +1395,12 @@ api.backgrounds =
text: t('backgroundSouthPoleText')
notes: t('backgroundSouthPoleNotes')
api.subscriptionBlocks =
"1": months:1, price:5, key: 'basic_earned'
"3": months:3, price:15, key: 'basic_3mo'
"6": months:6, price:30, key: 'basic_6mo'
"12": months:12, price:48, key: 'basic_12mo'
repeat = {m:true,t:true,w:true,th:true,f:true,s:true,su:true}
api.userDefaults =
habits: [
+34 -14
View File
@@ -694,7 +694,8 @@ api.wrap = (user, main=true) ->
{type,key} = req.params
if type is 'gems' and key is 'gem'
{convRate,convCap} = api.planGemLimits
{convRate} = api.planGemLimits
convCap = api.planGemLimits + user.purchased.plan.consecutive.gemCapExtra
return cb?({code:401,message:"Must subscribe to purchase gems with GP"},req) unless user.purchased?.plan?.planId
return cb?({code:401,message:"Not enough Gold"}) unless user.stats.gp >= convRate
return cb?({code:401,message:"You've reached the Gold=>Gem conversion cap (#{convCap}) for this month. We have this to prevent abuse / farming. The cap will reset within the first three days of next month."}) if user.purchased.plan.gemsBought >= convCap
@@ -762,6 +763,18 @@ api.wrap = (user, main=true) ->
user.stats.gp -= item.value
cb? {code:200, message}, _.pick(user,$w 'items achievements stats')
buyMysterySet: (req, cb)->
return cb?({code:401, message:"You don't have enough Mystic Hourglasses"}) unless user.purchased.plan.consecutive.trinkets>0
mysterySet = content.timeTravelerStore(user.items.gear.owned)?[req.params.key]
# console.log {mysterySet, key:req.params.key, store:content.timeTravelerStore(user.items.gear.owned), mysteryItems:content.mystery}
if window?.confirm?
return unless window.confirm("Buy this full set of items for 1 Mystic Hourglass?")
return cb?({code:404, message:"Mystery set not found, or set already owned"}) unless mysterySet
_.each mysterySet.items, (i)->user.items.gear.owned[i.key]=true
console.log(user.items.gear.owned)
user.purchased.plan.consecutive.trinkets--
cb? null, _.pick(user,$w 'items purchased.plan.consecutive')
sell: (req, cb) ->
{key, type} = req.params
return cb?({code:404,message:":type not found. Must bes in [eggs, hatchingPotions, food]"}) unless type in ['eggs','hatchingPotions', 'food']
@@ -1377,13 +1390,6 @@ api.wrap = (user, main=true) ->
if user.items.lastDrop.count > 0
user.items.lastDrop.count = 0
# Reset caps for subscribers
if user.purchased?.plan?.customerId
if moment(user.purchased.plan.dateUpdated).format('MMYYYY') != moment().format('MMYYYY')
#+moment().format('D') >= +moment(user.purchased.plan.dateCreated).format('D') and
user.purchased.plan.gemsBought = 0
user.purchased.plan.dateUpdated = new Date()
# "Perfect Day" achievement for perfect-days
perfect = true
clearBuffs = {str:0,int:0,per:0,con:0,stealth:0,streaks:false}
@@ -1466,16 +1472,30 @@ api.wrap = (user, main=true) ->
else clearBuffs
# Add 10 MP, or 10% of max MP if that'd be more. Perform this after Perfect Day for maximum benefit
user.stats.mp += _.max([10,.1 * user._statsComputed.maxMP])
user.stats.mp = user._statsComputed.maxMP if user.stats.mp > user._statsComputed.maxMP
# If user cancelled subscription, we give them until 30day's end until it terminates
# end-of-month perks for subscribers
plan = user.purchased?.plan
if plan && plan.customerId && plan.dateTerminated && moment(plan.dateTerminated).isBefore(+new Date)
_.merge user.purchased.plan, {planId:null, customerId:null, paymentMethod:null}
user.markModified 'purchased.plan'
if plan?.customerId
if moment(plan.dateUpdated).format('MMYYYY') != moment().format('MMYYYY')
plan.gemsBought = 0 # reset gem-cap
plan.dateUpdated = new Date()
# For every month, inc their "consecutive months" counter. Give perks based on consecutive blocks
# If they already got perks for those blocks (eg, 6mo subscription, subscription gifts, etc) - then dec the offset until it hits 0
# TODO use month diff instead of ++ / --?
plan.consecutive.count++
if plan.consecutive.offset > 0
plan.consecutive.offset--
else if plan.consecutive.count%3==0 # every 3 months
plan.consecutive.trinkets++
plan.consecutive.gemCapExtra+=5
plan.consecutive.gemCapExtra=25 if plan.consecutive.gemCapExtra>25 # cap it at 50 (hard 25 limit + extra 25)
# If user cancelled subscription, we give them until 30day's end until it terminates
if plan.dateTerminated && moment(plan.dateTerminated).isBefore(+new Date)
_.merge plan, {planId:null, customerId:null, paymentMethod:null}
_.merge plan.consecutive, {count:0, offset:0, gemCapExtra:0}
user.markModified? 'purchased.plan'
# After all is said and done, progress up user's effect on quest, return those values & reset the user's
progress = user.party.quest.progress; _progress = _.cloneDeep progress