クラス詳細化 + 進化



クラス名だけ違う、あるいは似たようなクラスを作成した時、武器や防具を追加、削除した時の対応が
煩わしい・・・ってのをラクさせようというもの。

装備品はすべて装備品のサブクラスで装備可能なものをスクリプトで整理します。

また、ステート、属性有効度も拡張してみます。

※メインクラスにはそのキャラ固有の装備しか設定しないので、初期装備ができなくなっちゃいます。
 すみません。

ちなみに、スクリプトで
class_evolve(ID, value)
を行うとクラスの進化が可能です。

貪藻矢射妥←ダイヤモンドベースモジュールが必要です。

変更点
2011:07:01
・属性詳細化 Plus改修にともなう変更

2024:02:01
・多刀流の処理変更
・外部フラグ追加

#==============================================================================
# ■ クラス詳細化 + 進化 By 貪藻矢射妥←
# 
# クラス名だけ違う、あるいは似たようなクラスを作成した時、武器や防具を
# 追加、削除した時の対応が煩わしい・・・ってのをラクさせようというもの。
# 
# 装備品はすべて装備品のサブクラスで装備可能なものをスクリプトで整理します。
# 
# また、ステート、属性有効度も拡張してみます。
#
# ※メインクラスにはそのキャラ固有の装備しか設定しないので、初期装備が
#  できなくなっちゃいます。すみません。
# 
# ちなみに、スクリプトで
# class_evolve(ID, value)
# を行うとクラスの進化が可能です。
# 
# 
#==============================================================================
# 更新っぽいもの
# 2011:07:01
# ・属性詳細化 Plus改修にともなう変更
#
# 2024:02:01
# ・多刀流の処理変更
# ・外部フラグ追加

$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Class_Evolve"] = true

module CLASS_EVOLVE
  CLS_RANK = {
  "S" => 0, 
  "A" => 1, 
  "B" => 2, 
  "C" => 3, 
  "D" => 4, 
  "E" => 5, 
  "F" => 6, 
  "G" => 7, 
  "H" => 8
  }
  
  #                      -S-   -A-   -B-   -C-   -D-   -E-   -F-   -G-   -H-
  STATE_RANK_TABLE   = [ 100,   90,   80,   60,   50,   40,   20,   10,    0]
  ELEMENT_RANK_TABLE = [ 225,  200,  150,  100,   50,    0,  -50, -100, -120]
  
  CLS_E_SET = {
    # ID => [["Class name", {Evolve Element Ranks}, {Ecolve State Ranks}]...]
     1 => [["運の女神", nil, nil], 
           ["\\r[歳殺月天,さいさつげってん]", {1=>"D", 2=>"D", 3=>"D", 4=>"D", 5=>"D", 6=>"D", 7=>"D", 8=>"D", 9=>"D"}, {14=>"F"}], 
           ["位の\\r[御子,みこ]", nil, {2=>"D", 3=>"D", 4=>"D", 6=>"D", 7=>"D", 8=>"D"}]], 
     2 => [["拳帝", nil, nil], 
           ["魔封拳帝", {1=>"D", 2=>"D", 3=>"D", 4=>"D", 5=>"D", 6=>"D", 7=>"D", 8=>"D", 9=>"D"}, nil], 
           ["世界を見守る者", nil, nil]], 
     3 => [["侍", nil, nil], 
           ["剣聖", {7=>"E", 8=>"E"}, {4=>"E", 6=>"E", 7=>"E", 18=>"E"}]], 
     4 => [["ガンマン", nil, nil], 
           ["スナイパー", nil, nil]], 
     5 => [["剣客", nil, nil], 
           ["百合剣客", nil, nil]], 
     6 => [["\\r[槍使い,ランサー]", nil, nil], 
           ["雀聖\\r[槍使い,ランサー]", nil, nil]], 
     7 => [["剣客", nil, nil], 
           ["シスコン剣客", nil, nil]], 
     
     9 => [["敏腕警部", nil, nil], 
           ["真理からの\\r[帰還者,リターナー]", nil, nil], 
           ["世界を管理する者", nil, nil]], 
    10 => [["トレジャーハンター", nil, nil], 
           ["真理への\\r[探求者,シーカー]", nil, nil], 
           ["世界を動かす者", nil, nil]], 
    
    12 => [["\\r[明殺,みょうさつ]者", nil, nil], 
           ["\\r[黄幡,おうばん]の\\r[明殺,みょうさつ]者", nil, nil]], 
    13 => [["\\r[赤眉,チーメイ]", nil, nil], 
           ["夢幻なる\\r[赤眉,チーメイ]", nil, nil]], 
    14 => [["\\r[壬生狼,みぶろ]", nil, nil], 
           ["\\r[豹尾,ひょうび]の\\r[壬生狼,みぶろ]", nil, nil]], 
    15 => [["侍の卵", nil, nil], 
           ["\\r[天下太陰,てんげだいおん]", {1=>"D", 4=>"D", 5=>"D", 6=>"D"}, nil]], 
    16 => [["侍の卵", nil, nil], 
           ["\\r[天下太陰,てんげだいおん]", {1=>"D", 4=>"D", 5=>"D", 6=>"D"}, nil]], 
    
    18 => [["\\r[天然な殺し屋,お気楽マーダー]", {1=>"G"}, {12=>"H"}], 
           ["夢見る\\r[殺し屋,スイーパー]", {1=>"H", 2=>"C", 4=>"C"}, nil]], 
    19 => [["\\r[絶対の破壊者,Breaker of Absolute]", nil, nil], 
           ["夢幻なる\\r[絶対の破壊者,Breaker of Absolute]", nil, nil]], 
    
    21 => [["女侍", nil, {4=>"H"}], 
           ["心眼な女侍", nil, nil]], 
    22 => [["女侍", nil, nil], 
           ["義風な女侍", nil, nil]], 
    23 => [["女侍", nil, nil], 
           ["豪快な女侍", nil, nil]], 
    24 => [["女侍", nil, nil], 
           ["策士な女侍", nil, nil]], 
    25 => [["女侍", nil, nil], 
           ["神秘な女侍", nil, nil]], 
    
    27 => [["剣豪", nil, nil], 
           ["\\r[素盞嗚尊,スサノオノミコト]", {1=>"D", 2=>"D", 3=>"D"}, nil]], 
    28 => [["隠密", nil, {3=>"H", 7=>"H", 14=>"H"}], 
           ["伊賀忍軍棟梁", nil, nil]], 
    
    30 => [["元\\r[歳殺陽天,さいさつようてん]", nil, nil], 
           ["運の女神の姉", {1=>"C", 2=>"C", 3=>"C", 4=>"C", 5=>"C", 6=>"C", 7=>"C", 8=>"C", 9=>"C"}, {14=>"D"}], 
           ["力の寵児", {1=>"D", 2=>"D", 3=>"D", 4=>"D", 5=>"D", 6=>"D", 7=>"D", 8=>"D", 9=>"D"}, {2=>"D", 3=>"D", 7=>"D", 8=>"D", 14=>"E"}]], 
    31 => [["危険な姐御", nil, {2=>"H", 14=>"H", 18=>"H"}], 
           ["運の女帝", nil, nil]], 
    
    33 => [["通りすがりの侍", nil, {18=>"H"}], 
           ["\\r[天蓋,てんがい]の\\r[徒,あだ]", nil, nil], 
           ["氷姫", nil, nil]], 
    34 => [["剣鬼", nil, {14=>"H"}], 
           ["孤高の剣鬼", nil, nil]], 
    
    40 => [["小説書き", nil, nil], 
           ["絵描き", nil, nil], 
           ["多芸は無芸", nil, nil]]
  }
  
  SUB_CLSID = {
    # ID => [[Weapon Sub Class IDs...], [Armor Sub Class IDs...]]
     1 => [[51, 52, 55, -66],         [72, 73, 74]], 
     2 => [[56, 60],                  [71, 73]], 
     3 => [[53, 60],                  [71, 73]], 
     4 => [[59, 60],                  [71, 73]], 
     5 => [[51, 52, 55, -66],         [72, 73, 74]], 
     6 => [[54, 60],                  [72, 73, 74]], 
     7 => [[51, 52, 53, 60],          [71, 73]], 
    
     9 => [[51, 52, 53, 55, 60],      [71, 73]], 
    10 => [[57, 60],                  [71, 73]], 
    
    12 => [[52, 53, 55, 60],          [71, 73]], 
    13 => [[51, 52, 53, 55, 60],      [72, 73, 74]], 
    14 => [[52, 55, 60],              [72, 73, 74]], 
    15 => [[51, 52, 54, 60, -66],     [72, 73, 74]], 
    16 => [[51, 52, 54, 60, -66],     [72, 73, 74]], 
    
    18 => [[51, 52, 55, 60],          [71, 73]], 
    19 => [[51, 52, 53, 54, 55, 60],  [72, 73, 74]], 
    
    21 => [[52, 54, 60],              [72, 73, 74]], 
    22 => [[52, 54, 60],              [72, 73, 74]], 
    23 => [[52, 60],                  [71, 72, 73, 74]], 
    24 => [[52, 60, -66],             [72, 73, 74]], 
    25 => [[52, 53, 60],              [72, 73, 74]], 
    
    27 => [[51, 52, 53, 54, 60],      [71, 73]], 
    28 => [[51, 52, 53, 54, 55, 60],  [71, 73]], 
    
    30 => [[51, 52, 53, 60],          [72, 73, 74]], 
    31 => [[51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [71, 72, 73, 74]], 
    
    33 => [[51, 52, 55, 60],          [72, 73, 74]], 
    34 => [[52, 60],                  [71, 72, 73, 74]], 
    
    40 => [[51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [71, 72, 73, 74]], 
  }
  
  #--------------------------------------------------------------------------
  # ● サブクラスによる装備品配列取得
  # flg : 0(Weapon)/1(Armor)
  #--------------------------------------------------------------------------
  def get_equip_set(actor_id, flg)
    
    @actor_tmp = $data_actors[actor_id]
    
    sub_set = SUB_CLSID[@actor_tmp.id][flg]
    case flg
    when 0 # 武器の場合
      rslt_set = $data_classes[@actor_tmp.class_id].weapon_set
      for index in sub_set
        if index > 0
          rslt_set += $data_classes[index].weapon_set
        else
          rslt_set -= $data_classes[-index].weapon_set
        end
      end
    when 1 # 防具の場合
      rslt_set = $data_classes[@actor_tmp.class_id].armor_set
      for index in sub_set
        if index > 0
          rslt_set += $data_classes[index].armor_set
        else
          rslt_set -= $data_classes[-index].armor_set
        end
      end
    else # 異常処理
      p "フラグが異常です。"
      return nil
    end
    return rslt_set
  end
end

class Game_System
  attr_accessor :class_names              # クラスネーム配列
  
  attr_accessor :inner_flg                # インナーフラグ
  attr_accessor :extra_flg                # 特殊装飾フラグ
end

class Game_Actor < Game_Battler
  include CLASS_EVOLVE
  #--------------------------------------------------------------------------
  # ● 初期化
  #--------------------------------------------------------------------------
  alias dia_initialize initialize
  def initialize(actor_id)
    
    dia_initialize(actor_id)
    
    $game_system.class_names = Array.new($data_actors.size)
    for i in 0...$data_actors.size
      $game_system.class_names[i] = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● クラス名の取得
  #--------------------------------------------------------------------------
  def class_name
    return CLS_E_SET[@actor_id][$game_system.class_names[@actor_id]][0]
  end
  #--------------------------------------------------------------------------
  # ● ステート有効度の取得
  #--------------------------------------------------------------------------
  def state_ranks
    for index in 0...$game_system.class_names[@actor_id]
      hash = CLS_E_SET[@actor_id][index][2]
      if hash != nil
        for i in 0...hash.size
          if hash.values[i].is_a?(Numeric)
            $data_classes[@class_id].state_ranks[hash.keys[i]] = hash.values[i]
          else
            $data_classes[@class_id].state_ranks[hash.keys[i]] = 
              CLS_RANK[hash.values[i]]
          end
        end
      end
    end
    return $data_classes[@class_id].state_ranks
  end
  include ELE_MM
  
  #--------------------------------------------------------------------------
  # ● 属性補正値の取得
  #     element_id : 属性 ID
  #--------------------------------------------------------------------------
  def element_rate(element_id)
    # 属性有効度に対応する数値を取得
    
    for index in 0..$game_system.class_names[@actor_id]
      hash = CLS_E_SET[@actor_id][index][1]
      if hash != nil
        for i in 0...hash.size
          if hash.values[i].is_a?(Numeric)
            $data_classes[@class_id].element_ranks[hash.keys[i]] = hash.values[i]
          else
            $data_classes[@class_id].element_ranks[hash.keys[i]] = 
              CLS_RANK[hash.values[i]]
          end
        end
      end
    end
    
    result = ELEMENT_RANK_TABLE[$data_classes[@class_id].element_ranks[element_id]]
    if result == nil
      result = $data_classes[@class_id].element_ranks[element_id]
    end
    
    list = get_armors_id_list
    
if $OuterFlgs["Element_Plus"]
    element_name = $data_system.elements[element_id]
    rate = [0, 0, 0, 0, 0, 0, 0]
    r_flg = [GRD_ELE_NONE, GRD_ELE_NONE, GRD_ELE_NONE, GRD_ELE_NONE, 
             GRD_ELE_NONE, GRD_ELE_NONE, GRD_ELE_NONE]
    t_rate = 0
    
    # 防具でこの属性が防御されている場合の計算
    for h in 0...list.size
      if !self.armors_weapon[h]
        armor = $data_armors[list[h]]
        if armor != nil and armor.guard_element_set.include?(element_id)
          for j in armor.guard_state_set
            if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
              rate[h] += $1.to_i
              r_flg[h] = GRD_ELE_PLUS
            end
          end
          for j in armor.guard_state_set
            if $data_states[j].name =~ /^#{element_name}マイナス/
              if r_flg[h] == GRD_ELE_NONE
                rate[h] += DEFAULT_GUARD
              elsif r_flg[h] == GRD_ELE_PLUS
                rate[h] *= -1
              end
              r_flg[h] = GRD_ELE_MINUS
            end
          end
          if r_flg[h] == GRD_ELE_NONE
            rate[h] -= DEFAULT_GUARD
          end
        end
      end
    end

     for one_rate in rate
       t_rate += one_rate
     end
    
     if result > 0
       result += result * t_rate / 100
     else
       result -= result * t_rate / 100
     end

     result = state_guard_ele(result, element_id)
      
     
     # Max/Minを超えないように補正
     result = [[result, ELE_MM_MIN].max, ELE_MM_MAX].min
else # 元の処理
     # 防具でこの属性が防御されている場合は半減
     #for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id, @armor5_id, 
     #          @armor6_id, @armor7_id]
     for i in list
       armor = $data_armors[i]
       if armor != nil and armor.guard_element_set.include?(element_id)
         result /= 2
       end
     end
     # ステートでこの属性が防御されている場合は半減
     for i in @states
       if $data_states[i].guard_element_set.include?(element_id)
         result /= 2
       end
     end
end # $OuterFlgs["Element_Plus"]
    
    # メソッド終了
    return result
  end
  #--------------------------------------------------------------------------
  # ● 装備可能判定
  #     item : アイテム
  #--------------------------------------------------------------------------
  def equippable?(item)
    # 武器の場合
    if item.is_a?(RPG::Weapon)
      # 現在のクラス+サブクラスの装備可能な武器に含まれている場合
      if get_equip_set(@actor_id, 0).include?(item.id)
        return true
      end
    end
    # 防具の場合
    if item.is_a?(RPG::Armor)
      # 現在のクラス+サブクラスの装備可能な防具に含まれている場合
      if get_equip_set(@actor_id, 1).include?(item.id)
        return true
      end
    end
    return false
  end
end

class Window_EquipItem < Window_Selectable
  include CLASS_EVOLVE
  include BM
  include VDI
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor      : アクター
  #     equip_type : 装備部位 (0〜3)
  #--------------------------------------------------------------------------
  alias initialize_vdi initialize
  def initialize(actor, equip_type)
    initialize_vdi(actor, equip_type)
    
    @draw_item_num = 2     # 一度に描画する数(必ずしも2である必要はない)
    @draw_ok = Array.new() # 描画完了フラグ配列
    
    refresh
  end
  
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    
    @draw_counter = 0
    reset_array
    
    mlt_blade = @actor.multi_blade?
    
    #p @equip_type
    @data = []
    # 装備可能な武器を追加
    #if @equip_type == 0 || (@equip_type == 1 && 
    #  (@actor.skill_learn?(@nitoryu) || @actor.last_skills.include?(@nitoryu)))
    if @equip_type == 0 || (mlt_blade[0] && mlt_blade[1].include?(@equip_type))
      weapon_set = get_equip_set(@actor.id, 0)
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0 && weapon_set.include?(i)
          #if @equip_type == 0 || 
          #  !$data_weapons[i].element_set.include?(Tkl2K_2_XP::TWO_HANDED)
            @data.push($data_weapons[i])
            $data_weapons[i].name = transfer($data_weapons[i].name)
          #end
        end
      end
    end
    # 装備可能な防具を追加
    if @equip_type != 0
      #p @equip_type, $game_system.inner_flg, $game_system.extra_flg
      armor_set = get_equip_set(@actor.id, 1)
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0 && armor_set.include?(i)
if $OuterFlgs["Equip_Extend"]
          case @equip_type
          when 1, 2    # 盾、兜
            if $data_armors[i].kind == @equip_type - 1
              @data.push($data_armors[i])
              $data_armors[i].name = transfer($data_armors[i].name)
            end
          when 3       # インナー
            if $data_armors[i].kind == 2 && 
              #$game_system.inner_flg &&
              $data_armors[i].guard_element_set.include?(Equip_Extend::INNER_ARM)
              @data.push($data_armors[i])
              $data_armors[i].name = transfer($data_armors[i].name)
            end
          when 4       # 鎧
            if $data_armors[i].kind == 2 && 
              #!$game_system.inner_flg &&
              !$data_armors[i].guard_element_set.include?(Equip_Extend::INNER_ARM)
              @data.push($data_armors[i])
              $data_armors[i].name = transfer($data_armors[i].name)
            end
          when 5, 6    # 装飾品1、装飾品2
            if $data_armors[i].kind == 3 && 
              #!$game_system.extra_flg &&
              !$data_armors[i].guard_element_set.include?(Equip_Extend::EXTRA_ACC) &&
              !$data_armors[i].guard_element_set.include?(Equip_Extend::BOOTS_ACC)
              @data.push($data_armors[i])
              $data_armors[i].name = transfer($data_armors[i].name)
            end
          when 7       # 特殊
            if $data_armors[i].kind == 3 && 
              #$game_system.extra_flg &&
              $data_armors[i].guard_element_set.include?(Equip_Extend::EXTRA_ACC) &&
              !$data_armors[i].guard_element_set.include?(Equip_Extend::BOOTS_ACC)
              @data.push($data_armors[i])
              $data_armors[i].name = transfer($data_armors[i].name)
            end
          when 8       # 靴
            if $data_armors[i].kind == 3 && 
              #$game_system.extra_flg &&
              !$data_armors[i].guard_element_set.include?(Equip_Extend::EXTRA_ACC) &&
              $data_armors[i].guard_element_set.include?(Equip_Extend::BOOTS_ACC)
              @data.push($data_armors[i])
              $data_armors[i].name = transfer($data_armors[i].name)
            end
          else
            p "異常"
          end
else # 元の処理
          if $data_armors[i].kind == @equip_type - 1
            @data.push($data_armors[i])
            $data_armors[i].name = transfer($data_armors[i].name)
          end
end # $OuterFlgs["Equip_Extend"]
        end
      end
    end
    # 空白を追加
    @data.push(nil)
    # ビットマップを作成し、全項目を描画
    @item_max = @data.size
    self.contents = Bitmap.new(width - 32, row_max * 32)
    #for i in 0...@item_max-1
    #  draw_item(i)
    #end
    
    draw_item_v
    
  end
end

class Interpreter
  #--------------------------------------------------------------------------
  # ● クラスの進化
  #--------------------------------------------------------------------------
  def class_evolve(id, value)
    if value.is_a?(Numeric)
      $game_system.class_names[id] = value
    else
      p "設定が不正です。"
    end
  end
end
カスタマイズポイント
CLS_RANK クラスランク拡張用のハッシュ。
STATE_RANK_TABLE ステート有効度(拡張磐)
CLS_RANKの数だけ造ってください。
ELEMENT_RANK_TABLE 属性有効度(拡張版)
CLS_RANKの数だけ造ってください。
CLS_E_SET アクターごとの属性有効度、ステート有効度の設定
ID => [["Class name", {Evolve Element Ranks}, {Ecolve State Ranks}]...]
と記載してください。 クラスの進化にも対応しているので、配列は複数設定が可能です。
Evolve Element Ranks / Ecolve State Ranksに関しては
属性ID / ステートID => "有効度(CLS_RANKで設定したもの)" もしくは数値
のハッシュ形式で記載を行ってください。
SUB_CLSID アクターごとのサブクラスの設定。
ID => [[Weapon Sub Class IDs...], [Armor Sub Class IDs...]]
と記載を行ってください。
クラスIDに『-』をつけることでそのサブクラスの装備品を除外することが可能です。
(女の子に武器から重量兵器を除外するみたいな)

戻る