尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证zombie-horde-survivors
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A browser-based 3D squad shooter: command a small squad of soldiers and a drone against waves of zombies, skeletons, aliens, hounds, brutes and giant worms. Play it hands-on (direct control of one soldier, in top-down, third-person or first-person view) or from above (RTS mode: select units and give orders).
| Layer | Technology |
|---|---|
| Language and build | TypeScript 6, Vite 8 |
| 3D rendering | Three.js 0.186 (WebGL today; a WebGPU + TSL migration is planned) |
| Simulation | pure TypeScript in src/sim (no Three.js, no DOM), fixed 60 Hz step, seeded RNG |
| Physics | the author's own solver in src/sim/physics (spheres, ragdolls, Hooke contacts on positions, spatial hash, sleeping, gravity wells); Rapier only in the Map 12 lab, for boxes, until the own solver has them |
| Data and validation | JSON in data/, validated with a strict zod schema |
| Models | GLB (glTF binary) with skeletal animation clips, Quaternius, KayKit, Kenney and Meshy AI |
| Audio | procedural sound effects (Web Audio) |
| Saved data | the browser's localStorage (best score, settings, your own maps); no backend, no accounts |
| Tests and checks | Vitest (51 sim tests), ESLint, Prettier, tsc, an asset-license check |
| Hosting | GitHub Pages, redeployed on every push to main |
Where the engine is heading (WebGPU, instanced animated crowds of 1,000+ units, a physics worker, ragdolls, Tauri + Steam): docs/PLAN-webgpu-engine.md. Nothing of that is built yet.
Play online: https://agustindiazcano.github.io/zombie-horde-survivors/ (desktop browser, keyboard and mouse).
npm install
npm run dev # dev server (http://localhost:5173)
npm run build # static files in dist/
npm test # unit tests
npm run lint && npm run format:check && npm run typecheck
Web build: the public page offers only Single Player → Waves → Map 1; everything else (Story, Development, Multiplayer, Editor, other maps) runs locally. The Pages workflow sets VITE_WEB_DEMO=true at build time (src/webDemo.ts).
Menus: Start → Single Player (Story: no missions yet; Waves: Map 1, the built-in arena), Multiplayer (coming soon, disabled), Development (every other map: test maps, labs, saved and imported ones) or Editor (desktop only: a paused map editor with a Play / Stop button and a right-hand panel; New / Open / Save / Export / Import work, its drawing tools are placeholders for now; saved maps appear in the Development list). Esc steps back one menu.
You start in direct control of one soldier, with the rest of the squad following you and shooting on their own. Press Y to switch to RTS mode, select units, send them anywhere on the map, then press Y again to take direct control of one of them.
Survive wave after wave. Enemies drop gold, XP and sometimes weapon crates. The game ends when every soldier is dead (the drone doesn't count).
Every key and mouse action (direct control, views, RTS mode, menus, the map editor and the mobile layout) is listed in docs/CONTROLS.md. The basics: W A S D move, the mouse aims, left click fires (the pistol is semi-automatic: one shot per click), R reloads, F strikes in melee, hold the right mouse button in third / first person to aim (and put the crosshair on a head for extra damage), Q throws a grenade, T changes view, Y switches between direct control and RTS mode, I opens the squad screen, B the shop and Esc pauses.
The round display in the bottom-right corner is a motion tracker, like the one from the film Aliens. A pulse ring spreads out from the middle of your squad and enemies only show up as bright blips when it crosses them, fading until the next ping. It is centred on your living units and only sees about 30 metres around them. The number at the bottom is the distance to the closest contact. Your units are hollow rings (filled for the one you control, a square for the drone). North is up.
Every unit has two hands, a vest slot and a 10-slot backpack. Some enemies drop a crate with weapons: pistol, rifle, heavy machine gun or the drone gun. Press E next to it to take items or stash your own; to equip weapons and move items between units press I (see below). The game pauses while a menu is open. Weapon and item stats are in data/items.json; the drop chance and the loot table are in data/game.json.
A soldier who reaches zero health does not die at once: it goes down (lies on the floor, "DOWN" in the health line, greyed icon) and bleeds out in 30 seconds. From the floor it can crawl slowly and shoot a one-handed weapon (a pistol) with poor aim; a rifle or machine gun will not fire. Enemies prefer soldiers on their feet, but every hit on a downed one shortens its time.
An ally on their feet who carries a medkit and stays within reach for 3 seconds uses it automatically and stands the soldier back up with the kit's health (small 25, medium 50, large 100); soldiers on follow walk over to help. Without a medkit the soldier dies when the timer ends. A soldier who died less than 30 seconds ago can be brought back by an ally with a defibrillator (4 seconds next to the body, one use, half health). The game is over when nobody is left on their feet. Medkits and the defibrillator come from crates and the shop; a medkit can also be used from the squad screen to heal yourself.
Accessories: scopes, sights, suppressors, compensators, magazines, a foregrip and a laser come from crates and the shop. In the squad screen (pause) the ⚙ on a weapon opens its workbench: each accessory takes one of the weapon's places (optic, barrel, magazine, grip, underbarrel), changes its damage, range, spread, recoil, reload, magazine or zoom, and the table shows the weapon bare, as it is and with the accessory under the pointer.
Enemies drop a gold coin and an XP orb. Any of your units (the drone too) collects them by walking over them; they vanish after 60 s. XP raises your level (shown at the top). Enemies show a health bar and light up when hit, and about half of them burst when killed, spraying blood and gibs.
Pausing (Esc, P or I) shows your bonuses and stats on the left and the whole squad on the right: each unit's health, level, experience and kills. Click a unit to open its window with a 3D view of the model and its inventory (up to four windows at once). Drag weapons between slots to equip them, stash them or hand them to another unit, even across windows; dropping on a taken slot swaps the two. Drag a held weapon to an empty backpack slot to unequip it (an unarmed unit can't shoot). A one-handed weapon fits either hand, a two-handed one only the right hand with the left hand free; stackable items such as medkits share a slot.
There are two kinds of experience. The global XP comes from the blue orbs and levels the squad up (perks). Each unit also has its own XP, which grows when that unit kills an enemy, plus a kill counter.
Press O (or use the Settings button on the title screen and the pause screen) for the settings window. Opened in the middle of a game it pauses, and gives the game back when you close it. Everything is saved in your browser.
| Section | Options |
|---|---|
| Graphics | Quality preset (Toaster / Low / Medium / High / Ultra), shadows on/off, shadow quality, resolution (25-200% of the screen's pixel density), surface depth (parallax), textures (melted / low / normal / ultra), water (flat / light / normal / full), sky clouds (simple puffs or volumetric in three detail levels), rain drops (streaks plus rings on the ground and the sea), filmic tone mapping, water reflection (sky only, or a mirror of the scene at two sizes), blood and gibs |
| Lighting | Normal, or dark with a flashlight per soldier (also L) |
| Other | FPS counter (also F3), sound volume |
Ultra is for a computer with a real graphics card: 4K shadows, the picture drawn at 1.5x and scaled down, the finest surface depth and 1K textures. If the game runs slowly, try the Low preset or lower the resolution. Toaster goes further: about a third of the pixels each way, drawn blocky, with no shadows, no surface depth and no gibs. Changing any graphics option by hand switches the preset to Custom.
Every level-up pauses the game and offers 3 random perks for the whole squad: pick one with a click or the 1 / 2 / 3 keys. Perks stack up to a limit: damage, fire rate, movement speed, max health, health regeneration and a bigger loot pickup radius.
Between waves (the countdown at the top) press B to open the shop and spend gold: heal the squad, buy an armor vest (+25 armor for every soldier), bring back a fallen soldier, buy a pistol or heavy machine gun for the selected unit, or buy permanent upgrades. Prices grow with each purchase. The game is paused while a menu is open. Perks and shop items are in data/game.json (perks, shop).
Crates can also hold an armor plate (+20 armor): taking it wears it at once instead of using a backpack slot. Armor soaks damage before health and caps at 50.
Variants are multipliers on the base zombie in data/game.json (enemies); each has its own model in data/characters.json.
| Enemy | From wave | Traits |
|---|---|---|
| Zombie | 1 | Baseline |
| Rotten marine | 1 | Brown, slow, fragile |
| Gory marine | 2 | Blood-soaked, fast, fragile |
| Hound (four legs) | 2 | Very fast, low health |
| Burgundy marine | 3 | Slow, huge health and damage |
| Giant worm | 4 | Very slow, very tanky, wide |
| Bleeder marine | 4 | Spurts blood, 2.5x health |
The infected marine, the acrobat (violet, hops), the runner (pale, fast) and the fast infected marine (green, quick steps) are variants of the same marine model too. The pale wanderer sleeps and strolls until you come close or it sees you, and wakes its neighbours; the orange climber walks over boxes.
Zombie speed and health also grow with each wave.
Mini boss: every 3rd wave one enemy comes back as a mini boss: a darker copy of one of the models, with glowing red eyes and a slower walk. Each boss is tougher and bigger than the last: health x50, x70, x100, x200, x500 (then x1.6 more each time), damage x2 up to x8, and a size from 2x up to 5x that grows with its health. They pay much better gold and XP. The bosses cycle zombie, skeleton, alien, brute, hound (boss in data/game.json).
src/sim — the pure simulation (squad, enemies, waves, loot). It imports no Three.js; ESLint and a test enforce that, so it can be unit-tested.src/sim/physics — the author's own physics solver for loose bodies and ragdolls (pure TypeScript, deterministic); the reference page and benchmark is tests/physics-lab-diaz-cano-vs-euler.html (npm run bench:physics-html). Every rule and formula: docs/PHYSICS.md; the author's techniques and the paper plan: docs/TECHNIQUES.md; the plan to plug it into the game: docs/PLAN-new-physics.md.src/render — Three.js rendering (arena, characters, effects, cameras).src — input, HUD, audio and the fixed-timestep game loop (the render interpolates between steps).data/maps/*.json — the built-in maps (Map 1); data/catalog.json — the editor's unit and asset lists.data/game.json — all gameplay numbers, validated with a strict schema. data/characters.json maps each unit to its model and animation clips.Copyright © 2026 Agustin Diaz Cano / Wylan Studios. All rights reserved. The game and the Wylan Engine are proprietary; see LICENSE. Third-party assets keep their own licenses (see Assets and Credits).
Every third-party asset is listed in assets.toml (name, author, source, license, path). Allowed licenses: CC0-1.0, CC-BY-3.0, CC-BY-4.0. npm run check:assets enforces this and CI runs it. Run npm run credits to regenerate the section below.