FSTR
I script Roblox games: movement, systems, UI and full game loops. Five projects, client work, and one AI.
- 01Tag!巻頭カラー
- 02Draw & Guess Anime!新連載
- 03MM2, server rewritten特別編
- 04Splitgate demo読切
- 05Break Piñatas for Brainrotsギャグ
- 06Client work特集
- +Eris, AI VTuberおまけ
TAG!
It's basically tag, but 1v1.
High-speed movement paired with abilities you use to win: speed boosts, invincibility, freeze rays, teleportation and more, for short, intense matches. The movement is Source-style. Bhop, air strafing, surf, ladders, edgebugs: the golden era of CS, inside Roblox.
- Bhop
- Air strafe
- Surf
- Ladders
- Edgebugs
- Abilities
- Ranked 1v1
function movemath.airaccelerate(velocity, wishdir, wishspeed, accel, dt, aircap) local capped = wishspeed if capped > aircap then capped = aircap end local currentspeed = velocity:Dot(wishdir) local addspeed = capped - currentspeed if addspeed <= 0 then return velocity end local accelspeed = accel * wishspeed * dt if accelspeed > addspeed then accelspeed = addspeed end return velocity + wishdir * accelspeed end function movemath.clipvelocity(velocity, normal, overbounce) local backoff = velocity:Dot(normal) * overbounce return velocity - normal * backoff end
The game isn't out yet. The public demo is the movement alone, in a practice arena. The movement controller is 3,254 lines. Click any panel to watch its clip in full.
次回02 Draw & Guess Anime!Draw &
Guess
Anime!
お絵描き頭脳戦〜 the artists want to be guessed 〜
A live Roblox party game built around 1v1 drawing duels. Each player gets an anime character to draw before the timer runs out, then guesses who the opponent drew. 100+ characters, instant matches, and a full progression loop with chairs, daily rewards and leaderboards.
- 1v1 duels
- 100+ characters
- Bots that draw
- Progression
- Leaderboards
Your turn.
Draw the word. Fifteen seconds from your first stroke. A small neural net I trained guesses while you draw. It runs in your browser; nothing is sent anywhere.
- This page's guesser is a small neural net trained for this site.
- In the game the canvas runs on EditableImage and strokes replicate as packed buffers.
- An effort check stops players winning by scribbling.
function StrokeCodec.encode(ops: { Op }): buffer
local total = 0
for _, op in ops do
total += opSize(op)
end
local b = buffer.create(total)
local o = 0
for _, op in ops do
buffer.writeu8(b, o, op.kind)
o += 1
if op.kind == Kind.Brush or op.kind == Kind.Eraser then
buffer.writeu8(b, o, op.size)
o += 1
if op.kind == Kind.Brush then
o = writeColor(b, o, op.color)
end
local count = #op.points // 2
buffer.writeu16(b, o, count)
o += 2
for i = 1, count * 2 do
buffer.writeu16(b, o, op.points[i])
o += 2
end
elseif op.kind == Kind.Fill then
o = writeColor(b, o, op.color)
buffer.writeu16(b, o, op.points[1])
buffer.writeu16(b, o + 2, op.points[2])
o += 4
end
end
return b
end
79 modules, about 16,500 lines. Server services, client controllers, shared rules, and tests for the rules.
次回03 MM2, server rewritten再構築、
サーバーサイド
Murder Mystery 2. Entire server side, rewritten from scratch.
You can (not) decompile
I was asked to re-create the whole server side from a decompiled copy of MM2 that only had its client code exposed. I had to wire all of the UI, the game loop and everything in between back to a server that I wrote from nothing. Here is the result.
- Decompiled LocalScripts
- Shop, inventory, trading, emotes UI
- Item database
Two clients, one server. Roles, kills, coins and the victory screen all come from the rewrite.
Splitgatedemo
A recreation of Splitgate's portal system. Fully see-through portals, seamless traversal that preserves your momentum, and guns that shoot through them.
Weapons, map and viewmodels are placeholders. The portal system is the part that matters.
Look through one, see out of the other. Walk in at speed, leave at speed.
function portalshared.crossing(portal, p0, p1, offset) local plane = portalshared.planeof(portal, offset) local l0 = plane:PointToObjectSpace(p0) local l1 = plane:PointToObjectSpace(p1) if l0.Z >= 0 or l1.Z < 0 then return nil end local span = l0.Z - l1.Z if math.abs(span) < 1e-6 then return nil end local u = l0.Z / span local hit = l0:Lerp(l1, u) if not portalshared.insideoval(portal, hit) then return nil end return u, plane * hit end function portalshared.mapcframe(entry, exit, cf) return exit:GetPivot() * flip * entry:GetPivot():Inverse() * cf end function portalshared.mapvector(entry, exit, v) return (exit:GetPivot() * flip):VectorToWorldSpace(entry:GetPivot():VectorToObjectSpace(v)) end
Break Piñatas
for Brainrots
A full brainrot simulator loop, built solo. Weather and brainrot mutations, a daily wheel, rebirths and a fully working UI.
local function rollWeatherId() local roll = math.random() * 100 local cumulative = 0 for _, weather in ipairs(Config.Weathers) do cumulative += weather.rollWeight if roll <= cumulative then return weather.id end end return nil end
- Server-authoritative. Every remote was audited for exploits before release.
- Weather service 1,142 lines. Piñata server 1,447. Brainrot display 1,661.
Client
Work
Paid commissions for other people's games. This is some of my client work: the clips are the builds I handed over, and the reviews are real messages, screenshotted as sent.
- Group games, a published studio title and a full-game commission.
- Developer role at Skorpy Studios, a 50,000+ member community.
Two commissions for a group hangout game. The first: grab-and-throw ragdolls, PvP duels, a cinematic camera with black bars, and admin commands tied to group ranks. ShaX came back for a second round: sprint and slide, carrying, vampire bites, a leaderboard, and an existing gun system wired into the new movement.
A four-player TV-crew game, commissioned as twelve priced tasks. Task one, delivered first as a demo: the title screen, settings, and a party lobby where every player is a TV channel, with crew codes, invites and role select.
- Title & settings
- Party lobby
- Crew codes
- Role select
Developer on Papers, Please!, a passport-inspection game published by Skorpy Studios, a community of 50,000+ members where I hold the developer role. Together with one other developer I scripted the whole game: the gameplay loop, round systems, progression, shops and the launch. Everything except the UI design, maps and models.
A wave-survival shooter. The job: swap the template monsters for Buddy, the studio's own character, and clean up the code underneath: session-locked saves, a gun bug that drained ammo twice, and hardcoded admin IDs removed. Delivered in a day and a half, paid in full.
- Monster swap
- Session-locked saves
- Bug fixes
- 1.5 days
Eris
AI VTuber
Heavily inspired by Neuro-sama. Not a chatbot: she has memory, sees the screen, talks, and plays osu! at a high level.
- long-term memory
- sees the screen
- real-time lip sync
- osu! automation
She plays Roblox too.
RoBeats is a rhythm game on Roblox.
This is Eris playing it.
つづく
To be continued.
More work is on the way. If you need movement, systems, UI or a whole game loop scripted, reach me by email or Discord.
Back to the cover奥付 Footage, code and avatar are my own. Built with three.js. The drawing guesser was trained on Google's Quick, Draw! dataset (CC BY 4.0).