2025年6月5日4
先日の記事の通り、ついに 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 Novel では主に、以下の開発を予定しています。
Alice Console の開発計画は未定部分が多いですが、現状決まっている Alice Console v0.4.0 の開発予定は以下のとおりです。
test
コマンド (1節に同じ命令が2つ被っている場合に警告) の実装format
コマンド (命令が1つもない節 (2つ以上続いている改行) を削除、不要なスペースの削除) の実装Aqua Notes v0.1.0 に関しての開発予定はほとんど決まっていません。
ひとまずは、テストコードの作成をし、初期バージョン v0.1.0 のリリースをすることを目標としています。
今までは、Anov Syntax という構文が利用され、これらは、構文自体はおおよそ統一しています。
ただ、仕様に関してはそれぞれ微妙異なることから、Anov Syntax for Alice Novel と Anov Syntax for Alice Console として定義しています。(イメージとしては MFM、GFM、GLFM のようなフレーバー扱い)
また、この統一したルールを文章として厳格な規定を設けるというのが、commonnovel-spec の方針で、Alice Novel や Alice Console などの処理系はこれに合わせるという計画でした。(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節ずつ読み込むという特殊方式であり、あまり仕様の一般化に向いていません。
上記のように、Common Novel の制定にはいくつもの問題があり、導入はあまり進んでいませんでした。そこで、新しい方式として Novel IL を模索していくこととなりました。
ここで考案したのが、Json 方式です。これは、現在利用されている Anov Syntax を (.ipynb
(Jupyter Notebook) のような) Json の方式に、(.NET における IL のような) 中間言語として変換し、読み込みを行うというシステムです。1(ここでは、“Novel IL” とします)
言葉で説明しても分かりづらいので、図示します。
今までの方式は:
このように、Alice Novel、Alice Console などのプログラムによって実装が異なっていました。(Common Novel の派生となる、Anov Syntax for Alice Novel や、Anov Syntax for Alice Console を利用する形だった)
しかし、これからの Novel IL では:
このように、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 を人間が読み書きすることはできますが、手間がかかるため、あまり現実的ではありません)
(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.json
や config.json
がコンパイル後に省略できる導入デメリット:
デメリットの影響は小さいと考え、導入を前向きに検討しています。
例:
// この例ではケバブケース (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
: (Advanced Novel / Alice Novel) Syntax » 無難非採用:
.an
: (Advanced Novel / Alice Novel) Syntax » 短い (と、当時は考えていたが、今考えると悪くない)採用:
.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) と被る.cnov
: (Common Novel) » .anov
と類似しているため、ややこしい.jn
: (Json-type Novel) » J が個人的に好みでない (?)