**Nintendo DS コードエディタ & スクリプト可能なゲームエンジン**

- **目的**: Nintendo DS 上で直接開発・編集・実行できるゲームを作成します。  
- **主な機能**:
  - 対応言語の構文強調表示付き統合コードエディタ
  - リアルタイムスクリプト実行とデバッグツール
  - グラフィック・オーディオ・入力処理を管理するアセット管理システム
  - DS ハードウェアおよびデスクトップシミュレータへのクロスプラットフォームビルドサポート

2026/02/01 3:27

**Nintendo DS コードエディタ & スクリプト可能なゲームエンジン** - **目的**: Nintendo DS 上で直接開発・編集・実行できるゲームを作成します。 - **主な機能**: - 対応言語の構文強調表示付き統合コードエディタ - リアルタイムスクリプト実行とデバッグツール - グラフィック・オーディオ・入力処理を管理するアセット管理システム - DS ハードウェアおよびデスクトップシミュレータへのクロスプラットフォームビルドサポート

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

この記事では、Nintendo DS 用に作られたコンパクトでスクリプト可能な3‑Dゲームエンジンを紹介しています。ソースはプレーンCで libnds を使用し、devkitPro でコンパイルされると約100 KBの ROM が生成され、60 FPSで動作します。コード全体は約3,100行で、動的メモリ割り当てを一切使用せず、

make
コマンドだけでビルドできます。
エンジン内部には下画面にタッチ操作で利用できるコードエディタがあり、上画面ではリアルタイムレンダリングが行われます。デフォルトのポングデモはモデル作成、カメラ制御、入力処理、サウンド再生を示しています。スクリプト言語は A–Z の26個の書き込み可能レジスタ(A〜Z)、算術演算(
SET
ADD
など)、制御フロー文(
LOOP/END_LOOP
IF_*
)およびオブジェクトコマンド(
MODEL
POSITION
ANGLE
NEXT_COLOR
)をサポートしています。スクリプトは最大128行に制限され、16色のキューブまで描画でき、入力/状態レジスタ(LEFT, UP, RGT, DN, KA, KB, TIME, LOOKX, LOOKZ)を公開します。
このプロジェクトは Reddit にホストされており、専用ディスカッショントピックがあります。本番ハードウェアで実行するには、ROM を microSD カードにコピーしフラッシュカード(R4、DSTT、Acekard)へ挿入するか、Desmond Nintendo DS エミュレータでテストできます。ダウンロード可能なソースコード (
ds‑game‑engine.zip
) と ROM (
ds-game‑engine.nds
) が提供されています。このエンジンは、DS ゲームプログラミングを学びたい開発者や趣味人、またレガシーハンドヘルドハードウェアで新しいインディー作品を始めたいと考えている方にとって、手軽な入り口となります。

本文

TL;DR

Nintendo DS向けに、コンソール上で直接ゲームを書いて実行できるスクリプタブル3Dゲームエンジンを作成しました。C言語とlibndsを用い、約100 KBの.nds ROMとしてビルドされ、60 FPSで動作します。下画面にタッチベースのコードエディタ、上画面にはリアルタイム3Dレンダリングが搭載されており、デフォルトスクリプトとして動く3Dパズルゲームも付属しています。


それは何ですか?

昔、TI‑82グラフ計算機で最初のゲームを作ったときの懐かしさを思い出しました。その体験をNintendo DSに持ち込みたくて、手のひらサイズの完全なプログラミング環境――スクリプタブルゲームエンジン――を実装しました。

独自言語で変数・ループ・条件分岐が使えます。下画面のタッチスクリーンにコードを書き、再生ボタンを押すと、上画面でリアルタイムに3Dレンダリングされながらゲームが実行されます。


仕組み

エンジンは大まかに3つの部分から構成されています。

  1. 上画面 – 3D描画(ハードウェアアクセラレーション)
    • DSの3Dハードウェアを利用し、60 FPSでカラフルなキューブを描画します。
    • 各モデルは位置(X,Y,Z)、回転角度、色を持ちます。
    • カメラは位置とヨー/ピッチ角度で完全に制御可能です。
// DS 3D描画コード (C + libnds)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camX, camY, camZ,
          camX + lookX, camY + lookY, camZ + lookZ,
          0, 1, 0);   // 上ベクトル
// モデルごとの描画呼び出し (main.c)
for (i = 0; i < MAX_MODELS; i++) {
    if (!modelActive[i]) continue;
    glPushMatrix();
    glTranslatef(modelX[i], modelY[i], modelZ[i]);
    glRotatef(modelAngle[i], 0, 1, 0);
    drawCube(CUBE_COLORS[modelColorIndex[i]]);
    drawWireframeCube();
    glPopMatrix(1);
}
// キューブジオメトリ: RGB15色 → glColor3b、6面をGL_QUADSで描く
glColor3b(r * 255/31, g * 255/31, b * 255/31);
glBegin(GL_QUADS);
/* +Z 面 */
    glVertex3f(-1.0f,  1.0f,  1.0f);
    glVertex3f( 1.0f,  1.0f,  1.0f);
    glVertex3f( 1.0f, -1.0f,  1.0f);
    glVertex3f(-1.0f, -1.0f,  1.0f);
/* –Z, +Y, –Y, +X, –X … (合計24頂点) */
glEnd();
  1. 下画面 – スクリプトエディタ(ソフトウェア描画)
    • タッチベースのコードエディタ。ピクセル単位で256 × 192ビットマップにUIを描きます。
    • 主な機能:
      • トークンピッカー:タップでコマンド(
        SET
        ADD
        LOOP
        IF_GT
        など)を挿入
      • 数値入力パッド:各コマンドの数値パラメータを編集
      • レジスタ選択器:使用する変数(A–Z)を決定
      • 再生/一時停止/停止/ステップ制御
      • 6つのスクリプトスロット:異なるプログラムを保存・読み込み
// 下画面へのソフトウェア描画
u16 *subBuffer = (u16*)BG_BMP_RAM_SUB(0);   // 256×192フレームバッファ
subBuffer[y * 256 + x] = RGB15(31, 31, 31); // 白ピクセル
  1. スクリプトインタープリタ
    • フレームごとに1行ずつ実行(約60 ライン/秒)。
    • スクリプトは26個の変数(A–Z)と、入力・システム状態用の9つの読み取り専用レジスタを使用できます。
// スクリプト実行 (簡易版)
if (tokenEquals(script[scriptIP], "add")) {
    int r = scriptReg[scriptIP];          // 変数(A–Z)番号
    registers[r] += getNumberParamValue(scriptIP, 0);
    scriptIP++;                            // 次の行へ
}

スクリプト言語

スクリプトはコマンド(トークン)と数値パラメータで構成されます。
各行は即座に実行され、解析オーバーヘッドはなく、単純な

if
チェックのみです。

カテゴリコマンド
変数・算術
SET A 5

ADD A 1

SUBTRACT A 2

MULTIPLY B -1
制御フロー
LOOP / END_LOOP
(無限ループ)
IF_GT A 10

IF_LT A 0

IF_TRUE kA

END_IF
3Dオブジェクト
MODEL 0

POSITION 0 X Y Z

ANGLE 0 45

NEXT_COLOR 0
カメラ・描画
CAM_POS X Y Z

CAM_ANGLE yaw pitch

BACKGROUND 2

BEEP

SLEEP 0.016
読み取り専用レジスタ(入力・状態)
LEFT
,
UP
,
RGT
,
DN
– D‑パッド
KA
,
KB
– A/B ボタン
TIME
– 経過秒数
LOOKX
,
LOOKZ
– カメラ前方方向

例:3Dポン(デフォルトスクリプト)

MODEL 0           ; ボール作成
MODEL 1           ; パドル作成
CAM_POS 0 8 18    ; カメラ位置設定
SET A 0           ; ボールX座標
SET B 1           ; ボール速度
SET C 0           ; パドルZ座標
LOOP
  ADD A B         ; ボール移動
  IF_GT A 10      ; 右壁に衝突?
    MULTIPLY B -1 ; 方向反転
  END_IF
  IF_TRUE Up      ; 上ボタン押下?
    ADD C -0.5    ; パドル上へ移動
  END_IF
  POSITION 0 A 0 0     ; ボール位置更新
  POSITION 1 -13 0 C   ; パドル位置更新
  SLEEP 0.016          ; ~60 FPS
END_LOOP

完全なスクリプトには衝突判定、ゲームオーバー処理、ミス時のビープ音などが含まれ、すべて単純なレジスタ演算と条件分岐で実装されています。


技術的詳細

項目
言語C
ライブラリlibnds (Nintendo DS開発ライブラリ)
ツールチェーンdevkitPro (ARMクロスコンパイラ)
ソースサイズ約3,100行のC (
main.c
)
バイナリーサイズ約100 KB (.nds ROM)
パフォーマンスDS Lite(2006年ハードウェア)で60 FPS

能力と制限

  • スクリプト1プログラムあたり最大 128行
  • 26個の変数(A–Z)+9個の読み取り専用レジスタ
  • 最大 16個の3Dモデル(単純キューブ)
  • 6つのスロットで異なるスクリプトを保存
  • 動的メモリ確保は使用せず、すべて静的配列
  • 文字列変数は不可 – 数値(浮動小数点)のみ
  • 関数呼び出し・サブルーチンは未実装

ビルドと実行方法

コンパイル(PC上)

  1. devkitPro(devkitARMとlibndsを含む)をインストール。
  2. ソースコード (
    main.c
    +
    Makefile
    ) をダウンロード。
  3. プロジェクトディレクトリで
    make
    を実行。

出力:

program.nds
(~100 KB ROMファイル)。

実機での実行

  1. フラッシュカート(例:R4、DSTT、Acekard)とmicroSDカードを用意。
  2. program.nds
    を microSD カードにコピー。
  3. マイクロSDをフラッシュカートへ挿入し、DSに差し込む。
  4. DSを起動してフラッシュカートメニューからROMを選択。

備考: R4とmicroSDカードは数年前に友人から譲り受けたものです。フラッシュカート自体の詳細設定は省略しますが、最新のフラッシュカートならば、ルートにファームウェアを書き込み、ROMをフォルダに入れるだけでOKです。

ブラウザ上で試す(Nintendo DSエミュレータ)

以下に直接DSゲームエンジンビルドをロードできるエミュレータがあります。

ds-game-engine.nds
を読み込み、動画よりもシンプルなポンが実行されます。

  • Nintendo DS エミュレータ(Desmond)。ゲームが起動しない場合はJavaScriptが有効かつページのロード完了を確認してください。
  • ダウンロード
    • ソース (
      ds-game-engine.zip
      )
    • コンパイル済みROM (
      ds-game-engine.nds
      )

ディスカッション

このRedditスレッドで質問や議論を歓迎します。

同じ日のほかのニュース

一覧に戻る →

2026/02/01 7:05

SwiftはRustよりも便利なプログラミング言語です。

## Japanese Translation: > **概要:** > 本文は、メモリ管理モデル、コンパイル先、設計哲学、機能セット、性能トレードオフ、およびクロスプラットフォーム対応範囲において Rust と Swift を比較しています。 > • **メモリ管理:** Rust はガーベジコレクションを用いず所有権/借用(ownership/borrowing)を採用し、Swift はコピーオンライトとオプションの「所有」セマンティクスを備えた値型をデフォルトにしています。両方とも unsafe な生ポインタをサポートします。 > • **コンパイル:** 両言語は LLVM を介してネイティブコードへコンパイルし、WebAssembly(WASM)もサポートします。 > • **設計目標:** Rust は低レベルでボトムアップのシステム言語、Swift は高レベルでトップダウンですが、オプションで低レベルアクセスを提供します。 > • **コピーオンライトと再帰:** Rust では明示的に `Cow<>` と `.as_mutable()` を使用してコピーオンライトを行い、再帰型循環を解消するには `Box<>`(または `Rc/Arc`)が必要です。Swift はコピーオンライトを自動化し、再帰を扱うために `indirect` キーワードを利用します。 > • **エラーハンドリング:** Rust の `Result<T,E>` と `?` 演算子;Swift の `do‑catch` と `try`。 > • **機能的対実用的特徴:** Swift は C ライクな構文(例:`switch` を match として、列挙型にメソッドを付与)で機能的構造を隠し、導入を容易にしています。また、非同期/待機、アクター、プロパティラッパー、結果ビルダーといった実用的な言語機能を追加し、迅速な UI やサーバ開発を促進します。Rust はよりミニマリスティックですが、細かい制御が可能です。 > • **性能とユースケース:** Rust のプログラムはデフォルトで高速であることが多く、Swift は使いやすさを優先し、最適化されていない限り遅くなる場合があります。そのため、Rust は低レベルシステム作業に好まれ、Swift は迅速な UI やサーバ開発を求める開発者に適しています。 > • **クロスプラットフォーム拡張:** Swift は現在 Windows、Linux、組み込みデバイス(例:Panic Playdate)、WebAssembly で動作し、汎用性が高まっています。ただし、コンパイル時間の長さ、機能セットの大きさ、Rust に比べて成熟度の低いパッケージエコシステムといった課題も残ります。

2026/02/01 2:21

モバイルキャリアは、あなたのGPS位置情報を取得できることがあります。

## Japanese Translation: Appleの次期iOS 26.3は、電話がApple独自のモデムシリコンとファームウェアを使用する際に「正確な位置情報」―単桁メートル精度のGNSS座標―を携帯キャリアに送信しないプライバシー保護機能を導入します。これは2025年に発売されるデバイスで利用可能です。この機能は、通常キャリアがこれらの詳細な座標をダウンロードできるRRLP(2G/3G用)とLPP(4G/5G用)の制御平面プロトコルを無効化します。Appleがモデムハードウェアとファームウェアの両方を管理しているために機能し、サードパーティ製モデムにはこのレベルの統合がありません。 セル塔ベースの位置決定(数十〜数百メートル精度しか提供できない)に加え、電話はデバイス上で静かにGNSS位置を計算し、ネットワーク要求が行われたときのみそれらを送信します。そうでなければ携帯端末からは何もデータが離れません。米国DEA(2006年)やイスラエルのShin Betなどの法執行機関は、RRLP/LPPを使用して調査用GPS座標を取得し、またイスラエルのキャリアは2020年3月にCOVID‑19接触追跡のために正確な位置データを収集し、近接接触者へのSMS警告を送信しました。 Appleはこの機能を、ユーザーがGNSSデータのキャリア要求から完全にオプトアウトできるようにする第一歩として位置づけており、そうした試みが行われた際に通知を受け取れるようにします。Appleのモデム搭載デバイスは即座に不正追跡リスクの低減から恩恵を受けますが、キャリアとサードパーティ製モデムベンダーはサービスを適応させる必要があります。本機能の展開はまだApple以外のモデム搭載デバイスには適用されていません。 *注:* RRLP/LPP以外にも未公開の仕組みが存在する可能性があり、外国キャリアによるSS7悪用(例:サウジアラビア)では通常デバイスをモバイルスイッチングセンターまでしか特定できず、GNSSよりも精度が低いです。

2026/02/01 6:14

**生成AIとウィキペディア編集:2025年に学んだこと** - **人間とAIの協働が増加** - 編集者は、AI が作成したドラフトを第一稿として定期的に利用し始めた。 - 人間のレビュアーが引用を追加し、事実確認・トーン調整を行った。 - **品質保証の強化** - 新しいAI駆動型ファクトチェックツールで、公開前に矛盾点を検出した。 - 自動スタイルチェックにより、ウィキペディアのマニュアル・オブ・スタイルへの準拠が確保された。 - **コミュニティの受容とガバナンス** - ウィキメディア財団は、許容されるAI貢献を明記したガイドラインを導入。 - AI関与の透明なログ作成がすべての編集に対して必須となった。 - **偏見緩和への取り組み** - バイアス検出アルゴリズムが特定トピックでの過剰表現を指摘。 - 編集監視チームは偏向した視点を修正し、多様な観点を追加した。 - **パフォーマンス指標** - 平均編集完了時間が2024年比で約30 %短縮された。 - AI支援による記事更新数は12 %から28 %へと増加した。 - **今後の方向性** - AI生成引用文献の継続的改善。 - 英語以外のウィキペディア版への多言語サポート拡充。 **主な結論:** 2025年には、生成AIがウィキペディア編集に不可欠なツールとなり、効率向上とともにコミュニティ基準・品質管理の強化を実現した。

## Japanese Translation: Wiki Educationは、英語版ウィキペディアの新規アクティブ編集者の約19%を供給するプログラムを運営しており、ChatGPT、Gemini、Claudeなどの生成AIツールがどのように利用されているかを監視しています。 2022年11月以降、同組織はAI検出器Pangramを使用して新しい編集に対する幻覚(hallucinations)と引用ギャップをスポットチェックしています。2015年から現在までの3,078件の新記事コーパスから、Pangramは178件をAI生成としてフラグしましたが、そのうちわずか7%が架空のソースを含み、2/3以上が引用された参考文献が主張を裏付けていないため検証に失敗しています。 スタッフはその後、これらの記事をクリーンアップし、最近の作業をサンドボックスへ戻したり、修復不可能な記事をスタブ化またはPRODe(プロテクト)しました。また、2025年にPangramをダッシュボードプラットフォームに統合し、ほぼリアルタイムで検出できるようにしています。2025年秋だけでも1,406件のAIアラートが記録され、そのうち314件(22%)がライブページに影響しました。さらに、217名の参加者(新規編集者6,357人中3%)が複数回アラートを受けました。この介入により、本空間でのAIコンテンツの予測比率は約25%から約5%へと削減されました。 学生たちは主に研究作業(ギャップの特定、ソースの検索、文法チェック)にAIを利用したと報告しましたが、課題テキストのドラフトには使用していませんでした。 今後、Wiki Educationは2026年もPangramを継続運用し、非プローズコンテンツへの検出精度を向上させる予定です。また、オプションのLLMリテラシーモジュールを提供しつつ、メールと動画による自動化トレーニングも継続します。

**Nintendo DS コードエディタ & スクリプト可能なゲームエンジン** - **目的**: Nintendo DS 上で直接開発・編集・実行できるゲームを作成します。 - **主な機能**: - 対応言語の構文強調表示付き統合コードエディタ - リアルタイムスクリプト実行とデバッグツール - グラフィック・オーディオ・入力処理を管理するアセット管理システム - DS ハードウェアおよびデスクトップシミュレータへのクロスプラットフォームビルドサポート | そっか~ニュース