[Planning] Redot primitive layer: base mechanics architecture #19
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Purpose
Design the base-layer primitives that all game mechanics build on. These are the foundation — damage, inventory, player avatar, health display, items, interaction.
Status: Planning phase. No implementation yet.
Proposed primitive set
1. Health & Damage
2. Item (base class)
3. Inventory
4. Player Avatar
5. Health Display (VR-appropriate)
6. Interaction System
Ranged grab (two-tier):
physics since Resonite has no native physics engine — was janky)
projectile arc calculation instead of hand-rolled simulation
you catch it. Not a teleport.
Architecture notes
Resonite prototyping
Open questions
Movement I want both Teleport and Smooth transportation,
Teleport Movement should have taken into consideration people abusing it to cheese areas that are meant to take a while to get through or specific movement things, consuming stammina to use in general rapidly
Smooth Movement should have two things, walking and sprint speeds.
For all controls we are mapping the meta quest controls of grip, trigger, joystick, stick click, two face buttons, and capacitive presence for interactables such as range or gravity grabs, a seperate physical movement and gesture for either
Both modes is the right call for PCVR — comfort for the motion-sensitive, speed for everyone else. A few thoughts on the details:
Teleport anti-cheese: stamina-as-cost is the right lever, but the shape matters. A shared pool with sprint would make the tradeoff real (blink across the gap or sprint out of the anomaly — not both), whereas a per-blink cooldown just paces the cheese instead of preventing it. Two other vectors worth nailing down early:
How are you picturing stamina regen — passive, or gated behind something (rest, consumables, the affected % system)?
Walk/sprint: the Quest stick is analog, so the natural mapping is partial deflection = walk, full tilt = sprint (stamina-draining). That frees stick click entirely — were you thinking crouch for it, or something else? Or do you want discrete speeds on a toggle instead of analog?
Capacitive presence for grabs: I like it — touch-to-preview, grip-to-commit is a nice two-stage feel. Two things I'd poke at: capacitive only senses touch, so the "separate physical movement and gesture" for range vs. gravity grabs has to be distinguishable before the grip press, and that's a discoverability risk. What's the physical difference you're picturing between the two gestures?
Also: two face buttons is scarce real estate. What's spoken for on A/B (X/Y), and does anything gameplay-critical risk getting bumped to a chord?
— Lantern
Grip poses: authored hand reference as override, procedural grab as default
Refines the grip-pose design above.
The hand reference (authored grips)
blender-assets/_lib/) so every artist works against the same hand.No reference = procedural grab (the default)
Why this ordering
Authored = override, procedural = default. The 90% case (loot, props, junk) costs nothing; the 10% case (weapons, tools) gets artist precision, including grips that ride moving parts.
Drivable bones:
da_rig.bone.<name>Moving parts on items are armature bones, named with a strict prefix:
da_rig.bone.*and exposes those bones as named controls.Because the name is a strict convention, references to these bones (from grips, animations, scripts) are checkable at asset-build time — a typo'd or missing bone fails the build, not the play session.
(Prefix corrected 2026-10-20: this thread originally said
ds_rid, thends_rig— both typos. The final prefix isda_rig.)The hand rig and authored poses
Naming
The rig prefix is
da_rig. The hand rig's bones are named:The reference hand is scaffolding, not content
da_rig.hand.bone.*names, a snapshot authored on the reference hand applies directly to the player's hand (their mesh, the authored pose).Authored pose set (per item, as needed)
Consequences
(Prefix corrected 2026-10-20: final prefix is
da_rig.)Grip indicator + dynamic grips on parts
Status: working design. The grip system as a whole needs more thought and a prototype before any of this is 100% settled — treat everything in this thread as direction, not final spec.
The indicator
Dynamic grips on parts
Control scheme + rig skeleton (Zach's dictation, 2026-10-22)
The control scheme was previously written down nowhere — it existed only as wiring in the rig scene. Recording it here, with the current-state findings from a code audit:
Movement
strafeflag; library default off = stick X discarded = forward/back only today. Being fixed.)Face buttons
by_button— B/Y) for 2 seconds. Hold, not press, deliberately — the press action stays unallocated for future use. The lower pair (ax_button) also unallocated. (This settles the face-button half of the open questions on this issue; stick-click role still open.)Later feature (on the map, not now)
Player rig skeleton
Chestcapitalized) even with no mesh skinned to it, with mock collisions for IK — so a proper player model (found or made) maps straight onto it when one exists. The shipped arms are the 39-bone subset of this contract; this is one skeleton, not two.— Lantern (from the 2026-10-22 design session)
Correction — the pause gesture (Zach, 2026-10-22, supersedes the gesture in comment 596)
Comment 596 above records pause as holding the upper face button for 2 seconds. That was wrong — correction from Zach tonight:
Pause is the legacy gesture: press BOTH face buttons at once (ax + by together on one controller, either hand). The pause menu replaces what that gesture used to call up. It is a press chord, not a hold — the upper button's hold is not allocated to pause, and neither single button press is consumed by it (each face button's own press remains free, as before).
Fixed in da-game PR #9 (commit
effbf51): the chord is edge-triggered (fires when the chord completes; holding both doesn't re-fire; one button per hand is not the gesture) and toggles pause like the controller menu button. Everything else in 596 stands (stick side option, turn settings, settings file, jump/crouch later feature, full-skeleton rig requirement).— Lantern
Correction retracted — the hold stands, now strict (Zach, 2026-10-22)
Comment 628 (my "correction" from earlier tonight) is itself retracted. Zach's report was a bug report: in the tested build, pressing both face buttons opened the pause menu. I misread it as a design change and briefly implemented the chord he was flagging. Apologies for the churn — the record, final:
Pause = hold the upper face button (B/Y) alone for 2 seconds — comment 596's dictation was right all along. Now implemented strictly in da-game PR #9 (
c22d369): each hand's hold timer accumulates only while that hand's B/Y is held and its A/X is not; an A/X press on the same hand at any point resets the timer, so the both-buttons press — any order, any overlap — can never open the menu. Among face-button inputs, the hold is the only way in.Platform note (Zach, same evening): the current target is Quest controllers via SteamVR — there, the controller menu/system button is reserved by the runtime and not usable by the app, so the hold is the operative in-headset opener. On a native Quest build the menu button would be the conventional opener, so that path (and desktop Esc) stays in code for it.
— Lantern
Amendment (2026-10-23) to the pause-gesture record in 596/633 — the gesture moves to the binding layer.
The design discussion continued and landed somewhere better than either in-game version: the game implements no pause gesture at all. Press-vs-hold disambiguation is a native feature of the runtime binding systems (SteamVR bindings carry press and hold as separate actions on one button — the Vivecraft pattern), so the gesture becomes binding data, per runtime:
pause← HOLD of the upper face button (B/Y), 2.0s — same duration and intent as 596/633, expressed in the SteamVR binding preset instead of a game-side timer. The strictness questions that occupied the in-game versions (chord poisoning, state flicker) do not exist at this layer.pause← the menu key, bound directly (the menu/system button is only reserved under SteamVR).The in-game hold timer shipped on the pause-menu branch has been removed; the branch was folded (UI chunk, CI chunk, input code removed) and now carries the full design as da-game
docs/input-system.md: asrc/input/layout (generic semantic contract + per-controller folders with per-runtime binding presets), Quest capacitive touch fully exposed as backend events (incl. the thumbrest, for later features), and addon-supplied controllers feeding the same contract. The loading-circle cosmetic from the Resonite-mod pattern is deferred — SteamVR provides its own hold feedback; the plan is preserved in that doc.