mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 07:07:35 +01:00
* feat(incentives): login bennies WIP * feat(content): incentive prize content WIP * fix(content): placeholders pass tests * WIP(content): Bard instrument placeholder * feat(content): Incentives build * chore(sprites): compile and fix some strings * WIP(incentives): quests and backgrounds * fix(quests): correct buy/launch handling * [WIP] Incentives rewarding (#8226) * Added login incentive rewards * Updated incentive rewards * Added incentive modal and updated notification structure * Added analytics to sleeping * Added login incentives to user analytics * Fixed unit tests and ensured that prizes are incremented and not replaced * Updated style of daily login incentive modal * Added rewards modal * Added translations * Added loigin incentive ui elements to profile * Updated login incentives structure and abstracted to common.content * Added dynamic display for login incentives on profile * Added purple potion image * Updated daily login modal * Fixed progress calculation * Added bard gear * Updated login incentive rewards * Fixed styles and text * Added multiple read for notifications * Fixed lint issues * Fixed styles and added 50 limit * Updated quest keys * Added login incentives reward page * Fixed tests * Fixed linting and tests * Read named notifications route. Add image for backgrounds * Fixed style issues and added tranlsations to login incentive notification * Hided abiltiy to purchase incentive backgrounds and added message to detail how to unlock * Updated awarded message * Fixed text and updated progress counter to display better * Fixed purple potion reward text * Fixed check in backgrouns reward text * fix(quest): pass tests * Added display of multiple rewards * Updated modal styles * Fixed neagtive 50 issue * Remvoed total count from daily login incentives modal * Fixed magic paw display * fix(awards): give bunnies again * WIP(incentives): more progress on BG shop * fix(incentives): actually award backgrounds * fix(incentives): more BG fixy * fix(backgrounds): don't gem-buy checkin bgs * Added dust bunny notification * fix(incentives): don't redisplay bunny award * chore(news): Bailey and different promo sprite
157 lines
4.9 KiB
JavaScript
157 lines
4.9 KiB
JavaScript
'use strict';
|
|
|
|
angular.module('habitrpg')
|
|
.factory('Quests', ['$http', '$state','$q', 'ApiUrl', 'Content', 'Groups', 'User', 'Analytics',
|
|
function questsFactory($http, $state, $q, ApiUrl, Content, Groups, User, Analytics) {
|
|
|
|
var user = User.user;
|
|
var party;
|
|
|
|
Groups.party()
|
|
.then(function (partyFound) {
|
|
party = partyFound;
|
|
});
|
|
|
|
function lockQuest(quest,ignoreLevel) {
|
|
if (!ignoreLevel){
|
|
if (quest.lvl && user.stats.lvl < quest.lvl) return true;
|
|
}
|
|
if (user.achievements.quests) return (quest.previous && !user.achievements.quests[quest.previous]);
|
|
|
|
return quest.locked;
|
|
}
|
|
|
|
function _preventQuestModal(quest) {
|
|
if (!quest) {
|
|
return 'No quest with that key found';
|
|
}
|
|
|
|
if (quest.previous && (!user.achievements.quests || (user.achievements.quests && !user.achievements.quests[quest.previous]))){
|
|
alert(window.env.t('unlockByQuesting', {title: Content.quests[quest.previous].text()}));
|
|
return 'unlockByQuesting';
|
|
}
|
|
|
|
if (quest.lvl > user.stats.lvl) {
|
|
alert(window.env.t('mustLvlQuest', {level: quest.lvl}))
|
|
return 'mustLvlQuest';
|
|
}
|
|
|
|
if (quest.unlockCondition && quest.unlockCondition.condition === 'create account') {
|
|
|
|
}
|
|
}
|
|
|
|
function buyQuest(quest) {
|
|
return $q(function(resolve, reject) {
|
|
var item = Content.quests[quest];
|
|
|
|
var preventQuestModal = _preventQuestModal(item);
|
|
if (preventQuestModal) {
|
|
return reject(preventQuestModal);
|
|
}
|
|
|
|
if (item.unlockCondition && item.unlockCondition.condition === 'party invite') {
|
|
if (!confirm(window.env.t('mustInviteFriend'))) return reject('Did not want to invite friends');
|
|
Groups.inviteOrStartParty(party)
|
|
return reject('Invite or start party');
|
|
}
|
|
|
|
if (item.unlockCondition && item.unlockCondition.condition === 'create account') {
|
|
alert(window.env.t('createAccountQuest'));
|
|
return reject('Awarded to new accounts');
|
|
}
|
|
|
|
if (item.unlockCondition && item.unlockCondition.condition === 'login incentive') {
|
|
if (user.loginIncentives > item.unlockCondition.incentiveThreshold) {
|
|
alert(window.env.t('loginIncentiveQuestObtained', {count: item.unlockCondition.incentiveThreshold}));
|
|
} else {
|
|
alert(window.env.t('loginIncentiveQuest', {count: item.unlockCondition.incentiveThreshold}));
|
|
}
|
|
return reject('Login incentive item');
|
|
}
|
|
|
|
resolve(item);
|
|
});
|
|
}
|
|
|
|
function questPopover(quest) {
|
|
// The popover gets parsed as markdown (hence the double \n for line breaks
|
|
var text = '';
|
|
if(quest.boss) {
|
|
text += '**' + window.env.t('bossHP') + ':** ' + quest.boss.hp + '\n\n';
|
|
text += '**' + window.env.t('bossStrength') + ':** ' + quest.boss.str + '\n\n';
|
|
} else if(quest.collect) {
|
|
var count = 0;
|
|
for (var key in quest.collect) {
|
|
text += '**' + window.env.t('collect') + ':** ' + quest.collect[key].count + ' ' + quest.collect[key].text() + '\n\n';
|
|
}
|
|
}
|
|
text += '---\n\n';
|
|
text += '**' + window.env.t('rewards') + ':**\n\n';
|
|
if(quest.drop.items) {
|
|
for (var item in quest.drop.items) {
|
|
text += quest.drop.items[item].text() + '\n\n';
|
|
}
|
|
}
|
|
if(quest.drop.exp)
|
|
text += quest.drop.exp + ' ' + window.env.t('experience') + '\n\n';
|
|
if(quest.drop.gp)
|
|
text += quest.drop.gp + ' ' + window.env.t('gold') + '\n\n';
|
|
|
|
return text;
|
|
}
|
|
|
|
function showQuest(quest) {
|
|
return $q(function(resolve, reject) {
|
|
var item = Content.quests[quest];
|
|
|
|
var preventQuestModal = _preventQuestModal(item);
|
|
if (preventQuestModal) {
|
|
return reject(preventQuestModal);
|
|
}
|
|
|
|
resolve(item);
|
|
});
|
|
}
|
|
|
|
function initQuest(key) {
|
|
return $q(function(resolve, reject) {
|
|
Analytics.updateUser({'partyID': party._id, 'partySize': party.memberCount});
|
|
Groups.Group.inviteToQuest(party._id, key)
|
|
.then(function(response) {
|
|
party.quest = response.data.data;
|
|
Groups.data.party = party;
|
|
$state.go('options.social.party');
|
|
resolve();
|
|
});
|
|
});
|
|
}
|
|
|
|
function sendAction(action) {
|
|
return $q(function(resolve, reject) {
|
|
$http.post(ApiUrl.get() + '/api/v3/groups/' + party._id + '/' + action)
|
|
.then(function(response) {
|
|
User.sync();
|
|
|
|
Analytics.updateUser({
|
|
partyID: party._id,
|
|
partySize: party.memberCount
|
|
});
|
|
|
|
var quest = response.data.quest;
|
|
if (!quest) quest = response.data.data;
|
|
resolve(quest);
|
|
});;
|
|
});
|
|
}
|
|
|
|
return {
|
|
lockQuest: lockQuest,
|
|
buyQuest: buyQuest,
|
|
questPopover: questPopover,
|
|
sendAction: sendAction,
|
|
showQuest: showQuest,
|
|
initQuest: initQuest
|
|
}
|
|
}]);
|