ヒラリラーのブログ

ゲームレビュー・旅行記ブログです

WWAScriptを使った複数の鍵をまとめて持てるWWAの作り方

いざ・・・扉を開けよう

こんにちは、今回は前回に引き続いてのWWA記事になります。

前回から間隔が開いてないのはWWA Advent Calendar 2024 18日目の記事の記事になるからですね。

adventar.org

まえがき

今年のWWAコンテストでは複数の鍵をまとめて持てる作品が多く見られました。
「謎めいた機械を追い求めて 闇組織の争奪」「箱庭迷宮エクゼリオ」「召喚されし時空の遺物」「レベルアップダンジョン2」「四つの村と封印の洞窟」・・・
あとコンテスト作品ではないですが自作の「Continue v3」でも似たようなシステムを採用しました。

謎追い2ではクリックすると鍵の数が分かる

www.aokashi.net

今回の記事では詳しくロジックは紹介しませんが、「箱庭迷宮エクゼリオ」では所持している鍵の数が一目で分かるような仕組みになっています。

箱庭迷宮エグゼリオ:クリックしなくても所持数が分かる

plicy.net

さて、本題に入りまして今回記事では複数の鍵を持てるWWAの作り方をご紹介します。
今回のロジックは「Continue v3」で採用していたものを参考に、「謎追い2」でも採用されたテクニックを組み合わせたものとなります。他作品のロジックは把握していないのですが、同じテクニックを実装する場合でも複数やり方はありますので、他作品では別の方法を採用している場合もあります。(実際Continue v3ではもう少し面倒な手段を取っていました。)

もう一点、今回の記事はWWAScript初心者向けに書いてありますので、分かる人が見たら冗長に感じるかもしれません。
また、全くWWAScriptを触ったことの無い方は、アルクスさんが書いて頂いたこちらの記事を参考にして、まずは触れてみてからこの記事を読むと理解がしやすいかもしれません。

note.com

また、今回のサンプルはケープダンジョンを改造したのを作ろうとしましたが、本作のほぼコピー作品を作られてしまうとPLiCyの検索妨害にもなりかねませんので、あえてダンジョン要素を排除した複数鍵を持てるだけのサンプルマップを用意しました。

note.com

(詳しくはアルクスさんのこちらの記事を読んでみるといいかも?)

それは置いておいてもこちらの方が他の余計な仕組みが入っていないので、わかりやすいかもしれません。

システム概要

さて前置きが長くなりましたが早速サンプルを見ていただきましょう。

hirarira.net

分かりやすいように最小限の構成にしているのであっさりしているとは思いますが、複数の鍵をまとめて持てることが確認できたかと思います。

続いて本作のロジックを解説していきます。
ざっくりとしたロジックについては12/5のAokashiさんの記事にて解説しているのですが、ここではもう少し深堀りをしていきたいと思います。

aokashi.hatenablog.jp

前提として今回のサンプルでは以下のように変数を利用しています。

変数No 役割
0 黄色の鍵所持数
1 青色の鍵所持数
2 赤色の鍵所持数
3 現在取得した鍵のID番号

紹介した記事でも書いてある通り、ポイントとしてはマップ上に配置する鍵パーツは「アイテム」でなく「ステータス変化」にしていきます。
それとは別にアイテムとしてもたせる「アイテム」パーツの鍵を別に用意します。

鍵を取った時の処理

マップ上に配置する「鍵」パーツ

もちろんこのままだと何も変化は起きないので、Script文を使って鍵取得関数 getKeyItem() を呼び出します。
その前に v[3] = 0 とセットしていますが、ここで「黄色の鍵を取得したよ」という情報を変数3番に格納しています。

<script>
// 取得したKeyのIDをセットする
v[3] = 0;
// 鍵取得関数を呼ぶ
getKeyItem();

鍵取得関数 getKeyItem() の中身はこちらになります。
分かりやすいように黄色の鍵を取得したときの処理だけを抜き出していますが、後ろには青色の鍵を取得した時の処理、赤色の鍵を取得した時の処理が続きます。
先ほど呼び出す際に v[3] = 0 とセットしたため、 if(v[3] == 0) の中身は黄色の鍵を取得した時のみ実行されます。

/** 鍵を取得したときに呼ばれる */
function getKeyItem() {
  // 黄色の鍵を取得した時
  if(v[3] == 0) {
    // 黄色の鍵を1つも持ってないならもたせる
    if(!HAS_ITEM(4)) {
      ITEM[0] = 4;
    }
    // 黄色の鍵の数を増やす
    v[0] += 1;
  }
  // 後ろの処理は省略
}

続いて if(!HAS_ITEM(4)) にてアイテムボックスに物体番号4番の鍵を持っているかを判定します。
このアイテムはマップ上に配置したステータス変化アイテムとは別の物体パーツとして用意します。

アイテムとして持たせる鍵パーツ

ロジックとしては鍵アイテムを1つも持っていない時には持たせる、鍵アイテムを持っている時にはアイテムボックスは現状のままで、内部的なカウントを増やすという処理になります。
ここでは黄色の鍵の数は変数0番( v[0] )にて管理していますので v[0] += 1 で変数をカウントアップさせます。

鍵をクリックした時の処理

鍵をクリックすると個数が分かる

続いて鍵をクリックした時の処理を解説します。
アイテムボックスにある鍵をクリックすると「黄色の鍵の数は12本です。」と所持している鍵の個数をメッセージで表示します。

アイテム側のScriptとしてはアイテム取得時と同じように、IDをセットした上で個数表示用の関数 showKeyNum() を呼び出しています。

<script>
// 鍵IDをセットする
v[3] = 0;
// 現在の鍵の個数を表示する
showKeyNum();

個数表示用の関数はシンプルで、押した鍵のIDに応じて現在の鍵の個数を表示しています。

function showKeyNum() {
  // 選択したのが黄色の鍵の場合
  if(v[3] == 0) {
    MSG("黄色の鍵の数は"+v[0]+"本です。")
  }
  else if(v[3] == 1) {
    MSG("青色の鍵の数は"+v[1]+"本です。")
  }
  else if(v[3] == 2) {
    MSG("赤色の鍵の数は"+v[2]+"本です。")
  }
}

扉を開けた時の処理

最後に鍵を開けた時の処理を解説します。

扉を開けた時の処理

扉側の特徴としては「鍵なくならない」属性に設定することです。これは鍵の残りが1つ以上あればアイテムは削除しない、0個であれば削除するという処理をScript側で行う必要があるためです。

扉側のScriptは他2つと同様、IDにをセットして鍵削除関数( useKeyItem() )を呼び出すだけです。

<script>
// 取得したKeyのIDをセットする
v[3] = 0;
// 鍵削除関数を呼ぶ
useKeyItem();

鍵削除関数では変数上での鍵の数を減らし、もし0個以下の場合には REMOVE_ITEM(4, 1) で鍵アイテムを全て削除しています。
これはWWAScriptに限らずプログラミング汎用で使えるテクニックなのですが、なるべく異常ケースに対応出来るように心がけるのが大切です。

/** 鍵を使用したときに呼ばれる */
function useKeyItem() {
  // 使用したのが黄色の鍵の場合
  if(v[3] == 0) {
    // 鍵の数を減らす
    v[0] -= 1;
    // 鍵の数が0個になったらアイテムを削除する
    if(v[0] <= 0) {
      v[0] = 0;
      REMOVE_ITEM(4, 1);
    }
  }
  // 後ろの処理は省略
}

今回の場合では if(v[0] == 0) のときにアイテム削除関数が呼ばれるようにしても良いのですが、万が一 v[0] が 0の状態でこちらの鍵使用変数が呼ばれてしまうと v[0] = -1 と鍵の数がマイナス1個になってしまい、かつアイテムボックスに鍵が残り続けるため鍵を無限に開けれてしまいます。

そのため if(v[0] <= 0) と0個以下の場合、例えば何らかの理由でマイナス個数になった場合でも鍵削除処理が走るようにした上で、 v[0] = 0; と鍵の数を正常系に戻して上げる必要があります。
このように設定することで鍵の数が0個の時に鍵を開ける処理が呼ばれてしまった場合にもアイテムボックスの鍵を削除した上で「鍵の数が0個」と正常な状態に戻すことが出来ます。

以上で複数の鍵を持たせる機構の説明は終わりになります。

【余談】鍵の個数を一目で分かるWWAの作り方

※これは実際のソースコードを覗いたわけではないので完全に推測になります。

「箱庭迷宮エクゼリオ」のように鍵の個数を一目で分かるようにするにもScriptを利用します。
こちらはざっくりとした方針だけ話しますが、鍵の保持個数ごとに鍵アイテムを作っていく形になるかと思います。「黄色鍵0個」「黄色鍵1個」「黄色鍵2個」...という具合ですね。

鍵を取得したり消費した際に現在の個数の鍵アイテムを持たせる必要があるのですが、鍵の格納位置を固定させておけば古い個数のアイテムを削除する手間は省けるかもしれません。

将来的にはアイテム欄にもPICTURE機能を使えるようにしたいところではあるのですが、アイテム欄はcanvas描画ではないので現行のシステムから大きく変える必要が出てくるため、もし対応するとしても遠い将来の改修になるかなあと思いますね。

サンプルのローカルでの動かし方

今まで説明したサンプルは以下でソースコードを公開していますので、気になる人はダウンロードしてローカルで動かしてみてください。(付属でスーパーマサトも付いてきてしまいますが・・・)

github.com

動かし方としては上のサイトにアクセスして、右上の緑の「Code」ボタンからDownload ZIPでダウンロードして任意の場所に解凍し、WWAWing公式サイトで配布されている「開発ツール完全版」に付属する wwa-server.exe を 解凍したフォルダにコピーして起動し、http://localhost:3000/multiKeySample/ にアクセスするとローカルで動かすことが出来ます。
(余談ですが http://localhost:3000/superMasato/ だとスーパーマサトが動きますw)

これにて今回の記事はおしまいになります。
明日はアルクスさんの「WWA Script応用:コピペ可、サンプル配布あり!色々やってみよう」になります。

WWAScript入門編と(ついでの本記事と)セットで読むと理解が深まるかもしれません。
それではまた、明日をお楽しみに~