BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A retro 16-bit style fighting game in a single HTML file with no build step. Sprites and worlds are AI-generated pixel art embedded in the file; music and the announcer are synthesized in code, and hit sound effects are real CC0 samples with a synthesized fallback.
Open index.html in any modern browser (desktop or phone) and play.
Power scales damage and knockback, speed scales walk speed, tech shortens recovery. On top of that every fighter has
their own walk and back-walk speed, jump height and arc, dash speed, hurtbox width and weight (KITS in index.html).README 전문 보기 ↗A retro 16-bit style fighting game in a single HTML file with no build step. Sprites and worlds are AI-generated pixel art embedded in the file; music and the announcer are synthesized in code, and hit sound effects are real CC0 samples with a synthesized fallback.
Open index.html in any modern browser (desktop or phone) and play.
| Fighter | Archetype | POW | SPD | TEC | Fatality |
|---|---|---|---|---|---|
| Donald Tramp | Grappler | 8 | 4 | 5 | You're Fired! |
| Elon Mask | Air fighter | 6 | 7 | 6 | Next Stop: Mars |
| Xi Jinpong | Fortress | 7 | 5 | 8 | Censored |
| Dario Amodayo | Defensive counter | 5.6 | 6 | 9 | Aligned into Paperclips |
| Sam Altmode | All-rounder (easiest) | 5 | 8 | 7 | Model Deprecated |
| Jensen Hwang | Zoner | 6.3 | 5 | 7 | Out of Memory |
| Mark Zuckerbot | Rushdown / BJJ | 6 | 7 | 6 | Welcome to the Metaverse |
| Alexandr Wong | Trapper | 4.2 | 9 | 7 | Labeled: Loser |
| Wang Xing-Mech | Armored heavy | 8 | 3 | 5 | Unitree-mendous |
Power scales damage and knockback, speed scales walk speed, tech shortens recovery. On top of that every fighter has
their own walk and back-walk speed, jump height and arc, dash speed, hurtbox width and weight (KITS in index.html).
Everyone uses the same input slots (see Controls) and each fighter maps them to their own moves. The select screen and the pause menu show the current fighter's list.
Status effects show as labels over the fighter's head: PROMPT INJECTED (controls swapped, the CPU mashes at random), LOCKED (no specials or super), GUARD DOWN (next hit can't be blocked) and SLOW.
Pick a fighter and a short comic intro sets the scene (any key or tap: next panel, Esc / SKIP: skip it all): the world's most powerful people are summoned to a secret island to fight for control of the first AGI. Then the ladder:
The AI gets harder fight by fight. Each match is best of 3 rounds (60 second timer). When you win the deciding round your opponent stands dazed: FINISH HIM! Walk up close and press SPECIAL for a fatality.
Home stages: Tramp - Mar-a-Lago Ballroom, Elon - Starship Launch Pad, Xi - Great Hall of the People, Zuck - Meta Data-Center Rooftop, Dario - Silicon Valley HQ, Sam - Venice Beach, Jensen - Hyperscale Data Center (slippery), Wong - Shenzhen Night Market, Xing - Mars Colony One (low gravity), THE SINGULARITY - The Void (low gravity).
Story data is plain tables in index.html: TRASH / TRASH_VS (VS lines), BANTER (rival exchanges), INTRO,
ENDINGS (captions), HOME / RIVAL, AI_RAMP. Comic panels load from assets/story/<key>.webp (intro_1..3,
ending_<fighter>_1..3) and captions can be overridden by assets/story/captions.json; until those exist the game
draws coloured placeholder cards.
DAILY on the title screen: one challenge per UTC day, the same for everyone. The date (YYYY-MM-DD) seeds one RNG
that picks your fighter (or lets you pick any), three opponents in a row with their stages, and one modifier:
| Modifier | Effect |
|---|---|
| BIG HEAD MODE | Every head is 65% bigger (hitboxes are not) |
| LOW GRAVITY | Floatier jumps for everyone |
| TARIFF TAX | Every hit you land costs 1% of your score |
| GLASS CANNON | Everyone deals and takes double damage |
| SPECIALS ONLY | Normals do 25% damage |
| HYPER SPEED | The game runs at 1.25x |
| NO BLOCK | Nobody can block |
| RATE LIMITED | Specials share a 3 second cooldown |
| MIRROR MATCH | All three opponents are your own fighter (in another palette) |
| POWER SURGE | Power bars start full and fill twice as fast |
No continues: three wins clears it, the first loss ends the run. Score is the normal arcade scoring plus a time bonus
(100 points per second under 2 minutes for each fight you win). Retry as often as you like; your best score of the day
is kept. The results screen shows today's best, your streak of days played and a share line
("Round 1 Fight daily 10/04: 3/3 wins, 48,210 pts, TARIFF TAX") that is copied to the clipboard (COPY button too).
Saved scores go on the DAILY tab of the leaderboard (today's date). Modifiers live on the one fight they were given
to (Fight.mods), so nothing carries into arcade or training. For testing, __R1F.daily.setDate('2026-10-04') fixes the
date. Data: MODS and Daily in index.html.
The newest modifier, SUPER INTELLIGENCE MANDATE (the CPU plays at max level, your score x1.5), is appended at the end of
MODS. The day's modifier is picked with floor(rng * MODS.length), so adding a modifier changes which modifier future
(and some past) dates pick; keep new ones at the end of the list and expect that.
Some dates replace the seeded pick with a hand-made challenge: Halloween (10-31) NIGHT OF THE LIVING TECH BROS (Zuck as
a Metaverse ghost, Mask, then THE SINGULARITY on The Void / Meta rooftop / The Void, modifier haunted: ghostly opponents,
purple-orange tint, fog, bats and a jack-o'-lantern moon) and Christmas (12-25) SILENT NIGHT FIGHT (Jensen, Sam, Tramp on
State Dinner / Silicon Valley / Mar-a-Lago, modifier xmas: snow, Santa hats on every fighter, and GIFT WRAPPED: the first hit
you land each round drops a present worth +25% power). Clearing one unlocks an exclusive palette for the fighter you used
(PUMPKIN SPICE, CANDY CANE; palette slots 5 and 6, shown on the select screen with their unlock text). The intro screen and the
DAILY button get a 🎃 / 🎄 badge, the ticker leads with a seasonal headline that day only, and the share line carries the name.
To add a special day, add one entry to DAILY_SPECIALS in index.html, keyed 'MM-DD' (recurs every year) or a full
'YYYY-MM-DD' (that date only, wins over MM-DD):
'07-04': { key: 'fourth', name: 'NAME', badge: '🎆', col: '#7df9ff', intro: 'INTRO LINE.', unlock: 'PALETTE NAME',
news: 'TICKER HEADLINE.', fighter: -1 /* -1 = player picks */, opps: ['mask', 'sam', 'sing'], stages: ['launchpad', 'valley', 'void'],
mod: 'surge' /* any MODS or SPECIAL_MODS id */, oppPal: [0, 0, 0], vs: { mask: 'VS-screen line' } },
opps are fighter ids, stages are stage bg keys; oppPal and vs are optional. Every date not listed stays automatic and
keeps exactly the pick it had (the seeded RNG is untouched). A special's own modifier goes in SPECIAL_MODS (not MODS, so
the rotation does not shift) and is read as this.mods.<id> in Fight. A new reward palette needs a HOL key plus its
PALS entry and PAL_COND text. Tests: node tests/tdaily.js (picks, golden hash of normal dates, modifiers, rewards) and
node tests/tcos.js (holiday palettes).
A slim red BREAKING strip at the top of the title screen scrolls the headlines in the NEWS array in index.html
(newest first). To add a headline, put one line at the top of NEWS (and drop old ones); nothing else needs editing.
The strip ignores taps, never covers the menu and stands still (newest headline only) when the OS asks for reduced
motion. Tramp's taunt currently carries the same gag: it plays tramp_taunt2 and stamps THE ENEMY on the opponent
for 3 s (Tramp's hits on them deal +10% meanwhile). Test: node tests/tnews.js.
Every fighter (THE SINGULARITY too) has 4 palettes: the art as drawn plus three recolours with joke names (Tramp's
SPRAY TAN GOLD, Zuck's SWEET BABY RAY'S, Jensen's LEATHER 2.0...). They are made in code: each palette is a few rules
over hue / saturation / lightness ranges (PALS), so the clothes change and skin stays put, applied through a 32k-entry
colour lookup table to each fighter's atlas the first time it's needed (about 50-150 ms per atlas, done during the VS
screen), and cached.
Wins in arcade and the daily (not training, not the bonus stage) earn rank points: win +10, each perfect round +5, fatality +5, daily clear +20 (once per day), loss -3, never below 0.
| Rank | Points |
|---|---|
| ★ Intern | 0 |
| ★★ Founder | 100 |
| ★★★ Series A | 300 |
| ★★★★ Unicorn | 700 |
| ★★★★★ Decacorn | 1,500 |
| ★★★★★★ Trillionaire | 3,000 |
Your rank badge sits on the title and result screens, and ranking up shows a banner with a sting. PROFILE (title
button, or tap the badge) shows your rank and points to the next one, wins, losses, current and best win streak,
perfects, fatalities, daily streak and clears, palettes unlocked, and wins per fighter. Everything lives in one versioned
localStorage key, r1f_profile (v: 1), so Phase 6 can upload it to an account.
New to fighting games? Pick TRAINING from the title screen, choose your fighter, then press TUTORIAL. A banner walks you through 15 short lessons on a practice dummy: walking, jumping, crouching, the four normals, blocking high, low and overhead attacks, throws, your fighter's own specials (with their real names and motions), chains, cancels, the super, one lesson on your fighter's unique trick (Tramp's YOU'RE FIRED grab, Wong's prompt injection and Crocs taunt, Xi's Unflinching Stance, Dario's counter stance, Xing's IPO Pop, Elon's double jump and air dash, Zuck's guard pull, Jensen's jacket slam, Sam's Hype Ship stacking) and a final exam against the CPU.
LESSONS and UNIQ in index.html are plain data (id, title, text, textTouch, dummy, check(F, ev, st)). Lessons listen to game events (hit, block, special, ...) raised through Fight.onEvent(fighter, name, data); commented stubs mark where the dash, run, double jump, air special, air block, air throw and air tech lessons go.Pick TRAINING from the title screen, choose your fighter, press FREE PRACTICE, then choose a dummy and a stage. There's no round timer, no KOs (the dummy's HP refills a second after your last hit and never drops below 1), and your power bar is always full. Cycle the dummy's behavior (STAND / CROUCH / BLOCK / CROUCH BLOCK / JUMP / CPU) and toggle a hitbox overlay, and check the HUD for the frame data and frame advantage of your last move plus a combo/damage counter. Pause and choose EXIT TRAINING to return to the title screen.
Street Fighter style: four attack buttons, motion-input specials, and hold back to block.
| Action | Keyboard | Mobile |
|---|---|---|
| Move / jump / crouch | A D W S or arrows | Joystick |
| Light / heavy punch | U / I (or Z / X) | LP / HP |
| Light / heavy kick | J / K (or C / V) | LK / HK |
| Block | Hold back (away from opponent) or Space | Hold back on the joystick |
| Uppercut (normal) | Crouch + heavy punch | ↓ + HP |
| Sweep | Crouch + heavy kick | ↓ + HK |
| Special S1 | ↓ ↘ → + punch, or L | SP |
| Special S2 | → ↓ ↘ + punch, or ↓ + L | ↓ + SP |
| Special S3 | ↓ ↙ ← + kick, or ← + L | ← + SP |
| Special S4 | ↓ ↙ ← + punch, or → + L | → + SP |
| Command grab (Tramp, Wong) | ← ↙ ↓ ↘ → + punch, or → + L | → + SP |
| Super (full power bar) | ↓ ↘ → ↓ ↘ → + punch, or L | SP when the bar is full |
| Throw (up close) | → or ← + LP + LK | → or ← + LP + LK |
| Taunt | HP + HK together | HP + HK |
| Dash, then hold to run | Tap → → (press to press within ~0.3 s), or E | Flick the joystick sideways (or double-tap it), keep holding to run |
| Back dash (invulnerable start) | Tap ← ←, or ← + E | Flick the joystick back |
| Double jump / super jump | ↑ again in the air / ↓ then ↑ | Same on the joystick |
| Air special | The special's motion in the air | ← → etc. + SP in the air |
| Air block | Hold back in the air | Hold back in the air |
| Air throw | LP + LK next to an airborne opponent | LP + LK |
| Air tech (flip out of a knockdown) | Any attack button while knocked into the air | Any attack button |
| Jump cancel | ↑ right after a heavy normal hits | ↑ |
| Pause / sound / FPS | Esc / M / F | II button |
Crouch-block to stop low attacks (crouching light kick, sweep) and stand-block to stop jump-ins and overheads. Heavy versions of specials hit harder and travel further. Only one of each of your projectiles can be on screen at a time.
Movement and air combat: the forward dash can cancel into any normal, special or jump after 4 frames; hold forward at its end to run at about twice walk speed. The back dash is invulnerable for its first 8 frames, but a hit during its recovery is a counter hit. Everyone double jumps once per jump (Tramp and the mech only hop, Elon goes highest). Air specials: Elon Optimus Dive (↓ ↙ ← + P, a diagonal dive kick), Sam Hype Ship and Hurricane Kick, Jensen GPU Chips, Wong Tweet Cannon (a 3-shot burst), Zuck Wi-Fi's Down, Xi Great Firewall (drops a barrier), Dario Clawd Drop, the mech Robot Dog. Tramp has none: he answers jumpers with his short hop and anti-airs. Landing during an air special costs a few frames of recovery. Air block (hold back from 8 frames into a jump) stops everything except throws, unblockables and the crouching heavy punch anti-air, and takes a little more chip than a ground block. Light air normals put an airborne opponent in a short juggle stun, heavy ones knock down (the 4th air hit always knocks down), and a knocked-down fighter can press any button in mid-air to tech out (not off throws, not right after the hit).
Throws and grabs can't be blocked, but they only reach up close, miss anyone in the air and lose to an attack that's already hitting. Super armor (Xi's and the mech's heavy punch, Jensen's jacket slam) takes the damage of one hit without flinching. Counter stances (Dario's alligator, Wong's counter) cancel a hit and answer it.
Combos: when a light attack connects, you can chain straight into any other attack, and every ground hit can cancel into a special (for example crouch jab, then ↓ ↘ → + punch). Inputs typed during the hit-freeze still count.
Power bar: fills only when you land hits or take them (a little on blocks too), and carries over between rounds. A full bar unlocks your fighter's super.
Damage × 10, combo bonuses, round win bonus (health + time left), flawless +3,000, fatality +10,000. Everything is multiplied by the run multiplier: x1 for the first fight, +1 per fight won, back to x1 after a continue. The bonus stage pays per hit, plus 500 per second left and 5,000 for a PERFECT.
A CREDITS button on the title screen plays rolling arcade credits (hold or tap to speed up, Esc to exit); the list lives in the CREDITS array in index.html.
Live setup: the site on Vercel uses the Supabase project round1fight through /api/scores. The Vercel env holds
SUPABASE_URL and SUPABASE_KEY (never in the repo); the schema and the two SQL functions are in api/supabase.sql.
Without those env vars the function falls back to Neon (DATABASE_URL), and without either the game keeps scores locally.
index.html picks the best storage it can reach (scores are always also kept in this browser):
Online API (Vercel + Neon Postgres): when the page is served over http(s) and GET /api/scores?n=1 answers within 2.5 s, the board is labelled ONLINE LEADERBOARD and uses api/scores.js. See "Online leaderboard setup" below. file:// never uses it.
Claude artifact database: when the page runs as a claude.ai artifact with the db capability, scores go to a shared cloud collection.
Supabase: fill in SUPABASE.url and SUPABASE.key (publishable/anon key) at the top of the script to use a public table anywhere the file is hosted (GitHub Pages, Netlify, etc). Create the table with:
create table public.scores (
id bigint generated always as identity primary key,
name text not null check (char_length(name) between 1 and 10),
score integer not null check (score >= 0 and score < 10000000),
fighter text not null,
world smallint not null default 1,
champ boolean not null default false,
at bigint,
created_at timestamptz default now()
);
alter table public.scores enable row level security;
create policy "read scores" on public.scores for select using (true);
create policy "insert scores" on public.scores for insert with check (true);
The daily board uses a second table with the same columns plus the date (world holds the wins, 0-3):
create table public.daily_scores (like public.scores including all);
alter table public.daily_scores add column day text not null check (day ~ '^\d{4}-\d{2}-\d{2}$');
alter table public.daily_scores enable row level security;
create policy "read daily" on public.daily_scores for select using (true);
create policy "insert daily" on public.daily_scores for insert with check (true);
Local fallback: localStorage, so the board always works offline.
The board has two tabs: ALL TIME and DAILY (today's scores only; ← / → switch). Daily entries go to a daily collection
in the artifact database, the daily_scores table on Supabase, or r1f_daily locally.
The site stays a static index.html with no build step; api/scores.js is a Vercel Node function (CommonJS) using the @neondatabase/serverless HTTP driver. package.json only lists that dependency and vercel.json sets "framework": null so Vercel serves the static page.
DATABASE_URL (the integration sets it; POSTGRES_URL is accepted as a fallback). No credentials are in the repo.CREATE TABLE IF NOT EXISTS); api/schema.sql is the same schema if you prefer to run it by hand.One scores table holds both boards: day IS NULL is the all-time arcade board, day = YYYY-MM-DD (UTC) is that day's daily challenge. A small score_rate table stores salted hashes of client IPs for rate limiting.
API
GET /api/scores?n=25 all-time top scores, or GET /api/scores?day=YYYY-MM-DD&n=25 for one daily board (filtered in SQL). n defaults to 25 and is capped at 100. Responses carry Cache-Control: s-maxage=10.POST /api/scores with JSON {name, fighter, score, wins, champ, day?} (world is accepted as an alias of wins). Bad input gets 400 {ok:false,error}.Validation rules
name: 1-12 characters after stripping everything except letters, digits, space and . _ -.fighter: one of tramp mask xi dario sam jensen zuck wong xing sing (the on-screen short name, e.g. SINGULARITY, is accepted too).score: integer from 0 to 5,000,000. Rationale: an arcade run is at most 11 fights and the multiplier rises by 1 per win (1+2+...+11 = 66); one fight's base score (hits at damage x 10 plus combos, win bonus 1000 + HP x 10 + time x 25 + 3000 flawless, 10000 finisher) stays under about 30k, so honest runs top out near 2M; the cap leaves headroom.wins: integer 0-12. champ: boolean.day: optional YYYY-MM-DD, only today or yesterday (UTC); omitted or empty means the all-time board.x-forwarded-for address) per 10 minutes, then 429.Tests: node tests/tapi.js (handler with a mocked sql function) and NODE_PATH=<global node_modules> node tests/tapiui.js (browser check against a stubbed /api/scores).
The fighters, props and worlds are AI-generated 16-bit pixel art (Recraft v4.1), processed into game-ready sprites and embedded in index.html as WebP data URIs, so the game is still a single file.
LIVE in index.html animates each painted world in code: rippling sea and puddles, swaying palms, flickering neon, twinkling windows and lanterns, blinking server LEDs, food steam, drifting fog, gulls and a rocket beacon.ASSETS.fighters.sing exists. The new home stages borrow a tinted world (and its crowd) until their backdrops maralago, launchpad, greathall, metaroof exist in ASSETS.bg; The Void is procedural (data rain, a perspective grid, a watching eye) and keeps its data rain over the real art. The Cybertruck is a procedural angular truck that crumples with damage until props truck0-truck3 exist.phProp) until its art lands.The pipeline lives in assets/tools:
slice.py keys out the magenta, finds each pose (splitting touching poses by erosion), defringes edges and saves clean RGBA frames.atlas.py flips every frame to face right, scales each fighter to their in-game height, anchors frames at the feet, packs one atlas per fighter plus props and backgrounds, and writes assets.js.Source sheets are kept in assets/raw. To swap a fighter's art, drop in new sheets with the same names and rerun both scripts, then paste assets.js over the const ASSETS script block in index.html.
Hits, blocks, whiffs, jumps, landings and KOs play real CC0 sound samples from audio/sfx (see audio/CREDITS.md), synthesized WebAudio still covers music, the announcer and any browser where the samples fail to load.
Title, stage, victory and KO music are free-licensed tracks streamed from audio/music (see audio/CREDITS.md), with the synthesized WebAudio sequencer as a fallback if a track can't load.
Every fighter has a theme song (audio/music/theme_<id>.mp3): it previews on the character select screen, and in arcade mode the opponent's theme plays on the VS screen and during the fight (training and the attract demo keep the stage tracks).
Every fighter has six voice lines (intro, signature special, super, taunt, KO yell, win quote) and there is a deep announcer, all in audio/voice. Phase 3 adds the rival banter (banter_<player>_<rival>_<n>.mp3), THE SINGULARITY's ring-modulated, bit-crushed voice (sing_*.mp3, including sing_phase2) and the story narration (story_<panel>.mp3). They are stock synthetic voices from the open Kokoro TTS model (Apache-2.0), pitch-shifted and gritted up per character, with no real person's voice cloned (see audio/CREDITS.md). Only the two fighters in the current match plus the announcer are loaded; if the files can't load (for example from file://) the announcer falls back to the browser's speech synthesis and the fighters stay quiet.
The game renders on a 960×540 canvas with nearest-neighbour scaling, and the HUD sits on its own sharp overlay. Drawing is just image blits from preloaded atlases: a full update and render takes well under 1 ms in headless Chromium, far below the 16.7 ms budget for 60 fps. Press F in game to see the live FPS counter. The embedded art adds about 1.9 MB to index.html.
All characters are parodies with made-up names.
| Select screen: fighter / palette |
| ← → / ↑ ↓ |
| Tap a card / tap a swatch or the portrait |
| Training: cycle dummy behavior | T | MODE button |
| Training: reset positions | R | RESET button |
| Training: toggle hitbox overlay | H | HITBOX button |