refactor: demote Partial Ragdoll to a comparison demo#78
Merged
Conversation
Partial Ragdoll was a thin wrapper over Godot's built-in PhysicalBoneSimulator3D — "what the engine already offers", not Kickback's value (the active spring ragdoll). As a co-equal plugin mode it cost real surface area for little unique value and was the least-tested path. Per project direction it becomes the "what Godot offers vs what we build" comparison demo instead. Plugin (now active-ragdoll only): - KickbackCharacter: dropped Mode.PARTIAL, the _simulator / _partial_controller detection, the partial configure, and the partial branch of receive_hit. - kickback_plugin.gd: single Active-Ragdoll setup (removed the Partial preset, the auto-created PhysicalBoneSimulator3D, the partial node, partial report lines). - strength_debug_hud.gd: active-only (removed partial discovery + _draw_partial_target + legend key). kickback_status_panel.gd: active-only (removed _check_simulator). - KickbackRaycast.DEFAULT_MASK is now the active layer only, so the (no-longer- disabled) baked simulator bones can't intercept active hits. Demo (the new home): - Moved partial_ragdoll_controller.gd + hit_event.gd to demo/ (DEMO-ONLY; @ICON and the addon icon dropped). demo.tscn/gd reframed as "Godot's built-in ragdoll vs Kickback's active ragdoll": frees the active char's baked simulator, enables the Godot char's, and routes one both-layers raycast by collider type (RigidBody3D -> Kickback facade, PhysicalBone3D -> the demo controller). Kept as general utilities the demo reuses: SkeletonDetector.populate_physical_bones, the KickbackLayers partial-layer constant. Docs: README, CLAUDE.md, INTEGRATION.md, issue templates updated; "pick one mode" / "don't mix modes" guidance removed. Validated: clean headless import, 109/109 GUT, clean scene-smoke (0 errors) on all 8 demos incl. the rewritten demo.tscn. Comparison-demo feel pending visual review. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Per project direction: Partial Ragdoll is demoted from a co-equal plugin mode to the comparison demo. It was a thin wrapper over Godot's built-in
PhysicalBoneSimulator3D— "what the engine already offers", not Kickback's value (the active spring ragdoll). Removing it as a mode makes the plugin's identity unambiguous and sheds the least-tested path + a chunk of surface area.Plugin — now active-ragdoll only
KickbackCharacter: droppedMode.PARTIAL, the_simulator/_partial_controllerdetection, the partialconfigure, and the partial branch ofreceive_hit(now active-only).kickback_plugin.gd(setup tool): a single Active-Ragdoll flow — removed the Partial preset, the auto-createdPhysicalBoneSimulator3D, the partial node, and the partial report branches.strength_debug_hud.gd/kickback_status_panel.gd: active-only (dropped partial discovery,_draw_partial_target, the legend key,_check_simulator).KickbackRaycast.DEFAULT_MASK→ active layer only. The active demos' shared ybot keeps an (inactive) baked simulator thatKickbackCharacterno longer disables; targeting only layer 4 prevents those bones from intercepting active hits.Demo — the new home
partial_ragdoll_controller.gd+hit_event.gdtodemo/(DEMO-ONLY;@icon+ the addon icon dropped).demo.tscn/demo.gdreframed as "Godot's built-in ragdoll vs Kickback's active ragdoll": frees the active char's baked simulator, enables the Godot char's, and routes one both-layers raycast by collider type (RigidBody3D→ Kickback facade;PhysicalBone3D→ the demo controller).Kept (general utilities the demo reuses)
SkeletonDetector.populate_physical_bones, theKickbackLayerspartial-layer constant.Docs
README, CLAUDE.md, INTEGRATION.md, issue templates updated; the "pick one mode" / "don't mix modes" guidance removed.
Validation
Clean headless import · 109/109 GUT · clean scene-smoke (0 errors) on all 8 demos incl. the rewritten
demo.tscn. (TheJoint3D::_body_exit_treelines in the test run are pre-existing engine teardown noise, unrelated.)🔬 Visual review (please)
Open
demo.tscn: left = Kickback active ragdoll, right = "Godot built-in ragdoll". Shoot each (1–5 weapons) — the left staggers/ragdolls/recovers; the right does a rawPhysicalBoneSimulator3Dragdoll then blends back. Confirm both react and the contrast reads clearly.🤖 Generated with Claude Code