diff --git a/website/client/components/groups/startQuestModal.vue b/website/client/components/groups/startQuestModal.vue
index e459a8b352..0f91e7a6e5 100644
--- a/website/client/components/groups/startQuestModal.vue
+++ b/website/client/components/groups/startQuestModal.vue
@@ -3,43 +3,20 @@
.left-panel.content
h3.text-center Quests
.row
- .col-4.quest-col(v-for='(value, key, index) in user.items.quests', @click='selectQuest(key)', :class="{selected: key === selectedQuest}", v-if='value > 0')
+ .col-4.quest-col(v-for='(value, key, index) in user.items.quests', @click='selectQuest({key})', :class="{selected: key === selectedQuest}", v-if='value > 0')
.quest-wrapper
.quest(:class="'inventory_quest_scroll_' + key")
.row
.col-10.offset-1.text-center
- span.description Can’t find a quest to start? Try checking out the Quest Shop in the Market for new releases!
+ span.description(v-once) {{ $t('noQuestToStart') }}
div(v-if='questData')
- .quest-image(:class="'quest_' + questData.key")
- h2.text-center {{questData.text()}}
- //- span by: Keith Holliday @TODO: Add author
- p(v-html="questData.notes()")
- div.quest-details
- div(v-if=' questData.collect')
- Strong {{$t('collect')}}:
- span(v-for="(value, key, index) in questData.collect")
- | {{$t('collectionItems', { number: questData.collect[key].count, items: questData.collect[key].text() })}}
- div
- Strong {{$t('difficulty')}}:
- span
- .svg-icon.difficulty-star(v-html="icons.difficultyStarIcon")
+ questDialogContent(:item="questData")
div.text-center
button.btn.btn-primary(@click='questInit()') {{$t('inviteToPartyOrQuest')}}
div.text-center
p {{$t('inviteInformation')}}
.side-panel(v-if='questData')
- h4.text-center {{$t('rewards')}}
- .box
- .svg-icon.rewards-icon(v-html="icons.starIcon")
- strong {{questData.drop.exp}} {{$t('experience')}}
- .box
- .svg-icon.rewards-icon(v-html="icons.goldIcon")
- strong {{questData.drop.gp}} {{$t('gold')}}
- h4.text-center(v-if='questData.drop.items') {{$t('questOwnerRewards')}}
- .box(v-for='item in questData.drop.items')
- .rewards-icon(v-if='item.type === "quest"', :class="'quest_' + item.key")
- .drop-rewards-icon(v-if='item.type === "gear"', :class="'shop_' + item.key")
- strong.quest-reward-text {{item.text()}}
+ questDialogDrops(:item="questData")
@@ -174,10 +113,16 @@ import starIcon from 'assets/svg/star.svg';
import goldIcon from 'assets/svg/gold.svg';
import difficultyStarIcon from 'assets/svg/difficulty-star.svg';
+
+import questDialogDrops from '../shops/quests/questDialogDrops';
+import questDialogContent from '../shops/quests/questDialogContent';
+
export default {
props: ['group'],
components: {
bModal,
+ questDialogDrops,
+ questDialogContent,
},
data () {
return {
@@ -198,6 +143,11 @@ export default {
mounted () {
let questKeys = Object.keys(this.user.items.quests);
this.selectedQuest = questKeys[0];
+
+ this.$root.$on('selectQuest', this.selectQuest);
+ },
+ destroyed () {
+ this.$root.$off('selectQuest', this.selectQuest);
},
computed: {
...mapState({user: 'user.data'}),
@@ -207,8 +157,9 @@ export default {
},
methods: {
selectQuest (quest) {
- this.selectedQuest = quest;
+ this.selectedQuest = quest.key;
},
+
async questInit () {
Analytics.updateUser({
partyID: this.group._id,
diff --git a/website/client/components/inventory/items/index.vue b/website/client/components/inventory/items/index.vue
index 6b0c7b5fa5..3a9a08fde7 100644
--- a/website/client/components/inventory/items/index.vue
+++ b/website/client/components/inventory/items/index.vue
@@ -115,7 +115,7 @@
)
template(slot="popoverContent", scope="context")
h4.popover-content-title {{ context.item.text }}
- .popover-content-text {{ context.item.notes }}
+ .popover-content-text(v-html="context.item.notes")
template(slot="itemBadge", scope="context")
countBadge(
:show="true",
@@ -145,6 +145,10 @@
@change="resetSpell($event)",
@memberSelected="memberSelected($event)",
)
+
+ startQuestModal(
+ group="user.party"
+ )
+
+
diff --git a/website/client/components/shops/quests/questDialogDrops.vue b/website/client/components/shops/quests/questDialogDrops.vue
new file mode 100644
index 0000000000..868ff2f6c9
--- /dev/null
+++ b/website/client/components/shops/quests/questDialogDrops.vue
@@ -0,0 +1,106 @@
+
+ div.questRewards
+ h3.text-center(v-once) {{ $t('rewards') }}
+ div.reward-item
+ span.svg-icon.inline.icon(v-html="icons.experience")
+ span.reward-text {{ $t('amountExperience', { amount: item.drop.exp }) }}
+ div.reward-item(v-if="item.drop.gp != 0")
+ span.svg-icon.inline.icon(v-html="icons.gold")
+ span.reward-text {{ $t('amountGold', { amount: item.drop.gp }) }}
+ h3.text-center(v-if='item.drop.items') {{$t('questOwnerRewards')}}
+ div.reward-item(v-for="drop in item.drop.items")
+ span.icon
+ div(:class="getDropIcon(drop)")
+ span.reward-text {{ getDropName(drop) }}
+
+
+
+
+
diff --git a/website/client/components/shops/quests/questInfo.vue b/website/client/components/shops/quests/questInfo.vue
index 1bf64ded9b..326732f1aa 100644
--- a/website/client/components/shops/quests/questInfo.vue
+++ b/website/client/components/shops/quests/questInfo.vue
@@ -3,7 +3,7 @@
span.col-4(v-if="quest.collect") {{ $t('collect') }}
span.col-8(v-if="quest.collect")
div(v-for="(collect, key) of quest.collect")
- span {{ collect.count }} {{ collect.text }}
+ span {{ collect.count }} {{ getCollectText(collect) }}
span.col-4 {{ $t('difficulty') }}
span.col-8
@@ -78,6 +78,13 @@
return result;
},
+ getCollectText (collect) {
+ if (collect.text instanceof Function) {
+ return collect.text();
+ } else {
+ return collect.text;
+ }
+ },
},
props: {
quest: {
diff --git a/website/common/locales/en/quests.json b/website/common/locales/en/quests.json
index 052cae5098..70a7c8db1b 100644
--- a/website/common/locales/en/quests.json
+++ b/website/common/locales/en/quests.json
@@ -117,5 +117,6 @@
"loginReward": "<%= count %> Check-ins",
"createAccountQuest": "You received this quest when you joined Habitica! If a friend joins, they'll get one too.",
"questBundles": "Discounted Quest Bundles",
- "buyQuestBundle": "Buy Quest Bundle"
+ "buyQuestBundle": "Buy Quest Bundle",
+ "noQuestToStart": "Can’t find a quest to start? Try checking out the Quest Shop in the Market for new releases!"
}
diff --git a/website/common/script/ops/revive.js b/website/common/script/ops/revive.js
index 498c87f926..a2192acb52 100644
--- a/website/common/script/ops/revive.js
+++ b/website/common/script/ops/revive.js
@@ -9,6 +9,8 @@ import {
import randomVal from '../libs/randomVal';
import predictableRandom from '../fns/predictableRandom';
+import { removePinnedGearByClass, addPinnedGearByClass } from './pinnedGearUtils';
+
module.exports = function revive (user, req = {}, analytics) {
if (user.stats.hp > 0) {
throw new NotAuthorized(i18n.t('cannotRevive', req.language));
@@ -81,8 +83,12 @@ module.exports = function revive (user, req = {}, analytics) {
let item = content.gear.flat[lostItem];
if (item) {
+ removePinnedGearByClass(user);
+
user.items.gear.owned[lostItem] = false;
+ addPinnedGearByClass(user);
+
if (user.items.gear.equipped[item.type] === lostItem) {
user.items.gear.equipped[item.type] = `${item.type}_base_0`;
}