Collection quests: make sure users cannot earn "excess" items (#12098)

* fix(collection quests): make sure users cannot earn "excess" collection items

* add test
This commit is contained in:
Matteo Pagliazzi
2020-04-20 23:12:05 +02:00
committed by GitHub
parent 2e97f9864e
commit 97209e40ad
2 changed files with 65 additions and 41 deletions

View File

@@ -538,6 +538,7 @@ describe('Group Model', () => {
});
});
describe('collection quests with multiple items', () => {
it('sends a chat message if no progress is made on quest with multiple items', async () => {
progress.collectedItems = 0;
party.quest.key = 'dilatoryDistress1';
@@ -563,7 +564,7 @@ describe('Group Model', () => {
});
});
it('handles collection quests with multiple items', async () => {
it('handles correctly', async () => {
progress.collectedItems = 10;
party.quest.key = 'evilsanta2';
party.quest.active = false;
@@ -587,6 +588,27 @@ describe('Group Model', () => {
});
});
it('cannot collect excess items', async () => {
// Make sure the quest progress isn't erased
sandbox.stub(Group.prototype, 'finishQuest').returns(Promise.resolve());
progress.collectedItems = 500;
party.quest.key = 'evilsanta2';
party.quest.active = false;
await party.startQuest(questLeader);
await party.save();
await Group.processQuestProgress(participatingMember, progress);
party = await Group.findOne({ _id: party._id });
expect(party.quest.progress.collect.tracks)
.to.eql(questScrolls.evilsanta2.collect.tracks.count);
expect(party.quest.progress.collect.branches)
.to.eql(questScrolls.evilsanta2.collect.branches.count);
});
});
it('sends message about victory', async () => {
progress.collectedItems = 500;

View File

@@ -1141,7 +1141,7 @@ schema.methods._processCollectionQuest = async function processCollectionQuest (
const itemsFound = {};
const possibleItemKeys = Object.keys(quest.collect)
.filter(key => group.quest.progress.collect[key] !== quest.collect[key].count);
.filter(key => group.quest.progress.collect[key] < quest.collect[key].count);
const possibleItemsToCollect = possibleItemKeys.reduce((accumulator, current, index) => {
accumulator[possibleItemKeys[index]] = quest.collect[current];
@@ -1151,11 +1151,13 @@ schema.methods._processCollectionQuest = async function processCollectionQuest (
_.times(progress.collectedItems, () => {
const item = shared.randomVal(possibleItemsToCollect, { key: true });
if (group.quest.progress.collect[item] < quest.collect[item].count) {
if (!itemsFound[item]) {
itemsFound[item] = 0;
}
itemsFound[item] += 1;
group.quest.progress.collect[item] += 1;
}
});
// Add 0 for all items not found