Commit Graph

139 Commits

Author SHA1 Message Date
vtroc7 f026f5fca0 Improve runtime readiness, rendering, audio and Linux game discovery v0.1.0-demo.5 2026-10-05 23:41:16 +03:00
vtroc7 65052d3f51 Add native T5 audio, Black Ops II maps, independent movement, late join, skill ratings and varied bot loadouts
Decode Black Ops audio natively and load Black Ops II worlds, faction
models, equipment, materials, lighting and weapon camouflage.

Rework capsule collision, solid recovery, penetration, recoil, effects
and sentry placement; synchronize late joins and player event delivery.
Keep local skill ratings and signed player accounts.

Show the selected community and master ping on the main menu. Add twenty
asset-filtered class presets across IW4, IW5, T5 and T6, plus fifty-two
unique player-style names shared by AI bots and dummies. Honor the chosen
dev descriptor in the two-client approved scenario and credit contributors
and weapon, map and attachment QA testers.

Validated with the approved gameplay lifecycle and two-client dev-master
scenarios, installed class-asset audit, bot-name uniqueness checks and
Linux IW4/IW5/T5/T6 gameplay smoke runs. Foreign-weapon match-stat schema
coverage remains incomplete.
v0.1.0-demo.4
2026-10-05 13:13:28 +03:00
vtroc7 9313f6c8be Merge pull requests #59 #64 #65 from gitoutofthere and NeptuneTheGoat 2026-10-04 16:20:36 +03:00
neptune bb575b897c Tidy the Black Ops II work for review
- Format with rustfmt and clear the clippy warnings on lines this branch
  adds (fixed-size chunks via as_chunks, explicit fallbacks instead of
  unwrap_or_default, range patterns, elided lifetimes).
- The engine-supplied equipment script is t6_equipment.gsc.txt, since
  publish-check treats any .gsc as game data; FNV constants are named.
- NOTICE credits the Plutonium t6-scripts dump that the equipment
  behaviour was worked out from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 17:21:51 -04:00
neptune 311c5d2a69 Name the camouflage fallbacks the way clippy asks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 21:08:22 -04:00
neptune 9fcdb6a25f Preview a camouflage as wide as the class panel lays it
The camouflage picker showed its swatch in the square attachment preview;
it now fills the weapon-wide preview, as the class panel shows it behind
the weapon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 21:05:05 -04:00
neptune 9c00565bd9 Give MW2 weapons their camouflage
A weapon's gunXModel / worldModel slots 1-8 are its camouflage models
(woodland ... orange_fall, numbered as mp/camoTable.csv). They are now
captured, aliased arrays included, and bound per weapon.

Classes carry a camouflage per weapon (classes.txt: two optional trailing
fields, written only when one is set; PersonalClass on the wire, protocol
103). MW2's _class.gsc reads it from customClasses...camo and gives the
weapon with its number; giveWeapon stores it as the slot's weaponModel in
weapon_data, which replicates. First person swaps the gun's materials for
the camouflage model's (it shares the gun's surfaces); third person draws
the camouflage world model.

Create-a-Class goes weapon, attachment, then camouflage, as MW2 does,
offering only the camouflage the weapon has, and MW2's panel shows it
behind the weapon. Console: give ... camo=<name|slot>, bot give ...
camo=<name>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 21:05:05 -04:00
neptune e3ff4be7d1 Give Black Ops II equipment its own effects and sounds
iw4l_t6/equipment plays T6's equipment effects and sounds: team-coloured
lights on bouncing betties, trophy systems, shock charges and C4, the
betty's launch and burst, the trophy's deploy and intercept flashes, the
shock charge's warning and zap, the sensor's scan, EMP fizzles.

T6 effects are captured with every effect they play in turn (runners and
spawned children), and the report names any the converter refuses. T6
rows use their own projectile explosion effect when it was captured. T6
equipment aliases are captured, and T6 aliases record whether they loop
so scripts can play them. Script effects honour hide()/showToPlayer()
(protocol 104), so team lights, and IW4's tactical insertion flares, show
to their side only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 17:53:22 -04:00
neptune 818ba83cc8 Run Black Ops II equipment as Black Ops II does
Tactical insertion: under IW4 rules offhands are bridged by name only, so
the upstream slot stand-ins no longer hand the scripts a flash for it (it
plants and sets the spawn again); hidden entities stay usable, so its
owner picks it back up.

Equipment stats: read T6 detonate delay/time, damage cone, forward and
view-relative up speed, the detonator flag (C4 detonates) and the
retrievable flag (owner pickup only where T6 allows it).

Equipment behaviour: iw4l_t6/equipment ports T6's bouncing betty, shock
charge, trophy system, sensor and EMP grenades onto IW4's scripts, plus
T6's one-of-each counts, claymore grace and respawn cleanup. The engine
reports those items under their own names, tags thrown grenades with
nativename/weaponmodel, keeps sensors planted, drops the claymore laser
from betty and trophy, and lets objective_team address one player (sensor
pings, drawn in FFA too; protocol 103).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:12:02 -04:00
neptune f7c3b953ee Merge upstream master (d352dbd) into bo2-weapons
Conflicts kept both sides: Steam discovery next to Game Folders and
sibling titles, upstream's profile/account persistence next to the
folder picks and saved position, SAB/FLAC beside blake3, the T6
localize loader on the raw-bytes catalog (cache format 3), and our
tactical insertion equipment mapping with upstream's specialty_null.
The fire-delay fix takes upstream's form. Exit silencing now mutes the
new audio runtime instead of Bevy audio sinks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:04:01 -04:00
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
neptune a921065c08 Play weapons' first raise after they are given
A weapon raised for the first time since it was given (on spawn, on
pickup, or switched to after a give) takes its first raise animation
and iFirstRaiseTime, as IW4 does: the first byte of a held weapon's
equipped state (usedBefore) is set once it is raised and cleared when
it is given. The first raise sends EV_FIRST_RAISE_WEAPON.

First raise times are read from IW4 WeaponCompleteDef (0x54) and T6
WeaponDef (1228) into the catalog and combat facts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 03:43:56 -04:00
neptune 2bc7281383 Show the Black Ops II tactical insertion's own light
T6 effects named in T6_EFFECTS are captured from the T6 zones and
converted to IW4 effects: a T6 element is laid out as a T5 one, lines
become tails along the effect's forward axis at half size, and sample
colours go from RGBA to BGRA. Their materials stand in on IW4's glow
stick material with the T6 colour maps.

The flare glows IW4's scripts light on a T6 tactical insertion play the
T6 team or enemy light instead, from the insertion, straight up. The
planted model lies flat as in Black Ops II.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 03:27:45 -04:00
neptune efa20d65ec Make the Black Ops II tactical insertion a tactical with its own model
The T6 tactical insertion sits in the tactical slot and throws with the
tactical button beside the lethal: the class script is handed a smoke
grenade standing for it, and its giving starts IW4's tactical insertion
perk. The glow stick IW4's scripts plant for it carries the T6 planted
model, drawn as a projectile mesh standing on end, and the thrown grenade
is removed once it is planted.

IW4's own tactical insertion chosen as the lethal is given as the
equipment perk instead of a frag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 02:50:36 -04:00
neptune 1677322267 Add Black Ops II optics, scope overlays, equipment icons and HUD names
- Reticles draw T6's emissive technique (T6 "unlit" is Radiant's preview);
  packed constant rows, floatZ stand-in, blended surfaces drop depth writes
- Zone pointer lookups go through per-asset bound slots (reused memory)
- Holo and rangefinder swap to their ADS models when fully aimed
- BO2 scope overlays (variant/unique overlay materials); sights looked
  through (ACOG, iron sights) on snipers aim down the 3D sight
- Select fire and other zero-timed alt raises last their clip
- Stat-only configurations (FMJ) keep the bare weapon's hides
- HUD names configurations with their attachments; equipment uses its
  BO2 HUD icon; attachment and overlay icons decoded for the class menu
- World models (planted equipment, third person) use native T6 materials

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:46:21 -04:00
neptune 6f15ecf64e Fix T6 alternate modes, iron sights, riot shield bash and fire delay
- Each T6 configuration with an alternate weapon (grenade launcher,
  select fire, dual optic) gets an alternate row of its own: it wears the
  configuration's attachments and returns to it. Select fire and dual
  optic fire from the configuration's magazine (WeaponAttachment
  sharedAmmo). A switch plays only the raise of the weapon switched to;
  select fire uses its attachment's in/out clips.
- weapon_iw4: a weapon with a fire delay re-armed the delay when it ran
  out and never fired; the delayed shot now fires.
- Configurations hide only their attachments' gun bones, not the bare
  weapon's (the Ballista's iron sights under its scope).
- A T6 riot shield bashes with the fire button (`fire_melees`).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 19:20:02 -04:00
neptune 3881204ae6 Apply Black Ops II attachment stats
Each T6 attachment configuration takes the numbers of the attachment's
WeaponAttachment (fastfile_t6::weapon::attachment, offsets checked against
known effects): clip size, fire time, reload times, ADS in/out times, ADS
zoom FOV and zoom fractions, damage range, hip spread, ADS move speed,
ADS view kick centring, ADS idle sway, and FMJ penetration.

- ADS move speed is relative to walking as in IW4 (SMGs 2, rifles 1); a
  stock raises it up to running pace.
- A pump shotgun's fast mag loads two shells a stroke.
- T6 weapons had no penetration multiplier; they take the stand-in's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 18:50:24 -04:00
Bulat Fatykh 41ee5fc846 Ship release notices and embed an OFL console font 2026-10-02 01:30:28 +03:00
neptune 0987b48fb7 Add Black Ops II weapon attachments (visible models)
Every attachment a T6 weapon offers, alone or in a compatible pair, is a
weapon row (`an94_acog_grip`) built from the base row and the weapon's
WeaponAttachmentUnique assets: the attachment's first-person and world
models at the weapon's own placement, hidden gun bones, clip overrides,
fire sounds and alternate weapon. Stat-only attachments make rows that
change nothing shown yet.

- fastfile_t6: AttachmentUniqueView; loaded assets record the asset each
  pointer field named at load time, since walk memory is reused.
- Each attachment model is captured per weapon (`model@unique`) with its
  offset as root rest and the gun bone it hangs from (ModelSkel::mount_tag).
- T6 guns hide parts by collapsing bones in skinning: their sights share
  the body's surfaces.
- Bare T6 rows hide what their `none` unique hides.
- The full T6 attachment table loads; stats-table names like `acog_sniper`
  map to `acog`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:46:34 -04:00
neptune af8ee254c1 Add Black Ops II weapons, native T6 shaders and Game Folders
T6 (Black Ops II) weapons load from the BO2 install beside MW2 and play
with their own models, materials, animations, sounds and icons, standing
in for an MW2 weapon row for gameplay.

- fastfile_t6: T6 zone walking and weapon views; IPak/SAB image and sound
  sources in asset_transport.
- dxbc_sm5: DX11 shader bytecode lowered to WGSL, so T6 materials draw
  with their own technique sets (t6_techset, dxbc_abi).
- Materials: borrowed draw states come from the stand-in's opaque body,
  never a lens; colour-map alpha (the camo mask) reads as one on opaque
  surfaces; specular and probe reflection scaled for IW4 lighting; maps
  named by another kind's samplers fall back to the same-role map.
- Dual wield (`X_dw` + `X_lh`) through the shared secondary-gun viewmodel,
  and the `dw` attachment from T6's attachment table.
- Melee: guns without their own melee clip (and pistols, whose clip is the
  tactical knife's) borrow knife_mp's knife and swings; the hip ADS layer
  returns after a melee.
- T6 clip names match case-insensitively.
- Game Folders option for BO1/MW3/BO2 installs, multi-game lookup fixes,
  clean exit, crosshairs, save/load/loadspawn console commands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:56:23 -04: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