WWA Script入門:コピペ可、サンプル配布あり!色々やってみよう
この記事は WWA Advent Calendar の4日目です。
はじめに
WWAクリエイターのアルクスです。
今回の記事はWWA Scriptの入門的な記事ということで書いていきます。
プログラミング慣れしている方であれば「Notion見ておいで」で片付きそうな内容ですが、そんな人はあまり多くないというのが実情。
やれる幅は広がったのに、使える人が限られると勿体ないよねーということで、今回の記事です。
初心者向けを意識しておりますので、分かりにくいという意見をいただいた箇所があれば随時アップデートしていきます。(更新時は後述のDiscordサーバーでもお知らせいたしますので、宜しくお願い致します)
不安定版のダウンロード
WWA Scriptは、安定版だと使用できません。
下記から、不安定版を入手した上でWWA作成を行うようにしてください。

ケーブダンジョン2にScriptを導入するサンプル
1からサンプルマップを作成していくのは大変なので、WWA Wingのファイル一式に同封されている『caves02』をベースに、色々とやってみましょう。
【留意事項】
入門編ということで、今回の記事内で紹介しているサンプルスクリプトではjsファイルを使用しておらず、変数もほとんど活用しておりません。
応用編の記事も執筆予定ですが、それらを用いて
色々とやれそうな方は自力でチャレンジしてみてください!
アイテムの所持有無でセリフを変える
状況に応じて、おじいさんのセリフを分岐させてみましょう。




<script>
if(HAS_ITEM(34){
MSG("十字架があれば、\nゾンビたちも楽に倒せるぞ。");
}
else{
MSG("バンパイアを倒すには、\n十字架というアイテムが\n必要になるらしい。\nこれより下の階のどこかに\nあるらしいが・・・。");
}
今回は「何やっているのか分からん!」という方をターゲットにした記事なので、詳しく解説していきます。
※「全然詳しくねえ!」とかあったら遠慮なくお願いします。
<script>
パーツ内でWWA Scriptを使用する時には、まず最初にこれを書きます。
if(○○){
△△
}
else{
××
}
「もし○○なら、△△する。そうでないなら、××する」
という命令をここに記載します。
今回の場合だと……
○○:物体パーツ34(十字架)を持っている?
△△:十字架がある場合のメッセージを出す処理
××:十字架がない場合のメッセージを出す処理
※elseを使わず、ifだけ書くことも可能です。逆はできません。
HAS_ITEM(○○)
パーツ番号○○のアイテムを持っている?という確認を行う処理です。
基本的には前述のif構文と一緒に使用します。
前述のifと合わせて使います。
MSG(○○)
○○部分に入力した内容をメッセージウィンドウに表示します。
直接日本語を入力できますが、
文字は『""』で囲い、改行は『\n』を文中に入れる必要があります。
MSG("十字架があれば、\nゾンビたちも楽に倒せるぞ。");
/*
十字架があれば、
ゾンビたちも楽に倒せるぞ。
*/
下記は上記の応用です。
(デフォルト)まずは武器を取りなよ
(武器あるよ)次に防具を取りなよ
(どっちもあるよ)ヨシ!
といった具合にメッセージが分岐します。


アイテムボックスの空き有無を確認する
前項『アイテムの所持有無で~』の応用で、HAS_ITEMを用いればアイテムボックスの空きの有無についても簡単に確認できます。
下記はサンプルです。

<script>
if(HAS_ITEM(0)){
MSG("アイテムボックスに空きがあるので、\n鍵を購入することができます。");
}
else{
MSG("アイテムボックスに空きがないので、\n今は鍵を購入できません。");
}
このように、HAS_ITEMで0を指定すると物体パーツ0のアイテムを持っているか(=アイテムボックスの空きがあるか)を調べることができます。
アイテムボックスに空きがある状態で調べることでアイテムを入手するなど、アイデア次第で色々なことに応用ができると思います。

このスクリプトの応用によって動作しています。
(実際に作ろうとすると他にも色々と下準備が必要)
パーツの所在を確認する
o[][]やm[][]を用いることで、指定した座標に特定のパーツがあるか否かを確認することができます。
試しに、最初に十中八九のプレイヤーが回収する剣や盾を拾わなかった場合のイベント『ハードモード』を用意してみましょう。



<script>
//X=1,Y=53に物体パーツ(盾)がある場合
if(o[1][53] != 0){
//盾を撤去
o[1][53] = 0;
//ステータス加算
DF += 1;
//ダンジョン内の装備を弱体化
PARTS(36,33);
//クリアボーナスの配置
o[37][13] = 69;
}
//X=1,Y=54に物体パーツ(剣)がある場合
if(o[1][54] != 0){
//剣を撤去
o[1][54] = 0;
//ステータス加算
AT += 1;
//ダンジョン内の装備を弱体化
PARTS(35,32);
//クリアボーナスの配置
o[33][13] = 69;
}

扉パーツを使わずに扉を作る
アイテムに反応して消滅するパーツとして使う『扉』ですが、WWA Scriptがあれば実はもう必要ありません。
こちらもHAS_ITEMを活用すれば、そういうことができます。


<script>
if(HAS_ITEM(72)){
SOUND(13);
REMOVE_ITEM(72);
o[X][Y] = 91;
o[PX][PY] = 91;
}
何個か、紹介していないものが出てきたので説明しておきましょう!
SOUND(○○)
サウンド番号○○のサウンドを再生します。
『扉』のときは扉が開く時にしかサウンドが鳴りませんでしたが、今回はメッセージパーツを扉として扱っているので、if文の中に入れています。
※SOUND文を入れる場所に注意。
if文の外にあると、扉を開けられなかった場合にも音が鳴ります!
REMOVE_ITEM(○○)
パーツ番号○○のアイテムを取り除きます。
※今回は扉『鍵なくなる』を想定しているので書いていますが、扉の種類『鍵なくならない』の場合は不要です。
o[☆][★]
X座標☆, Y座標★にある物体パーツ番号を取得しています。……と、これは先程も登場したネタですが、今回は『X』『Y』『PX』『PY』という数字ではないものが登場しております。
それぞれ意味があり
X、Y
そのスクリプトが発生したパーツの座標(今回の場合、扉のある座標)
PX、PY
現在のプレイヤーのいる座標
o[X][Y] = 91;
o[PX][PY] = 91;
今回のこれだと、扉の座標と自分の座標それぞれに
↓の演出用パーツを呼び出している感じです。

あえて改造前準拠のまま91参照にしました。
さて、ここまで読んでこう思われた方もいるのではないでしょうか。
『これ別にメッセージでやらなくても良くね? 扉でいいじゃん』と。
ではここで、先程のスクリプトをもう少し補強してみましょう。
<script>
if(HAS_ITEM(31)){ //赤鍵
SOUND(13);
o[X][Y] = 91;
o[PX][PY] = 91;
}
else if(HAS_ITEM(72)){ //黄鍵
SOUND(13);
REMOVE_ITEM(72);
o[X][Y] = 91;
o[PX][PY] = 91;
}
何をやっているかというと
赤色の鍵を持っている場合、黄色の扉を開ける。(鍵なくならない)
赤色の鍵を持っていないが黄色の鍵を持っている場合、黄色の扉を開ける。(鍵なくなる)
どちらにも該当しない場合、黄色の扉を開けない。
といった挙動になっております。このように開け方が複数通りある扉は既存の扉パーツでは作ることができません。(一応、赤鍵を拾った時にPARTSマクロを使えばそれっぽいことはやれますが、1パーツでは無理です。)
【TIPS】
「SOUND(13)」「o[X][Y] = 91」「o[PX][PY] = 91」を2回ずつ書いていて、なんかしつこいなーと思った方もいらっしゃるかもしれません。
実際にここは改良の余地があり、次回の『WWA Script入門』で掘り下げていく予定です。
他にも……
<script>
if(HAS_ITEM(73)){ //青鍵
SOUND(13);
REMOVE_ITEM(73);
o[X][Y] = 94;
o[PX][PY] = 94;
}
else if(DF >= 10){ //防御力10以上
DF -= 10;
SOUND(13);
o[X][Y] = 94;
o[PX][PY] = 94;
}
青色の鍵を持っている場合、青色の扉を開ける。(鍵なくなる)
青色の鍵を持っていないが、防御力(装備除く)が10以上ある場合も青色の扉を開ける。(防御力-10)
どちらにも該当しない場合、青色の扉を開けない。
<script>
if(HAS_ITEM(31)){ //赤鍵
SOUND(13);
REMOVE_ITEM(31);
o[X][Y] = 101;
o[PX][PY] = 101;
}
else{
MSG("この先に進むには\n赤色の鍵が必要になりそうです。\n\n"
+ "今までに通った道に怪しい場所がないか、\n確かめてみましょう。");
}
赤色の鍵を持っている場合、赤色の扉を開ける。(鍵なくなる)
上記に該当しない場合、赤色の扉を開けない。ただし、赤色の鍵についてのヒントメッセージを表示させる。

あえて扉パーツを使うという判断も。
鋼の盾を守るROCKを1パーツに集約する
フロア内のROCKを2体倒すことで入手できる鋼の盾ですが、彼らには3つのパーツが用られています。

物体パーツ50 倒すと門(緑扉)を開けるROCK
物体パーツ51 左側にいるROCK。倒すと右側を物体50にする。
物体パーツ52 右側にいるROCK。倒すと左側を物体50にする。

なんか回りくどいので左右両方を物体パーツ50にしようと、そのままパーツID50を左右に配置すれば片方を倒しただけで門が開いてしまいます。

……御座います。
1パーツで門を制御する策、御座います……!

<script>
if(o[1][4] == 0 && o[3][4] == 0){
o[2][3] = 104;
o[PX][PY] = 104;
}
if(○○ == △△){
××
}
『○○と△△が等しい場合、××部分の処理を行う。』という意味合いの構文です。
=が1つだと別の処理になるのでご注意ください。
(たとえば『o[1][4] = 0』だと、X座標1, Y座標4の物体パーツを0(無し)にしてしまいます。)
if(○○ != △△){
××
}
先ほどのものに似ておりますが、今度は『○○と△△が等しくない場合』に処理を行います。
if(○○ && △△){
××
}
『○○と△△のすべてを満たしている場合に××部分の処理を行う』という意味合いの構文です。
if(○○ && △△ && □□)のように3つ以上繋げることもできます。
if(○○ || △△){
××
}
『○○と△△の何かを満たしている場合に××部分の処理を行う』という意味合いの構文です。
こちらもif(○○ || △△ || □□)のように3つ以上繋げることもできます。
※『|』については、大半のキーボードだと「¥」とShiftキーを同時押しすることで入力できてます。
【TIPS】
パーツ使用数を節約するメリット自体はそこまでないのですが、モンスターの強さを後から調整する場合は修正が必要な場所が少なくなります。
また、このようなギミックを追加で作成する場合なんかも追加作成が必要なパーツ数を減らすことができます。
アイテムのランダム封入
RAND()を活用することで、従来なら『ランダム選択』パーツで処理していたようなこともできてしまったりします。

<script>
MSG("宝箱を開けた!");
v[0] = RAND(100);
//薬35%、攻撃25%、防御40%
if(v[0] < 35){
o[X][Y] = 19;
}
else if(v[0] < 60){
o[X][Y] = 21;
}
else{
o[X][Y] = 22;
}
【TIPS】
今回はサンプルということでこのようにしておりますが、ダンジョン系WWAを作成する分にはお金を置いて、プレイヤーが好きに買物したほうがいいということもよくあります。
サンプル
上記を組み込んだサンプルがこちらになります。
zipはこちら
※トラブル防止のため、zipの再配布やPLiCyへの投稿などは禁止です。
(記事内で紹介したサンプル自体はご自由にお使いいただけます)
おわりに
というわけで、Script導入サンプルの記事をお送りいたしました。
既にWWA Scriptを取り入れた作品を作られている方々には物足りない記事だったかもしれませんが、12/19に投稿予定の応用編では、ユーザ定義変数を使ったり、DATファイルの外側にファイルを作って色々とやったりする記事を予定しております。
逆に今までWWA Scriptを取り入れたことがないよ!という方は、これを機にスクリプトへのチャレンジを試みていただけると嬉しいなと思います。

WWA Discordサーバーの#質問相談チャンネルで積極的にご質問ください!
宿題
今回の記事ではあまり変数を使わずにScriptのサンプルを紹介してきましたが、次回の応用編では変数をバリバリ使います。
というわけで、変数について学んでおいていただけると応用編はスムーズに読んでいくことができると思います。
『ゲーム作りラボ』様の記事が分かりやすいかと思いますので、ご参考に!
明日はAokashiさんの
『「謎めいた機械を追い求めて 闇組織の争奪」の技術の話』です。
※12/8は別内容の記事を取り扱い、応用編は12/19を予定しております。