Just $ A sandbox

プログラミングと計算機科学とかわいさ

ノベルゲーム「人形劇が終わる夜」をリリースした

もう2週間近く前ですがノベルゲームをリリースしました.

www.freem.ne.jp

反省会を兼ねてその話.

企画

前のノベルゲームをリリースしたのが2年近く前ということもあり, そろそろなんとなくノベルゲーム作りたいなと思ったこと.
諸般の事情で現実逃避先として「新作ゲーム作ろう, 目の前のつらいことから目をそむけてゲームを作ろう」という経緯で作ることにした.

今回も前回同様に, スクリプトとキャラとシナリオはそこそこ頑張って背景やらBGMやらSEやらシステム画像やらはよさ気な素材を引っ張ってきた.

シナリオ

最初は心の安らぎを求めていたためか, すごく優しくて甲斐性があって可愛いお姉ちゃんがプレイヤーを甘やかしてくれる話にしようと思って話を考え始めていたのに終わってみるとあまりそういう話にはならなかった. (部分的にそういう要素はあるけど)
今まで作ったことのあるノベルゲームは, 大抵途中から書くスピードが失速するのでエンディングは今まで書いたものをつぎはぎしながら何とか辿り着く感じの書き方をしていたけれど, 今回はなぜかそうはならず, むしろ予定通り書き上げたのに説明不足では?という感じが最後まで拭えない感じに.
自分にしては珍しく最後まで使わなかった設定や小ネタ的なものがいくつか余ったけれど, 余計な継ぎ足しは話の流れを妨害しそうだったので諦めてとりあえず完成とした.

最後にテストプレイした時は, 全然説明されてなくてこれはプレイヤーには伝わらないのでは?と悩んだけれど, 結局あまり加筆せずにそのままにした気がする.
なんというか, 今回のオチに関しては下手にごちゃごちゃと説明するのは良くない気がしたので.
説明不足だったらごめんなさい.

個人的には割と好きなタイプの(?)結末になったと思います.

立ち絵

女の子3人分用意したら力尽きたのはもったいないことをしたなという気も.
絵を描くのって(自分があまり上手くないこともあって)結構精神的に消耗するので事前に描いておくべきなのでは????ってすごく思った.
次は2〜3キャラ分の立ち絵を先に用意してから始めるほうがいいかも.

スクリプトとエンジン

今回はなんとなくKAGじゃなくてKAGEXを使った.
発言者の名前表示がデフォルトでできる, 行末改行+クリック待ちタグを自動付与するモードがある, バックログがデフォルトでスクロールバーついてる等々, 挙げ出したらキリがないほど気が利いていて本当にすごい.
反面, 標準の機能に手を入れようとするとドキュメントとかが全然なくて不親切だったり, KKDEのKAGEXサポートがよく分からないことになっていたりという少し困った所も.
総合的に見れば慣れれば超優秀だと思うから今後ももしかしたら使うかも?

背景

いつものように背景画像を加工したけれど, 画像の加工をする前提なら元画像がどれくらい綺麗なものかというのは非常に重要ということを身に沁みて理解した.
今回はいくつかのサイトで, 2000px~程度のサイズの写真素材などをとってきて加工する感じでやった.
前回はあまり気にせず800pxくらいのやつを使っていたのだけれど, 加工のしやすさがまるで違うので.

BGMとSE

よさ気なやつがたくさん見つかったこともあって, 今回は非常にBGM選びとSE選びが楽しかった.
インターネットはすごい.

タイトルとED

タイトルは最後まで悩んだ気がする.
何をつけてもしっくりこなくて, そもそもジャンルとかあらすじも自分でも上手く説明できないような作品(いつもそういう話ばかり書いてる気がする?)なのでどういう方向性でいけばいいかも分からず….
結局, 比喩方面に逃げました. (作品中に人形劇は出てきません)

ED演出も割と楽しくやったつもり?
いつも通りの本編補足演出だけど, 今回は裏設定が結構余ったりしていたので作りやすかった記憶が.
特に今回はED2の後にもエピローグが控えているのでそれを踏まえて文章を書きました.

リリースしてから

リリースはいつも通りにふりーむへ.
気がついたらプレイ動画が上がってたりしてて嬉しかったです.
でも怖いのでまだ見てません. 最後まで上がったら見ようかと思います.

製作期間は, シナリオを本格的に書き始めてから多分3週間くらい?
短編とは言え結果的にすごく短期間で完成してしまった.
もしも次があるなら, 次は今までとは少し方向性を変えた話を書きたいなー. (今回も作り始める前は同じことを言っていた気がする)

ListのT代数の非自明な射は何か?

ListのT代数の非自明な射は何か?という感じの話.

List Monad, T-Algebra

以下のようなmonoid free functorとforgetful functorの随伴がある:
free functorは集合を自由モノイド(wordの集合, 演算は結合)に飛ばし, forgetful functorはモノイドを底集合に飛ばす.

$ F \dashv G : \mathbf{Mon}(FX,Y) \cong \mathbf{Set}(X, GY); h \mapsto h |_X $

ここから標準的に得られるモナドはList Monadに一致する:

$ TC = GFC = | C^* | \cong [C] $
$ \text{unit}_C : C \hookrightarrow TC $
$ \text{join}_C = G \epsilon F C = \text{concat} : T^2 C \to TC$

ListのT代数とは$(C,h : TC \to C)$であって以下の条件を満たすもののこと:

1. $ h \circ \text{join}_C = h \circ T h $
2. $ h \circ \text{unit}_C = 1_C $

あるいは, 元を明示して書くと,

1. `forall xs : [ [a] ]. h (concat xs) = h (fmap h xs)`
2. `forall x : a. h [x] = x`

ともかける.
例としては, `head, last : [a] -> a`や`sum, product : [Int] -> Int`などがそう.

$(C,h), (C', h')$がともにListのT代数のとき, この間のT代数の射$f : (C,h) \to (C',h')$とは, 射$f : C \to C'$であって以下を満たすもののこと:

1. $ f \circ h = h' \circ T f $

T代数の射の手頃で非自明な例は作るのが難しい, というのも型aが一般的だと例えばheadとlastの間には射はないので, 上に挙げた例の間に射をのばそうとしても上手くいかない.
idでない例としては, 例えば`length : ([a], h) --> (Int, h)`などがあるが, これは型が違うとはいえdomとcodに現れている射が同じものなのでほぼidと変わらない.

ListのT代数で非自明な射というのはどういうものがあるだろう?
もしくは他のモナドのT代数の場合だとどうだろう?という疑問.

ノベルゲームシナリオ論

※ 以下は全て個人の感想です。

長さは「正義」

長いゲームは飽きられやすいけれど、その点さえ解決できれば長さは完全に正義である。
長時間プレイしてくれたプレイヤーは大抵どのキャラにも相応の愛着が沸いているので、キャラクターらしささえ損なわなければどんなエンディングでも(ヒロイン死亡とかそういうのじゃない限り)そんなに文句はおきない。
あとはどうやって長時間飽きさせずにプレイさせるかというところで、若干邪道な方法に、ノベル部分以外にミニゲーム的な要素を加えてそっちをめちゃくちゃ面白くする(場合によってはそちらをメインにしてノベル部分がむしろおまけでもよい)というやつ。
商業ゲームではこの方法のものをたまに見る。ミニゲームが面白いからついやっちゃう的な。アレとかアレとか。

安易な選択肢の導入

ノベルゲームというからにはゲーム性がないといけないということで選択肢を導入しているゲームは割とよくある。
けれど、選択肢によってシナリオが分岐し、それによってエンディングまで変わる必要性はどこにあるの、っていいたくなることはよくある。
選んだ選択肢でTRUE ENDとかBAD ENDとか別れてしまうのであれば、実質製作者の決めた選択肢を選ぶことを強要されているので自由度が増してる感じが全くしない。無駄に周回プレイを強要させるのは基本的に悪手だと思う。
あとは、どうでもよさそうな選択を1回間違えるだけで結末が大きく変わったり事実がねじ曲げられる系とか。プレイヤーからしたら意味不明だと思う。

ただし例外的に選択肢を導入することに意味のある場合が少なくとも3つはあると思う。もしかしたらもっとあるかも。
1つ目は、選択肢を選んだ結果が平等になる場合。商業のいわゆるキャラゲー(ストーリーよりキャラクターとの会話とかキャラクターに関するエピソードを楽しむやつ)ならこういうのは結構よくある。要はプレイヤーはどのキャラとくっつくかが選べるだけで、それ以外にシナリオ的な差異は発生しない。この場合は周回プレイを強要しないし、どれを選んでも望んだ結末(選んだキャラとくっつく)が得られるのでそういう意味ではエンディングが平等なので平和だ。
2つ目は、選択肢にメタ的な意味がある場合。一番安易なものとしてよくある「ループもの」ノベルゲームなら、周回プレイをさせることにすら意味がある場合がある。そういう感じで選択肢を選ばせることにも意味を持たせられれば十分選択肢を出す理由になる。ただしこれもシナリオの書き方の問題で、何度も何度も似たようなエンディングを通らないと真のエンディングに到達しないみたいなのはそれはそれで問題な気がする。
3つ目は、選択肢を選ぶ行為がシミュレーション要素を含んでいる場合。シナリオ攻略のために選択肢があるわけじゃなくて、プレイヤーの行動コマンドとして選択肢が使われている場合。アレとかね。これはちゃんとゲーム性があるのでいいと思う。この方針で真面目に遊べるものを作るのはかなり大変だと思うけどそれはまた別の話だ。

いずれにせよ、本当にこのゲームには選択肢がいるの?というのは作る側にとっては結構大事な問だと思う。
あとはエンディングは本当にそれだけ必要なの?BAD ENDになった後は最初からやらせる必要性があるの?とか。
製作者の自己満足を「プレイ自由度」とか「ゲーム性」って言葉でごまかしてないかと。

説明セリフ

慣れの問題だと思うけど説明セリフがどうも気になるので気をつけたい。(自戒を込めて)
そもそもそのイベント自体、キャラクターの性格を説明するためのものだよね?ってのがプレイヤーに伝わってしまっているやつ。
主人公とクラスメイトが謎の三文芝居をやったあと、ト書きで「こいつはいつもこんな調子だ。」とか説明するやつ。
キャラギャルゲーとかに顕著。アレとかね。

会話の発散

会話の進みは2人の時と3人以上の時で全く違うという気がする。
2人会話は、会話イベントの目的が決まっていると一直線な会話になりやすい。のであまりコレばかりだと単調になりやすい。
3人以上のキャラクターがいると、各人が好き勝手しゃべるので全然話が目的の方向に収束しない。ので、ページを稼ぎたい場合は無理にでも人を増やすのはかなり効果的だと思う。

情景描写

ノベルゲームでの情景描写は絵との乖離が発生しやすいので注意が必要だけれど、人間には五感があるので視覚以外の情報をプレイヤーに伝える意味での情景描写は結構重要だと思う。
特にその場所の匂いと現在吹いている風の様子を描写するのは強力だと思う。
割とどこでもやりやすいことと、適当書いても他の記述と矛盾しにくいので。

ループものも飽和している

上の記述と矛盾しているような気もするけどループものは正直すでに飽和しているので、このジャンルで斬新さで勝負するのはもう難しい気がする。
というかループ設定持ち出すと他のループものと比較されやすいので安易に使うのは危険かもしれない。
時系列がバラバラの話が1つにまとまるみたいな手法をループ以外で実現できると、同じような方向性でもまた印象が変わりそう。


終わり。
意見は人それぞれだと思います。