Skip to content
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5fb86f7
feat: add Patchwerk boss image asset for combat replay
dodoels Apr 1, 2026
682f03e
i18n: add combat replay translations (en, fr)
dodoels Apr 1, 2026
2d5b4b9
feat: add CombatReplay component to detailed results
dodoels Apr 1, 2026
718e966
style: add combat replay SCSS
dodoels Apr 1, 2026
c4114bc
feat: integrate combat replay tab into DetailedResults
dodoels Apr 1, 2026
60b6b89
fix: correct boss image path to /mop/assets/img/
dodoels Apr 1, 2026
e47f044
fix: constrain boss image size and center in arena
dodoels Apr 1, 2026
9d86a61
fix: layout - flex arena height, larger boss, fix dot resource bars, …
dodoels Apr 1, 2026
babcde4
fix: replay layout - full viewport height, centered 50% CDM, even-wid…
dodoels Apr 1, 2026
eb3341d
fix ui
dodoels Apr 1, 2026
69d978e
feat: add Wowhead tooltips to ticker and CDM action grid spell icons
dodoels Apr 1, 2026
c45b42e
feat: add buff/debuff tracking + fix translation schema
dodoels Apr 1, 2026
dc810f6
fix: respect target/player filter in combat replay
dodoels Apr 1, 2026
0723a5d
fix: use <a> + setBackgroundAndHref for spell icons so Wowhead toolti…
dodoels Apr 1, 2026
92cd9f9
fix: add replay to results_tab.details.tabs schema
dodoels Apr 1, 2026
9440182
fix: display multiple enemies side by side in a flex row
dodoels Apr 1, 2026
2505bc7
fix: use UnitMetrics.auraUptimeLogs for correct buff/debuff sourcing
dodoels Apr 1, 2026
91f044e
fix: derive resource max from log total field instead of hardcoded de…
dodoels Apr 1, 2026
65a8e51
feat: depth formation layout for multi-target enemies
dodoels Apr 1, 2026
f0d30c8
refactor: address PR review — tsx refs, fragments, FA icons, hit CSS
dodoels Apr 8, 2026
20f0246
update and address comments
dodoels Apr 13, 2026
989e6ef
Merge upstream/master into sim-replay
dodoels Apr 22, 2026
1d4f52f
fix(replay): filter passive/melee/item-only from ticker and CDM grid
dodoels Apr 22, 2026
70bf800
address comments
dodoels Apr 22, 2026
9df8dfe
refactor(replay): apply 1337LutZ review — getActionMetrics, no cast s…
dodoels Apr 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added assets/img/boss_patchwerk.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions assets/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -1987,6 +1987,7 @@
"casts": "Casts",
"resources": "Resources",
"timeline": "Timeline",
"replay": "Replay",
"log": "Log"
},
"columns": {
Expand Down Expand Up @@ -2470,5 +2471,13 @@
"points_suffix": "Points",
"percent_suffix": "%"
}
},
"combat_replay": {
"empty_title": "Combat Replay",
"empty_desc": "Run a simulation to generate an interactive combat replay",
"default_player": "Player",
"training_dummy": "Training Dummy",
"seek_back": "Rewind {{time}}s",
"seek_fwd": "Forward {{time}}s"
}
}
9 changes: 9 additions & 0 deletions assets/locales/fr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -1988,6 +1988,7 @@
"casts": "Sorts",
"resources": "Ressources",
"timeline": "Chronologie",
"replay": "Replay",
"log": "Journal"
},
"columns": {
Expand Down Expand Up @@ -2471,5 +2472,13 @@
"points_suffix": "Points",
"percent_suffix": "%"
}
},
"combat_replay": {
"empty_title": "Replay de Combat",
"empty_desc": "Lancez une simulation pour générer un replay de combat interactif",
"default_player": "Joueur",
"training_dummy": "Mannequin d'entraînement",
"seek_back": "Reculer {{time}}s",
"seek_fwd": "Avancer {{time}}s"
}
}
25 changes: 25 additions & 0 deletions schemas/translation.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -8330,6 +8330,9 @@
"timeline": {
"type": "string"
},
"replay": {
"type": "string"
},
"log": {
"type": "string"
}
Expand All @@ -8344,6 +8347,7 @@
"casts",
"resources",
"timeline",
"replay",
"log"
]
},
Expand Down Expand Up @@ -10360,6 +10364,26 @@
"results",
"character_stats"
]
},
"combat_replay": {
"type": "object",
"properties": {
"empty_title": { "type": "string" },
"empty_desc": { "type": "string" },
"default_player": { "type": "string" },
"training_dummy": { "type": "string" },
"seek_back": { "type": "string" },
"seek_fwd": { "type": "string" }
},
"additionalProperties": false,
"required": [
"empty_title",
"empty_desc",
"default_player",
"training_dummy",
"seek_back",
"seek_fwd"
]
}
},
"additionalProperties": false,
Expand All @@ -10373,6 +10397,7 @@
"bulk_tab",
"rotation_tab",
"results_tab",
"combat_replay",
"import",
"export",
"info",
Expand Down
30 changes: 25 additions & 5 deletions ui/core/components/detailed_results.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { DamageMetricsTable } from './detailed_results/damage_metrics';
import { DpsHistogram } from './detailed_results/dps_histogram';
import { DtpsMetricsTable } from './detailed_results/dtps_metrics';
import { HealingMetricsTable } from './detailed_results/healing_metrics';
import { CombatReplay } from './detailed_results/combat_replay';
import { LogRunner } from './detailed_results/log_runner';
import { PlayerDamageMetricsTable } from './detailed_results/player_damage';
import { PlayerDamageTakenMetricsTable } from './detailed_results/player_damage_taken';
Expand Down Expand Up @@ -69,6 +70,10 @@ const tabs: Tab[] = [
targetId: 'timelineTab',
label: i18n.t('results_tab.details.tabs.timeline'),
},
{
targetId: 'replayTab',
label: i18n.t('results_tab.details.tabs.replay'),
},
{
targetId: 'logTab',
label: i18n.t('results_tab.details.tabs.log'),
Expand Down Expand Up @@ -175,12 +180,17 @@ export class DetailedResults extends Component {
<div className="resource-metrics" />
</div>
</div>
<div id="timelineTab" className="tab-pane dr-tab-content timeline-content fade">
<div className="dr-row">
<div className="timeline" />
</div>
<div id="timelineTab" className="tab-pane dr-tab-content timeline-content fade">
<div className="dr-row">
<div className="timeline" />
</div>
</div>
<div id="replayTab" className="tab-pane dr-tab-content replay-content fade">
<div className="dr-row">
<div className="combat-replay" />
</div>
<div id="logTab" className="tab-pane dr-tab-content log-content fade">
</div>
<div id="logTab" className="tab-pane dr-tab-content log-content fade">
<div className="dr-row">
<div className="log" />
</div>
Expand Down Expand Up @@ -283,6 +293,16 @@ export class DetailedResults extends Component {
timeline.render();
});

const combatReplay = new CombatReplay({
parent: this.rootElem.querySelector('.combat-replay')!,
resultsEmitter: this.resultsEmitter,
});

const replayTabEl = document.querySelector('button[data-bs-target="#replayTab"]');
replayTabEl?.addEventListener('hide.bs.tab', () => {
combatReplay.stopPlayback();
});

new LogRunner({
parent: this.rootElem.querySelector('.log')!,
resultsEmitter: this.resultsEmitter,
Expand Down
Loading
Loading