【サイトについて】
* RPGツクールMVを使った、ゲームを一層楽しくするためのアイディアや、豆知識、プラグインなどを紹介していきます。あくまで個人の考えに基づく記事ですので、参考程度にお読みいただければ幸いです。
<< 魔法をかける時に杖を振る | main | 用語辞典を作ろう! >>
スポンサーサイト
0

    一定期間更新がないため広告を表示しています

    | - | |- |
    自作ゲーム専用プラグインを用意しよう!
    0
      RPGツクールMV バージョン1.2.0へのアップデートが2016年4月21日頃に予定されているそうです。
      ツクールMVにて使用されている基本描画ライブラリPixi.jsの更新も兼ねたバージョン1.3.0を控えているとの情報もありますし、今後アップデート頻度をやや上げていきたいとの事なので、製作済みゲームのアップデートも考えていかなければいけません。

      こういう時、たとえば自作品で「エンカウント率を低くする」とか「クリティカル時にアニメーションの演出を足す」とか、細かい追加をするのにプラグインではなく本体側のJavascriptを書き換えている場合、本体アップデートした時に書き換えた場所が消えてしまいます

      これを避けるために、ちょっとした書き換えでもJavascriptに触れずに、プラグインを自作する事にしましょう。
      ※プラグインの基本的な作り方については「プラグイン講座」をご覧ください。

      私の作品「ナイトオブシンデレラ」でも「ラハと魔法の園」でも、独自のプラグイン(knightof.js、graystory.js)を作成し、呼び出す様にしています。

      ■プラグインを作成する

      1) メモ帳やソースエディタを開いて、以下の文を入力します。コピー&ペーストで構いません。
       
      /*:
       * @plugindesc このゲーム専用プラグイン
       * @author 作者名
       * @help ゲーム専用に作成された初期読み込み用プラグイン
       */

      (function() {



      })();

      「このゲーム専用プラグイン」や「作者名」の部分は適宜変更してください。

      2) このまま一旦ファイルを保存してください。
      ファイル名は「自分のゲーム名.js」が分かりやすくていいと思います。たとえば「final story」というゲームなら「finalstory.js」、「勇者vs魔王 魔剣の伝説」というタイトルなら「maken.js」といった感じで、必ずファイル名は半角英数字にしてください
      保存場所は、ゲームプロジェクトフォルダのjs/pluginsフォルダ内です。
      文字コードは「UTF-8(BOM無し)」です。

      3) ツクールMV本体の「プラグイン」を表示し、いま作成したファイル名を選択し「ON」にします。

      これで独自プラグインの準備は出来ました。
      以降何か書き換えが発生した場合は、このファイルの (function(){ と })(); の間に、書き換える部分の処理をまるごとコピー&ペーストします。
      つまり本体側のJavascriptには一切手を加えず、いま作成したファイルの方に処理をコピーしておくことで、アップデートによる上書き消滅を防ぐことが出来るわけです。

      プラグインの呼び出し順序は

      [本体側のJavascript]→[プラグイン(リストの上から順)]

      なので、本体側でいくら「Aにしろ!」と命令を出した所で、プラグインで「Bにしろ!」と命令が下されれば、「Bにしろ」しか実行されません。
      ただし沢山のプラグインを使用している場合、その順序にはご注意ください。
      実行順は上から下にかけてです


      1番目に読み込んだプラグインの内容が「メニュー画面に背景を出せ」となっている時、2番目に読み込むプラグインの内容が「メニュー画面には背景を出すな」と書かれていれば、背景を出すなの命令が実行されます。
      (正確には背景を一瞬出した後、背景を出さなくなります)


      ■「ラハと魔法の園〜the graystory〜」で実行している独自プラグイン

      1) タイトルBGM維持
      タイトル画面から「ニューゲーム」を選択した時、タイトルBGMがそのまま流れっぱなしになる処理です。難易度選択の画面にゆるやかに移行するために加えた処理です。
      普通ならニューゲームを選択するとタイトルBGMがフェードアウトしてゲーム内BGMが流れるのですが、フェードアウトで消す処理をコメントアウト(書いた内容を実行しない様にすること)する事で維持を実現しています。
       
          // タイトルBGM維持
          Scene_Title.prototype.commandNewGame = function() {
              DataManager.setupNewGame();
              this._commandWindow.close();
              //this.fadeOutAll();
              var time = this.slowFadeSpeed() / 60;
              this.startFadeOut(this.slowFadeSpeed());
              SceneManager.goto(Scene_Map);
          };


      2) エンカウント率調整
      戦闘エンカウントのバラつきを無くすため、ほぼ戦闘と戦闘の間の歩数は均等になる様にしています。
      6の乱数にツクールのマップ設定のエンカウント歩数を足しています。
      つまりマップ上でエンカウントが「40歩」と設定されているエリアでは
      40〜46歩ごとにエンカウントします。
      デフォルトの2〜3歩歩くだけで次の戦闘が始まる様な煩わしさや、さっきは3歩目で出たのに今度は40歩歩いても全然出て来ないといったバラつきがなくなります。
       
          // エンカウント率調整
          Game_Player.prototype.makeEncounterCount = function() {
          var n = $gameMap.encounterStep();
          this._encounterCount = Math.randomInt(6) + n;
          };


      3) クリティカルヒットのダメージ調整
      ツクールのデフォルトでは戦闘時クリティカルが通常ヒットの3倍になっています。
      あまりに威力が大きすぎるため、2倍に変更しています。
       
          // クリティカルのダメージ率調整
          Game_Action.prototype.applyCritical = function(damage) {
              return damage * 2;
          };


      4) 戦闘開始時の戦う・逃げるスキップ
      デフォルトでは戦闘開始時にパーティーコマンドと呼ばれるウィンドウが最初に表示され、「戦う」「逃げる」が選べる様になります。「戦う」は分かりきっているし、「逃げる」は特定のキャラしか使用出来ない魔法にしたかったので、このウィンドウをスキップする様にしました。
       
          // 戦闘開始時の戦う・逃げるコマンドのスキップ
          Scene_Battle.prototype.changeInputWindow = function() {
          if (BattleManager.isInputting()) {
              if (BattleManager.actor()) {
                  this.startActorCommandSelection();
              } else {
                  //this.startPartyCommandSelection();
                  this.selectNextCommand();
              }

          } else {
              this.endCommandSelection();
          }
          };

      パーティーコマンド選択にコメントアウトしています。

      5) お店で装備を買う時、魔法力・魔法防御力の増減値を表示する
      滅多に無い変更とは思いますが、ラハ園では魔法のみが存在する世界で「物理攻撃力」「物理防御力」を消す必要がありました。お店で取り扱う武器や防具を買うとき、画面上に「+5」とか「+8」とか表示される数値は、この物理攻撃・物理防御の増減値です。これを魔法力、魔法防御力に変更するため、取得する場所を変更しています。
       
          // 魔法力・魔法防御力を装備購入時に表示
          Window_ShopStatus.prototype.paramId = function() {
              //return DataManager.isWeapon(this._item) ? 4 : 3;
              if (DataManager.isWeapon(this._item)) {
                  return 4;
              }else if(DataManager.isArmor(this._item)) {
                  return 5;
              }else{
                  return 3;
              }
          };


      6) 装備欄から「攻撃力」「防御力」を削除
      上の理由に同じで、装備やステータス欄からも攻撃力・防御力を消します。
       
          // 装備表示から攻撃力・防御力を削除
          Window_EquipStatus.prototype.refresh = function() {
              this.contents.clear();
              if (this._actor) {
                  this.drawActorName(this._actor, this.textPadding(), 0);
                  for (var i = 2; i < 6; i++) {
                      this.drawItem(-2, this.lineHeight() * (1 + i), 2 + i);
                  }

              }
          };

          // ステータス表示から攻撃力・防御力を削除
          Window_Status.prototype.drawParameters = function(x, y) {
          var lineHeight = this.lineHeight();
          for (var i = 2; i < 6; i++) {
              var paramId = i + 2;
              var y2 = y + lineHeight * i;
              this.changeTextColor(this.systemColor());
              this.drawText(TextManager.param(paramId), x, y2, 160);
              this.resetTextColor();
              this.drawText(this._actor.param(paramId), x + 160, y2, 60, 'right');
          }

          };


      7) ステータスから「職業名」を削除
      ステータス画面上に「戦士」とか「勇者」とか表示されてるあれです。
      職ごとによるステータスではなくキャラごとによるステータスとしての扱いなので、職業名は使いません。
      コメントアウトです。
       
          // ステータス表示から職業名を削除
          Window_Status.prototype.drawBlock1 = function(y) {
          this.drawActorName(this._actor, 6, y);
          //this.drawActorClass(this._actor, 192, y);
          this.drawActorNickname(this._actor, 432, y);
          };


      8) メニュー画面の「職業名」を「二つ名」に変更
      メニュー画面にも職業名が名前の横に表示されていますので、
      コメントアウトしてActorNickname(二つ名)に変更します。
       
      Window_Base.prototype.drawActorSimpleStatus = function(actor, x, y, width) {
          var lineHeight = this.lineHeight();
          var x2 = x + 180;
          var width2 = Math.min(200, width - 180 - this.textPadding());
          this.drawActorName(actor, x, y);
          this.drawActorLevel(actor, x, y + lineHeight * 1);
          this.drawActorIcons(actor, x, y + lineHeight * 2);
          //this.drawActorClass(actor, x2, y);
          this.drawActorNickname(actor, x2, y, width2);

          this.drawActorHp(actor, x2, y + lineHeight * 1, width2);
          this.drawActorMp(actor, x2, y + lineHeight * 2, width2);
      }



      9) スイッチ50がONの時は「サード」スキルを表示
      戦闘中サードスキル、つまりTP100になった時のみ使用可能になる必殺技の様なスキルです。「サードスキルのチュートリアルイベントを見るまではTPが100になっても使えない」という状況を作り出すため、50番のスイッチがONになるまではコマンド欄にすら表示させない、といった処理を入れています。
      これによりスイッチのON・OFFで「サード」を表示するかどうかを管理出来ますので、必殺技封印フロアなどはここで作れるわけです。
       
          // スイッチ50がONの時はスキルタイプ「サード」を表示
          Window_ActorCommand.prototype.addSkillCommands = function() {
              var skillTypes = this._actor.addedSkillTypes();
                  skillTypes.sort(function(a, b) {
                  return a - b;
              });
              skillTypes.forEach(function(stypeId) {
                  var name = $dataSystem.skillTypes[stypeId];
                      if (stypeId != 2 || $gameSwitches.value(50)) 
                          if (stypeId != 2 || this._actor.tp == 100)
                          this.addCommand(name, 'skill', true, stypeId);
                  }, this);

              };


      10) 魔法反射にアニメーション表示
      戦闘中、魔法反射はデフォルトだと効果音とダメージの変動のみしかありませんが、反射時にグリーンの盾の様なものを表示したくて、処理にtarget.startAnimationを足しています。
       
          // 魔法反射にアニメーション追加
          BattleManager.invokeMagicReflection = function(subject, target) {
          target.startAnimation(122, false, 0);
          this._logWindow.displayReflection(target);
          this._action.apply(subject);
          this._logWindow.displayActionResults(subject, subject);
          };


      11) 完全耐性にアニメーション表示
      戦闘中、状態異常に対して100%の耐性がある場合でも、デフォルトでは「miss」と表示されますので、果たして「たまたま効かなかっただけ」か「完全な耐性持ちなのか」が非常に分かりづらいです。
      完全耐性だと分かるアニメーションを入れることで、すぐに耐性持ちだと分かる様にしています。
       
      Game_Action.prototype.itemEffectAddNormalState = function(target, effect) {
          var chance = effect.value1;
          if (!this.isCertainHit()) {
              chance *= target.stateRate(effect.dataId);
              chance *= this.lukEffectRate(target);
          }
          if (Math.random() < chance) {
              target.addState(effect.dataId);
              this.makeSuccess(target);
                  if (target.isStateResist(effect.dataId) == true) {
                      target.startAnimation(122, false, 0);
                  }

              }
          };

      魔法反射と同じ、盾を表示するアニメーションです。
      ただし「毒」と「眠り」を同時にかける魔法の場合などは「毒完全耐性」と「眠り完全耐性」の区別がつきませんので、どちらかに完全耐性があるとアニメーションが表示されます。使用の際にはご留意ください。


      12) 176番スイッチでアイテム使用不可
      戦闘中、アイテム使用を禁止にするための試練フロアの実装するためのものです。
       
          // 176番スイッチでアイテム使用禁止
          Window_ActorCommand.prototype.makeCommandList = function() {
              if (this._actor) {
                  this.addAttackCommand();
                  this.addSkillCommands();
                  this.addGuardCommand();
                  if ($gameSwitches.value(176)){
                  this.addCommand(TextManager.item, false, false);
                  }else{
                  this.addItemCommand();
                  }

              }
          };

      if ($gameSwitch.value(スイッチID)) は大変便利な構文で、ゲーム内のスイッチON・OFFでプラグインの状態をいじれるので、ぜひ積極的に使ってみましょう。

      上記は一例ですが、この他にもメニュー画面に得点やプレイ時間を表示させたり、戦闘中に左からトコトコ歩いてきて敵についての解説をするイベントなど、色々独自プラグイン内に入れています。
      ぜひJavascriptは、本体側のjs/rpg_****.jsを書き換えるのではなく、新規のプラグインファイル内にそこからコピー&ペーストしたものを書き換える様にすると良いでしょう。

       
      | RPGツクールMVプラグイン | 12:34 |- |
      スポンサーサイト
      0
        | - | 12:34 |- |
        PR