今後の開発方針と Novel IL の導入について

2025年6月5日

はじめに

先日の記事の通り、ついに Alice Novel v0.9.3 が Microsoft Store にて、公開されました!!

v0.9.4 についてもかなり開発が進んでおり、近日中にリリースできる予定です!

本記事では更に次のバージョンである、Alice Novel v0.9.5、続く Alice Console v0.4.0、Aqua Notes のリリース予定と、同時に導入する Novel IL の開発予定について記載していきます。

Alice Project の開発予定

Alice Novel v0.9.5 の主な予定

Alice Novel では主に、以下の開発を予定しています。

  • 読み込むファイルを Anproj + Anov 形式から、後述する Novel IL に変更
  • 大規模リファクタリング (機能の分離により、開発効率の向上)
  • テストコードの追加 (リファクタリング後に作成)

Alice Console v0.4.0 の予定

Alice Console の開発計画は未定部分が多いですが、現状決まっている Alice Console v0.4.0 の開発予定は以下のとおりです。

  • 読み込むファイルを Anov 構文から、後述する Novel IL に変更 (今まで Alice Console のリポジトリ内で管理していた Anov Syntax は、Anov to Novel IL コンバーターのような役割に変更)
  • test コマンド (1節に同じ命令が2つ被っている場合に警告) の実装
  • format コマンド (命令が1つもない節 (2つ以上続いている改行) を削除、不要なスペースの削除) の実装

Aqua Notes v0.1.0 の予定

Aqua Notes v0.1.0 に関しての開発予定はほとんど決まっていません。

ひとまずは、テストコードの作成をし、初期バージョン v0.1.0 のリリースをすることを目標としています。

Json 形式の Novel IL の導入検討

今までの方式

今までは、Anov Syntax という構文が利用され、これらは、構文自体はおおよそ統一しています。

ただ、仕様に関してはそれぞれ微妙異なることから、Anov Syntax for Alice Novel と Anov Syntax for Alice Console として定義しています。(イメージとしては MFMGFMGLFM のようなフレーバー扱い)

また、この統一したルールを文章として厳格な規定を設けるというのが、commonnovel-spec の方針で、Alice Novel や Alice Console などの処理系はこれに合わせるという計画でした。(Common Novel 処理系方針)

Common Novel 処理系方針の問題点

今まで採用していた Anov Syntax 処理系や、先述した Common Novel 処理系方針について、いくつかの問題点がありました。

分岐

Anov Syntax / Common Novel では、分岐 (If 文) の構文読み取りがやや難儀でした。(条件分岐の読み込みの際に、戻って読み込む必要がある)

読み込み速度

Anov Syntax / Common Novel は、リアルタイム読み込みなので、事前読み込み時間がないというメリットがあります。(一応、Alice Novel の開発当時の最大のメリットはこれだった) しかし、動画読み込みが遅い、先述した通り分岐の開発が難しい、などのデメリットも存在していました。

ほとんどのプログラミング言語では Json 形式の読み込みライブラリが発達しており、自作した Anov リーダーよりも高い速度を実現できると考えています。(Anov Syntax では正規表現を利用しているので、比較的読み込み速度は遅いと思います)

特殊方式

Anov Syntax / Common Novel は、1節ずつ読み込むという特殊方式であり、あまり仕様の一般化に向いていません。

Novel IL の概要・目的

上記のように、Common Novel の制定にはいくつもの問題があり、導入はあまり進んでいませんでした。そこで、新しい方式として Novel IL を模索していくこととなりました。

ここで考案したのが、Json 方式です。これは、現在利用されている Anov Syntax を (.ipynb (Jupyter Notebook) のような) Json の方式に、(.NET における IL のような) 中間言語として変換し、読み込みを行うというシステムです。1(ここでは、“Novel IL” とします)

言葉で説明しても分かりづらいので、図示します。

今までの方式は:

diagram

このように、Alice Novel、Alice Console などのプログラムによって実装が異なっていました。(Common Novel の派生となる、Anov Syntax for Alice Novel や、Anov Syntax for Alice Console を利用する形だった)

しかし、これからの Novel IL では:

diagram

このように、Alice Novel、Alice Console などのプログラムにかかわらず、中間言語 (Novel IL) を通すため、共通性と移植性が向上します。

(Alice Console の場合は、基本 Hot Reload (JIT コンパイル相当) をする予定なので、体感として Novel IL に変換しているという感じがないですが、内部的には変換されています)

また、この技術により、中間言語に変換するコンパイラーさえあれば、別のノベル言語 (Ren’py 用や、Tyrano Script 用など) も、(理論上は) 同じ方式で利用できます!

更に、先述した Anov Syntax の読み込み方式が特殊であるために、読み込みが遅くなっていることに関しても、Json 読み込みになるため、ゲーム時は高速にプレイできます。(コンパイル時は多少時間がかかりますが)

注意点

注意点としては、Novel IL は人間が解読可能な言語であるものの、コンピューター向けのコードであり冗長なため、簡潔な Anov Syntax を代替するものにはなりません。あくまで中間言語です。(Novel IL を人間が読み書きすることはできますが、手間がかかるため、あまり現実的ではありません)

各システムへの適応予定

  1. Anov Syntax (Alice Console リポジトリ) にて Anov to NIL (Novel IL) の変換ツールを開発
  2. Alice Console に導入 (Anov Syntax for Alice Console の読み込みから、Novel IL の読み込みに変更)
  3. Alice Novel に導入 (Anov Syntax for Alice Novel の読み込みから、Novel IL の読み込みに変更)
  4. (Aqua Notes に導入 (Anov Syntax の読み込みから、Novel IL の読み込みに変更))

(metadata 項目は基本省略)

一般的な構文

Anov Syntax:

> green-park.png
- Alice
[Hi, there.]

- Rabbit
[Hi, Alice.]

[Nice to meet you.]

Novel IL:

{
  "cells": [
    {
      "lines": 1,
      "characrter-name": "Alice",
//    "character-image": "",
      "background-image": "green-park.png",
      "messages": "Hi, there."
    },
    {
      "lines": 2,
      "characrter-name": "Rabbit",
      "background-image": "green-park.png",
      "messages": "Hi, Alice."
    },
    {
      "lines": 3,
      "characrter-name": "Rabbit",
      "background-image": "green-park.png",
      "messages": "Nice to meet you."
    }
  ]
}

画像をまとめる

{
  "cells": [
    {
      "lines": 1,
      "characrter-name": "Alice",
-     "background-image": "green-park.png",
+     "image": {
+       "frontground": "alice-normal.png",
+       "background": "green-park.png"
+     },
      "messages": "Hi, there."
    },
    {
      // (中略)
    }
  ]
}

プラグイン関係

プラグイン (拡張機能: Extension) の導入は、かなり後の予定ですが、仕様は先行して決定しておきます。

{
  "cells": [
    {
      "lines": 1,
      "characrter-name": "",
      "background-image": "frutiger-aero.png",
      "messages": "Let's search!",
      // プラグイン専用要素 (プラグインの性質によって metadata / config.json などで設定してもいいかも)
      "plugin": [
        {
          "name": "aliceproject-search.dll",
          "search-engine": "google"
        },
        {
          "name": "aliceproject-compression.dll",
          "image": "image/webp",
          "audio": "none",
          "video": "video/webm"
        }
      ]
    },
    {
      // (中略)
    }
  ]
}

選択と分岐

分岐のための仕様も作成予定です。

{
  "cells": [
    {
      "lines": 1,
      "characrter-name": "Rabbit",
      // 選択
      "selection": {
        "apple": "",
        "lemon": "",
        "grape": ""
      },
      "image": {
        "froutground-image": "fruits.png"
      },
      "messages": "Select fruit you like."
    },
    {
      "lines": 2,
      "characrter-name": "Rabbit",
      // 分岐 ("または"と"かつ" (AND, OR, XOR) をどのようにするかは微妙)
      // 当てはまる場合は、この行を表示、当てはまらない場合はスキップされる
      "if": {
        "apple": "true",
        "lemon": "false",
        "fruits": 2
      },
      "image": {
        "background-image": "green-park.png"
      },
      "messages": "Nice to meet you."
    }
  ]
}

備考

metadata 項目を導入するかどうか

.ipynb (Jupyter Notebook) では、Jupyter Notebook で利用される言語 (Python, C#, Markdown など) や、その他の情報を保存する項目として、metadata 項目があります。これを、Novel IL に導入するかどうかについてです。

導入メリット:

  • package.jsonconfig.json がコンパイル後に省略できる
  • ファイルごとに、設定の保存ができる → ファイルを変更 (リンクさせれば) すれば、UI のカラーリング変更などができる

導入デメリット:

  • ファイルが肥大化する

デメリットの影響は小さいと考え、導入を前向きに検討しています。

例:

// この例ではケバブケース (kebab-case) と、スネークケース (snake_case) が混ざっている。
// [FYI] 本家 Jupyter Notebook では、スネークケース (snake_case) とキャメルケース (camelCase) が混ざっている。

{
  "cells": [
    {
      "lines": 1,
      "characrter-name": "Alice",
      "character-image": "alice-normal.png",
      "background-image": "green-park.png",
      "messages": "Hi, there."
    },
    {
      "lines": 2,
      "characrter-name": "Rabbit",
      "character-image": "rabbit-normal.png",
      "background-image": "green-park.png",
      "messages": "Hi, Alice."
    },
    {
      // (中略)
    }
  ],
  "metadata": {
    // ゲーム情報
    "game-spec": {
      "title": "Alice's Wonder Forest",
      "author": [
        "Alice Project"
      ],
      "language_info": "English",
      "version": "1.0.0"
    },
    // プラットフォーム互換性
    "platforms-compatibility": [
      {
        "name": "Alice Novel",
        "version": "0.9.3",
        "state": "all-clear"
      },
      {
        "name": "Alice Console",
        "version": "0.3.0",
        "state": "partially-clear"
      }
    ],
    // ゲームエンジンの色変更 (GUI のみ)
    "game-engine-style": {
      "primary": {
        "light": "#757ce8",
        "main": "#3f50b5",
        "dark": "#002884",
        "contrastText": "#fff"
      },
      "secondary": {
        "light": "#ff7961",
        "main": "#f44336",
        "dark": "#ba000d",
        "contrastText": "#000"
      }
    }
  }
}

本格ゲーム開発

Alice Novel を用いた本格ゲーム作成についても考えています。(サンプルゲームはあくまで機能紹介のためのゲームだが、ここで言う本格ゲームというのは、シナリオが成立しており、楽しめるゲームと言う意味)

しかし、これについては Ivy Cafeteria ですでに SRFB の開発計画があるため、こちらの完成を考えている。

拡張子名の選考

Anov Syntax

採用:

  • .anov: (Advanced Novel / Alice Novel) Syntax » 無難

非採用:

  • .an: (Advanced Novel / Alice Novel) Syntax » 短い (と、当時は考えていたが、今考えると悪くない)
Novel IL

採用:

  • .nil: (Novel Intermediate Language) » Novel + IL (中間言語) なので、妥当

非採用:

  • .fan: (Formatted Advanced Novel) » ゲームは楽しい (fan) と合っていていいと思った
  • .nf: (Novel Formatted-text) » Novel の N が先なのがいい
  • .nml: (Novel Markup Language) » XML っぽい案
  • .ns: (Novel Script) » Json 形式であり、Script らしくないか
  • .annb: (Advanced Novel NoteBook) » N が2回被るのと、発音が .anov とほとんど同じなのが微妙
  • .ne: (Novel Elements / Novel Essence) » 悪くないが、E が割と謎
  • .cn: (Common Novel) » 中国の国別コード (.cn) と被る2
  • .cnov: (Common Novel) » .anov と類似しているため、ややこしい2
  • .jn: (Json-type Novel) » J が個人的に好みでない (?)

  1. https://github.com/orgs/AliceNovel/discussions/11 ↩︎

  2. Novel IL が新 Common Novel だった頃の案 ↩︎ ↩︎