Illustrated player manual · Hyperlinked PDF manual
Desktop launcher: run ./run-launcher.sh for shared server favourites, live player/map status, BSP/VRM preloading and submission, and a custom BGM playlist editor.
0.22v build notes · Published releases
New in 0.22v: a desktop launcher with VR-first play, direct joining, coloured names/clan tags, avatar selection, favourites, asset transfers, playlists and transactional GitHub updates. Includes the approved CC0 soundtrack, corrected HK slap, ST vehicle bots, expansion support and an illustrated player manual. Linux, Windows and experimental Quest clients remain release targets; dedicated server and bot worker are Linux-only.
The separate Community Maps and Original TF Arenas downloads are retired from 0.12v onward. Pressureworks and Vesper Abbey remain bundled for TF, and Assault retains its full-sized variants. User imports remain supported. See archive policy.
FPSloppa is a PC OpenXR and desktop online arena shooter with seven base Quake deathmatch arenas, dedicated objective/CC maps and a separate final expansion with 78 maps, Quake I BSP imports, textured 3D weapons and VRM avatars. Practice starts an offline match against three bots on the selected BSP map. The original Entryway map has been removed. See MAPS.md for arenas, custom imports and supported entities. Open project.godot in Godot 4.7.2 and press F5, or run ./run-vr.sh on Linux with an active OpenXR runtime. Use ./run-desktop.sh for mouse and keyboard. On another system, set GODOT_BIN or open the project in Godot.
See VR.md for Touch / Index controls, tracked weapons, VR menus, IK and validation limits. Click the right joystick to open the weapon wheel, tilt and release to equip, or click again to cancel. Custom VRM avatars have a 25 MB limit; missing BSP maps download automatically from the host. Normal multiplayer modes spawn with only dual pistols and 50 shared bullets; IG, IF and CC use their mode-specific weapons, and TF uses class loadouts. Blood, gibs, pain reactions and spatial sound effects are included.
The separate portable avatar converter prepares FBX/glTF source avatars as VRM on Windows and Linux, with manual humanoid mapping and optional texture resizing. It can extract source models from Unity packages; assembled Unity prefabs and VRChat-specific shaders/components require preparation in their source editor. Download Linux/Windows releases or build from its independent repository.
The additional UT Avatar Converter turns original UT99 model and skin packages into experimental VRM avatars on Linux and Windows. It includes archive extraction, material selection, editable rig landmarks and a pose preview, with tested Female Soldier, Female Commando and Rumiko presets. Download Linux/Windows releases or build from its independent repository. The separate experimental MDL Avatar Converter now supports Quake MDL/PAK input, palette and frame/skin selection, editable rigging and VRM export. GoldSrc MDL is unsupported.
ST is included from 0.20v with Stonehenge, Raindance and Katabatic; see Tribes mode and controls. Put custom OGG music in the empty bgm/ folder; see music selection.
PC binaries: use Play-VR or Play-Desktop in the Linux/Windows ZIP. The optional Linux server ZIP runs without installing Godot. See SERVER.md for server.cfg, VOICE.md for voice chat, and STANDALONE.md for Quest APK installation and device-testing limitations. Smooth turning now defaults on.
For VR callsign editing, saved-name configuration and the system-username fallback, see VR callsign setup. Use matching client and server builds to receive all fixes. The protocol is fpsloppa-45-de-utility.
Maps and avatars now live beside the executable in maps/ and vrm/, outside the Godot package. Current standalone APKs include the base maps and models and install them automatically on first launch. See external asset setup. Left-handed controls, seated mode, Instagib, Instafreeze, Freeze Tag and Chainsaw Circus are available.
- One player chooses an arena, callsign, UDP port (default 7777), frag limit and time limit, then selects Host Match.
- Other players enter that host's IP address or hostname and the same port, then select Join Match. Use
127.0.0.1only for clients on the host's own computer; use the host's LAN address for other computers on the same network. - For Internet play, allow the selected UDP port through the host firewall and forward it on the router to the hosting computer, or use a publicly reachable dedicated server. Join using the host's public address.
All participants need the same project version. In-game hosting supports eight players total, including the playing host. Dedicated servers default to eight and allow up to 32 players (above 16 is unsupported; performance, gameplay and maps are not balanced for these counts) through sv_maxclients in server.cfg. Joining an ongoing match is supported. Browse Servers… supports live dedicated-server status, favorites, filtering, joining and spectating through an optional operator-hosted master directory. See server browser setup. There is no account service, automatic matchmaking, NAT relay, or host migration. Dedicated servers support configured map rotation. A remote Linux server passed live client tests across all eleven modes and a sixteen-player capacity hold. Some peers experienced elevated latency; see the remote test report.
PRACTICE VS BOTS starts an offline match on the selected BSP map with three AI opponents. Bots use movement shortcuts, useful supplies, cover, team roles, TF abilities, and Assault objectives; see BOTS.md. The selected gamemode determines weapons and pickups.
| Control | Action |
|---|---|
| WASD / mouse | Move / aim |
| Left mouse | Fire primary weapon; hold for repeated fire |
| Right mouse | Fire the second pistol while dual pistols are selected |
| Shift | Walk instead of running |
| 1 | Fist / chainsaw |
| 2 | Dual pistols |
| 3 | Shotgun / super shotgun |
| 4, 5, 6, 7 | Chaingun, rocket launcher, plasma rifle, BFG |
| Mouse wheel | Cycle owned weapons |
| E | Use a nearby door |
| Space | Jump / swim on Quake maps |
| F | Weapon whip (no ammo required) |
| Tab | Scoreboard |
| Enter | Chat; Enter again sends, Esc cancels |
| Esc | Match menu / resume |
| Fire or Space while dead | Respawn after the two-second delay |
Movement uses Quake-style ground friction and air strafing. Release and press jump for each bunny hop; release movement in midair to keep momentum, or steer with directional input. Run/walk speeds and TF class modifiers are retained, including proportional VR thumbstick control. All maps allow jumping and swimming. Stair stepping is automatic. Movement provenance and tuning. Platforms cycle automatically.
The default Doom loadout has no magazines or manual reloads. Its shotguns have an automatic firing/reload cycle. First pistol/chaingun shots are accurate; sustained fire spreads. Pistols use 4.2° horizontal spread (down from 5.6°). Selecting slot 2 equips a pair, with independent firing cycles and one shared bullet pool. Pellet damage is randomized. Free vertical mouse aim replaces the original game's vertical auto-aim. The optional CS 1.6 loadout has magazines and physical VR reloads.
| Weapon | Behavior | Approximate firing interval / ammo |
|---|---|---|
| Fist | 2–20 melee damage | 0.57 s, no ammo |
| Chainsaw | Rapid 2–20 melee damage | 0.114 s, no ammo |
| Dual pistols | 6/12/18 hitscan damage per shot | 0.40 s per pistol, 1 shared bullet per shot |
| Shotgun | 7 pellets, mostly horizontal spread | 1.00 s, 1 shell |
| Super shotgun | 20 pellets, wider horizontal/vertical spread | 1.63 s, 2 shells |
| Chaingun | Rapid 5/10/15 hitscan damage | 0.114 s, 1 bullet |
| Rocket launcher | Traveling rocket, 20–160 direct damage plus up to 128 splash; self-damage; walls block splash | 0.57 s, 1 rocket |
| Plasma rifle | Rapid traveling bolts, 5–40 damage | 0.086 s, 1 cell |
| BFG 9000 | 0.86 s charge, large projectile, then 40 forward tracer rays from the shooter's location on impact | 1.72 s, 40 cells |
These are approximations, not an emulation of Doom's 35 Hz state machine or random table. Weapon models use the CC0 Oldschool AFPS Weapons pack by Drummyfish, converted in Blender, with a BFG adaptation and the original textured shotgun-based super-shotgun variant. The fist derives from the bundled CC0 VRoid model. Muzzle flashes, shot tracers, recoil, hit feedback and synthesized sounds are authored for this project. Green armor absorbs one third of incoming damage; blue armor absorbs one half, limited by remaining armor.
- Default: 20 frags / 10 minutes, followed by a ten-second intermission and automatic restart.
- Players spawn with 100 health, only dual pistols and 50 shared bullets. Inventory resets on death. Spawn points favor distance from living opponents.
- Spawn protection lasts 1.5 seconds and is cancelled by firing.
- Suicides subtract one frag. A death adds to the victim's death count. Fire/Space respawns after two seconds; automatic respawn follows three seconds later.
- Map weapons respawn after 5 seconds, or 30 seconds in Team Deathmatch, including the BFG/lightning gun/Redeemer slot. Ammunition, health and armor respawn after 30 seconds. Pickup claims are resolved by the server once. See weapon timing audit.
- Tab shows names, frags, deaths and ping. The feed shows kills, chat, joins and departures.
A separate Linux executable is available with Q3-style configuration. See SERVER.md.
./run-desktop.sh --headless -- --server --map qsrc_dm1 --port 7777 --frags 20 --minutes 10Or use Godot directly:
godot --headless --xr-mode off --path /path/to/Godot -- --server --port 7777
godot --path /path/to/Godot -- --connect 127.0.0.1 --port 7777The server simulates movement and combat. Clients send movement/aim/fire intent at 30 Hz and receive state at 20 Hz. Clients predict their own movement and weapon feedback, then correct to server positions; other marines interpolate. Hitscan rewinding is capped at 200 ms using transport-measured ping. Health, ammo, inventory, damage, pickups, frags and round state stay server-owned. This is a small playable prototype, not a hardened competitive anti-cheat system; prediction is deliberately simple.
deathmatch/tests/rules.gd: 13 checks for weapon rules, armor, weapon cycling and invalid input rejection.
deathmatch/tests/combat.gd: 13 checks for spawn protection, hitscan, melee, chaingun cadence, plasma, projectile removal, rocket damage/self-damage, wall occlusion, BFG charge/impact and contested pickups.
deathmatch/tests/run_network_tests.py: launches one dedicated server and two independent ENet clients, checks replicated combat/inventory, scoring, respawns, pickup respawn, chat, round restart, disconnect/rejoin, and late-join projectile/door state. Logs are written to test-results/.
godot --headless --xr-mode off --path . --script res://deathmatch/tests/rules.gd
godot --headless --xr-mode off --path . --script res://deathmatch/tests/combat.gd
python3 deathmatch/tests/run_network_tests.py /path/to/godotCore files: arena.gd (networking/combat/match), fighter.gd (movement and marine), weapons.gd (tuning), art.gd (weapon asset assembly and sound), interface.gd (menus/HUD) and bots.gd (offline navigation and combat input). The eight bundled BSP arenas and user-imported BSPs are playable.
Behavior references: id Software's original weapon routines. Networking references: Godot high-level multiplayer and ENet peer statistics. This implementation is independently written. Original Doom music, sound samples, sprites and source code are not bundled. See asset credits.
Optional bHaptics vest feedback includes the FPSloppa Vest v1 weapon/hit/hazard/healing profile. Native Bluetooth is preferred on Linux/Windows x86_64 (Linux X40 tested; Windows build unvalidated); OSC remains available. Enable it in Settings → Haptics. This revision uses protocol fpsloppa-33-haptic-damage-context; update clients and servers together.
Optional body tracking, recorded spatial audio and speech-driven VRM mouths are included in protocol fpsloppa-29-acknowledged-movement. Update the server and every client together.
Eye-tracked VRM gaze and measured blinking are automatic on supported OpenXR runtimes/models; see EYES.md. Graphics shows Fovea Size (Off/Small/Medium/Large) when eye tracking is available, or Static Foveation (Off/Low/Medium/High) otherwise. See foveation and quad-view support and PERFORMANCE.md for rendering changes, profiling commands and hardware-validation limits. The generated launcher artwork is documented in ICON.md.
Voice starts in push-to-talk mode (V / VR off-hand grip). The voice controls are selectable inside the VR menu; Android requests microphone and vendor tracking access with a retry option. Tracked VR players can look down at their own head-hidden avatar body for an IK reference. See VOICE.md and TRACKING.md.
Every held weapon can perform a short-range weapon whip: press F on desktop or swing the weapon in VR. It deals 10 damage before armor, with 0.8 seconds between attacks and at most one victim per swing. A deliberate VR swing is required; resting the weapon against a player does no damage. The server checks range, walls, cooldown and normal spawn protection. VR swings require slowing the weapon before swinging again.
Select Join as spectator before JOIN MATCH to watch with a free-flying camera. Desktop uses WASD and Space/Ctrl for up/down; VR uses the left stick to move, right stick left/right to turn and right stick up/down to fly. Spectators have no visible avatar, collision, pickups, weapons or damage, appear separately on the scoreboard, and keep their role through map downloads and rotation. They occupy a connection slot (8 on menu-hosted servers, up to 32 in dedicated server configuration; above 16 is unsupported). CLI joining also accepts --spectate alongside --connect.
The final scoreboard opens automatically when a match ends, including its VR surface, and closes for the next round. SETTINGS… is available before joining and during matches. Audio controls include master, effects, music, voice playback, output device and access to microphone/voice controls. Graphics controls include render resolution (50–125%), MSAA and shadows; desktop also offers fullscreen/windowed mode and FOV. Changes apply immediately and persist alongside your other client preferences. VR FOV and refresh timing remain headset/runtime controlled.
The title and lobby retain Dead Air and Please Hold. Gameplay uses your OGG music from the empty bgm/ folder: map-specific playlists override mode-specific playlists, then unprefixed tracks. Matching tracks loop in filename order; named mode/map folders and M3U playlists are supported. Music retains its saved volume control and context crossfades. See custom music instructions and built-in music credits. New supply models distinguish bullets, shells, rockets, cells, medkits and armour with cached single-surface meshes.
Dedicated servers support DM, TDM, CTF and KOTH, with configurable limits, team switching and majority votes for balance, available maps and allowed game types. In-game hosting remains DM-only with eight slots. See GAMEMODES.md and server.cfg.
Seven Quake source ports form the base DM/IG/FT/TDM rotation. CC has four dedicated LibreQuake remodels. Menus use an original iron/brass theme with large VR controls; CTF flags use cloth banners with distinct team emblems. Steam Audio provides headphone HRTF spatialisation for effects on Linux, Windows and Android; TwoVoIP supplies native Opus positional voice. Sound settings include a standard spatial-audio fallback. Dedicated servers may advertise an external Mumble client handoff; built-in voice remains the default.
This build also includes the previously developed dual pistols, controller finger gestures/tracker fixes, spectator mode, end-of-match scoreboard, audio/graphics settings, new pickup models, restored CC0 super shotgun and four original tracker soundtracks.
Rocket splash now supports rocket jumping with reduced self damage and bounded, replicated knockback. Megahealth and mega armour have distinct colours, labels and moving halos; pain, respawn, powerful-item spawn and pickup cues are improved. Settings → Graphics adjusts VR HUD size and vertical position within saved limits.
Controls, two-handed aiming, physical jumps, demo/video tools and the optional voting lobby: session features.
Hit registration, latency simulation and test limitations: network testing.
The main menu fits the VR canvas without scrolling, with Quit fixed at the bottom. Settings → Controls contains Bindings, VR Controls and Swap Gun Hand. Settings → Tracking contains recentering, body calibration, SlimeVR OSC and body tracking. Demo controls use two compact columns. Match setup lives behind Host Match, offering DM, TDM, CTF, KOTH, Instagib, Instafreeze, Freeze Tag, Chainsaw Circus, Team Fortress and Assault (up to eight players). Lobby voting is on the wall, with a camera-based tracking mirror alongside it. VR dropdowns support joystick scrolling and trigger-held dragging, including the TF class selector. Closing the menu closes every open dropdown. Flag captures produce a short fanfare and a team/player banner.
Round-end voting presents a shared 3×3 grid of nine random, valid map/mode/loadout combinations. Click a card to cast or change your vote. The same choices and votes carry into the waiting-room wall when the lobby is enabled (controller pointer in VR; aim and click on desktop). The highest tally wins at the end of the countdown; ties and no-vote results use the first tied card in grid order. If the server permits fewer than nine combinations, unused slots are disabled. Normal in-match proposals still use mode/map/loadout selectors and majority Yes/No votes. Active in-game votes display their target, counts and remaining time on desktop and VR HUDs. Matching clients and server are required (fpsloppa-37-match-ballot).
Assault (AS) includes the HiSlop train map and the new Frigate harbor
adaptation in the source build. Frigate has a destructible aft compressor,
underwater approach and locked gun-control bridge. Enable Assault through
sv_gametype / sv_gametypes and as_maplist, just like TF. See AS.md.
Experimental Doom / Quake I / UT99 weapon selection and controls: Weapon variants. Doom remains the default.
The optional CS 1.6 arena loadout adds twelve weapons with magazines, physical VR pouch reloads and manual actions, desktop timed reloads, burst/suppressor modes, aligned sights and the existing VR sniper scope. Select it in Host/Practice or use sv_weapon_rules "cs16".
Dedicated servers can opt into experimental arena jetpacks with sv_jetpacks "1" for DM/TDM/CTF/IG/IF/FT. Collect the pack, then double-tap jump; pickup counts are capped and respawn with megahealth.
DE — Bomb Defusal adds CS economy and single-life rounds on five classic BSP29 map reconstructions, preparation-time purchases through the weapon wheel, chest-carried bombs, surface planting and tactile keypad/cutter defusal. An optional CS virtual stock is in VR Controls.
