diff --git a/package-lock.json b/package-lock.json index 2e3d7dd815..df98b51368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.226.0", + "version": "4.226.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4ed410d8ae..97eb8ee1cb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.226.0", + "version": "4.226.1", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.17.8", diff --git a/website/client/src/assets/scss/animals.scss b/website/client/src/assets/scss/animals.scss index 1bb7ef4277..7b1343523f 100644 --- a/website/client/src/assets/scss/animals.scss +++ b/website/client/src/assets/scss/animals.scss @@ -19,6 +19,11 @@ top: -16px !important; } -.Pet.Pet-FlyingPig-Veggie, .Pet.Pet-FlyingPig-Dessert { +.Pet.Pet-FlyingPig-Veggie, .Pet.Pet-FlyingPig-Dessert, .Pet.Pet-FlyingPig-Virtual { top: -28px !important; } + +.Pet[class*="Virtual"] { + left: 1.25rem; + bottom: 0.5rem; +} diff --git a/website/client/src/components/avatar.vue b/website/client/src/components/avatar.vue index 3199fc37d7..cf070118d2 100644 --- a/website/client/src/components/avatar.vue +++ b/website/client/src/components/avatar.vue @@ -79,7 +79,6 @@ > @@ -131,10 +130,12 @@ import some from 'lodash/some'; import moment from 'moment'; import { mapState } from '@/libs/store'; +import foolPet from '../mixins/foolPet'; import ClassBadge from '@/components/members/classBadge'; export default { + mixins: [foolPet], components: { ClassBadge, }, @@ -243,11 +244,12 @@ export default { petClass () { if (some( this.currentEventList, - event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'invert', + event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'virtual', )) { - return `Pet-${this.member.items.currentPet} invert`; + return this.foolPet(this.member.items.currentPet); } - return `Pet-${this.member.items.currentPet}`; + if (this.member.items.currentPet) return `Pet-${this.member.items.currentPet}`; + return ''; }, }, methods: { diff --git a/website/client/src/components/inventory/stable/petItem.vue b/website/client/src/components/inventory/stable/petItem.vue index 432d364bb8..eb57892e63 100644 --- a/website/client/src/components/inventory/stable/petItem.vue +++ b/website/client/src/components/inventory/stable/petItem.vue @@ -114,11 +114,13 @@ import some from 'lodash/some'; import moment from 'moment'; import { v4 as uuid } from 'uuid'; import { mapState } from '@/libs/store'; +import foolPet from '@/mixins/foolPet'; import { isAllowedToFeed, isHatchable, isOwned, isSpecial, } from '../../../libs/createAnimal'; export default { + mixins: [foolPet], props: { item: { type: Object, @@ -169,9 +171,10 @@ export default { getPetItemClass () { if (this.isOwned() && some( this.currentEventList, - event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'invert', + event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'virtual', )) { - return `Pet Pet-${this.item.key} ${this.item.eggKey} invert`; + const petString = `${this.item.eggKey}-${this.item.key}`; + return `Pet ${this.foolPet(petString)}`; } if (this.isOwned() || (this.mountOwned() && this.isHatchable())) { diff --git a/website/client/src/mixins/foolPet.js b/website/client/src/mixins/foolPet.js new file mode 100644 index 0000000000..6a2c74f9a2 --- /dev/null +++ b/website/client/src/mixins/foolPet.js @@ -0,0 +1,53 @@ +import includes from 'lodash/includes'; + +export default { + methods: { + foolPet (pet) { + const SPECIAL_PETS = [ + 'Wolf-Veteran', + 'Wolf-Cerberus', + 'Dragon-Hydra', + 'Turkey-Base', + 'BearCub-Polar', + 'MantisShrimp-Base', + 'JackOLantern-Base', + 'Mammoth-Base', + 'Tiger-Veteran', + 'Phoenix-Base', + 'Turkey-Gilded', + 'MagicalBee-Base', + 'Lion-Veteran', + 'Gryphon-RoyalPurple', + 'JackOLantern-Ghost', + 'Jackalope-RoyalPurple', + 'Orca-Base', + 'Bear-Veteran', + 'Hippogriff-Hopeful', + 'Fox-Veteran', + 'JackOLantern-Glow', + 'Gryphon-Gryphatrice', + 'JackOLantern-RoyalPurple', + ]; + const BASE_PETS = [ + 'Wolf', + 'TigerCub', + 'PandaCub', + 'LionCub', + 'Fox', + 'FlyingPig', + 'BearCub', + 'Dragon', + 'Cactus', + ]; + if (!pet) return 'Pet-Cactus-Virtual'; + if (SPECIAL_PETS.indexOf(pet) !== -1) { + return 'Pet-Wolf-Virtual'; + } + const species = pet.slice(0, pet.indexOf('-')); + if (includes(BASE_PETS, species)) { + return `Pet-${species}-Virtual`; + } + return 'Pet-Fox-Virtual'; + }, + }, +}; diff --git a/website/common/script/content/constants/events.js b/website/common/script/content/constants/events.js index 4484ae8f9a..32fdcf3734 100644 --- a/website/common/script/content/constants/events.js +++ b/website/common/script/content/constants/events.js @@ -22,6 +22,11 @@ export const EVENTS = { season: 'spring', gear: true, }, + aprilFools2022: { + start: '2022-04-01T08:00-05:00', + end: '2022-04-02T08:00-05:00', + aprilFools: 'virtual', + }, valentines2022: { start: '2022-02-14T08:00-05:00', end: '2022-02-18T20:00-05:00',