Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
afe1bdc168 chore(deps): bump axios from 0.28.1 to 1.13.2 in /website/client
Bumps [axios](https://github.com/axios/axios) from 0.28.1 to 1.13.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.28.1...v1.13.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-16 23:57:34 +00:00
32 changed files with 95 additions and 496 deletions

View File

@@ -274,13 +274,13 @@ describe('Group Model', () => {
expect(Group.prototype.sendChat).to.be.calledOnce;
expect(Group.prototype.sendChat).to.be.calledWith({
message: '`Participating Member attacks Wailing Whale for 5 damage. Wailing Whale attacks party for 8 damage.`',
message: '`Participating Member attacks Wailing Whale for 5.0 damage. Wailing Whale attacks party for 7.5 damage.`',
info: {
bossDamage: '8',
bossDamage: '7.5',
quest: 'whale',
type: 'boss_damage',
user: 'Participating Member',
userDamage: '5',
userDamage: '5.0',
},
});
});

View File

@@ -15,7 +15,7 @@
"amplitude-js": "^8.21.3",
"assert": "^2.1.0",
"autoprefixer": "^10.4.20",
"axios": "^0.28.0",
"axios": "^1.13.2",
"axios-progress-bar": "^1.2.0",
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",
@@ -3307,12 +3307,13 @@
}
},
"node_modules/axios": {
"version": "0.28.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.28.1.tgz",
"integrity": "sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==",
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},

View File

@@ -19,7 +19,7 @@
"amplitude-js": "^8.21.3",
"assert": "^2.1.0",
"autoprefixer": "^10.4.20",
"axios": "^0.28.0",
"axios": "^1.13.2",
"axios-progress-bar": "^1.2.0",
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",

View File

@@ -1055,11 +1055,6 @@
width: 141px;
height: 147px;
}
.background_elegant_palace {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_elegant_palace.png');
width: 141px;
height: 147px;
}
.background_enchanted_music_room {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_enchanted_music_room.png');
width: 141px;
@@ -1756,11 +1751,6 @@
width: 141px;
height: 147px;
}
.background_nighttime_street_with_shops {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_nighttime_street_with_shops.png');
width: 141px;
height: 147px;
}
.background_ocean_sunrise {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_ocean_sunrise.png');
width: 141px;
@@ -2447,11 +2437,6 @@
width: 141px;
height: 147px;
}
.background_winter_desert_with_saguaros {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_desert_with_saguaros.png');
width: 141px;
height: 147px;
}
.background_winter_fireworks {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_fireworks.png');
width: 141px;
@@ -29470,11 +29455,6 @@
width: 60px;
height: 60px;
}
.back_armoire_harpsichord {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_armoire_harpsichord.png');
width: 114px;
height: 90px;
}
.body_armoire_clownsBowtie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/body_armoire_clownsBowtie.png');
width: 114px;
@@ -29865,11 +29845,6 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_loneCowpokeOutfit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_loneCowpokeOutfit.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_lunarArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_lunarArmor.png');
width: 90px;
@@ -30505,11 +30480,6 @@
width: 114px;
height: 87px;
}
.head_armoire_loneCowpokeHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_loneCowpokeHat.png');
width: 114px;
height: 90px;
}
.head_armoire_lunarCrown {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_lunarCrown.png');
width: 90px;
@@ -30820,11 +30790,6 @@
width: 114px;
height: 90px;
}
.shield_armoire_doubleBass {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_doubleBass.png');
width: 114px;
height: 90px;
}
.shield_armoire_dragonTamerShield {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_dragonTamerShield.png');
width: 90px;
@@ -31030,11 +30995,6 @@
width: 90px;
height: 90px;
}
.shield_armoire_prettyPinkGiftBox {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_prettyPinkGiftBox.png');
width: 114px;
height: 90px;
}
.shield_armoire_ramHornShield {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_ramHornShield.png');
width: 90px;
@@ -31505,11 +31465,6 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_loneCowpokeOutfit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_loneCowpokeOutfit.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_lunarArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_lunarArmor.png');
width: 90px;
@@ -31805,11 +31760,6 @@
width: 114px;
height: 90px;
}
.weapon_armoire_bambooFlute {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_bambooFlute.png');
width: 114px;
height: 90px;
}
.weapon_armoire_barristerGavel {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_barristerGavel.png');
width: 90px;
@@ -32220,11 +32170,6 @@
width: 114px;
height: 90px;
}
.weapon_armoire_prettyPinkParasol {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_prettyPinkParasol.png');
width: 114px;
height: 90px;
}
.weapon_armoire_pushBroom {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pushBroom.png');
width: 114px;
@@ -34115,46 +34060,6 @@
width: 90px;
height: 90px;
}
.back_mystery_202601 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202601.png');
width: 114px;
height: 90px;
}
.back_mystery_202602 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202602.png');
width: 114px;
height: 90px;
}
.broad_armor_mystery_202512 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202512.png');
width: 114px;
height: 90px;
}
.head_mystery_202512 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202512.png');
width: 114px;
height: 90px;
}
.head_mystery_202602 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202602.png');
width: 114px;
height: 90px;
}
.slim_armor_mystery_202512 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202512.png');
width: 114px;
height: 90px;
}
.weapon_mystery_202512 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202512.png');
width: 114px;
height: 90px;
}
.weapon_mystery_202601 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202601.png');
width: 114px;
height: 90px;
}
.back_mystery_201402 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_201402.png');
width: 90px;
@@ -38735,26 +38640,6 @@
width: 114px;
height: 90px;
}
.broad_armor_special_winter2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Healer.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Mage.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Rogue.png');
width: 117px;
height: 120px;
}
.broad_armor_special_winter2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2026Warrior.png');
width: 114px;
height: 90px;
}
.broad_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png');
width: 90px;
@@ -39050,26 +38935,6 @@
width: 114px;
height: 90px;
}
.head_special_winter2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Healer.png');
width: 114px;
height: 90px;
}
.head_special_winter2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Mage.png');
width: 114px;
height: 90px;
}
.head_special_winter2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Rogue.png');
width: 117px;
height: 120px;
}
.head_special_winter2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2026Warrior.png');
width: 114px;
height: 90px;
}
.head_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png');
width: 90px;
@@ -39250,21 +39115,6 @@
width: 114px;
height: 90px;
}
.shield_special_winter2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2026Healer.png');
width: 114px;
height: 90px;
}
.shield_special_winter2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2026Rogue.png');
width: 117px;
height: 120px;
}
.shield_special_winter2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2026Warrior.png');
width: 114px;
height: 90px;
}
.shield_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png');
width: 90px;
@@ -39505,26 +39355,6 @@
width: 114px;
height: 90px;
}
.slim_armor_special_winter2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Healer.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Mage.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Rogue.png');
width: 117px;
height: 120px;
}
.slim_armor_special_winter2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2026Warrior.png');
width: 114px;
height: 90px;
}
.slim_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png');
width: 90px;
@@ -39765,26 +39595,6 @@
width: 114px;
height: 90px;
}
.weapon_special_winter2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Healer.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Mage.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Rogue.png');
width: 117px;
height: 120px;
}
.weapon_special_winter2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2026Warrior.png');
width: 114px;
height: 90px;
}
.weapon_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png');
width: 90px;

View File

@@ -134,10 +134,10 @@
></div>
{{
(Math.ceil(parseFloat(group.quest.progress.hp) * 100) / 100)
| localizeNumber(user.preferences.language, { toFixed: 0 })
| localizeNumber(user.preferences.language, { toFixed:2 })
}} / {{
parseFloat(questData.boss.hp)
| localizeNumber(user.preferences.language, { toFixed: 0 })
| localizeNumber(user.preferences.language, { toFixed:2 })
}}
<strong>HP</strong>
@@ -160,7 +160,7 @@
{{
(user.party.quest.progress.up || 0)
| floor(10)
| localizeNumber(user.preferences.language, { toFixed: 0 })
| localizeNumber(user.preferences.language, { toFixed:1 })
}}
{{ $t('pendingDamageLabel') }}
</span>
@@ -198,7 +198,7 @@
class="float-left"
>{{ $t('rage') }} {{
parseFloat(group.quest.progress.rage)
| localizeNumber(user.preferences.language, { toFixed: 0 })
| localizeNumber(user.preferences.language, { toFixed: 2 })
}} / {{
questData.boss.rage.value
| localizeNumber(user.preferences.language)

View File

@@ -416,7 +416,7 @@
:aria-label="$t('gold')"
v-html="icons.gold"
></div>
<span>{{ Math.floor(user.stats.gp) }}</span>
<span>{{ Math.floor(user.stats.gp * 100) / 100 }}</span>
</div>
</div>
<div class="form-inline desktop-only">

View File

@@ -124,14 +124,13 @@
></div>
</div>
<input
v-model="taskValue"
v-model="task.value"
class="form-control"
type="number"
required="required"
placeholder="Enter a Value"
step="1"
step="0.01"
min="0"
@blur="validateValue()"
>
</div>
</div>
@@ -1096,7 +1095,6 @@ export default {
per: 'perception',
},
calendarHighlights: { dates: [new Date()] },
taskValue: 0,
};
},
computed: {
@@ -1267,9 +1265,8 @@ export default {
if (!this.canSave) return;
if (this.newChecklistItem) this.addChecklistItem();
if (this.task.type === 'reward') {
this.validateValue();
this.task.value = this.taskValue;
if (this.task.type === 'reward' && this.task.value === '') {
this.task.value = 0;
}
if (this.purpose === 'create') {
@@ -1358,10 +1355,6 @@ export default {
this.task.tags.push(tagResult.id);
},
validateValue () {
this.taskValue = Number(this.taskValue);
this.taskValue = Math.floor(this.taskValue);
},
},
};
</script>

View File

@@ -113,7 +113,7 @@ export default {
filters: {
statFloor (value) {
if (value < 1 && value > 0) {
return 1;
return Math.ceil(value * 10) / 10;
}
return Math.floor(value);
},

View File

@@ -1,15 +1,15 @@
import round from './round';
function _convertToThousand (num) {
return `${(num / (10 ** 3)).toFixed(0)}k`;
return `${(num / (10 ** 3)).toFixed(1)}k`;
}
function _convertToMillion (num) {
return `${(num / (10 ** 6)).toFixed(0)}m`;
return `${(num / (10 ** 6)).toFixed(1)}m`;
}
function _convertToBillion (num) {
return `${(num / (10 ** 9)).toFixed(0)}b`;
return `${(num / (10 ** 9)).toFixed(1)}b`;
}
export default function roundBigNumber (num) {

View File

@@ -43,7 +43,7 @@ export function getSign (number) {
}
export function round (number, nDigits) {
return Math.abs(number.toFixed(nDigits || 0));
return Math.abs(number.toFixed(nDigits || 1));
}
export function getXPMessage (val) {

View File

@@ -4,13 +4,19 @@ import {
getDropClass, getXPMessage, getSign, round,
} from '@/libs/notifications';
// See https://stackoverflow.com/questions/4187146/truncate-number-to-two-decimal-places-without-rounding
function toFixedWithoutRounding (num, fixed) {
const re = new RegExp(`^-?\\d+(?:\.\\d{0,${(fixed || -1)}})?`); // eslint-disable-line no-useless-escape
return num.toString().match(re)[0];
}
export const NotificationMixins = {
computed: {
...mapState({ notifications: 'notificationStore' }),
},
methods: {
coins (money) {
return this.round(money, 0);
return this.round(money, 2);
},
crit (val) {
const message = `${this.$t('critBonus')} ${Math.round(val)} %`;
@@ -51,7 +57,7 @@ export const NotificationMixins = {
},
mp (val) {
const cleanMp = `${val}`.replace('-', '').replace('+', '');
this.notify(`${this.sign(val)} ${cleanMp < 0 ? Math.floor(cleanMp) : Math.ceil(cleanMp)}`, 'mp', 'glyphicon glyphicon-fire', this.sign(val));
this.notify(`${this.sign(val)} ${toFixedWithoutRounding(cleanMp, 1)}`, 'mp', 'glyphicon glyphicon-fire', this.sign(val));
},
purchased (itemName) {
this.text(this.$t('purchasedItem', {

View File

@@ -94,7 +94,7 @@ export default {
if (quest && user.party.quest && user.party.quest.key) {
const userQuest = Content.quests[user.party.quest.key];
if (quest.progressDelta && userQuest.boss) {
this.damage(quest.progressDelta.toFixed(0));
this.damage(quest.progressDelta.toFixed(1));
} else if (quest.collection && userQuest.collect) {
user.party.quest.progress.collectedItems += 1;
this.quest('questCollection', quest.collection);

View File

@@ -179,7 +179,7 @@ export default {
if (questProgress > 0) {
const userQuest = quests.quests[this.user.party.quest.key];
if (userQuest.boss) {
this.damage(questProgress.toFixed(0));
this.damage(questProgress.toFixed(1));
} else if (userQuest.collection && userQuest.collect) {
this.quest('questCollection', questProgress);
}

View File

@@ -26,10 +26,7 @@ export default {
// @TODO: Task modal component is mutating a prop
// and that causes issues. We need to not copy the prop similar to group modals
if (this.task) {
this.checklist = clone(this.task.checklist);
this.taskValue = this.task.value;
}
if (this.task) this.checklist = clone(this.task.checklist);
},
},
};

View File

@@ -260,9 +260,6 @@ export default {
} else if (this.restoreValues[stat] > MAX_FIELD_HARD_CAP) {
this.restoreValues[stat] = MAX_FIELD_HARD_CAP;
valid = false;
} else if (!Number.isInteger(this.restoreValues[stat])) {
this.restoreValues[stat] = Math.floor(this.restoreValues[stat]);
valid = false;
}
}

View File

@@ -8,14 +8,14 @@ describe('round big number filter', () => {
});
test('can round thousands', () => {
expect(roundBigNumberFilter(70065)).to.equal('70k');
expect(roundBigNumberFilter(70065)).to.equal('70.1k');
});
test('can round milions', () => {
expect(roundBigNumberFilter(10000987)).to.equal('10m');
expect(roundBigNumberFilter(10000987)).to.equal('10.0m');
});
test('can round bilions', () => {
expect(roundBigNumberFilter(1000000000)).to.equal('1b');
expect(roundBigNumberFilter(1000000000)).to.equal('1.0b');
});
});

View File

@@ -1051,18 +1051,6 @@
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners.",
"backgrounds122025": "SET 139: Released December 2025",
"backgroundNighttimeStreetWithShopsText": "Nighttime Street with Shops",
"backgroundNighttimeStreetWithShopsNotes": "Enjoy the warm glow of a Nighttime Street with Shops.",
"backgrounds012026": "SET 140: Released January 2026",
"backgroundWinterDesertWithSaguarosText": "Winter Desert with Saguaros",
"backgroundWinterDesertWithSaguarosNotes": "Breathe the crisp air of a Winter Desert with Saguaros.",
"backgrounds022026": "SET 141: Released February 2026",
"backgroundElegantPalaceText": "Elegant Palace",
"backgroundElegantPalaceNotes": "Admire the colorful halls of an Elegant Palace.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",

View File

@@ -276,7 +276,7 @@
"weaponSpecialWinter2018WarriorText": "Holiday Bow Hammer",
"weaponSpecialWinter2018WarriorNotes": "The sparkly appearance of this bright weapon will dazzle your enemies as you swing it! Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.",
"weaponSpecialWinter2018MageText": "Holiday Confetti",
"weaponSpecialWinter2018MageNotes": "Magicand glitteris in the air! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.",
"weaponSpecialWinter2018MageNotes": "Magic--and glitter--is in the air! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.",
"weaponSpecialWinter2018HealerText": "Mistletoe Wand",
"weaponSpecialWinter2018HealerNotes": "This mistletoe ball is sure to enchant and delight passersby! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.",
@@ -569,15 +569,6 @@
"weaponSpecialFall2025MageText": "Masked Ghost Axe",
"weaponSpecialFall2025MageNotes": "A mighty weapon to cut a safe path through an autumn forest full of frights. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
"weaponSpecialWinter2026WarriorText": "Rime Scythe",
"weaponSpecialWinter2026WarriorNotes": "Scythes help cut, reap, and cover large areas—all things you need when refining a task list. Increases Strength by <%= str %>. Limited Edition Winter 2025-2026 Gear.",
"weaponSpecialWinter2026RogueText": "Ski Pole",
"weaponSpecialWinter2026RogueNotes": "Ski poles help you maintain balance, stability, and timing—all things you need to be truly productive. Increases Strength by <%= str %>. Limited Edition Winter 2025-2026 Gear.",
"weaponSpecialWinter2026HealerText": "Polar Staff",
"weaponSpecialWinter2026HealerNotes": "Staffs help with support, stability, and direction—all things that help you truly conquer a task list. Increases Intelligence by <%= int %>. Limited Edition Winter 2025-2026 Gear.",
"weaponSpecialWinter2026MageText": "Candelabra Staff",
"weaponSpecialWinter2026MageNotes": "Candelabras help by holding multiple candles at a time—follow its lead the next time you need to multitask. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Winter 2025-2026 Gear.",
"weaponMystery201411Text": "Pitchfork of Feasting",
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -622,10 +613,6 @@
"weaponMystery202508Notes": "This spinning blade will terrify any monster or red Daily that crosses your path! Confers no benefit. August 2025 Subscriber Item.",
"weaponMystery202511Text": "Frost Sword",
"weaponMystery202511Notes": "The icy glow of this sword will make quick work of even dark red tasks. Confers no benefit. November 2025 Subscriber Item.",
"weaponMystery202512Text": "Cookie Champion's Blade",
"weaponMystery202512Notes": "A shining sword cast from sugar, mint, and arcane enchantments. Confers no benefit. December 2025 Subscriber Item.",
"weaponMystery202601Text": "Winter's Aegis",
"weaponMystery202601Notes": "An icy bubble shield that grants magical protection from opposing elements. Confers no benefit. January 2026 Subscriber Item.",
"weaponMystery301404Text": "Steampunk Cane",
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
@@ -661,7 +648,7 @@
"weaponArmoireBasicLongbowText": "Basic Longbow",
"weaponArmoireBasicLongbowNotes": "A serviceable hand-me-down bow. Increases Strength by <%= str %>. Enchanted Armoire: Basic Archer Set (Item 1 of 3).",
"weaponArmoireHabiticanDiplomaText": "Habitican Diploma",
"weaponArmoireHabiticanDiplomaNotes": "A certificate of significant achievementwell done! Increases Intelligence by <%= int %>. Enchanted Armoire: Graduate Set (Item 1 of 3).",
"weaponArmoireHabiticanDiplomaNotes": "A certificate of significant achievement -- well done! Increases Intelligence by <%= int %>. Enchanted Armoire: Graduate Set (Item 1 of 3).",
"weaponArmoireSandySpadeText": "Sandy Spade",
"weaponArmoireSandySpadeNotes": "A tool for digging, as well as flicking sand into the eyes of enemy monsters. Increases Strength by <%= str %>. Enchanted Armoire: Seaside Set (Item 1 of 3).",
"weaponArmoireCannonText": "Cannon",
@@ -821,7 +808,7 @@
"weaponArmoireCleaningClothText": "Cleaning Cloth",
"weaponArmoireCleaningClothNotes": "Take this tidying tool on your adventures and always be able to polish a pretty plaque or wipe a wooden windowsill. Increases Strength and Constitution by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set Two (Item 3 of 3)",
"weaponArmoireRidingBroomText": "Riding Broom",
"weaponArmoireRidingBroomNotes": "Run all your most magical errands on this fine broomor, just take it for a joyride around the neighborhood. Whee! Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Spooky Sorcery Set (Item 1 of 3)",
"weaponArmoireRidingBroomNotes": "Run all your most magical errands on this fine broom--or, just take it for a joyride around the neighborhood. Whee! Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Spooky Sorcery Set (Item 1 of 3)",
"weaponArmoireRollingPinText": "Rolling Pin",
"weaponArmoireRollingPinNotes": "Roll your dough as thin as you like in-between bonking bad habits when they pop up around you like a certain rodent-bopping game. Increases Strength by <%= str %>. Enchanted Armoire: Cooking Implements Set 2 (Item 2 of 2).",
"weaponArmoireScholarlyTextbooksText": "Scholarly Textbooks",
@@ -850,10 +837,6 @@
"weaponArmoireBeekeepersSmokerNotes": "Use this to calm your bees so you can retrieve some honey. The bees wont mind. Honestly, we could all use a few extra minutes of calm from time to time. Increases Intelligence by <%= int %>. Enchanted Armoire: Beekeeper Set (Item 3 of 4).",
"weaponArmoireBlacksmithsHammerText": "Blacksmith's Hammer",
"weaponArmoireBlacksmithsHammerNotes": "This hammer is for metalworking, but it is perfectly adept amidst hot red coals and hot red Daily tasks, as well. Increases Strength by <%= str %>. Enchanted Armoire: Blacksmith Set (Item 3 of 3).",
"weaponArmoireBambooFluteText": "Bamboo Flute",
"weaponArmoireBambooFluteNotes": "Hwhoooo! Hu-whooooo! Gather your party for a meditation session or self-care nap while relaxing to tunes played on this bamboo flute. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 2 of 3)",
"weaponArmoirePrettyPinkParasolText": "Pretty Pink Parasol",
"weaponArmoirePrettyPinkParasolNotes": "Pretty and practical is the preeminent permutation. And for a particularly impressive presentation, give this parasol a spin! Increases all stats by <%= attrs %> each. Enchanted Armoire: Pretty in Pink Set (Item 1 of 2)",
"armor": "armor",
"armorCapitalized": "Armor",
@@ -1206,7 +1189,7 @@
"armorSpecialSpring2020HealerNotes": "Wrap yourself in soft iris leaves and petals to fool enemies into underestimating your healing power. Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
"armorSpecialSummer2020RogueText": "Crocodile Disguise",
"armorSpecialSummer2020RogueNotes": "A crocodile makes the perfect Rogue, waiting for the perfect moment to strike. Borrow their skillsand their explosive speed. Increases Perception by <%= per %>. Limited Edition 2020 Summer Gear.",
"armorSpecialSummer2020RogueNotes": "A crocodile makes the perfect Rogue, waiting for the perfect moment to strike. Borrow their skills--and their explosive speed. Increases Perception by <%= per %>. Limited Edition 2020 Summer Gear.",
"armorSpecialSummer2020WarriorText": "Rainbow Trout Tail",
"armorSpecialSummer2020WarriorNotes": "You'll be the bright fish in a dull stream, with these dazzling scales! Increases Constitution by <%= con %>. Limited Edition 2020 Summer Gear.",
"armorSpecialSummer2020MageText": "Oarfish Armor",
@@ -1403,15 +1386,6 @@
"armorSpecialFall2025MageText": "Masked Ghost Armor",
"armorSpecialFall2025MageNotes": "This seasonal armor becomes noncorporeal only after you put it on. Increases Intelligence by <%= int %>. Limited Edition Fall 2025 Gear.",
"armorSpecialWinter2026WarriorText": "Rime Reaper Suit",
"armorSpecialWinter2026WarriorNotes": "Icicles will snap and slide with every step on your way to completing your Dailies. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
"armorSpecialWinter2026RogueText": "Ski Suit and Skis",
"armorSpecialWinter2026RogueNotes": "Go speedily swishing down the slopes on your way to completing your Dailies. Increases Perception by <%= per %>. Limited Edition Winter 2025-2026 Gear.",
"armorSpecialWinter2026HealerText": "Polar Robe",
"armorSpecialWinter2026HealerNotes": "Like a natural light show, you will be stunning on your way to completing your Dailies. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
"armorSpecialWinter2026MageText": "Midwinter Candle Robe",
"armorSpecialWinter2026MageNotes": "Glide smoothly along your path like wax on your way to completing your Dailies. Increases Intelligence by <%= int %>. Limited Edition Winter 2025-2026 Gear.",
"armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
"armorMystery201403Text": "Forest Walker Armor",
@@ -1548,8 +1522,6 @@
"armorMystery202504Notes": "Abominable? More like adorable! Confers no benefit. April 2025 Subscriber Item.",
"armorMystery202509Text": "Windswept Wanderer's Robe",
"armorMystery202509Notes": "Bright silks protect you from the weather, hot or cold. Confers no benefit. September 2025 Subscriber Item.",
"armorMystery202512Text": "Cookie Champion Armor",
"armorMystery202512Notes": "Ready for battle in this plate that is both sweet and strong. Confers no benefit. December 2025 Subscriber Item.",
"armorMystery301404Text": "Steampunk Suit",
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
@@ -1649,7 +1621,7 @@
"armorArmoireCoverallsOfBookbindingText": "Coveralls of Bookbinding",
"armorArmoireCoverallsOfBookbindingNotes": "Everything you need in a set of coveralls, including pockets for everything. A pair of goggles, loose change, a golden ring... Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Bookbinder Set (Item 2 of 4).",
"armorArmoireRobeOfSpadesText": "Robe of Spades",
"armorArmoireRobeOfSpadesNotes": "These luxuriant robes conceal hidden pockets for treasures or weaponsyour choice! Increases Strength by <%= str %>. Enchanted Armoire: Ace of Spades Set (Item 2 of 3).",
"armorArmoireRobeOfSpadesNotes": "These luxuriant robes conceal hidden pockets for treasures or weapons--your choice! Increases Strength by <%= str %>. Enchanted Armoire: Ace of Spades Set (Item 2 of 3).",
"armorArmoireSoftBlueSuitText": "Soft Blue Suit",
"armorArmoireSoftBlueSuitNotes": "Blue is a calming colour. So calming, some even wear this soft outfit to sleep... zZz. Increases Intelligence by <%= int %> and Perception by <%= per %>. Enchanted Armoire: Blue Loungewear Set (Item 2 of 3).",
"armorArmoireSoftGreenSuitText": "Soft Green Suit",
@@ -1711,7 +1683,7 @@
"armorArmoireMedievalLaundryDressText": "Laundry Dress",
"armorArmoireMedievalLaundryDressNotes": "Put on your apron and roll up your sleeves: it's time to get the laundry done! Increases Constitution by <%= con %>. Enchanted Armoire: Medieval Launderers Set (Item 2 of 6).",
"armorArmoireBathtubText": "Bathtub",
"armorArmoireBathtubNotes": "Time for a little R&R? Here's your own personal bathtuband a guarantee that the water is always the right temperature! Increases Constitution by <%= con %>. Enchanted Armoire: Bubble Bath Set (Item 2 of 4).",
"armorArmoireBathtubNotes": "Time for a little R&R? Here's your own personal bathtub -- and a guarantee that the water is always the right temperature! Increases Constitution by <%= con %>. Enchanted Armoire: Bubble Bath Set (Item 2 of 4).",
"armorArmoireBagpipersKiltText": "Bagpiper's Kilt",
"armorArmoireBagpipersKiltNotes": "A good sturdy kilt will serve you well. Increases Constitution by <%= con %>. Enchanted Armoire: Bagpiper Set (Item 2 of 3).",
"armorArmoireHeraldsTunicText": "Herald's Tunic",
@@ -1798,8 +1770,6 @@
"armorArmoireBlacksmithsApronNotes": "This apron doesnt feel as heavy as it looks once youve got it on. It will shield you from stray sparks while allowing you to maneuver freely. Increases Constitution by <%= con %>. Enchanted Armoire: Blacksmith Set (Item 2 of 3).",
"armorArmoireBlackPartyDressText": "Black Party Dress",
"armorArmoireBlackPartyDressNotes": "Youre strong, smart, hearty, and so fashionable! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 2 of 2).",
"armorArmoireLoneCowpokeOutfitText": "Lone Cowpoke Outfit",
"armorArmoireLoneCowpokeOutfitNotes": "Whoa, there! Want to make a statement when you ride into town as a mysterious stranger ready to be productive? Heres the perfect outfit, complete with chaps and a shining, silver belt buckle. Increases Constitution by <%= con %>. Enchanted Armoire: Lone Cowpoke Set (Item 2 of 2)",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@@ -1868,7 +1838,7 @@
"headSpecialLunarWarriorHelmText": "Lunar Warrior Helm",
"headSpecialLunarWarriorHelmNotes": "The power of the moon will strengthen you in battle! Increases Strength and Intelligence by <%= attrs %> each.",
"headSpecialMammothRiderHelmText": "Mammoth Rider Helm",
"headSpecialMammothRiderHelmNotes": "Don't let its fluffiness fool youthis hat will grant you piercing powers of perception! Increases Perception by <%= per %>.",
"headSpecialMammothRiderHelmNotes": "Don't let its fluffiness fool you--this hat will grant you piercing powers of perception! Increases Perception by <%= per %>.",
"headSpecialPageHelmText": "Page Helm",
"headSpecialPageHelmNotes": "Chainmail: for the stylish AND the practical. Increases Perception by <%= per %>.",
"headSpecialRoguishRainbowMessengerHoodText": "Roguish Rainbow Messenger Hood",
@@ -1964,7 +1934,7 @@
"headSpecialFall2015RogueText": "Bat-tle Wings",
"headSpecialFall2015RogueNotes": "Echolocate your enemies with this powerful helm! Increases Perception by <%= per %>. Limited Edition 2015 Fall Gear.",
"headSpecialFall2015WarriorText": "Scarecrow Hat",
"headSpecialFall2015WarriorNotes": "Everyone would want this hatif they only had a brain. Increases Strength by <%= str %>. Limited Edition 2015 Fall Gear.",
"headSpecialFall2015WarriorNotes": "Everyone would want this hat--if they only had a brain. Increases Strength by <%= str %>. Limited Edition 2015 Fall Gear.",
"headSpecialFall2015MageText": "Stitched Hat",
"headSpecialFall2015MageNotes": "Every stitch in this hat augments its power. Increases Perception by <%= per %>. Limited Edition 2015 Fall Gear.",
"headSpecialFall2015HealerText": "Hat of Frog",
@@ -2343,15 +2313,6 @@
"headSpecialFall2025MageText": "Masked Ghost Mask",
"headSpecialFall2025MageNotes": "Ethereal and glowy, this mask covers your head while you cover all your important tasks. Increases Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
"headSpecialWinter2026WarriorText": "Rime Reaper Helmet",
"headSpecialWinter2026WarriorNotes": "Maintain focus and concentration as you set your sights on greater goals this season. Increases Strength by <%= str %>. Limited Edition 2025-2026 Winter Gear.",
"headSpecialWinter2026RogueText": "Ski Mask and Goggles",
"headSpecialWinter2026RogueNotes": "Maintain focus and vision as you set your sights on greater goals this season. Increases Perception by <%= per %>. Limited Edition 2025-2026 Winter Gear.",
"headSpecialWinter2026HealerText": "Polar Bear Mask",
"headSpecialWinter2026HealerNotes": "Maintain focus and clarity as you set your sights on greater goals this season. Increases Intelligence by <%= int %>. Limited Edition 2025-2026 Winter Gear.",
"headSpecialWinter2026MageText": "Midwinter Candle Hat",
"headSpecialWinter2026MageNotes": "Maintain focus and illumination as you set your sights on greater gooals this season. Increases Perception by <%= per %>. Limited Edition 2025-2026 Winter Gear.",
"headSpecialGaymerxText": "Rainbow Warrior Helm",
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
@@ -2535,10 +2496,6 @@
"headMystery202504Notes": "Wear this mysterious visage to dwell undetected among the worlds most obscure cyptids. Confers no benefit. April 2025 Subscriber Item.",
"headMystery202507Text": "Spunky Skater Cap",
"headMystery202507Notes": "Backwards hats are still cool, right? Confers no benefit. July 2025 Subscriber Item.",
"headMystery202512Text": "Cookie Champion Helm",
"headMystery202512Notes": "Gingerbread forged with ancient magic will protect you as long as you can hold off your urge to try a bite! Confers no benefit. December 2025 Subscriber Item.",
"headMystery202602Text": "Sakura Fox Ears",
"headMystery202602Notes": " Your hearing will be sharpened by these ears such that you can hear the buds of blossoms growing on tree branches as spring approaches. Confers no benefit. February 2026 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
@@ -2767,8 +2724,6 @@
"headArmoireBlackHairbowNotes": "Become strong, smart, and hearty while wearing this beautiful Black Hairbow! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 1 of 2).",
"headArmoireBlacksmithsGogglesText": "Blacksmith's Goggles",
"headArmoireBlacksmithsGogglesNotes": "Shatter and heat-resistant ocular protection is yours when youre working in a forge. Increases Perception by <%= per %>. Enchanted Armoire: Blacksmith Set (Item 1 of 3).",
"headArmoireLoneCowpokeHatText": "Lone Cowpoke Hat",
"headArmoireLoneCowpokeHatNotes": "Howdy there, pardner! Dyou hate when youre out on the range, workin on tasks, and sun gets in your eyes? Well, good thing youve got a hat for that now. Increases Perception by <%= per %>. Enchanted Armoire: Lone Cowpoke Set (Item 1 of 2)",
"offhand": "off-hand item",
"offHandCapitalized": "Off-Hand Item",
@@ -3081,11 +3036,6 @@
"shieldSpecialFall2025HealerText": "Kobold Shield",
"shieldSpecialFall2025HealerNotes": "Buy yourself some extra time to gather supplies by shielding yourself from your chores. Increases Constitution by <%= con %>. Limited Edition Fall 2025 Gear.",
"shieldSpecialWinter2026WarriorText": "Rime Shield",
"shieldSpecialWinter2026WarriorNotes": "Stop obstacles cold with this handy, spikey shield. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
"shieldSpecialWinter2026HealerText": "Starburst",
"shieldSpecialWinter2026HealerNotes": "Stars help with wayfinding, energy, and illumination—all things that help you better conquer a task list. Increases Constitution by <%= con %>. Limited Edition Winter 2025-2026 Gear.",
"shieldMystery201601Text": "Resolution Slayer",
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
"shieldMystery201701Text": "Time-Freezer Shield",
@@ -3145,7 +3095,7 @@
"shieldArmoireMushroomDruidShieldText": "Mushroom Druid Shield",
"shieldArmoireMushroomDruidShieldNotes": "Though made from a mushroom, there's nothing mushy about this tough shield! Increases Constitution by <%= con %> and Strength by <%= str %>. Enchanted Armoire: Mushroom Druid Set (Item 3 of 3).",
"shieldArmoireFestivalParasolText": "Festival Parasol",
"shieldArmoireFestivalParasolNotes": "This lightweight parasol will shield you from the glarewhether it's from the sun or from dark red Dailies! Increases Constitution by <%= con %>. Enchanted Armoire: Festival Attire Set (Item 2 of 3).",
"shieldArmoireFestivalParasolNotes": "This lightweight parasol will shield you from the glare--whether it's from the sun or from dark red Dailies! Increases Constitution by <%= con %>. Enchanted Armoire: Festival Attire Set (Item 2 of 3).",
"shieldArmoireVikingShieldText": "Viking Shield",
"shieldArmoireVikingShieldNotes": "This sturdy shield of wood and hide can stand up to the most daunting of foes. Increases Perception by <%= per %> and Intelligence by <%= int %>. Enchanted Armoire: Viking Set (Item 3 of 3).",
"shieldArmoireSwanFeatherFanText": "Swan Feather Fan",
@@ -3239,7 +3189,7 @@
"shieldArmoireBouncyBubblesText": "Bouncy Bubbles",
"shieldArmoireBouncyBubblesNotes": "Complete your relaxing bath with these exuberant bubbles! Increases Strength by <%= str %>. Enchanted Armoire: Bubble Bath Set (Item 4 of 4).",
"shieldArmoireBagpipesText": "Bagpipes",
"shieldArmoireBagpipesNotes": "The uncharitable might say you're planning to wake the dead with these bagpipesbut you know you're just motivating your Party to success! Increases Strength by <%= str %>. Enchanted Armoire: Bagpiper Set (Item 3 of 3).",
"shieldArmoireBagpipesNotes": "The uncharitable might say you're planning to wake the dead with these bagpipes -- but you know you're just motivating your Party to success! Increases Strength by <%= str %>. Enchanted Armoire: Bagpiper Set (Item 3 of 3).",
"shieldArmoireHeraldsMessageScrollText": "Herald's Message Scroll",
"shieldArmoireHeraldsMessageScrollNotes": "What exciting news does this scroll contain? Could it be about a new pet or a long habit streak? Increases Perception by <%= per %>. Enchanted Armoire: Herald Set (Item 4 of 4)",
"shieldArmoireSoftBlackPillowText": "Soft Black Pillow",
@@ -3294,10 +3244,6 @@
"shieldArmoireFlyFishingRodNotes": "Put a lure on this long and flexible rod and fish will mistake it for an insect every single time. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fly Fishing Set (Item 3 of 3)",
"shieldArmoireSoftOrangePillowText": "Soft Orange Pillow",
"shieldArmoireSoftOrangePillowNotes": "The ready warrior packs a pillow for any expedition. Get ready to take on new obligations… even while you nap. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Orange Loungewear Set (Item 3 of 3).",
"shieldArmoireDoubleBassText": "Double Bass",
"shieldArmoireDoubleBassNotes": "Bom doo bom brrrr brr brr brrrr! Gather your party for some grounding or dancing as you listen to music on this deep double bass. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 3 of 3)",
"shieldArmoirePrettyPinkGiftBoxText": "Pretty Pink Present",
"shieldArmoirePrettyPinkGiftBoxNotes": "Is this gift from a dear friend? A caring relative? A true love? A secret admirer? Whoever sent it knows youll be pleased with whats inside. Increases all stats by <%= attrs %> each. Enchanted Armoire: Pretty in Pink Set (Item 2 of 2)",
"back": "Back Accessory",
"backBase0Text": "No Back Accessory",
@@ -3388,13 +3334,6 @@
"backMystery202507Notes": "Your steed for the sidewalks and halfpipes. Confers no benefit. July 2025 Subscriber Item.",
"backMystery202510Text": "Gliding Ghoul Wings",
"backMystery202510Notes": "Fly silently across the haunted skies with these giant wings. Confers no benefit. October 2025 Subscriber Item.",
"backMystery202601Text": "Winter's Sigil",
"backMystery202601Notes": "This mark grants the user control over the elements of the season of cold and frost. Confers no benefit. January 2026 Subscriber Item.",
"backMystery202602Text": "Five Tails of Sakura",
"backMystery202602Notes": "These fluffy tails are the color of cherry blossoms, a reminder that spring is on the way! Confers no benefit. February 2026 Subscriber Item.",
"backArmoireHarpsichordText": "Harpsichord",
"backArmoireHarpsichordNotes": "Pting! Ptiiing! Gather your party for a dinner or picnic and listen to a tinny melody on this harpsichord. Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 1 of 3)",
"backSpecialWonderconRedText": "Mighty Cape",
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
@@ -3613,7 +3552,7 @@
"headAccessoryMystery201908Text": "Footloose Faun Horns",
"headAccessoryMystery201908Notes": "If wearing horns floats your goat, you're in luck! Confers no benefit. August 2019 Subscriber Item.",
"headAccessoryMystery202004Text": "Mighty Monarch Antennae",
"headAccessoryMystery202004Notes": "They twitch just a bit if the scent of flowers drifts byuse them to find a pretty garden! Confers no benefit. April 2020 Subscriber Item.",
"headAccessoryMystery202004Notes": "They twitch just a bit if the scent of flowers drifts by--use them to find a pretty garden! Confers no benefit. April 2020 Subscriber Item.",
"headAccessoryMystery202005Text": "Wondrous Wyvern Horns",
"headAccessoryMystery202005Notes": "With such mighty horns, what creature dares challenge you? Confers no benefit. May 2020 Subscriber Item.",
"headAccessoryMystery202009Text": "Marvelous Moth Antennae",

View File

@@ -239,10 +239,6 @@
"fall2025SkeletonRogueSet": "Skeleton Rogue Set",
"fall2025KoboldHealerSet": "Kobold Healer Set",
"fall2025MaskedGhostMageSet": "Masked Ghost Mage Set",
"winter2026RimeReaperWarriorSet": "Rime Reaper Warrior Set",
"winter2026SkiRogueSet": "Ski Rogue Set",
"winter2026PolarBearHealerSet": "Polar Bear Healer Set",
"winter2026MidwinterCandleMageSet": "Midwinter Candle Mage Set",
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
"winterPromoGiftDetails1": "Until January 6th only, when you gift somebody a subscription, you get the same subscription for yourself for free!",
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",

View File

@@ -65,7 +65,7 @@
"questSpiderText": "The Icy Arachnid",
"questSpiderNotes": "As the weather starts cooling down, delicate frost begins appearing on Habiticans' windowpanes in lacy webs... except for @Arcosine, whose windows are frozen completely shut by the Frost Spider currently taking up residence in his home. Oh dear.",
"questSpiderCompletion": "The Frost Spider collapses, leaving behind a small pile of frost and a few of her enchanted egg sacs. @Arcosine rather hurriedly offers them to you as a rewardperhaps you could raise some non-threatening spiders as pets of your own?",
"questSpiderCompletion": "The Frost Spider collapses, leaving behind a small pile of frost and a few of her enchanted egg sacs. @Arcosine rather hurriedly offers them to you as a reward--perhaps you could raise some non-threatening spiders as pets of your own?",
"questSpiderBoss": "Spider",
"questSpiderDropSpiderEgg": "Spider (Egg)",
"questSpiderUnlockText": "Unlocks Spider Eggs for purchase in the Market",
@@ -134,7 +134,7 @@
"questGroupEarnable": "Earnable Quests",
"questBasilistText": "The Basi-List",
"questBasilistNotes": "There's a commotion in the marketplacethe kind that should make you run away. Being a courageous adventurer, you run towards it instead, and discover a Basi-list, coalescing from a clump of incomplete To Do's! Nearby Habiticans are paralyzed with fear at the length of the Basi-list, unable to start working. From somewhere in the vicinity, you hear @Arcosine shout: \"Quick! Complete your To Do's and Dailies to defang the monster, before someone gets a paper cut!\" Strike fast, adventurer, and check something off - but beware! If you leave any Dailies undone, the Basi-list will attack you and your party!",
"questBasilistNotes": "There's a commotion in the marketplace--the kind that should make you run away. Being a courageous adventurer, you run towards it instead, and discover a Basi-list, coalescing from a clump of incomplete To Do's! Nearby Habiticans are paralyzed with fear at the length of the Basi-list, unable to start working. From somewhere in the vicinity, you hear @Arcosine shout: \"Quick! Complete your To Do's and Dailies to defang the monster, before someone gets a paper cut!\" Strike fast, adventurer, and check something off - but beware! If you leave any Dailies undone, the Basi-list will attack you and your party!",
"questBasilistCompletion": "The Basi-list has scattered into paper scraps, which shimmer gently in rainbow colors. \"Whew!\" says @Arcosine. \"Good thing you guys were here!\" Feeling more experienced than before, you gather up some fallen gold from among the papers.",
"questBasilistBoss": "The Basi-List",
@@ -296,7 +296,7 @@
"questDilatoryDistress3DropShield": "Moonpearl Shield (Off-Hand Item)",
"questCheetahText": "Such a Cheetah",
"questCheetahNotes": "As you hike across the Sloensteadi Savannah with your friends @PainterProphet, @tivaquinn, @Unruly Hyena, and @Crawford, you're startled to see a Cheetah screeching past with a new Habitican clamped in its jaws. Under the Cheetah's scorching paws, tasks burn away as though completebefore anyone has the chance to actually finish them! The Habitican sees you and yells, \"Please help me! This Cheetah is making me level too quickly, but I'm not getting anything done. I want to slow down and enjoy the game. Make it stop!\" You fondly remember your own fledgling days, and know that you have to help the newbie by stopping the Cheetah!",
"questCheetahNotes": "As you hike across the Sloensteadi Savannah with your friends @PainterProphet, @tivaquinn, @Unruly Hyena, and @Crawford, you're startled to see a Cheetah screeching past with a new Habitican clamped in its jaws. Under the Cheetah's scorching paws, tasks burn away as though complete -- before anyone has the chance to actually finish them! The Habitican sees you and yells, \"Please help me! This Cheetah is making me level too quickly, but I'm not getting anything done. I want to slow down and enjoy the game. Make it stop!\" You fondly remember your own fledgling days, and know that you have to help the newbie by stopping the Cheetah!",
"questCheetahCompletion": "The new Habitican is breathing heavily after the wild ride, but thanks you and your friends for your help. \"I'm glad that Cheetah won't be able to grab anyone else. It did leave some Cheetah eggs for us, so maybe we can raise them into more trustworthy pets!\"",
"questCheetahBoss": "Cheetah",
"questCheetahDropCheetahEgg": "Cheetah (Egg)",
@@ -323,7 +323,7 @@
"questBurnoutBossRageTavern": "`Burnout uses EXHAUST STRIKE!`\n\nMany Habiticans have been hiding from Burnout in the Tavern, but no longer! With a screeching howl, Burnout rakes the Tavern with its white-hot hands. As the Tavern patrons flee, Daniel is caught in Burnout's grip, and transforms into an Exhaust Spirit right in front of you!\n\nThis hot-headed horror has gone on for too long. Don't give up... we're so close to vanquishing Burnout for once and for all!",
"questFrogText": "Swamp of the Clutter Frog",
"questFrogNotes": "As you and your friends are slogging through the Swamps of Stagnation, @starsystemic points at a large sign. \"Stay on the pathif you can.\"<br><br>\"Surely that isn't hard!\" @RosemonkeyCT says. \"It's broad and clear.\"<br><br>But as you continue, you notice that path is gradually overtaken by the muck of the swamp, laced with bits of strange blue debris and clutter, until it's impossible to proceed.<br><br>As you look around, wondering how it got this messy, @Jon Arjinborn shouts, \"Look out!\" An angry frog leaps from the sludge, clad in dirty laundry and lit by blue fire. You will have to overcome this poisonous Clutter Frog to progress!",
"questFrogNotes": "As you and your friends are slogging through the Swamps of Stagnation, @starsystemic points at a large sign. \"Stay on the path -- if you can.\"<br><br>\"Surely that isn't hard!\" @RosemonkeyCT says. \"It's broad and clear.\"<br><br>But as you continue, you notice that path is gradually overtaken by the muck of the swamp, laced with bits of strange blue debris and clutter, until it's impossible to proceed.<br><br>As you look around, wondering how it got this messy, @Jon Arjinborn shouts, \"Look out!\" An angry frog leaps from the sludge, clad in dirty laundry and lit by blue fire. You will have to overcome this poisonous Clutter Frog to progress!",
"questFrogCompletion": "The frog cowers back into the muck, defeated. As it slinks away, the blue slime fades, leaving the way ahead clear.<br><br>Sitting in the middle of the path are three pristine eggs. \"You can even see the tiny tadpoles through the clear casing!\" @Breadstrings says. \"Here, you should take them.\"",
"questFrogBoss": "Clutter Frog",
"questFrogDropFrogEgg": "Frog (Egg)",
@@ -365,7 +365,7 @@
"questSnailUnlockText": "Unlocks Snail Eggs for purchase in the Market",
"questBewilderText": "The Be-Wilder",
"questBewilderNotes": "The party begins like any other.<br><br>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.<br><br>As the Mistiflying clock tower strikes midnight, the April Fool leaps onto the stage to give a speech.<br><br>“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.<br><br>“As you know,” the Fool continues, “my confusing illusions usually only last a single day. But Im pleased to announce that Ive 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!”<br><br>Lemoness pales suddenly, dropping her hors d'oeuvres. “Wait! Dont trust”<br><br>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.<br><br>“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.”<br><br>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.<br><br>“My dearest friends, why so alarmed?” crows the Be-Wilder, beating its wings. “Theres no need to toil for your rewards any more. Ill just give you all the things that you desire!”<br><br>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.<br><br>PainterProphet ducks as lightning bolts crackle overhead, and fog blots out the sun. “No! This time, I dont think it is!”<br><br>Quickly, Habiticans, dont let this World Boss distract us from our goals! Stay focused on the tasks that you need to complete so we can rescue Mistiflyingand hopefully, ourselves.",
"questBewilderNotes": "The party begins like any other.<br><br>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.<br><br>As the Mistiflying clock tower strikes midnight, the April Fool leaps onto the stage to give a speech.<br><br>“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.<br><br>“As you know,” the Fool continues, “my confusing illusions usually only last a single day. But Im pleased to announce that Ive 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!”<br><br>Lemoness pales suddenly, dropping her hors d'oeuvres. “Wait! Dont trust--”<br><br>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.<br><br>“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.”<br><br>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.<br><br>“My dearest friends, why so alarmed?” crows the Be-Wilder, beating its wings. “Theres no need to toil for your rewards any more. Ill just give you all the things that you desire!”<br><br>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.<br><br>PainterProphet ducks as lightning bolts crackle overhead, and fog blots out the sun. “No! This time, I dont think it is!”<br><br>Quickly, Habiticans, dont 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": "<strong>The Be-Wilder is DEFEATED!</strong><br><br>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.<br><br><strong>Mistiflying is saved!</strong><br><br>The April Fool has enough shame to look a bit sheepish. “Oh, hm,” he says. “Perhaps I got a little…. carried away.”<br><br>The crowd mutters. Sodden flowers wash up on sidewalks. Somewhere in the distance, a roof collapses with a spectacular splash.<br><br>“Er, yes,” the April Fool says. “That is. What I meant to say was, Im dreadfully sorry.” He heaves a sigh. “I suppose it cant all be fun and games, after all. It might not hurt to focus occasionally. Maybe Ill get a head start on next years pranking.”<br><br>Redphoenix coughs meaningfully.<br><br>“I mean, get a head start on this years spring cleaning!” the April Fool says. “Nothing to fear, Ill have Habit City in spit-shape soon. Luckily nobody is better than I at dual-wielding mops.”<br><br>Encouraged, the marching band starts up.<br><br>It isnt 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.<br><br>As Habiticans cuddle the magical fuzzy bees, the April Fools eyes light up. “Oho, Ive had a thought! Why dont you all keep some of these fuzzy Bee Pets and Mounts? Its a gift that perfectly symbolizes the balance between hard work and sweet rewards, if Im going to get all boring and allegorical on you.” He winks. “Besides, they dont have stingers! Fools 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, Im dreadfully sorry.” He heaves a sigh. “I suppose it cant all be fun and games, after all. It might not hurt to focus occasionally. Maybe Ill get a head start on next years pranking.”\n\nRedphoenix coughs meaningfully.\n\n“I mean, get a head start on this years spring cleaning!” the April Fool says. “Nothing to fear, Ill 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 isnt 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 Fools eyes light up. “Oho, Ive had a thought! Why dont you all keep some of these fuzzy Bee Pets and Mounts? Its a gift that perfectly symbolizes the balance between hard work and sweet rewards, if Im going to get all boring and allegorical on you.” He winks. “Besides, they dont have stingers! Fools honor.”",
"questBewilderBossRageTitle": "Beguilement Strike",
@@ -415,7 +415,7 @@
"questArmadilloUnlockText": "Unlocks Armadillo Eggs for purchase in the Market",
"questCowText": "The Mootant Cow",
"questCowNotes": "Its been a long, hot day at Sparring Farms, and there is nothing more you want than a long sip of water and some sleep. You're standing there daydreaming when @Soloana suddenly screams, \"Everyone run! The prize cow has mootated!\"<br><br>@eevachu gulps. \"It must be our bad habits that infected it.\"<br><br>\"Quick!\" @Feralem Tau says. \"Lets do something before the udder cows mootate, too.\"<br><br>Youve herd enough. No more daydreamingit's time to get those bad habits under control!",
"questCowNotes": "Its been a long, hot day at Sparring Farms, and there is nothing more you want than a long sip of water and some sleep. You're standing there daydreaming when @Soloana suddenly screams, \"Everyone run! The prize cow has mootated!\"<br><br>@eevachu gulps. \"It must be our bad habits that infected it.\"<br><br>\"Quick!\" @Feralem Tau says. \"Lets do something before the udder cows mootate, too.\"<br><br>Youve herd enough. No more daydreaming -- it's time to get those bad habits under control!",
"questCowCompletion": "You milk your good habits for all they are worth until the cow reverts to its original form. The cow looks over at you with her pretty brown eyes and nudges over three eggs.<br><br>@fuzzytrees laughs and hands you the eggs, \"Maybe it still is mootated if there are baby cows in these eggs. But I trust you to stick to your good habits when you raise them!\"",
"questCowBoss": "Mootant Cow",
"questCowDropCowEgg": "Cow (Egg)",
@@ -449,7 +449,7 @@
"questTaskwoodsTerror2DropArmor": "Pyromancer's Robes (Armor)",
"questTaskwoodsTerror3Text": "Terror in the Taskwoods, Part 3: Jacko of the Lantern",
"questTaskwoodsTerror3Notes": "Ready for battle, your group marches to the heart of the forest, where the renegade spirit is trying to destroy an ancient apple tree surrounded by fruitful berry bushes. His pumpkin-like head radiates a terrible light wherever it turns, and in his left hand he holds a long rod, with a lantern hanging from its tip. Instead of fire or flame, however, the lantern contains a dark crystal that chills you to the very bone.<br><br>The Joyful Reaper raises a bony hand to her mouth. \"That'sthat's Jacko, the Lantern Spirit! But he's a helpful harvest ghost who guides our farmers. What could possibly drive the dear soul to act this way?\"<br><br>\"I don't know,\" says @bridgetteempress. \"But it looks like that 'dear soul' is about to attack us!\"",
"questTaskwoodsTerror3Notes": "Ready for battle, your group marches to the heart of the forest, where the renegade spirit is trying to destroy an ancient apple tree surrounded by fruitful berry bushes. His pumpkin-like head radiates a terrible light wherever it turns, and in his left hand he holds a long rod, with a lantern hanging from its tip. Instead of fire or flame, however, the lantern contains a dark crystal that chills you to the very bone.<br><br>The Joyful Reaper raises a bony hand to her mouth. \"That's -- that's Jacko, the Lantern Spirit! But he's a helpful harvest ghost who guides our farmers. What could possibly drive the dear soul to act this way?\"<br><br>\"I don't know,\" says @bridgetteempress. \"But it looks like that 'dear soul' is about to attack us!\"",
"questTaskwoodsTerror3Completion": "After a long battle, you manage to land a well-aimed blow at the lantern that Jacko carries, and the crystal within shatters. Jacko suddenly snaps back to his senses and bursts into glowing tears. \"Oh, my beautiful forest! What have I done?!\" he wails. His tears extinguish the remaining fires, and the apple tree and wild berries are saved.<br><br>After you help him relax, he explains, \"I met this charming lady named Tzina, and she gave me this glowing crystal as a gift. At her urging, I put it in my lantern... but that's the last thing I recall.\" He turns to you with a golden smile. \"Perhaps you should take it for safekeeping while I help the wild orchards to regrow.\"",
"questTaskwoodsTerror3Boss": "Jacko of the Lantern",
"questTaskwoodsTerror3DropStrawberry": "Strawberry (Food)",
@@ -494,7 +494,7 @@
"questSlothUnlockText": "Unlocks Sloth Eggs for purchase in the Market",
"questTriceratopsText": "The Trampling Triceratops",
"questTriceratopsNotes": "The snow-capped Stoïkalm Volcanoes are always bustling with hikers and sight-seers. One tourist, @plumilla, calls over a crowd. \"Look! I enchanted the ground to glow so that we can play field games on it for our outdoor activity Dailies!\" Sure enough, the ground is swirling with glowing red patterns. Even some of the prehistoric pets from the area come over to play.<br><br>Suddenly, there's a loud snapa curious Triceratops has stepped on @plumilla's wand! It's engulfed in a burst of magic energy, and the ground starts shaking and growing hot. The Triceratops' eyes shine red, and it roars and begins to stampede!<br><br>\"That's not good,\" calls @McCoyly, pointing in the distance. Each magic-fueled stomp is causing the volcanoes to erupt, and the glowing ground is turning to lava beneath the dinosaur's feet! Quickly, you must hold off the Trampling Triceratops until someone can reverse the spell!",
"questTriceratopsNotes": "The snow-capped Stoïkalm Volcanoes are always bustling with hikers and sight-seers. One tourist, @plumilla, calls over a crowd. \"Look! I enchanted the ground to glow so that we can play field games on it for our outdoor activity Dailies!\" Sure enough, the ground is swirling with glowing red patterns. Even some of the prehistoric pets from the area come over to play.<br><br>Suddenly, there's a loud snap -- a curious Triceratops has stepped on @plumilla's wand! It's engulfed in a burst of magic energy, and the ground starts shaking and growing hot. The Triceratops' eyes shine red, and it roars and begins to stampede!<br><br>\"That's not good,\" calls @McCoyly, pointing in the distance. Each magic-fueled stomp is causing the volcanoes to erupt, and the glowing ground is turning to lava beneath the dinosaur's feet! Quickly, you must hold off the Trampling Triceratops until someone can reverse the spell!",
"questTriceratopsCompletion": "With quick thinking, you herd the creature towards the soothing Stoïkalm Steppes so that @*~Seraphina~* and @PainterProphet can reverse the lava spell without distraction. The calming aura of the Steppes takes effect, and the Triceratops curls up as the volcanoes go dormant once more. @PainterProphet passes you some eggs that were rescued from the lava. \"Without you, we wouldn't have been able to concentrate to stop the eruptions. Give these pets a good home.\"",
"questTriceratopsBoss": "Trampling Triceratops",
"questTriceratopsDropTriceratopsEgg": "Triceratops (Egg)",
@@ -502,7 +502,7 @@
"questGroupStoikalmCalamity": "Stoïkalm Calamity",
"questStoikalmCalamity1Text": "Stoïkalm Calamity, Part 1: Earthen Enemies",
"questStoikalmCalamity1Notes": "A terse missive arrives from @Kiwibot, and the frost-crusted scroll chills your heart as well as your fingertips. \"Visiting Stoïkalm Steppesmonsters bursting from earthsend help!\" You gather your party and ride north, but as soon as you venture down from the mountains, the snow beneath your feet explodes and gruesomely grinning skulls surround you!<br><br>Suddenly, a spear sails past, burying itself in a skull that was burrowing through the snow in an attempt to catch you unawares. A tall woman in finely-crafted armor gallops into the fray on the back of a mastodon, her long braid swinging as she yanks the spear unceremoniously from the crushed beast. It's time to fight off these foes with the help of Lady Glaciate, the leader of the Mammoth Riders!",
"questStoikalmCalamity1Notes": "A terse missive arrives from @Kiwibot, and the frost-crusted scroll chills your heart as well as your fingertips. \"Visiting Stoïkalm Steppes -- monsters bursting from earth -- send help!\" You gather your party and ride north, but as soon as you venture down from the mountains, the snow beneath your feet explodes and gruesomely grinning skulls surround you!<br><br>Suddenly, a spear sails past, burying itself in a skull that was burrowing through the snow in an attempt to catch you unawares. A tall woman in finely-crafted armor gallops into the fray on the back of a mastodon, her long braid swinging as she yanks the spear unceremoniously from the crushed beast. It's time to fight off these foes with the help of Lady Glaciate, the leader of the Mammoth Riders!",
"questStoikalmCalamity1Completion": "As you deliver a final blow to the skulls, they dissipate in a puff of magic. \"The dratted swarm may be gone,\" Lady Glaciate says, \"but we have bigger problems. Follow me.\" She tosses you a cloak to protect you from the chill air, and you ride off after her.",
"questStoikalmCalamity1Boss": "Earth Skull Swarm",
"questStoikalmCalamity1RageTitle": "Swarm Respawn",
@@ -513,7 +513,7 @@
"questStoikalmCalamity1DropArmor": "Mammoth Rider Armor",
"questStoikalmCalamity2Text": "Stoïkalm Calamity, Part 2: Seek the Icicle Caverns",
"questStoikalmCalamity2Notes": "The stately hall of the Mammoth Riders is an austere masterpiece of architecture, but it is also entirely empty. There's no furniture, the weapons are missing, and even the columns were picked clean of their inlays.<br><br>\"Those skulls scoured the place,\" Lady Glaciate says, and there is a blizzard brewing in her tone. \"Humiliating. Not a soul is to mention this to the April Fool, or I will never hear the end of it.\"<br><br>\"How mysterious!\" says @Beffymaroo. \"But where did they\"<br><br>\"The icicle drake caverns.\" Lady Glaciate gestures at shining coins spilled in the snow outside. \"Sloppy.\"<br><br>\"But aren't icicle drakes honorable creatures with their own treasure hoards?\" @Beffymaroo asks. \"Why would they possibly\"<br><br>\"Mind control,\" says Lady Glaciate, utterly unfazed. \"Or something equally melodramatic and inconvenient.\" She begins to stride from the hall. \"Why are you just standing there?\"<br><br>Quickly, go follow the trail of Icicle Coins!",
"questStoikalmCalamity2Notes": "The stately hall of the Mammoth Riders is an austere masterpiece of architecture, but it is also entirely empty. There's no furniture, the weapons are missing, and even the columns were picked clean of their inlays.<br><br>\"Those skulls scoured the place,\" Lady Glaciate says, and there is a blizzard brewing in her tone. \"Humiliating. Not a soul is to mention this to the April Fool, or I will never hear the end of it.\"<br><br>\"How mysterious!\" says @Beffymaroo. \"But where did they--\"<br><br>\"The icicle drake caverns.\" Lady Glaciate gestures at shining coins spilled in the snow outside. \"Sloppy.\"<br><br>\"But aren't icicle drakes honorable creatures with their own treasure hoards?\" @Beffymaroo asks. \"Why would they possibly--\"<br><br>\"Mind control,\" says Lady Glaciate, utterly unfazed. \"Or something equally melodramatic and inconvenient.\" She begins to stride from the hall. \"Why are you just standing there?\"<br><br>Quickly, go follow the trail of Icicle Coins!",
"questStoikalmCalamity2Completion": "The Icicle Coins lead you straight to the buried entrance of a cleverly hidden cavern. Though the weather outside is calm and lovely, with the sunlight sparkling across the expanse of snow, there is a howling within like a fierce winter wind. Lady Glaciate grimaces and hands you a Mammoth Rider helm. \"Wear this,\" she says. \"You'll need it.\"",
"questStoikalmCalamity2CollectIcicleCoins": "Icicle Coins",
"questStoikalmCalamity2DropHeadgear": "Mammoth Rider Helm (Headgear)",
@@ -527,21 +527,21 @@
"questStoikalmCalamity3DropWeapon": "Mammoth Rider Spear (Weapon)",
"questGuineaPigText": "The Guinea Pig Gang",
"questGuineaPigNotes": "You're casually strolling through Habit City's famous Market when @Pandah waves you down. \"Hey, check these out!\" They're holding up a brown and beige egg you don't recognize.<br><br>Alexander the Merchant frowns at it. \"I don't remember putting that out. I wonder where it came\" A small paw cuts him off.<br><br>\"Guinea all your gold, merchant!\" squeaks a tiny voice brimming with evil.<br><br>\"Oh no, the egg was a distraction!\" @mewrose exclaims. \"It's the gritty, greedy Guinea Pig Gang! They never do their Dailies, so they constantly steal gold to buy health potions.\"<br><br>\"Robbing the Market?\" says @emmavig. \"Not on our watch!\" Without further prompting, you leap to Alexander's aid.",
"questGuineaPigCompletion": "\"We submit!\" The Guinea Pig Gang Boss waves his paws at you, fluffy head hanging in shame. From underneath his hat falls a list, and @snazzyorange quickly swipes it for evidence. \"Wait a minute,\" you say. \"It's no wonder you've been getting hurt! You've got way too many Dailies. You don't need health potionsyou just need help organizing.\"<br><br>\"Really?\" squeaks the Guinea Pig Gang Boss. \"We've robbed so many people because of this! Please take our eggs as an apology for our crooked ways.\"",
"questGuineaPigNotes": "You're casually strolling through Habit City's famous Market when @Pandah waves you down. \"Hey, check these out!\" They're holding up a brown and beige egg you don't recognize.<br><br>Alexander the Merchant frowns at it. \"I don't remember putting that out. I wonder where it came--\" A small paw cuts him off.<br><br>\"Guinea all your gold, merchant!\" squeaks a tiny voice brimming with evil.<br><br>\"Oh no, the egg was a distraction!\" @mewrose exclaims. \"It's the gritty, greedy Guinea Pig Gang! They never do their Dailies, so they constantly steal gold to buy health potions.\"<br><br>\"Robbing the Market?\" says @emmavig. \"Not on our watch!\" Without further prompting, you leap to Alexander's aid.",
"questGuineaPigCompletion": "\"We submit!\" The Guinea Pig Gang Boss waves his paws at you, fluffy head hanging in shame. From underneath his hat falls a list, and @snazzyorange quickly swipes it for evidence. \"Wait a minute,\" you say. \"It's no wonder you've been getting hurt! You've got way too many Dailies. You don't need health potions -- you just need help organizing.\"<br><br>\"Really?\" squeaks the Guinea Pig Gang Boss. \"We've robbed so many people because of this! Please take our eggs as an apology for our crooked ways.\"",
"questGuineaPigBoss": "Guinea Pig Gang",
"questGuineaPigDropGuineaPigEgg": "Guinea Pig (Egg)",
"questGuineaPigUnlockText": "Unlocks Guinea Pig Eggs for purchase in the Market",
"questPeacockText": "The Push-and-Pull Peacock",
"questPeacockNotes": "You trek through the Taskwoods, wondering which of the enticing new goals you should pick. As you go deeper into the forest, you realize that you're not alone in your indecision. \"I could learn a new language, or go to the gym...\" @Cecily Perez mutters. \"I could sleep more,\" muses @Lilith of Alfheim, \"or spend time with my friends...\" It looks like @PainterProphet, @Pfeffernusse, and @Draayder are equally paralyzed by the overwhelming options.<br><br>You realize that these ever-more-demanding feelings aren't really your own... you've stumbled straight into the trap of the pernicious Push-and-Pull Peacock! Before you can run, it leaps from the bushes. With each head pulling you in conflicting directions, you start to feel burnout overcoming you. You can't defeat both foes at once, so you only have one optionconcentrate on the nearest task to fight back!",
"questPeacockNotes": "You trek through the Taskwoods, wondering which of the enticing new goals you should pick. As you go deeper into the forest, you realize that you're not alone in your indecision. \"I could learn a new language, or go to the gym...\" @Cecily Perez mutters. \"I could sleep more,\" muses @Lilith of Alfheim, \"or spend time with my friends...\" It looks like @PainterProphet, @Pfeffernusse, and @Draayder are equally paralyzed by the overwhelming options.<br><br>You realize that these ever-more-demanding feelings aren't really your own... you've stumbled straight into the trap of the pernicious Push-and-Pull Peacock! Before you can run, it leaps from the bushes. With each head pulling you in conflicting directions, you start to feel burnout overcoming you. You can't defeat both foes at once, so you only have one option -- concentrate on the nearest task to fight back!",
"questPeacockCompletion": "The Push-and-Pull Peacock is caught off guard by your sudden conviction. Defeated by your single-minded drive, its heads merge back into one, revealing the most beautiful creature you've ever seen. \"Thank you,\" the peacock says. \"Ive spent so long pulling myself in different directions that I lost sight of what I truly wanted. Please accept these eggs as a token of my gratitude.\"",
"questPeacockBoss": "Push-and-Pull Peacock",
"questPeacockDropPeacockEgg": "Peacock (Egg)",
"questPeacockUnlockText": "Unlocks Peacock Eggs for purchase in the Market",
"questButterflyText": "Bye, Bye, Butterfry",
"questButterflyNotes": "Your gardener friend @Megan sends you an invitation: “These warm days are the perfect time to visit Habiticas butterfly garden in the Taskan countryside. Come see the butterflies migrate!” When you arrive, however, the garden is in shambleslittle more than scorched grass and dried-out weeds. Its been so hot that the Habiticans havent come out to water the flowers, and the dark-red Dailies have turned it into a dry, sun-baked, fire-hazard. There's only one butterfly there, and there's something odd about it...<br><br>“Oh no! This is the perfect hatching ground for the Flaming Butterfry,” cries @Leephon.<br><br>“If we dont catch it, itll destroy everything!” gasps @Eevachu.<br><br>Time to say bye, bye to Butterfry!",
"questButterflyNotes": "Your gardener friend @Megan sends you an invitation: “These warm days are the perfect time to visit Habiticas butterfly garden in the Taskan countryside. Come see the butterflies migrate!” When you arrive, however, the garden is in shambles -- little more than scorched grass and dried-out weeds. Its been so hot that the Habiticans havent come out to water the flowers, and the dark-red Dailies have turned it into a dry, sun-baked, fire-hazard. There's only one butterfly there, and there's something odd about it...<br><br>“Oh no! This is the perfect hatching ground for the Flaming Butterfry,” cries @Leephon.<br><br>“If we dont catch it, itll destroy everything!” gasps @Eevachu.<br><br>Time to say bye, bye to Butterfry!",
"questButterflyCompletion": "After a blazing battle, the Flaming Butterfry is captured. “Great job catching that would-be arsonist,” says @Megan with a sigh of relief. “Still, its hard to vilify even the vilest butterfly. Wed better free this Butterfry someplace safe…like the desert.”<br><br>One of the other gardeners, @Beffymaroo, comes up to you, singed but smiling. “Will you help raise these foundling chrysalises we found? Perhaps next year well have a greener garden for them.”",
"questButterflyBoss": "Flaming Butterfry",
"questButterflyDropButterflyEgg": "Caterpillar (Egg)",
@@ -712,7 +712,7 @@
"questSeaSerpentUnlockText": "Unlocks Sea Serpent Eggs for purchase in the Market",
"questKangarooText": "Kangaroo Catastrophe",
"questKangarooNotes": "Maybe you should have finished that last task… you know, the one you keep avoiding, even though it always comes back around? But @Mewrose and @LilithofAlfheim invited you and @stefalupagus to see a rare kangaroo troop hopping through the Sloensteadi Savannah; how could you say no?! As the troop comes into view, something hits you on the back of the head with a mighty <em>whack!</em><br><br>Shaking the stars from your vision, you pick up the responsible objecta dark red boomerang, with the very task you continually push back etched into its surface. A quick glance around confirms the rest of your party met a similar fate. One larger kangaroo looks at you with a smug grin, like shes daring you to face her and that dreaded task once and for all!",
"questKangarooNotes": "Maybe you should have finished that last task… you know, the one you keep avoiding, even though it always comes back around? But @Mewrose and @LilithofAlfheim invited you and @stefalupagus to see a rare kangaroo troop hopping through the Sloensteadi Savannah; how could you say no?! As the troop comes into view, something hits you on the back of the head with a mighty <em>whack!</em><br><br>Shaking the stars from your vision, you pick up the responsible object--a dark red boomerang, with the very task you continually push back etched into its surface. A quick glance around confirms the rest of your party met a similar fate. One larger kangaroo looks at you with a smug grin, like shes daring you to face her and that dreaded task once and for all!",
"questKangarooCompletion": "“NOW!” You signal your party to throw the boomerangs back at the kangaroo. The beast hops further away with each hit until she flees, leaving nothing more than a dark red cloud of dust, a few eggs, and some gold coins.<br><br>@Mewrose walks forward to where the kangaroo once stood. “Hey, where did the boomerangs go?”<br><br>“They probably dissolved into dust, making that dark red cloud, when we finished our respective tasks,” @stefalupagus speculates.<br><br>@LilithofAlfheim squints at the horizon. “Is that another kangaroo troop heading our way?”<br><br>You all break into a run back to Habit City. Better to face your difficult tasks than take another lump to the back of the head!",
"questKangarooBoss": "Catastrophic Kangaroo",
"questKangarooDropKangarooEgg": "Kangaroo (Egg)",
@@ -784,7 +784,7 @@
"questAmberText": "The Amber Alliance",
"questAmberNotes": "Youre sitting in the Tavern with @beffymaroo and @-Tyr- when @Vikte bursts through the door and excitedly tells you about the rumors of another type of Magic Hatching Potion hidden in the Taskwoods. Having completed your Dailies, the three of you immediately agree to help @Vikte on their search. After all, whats the harm in a little adventure?<br><br>After walking through the Taskwoods for hours, youre beginning to regret joining such a wild chase. Youre about to head home, when you hear a surprised yelp and turn to see a huge lizard with shiny amber scales coiled around a tree, clutching @Vikte in her claws. @beffymaroo reaches for her sword.<br><br>“Wait!” cries @-Tyr-. “Its the Trerezin! Shes not dangerous, just dangerously clingy!”",
"questAmberCompletion": "“Trerezin?” @-Tyr- says calmly. “Could you let @Vikte go? I dont think theyre enjoying being so high up.”<br><br>The Trerezins amber skin blushes crimson and she gently lowers @Vikte to the ground. “My apologies! Its been so long since Ive had any guests that Ive forgotten my manners!” She slithers forward to greet you properly before disappearing into her treehouse, and returning with an armful of Amber Hatching Potions as thank-you gifts!<br><br>“Magic Potions!” @Vikte gasps.<br><br>“Oh, these old things?” The Trerezin's tongue flickers as she thinks. “How about this? Ill give you this whole stack if you promise to visit me every so often...”<br><br>And so you leave the Taskwoods, excited to tell everyone about the new potionsand your new friend!",
"questAmberCompletion": "“Trerezin?” @-Tyr- says calmly. “Could you let @Vikte go? I dont think theyre enjoying being so high up.”<br><br>The Trerezins amber skin blushes crimson and she gently lowers @Vikte to the ground. “My apologies! Its been so long since Ive had any guests that Ive forgotten my manners!” She slithers forward to greet you properly before disappearing into her treehouse, and returning with an armful of Amber Hatching Potions as thank-you gifts!<br><br>“Magic Potions!” @Vikte gasps.<br><br>“Oh, these old things?” The Trerezin's tongue flickers as she thinks. “How about this? Ill give you this whole stack if you promise to visit me every so often...”<br><br>And so you leave the Taskwoods, excited to tell everyone about the new potions--and your new friend!",
"questAmberBoss": "Trerezin",
"questAmberDropAmberPotion": "Amber Hatching Potion",
"questAmberUnlockText": "Unlocks Amber Hatching Potions for purchase in the Market",
@@ -800,7 +800,7 @@
"questWaffleText": "Waffling with the Fool: Disaster Breakfast!",
"questWaffleNotes": "“April Fool!” storms a flustered Lady Glaciate. “You said your dessert-themed prank was over with and completely cleaned up!”<br><br>“Why, it was and is, my dear,” replies the Fool, puzzled. “And I am the most honest of Fools. What's wrong?”<br><br>“There's a giant sugary monster approaching Habit City!”<br><br>“Hmm,” muses the Fool. “I did raid a few lairs for the mystic reagents for my last event. Maybe I attracted some unwanted attention. Is it the Saccharine Serpent? The Torte-oise? Tiramisu Rex?”<br><br>“No! It's some sort of... Awful Waffle!”<br><br>“Huh. That's a new one! Perhaps it spawned from all the ambient shenanigan energy.” He turns to you and @beffymaroo with a lopsided smile. “I don't suppose you'd be available for some heroics?”",
"questWaffleCompletion": "Battered and buttered but triumphant, you savor sweet victory as the Awful Waffle collapses into a pool of sticky goo.<br><br>“Wow, you really creamed that monster,” says Lady Glaciate, impressed.<br><br>“A piece of cake!” beams the April Fool.<br><br>“Kind of a shame, though,” says @beffymaroo. “It looked good enough to eat.”<br><br>The Fool takes a set of potion bottles from somewhere in his cape, fills them with the syrupy leavings of the Waffle, and mixes in a pinch of sparkling dust. The liquid swirls with colornew Hatching Potions! He tosses them into your arms. “All that adventure has given me an appetite. Who wants to join me for breakfast?”",
"questWaffleCompletion": "Battered and buttered but triumphant, you savor sweet victory as the Awful Waffle collapses into a pool of sticky goo.<br><br>“Wow, you really creamed that monster,” says Lady Glaciate, impressed.<br><br>“A piece of cake!” beams the April Fool.<br><br>“Kind of a shame, though,” says @beffymaroo. “It looked good enough to eat.”<br><br>The Fool takes a set of potion bottles from somewhere in his cape, fills them with the syrupy leavings of the Waffle, and mixes in a pinch of sparkling dust. The liquid swirls with color--new Hatching Potions! He tosses them into your arms. “All that adventure has given me an appetite. Who wants to join me for breakfast?”",
"questWaffleBoss": "Awful Waffle",
"questWaffleRageTitle": "Maple Mire",
"questWaffleRageDescription": "Maple Mire: This bar fills when you don't complete your Dailies. When it is full, the Awful Waffle will subtract from the pending damage that party members have built up!",
@@ -819,7 +819,7 @@
"questFluoriteUnlockText": "Unlocks Fluorite Hatching Potions for purchase in the Market",
"questWindupText": "A Whirl with a Wind-Up Warrior",
"questWindupNotes": "Habit City is seldom quiet, but you werent prepared for the cacophony of creaks, squeaks and screams escaping Good Timekeeping, Habiticas finest clockwork emporium. You sighyou just wanted your watch fixed. The proprietor, known only as “Great and Powerful”, tumbles out the door, pursued by a clanking copper colossus!<br><br>“Ki-! Ki-! Ki!” it clangs, arms smashing up and down. Its gears grind and screech in protest.<br><br>“My robot Clankton has gone mad! Its trying to kill me!” the supposedly Powerful one shrieks.<br><br>Even with a broken watch, you can tell when its time to fight. You leap forward to defend the panicking watchmaker. @Vikte and @a_diamond also step up to help!<br><br>“Ki-! Ki-! Ki-!” Clankton chants with each blow. “Mew!”<br><br>Wait, was that mechanical mewling amidst the murderous monotone?",
"questWindupNotes": "Habit City is seldom quiet, but you werent prepared for the cacophony of creaks, squeaks and screams escaping Good Timekeeping, Habiticas finest clockwork emporium. You sigh--you just wanted your watch fixed. The proprietor, known only as “Great and Powerful”, tumbles out the door, pursued by a clanking copper colossus!<br><br>“Ki-! Ki-! Ki!” it clangs, arms smashing up and down. Its gears grind and screech in protest.<br><br>“My robot Clankton has gone mad! Its trying to kill me!” the supposedly Powerful one shrieks.<br><br>Even with a broken watch, you can tell when its time to fight. You leap forward to defend the panicking watchmaker. @Vikte and @a_diamond also step up to help!<br><br>“Ki-! Ki-! Ki-!” Clankton chants with each blow. “Mew!”<br><br>Wait, was that mechanical mewling amidst the murderous monotone?",
"questWindupCompletion": "As you dodge the attacks, you notice something odd: a stripy brass tail sticking out of the robots chassis. You plunge a hand amid the grinding gears and pull out… a trembling wind-up tiger cub. It snuggles against your shirt.<br><br>The clockwork robot immediately stops flailing and smiles, its cogs clicking back into place. “Ki-Ki-Kitty! Kitty got in me!”<br><br>“Great!” the Powerful says, blushing. “Ive been working hard on these wind-up pet potions. I guess I lost track of my new creations. Ive been missing my Tidy the workshop daily a lot lately…”<br><br>You follow the tinkerer and Clankton inside. Parts, tools and potions cover every surface. “Powerful” takes your watch, but hands you a few potions.<br><br>“Take these. Clearly theyll be safer with you!”",
"questWindupBoss": "Clankton",
"questWindupDropWindupPotion": "Wind-Up Hatching Potion",

View File

@@ -180,9 +180,6 @@
"mysterySet202509": "Windswept Wanderer Set",
"mysterySet202510": "Gliding Ghoul Set",
"mysterySet202511": "Frost Warrior Set",
"mysterySet202512": "Cookie Champion Set",
"mysterySet202601": "Winter's Aegis Set",
"mysterySet202602": "Sakura Fox Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",

View File

@@ -674,15 +674,6 @@ const backgrounds = {
backgrounds112025: {
castle_keep_with_banners: { },
},
backgrounds122025: {
nighttime_street_with_shops: { },
},
backgrounds012026: {
winter_desert_with_saguaros: { },
},
backgrounds022026: {
elegant_palace: { },
},
eventBackgrounds: {
birthday_bash: {
price: 0,

View File

@@ -26,9 +26,6 @@ export const ARMOIRE_RELEASE_DATES = {
orangeLoungewear: { year: 2025, month: 9 },
blackHairbow: { year: 2025, month: 10 },
blacksmith: { year: 2025, month: 11 },
musicalInstrumentTwo: { year: 2025, month: 12 },
loneCowpoke: { year: 2026, month: 1 },
prettyInPink: { year: 2026, month: 2 },
};
export const EGGS_RELEASE_DATES = {

View File

@@ -62,11 +62,6 @@ const SEASONAL_SETS = {
'winter2025AuroraMageSet',
'winter2025StringLightsHealerSet',
'winter2025SnowRogueSet',
'winter2026RimeReaperWarriorSet',
'winter2026SkiRogueSet',
'winter2026PolarBearHealerSet',
'winter2026MidwinterCandleMageSet',
],
spring: [
// spring 2014

View File

@@ -2,15 +2,11 @@ import { back as baseBack } from './sets/base';
import { back as mysteryBack } from './sets/mystery';
import { back as specialBack } from './sets/special';
import armoire from './sets/armoire';
const back = {
base: baseBack,
mystery: mysteryBack,
special: specialBack,
get armoire () {
return armoire.back;
},
};
export default back;

View File

@@ -557,18 +557,6 @@ const armor = {
con: 11,
set: 'blacksmith',
},
loneCowpokeOutfit: {
con: 10,
set: 'loneCowpoke',
},
};
const back = {
harpsichord: {
int: 6,
per: 6,
set: 'musicalInstrumentTwo',
},
};
const body = {
@@ -1152,10 +1140,6 @@ const head = {
per: 11,
set: 'blacksmith',
},
loneCowpokeHat: {
per: 10,
set: 'loneCowpoke',
},
};
const shield = {
@@ -1534,18 +1518,6 @@ const shield = {
per: 8,
set: 'orangeLoungewear',
},
doubleBass: {
con: 6,
str: 6,
set: 'musicalInstrumentTwo',
},
prettyPinkGiftBox: {
con: 2,
int: 2,
per: 2,
str: 2,
set: 'prettyInPink',
},
};
const headAccessory = {
@@ -2065,25 +2037,12 @@ const weapon = {
str: 11,
set: 'blacksmith',
},
bambooFlute: {
con: 6,
int: 6,
set: 'musicalInstrumentTwo',
},
prettyPinkParasol: {
con: 2,
int: 2,
per: 2,
str: 2,
set: 'prettyInPink',
},
};
const releaseDay = 7;
forEach({
armor,
back,
body,
eyewear,
head,
@@ -2142,38 +2101,34 @@ function updateReleased (type) {
return returnType;
}
const memoizedUpdateReleased = memoize(updateReleased);
const memoizedUpdatReleased = memoize(updateReleased);
export default {
get armor () {
return memoizedUpdateReleased({ identifier: 'armor', memoizeConfig: true }, armor);
},
get back () {
return memoizedUpdateReleased({ identifier: 'back', memoizeConfig: true }, back);
return memoizedUpdatReleased({ identifier: 'armor', memoizeConfig: true }, armor);
},
get body () {
return memoizedUpdateReleased({ identifier: 'body', memoizeConfig: true }, body);
return memoizedUpdatReleased({ identifier: 'body', memoizeConfig: true }, body);
},
get eyewear () {
return memoizedUpdateReleased({ identifier: 'eyewear', memoizeConfig: true }, eyewear);
return memoizedUpdatReleased({ identifier: 'eyewear', memoizeConfig: true }, eyewear);
},
get head () {
return memoizedUpdateReleased({ identifier: 'head', memoizeConfig: true }, head);
return memoizedUpdatReleased({ identifier: 'head', memoizeConfig: true }, head);
},
get headAccessory () {
return memoizedUpdateReleased({ identifier: 'headAccessory', memoizeConfig: true }, headAccessory);
return memoizedUpdatReleased({ identifier: 'headAccessory', memoizeConfig: true }, headAccessory);
},
get shield () {
return memoizedUpdateReleased({ identifier: 'shield', memoizeConfig: true }, shield);
return memoizedUpdatReleased({ identifier: 'shield', memoizeConfig: true }, shield);
},
get weapon () {
return memoizedUpdateReleased({ identifier: 'weapon', memoizeConfig: true }, weapon);
return memoizedUpdatReleased({ identifier: 'weapon', memoizeConfig: true }, weapon);
},
// convenience method for tests mostly. Not used in the app
get all () {
const items = [];
items.push(...Object.values(this.armor));
items.push(...Object.values(this.back));
items.push(...Object.values(this.body));
items.push(...Object.values(this.eyewear));
items.push(...Object.values(this.head));

View File

@@ -71,7 +71,6 @@ const armor = {
202502: { },
202504: { },
202509: { },
202512: { },
301404: { },
301703: { },
301704: { },
@@ -120,8 +119,6 @@ const back = {
202506: { },
202507: { },
202510: { },
202601: { },
202602: { },
};
const body = {
@@ -252,8 +249,6 @@ const head = {
202503: { },
202504: { },
202507: { },
202512: { },
202602: { },
301404: { },
301405: { },
301703: { },
@@ -335,8 +330,6 @@ const weapon = {
202408: { },
202508: { },
202511: { },
202512: { },
202601: { },
301404: { },
};

View File

@@ -827,18 +827,6 @@ const armor = {
fall2025Rogue: {
set: 'fall2025SkeletonRogueSet',
},
winter2026Warrior: {
set: 'winter2026RimeReaperWarriorSet',
},
winter2026Mage: {
set: 'winter2026MidwinterCandleMageSet',
},
winter2026Healer: {
set: 'winter2026PolarBearHealerSet',
},
winter2026Rogue: {
set: 'winter2026SkiRogueSet',
},
};
const armorStats = {
@@ -1976,18 +1964,6 @@ const head = {
fall2025Rogue: {
set: 'fall2025SkeletonRogueSet',
},
winter2026Warrior: {
set: 'winter2026RimeReaperWarriorSet',
},
winter2026Mage: {
set: 'winter2026MidwinterCandleMageSet',
},
winter2026Healer: {
set: 'winter2026PolarBearHealerSet',
},
winter2026Rogue: {
set: 'winter2026SkiRogueSet',
},
};
const headStats = {
@@ -2718,15 +2694,6 @@ const shield = {
set: 'fall2025SkeletonRogueSet',
notes: t('shieldSpecialFall2025RogueNotes', { str: 8 }),
},
winter2026Warrior: {
set: 'winter2026RimeReaperWarriorSet',
},
winter2026Healer: {
set: 'winter2026PolarBearHealerSet',
},
winter2026Rogue: {
set: 'winter2026SkiRogueSet',
},
};
const shieldStats = {
@@ -3454,18 +3421,6 @@ const weapon = {
fall2025Rogue: {
set: 'fall2025SkeletonRogueSet',
},
winter2026Warrior: {
set: 'winter2026RimeReaperWarriorSet',
},
winter2026Mage: {
set: 'winter2026MidwinterCandleMageSet',
},
winter2026Healer: {
set: 'winter2026PolarBearHealerSet',
},
winter2026Rogue: {
set: 'winter2026SkiRogueSet',
},
};
const weaponStats = {

View File

@@ -67,7 +67,7 @@ spells.wizard = {
cast (user, target, req) {
let bonus = statsComputed(user).int * crit.crit(user, 'per');
bonus *= Math.ceil((target.value < 0 ? 1 : target.value + 1) * 0.075);
user.stats.exp += Math.ceil(diminishingReturns(bonus, 75));
user.stats.exp += diminishingReturns(bonus, 75);
if (!user.party.quest.progress.up) user.party.quest.progress.up = 0;
user.party.quest.progress.up += Math.ceil(statsComputed(user).int * 0.1);
updateStats(user, user.stats, req);
@@ -122,9 +122,9 @@ spells.warrior = {
notes: t('spellWarriorSmashNotes'),
cast (user, target) {
const bonus = statsComputed(user).str * crit.crit(user, 'con');
target.value += Math.ceil(diminishingReturns(bonus, 2.5, 35));
target.value += diminishingReturns(bonus, 2.5, 35);
if (!user.party.quest.progress.up) user.party.quest.progress.up = 0;
user.party.quest.progress.up += Math.ceil(diminishingReturns(bonus, 55, 70));
user.party.quest.progress.up += diminishingReturns(bonus, 55, 70);
},
},
defensiveStance: { // Defensive Stance
@@ -174,7 +174,7 @@ spells.rogue = {
notes: t('spellRoguePickPocketNotes'),
cast (user, target) {
const bonus = calculateBonus(target.value, statsComputed(user).per);
user.stats.gp += Math.ceil(diminishingReturns(bonus, 25, 75));
user.stats.gp += diminishingReturns(bonus, 25, 75);
},
},
backStab: { // Backstab
@@ -186,8 +186,8 @@ spells.rogue = {
cast (user, target, req) {
const _crit = crit.crit(user, 'str', 0.3);
const bonus = calculateBonus(target.value, statsComputed(user).str, _crit);
user.stats.exp += Math.ceil(diminishingReturns(bonus, 75, 50));
user.stats.gp += Math.ceil(diminishingReturns(bonus, 18, 75));
user.stats.exp += diminishingReturns(bonus, 75, 50);
user.stats.gp += diminishingReturns(bonus, 18, 75);
updateStats(user, user.stats, req);
},
},
@@ -225,7 +225,7 @@ spells.healer = {
notes: t('spellHealerHealNotes'),
cast (user, target, req) {
if (user.stats.hp >= 50) throw new NotAuthorized(t('messageHealthAlreadyMax')(req.language));
user.stats.hp += Math.ceil((statsComputed(user).con + statsComputed(user).int + 5) * 0.075);
user.stats.hp += (statsComputed(user).con + statsComputed(user).int + 5) * 0.075;
if (user.stats.hp > 50) user.stats.hp = 50;
},
},
@@ -238,7 +238,7 @@ spells.healer = {
cast (user, tasks) {
each(tasks, task => {
if (task.type !== 'reward') {
task.value += Math.ceil(4 * (statsComputed(user).int / (statsComputed(user).int + 40)));
task.value += 4 * (statsComputed(user).int / (statsComputed(user).int + 40));
}
});
},
@@ -263,7 +263,7 @@ spells.healer = {
notes: t('spellHealerHealAllNotes'),
cast (user, target) {
each(target, member => {
member.stats.hp += Math.ceil((statsComputed(user).con + statsComputed(user).int + 5) * 0.04);
member.stats.hp += (statsComputed(user).con + statsComputed(user).int + 5) * 0.04;
if (member.stats.hp > 50) member.stats.hp = 50;
});
},

View File

@@ -94,11 +94,7 @@ function _calculateReverseDelta (task, direction) {
function _gainMP (user, val) {
val *= user._tmp.crit || 1; // eslint-disable-line no-param-reassign
if (val < 0) {
user.stats.mp += Math.floor(val);
} else {
user.stats.mp += Math.ceil(val);
}
user.stats.mp += val;
if (user.stats.mp >= statsComputed(user).maxMP) user.stats.mp = statsComputed(user).maxMP;
if (user.stats.mp < 0) {
@@ -115,7 +111,7 @@ function _subtractPoints (user, task, stats, delta) {
if (conBonus < 0.1) conBonus = 0.1;
const hpMod = delta * conBonus * task.priority * 2; // constant 2 multiplier for better results
stats.hp += Math.round(hpMod); // round to 0dp
stats.hp += Math.round(hpMod * 10) / 10; // round to 1dp
return stats.hp;
}
@@ -143,9 +139,9 @@ function _addPoints (user, task, stats, direction, delta) {
user._tmp.streakBonus = afterStreak - gpMod;
}
stats.gp += Math.round(afterStreak);
stats.gp += afterStreak;
} else {
stats.gp += Math.round(gpMod);
stats.gp += gpMod;
}
}
@@ -187,10 +183,7 @@ function _changeTaskValue (user, task, direction, times, cron) {
addToDelta += nextDelta;
});
if (addToDelta < 0) {
return Math.floor(addToDelta);
}
return Math.ceil(addToDelta);
return addToDelta;
}
function _updateCounter (task, direction, times) {

View File

@@ -1051,21 +1051,21 @@ schema.methods._processBossQuest = async function processBossQuest (options) {
type: 'boss_dont_attack',
user: user.profile.name,
quest: group.quest.key,
userDamage: progress.up.toFixed(0),
userDamage: progress.up.toFixed(1),
},
});
promises.push(groupMessage.save());
} else {
const groupMessage = await group.sendChat({
message: `\`${shared.i18n.t('chatBossDamage', {
username: user.profile.name, bossName: quest.boss.name('en'), userDamage: progress.up.toFixed(0), bossDamage: Math.abs(down).toFixed(0),
username: user.profile.name, bossName: quest.boss.name('en'), userDamage: progress.up.toFixed(1), bossDamage: Math.abs(down).toFixed(1),
}, user.preferences.language)}\``,
info: {
type: 'boss_damage',
user: user.profile.name,
quest: group.quest.key,
userDamage: progress.up.toFixed(0),
bossDamage: Math.abs(down).toFixed(0),
userDamage: progress.up.toFixed(1),
bossDamage: Math.abs(down).toFixed(1),
},
});
promises.push(groupMessage.save());