#============================================================================== # ●CP制战斗 # 原作者:桜雅 在土, 和希 (XP版CP制),韩云溪(AT即时战斗) # 修改:pigsss # 更新日期:2012.05.09 # 一个简单的cp战斗系统 # 好吧,我还是不明白为什么那么多人喜欢用… # ·加强兼容性 # ·修正先制/被偷袭bug # ·修正敌人隐藏bug # ·修正逃跑失败bug # ■✖ !注意------------------------- # ·敌人特殊能力【增加行动次数】不可用│ # --------------------------------- #============================================================================== module CP # # 基本能力消耗的CP值 # CP_COST_SKILL_ITEM_ACTION = 65535 # 技能 物品 CP_COST_BASIC_ATTACK = 32768 # 攻撃 CP_COST_BASIC_GUARD = 32768 # 防御 CP_COST_BASIC_ESCAPE = 65535 #逃跑 end #============================================================================== # □ CP_Thread #============================================================================== class CP_Thread # 战斗速度 # BATTLE_SPEED = 1.0 # # 战斗开始的时候气槽百分比 # START_CP_PERCENT = 10 # # CP满时的音效 # FULL_SE = "Audio/SE/open1" #-------------------------------------------------------------------------- # ○ 变量公开 #-------------------------------------------------------------------------- attr_accessor :stop # CP加算ストップ #---------------------------------------------------------------------------- # ○ 初始化 #---------------------------------------------------------------------------- def initialize @battlers = [] @cancel = false @stop = false @agi_total = 0 # 配列 count_battlers を初期化 count_battlers = [] # エネミーを配列 count_battlers に追加 for enemy in $game_troop.members count_battlers.push(enemy) end # アクターを配列 count_battlers に追加 for actor in $game_party.battle_members count_battlers.push(actor) end for battler in count_battlers @agi_total += battler.agi end for battler in count_battlers battler.cp = [[65535 * START_CP_PERCENT * (rand(15) + 85) * 4 * battler.agi / @agi_total / 10000, 0].max, 65535].min battler.turn_count = 0 end end #---------------------------------------------------------------------------- # ○ CP更新 #---------------------------------------------------------------------------- def update # 停止刷新 return if @stop # for battler in $game_party.battle_members + $game_troop.members # 行動出来なければ無視 if battler.dead? || battler.hidden? battler.cp = 0 next end battler.cp = [[battler.cp + BATTLE_SPEED * 2048 * battler.agi / @agi_total, 0].max, 65535].min # CP满时 if battler.cp >= battler.max_cp Audio.se_play(FULL_SE) BattleManager.set_enable_go(battler) battler.my_turn = true BattleManager.input_start break end unless BattleManager.cp_updating? return end end def update? return !@stop end end #---------------------------------------------------------------------------- # ○ CPカウントの開始 #---------------------------------------------------------------------------- def stop @cancel = true if @cp_thread != nil then @cp_thread.join @cp_thread = nil end end end #============================================================================== # ■ Game_BattlerBase #------------------------------------------------------------------------------ # 管理战斗者的类。主要含有能力值计算的方法。Game_Battler 类的父类。 #============================================================================== class Game_BattlerBase attr_reader :cp # CP attr_accessor :turn_count attr_accessor :my_turn include CP #------------------------------ alias old_initialize initialize def initialize old_initialize @cp = 0 @turn_count = 0 @my_turn = false end #------------------------------ def inputable? if @my_turn return normal? && !auto_battle?# && @cp >= 65535 else return false end end #-------------------------------------------------------------------------- # ● 更改 CP #-------------------------------------------------------------------------- def cp=(cp) @cp = [[cp, max_cp].min, 0].max end #-------------------------------------------------------------------------- # ● 获取 CP 的最大值 #-------------------------------------------------------------------------- def max_cp return 65535 end #-------------------------------------------------------------------------- # ● 获取 CP 的比率 #-------------------------------------------------------------------------- def cp_rate @cp.to_f / 65535 end #-------------------------------------------------------------------------- # ● 扣除技能的使用消耗 #-------------------------------------------------------------------------- alias :old_pay_skill_cost :pay_skill_cost def pay_skill_cost(skill) old_pay_skill_cost(skill) ########### case skill.id when 1 @cp -= CP_COST_BASIC_ATTACK when 2 @cp -= CP_COST_BASIC_GUARD when 3...999 # 可自订不同消耗的技能 @cp -= CP_COST_SKILL_ITEM_ACTION else @cp = 0 end ########### end end #-------------------------------------------------------- class Game_Battler < Game_BattlerBase include CP #-------------------------------------------------------------------------- # ● 消耗物品 #-------------------------------------------------------------------------- alias :old_consume_item :consume_item def consume_item(item) old_consume_item(item) ########### case item.id when 0...999 # 可自订不同消耗的物品 @cp -= CP_COST_SKILL_ITEM_ACTION else @cp = 0 end ########### end end #------------------------------------- class Game_Party < Game_Unit def make_action(member) unless member == nil member.make_actions unless member.inputable? end end end #------------------------------------- class Game_Troop < Game_Unit def make_action(member) member.make_actions unless member == nil end def increase_turn(enemy) troop.pages.each {|page| @event_flags[page] = false if page.span == 1 } enemy.turn_count += 1 aaa = [] for iii in $game_troop.members aaa.push(iii.turn_count) end @turn_count = aaa.max end end #------------------------------------- module BattleManager def self.battle_start $game_system.battle_count += 1 $game_party.on_battle_start $game_troop.on_battle_start $game_troop.enemy_names.each do |name| $game_message.add(sprintf(Vocab::Emerge, name)) end if @preemptive $game_message.add(sprintf(Vocab::Preemptive, $game_party.name)) for b in $game_troop.members if !b.hidden? b.cp = 0 end end for b in $game_party.battle_members if !b.hidden? b.cp = b.max_cp end end elsif @surprise $game_message.add(sprintf(Vocab::Surprise, $game_party.name)) for b in $game_troop.members if !b.hidden? b.cp = b.max_cp end end for b in $game_party.battle_members if !b.hidden? b.cp = 0 end end end wait_for_message end def self.enable_go @enable_go end def self.set_enable_go(b) @enable_go = b end def self.enable_go_clear @enable_go = nil end def self.max_agi @max_agi end def self.cp_updation @phase = :cp_update end def self.cp_updating? @phase == :cp_update end #-------------------------------------------------------------------------- # ● 重定义:开始输入指令 #-------------------------------------------------------------------------- def self.input_start if @phase != :input @phase = :input $game_party.make_actions $game_troop.make_actions clear_actor end return $game_party.inputable? end #------------------------------------------------------------------------- # ● 重定义:回合开始 #------------------------------------------------------------------------ def self.turn_start @phase = :turn clear_actor make_action_orders end #------------------------------------------------------------------------- # ● 重定义:行动顺序 #------------------------------------------------------------------------ def self.make_action_orders @action_battlers = [] for b in $game_troop.members + $game_party.battle_members if b.my_turn @action_battlers.push(b) end end exclude_battler = [] for battler in @action_battlers if battler.cp < 65535 exclude_battler.push(battler) end end @action_battlers -= exclude_battler end end #============================================================================== # ■ Window_Base #------------------------------------------------------------------------------ # 游戏中所有窗口的父类 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● 获取颜色 #-------------------------------------------------------------------------- def cp_gauge_color1; Color.new(200,200,120); end; # CP 值槽 1 def cp_gauge_color2; Color.new(100,100,70); end; # CP 值槽 2 #-------------------------------------------------------------------------- # ● 绘制值槽(长宽自由版) # rate : 比率(1.0 为满值) # color1 : 渐变色的左端 # color2 : 渐变色的右端 #-------------------------------------------------------------------------- def draw_gauge_free(x, y, width, rate, color1, color2, height) fill_w = (width * rate).to_i gauge_y = y + line_height - 8 contents.fill_rect(x, gauge_y, width, height, gauge_back_color) contents.gradient_fill_rect(x, gauge_y, fill_w, height, color1, color2) end #-------------------------------------------------------------------------- # ● 绘制 CP #-------------------------------------------------------------------------- def draw_actor_cp(actor, x, y, width = 124, height) draw_gauge_free(x, y, width, actor.cp_rate, cp_gauge_color1, cp_gauge_color2, height) change_color(system_color) end end #################################### class Window_CP < Window_Selectable #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize super(0, 0, window_width, window_height) refresh self.openness = 0 self.opacity = 200 self.contents_opacity = 200 end #-------------------------------------------------------------------------- # ● 获取窗口的宽度 #-------------------------------------------------------------------------- def window_width 64 end #-------------------------------------------------------------------------- # ● 获取窗口的高度 #-------------------------------------------------------------------------- def window_height fitting_height(visible_line_number) end #-------------------------------------------------------------------------- # ● 获取显示行数 #-------------------------------------------------------------------------- def visible_line_number return 4 end #-------------------------------------------------------------------------- # ● 获取项目数 #-------------------------------------------------------------------------- def item_max $game_party.battle_members.size end #-------------------------------------------------------------------------- # ● 获取值槽区域的宽度 #-------------------------------------------------------------------------- def gauge_area_width return 40 end #-------------------------------------------------------------------------- # ● 获取值槽区域的矩形 #-------------------------------------------------------------------------- def gauge_area_rect(index) rect = item_rect_for_text(index) rect.x += rect.width - gauge_area_width rect.width = gauge_area_width rect end #~ #-------------------------------------------------------------------------- #~ # ● 绘制项目 #~ #-------------------------------------------------------------------------- #~ def draw_item(index) #~ actor = $game_party.battle_members[index] #~ rect = gauge_area_rect(index) ## #~ draw_actor_cp(actor, rect.x - 165, rect.y - 10, 100, 16) ## #~ draw_basic_area(basic_area_rect(index), actor) #~ draw_gauge_area(gauge_area_rect(index), actor) #~ end #-------------------------------------------------------------------------- # ● 绘制项目 #-------------------------------------------------------------------------- def draw_cp(index) actor = $game_party.battle_members[index] rect = gauge_area_rect(index) ## draw_actor_cp(actor, rect.x , rect.y - 10, 40, 16) ## end #-------------------------------------------------------------------------- # ● 绘制所有项目 #-------------------------------------------------------------------------- def draw_all_items_cp item_max.times {|i| draw_cp(i) } end def refresh_cp contents.clear draw_all_items_cp end end #--------------------------------------------------------------------------- class Scene_Battle #-------------------------------------------------------------------------- # ● 重定义:开始处理 #-------------------------------------------------------------------------- def start super create_spriteset create_all_windows BattleManager.method_wait_for_message = method(:wait_for_message) @cp_thread = CP_Thread.new end #-------------------------------------------------------------------------- # ● 重定义:开始后处理 #-------------------------------------------------------------------------- def post_start super battle_start @cp_thread.stop = false # end #-------------------------------------------------------------------------- # ● 重定义:信息窗口打开时的更新 # 在状态窗口关闭完成前,信息窗口的打开度设置为 0 。 #-------------------------------------------------------------------------- def update_message_open if $game_message.busy? && !@status_window.close? @message_window.openness = 0 @status_window.close @party_command_window.close @actor_command_window.close @cp_window.close end end #-------------------------------------------------------------------------- # ● 生成所有窗口 #-------------------------------------------------------------------------- alias :o_create_all_windows :create_all_windows def create_all_windows o_create_all_windows create_CP_window create_name_window end #-------------------------------------------------------------------------- # ● 生成名字窗口 #-------------------------------------------------------------------------- def create_name_window @name_window = Window_Name.new @name_window.y = 250 + Graphics.height - 416 end #-------------------------------------------------------------------------- # ● 生成状态窗口 #-------------------------------------------------------------------------- def create_CP_window @cp_window = Window_CP.new @cp_window.x = 0 @cp_window.y = Graphics.height - 120 end #-------------------------------------------------------------------------- # ● 重定义:开始角色指令的选择 #-------------------------------------------------------------------------- def start_actor_command_selection @status_window.select(BattleManager.actor.index) @party_command_window.close @actor_command_window.setup(BattleManager.actor) @name_window.setup(BattleManager.actor) @name_window.open end #------------------------------------------------------------------------- # ● 当cp满时的操作 #------------------------------------------------------------------------ def on_cp_full BattleManager.cp_updation if BattleManager.enable_go.is_a?(Game_Actor) and BattleManager.enable_go.inputable? BattleManager.enable_go.on_turn_end refresh_status start_party_command_selection @cp_window.close else if BattleManager.enable_go.is_a?(Game_Actor) BattleManager.enable_go.on_turn_end $game_party.make_action(BattleManager.enable_go) turn_start elsif BattleManager.enable_go.is_a?(Game_Enemy) BattleManager.enable_go.on_turn_end $game_troop.make_action(BattleManager.enable_go) $game_troop.increase_turn(BattleManager.enable_go) turn_start end end BattleManager.enable_go_clear end #------------------------------------------------------------------------- # ● 重定义:战斗开始 #------------------------------------------------------------------------ def battle_start BattleManager.battle_start process_event unless scene_changing? @status_window.unselect @status_window.open @cp_window.unselect @cp_window.open end on_cp_full end #------------------------------------------------------------------------- # ● cp刷新 #------------------------------------------------------------------------ def refresh_cp if @cp_thread.update? @cp_window.refresh_cp end end #-------------------------------------------------------------------------- # ● 指令“撤退” #-------------------------------------------------------------------------- def command_escape turn_start unless BattleManager.process_escape for a in $game_party.battle_members a.cp -= CP::CP_COST_BASIC_ESCAPE end end #------------------------------------------------------------------------- # ● 重定义:画面更新 #------------------------------------------------------------------------ def update super if BattleManager.cp_updating? @cp_thread.update #refresh_status refresh_cp on_cp_full elsif BattleManager.in_turn? process_event on_cp_full process_action end BattleManager.judge_win_loss end #-------------------------------------------------------------------------- # ● 重定义:处理战斗行动 #-------------------------------------------------------------------------- def process_action @cp_thread.stop = true return if scene_changing? if !@subject || !@subject.current_action @subject = BattleManager.next_subject end return turn_end unless @subject if @subject.current_action @subject.current_action.prepare if @subject.current_action.valid? @status_window.open execute_action end @subject.remove_current_action end process_action_end unless @subject.current_action end #------------------------------------------------------------------------- # ● 重定义:行动结束 #------------------------------------------------------------------------ def process_action_end @subject.on_action_end @subject.my_turn = false if @subject.cp >= 65535 @subject.cp = 0 end refresh_status @log_window.display_auto_affected_status(@subject) @log_window.wait_and_clear @log_window.display_current_state(@subject) @log_window.wait_and_clear BattleManager.judge_win_loss @subject = nil @cp_thread.stop = false ########### end #-------------------------------------------------------------------------- # ● 重定义:回合开始 #-------------------------------------------------------------------------- def turn_start @party_command_window.close @actor_command_window.close @name_window.close @cp_window.open # @status_window.unselect BattleManager.turn_start @log_window.wait @log_window.clear end #------------------------------------------------------------------------- # ● 重定义:回合结束 #------------------------------------------------------------------------ def turn_end all_battle_members.each do |battler| refresh_status @log_window.display_auto_affected_status(battler) @log_window.wait_and_clear end BattleManager.turn_end process_event on_cp_full end end class Window_Name < Window_Base #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize super(Graphics.width - 128, 0, window_width, fitting_height(1)) self.openness = 0 @actor = nil end #-------------------------------------------------------------------------- # ● 获取窗口的宽度 #-------------------------------------------------------------------------- def window_width return 128 end #-------------------------------------------------------------------------- # ● 刷新 #-------------------------------------------------------------------------- def refresh contents.clear draw_actor_name(@actor, 0 , 0, 100) end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def setup(actor) @actor = actor end #-------------------------------------------------------------------------- # ● 打开窗口 #-------------------------------------------------------------------------- def open refresh super end end #============================================================================== # ■ Window_Base #------------------------------------------------------------------------------ # 游戏中所有窗口的父类 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● 绘制角色肖像图 # enabled : 有效的标志。false 的时候使用半透明效果绘制 #-------------------------------------------------------------------------- def draw_face_b(face_name, face_index, x, y, enabled = false) bitmap = Cache.face(face_name) rect = Rect.new(face_index % 4 * 96 ,face_index / 4 * 96 + 40, 96, 20) contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha) bitmap.dispose end #-------------------------------------------------------------------------- # ● 绘制角色肖像图 #-------------------------------------------------------------------------- def draw_actor_face_b(actor, x, y, enabled = true) draw_face_b(actor.face_name, actor.face_index, x, y, enabled) end end #============================================================================== # ■ Window_BattleStatus #------------------------------------------------------------------------------ # 战斗画面中,显示“队伍成员状态”的窗口。 #============================================================================== class Window_BattleStatus < Window_Selectable #-------------------------------------------------------------------------- # ● 绘制基本区域 #-------------------------------------------------------------------------- def draw_basic_area(rect, actor) index = $game_party.members.index(actor) draw_actor_face_b(actor, rect.x , rect.y + index * (0) + 4) #draw_actor_name(actor, rect.x , rect.y, 100) draw_actor_icons(actor, rect.x + 104, rect.y, rect.width - 104) end end
xmheart 发表于 2012-1-28 01:19
# ● 扣除技能的使用消耗
#----------------------------------------------------------------------- ...
未命名.jpg (61.14 KB, 下载次数: 45)
未命名1.jpg (44.44 KB, 下载次数: 50)
pigsss 发表于 2012-2-1 11:15
#--------------------------------------------------------------------------
450. # ● 生成状态窗 ...
未命名.png (364.87 KB, 下载次数: 28)
QQ浏览器截屏未命名.png (13.64 KB, 下载次数: 48)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |