ダブルドロップカスタム


ダブルドロップのトレジャー獲得最大数の設定+微妙な修正。 また、ステートによるトレジャー、経験値、ゴールド獲得の変動を設定 ※このスクリプトは小さな本屋の改造素材です。 変更点 2007:12:27 ・獲得変動ステートの設定をカスタマイズポイントへ移行。 2009:03:17 ・ドロップ確率を個別に設定可能に 2009:03:18 ・不正チェック関数を追加 ・データベースでトレジャーを設定してない場合の処理を追加  (と、言うか、今までもできていた・・・) 2009:03:25 ・盗むカスタムの修正のための確率不正チェック関数の修正 2009:05:02 ・データベース上でドロップアイテムを設定せず、スティールアイテムのみ設定した場合、スティール確率が  データベースでトレジャーの設定を行ってない場合のトレジャー出現確率になっていたバグを修正 2011:07:01 ・トレジャー、経験値、ゴールド獲得をスクリプト上の設定からデータベース上の設定に変更 2012:03:03 ・module BMに設定したものをmodule Double_Dropに変更
ドロップアイテム設定
module XRXS_WDRP
  # エネミーデータ
  def self.data(id)
    data = []
    data[1] = [[50, $data_items[68]]]
    data[2] = [[nil, $data_items[68]]]
    return data[id]
  end
  #
  # ※記述例
  #  data[1] = [[50, $data_items[68]]]
  #  →エネミー1は50%の確率でアイテム68を落とす
  #
  #  data[2] = [[nil, $data_items[68]]]
  #  →エネミー2はデータベースで設定した確率でアイテム68を落とす
  #   (もしデータベースでトレジャーを設定してない場合はスクリプト
  #    本体のカスタマイズポイントで設定した確率で落とす)
  #
end
スクリプト本体
#----------------------------------------------------------------------------
# ダブル・ドロップ貪藻矢射妥←カスタム By 貪藻矢射妥←
# 微妙に使いづらいです・・・多分(をひ)
#----------------------------------------------------------------------------
# 原作:     ▼▲▼ XRXS79. ダブル・ドロップ ▼▲▼
# 原作者:   森穂様、XRXS.様
# HP:       小さな本屋 
# アドレス: http://xrxs.at-ninja.jp/
#
# 改造内容:
# ・トレジャー獲得最大数の設定
# ・トレジャー、経験値、ゴールド獲得の変動ステートを設定
# ・ダブルドロップにて個別にゲット確率を設定可能に
#============================================================================
# 変更点
# 
# 2007:12:27
# ・獲得変動ステートの設定をカスタマイズポイントへ移行。
# 
# 2009:03:17
# ・ドロップ確率を個別に設定可能に
# 
# 2009:03:18
# ・不正チェック関数を追加
# ・データベースでトレジャーを設定してない場合の処理を追加
#  (と、言うか、今までもできていた・・・)
# 
# 2009:03:25
# ・盗むカスタムの修正のための確率不正チェック関数の修正
# 
# 2009:05:02
# ・データベース上でドロップアイテムを設定せず、スティールアイテムのみ設定した
#  場合、スティール確率がデータベースでトレジャーの設定を行ってない場合の
#  トレジャー出現確率になっていたバグを修正
# 
# 2011:07:01
# ・トレジャー、経験値、ゴールド獲得をスクリプト上の設定からデータベース上の
#  設定に変更
# 
# 2012:03:03
# ・module BMに設定したものをmodule Double_Dropに変更

#==============================================================================
# カスタマイズ・ポイント
#==============================================================================
module Double_Drop
  # データベースでトレジャーの設定を行ってない場合のトレジャー出現確率
  # 通常、何も設定を行わないと100になっています。
  ST_R = 75
  # スクリプトで設定した値が 0 < X <= 100 でない場合にエラーとするか
  # 範囲内に収めるかのフラグ。
  ERR_FLG = true
  
  #============================================================================
  # ○ 確率の不正チェック関数
  # prob  : チェックする値
  # enemy : エネミー
  #============================================================================
  def ck_value(prob, enemy, flg=false)
    
    if enemy.is_a?(Game_Enemy)
      probX = prob == nil ? enemy.treasure_prob : prob
      if enemy.item_id == 0 && enemy.weapon_id == 0 && enemy.armor_id == 0 && 
        !flg
        probX = ST_R
      end
    else
      probX = prob == nil ? ST_R : prob
    end
    
    if probX <= 0 || probX > 100
      if ERR_FLG
        p "値が不正です。"
        return nil
      else
        return [[probX, 1].max, 100].min
      end
    else
      return probX
    end
  end
end

module IGE
  # トレジャー獲得最大数
  # トレジャー獲得最大数が『0..n』なので0〜nまでの数値になります。
  # (設定した数+1が最大の獲得数になります)
  TRE_MAX = 9
  
  GOLD_NAME = "ゴールド"
  EXP_NAME  = "経験値"
  TREJ_NAME = "トレジャー"
  
  def get_rate(actor, kind)
    get_rates = {
      GOLD_NAME => 100, 
      EXP_NAME  => 100, 
      TREJ_NAME => 100
    }
    armor_list  = [actor.armor1_id, actor.armor2_id, actor.armor3_id, 
                   actor.armor4_id]

    for armor_id in armor_list
      next if armor_id == 0
      tmp_armor = $data_armors[armor_id]
    case kind
    when GOLD_NAME
      for id in tmp_armor.guard_state_set
        if $data_states[id].name =~ /^#{GOLD_NAME}([0-9]+)(%|%)/
          if get_rates[GOLD_NAME] == 100
            get_rates[GOLD_NAME] = $1.to_i
          else
            get_rates[GOLD_NAME] += $1.to_i
          end
        end
        if  $data_states[id].name =~ /^#{GOLD_NAME}(None)/
          get_rates[GOLD_NAME] = 0
        end
      end
    when EXP_NAME
      for id in tmp_armor.guard_state_set 
        if $data_states[id].name =~ /^#{EXP_NAME}([0-9]+)(%|%)/
          if get_rates[EXP_NAME] == 100
            get_rates[EXP_NAME] = $1.to_i
          else
            get_rates[EXP_NAME] += $1.to_i
          end
        end
        if $data_states[id].name =~ /^#{EXP_NAME}(None)/
          get_rates[GOLD_NAME] = 0
        end
      end
    when TREJ_NAME
      for id in tmp_armor.guard_state_set 
        if $data_states[id].name =~ /^#{TREJ_NAME}([0-9]+)(%|%)/
          if get_rates[TREJ_NAME] == 100
            get_rates[TREJ_NAME] = $1.to_i
          else
            get_rates[TREJ_NAME] += $1.to_i
          end
        end
        if $data_states[id].name =~ /^#{TREJ_NAME}(None)/
          get_rates[GOLD_NAME] = 0
        end
      end
    else
      p "種別が不正です。"
      return 100
    end
    end
    
    return get_rates[kind]
  end
  
  # 諸注意:上記の獲得変動ステートが重複して装備した場合、効果が重なり合い、
  # 場合によってはゴールドもEXPも手に入らなくなる可能性があります。
  # よって、(ステートが防具に付加する場合は)Tetra-Z氏の排他装備(あるいは
  # 排他装備inパーティー)を併用することをお勧めします。
  # (ちなみに、そのスクリプトを使用する場合はさらにTetra-Z作「TETRAZ.排他理論」と
  # XMS.「XRXS.装備属性取得機構」が必要になります、)
end
#==============================================================================
# ■ Scene_Battle (分割定義 2)
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle
  include IGE
  include Double_Drop
  include XRXS_WDRP
  include BM
  #--------------------------------------------------------------------------
  # ● アフターバトルフェーズ開始
  #--------------------------------------------------------------------------
  def start_phase5
    # フェーズ 5 に移行
    @phase = 5
    # バトル終了 ME を演奏
    $game_system.me_play($game_system.battle_end_me)
    # バトル開始前の BGM に戻す
    $game_system.bgm_play($game_temp.map_bgm)
    # EXP、ゴールド、トレジャーを初期化
    exp = 0
    gold = 0
    treasures = []
    gold_rate = 1
    # ループ
    for enemy in $game_troop.enemies
      # エネミーが隠れ状態でない場合
      unless enemy.hidden
        # 獲得 EXP、ゴールドを追加
        exp += enemy.exp
        gold += enemy.gold
        # トレジャー出現乱数の初期値を設定
        prob = 100
        # ステート[アイテム出現n倍]になっている場合
        for i in 0...$game_party.actors.size
          actor = $game_party.actors[i]
          # トレジャー出現確率の変動
          prob /= (get_rate(actor, TREJ_NAME) / 100.0)
          prob = Integer(prob)
        end
        # トレジャー出現判定
        if rand(prob) < enemy.treasure_prob
          if enemy.item_id > 0
            treasures.push($data_items[enemy.item_id])
          end
          if enemy.weapon_id > 0
            treasures.push($data_weapons[enemy.weapon_id])
          end
          if enemy.armor_id > 0
            treasures.push($data_armors[enemy.armor_id])
          end
        end
      end
    end
    
    #
    # [タブル・ドロップ]
    #
    for enemy in $game_troop.enemies
      # エネミーが隠れ状態でない場合
      unless enemy.hidden
        data = XRXS_WDRP.data(enemy.id)
        if data.is_a?(Array)
          for i in 0...data.size
            #probX = data[i][0] == nil ? enemy.treasure_prob : data[i][0]
            probX = ck_value(data[i][0], enemy)
            if data[i][1] != nil and rand(prob) < probX
              # 入手!
              treasures.push(data[i][1])
            end
          end
        end
      end
    end
    #
    #
    #
    
    # トレジャーの数を TRE_MAX個までに設定
    treasures = treasures[0..TRE_MAX]
    # EXP 獲得
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      if actor.cant_get_exp? == false
        last_level = actor.level
        # EXP獲得変動
        @exp_flag = false
        actor.exp += Integer(exp * get_rate(actor, EXP_NAME) / 100.0)
        if actor.level > last_level
          @status_window.level_up(i)
        end
      end
    end
    
    for i in 0...$game_party.actors.size
    actor = $game_party.actors[i]
      # ゴールド獲得の変動
      gold *= (get_rate(actor, GOLD_NAME) / 100.0)
      gold = Integer(gold)
    end
    
    # ゴールド獲得
    $game_party.gain_gold(gold)
    # トレジャー獲得
    for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    # バトルリザルトウィンドウを作成
    @result_window = Window_BattleResult.new(exp, gold, treasures)
    # ウェイトカウントを設定
    @phase5_wait_count = 100
  end
end
カスタマイズポイント解説(・・・言わなくても分かるような・・・) 薄緑色の部分にてトレジャーの最大獲得数(-1)を設定。 薄橙色の部分にてトレジャー獲得変動の属性名称ベースを設定。 薄赤色にて経験値変動の属性名称ベースを設定。 薄紫色の部分にてゴールド変動の属性名称ベースを設定。 あとは上記のようにデータベースで設定を行います。 ※〜None は取得しない場合の属性となります。 ※獲得変動ステートが重複して装備した場合、効果が重なり合い、場合によってはゴールドもEXPも手に入らなく なる可能性があります。 よって、(ステートが防具に付加する場合は)Tetra-Z氏の排他装備(あるいは排他装備inパーティー)を 併用することをお勧めします。 (ちなみに、そのスクリプトを使用する場合はさらに  Tetra-Z作「TETRAZ.排他理論」とXMS.「XRXS.装備属性取得機構」が必要になります。)

戻る