折尾楽太郎 2021/10/03 18:28

(0002)特徴の追加作戦

概要

RPGツクールはデータベースの以下の項目に「特徴」という設定項目が備わっています。

  • アクター
  • 職業
  • 武器
  • 防具
  • 敵キャラ
  • ステート

一方、イベントコマンドに特徴を編集するコマンドは備わっていません。
そのため、例えばこういったことができなさそうです。(以下例)

  • 修行の結果、通常攻撃が全体攻撃になる
  • 物語の途中で魔法使いの通常攻撃を攻撃力依存から魔力依存に切り替える
  • クエストをこなすことで戦闘の獲得金額が2倍になる

代替策として、同名の職業をコピペして特徴だけ異なるものを用意し、裏で職業を切り替えたり、プレイヤーが操作できない装備のつけ外しをしたりで実現できなくはないですが、前者は

  • 職業の数が肥大化する
  • 転職システムを導入していると簡単に破綻する
  • 習得の順序が複数ある場合も破綻する

後者は

  • 変更不可の装備がプレイヤーに見えてしまうので違和感が生まれる
     (プレイヤーに見えない装備欄って作れるのかな…)
  • プラグインを使わない場合、装備枠が一つこれに持っていかれる
  • こちらも習得の順序が複数ある場合に破綻する
  • 優先順位が強すぎてプレイヤーの自由度が下がる※

※特徴の優先順位については別記事「(0001)特徴の適用される優先順位」で言及していますのでご興味があれば併せてご確認ください。

といった難点があります。

そこで、イベントコマンドの「プラグインコマンド」から特徴を編集できるようにプラグインを自作してみようと考えました。

尚、当記事執筆時点では完成していませんので悪しからず。

後で気づいた本来の前提情報

本来なら前提条件として把握した上で取り組むべきところを後で気づいた情報を先に記載していきます。

グローバル変数の命名規則

最初にアクターの特徴編集プラグインを作り始めましたが、実はアクターの情報が入っているグローバル変数には以下の2種類があります。

  • $dataActors
  • $gameActors

です。データベースの情報が入っているのが$dataActorsということで、$gameActorsの方の存在にすら気づかず$dataActorsの方を編集して「できた!」ってなっていたわけですが、実は$dataから始まるグローバル変数と$gameから始まる変数には大まかに以下の違いがあります。

  • $data~

ゲーム起動時にデータベースに設定されている情報を格納する。ゲーム起動時以外は更新されず全セーブデータで参照される。セーブデータ側には保持されない

  • $game~

ゲームの進行状況によって変化する系統の情報が格納される。$gameActorsの場合はセーブ時点でパーティーにいるアクターとそれぞれのステータス等。セーブデータに含まれる(例外あり)が特徴は含まれない


というわけで、$dataActorsの方を編集するようにプラグインを設計してしまったため、特徴を追加しても以下のような現象が発生しました。

  • プラグインコマンドを発火させると、タイトルに戻って発火させていないセーブデータをロードしても特徴が編集された状態が保持されてしまう
  • プラグインコマンドを発火させてセーブしても、一旦ゲームを閉じて起動しなおすと、発火後にセーブしたデータをロードしても特徴が元に戻ってしまっている

これを把握した私はこう思いました。「だからイベントコマンドにないのか~」

打開策と執筆時点の状況

課題を列挙すると

  • $dataActorsがゲーム起動時にしか読み込まれない
  • $dataActorsの内容がセーブデータに保存されない

です。というわけで、最早コアスクリプトをいじるしかないという結論に至りました。悪手ですが致し方ありません。

※コアスクリプトを編集すると簡単にゲームが起動しなくなるなど重大なエラーが発生します。編集は自己責任にて行ってください。

コアスクリプト(v1.1.0時点…プラグイン開発用のプロジェクトのバージョンアップをし忘れてました)の中を探すと、rmmz_manager.jsにDataManager.makeSaveContentsというメソッドがあり、ここでセーブデータに格納するデータを用意しているようです。

そのため、return contents;の直前にcontents.modifiedDataActors = $dataActors;を挿入してみました。

更にセーブデータを読み込む処理が同じくrmmz_manager.jsにあるDataManager.extractSaveContentsというメソッドで行われているようなので、最終行に$dataActors = contents.modifiedDataActors;を挿入してみました。

これにより、セーブデータにセーブ時点での$dataActorsのデータを保存し、ロード時に$dataActorsをセーブデータに格納されているデータで上書きすることができました。

どやっ('ω')

となるのはまだ早い!

おわかりいただけただろうか。「ロード時に」と記載したことを。

そうです。以下の手順を踏むと残念なことになります。

  • ゲームを開始する
  • イベントコマンドで特徴を編集する
  • タイトルに戻る
  • ニューゲームを開始する

ニューゲームはロード処理を伴わないので、$dataActorsが更新されません。よって、特徴が編集された$dataActorsがそのまま保持された状態でゲームが開始されてしまいます。

実は(執筆時点では)この問題は解決できていません。ゲーム起動時に実行される、Actors.jsonを読み込んで$dataActorsに格納する処理をニューゲームの処理時に再度実行するように記述してみましたが、$dataActorsがnullになってしまい、エラーになってしまいました。

「まあ、不利な特徴編集をしなければ、プレイヤーに損はないから良いか~」と無理やり理由をこじつけて一旦諦めました。

ではでは。

月別アーカイブ

限定特典から探す

記事を検索