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

+56 -35
View File
@@ -5,51 +5,72 @@
{
"path": "weapons.png",
"regions": [
{"name": "Sword", "crop": [8, 10], "size": [32, 12], "pivot": [4, 5.5]},
{"name": "Hammer", "crop": [57, 9], "size": [29, 14], "pivot": [4, 7]},
{"name": "Flail", "crop": [107, 5], "size": [30, 19], "pivot": [3, 9]},
{"name": "Lance", "crop": [145, 10], "size": [47, 12], "pivot": [6, 6]},
{"name": "Whip", "crop": [11, 41], "size": [24, 22], "pivot": [7, 3]},
{"name": "Whip Base", "crop": [154, 105], "size": [15, 12], "pivot": [8, 3]},
{"name": "Grapple", "crop": [60, 41], "size": [27, 13], "pivot": [3, 6.5]},
{"name": "Boomerang", "crop": [111, 41], "size": [19, 13], "pivot": [9, 2]},
{"name": "Bow", "crop": [161, 35], "size": [14, 27], "pivot": [2, 13]},
{"name": "Blaster", "crop": [11, 74], "size": [23, 14], "pivot": [4, 9]},
{"name": "Uzi", "crop": [61, 72], "size": [24, 18], "pivot": [10, 8]},
{"name": "Shotgun", "crop": [104, 74], "size": [31, 10], "pivot": [8, 5]},
{"name": "Flamethrower", "crop": [151, 72], "size": [31, 17], "pivot": [5, 9]},
{"name": "Rocket Launcher", "crop": [8, 106], "size": [31, 12], "pivot": [10, 5]},
{"name": "Mine", "crop": [66, 103], "size": [10, 18], "pivot": [1, 11.5]},
{"name": "Grapple Tip", "crop": [70, 41], "size": [17, 13], "pivot": [0, 6.5]},
{"name": "Fist", "crop": [111, 105], "size": [14, 14], "pivot": [0, 7]},
{"name": "Grapple Base", "crop": [60, 41], "size": [10, 13], "pivot": [3, 6.5]},
{"name": "Grimoire", "crop": [10, 134], "size": [16, 9], "pivot": [8, 2.5]}
{"name": "Fist", "crop": [17, 9], "size": [14, 14], "pivot": [0, 7]},
{"name": "Sword", "crop": [56, 10], "size": [32, 12], "pivot": [4, 5.5]},
{"name": "Hammer", "crop": [105, 9], "size": [29, 14], "pivot": [4, 7]},
{"name": "Lance", "crop": [144, 10], "size": [47, 12], "pivot": [6, 6]},
{"name": "Whip", "crop": [12, 37], "size": [24, 22], "pivot": [7, 3]},
{"name": "Whip Base", "crop": [64, 42], "size": [15, 12], "pivot": [8, 3]},
{"name": "Flail", "crop": [105, 38], "size": [30, 19], "pivot": [3, 9]},
{"name": "Boomerang", "crop": [158, 41], "size": [19, 13], "pivot": [9, 2]},
{"name": "Grapple", "crop": [10, 73], "size": [27, 13], "pivot": [3, 6.5]},
{"name": "Grapple Tip", "crop": [20, 73], "size": [17, 13], "pivot": [0, 6.5]},
{"name": "Grapple Base", "crop": [10, 73], "size": [10, 13], "pivot": [3, 6.5]},
{"name": "Bow", "crop": [63, 66], "size": [14, 27], "pivot": [2, 13]},
{"name": "Bow Charge 1", "crop": [103, 66], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Charge 2", "crop": [151, 66], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Charge 3", "crop": [7, 98], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Charge 4", "crop": [55, 98], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Cooldown 1", "crop": [103, 98], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Cooldown 2", "crop": [151, 98], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Cooldown 3", "crop": [7, 130], "size": [33, 27], "pivot": [8, 13]},
{"name": "Bow Cooldown 4", "crop": [55, 130], "size": [33, 27], "pivot": [8, 13]},
{"name": "Blaster", "crop": [108, 137], "size": [23, 14], "pivot": [4, 9]},
{"name": "Uzi", "crop": [156, 135], "size": [24, 18], "pivot": [10, 8]},
{"name": "Shotgun", "crop": [8, 171], "size": [31, 10], "pivot": [8, 5]},
{"name": "Bolter", "crop": [59, 169], "size": [25, 14], "pivot": [6, 7]},
{"name": "Bolter 1", "crop": [106, 169], "size": [28, 14], "pivot": [6, 7]},
{"name": "Bolter 2", "crop": [154, 169], "size": [28, 14], "pivot": [6, 7]},
{"name": "Bolter 3", "crop": [10, 201], "size": [28, 14], "pivot": [6, 7]},
{"name": "Bolter 4", "crop": [58, 201], "size": [28, 14], "pivot": [6, 7]},
{"name": "Bolter 5", "crop": [106, 201], "size": [28, 14], "pivot": [6, 7]},
{"name": "Rocket Launcher", "crop": [152, 202], "size": [31, 12], "pivot": [10, 5]},
{"name": "Grenade Launcher", "crop": [8, 233], "size": [31, 14], "pivot": [12, 7]},
{"name": "Mine", "crop": [67, 231], "size": [10, 18], "pivot": [1, 11.5]},
{"name": "Flamethrower", "crop": [104, 231], "size": [31, 17], "pivot": [5, 9]},
{"name": "Vacuum", "crop": [146, 229], "size": [43, 22], "pivot": [23, 7]},
{"name": "Grimoire", "crop": [16, 267], "size": [16, 9], "pivot": [8, 2.5]}
]
}
],
"layers": [
{"name": "sprite"}
],
"defaultAnimation": "Sword",
"defaultAnimation": "Fist",
"animations": {
"Sword": {"layers": [{"layer": 0, "frames": [{"region": 0}]}]},
"Hammer": {"layers": [{"layer": 0, "frames": [{"region": 1}]}]},
"Flail": {"layers": [{"layer": 0, "frames": [{"region": 2}]}]},
"Fist": {"layers": [{"layer": 0, "frames": [{"region": 0}]}]},
"Sword": {"layers": [{"layer": 0, "frames": [{"region": 1}]}]},
"Hammer": {"layers": [{"layer": 0, "frames": [{"region": 2}]}]},
"Lance": {"layers": [{"layer": 0, "frames": [{"region": 3}]}]},
"Whip": {"layers": [{"layer": 0, "frames": [{"region": 4}]}]},
"Whip Base": {"layers": [{"layer": 0, "frames": [{"region": 5}]}]},
"Grapple": {"layers": [{"layer": 0, "frames": [{"region": 6}]}]},
"Grapple Tip": {"layers": [{"layer": 0, "frames": [{"region": 15}]}]},
"Grapple Base": {"layers": [{"layer": 0, "frames": [{"region": 17}]}]},
"Flail": {"layers": [{"layer": 0, "frames": [{"region": 6}]}]},
"Boomerang": {"layers": [{"layer": 0, "frames": [{"region": 7}]}]},
"Bow": {"layers": [{"layer": 0, "frames": [{"region": 8}]}]},
"Blaster": {"layers": [{"layer": 0, "frames": [{"region": 9}]}]},
"Uzi": {"layers": [{"layer": 0, "frames": [{"region": 10}]}]},
"Shotgun": {"layers": [{"layer": 0, "frames": [{"region": 11}]}]},
"Flamethrower": {"layers": [{"layer": 0, "frames": [{"region": 12}]}]},
"Rocket Launcher": {"layers": [{"layer": 0, "frames": [{"region": 13}]}]},
"Mine": {"layers": [{"layer": 0, "frames": [{"region": 14}]}]},
"Fist": {"layers": [{"layer": 0, "frames": [{"region": 16}]}]},
"Grimoire": {"layers": [{"layer": 0, "frames": [{"region": 18}]}]}
"Grapple": {"layers": [{"layer": 0, "frames": [{"region": 8}]}]},
"Grapple Base": {"layers": [{"layer": 0, "frames": [{"region": 10}]}]},
"Grapple Tip": {"layers": [{"layer": 0, "frames": [{"region": 9}]}]},
"Bow": {"layers": [{"layer": 0, "frames": [{"region": 12}]}]},
"Bow Charge": {"length": 4, "loop": false, "layers": [{"layer": 0, "frames": [{"region": 12}, {"region": 13}, {"region": 14}, {"region": 15}]}]},
"Bow Cooldown": {"length": 4, "loop": false, "layers": [{"layer": 0, "frames": [{"region": 16}, {"region": 17}, {"region": 18}, {"region": 19}]}]},
"Blaster": {"layers": [{"layer": 0, "frames": [{"region": 20}]}]},
"Uzi": {"layers": [{"layer": 0, "frames": [{"region": 21}]}]},
"Shotgun": {"layers": [{"layer": 0, "frames": [{"region": 22}]}]},
"Bolter": {"length": 25, "layers": [{"layer": 0, "frames": [{"region": 24, "delay": 5}, {"region": 25, "delay": 5}, {"region": 26, "delay": 5}, {"region": 27, "delay": 5}, {"region": 28, "delay": 5}]}]},
"Rocket Launcher": {"layers": [{"layer": 0, "frames": [{"region": 29}]}]},
"Grenade Launcher": {"layers": [{"layer": 0, "frames": [{"region": 30}]}]},
"Mine": {"layers": [{"layer": 0, "frames": [{"region": 31}]}]},
"Flamethrower": {"layers": [{"layer": 0, "frames": [{"region": 32}]}]},
"Vacuum": {"layers": [{"layer": 0, "frames": [{"region": 33}]}]},
"Grimoire": {"layers": [{"layer": 0, "frames": [{"region": 34}]}]}
}
}