From 6a2dcb7e3df237dca254ecacaec2438b5bba7820 Mon Sep 17 00:00:00 2001 From: Freddie Date: Wed, 18 Mar 2026 18:41:44 -0700 Subject: [PATCH 1/9] Fix some console spam --- apps/frontend/user-home/state/user/derived.svelte.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/frontend/user-home/state/user/derived.svelte.ts b/apps/frontend/user-home/state/user/derived.svelte.ts index 579a5b6e8..222d2621c 100644 --- a/apps/frontend/user-home/state/user/derived.svelte.ts +++ b/apps/frontend/user-home/state/user/derived.svelte.ts @@ -698,8 +698,6 @@ export class DataUserDerived { charChore.name ||= chore.name; - if (chore.key === 'preyRep') console.log(character.name, charChore); - return charChore; } From 695cb4315c709cdd345f6ea9538497f7880919b8 Mon Sep 17 00:00:00 2001 From: Freddie Date: Wed, 18 Mar 2026 20:39:48 -0700 Subject: [PATCH 2/9] Show weekly currency cap on home currencies --- .../table/row/HomeTableRowCurrencies.svelte | 4 +- .../utils/characters/get-currency-data.ts | 15 ++++++- .../ApiUserCharacterCurrencyConverter.cs | 41 ++++--------------- 3 files changed, 22 insertions(+), 38 deletions(-) diff --git a/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte b/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte index 1c3a68538..ec7a553d8 100644 --- a/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte +++ b/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte @@ -26,14 +26,14 @@ {@const currency = currencyId < 1000000 ? wowthingData.static.currencyById.get(currencyId) : undefined} {@const itemId = currencyId > 1000000 ? currencyId - 1000000 : 0} - {@const { amount, amountRaw, percent, tooltip } = getCurrencyData( + {@const { amount, amountRaw, percent, tooltip, weekMax } = getCurrencyData( $timeStore, character, currency, itemId )} {#if amount} - {@const good = currencyGood[currencyId]} + {@const good = currencyGood[currencyId] || weekMax || 0} = good} diff --git a/apps/frontend/utils/characters/get-currency-data.ts b/apps/frontend/utils/characters/get-currency-data.ts index b23d26fa2..64e628f46 100644 --- a/apps/frontend/utils/characters/get-currency-data.ts +++ b/apps/frontend/utils/characters/get-currency-data.ts @@ -18,6 +18,8 @@ interface CharacterCurrencyData { capRemaining: number; percent: number; tooltip: string; + weekAmount: number; + weekMax: number; } export function getCurrencyData( @@ -32,6 +34,8 @@ export function getCurrencyData( capRemaining: 0, percent: 0, tooltip: '', + weekAmount: 0, + weekMax: 0, }; if (currency) { @@ -56,19 +60,26 @@ export function getCurrencyData( const amount = characterCurrency.quantity; ret.amount = toNiceNumber(amount); ret.amountRaw = amount; + ret.weekAmount = characterCurrency.weekQuantity; + ret.weekMax = characterCurrency.weekMax; if (characterCurrency.isMovingMax && characterCurrency.max > 0) { ret.capRemaining = characterCurrency.max - characterCurrency.totalQuantity; ret.percent = (characterCurrency.totalQuantity / characterCurrency.max) * 100; ret.tooltip = `${characterCurrency.totalQuantity.toLocaleString()} / ${characterCurrency.max.toLocaleString()}`; } else { + ret.tooltip = amount.toLocaleString(); + if (characterCurrency.max > 0) { ret.capRemaining = characterCurrency.max - amount; ret.percent = (amount / characterCurrency.max) * 100; - ret.tooltip = `${amount.toLocaleString()} / ${characterCurrency.max.toLocaleString()}`; + ret.tooltip = `${ret.tooltip} / ${characterCurrency.max.toLocaleString()}`; + } else if (characterCurrency.weekMax > 0) { + ret.capRemaining = characterCurrency.weekMax - characterCurrency.weekQuantity; + ret.percent = (characterCurrency.weekQuantity / characterCurrency.weekMax) * 100; + extraTooltip = `${characterCurrency.weekQuantity.toLocaleString()} / ${characterCurrency.weekMax.toLocaleString()} weekly cap`; } else { ret.percent = 0; - ret.tooltip = amount.toLocaleString(); } } ret.tooltip += ` ${currency.name}`; diff --git a/apps/web/Converters/ApiUserCharacterCurrencyConverter.cs b/apps/web/Converters/ApiUserCharacterCurrencyConverter.cs index 09e28f8c7..dad1ff14c 100644 --- a/apps/web/Converters/ApiUserCharacterCurrencyConverter.cs +++ b/apps/web/Converters/ApiUserCharacterCurrencyConverter.cs @@ -14,40 +14,13 @@ public override void Write(Utf8JsonWriter writer, ApiUserCharacterCurrency curre writer.WriteStartArray(); writer.WriteNumberValue(currency.CurrencyId); - - bool useQuantity = currency.Quantity > 0; - bool useMax = currency.Max > 0; - bool useTotalQuantity = currency.TotalQuantity > 0; - bool useIsMovingMax = currency.IsMovingMax; - bool useWeekly = currency.IsWeekly; - - if (useWeekly || useIsMovingMax || useTotalQuantity || useMax || useQuantity) - { - writer.WriteNumberValue(currency.Quantity); - } - - if (useWeekly || useIsMovingMax || useTotalQuantity || useMax) - { - writer.WriteNumberValue(currency.Max); - } - - if (useWeekly || useIsMovingMax || useTotalQuantity) - { - writer.WriteNumberValue(currency.TotalQuantity); - } - - if (useWeekly || useIsMovingMax) - { - writer.WriteNumberValue(currency.IsMovingMax ? 1 : 0); - } - - if (useWeekly) - { - writer.WriteNumberValue(currency.IsWeekly ? 1 : 0); - writer.WriteNumberValue(currency.WeekQuantity); - writer.WriteNumberValue(currency.WeekMax); - } - + writer.WriteNumberValue(currency.Quantity); + writer.WriteNumberValue(currency.Max); + writer.WriteNumberValue(currency.TotalQuantity); + writer.WriteNumberValue(currency.IsMovingMax ? 1 : 0); + writer.WriteNumberValue(currency.IsWeekly ? 1 : 0); + writer.WriteNumberValue(currency.WeekQuantity); + writer.WriteNumberValue(currency.WeekMax); writer.WriteEndArray(); } } From 76e782d831a5c314289d3d629c89ac4a1589772b Mon Sep 17 00:00:00 2001 From: Freddie Date: Thu, 19 Mar 2026 21:52:07 -0700 Subject: [PATCH 3/9] Fix status color on weekly currencies --- .../components/home/table/row/HomeTableRowCurrencies.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte b/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte index ec7a553d8..10cc39a89 100644 --- a/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte +++ b/apps/frontend/components/home/table/row/HomeTableRowCurrencies.svelte @@ -26,17 +26,18 @@ {@const currency = currencyId < 1000000 ? wowthingData.static.currencyById.get(currencyId) : undefined} {@const itemId = currencyId > 1000000 ? currencyId - 1000000 : 0} - {@const { amount, amountRaw, percent, tooltip, weekMax } = getCurrencyData( + {@const { amount, amountRaw, percent, tooltip, weekAmount, weekMax } = getCurrencyData( $timeStore, character, currency, itemId )} {#if amount} + {@const checkAmount = weekMax ? weekAmount : amountRaw} {@const good = currencyGood[currencyId] || weekMax || 0} = good} + class:status-success={good && checkAmount >= good} class:status-shrug={percent >= 50 && percent < 100} class:status-fail={percent >= 100} class:got-none={amount === '0' && percent === 0} From dcbef053d5bc5f19a3a8fa3852211c557b36d827 Mon Sep 17 00:00:00 2001 From: Freddie Date: Fri, 20 Mar 2026 18:11:21 -0700 Subject: [PATCH 4/9] Show upcoming renown rewards on tooltip --- .../tooltips/reputation/RenownRewards.svelte | 46 +++++++++++++++++++ .../reputation/TooltipReputationRenown.svelte | 43 +++++++++++------ .../shared/stores/data/static/process.ts | 1 + .../shared/stores/data/static/types.ts | 1 + 4 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 apps/frontend/components/tooltips/reputation/RenownRewards.svelte diff --git a/apps/frontend/components/tooltips/reputation/RenownRewards.svelte b/apps/frontend/components/tooltips/reputation/RenownRewards.svelte new file mode 100644 index 000000000..afa807260 --- /dev/null +++ b/apps/frontend/components/tooltips/reputation/RenownRewards.svelte @@ -0,0 +1,46 @@ + + + + + + + {#each rewards as { level, names, toastDescriptions } (level)} + + + + + {/each} + +
{level} + {#each { length: names.length }, index} + {@const name = names[index]} + {@const desc = toastDescriptions[index]} +
+ {#if desc} + {desc} + {:else} + {name || '???'} - ??? + {/if} +
+ {/each} +
diff --git a/apps/frontend/components/tooltips/reputation/TooltipReputationRenown.svelte b/apps/frontend/components/tooltips/reputation/TooltipReputationRenown.svelte index 42aebe0a7..d5c0d1b19 100644 --- a/apps/frontend/components/tooltips/reputation/TooltipReputationRenown.svelte +++ b/apps/frontend/components/tooltips/reputation/TooltipReputationRenown.svelte @@ -2,32 +2,41 @@ import { Constants } from '@/data/constants'; import { wowthingData } from '@/shared/stores/data'; import type { StaticDataReputation } from '@/shared/stores/static/types'; - import type { Character, CharacterReputationParagon } from '@/types'; + import type { CharacterReputationParagon } from '@/types'; import type { ManualDataReputationSet } from '@/types/data/manual'; + import type { CharacterProps } from '@/types/props'; import ProgressBar from '@/components/common/ProgressBar.svelte'; + import RenownRewards from './RenownRewards.svelte'; import WowthingImage from '@/shared/components/images/sources/WowthingImage.svelte'; - export let character: Character; - export let characterParagon: CharacterReputationParagon = undefined; - export let characterRep: number; - export let dataRep: StaticDataReputation; - export let reputation: ManualDataReputationSet = undefined; + type Props = CharacterProps & { + characterRep: number; + dataRep: StaticDataReputation; + characterParagon?: CharacterReputationParagon; + reputation?: ManualDataReputationSet; + }; + let { character, characterRep, dataRep, characterParagon, reputation }: Props = $props(); - let progress: number; - let tier: number; + let maxRenown = $derived( + wowthingData.static.currencyById.get(dataRep.renownCurrencyId)?.maxTotal || 1 + ); + let renownValue = $derived(dataRep.maxValues[0] || 2500); + let tier = $derived(Math.floor(characterRep / renownValue)); + let progress = $derived( + tier < maxRenown ? characterRep % renownValue : characterParagon?.current || 0 + ); - $: maxRenown = wowthingData.static.currencyById.get(dataRep.renownCurrencyId)?.maxTotal || 1; - $: renownValue = dataRep.maxValues[0] || 2500; - $: { - tier = Math.floor(characterRep / renownValue); - progress = tier < maxRenown ? characterRep % renownValue : characterParagon?.current || 0; - } + let upcomingRewards = $derived( + (wowthingData.static.renownRewards[dataRep.id] || []).filter( + (reward) => reward.level > tier + ) + ); -
+
0 ? '25rem' : '15rem'}>

{#if reputation?.both === undefined && character} {#if upcomingRewards.length > 0} - + {/if}

From 0e97904a08164cee5b707c7236e6182b2fac17de Mon Sep 17 00:00:00 2001 From: Freddie Date: Sat, 21 Mar 2026 11:04:42 -0700 Subject: [PATCH 6/9] Add Lost Legends chore --- apps/frontend/data/constants.ts | 5 +++++ apps/frontend/data/tasks/11-midnight/12-0-0.ts | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/apps/frontend/data/constants.ts b/apps/frontend/data/constants.ts index d87d30acb..77c98f0a1 100644 --- a/apps/frontend/data/constants.ts +++ b/apps/frontend/data/constants.ts @@ -35,6 +35,11 @@ export abstract class Constants { loammNiffen: 2564, delveBrann: 2640, delveValeera: 2744, + + midnightAmani: 2696, + midnightHarati: 2704, + midnightSingulatity: 2699, + midnightSilvermoon: 2710, }; // static JSON -> itemBonusListGroups -> match upgradeTiers IDs diff --git a/apps/frontend/data/tasks/11-midnight/12-0-0.ts b/apps/frontend/data/tasks/11-midnight/12-0-0.ts index 210c19fdc..fbb3cc9c2 100644 --- a/apps/frontend/data/tasks/11-midnight/12-0-0.ts +++ b/apps/frontend/data/tasks/11-midnight/12-0-0.ts @@ -211,6 +211,15 @@ export const midChores12_0_0: Task = { }, ], }, + { + key: 'midLostLegends', + name: 'Lost Legends', + icon: iconLibrary.gameSecretBook, + minimumLevel: 83, + accountWide: true, + questReset: DbResetType.Weekly, + questIds: [89268], + }, { key: 'midDungeon', name: 'Dungeon', From 798def4d097aea13f7d5c86ed14bb8b10663d48f Mon Sep 17 00:00:00 2001 From: Freddie Date: Sat, 21 Mar 2026 14:16:47 -0700 Subject: [PATCH 7/9] Update prey chores to track reward bags --- apps/frontend/data/tasks/11-midnight/prey.ts | 155 ++++--------------- apps/frontend/shared/icons/library.ts | 2 + apps/frontend/types/tasks.ts | 1 + 3 files changed, 32 insertions(+), 126 deletions(-) diff --git a/apps/frontend/data/tasks/11-midnight/prey.ts b/apps/frontend/data/tasks/11-midnight/prey.ts index ca91b3b08..d54e19915 100644 --- a/apps/frontend/data/tasks/11-midnight/prey.ts +++ b/apps/frontend/data/tasks/11-midnight/prey.ts @@ -1,124 +1,11 @@ import { iconLibrary } from '@/shared/icons'; import { DbResetType } from '@/shared/stores/db/enums'; -import type { Character } from '@/types'; -import type { Chore, Task } from '@/types/tasks'; +import type { Task } from '@/types/tasks'; import { userState } from '@/user-home/state/user'; -const normalQuestIds: number[] = [ - 91114, // Prey: Consul Nebulor (Normal) - 91112, // Prey: Crusader Luxia Maxwell (Normal) - 91100, // Prey: Deliah Gloomsong (Normal) - 91124, // Prey: Dengzag, the Darkened Blaze (Normal) - 91115, // Prey: Executor Kaenius (Normal) - 91123, // Prey: Grothoz, the Burning Shadow (Normal) - 91111, // Prey: High Vindicator Vureem (Normal) - 91116, // Prey: Imperator Enigmalia (Normal) - 91103, // Prey: Jo'zolo the Breaker (Normal) - 91117, // Prey: Knight-Errant Bloodshatter (Normal) - 91098, // Prey: L-N-0R the Recycler (Normal) - 91110, // Prey: Lamyne of the Undercroft (Normal) - 91108, // Prey: Lieutenant Blazewing (Normal) - 91119, // Prey: Lost Theldrin (Normal) - 91095, // Prey: Magister Sunbreaker (Normal) - 91096, // Prey: Magistrix Emberlash (Normal) - 91099, // Prey: Mordril Shadowfell (Normal) - 91102, // Prey: Nexus-Edge Hadim (Normal) - 91120, // Prey: Neydra the Starving (Normal) - 91109, // Prey: Petyoll the Razorleaf (Normal) - 91101, // Prey: Phaseblade Talasha (Normal) - 91113, // Prey: Praetor Singularis (Normal) - 91107, // Prey: Ranger Swiftglade (Normal) - 91097, // Prey: Senior Tinker Ozwold (Normal) - 91105, // Prey: The Talon of Janali (Normal) - 91106, // Prey: The Wing of Akil'zon (Normal) - 91122, // Prey: Thorn-Witch Liset (Normal) - 91121, // Prey: Thornspeaker Edgath (Normal) - 91118, // Prey: Vylenna the Defector (Normal) - 91104, // Prey: Zadu, Fist of Nalorakk (Normal) -]; - -const hardQuestIds: number[] = [ - 91245, // Prey: Consul Nebulor (Hard) - 91243, // Prey: Crusader Luxia Maxwell (Hard) - 91220, // Prey: Deliah Gloomsong (Hard) - 91255, // Prey: Dengzag, the Darkened Blaze (Hard) - 91246, // Prey: Executor Kaenius (Hard) - 91254, // Prey: Grothoz, the Burning Shadow (Hard) - 91242, // Prey: High Vindicator Vureem (Hard) - 91247, // Prey: Imperator Enigmalia (Hard) - 91226, // Prey: Jo'zolo the Breaker (Hard) - 91248, // Prey: Knight-Errant Bloodshatter (Hard) - 91216, // Prey: L-N-0R the Recycler (Hard) - 91240, // Prey: Lamyne of the Undercroft (Hard) - 91236, // Prey: Lieutenant Blazewing (Hard) - 91250, // Prey: Lost Theldrin (Hard) - 91210, // Prey: Magister Sunbreaker (Hard) - 91212, // Prey: Magistrix Emberlash (Hard) - 91218, // Prey: Mordril Shadowfell (Hard) - 91224, // Prey: Nexus-Edge Hadim (Hard) - 91251, // Prey: Neydra the Starving (Hard) - 91238, // Prey: Petyoll the Razorleaf (Hard) - 91222, // Prey: Phaseblade Talasha (Hard) - 91244, // Prey: Praetor Singularis (Hard) - 91234, // Prey: Ranger Swiftglade (Hard) - 91214, // Prey: Senior Tinker Ozwold (Hard) - 91230, // Prey: The Talon of Janali (Hard) - 91232, // Prey: The Wing of Akil'zon (Hard) - 91253, // Prey: Thorn-Witch Liset (Hard) - 91252, // Prey: Thornspeaker Edgath (Hard) - 91249, // Prey: Vylenna the Defector (Hard) - 91228, // Prey: Zadu, Fist of Nalorakk (Hard) -]; - -const nightmareQuestIds: number[] = [ - 91259, // Prey: Consul Nebulor (Nightmare) - 91257, // Prey: Crusader Luxia Maxwell (Nightmare) - 91221, // Prey: Deliah Gloomsong (Nightmare) - 91269, // Prey: Dengzag, the Darkened Blaze (Nightmare) - 91260, // Prey: Executor Kaenius (Nightmare) - 91268, // Prey: Grothoz, the Burning Shadow (Nightmare) - 91256, // Prey: High Vindicator Vureem (Nightmare) - 91261, // Prey: Imperator Enigmalia (Nightmare) - 91227, // Prey: Jo'zolo the Breaker (Nightmare) - 91262, // Prey: Knight-Errant Bloodshatter (Nightmare) - 91217, // Prey: L-N-0R the Recycler (Nightmare) - 91241, // Prey: Lamyne of the Undercroft (Nightmare) - 91237, // Prey: Lieutenant Blazewing (Nightmare) - 91264, // Prey: Lost Theldrin (Nightmare) - 91211, // Prey: Magister Sunbreaker (Nightmare) - 91213, // Prey: Magistrix Emberlash (Nightmare) - 91219, // Prey: Mordril Shadowfell (Nightmare) - 91225, // Prey: Nexus-Edge Hadim (Nightmare) - 91265, // Prey: Neydra the Starving (Nightmare) - 91239, // Prey: Petyoll the Razorleaf (Nightmare) - 91223, // Prey: Phaseblade Talasha (Nightmare) - 91258, // Prey: Praetor Singularis (Nightmare) - 91235, // Prey: Ranger Swiftglade (Nightmare) - 91215, // Prey: Senior Tinker Ozwold (Nightmare) - 91231, // Prey: The Talon of Janali (Nightmare) - 91233, // Prey: The Wing of Akil'zon (Nightmare) - 91267, // Prey: Thorn-Witch Liset (Nightmare) - 91266, // Prey: Thornspeaker Edgath (Nightmare) - 91263, // Prey: Vylenna the Defector (Nightmare) - 91229, // Prey: Zadu, Fist of Nalorakk (Nightmare) -]; - -const preyFunc = (questIds: number[], index: number) => { - return (char: Character) => { - const charQuests = userState.quests.characterById.get(char.id); - const completedOrInProgress = questIds.filter( - (questId) => - charQuests.hasQuestById.has(questId) || - charQuests.progressQuestByKey.has(`q${questId}`) - ); - - if (completedOrInProgress[index]) { - return [completedOrInProgress[index]]; - } else { - return questIds.filter((questId) => !completedOrInProgress.includes(questId)); - } - }; -}; +const NORMAL_UNLOCK = 93086; // To the Sanctum! +const HEROIC_UNLOCK = 92177; // One Hero's Prey +const NIGHTMARE_UNLOCK = 92182; // The Sheep or the Wolf export const midPrey: Task = { key: 'midPrey', @@ -139,32 +26,48 @@ export const midPrey: Task = { }, { key: 'preyNormal', - name: 'Normal', + name: 'Normal - {item:257023}', icon: iconLibrary.notoClownFace, alwaysStarted: true, - questCount: 4, + questCount: 2, questReset: DbResetType.Weekly, - questIds: normalQuestIds, + questIds: [93168, 93156], + couldGetFunc: (char) => + userState.quests.characterById.get(char.id)?.hasQuestById?.has(NORMAL_UNLOCK), }, { key: 'preyHard', - name: 'Hard', + name: 'Hard - {item:257026}', icon: iconLibrary.notoCowboyHatFace, minimumLevel: 90, alwaysStarted: true, - questCount: 4, + questCount: 2, questReset: DbResetType.Weekly, - questIds: hardQuestIds, + questIds: [93169, 93857], + couldGetFunc: (char) => + userState.quests.characterById.get(char.id)?.hasQuestById?.has(HEROIC_UNLOCK), }, { key: 'preyNightmare', - name: 'Nightmare', + name: 'Nightmare- {item:262346}', icon: iconLibrary.notoAngryFaceWithHorns, minimumLevel: 90, alwaysStarted: true, - questCount: 4, + questCount: 2, + questReset: DbResetType.Weekly, + questIds: [93170, 93861], + couldGetFunc: (char) => + userState.quests.characterById.get(char.id)?.hasQuestById?.has(NIGHTMARE_UNLOCK), + }, + { + key: 'preyNightmarishTask', + name: 'A Nightmarish Task', + icon: iconLibrary.notoV1AngryFaceWithHorns, + minimumLevel: 90, questReset: DbResetType.Weekly, - questIds: nightmareQuestIds, + questIds: [94446], + couldGetFunc: (char) => + userState.quests.characterById.get(char.id)?.hasQuestById?.has(NIGHTMARE_UNLOCK), }, ], }; diff --git a/apps/frontend/shared/icons/library.ts b/apps/frontend/shared/icons/library.ts index 507e0cc07..bd7c87418 100644 --- a/apps/frontend/shared/icons/library.ts +++ b/apps/frontend/shared/icons/library.ts @@ -198,6 +198,8 @@ export { default as notoSnowflake } from '@iconify/icons-noto/snowflake'; export { default as notoSunWithFace } from '@iconify/icons-noto/sun-with-face'; export { default as notoWaterWave } from '@iconify/icons-noto/water-wave'; +export { default as notoV1AngryFaceWithHorns } from '~icons/noto-v1/angry-face-with-horns'; + export { default as openmojiFlagFrance } from '@iconify/icons-openmoji/flag-france'; export { default as openmojiFlagGermany } from '@iconify/icons-openmoji/flag-germany'; export { default as openmojiFlagItaly } from '@iconify/icons-openmoji/flag-italy'; diff --git a/apps/frontend/types/tasks.ts b/apps/frontend/types/tasks.ts index 6e3086335..136b141e2 100644 --- a/apps/frontend/types/tasks.ts +++ b/apps/frontend/types/tasks.ts @@ -15,6 +15,7 @@ export type Task = { requiredHolidays?: Holiday[]; requiredQuestId?: number; showSeparate?: boolean; + sumChores?: boolean; chores: Chore[]; }; From a81516c0451994c44d014bc6c91cafdc2982ba3a Mon Sep 17 00:00:00 2001 From: Freddie Date: Sat, 21 Mar 2026 14:29:50 -0700 Subject: [PATCH 8/9] Support Task.sumChores --- apps/frontend/user-home/state/user/derived.svelte.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/frontend/user-home/state/user/derived.svelte.ts b/apps/frontend/user-home/state/user/derived.svelte.ts index 222d2621c..f38e6de9e 100644 --- a/apps/frontend/user-home/state/user/derived.svelte.ts +++ b/apps/frontend/user-home/state/user/derived.svelte.ts @@ -412,10 +412,18 @@ export class DataUserDerived { } if (!charChore.skipped) { - charTask.countTotal++; + if (task.sumChores) { + charTask.countTotal += charChore.progressTotal; + } else { + charTask.countTotal++; + } if (charChore.status === QuestStatus.Completed) { - charTask.countCompleted++; + if (task.sumChores) { + charTask.countCompleted += charChore.progressCurrent; + } else { + charTask.countCompleted++; + } } else if (charChore.status === QuestStatus.InProgress) { charTask.status ||= QuestStatus.InProgress; charTask.countStarted++; From b79f356eda074cd7dd9e85541964ab7ed2f7614c Mon Sep 17 00:00:00 2001 From: Freddie Date: Sat, 21 Mar 2026 14:39:34 -0700 Subject: [PATCH 9/9] Better prey unlock states --- .../tooltips/task/TooltipTaskRow.svelte | 18 +++++--- apps/frontend/data/constants.ts | 4 ++ apps/frontend/data/tasks/11-midnight/prey.ts | 44 ++++++++++++++----- .../user-home/state/user/derived.svelte.ts | 16 +++---- 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/apps/frontend/components/tooltips/task/TooltipTaskRow.svelte b/apps/frontend/components/tooltips/task/TooltipTaskRow.svelte index 58f6451e9..a96c597dd 100644 --- a/apps/frontend/components/tooltips/task/TooltipTaskRow.svelte +++ b/apps/frontend/components/tooltips/task/TooltipTaskRow.svelte @@ -1,4 +1,5 @@