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

+6 -13
View File
@@ -17,6 +17,8 @@ struct Particle
float size;
};
void particle_draw(Renderer& renderer, Particle& particle, Vec2 position);
// Text that hops up from where it appears and fades, like damage numbers. Jitter shakes it, in pixels.
// Damage numbers also keep their value and which target they're over, so quick hits can add up.
struct Popup
@@ -49,20 +51,13 @@ struct Flash
float size = 0;
};
// A ring swelling out to its radius as it fades, like an airblast.
struct Ring
{
Color color;
Vec2 position;
float life = 0;
float radius = 0;
};
// A fading copy of a sprite left behind by something moving fast.
// A fading copy of a sprite left behind by something moving fast, and what its fighter wore (nothing, FASHION_NONE,
// for an attack's).
struct Afterimage
{
Pose pose;
float life = 0;
int worn = 0;
};
// Particles, afterimages, text popups, screen shake and the damage-per-second tally.
@@ -70,9 +65,8 @@ class Effects
{
public:
void burst(Burst burst, Vec2 position, float angle, Color color);
void afterimage_spawn(Pose pose);
void afterimage_spawn(Pose pose, int worn);
void flash_spawn(Vec2 position, float angle, float size, Color color);
void ring_spawn(Vec2 position, float radius, Color color);
void afterimage_draw(Game& game);
void number_spawn(Vec2 position, int value, int target, Color color);
void dps_record(int amount);
@@ -90,7 +84,6 @@ private:
std::vector<Hit> hits;
std::vector<Particle> particles;
std::vector<Popup> popups;
std::vector<Ring> rings;
float shake = 0;
int ticks = 0;
};