#============================================================================== # ■ RGSS3 ステートレベルステート Ver1.03 by 星潟 #------------------------------------------------------------------------------ # 付与したステートに、ステートレベルの概念を追加します。 # 同一ステートを重ねがけする事でステートレベルが1ずつ加算されます。 # また、ステートレベルに応じた追加ステート効果や # 一定レベルに達したステートを他のステートに変化させる機能を追加します。 # # ※ステートレベルに応じた追加ステート効果は本来のステートとは見なされません。 # よって、追加ステート側にはステートレベルの概念はありません。 # 追加ステート側は本来のステートとは別に # 通常は絶対に付与されない専用ステートとして用意して下さい。 # 追加ステート側の優先度設定は0が推奨です。 # # 状況確認コマンドと同時に使用する場合は # 状況確認コマンドより下に導入して下さい。 #============================================================================== # ステートのメモ欄に設定。 #------------------------------------------------------------------------------ # <ステートレベルステート:2,50> # # ステートレベル2の時、ステートID50にもかかっている状態にする。 #------------------------------------------------------------------------------ # <ステート最大レベル:3> # # このステートの最大レベルは3とする。 #------------------------------------------------------------------------------ # <ステート変化レベル:3,51> # # このステートはレベル3に達した際に除去され # ステートID51の付与効果に変換される。 #------------------------------------------------------------------------------ # <ステート変化時残留> # # このステートはステート変化レベルの効果で変化しても除去されずに残る。 #============================================================================== # イベントコマンドの変数の操作のスクリプト等で使用。 #------------------------------------------------------------------------------ # state_level_get_actor(1,10) # # アクター1のステートID10のステートレベルを取得する。 #------------------------------------------------------------------------------ # state_level_get_enemy(0,5) # # 敵グループの先頭エネミーのステートID5のステートレベルを取得する。 # 存在しない場合はエラーになるので注意。 #============================================================================== module StateLevel #ステートレベルステート設定用キーワードを指定します。 Word1 = "ステートレベルステート" #ステート最大レベル設定用キーワードを指定します。 Word2 = "ステート最大レベル" #ステート変化レベル設定用キーワードを指定します。 Word3 = "ステート変化レベル" #ステート変化時残留設定用キーワードを指定します。 Word4 = "ステート変化時残留" #2以上のステートレベルをステートと共に描写するか否かを指定します。 #trueで描写、falseで描写しない。 LDraw = true #X座標の調整値を指定します。 X_POS = -14 #Y座標の調整値を指定します。 Y_POS = 6 #文字色を配列で指定します。 #赤、緑、青、アルファの順に指定します。 COLOR = [255,255,255,255] #縁の文字色を配列で指定します。 #赤、緑、青、アルファの順に指定します。 O_CLR = [0,0,0,255] #文字の影の有無を指定します。 #trueで有り、falseで無しとなります。 SHADOW = true #フォントサイズを指定します。 FSIZE = 18 #状況確認コマンドスクリプトを導入しているか否かを指定します。 #trueで導入、falseで導入していない前提で処理を行います。 #(導入している状態で、ウィンドウにカウントを表示させたくない場合は # falseにして下さい) CONF = false end class Game_Interpreter #-------------------------------------------------------------------------- # ステートレベルを取得 #-------------------------------------------------------------------------- def state_level_get_actor(aid,id) a = $game_actors[aid] return 0 unless a a.state_level_get(id) end #-------------------------------------------------------------------------- # ステートレベルを取得 #-------------------------------------------------------------------------- def state_level_get_enemy(eid,id) a = $game_troop.members[eid] return 0 unless a a.state_level_get(id) end end class Game_BattlerBase #-------------------------------------------------------------------------- # ステートレベルを取得 #-------------------------------------------------------------------------- def state_level_get(id) @state_level ||= {} l = @state_level[id] l ? l : 0 end #-------------------------------------------------------------------------- # 特徴を保持する全オブジェクトの配列取得 #-------------------------------------------------------------------------- alias feature_objects_statelevel feature_objects def feature_objects @state_level_mode = true a = feature_objects_statelevel @state_level_mode = nil a end #-------------------------------------------------------------------------- # ステート #-------------------------------------------------------------------------- alias states_statelevel states def states a = states_statelevel return a unless @state_level_mode b = [] a.each {|s| l = @state_level[s.id] next unless l s.state_level_state.each {|v| next if v[0] > l b.push($data_states[v[1]])}} a + b end #-------------------------------------------------------------------------- # ステートの消去 #-------------------------------------------------------------------------- alias erase_state_statelevel erase_state def erase_state(state_id) erase_state_statelevel(state_id) @state_level.delete(state_id) end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ステートの付加 #-------------------------------------------------------------------------- alias add_state_statelevel add_state def add_state(state_id) l = @state_level[state_id] if l && l > 0 s = $data_states[state_id] c = s.state_change_level if c[1] > 0 && l >= c[0] remove_state(state_id) if s.state_change_remain == 0 return add_state_statelevel(c[1]) end end add_state_statelevel(state_id) if l && l > 0 && @state_level[state_id] && @state_level[state_id] != l refresh end end #-------------------------------------------------------------------------- # ステート情報をクリア #-------------------------------------------------------------------------- alias clear_states_statelevel clear_states def clear_states clear_states_statelevel @state_level = {} end #-------------------------------------------------------------------------- # ステートのカウント(ターン数および歩数)をリセット #-------------------------------------------------------------------------- alias reset_state_counts_statelevel reset_state_counts def reset_state_counts(state_id) reset_state_counts_statelevel(state_id) s = $data_states[state_id] @state_level[state_id] = [(1 + (@state_level[state_id] ? @state_level[state_id] : 0)),s.state_max_level].min end end class RPG::State < RPG::BaseItem #-------------------------------------------------------------------------- # ステートレベル別追加ステート #-------------------------------------------------------------------------- def state_level_state @state_level_state ||= state_level_state_make end #-------------------------------------------------------------------------- # ステートレベル別追加ステート #-------------------------------------------------------------------------- def state_level_state_make r = [] note.each_line {|l| a = /<#{StateLevel::Word1}[::](\d+),(\d+)>/ =~ l ? [$1.to_i,$2.to_i] : nil next unless a r.push(a)} r end #-------------------------------------------------------------------------- # ステート最大レベル #-------------------------------------------------------------------------- def state_max_level @state_max_level ||= /<#{StateLevel::Word2}[::](\d+)>/ =~ note ? $1.to_i : 1 end #-------------------------------------------------------------------------- # ステート変化レベル #-------------------------------------------------------------------------- def state_change_level @state_change_level ||= /<#{StateLevel::Word3}[::](\d+),(\d+)>/ =~ note ? [$1.to_i,$2.to_i] : [0,0] end #-------------------------------------------------------------------------- # ステート変化時残留 #-------------------------------------------------------------------------- def state_change_remain @state_change_remain ||= /<#{StateLevel::Word4}>/ =~ note ? 1 : 0 end end if StateLevel::LDraw class Game_BattlerBase #-------------------------------------------------------------------------- # ステートレベルを描写 #-------------------------------------------------------------------------- def state_level_array array = [] states.each {|state| next if state.icon_index == 0 l = @state_level[state.id] array.push(l && l > 1 ? l.to_s : "")} array end end class Window_Base < Window #-------------------------------------------------------------------------- # ステートおよび強化/弱体のアイコンを描画 #-------------------------------------------------------------------------- alias draw_actor_icons_level_draw draw_actor_icons def draw_actor_icons(actor, x, y, width = 96) draw_actor_icons_level_draw(actor, x, y, width) font_data = contents.font.clone contents.font.size = StateLevel::FSIZE ca1 = StateLevel::COLOR contents.font.color = Color.new(ca1[0],ca1[1],ca1[2],ca1[3]) ca2 = StateLevel::O_CLR contents.font.out_color = Color.new(ca2[0],ca2[1],ca2[2],ca2[3]) contents.font.shadow = StateLevel::SHADOW array = actor.state_level_array array = array[0, width / 24] array.each_with_index {|n, i| draw_text( x + 24 * i + StateLevel::X_POS, y + StateLevel::Y_POS, 24, 24, n, 2) } contents.font = font_data end end if StateLevel::CONF class Window_B_Confirm < Window_Selectable #-------------------------------------------------------------------------- # 項目の描画 #-------------------------------------------------------------------------- alias draw_item_level_draw draw_item def draw_item(index) draw_item_level_draw(index) font_data = contents.font.clone contents.font.size = StateLevel::FSIZE ca1 = StateLevel::COLOR contents.font.color = Color.new(ca1[0],ca1[1],ca1[2],ca1[3]) ca2 = StateLevel::O_CLR contents.font.out_color = Color.new(ca2[0],ca2[1],ca2[2],ca2[3]) contents.font.shadow = StateLevel::SHADOW if @last_actor == nil case @display_mode when 0 actor = B_CONFIRM::PTMT ? $game_party.all_members[index] : $game_party.members[index] when 1 actor = $game_troop.unhidden_members[index] end rect = item_rect(index) icons_width = (rect.width - rect.x - 150 - 96) / 24 array = actor.state_level_array sub_array = array[0, icons_width] sub_array.each_with_index {|n, i| draw_text(x + 24 * i + StateLevel::X_POS + 246, rect.y + y + StateLevel::Y_POS + line_height * 1, 24, 24, n, 2) } sub_array = array[icons_width, icons_width * 2] sub_array.each_with_index {|n, i| draw_text(x + 24 * i + StateLevel::X_POS + 246, rect.y + y + StateLevel::Y_POS + line_height * 2, 24, 24, n, 2) } if sub_array != nil end contents.font = font_data end end class Window_B_Confirm_Detail < Window_Base #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- alias refresh_level_draw refresh def refresh actor = @window_b_confirm.last_actor refresh_level_draw font_data = contents.font.clone contents.font.size = StateLevel::FSIZE ca1 = StateLevel::COLOR contents.font.color = Color.new(ca1[0],ca1[1],ca1[2],ca1[3]) ca2 = StateLevel::O_CLR contents.font.out_color = Color.new(ca2[0],ca2[1],ca2[2],ca2[3]) contents.font.shadow = StateLevel::SHADOW icons_width = (width - x - 162 - 96) / 24 array = actor.state_level_array sub_array = array[0, icons_width] sub_array.each_with_index {|n, i| draw_text(x + 24 * i + StateLevel::X_POS + 246, y + StateLevel::Y_POS + line_height * 1, 24, 24, n, 2) } sub_array = array[icons_width, icons_width * 2] sub_array.each_with_index {|n, i| draw_text(x + 24 * i + StateLevel::X_POS + 246, y + StateLevel::Y_POS + line_height * 2, 24, 24, n, 2) } if sub_array != nil contents.font = font_data end end end end