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:
1 parent
e55596b276
commit
e9d8cac926
101 files changed
+5787
-7148
No files matched your search
@@ -0,0 +1,5 @@
|
||||
// Headless node runs of the emscripten build: SDL looks for hints in the page's URL, which node doesn't have, and the
|
||||
// game reads RPG_SEED and friends from the environment, which emscripten doesn't pass through by itself.
|
||||
globalThis.window = globalThis.window || { location: { search: "" } };
|
||||
Module.preRun = Module.preRun || [];
|
||||
Module.preRun.push(() => Object.assign(ENV, process.env));
|
||||
@@ -0,0 +1,9 @@
|
||||
// The browser build: keeps the prefs folder (/libsdl, where SDL puts it on the web) in IndexedDB, loading it before
|
||||
// the game starts so saved settings are there when it reads them. The game writes it back after every save.
|
||||
Module.preRun = Module.preRun || [];
|
||||
Module.preRun.push(() => {
|
||||
FS.mkdir("/libsdl");
|
||||
FS.mount(IDBFS, {}, "/libsdl");
|
||||
addRunDependency("prefs");
|
||||
FS.syncfs(true, () => removeRunDependency("prefs"));
|
||||
});
|
||||
@@ -0,0 +1,29 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Smack a Brother</title>
|
||||
<style>
|
||||
html, body { margin: 0; height: 100%; background: #000; overflow: hidden; }
|
||||
canvas { display: block; width: 100%; height: 100%; image-rendering: pixelated; outline: none; }
|
||||
#status { position: fixed; inset: 0; display: grid; place-items: center; color: #fff; font: 16px monospace; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="status">Loading...</div>
|
||||
<canvas id="canvas" tabindex="-1" oncontextmenu="event.preventDefault()"></canvas>
|
||||
<script>
|
||||
var Module = {
|
||||
canvas: document.getElementById("canvas"),
|
||||
setStatus: function (text) {
|
||||
var status = document.getElementById("status");
|
||||
status.textContent = text;
|
||||
status.style.display = text ? "grid" : "none";
|
||||
},
|
||||
};
|
||||
Module.setStatus("Loading...");
|
||||
</script>
|
||||
{{{ SCRIPT }}}
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user