Tomatoes, match tabs, shared pings, and a round of fixes

- On the results, everyone but the winner splats tomatoes where they
  click (bots aim at the winner), with a new splat sound.
- During a match the menu has the item tabs (choosing when the
  countdown allows, and otherwise levelling the sandbox's levels for
  when you're back), Play (the game's rules) and Settings.
- Pings are shared through the server (protocol 4), so other players'
  connection bars show over their heads and on their windows.
- PvP comes into lobbies with your profile and is saved.
- The choice menu opens by itself however the countdown began.
- Knocked-out fighters keep their buttons current, so Ready on the
  results toggles once per press.
- The weapon wheel wraps both ways. Readying with empty slots plays
  the equip sound for your own fighter.
- Shock Absorber: up to 50% less weapon movement and 33% less
  knockback. Only the catalog previews the next level.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shweetandClaude Opus 5.5 committed 2026-11-08 18:11:06 -05:00
1 parent cdb0845da2
commit 9a41474069
29 files changed
+295 -79

No files matched your search

+7 -7
View File
@@ -1190,9 +1190,9 @@ static void effects_preview_get(Game& game, const char* now, const char* next, c
SDL_strlcpy(text, result.c_str(), size);
}
// Name, numbers at a level and description of a weapon or trinket. Trinkets say how many copies are equipped, and
// when they stack.
Tooltip Ui::tooltip_build(Game& game, bool isTrinket, int item, int level)
// Name, numbers at a level and description of a weapon or trinket, previewing the next level's where asked (the
// catalog). Trinkets say how many copies are equipped, and when they stack.
Tooltip Ui::tooltip_build(Game& game, bool isTrinket, int item, int level, bool isPreview)
{
Tooltip tooltip;
tooltip.isTrinket = isTrinket;
@@ -1214,8 +1214,8 @@ Tooltip Ui::tooltip_build(Game& game, bool isTrinket, int item, int level)
else
SDL_strlcpy(equipped, copies > 0 ? "Equipped" : "Not Equipped", sizeof(equipped));
tooltip.name = def.name;
// In the sandbox, the effects show what the next level changes after an arrow, as weapons' stats do.
bool isPreview = game.sim.match.state == MATCH_PRACTICE && level < LEVEL_COUNT - 1;
// Previewed (in the catalog), the effects show what the next level changes after an arrow, as stats do.
isPreview &= level < LEVEL_COUNT - 1;
char effects[TOOLTIP_LENGTH];
if (isPreview)
effects_preview_get(game, def.effects[level], def.effects[level + 1], effects, sizeof(effects));
@@ -1234,8 +1234,8 @@ Tooltip Ui::tooltip_build(Game& game, bool isTrinket, int item, int level)
const WeaponDef& def = WEAPON_DEFS[item];
tooltip.name = def.name;
// In the sandbox, values that change at the next level show it after an arrow.
bool isPreview = game.sim.match.state == MATCH_PRACTICE && level < LEVEL_COUNT - 1;
// Previewed (in the catalog), values that change at the next level show it after an arrow.
isPreview &= level < LEVEL_COUNT - 1;
SDL_snprintf(tooltip.stats, sizeof(tooltip.stats), isPreview ? "(Level %d → Level %d)" : "(Level %d)", level + 1,
level + 2);
stats_table_build(fighter, item, level, isPreview, tooltip);