戦闘中スキル説明文にステータス表示

せくもん
記事: 36
登録日時: 2018年6月09日(土) 21:48

戦闘中スキル説明文にステータス表示

投稿記事by せくもん » 2019年7月09日(火) 21:37

いつもお世話になっております。
現在製作中のゲームで戦闘中、全てのスキルの説明文にそのスキルの性能表示を
盛り込む為、画像の様に加筆しました。

ツクマテ質問用.png
ツクマテ質問用.png (299.35 KiB) 閲覧数: 1772 回


現状では『速度』にスキルの速度補正、『成功』にはスキルの成功率
『威力』にはダメージ計算式の定数(150 + a.mat * 2 - b.mdf * 2 だったら 150)
をそのまま入れてありますが、これにスキル使用者の能力値を加算して
戦闘中のバフやデバフによる変化に応じて数字が変動するようにしたいのですが

『威力』に関してはスキル毎に計算式が違う為に難しいと思いますが
『速度』に速度補正 + 使用者の敏捷度
『成功』に成功率 + 使用者の運

…と下の2つだけでも計算結果を代入する良い方法はありませんでしょうか?

ぽんぽこねるそん
記事: 38
登録日時: 2018年10月26日(金) 12:24

Re: 戦闘中スキル説明文にステータス表示

投稿記事by ぽんぽこねるそん » 2019年7月10日(水) 01:21

せくもんさん、こんばんは。
デフォルトだと使用者が分からないのでヘルプウィンドウにアクターも渡すようにして
制御文字で計算結果を表示できるようにすればいいかと思います。

コード: 全て選択

module USABLEITEM_HELP_FORMAT
  #速度補正のフォーマット
  SPD_FORMAT = '速度:%4d'
  #成功率のフォーマット
  SUC_FORMAT = '成功:%3d'
end
#==============================================================================
# ■ Window_Help
#------------------------------------------------------------------------------
#  スキルやアイテムの説明、アクターのステータスなどを表示するウィンドウです。
#==============================================================================

class Window_Help < Window_Base
  include USABLEITEM_HELP_FORMAT
  #--------------------------------------------------------------------------
  # ● 制御文字の事前変換
  #    実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。
  #    文字「\」はエスケープ文字(\e)に変換。
  #--------------------------------------------------------------------------
  def convert_escape_characters(text)
    result = super
    result.gsub!(/\eSPD/i)          { item_speed_text }
    result.gsub!(/\eSUC/i)          { item_success_rate_text }
    result
  end
  #--------------------------------------------------------------------------
  # ● テキスト設定
  #--------------------------------------------------------------------------
  def set_text(text)
    if text != @text
      @text = convert_escape_characters(text)
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム設定
  #     item : スキル、アイテム等
  #--------------------------------------------------------------------------
  alias org_set_item set_item
  def set_item(item)
    @item = item
    org_set_item(item)
  end
  #--------------------------------------------------------------------------
  # ● アクターの設定
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 追加した制御文字を使用するか判定
  #--------------------------------------------------------------------------
  def add_control_character?
    return false unless @item.is_a?(RPG::UsableItem)
    return false unless @actor.is_a?(Game_Battler)
    return true
  end
  #--------------------------------------------------------------------------
  # ● アイテムの速度補正のテキスト取得
  #--------------------------------------------------------------------------
  def item_speed_text
    return "" unless add_control_character?
    return sprintf(SPD_FORMAT, @item.speed + @actor.agi)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの成功率のテキスト取得
  #--------------------------------------------------------------------------
  def item_success_rate_text
    return "" unless add_control_character?
    return sprintf(SUC_FORMAT, @item.success_rate + @actor.luk)
  end
end

#==============================================================================
# ■ Window_SkillList
#------------------------------------------------------------------------------
#  スキル画面で、使用できるスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_SkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  alias org_update_help update_help
  def update_help
    org_update_help
    @help_window.actor = @actor
  end
end
#==============================================================================
# ■ Scene_Skill
#------------------------------------------------------------------------------
#  スキル画面の処理を行うクラスです。処理共通化の便宜上、スキルも「アイテム」
# として扱っています。
#==============================================================================

class Scene_Skill < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● アイテムの使用
  #--------------------------------------------------------------------------
  alias org_use_item use_item
  def use_item
    super
    org_use_item
    @item_window.update_help
  end
end

※ヘルプウィンドウにのみ制御文字を追加しているのでスクリプトで他のウィンドウに
スキルの説明を表示させているとそのウィンドウだとうまく表示されないと思います。
せくもん
記事: 36
登録日時: 2018年6月09日(土) 21:48

Re: 戦闘中スキル説明文にステータス表示

投稿記事by せくもん » 2019年7月10日(水) 22:34

ぽんぽこねるそん様、ご返答ありがとうございます。

なるほど、使用者の情報を認識させれば制御文字の使用は可能だったのですね。
これは気が付きませんでした。

『他のウィンドウにスキルの説明を表示させる』みたいな処理は行なっていないので
その点は問題ありません。

ところで、ツクマテさんの掲示板では自分の環境だと『半角の¥』が
『\』に文字化けする現象が起こるのですが
コード中の『\』は『半角の¥』に置き換える…という解釈で良いのでしょうか?
ぽんぽこねるそん
記事: 38
登録日時: 2018年10月26日(金) 12:24

Re: 戦闘中スキル説明文にステータス表示

投稿記事by ぽんぽこねるそん » 2019年7月10日(水) 23:25

[¥]が[\]になっているのはフォントの問題なので気にしなくて大丈夫です。
せくもん
記事: 36
登録日時: 2018年6月09日(土) 21:48

Re: 戦闘中スキル説明文にステータス表示

投稿記事by せくもん » 2019年7月11日(木) 22:46

ぽんぽこねるそん様、ご返答ありがとうございます。

文字化けの件はコードを丸ごとメモ帳などにコピペする事で復旧できました。
スクリプトを導入して試したところ、バフやデバフで能力値が変動する度に
きちんと数字が変化する事が確認できましたが
毎戦闘ごとにスキルのメニューを最初に開いた時に最初にカーソルが合っている
スキルの制御文字部分が空白になるみたいです。
一度メニューを閉じて再度、魔法や特技のコマンドを選択するか
別のスキルにカーソルを移動してから戻すと直る様ですが…
ぽんぽこねるそん
記事: 38
登録日時: 2018年10月26日(金) 12:24

Re: 戦闘中スキル説明文にステータス表示

投稿記事by ぽんぽこねるそん » 2019年7月12日(金) 01:44

修正したので申し訳ありませんがこちらに差し替えてください。

コード: 全て選択

module USABLEITEM_HELP_FORMAT
  #速度補正のフォーマット
  SPD_FORMAT = '速度:%4d'
  #成功率のフォーマット
  SUC_FORMAT = '成功:%3d'
end
#==============================================================================
# ■ Window_Help
#------------------------------------------------------------------------------
#  スキルやアイテムの説明、アクターのステータスなどを表示するウィンドウです。
#==============================================================================

class Window_Help < Window_Base
  include USABLEITEM_HELP_FORMAT
  #--------------------------------------------------------------------------
  # ● 制御文字の事前変換
  #    実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。
  #    文字「\」はエスケープ文字(\e)に変換。
  #--------------------------------------------------------------------------
  def convert_escape_characters(text)
    result = super
    result.gsub!(/\eSPD/i)          { item_speed_text }
    result.gsub!(/\eSUC/i)          { item_success_rate_text }
    result
  end
  #--------------------------------------------------------------------------
  # ● テキスト設定
  #--------------------------------------------------------------------------
  def set_text(text)
    if text != @text
      @text = convert_escape_characters(text)
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム設定
  #     item : スキル、アイテム等
  #--------------------------------------------------------------------------
  alias org_set_item set_item
  def set_item(item)
    @item = item
    org_set_item(item)
  end
  #--------------------------------------------------------------------------
  # ● アクターの設定
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    set_item(@item)
  end
  #--------------------------------------------------------------------------
  # ● クリア
  #--------------------------------------------------------------------------
  alias org_clear clear
  def clear
    org_clear
    @item = nil
    @actor = nil
  end
  #--------------------------------------------------------------------------
  # ● 追加した制御文字を使用するか判定
  #--------------------------------------------------------------------------
  def add_control_character?
    return false unless @item.is_a?(RPG::UsableItem)
    return false unless @actor.is_a?(Game_Battler)
    return true
  end
  #--------------------------------------------------------------------------
  # ● アイテムの速度補正のテキスト取得
  #--------------------------------------------------------------------------
  def item_speed_text
    return "" unless add_control_character?
    return sprintf(SPD_FORMAT, @item.speed + @actor.agi)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの成功率のテキスト取得
  #--------------------------------------------------------------------------
  def item_success_rate_text
    return "" unless add_control_character?
    return sprintf(SUC_FORMAT, @item.success_rate + @actor.luk)
  end
end

#==============================================================================
# ■ Window_SkillList
#------------------------------------------------------------------------------
#  スキル画面で、使用できるスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_SkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  alias org_update_help update_help
  def update_help
    org_update_help
    @help_window.actor = @actor
  end
end
せくもん
記事: 36
登録日時: 2018年6月09日(土) 21:48

Re: 戦闘中スキル説明文にステータス表示

投稿記事by せくもん » 2019年7月12日(金) 22:44

ぽんぽこねるそん様、ご返答ありがとうございます。

新しく作っていただいたスクリプトを試したところ無事に制御文字を表示する事が出来ました。
こちらこそ再度お手数をおかけしてしまい申し訳ありません。
どうもありがとうございました。
せくもん
記事: 36
登録日時: 2018年6月09日(土) 21:48

Re: 戦闘中スキル説明文にステータス表示

投稿記事by せくもん » 2019年7月27日(土) 21:36

[url]
viewtopic.php?f=43&t=8099
[/url]
↑のトピックでメモ欄を用いてスキルにパラメータを追加する方法を教えて頂いたので
これを応用して威力値が変動出来る様にならないか試してみました。

コード: 全て選択

module USABLEITEM_HELP_FORMAT
  #物理威力のフォーマット
  POW_FORMAT = '威力:%3d'
  #魔法威力のフォーマット
  MPO_FORMAT = '威力:%3d'
  #速度補正のフォーマット
  SPD_FORMAT = '速度:%4d'
  #成功率のフォーマット
  SUC_FORMAT = '成功:%3d'
end
class RPG::UsableItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● スキルやアイテムの威力基本値
  #--------------------------------------------------------------------------
  def item_power
    return @item_power if @item_power
    @item_power = /<威力基本値:(\d+)>/ =~ note ? $1.to_i : USABLEITEM_HELP_FORMAT
    @item_power
  end
end
#==============================================================================
# ■ Window_Help
#------------------------------------------------------------------------------
#  スキルやアイテムの説明、アクターのステータスなどを表示するウィンドウです。
#==============================================================================

class Window_Help < Window_Base
  include USABLEITEM_HELP_FORMAT
  #--------------------------------------------------------------------------
  # ● 制御文字の事前変換
  #    実際の描画を始める前に、原則として文字列に変わるものだけを置き換える。
  #    文字「\」はエスケープ文字(\e)に変換。
  #--------------------------------------------------------------------------
  def convert_escape_characters(text)
    result = super
    result.gsub!(/\ePOW/i)          { item_physical_power_text }
    result.gsub!(/\eMPO/i)          { item_magical_power_text }
    result.gsub!(/\eSPD/i)          { item_speed_text }
    result.gsub!(/\eSUC/i)          { item_success_rate_text }
    result
  end
  #--------------------------------------------------------------------------
  # ● テキスト設定
  #--------------------------------------------------------------------------
  def set_text(text)
    if text != @text
      @text = convert_escape_characters(text)
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム設定
  #     item : スキル、アイテム等
  #--------------------------------------------------------------------------
  alias org_set_item set_item
  def set_item(item)
    @item = item
    org_set_item(item)
  end
  #--------------------------------------------------------------------------
  # ● アクターの設定
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    set_item(@item)
  end
  #--------------------------------------------------------------------------
  # ● クリア
  #--------------------------------------------------------------------------
  alias org_clear clear
  def clear
    org_clear
    @item = nil
    @actor = nil
  end
  #--------------------------------------------------------------------------
  # ● 追加した制御文字を使用するか判定
  #--------------------------------------------------------------------------
  def add_control_character?
    return false unless @item.is_a?(RPG::UsableItem)
    return false unless @actor.is_a?(Game_Battler)
    return true
  end
  #--------------------------------------------------------------------------
  # ● アイテムの物理威力のテキスト取得
  #--------------------------------------------------------------------------
  def item_physical_power_text
    return "" unless add_control_character?
    return sprintf(POW_FORMAT, @item.item_power + @actor.atk)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの魔法威力のテキスト取得
  #--------------------------------------------------------------------------
  def item_magical_power_text
    return "" unless add_control_character?
    return sprintf(MPO_FORMAT, @item.item_power + @actor.mat)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの速度補正のテキスト取得
  #--------------------------------------------------------------------------
  def item_speed_text
    return "" unless add_control_character?
    return sprintf(SPD_FORMAT, @item.speed + @actor.agi)
  end
  #--------------------------------------------------------------------------
  # ● アイテムの成功率のテキスト取得
  #--------------------------------------------------------------------------
  def item_success_rate_text
    return "" unless add_control_character?
    return sprintf(SUC_FORMAT, @item.success_rate + @actor.luk)
  end
end

#==============================================================================
# ■ Window_SkillList
#------------------------------------------------------------------------------
#  スキル画面で、使用できるスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_SkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  alias org_update_help update_help
  def update_help
    org_update_help
    @help_window.actor = @actor
  end
end


これで、メモ欄に<威力基本値:150>等と記入する事で攻撃力や魔法攻撃力の変化に伴い
威力の数字も変動させる事が出来る様になりました。

ところで

コード: 全て選択

class RPG::UsableItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● スキルやアイテムの威力基本値
  #--------------------------------------------------------------------------
  def item_power
    return @item_power if @item_power
    @item_power = /<威力基本値:(\d+)>/ =~ note ? $1.to_i : USABLEITEM_HELP_FORMAT
    @item_power
  end
end

の中の『 : USABLEITEM_HELP_FORMAT』の部分は
当初、エラーが出るので試しに入れてみたら収まったのですが
『:』や『::』は何の処理をしているものなんでしょうか?
ぽんぽこねるそん
記事: 38
登録日時: 2018年10月26日(金) 12:24

Re: 戦闘中スキル説明文にステータス表示

投稿記事by ぽんぽこねるそん » 2019年7月27日(土) 23:50

せくもんさん、こんばんは。
ご自身でスキルの威力を表示できるようにされたのですね!すごいです!
自分の作ったものを参考?にして頂けると、微力ながらせくもんさんのお力になれたのかなと
とてもうれしく思います。

それで本題ですが
『:』は

コード: 全て選択

条件式 ? 真の時の値 : 偽の時の値

で要は条件分岐をしています。

コード: 全て選択

if 条件式
真の時の値
else
偽の時の値
end

これと同じです。
一々if~と書くのが面倒なので簡潔に書けるこっちを使っているだけです。

これが無かった時にエラーが出たのは
メモ欄から正規表現で威力を取得していてそのままだと文字列のままなので整数に変換しているのですが
取得できなかったときは変換ができないのでエラーになっていたわけです。
今のままだとモジュールが入っちゃっているので説明文に『\POW』と書いていて
スキルに威力が設定されていない時にエラーになるので数値が入る用に直しておいた方がいいです。

『::』はモジュールの定数やメソッドを呼び出しています。
せくもん
記事: 36
登録日時: 2018年6月09日(土) 21:48

Re: 戦闘中スキル説明文にステータス表示

投稿記事by せくもん » 2019年7月28日(日) 21:44

ぽんぽこねるそん様、ご返答ありがとうございます。

RGSSはまだまだ初心者の域ですが、ぽんぽこねるそんさんのスクリプトは
関数にひとつひとつ見出しが付いているので『この def ~ end で何の処理をしているのか?』が
分かりやすくて、とても助かります。

『:』の件は、よく調べたら『絶対被弾』の際に一度聞いてましたね。
失礼しました。

つまり

<威力基本値:0>

コード: 全て選択

@item_power = /<威力基本値:(\d+)>/ =~ note ? $1.to_i : 0


コード: 全て選択

module POWER
  SKILL_POWER = 0
end

@item_power = /<威力基本値:(\d+)>/ =~ note ? $1.to_i : POWER :: SKILL_POWER


これらは全て同じと考えて良いのでしょうか?

“VX / Ace:質問” へ戻る