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

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

    | - | |- |
    私のストーリーの作り方
    0
      今回はストーリーの作り方について綴ってみたいと思います。
      と、その前に、フリーゲームRPG「ひびかけ色のキセキ」の作者さまeconaさんが「キャラの役割からストーリーを仕上げる方法」という記事を書いておられます。非常に丁寧に解説されておりますので、こちらもぜひご参考にしてください。

      今回のブログ記事タイトルの手前に「私の」とわざわざ書いていますが、あくまで私が自分の作品で作ってきた事をそのまんま書くだけなので、「このやり方が正しいのだな!」「これが一般的なRPGの作り方か!」などとは決して思わないで下さいね。

      はっきり言いますと、このやり方は「邪道」です。


      その1 ドンデン返しを考える

      具体的な世界観とかキャラクターとか決めるのは完全に後回しにします。
      「ナイトオブシンデレラ」「ラハと魔法の園」「世界を救う四つの小箱」(他PLiCyさんに公開のショート2作品含め)全てにおいてまずこの手法をとっています。
      普通に勇者が旅立って、普通に魔王をやっつけて、普通にハッピーエンド。
      それもまた一つのRPGであると思いますが、印象は薄いですよね。
      しかし実は冒険開始時点で、実は既に勇者はスライムに殺されていたとしたら??
      魔王をやっつけるシーンなどは、すべて勇者が死ぬ前に見た走馬燈、幻想、妄想だったのです。
      これだけだと勿論「はあ?アホらし」ってなりますので、ドンデン返しのネタを作ったら、それに至るまでの伏線を作っていきます。
      「あー、だから勇者にとって都合のいい事ばかり起きていたのか!」
      「あー、だから勇者には空を飛ぶ能力があったのか…!」
      「あー、だから勇者には天使が見えたのか…!」
      「あー、だからこのゲームのタイトルは"勇者へのレクイエム"だったのか!」
      例は相変わらず雑ですが、なんでもいいです。こんな感じです。
      大切なのはプレイヤーに「何だってえええええ?!」と思わせる意外性です。
      「黒幕の正体がもし○○だったら、びっくりするよね」という発想からナイトオブシンデレラが生まれましたし、「主人公の正体がもし○○だったら、びっくりするよね」という発想からラハ園は生まれたといっても過言ではありません。
      世界観やキャラクターは後からでも自然とわいてくるので、「意外な結末」をまず用意してみましょう。

      以下、使い古された例ではありますが、
      「主人公とヒロインは実は同一人物だった!」
      「全ての元凶は魔王ではなく、一番最初に戦ったスライムだった!」
      「旧校舎で起こっている様々な怪奇現象は、すべて科学で説明可能な自然現象だった!」
      これだけじゃ面白くないので
      そしてその自然現象は、実はすべて主人公の選択した行動のせいで起こっていた!
      とか。
      実に下らないものでもいいです。伏線によっては化けるかも知れません。
      いろいろ考えてみてください。


      その2 伏線を考える

      上でも触れましたが、ドンデン返しを考えたらそのための伏線を考えていきます。
      多少強引な展開や無理があっても構いません。これは無理があるだろうと思った事は後から消去法で削っていきましょう。
      しかし伏線というものは、

      ・多すぎるとプレイヤーにすぐバレる
      ・少なすぎたり、分かりにくすぎるとプレイヤーに不快感を与える

      という非常に厄介なもので、真相を知った時の驚きと快楽をプレイヤーに与えるのが難しいものです。ストーリー開始時点で既に死んでいた勇者の例を上に挙げましたが、とんでも展開すぎるために伏線が無さすぎると「はぁ?」ですしね。
      良い伏線の張り方を学ぶためには、意外性のあるストーリーやドンデン返しなどで評判の良いゲームを是非プレイしてみる事をおすすめします。FF10の伏線の張り方は個人的に好きですが、こういったものはノベルゲームに多いです。有名どころだとシュタインズゲートとかですね。
      私のストーリーの発想の原点はいつでもノベルゲームです。じゃあノベルゲームを出せばいいじゃないかと言われそうですが、いつかはやってみたいですね。


      その3 周囲を固めていく

      ドンデン返しと伏線が出来たら、それを「隠す」ための世界とキャラクターを構築していきます。
      開幕時点で既に死亡している勇者の周りでは普通に町人・村人達が生活していて、でもどことなく様子が変。でも勇者には優しくしてくれる。
      勇者が昔憧れていた伝説の剣士の登場や、勇者の100%理想のタイプのヒロインの登場など、何もかもが勇者にとって都合の良い世界とキャラクターがどんどん出来上がっていきます。
      しかし「実は勇者は死んでました。終わり」だと非常に後味の悪いBAD ENDにしかならないので、途中の選択や行動によっては勇者は一命をとりとめ最終的に目を覚ます、そしてそこからが本当の冒険の始まり!という形にした方が、多少強引ながらもハッピーエンドになりますし、マルチエンディングの凝った物語を演出出来ると思います。


      とまあ、以上の3ステップが、私のストーリーの作り方です。
      こんな風に私はいつでも「意外な真実」を最初に考えてから周囲を固めていくという方法をとっているので、賛否両論が多く、レビューや感想メールなどでも「展開にやや無理はあるが、」と先ず書かれる事が多いのです(苦笑)。いつか無理のない展開に持っていける様、頑張りたいですね。
      | ストーリー | 20:21 |- |
      戦闘行動を「ものまね」するスキル
      0
        敵味方関係なく、前に行動した者の行動を「ものまね」するスキルを、ちょっと実験がてらに作ってみました。



        いかがでしょうか?

        作り方のヒントとしては、

        (1) 敵または味方が行動するたび、その行動のスキルIDを変数に入れるプラグインを作る
        (2) [コモンイベント]で、そのスキルIDを強制行動するスクリプトを書く
        (3) [スキル]で「ものまね」スキルを作り、コモンイベント(2)を呼び出す

        こんな感じです!
        「味方の行動だけ真似させたい」場合などは(1)をちょっといじる事で実装が出来ます。

        具体的な方法や実際のプラグインは公開しません。
        しかしこのブログのプラグイン講座を読んでくださった方にはきっと難しくないはず…。
        宿題としますので、ぜひぜひチャレンジしてみてください!
        | 戦闘 | 16:28 |- |
        ストレスフリーな「逃げる」を目指す
        0
          おはようございます。
          RPGにおいて戦闘から「逃げる」コマンドを使っていますか?
          「敵に尻など見せるものか!」と息巻いて絶対に逃げないという姿勢の人を除いては
          かなりの人が多用するコマンドだと思います。



          逃げる理由としては
          (1) 厄介な敵なので戦闘を避けたい
          (2) エンカウント率が高すぎて面倒くさい
          (3) 死屍累々なので逃げて全滅を防ぐ
          (4) ボス戦まで体力を温存したい
          (5) レベルの低い雑魚とはいちいち戦う必要も無い
          大体このパターンでは無いでしょうか?
          しかし(5)以外で「逃げる」を実行すると逃走失敗というパターンが多いですよね。

          ツクールMVのデフォルトの逃走率はこうです。

          0.5 × 仲間全員の敏捷性の平均値 ÷ 敵の敏捷性の平均値

          たとえば、味方の敏捷性平均値が80で、敵の平均が40だとします。
          この時計算式は0.5*80/40で1。
          つまり平均2倍以上の差があれば、100%逃げられる計算となります。
          味方の敏捷性平均値がちょっと足りずに75の場合は0.9375。
          93.7%の確率で逃げられ、6.3%の確率で失敗する、という事です。

          逆に考えましょう。
          自分より圧倒的に強い敵。たとえば味方の平均が40、敵の平均が200だとしますよね。
          計算式は0.5*40/200になるので、0.1。
          この時は「10%の確率でしか逃げられない」という結果に陥ります。

          「これじゃあ何度逃げても殆ど失敗じゃないか!」と憤慨している方は落ち着いてください。rpg_managers.jsの2394行目あたりにこんな記述があります。
              if (success) {
                  this.displayEscapeSuccessMessage();
                  this._escaped = true;
                  this.processAbort();
              } else {
                  this.displayEscapeFailureMessage();
                  this._escapeRatio += 0.1;
                  $gameParty.clearActions();
                  this.startTurn();
              }

          逃走に失敗するごとに、逃走率計算式に0.1がプラスされるのです。
          ということは10%の確率でしか逃げられない戦闘であっても、2回目の逃走では20%、3回目の逃走では30%、最低でも10回の試行で100%逃げられるという計算式になっています。まあ大抵そこまで差がついている戦闘において10回も逃走するとズタボロになっていると思いますが…。

          ここまで見ると一瞬「うむ。なかなかバランスのとれている逃走計算じゃないか」と思っちゃいますよね。
          果たしてそうでしょうか??
          事あるごとに言っているかも知れませんが、ツクールの乱数は偏りがちです。この様に歴然たる敏捷差のある戦闘において10%を3連続引くこともあれば、10回連続で逃げられないことが延々続く状況も普通に起こり得るのです。

          全ての敵からさくさく逃げられると道中は楽ですがレベルが低いままボスに挑む事になって面倒くさい事になりますし、全ての敵から逃げにくいとイライラさせられっ放しです。さすがに10回も逃げるを実行し続けるプレイヤーさんは少ないですよね。ストレスフリーな逃走計算式であるとは言えません。

          では、どうするか、という回答の前に、「どこをいじればこの逃走計算が変更できるのか」を見ておきましょう。
          rpg_managers.jsの1993〜1995行目です。
           
          BattleManager.makeEscapeRatio = function() {
              this._escapeRatio = 0.5 * $gameParty.agility() / $gameTroop.agility();
          };

          this._escapeRatio=のあとの計算式ですね。
          計算結果では、(限りなく0に近い数値)から1までの数値のどれかが算出される式です。

          「すばやさに影響せず戦闘で確実に逃げられる様にしたい」という方は、計算式をざっくり消して1にしちゃってください。
          this._escapeRatio = 1;

          「すばやさに影響せず50%の確率で逃げられる様にしたい」という方は、そのまんま50%、つまり0.5を右辺にそのまんま入れてください。
          this._escapeRatio = 0.5;

          「勝負の鍵は運だ!オレは素早さじゃなく運のみを影響させたいんだ!」という方は、
          this._escapeRatio = 0.5 * $gameParty.luklity / $gameTroop.luklity();

          とした上で、自作プラグインの中に下記を追記しておくと良いでしょう。
           
          Game_Unit.prototype.luklity = function() {
              var members = this.members();
              if (members.length === 0) {
                  return 1;
              }
              var sum = members.reduce(function(r, member) {
                  return r + member.luk;
              }, 0);
              return sum / members.length;
          };

          こんな風にカスタマイズすると色々楽しめますよね。

          「確実に先手を取られる敏捷性をもつ強敵だが、逃げようと思えば100%逃げられる敵」とか、「素早さがゼロのくせになかなか逃がしてくれない敵」とかは、この式をうまくいじる事で実装出来るはずです。

          逃走計算に正解はありません。作者さんの好みです。
          しかし「ここぞ」という時に逃走コマンドで成功する事は、プレイヤーにとってストレスを与えない結果に繋がりますので、ぜひ最適な計算式を見つけ出してみると良いでしょう。

          ちなみに私の個人的な好みは「100%逃走可能」です。
          FFでいう「とんずら」を常時実行出来る状況です。
          「おいおいそんなの甘すぎるわ」「ぬるすぎるわ」「もはやRPGじゃねーよ」「何考えてんだ」という意見が大量のタライやバケツとともに降って来そうなので、逃げる事によるデメリットはもう少し必要という作者さんも多いと思います。
          逃げると経験値が得られないので「レベルが上がりにくい」というデメリットは既に上にも書いた通りですが、​100%逃げられる仕様にした場合は、通常の逃走式よりももう少しだけ何らかの代償的要素は必要かも知れませんね。

          要は、あくまでプレイヤーが面倒と感じた戦闘にのみ逃走が100%成功すればいいのですから、多用し過ぎを防ぐという意味では、下の様なやり方があります。

          かのスーパーファミコンの名作「ファイナルファンタジー4」。逃走はLRボタンを押しっぱなしで、殆どの雑魚敵で楽々出来ますが、ゴールドを大量に落とすという地味にいやらしい代償がありました。

          あの仕様がちょっと面白いのでちょっと再現してみます。

          FF4の逃走におけるデメリットの仕様は「勝利すると手に入るGの25%を失う」です。
          つまり1000G手に入る戦闘では、所持金から250Gを失います。



          自作プラグインに、下記の様に追記します。
           
          Game_Troop.prototype.LostgoldTotal = function() {
              return this.aliveMembers().reduce(function(r, enemy) {
                  return r + enemy.gold();
              }, 0) * this.goldRate();
          };

          ある程度敵を倒してから逃走する場合、その倒した敵についてはゴールドは失わない仕様です。
          あとはrpg_managers.jsの先ほどの逃走成功処理に足してください。
           
              if (success) {
                  this.displayEscapeSuccessMessage();
                  var lsgold = Math.floor($gameTroop.LostgoldTotal() * 0.25);
                  $gameMessage.add(lsgold  + TextManager.currencyUnit +  "を落っことした!");
                  $gameParty.loseGold(lsgold);

                  this._escaped = true;
                  this.processAbort();
              } else {

          (※注意 rpg_managers.jsの文字コードがUTF-8で無い場合は文字化けします)
          「分かりにくい」「自作プラグインって何ぞや?」という方は、一度このブログのカテゴリ「プラグイン」を参考いただければ幸いです。一応ここで書いたプラグインを下記においておきますね。

          EscapeGoldLost.js
          (javascriptが直接表示されるブラウザの場合は右クリックで「別名でファイル保存」などで保存ください)

          もちろん「25%もG落とすんじゃ余計にストレスたまるだろ!」というプレイヤーさんもいますので、この数値は0.005%の様に出来るだけ低く設定するとか、敵からのお宝ドロップの確率をあげるというのも有りだと思います。
          | 戦闘 | 10:34 |- |
          RPG序盤の雑魚戦のバランスについて
          0
            ストーリー重視のRPGの序盤のパターンで多いのは、

            (1) シナリオ開始
            (2) 数回の雑魚敵との戦闘
            (3) 最初のボス戦
            (4) 次のシナリオへ

            大体こういう感じですよね。
            このうち(2)はとても重要で、プレイヤーのモチベーションを左右する非常に大事な場所だと思っています。
            雑魚敵との戦闘が「長い」「強すぎる」「エンカウントが多い」「単調」だと、たとえシナリオが魅力的でも、いかにボス戦においてスリリングで素晴らしい演出が施されていても、投げられてしまう事は多いのではないでしょうか。

            私も自作品でうまい調整が出来ているとはお世辞にも言えないのですが、
            例えばゲーム開始直後、最初のエンカウントがスライムだとして、
            普通に戦っていて、スライムごときに全滅する」という事があってはならないと思うんです。



            チュートリアルの時間を除いて一番最初の戦闘は20秒以内にカタをつけたい、というのが個人的な考えです。
            RPG慣れしていないプレイヤーのためにも「最初は主人公の通常攻撃 一撃で倒せる様にする」のと同時に、そして「その攻撃を敵は回避しない」という調整が望ましいと考えています。
            ツクールMVの命中率・回避率は、エンカウント率同様、結構偏った判定をしており、味方の命中率95%+敵の回避率5%としている場合でも、2回連続どころか3回連続ミスなんて事もよくあります。「これがこのゲームの最初の相手か!さあ戦うぞ!」という時にいきなりミスを連続で引くと気持ちが萎えるだけでなく、RPGの難易度が高すぎると感じてしまい投げ出すきっかけになる気がします。
            データベースのモンスターの設定で新規で追加した時のデフォルトの状態では回避率+5%を勝手に入れられているので、これは序盤は外すか確率を低くセットする様にしてみることをおすすめします。

            空を飛んでいる敵は避けやすいといった特徴を持たせるべく回避率を増やすのは悪くないことだと思います。しかし「これは攻撃が当たりにくいので、別の方法で倒すのだな」と考えられる手段を用意すべきで、魔法や専用武器を使って確実に一撃で倒すという方法があってこそ親切設計といえると思います。少なくとも最初のボスの手前ぐらいまでは一発(1匹につき1ターン)で倒せるほどサクサクであって欲しいんですよね。

            敵から受けるダメージも、主人公のHPが450ぐらいあれば、



            序盤の序盤ならこんな感じでいかがでしょうか?
            約15回ダメージを受けるとHP0になるぐらいの調整です。
            割とぬるめですが、初期のドラクエなどでもレベル1でHP30程度の主人公キャラに対して、スライム側の攻撃は1とか2ですよね。大体15発で戦闘不能になる計算です。
            回復手段が豊富であれば、もっとダメージを受けても良い気がしますし、この辺りは作者の好みにもよるとは思いますが、これぐらいが私の好みのバランスです。

            「作者自身は仕様を知っているからどんな敵でも楽に倒せるかも知れないが、
             RPG慣れ・ゲーム慣れしていない人は楽に倒せないかも知れない」
            「序盤はテンポを良くし、飽きさせない様にする」
            この2点を意識したバランス調整を心がけたいですね。


            ちなみに「ラハと魔法の園」では序盤の雑魚敵は1戦15〜30秒を計測したバランス調整を行っています。
            序盤の敵についてはボスを含め一切回避しません。
            もちろん序盤とは言えすべての雑魚敵が一撃で倒せすぎてしまうのはつまらないので、あくまで序盤の序盤についてのみの考えであり、特徴を持たせるなどして長期戦にならない様な応用した工夫は必要になってくるとは思います。
            ポカル連打だと逆に時間が掛かる事もあったり、回避・反射魔法持ちという嫌らしい敵に対してはランパクトという有効手段も用意しているので、一部の敵については出来るだけ思考を止めずに戦って欲しいなという希望もありました。

            あくまで個人的な考察ですが、以上ご参考までに。
            | 戦闘 | 18:35 |- |
            ブラウザ版のセーブデータをWindows版に移す
            0
              RPGツクールMVではWindows版、Mac版、ブラウザ版の3つの出力が可能です。
              (厳密に言えばスマートフォン版出力がありますが、ここでは無視します)

              ダウンロードせずにすぐ遊ぶことの出来るブラウザ版は便利。しかしある程度遊んでみてから、「やっぱりWindows版やMac版に移行してゆっくり遊びたいな」という場合や、うっかりブラウザの履歴削除などをしてしまってセーブデータが消えてしまうのが怖いという場合のために、データはローカル環境に持っておきたいですね。

              ここでは「ブラウザ版のゲームのセーブデータを、Windows版のゲームに移す」方法について解説させていただきます。Mac版Safariからのデータ移動については、こまさんに教えていただきました。ありがとうございます。

              各ブラウザで保存したセーブデータは「Local Storage(ローカルストレージ)」という領域に格納されます。
              OSやブラウザごとに保存場所はかなり違うのですが、ご参考までに。
              ※フォルダが見当たらない場合は隠しファイルの可能性があります。フォルダ設定の「隠しファイル」にチェックを入れるか、フォルダオプションから「隠しファイルを表示する」をチェックしてください。

              ■Google Chrome(Windows10)
              (ユーザフォルダ)¥AppData¥Local¥Google¥Chrome¥User Data¥Default¥Local Storage

              ■Safari(Mac)
              (ユーザフォルダ)¥ライブラリ¥Safari¥LocalStorage

              ■Google Chrome(Mac)
              (ユーザフォルダ)¥ライブラリ¥Application Support¥Google¥Chrome¥Default¥Local Storage

              階層深すぎです!! ファイル名がhttpから始まり、そのブラウザ版ゲームのURLで始まっているものがセーブデータ格納ファイルです。それを適当な場所、とりあえずデスクトップなどにコピーしておいてください。

              まだ終わりじゃありませんよ!
              このファイルをそのまんまWindows版のsaveフォルダに移しても駄目です。Local StorageはSQLite3と呼ばれるデータベースファイル内に集約されていますので、個別のセーブデータとしてファイル出力する必要があります。

              そのためには「PupSQLite」というツールを使います。
              SQLite3データベースの編集ソフトです。Windowsにインストールしてください。

              インストールが終わりましたら、PupSQLiteを開いてください。



              この灰色の画面の上に、先ほどデスクトップに移したファイルをドラッグ&ドロップします。
              すると左側のメニュー欄に「ItemTable」と表示されるので、これをダブルクリックします。



              すると今度は右側にずらっとリストが表示されますよね。
              「RPG Config」「RPG Global」「RPG File1」「RPG File 2」…
              勘のいい方ならここで既に把握出来ると思うのですが、このkeyがそれぞれ各セーブデータファイルと対応しているわけです。

              ひとまず「RPG Global」行の右側のByte[] 配列と書かれている文字を右クリックし、「ファイルの出力」を選んでください。



              そうすると保存するファイル名を訊いてきますので、global.rpgsaveというファイル名で保存してください。

              同様の手順で、
              RPG File1は file1.rpgsave
              RPG File2は file2.rpgsave
              RPG Configは config.rpgsave
              という名前で、それぞれ一つずつ保存していきます。

              すべてのファイルの保存を終えましたら、それらをsaveフォルダにまとめ、Windows版のゲームのsaveフォルダに入れるだけです。この状態でゲームを起動しましたら、ブラウザ版のセーブデータがWindows版に移行されている事が確認出来るかと思います。
              | RPGツクールMV技術情報 | 14:42 |- |
              親切なチュートリアルを作るための3つの手法
              0
                はい。今回は完全に私の個人的な考えです。
                私は何のゲームを始める時でも説明書は一応目を通すんですが、一度に色んな事をスパパパンと説明されてしまうと頭の中がグルグルになってしまって、10個覚えなければいけないことの2個ぐらいしか覚えられない事が多々あります。(この時点で完璧に覚えられる人尊敬します)

                多くの場合、複雑なシステムを含んだゲームについてはチュートリアルイベントが発生しますよね。この時点だと大抵の人はチュートリアル通りに以後動くことは出来ると思います。
                しかしそれでも覚えられないんですよ、私(泣)

                このせいで自分のゲームでもそこまで凝ったシステムを含めたくないわけですが、その辺りが作品評価に響いたりする事もあって、本当にアイタタタです。「だからストーリー重視って言ってんでしょ、凝ったシステムが無いことくらいは見逃して〜!」なんて事はもちろんプレイして頂いた方には口が避けても言えず。

                皆さんの中で、最近のFF8のドローシステムとかFF14の戦闘とか正直初回プレイ時は全くついていけてない人挙手お願いします!
                ・・・居ませんか?

                「それはゲームを理解する気が無いからだ」とか「遊ぶ心構えが出来てないからだ」とかそういうのではないんですよ。必要あらばメモを取るぐらいはします。そういう事じゃなくて、思うに私自身はあくまで物語をメタ的な視点で見られないのだな、と気付いたんです。

                たとえば「ジョブシステムについて説明します」というナレーションが突如入り、あれこれと説明が入った後「次に進みます。Aボタンを押してください」というナレーションに移行し…、ここまで来ると大抵の場合は話の腰が折れていることが多くて、逆に覚えにくいんです。
                そもそも昔のゲームにはチュートリアルなんて殆ど無かったじゃないですか。私ファミコン世代の人間ですよ。スイッチをパチーンと入れたらタイトル画面が出てきて、スタートボタン押したら即座に冒険開始です。チュートリアルが必要になるほどシステムが複雑化したのは無数のゲームが次々発売されたおかげでそれらと差別化するためのオリジナリティ要素だと思いますし、説明書もソフトの軽量化やオンライン化の影響で丁寧な物は入れられないですよね。

                理解が追いつかないプレイヤーも居る事を意識して、チュートリアルを工夫されると良いかも知れませんね。
                今回のゲーム作りで私がとった方法は以下の通りです。


                1. チュートリアルを会話イベントにする



                「ラハと魔法の園〜the graystory〜」では、RPGの物理攻撃のかわりとなるファーストスキルの説明を優等生ヒロインが行いました。初めて出会ったヒロインとの最初の出会いに絡めたイベント内に説明を含め、文章量も最低限に留めました。
                しかしこうなると「Aボタンを押す」とか「システムウィンドウを開く」とかってメタ的な説明も出来るだけ入れたくない所です。なるべくそういった単語を交えずに、物語の世界から一時的にでも切り離さない様な工夫を考えたいですよね。


                2. 最初の内は、一度に二つ以上の事を説明しない



                今回TPが100になった時のみ使用可能な必殺魔法についての説明イベントは、もう少し後に設けています。出来る事は徐々に増やしていった方がいいかなと思っての対応です。(TP満タンなったら必殺撃てるって程度の事なら口頭説明でも普通に分かる事かも知れませんが)


                3. 仲間キャラクターがお手本を見せる



                システムにもよると思うのですが、仲間キャラクターがシステムの有用性について実際にお手本を見せられるのであれば、ぜひ見せて欲しいところですね。このシーンはモンスターには弱点属性があることの説明です。これは誰でも分かる事とは思うのですが、RPG慣れしてないプレイヤーさんも少なからずいると思いますから(何よりこのゲームは若干ノベル寄りですからね)。

                他にも色々あるのですが、今回はとりあえずこんな所で。

                それにしても私の作品で「凝ったシステムは無い」というレビューの一文を見るとなにげに凹みます…(苦笑)。自分で自分の作品をプレイした時に初回で理解出来ないシステムは作りたくないからなんですが…;
                | システム | 00:45 |- |
                MV1.1.0→1.2.0 Javascript変更部分
                0
                  RPGツクールMVのメジャーアップデートが公開されました。
                  バージョンは1.1.0から1.2.0となります。

                  Javascriptの差し替えが必要という事で、
                  「差し替える事でプラグインが動かなくなるんじゃ…?」
                  と心配されている方も多いかも知れません。
                  それでは今回も実際にjsフォルダの中身がどのぐらい書き換わっているのか、確認してみました。


                  ■main.js
                  変更なし


                  ■rpg_core.js
                  4754行目に下記文追加
                   
                  TilingSprite.prototype.generateTilingTexture = function(arg) {
                      PIXI.TilingSprite.prototype.generateTilingTexture.call(this, arg);
                      // Purge from Pixi's Cache
                      if (this.tilingTexture.canvasBuffer)
                          PIXI.Texture.removeTextureFromCache(this.tilingTexture.canvasBuffer.canvas._pixiId);
                  };

                  これはリリースノートの[バグ対応]欄にある、タイルスプライトのメモリリークの修正でしょう。
                  liplyさんが以前公開されたメモリリークパッチがそのまま入れられていますね。
                  (この処理について、記事一番下に補足説明を記載)


                  ■rpg_managers.js
                  変更なし


                  ■rpg_objects.js
                  1091〜1095行目が少し書き換えられています。

                  旧)バージョン1.1.0
                  Game_Picture.prototype.updateRotation = function() {
                      if (this._rotationSpeed > 0) {
                          this._angle += this._rotationSpeed / 2;
                      }
                  };

                  新)バージョン1.2.0
                  Game_Picture.prototype.updateRotation = function() {
                      if (this._rotationSpeed !== 0) {
                          this._angle += this._rotationSpeed / 2;
                      }
                  };

                  ピクチャの回転で、1.2.0において半時計回りの機能を追加した事による処理変更かと思います。

                  ■rpg_scenes.js
                  変更なし


                  ■rpg_sprites.js
                  1431行目 Sprite_Animation.prototype.updateCellSpriteの処理です。
                  変更部分は一箇所ですが、切り所が難しいためちょっと長いですが丸ごと処理を貼り付けておきます。

                  旧)バージョン1.1.0
                  Sprite_Animation.prototype.updateCellSprite = function(sprite, cell) {
                      var pattern = cell[0];
                      if (pattern >= 0) {
                          var sx = pattern % 5 * 192;
                          var sy = Math.floor(pattern % 100 / 5) * 192;
                          var mirror = this._mirror;
                          sprite.bitmap = pattern < 100 ? this._bitmap1 : this._bitmap2;
                          sprite.setFrame(sx, sy, 192, 192);
                          sprite.x = cell[1];
                          sprite.y = cell[2];
                          if (this._mirror) {
                              sprite.x *= -1;
                          }
                          sprite.rotation = cell[4] * Math.PI / 180;
                          sprite.scale.x = cell[3] / 100;
                          if ((cell[5] && !mirror) || (!cell[5] && mirror)) {
                              sprite.scale.x *= -1;
                          }
                          sprite.scale.y = cell[3] / 100;
                          sprite.opacity = cell[6];
                          sprite.blendMode = cell[7];
                          sprite.visible = this._target.visible;
                      } else {
                          sprite.visible = false;
                      }
                  };

                  新)バージョン1.2.0
                  Sprite_Animation.prototype.updateCellSprite = function(sprite, cell) {
                      var pattern = cell[0];
                      if (pattern >= 0) {
                          var sx = pattern % 5 * 192;
                          var sy = Math.floor(pattern % 100 / 5) * 192;
                          var mirror = this._mirror;
                          sprite.bitmap = pattern < 100 ? this._bitmap1 : this._bitmap2;
                          sprite.setFrame(sx, sy, 192, 192);
                          sprite.x = cell[1];
                          sprite.y = cell[2];
                          if (this._mirror) {
                              sprite.x *= -1;
                          }
                          sprite.rotation = cell[4] * Math.PI / 180;
                          sprite.scale.x = cell[3] / 100;
                          if ((cell[5] && !mirror) || (!cell[5] && mirror)) {
                              sprite.scale.x *= -1;
                          }
                          sprite.scale.y = cell[3] / 100;
                          sprite.opacity = cell[6];
                          sprite.blendMode = cell[7];
                          sprite.visible = true;
                      } else {
                          sprite.visible = false;
                      }
                  };

                  リリースノートにある「アニメーションのバグ修正:正しくないターゲットを隠す問題」がこれにあたります。
                  (※追記 4/21 16:30修正。この箇所のみソースが新旧逆でした。申し訳無いです)

                  Javascript修正箇所はおそらく以上です。
                  rpg_core.jsのバージョン情報変数Utils.RPGMAKER_VERSION も 1.1.0のままでした。
                  JSに関しては軽微な修正のみかも知れませんね。


                  2016/04/22 22:30追記

                  今回メモリリーク修正について、1.2.0へのバージョンアップ当初、
                  イベント「遠景の変更」を入れたゲームをCanvasモードで開くと、以下の様なエラーが発生していました。



                  この問題についてツクール開発部様に報告し、
                  メモリリーク修正を以下の様に記述する事でCanvasモードでのエラー落ちを回避できる旨記事にしました所、
                   
                  (function(){
                      var TilingSprite_prototype_generateTilingTexture = TilingSprite.prototype.generateTilingTexture;
                      TilingSprite.prototype.generateTilingTexture = function(arg){
                          TilingSprite_prototype_generateTilingTexture.call(this, arg);
                          if (Graphics.isWebGL())
                              if (this.tilingTexture.canvasBuffer)    PIXI.Texture.removeTextureFromCache(this.tilingTexture.canvasBuffer.canvas._pixiId);
                      }
                  })();

                  本日夕方新しく行われたアップデート(バージョン変わらず1.2.0)で、この私の案が採用された様です。
                  つまり「Canvasモードの時はメモリリークパッチは反映しない」という事です。

                  Canvasモードではメモリリークの影響はWebGLと比較すれば浅いのですが、完全では無いので、おそらくは当面の応急処置だと思います。pixi.jsが絡んでいる問題という事もあり、バージョン1.3.0までの繋ぎという形かも知れませんね。
                  | RPGツクールMV技術情報 | 15:10 |- |
                  用語辞典を作ろう!
                  0
                    中長編作品や、ちょっとシステムの凝ったゲームを作ると、
                    ゲーム内にも解説や用語辞典、マニュアルなんかが欲しくなりますよね。

                    それを、↓こ〜んな風に、



                    ものすごく簡単に作れてしまう素晴らしいプラグインを
                    トリアコンタンさんが作ってくださいましたので、ご紹介させていただきます。

                    プラグインページ
                    (作者:トリアコンタンさん ※MITライセンス)

                    ダウンロード(Download)よりダウンロードしたSceneGlossary.jsを各プロジェクトフォルダのjs/pluginsフォルダに入れ、プラグイン管理からONにしてください。各プラグインのパラメータに関する説明はヘルプをご覧ください。

                    ■基本的な使い方

                    まずは用語辞典に載せたい用語を、データベースの「アイテム」欄に「隠しアイテム」として作ります。

                    隠しアイテムにはAとBがありますが、パラメータで設定したアイテムタイプの方を選択してください。
                    アイテム名が用語名、アイテムタイプが「隠しアイテムA(またはB)」。

                    2016/04/21追記
                    「使用可能時」は「メニュー画面」にしておきましょう。

                    (※「常時」「バトル画面」にすると戦闘中のアイテム欄に表示されてしまいます
                      「使用不可」にすると用語辞典内の用語名がグレーになります)

                    そしてメモ欄に <SG説明:> と入力し、説明: と > の間に用語の解説を入力しましょう。
                    例では「黄金結晶」という名前の素材アイテムについての解説を入れたいと思います。



                    これで保存し、ゲームを確認してみてください。
                    メニューを開くと、「用語辞典」という項目が出来ていますよね。



                    これを選択すると、、、



                    当然空欄です。
                    なぜなら、まだ設定した隠しアイテム「黄金結晶」が手に入っていないからです。

                    街にいるキャラに話を聞きましょう。



                    そう、ここで初めて「黄金結晶」という単語が出て来ましたね。
                    このイベントの下に隠しアイテム「黄金結晶」の入手イベントを入れることで、
                    はじめて用語辞典に項目が追加されるわけです。



                    用語に追加したいタイミングで、該当用語の隠しアイテムを
                    「アイテムの増減」で入手できる様にイベントを書きましょう。
                    手にした隠しアイテムと用語辞典は連動していると思ってください。



                    ちなみに、プラグインパラメータに「自動登録」というものがあるのですが、
                    これがONに設定されていると、何と「アイテムの増減」処理を挟み込むことなく、
                    黄金結晶」というキーワードが会話内に登場した瞬間、
                    自動的に用語辞典に登録されるのです

                    なーんと便利な!!

                    ※自動登録ONの時の注意!
                    「ルシ」という単語を解説するために会話内に「ファルシ」という言葉を入れると、ルシという単語を中に含んでいるため「ルシ」「ファルシ」両方とも項目が出てきてしまいます。
                    「ライ」というキャラクターの解説をあとで辞典に入れたいのに、誰かがうっかり「カレーライス」の話をしてしまうと、その時点でライが自動登録されてしまいます。近しいキーワードをなるべく会話に含まない様、ご注意を!

                    2016/04/21追記
                    プラグインのバージョン1.2.0で自動登録の対象外にするタグの機能が追加されました。
                    自動的に登録させたくないアイテムのメモ欄に <SG手動> と入力しましょう。


                    ■応用編

                    まだまだこのプラグインには沢山の機能があります。
                    隠しアイテムのメモ欄に、こんな風に、



                    黄金結晶のメモ欄に
                    <SGカテゴリ:*******> にカテゴリ名を入れ、
                    <SGピクチャ:*******> にimg/picturesフォルダにある画像ファイル名(拡張子不要)を入れ、
                    <SGピクチャ揃え:******> に「center」と入れます。

                    この状態で用語辞典を見ると・・



                    用語辞典を開いた時、まずはカテゴリとしてまとめられます。
                    メモ欄で「素材辞典」が表示されましたね。
                    <SGカテゴリ:>で入力した文字がそのまま表示されています。

                    カテゴリを選択すると、



                    画像つきの解説が出ます!!
                    素材のイラストだったり、キャラクターの立ち絵などを表示すると、
                    ゲームのクオリティが一気にアップすると思います。

                    説明には変数も使えます。
                    単なる用語辞典としての使い方ではなく、
                    いろんな使い方のアイディアが生まれそうですね!
                    とっても素晴らしいプラグインだと思います。
                    | RPGツクールMVプラグイン | 18:31 |- |
                    自作ゲーム専用プラグインを用意しよう!
                    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
                        ハリーポッターの様に魔法をかけるのに魔法の杖を必要とする場合、
                        対象に杖を向けて「エクスペクトォォパトロォナァァム!」って感じで詠唱する…
                        というスタイルが殆どだと思います。

                        RPGツクールMVのデフォルトでは魔法詠唱時に
                        両手を広げて詠唱して、杖がどこかへ消えてしまうんですよね



                        これじゃ杖買う必要まったく無いじゃないか!!
                        というご意見も中には…、
                        いや全然なかったんですけど、昨日自分自身でそう思ってしまって、

                        ↓こうした方が「らしい」じゃないですか。



                        というわけで何とか出来ないかと思って作ってみましたよ。

                        必要となるもの
                        杖の武器画像
                        Javascriptの書き換え(プラグインの作成)
                        これだけです。

                        「杖の武器画像はデフォルトにあるじゃん」と突っ込みが入るかも知れないのですが、デフォルトの杖はドラゴンボールの亀仙人が持ってる様な杖なので、スタイリッシュじゃ無いというか、若々しさに欠けるというか…。

                        というわけで素人ながら作ってみたのです。
                        各プロジェクトのimg/systemフォルダにあるWeapon1.pngの、ヤリ(使わないので)画像を改変し、ポッターが振る様な感じの杖を作りました。





                        これもっと上手に作れる方、ぜひ作っていただけると嬉しいのですが…(汗)

                        また、「ラハと魔法の園」では「ポカル」という名前の、通常攻撃と同じモーションの攻撃方法がありますので、システムタブ[SV]攻撃モーションの「杖」モーションを「突き」にし、画像を新しく作成した杖に変更します。
                        これでポカル使用時に杖でボカッと殴る様な仕草ではなく、杖を相手に向けて見えない衝撃波が加えられている様な効果が得られました。

                        さて、あとはJavascriptの書き換えです。
                        魔法を詠唱する時のモーションはツクール本体側では変更できず、js/rpg_object.jsを書き換える必要があります。

                        js/rpg_object.jsの3992行目です。
                         
                        Game_Actor.prototype.performAction = function(action) {
                            Game_Battler.prototype.performAction.call(this, action);
                            if (action.isAttack()) {
                                this.performAttack();
                            } else if (action.isGuard()) {
                                this.requestMotion('guard');
                            } else if (action.isMagicSkill()) {
                                this.requestMotion('spell');
                            } else if (action.isSkill()) {
                                this.requestMotion('skill');
                            } else if (action.isItem()) {
                                this.requestMotion('item');
                            }
                        };

                        この赤字の部分ですね。
                        「魔法使用時はモーション spell を使え」
                        「スキル使用時はモーション skill を使え」
                        という命令をしています。

                        杖を向けるというモーションに変えたいので、
                        ここの処理ではデフォルトでは武器画像を表示する様に作られてないので、
                        そのための処理を別途加えてやる必要があります。

                        こう書き換えます。
                         
                            Game_Actor.prototype.performAction = function(action) {
                                Game_Battler.prototype.performAction.call(this, action);
                                // 武器画像を表示するための準備
                                var weapons = this.weapons();
                                var wtypeId = weapons[0] ? weapons[0].wtypeId : 0;
                                var attackMotion = $dataSystem.attackMotions[wtypeId];

                                if (action.isAttack()) {
                                    this.performAttack();
                                } else if (action.isGuard()) {
                                    this.requestMotion('guard');
                                } else if (action.isMagicSkill()) {
                                    // モーションを突きに変更
                                    this.requestMotion('thrust');
                                    // 杖画像を表示
                                    this.startWeaponAnimation(attackMotion.weaponImageId);

                                } else if (action.isSkill()) {
                                    // モーションを突きに変更
                                    this.requestMotion('thrust');
                                    // 杖画像を表示
                                    this.startWeaponAnimation(attackMotion.weaponImageId);

                                } else if (action.isItem()) {
                                    this.requestMotion('item');
                                }
                            };

                        これで魔法を使う時に杖(装備している武器)を使い、
                        モーション「突き(thrust)」を実行する様に変更ができました。
                        (何で「突き」モーションかと言うと、対象に向けてまっすぐ杖を差し出すからです)

                        というわけでこの状態で戦闘テスト。



                        どうでしょうか。
                        っぽく」なりました?

                         
                        | 戦闘 | 12:19 |- |
                        PR