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 @@ + + + + + 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`; }