開発日誌

テクニック

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 乗船中使用不可スクリプト

2012-08-25 15:23:39

先日、小舟に乗っている最中にワープ魔法・アイテムを使うと、船に乗ったまま移動してしまうバグを修正しましたが、その時の副産物として、乗り物に乗っている最中は使用できなくするスキルやアイテムを作るスクリプトを公開します。VX用です。

使い方は単純で、上記スクリプトを導入し、対象となるアイテムもしくはスキルのメモ欄に、以下の指定文字列を記述するだけです。

PANDA::DisableInVehicle

私はワープ魔法・アイテムで使いましたが、他にも使い道はあるかと思います。また、全ての乗り物を対象にしていますが、飛行船だけとか、大型船だけとか、特定の乗り物に乗っている時などの判定も、簡単な改造で実現できるでしょう。

以前に公開した使用可否スイッチ制御スクリプトを用いて、並列処理で乗り物に乗っている状態を判定してスイッチをon/offする、といった方法でも実現できますが、それだけのことに並列処理を使うのも非効率なので、スクリプトにしました。

質問やアドバイスなどはコメント欄まで、お気軽にどうぞ。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ 天下御免!からくり屋敷 ] [ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] [ ツクール情報 ] ステート相殺の不具合

2012-07-01 21:13:46

天下御免!からくり屋敷』のデバッグ作業中に、RPGツクールVXのプリセットスクリプトの不具合と思われる部分を発見しました。

戦闘中、防御力など変化していないのに、なぜか「防御力が元に戻った!」というメッセージが表示されるという現象に悩まされていたのですが、その原因がVXのプリセットスクリプトの不具合にあるらしいことが判明しました。Game_Battlerクラスのadd_stateメソッドで、ステートが相殺された場合にも、自然解除のターン数が設定されてしまっているのは、おかしいですね。新規プロジェクトで試してみても、同様の現象が起きました。

ちょっと検索してみた限りでは、あまり話題になっていない模様ですね。ただ、話題が皆無ではなかったので、不具合には違いないのでしょう。Scene_Battleクラスのremove_states_autoモジュールを見ると、実際のステートに変化が起きない場合は、ステート解除のメッセージが表示されることはないため、簡単にはこの不具合が発覚しないようですし、余計なメッセージが表示される以外には特に実害がないので、放置されているのでしょうか…。

というわけで、修正するスクリプトを作ってみました。Game_Battlerクラスのadd_stateメソッドに追加定義していますので、ここに手を加えている場合は競合に注意してください。

一応、能力値の上昇・低下に関わるステート相殺では、上手く動いている模様ですが、綿密なテストは行っていないので、いろいろな形でステートの相殺を応用しているような場合に、不備があるかもしれません。もし上手く動かないような場合には、コメント欄等にてご報告いただけると、ありがたいです。

[ 天下御免!からくり屋敷 ] [ テクニック ] 今週のハマり

2012-06-07 21:50:47

怒濤の日々が過ぎ、ようやく少し落ち着いたので、『天下御免!からくり屋敷』の制作を再開しました。

が、再開早々、バグに悩まされました。

蘇生魔法を使ってくる敵が出てくるのですが、生き返った敵のグラフィックが、なぜか表示されないという問題が…。気配はあれど、姿は見えず。攻撃でダメージを与えると、ようやく姿を現します。

エネミーの表示関係は特に手を着けていないはずなのに、おかしいなと思っていろいろスクリプトを追ってみたところ、ようやく原因が判明しました。

  • Sprite_Battlerで、ダメージを受けた際に、20フレーム間、点滅エフェクトがかかる。
  • @effect_duration変数で、19から0までカウントダウンしている。
  • 点滅エフェクトを実装しているupdate_blinkメソッドでは、
    self.visible = (@effect_duration % 10 < 5)
    となっており、@effect_duration変数の下1桁が0〜4の時に表示、5〜9の時に非表示となる仕組み。
  • ところで、戦闘高速化を施したため、ダメージを受けた際のウェイトを、30フレームから半分の15フレームにしていた。(Scene_Battleのdisplay_hp_damageメソッド)
  • このため、点滅エフェクトの20フレームのうち、15フレーム目、すなわちvisibleが非表示の状態で、崩壊エフェクトに移ってしまう。

こんなの、そう簡単には気付かないよ!

というわけで、ダメージを受けた際のウェイトは20フレーム以上確保するか、あるいは出現エフェクトを実装しているSprite_Battlerのupdate_appearメソッドに、self.visible = trueを入れるかすればOKのようです。とりあえず、後者で修正しましたが、戦闘高速化もたまに高速すぎて、何が起こったのか把握できないことがあるため、ウェイトの値を一律半分にしている現在の高速化方法は、見直した方がいいのかも。

[ 天下御免!からくり屋敷 ] [ テクニック ] 不可視シンボルエンカウント

2011-10-17 23:20:54

引き続き和風ミニ(?)RPGの根幹システムを作成しています。

普段は見えないが接触すると戦闘に。

今回のゲームで導入してみたいのは、シンボルエンカウントだけど、敵シンボルの姿は普段は見えない、という方式。むかーしの「英雄伝説 I」のフィールド画面で採用されていたかと思います。

普通のシンボルエンカウントだと、ザコ戦を全て回避して進むことができますが、ボス戦などに臨むためにはそれなりに成長していなければならず、ザコ戦全回避では結局ゲームが成り立ちません。かといって普通のランダムエンカウントでは、適切なエンカウント率の調整が困難です。その点、この方式であれば、プレイする側の感覚としては、ランダムエンカウントに近いと思いますが、あっちへ寄り道して来ると1回エンカウントしている、みたいな絶妙なバランス調整が可能です。

気付かれた。逃げろー!

細かい仕様はいろいろ付けています。

  • 戦闘からは必ず逃げられるが、逃げた後はその敵シンボルが見えるようになって、追いかけてくる。
  • 一定範囲内に接近すると主人公を追いかけてくる。
  • 執拗に追いかけられても困るので、ある程度経つと追尾を中止する。
  • ある程度経つと消滅して、一定時間後に復活する。
  • 背後から接触された場合は不意打ちになる場合がある。
  • 狭い範囲に敵が固まってしまわないように、配置と移動範囲を調整する。
  • アイテムを使うと敵シンボルが見えるようになる。

けっこう良い方式だと思うのですが、採用しているゲームはほとんどないように思います。実はダメダメな方式だったらどうしようw

[ 天下御免!からくり屋敷 ] [ テクニック ] RubyでRubyを…

2011-10-08 14:11:23

数日間の苦闘の末、テキストにルビを振るシステムができあがりました!

和風RPGを制作する上では、どうしても難しい言葉とか固有名詞とかが出てきます。通常の西洋ファンタジーであれば、固有名詞はカタカナが中心ですし、ちょっと読めない人が多そうだと思った言葉は、簡単な言葉で置き換えたり、ひらがなに開いたりすることも可能ですが、和風だとそういうわけにもいきませんからね。「名刀こてつ」では攻撃力も半減しそうです。

いくつか既にルビ振りを可能にするスクリプト素材があるにはありましたが、ルビ振りのみで十分なのと、画面構成全体や文字表示など根幹の部分をいじるため、競合すると厄介なので、自力で実装しました。

ルビの分だけ1行の高さが変わりますし、会話メッセージだけでなく、アイテム名やモンスター名などもルビ振りをしたかったので(むしろそっちの方が重要)、かなり全シーンにわたって各ウィンドウの位置やサイズ調整が必要になりました。一瞬投げそうになったけど、やり始めてしまえば、思ったほど修正箇所は多くなかったかな。

というわけで、苦労の賜物↓

会話画面 ▲

装備変更画面 ▲

術選択画面 ▲

あとですね、一番の問題は、テキスト中にルビを入力するのが、けっこう面倒…。