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

+17 -2
View File
@@ -59,12 +59,24 @@ enum MouseButton
MOUSE_COUNT
};
// Which half of a binding: the keyboard side or the gamepad side.
enum BindingSide
{
SIDE_KEY,
SIDE_PAD
};
// A control's two bindings: one on the keyboard side (a key's scancode, or past the keys a mouse button or wheel
// direction) and one on the gamepad (a button, or past the buttons a stick or trigger direction). -1 is unbound.
struct Binding
{
int key = -1;
int pad = -1;
int& side_get(BindingSide side)
{
return side == SIDE_PAD ? pad : key;
}
};
constexpr int PAD_MAX = 4;
@@ -144,8 +156,10 @@ public:
int captureControl = -1;
int erases = 0;
int slotPressed = -1;
// A loadout picked with Shift and a number key, kept until the settings take it (they update once a frame).
int loadoutPressed = -1;
bool isBindingChanged = false;
bool isCaptureGamepad = false;
BindingSide captureSide = SIDE_KEY;
bool isClicked = false;
bool isConfirmed = false;
bool isMouseMoved = false;
@@ -174,7 +188,8 @@ public:
bool is_mouse_down(MouseButton button);
bool is_mouse_pressed(MouseButton button);
bool is_mouse_released(MouseButton button);
void binding_name_get(int binding, bool isGamepad, char* text, int size);
void binding_name_get(int binding, BindingSide side, char* text, int size);
void control_name_get(Control control, char* text, int size);
bool is_control_down(int device, Control control);