Skip to content

Commit bb93214

Browse files
committed
add item timings
1 parent aaac9e2 commit bb93214

2 files changed

Lines changed: 38 additions & 8 deletions

File tree

src/routes/goals/[goalId]/+page.svelte

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
let goalId = $derived($page.params.goalId);
99
let goal = $state(null);
1010
let matchData = $state([]);
11+
let items = $state([]);
1112
let isLoading = $state(true);
1213
let error = $state("");
1314
@@ -115,15 +116,29 @@
115116
isLoading = true;
116117
error = "";
117118
try {
118-
goal = await invoke("get_goal", { goalId: parseInt(goalId) });
119-
matchData = await invoke("get_goal_histogram_data", { goalId: parseInt(goalId) });
119+
[goal, matchData, items] = await Promise.all([
120+
invoke("get_goal", { goalId: parseInt(goalId) }),
121+
invoke("get_goal_histogram_data", { goalId: parseInt(goalId) }),
122+
invoke("get_all_items"),
123+
]);
120124
} catch (e) {
121125
error = `Failed to load goal data: ${e}`;
122126
} finally {
123127
isLoading = false;
124128
}
125129
}
126130
131+
function getItemName(itemId) {
132+
const item = items.find(i => i.id === itemId);
133+
return item ? item.display_name : `Item ${itemId}`;
134+
}
135+
136+
function formatSeconds(totalSeconds) {
137+
const minutes = Math.floor(totalSeconds / 60);
138+
const seconds = totalSeconds % 60;
139+
return `${minutes}:${seconds.toString().padStart(2, "0")}`;
140+
}
141+
127142
function resetFilters() {
128143
selectedHeroId = "";
129144
startDate = "";
@@ -140,6 +155,8 @@
140155
return "Last Hits";
141156
case "Level":
142157
return "Level";
158+
case "ItemTiming":
159+
return "Item Timing";
143160
default:
144161
return metric;
145162
}
@@ -155,6 +172,8 @@
155172
return "CS";
156173
case "Level":
157174
return "";
175+
case "ItemTiming":
176+
return "M:SS";
158177
default:
159178
return "";
160179
}
@@ -163,11 +182,20 @@
163182
function formatGoalDescription(g) {
164183
if (!g) return "";
165184
const heroName = g.hero_id !== null ? getHeroName(g.hero_id) : "Any Hero";
166-
const metricLabel = getMetricLabel(g.metric);
185+
if (g.metric === "ItemTiming") {
186+
const itemName = g.item_id !== null ? getItemName(g.item_id) : "Unknown Item";
187+
const timeStr = formatSeconds(g.target_value);
188+
return `${heroName}: ${itemName} by ${timeStr}`;
189+
}
167190
const unit = getMetricUnit(g.metric);
168191
const valueStr = unit ? `${g.target_value} ${unit}` : `Level ${g.target_value}`;
169192
return `${heroName}: ${valueStr} by ${g.target_time_minutes} min`;
170193
}
194+
195+
function formatStatValue(value, metric) {
196+
if (metric === "ItemTiming") return formatSeconds(value);
197+
return value;
198+
}
171199
</script>
172200

173201
{#if isLoading}
@@ -245,12 +273,12 @@
245273
</div>
246274
<div class="stat-card">
247275
<div class="stat-label">Average</div>
248-
<div class="stat-value">{stats().avgValue} {getMetricUnit(goal.metric)}</div>
276+
<div class="stat-value">{formatStatValue(stats().avgValue, goal.metric)} {goal.metric !== "ItemTiming" ? getMetricUnit(goal.metric) : ""}</div>
249277
</div>
250278
<div class="stat-card">
251279
<div class="stat-label">Range</div>
252280
<div class="stat-value">
253-
{stats().minValue} - {stats().maxValue}
281+
{formatStatValue(stats().minValue, goal.metric)} – {formatStatValue(stats().maxValue, goal.metric)}
254282
</div>
255283
</div>
256284
</div>
@@ -311,7 +339,7 @@
311339
font-size="14"
312340
font-weight="bold"
313341
>
314-
Target: {goal.target_value}
342+
Target: {goal.metric === "ItemTiming" ? formatSeconds(goal.target_value) : goal.target_value}
315343
</text>
316344
{/if}
317345

@@ -353,7 +381,7 @@
353381
fill="#a0a0a0"
354382
font-size="10"
355383
>
356-
{bin.start}
384+
{goal.metric === "ItemTiming" ? formatSeconds(bin.start) : bin.start}
357385
</text>
358386
{/each}
359387

@@ -366,7 +394,9 @@
366394
font-size="14"
367395
font-weight="bold"
368396
>
369-
{getMetricLabel(goal.metric)} ({getMetricUnit(goal.metric) || "value"})
397+
{goal.metric === "ItemTiming"
398+
? `${goal.item_id !== null ? getItemName(goal.item_id) : "Item"} Timing (M:SS)`
399+
: `${getMetricLabel(goal.metric)} (${getMetricUnit(goal.metric) || "value"})`}
370400
</text>
371401
<text
372402
x="30"

0 commit comments

Comments
 (0)