En taktisk FPS i Counter-Strike-traditionen — i browseren. Hele spillets kerne er skrevet én gang i F# og kører både som .NET på serveren og som JavaScript i klienten. Rammer du på din skærm, rammer du på serveren.
de_forbunker med et par AK-bursts (bemærk spray-mønsteret på ammo-tælleren). Grafikken er bevidst blokeret-ud i denne fase — al kompleksiteten ligger i simulation og netværk.Kompetitive FPS-spillere opdager alt: inkonsistente hitboxes, inputlag, movement der føles forkert. Prototypen her går efter det sværeste først — fair hit-detection og source-style movement på webteknologi — og lader grafik og indhold vente. Derfor er den mindst færdig-polerede af de tre prototyper, men teknisk den mest ambitiøse.
Movement (friction, air-strafe, bunnyhop-cap), våbendata med AK-spraymønster og hitbox-poser ligger i ét delt
F#-modul. Serveren kompilerer det til .NET 8; klienten kompilerer den samme kode til JavaScript med Fable.
Funktionen Pose.compute producerer både det, klienten tegner, og de hitboxes, serveren skyder mod —
"what you see is what you hit" er en egenskab ved arkitekturen, ikke noget der skal vedligeholdes.
Serveren kører en dedikeret 64-ticks tråd og gemmer 32 ticks spillerhistorik i en ringbuffer. Hvert input
fortæller, hvilket tick skytten så på sin skærm (lerpTick); ved skud spoler serveren alle modstandere
tilbage til det øjeblik og laver hit-detection dér. Du sigter på det, du ser — ikke på hvor modstanderen "rigtigt"
er 80 ms senere. Al mutation sker på tick-tråden; netværkstråde afleverer kun inputs i en kø.
Ingen JSON på den varme sti: inputs er 20 bytes (sekvensnummer, knapper som bitfelt, yaw/pitch som float32), snapshots 48 bytes pr. spiller med per-modtager input-kvittering. Klienten forudsiger sin egen bevægelse og afstemmer mod serverens facit med en aftagende fejl-offset (~90 ms), mens andre spillere interpoleres to ticks bagud. Selv ping-estimatet er gratis — det falder ud af lerpTick-feltet.
Renderingen er Babylon.js med WebGPU og automatisk WebGL2-fallback; lyden er procedural Web Audio med HRTF-panning, så fodtrin og skud kan retningsbestemmes med hovedtelefoner — uden en eneste lydfil. Og så er der detaljerne, man kun lærer ved at bygge det: Chromium kan sende ét kæmpe musedelta lige efter pointer lock (klienten skal skippe og clampe), og spawn-retningen skal med i selve spawn-eventen, fordi snapshottet allerede er overskrevet af spillerens gamle kamera-retning.
Live som team deathmatch med AK-47, USP og kniv på én bane. Roadmap: flere våben, runde-økonomi med buy-fase, vægpenetration, dødskamera og rigtige karaktermodeller. Prototypen har allerede bevist det svære: at competitive-grade netcode kan leveres i en browser-tab.
Krævende realtidssystemer, funktionel arkitektur eller netværkskode med lave latenskrav.
Skriv til mig