f8607d114c
Implements the multiplayer transport layer from ROADMAP.md: UUID-based client identity, a reliable-packet channel over UDP, handshake/ack/ ping/disconnect/player-joined/player-left/player-state packet types, and split online (networked) vs offline (in-process singleplayer) server modes wired into the engine's update/dispose loop.
5.5 KiB
5.5 KiB
Dusk Roadmap
Tracking upcoming milestones for the engine. See PSP_OPTIMIZATION_PLAN.md
for a memory/CPU optimization survey specifically targeting the PSP build
(milestone 4 below is its Priority 3).
Upcoming milestones
- Add a very basic physics engine, moving away from the current tile-based movement.
- Give entities full freedom of movement (no longer locked to tile grid positions).
- Update entity interaction, triggers, chunk management, and other systems that currently assume tile-based positioning so they work with the new 3D positioning/movement code.
- Investigate and fix poor UI rendering performance. First pass done
(2026-07-31): slider/tab/frame/textbox now cache their sprite
geometry instead of rebuilding it every frame, and the console's
vertex buffer is fixed-size instead of alloc/free churn (see
STATUS.md's "UI rendering performance" note for detail). Still open: per-widget material/color changes still force a sprite-batch flush each time (color is per-material, not per-vertex), so a row of alternating highlighted widgets still costs one draw call per widget. - Create UI elements for displaying status indicators, e.g. network connection state and save-in-progress.
- Fully test saving end-to-end on all supported platforms.
- Remove the tile system from chunks in favor of meshes, with dynamic hitboxes per chunk loaded in from the chunk file data.
- Create UI elements for network status: a connecting modal, an error state, and a connected flag. Retire the test HTTP request once these are in place.
- Build the socket server and client implementation, including handlers for the different packet types.
- Add a dedicated multiplayer entity type,
clientplayer, alongside the existingnpcandplayertypes. Limit to 16 (defined constant, see SERVER_CLIENT_COUNT_MAX/CLIENT_COUNT_MAX in src/dusk/network/socket/) for now. - Send and receive
clientplayerposition over the network. - Create a UI menu for creating a server and joining a server. For now, join IPs are hard-coded (testing against a fixed IP of 10.0.0.94).
- Create "handshake" packets. For now, just send the username, enforced to be under 10 characters long.
- Server tracks all players' positions and broadcasts them to all connected clients.
- Server sends disconnect packets for users who leave.
- Server assigns each client a UUID; all clients know every other client's UUID (used to reference them across position updates, disconnect packets, etc).
- Server notifies all clients (by UUID) when a user joins, leaves,
or is disconnected, so clients can spawn or remove the
corresponding
clientplayerentity in the world.
Infrastructure / debt backlog
Found during a full-codebase inventory pass (2026-07-30, see STATUS.md
for the full survey). These aren't new feature milestones so much as
loose ends worth closing, roughly in order of how cheap/safe they are to
fix:
- Re-enable
test/item(currently commented out intest/CMakeLists.txt) -- confirm it still passes and turn it back on. - Restore
itemgive.c/hinsrc/duskrpg/item/CMakeLists.txt-- the textbox UI dependency it was waiting on (ui/textbox/) is already back. - Decide the fate of the
vitatarget:scripts/build-vita.shanddocker/vita/reference-DDUSK_TARGET_SYSTEM=vita, but nocmake/targets/vita.cmakeexists, so the build is currently broken. Either implement it or remove the dangling scripts/Dockerfile. - Per-PR CI build coverage for non-Linux targets: first pass added
2026-07-31 as
run-tests-gamecube-dolphin/run-tests-wii-dolphin(build the ISO, boot it in Dolphin under Xvfb) andrun-tests-psp-ppsspp(build the EBOOT, boot it in PPSSPPHeadless) in.github/workflows/test.yml, plus matchingscripts/test-*-dolphin.sh/scripts/test-psp-ppsspp.sh(+-dockervariants). Markedcontinue-on-error: truesince none of these have actually been exercised on a real runner yet -- verify they pass before relying on them, and drop the flag once they do. Knulli still has no per-PR coverage at all. - Milestone 4 above (poor UI rendering performance) has a first pass
in (2026-07-31, see
STATUS.md) -- remaining concrete lead: sprite batch flushes are keyed on shader+material (including tint color), so per-widget color changes (e.g. focus highlight) still force a flush per widget; moving tint to per-vertex color would let a whole row of widgets batch into one draw call regardless of highlight state. - Revisit the GameCube/Wii networking static-IP workaround in
networkdolphin.c-- it's standing in for an unresolved suspected memory-corruption bug inif_config()'s DHCP path. - Decide whether the PSP dialog-based network connect UI needs to come back -- it was removed entirely (not fixed) when the original dialog-tearing bug proved hard to resolve.
- Backfill unit tests for the biggest untested surfaces:
ui/(whole widget framework),save/,script/(JerryScript bindings),event/.
Principles
- Never trust the network implicitly. Neither side (server or client)
should assume the other's packets are well-formed or benign --
validate all incoming packet data defensively, since either side
may send garbage or malicious data. Use
errorret_t/errorThrow()for these runtime checks, not assert macros -- asserts are debug-only and won't guard release builds against malformed or malicious packet data.