diff --git a/common/locales/en/groups.json b/common/locales/en/groups.json
index 1e6e9d982e..bf2a56ec12 100644
--- a/common/locales/en/groups.json
+++ b/common/locales/en/groups.json
@@ -46,7 +46,7 @@
"logoUrl": "Logo URL",
"assignLeader": "Assign Group Leader",
"members": "Members",
- "partyList": "Order for party members in header (reload browser after changing order)",
+ "partyList": "Order for party members in header",
"banTip": "Boot Member",
"moreMembers": "more members",
"invited": "Invited",
@@ -136,5 +136,6 @@
"exclusiveQuestScroll": "Inviting a friend to your party will grant you an exclusive Quest Scroll to battle the Basi-List together!",
"nameYourParty": "Name your new party!",
"partyEmpty": "You're the only one in your party. Invite your friends!",
+ "partyChatEmpty": "Your Party Chat is empty! Type a message in the box above to start chatting.",
"possessiveParty": "<%= name %>'s Party"
}
diff --git a/common/locales/en/quests.json b/common/locales/en/quests.json
index 6b47aac5fb..bd97e6c88e 100644
--- a/common/locales/en/quests.json
+++ b/common/locales/en/quests.json
@@ -60,5 +60,7 @@
"questWarning": "If new players join the party before the quest starts, they will also receive an invitation. However once the quest has started, no new party members can join the quest.",
"bossRageTitle": "Rage",
"bossRageDescription": "When this bar fills, the boss will unleash a special attack!",
- "startQuest": "START A QUEST"
+ "startQuest": "START A QUEST",
+ "whichQuestStart": "Which quest do you want to start?",
+ "getMoreQuests": "Get more quests"
}
diff --git a/common/script/content.coffee b/common/script/content.coffee
index ccdbe470b7..1d45f79507 100644
--- a/common/script/content.coffee
+++ b/common/script/content.coffee
@@ -1119,6 +1119,11 @@ api.food =
_.each api.food, (food,key) ->
_.defaults food, {value: 1, key, notes: t('foodNotes')}
+api.questCategories =
+ ableUnlock: 'unlockableQuests'
+ gold: 'goldQuests'
+ pet: 'petQuests'
+
api.quests =
dilatory:
@@ -1309,7 +1314,7 @@ api.quests =
notes: t('questVice1Notes')
value: 4
lvl: 30
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questVice1Boss')
hp: 750
@@ -1326,7 +1331,7 @@ api.quests =
notes: t('questVice2Notes')
value: 4
lvl: 30
- category: 'unlockable'
+ category: 'ableUnlock'
previous: 'vice1'
collect:
lightCrystal: text: t('questVice2CollectLightCrystal'), count: 45
@@ -1344,7 +1349,7 @@ api.quests =
previous: 'vice2'
value: 4
lvl: 30
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questVice3Boss')
hp: 1500
@@ -1450,7 +1455,7 @@ api.quests =
notes: t('questAtom1Notes')
value: 4
lvl: 15
- category: 'unlockable'
+ category: 'ableUnlock'
collect:
soapBars: text: t('questAtom1CollectSoapBars'), count: 20
drop:
@@ -1465,7 +1470,7 @@ api.quests =
previous: 'atom1'
value: 4
lvl: 15
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questAtom2Boss')
hp: 300
@@ -1483,7 +1488,7 @@ api.quests =
completion: t('questAtom3Completion')
value: 4
lvl: 15
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questAtom3Boss')
hp: 800
@@ -1562,7 +1567,7 @@ api.quests =
notes: t('questMoonstone1Notes')
value: 4
lvl: 60
- category: 'unlockable'
+ category: 'ableUnlock'
collect:
moonstone: text: t('questMoonstone1CollectMoonstone'), count: 500
drop:
@@ -1577,7 +1582,7 @@ api.quests =
value: 4
lvl: 60
previous: 'moonstone1'
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questMoonstone2Boss')
hp: 1500
@@ -1595,7 +1600,7 @@ api.quests =
previous: 'moonstone2'
value: 4
lvl: 60
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questMoonstone3Boss')
hp: 2000
@@ -1620,7 +1625,7 @@ api.quests =
notes: t('questGoldenknight1Notes')
value: 4
lvl: 40
- category: 'unlockable'
+ category: 'ableUnlock'
collect:
testimony: text: t('questGoldenknight1CollectTestimony'), count: 300
drop:
@@ -1635,7 +1640,7 @@ api.quests =
value: 4
previous: 'goldenknight1'
lvl: 40
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questGoldenknight2Boss')
hp: 1000
@@ -1653,7 +1658,7 @@ api.quests =
previous: 'goldenknight2'
value: 4
lvl: 40
- category: 'unlockable'
+ category: 'ableUnlock'
boss:
name: t('questGoldenknight3Boss')
hp: 1700
@@ -1675,7 +1680,7 @@ api.quests =
notes: t('questBasilistNotes')
completion: t('questBasilistCompletion')
value: 4
- category: 'unlockable'
+ category: 'ableUnlock'
unlockCondition:
condition: 'party invite'
text: t('inviteFriends')
diff --git a/common/script/count.js b/common/script/count.js
index 21d9bd93f5..a48fcd42d9 100644
--- a/common/script/count.js
+++ b/common/script/count.js
@@ -27,7 +27,6 @@ function dropPetsCurrentlyOwned(pets) {
return count;
}
-
function mountMasterProgress(mounts) {
var count = 0;
_(DROP_ANIMALS).each(function(animal) {
@@ -51,9 +50,23 @@ function remainingGearInSet(userGear, set) {
return count;
}
+function questsOfCategory(userQuests, category) {
+ var quests = _.filter(content.quests, function(quest) {
+ var categoryMatches = quest.category === category;
+ var hasQuest = userQuests[quest.key];
+
+ return categoryMatches && hasQuest;
+ });
+
+ var count = _.size(quests);
+
+ return count;
+}
+
module.exports = {
beastMasterProgress: beastMasterProgress,
dropPetsCurrentlyOwned: dropPetsCurrentlyOwned,
mountMasterProgress: mountMasterProgress,
- remainingGearInSet: remainingGearInSet
+ remainingGearInSet: remainingGearInSet,
+ questsOfCategory: questsOfCategory
};
diff --git a/website/public/js/controllers/groupsCtrl.js b/website/public/js/controllers/groupsCtrl.js
index 7ea4891efa..90bce84d12 100644
--- a/website/public/js/controllers/groupsCtrl.js
+++ b/website/public/js/controllers/groupsCtrl.js
@@ -535,7 +535,15 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
content: html
}).popover('show');
});
- }
+ };
+
+ $scope.clickStartQuest = function(){
+ if (_.reduce(User.user.items.quests, function(a,v){a += v; return a}) > 0){
+ $rootScope.openModal("ownedQuests", {controller:"InventoryCtrl"});
+ } else {
+ $rootScope.$state.go('options.inventory.quests');
+ }
+ };
$scope.reject = function(){
//User.user.invitations.party = undefined;
diff --git a/website/views/options/inventory/quests.jade b/website/views/options/inventory/quests.jade
index 537689f802..429707a464 100644
--- a/website/views/options/inventory/quests.jade
+++ b/website/views/options/inventory/quests.jade
@@ -1,5 +1,4 @@
-//- If this variable gets any bigger, please move it out of this jade template and into common/script/content
-- var questCategories = {'unlockable':'unlockableQuests','gold':'goldQuests','pet':'petQuests'}
+include ../../shared/mixins
.container-fluid
.row: .col-xs-12
@@ -13,25 +12,14 @@
.row
.col-md-6
h3.equipment-title=env.t('yourQuests')
- menu.inventory-list
- li.customize-menu
- p.muted(ng-show='questCount < 1')=env.t('noScrolls')
- each caption,type in questCategories
- menu.pets-menu(label=env.t(caption))
- div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]', ng-if='Content.quests[quest_key].category === "#{type}"')
- button.customize-option(ng-class='lockQuest(quest) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"',
- ng-click='showQuest(quest_key)',
- data-popover-html="{{::lockQuest(quest) ? env.t('scrollsPre') : questPopover(quest) | markdown}}",
- popover-title='{{::quest.text()}}', popover-trigger='mouseenter',
- popover-placement='right', popover-append-to-body='true')
- .badge.badge-info.stack-count {{points}}
+ +ownedQuests(true,'right')
.col-md-6.border-left
li.customize-menu
h3.equipment-title=env.t('questsForSale')
- each caption,type in questCategories
- menu.pets-menu(label=env.t(caption))
- div(ng-repeat='quest in Content.questsByLevel', ng-if='quest.canBuy && quest.category === "#{type}"')
+ div(ng-repeat='(type,caption) in Content.questCategories')
+ menu.pets-menu(label='{{env.t(caption)}}')
+ div(ng-repeat='quest in Content.questsByLevel', ng-if='quest.canBuy && quest.category === type')
button.customize-option(ng-class='lockQuest(quest) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"',
data-popover-html="{{::lockQuest(quest,true) ? env.t('scrollsPre') : questPopover(quest) | markdown}}",
popover-title='{{::quest.text()}}', popover-append-to-body="true",
diff --git a/website/views/options/social/group.jade b/website/views/options/social/group.jade
index 7b642422ff..55f67cb3d7 100644
--- a/website/views/options/social/group.jade
+++ b/website/views/options/social/group.jade
@@ -56,6 +56,9 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
a(class='badge badge-info', ng-click='clickMember(group.leader._id, true)')
| {{group.leader.profile.name}}
+ div.text-center(ng-if='group.type === "party"')
+ button.btn.btn-success.margin-auto.width-50(ng-click='clickStartQuest();')=env.t('startQuest')
+
// ------ Members -------
.panel.panel-default
.panel-heading
@@ -63,21 +66,6 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
=env.t('members')
button.pull-right.btn.btn-primary(ng-click="openInviteModal(group)")=env.t("inviteFriends")
.panel-body.modal-fixed-height
- div.form-group(ng-if='::group.type=="party" && group.memberCount > 1')
- p=env.t('partyList')
- select.form-control#partyOrder(
- ng-model='user.party.order',
- ng-controller='ChatCtrl',
- ng-options='k as v for (k , v) in partyOrderChoices',
- ng-change='set({"party.order": user.party.order})'
- )
- |
- select.form-control#partyOrderAscending(
- ng-model='user.party.orderAscending',
- ng-controller='ChatCtrl',
- ng-options='k as v for (k , v) in partyOrderAscendingChoices',
- ng-change='set({"party.orderAscending": user.party.orderAscending})'
- )
h4(ng-show='group.memberCount === 1 && group.type === "party"')=env.t('partyEmpty')
table.table.table-striped(ng-show='group.memberCount > 1 || group.type !== "party"' bindonce='group')
tr(ng-repeat='member in group.members track by member._id')
@@ -94,7 +82,6 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
|{{group.memberCount - group.members.length}}
= ' ' + env.t('moreMembers')
|
-
h4(ng-show='group.invites.length > 0')=env.t('invited')
table.table.table-striped
tr(ng-repeat='invite in group.invites')
@@ -107,8 +94,24 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
span(ng-click='clickMember(invite._id, true)')
| {{invite.profile.name}}
- div.text-center(ng-if='group.type === "party"')
- button.btn.btn-success.margin-auto.width-100=env.t('startQuest')
+ .panel.panel-default
+ .panel-heading
+ h3.panel-title=env.t('partyList')
+ .panel-body
+ div.form-group(ng-if='::group.type=="party" && group.memberCount > 1')
+ select.form-control#partyOrder(
+ ng-model='user.party.order',
+ ng-controller='ChatCtrl',
+ ng-options='k as v for (k , v) in partyOrderChoices',
+ ng-change='set({"party.order": user.party.order})'
+ )
+ |
+ select.form-control#partyOrderAscending(
+ ng-model='user.party.orderAscending',
+ ng-controller='ChatCtrl',
+ ng-options='k as v for (k , v) in partyOrderAscendingChoices',
+ ng-change='set({"party.orderAscending": user.party.orderAscending})'
+ )
include ./challenge-box
@@ -135,3 +138,4 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
include ./chat-box
+chatMessages()
+ h4(ng-if='group.chat.length < 1 && group.type === "party"')=env.t('partyChatEmpty')
diff --git a/website/views/options/social/party.jade b/website/views/options/social/party.jade
index a23cf679dd..ded8fff16f 100644
--- a/website/views/options/social/party.jade
+++ b/website/views/options/social/party.jade
@@ -13,10 +13,10 @@ script(type='text/ng-template', id='partials/options.social.party.html')
.row.margin-auto.text-center
a.btn.btn-primary.btn-lg.width-50(ng-click="inviteOrStartParty(group)")=env.t("startPartyWithFriends")
.row.text-center.margin-auto(ng-controller='UserCtrl')
- span.inline-block.party_preview(style='margin-left:-100px')
- span.figure.herobox.inline-block.width-0
- .character-sprites(style='width:0')
- +generatedAvatar
+ span.inline-block.party_preview
+ span.figure.herobox.inline-block
+ .character-sprites(style='margin:0 0 0 4.2em')
+ +generatedAvatar
.row.margin-auto.text-center
ul
li=env.t('partyExplanation1')
diff --git a/website/views/shared/mixins.jade b/website/views/shared/mixins.jade
index c4dde11e38..846370b570 100644
--- a/website/views/shared/mixins.jade
+++ b/website/views/shared/mixins.jade
@@ -16,4 +16,20 @@ mixin previewMarkdown(text)
.panel.panel-warning
.panel-heading=env.t('msgPreviewHeading')
.panel-body.markdown-preview
- markdown(text='#{text}')
\ No newline at end of file
+ markdown(text='#{text}')
+
+mixin ownedQuests(popoverAppend,popoverPlacement)
+ menu.inventory-list
+ li.customize-menu
+ p.muted(ng-show='questCount < 1')=env.t('noScrolls')
+ div(ng-repeat='(type,caption) in Content.questCategories')
+ menu.pets-menu(ng-if='Shared.count.questsOfCategory(user.items.quests,type) > 0', label='{{env.t(caption)}}')
+ div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]', ng-if='Content.quests[quest_key].category === type')
+ button.customize-option(ng-class='lockQuest(quest) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"',
+ ng-click='$close(); showQuest(quest_key)',
+ data-popover-html="{{::lockQuest(quest) ? env.t('scrollsPre') : questPopover(quest) | markdown}}",
+ popover-title='{{::quest.text()}}',
+ popover-trigger='mouseenter',
+ popover-append-to-body='#{popoverAppend}',
+ popover-placement='#{popoverPlacement}')
+ .badge.badge-info.stack-count {{points}}
diff --git a/website/views/shared/modals/invite-friends.jade b/website/views/shared/modals/invite-friends.jade
index 026382827f..b05ae4c09f 100644
--- a/website/views/shared/modals/invite-friends.jade
+++ b/website/views/shared/modals/invite-friends.jade
@@ -54,7 +54,7 @@ script(type='text/ng-template', id='modals/invite-friends.html')
.quest_basilist.pull-left
p(style='margin:2em')=env.t('exclusiveQuestScroll')
button.btn.btn-default.pull-right(style='margin:auto 1em', ng-click='$close()')=env.t('close')
- .modal-footer(style='padding-bottom:0')
+ .modal-footer(style='padding-bottom:0',ng-if='!group || group.memberCount === 1')
p!=env.t('wantExistingParty', {linkStart: "", linkEnd: ""})
pre(style='margin:1em 0 0 0').
{{user.id}}
diff --git a/website/views/shared/modals/quests.jade b/website/views/shared/modals/quests.jade
index 165e0187e1..a9c48ebcea 100644
--- a/website/views/shared/modals/quests.jade
+++ b/website/views/shared/modals/quests.jade
@@ -1,4 +1,5 @@
include ./quest-rewards
+include ../mixins
mixin questInfo
.pull-right-sm.text-center
@@ -92,3 +93,13 @@ script(type='text/ng-template', id='modals/questDrop.html')
button.btn.btn-default(ng-click='closeQuest(); $close()')=env.t('questLater')
button.btn.btn-primary(ng-click='inviteOrStartParty(group); $close()', ng-if='!party.members')=env.t('startAParty')
button.btn.btn-primary(ng-click='questInit(); $close()', ng-if='party.members')=env.t('inviteParty')
+
+script(type='text/ng-template', id='modals/ownedQuests.html')
+ .modal-header
+ h4=env.t('whichQuestStart')
+ .modal-body
+ +ownedQuests(false,'top')
+ .modal-footer
+ h4.pull-left
+ a(ui-sref='options.inventory.quests', ng-click='$close()')=env.t('getMoreQuests')
+ button.btn.btn-default.pull-right(ng-click='$close()')=env.t('neverMind')