Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗騎手目線で JRA の平地G1全24戦を駆け抜けるブラウザゲーム。
ファンファーレが鳴り、ゲートが開いたら、あなたは相棒の背中の上。 進路どり・追う/抑える(体重移動)・ムチを駆使して頂点を目指します。
JRA の平地G1全24戦を、G1のある週ごとに1戦ずつ戦います(日付は2025年の開催日程)。
| # | 日付 | レース | コース |
|---|---|---|---|
| 1 | 2/23 | フェブラリーステークス | 東京 ダ1600m |
| 2 | 3/30 | 高松宮記念 | 中京 芝1200m |
| 3 | 4/6 | 大阪杯 | 阪神 芝(内)2000m |
| 4 | 4/13 | 桜花賞 | 阪神 芝(外)1600m |
| 5 | 4/20 | 皐月賞 | 中山 芝2000m |
| 6 | 5/4 | 天皇賞(春) | 京都 芝(外)3200m |
| 7 | 5/11 | NHKマイルカップ | 東京 芝1600m |
| 8 | 5/18 | ヴィクトリアマイル | 東京 芝1600m |
| 9 | 5/25 | オークス | 東京 芝2400m |
| 10 | 6/1 | 日本ダービー | 東京 芝2400m |
| 11 | 6/8 | 安田記念 | 東京 芝1600m |
| 12 | 6/15 | 宝塚記念 | 阪神 芝(内)2200m |
| 13 | 9/28 | スプリンターズステークス | 中山 芝1200m |
| 14 | 10/19 | 秋華賞 | 京都 芝(内)2000m |
| 15 | 10/26 | 菊花賞 | 京都 芝(外)3000m |
| 16 | 11/2 | 天皇賞(秋) | 東京 芝2000m |
| 17 | 11/16 | エリザベス女王杯 | 京都 芝(外)2200m |
| 18 | 11/23 | マイルチャンピオンシップ | 京都 芝(外)1600m |
| 19 | 11/30 | ジャパンカップ | 東京 芝2400m |
| 20 | 12/7 | チャンピオンズカップ | 中京 ダ1800m |
| 21 | 12/14 | 阪神ジュベナイルフィリーズ | 阪神 芝(外)1600m |
| 22 | 12/21 | 朝日杯フューチュリティステークス | 阪神 芝(外)1600m |
| 23 | 12/27 | ホープフルステークス | 中山 芝2000m |
| 24 | 12/28 | 有馬記念 | 中山 芝2500m |
夏(7〜8月)や G1 のない週は飛ばして次の G1 へ進みます。年齢・性別の出走条件はゲームでは気にせず、相棒はすべての G1 に出走できます。 各コースは直線の長さ・コーナー半径・回り・芝/ダートを実際の競馬場に近づけて再現(直線の短い中山は前が有利、東京は末脚が生きる)。 24戦を終えるとシーズン総括。同じ相棒で翌年へ続きます(脚質は変わりません)。
index.html をブラウザで開くだけ(ビルド不要・外部ライブラリなし)。
# ローカルサーバーで開く場合
python3 -m http.server 8000
# → http://localhost:8000/
| 操作 | キー | スマホ |
|---|---|---|
| 進路(内へ/外へ) | ← / → | ◀ ▶ |
| 追う(前傾) | ↑ | 追う |
| 抑える(手綱を引く) | ↓ | 抑える |
| ムチ・スタート | Space | ムチ |
| 消音 / 一時停止 | M / Esc | ♪ |
相棒の脚質(逃げ・先行・差し・追込)は最初に決まり、乗り替わらない限り変わりません。 脚質は画面に表示されません。
レース結果画面の「シェアする」で結果を共有できます(スマホはOSの共有シート、PCはXの投稿画面。最終戦の有馬記念はシーズン総括)。「結果をコピー」で文章をコピーすることもできます。共有文には紹介記事のURL(https://techgym.jp/column/claude-code-game-keiba/ 。js/game.js の SHARE_URL)が付きます。
データはブラウザ(localStorage)に保存されます。「新しい馬に乗り替わる」で脚質ごとリセット。
端末の言語が日本語なら日本語、それ以外は英語で表示します。タイトル画面の「日本語 / English」でいつでも切り替えられます(選んだ言語は保存)。
画面の文言は js/i18n.js、レース名・競馬場・馬名・騎手コメントなどレースまわりの文言は js/sim.js にあります。
Android のアプリ名も、日本語の端末では「ダービージョッキー」、それ以外では「Derby Jockey」になります。
vercel.json で、Vercel が npm run build を実行して www/ を公開するよう設定しています(Android アプリに同梱するのと同じファイルです)。
Capacitor でゲームのファイルをアプリ内に同梱しているため、ネットにつながっていなくても遊べます。
v1.0.0 (build 12) など)とプライバシーポリシーへのリンクを表示アプリ ID は jp.techgym.keiba です(Google Play に一度公開すると変更できません)。
Android アプリでのみ広告を表示します(Web 版には広告は出ません)。
| 広告 | タイミング |
|---|---|
| バナー | トップ画面・相棒の画面・一時停止画面・結果画面の下(レース中は出さない) |
| インタースティシャル(全画面) | 新しいレースへ進むとき(出走する・次走)、タイトルへ戻るとき、一時停止から再開するとき。ただし前回から 60 秒以内は出さない(js/ads.js の INTERSTITIAL_GAP_MS) |
| リワード | 勝てなかったレースの結果画面で「広告を見て、このレースをやり直す」を選ぶと、結果を取り消して同じレースにもう一度挑戦(1 レース 1 回まで) |
android/app/src/main/res/values/strings.xml の admob_app_id、広告ユニット ID(バナー・インタースティシャル・リワード)は js/ads.js の UNITS.production にあります。derby-jockey.apk)は常に Google のテスト広告 を表示します。自分でタップしても問題ありません。ADMOB_MODE=production で本番の広告に切り替えます(scripts/build-web.js が js/ads-config.js を書き換えます)。GitHub Actions(自動): Web 版や android/ を変更して push すると、.github/workflows/android.yml が動作確認用の APK を作ります。
既定ブランチのビルドは GitHub の Release(android-latest)に自動で載るので、Android 端末で次の URL を開くか QR コードを読み取るだけで最新版をダウンロードできます。
https://github.com/techgymjp/keiba/releases/latest/download/derby-jockey.apk
ダウンロードした derby-jockey.apk を開き、「提供元不明のアプリ」のインストールを許可するとインストールできます。
動作確認用の署名鍵(android/app/debug.keystore)はリポジトリで固定しているので、新しいビルドもアンインストールせずに上書きインストールできます。
(Release に載る APK はデバッグ版です。Google Play には下の手順で作る署名済み .aab を使います)
手元の PC(Android Studio):
npm ci
npm run android:sync # Web ファイルを www/ にまとめて Android プロジェクトへコピー
npm run android:open # Android Studio で開く
アイコンと起動画面は assets/ の元画像から npx @capacitor/assets generate --android で生成しています。
upload.jks)は他のアプリと同じものを使えます。GitHub のリポジトリの Settings → Secrets and variables → Actions に次の 4 つを登録する
| 名前 | 内容 |
|---|---|
ANDROID_KEYSTORE_BASE64 | base64 -i upload.jks | tr -d '\n' | pbcopy でコピーした文字列 |
ANDROID_KEYSTORE_PASSWORD | キーストアのパスワード |
ANDROID_KEY_ALIAS | upload |
ANDROID_KEY_PASSWORD | 鍵のパスワード |
derby-jockey-release-aab(.aab)ができるバージョン番号(versionCode)は Actions の実行回数が自動で使われます。表示用のバージョン名は package.json の version です。
Android 版と同じ Capacitor のプロジェクトに ios/ を足しています(JET STRIKE と同じ構成)。Bundle ID は jp.techgym.keiba、iPhone 専用・横画面固定です。
ビルドと App Store への提出は Mac で行います。手順は docs/IOS_BUILD.md にあります。
js/ads.js の UNITS.ios、アプリ ID は ios/App/App/Info.plist の GADApplicationIdentifiernpm run ios:sync(テスト広告)/ npm run ios:release(本番広告。App Store 用)/ npm run ios:open.github/workflows/ios.yml が push のたびに、署名なしでシミュレーター向けにビルドできるかを確認するdocs/store/ios/All rights reserved. 著作権はテックジム株式会社に帰属します。無断での複製・改変・再配布、Web サイトやアプリとしての公開を禁止します。ただし、テックジムの受講生が学習目的で複製・改変することは許可します(商用利用は不可。詳しくは LICENSE)。
| ファイル | 役割 |
|---|---|
js/sim.js | 競馬場・年間カレンダー・レースシミュレーション(脚質・スタミナ・位置取り・進路妨害・コーナーロス)。DOM非依存 |
js/render.js | 疑似3Dの騎手目線描画、自馬の首・手綱・ムチ、ミニマップ |
js/audio.js | WebAudio による合成音(オリジナルのファンファーレ、蹄音、歓声、ムチ、ゲート) |
js/game.js | 進行管理、入力、実況、HUD、セーブ |
js/i18n.js | 表示言語(日本語 / 英語)の文言と切り替え |
js/ads.js / js/ads-config.js | AdMob 広告(Android アプリのみ) |
js/build-info.js | タイトル画面に出すバージョン(ビルド時に生成) |
scripts/build-web.js | Android 同梱・Vercel 公開用に www/ を作る |
android/ | Android プロジェクト(Capacitor) |
tools/balance.js | 脚質バランス検証(node tools/balance.js [レース数] [fps] [レースid]) |
?speed=4 を URL に付けると早送り(動作確認用)。