Merged: updating two-handed tests to use arrow functions.
This commit is contained in:
@@ -61,11 +61,11 @@ each(GEAR_TYPES, (type) => {
|
||||
let _canOwn = item.canOwn || canOwnFuncTrue;
|
||||
|
||||
item.canOwn = (user) => {
|
||||
let userOwnsItem = Boolean(user.items.gear.owned[key]);
|
||||
let userHasOwnedItem = ownsItem(key)(user);
|
||||
let eventIsCurrent = moment().isAfter(item.event.start) && moment().isBefore(item.event.end);
|
||||
let compatibleWithUserClass = item.specialClass ? user.stats.class === item.specialClass : true;
|
||||
|
||||
return _canOwn(user) && (userOwnsItem || eventIsCurrent) && compatibleWithUserClass;
|
||||
return _canOwn(user) && (userHasOwnedItem || eventIsCurrent) && compatibleWithUserClass;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ let armor = {
|
||||
str: 7,
|
||||
per: 7,
|
||||
set: 'gladiator',
|
||||
canOwn: ownsItem('armor_armoire_gladiatorArmor '),
|
||||
canOwn: ownsItem('armor_armoire_gladiatorArmor'),
|
||||
},
|
||||
rancherRobes: {
|
||||
text: t('armorArmoireRancherRobesText'),
|
||||
@@ -28,7 +28,7 @@ let armor = {
|
||||
per: 5,
|
||||
int: 5,
|
||||
set: 'rancher',
|
||||
canOwn: ownsItem('armor_armoire_rancherRobes '),
|
||||
canOwn: ownsItem('armor_armoire_rancherRobes'),
|
||||
},
|
||||
goldenToga: {
|
||||
text: t('armorArmoireGoldenTogaText'),
|
||||
@@ -37,7 +37,7 @@ let armor = {
|
||||
str: 8,
|
||||
con: 8,
|
||||
set: 'goldenToga',
|
||||
canOwn: ownsItem('armor_armoire_goldenToga '),
|
||||
canOwn: ownsItem('armor_armoire_goldenToga'),
|
||||
},
|
||||
hornedIronArmor: {
|
||||
text: t('armorArmoireHornedIronArmorText'),
|
||||
@@ -46,7 +46,7 @@ let armor = {
|
||||
con: 9,
|
||||
per: 7,
|
||||
set: 'hornedIron',
|
||||
canOwn: ownsItem('armor_armoire_hornedIronArmor '),
|
||||
canOwn: ownsItem('armor_armoire_hornedIronArmor'),
|
||||
},
|
||||
plagueDoctorOvercoat: {
|
||||
text: t('armorArmoirePlagueDoctorOvercoatText'),
|
||||
@@ -56,7 +56,7 @@ let armor = {
|
||||
str: 5,
|
||||
con: 6,
|
||||
set: 'plagueDoctor',
|
||||
canOwn: ownsItem('armor_armoire_plagueDoctorOvercoat '),
|
||||
canOwn: ownsItem('armor_armoire_plagueDoctorOvercoat'),
|
||||
},
|
||||
shepherdRobes: {
|
||||
text: t('armorArmoireShepherdRobesText'),
|
||||
@@ -65,7 +65,7 @@ let armor = {
|
||||
str: 9,
|
||||
per: 9,
|
||||
set: 'shepherd',
|
||||
canOwn: ownsItem('armor_armoire_shepherdRobes '),
|
||||
canOwn: ownsItem('armor_armoire_shepherdRobes'),
|
||||
},
|
||||
royalRobes: {
|
||||
text: t('armorArmoireRoyalRobesText'),
|
||||
@@ -75,7 +75,7 @@ let armor = {
|
||||
per: 5,
|
||||
int: 5,
|
||||
set: 'royal',
|
||||
canOwn: ownsItem('armor_armoire_royalRobes '),
|
||||
canOwn: ownsItem('armor_armoire_royalRobes'),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -85,7 +85,7 @@ let eyewear = {
|
||||
notes: t('eyewearArmoirePlagueDoctorMaskNotes'),
|
||||
value: 100,
|
||||
set: 'plagueDoctor',
|
||||
canOwn: ownsItem('eyewear_armoire_plagueDoctorMask '),
|
||||
canOwn: ownsItem('eyewear_armoire_plagueDoctorMask'),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -97,7 +97,7 @@ let head = {
|
||||
con: 7,
|
||||
per: 7,
|
||||
set: 'soothing',
|
||||
canOwn: ownsItem('head_armoire_lunarCrown '),
|
||||
canOwn: ownsItem('head_armoire_lunarCrown'),
|
||||
},
|
||||
redHairbow: {
|
||||
text: t('headArmoireRedHairbowText'),
|
||||
@@ -106,7 +106,7 @@ let head = {
|
||||
str: 5,
|
||||
int: 5,
|
||||
con: 5,
|
||||
canOwn: ownsItem('head_armoire_redHairbow '),
|
||||
canOwn: ownsItem('head_armoire_redHairbow'),
|
||||
},
|
||||
violetFloppyHat: {
|
||||
text: t('headArmoireVioletFloppyHatText'),
|
||||
@@ -115,7 +115,7 @@ let head = {
|
||||
per: 5,
|
||||
int: 5,
|
||||
con: 5,
|
||||
canOwn: ownsItem('head_armoire_violetFloppyHat '),
|
||||
canOwn: ownsItem('head_armoire_violetFloppyHat'),
|
||||
},
|
||||
gladiatorHelm: {
|
||||
text: t('headArmoireGladiatorHelmText'),
|
||||
@@ -124,7 +124,7 @@ let head = {
|
||||
per: 7,
|
||||
int: 7,
|
||||
set: 'gladiator',
|
||||
canOwn: ownsItem('head_armoire_gladiatorHelm '),
|
||||
canOwn: ownsItem('head_armoire_gladiatorHelm'),
|
||||
},
|
||||
rancherHat: {
|
||||
text: t('headArmoireRancherHatText'),
|
||||
@@ -134,7 +134,7 @@ let head = {
|
||||
per: 5,
|
||||
int: 5,
|
||||
set: 'rancher',
|
||||
canOwn: ownsItem('head_armoire_rancherHat '),
|
||||
canOwn: ownsItem('head_armoire_rancherHat'),
|
||||
},
|
||||
royalCrown: {
|
||||
text: t('headArmoireRoyalCrownText'),
|
||||
@@ -142,7 +142,7 @@ let head = {
|
||||
value: 100,
|
||||
str: 10,
|
||||
set: 'royal',
|
||||
canOwn: ownsItem('head_armoire_royalCrown '),
|
||||
canOwn: ownsItem('head_armoire_royalCrown'),
|
||||
},
|
||||
blueHairbow: {
|
||||
text: t('headArmoireBlueHairbowText'),
|
||||
@@ -151,7 +151,7 @@ let head = {
|
||||
per: 5,
|
||||
int: 5,
|
||||
con: 5,
|
||||
canOwn: ownsItem('head_armoire_blueHairbow '),
|
||||
canOwn: ownsItem('head_armoire_blueHairbow'),
|
||||
},
|
||||
goldenLaurels: {
|
||||
text: t('headArmoireGoldenLaurelsText'),
|
||||
@@ -160,7 +160,7 @@ let head = {
|
||||
per: 8,
|
||||
con: 8,
|
||||
set: 'goldenToga',
|
||||
canOwn: ownsItem('head_armoire_goldenLaurels '),
|
||||
canOwn: ownsItem('head_armoire_goldenLaurels'),
|
||||
},
|
||||
hornedIronHelm: {
|
||||
text: t('headArmoireHornedIronHelmText'),
|
||||
@@ -169,7 +169,7 @@ let head = {
|
||||
con: 9,
|
||||
str: 7,
|
||||
set: 'hornedIron',
|
||||
canOwn: ownsItem('head_armoire_hornedIronHelm '),
|
||||
canOwn: ownsItem('head_armoire_hornedIronHelm'),
|
||||
},
|
||||
yellowHairbow: {
|
||||
text: t('headArmoireYellowHairbowText'),
|
||||
@@ -178,7 +178,7 @@ let head = {
|
||||
int: 5,
|
||||
per: 5,
|
||||
str: 5,
|
||||
canOwn: ownsItem('head_armoire_yellowHairbow '),
|
||||
canOwn: ownsItem('head_armoire_yellowHairbow'),
|
||||
},
|
||||
redFloppyHat: {
|
||||
text: t('headArmoireRedFloppyHatText'),
|
||||
@@ -187,7 +187,7 @@ let head = {
|
||||
con: 6,
|
||||
int: 6,
|
||||
per: 6,
|
||||
canOwn: ownsItem('head_armoire_redFloppyHat '),
|
||||
canOwn: ownsItem('head_armoire_redFloppyHat'),
|
||||
},
|
||||
plagueDoctorHat: {
|
||||
text: t('headArmoirePlagueDoctorHatText'),
|
||||
@@ -197,7 +197,7 @@ let head = {
|
||||
str: 6,
|
||||
con: 5,
|
||||
set: 'plagueDoctor',
|
||||
canOwn: ownsItem('head_armoire_plagueDoctorHat '),
|
||||
canOwn: ownsItem('head_armoire_plagueDoctorHat'),
|
||||
},
|
||||
blackCat: {
|
||||
text: t('headArmoireBlackCatText'),
|
||||
@@ -205,7 +205,7 @@ let head = {
|
||||
value: 100,
|
||||
int: 9,
|
||||
per: 9,
|
||||
canOwn: ownsItem('head_armoire_blackCat '),
|
||||
canOwn: ownsItem('head_armoire_blackCat'),
|
||||
},
|
||||
orangeCat: {
|
||||
text: t('headArmoireOrangeCatText'),
|
||||
@@ -213,7 +213,7 @@ let head = {
|
||||
value: 100,
|
||||
con: 9,
|
||||
str: 9,
|
||||
canOwn: ownsItem('head_armoire_orangeCat '),
|
||||
canOwn: ownsItem('head_armoire_orangeCat'),
|
||||
},
|
||||
blueFloppyHat: {
|
||||
text: t('headArmoireBlueFloppyHatText'),
|
||||
@@ -222,7 +222,7 @@ let head = {
|
||||
per: 7,
|
||||
int: 7,
|
||||
con: 7,
|
||||
canOwn: ownsItem('head_armoire_blueFloppyHat '),
|
||||
canOwn: ownsItem('head_armoire_blueFloppyHat'),
|
||||
},
|
||||
shepherdHeaddress: {
|
||||
text: t('headArmoireShepherdHeaddressText'),
|
||||
@@ -230,7 +230,7 @@ let head = {
|
||||
value: 100,
|
||||
int: 9,
|
||||
set: 'shepherd',
|
||||
canOwn: ownsItem('head_armoire_shepherdHeaddress '),
|
||||
canOwn: ownsItem('head_armoire_shepherdHeaddress'),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -242,7 +242,7 @@ let shield = {
|
||||
con: 5,
|
||||
str: 5,
|
||||
set: 'gladiator',
|
||||
canOwn: ownsItem('shield_armoire_gladiatorShield '),
|
||||
canOwn: ownsItem('shield_armoire_gladiatorShield'),
|
||||
},
|
||||
midnightShield: {
|
||||
text: t('shieldArmoireMidnightShieldText'),
|
||||
@@ -250,7 +250,7 @@ let shield = {
|
||||
value: 100,
|
||||
con: 10,
|
||||
str: 2,
|
||||
canOwn: ownsItem('shield_armoire_midnightShield '),
|
||||
canOwn: ownsItem('shield_armoire_midnightShield'),
|
||||
},
|
||||
royalCane: {
|
||||
text: t('shieldArmoireRoyalCaneText'),
|
||||
@@ -260,7 +260,7 @@ let shield = {
|
||||
int: 5,
|
||||
per: 5,
|
||||
set: 'royal',
|
||||
canOwn: ownsItem('shield_armoire_royalCane '),
|
||||
canOwn: ownsItem('shield_armoire_royalCane'),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -272,7 +272,7 @@ let weapon = {
|
||||
str: 5,
|
||||
per: 5,
|
||||
con: 5,
|
||||
canOwn: ownsItem('weapon_armoire_basicCrossbow '),
|
||||
canOwn: ownsItem('weapon_armoire_basicCrossbow'),
|
||||
},
|
||||
lunarSceptre: {
|
||||
text: t('weaponArmoireLunarSceptreText'),
|
||||
@@ -281,7 +281,7 @@ let weapon = {
|
||||
con: 7,
|
||||
int: 7,
|
||||
set: 'soothing',
|
||||
canOwn: ownsItem('weapon_armoire_lunarSceptre '),
|
||||
canOwn: ownsItem('weapon_armoire_lunarSceptre'),
|
||||
},
|
||||
rancherLasso: {
|
||||
twoHanded: true,
|
||||
@@ -292,7 +292,7 @@ let weapon = {
|
||||
per: 5,
|
||||
int: 5,
|
||||
set: 'rancher',
|
||||
canOwn: ownsItem('weapon_armoire_rancherLasso '),
|
||||
canOwn: ownsItem('weapon_armoire_rancherLasso'),
|
||||
},
|
||||
mythmakerSword: {
|
||||
text: t('weaponArmoireMythmakerSwordText'),
|
||||
@@ -301,7 +301,7 @@ let weapon = {
|
||||
str: 6,
|
||||
per: 6,
|
||||
set: 'goldenToga',
|
||||
canOwn: ownsItem('weapon_armoire_mythmakerSword '),
|
||||
canOwn: ownsItem('weapon_armoire_mythmakerSword'),
|
||||
},
|
||||
ironCrook: {
|
||||
text: t('weaponArmoireIronCrookText'),
|
||||
@@ -310,7 +310,7 @@ let weapon = {
|
||||
str: 7,
|
||||
per: 7,
|
||||
set: 'hornedIron',
|
||||
canOwn: ownsItem('weapon_armoire_ironCrook '),
|
||||
canOwn: ownsItem('weapon_armoire_ironCrook'),
|
||||
},
|
||||
goldWingStaff: {
|
||||
text: t('weaponArmoireGoldWingStaffText'),
|
||||
@@ -320,7 +320,7 @@ let weapon = {
|
||||
int: 4,
|
||||
per: 4,
|
||||
str: 4,
|
||||
canOwn: ownsItem('weapon_armoire_goldWingStaff '),
|
||||
canOwn: ownsItem('weapon_armoire_goldWingStaff'),
|
||||
},
|
||||
batWand: {
|
||||
text: t('weaponArmoireBatWandText'),
|
||||
@@ -328,7 +328,7 @@ let weapon = {
|
||||
value: 100,
|
||||
int: 10,
|
||||
per: 2,
|
||||
canOwn: ownsItem('weapon_armoire_batWand '),
|
||||
canOwn: ownsItem('weapon_armoire_batWand'),
|
||||
},
|
||||
shepherdsCrook: {
|
||||
text: t('weaponArmoireShepherdsCrookText'),
|
||||
@@ -336,7 +336,7 @@ let weapon = {
|
||||
value: 100,
|
||||
con: 9,
|
||||
set: 'shepherd',
|
||||
canOwn: ownsItem('weapon_armoire_shepherdsCrook '),
|
||||
canOwn: ownsItem('weapon_armoire_shepherdsCrook'),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Cron and time / day functions
|
||||
------------------------------------------------------
|
||||
*/
|
||||
import _ from 'lodash';
|
||||
import moment from 'moment';
|
||||
|
||||
export const DAY_MAPPING = {
|
||||
0: 'su',
|
||||
1: 'm',
|
||||
2: 't',
|
||||
3: 'w',
|
||||
4: 'th',
|
||||
5: 'f',
|
||||
6: 's',
|
||||
};
|
||||
|
||||
/*
|
||||
Each time we perform date maths (cron, task-due-days, etc), we need to consider user preferences.
|
||||
Specifically {dayStart} (custom day start) and {timezoneOffset}. This function sanitizes / defaults those values.
|
||||
{now} is also passed in for various purposes, one example being the test scripts scripts testing different "now" times.
|
||||
*/
|
||||
|
||||
function sanitizeOptions (o) {
|
||||
let ref = Number(o.dayStart || 0);
|
||||
let dayStart = !_.isNaN(ref) && ref >= 0 && ref <= 24 ? ref : 0;
|
||||
let timezoneOffset = o.timezoneOffset ? Number(o.timezoneOffset) : Number(moment().zone());
|
||||
// TODO: check and clean timezoneOffset as for dayStart (e.g., might not be a number)
|
||||
let now = o.now ? moment(o.now).zone(timezoneOffset) : moment().zone(timezoneOffset);
|
||||
|
||||
// return a new object, we don't want to add "now" to user object
|
||||
return {
|
||||
dayStart,
|
||||
timezoneOffset,
|
||||
now,
|
||||
};
|
||||
}
|
||||
|
||||
export function startOfWeek (options = {}) {
|
||||
let o = sanitizeOptions(options);
|
||||
|
||||
return moment(o.now).startOf('week');
|
||||
}
|
||||
|
||||
/*
|
||||
This is designed for use with any date that has an important time portion (e.g., when comparing the current date-time with the previous cron's date-time for determing if cron should run now).
|
||||
It changes the time portion of the date-time to be the Custom Day Start hour, so that the date-time is now the user's correct start of day.
|
||||
It SUBTRACTS a day if the date-time's original hour is before CDS (e.g., if your CDS is 5am and it's currently 4am, it's still the previous day).
|
||||
This is NOT suitable for manipulating any dates that are displayed to the user as a date with no time portion, such as a Daily's Start Dates (e.g., a Start Date of today shows only the date, so it should be considered to be today even if the hidden time portion is before CDS).
|
||||
*/
|
||||
|
||||
export function startOfDay (options = {}) {
|
||||
let o = sanitizeOptions(options);
|
||||
let dayStart = moment(o.now).startOf('day').add({ hours: o.dayStart });
|
||||
|
||||
if (moment(o.now).hour() < o.dayStart) {
|
||||
dayStart.subtract({ days: 1 });
|
||||
}
|
||||
return dayStart;
|
||||
}
|
||||
|
||||
/*
|
||||
Absolute diff from "yesterday" till now
|
||||
*/
|
||||
|
||||
export function daysSince (yesterday, options = {}) {
|
||||
let o = sanitizeOptions(options);
|
||||
|
||||
return startOfDay(_.defaults({ now: o.now }, o)).diff(startOfDay(_.defaults({ now: yesterday }, o)), 'days');
|
||||
}
|
||||
|
||||
/*
|
||||
Should the user do this task on this date, given the task's repeat options and user.preferences.dayStart?
|
||||
*/
|
||||
|
||||
export function shouldDo (day, dailyTask, options = {}) {
|
||||
if (dailyTask.type !== 'daily') {
|
||||
return false;
|
||||
}
|
||||
let o = sanitizeOptions(options);
|
||||
let startOfDayWithCDSTime = startOfDay(_.defaults({ now: day }, o));
|
||||
|
||||
// The time portion of the Start Date is never visible to or modifiable by the user so we must ignore it.
|
||||
// Therefore, we must also ignore the time portion of the user's day start (startOfDayWithCDSTime), otherwise the date comparison will be wrong for some times.
|
||||
// NB: The user's day start date has already been converted to the PREVIOUS day's date if the time portion was before CDS.
|
||||
let taskStartDate = moment(dailyTask.startDate).zone(o.timezoneOffset);
|
||||
|
||||
taskStartDate = moment(taskStartDate).startOf('day');
|
||||
if (taskStartDate > startOfDayWithCDSTime.startOf('day')) {
|
||||
return false; // Daily starts in the future
|
||||
}
|
||||
if (dailyTask.frequency === 'daily') { // "Every X Days"
|
||||
if (!dailyTask.everyX) {
|
||||
return false; // error condition
|
||||
}
|
||||
let daysSinceTaskStart = startOfDayWithCDSTime.startOf('day').diff(taskStartDate, 'days');
|
||||
|
||||
return daysSinceTaskStart % dailyTask.everyX === 0;
|
||||
} else if (dailyTask.frequency === 'weekly') { // "On Certain Days of the Week"
|
||||
if (!dailyTask.repeat) {
|
||||
return false; // error condition
|
||||
}
|
||||
let dayOfWeekNum = startOfDayWithCDSTime.day(); // e.g., 0 for Sunday
|
||||
|
||||
return dailyTask.repeat[DAY_MAPPING[dayOfWeekNum]];
|
||||
} else {
|
||||
return false; // error condition - unexpected frequency string
|
||||
}
|
||||
}
|
||||
+19
-185
@@ -1,4 +1,10 @@
|
||||
var $w, _, api, content, i18n, moment, preenHistory, sanitizeOptions, sortOrder,
|
||||
import {
|
||||
daysSince,
|
||||
shouldDo,
|
||||
} from '../../common/script/cron';
|
||||
import * as statHelpers from './statHelpers';
|
||||
|
||||
var $w, _, api, content, i18n, moment, preenHistory, sortOrder,
|
||||
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
moment = require('moment');
|
||||
@@ -12,6 +18,13 @@ i18n = require('./i18n');
|
||||
api = module.exports = {};
|
||||
|
||||
api.i18n = i18n;
|
||||
api.shouldDo = shouldDo;
|
||||
|
||||
api.maxLevel = statHelpers.MAX_LEVEL;
|
||||
api.capByLevel = statHelpers.capByLevel;
|
||||
api.maxHealth = statHelpers.MAX_HEALTH;
|
||||
api.tnl = statHelpers.toNextLevel;
|
||||
api.diminishingReturns = statHelpers.diminishingReturns;
|
||||
|
||||
$w = api.$w = function(s) {
|
||||
return s.split(' ');
|
||||
@@ -61,184 +74,6 @@ api.planGemLimits = {
|
||||
convCap: 25
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Time / Day
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Each time we're performing date math (cron, task-due-days, etc), we need to take user preferences into consideration.
|
||||
Specifically {dayStart} (custom day start) and {timezoneOffset}. This function sanitizes / defaults those values.
|
||||
{now} is also passed in for various purposes, one example being the test scripts scripts testing different "now" times
|
||||
*/
|
||||
|
||||
sanitizeOptions = function(o) {
|
||||
var dayStart, now, ref, timezoneOffset;
|
||||
dayStart = !_.isNaN(+o.dayStart) && (0 <= (ref = +o.dayStart) && ref <= 24) ? +o.dayStart : 0;
|
||||
timezoneOffset = o.timezoneOffset ? +o.timezoneOffset : +moment().zone();
|
||||
now = o.now ? moment(o.now).zone(timezoneOffset) : moment(+(new Date)).zone(timezoneOffset);
|
||||
return {
|
||||
dayStart: dayStart,
|
||||
timezoneOffset: timezoneOffset,
|
||||
now: now
|
||||
};
|
||||
};
|
||||
|
||||
api.startOfWeek = api.startOfWeek = function(options) {
|
||||
var o;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
o = sanitizeOptions(options);
|
||||
return moment(o.now).startOf('week');
|
||||
};
|
||||
|
||||
api.startOfDay = function(options) {
|
||||
var dayStart, o;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
o = sanitizeOptions(options);
|
||||
dayStart = moment(o.now).startOf('day').add({
|
||||
hours: o.dayStart
|
||||
});
|
||||
if (moment(o.now).hour() < o.dayStart) {
|
||||
dayStart.subtract({
|
||||
days: 1
|
||||
});
|
||||
}
|
||||
return dayStart;
|
||||
};
|
||||
|
||||
api.dayMapping = {
|
||||
0: 'su',
|
||||
1: 'm',
|
||||
2: 't',
|
||||
3: 'w',
|
||||
4: 'th',
|
||||
5: 'f',
|
||||
6: 's'
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Absolute diff from "yesterday" till now
|
||||
*/
|
||||
|
||||
api.daysSince = function(yesterday, options) {
|
||||
var o;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
o = sanitizeOptions(options);
|
||||
return api.startOfDay(_.defaults({
|
||||
now: o.now
|
||||
}, o)).diff(api.startOfDay(_.defaults({
|
||||
now: yesterday
|
||||
}, o)), 'days');
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Should the user do this task on this date, given the task's repeat options and user.preferences.dayStart?
|
||||
*/
|
||||
|
||||
api.shouldDo = function(day, dailyTask, options) {
|
||||
var dayOfWeekCheck, dayOfWeekNum, daysSinceTaskStart, everyXCheck, o, startOfDayWithCDSTime, taskStartDate;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (dailyTask.type !== 'daily') {
|
||||
return false;
|
||||
}
|
||||
o = sanitizeOptions(options);
|
||||
startOfDayWithCDSTime = api.startOfDay(_.defaults({
|
||||
now: day
|
||||
}, o));
|
||||
taskStartDate = moment(dailyTask.startDate).zone(o.timezoneOffset);
|
||||
taskStartDate = moment(taskStartDate).startOf('day');
|
||||
if (taskStartDate > startOfDayWithCDSTime.startOf('day')) {
|
||||
return false;
|
||||
}
|
||||
if (dailyTask.frequency === 'daily') {
|
||||
if (!dailyTask.everyX) {
|
||||
return false;
|
||||
}
|
||||
daysSinceTaskStart = startOfDayWithCDSTime.startOf('day').diff(taskStartDate, 'days');
|
||||
everyXCheck = daysSinceTaskStart % dailyTask.everyX === 0;
|
||||
return everyXCheck;
|
||||
} else if (dailyTask.frequency === 'weekly') {
|
||||
if (!dailyTask.repeat) {
|
||||
return false;
|
||||
}
|
||||
dayOfWeekNum = startOfDayWithCDSTime.day();
|
||||
dayOfWeekCheck = dailyTask.repeat[api.dayMapping[dayOfWeekNum]];
|
||||
return dayOfWeekCheck;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Level cap
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
api.maxLevel = 100;
|
||||
|
||||
api.capByLevel = function(lvl) {
|
||||
if (lvl > api.maxLevel) {
|
||||
return api.maxLevel;
|
||||
} else {
|
||||
return lvl;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Health cap
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
api.maxHealth = 50;
|
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Scoring
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
api.tnl = function(lvl) {
|
||||
return Math.round(((Math.pow(lvl, 2) * 0.25) + (10 * lvl) + 139.75) / 10) * 10;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
A hyperbola function that creates diminishing returns, so you can't go to infinite (eg, with Exp gain).
|
||||
{max} The asymptote
|
||||
{bonus} All the numbers combined for your point bonus (eg, task.value * user.stats.int * critChance, etc)
|
||||
{halfway} (optional) the point at which the graph starts bending
|
||||
*/
|
||||
|
||||
api.diminishingReturns = function(bonus, max, halfway) {
|
||||
if (halfway == null) {
|
||||
halfway = max / 2;
|
||||
}
|
||||
return max * (bonus / (bonus + halfway));
|
||||
};
|
||||
|
||||
api.monod = function(bonus, rateOfIncrease, max) {
|
||||
return rateOfIncrease * max * bonus / (rateOfIncrease * bonus + max);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Preen history for users with > 7 history entries
|
||||
This takes an infinite array of single day entries [day day day day day...], and turns it into a condensed array
|
||||
@@ -293,7 +128,6 @@ api.preenTodos = function(tasks) {
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Update the in-browser store with new gear. FIXME this was in user.fns, but it was causing strange issues there
|
||||
*/
|
||||
@@ -535,7 +369,7 @@ api.taskClasses = function(task, filters, dayStart, lastCron, showCompleted, mai
|
||||
classes += " beingEdited";
|
||||
}
|
||||
if (type === 'todo' || type === 'daily') {
|
||||
if (completed || (type === 'daily' && !api.shouldDo(+(new Date), task, {
|
||||
if (completed || (type === 'daily' && !shouldDo(+(new Date), task, {
|
||||
dayStart: dayStart
|
||||
}))) {
|
||||
classes += " completed";
|
||||
@@ -2326,7 +2160,7 @@ api.wrap = function(user, main) {
|
||||
}
|
||||
}
|
||||
dropMultiplier = ((ref1 = user.purchased) != null ? (ref2 = ref1.plan) != null ? ref2.customerId : void 0 : void 0) ? 2 : 1;
|
||||
if ((api.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= dropMultiplier * (5 + Math.floor(user._statsComputed.per / 25) + (user.contributor.level || 0)))) {
|
||||
if ((daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= dropMultiplier * (5 + Math.floor(user._statsComputed.per / 25) + (user.contributor.level || 0)))) {
|
||||
return;
|
||||
}
|
||||
if (((ref3 = user.flags) != null ? ref3.dropsEnabled : void 0) && user.fns.predictableRandom(user.stats.exp) < chance) {
|
||||
@@ -2533,7 +2367,7 @@ api.wrap = function(user, main) {
|
||||
options = {};
|
||||
}
|
||||
now = +options.now || +(new Date);
|
||||
daysMissed = api.daysSince(user.lastCron, _.defaults({
|
||||
daysMissed = daysSince(user.lastCron, _.defaults({
|
||||
now: now
|
||||
}, user.preferences));
|
||||
if (!(daysMissed > 0)) {
|
||||
@@ -2599,7 +2433,7 @@ api.wrap = function(user, main) {
|
||||
thatDay = moment(now).subtract({
|
||||
days: 1
|
||||
});
|
||||
if (api.shouldDo(thatDay.toDate(), daily, user.preferences) || completed) {
|
||||
if (shouldDo(thatDay.toDate(), daily, user.preferences) || completed) {
|
||||
_.each(daily.checklist, (function(box) {
|
||||
box.completed = false;
|
||||
return true;
|
||||
@@ -2653,7 +2487,7 @@ api.wrap = function(user, main) {
|
||||
thatDay = moment(now).subtract({
|
||||
days: n + 1
|
||||
});
|
||||
if (api.shouldDo(thatDay.toDate(), task, user.preferences)) {
|
||||
if (shouldDo(thatDay.toDate(), task, user.preferences)) {
|
||||
scheduleMisses++;
|
||||
if (user.stats.buffs.stealth) {
|
||||
user.stats.buffs.stealth--;
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Level cap
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
export const MAX_LEVEL = 100;
|
||||
|
||||
export function capByLevel (lvl) {
|
||||
if (lvl > MAX_LEVEL) {
|
||||
return MAX_LEVEL;
|
||||
} else {
|
||||
return lvl;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Health cap
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
export const MAX_HEALTH = 50;
|
||||
|
||||
/*
|
||||
------------------------------------------------------
|
||||
Scoring
|
||||
------------------------------------------------------
|
||||
*/
|
||||
|
||||
export function toNextLevel (lvl) {
|
||||
return Math.round((Math.pow(lvl, 2) * 0.25 + 10 * lvl + 139.75) / 10) * 10;
|
||||
}
|
||||
|
||||
/*
|
||||
A hyperbola function that creates diminishing returns, so you can't go to infinite (eg, with Exp gain).
|
||||
{max} The asymptote
|
||||
{bonus} All the numbers combined for your point bonus (eg, task.value * user.stats.int * critChance, etc)
|
||||
{halfway} (optional) the point at which the graph starts bending
|
||||
*/
|
||||
|
||||
export function diminishingReturns (bonus, max, halfway = max / 2) {
|
||||
return max * (bonus / (bonus + halfway));
|
||||
}
|
||||
Reference in New Issue
Block a user