#==============================================================================
# ●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 = []
[url=home.php?mod=space&uid=9053]@cancel[/url] = false
[url=home.php?mod=space&uid=76426]@stop[/url] = 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
[url=home.php?mod=space&uid=9053]@cancel[/url] = 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