WWAevalマニュアル

WWAevalのマニュアルです。ここには詳細な仕様についての記述しかないので、おおまかな使用手順については解説マップサンプル集を見てください。

このマニュアルは最新バージョンに合わせて作られています。古いバージョンにはない機能などがあるので注意してください。

導入方法

  1. WWA.classのあるフォルダに、トップページからダウンロードできるzipファイルにある と、Java文字列内の式の解釈/演算クラス(Hishidama's Java-Eval class)からダウンロードできるeval.jarを設置する。
  2. WWA実行用HTMLのapplet要素の開始タグを以下のように書き換える。
    <APPLET CODE="WWA.class" WIDTH=560 HEIGHT=440>
    <applet id="WWAevalApplet" code="WWAevalApplet.class" archive="eval.jar" width=1 height=1>
    </applet>
    <applet code="WWAextend.class" archive="eval.jar" width=560 height=440>

    Arunekoさんがこの書き換え処理を済ませたXHTMLファイルを自動生成する補助ソフトを作ってくれました。

バージョンアップ方法

WWAevalを古いバージョンから新しいものに更新するには、zipファイルにある拡張子が「.class」のファイルで古いファイルを全て上書きしてください。

拡張モード

拡張モードとは、WWAevalの拡張構文を使用できる状態のことを指します。

WWAevalでは拡張構文としてeval文拡張マクロ文を実装しています。しかし、これらには後述の副作用があるため、単純にメッセージイベントを作っただけでは拡張モードにならないようになっています。

拡張モードになるための条件

以下の条件で拡張モードになります。

次の種類のパーツでマクロ文$wwaevalを使い、拡張構文の使用を宣言したとき
次のマクロ文を使ってメッセージパーツを呼び出したとき

マクロ文$wwaevalは設定変更で省略することもできます。

拡張モードの副作用

拡張モード時には内部でパーツのイベントを実行しない設定にしているので、以下の副作用があります。

これらの問題は連続イベントを用いれば一応解決できます。

eval文

eval文は、「@{」と「}@」で囲まれた文のことを指します。

メッセージを表示するときに、@{ }@で囲まれた文章をプログラミング言語の式として解釈し、その式を評価した値を表示します。

eval文を使用することで、変数に対し色々な計算処理を行うことができます。

文法

若干の違いを除き、Javaの文法と同じ方法で記述します。文字列はダブルクォーテーション("")で囲みます。
詳しくは四則演算実行クラスで使用できる演算子を見てください。

使用できる文章の位置

基本的に、文章中のどこでもeval文を使用できます。ただし、<c>以降のコメントと、マクロ文の左辺では使えません。
また、eval文は複数行にまたがることができ、文内の改行は無視されます。

変数の使用

eval文では変数を使用することができます。使用できる変数は、変数一覧を参照してください。

一時変数

一時変数は、1つのイベント内でのみ値が保存され、イベント実行後には破棄される変数です。

eval文内では、他の変数・定数と被らず、アンダーバー(_)以外の記号を使っていない任意の文字列を一時変数として扱います。日本語でも一時変数になります。

一時変数の名前は今後のWWAevalの更新によって新しい変数のものと重複する可能性があります。現時点で確実に重複しないと保障できるものは、変数名に日本語が含まれているもののみです。

eval文内では単純な数値か文字列以外の変数を直接作成することができないので、一部を一時変数として事前に定義しています

関数の使用

eval文内では「関数名(引数)」という形で関数を使用できます。使用できる関数は以下の通りです。

ネスト

eval文は手抜きなのでそのままではネストすることはできません。そのかわり、@{ }@で囲まれたeval文の内側で同等の機能の@< >@で囲まれた文を使用することができます。

が、わかりづらいのでネストはあまり使用しないほうがいい気もします。

プレイヤーの体力が300未満なら攻撃力を、300以上なら防御力を50上げる
@{ @< hp < 300 ? "at" : "df" >@ += 50 }@

拡張マクロ文

WWAevalでは条件分岐やアイテム操作などが行える拡張マクロ文を実装しています。使用できるマクロ文については、拡張マクロ文一覧を参照してください。

$pictによる画像表示機能

$pictはWWAevalの拡張マクロ文の1つですが、機能が複雑なためここで詳しい説明をします。

$pictを使うと、画面に画像を表示します。この画像は動かしたり、イベントを発動したりすることができます。プログラミンでいうところの「絵」だよ!

$pict表示される画像はマクロ文$pictで直接指定するものではありません。$pictを使ったパーツとは別に、物体パーツを1つ使って画像データを作成します。マクロ文$pictはその事前に作られた画像データを呼び出すことだけを行います。

物体パーツに$pict_defineと書き込むと、その物体パーツは画像データ作成用の物体になります。$pict_defineの次の行から画像データの属性を書いていきます。

使用できる画像データの属性については、$pictの属性一覧を参照してください。

使用例

dispという表示位置属性のみを設定した簡単な例です。
プレイヤーの右下にある攻撃エフェクトが$pictを使って描画したものです。
$pictの使用例

画像番号

画像番号は、表示する画像イベントの管理に使用する番号です。

1つの画像番号につき1つの画像イベントが割り当てられるため、既に使用されている画像番号に新しい画像イベントを指定すると前の画像イベントは消去されます。また、画像番号は表示順にも使用され、番号が大きいものが前面になるように描画されます。

画像番号はデフォルトでは0から9までの10個が使用可能です。全体設定用パーツ$pict_lengthマクロ文を使えば最大で0から39まで使用できるようになります(その分Valiable変数を消費します)。

無名画像イベント

画像番号に-1を指定すると、その画像イベントは無名になります。この無名画像イベントには以下の特徴があります。

番号重複の心配がないので、ちょっとしたエフェクトのようにセーブする必要がないものは無名にするといいでしょう。

拡張構文(拡張マクロ文とeval文)の使用

$pict_defineでの画像の定義は通常のメッセージイベントとは呼び出され方が違います。そのため、WWA本来のマクロ文は一切使用できません。WWAevalの拡張構文に限り使用することができます。

拡張構文は高速化のため画像データを生成するときにしか実行されないので、画像表示中にeval文で使用した変数の値が変わっても反映されません。connect属性で画像を引き継ぐときはその都度evalが実行されるので、リアルタイムに変数の値を反映させる場合はconnect属性で自分自身を再帰的に呼び出してください。

また、後述のセーブの仕様のため、拡張構文はいつ何回呼び出されるかはわかりません。wait属性やend属性で安全性が確保されているとき以外はeval文の使用は変数の参照のみにとどめ、変数の値の変更はしないようにしてください。

$pictとセーブ・ロードの関係

WWAの仕様上、セーブデータにはあまり多くのデータを保存しておくことができません。そのため、$pictの画像イベントの情報は「画像番号」「画像データが記述してある物体の番号」「引数」の3つの数値以外は、データのセーブでは保存されずロードでも復元されません。

セーブデータがロードされると、WWAevalは全ての画像データを再定義します。セーブしたときに表示されていた画像は、全て最初から(もしくはconnectcreateされたときから)表示し直されます。このとき、

という画像表示中にセーブ・ロードができない場合か、無名画像イベントである場合を除き、拡張構文が任意の回数分評価されてしまいます。ここで変数の変更を行っている場合ユーザーが好きなだけ変数の値を変更できてしまいます。

また、eval文を参照のみで使ったとしても、データロードで変数の評価のタイミングが違うと自ずと変数の値も変わります(特にPlayerXPlayerYで顕著)。put属性を使わなければ画像の表示が若干おかしくなるだけですが、put属性を使った場合は出現パーツをプレイヤーが好きな位置に出現させられてしまう可能性があるのでそのことに留意してください。

画像置換機能

画像置換機能は、オリジナルのGIFの分割画像の1つを、別の画像ファイルのデータに置き換えるという機能です。

置き換える画像にはgif形式のほかにpng、jpg形式も使えます。フルカラーjpg・半透明png・アニメgifをWWA内で他の分割画像と同等の方法で使用することができます。

使用手順

なぜか画像形式。
画像置換機能の使用手順

注意点

Javascript連携機能

Javascript連携機能は、WWAからJavascriptを呼び出したり、JavascriptからWWAにアクセスする機能です。

Javascript連携機能の有効化

Javascriptの使用には下で説明する問題点があるため、WWAevalはデフォルトではJavascript連携機能を無効にしています。

Javascript連携機能を使うには、全体設定用パーツでマクロ文$usejsを使ってJavascriptの使用を宣言してください。 とくに理由がなければ、「$usejs=2」と記述します。このマクロ文はゲーム開始時に解釈されるので、ゲーム中で途中でJavascriptを使うかどうかを変えることはできません。

Javascript関数の呼び出し

CallJS関数$calljs文でJavascript関数を呼び出します。

JavascriptからWWAへのアクセス

Javascript連携関数を使ってアクセスできます。

eval文で使える変数の取得・変更ができます。

Javascript連携の問題点

Javascript連携機能を使うと動的なイベントを実行することができますが、HTMLソースを書き換えることにより簡単にゲームデータの改ざんができてしまうという問題があります。

例えば、サンプルのWWAデバッガーではステータス値などをいじることができますが、 このようなことが他のJavascriptからWWAへのアクセスを許可したゲームでもできてしまいます。 ランキングなどのCGIと連携したWWAではこの機能を使わないようにすることを推奨します。

もしビジュアル効果のみを目的にJavascript連携機能を使い、ステータス変更などをしないのなら、次のようにしてください。

詳しい説明は省きますが、こうするとゲームデータの改ざんの危険性を最小限にすることができます。 (サンプルのエフェクト集ゲームナビゲーターでも同様の手法を取っています)

ブラウザのバージョン

Javascript連携機能は、次のバージョンのブラウザで動作します。

しかし、使用するJavascriptのソースコードの内容によっては、これよりもさらにバージョンの制限が厳しくなることがあります。
(例えば、WWAデバッガーは現時点でSafariで動作しません)

Javascript連携機能を使うなら、複数のブラウザの最新版で動作チェックをして、 プレイヤーに動作確認ができたブラウザを通知したほうがいいでしょう。

その他細かい仕様とか

WWAevalで使用しているValiable変数

初期状態のWWAevalでは60から89番までのValiable変数を内部で使用しています。また、WWA本体では90から99番まではシステム予約となっています。不具合が起きるかもしれないのでこれらの変数を使用しないようにしてください。

作成者側で使用できる変数は0番から59番までの60個のみです。

変数足りないがな…。

WWAevalが使用している変数のうち、79番以前は$pictで使用しているものです。
もし$pictを全く使わないのであれば、全体設定用パーツ$pict_length=0 とすることで 作成者側が使える変数を0番から79番までの80個に増やすことができます。

大文字と小文字の区別

eval文で使用する変数や関数
大文字と小文字は区別される。
マクロ文や$pictの属性
大文字と小文字は区別されない。

アンダーバー(_)があるものもありますが、気分であったりなかったりします。わかりづらい・・・。

命令文が実行される順番

この拡張を使用したイベントは、「WWAevalの拡張構文→既存のマクロ文($move以外)→メッセージの表示」という順番で処理が実行されます。同じ種類のものであれば書いた順番で処理されますが、既存のマクロ文はどの位置にあってもWWAevalによる拡張文の後に実行されます(<p>含む)。

$wwaeval
$map=1,2,3
$if=@{Object[3][2] == 1}@
真
$else
偽
$endif
$map=0,2,3

このサンプルのif文は常に真になるように見えますが、$mapが実行されるのはWWAevalの文章解析が終わった後なので、元々X=2,Y=3に物体1がない限りはif文は偽になります。

変数の型

WWAで使われてる変数の数値の型は全て整数値になっています。そのような変数に小数点を含む数値を代入した場合、小数点以下は自動的に切り捨てられます。eval文中では小数を含む数値も使用できます。

eval文内での変数の型の厳密性は、JavaよりはゆるくJavaScriptよりは厳しくなっています。上記のように小数を含む数値を整数の変数に代入できますが、文字列を数値のように扱ったりはできず、エラーになります。適宜toString関数parseDouble関数を使ってください。

変数の値域

変数の数値には上限と下限があります。範囲を超えるとオーバーフローや値の切り詰めなどが起こり、予期しない動作をするかもしれません。

下の表の「推奨上限」と「推奨下限」はWWA本体で使用できると確定されている範囲です。

「実際の上限」「実際の下限」は一応使用できるものの、許可されたものではない範囲です。できれば使用しないのが賢明です。

変数名実際の下限推奨下限推奨上限実際の上限
Map 00パーツ最大数32767
Object
Strength -53506500065000
Defence
Gold
Valiable
一時変数約-20億約-20億約20億約20億
その他006500065000

WWA本体の内部変数へのアクセス

これらは本来外部からアクセスされるべきではないWWAの内部変数にアクセスすることで機能を実現させています。WWA本体がバージョンアップすると互換性がなくなる可能性があります。

というか、内部変数へのアクセス以外にも確定仕様ではないところをガチガチに利用しているので、バージョンアップしたらほぼ確実に何かしらでバグります。すいません・・・

WWA複数起動による干渉

クラス間の変数受け渡しのためにstatic変数を使っている関係で、 拡張クラスを使用したWWAを同じフォルダから複数同時に起動すると干渉しあって誤動作します。

…とのことなのでWWAevalにおいても干渉が発生します。不正に変数の値などを書き換えることができるかもしれないので、WWAevalでは干渉が発生した場合はそのクラスファイルに関わる全てのWWAを停止させます。この場合ゲームを続行することはできないし、ゲームの進行状況などのデータは失われます。

この干渉は同じフォルダのWWAを複数起動している場合に発生します。が、検出方法は手抜きなので、一度干渉が検出されるとその後ずっとWWAが起動できなくなることがあります。その場合はJavaを再起動すれば直ります。

マップ破損バグ

WWAevalを使用していると、

という現象が起こることがあります。これは1バイト文字を多用したときに起こるWWAのバグで、原理的にはWWAevalを使っていなくても発生します。

詳しい解説は省きますが、このバグは全てのメッセージの容量を1000バイト未満にし(この時点で7割方直る)、 内容が「a」という1文字だけのメッセージパーツをコピペで大量に(具体的にはバグって表示されるワールド名が「a」になるまで)作れば高確率で直ります。

1000バイトを超えたメッセージを探すのが大変だって? EclipseでWWAをデバッグモードで起動するという高度な荒技もあるけど。基本的には記憶を頼りに総当たりするしかないか…

Javaのバージョン

WWAevalでは正規表現や同期コレクションなどの高水準な機能を使っているため、マイクロソフト製VMなどの古いJavaとの互換性がありません。 現在のところ、動作可能なJavaのバージョンは1.5以上です。

コンパイル方法

WWAevalはソースコードを公開しているので、プログラム内容を改造したりパッチを当てたりできます。 当然ですが、ソースの書き換えにはJava言語の知識が必要です。

ver6.0以降のWWAevalをコンパイルする場合は、ソースファイルのあるフォルダで次のコマンドを打ってください。

javac -encoding utf-8 -cp "eval.jar;C:\Program Files (x86)\Java\jre6\lib\plugin.jar" *.java -target 1.5 -source 1.5

plugin.jarの位置は「(jreをインストールしたフォルダ)/lib/plugin.jar」になるので、環境に合わせて適宜変更してください。

以下の説明はver5.2以前のものです。 初期設定をマクロ文で行うようにしたので、ver6.0からは設定変更のためにWWAevalをコンパイルする必要はありません。

WWAevalでは設定の変更にJavaファイルをコンパイルする必要があるものがありますが、WWAevalの仕様によりデフォルトのWWA拡張クラスとコンパイル方法が異なっています。のでここでコンパイル方法を簡単に説明します。

コンパイルするにはまずJava開発環境を整備する必要があります。コンパイルにコマンドプロンプトを使用する場合、Java初心者入門講座: ■Java言語の開発環境の準備の説明が丁寧で分かりやすいのでそちらを見てください。

コマンドプロンプトでWWAevalのjavaファイルがあるフォルダへ移動し、

javac -cp eval.jar *.java -target 1.4 -source 1.4

とコマンド入力すればうまくコンパイルできるはずです。「'javac' は内部コマンドまたは外部コマンド...として認識されていません」というエラーがでた場合はJava開発環境がないか、環境変数のPathが正しく設定されてません。「パッケージ jp.hishidama.eval は存在しません。」というエラー(をはじめとした大量のエラー)が出た場合はeval.jarがダウンロードされていません

コンパイルに成功した場合、「WWAextend の書き込み中にエラーが...」というエラーが出ますが、これで正しい動作です。エラーが何も出なかった場合はWWAextend.classが上書きされてしまっています。WWAextend.classはファイルのプロパティで上書き禁止にしてください。

$wwaeval宣言の省略

全体設定用パーツ$need_wwaeval=0 と設定すると$wwaeval宣言なしでも拡張モードになります。
(ver5.2以前の方法の、WWAextendSub.javaの150行目付近にあるWWAeval_needsDeclare変数をfalseにしてコンパイルすることでも同様の効果になります)

副作用を無視できる新作マップの作成時などに利用してください。

また、この場合でもメッセージの文頭で$no_wwaevalと宣言すれば拡張モードから一時的に抜けることができます(マクロ文から呼び出されるパーツでは無効)。

仕様変更で互換性がなくなったもの

仕様変更によって、以前のバージョンでできたことがなくなったものがあります。

全てのバージョン
WWAevalではeval文で使える変数や定数をたまに追加しています。そのため旧バージョンで一時変数として使えていたものが重複して使えなくなることがあります。
ver6.0
動作可能なJavaのバージョンが1.4以上から1.5以上になりました。
画像番号のデフォルトの最大値が9に減りました。これにより使用できるシステム変数が増えましたが、10以上の画像番号を使っているゲームはうまく動作しなくなります。その場合は$pict_length=20 としてください。
ver5.0
DirXYなどのXY2つの座標を返す関数の戻り値が、配列ではなくCoordクラスになりました。
$pictで呼び出されるパーツの拡張構文の実行が、次のフレームではなく$pictを呼び出したパーツのイベント実行中になりました。(2010/9/22追記。指摘してくれた方ありがとうございます。)
ver4.0
使用しているシステム変数が、70から89までの20個から40から89までの50個になりました。
それにより、使用できる$pictの画像番号が最大まで増やしても0から39までの40個までになりました。
ver1.1
%[ ]%文がなくなりました。現バージョンでは同じものがeval文内で使用できます(が、文字列は"文字列"のように""で囲む必要があります)。
GetMessage/SetMessage関数がなくなりました。現バージョンでは文字列型の変数が普通にeval文内で使用できます。

ナビゲーション