diff --git a/common/script/fns/randomDrop.js b/common/script/fns/randomDrop.js index 2d91f2e2f3..658fceef4e 100644 --- a/common/script/fns/randomDrop.js +++ b/common/script/fns/randomDrop.js @@ -37,7 +37,8 @@ module.exports = function randomDrop (user, options, req = {}) { chance = diminishingReturns(chance, 0.75); if (predictableRandom(user, user.stats.gp) < chance) { - user.party.quest.progress.collect++; + if (!user.party.quest.progress.collectedItems) user.party.quest.progress.collectedItems = 0; + user.party.quest.progress.collectedItems++; user.markModified('party.quest.progress'); } diff --git a/test/api/v3/integration/debug/POST-debug_quest-progress.test.js b/test/api/v3/integration/debug/POST-debug_quest-progress.test.js index 5ab0ee0af8..6f10b78ba4 100644 --- a/test/api/v3/integration/debug/POST-debug_quest-progress.test.js +++ b/test/api/v3/integration/debug/POST-debug_quest-progress.test.js @@ -44,7 +44,7 @@ describe('POST /debug/quest-progress', () => { await user.sync(); - expect(user.party.quest.progress.collect).to.eql(300); + expect(user.party.quest.progress.collectedItems).to.eql(300); }); it('returns error when not in production mode', async () => { diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js index f65a1f5557..ec8ce2a216 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js @@ -102,7 +102,8 @@ describe('POST /groups/:groupId/quests/abort', () => { progress: { up: 0, down: 0, - collect: 0, + collect: {}, + collectedItems: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js index bd4ff20916..96d78c9bb4 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js @@ -114,7 +114,8 @@ describe('POST /groups/:groupId/quests/cancel', () => { progress: { up: 0, down: 0, - collect: 0, + collect: {}, + collectedItems: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js index 584a37a2d9..89c65d0c73 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js @@ -113,7 +113,8 @@ describe('POST /groups/:groupId/quests/leave', () => { progress: { up: 0, down: 0, - collect: 0, + collect: {}, + collectedItems: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js index 80641b1e15..c8db296ad9 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js @@ -116,7 +116,8 @@ describe('POST /groups/:groupId/quests/reject', () => { progress: { up: 0, down: 0, - collect: 0, + collect: {}, + collectedItems: 0, }, completed: null, RSVPNeeded: false, diff --git a/test/api/v3/unit/libs/cron.test.js b/test/api/v3/unit/libs/cron.test.js index 08f8fb9368..d6d0866ef9 100644 --- a/test/api/v3/unit/libs/cron.test.js +++ b/test/api/v3/unit/libs/cron.test.js @@ -508,7 +508,7 @@ describe('cron', () => { cron({user, tasksByType, daysMissed, analytics}); expect(user.party.quest.progress.up).to.equal(0); expect(user.party.quest.progress.down).to.equal(0); - expect(user.party.quest.progress.collect).to.be.empty; + expect(user.party.quest.progress.collectedItems).to.be.empty; }); it('applies the user progress', () => { diff --git a/test/api/v3/unit/models/group.test.js b/test/api/v3/unit/models/group.test.js index e164bae769..2502ee96c0 100644 --- a/test/api/v3/unit/models/group.test.js +++ b/test/api/v3/unit/models/group.test.js @@ -58,7 +58,7 @@ describe('Group Model', () => { progress = { up: 5, down: -5, - collect: 5, + collectedItems: 5, }; party.quest.members = { @@ -309,7 +309,7 @@ describe('Group Model', () => { }); it('sends a chat message if no progress is made', async () => { - progress.collect = 0; + progress.collectedItems = 0; await Group.processQuestProgress(participatingMember, progress); @@ -320,7 +320,7 @@ describe('Group Model', () => { }); it('handles collection quests with multiple items', async () => { - progress.collect = 10; + progress.collectedItems = 10; party.quest.key = 'evilsanta2'; party.quest.active = false; @@ -337,7 +337,7 @@ describe('Group Model', () => { }); it('sends message about victory', async () => { - progress.collect = 500; + progress.collectedItems = 500; await Group.processQuestProgress(participatingMember, progress); @@ -351,7 +351,7 @@ describe('Group Model', () => { let quest = questScrolls[party.quest.key]; let finishQuest = sandbox.spy(Group.prototype, 'finishQuest'); - progress.collect = 999; + progress.collectedItems = 999; // TODO should this be collectedItems? What is this testing? await Group.processQuestProgress(participatingMember, progress); @@ -458,7 +458,7 @@ describe('Group Model', () => { expect(participatingMember.party.quest.key).to.eql('whale'); expect(participatingMember.party.quest.progress.down).to.eql(0); - expect(participatingMember.party.quest.progress.collect).to.eql(0); + expect(participatingMember.party.quest.progress.collectedItems).to.eql(0); expect(participatingMember.party.quest.completed).to.eql(null); }); @@ -470,12 +470,12 @@ describe('Group Model', () => { expect(participatingMember.party.quest.key).to.eql('whale'); expect(participatingMember.party.quest.progress.down).to.eql(0); - expect(participatingMember.party.quest.progress.collect).to.eql(0); + expect(participatingMember.party.quest.progress.collectedItems).to.eql(0); expect(participatingMember.party.quest.completed).to.eql(null); expect(questLeader.party.quest.key).to.eql('whale'); expect(questLeader.party.quest.progress.down).to.eql(0); - expect(questLeader.party.quest.progress.collect).to.eql(0); + expect(questLeader.party.quest.progress.collectedItems).to.eql(0); expect(questLeader.party.quest.completed).to.eql(null); }); @@ -595,7 +595,7 @@ describe('Group Model', () => { expect(userQuest.key).to.eql('whale'); expect(userQuest.progress.down).to.eql(0); - expect(userQuest.progress.collect).to.eql(0); + expect(userQuest.progress.collectedItems).to.eql(0); expect(userQuest.completed).to.eql(null); }); diff --git a/test/common/fns/randomDrop.test.js b/test/common/fns/randomDrop.test.js index b91021ab6e..bd2cd2fe51 100644 --- a/test/common/fns/randomDrop.test.js +++ b/test/common/fns/randomDrop.test.js @@ -22,15 +22,15 @@ describe('common.fns.randomDrop', () => { }); it('drops an item for the user.party.quest.progress', () => { - expect(user.party.quest.progress.collect).to.eql(0); + expect(user.party.quest.progress.collectedItems).to.eql(0); user.party.quest.key = 'vice2'; predictableRandom = () => { return 0.0001; }; randomDrop(user, { task, predictableRandom }); - expect(user.party.quest.progress.collect).to.eql(1); + expect(user.party.quest.progress.collectedItems).to.eql(1); randomDrop(user, { task, predictableRandom }); - expect(user.party.quest.progress.collect).to.eql(2); + expect(user.party.quest.progress.collectedItems).to.eql(2); }); context('drops enabled', () => { diff --git a/test/server_side/controllers/groups.test.js b/test/server_side/controllers/groups.test.js index 88fe31752e..62b950ce9c 100644 --- a/test/server_side/controllers/groups.test.js +++ b/test/server_side/controllers/groups.test.js @@ -278,7 +278,7 @@ describe('Groups Controller', function() { progress : { up : 50, down : 0, - collect : {} + collectedItems : {} }, completed : null, RSVPNeeded : false @@ -368,6 +368,7 @@ describe('Groups Controller', function() { user.party.quest.progress = { up: 100, down: 32, + collectedItems: 16, collect: { foo: 12, bar: 4 @@ -380,7 +381,7 @@ describe('Groups Controller', function() { expect(user.party.quest.progress).to.eql({ up: 0, down: 0, - collect: 0, + collectedItems: 0, }); }); diff --git a/website/server/controllers/api-v3/debug.js b/website/server/controllers/api-v3/debug.js index 923a79814a..696505551d 100644 --- a/website/server/controllers/api-v3/debug.js +++ b/website/server/controllers/api-v3/debug.js @@ -167,11 +167,13 @@ api.questProgress = { } if (quest.boss) { + if (!user.party.quest.progress.up) user.party.quest.progress.up = 0; user.party.quest.progress.up += 1000; } if (quest.collect) { - user.party.quest.progress.collect += 300; + if (!user.party.quest.progress.collectedItems) user.party.quest.progress.collectedItems = 0; + user.party.quest.progress.collectedItems += 300; } user.markModified('party.quest.progress'); diff --git a/website/server/libs/api-v3/cron.js b/website/server/libs/api-v3/cron.js index f6a4d337c7..765b4307fa 100644 --- a/website/server/libs/api-v3/cron.js +++ b/website/server/libs/api-v3/cron.js @@ -277,7 +277,7 @@ export function cron (options = {}) { // After all is said and done, progress up user's effect on quest, return those values & reset the user's let progress = user.party.quest.progress; let _progress = _.cloneDeep(progress); - _.merge(progress, {down: 0, up: 0, collect: 0}); + _.merge(progress, {down: 0, up: 0, collectedItems: 0}); // TODO: Clean PMs - keep 200 for subscribers and 50 for free users. Should also be done while resting in the inn // let numberOfPMs = Object.keys(user.inbox.messages).length; diff --git a/website/server/models/group.js b/website/server/models/group.js index 661a77fd04..e60abd6780 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -117,7 +117,8 @@ function _cleanQuestProgress (merge) { progress: { up: 0, down: 0, - collect: 0, + collect: {}, + collectedItems: 0, }, completed: null, RSVPNeeded: false, @@ -552,7 +553,7 @@ schema.methods._processCollectionQuest = async function processCollectionQuest ( let quest = questScrolls[group.quest.key]; let itemsFound = {}; - _.times(progress.collect, () => { + _.times(progress.collectedItems, () => { let item = shared.fns.randomVal(user, quest.collect, {key: true, seed: Math.random()}); if (!itemsFound[item]) { diff --git a/website/server/models/user.js b/website/server/models/user.js index 8042eaa48e..ba3377e865 100644 --- a/website/server/models/user.js +++ b/website/server/models/user.js @@ -376,7 +376,10 @@ export let schema = new Schema({ progress: { up: {type: Number, default: 0}, down: {type: Number, default: 0}, - collect: {type: Number, default: 0}, + collect: {type: Schema.Types.Mixed, default: () => { + return {}; + }}, + collectedItems: {type: Number, default: 0}, }, completed: String, // When quest is done, we move it from key => completed, and it's a one-time flag (for modal) that they unset by clicking "ok" in browser RSVPNeeded: {type: Boolean, default: false}, // Set to true when invite is pending, set to false when quest invite is accepted or rejected, quest starts, or quest is cancelled