前回:
[テキストだけのエロゲーを作るvol.3 - 111のデジ同人感想]
次回:
[テキストだけのエロゲーを作るvol.5 - 111のデジ同人感想]

プログラム構造とゲーム。コンセプトが根本の共通点


先週でそれなりにテキストを書ける体制が整ったので、今週は一気にイベント実装を進めた。
だがここでまた気に入らないことが発生。

ごちゃごちゃ

↑こんな感じで、各行動の中に各キャラのイベントを列挙するのだが、今までの仲間1匹から5匹となり、非常に雑然とする。

革命度が高い状態だと犬に出会えるけど、仲間にするには3回会わないとだめ、仲間になった後も変化するイベントが…
と条件とキャラが、あっちこっちへ行っちゃう。

それを何とか分かりやすい形にしようと、またプログラムを整理。

今までは各行動の後にこんな感じで書いてたのが
if(this.friend.indexOf("亀") < 0){
if(this.action == 1){
// 色々な処理
}
}


var Char = {
has : false ,
randomEvent : function(){} ,
charEvent : function(){}
}
//
var kame = $.extend({} , Char, {
title : "亀" ,
randomEvent : function(){
if(Player.action == 1){
// 色々な処理
}
}
});

こんな風にキャラクターごとにオブジェクトを作り、諸条件はrandomEventの中に詰め込む。
つまり、

バズーカを振る→亀とのイベントチェック
竿だけ売る→犬とのイベントチェック
という流れが、

亀とのイベント→バズーカ降ってるかチェック
犬とのイベント→竿竹売ってるかチェック
という逆になったのだね。

それに伴い、そもそも”亀を仲間にしているか?”という文法も
if(this.friend.indexOf("亀") > 0)

と書いてたのが、
if(this.has)

で分かるように。

なぜなら一つ目は各コマンド内に記述で、「Playerの友達の…」という回りくどい照会が必要だが、
二つ目はそのものずばり、カメというキャラクターオブジェクトの中に記述する=つまりthisでカメを指せるようになるから。

中年修正中…(やっぱり2回くらい直しました)

一見、縦の物を横にしただけじゃねえか、という所だが、今回に限ってはかなり簡潔になったのではないかと思う。
(こねくり回した挙句、「前の方が良かったじゃん…」ってなる時もある)


前に「表現したいコンセプトに合わせて、ゲームシステムを考えようじゃないか」って書いたけども(体験重視のゲームデザイン)
不思議な事に、プログラムの整理(リファクタリング)でさえ、それに沿うと成功しやすい気がした。

つまり表現したい物があり、それを形づくる為にプログラムがあるのだから、
プログラムのコードも「表現したい事はなんなのか?」に向きあう事が大切。
そうすれば、自然と則したデータ構造になる…?

「今回はネコバというキャラゲーで、これは仲間とかが大事だから」って考えたシステムで、実際、コマンドに付いてたイベントを、各キャラごとに割り振ったら、非常にすっきりしたという。

(逆にプログラムからフィードバックを受け、ゲーム性が変化する事もあるかもだし、ツールでの開発は、決められたデータ構造にコンセプトを閉じ込めること…かも知れない…)

形を変えるプログラムとゲーム…。
コンセプトという大本で、不思議にぷらぷらと繋がっている気がした。

ゲームがゲームになる瞬間を見たい


自分は[脱衣STG]で初めて縦STGを作ったのだけど、家庭用のデザエモン等で遊んでた身としては
「STGとか、弾をばーっとやれば簡単やろー」と思ってたのが、たまげた。
まぁ出来上がったものを見ても全然面白くない、というか、そもそも”自機が弾を撃ってる”感覚さえ無いのだ。

ボタンを押す、そりゃ確かに自機から弾が出て、飛んで行く。
だが「ただそれだけの表示」であり、「プログラム通りに実行しているな…」という無味乾燥な手触りにしかならなかったのである。

そこから、「弾を撃った時の効果音のタイミング」「反動で自機が震える(しかも毎回1って感じじゃなく、1,2,1みたいなリズムで?)」
「弾の射出位置を半歩前に出す」
「どうやら見てて気持ち良い、動きを制御する関数とかあるらしい」
とか、今までの作品を思い出したり調べたりして、少しはマシになった。

今までSTGをわーい爽快だな、とやってきたが、まあその限りにおいて、全然分かってなかったのである。

悪意のあるネコバカット1

この問題は市販の製作ツールを使って作るなら簡単に解決するが、
ことツール製作の範囲から外れると、何も分かって無さと、今まで事もなげに味わってきたゲーム性や手触り…というノウハウの山に、くらくらとしさえする。

自分は、どの瞬間、何を採用した時に「面白く」なるか、
つまり「ゲームがゲームになる」のはどういった作用なのか…
その「果てしない物」を知りたくて、イチからやっているのかも知れない。

それは言わばゲームの本質であり、既に確立したゲームジャンル以外…、体験重視のデザインを作ろうとする時に、きっと必要なのではありますまいか。
(単に自分の苦労をこじつけで、正当化してる気もする…)

111先生のお手本


という訳で、80%くらいイベントを実装、理論上はクリアまで行けるようになりました。

45417787
クリックでゲームに飛びます

zipはここ。

が、ひたすらテキストを打ち込むことに集中、全然デバッグしてないので多分途中でバグる。
(とりあえずイベントが立て込んだ時のテキスト前後がひどい)

一応ゲーム的に気を付けたのは、
”段階を踏んでる事が変化で分かる”ことで、今でも酷いRPGにはありがちですが、
『◯◯に行って、XXを調べ、△△と話す』
という時に、きっちり順に調べないと特別な反応を返さないとか、ダメでしょう。

そこはいきなり△△と話せば「おヌシはまだ必要なものを持っておらん!」とか言わせると分かりやすいし、
◯◯まで進んだなら、「あとは何か先の尖った物(XX)さえあれば…」と、プレイヤーに途中経過で正しいよ、とアサインしてあげるのも基本。

そうしないと、せっかく◯◯まで行けたのに「あれ?(何も起こんないな…)もしかして前の場所で、まだ何かしなくちゃいけなかった?」とか戻って不要な混乱、気分は最悪、となったりもする。

そうやって自力で解決した感を醸すから楽しいのであって、”別途、正解メモ用意しました”ってのはどうなんでしょう…解決としてはかなりまずいレベルでは。
仕方ない場合もあるけど…


本作は適当にテキストが楽しければOKなのでそこまでシビアじゃ無いけど、
このテキストゲーをクリアしてやろうかと思い立った時、真っ先に「どうなったらクリアか分からねーよ(そもそも目的が分からねーよ)」が浮かぶので、その導線が居ると。

これをステップで逆に紐解くと、
3.仲間を5人揃える

2.仲間を1人揃える

1.仲間が出現するための条件を揃える

という所まで、構成要素を小さくできる。

具体的には、バズーカを振って革命度を溜めるといぬが出現するけど、それが起きるまでに、「最近調子いいわー」みたいなセリフ変化があったり、バズーカ振りが違うコマンド名になったり。

仮にそうやっていぬが仲間になった時、プレイヤーが考えるのは「じゃあ他のパラメーター上げれば、別のキャラも出る?」
だろうから、2人めはまっすぐその通り、3人めはちょっと捻りをかましたりとかすると、少し楽しいだろう。

まぁその辺がまだ実装し切れてない、残り20%なんですけどね…!!

次回課題(プログラムの自由度と、実際上のコスト…)


その辺をきちっとやるには、デバックのしやすさ・実装しやすさも大事になってくる。
(でないとムダに試行回数は増え、志はあれど体力・時間の限界が先に来る。
やっぱ何だかんだ、既存の製作ツールは有利…)

悪意のあるネコバカット2

例えば現状、デバッグがしにくかったり(ツール付属の便利機能など無いのだ)
そもそも、
Player.money -= 200;
MIP.writeText("猫「ネコバ一家から犯罪者がでるとはなー もうやるなよ");
MIP.writeText("モ「ネコバ君済まない、奴らの拷問に耐え切れず
君からの依頼という事にしてしまったよ");
MIP.writeText("猫「やめろって!");

みたいにコード中で書いてるけど、これがもう冗長だよね。

いや、MIP.writeTextはもう分かったから! 一回書けばええやろ! って感じ。

ここはイベントIDに紐付けて、
text_event(21);
とだけ書いて呼び出せるのが理想だし、そのイベントの記述も
event21.txtというテキストファイルに
猫「ネコバ一家から犯罪者がでるとはなー もうやるなよ
モ「ネコバ君済まない、奴らの拷問に耐え切れず
君からの依頼という事にしてしまったよ
@money,-200

みたいに、ほぼ特別な記述無しで管理できるのが、良さそうに見える。

(冒頭では格好良い事を言ったが、大体はこんな、どぶさらいのような細々とした事をやるのである。
テキストゲーを作るだけのはずが、なぜエンジン作りみたいになっているのだ…?)

ゲーム演出的には、パラメーターが増減した時に何か考えなくちゃいかんだろうし、クリック待ちが続いた時に、コマンドメニューがチカチカするのが気になるよね…とか。
まあ次回以降の課題という事で…。


製作は面白いけど、ちゃんと作ろうとすると、ゲームは時間が掛かるのだった。