ノベルゲー用スクリプトエンジンの適当な説明

FlashLite1.1で動く、Flashスクリプトエンジンを、仕事で作ってました。
残念ながら仕事なのでコードや詳細は書けませんが、あまりこういうエントリーを見かけなかったので。
この落書きが誰かの何かのヒントになれば。


「やってできないことはない」


先週末は、こんなの無理だーと思ってましたが、頭使って工夫して、あとはとにかく書きまくってればなんとかなるものですね。
最近は大容量が当たり前になってきているので、FlashLite1.1の、「ドコモは外部読み込みファイル含め100KBまで」という制限はかなりきついものがありました。

でも今一応ゲームみたいなものが作れてます。

自分一人だと、壁に当たった時にすぐやめてしまう根性無しですが、仕事という枷のお陰でなんとかまた前に進むことができました。


今のところ容量制限回避のコツとしては、「シーンごとにswfファイル自体を切り替える」ですかね。背景は一枚だけ読み込むようにして、シーンが切り替わったらgetURLで保存処理を行うPHPファイルなどに飛ばして値をDB等に保存しておき、再度PHPからswfを書き出すことによって固有IDごとのセッションが維持できるので、何でもかんでも突っ込んで100KBに抑える必要が無いです。シーンごとに登場キャラを限るとかすれば、思いっきりキャラクターアニメーション等に容量を割くことができます。
まあちょっとリダイレクトリダイレクトっていうのがテンポが悪いかな、とも思いますが、swf一つあたりの容量も小さくて済みますし、シナリオは外部から読み込み、キャラクターの動きや画面を揺らす処理、キャラの名前表示、文章の色変更などもシナリオファイル内から指示できるエンジンを作ったので、別ゲームの制作も容易です。よくある、「絵とシナリオ差し替えて別ゲー商法」ですね。そんな商法があるのか知りませんが、多分あるでしょう。

テキストファイルには変数一つに全ての内容を読み込むように書きます。
一行目に
t=
って書いて、あとはシナリオを普通にがんがん書いていきます。

で、loadVariablesで読み、変数tの中身をwhileで一行ずつ処理していきます。
配列が使えないのも難点ですが、擬似的に配列をシミュレートする方法はお馴染みですね。
Stringクラスが無い分、結構力技な解析方法になりがちですが、スクリプト記法の煩わしさに多少我慢してもらうことで意外となんとかなりました。
行単位の読み込みは改行コードで区切ろうと思ってたら普通のstringでは空白になってしまってうまくとれなかったので、mbord関数でASCIIコードに変換して読んでます。改行コードはCRとLF、CR+LFがあるので、シナリオファイル側でも保存時には気をつけないといけないところです。
あとこれは記法の仕様作成時に気をつけないといけないのですが、ASCIIコードに変換しようとしても、swfに読み込んだ時点で飛ばされてしまう文字もいくつかあるみたいで…%とかは使えないみたいですね、あと&は変数の区切りに使われるものですから普通に危険そうです。エンジンの仕様はしっかりメモして、シナリオライターさんにがんばってもらいましょう。

多分もっと効率の良いやり方がありそうですけど、今はとりあえず動くものを早く出したいので仕方ないです。

PHPを使って固有IDをswfの外側で引き回せるということは、マップ(シーン)移動用のファイルやその他ミニゲーム用のファイル、エンディング用のファイルなども別々に作って連動させることができるので、表現の幅がかなり広がったと言えます。一つのシーンに全て詰め込むことはできませんが、分けて作ってあげればかなり大規模なゲームも作れるのではないでしょうか。





基本基本と言いながら書いてくれるところが少ないので一応TIPSとして。

文章の色変更ですが、FlashLite1.1ではtextformatクラスが無いので一筋縄ではいきません。色はダイナミックテキストの色を変えてやる必要があります。しかしこれでは外部から動的に変化させることができないので、
フレーム1
フレーム2
フレーム3
に、同じ変数を持ったダイナミックテキストフィールドを作ります。
で、それぞれのフレームでテキストの文字色を変えておき、色変更の命令がきたらtellTargetでgotoAndStopしてやります。
そうすると色が変えられます。わかるかな…。



画面を揺らす処理は、
ゲーム画面を構成する一番表側のムービークリップのx座標とy座標をrandom(10)-5とか適当な値を何回か突っ込んでやれば揺らせます。


そんな感じです。

スクリプトエンジン作成にあたっては、NScripterでのゲーム制作経験が役に立ちました。
あと専門の時に勉強したTiSE…でしたっけ、講師が作ったエンジンなのですが、あの時教わったスクリプトエンジンの仕組みは今も頭に残ってて、かなり参考になりました。さりげなく糧になってるんだなあ。
(ふろ○あん先生、ありがとうございます。ダメ学生でゲーム業界に入れなかったはぐれ者ですが、今もゲーム作ってます)


やるぜーって言ってから相当時間が経ってしまいましたが、だんだん掴めてきたのでこれからもがんばります。