Vino.js開発日記 その1

お久しぶりです。Marcoです。ブログっぽい記事を書くのは久しぶりです。

今回は私が今開発中(厳密には構想・設計中)のVino.jsについてダラダラと書いてみようかなと思います。

Vino.jsとは

Vino.jsとはVisual Novel JavsScriptの略で、ビジュアルノベルを作るためにめんどくさい部分を解消したいとの思いから考案されました。

五つの柱

  • 製作時のめんどくさいを解消すること
  • 最低限動作させるのは簡単であること
  • フラグ・パラメータの管理手段を提供すること
  • 様々な表現に対応できる柔軟性を持つこと
  • 仕組み上の不可能をなくすこと

ライブラリ制作が初めてなので、どういった思想のもとで作るかというのを定めた五本の柱を考案しました。

基本的に、この方針に従って制作を進めていきます。

五本目について補足

不可能をなくすというのはOSをも作れるようにという意味ではありません。

例えばシナリオを遡る演出であったり、スタイルを大きく変化させるもの、Webという環境を活かすもの、それらを『Vinoの仕組みじゃ不可能だよ』と言いたくないのです。そういう思いを込めた方針です。

開発言語

いやあ、JavaScriptで書こうと思ったんですけど、TypeScriptになる可能性が高いかなと思います。

軽くJSで書いた感じ、自前Objectを展開しまくるので、JSDocでどうにかするよりTSを採用したほうがいいかなという理由です。

他プロジェクトでTSを採用する予定も出てきたので、自分自身のリソース的にも悪くない選択じゃないかなと思います。TypeScript HandbookにToCを付けるスクリプトを書いたりして、結構いい環境も作れたと思います。

予定図

全体の構造は現在考え中なので次回あたりのブログで書こうかなと思うのですが、ざっくり言えばオブジェクト直下にオブジェクトやらfunctionやらおいていくという具合です。

表示のために使われる値などはPrivateで定義され、基本的に触れることができないようにします。

柔軟性を持つという点が一番の悩みどころです。イベントを提供したり、コールバック関数を持たせることを可能にすることなど検討していますが、いろいろ調べている限りまだ知識不足なところだなと感じていて、調査に時間がかかりそうです。

脳内にある仮案処理フロー

  1. Vinoが実体化される
  2. 引数から設定やパラメータ、storyScriptなどを展開する
  3. VinoEcosystemのイベントを生成する
  4. 生成終了のイベントが発火する
  5. Vinoが動くためのイベントを登録する
  6. innerBoxなどを描画する処理が走る
  7. 遷移イベントが発火する
  8. ユーザー提供のメソッドが実行される*1
  9. 遷移メソッドが実行される
  10. 以降7~9の繰り返し
解説

3~4はPromiseによって管理され、5~6が非同期に処理されます。

7については、ユーザーがEventLockをかけることで一旦処理を止めることが出来ます。これは4のあと、イベントリスナーを登録し終えるまでの間に遷移イベントが発火してしまうことを防ぐものです。(((ロジックは未定です、こんな具合にしたいなというものです。ProxyによってSet時の処理を置き換えちゃうとかでもいいんですかね。あともちろん、内部ではVinoのイベント登録待ちも用意します)))

7~8がどのような処理になるか未調査です。useCaptureフラグが有効になっていても、何らかの非同期処理が走ってしまうことで順序が異なってしまうことも考えられます。その場合はまた別途検討する必要があると思います。

あとはユーザーの挟み込む処理->Vinoの処理……という具合で動きます。基本的にイベントはsectionの切り替わりごとに発生します。若干心配しているのは、従来のシステムを完全に覆すような、破壊的な挙動をするゲームを制作することが担保できないことです。

案としては、Vinoの処理を行わないようにするAdvanceOptionを用意して、描画周りのAPIを触れやすいように作るというものを考えています。Event bubblingも軽く読んでみたんですが、第二の柱を維持するのが難しいかなという印象です。発火->UserMethod->VinoMethodの流れが固定になりますからね……。

まだまだ予定だらけで、MDN読みながらこんな案もいいななんて考えている最中なので、今後大きく変更したり、新しい仕組みを提案することもありえます。開発日記なので、こういう経緯も残していければいいかなと。

個人的な文章

難しいな。難しい。考えるの難しい。でも楽しい。

どんな仕組みでJSを活かしたら使いやすいかな?と思っても、他人のコードをたくさん読むこともなくて、ライブラリに触れた経験もあまりなくて、ほんとに独学で突き進んでいくしかないんじゃないかって思ってしまう。ようやくJS歴一年の記念パーティーを開催するというような時期がきた。不安に思うことも仕方がないんだ。そうだ。

まあ仕事ではないし、私の脳内にある夢地図をぶつけていけばいいと思うと少しは気が楽になる。まさしくこれは私の夢地図のような存在だ。私が知っているJavaScriptを活かす作りと、こんな感じでゲームが作れたらいいなと思う願いを詰め込んでいる。プリティーリズムを三日連続でずっと見ていたせいで、想いを心に閉じ込めておくことは出来なくなっているみたいだ。文章にしてしまいたくなる。

それでも、周囲の方々と違ってコードを書く以外に浮気ばかりしていまう人間なので、作業時間の確保というものが難しい。これは精神的なところとか、自己管理的なところなので、もう技術の面ですらない。多分、今一周年を迎えているのもこれが理由じゃないのかなあ。何か長く続くってことが自分にとって珍しいことなのだ。お恥ずかしいことに。

まあダラダラとこれ以上書き連ねていても、私が大好きな私の文章を量産するだけになってしまうので、このあたりで切り上げよう。

次回はJavaScriptにおけるイベント周りの勉強をしてから書こうと思う。それはそうと、流石にそろそろ働かないとまずいなと思うのでまたバイトを探すことにしなくては……。

読んでいただきありがとうございました。文章書くのは最高に楽しい!

*1:useCaptureをtrueにすることで先に実行されます