【RGSS3】アクターの装備タイプをイベントで追加・削除したい

さくらて
記事: 7
登録日時: 2018年8月27日(月) 19:41

【RGSS3】アクターの装備タイプをイベントで追加・削除したい

投稿記事by さくらて » 2021年3月09日(火) 18:13

【RGSS3・VXace】

こんばんは。見てくださりありがとうございます。

早速質問なのですが、アクターの特徴の欄から設定できる「武器タイプ装備」「防具タイプ装備」をゲームイベント中に追加・削除したいのです。

具体例で例えますと、
物語序盤→アクター1の装備できる武器タイプは1番と4番。
中盤→1番が装備不可能になり2番が追加(4番も並行して装備可能)
終盤→4番が装備不可能になり5~8が装備可能

という感じです。この処理をアクター1だけでなく複数キャラに反映したいです。

スクリプトで実行できるかな?と思い色々調べたのですが、ヒットせず困り果てています。
どうかご教示お願いしますm(_ _)m

DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 【RGSS3】アクターの装備タイプをイベントで追加・削除したい

投稿記事by DEDEN » 2021年3月09日(火) 23:17

さくらて様 こんばんは
スクリプトを作成しますので少々お待ちください
TOMO
記事: 343
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: 【RGSS3】アクターの装備タイプをイベントで追加・削除したい

投稿記事by TOMO » 2021年3月10日(水) 00:36

DEDENさんがスクリプトを作るようだけど、
パッシブスキル系のスクリプトを使えば、「スキルの増減」で近いのが出来るのでは?
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 【RGSS3】アクターの装備タイプをイベントで追加・削除したい

投稿記事by DEDEN » 2021年3月10日(水) 03:07

さくらて様 お待たせしました
スクリプトが完成しました
使い方はイベントコマンドのスクリプトで
add_weapon_type(アクターID,武器タイプID)と実行すれば指定アクターに指定武器タイプIDを追加できます
add_armor_type(アクターID,防具タイプID)が防具追加です
delete_weapon_type(アクターID,武器タイプID)とすれば逆に装備不可にできます
防具も同様にdelete_armor_type(アクターID,防具タイプID)です
他の特徴も追加/削除できますが設定がややこしいので不明な点があればいつでもどうぞ
設定項目では職業からも特徴を削除するか設定できます
複数アクターで職業を共有している場合は他アクターにも影響を与えてしまうので注意してください
また、このスクリプトを導入した場合は導入前のセーブデータはエラーを起こすようになります
それを回避するためにはセーブしているマップに自動実行のイベントを作成し、
イベントコマンドのスクリプトでset_actor_dataと実行してください
その後セーブすればそのセーブデータは以降も使えるようになります
役目を終えたイベントは削除して大丈夫です

コード: 全て選択

#==============================================================================
# ■ アクター特徴追加/削除 Ver:1.00
#------------------------------------------------------------------------------
#  任意のタイミングでアクターの特徴を追加/削除できます
#==============================================================================
#==============================================================================
#  〇 使い方
#------------------------------------------------------------------------------
#  ● イベントコマンドのスクリプトでadd_weapon_type(アクターID,武器タイプID)
#     と実行すると指定したアクターの装備できる武器タイプが追加されます
#     また、add_armor_type(アクターID,防具タイプID)とした場合は防具タイプが
#     追加されます
#  ● イベントコマンドのスクリプトでdelete_weapon_type(アクターID,武器タイプID)
#     と実行すると指定したアクターの装備できる武器タイプが削除されます
#     また、delete_armor_type(アクターID,防具タイプID)とした場合は防具タイプが
#     削除されます
#  ● add_feature(アクターID,特徴ID,タイプID,設定値)と実行した場合はその他の
#     好きな特徴を追加できます
#     特徴IDはGame_BattlerBaseの定数を参照してください
#     タイプIDは特徴IDによって渡すべき値が変化します スキルの場合はスキルID
#     ステートの場合はステートID等です
#     設定値も特徴IDによって異なります
#     例:add_feature(1,11,1,0.5)
#     アクターID:1番に対して属性ID:1に*0.5の属性耐性を付与します
#  ● delete_feature(アクターID,特徴ID,タイプID,設定値)と実行した場合は
#     条件に合った特徴を検索して削除します
#     絞り込まない項目はnilを指定してください
#     例:delete_feature(1,11,nil,0.5)
#     アクターID:1番に対して*0.5倍の属性耐性を全て削除します
#==============================================================================
# ● 設定項目
#==============================================================================
module Deden
  module Actor_Feature
    #特徴を削除する際に職業からも削除するか否か
    #trueにすると指定アクターが属する職業の特徴からも削除されます
    #職業を複数アクターで共有している場合は他のアクターにも影響を
    #及ぼすのでご注意ください
    CLASS_FEATURES_DELETE = true
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● セットアップ
  #--------------------------------------------------------------------------
  alias setup_deden setup
  def setup(actor_id)
    create_actor_data(actor_id)
    setup_deden(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● アクターデータ作成
  #--------------------------------------------------------------------------
  def create_actor_data(actor_id)
    @actor_data = $data_actors[actor_id].dup
    @class_data = $data_classes[@actor_data.class_id].dup
  end
  #--------------------------------------------------------------------------
  # ● アクターオブジェクト取得
  #--------------------------------------------------------------------------
  def actor
    @actor_data
  end
  #--------------------------------------------------------------------------
  # ● クラスオブジェクト取得
  #--------------------------------------------------------------------------
  def class
    @class_data
  end
end
class Game_Interpreter
  include Deden::Actor_Feature
  #--------------------------------------------------------------------------
  # ● 武器タイプの追加
  #--------------------------------------------------------------------------
  def add_weapon_type(actor_id,type_id)
    add_feature(actor_id,51,type_id)
  end
  #--------------------------------------------------------------------------
  # ● 防具タイプの追加
  #--------------------------------------------------------------------------
  def add_armor_type(actor_id,type_id)
    add_feature(actor_id,52,type_id)
  end
  #--------------------------------------------------------------------------
  # ● 追加処理
  #--------------------------------------------------------------------------
  def add_feature(actor_id,code,type_id,value = 0.0)
    data = RPG::BaseItem::Feature.new
    data.code = code
    data.data_id = type_id
    data.value = value
    $game_actors[actor_id].actor.features.push(data)
  end
  #--------------------------------------------------------------------------
  # ● 武器タイプの削除
  #--------------------------------------------------------------------------
  def delete_weapon_type(actor_id,type_id)
    delete_feature(actor_id,51,type_id)
  end
  #--------------------------------------------------------------------------
  # ● 防具タイプの削除
  #--------------------------------------------------------------------------
  def delete_armor_type(actor_id,type_id)
    delete_feature(actor_id,52,type_id)
  end
  #--------------------------------------------------------------------------
  # ● 削除処理
  #--------------------------------------------------------------------------
  def delete_feature(actor_id,code,type_id = nil,value = nil)
    10.times do #何故か配列が飛ばされる場合があるので繰り返す 原因不明
    $game_actors[actor_id].actor.features.each do |i|
      if i.code == code && data_check(i.data_id,type_id) && data_check(i.value,value)
        $game_actors[actor_id].actor.features.delete(i)
      end
    end
    if CLASS_FEATURES_DELETE
      $game_actors[actor_id].class.features.each do |i|
      if i.code == code && data_check(i.data_id,type_id) && data_check(i.value,value)
        $game_actors[actor_id].class.features.delete(i)
      end
      end
    end
    end
  end
  #--------------------------------------------------------------------------
  # ● データチェック
  #--------------------------------------------------------------------------
  def data_check(id_1,id_2)
    id_1 == id_2 || id_2.nil? ? true : false
  end
  #--------------------------------------------------------------------------
  # ● セーブデータ救出用
  #--------------------------------------------------------------------------
  def set_actor_data
    size = $data_actors.size
    for n in 1 ... size
      $game_actors[n].create_actor_data(n)
    end
  end
end
最後に編集したユーザー DEDEN on 2021年3月10日(水) 03:11 [ 編集 2 回目 ]
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 【RGSS3】アクターの装備タイプをイベントで追加・削除したい

投稿記事by DEDEN » 2021年3月10日(水) 03:09

TOMO様
確かに再現できそうですね
しかし私のスクリプトの練習になったので良かったです
さくらて
記事: 7
登録日時: 2018年8月27日(月) 19:41

Re: 【RGSS3】アクターの装備タイプをイベントで追加・削除したい

投稿記事by さくらて » 2021年3月10日(水) 06:22

おはようございます。
確かにTOMO様の仰るスクリプトでも似たような動きができそうですね。こちらのリサーチ不足でした><

そしてDEDEN様、素晴らしいスクリプトを作って頂き本当にありがとうございます。
早速実装できました!セーブデータも大丈夫そうです。


短時間での解決で驚いています。
御二方、本当にありがとうございましたm(_ _)m!

“VX / Ace:質問” へ戻る