Angels95 is a multiplayer game world built on AngelTech — the engine that began life as the OmegaTech Engine. It is a persistent, server-authoritative realm where players explore partitioned worlds, collect power-ups, level up, and fight NPCs alongside other connected players.
Repository: github.com/TribeWarez/Angels-95
Built on raylib 5.5 with PS1-inspired retro
aesthetics, a custom OZONE world format, a
LightningScript entity-scripting language, a Win32-native level editor
(AngelEd), and a dedicated standalone server (AngelServ) with no raylib
dependency.
Current release: b101.
All shots captured in-engine via --shot mode (PS1-style, HUD-free, 1920x1051).
The four classic showcase worlds are below; the campaign worlds added in b101
follow.
A ruined hill-citadel — roofed courtyard, four corner towers, a gatehouse over the south gate, and watch balconies over a collar of sand.
Sun-baked desert oasis at midday — sandstone arches and columns under a noon sky.
Desert fortress — halls, corridors, underground tunnels and three outdoor areas under a daylight sky.
Small functional/test scene — five chambers, a great hall and a courtyard, one zone of every zone type, and a portal to Dust Ravine.
The campaign opener: a cliff-top arrival overlooking a forested gorge, a stepped descent, a river and bridge, a waterfall into a plunge pool, and Nali-style shrine ruins in the pine valley.
Three dusk-lit cascade terraces at 16, 8 and 0, two waterfalls into pools that sit under their falls, a ruined aqueduct you can walk over, stepping stones through the basin, and a lookout exit.
- Two outdoor campaign maps (b101) —
Sektor_01_SilentPines(forested gorge: cliff-top arrival, stepped descent, river and bridge, waterfall, shrine ruins) andKryoArchipel_Severny/ Dusk Falls (three dusk cascade terraces, ruined aqueduct, stepping stones), plusAethelgard_Ruinspromoted from the tech demo into a playable mission world. - Sky and water rendering (b101) — the sky samples its vertical gradient from world elevation instead of the quad texcoord, so the six skybox faces agree at every corner (corner steps fell from 33–40 colour levels to 1–5); deterministic generators produce the pool, waterfall-streak and foam textures, and every cascade gets an impact band, a faster churn wall and shore foam.
- Dedicated server — UDP multiplayer, HTTP map API and
/status, LAN discovery (UDP27100) plus internet discovery viaAngelMasterheartbeats; runs headless on Linux or Windows. - CSG worlds —
OZONEprimitive brush format (add/sub/intersect, box/cyl/sph/pyr/pln), per-brushtexScale*/texOffset*/texPathandname=zone labels. - LightningScript entities — data-driven
.ozlsdefinitions for items, pickups, weapons, NPCs, and scripted sky/zone triggers (on_enter,on_tick,on_collect, …) with actions likeheal,damage,msg,consume,playerstat,spawn_pickup,spawn_pawn. - Data-driven pawn system — NPC defs in
GameData/Pawn/PawnDefs/*.cfgwith an IDLE/PATROL/CHASE/RETURN/DEAD state machine. - Weapons & combat — ranged (projectiles, ammo/reload/magazine) and melee
(
reach,on_swing/on_hit) defined as.ozlsentities. - AngelEd level editor — native Win32 panels + raylib viewport, CSG brush ops, OZONE export, Lit/Unlit/Wire view modes.
- Packaged assets —
OzPack.exebundles models/scripts/textures/sounds/ worlds into.ozpak/.oztex/.ozsnd/.ozmux/.ozonepackages inSystem/Data/. - GameUI object-bar HUD (b82) —
SlotBarrenders a data-driven atlas + slots with click-to-select; shared between the in-world hotbar and the inventory overlay. - AngelPlayer behaviours (b78–b80) —
GameUi,InventoryBehaviour,WeaponBehaviour,PlayerControllermodules; sprint/crouch/stance replicated to the server. - Per-zone physics (b80) —
gravity,jump,terminal,water_*,ladder_speed,fly_multoverrides viaZoneEnvOverrides. - Unified audio (b57/b82) —
SoundManagerfacade for every sound/music call;DspReverbSchroeder reverb on the master mix. - Server worlds & saves (b59) — seeds NPCs/pickups from
World.ozone; V2 world saves with 60s autosave; HTTP/mapAPI; adminlist/say/kick- HTTP Bearer auth.
- HTTPS master uplink (b59/b70) — WinHTTP/Schannel (Windows) + curl
(POSIX), no vendored crypto; default master
https://angels95.tribewarez.com/master; LAN + Internet browser. - Editor undo/redo (b60–b81) — full-document history (Ctrl+Z/Y/Shift+Z), OZONE save/playtest, Script Manager, def-aligned Entity Properties, world texture import, viewport skybox.
- Vertex-keyframe animation (b74) —
.ozanimmorph clips, in-editor animation tool, Convert to Animated, vertex deform + undo/redo. - New OZONE entities (b74) —
Mesh.Static/Mesh.Skeletal,ParticleEmitter,PathNode,WindZoneend-to-end (OZONE → loader → runtime → editor → export) with wind-sway shader. - Weapons & view-models (b54+) — six shipped weapons; FBX→GLB pipeline; per-weapon first-person view-model with Idle/Fire/Reload clips + procedural recoil.
- Screenshot mode (b82) —
--shot,--shot-delay,--shot-res,--shot-cam,--shot-hudheadless captures. - Deep-link join (b60/b71) —
angels95://join/<ip>:<port>OS protocol handler (HKCU /.desktop) withJoinUrivalidation. - Pack-on-import (b82) — editor imports pack straight into
imported_models.ozpak/imported_textures.oztex(free-placement textures, not tileset).
| Topic | Page |
|---|---|
| Quick developer reference | AGENTS.md |
| Gameplay, controls, HUD, mechanics | Core Game |
| Architecture, source tree, key classes | Engine Overview |
| AngelEd editor panels and workflow | Editor Usage |
| LightningScript scripting reference | LightningScript |
| OZONE world format | World Format |
| Build instructions, prerequisites, CI | Building |
| Gap analysis and priorities | Engine Roadmap |
| Master server protocol, HTTPS uplink, browser | Master Server |
| Key | Action |
|---|---|
| WASD | Movement (first-person) |
| Mouse | Look |
| Left Click | Fire weapon (slot 1) |
| 1–8 | Select hotbar slot |
| Mouse Wheel / Arrow Keys | Cycle slots |
| E | Collect nearby pickup |
| Tab | Toggle inventory overlay |
| Escape | Pause menu (Resume / Settings / Main Menu / Quit) |
| F11 | Toggle fullscreen |
The dedicated server has no raylib dependency:
./AngelServ --port 27015 --http-port 8080 --dir GameData
| Flag | Default | Description |
|---|---|---|
--port |
27015 |
UDP game server port |
--http-port |
8080 |
HTTP map API (GET /map?list, GET /map?name=X) and /status |
--dir |
GameData |
Path to game data directory |
--server-name |
Angels95 Server |
Display name announced to masters |
--master |
– | Master UDP heartbeat target host[:port], repeatable |
--master-http |
– | Master HTTP(S) heartbeat URL, repeatable (TLS via WinHTTP/curl) |
--public-ip |
– | Public IP to announce when behind NAT |
--bind |
all | Interface to bind — IPv4, hostname, or 0.0.0.0 on a VPS |
--auth-token |
– | HTTP Bearer gate (env OZ_AUTH_TOKEN) |
--admin-token |
– | Enables COMMAND list/say/kick (env OZ_ADMIN_TOKEN) |
LAN discovery on UDP 27100. Worlds are scanned from GameData/Worlds/.
AngelMaster maintains the public server list for internet browsing:
./AngelMaster --port 27900 --http-port 27950
It accepts UDP heartbeats and POST /api/heartbeat, and serves
GET /api/servers?gamename=angels95 (JSON, CORS-enabled). Entries expire after
90 s. Point game servers at it with --master host:27900 and/or
--master-http http://host:27950; clients add it to [MasterServers] in
System/Angels95.ini and browse via Multiplayer → Join → Source: Internet.
See Wiki/Master-Server.md for the full protocol.
Tagging a build (b*) deploys both servers to a VPS over SSH + systemd, after
the Linux CI job (tests, worldchecks, GLIBC gate) passes. CI ships the two
binaries, the systemd units and a self-contained GameData/ tree; the host's
System/OzServer.ini and GameData/Saves/ are preserved, and the previous
binaries stay beside the new ones for a one-step rollback. Setup (secrets,
DEPLOY_PATH, sudoers, firewall, rollback) is documented in
Wiki/Building.md.
Launch the client from the repo root (it expects repo-relative asset paths) or
from a System/ release folder:
./Angels95 # show home screen / load default world
./Angels95 --world Dust_Ravine
./Angels95 --world-dir GameData/Worlds
Note:
System/Angels95.iniis read at runtime by the client (settings are grouped under[AngelTech.Window],[AngelTech.Render],[AngelTech.Audio],[AngelTech.Gameplay],[AngelTech.Input],[AngelTech.HUD]and[AngelTech.Debug]; bindings live in[Keybinds]and master URLs in[MasterServers]). Rebuilding does not overwrite it — the build scripts only write a template when the file is missing;build.cmd resetconfig/-ResetConfig(either PowerShell script) restores the defaults.System/OzServer.iniis a template written by the build scripts, andAngelServalso reads it at runtime ([Server]/[Auth]/[MasterServers]) — CLI flags and env (OZ_AUTH_TOKEN,OZ_ADMIN_TOKEN) override it.
raylib 5.5 must be installed system-wide (/usr/local/lib/libraylib.a —
build.sh installs it from source). Then:
make OTENGINE # client -> Angels95
make AngelServ # server, no raylib
make AngelMaster # master server, no raylib
make ozpack # asset packer
make -j$(nproc) # all four- w64devkit:
.\build-native-win.ps1(requiresC:\raylib\w64devkit). - MSYS2 / MINGW64:
.\build.ps1(auto-builds raylib 5.5 if missing).
Both assemble a playable System/ folder. build-data.ps1 drives OzPack
to create .oz* packages from GameData/.
| Target | Build cmd | Depends on |
|---|---|---|
Angels95 client |
make OTENGINE |
raylib 5.5 |
AngelServ server |
make AngelServ |
none (standalone sockets) |
AngelMaster master |
make AngelMaster |
none (standalone sockets + threads) |
AngelEd editor |
make -C AngelEd |
raylib + Win32 (Windows only) |
OzPack packer |
make ozpack |
none |
make test # builds + runs every suite, then FAILS if any suite failedStandalone tests (no framework) land in the repo root as executables. 24 suites:
parser, context, registry, entity_manager, pawn_system, ozone_parser, join_uri,
master, network, game_state, ozanim, ozls_writer, autoconvex, csg, brushmesh,
surface, gametype, editorbus, assetscope, events, game, gizmomath, keybinds,
menu. Single suites: make test_parser, etc.
make test also runs worldcheck over every shipped world (including
--asset-refs) and tools/check_editor_objects.sh, so a broken map or a
compiled-but-never-linked editor object fails the build rather than shipping.
Source/— client core, renderer, network, server, master server (Source/Master/), script, pawn, physics, package, audio, video (plmpeg).AngelEd/— Win32 level editor.GameData/— worlds, pawn defs, items, guns, textures, sounds.tests/— standalone test executables.Wiki/— full engine documentation (see Quick Links above).
- Two outdoor campaign maps (
Sektor_01_SilentPines,KryoArchipel_Severny/ Dusk Falls) andAethelgard_Ruinspromoted to a full mission world; sky sampled by world elevation (corner seams 33–40 levels → 1–5, cap band 50 → 1); generated pool / waterfall-streak / foam textures with impact foam at every cascade; terrace relief, ground decals and debris.
- b100 — Linux runner pinned to
ubuntu-24.04+ GLIBC ≤ 2.39 gate (b99 required GLIBC_2.43 and crashed every container). - b99 — b98 completed, including the Linux miniz feature-test fix.
- b98 — master listing fix, build-id versioning, TDM friendly fire, slot/bind fixes, hierarchy committed.
- b97 — responsive title menu, server browser, character select,
--world. - b96 — editor surface/transform fixes, brush sizing, MP heartbeat, build exit code.
- b95 — client fails fast when
AngelServ.exeis missing (start /Bhangs cmd). - b94 — real surface decals, item drop + hotbar reorder, overflow stash, sprint bob damp, gore, hierarchy scaffold.
- b93 — EngineTest's Egyptian desert path, plus three renderer fixes the path exposed.
- b92 — GameData restructured by role, packaged install completed, shot crash / 22 buried lights / 57 missing assets fixed.
- b91 — maintenance release.
- b90 — editor reaches its designed layer tree (Core/Subsystems/Resources/UI); brush-selection index-space fix (could delete the wrong brush).
- b89 — editor event bus + Core/UI/Subsystems split; exporter surface-flag data loss fixed.
- b88 — remote players visible, pickups reconcile, editor property panels consolidated.
- b87 —
GameTypeInforuleset: scoring, teams, win conditions, networking, scoreboard. - b86 — AutoConvex collision,
:lightdefs, CSG no-collision warning. - b85 —
.ozlssound stats, writable.ozlseditor. - b84 —
World_endless_snow,tools/worldcheck, editor pickup/equip refactor. - b83 —
World_endless_snowsnowbound industrial complex (radar sectors, refinery, power plant, rail yard).
- GameUI object-bar HUD (
SlotBar) — data-driven atlas +slot_rects, click-to-select, shared between in-world hotbar and inventory overlay; editor asset-scope tree + pack-on-import;SoundManager/ZoneManagerextraction;--shotscreenshot mode; new pawn/player assets.
- Editor full-document undo/redo (OZONE-snapshot history) + world texture import; tileset-aware
OzoneLoader::LoadString; CitadelRuins south corridor + Skaarj Predator model.
- AngelPlayer behaviour modules (
GameUi,InventoryBehaviour,WeaponBehaviour,PlayerController) +PlayerPhysics; per-zone physics overrides viaZoneEnvOverrides; native UI.
- Client lighting fixes (headlight wash, editor light export), pistol pickup crash, inverted controls; equipment wiring + skill respec + stance replication.
- Player model,
movement_speed+ sprint/crouch, ethereal skill tree, equipment wiring, multiplayer stance.
- Source tree reorganized (
World/,Pawn/AngelPlayer/,Renderer/Mesh/,Audio/); legacy WDL format dropped.
- Model Browser preview fixed; Import/Export mesh buttons restored.
- raylib 5.5 CI build fix; editor list de-dup, resizable panels, button icons.
oz::Meshtaxonomy (static/skeletal + vertex-keyframe.ozanimanimation); new OZONE entitiesParticleEmitter,PathNode,WindZoneend-to-end; in-editor animation authoring tool.
- Network NPC sync fix — server NPCs keyed by (world, npc, partition); no more unbounded pawn spawning after a map switch.
- Joining a server now loads its map (menu
GetSelectedWorld+ serveractive_worldJSON fixes); client relocates cwd to the install root.
- Join-IP textbox corruption fixed; packaged
.dds/image/audio decode from memory (LoadImageFromMemory/LoadWaveFromMemory).
- Live HTTPS master uplink — WinHTTP/Schannel (Windows) + curl (POSIX), no vendored crypto; default master
https://angels95.tribewarez.com/master; working Internet server browser.
- Per-binary release assets on GitHub (Linux + Windows); release notes document standalone vs zip-required binaries.
- Saved levelinfo skybox renders in client + editor; level skybox beats zone texture (explicit
set_skyboxstill overrides).
- Skybox actually loads (lazy
skyboxTex); per-world.ozlsskybox fallback; Sky toolbar toggle restored.
- Editor skybox selection priority fixed (levelinfo >
Models/Skybox.png).
- Linux server build fixed;
--bindon AngelServ/AngelMaster for VPS hosting; anti-spoofpubliciptrust;System/angels95-serv.serviceunits.
- Editor viewport skybox cube + Sky toolbar toggle.
- Skybox packaging (
.ddsfrom packages viaSystem/Cache); texture manager lists the.ddssky library.
- Zone Properties tabs visible again (Particles/Portals wired); Fog skybox Browse/Use Active Tex/Apply Skybox.
- OZONE texture persistence + editor load idempotence; AngelMaster daemon + InternetBrowser + master announce; Master wiki/test/CI.
- Editor OZONE save/playtest fixed (compiles before launch); Script Manager; def-aligned Entity Properties;
angels95://deep-link +JoinUri.
- LightningScript VM made real (flag vars, RHS arithmetic, brace conditions,
toggle_flag/jump); pawn FSM hooks live; server world seeding + V2 saves + admin/auth.
- Multiplayer wiring: scene/ammo sync, weapon grants, typed network NPCs; NPC death/respawn; pickup respawn; CSG op export; portal traversal; editor tool modes.
- Wired dead systems: reverb DSP on master mix, pawn aggro screams, looping title video, LAN browser + join/host ports, OzPackage zlib compression.
- b56 — 2026-09-24 — Tier 0 network security hardenings: world-list clamp, bounded reads, server-authoritative
PLAYER_HURT/PLAYER_KILL, ammo clamps, teleport rejection, deferred auth. - b55 — 2026-09-23 — LightningScript entity actions (
msg/heal/damage/playerstat/consume/spawn_pickup); Dust_Ravine content; AngelEd brush ops; CombatFX; CI overhaul. - b54 — 2026-08-21 — OZONE terrain render pipeline, sky zone isolation, script action boundaries.
- b53 — 2026-08-11 — New map Dust_Ravine (desert fortress); 2x wall texture tiling;
texScale*tokens. - b52 — 2026-08-11 — Fix:
EngineBillboardmodel-cache (extreme low FPS). - b51 — 2026-07-30 — Crash fixes, server security, multiplayer UI, editor fixes, refactoring, tests.
MIT — Copyright (c) 2026 TribeWarez.
See also CODE_OF_CONDUCT.md, CONTRIBUTING.md, and SECURITY.md.
| Repository | What it is |
|---|---|
| TribeWarez/Angels-95 | This repository — the game, the AngelTech engine, the AngelEd editor, AngelServ and AngelMaster. |
| TribeWarez/angels95-master-server | The hosted master server: heartbeat intake and the public server list behind angels95.tribewarez.com. The in-repo AngelMaster is the same protocol; the hosted deployment lives there. |
| paganswrath/OmegaTech | The engine Angels95 was originally built on top of. |
| paganswrath/OTEditor | The original OmegaTech level editor. |
- raylib — Ramon Santamaria
- raygui — Immediate-mode GUI
- pl_mpeg — MPEG1 video playback
- c99-raylib-video-player — Video integration
Angels95 began as a fork of the OmegaTech Engine, and would not exist without the original source released by paganswrath:
- OmegaTech — the engine this project was built on top of. The engine in this repository is now developed under the name AngelTech.
- OTEditor — the OmegaTech editor that AngelEd descends from.
If you are interested in where this codebase came from, start there. Thank you.


















