"Splits" window for tracking different goals for speed runners.#2001
"Splits" window for tracking different goals for speed runners.#2001jdm080 wants to merge 9 commits into
Conversation
Adds a new built-in ToolboxWindow for tracking speedrun splits in Guild Wars. Features include: - Split timer with real time and game time tracking - Goal-based triggers: mission complete/bonus, map enter/exit, vanquish complete, reach level, reach title rank, manual - Hard mode flag on mission/bonus triggers - Batch goal pickers for missions, explorables, towns, and titles - Personal best comparison (real or game time basis) - Per-character run history saved to JSON - Crash-protection resume on toolbox restart - Configurable hotkeys for start, reset, and manual split - Settings panel integrated into the standard Toolbox settings UI
|
@claude between this and the existing objective timer module, how would you approach having a single source of truth for tracking objectives in game without impacting the look and feel of the existing objective timer in toolbox? Could we enhance this version with what's missing to be a replacement of the existing module? We also already have a feature to host a websocket to host live splits, could this easily be integrated? I'm conscious of how much code this module would add, and would like to merge functionality related to objective tracking |
|
Claude finished @3vcloud's task in 2m 7s —— View job Analysis: Merging Splits with Objective Timer
Where the two modules currently overlapBoth windows independently register their own GW event hooks for essentially the same underlying game events:
There are also 9 additional StoC hooks in ObjectiveTimer ( What's missing from SplitsWindow to be a full replacement1. The rich sub-objective event system
2. WebSocket / LiveSplit server ObjectiveTimerWindow hosts a 3. Historical multi-run display ObjectiveTimer renders all runs from the current day as collapsible headers with Start/End/Time columns for each individual objective. SplitsWindow only shows the live run against the personal best. The use cases are subtly different: ObjectiveTimer = "how did each objective compare across today's runs"; SplitsWindow = "am I on PB pace right now?" 4. Hierarchical objectives ObjectiveTimer has parent/child indented objectives (e.g., DoA rooms inside a Foundry parent). SplitsWindow is a flat list. This is important for displaying sub-steps without counting each as a full split. 5. Auto Minor, but SplitsWindow has no equivalent to Recommended architecture: shared event busThe cleanest path to a single source of truth without touching the Objectives window's UI is a dedicated
Both For WebSocket integration pathThe websocket server logic in // New shared class (sketch)
class LiveSplitServer {
public:
static LiveSplitServer& Instance();
void Enable(int port, WebsocketMode mode);
void Disable();
void Send(std::string_view command); // "start" / "split" / "reset"
};
What's practical to add now vs. long-termNow (low effort, high value):
Medium term:
Long term (full replacement of ObjectiveTimer):
The existing Objectives window and its data format don't need to change at all until you're confident the Splits window covers all its use cases — at which point it becomes a Summary: The WebSocket integration is the most practical immediate addition and is straightforward to wire in. A proper single source of truth requires extracting an event bus module that both windows subscribe to, plus expanding |
|
So as an overall direction, more integration with the current objective timer (full collapse into or via a shared bus). Webserver integration also. |
Yeh looks like it's a close fit to replace the objective timer to be honest, so with a few more tweaks I wouldn't have a problem using this instead |
…erences Brings the Splits feature up to date with the latest local work: Manual/Running profile subfolders, mission-queue ready-check pause handling, a manual pause/resume flow with a running paused-time total, GoalReference PB comparisons, and the SplitsProfile split-out for per-profile display settings. Also exposes PacketLoggerWindow outside debug builds (dedupes a stray double include of SplitsWindow.h along the way). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Brings feature/splits-window up to date with origin/dev (the branch had drifted ~705 commits behind), picking up the glaze JSON library, recast navigation, the Hotkeys/ split, and other upstream changes the Splits feature's build files were missing (notably glaze, which GoalList/ SplitsWindow serialization depends on). Splits files themselves are unchanged from the prior commit. Preserves the pending FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 workflow fix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
# Conflicts: # .github/scripts/connect-simplysign.ps1 # .github/workflows/site-deploy.yml # GWToolboxdll/CMakeLists.txt # GWToolboxdll/Modules/ToolboxSettings.cpp # site/src/content/docs/history.md
…tion - Add GWEventBus module: single source of truth for all 20 GW game events (UIMessage + StoC callbacks), all subscribers register via Subscribe/Unsubscribe - Remove SC profile from SplitsWindow; fix all profile index regressions (0=Manual, 1=Running); delete Presets.h/cpp - Migrate SplitsWindow to GWEventBus: no direct GWCA hook registrations; map tracking moved from frame-polling to InstanceLoadInfo/GameSrvTransfer events - Migrate ObjectiveTimerWindow to GWEventBus: fixes hooks never being removed on Terminate (static local HookEntry leak); replace packet-copy statics with lightweight field caches for CheckIsMapLoaded - Wire Splits into OT WebSocket server: reset+start on run start, split on goal complete, reset on fail/reset; all calls include context label for UI - Add last-command display and event reference tables to WebSocket settings UI - Remove show_start_time column and End-Start/Since-last radio from Splits UI Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GoalEngine: WorldContext missions_bonus bitmask is historical; snapshot bonus bit at instance load (bonus_was_set_at_entry_) so NotifyMissionComplete only fires MissionBonus if the bonus was earned during this run, not from a previous completion on the same character - Auto-start clock on map entry when first goal is MissionComplete/MissionBonus/ VanquishComplete, matching the existing MapEnter auto-start behaviour - SplitsGoalListWindow: gear icon button navigates to Splits settings via SettingsWindow::NavigateToSection; list picker dropdown visible only while timer is at 0 so active runs cannot be interrupted - Strip all debug hooks (ObjAdd/ObjDone/ObjComplete/MissionCmplt/InstLoad/ SrvXfer packet callbacks and Objective Debug Log settings UI) - .gitignore: exclude _archive/ folders from remote Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A ways to go, but wanted to see if this is even something that might be wanted.
Adds a new built-in ToolboxWindow for tracking different speedrun's and their splits in Guild Wars. Features include: