From 2f5fd4019de8c76d785cf0dfb47349184a2ac974 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Mon, 9 Jan 2023 16:08:54 -0600 Subject: [PATCH 01/58] fix(admin): don't auto calculate Gem cap also fixes .eslintrc to stop down prop mutations from error level --- website/client/.eslintrc.js | 4 + .../user-support/subscriptionAndPerks.vue | 88 ++++++++++--------- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/website/client/.eslintrc.js b/website/client/.eslintrc.js index 7dc69cc284..56eb1c8668 100644 --- a/website/client/.eslintrc.js +++ b/website/client/.eslintrc.js @@ -14,6 +14,10 @@ module.exports = { // TODO find a way to let eslint understand webpack aliases 'import/no-unresolved': 'off', 'import/extensions': 'off', + 'vue/component-tags-order': ['warn', { + order: [ 'template', 'style', 'script' ], + }], + 'vue/no-mutating-props': 'warn', 'vue/no-v-html': 'off', 'vue/html-self-closing': ['error', { html: { diff --git a/website/client/src/components/admin-panel/user-support/subscriptionAndPerks.vue b/website/client/src/components/admin-panel/user-support/subscriptionAndPerks.vue index 50c3c1b135..8fa3cffb0b 100644 --- a/website/client/src/components/admin-panel/user-support/subscriptionAndPerks.vue +++ b/website/client/src/components/admin-panel/user-support/subscriptionAndPerks.vue @@ -43,42 +43,55 @@
- Months until renewal: + Perk offset months: {{ hero.purchased.plan.consecutive.offset }}
-
- Next Mystic Hourglass: - {{ nextHourglassDate }} -
-
- -
-
- Gem cap: - {{ hero.purchased.plan.consecutive.gemCapExtra + 25 }} -
-
- -
+
+ Next Mystic Hourglass: + {{ nextHourglassDate }} +
+
+ +
+
+ +
+
+ Total Gem cap: + {{ Number(hero.purchased.plan.consecutive.gemCapExtra) + 25 }} +
+
+ +
@@ -139,13 +152,6 @@ export default { return currentPlanContext.nextHourglassDate.format('MMMM'); }, }, - watch: { - 'hero.purchased.plan.consecutive.count' () { // eslint-disable-line object-shorthand - this.hero.purchased.plan.consecutive.gemCapExtra = Math.min( - Math.floor(this.hero.purchased.plan.consecutive.count / 3) * 5, 25, - ); - }, - }, methods: { dateFormat (date) { return moment(date).format('YYYY/MM/DD'); From ecac3f0c5f243fd95ddaa091069d7ddda3803e88 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Fri, 27 Jan 2023 19:26:19 -0600 Subject: [PATCH 02/58] fix(backgrounds): disallow equipping unowned bashground Also add missing headers when recording group task creation --- website/server/controllers/api-v3/tasks/groups.js | 1 + website/server/libs/user/index.js | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index 963fcdbf91..d80e0bb5f2 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -68,6 +68,7 @@ api.createGroupTasks = { category: 'behavior', taskType: task.type, groupID: group._id, + headers: req.headers, }); }); }, diff --git a/website/server/libs/user/index.js b/website/server/libs/user/index.js index 35068ad3f9..4ed618b36f 100644 --- a/website/server/libs/user/index.js +++ b/website/server/libs/user/index.js @@ -97,7 +97,9 @@ function checkPreferencePurchase (user, path, item) { const itemPath = `${path}.${item}`; const appearance = _.get(common.content.appearances, itemPath); if (!appearance) return false; - if (appearance.price === 0) return true; + if (appearance.price === 0 && path !== 'background') { + return true; + } return _.get(user.purchased, itemPath); } From 27964a2d868e50b2064e0d729de2b484588c7c40 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Fri, 27 Jan 2023 19:57:15 -0600 Subject: [PATCH 03/58] fix(analytics): add headers to group task assignment --- website/server/controllers/api-v3/tasks/groups.js | 1 + 1 file changed, 1 insertion(+) diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index d80e0bb5f2..1945ce2dc1 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -256,6 +256,7 @@ api.assignTask = { category: 'behavior', taskType: task.type, groupID: group._id, + headers: req.headers, }); }, }; From dd9e03044fd9856b3feb8433bb5e397ae6c58ca9 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Tue, 31 Jan 2023 10:02:43 -0600 Subject: [PATCH 04/58] chore(subproject): update habitica-images --- habitica-images | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/habitica-images b/habitica-images index ee59cc377a..7203f4633c 160000 --- a/habitica-images +++ b/habitica-images @@ -1 +1 @@ -Subproject commit ee59cc377a7c02b02f1c6697132b167ac1ce6d81 +Subproject commit 7203f4633cc90ede5b2f6745393d54493c487ff6 From cfa85850bf35e9434fe471025ec6a1972052f536 Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:03:06 -0500 Subject: [PATCH 05/58] chore(typos): miscellaneous string fixes (#14414) * fix(string): questVice1Notes html changed to a mobile-device friendly format * fix(strings): updated limited.json with "dateEnd" & "monthYYYY" months & put in chronological order * fix(string): remove extra word from headSpecialSummer2022WarriorNotes * fix(string): corrected armorSpecialSummer2022MageNotes * fix: remove duplicated string and adjust upgrade button style * fix(style): set border radii to 8px on upgrading-group id * fix(payments): remove duplicate entry from another modal * chore(fix): restore string inadvertently removed during a refactor * chore(fix): comma dangle * chore(typo): who knew, that Y was actually important... * chore(typo): fix text in questBewilderNotes * chore(string): clarify polar pets requirements * couple small changes to the footer as pointed out by users * chore(fix): correct name of Fabulous Party Hat --------- Co-authored-by: SabreCat --- website/client/src/components/appFooter.vue | 3 ++- website/common/locales/en/achievements.json | 2 +- website/common/locales/en/gear.json | 4 ++-- website/common/locales/en/questsContent.json | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/website/client/src/components/appFooter.vue b/website/client/src/components/appFooter.vue index 963cd6d9d9..5ba301899a 100644 --- a/website/client/src/components/appFooter.vue +++ b/website/client/src/components/appFooter.vue @@ -224,7 +224,7 @@ >
. Limited Edition 2022 Spring Gear.", diff --git a/website/common/locales/en/questsContent.json b/website/common/locales/en/questsContent.json index 440a2910b1..63b09b9621 100644 --- a/website/common/locales/en/questsContent.json +++ b/website/common/locales/en/questsContent.json @@ -365,7 +365,7 @@ "questSnailUnlockText": "Unlocks Snail Eggs for purchase in the Market", "questBewilderText": "The Be-Wilder", - "questBewilderNotes": "The party begins like any other.

The appetizers are excellent, the music is swinging, and even the dancing elephants have become routine. Habiticans laugh and frolic amid the overflowing floral centerpieces, happy to have a distraction from their least-favorite tasks, and the April Fool whirls among them, eagerly providing an amusing trick here and a witty twist there.

As the Mistiflying clock tower strikes midnight, the April Fool leaps onto the stage to give a speech.

“Friends! Enemies! Tolerant acquaintances! Lend me your ears.” The crowd chuckles as animal ears sprout from their heads, and they pose with their new accessories.

“As you know,” the Fool continues, “my confusing illusions usually only last a single day. But I’m pleased to announce that I’ve discovered a shortcut that will guarantee us non-stop fun, without having to deal with the pesky weight of our responsibilities. Charming Habiticans, meet my magical new friend... the Be-Wilder!”

Lemoness pales suddenly, dropping her hors d'oeuvres. “Wait! Don’t trust--”

But suddenly mists are pouring into the room, glittering and thick, and they swirl around the April Fool, coalescing into cloudy feathers and a stretching neck. The crowd is speechless as an monstrous bird unfolds before them, its wings shimmering with illusions. It lets out a horrible screeching laugh.

“Oh, it has been ages since a Habitican has been foolish enough to summon me! How wonderful it feels, to have a tangible form at last.”

Buzzing in terror, the magic bees of Mistiflying flee the floating city, which sags from the sky. One by one, the brilliant spring flowers wither up and wisp away.

“My dearest friends, why so alarmed?” crows the Be-Wilder, beating its wings. “There’s no need to toil for your rewards any more. I’ll just give you all the things that you desire!”

A rain of coins pours from the sky, hammering into the ground with brutal force, and the crowd screams and flees for cover. “Is this a joke?” Baconsaur shouts, as the gold smashes through windows and shatters roof shingles.

PainterProphet ducks as lightning bolts crackle overhead, and fog blots out the sun. “No! This time, I don’t think it is!”

Quickly, Habiticans, don’t let this World Boss distract us from our goals! Stay focused on the tasks that you need to complete so we can rescue Mistiflying -- and hopefully, ourselves.", + "questBewilderNotes": "The party begins like any other.

The appetizers are excellent, the music is swinging, and even the dancing elephants have become routine. Habiticans laugh and frolic amid the overflowing floral centerpieces, happy to have a distraction from their least-favorite tasks, and the April Fool whirls among them, eagerly providing an amusing trick here and a witty twist there.

As the Mistiflying clock tower strikes midnight, the April Fool leaps onto the stage to give a speech.

“Friends! Enemies! Tolerant acquaintances! Lend me your ears.” The crowd chuckles as animal ears sprout from their heads, and they pose with their new accessories.

“As you know,” the Fool continues, “my confusing illusions usually only last a single day. But I’m pleased to announce that I’ve discovered a shortcut that will guarantee us non-stop fun, without having to deal with the pesky weight of our responsibilities. Charming Habiticans, meet my magical new friend... the Be-Wilder!”

Lemoness pales suddenly, dropping her hors d'oeuvres. “Wait! Don’t trust--”

But suddenly mists are pouring into the room, glittering and thick, and they swirl around the April Fool, coalescing into cloudy feathers and a stretching neck. The crowd is speechless as a monstrous bird unfolds before them, its wings shimmering with illusions. It lets out a horrible screeching laugh.

“Oh, it has been ages since a Habitican has been foolish enough to summon me! How wonderful it feels, to have a tangible form at last.”

Buzzing in terror, the magic bees of Mistiflying flee the floating city, which sags from the sky. One by one, the brilliant spring flowers wither up and wisp away.

“My dearest friends, why so alarmed?” crows the Be-Wilder, beating its wings. “There’s no need to toil for your rewards any more. I’ll just give you all the things that you desire!”

A rain of coins pours from the sky, hammering into the ground with brutal force, and the crowd screams and flees for cover. “Is this a joke?” Baconsaur shouts, as the gold smashes through windows and shatters roof shingles.

PainterProphet ducks as lightning bolts crackle overhead, and fog blots out the sun. “No! This time, I don’t think it is!”

Quickly, Habiticans, don’t let this World Boss distract us from our goals! Stay focused on the tasks that you need to complete so we can rescue Mistiflying -- and hopefully, ourselves.", "questBewilderCompletion": "The Be-Wilder is DEFEATED!

We've done it! The Be-Wilder lets out a ululating cry as it twists in the air, shedding feathers like falling rain. Slowly, gradually, it coils into a cloud of sparkling mist. As the newly-revealed sun pierces the fog, it burns away, revealing the coughing, mercifully human forms of Bailey, Matt, Alex.... and the April Fool himself.

Mistiflying is saved!

The April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”

The crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.

“Er, yes,” the April Fool says. “That is. What I meant to say was, I’m dreadfully sorry.” He heaves a sigh. “I suppose it can’t all be fun and games, after all. It might not hurt to focus occasionally. Maybe I’ll get a head start on next year’s pranking.”

Redphoenix coughs meaningfully.

“I mean, get a head start on this year’s spring cleaning!” the April Fool says. “Nothing to fear, I’ll have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”

Encouraged, the marching band starts up.

It isn’t long before all is back to normal in Habit City. Plus, now that the Be-Wilder has evaporated, the magical bees of Mistiflying bustle back to work, and soon the flowers are blooming and the city is floating once more.

As Habiticans cuddle the magical fuzzy bees, the April Fool’s eyes light up. “Oho, I’ve had a thought! Why don’t you all keep some of these fuzzy Bee Pets and Mounts? It’s a gift that perfectly symbolizes the balance between hard work and sweet rewards, if I’m going to get all boring and allegorical on you.” He winks. “Besides, they don’t have stingers! Fool’s honor.”", "questBewilderCompletionChat": "`The Be-Wilder is DEFEATED!`\n\nWe've done it! The Be-Wilder lets out a ululating cry as it twists in the air, shedding feathers like falling rain. Slowly, gradually, it coils into a cloud of sparkling mist. As the newly-revealed sun pierces the fog, it burns away, revealing the coughing, mercifully human forms of Bailey, Matt, Alex.... and the April Fool himself.\n\n`Mistiflying is saved!`\n\nThe April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”\n\nThe crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.\n\n“Er, yes,” the April Fool says. “That is. What I meant to say was, I’m dreadfully sorry.” He heaves a sigh. “I suppose it can’t all be fun and games, after all. It might not hurt to focus occasionally. Maybe I’ll get a head start on next year’s pranking.”\n\nRedphoenix coughs meaningfully.\n\n“I mean, get a head start on this year’s spring cleaning!” the April Fool says. “Nothing to fear, I’ll have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”\n\nEncouraged, the marching band starts up.\n\nIt isn’t long before all is back to normal in Habit City. Plus, now that the Be-Wilder has evaporated, the magical bees of Mistiflying bustle back to work, and soon the flowers are blooming and the city is floating once more.\n\nAs Habiticans cuddle the magical fuzzy bees, the April Fool’s eyes light up. “Oho, I’ve had a thought! Why don’t you all keep some of these fuzzy Bee Pets and Mounts? It’s a gift that perfectly symbolizes the balance between hard work and sweet rewards, if I’m going to get all boring and allegorical on you.” He winks. “Besides, they don’t have stingers! Fool’s honor.”", "questBewilderBossRageTitle": "Beguilement Strike", From 059269f9b0ddfcb128c97906ca71642b3596c5c0 Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:33:36 -0500 Subject: [PATCH 06/58] chore(content): add February subscriber items (#14466) * chore(content): add February subscriber items * fix(strings): month typo --------- Co-authored-by: SabreCat --- .../assets/css/sprites/spritesmith-main.css | 35 ++++++++++++++++--- website/common/locales/en/gear.json | 6 +++- website/common/locales/en/subscriber.json | 1 + .../script/content/gear/sets/mystery.js | 2 ++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/website/client/src/assets/css/sprites/spritesmith-main.css b/website/client/src/assets/css/sprites/spritesmith-main.css index 4848a5a501..7f3f7c653d 100644 --- a/website/client/src/assets/css/sprites/spritesmith-main.css +++ b/website/client/src/assets/css/sprites/spritesmith-main.css @@ -27660,6 +27660,31 @@ width: 68px; height: 68px; } +.back_mystery_202302 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202302.png'); + width: 114px; + height: 90px; +} +.headAccessory_mystery_202302 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_mystery_202302.png'); + width: 114px; + height: 90px; +} +.shop_back_mystery_202302 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_back_mystery_202302.png'); + width: 68px; + height: 68px; +} +.shop_headAccessory_mystery_202302 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_mystery_202302.png'); + width: 68px; + height: 68px; +} +.shop_set_mystery_202302 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202302.png'); + width: 68px; + height: 68px; +} .broad_armor_mystery_301404 { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png'); width: 90px; @@ -32430,11 +32455,6 @@ width: 68px; height: 68px; } -.shop_weapon_special_Winter2023Rogue { - background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_Winter2023Rogue.png'); - width: 68px; - height: 68px; -} .shop_weapon_special_candycane { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_candycane.png'); width: 68px; @@ -32620,6 +32640,11 @@ width: 68px; height: 68px; } +.shop_weapon_special_winter2023Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2023Rogue.png'); + width: 68px; + height: 68px; +} .shop_weapon_special_winter2023Warrior { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2023Warrior.png'); width: 68px; diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index 54f21216fb..c9ee405725 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -2663,7 +2663,9 @@ "backMystery202206Text": "Sea Sprite Wings", "backMystery202206Notes": "Whimsical wings made of water and waves! Confers no benefit. June 2022 Subscriber Item.", "backMystery202301Text": "Five Tails of Valor", - "backMystery202301Notes": "These fluffy tails contain ethereal power and also a high level of charm! Confers no benefit. January 2023 Subscriber Item.", + "backMystery202301Notes": "These fluffy tails contain ethereal power and also a high level of charm! Confers no benefit. January 2023 Subscriber Item.", + "backMystery202302Text": "Trickster Tabby Tail", + "backMystery202302Notes": "Anytime you wear this tail it's sure to be a frabjous day! Callooh! Callay! Confers no benefit. February 2023 Subscriber Item.", "backSpecialWonderconRedText": "Mighty Cape", "backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.", @@ -2873,6 +2875,8 @@ "headAccessoryMystery202205Notes": "These dazzling horns are as bright as a desert sunset. Confers no benefit. May 2022 Subscriber Item.", "headAccessoryMystery202212Text": "Glacial Tiara", "headAccessoryMystery202212Notes": "Magnify your warmth and friendship to new heights with this ornate golden tiara. Confers no benefit. December 2022 Subscriber Item.", + "headAccessoryMystery202302Text": "Trickster Tabby Ears", + "headAccessoryMystery202302Notes": "The purr-fect accessory to set off your enchanting grin. Confers no benefit. February 2023 Subscriber Item.", "headAccessoryMystery301405Text": "Headwear Goggles", "headAccessoryMystery301405Notes": "\"Goggles are for your eyes,\" they said. \"Nobody wants goggles that you can only wear on your head,\" they said. Hah! You sure showed them! Confers no benefit. August 3015 Subscriber Item.", diff --git a/website/common/locales/en/subscriber.json b/website/common/locales/en/subscriber.json index 977bc08ef2..e8c737be83 100644 --- a/website/common/locales/en/subscriber.json +++ b/website/common/locales/en/subscriber.json @@ -146,6 +146,7 @@ "mysterySet202211": "Electromancer Set", "mysterySet202212": "Glacial Guardian Set", "mysterySet202301": "Valiant Vulpine Set", + "mysterySet202302": "Trickster Tabby Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/script/content/gear/sets/mystery.js b/website/common/script/content/gear/sets/mystery.js index e851da7513..ed445c9e09 100644 --- a/website/common/script/content/gear/sets/mystery.js +++ b/website/common/script/content/gear/sets/mystery.js @@ -97,6 +97,7 @@ const back = { 202205: { }, 202206: { }, 202301: { }, + 202302: { }, }; const body = { @@ -227,6 +228,7 @@ const headAccessory = { 202203: { }, 202212: { }, 202205: { }, + 202302: { }, 301405: { }, }; From 0ca339829f5b7fe9cbe5705ef76c11524ec3ee59 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Tue, 31 Jan 2023 10:35:50 -0600 Subject: [PATCH 07/58] 4.258.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f1464c913..1f1a270bfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.257.0", + "version": "4.258.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f40a00b1df..1c7d06a247 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.257.0", + "version": "4.258.0", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.20.12", From 347038252869dd1f68b5f64a2d8893e5e2ecc05e Mon Sep 17 00:00:00 2001 From: SabreCat Date: Tue, 31 Jan 2023 10:59:53 -0600 Subject: [PATCH 08/58] fix(lint): revert bad lint rule again --- website/client/.eslintrc.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/website/client/.eslintrc.js b/website/client/.eslintrc.js index 56eb1c8668..7dc69cc284 100644 --- a/website/client/.eslintrc.js +++ b/website/client/.eslintrc.js @@ -14,10 +14,6 @@ module.exports = { // TODO find a way to let eslint understand webpack aliases 'import/no-unresolved': 'off', 'import/extensions': 'off', - 'vue/component-tags-order': ['warn', { - order: [ 'template', 'style', 'script' ], - }], - 'vue/no-mutating-props': 'warn', 'vue/no-v-html': 'off', 'vue/html-self-closing': ['error', { html: { From 0f9b6ab59195b1a7f94d931c1a2b621181bf4bb2 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Tue, 31 Jan 2023 10:59:53 -0600 Subject: [PATCH 09/58] fix(lint): revert bad lint rule again --- website/client/.eslintrc.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/website/client/.eslintrc.js b/website/client/.eslintrc.js index 56eb1c8668..7dc69cc284 100644 --- a/website/client/.eslintrc.js +++ b/website/client/.eslintrc.js @@ -14,10 +14,6 @@ module.exports = { // TODO find a way to let eslint understand webpack aliases 'import/no-unresolved': 'off', 'import/extensions': 'off', - 'vue/component-tags-order': ['warn', { - order: [ 'template', 'style', 'script' ], - }], - 'vue/no-mutating-props': 'warn', 'vue/no-v-html': 'off', 'vue/html-self-closing': ['error', { html: { From 96a8c1a41c1c873e61ddf5498e57ebddefae6f2d Mon Sep 17 00:00:00 2001 From: SabreCat Date: Thu, 2 Feb 2023 09:02:05 -0600 Subject: [PATCH 10/58] fix(chat): correctly hide flag counts from non-moderators --- website/server/models/group.js | 1 + 1 file changed, 1 insertion(+) diff --git a/website/server/models/group.js b/website/server/models/group.js index 35e35b3b86..dbf17f3f10 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -403,6 +403,7 @@ schema.statics.toJSONCleanChat = async function groupToJSONCleanChat (group, use if (user._id !== chatMsg.uuid && chatMsg.flagCount >= CHAT_FLAG_LIMIT_FOR_HIDING) { return undefined; } + chatMsg.flagCount = 0; } return chatMsg; From 5f66aa35f23b35f9d6a17f923221708f1bca7965 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Thu, 2 Feb 2023 16:36:44 -0600 Subject: [PATCH 11/58] 4.258.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f1a270bfa..750b931316 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.258.0", + "version": "4.258.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1c7d06a247..be8ff1ce96 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.258.0", + "version": "4.258.1", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.20.12", From a213fb723a5fec779814193b776f15f085ae6ad5 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Fri, 3 Feb 2023 09:23:21 -0600 Subject: [PATCH 12/58] fix(purchases): correct hardcoded date range for Gryph --- website/server/libs/payments/skuItem.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/server/libs/payments/skuItem.js b/website/server/libs/payments/skuItem.js index 89ede4a053..0edb551a35 100644 --- a/website/server/libs/payments/skuItem.js +++ b/website/server/libs/payments/skuItem.js @@ -12,8 +12,8 @@ const RESPONSE_INVALID_ITEM = 'INVALID_ITEM_PURCHASED'; const EVENTS = { birthday10: { - start: '2023-01-23T08:00-05:00', - end: '2023-02-01T23:59-05:00', + start: '2023-01-30T08:00-05:00', + end: '2023-02-08T23:59-05:00', }, }; From c7deb1eb1901dab8093e922cf238bac155c21a7b Mon Sep 17 00:00:00 2001 From: SabreCat Date: Fri, 3 Feb 2023 09:23:27 -0600 Subject: [PATCH 13/58] 4.258.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 750b931316..1e31e889e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.258.1", + "version": "4.258.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index be8ff1ce96..bf15796653 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.258.1", + "version": "4.258.2", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.20.12", From e0a5938711c6a94c417366fea9141743a1196c9d Mon Sep 17 00:00:00 2001 From: SabreCat Date: Mon, 6 Feb 2023 21:34:29 -0600 Subject: [PATCH 14/58] fix(test): update expectations for new flagging logic --- .../chat/POST-groups_id_chat_id_clear_flags.test.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js b/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js index 4bb99cc33f..9f98d73d85 100644 --- a/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js +++ b/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js @@ -66,7 +66,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { type: 'party', privacy: 'private', }, - members: 1, + members: 2, }); await members[0].update({ 'auth.timestamps.created': new Date('2022-01-01') }); @@ -76,12 +76,17 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { await admin.post(`/groups/${group._id}/chat/${privateMessage.id}/flag`); // first test that the flag was actually successful + // author always sees own message; flag count is hidden from non-admins let messages = await members[0].get(`/groups/${group._id}/chat`); - expect(messages[0].flagCount).to.eql(5); + expect(messages[0].flagCount).to.eql(0); + messages = await members[1].get(`/groups/${group._id}/chat`); + expect(messages.length).to.eql(0); + // admin cannot directly request private group chat, but after unflag, + // message should be revealed again and still have flagCount of 0 await admin.post(`/groups/${group._id}/chat/${privateMessage.id}/clearflags`); - - messages = await members[0].get(`/groups/${group._id}/chat`); + messages = await members[1].get(`/groups/${group._id}/chat`); + expect(messages.length).to.eql(1); expect(messages[0].flagCount).to.eql(0); }); From 0335eb1f7ec315a67d12a95abfe73a8dccd8b667 Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Tue, 7 Feb 2023 10:12:19 -0500 Subject: [PATCH 15/58] chore(content): add February backgrounds and Enchanted Armoire Items (#14482) * chore(content): add February backgrounds and Enchanted Armoire Items * fix(test): birthday week adjustment * fix(strings): . * fix(strings): correct background tokens --------- Co-authored-by: SabreCat Co-authored-by: Sabe Jones --- habitica-images | 2 +- test/api/unit/libs/payments/skuItem.test.js | 2 +- .../assets/css/sprites/spritesmith-main.css | 65 +++++++++++++++++++ website/common/locales/en/backgrounds.json | 8 +++ website/common/locales/en/gear.json | 9 ++- .../script/content/appearance/backgrounds.js | 5 ++ .../script/content/gear/sets/armoire.js | 13 ++++ 7 files changed, 100 insertions(+), 4 deletions(-) diff --git a/habitica-images b/habitica-images index 7203f4633c..7051701604 160000 --- a/habitica-images +++ b/habitica-images @@ -1 +1 @@ -Subproject commit 7203f4633cc90ede5b2f6745393d54493c487ff6 +Subproject commit 7051701604ff6ea246bf96995f4869ca95696d88 diff --git a/test/api/unit/libs/payments/skuItem.test.js b/test/api/unit/libs/payments/skuItem.test.js index bc4bbb5c94..41aa180faf 100644 --- a/test/api/unit/libs/payments/skuItem.test.js +++ b/test/api/unit/libs/payments/skuItem.test.js @@ -23,7 +23,7 @@ describe('payments/skuItems', () => { describe('#gryphatrice', () => { const sku = 'Pet-Gryphatrice-Jubilant'; it('returns true during birthday week', () => { - clock = sinon.useFakeTimers(new Date('2023-01-29')); + clock = sinon.useFakeTimers(new Date('2023-01-31')); expect(canBuySkuItem(sku, user)).to.be.true; }); it('returns false outside of birthday week', () => { diff --git a/website/client/src/assets/css/sprites/spritesmith-main.css b/website/client/src/assets/css/sprites/spritesmith-main.css index 7f3f7c653d..e20700e5c5 100644 --- a/website/client/src/assets/css/sprites/spritesmith-main.css +++ b/website/client/src/assets/css/sprites/spritesmith-main.css @@ -945,6 +945,11 @@ width: 141px; height: 147px; } +.background_fancy_bedroom { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_fancy_bedroom.png'); + width: 141px; + height: 147px; +} .background_fantastical_shoe_store { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_fantastical_shoe_store.png'); width: 141px; @@ -1164,6 +1169,11 @@ width: 141px; height: 147px; } +.background_golden_birdcage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_golden_birdcage.png'); + width: 141px; + height: 147px; +} .background_gorgeous_greenhouse { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_gorgeous_greenhouse.png'); width: 141px; @@ -1319,6 +1329,11 @@ width: 141px; height: 147px; } +.background_in_front_of_fountain { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_in_front_of_fountain.png'); + width: 141px; + height: 147px; +} .background_in_the_armory { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_in_the_armory.png'); width: 141px; @@ -2586,6 +2601,11 @@ width: 68px; height: 68px; } +.icon_background_fancy_bedroom { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_fancy_bedroom.png'); + width: 68px; + height: 68px; +} .icon_background_fantastical_shoe_store { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_fantastical_shoe_store.png'); width: 68px; @@ -2805,6 +2825,11 @@ width: 68px; height: 68px; } +.icon_background_golden_birdcage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_golden_birdcage.png'); + width: 68px; + height: 68px; +} .icon_background_gorgeous_greenhouse { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_gorgeous_greenhouse.png'); width: 68px; @@ -2960,6 +2985,11 @@ width: 68px; height: 68px; } +.icon_background_in_front_of_fountain { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_in_front_of_fountain.png'); + width: 68px; + height: 68px; +} .icon_background_in_the_armory { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_in_the_armory.png'); width: 68px; @@ -18660,6 +18690,11 @@ width: 114px; height: 90px; } +.broad_armor_armoire_teaGown { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_teaGown.png'); + width: 114px; + height: 90px; +} .broad_armor_armoire_vermilionArcherArmor { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_vermilionArcherArmor.png'); width: 90px; @@ -19100,6 +19135,11 @@ width: 90px; height: 90px; } +.head_armoire_teaHat { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_teaHat.png'); + width: 114px; + height: 90px; +} .head_armoire_toqueBlanche { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_toqueBlanche.png'); width: 114px; @@ -19465,6 +19505,11 @@ width: 114px; height: 87px; } +.shield_armoire_teaKettle { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_teaKettle.png'); + width: 114px; + height: 90px; +} .shield_armoire_treasureMap { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_treasureMap.png'); width: 114px; @@ -19900,6 +19945,11 @@ width: 68px; height: 68px; } +.shop_armor_armoire_teaGown { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_teaGown.png'); + width: 68px; + height: 68px; +} .shop_armor_armoire_vermilionArcherArmor { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_vermilionArcherArmor.png'); width: 68px; @@ -20355,6 +20405,11 @@ width: 68px; height: 68px; } +.shop_head_armoire_teaHat { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_teaHat.png'); + width: 68px; + height: 68px; +} .shop_head_armoire_toqueBlanche { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_toqueBlanche.png'); width: 68px; @@ -20720,6 +20775,11 @@ width: 68px; height: 68px; } +.shop_shield_armoire_teaKettle { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_teaKettle.png'); + width: 68px; + height: 68px; +} .shop_shield_armoire_treasureMap { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_treasureMap.png'); width: 68px; @@ -21615,6 +21675,11 @@ width: 114px; height: 90px; } +.slim_armor_armoire_teaGown { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_teaGown.png'); + width: 114px; + height: 90px; +} .slim_armor_armoire_vermilionArcherArmor { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_vermilionArcherArmor.png'); width: 90px; diff --git a/website/common/locales/en/backgrounds.json b/website/common/locales/en/backgrounds.json index 5abbb901a2..7825d8edb2 100644 --- a/website/common/locales/en/backgrounds.json +++ b/website/common/locales/en/backgrounds.json @@ -851,6 +851,14 @@ "backgroundWinterLakeWithSwansText": "Winter Lake With Swans", "backgroundWinterLakeWithSwansNotes": "Enjoy Nature at a Winter Lake With Swans.", + "backgrounds022023": " SET 105: Released February 2022", + "backgroundInFrontOfFountainText": "In Front of a Fountain", + "backgroundInFrontOfFountainNotes": "Stroll In Front of a Fountain.", + "backgroundGoldenBirdcageText": "Golden Birdcage", + "backgroundGoldenBirdcageNotes": "Hide out in a Golden Birdcage.", + "backgroundFancyBedroomText": "Fancy Bedroom", + "backgroundFancyBedroomNotes": "Luxuriate in a Fancy Bedroom.", + "timeTravelBackgrounds": "Steampunk Backgrounds", "backgroundAirshipText": "Airship", "backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.", diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index c9ee405725..c02f62d6c3 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -1428,7 +1428,9 @@ "armorArmoireJewelersApronNotes": "This heavy-duty apron is just the thing to wear when you feel creative. Best of all, there are dozens of small pockets to hold everything you need. Increases Intelligence by <%= int %>. Enchanted Armoire: Jeweler Set (Item 1 of 4).", "armorArmoireShawlCollarCoatText": "Shawl-Collar Coat", "armorArmoireShawlCollarCoatNotes": "A wise wizard once said there’s nothing better than being both cozy and productive! Wear this warm and stylish coat as you conquer the year’s challenges. Increases Constitution by <%= con %>. Enchanted Armoire: Independent Item.", - + "armorArmoireTeaGownText": "Tea Party Gown", + "armorArmoireTeaGownNotes": "You’re resilient, creative, brilliant, and so fashionable! Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Tea Party Set (Item 1 of 3).", + "headgear": "helm", "headgearCapitalized": "Headgear", @@ -2189,6 +2191,8 @@ "headArmoireStrawRainHatNotes": "You’ll be able to spot every obstacle in your path when you wear this water-resistant, conical hat. Increases Perception by <%= per %>. Enchanted Armoire: Straw Raincoat Set (Item 2 of 2).", "headArmoireFancyPirateHatText": "Fancy Pirate Hat", "headArmoireFancyPirateHatNotes": "Be protected from the sun and any seagulls flying overhead as you drink tea on the deck of your ship. Increases Perception by <%= per %>. Enchanted Armoire: Fancy Pirate Set (Item 2 of 3).", + "headArmoireTeaHatText": "Tea Party Hat", + "headArmoireTeaHatNotes": "This elegant hat is both fancy and functional. Increases Perception by <%= per %>. Enchanted Armoire: Tea Party Set (Item 2 of 3).", "offhand": "off-hand item", "offHandCapitalized": "Off-Hand Item", @@ -2595,7 +2599,8 @@ "shieldArmoireBubblingCauldronNotes": "The perfect cauldron for brewing up a productivity potion or cooking a savory soup. In fact, there is little difference between the two! Increases Constitution by <%= con %>. Enchanted Armoire: Cooking Implements Set (Item 2 of 2).", "shieldArmoireJewelersPliersText": "Jeweler's Pliers", "shieldArmoireJewelersPliersNotes": "They cut, twist, pinch, and more. This tool can help you create whatever you can imagine. Increases Strength by <%= str %>. Enchanted Armoire: Jeweler Set (Item 3 of 4).", - + "shieldArmoireTeaKettleText": "Tea Kettle", + "shieldArmoireTeaKettleNotes": "All your favorite, flavorful teas can be brewed in this kettle. Are you in the mood for black tea, green tea, oolong, or perhaps an herbal infusion? Increases Constitution by <%= con %>. Enchanted Armoire: Tea Party Set (Item 3 of 3).", "back": "Back Accessory", "backBase0Text": "No Back Accessory", diff --git a/website/common/script/content/appearance/backgrounds.js b/website/common/script/content/appearance/backgrounds.js index 49e8daabc9..452855ea81 100644 --- a/website/common/script/content/appearance/backgrounds.js +++ b/website/common/script/content/appearance/backgrounds.js @@ -540,6 +540,11 @@ const backgrounds = { snowy_temple: { }, winter_lake_with_swans: { }, }, + backgrounds022023: { + in_front_of_fountain: { }, + golden_birdcage: { }, + fancy_bedroom: { }, + }, eventBackgrounds: { birthday_bash: { price: 0, diff --git a/website/common/script/content/gear/sets/armoire.js b/website/common/script/content/gear/sets/armoire.js index 58170d6a9c..c79e433e7b 100644 --- a/website/common/script/content/gear/sets/armoire.js +++ b/website/common/script/content/gear/sets/armoire.js @@ -411,6 +411,11 @@ const armor = { shawlCollarCoat: { con: 8, }, + teaGown: { + str: 5, + int: 5, + set: 'teaParty', + }, }; const body = { @@ -832,6 +837,10 @@ const head = { per: 8, set: 'fancyPirate', }, + teaHat: { + per: 10, + set: 'teaParty', + }, }; const shield = { @@ -1133,6 +1142,10 @@ const shield = { str: 10, set: 'jewelers', }, + teaKettle: { + con: 10, + set: 'teaParty', + }, }; const headAccessory = { From 1de2adf301ea5520ae690d53e7b9841b1b7003a3 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Tue, 7 Feb 2023 09:11:52 -0600 Subject: [PATCH 16/58] 4.259.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e31e889e6..e2b06a9914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.258.2", + "version": "4.259.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bf15796653..f5c9da55c7 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.258.2", + "version": "4.259.0", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.20.12", From 0b8f2bc58e796e5cfe4ca2afc26e74343083992a Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Wed, 8 Feb 2023 16:04:30 -0500 Subject: [PATCH 17/58] update(content): revise community guidelines (#14481) * update(content); revise community guidelines * fix(CG): remove outdated spoiler advice, remove unneeded string token * chore(CG): update date line to intended publication --------- Co-authored-by: SabreCat --- .../images/community-guidelines/staff.png | Bin 7543 -> 8744 bytes .../components/static/communityGuidelines.vue | 61 ++++++++++-------- .../locales/en/communityGuidelines.json | 58 ++++++++--------- 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/website/client/src/assets/images/community-guidelines/staff.png b/website/client/src/assets/images/community-guidelines/staff.png index 734b173d73cb7084be902445e2fbd41228f436f6..47ab2b2e197f498101fcf709d360af52b89d7442 100644 GIT binary patch literal 8744 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

{{ $t('communityGuidelines') }}


-

{{ $t('lastUpdated') }} July 28, 2021

+

{{ $t('lastUpdated') }} February 8, 2023

{{ $t('commGuideHeadingWelcome') }}

@@ -21,6 +21,7 @@

    +
  • @@ -32,6 +33,7 @@
-
  • @@ -176,50 +177,53 @@

    {{ $t('commGuideHeadingMeet') }}

    -

    -

      -
    • {{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}
    • +
    • + {{ $t('commGuideAKA', {habitName: 'heyeilatan', realName: 'Natalie'}) }} + ({{ $t('commGuideOnGitHub', {gitHubName: 'CuriousMagpie'}) }}) + - Web Developer +
    • +
    • + {{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }} + - Mobile Developer +
    • {{ $t('commGuideAKA', {habitName: 'redphoenix', realName: 'Vicky'}) }} ({{ $t('commGuideOnGitHub', {gitHubName: 'veeeeeee'}) }}) + - Co-Founder +
    • +
    • + {{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }} + - Art, Community Management, Many Hats +
    • +
    • + {{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Sabe'}) }} + - Web Developer +
    • +
    • + {{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }} + - Designer +
    • +
    • + {{ $t('commGuideAKA', {habitName: 'Piyo', realName: 'Sara'}) }} + - Mobile Designer
    • -
    • {{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }}
    • -
    • {{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Sabe'}) }}
    • -
    • {{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }}
    • -
    • {{ $t('commGuideAKA', {habitName: 'Piyo', realName: 'Sara'}) }}
    -

    -
    - -
    -

    -
      -
    • Dewines
    • -
    • Nakonana
    • -
    • Cantras
    • -
    • Alys (LadyAlys {{ $t('commGuidePara011c') }})
    • -
    • Fox_town
    • -
    • MaybeSteveRogers
    • -
    • shanaqui
    • -
    • deilann (not yet pictured)
    • -
    -
    -
    -

    {{ $t('commGuidePara014') }}
    Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8, - Breadstrings, Megan, Blade, and Daniel the Bard + Breadstrings, Megan, Blade, Daniel the Bard, deilann, shanaqui, Nakonana, + Dewines, Alys, Fox_town, MaybeSteveRogers, and Cantras. +

    @@ -815,7 +822,7 @@ export default { ...mapState({ user: 'user.data' }), ...mapState(['isUserLoaded']), getDataDisplayToolUrl () { - const base = 'https://oldgods.net/habitrpg/habitrpg_user_data_display.html'; + const base = 'https://tools.habitica.com/'; if (!this.user) return null; return `${base}?uuid=${this.user._id}`; }, diff --git a/website/client/src/components/groups/tavern.vue b/website/client/src/components/groups/tavern.vue index 75ed9d2062..4901d79b22 100644 --- a/website/client/src/components/groups/tavern.vue +++ b/website/client/src/components/groups/tavern.vue @@ -340,7 +340,7 @@
  • {{ $t('dataDisplayTool') }}
  • diff --git a/website/common/locales/en/front.json b/website/common/locales/en/front.json index 2f9b23eb38..6634564653 100644 --- a/website/common/locales/en/front.json +++ b/website/common/locales/en/front.json @@ -179,5 +179,6 @@ "signup": "Sign Up", "getStarted": "Get Started!", "mobileApps": "Mobile Apps", - "learnMore": "Learn More" + "learnMore": "Learn More", + "translateHabitica": "Translate Habitica" } From 8f4d668b0f7aac74127b4599652cf7fffd40b716 Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Mon, 13 Feb 2023 00:17:09 -0500 Subject: [PATCH 21/58] chore(content): add pet quest bundle and magic hatching potions for February (#14499) --- website/common/script/content/bundles.js | 3 ++- .../common/script/content/constants/events.js | 18 ++++++++++++++++-- .../common/script/content/hatching-potions.js | 14 ++++++++++++-- .../script/content/shop-featuredItems.js | 18 +++++++++--------- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/website/common/script/content/bundles.js b/website/common/script/content/bundles.js index 8214d474a6..fef5a84ca2 100644 --- a/website/common/script/content/bundles.js +++ b/website/common/script/content/bundles.js @@ -194,8 +194,9 @@ const bundles = { 'seaserpent', 'gryphon', ], + event: EVENTS.bundle202302, canBuy () { - return moment().isBefore('2022-02-28T20:00-05:00'); + return moment().isBetween(EVENTS.bundle202302.start, EVENTS.bundle202302.end); }, type: 'quests', value: 7, diff --git a/website/common/script/content/constants/events.js b/website/common/script/content/constants/events.js index 192c8578f2..fbb8339e26 100644 --- a/website/common/script/content/constants/events.js +++ b/website/common/script/content/constants/events.js @@ -10,11 +10,25 @@ const gemsPromo = { export const EVENTS = { noEvent: { - start: '2023-02-08T23:59-05:00', - end: '2023-02-14T08:00-05:00', + start: '2023-02-28T23:59-05:00', + end: '2023-03-21T08:00-05:00', season: 'normal', npcImageSuffix: '', }, + bundle202302: { + start: '2023-02-13T08:00-05:00', + end: '2023-02-28T23:59-05:00', + }, + potions202302:{ + start: '2023-02-21T08:00-05:00', + end: '2023-02-28T23:59-05:00', + }, + valentines2023: { + start: '2023-02-13T08:00-05:00', + end: '2023-02-17T23:59-05:00', + season: 'valentines', + npcImageSuffix: 'valentines', + }, birthday10: { start: '2023-01-30T08:00-05:00', end: '2023-02-08T23:59-05:00', diff --git a/website/common/script/content/hatching-potions.js b/website/common/script/content/hatching-potions.js index 2d45722a9a..c2530afe91 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -62,8 +62,13 @@ const premium = { value: 2, text: t('hatchingPotionCupid'), limited: true, + event: EVENTS.potions202302, + _addlNotes: t('eventAvailabilityReturning', { + availableDate: t('dateEndFebruary'), + previousDate: t('februaryYYYY', { year: 2022 }), + }), canBuy () { - return moment().isBefore('2022-02-28T20:00-05:00'); + return moment().isBetween(EVENTS.potions202302.start, EVENTS.potions202302.end); }, }, Shimmer: { @@ -278,8 +283,13 @@ const premium = { value: 2, text: t('hatchingPotionRoseQuartz'), limited: true, + event: EVENTS.potions202302, + _addlNotes: t('eventAvailabilityReturning', { + availableDate: t('dateEndFebruary'), + previousDate: t('februaryYYYY', { year: 2022 }), + }), canBuy () { - return moment().isBefore('2022-02-28T20:00-05:00'); + return moment().isBetween(EVENTS.potions202302.start, EVENTS.potions202302.end); }, }, Celestial: { diff --git a/website/common/script/content/shop-featuredItems.js b/website/common/script/content/shop-featuredItems.js index 44ae32f7f7..dcf159a42c 100644 --- a/website/common/script/content/shop-featuredItems.js +++ b/website/common/script/content/shop-featuredItems.js @@ -5,7 +5,7 @@ import { EVENTS } from './constants'; // path: 'premiumHatchingPotions.Rainbow', const featuredItems = { market () { - if (moment().isBetween(EVENTS.winter2023.start, EVENTS.winter2023.end)) { + if (moment().isBetween(EVENTS.potions202302.start, EVENTS.potions202302.end)) { return [ { type: 'armoire', @@ -13,15 +13,15 @@ const featuredItems = { }, { type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.StarryNight', + path: 'premiumHatchingPotions.RoseQuartz', }, { type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.Holly', + path: 'premiumHatchingPotions.Cupid', }, { - type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.Aurora', + type: 'hatchingPotions', + path: 'hatchingPotions.CottonCandyPink', }, ]; } @@ -45,19 +45,19 @@ const featuredItems = { ]; }, quests () { - if (moment().isBetween(EVENTS.winter2023.start, EVENTS.winter2023.end)) { + if (moment().isBetween(EVENTS.bundle202302.start, EVENTS.bundle202302.end)) { return [ { type: 'bundles', - path: 'bundles.winterQuests', + path: 'bundles.mythicalMarvels', }, { type: 'quests', - path: 'quests.whale', + path: 'quests.treeling', }, { type: 'quests', - path: 'quests.turtle', + path: 'quests.rock', }, ]; } From a73e4d399eda4060c4cb71281f09d44287a79f9e Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Mon, 13 Feb 2023 00:17:56 -0500 Subject: [PATCH 22/58] chore(content): add Pink Marble Magic Hatching Potion (#14497) * chore(content): add quest text * chore(content): add rest of potion quest content * fix(image): pad quest scroll image * feat(quest): add Rage action --------- Co-authored-by: SabreCat --- habitica-images | 2 +- .../assets/css/sprites/spritesmith-main.css | 195 ++++++++++++++++++ website/common/locales/en/content.json | 1 + website/common/locales/en/questsContent.json | 12 +- .../common/script/content/hatching-potions.js | 7 + .../common/script/content/quests/potions.js | 39 ++++ 6 files changed, 254 insertions(+), 2 deletions(-) diff --git a/habitica-images b/habitica-images index 7051701604..5cc03160b5 160000 --- a/habitica-images +++ b/habitica-images @@ -1 +1 @@ -Subproject commit 7051701604ff6ea246bf96995f4869ca95696d88 +Subproject commit 5cc03160b57bb3e0fbb7b75543fcd01c2c136883 diff --git a/website/client/src/assets/css/sprites/spritesmith-main.css b/website/client/src/assets/css/sprites/spritesmith-main.css index e20700e5c5..2ac6f4a821 100644 --- a/website/client/src/assets/css/sprites/spritesmith-main.css +++ b/website/client/src/assets/css/sprites/spritesmith-main.css @@ -35473,6 +35473,11 @@ width: 190px; height: 183px; } +.quest_pinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_pinkMarble.png'); + width: 219px; + height: 219px; +} .quest_pterodactyl { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_pterodactyl.png'); width: 219px; @@ -36253,6 +36258,11 @@ width: 68px; height: 68px; } +.inventory_quest_scroll_pinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/inventory_quest_scroll_pinkMarble.png'); + width: 68px; + height: 68px; +} .inventory_quest_scroll_pterodactyl { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/inventory_quest_scroll_pterodactyl.png'); width: 68px; @@ -37603,6 +37613,11 @@ width: 105px; height: 105px; } +.Mount_Body_BearCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_BearCub-Polar { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_BearCub-Polar.png'); width: 105px; @@ -38028,6 +38043,11 @@ width: 105px; height: 105px; } +.Mount_Body_Cactus-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_Cactus-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Cactus-PolkaDot.png'); width: 105px; @@ -38548,6 +38568,11 @@ width: 105px; height: 105px; } +.Mount_Body_Dragon-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_Dragon-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dragon-PolkaDot.png'); width: 105px; @@ -38968,6 +38993,11 @@ width: 105px; height: 105px; } +.Mount_Body_FlyingPig-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_FlyingPig-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_FlyingPig-PolkaDot.png'); width: 105px; @@ -39238,6 +39268,11 @@ width: 105px; height: 105px; } +.Mount_Body_Fox-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_Fox-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Fox-PolkaDot.png'); width: 105px; @@ -39898,6 +39933,11 @@ width: 105px; height: 105px; } +.Mount_Body_LionCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_LionCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_LionCub-PolkaDot.png'); width: 105px; @@ -40388,6 +40428,11 @@ width: 105px; height: 105px; } +.Mount_Body_PandaCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_PandaCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_PandaCub-PolkaDot.png'); width: 105px; @@ -41613,6 +41658,11 @@ width: 105px; height: 105px; } +.Mount_Body_TigerCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Body_TigerCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_TigerCub-PolkaDot.png'); width: 105px; @@ -42193,6 +42243,11 @@ width: 135px; height: 135px; } +.Mount_Body_Wolf-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-PinkMarble.png'); + width: 135px; + height: 135px; +} .Mount_Body_Wolf-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Wolf-PolkaDot.png'); width: 135px; @@ -42713,6 +42768,11 @@ width: 105px; height: 105px; } +.Mount_Head_BearCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_BearCub-Polar { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_BearCub-Polar.png'); width: 105px; @@ -43138,6 +43198,11 @@ width: 105px; height: 105px; } +.Mount_Head_Cactus-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_Cactus-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Cactus-PolkaDot.png'); width: 105px; @@ -43658,6 +43723,11 @@ width: 105px; height: 105px; } +.Mount_Head_Dragon-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_Dragon-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dragon-PolkaDot.png'); width: 105px; @@ -44078,6 +44148,11 @@ width: 105px; height: 105px; } +.Mount_Head_FlyingPig-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_FlyingPig-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_FlyingPig-PolkaDot.png'); width: 105px; @@ -44348,6 +44423,11 @@ width: 105px; height: 105px; } +.Mount_Head_Fox-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_Fox-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Fox-PolkaDot.png'); width: 105px; @@ -45008,6 +45088,11 @@ width: 105px; height: 105px; } +.Mount_Head_LionCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_LionCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_LionCub-PolkaDot.png'); width: 105px; @@ -45498,6 +45583,11 @@ width: 105px; height: 105px; } +.Mount_Head_PandaCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_PandaCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_PandaCub-PolkaDot.png'); width: 105px; @@ -46723,6 +46813,11 @@ width: 105px; height: 105px; } +.Mount_Head_TigerCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-PinkMarble.png'); + width: 105px; + height: 105px; +} .Mount_Head_TigerCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_TigerCub-PolkaDot.png'); width: 105px; @@ -47303,6 +47398,11 @@ width: 135px; height: 135px; } +.Mount_Head_Wolf-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-PinkMarble.png'); + width: 135px; + height: 135px; +} .Mount_Head_Wolf-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Wolf-PolkaDot.png'); width: 135px; @@ -47828,6 +47928,11 @@ width: 81px; height: 99px; } +.Mount_Icon_BearCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_BearCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_BearCub-Polar { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_BearCub-Polar.png'); width: 81px; @@ -48253,6 +48358,11 @@ width: 81px; height: 99px; } +.Mount_Icon_Cactus-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Cactus-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_Cactus-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Cactus-PolkaDot.png'); width: 81px; @@ -48773,6 +48883,11 @@ width: 81px; height: 99px; } +.Mount_Icon_Dragon-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Dragon-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_Dragon-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Dragon-PolkaDot.png'); width: 81px; @@ -49193,6 +49308,11 @@ width: 81px; height: 99px; } +.Mount_Icon_FlyingPig-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_FlyingPig-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_FlyingPig-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_FlyingPig-PolkaDot.png'); width: 81px; @@ -49463,6 +49583,11 @@ width: 81px; height: 99px; } +.Mount_Icon_Fox-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Fox-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_Fox-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Fox-PolkaDot.png'); width: 81px; @@ -50128,6 +50253,11 @@ width: 81px; height: 99px; } +.Mount_Icon_LionCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_LionCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_LionCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_LionCub-PolkaDot.png'); width: 81px; @@ -50618,6 +50748,11 @@ width: 81px; height: 99px; } +.Mount_Icon_PandaCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_PandaCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_PandaCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_PandaCub-PolkaDot.png'); width: 81px; @@ -51843,6 +51978,11 @@ width: 81px; height: 99px; } +.Mount_Icon_TigerCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_TigerCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_TigerCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_TigerCub-PolkaDot.png'); width: 81px; @@ -52423,6 +52563,11 @@ width: 81px; height: 99px; } +.Mount_Icon_Wolf-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Wolf-PinkMarble.png'); + width: 81px; + height: 99px; +} .Mount_Icon_Wolf-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Icon_Wolf-PolkaDot.png'); width: 81px; @@ -52953,6 +53098,11 @@ width: 81px; height: 99px; } +.Pet-BearCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-BearCub-Polar { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Polar.png'); width: 81px; @@ -53393,6 +53543,11 @@ width: 81px; height: 99px; } +.Pet-Cactus-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-Cactus-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-PolkaDot.png'); width: 81px; @@ -53933,6 +54088,11 @@ width: 81px; height: 99px; } +.Pet-Dragon-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-Dragon-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-PolkaDot.png'); width: 81px; @@ -54368,6 +54528,11 @@ width: 81px; height: 99px; } +.Pet-FlyingPig-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-FlyingPig-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-PolkaDot.png'); width: 81px; @@ -54653,6 +54818,11 @@ width: 81px; height: 99px; } +.Pet-Fox-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-Fox-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-PolkaDot.png'); width: 81px; @@ -55333,6 +55503,11 @@ width: 81px; height: 99px; } +.Pet-LionCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-LionCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-PolkaDot.png'); width: 81px; @@ -55838,6 +56013,11 @@ width: 81px; height: 99px; } +.Pet-PandaCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-PandaCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-PolkaDot.png'); width: 81px; @@ -57088,6 +57268,11 @@ width: 81px; height: 99px; } +.Pet-TigerCub-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-TigerCub-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-PolkaDot.png'); width: 81px; @@ -57688,6 +57873,11 @@ width: 81px; height: 99px; } +.Pet-Wolf-PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-PinkMarble.png'); + width: 81px; + height: 99px; +} .Pet-Wolf-PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-PolkaDot.png'); width: 81px; @@ -58023,6 +58213,11 @@ width: 68px; height: 68px; } +.Pet_HatchingPotion_PinkMarble { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_PinkMarble.png'); + width: 68px; + height: 68px; +} .Pet_HatchingPotion_PolkaDot { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_PolkaDot.png'); width: 68px; diff --git a/website/common/locales/en/content.json b/website/common/locales/en/content.json index 2b0fe859ce..21af836eba 100644 --- a/website/common/locales/en/content.json +++ b/website/common/locales/en/content.json @@ -310,6 +310,7 @@ "hatchingPotionOnyx": "Onyx", "hatchingPotionVirtualPet": "Virtual Pet", "hatchingPotionPorcelain": "Porcelain", + "hatchingPotionPinkMarble": "Pink Marble", "hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.", "premiumPotionAddlNotes": "Not usable on quest pet eggs. Available for purchase until <%= date(locale) %>.", diff --git a/website/common/locales/en/questsContent.json b/website/common/locales/en/questsContent.json index 63b09b9621..8db64cb804 100644 --- a/website/common/locales/en/questsContent.json +++ b/website/common/locales/en/questsContent.json @@ -877,5 +877,15 @@ "questVirtualPetRageDescription": "This bar fills when you don't complete your Dailies. When it is full, the Wotchimon will take away some of your party's pending damage!", "questVirtualPetRageEffect": "`Wotchimon uses Bothersome Beep!` Wotchimon sounds a bothersome beep, and its happiness bar suddenly disappears! Pending damage reduced.", "questVirtualPetDropVirtualPetPotion": "Virtual Pet Hatching Potion", - "questVirtualPetUnlockText": "Unlocks Virtual Pet Hatching Potion for purchase in the Market" + "questVirtualPetUnlockText": "Unlocks Virtual Pet Hatching Potion for purchase in the Market", + + "questPinkMarbleText": "Calm the Corrupted Cupid", + "questPinkMarbleNotes": "After hearing rumors about a cave in the Meandering Mountains that has pink rocks and dust shooting out of it, your party starts to investigate. As you approach the cave, there is indeed a huge pink dust cloud – and strangely, you hear a tiny voice's battle cry, followed by the sound of shattering rock.

    @Empress42 accidentally inhales some of the dust and suddenly feels dreamy and less productive. “Same here!” says @QuartzFox, “I'm suddenly fantasizing about a person that I barely know!”

    @a_diamond peeks into the cave and finds a little being zipping around and smashing pink marbled rock to dust. “Take cover! This Cupid has been corrupted and is using his magic to cause limerence and unrealistic infatuations! We have to subdue him!”", + "questPinkMarbleCompletion": "You manage to pin the little guy down at last – he was much tougher and faster than expected. Before he stirs again, you take away his quiver of glowing arrows. He blinks and suddenly looks around in surprise. “To escape my own sorrow and heartbreak for a while I pricked myself with one of my arrows… I don't remember anything after that!”

    He is just about to flee the cave, notices that @Loremi has taken a sample of the marble dust and grins. “Try using some of this pink marble dust in a potion! Nurture the pets that hatch from it and you will find that real relationships are born from communication, mutual trust and care. I wish you luck, and I wish you love!”", + "questPinkMarbleBoss": "Cupido", + "questPinkMarbleRageTitle": "Pink Punch", + "questPinkMarbleRageDescription": "This bar fills when you don't complete your Dailies. When it is full, Cupido will take away some of your party's pending damage!", + "questPinkMarbleRageEffect": "`Cupido uses Pink Punch!` That wasn't affectionate at all! Your partymates are taken aback. Pending damage reduced.", + "questPinkMarbleDropPinkMarblePotion": "Pink Marble Hatching Potion", + "QuestPinkMarbleUnlockText": "Unlocks Pink Marble Hatching Potions for purchase in the Market." } diff --git a/website/common/script/content/hatching-potions.js b/website/common/script/content/hatching-potions.js index c2530afe91..d5cfdcd4f5 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -551,6 +551,13 @@ const premium = { return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end); }, }, + PinkMarble: { + value: 2, + text: t('hatchingPotionPinkMarble'), + limited: true, + canBuy: hasQuestAchievementFunction('pinkMarble'), + _addlNotes: t('premiumPotionUnlimitedNotes'), + }, }; const wacky = { diff --git a/website/common/script/content/quests/potions.js b/website/common/script/content/quests/potions.js index 0b615f46a4..2aca7126ad 100644 --- a/website/common/script/content/quests/potions.js +++ b/website/common/script/content/quests/potions.js @@ -170,6 +170,45 @@ const QUEST_POTIONS = { unlock: t('questOnyxUnlockText'), }, }, + pinkMarble: { + text: t('questPinkMarbleText'), + notes: t('questPinkMarbleNotes'), + completion: t('questPinkMarbleCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questPinkMarbleBoss'), + hp: 1200, + str: 2, + rage: { + title: t('questPinkMarbleRageTitle'), + description: t('questPinkMarbleRageDescription'), + value: 50, + progressDrain: 0.5, + effect: t('questPinkMarbleRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'PinkMarble', + text: t('questPinkMarbleDropPinkMarblePotion'), + }, { + type: 'hatchingPotions', + key: 'PinkMarble', + text: t('questPinkMarbleDropPinkMarblePotion'), + }, { + type: 'hatchingPotions', + key: 'PinkMarble', + text: t('questPinkMarbleDropPinkMarblePotion'), + }, + ], + gp: 75, + exp: 800, + unlock: t('questPinkMarbleUnlockText'), + }, + }, ruby: { text: t('questRubyText'), notes: t('questRubyNotes'), From 74da6d8798c2561ba2e78570c7e20371615d0db1 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Sun, 12 Feb 2023 23:17:16 -0600 Subject: [PATCH 23/58] 4.260.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20f2c51b3c..cbebd7c97f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.259.1", + "version": "4.260.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fecf9b9732..ae2572ee22 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.259.1", + "version": "4.260.0", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.20.12", From f9db4b9b5befdf4042c577d12416ca21d672653c Mon Sep 17 00:00:00 2001 From: SabreCat Date: Mon, 13 Feb 2023 11:25:02 -0600 Subject: [PATCH 24/58] fix(event): correct logic for various Valentine's items --- website/client/src/components/groups/tavern.vue | 10 ++++++---- website/client/src/components/shops/market/index.vue | 10 ++++++---- website/client/src/components/shops/quests/index.vue | 10 ++++++---- website/common/script/content/constants/events.js | 6 +++--- website/common/script/content/index.js | 2 +- website/common/script/content/spells.js | 2 +- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/website/client/src/components/groups/tavern.vue b/website/client/src/components/groups/tavern.vue index 75ed9d2062..8804aaa32c 100644 --- a/website/client/src/components/groups/tavern.vue +++ b/website/client/src/components/groups/tavern.vue @@ -759,6 +759,7 @@