Wavecaller · spawnerKit 1.0.0
spawnerKit is a reusable enemy spawning kit you can install into your own world: spawn points, spawners, waves written as data, difficulty curves, enemy pooling, five events and host-authoritative multiplayer. This world is its home and its showcase.
What you get
- 10 spawn patterns, swapped with one setting,
pattern: at a spawn point, random in an area, in a ring around a player, just off screen, along a smooth curved path (built on the engine's spline module), out of a portal, dropping from the sky, burrowing up, an endless trickle, and a fully scripted wave table. - 7 spawn effects built on juiceKit: puff of smoke, portal swirl, sci-fi beam-in, dirt burst, landing impact, sparkle pop, none.
- 5 difficulty curves: steady, steep, stepped plateaus, breather waves, flat.
- Waves as data: a
.datafile per wave table (enemies, counts, delay, gap between spawns, spawn points), checked by the editor as you type. - Pooling: dead or departed enemies are reused, not destroyed. Over ten waves the entity count stayed exactly flat, and a readout shows created vs reused.
- Events:
waveStarted,waveCleared,spawned,despawned,allWavesDone, fired on every player's machine. - Multiplayer, host-authoritative: only the host decides and spawns, so no enemy is ever spawned twice, and every player's machine is meant to show the host's enemies. Tested between the desktop app and a browser tab: in the best session both screens matched enemy for enemy. Some sessions did not, because of open engine issues that can make new enemies reach a second player late or not at all; the README's Known limits list them, and a built-in sync check (
SK.syncReport()and the on-screen readout) shows what each player actually sees. - 5 sample enemies (grunt, runner, brute, flyer, spitter) in two looks (toy, neon), with health, damage and death from SecondWind; rounds hook into MatchFlow.
- A catalog of everything, tagged by pattern and by the kind of game it suits:
SK.find({ kind = "pattern", genre = "towerDefense" }).
The gallery
Press Play: every spawn pattern, effect and curve stands side by side, labelled. Each difficulty curve has a live pen in front of its bar graph, where a spawner plays six waves on that curve and shows the wave, the enemy count and the health multiplier. At the far end an arena plays three waves from threeWaves.data inside a MatchFlow round, with MatchFlow's timer, wave counter ("wave 2 of 3") and victory screen on. The pool readout sits bottom-right.
Install it in your world
The kits it builds on go in first, spawnerKit last, every call with at=/source:
zeromind_install guid=7b85ce05-3903-4374-b654-2d4ffea295a5,31cf13b4-df7d-4888-85e2-7947a7301614,eed55f6d-afaf-4767-83c5-539ef91e0dc5 at=/source(Lifeline, MatchFlow, juiceKit)zeromind_install guid=5da0a53c-5953-4adc-80fb-f5afb02f6568 at=/source(SecondWind)zeromind_install guid=866b48e5-deed-4e7f-84a8-94ec29134c81 at=/source(spawnerKit)
Installed spawnerKit first and SecondWind is "not found"? Delete /source/deps, then run steps 1 and 2. Then local SK = require("spawnerKit.api"): the package README has a complete scene example (checked in a brand-new world, three waves of 6, 9 and 13 enemies), every setting and event, the catalog, and a Known limits section. 91 tests cover every public call: zero tests run spawnerKit.
Comments · 0
Open discussion, no rating attached. Ask questions, swap notes, follow threads.