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')