Profile stats, first-run hints, tiered balance, a wave-driven whip, and more options

- Profile Stats: damage dealt, kills and wins (single player and multiplayer) and the most and least played weapons
  and trinkets, counted from running totals in the simulation so online rewinds correct them. Protocol 6.
- First-run control hints in the sandbox (and Chat in lobbies), each gone for good once used.
- The ready countdown and a timed round's last five seconds beep (new countdown sound), and those seconds show big.
  When time runs out, everyone short of the most health dies.
- Weapon balance tuned into tiers: Whip and Grenade Launcher on top, then melee, ranged, and utility (Vacuum,
  Grapple, Uzi) at the bottom.
- The whip's lash is a chain of links a wave rolls down: windup, loop, crack, then a floppy recoil.
- Muzzles come from Muzzle nulls in weapons.anm2 (read in at build time), for shots and the flash, which now follows
  the weapon.
- Settings: Quit, Scale (1x-4x or Free), FPS meter and limit beside Vsync, Mute on Unfocus, Damage Numbers, Rumble,
  Stick Deadzone, and an Online section (Host, Chat, Ping) shared with the Multiplayer page.
- The menu header lays out tabs and buttons by their names. About is sandbox-only. The score no longer shifts with
  the menu's tab.
- Smaller meters, 90 tips (all ending in !), and a shorter lobby welcome.
This commit is contained in:
shweet committed 2026-11-10 18:32:31 -05:00
1 parent e9d8cac926
commit b96defa1e6
32 files changed
+1368 -396

No files matched your search

+4 -2
View File
@@ -116,9 +116,10 @@ void Effects::popup_spawn(Vec2 position, const char* text, Color color)
effect_add(popups, popup);
}
void Effects::flash_spawn(Vec2 position, float angle, float size, Color color)
void Effects::flash_spawn(Flash flash)
{
effect_add(flashes, Flash{color, position, angle, FLASH_LIFE, size});
flash.life = FLASH_LIFE;
effect_add(flashes, flash);
}
// A particle at position, shrinking and fading as its life runs out: an outline in its colour around a core shaded by
@@ -207,6 +208,7 @@ void Effects::draw(Game& game)
// Each flash is a long streak along the shot crossed by a short one, shrinking as it fades.
for (Flash& flash : flashes)
{
game.scene.flash_follow(flash);
float fade = flash.life / FLASH_LIFE;
float length = FLASH_LENGTH * flash.size * fade;
float width = FLASH_WIDTH * flash.size * fade;