mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-08-02 04:00:36 +00:00
Merge branch 'develop' into paglias/bs3
This commit is contained in:
commit
0a047f5b2f
9 changed files with 71 additions and 53 deletions
|
|
@ -191,9 +191,9 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$
|
|||
.success(function(){
|
||||
var msg = "You cast " + spell.text;
|
||||
switch (type) {
|
||||
case 'task': msg += ' on ' + target.text;break;
|
||||
case 'user': msg += ' on ' + target.profile.name;break;
|
||||
case 'party': msg += ' on the Party';break;
|
||||
case 'task': msg += ' on ' + target.text + '.';break;
|
||||
case 'user': msg += ' on ' + target.profile.name + '.';break;
|
||||
case 'party': msg += ' for the Party.';break;
|
||||
}
|
||||
Notification.text(msg);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -9,3 +9,8 @@ angular.module('habitrpg')
|
|||
return Math.floor((gp - Math.floor(gp))*100);
|
||||
}
|
||||
})
|
||||
.filter('htmlDecode',function(){
|
||||
return function(html){
|
||||
return $('<div/>').html(html).text();
|
||||
}
|
||||
})
|
||||
|
|
@ -539,9 +539,11 @@ api.questAccept = function(req, res) {
|
|||
|
||||
// If ?key=xxx is provided, we're starting a new quest and inviting the party. Otherwise, we're a party member accepting the invitation
|
||||
if (key) {
|
||||
if (!shared.content.quests[key]) return res.json(404,{err:'Quest ' + key + ' not found'});
|
||||
var quest = shared.content.quests[key];
|
||||
if (!quest) return res.json(404,{err:'Quest ' + key + ' not found'});
|
||||
if (quest.lvl && user.stats.lvl < quest.lvl) return res.json(400, {err: "You must be level "+quest.lvl+" to being this quest."});
|
||||
if (group.quest.key) return res.json(400, {err: 'Party already on a quest (and only have one quest at a time)'});
|
||||
if (!user.items.quests[key]) return res.json(401, {err: "You don't own that quest scroll"});
|
||||
if (!user.items.quests[key]) return res.json(400, {err: "You don't own that quest scroll"});
|
||||
group.quest.key = key;
|
||||
group.quest.members = {};
|
||||
// Invite everyone. true means "accepted", false="rejected", undefined="pending". Once we click "start quest"
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ GroupSchema.methods.finishQuest = function(quest, cb) {
|
|||
case 'eggs':
|
||||
case 'food':
|
||||
case 'hatchingPotions':
|
||||
case 'quests':
|
||||
updates['$inc']['items.'+item.type+'.'+dropK] = _.where(quest.drop.items,{type:item.type,key:item.key}).length;
|
||||
break;
|
||||
case 'pets':
|
||||
|
|
|
|||
|
|
@ -288,7 +288,8 @@ describe('API', function () {
|
|||
request.post(baseURL+'/user/batch-update')
|
||||
.send([
|
||||
{op:'score',params:{direction:'up',id:user.dailys[0].id}},
|
||||
{op:'score',params:{direction:'up',id:user.dailys[1].id}}
|
||||
{op:'score',params:{direction:'up',id:user.dailys[1].id}},
|
||||
{op:'update',body:{'stats.lvl':50}}
|
||||
])
|
||||
.end(function(res){
|
||||
user = res.body;
|
||||
|
|
@ -344,21 +345,21 @@ describe('API', function () {
|
|||
// Start the quest
|
||||
async.waterfall([
|
||||
function (cb) {
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept?key=gryphon")
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3")
|
||||
.end(function (res) {
|
||||
expectCode(res, 401);
|
||||
User.findByIdAndUpdate(_id, {$set: {'items.quests.gryphon':1}}, cb);
|
||||
expectCode(res, 400);
|
||||
User.findByIdAndUpdate(_id, {$set: {'items.quests.vice3':1}}, cb);
|
||||
});
|
||||
},
|
||||
function (_user,cb) {
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept?key=gryphon")
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3")
|
||||
.end(function (res) {
|
||||
expectCode(res, 200);
|
||||
Group.findById(group._id, cb);
|
||||
});
|
||||
},
|
||||
function (_group,cb) {
|
||||
expect(_group.quest.key).to.be('gryphon');
|
||||
expect(_group.quest.key).to.be('vice3');
|
||||
expect(_group.quest.active).to.be(false);
|
||||
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept")
|
||||
|
|
@ -435,7 +436,7 @@ describe('API', function () {
|
|||
request.post(baseURL+'/user/batch-update')
|
||||
.end(function(){
|
||||
request.get(baseURL+'/groups/party').end(function(res){
|
||||
expect(res.body.quest.progress.hp).to.be.below(shared.content.quests.gryphon.boss.hp);
|
||||
expect(res.body.quest.progress.hp).to.be.below(shared.content.quests.vice3.boss.hp);
|
||||
var _party = res.body.members;
|
||||
expect(_.find(_party,{_id:party[0]._id}).stats.hp).to.be.below(50);
|
||||
expect(_.find(_party,{_id:party[1]._id}).stats.hp).to.be.below(50);
|
||||
|
|
@ -445,7 +446,7 @@ describe('API', function () {
|
|||
|
||||
// Kill the boss
|
||||
function(cb){
|
||||
expect(user.items.eggs['Gryphon']).to.not.be.ok();
|
||||
expect(user.items.gear.owned.weapon_special_2).to.not.be.ok();
|
||||
Group.findByIdAndUpdate(group._id,{$set:{'quest.progress.hp':0}},cb);
|
||||
},
|
||||
function(_group,cb){
|
||||
|
|
@ -465,12 +466,14 @@ describe('API', function () {
|
|||
},
|
||||
function(_group,cb){
|
||||
expect(_.isEmpty(_group.quest)).to.be(true);
|
||||
expect(user.items.eggs['Gryphon']).to.be(2);
|
||||
expect(_.find(_group.members,{_id:party[0]._id}).items.eggs['Gryphon']).to.be(2);
|
||||
expect(_.find(_group.members,{_id:party[1]._id}).items.eggs['Gryphon']).to.be(2);
|
||||
expect(_.find(_group.members,{_id:party[2]._id}).items.eggs['Gryphon']).to.not.be.ok();
|
||||
expect(user.stats.exp).to.be.above(shared.content.quests.gryphon.drop.exp);
|
||||
expect(user.stats.gp).to.be.above(shared.content.quests.gryphon.drop.gp);
|
||||
expect(user.items.gear.owned.weapon_special_2).to.be(true);
|
||||
expect(user.items.eggs.Dragon).to.be(2);
|
||||
expect(user.items.hatchingPotions.Shade).to.be(2);
|
||||
expect(_.find(_group.members,{_id:party[0]._id}).items.gear.owned.weapon_special_2).to.be(true);
|
||||
expect(_.find(_group.members,{_id:party[1]._id}).items.gear.owned.weapon_special_2).to.be(true);
|
||||
expect(_.find(_group.members,{_id:party[2]._id}).items.gear.owned.weapon_special_2).to.not.be.ok();
|
||||
expect(user.stats.exp).to.be.above(shared.content.quests.vice3.drop.exp);
|
||||
expect(user.stats.gp).to.be.above(shared.content.quests.vice3.drop.gp);
|
||||
cb();
|
||||
}
|
||||
],done);
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html')
|
|||
p.muted(ng-show='questCount < 1')=env.t('noScrolls')
|
||||
p.muted!=env.t('scrollsText1') + ' <a href="/#/options/groups/party">' + env.t('scrollsText2') + '</a>'
|
||||
div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]')
|
||||
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
|
||||
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
|
||||
.badge.badge-info.stack-count {{points}}
|
||||
|
||||
li.customize-menu
|
||||
|
|
@ -109,8 +109,8 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html')
|
|||
li.customize-menu
|
||||
menu.pets-menu(label=env.t('quests'))
|
||||
p.muted!=env.t('scrollsText1') + ' <a href="/#/options/groups/party">' + env.t('scrollsText2') + '</a>'
|
||||
div(ng-repeat='quest in Content.quests')
|
||||
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='buyQuest(quest.key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
|
||||
div(ng-repeat='quest in Content.quests', ng-if='quest.canBuy')
|
||||
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='buyQuest(quest.key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
|
||||
p
|
||||
| {{quest.value}}
|
||||
span.Pet_Currency_Gem1x.inline-gems
|
||||
|
|
@ -127,7 +127,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html')
|
|||
p
|
||||
| 4
|
||||
span.Pet_Currency_Gem1x.inline-gems
|
||||
div
|
||||
//-div
|
||||
button.customize-option(popover='{{Content.spells.special.snowball.notes}}', popover-title='{{Content.spells.special.snowball.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("special", Content.spells.special.snowball)', class='inventory_special_snowball')
|
||||
p
|
||||
| {{Content.spells.special.snowball.value}}
|
||||
|
|
|
|||
|
|
@ -47,11 +47,12 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title=env.t('guild
|
|||
table.table.table-striped
|
||||
tr(ng-repeat='(k,v) in group.quest.progress.collect', class='quest_collected_{{v >= Content.quests[group.quest.key].collect[k].count}}')
|
||||
td
|
||||
div(class='quest_{{group.quest.key}}_{{k}}') {{Content.quests[group.quest.key].collect[k].text}}
|
||||
div.pull-left(class='quest_{{group.quest.key}}_{{k}}')
|
||||
| {{Content.quests[group.quest.key].collect[k].text}}
|
||||
td
|
||||
{{v}} / {{Content.quests[group.quest.key].collect[k].count}}
|
||||
|
||||
p {{Content.quests[group.quest.key].notes}}
|
||||
div(ng-bind-html='Content.quests[group.quest.key].notes')
|
||||
hr
|
||||
h5=env.t('participants')
|
||||
table.table.table-striped
|
||||
|
|
|
|||
|
|
@ -26,7 +26,15 @@ script(type='text/ng-template', id='modals/newStuff.html')
|
|||
h3.popover-title
|
||||
a(target='_blank', href='https://twitter.com/Mihakuu') Bailey
|
||||
.popover-content
|
||||
h5 Vice
|
||||
p You awaken after the Winter Wonderland festivities and birthday celebrations with a smile. It's been a snowy, cheerful couple months, and the NPCs have finally returned to their normal attire. But today something is very wrong. Shadowy whisps cover the ground of Habitica, the sky has darkened. At the tavern you hear @DanielTheBard struming dark tales on his lute, and @Baconsaur peering into a mug, grumbling about her mounts swallowed in the shadows. They speak of the same thing: <strong>Vice</strong>, a dark an terrible foe. This new boss arc is a 3-part quest that requires level 30 to begin. Bring your strongest party members, and don't miss your dailies - there's a powerful weapon at the end!
|
||||
p
|
||||
small.muted by @baconsaur & @DanielTheBard
|
||||
p
|
||||
small.muted 02/01/2014
|
||||
|
||||
hr
|
||||
h5 01/30/2014
|
||||
table.table.table-striped
|
||||
tr
|
||||
td
|
||||
|
|
@ -53,8 +61,6 @@ script(type='text/ng-template', id='modals/newStuff.html')
|
|||
|
||||
p.muted By @lemoness
|
||||
|
||||
small.muted 01/30/2014
|
||||
|
||||
hr
|
||||
h5 01/28/2014
|
||||
table.table.table-striped
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ script(type='text/ng-template', id='modals/showQuest.html')
|
|||
h3 {{selectedQuest.text}}
|
||||
.modal-body
|
||||
.pull-right(class='quest_{{selectedQuest.key}}')
|
||||
p {{selectedQuest.notes}}
|
||||
div(ng-bind-html='selectedQuest.notes')
|
||||
quest-rewards(key='{{selectedQuest.key}}')
|
||||
hr
|
||||
div(style='clear:left;clear:right')
|
||||
|
|
@ -44,7 +44,7 @@ script(type='text/ng-template', id='modals/buyQuest.html')
|
|||
h3 {{selectedQuest.text}}
|
||||
.modal-body
|
||||
.pull-right(class='quest_{{selectedQuest.key}}')
|
||||
p {{selectedQuest.notes}}
|
||||
div(ng-bind-html='selectedQuest.notes')
|
||||
quest-rewards(key='{{selectedQuest.key}}')
|
||||
.modal-footer
|
||||
button.btn.btn-large.cancel(ng-click='closeQuest()')=env.t('neverMind')
|
||||
|
|
@ -56,7 +56,7 @@ script(type='text/ng-template', id='modals/questInvitation.html')
|
|||
h3=env.t('questInvitation')
|
||||
| {{Content.quests[party.quest.key].text}}
|
||||
.modal-body
|
||||
p {{Content.quests[party.quest.key].notes}}
|
||||
div(ng-bind-html='Content.quests[party.quest.key].notes')
|
||||
quest-rewards(key='{{party.quest.key}}')
|
||||
.modal-footer
|
||||
button.btn.btn-default.btn-small.btn-cancel(ng-click='questHold = true')=env.t('askLater')
|
||||
|
|
|
|||
Loading…
Reference in a new issue