Weapons built from traits, fashion, Hourglass, About tab, and Ithaca

- Every attack is now assembled from traits on its definition instead
  of per-weapon code: an anchor and path (thrusts, out-and-back, arcs),
  shared flight physics (gravity, drag, acceleration, homing, and one
  wall response: end, burst, stick, crawl, bounce, stop, pass, return,
  latch), and flags like bouncy, drifting, tethered, orbiting, instant
  and arming. Melee are projectiles too.
- Shots have a lifetime and a fade (when damage bottoms out). Range is
  speed times lifetime. Ricochets and the Vacuum wind lifetime back.
- The Vacuum pulls anyone's shots, and its airblast flips them out
  along the aim, claiming enemies' (fading into your colour).
- New trinket: Hourglass, longer projectile lifetime and range. Ropes
  and chains lengthen with it and the Accelerator.
- Fashion: 23 items worn on the head, face or torso, chosen in Profile.
- Flamethrower flames hit continuously, the whip coils and sweeps,
  bouncing shots roll over ramps, and Ricochet relights grenade fuses.
- Profile tab, colour tooltips, option hints on every setting, an
  About tab with credits and links, and the Ithaca font.
- Loadouts lock once readied, tomatoes clear with the match, and the
  round-over pause is 4 seconds.
- CC0 license. Tools and CLAUDE.md are no longer tracked, and the web
  shell moves to web/.
This commit is contained in:
shweet committed 2026-11-10 15:27:12 -05:00
1 parent e55596b276
commit e9d8cac926
101 files changed
+5787 -7148

No files matched your search

+8
View File
@@ -44,6 +44,7 @@ struct Color
constexpr Color BLACK = {0, 0, 0, 1};
constexpr Color GRAY = {128 / 255.0f, 128 / 255.0f, 128 / 255.0f, 1};
constexpr Color WHITE = {1, 1, 1, 1};
constexpr Color CLEAR = {0, 0, 0, 0};
inline Vec2 operator+(Vec2 a, Vec2 b)
{
@@ -184,6 +185,13 @@ inline Color color_fade(Color color, float alpha)
return {color.r, color.g, color.b, color.a * alpha};
}
// A colour amount of the way from one to another.
inline Color color_mix(Color from, Color to, float amount)
{
return {from.r + (to.r - from.r) * amount, from.g + (to.g - from.g) * amount, from.b + (to.b - from.b) * amount,
from.a + (to.a - from.a) * amount};
}
// A list of up to N items held in place, without the heap: game state kept in one, unlike in a std::vector, is plain
// bytes that mean the same on every platform (see Fighter). Pushing past N drops the item.
template <class T, int N> struct FixedList