Merge branch 'release' into develop
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 8 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
|
@ -1,6 +1,7 @@
|
|||
<template lang="pug">
|
||||
.row
|
||||
world-boss-info-modal
|
||||
world-boss-rage-modal
|
||||
.col-12.col-sm-8.clearfix.standard-page
|
||||
.row
|
||||
.col-6.title-details
|
||||
|
|
@ -69,12 +70,15 @@
|
|||
.col-sm-5.d-flex
|
||||
strong {{ $t('rageStrikes') }}
|
||||
.svg-icon.boss-icon.information-icon.ml-2(v-html="icons.informationIcon", v-b-tooltip.hover.top="questData.boss.rage.description()")
|
||||
.col-sm-2
|
||||
img.rage-strike(src="~assets/images/rage_strike2x.png")
|
||||
.col-sm-2
|
||||
img.rage-strike(src="~assets/images/rage_strike2x.png")
|
||||
.col-sm-2
|
||||
img.rage-strike(src="~assets/images/rage_strike2x.png")
|
||||
.col-sm-2.text-center(@click="showWorldBossRage('seasonalShop')")
|
||||
img.rage-strike(src="~assets/images/world-boss/rage_strike@2x.png", v-if="!group.quest.extra.worldDmg.seasonalShop")
|
||||
img.rage-strike-active(src="~assets/images/world-boss/rage_strike-seasonalShop@2x.png", v-if="group.quest.extra.worldDmg.seasonalShop")
|
||||
.col-sm-2.text-center
|
||||
img.rage-strike(src="~assets/images/world-boss/rage_strike@2x.png", v-if="!group.quest.extra.worldDmg.market")
|
||||
img.rage-strike-active(src="~assets/images/world-boss/rage_strike-market@2x.png", v-if="group.quest.extra.worldDmg.market")
|
||||
.col-sm-2.text-center
|
||||
img.rage-strike(src="~assets/images/world-boss/rage_strike@2x.png", v-if="!group.quest.extra.worldDmg.quests")
|
||||
img.rage-strike-active(src="~assets/images/world-boss/rage_strike-quests@2x.png", v-if="group.quest.extra.worldDmg.quests")
|
||||
.boss-description.p-3(:style="{'border-color': questData.colors.extralight}", @click="sections.worldBoss = !sections.worldBoss")
|
||||
strong.float-left {{ $t('worldBossDescription') }}
|
||||
.float-right
|
||||
|
|
@ -478,6 +482,11 @@
|
|||
height: auto;
|
||||
}
|
||||
|
||||
.rage-strike-active {
|
||||
max-width: 75px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.world-boss-info-button {
|
||||
width: 100%;
|
||||
background-color: $gray-500;
|
||||
|
|
@ -497,7 +506,8 @@ import { TAVERN_ID } from '../../../common/script/constants';
|
|||
import chatMessage from '../chat/chatMessages';
|
||||
import autocomplete from '../chat/autoComplete';
|
||||
import communityGuidelines from './communityGuidelines';
|
||||
import worldBossInfoModal from '../worldBossInfoModal';
|
||||
import worldBossInfoModal from '../world-boss/worldBossInfoModal';
|
||||
import worldBossRageModal from '../world-boss/worldBossRageModal';
|
||||
|
||||
import challengeIcon from 'assets/svg/challenge.svg';
|
||||
import chevronIcon from 'assets/svg/chevron-red.svg';
|
||||
|
|
@ -529,6 +539,7 @@ export default {
|
|||
autocomplete,
|
||||
communityGuidelines,
|
||||
worldBossInfoModal,
|
||||
worldBossRageModal,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
|
@ -731,6 +742,11 @@ export default {
|
|||
showWorldBossInfo () {
|
||||
this.$root.$emit('bv::show::modal', 'world-boss-info');
|
||||
},
|
||||
showWorldBossRage (npc) {
|
||||
if (this.group.quest.extra.worldDmg[npc]) {
|
||||
this.$root.$emit('bv::show::modal', 'world-boss-rage');
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@
|
|||
div
|
||||
ul.list-inline
|
||||
li(v-for='network in SOCIAL_AUTH_NETWORKS')
|
||||
// @TODO this is broken
|
||||
button.btn.btn-primary(v-if='!user.auth[network.key].id', @click='socialAuth(network.key, user)') {{ $t('registerWithSocial', {network: network.name}) }}
|
||||
button.btn.btn-primary(disabled='disabled', v-if='!hasBackupAuthOption(network.key) && user.auth[network.key].id') {{ $t('registeredWithSocial', {network: network.name}) }}
|
||||
button.btn.btn-danger(@click='deleteSocialAuth(network.key)', v-if='hasBackupAuthOption(network.key) && user.auth[network.key].id') {{ $t('detachSocial', {network: network.name}) }}
|
||||
|
|
@ -239,6 +238,10 @@ export default {
|
|||
// @TODO: We may need to request the party here
|
||||
this.party = this.$store.state.party;
|
||||
this.newDayStart = this.user.preferences.dayStart;
|
||||
hello.init({
|
||||
facebook: process.env.FACEBOOK_KEY, // eslint-disable line
|
||||
google: process.env.GOOGLE_CLIENT_ID, // eslint-disable line
|
||||
});
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@
|
|||
)
|
||||
.standard-page
|
||||
div.featuredItems
|
||||
.background(:class="{opened: seasonal.opened}")
|
||||
.background(:class="{opened: seasonal.opened && !broken, broken: broken}")
|
||||
.background(:class="{cracked: broken, broken: broken}")
|
||||
div.npc
|
||||
div.featured-label
|
||||
span.rectangle
|
||||
|
|
@ -32,7 +33,8 @@
|
|||
div.content(v-if="!seasonal.opened")
|
||||
div.featured-label.with-border.closed
|
||||
span.rectangle
|
||||
span.text(v-once, v-html="seasonal.notes")
|
||||
span.text(v-if="!broken", v-html="seasonal.notes")
|
||||
span.text(v-if="broken") {{ $t('seasonalShopBrokenText') }}
|
||||
span.rectangle
|
||||
div.content(v-else-if="seasonal.featured.items.length !== 0")
|
||||
div.featured-label.with-border(v-if='!featuredGearBought')
|
||||
|
|
@ -230,6 +232,18 @@
|
|||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.background.broken {
|
||||
background: url('~assets/images/npc/broken/seasonal_shop_broken_background.png');
|
||||
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.background.cracked {
|
||||
background: url('~assets/images/npc/broken/seasonal_shop_broken_layer.png');
|
||||
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
@ -256,6 +270,11 @@
|
|||
background: url('~assets/images/npc/#{$npc_seasonal_flavor}/seasonal_shop_opened_npc.png');
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.broken .npc {
|
||||
background: url('~assets/images/npc/broken/seasonal_shop_broken_npc.png');
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -348,8 +367,14 @@
|
|||
featuredGearBought: false,
|
||||
|
||||
backgroundUpdate: new Date(),
|
||||
|
||||
broken: false,
|
||||
};
|
||||
},
|
||||
async mounted () {
|
||||
const worldState = await this.$store.dispatch('worldState:getWorldState');
|
||||
this.broken = worldState.worldBoss.extra.worldDmg.seasonalShop;
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
content: 'content',
|
||||
|
|
|
|||
57
website/client/components/world-boss/worldBossRageModal.vue
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<template lang="pug">
|
||||
b-modal#world-boss-rage(title="", :hide-footer="true", :hide-header="true")
|
||||
.modal-header.d-flex.align-items-center.justify-content-center
|
||||
.reduce {{ $t('seasonalShopRageStrikeHeader') }}
|
||||
img.npc-background(src='~assets/images/npc/broken/rage-strike-seasonalShop-scaled@2x.png')
|
||||
.modal-body
|
||||
.row
|
||||
.col-12.text-center.padding-24
|
||||
h2 {{ $t('seasonalShopRageStrikeLead') }}
|
||||
p {{ $t('seasonalShopRageStrikeRecap') }}
|
||||
</template>
|
||||
|
||||
<style>
|
||||
#world-boss-rage .modal-body {
|
||||
padding: 0;
|
||||
width: 376px;
|
||||
}
|
||||
#world-boss-rage .modal-content {
|
||||
width: 378px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang='scss' scoped>
|
||||
.modal-header {
|
||||
background-color: #FA8537;
|
||||
color: white;
|
||||
height: 2em;
|
||||
}
|
||||
|
||||
.npc-background {
|
||||
max-width: 376px;
|
||||
height: auto;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.padding-24 {
|
||||
padding-top: 1em;
|
||||
padding-left: 3em;
|
||||
padding-right: 3em;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
|
||||
.reduce {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
methods: {
|
||||
close () {
|
||||
this.$root.$emit('bv::hide::modal', 'world-boss-rage');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
@ -15,6 +15,7 @@ import * as tags from './tags';
|
|||
import * as hall from './hall';
|
||||
import * as shops from './shops';
|
||||
import * as snackbars from './snackbars';
|
||||
import * as worldState from './world-state';
|
||||
|
||||
// Actions should be named as 'actionName' and can be accessed as 'namespace:actionName'
|
||||
// Example: fetch in user.js -> 'user:fetch'
|
||||
|
|
@ -35,6 +36,7 @@ const actions = flattenAndNamespace({
|
|||
hall,
|
||||
shops,
|
||||
snackbars,
|
||||
worldState,
|
||||
});
|
||||
|
||||
export default actions;
|
||||
|
|
|
|||
7
website/client/store/actions/world-state.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
import axios from 'axios';
|
||||
|
||||
export async function getWorldState () {
|
||||
const url = '/api/v3/world-state';
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
|
@ -34,6 +34,7 @@
|
|||
"seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? They’ll only be available until October 31st!",
|
||||
"seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? They’ll only be available until January 31st!",
|
||||
"seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until October 31... I guess you should to stock up now, or you'll have to wait... and wait... and wait... <strong>*sigh*</strong>",
|
||||
"seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!",
|
||||
"seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.",
|
||||
"candycaneSet": "Candy Cane (Mage)",
|
||||
"skiSet": "Ski-sassin (Rogue)",
|
||||
|
|
|
|||
|
|
@ -662,7 +662,10 @@
|
|||
"questDysheartenerCompletionChat": "`The Dysheartener is DEFEATED!`\n\nTogether, everyone in Habitica strikes a final blow to their tasks, and the Dysheartener rears back, shrieking with dismay. “What's wrong, Dysheartener?” AnnDeLune calls, eyes sparkling. “Feeling discouraged?”\n\nGlowing pink fractures crack across the Dysheartener's carapace, and it shatters in a puff of pink smoke. As a renewed sense of vigor and determination sweeps across the land, a flurry of delightful sweets rains down upon everyone.\n\nThe crowd cheers wildly, hugging each other as their pets happily chew on the belated Valentine's treats. Suddenly, a joyful chorus of song cascades through the air, and gleaming silhouettes soar across the sky.\n\nOur newly-invigorated optimism has attracted a flock of Hopeful Hippogriffs! The graceful creatures alight upon the ground, ruffling their feathers with interest and prancing about. “It looks like we've made some new friends to help keep our spirits high, even when our tasks are daunting,” Lemoness says.\n\nBeffymaroo already has her arms full with feathered fluffballs. “Maybe they'll help us rebuild the damaged areas of Habitica!”\n\nCrooning and singing, the Hippogriffs lead the way as all the Habitcans work together to restore our beloved home.",
|
||||
"questDysheartenerBossRageTitle": "Shattering Heartbreak",
|
||||
"questDysheartenerBossRageDescription": "The Rage Attack gauge fills when Habiticans miss their Dailies. If it fills up, the Dysheartener will unleash its Shattering Heartbreak attack on one of Habitica's shopkeepers, so be sure to do your tasks!",
|
||||
"questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the gazebo that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!",
|
||||
"questDysheartenerBossRageSeasonal": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nOh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.\n\nQuickly, let's keep doing our Dailies so that the beast won't strike again!",
|
||||
"seasonalShopRageStrikeHeader": "The Seasonal Shop was Attacked!",
|
||||
"seasonalShopRageStrikeLead": "Leslie is Heartbroken!",
|
||||
"seasonalShopRageStrikeRecap": "On February 21, our beloved Leslie the Seasonal Sorceress was devastated when the Dysheartener shattered the Seasonal Shop. Quickly, tackle your tasks to defeat the monster and help rebuild!",
|
||||
"questDysheartenerBossRageMarket": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nHelp! After feasting on our incomplete Dailies, the Dysheartener lets out another Shattering Heartbreak attack, smashing the walls and floor of the Market! As stone rains down, Alex the Merchant weeps at his crushed merchandise, stricken by the destruction.\n\nWe can't let this happen again! Be sure to do all our your Dailies to prevent the Dysheartener from using its final strike.",
|
||||
"questDysheartenerBossRageQuests": "`The Dysheartener uses SHATTERING HEARTBREAK!`\n\nAaaah! We've left our Dailies undone again, and the Dysheartener has mustered the energy for one final blow against our beloved shopkeepers. The countryside around Ian the Quest Master is ripped apart by its Shattering Heartbreak attack, and Ian is struck to the core by the horrific vision. We're so close to defeating this monster.... Hurry! Don't stop now!",
|
||||
"questDysheartenerDropHippogriffPet": "Hopeful Hippogriff (Pet)",
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ for (let key in weapon) {
|
|||
|
||||
return `${oldnotes(lang)} ${twoHandedText}`;
|
||||
};
|
||||
item.notes.i18nLangFunc = true; // See https://github.com/HabitRPG/habitica/blob/develop/website/common/script/content/translation.js#L8
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||