In VR the HUD is a screen at a fixed distance before the eyes, so the
names upstream draws on it hung there instead of over the players' heads.
Off until they are drawn into each eye's picture.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Y in a hosted game's lobby opens a panel to make the game public, choose
how many bots join (none by default, up to 15) and how well they play
(bots.skill: easy, normal, hard; hard is the first bots' play, normal a
little slower to notice, turn and aim). Integer settings can now be
written to config.toml as booleans could.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A host can make its game public (Y in the lobby, or network.public_game):
it then announces name, map, game type, players and join code every 10 s,
retained, on hcvr/1/g<network version>/<id> through the signalling
brokers, and clears it when it stops. On the system link list, X opens an
online games panel listing the public games heard lately (stale ones
dropped after 45 s) and a row to type a code; A joins by the game's code.
Announcements carry no addresses.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
p2p_join_state tells the menus whether the host is being reached, was
reached (its game is in the list), did not answer, could not be reached
(both routers too strict: allow UPnP) or was lost; the join screen shows
it under the code's status.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A hosted game gets an 8-character join code (Crockford base 32) besides
its invite link, shown under the lobby's buttons. On the system link list,
X opens the game's keyboard to type a code in; the code's topic and key
come from a slow PBKDF2 derivation, the host answers an ask on that topic
through the signalling brokers with its invite sealed with the key, and
the joiner joins as with the link. Codes in join_link.txt work too.
Also: the clipboard text last seen is kept from run to run, so a run's
own invite is not joined again at the next start; in menus a held stick
repeats after 350 ms and then every 90 ms, and its threshold is 70%.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A widget background bitmap whose bounds cover the whole 640x480 design
space (the pause menu dim, for example) stopped at the edges of the
centered 640 column on widescreen displays, leaving the side bands
undimmed. Widen the bounds and the clip symmetrically to the full
screen width, mirroring the existing fade_to_black special case in
render_ui_widgets().
Tested on a Retroid Pocket Flip2 (854x480 render target).
Upstream's own fixes replace two of ours: reclaiming ART's idle large
object space for the guest's fixed ranges (host_memory.c), and the audio
callback's gathering (host_sdl.c). Its consolidated headers take the VR
declarations (model_animation_definitions.h, render/render.h). The
updaters look at this repository's releases: the original's builds, made
without VR, must never replace this one (they share the package name).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hands are drawn over the world, so they hid the grenade wherever they
overlapped it, and turning the palm up showed it behind the hand. It is now
drawn in the first-person pass with them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The left trigger holds the grenade in the hand (the game keeps it there
past the throw animation); letting go throws it from the left hand, along
the fastest the hand moved over its last 150 ms, as hard as that was (full
at 4 m/s). Without a throw (vr.grenade_throw_speed, 1.5 m/s) the game
throws as before. The left hand's swing is no melee while throwing, and
the arms keep their pose through the throw animation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Halo draws its centre prompts as crosshair elements of the weapon HUD.
Only the reticle states now go to the crosshair layer; the message states
are drawn in the head-locked HUD, also while zoomed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The crosshair used to be cut out of the HUD image (an 80x80 region around
the centre) and moved to where the weapon aims, taking with it whatever
else lay there, such as part of the reload prompt. Now it is drawn alone
first (hud_draw_crosshair), captured into its layer, and the HUD is drawn
afterwards without it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The weapon's frames are derived in one place: the controller's, the
model's (turned so its barrel points where the controller does), and,
with both hands on it, both turned alike by the turn that lines the
model's grips up with the hands, measured in the model's frame (it was
applied in the controller's, which tipped the aim up when gripping).
- The crosshair runs along that aim from the muzzle, as the shots do.
- The scope keeps its place above and ahead of the hand, moved only
sideways over the barrel as drawn, facing back along the aim.
- Each weapon's barrel angle and gun node offset go to debug.txt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
First-person models point their barrels in towards the screen's centre,
so the model pointed a few degrees left of where the controller aims and
shots, the crosshair and the scope went. The weapon camera is now turned
by the barrel's direction at the ready (the gun node's axis nearest the
camera's forward), which is logged per weapon, and the scope's disc sits
over the barrel as drawn.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each weapon's first-person model sits differently in the hand, and the
pistol's barrel ran a few centimetres left of the controller's aim, so its
crosshair sat right of it. Shots, the crosshair and the laser now start at
the gun node as drawn at the ready, along the controller's aim.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The weapon's own crosshair (red on an enemy, as in the HUD) is taken
from the HUD's centre and floats where the weapon aims, as far away as
what it aims at, facing the eyes, as large as the HUD showed it
(vr.crosshair). The laser is off by default (vr.laser) and never shows
over the menus.
- Zoomed in, the first-person weapon stays in the hand (the game hides
it), the HUD's crosshair and zoom overlays give way to the scope, which
has a fine cross of its own, and the scope's disc is 10 cm across.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Recover transparent geometry submit (+1,285 meaningful code, zero exact losses); reconcile COMMON ownership and Q10 85+EXT1 credit, actions/main data, and separately disclosed denominator corrections. Preserve canonical-only repairs and all held research. C09 is ordinary disclosed cleanup, not a claim of proven scaffolding intent. Clean rebuild, 1,663 tests, parks, audits, provider links and independent EXT1 check pass. Local reconciliation only.
Zoomed in, the player's view is drawn once more, from the weapon along
its aim through the zoom's field of view, into a small square of the
back buffer (the first-person weapon left out), and shown on a disc over
the barrel that magnifies what it covers of the view by the zoom's
magnification (vr.scope_size). The weapon's zoom mask and filters no
longer darken the HUD before the eyes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The part of the HUD moved to the wrist is now just around the motion
tracker's disc and its range (measured in a 640-wide HUD), larger on the
wrist and without what else the corner holds.
- The terminal's log lines, which the beta prints over the bottom left
of the screen, are left out in VR; the console, when open, still shows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While an animation turns the weapon away from where it aims (reloads,
drawing and putting it away, posing, venting), the laser follows the gun
node's turn from its ready pose. The ready pose is now kept only while
the weapon is held ready or firing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The melee animation moves both hands about the gun (the right one to the
stock, the left one onto the barrel) and the left arm with them; holding
only the gun still showed that. The whole skeleton now keeps its pose
from before the attack, in the hand. The melee diagnostics are gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The free left arm keeps its shape on the foregrip, which left its upper
arm pointing anywhere (at the belly, looking down); it now turns about the
elbow to point back at the shoulder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Bent to the shoulder, the free left arm's skin, bound partly to the
skeleton's root at the other hand, tore into ribbons wherever the hand
was far from where the animation has it. The whole arm now follows the
hand as it is shaped on the foregrip; the shoulder IK is kept for the
right arm and the left one on the weapon.
- A melee attack aims where the head looks (the right controller aims
the weapon), and each one is logged; vr.melee_swing_speed is 1.5 m/s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The forearm, turned only to point at the wrist, kept the animation's
twist while the free hand could roll half a turn from it, and the skin
between them collapsed into a ribbon. It now takes most of the hand's roll
about its bone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The free left hand lines up with the controller as a hand holds it:
fingers along it, the knuckles (little finger to index) up its handle,
the wrist behind its grip.
- Thrusting a hand forward (vr.melee_swing_speed) is a melee attack; the
right grip still is too.
- Through a melee attack the gun stays in the hand; its animation would
swing it before the camera.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The first-person arms' upper arms and forearms are turned (two-bone
IK) to run from the player's shoulders, below the head, to the wrists,
instead of floating with the weapon.
- The left wrist follows the left controller, its fingers with it,
unless the grip closes at the weapon's foregrip (vr.two_hand_reach):
then the hand holds the weapon, which aims along both hands.
- Left controller: grip holds the weapon, Y switches weapons, X is the
flashlight, and held switches grenades.
- The first-person skeleton's nodes are logged once per weapon.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With vr.aim_with = "controller" (the default), on foot:
- the unit's aiming vector comes from the right controller, while its
facing (the body, the view and the movement) keeps following the head;
- shots start at the muzzle of the weapon in the hand, kept inside the
level from the camera as before;
- the first-person weapon and hands are posed from the controller
(vr.weapon_forward/right/down place the model in the hand);
- the HUD's crosshair, which marks where the head looks, is left out, and
a laser runs from the weapon to what it aims at (vr.laser).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Android port gets an OpenXR session in the host (Khronos loader, core
OpenXR plus XR_KHR_opengl_es_enable): on a headset the game keeps its
640x480 layout drawn at the eye images' resolution, renders the player's
view once per eye from the tracked eye poses through asymmetric frusta,
and shows the HUD and menus as a head-locked or room-fixed quad layer.
The head aims the player; the right stick turns; the Touch controllers
map onto the Xbox pad; rumble goes to the controllers. Frames without a
player view (menus, loading, cinematics) go onto a screen in the room.
A marker file, xr_test, runs a self-test of the session, layers, colour
path and controllers without game data.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>