Commit Graph

120 Commits

Author SHA1 Message Date
vtroc7 d352dbdfd8 Discover Steam MW3 and Black Ops installations v0.1.0-demo.3 2026-10-02 20:06:28 +03:00
vtroc7 d48a9f6502 Steam MW2 discovery, embedded licences, weapon variants, lock-on launchers, double-barrel fire and a two-client dev-master scenario
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.1.0-demo.2
2026-10-02 19:36:24 +03:00
vtroc7 dc1ea70cfe Refuse cargo tests in approved_tests and strip merge-train leftovers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:59:07 +03:00
vtroc7 2bcedf97fe Set the player archive password to t.me/contextrot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:25:31 +03:00
vtroc7 3adb14b5ba Document the prebuilt Windows release and ship it without a descriptor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:23:31 +03:00
vtroc7 3694c35041 Audio control runtime, typed player accounts, self-updates, thermal and shellshock screens, third person, guided killstreak HUD, player cards, a lobby cheats toggle and god mode
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.1.0-demo.1
2026-10-02 15:57:27 +03:00
vtroc7 d7374a3053 Merge pull requests #50 #53 #54 #55 #56 #57 #58 from gitoutofthere, brennop and liam-mcelhaney122 2026-10-02 14:42:08 +03:00
Bulat Fatykh 9eedca78a6 Collapse the IWD fallback read condition
Address the only added clippy warning in fork Actions run 36914579707; preserve name matching before the read and fallback after its error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:40:19 +03:00
Bulat Fatykh 0d8c5c7a15 Format the touched files with rustfmt
Apply resource reader and fixture hunks from fork Actions run 36914579707.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:39:33 +03:00
Bulat Fatykh 18d97acbce Merge current upstream master to retain landed IWD diagnostics
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	crates/asset_transport/src/iwd.rs
2026-10-01 22:39:33 +03:00
brennop 7b96f516e0 Look for iw4l.exe as the default approved-test binary on Windows
The runner's default --bin is target/play/iw4l, and its pre-flight check
calls is_file() on that path. On Windows the build writes iw4l.exe, so
`make approved` stopped with "target/play/iw4l is not built" right after
building it. stage_binary already falls back to .exe, but the check runs
first. Append EXE_SUFFIX to the default; it is empty on unix.

The pre-flight now names target/play/iw4l.exe. A full run with
`ARGS='--bin target/play/iw4l.exe'`, the path the default now gives,
passed 47/47 assertions on Windows.
2026-10-01 15:10:02 -03:00
brennop 631c96feb4 Decode each common_mp XModel once for the scene and FX catalogs
Since 38aa9cf (match flow run from the game scripts) the common walk
captures every common_mp XModel as a scene model, because the scripts
spawn models by name: 736 of them on mp_rust. FxModelCatalog::capture
then decoded the same XModels a second time for the FX catalog, from the
same stream, script strings and materials. Both catalogs are pruned only
after the map walk, so two copies of every skeleton were live through
the load.

The common walk now decodes each XModel once and gives the scene
catalog's Arc<ModelSkel> to the FX catalog through
FxModelCatalog::capture_shared. The load result does not change: the
world report lines and the GSC fingerprint of mp_rust are the same as
before the patch.

mp_rust on Windows, IW4L_COUNTING_ALLOC=1, live heap in MiB, warm
artifact cache (baseline -> patched):

  common set, after common_assets/common_mp          3,605 -> 2,612
  highest value in the asset stages, before install  4,454 -> 3,460
  heap_mib on the "load complete" line               7,388 -> 6,395

The first baseline run, with a cold cache, read 3,609 / 4,605 / 7,469.
2026-10-01 14:40:58 -03:00
Liam McElhaney 062d633ad3 Take the cheat switch from the launch options
The match bootstrap set allow_debug_actions to true for every match.
The host therefore accepted the debug actions from any peer.

Add the --cheats launch switch for map, serve and menu.
The switch sets the HostCheats resource. The match install reads it.
Cheats are off when the switch is absent.
Pass --cheats in make map, the live recipes and the scripted harnesses.
2026-10-01 13:31:10 -04:00
Liam McElhaney 3b97658b77 Add a mouse look sensitivity slider to the look options menu 2026-10-01 13:29:05 -04:00
brennop a2b52f8b26 Read unstaged paths without mapfile in the pre-commit hook
macOS ships bash 3.2, which has no mapfile, and expanding an empty
array under `set -u` fails before bash 4.4. With rustfmt on PATH the
hook therefore aborted every commit there once `cargo xtask mr
new|fmt|ship` had installed it.

Read `git diff --name-only` with a while-read loop, the way the
context/ check above it already reads its list. Behaviour is unchanged.
2026-10-01 14:18:21 -03:00
brennop 51c0ee8705 Find tools with an .exe suffix on PATH
tool_on_path only looked for a file named exactly like the tool. On
Windows rustup installs rustfmt.exe, so `cargo xtask mr fmt` stopped at
"rustfmt not on PATH" even with rustfmt installed, and require_tools
and the other PATH checks had the same blind spot.

Also try name + EXE_SUFFIX, which is empty on unix, so nothing changes
there.
2026-10-01 14:13:12 -03:00
vtroc7 bfe3c2aa70 Breath, shields, crossbow, car destruction, remote animation and GSC services
Scoped weapons hold breath with recovery feedback and sound. Riot shields
block and deflect bullets in hand and on the back; explosive crossbow bolts,
destructible map cars with round resets, and T5 map model collision work.
Remote players show last stand, weapon change, jump, mantle, landing,
ladder and stun animations, and server hitboxes follow the shared torso tree.

GSC gains spectator follow cameras, chat, kick, vehicle paths and flight
controls, physics spheres, slow motion, slide and mantle movers, damage
triggers, music, ambience, rumble and live audio fades over a shared mixer.

IW5 and T5 maps get sun shadows with per-stage sun selection; post-fx
pipelines compile before a vision blend needs them. The lobby browser keeps
focus and selection, and rooms can be password protected. Console supply
and give commands search every item category. Frames and replays decode
only the current wire protocol.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 19:18:44 +03:00
vtroc7 9dad890c20 Merge pull requests #33 #35 #38 #39 #40 #41 #42 #43 #44 #45 #46 #47 #48 #49 from gitoutofthere 2026-10-01 19:07:17 +03:00
Bulat Fatykh abe1b4e91c Validate IWD entry lengths before returning resource bytes 2026-10-01 17:46:39 +03:00
Bulat Fatykh 6a6069a589 Escape interior NUL in Perfetto debug strings 2026-10-01 17:43:47 +03:00
Bulat Fatykh ed92dbdbf2 Preserve unreadable user settings during autosave 2026-10-01 17:40:29 +03:00
Bulat Fatykh e21be0c4fb Preserve string token kinds in GSC parsing 2026-10-01 17:34:18 +03:00
Bulat Fatykh 1644e60a87 Validate incoming master room option requests before state changes 2026-10-01 17:32:55 +03:00
Bulat Fatykh bcebc2f038 Remove the redundant master binary declaration 2026-10-01 17:10:57 +03:00
Bulat Fatykh 38ba1b4c56 Clarify IWD entry failures with operation and archive 2026-10-01 17:09:08 +03:00
Bulat Fatykh 7aafeae990 Reuse incremental FNV hashing in the artifact cache [skip ci] 2026-10-01 17:07:36 +03:00
Bulat Fatykh 8c5457bc68 docs: clarify master settings for players 2026-10-01 17:07:23 +03:00
Bulat Fatykh fb3d79d608 docs: explain IW4L capabilities and first-run setup 2026-10-01 16:53:35 +03:00
Bulat Fatykh 74f0dbef96 Bind localized string table lookups by row 2026-10-01 16:41:40 +03:00
Bulat Fatykh 00a0e3ab2d Reuse the packed unit vector decoder for asset models
Adapt the shared decoding idea from Nathan Safran's commit
598bcabba508c40b4476d3265970637398b51b81 in nsafran1217/iw4L.
Delegate the complete asset-model decoder to the existing dpvs_iw4
function; leave the source commit's scale table and other changes out.

Source: https://github.com/nsafran1217/iw4L/commit/598bcabba508c40b4476d3265970637398b51b81
Co-authored-by: Nathan Safran <nsafran1217@gmail.com>
2026-10-01 16:38:26 +03:00
Bulat Fatykh fd9b8f8174 Remove the Rust match-end decision retired by script-driven matches 2026-10-01 16:34:39 +03:00
Bulat Fatykh d5fd9cc3f5 Make the glass lookup change independent of decoder transactions 2026-10-01 16:32:39 +03:00
Bulat Fatykh 2202707e8d Search existing glass rows without building a full index
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:32:38 +03:00
Bulat Fatykh 4babe8e897 Keep snapshot decoders unchanged on wire errors 2026-10-01 16:32:38 +03:00
Bulat Fatykh 029a5e634e Limit the decoder fix to projectile state on read errors 2026-10-01 16:31:54 +03:00
Bulat Fatykh 212557c871 Keep snapshot decoders unchanged on wire errors 2026-10-01 16:31:54 +03:00
vc ff7369ffa6 Merge pull request #26 from gitoutofthere/fix/snapshot-delta-length
Check a snapshot delta's length against its frame before allocating it
2026-10-01 13:12:15 +03:00
vc 2768169e6e Merge pull request #25 from gitoutofthere/fix/gsc-nonfinite-text
Turn a non-finite GSC number into a script error, not a panic, when it meets text
2026-10-01 13:12:08 +03:00
vc 1f3df639f4 Merge pull request #24 from gitoutofthere/fix/usercmd-host-panics
Keep a client's usercmd from panicking the host step
2026-10-01 13:11:10 +03:00
vc 89957e170f Merge pull request #22 from Intelios/skip-appledouble-files
Skip macOS AppleDouble files when indexing IWD archives
2026-10-01 13:08:58 +03:00
vc 4452be47f2 Merge pull request #31 from awsms/fix/manyshit
Improve controller aiming and restore MW2 reload ADS timing
2026-10-01 12:43:22 +03:00
vtroc7 41713bb762 Remove controller and weapon research comments 2026-10-01 12:42:43 +03:00
vc dac17be04a Merge pull request #30 from Wet-Shoelace/master
Fix weapon bob tilt when walking
2026-10-01 12:37:11 +03:00
vc 2ed90f1c73 Merge pull request #23 from gitoutofthere/cleanup/pm-flags-literals
Name the single pm_flags bits in movement_iw4
2026-10-01 12:15:03 +03:00
awsms 581832c62b Enable akimbo wrist twist and righty tighty
Restore the akimbo sprint/reload and rapid weapon-cycle behavior needed for
wrist twist and righty tighty. Independent sprint checks previously replaced
one hand's reload animation while processing the other hand.

Prepare both hands and decay their timers before making one shared sprint
transition decision. Follow the original MW2 state checks: firing,
rechambering or melee in either hand can block the transition, while the
primary hand determines whether both hands enter or leave sprint. This
preserves the left reload pose through a rapid weapon-cycle cancellation
without a dedicated wrist-twist animation exception.

Allow combined use/reload to coexist with akimbo sprint while the primary
hand is not reloading. Account for the RELOAD bit added by the current
client when no interaction is targeted. Once the primary hand reloads,
restore normal sprint interruption so reloading both weapons cannot trigger
the left-only wrist twist. Keep ordinary reload-button sprint interruption.

Validation: play build, targeted formatting and diff checks passed. A
temporary probe matched 1,922 state/flag combinations against the original
MW2 sprint-decision instruction block. Lifecycle probes covered left-only,
right-only and both-hand reloads with tapped and held input, including ammo
completion and non-restarting reload timers. Rapid weapon cycling and the
previous held-fire/reload regression probes passed. The user confirmed the
resulting behavior in game. No temporary probes are included.
2026-10-01 08:33:20 +02:00
awsms ba25d47245 Restore held fire and reload behavior
Reload requests were only accepted on a new button press, so holding reload
could not restart it after firing or canceling a weapon switch. Semi-auto
fire also required a new press even when a reload had rearmed the weapon.

Evaluate the held reload request through the existing reload eligibility
checks. Use the semi-auto shot count to gate firing, resetting it on trigger
release and reusing the existing resets during reloads and weapon changes.
Holding fire alone still produces one semi-auto shot, while holding fire
and reload repeats the shot/reload cycle. Holding reload through a double
weapon switch restarts the reload when the weapon becomes eligible again.
The shared simulation change applies to keyboard and controller input.

Validation: play build, targeted rustfmt and diff checks passed. Temporary
probes reproduced both failures before the change and passed afterward,
including normal and fast reloads, canceled and completed weapon switches,
semi-auto release/repress, reload eligibility, bolt actions and both akimbo
hands. The user confirmed the resulting behavior matches MW2 in game.
Temporary probes are excluded from the commit.
2026-10-01 08:21:14 +02:00
awsms 32d6dae721 Fix reload ADS timing
Holding aim originally allowed zooming throughout a reload. The blanket
reload-state restriction added in a2093b9 overcorrected this by blocking
ADS until the entire reload finished, delaying the return to aim compared
to MW2.

Replace that restriction with the original engine's ADS fraction logic.
Decode WeaponDef::iPositionReloadTransTime from IW4 assets and carry it
through the weapon catalog, combat facts and shared movement context.
Include the field in the simulation content fingerprint.

Magazine reloads suppress ADS while remaining weapon time exceeds the
weapon's authored transition window. Segmented reloads suppress ADS during
the start and insertion states, then use that window during reload end.
Keep ADS intent available so holding aim resumes the blend at the original
boundary. The comparison uses weapon-timer milliseconds, preserving the
existing Sleight of Hand timer scaling without an extra fixed delay.

Validation: play build, targeted formatting and diff checks passed. A
temporary reference probe compared 4,704 cases against the original
MW2/IW4x instruction block at 0x4a84ab..0x4a8513, including transition
boundaries and segmented reloads. Runtime traces verified authored windows
and early ADS recovery on M9, USP, Intervention and Barrett with Sleight
of Hand. The user confirmed the resulting behavior in game.

Temporary diagnostics and probes are excluded. The runtime test encountered
the previously observed shutdown SIGSEGV after process_exit code=0; this
change does not address that shutdown issue.
2026-10-01 08:06:24 +02:00
awsms a2093b931c Block aiming down sights during weapon reloads
The shared ADS permission check excluded weapon switches, melee and offhand
states but omitted the reload family. Holding or requesting ADS during a
reload could therefore keep raising the weapon and zooming the view.

Reject ADS throughout Reloading, ReloadingInterrupt, ReloadStart,
ReloadStartInterrupt and ReloadEnd using the existing weapon-state helper.
The normal ADS intent/fraction update then lowers the weapon at its ADS-out
rate and prevents re-entry until the reload ends. The same permission check
runs in authoritative simulation and client prediction, covering keyboard
reload and controller use/reload without changing their bindings.

Validation: play build, targeted rustfmt and diff checks passed. A temporary
probe reproduced the permissive behavior with the previous implementation,
then verified ADS exit and blocked entry for all five reload states with
RELOAD and USE_RELOAD inputs. It also checked ADS recovery when ready and
preserved firing/rechamber permissions. No in-game visual retest was run.
2026-10-01 07:49:58 +02:00
awsms d75aa4181a Fix controller trigger hands for akimbo weapons
The weapon simulation fires the right akimbo hand with THROW and the left
with ATTACK. Default controller bindings therefore fired the opposite hand:
RT used ATTACK while LT used speed_throw.

Port the hand-mapping behavior from the local Xbox branch to the unified
binding system. Resolve akimbo state from the predicted local player, with
a presented-snapshot fallback, and swap controller attack/speed_throw actions
when installing gameplay bindings. Preserve saved bindings, keyboard/mouse
controls and unrelated controller actions. Lefty and custom layouts follow
their assigned fire/aim actions rather than hard-coded physical triggers.

Use the existing binding-change path to release the old action and block a
held button until release when switching between single and dual weapons.

Validation: play build and diff checks passed. A temporary probe covered
right/left/both triggers, releases, normal fire/ADS bindings, Lefty and custom
assignments, mouse preservation, and release-before-remap weapon transitions.
No physical-controller gameplay retest was performed.
2026-10-01 07:46:01 +02:00
awsms b7661e1a0a Match IW4x controller turn acceleration
The turn-speed limit scaled with sensitivity while acceleration scaled
with FOV. Increasing sensitivity therefore lengthened the ramp, unlike
the local IW4x controller implementation.

Scale acceleration by the base controller sensitivity multiplier instead
of FOV, matching IW4x's default 1200 degrees/s squared times sensitivity.
Keep ADS and FOV scaling on the requested turn speed. Ramp the absolute
speed before applying the requested direction, matching IW4x's integrator
when the stick reverses direction during a ramp. Deceleration and disabled
acceleration remain immediate.

Validation: the play build, targeted rustfmt and diff checks passed.
A temporary reference probe passed 216 combinations of sensitivity, FOV,
ADS blend, frame rate and acceleration mode, including direction reversals,
release and disabling acceleration. No game relaunch or physical-controller
feel test was performed.
2026-10-01 07:42:51 +02:00