제가 사용해봤을때는 문제가 없었기에 올려봅니다
저작권자 : 한소영님
#==============================================================================
# ■ Mother Battle System
#------------------------------------------------------------------------------
# [사용법]
# 스킬이나 아이템의 메모 란에 아래 문구를 입력해주세요.
# <mbs: {type}, {interval}, {rate}>
#
# 1. {type} - 체력이 변동하는 타입을 설정합니다. 타입에는 두 가지가 존재합니다.
# (1) lin - 선형 타입 Linear = 일정한 값이 더해지거나 감소합니다.
# (2) pro - 비례 타입 Proportional = 남은 값에 비례하여 더해지거나 감소합니다.
# 2. {interval} - 체력이 변하는 간격을 설정합니다. (프레임 단위)
# 3. {rate} - 소수점을 포함하여 할푼리(0.xxx)를 적어주세요.
#
# [사용 예]
# <mbs: lin, 10, 0.01>
#
# [주의사항]
# 턴 종료 후에만 갱신되는 턴제 전투 시스템을 억지로 개조한 것인 만큼
# 어떤 오류가 있을지 장담할 수 없습니다.
#==============================================================================
class Game_ActionResult
attr_accessor :mbs_type
attr_accessor :mbs_interval
attr_accessor :mbs_rate
alias mother_battle_system_make_damage_sndp make_damage
def make_damage(value, item)
mother_battle_system_make_damage_sndp(value, item)
if item.note =~ /<\s*mbs\s*:\s*(\S+)\s*\,\s*(\d+)\s*\,\s*(\d+\.?\d*)\s*>/mi
@mbs_type = $1
@mbs_interval = $2.to_i
@mbs_rate = $3.to_f
end
end
end
class Game_Battler
attr_accessor :mbs_death
attr_accessor :mbs_damages
alias mother_battle_system_execute_damage_sndp execute_damage
def execute_damage(user)
if @result.mbs_type.nil?
mother_battle_system_execute_damage_sndp(user)
else
on_damage(@result.hp_damage) if @result.hp_damage > 0
@mbs_damages = [] if @mbs_damages.nil?
@mbs_damages.push({
:type => @result.mbs_type,
:frame => -1,
:interval => @result.mbs_interval,
:rate => @result.mbs_rate,
:init => @result.hp_damage,
:left => @result.hp_damage,
:damage => true
})
self.mp -= @result.mp_damage
user.mbs_damages = [] if user.mbs_damages.nil?
user.mbs_damages.push({
:type => @result.mbs_type,
:frame => -1,
:interval => @result.mbs_interval,
:rate => @result.mbs_rate,
:init => @result.hp_drain,
:left => @result.hp_drain,
:damage => false
})
user.mp += @result.mp_drain
end
end
alias mother_battle_system_item_effect_recover_hp_sndp item_effect_recover_hp
def item_effect_recover_hp(user, item, effect)
if @result.mbs_type.nil?
mother_battle_system_item_effect_recover_hp_sndp(user, item, effect)
else
value = (mhp * effect.value1 + effect.value2) * rec
value *= user.pha if item.is_a?(RPG::Item)
value = value.to_i
@result.hp_damage -= value
@result.success = true
if item.note =~ /<\s*mbs\s*:\s*(\S+)\s*\,\s*(\d+)\s*\,\s*(\d+\.?\d*)\s*>/mi
@mbs_damages = [] if @mbs_damage.nil?
@mbs_damages.push({
:type => $1,
:frame => -1,
:interval => $2.to_i,
:rate => $3.to_f,
:init => value,
:left => value,
:damage => false
})
end
end
end
def refresh_mbs
return if @mbs_damages.nil?
@mbs_damages.each_with_index do |mbs_damage, index|
mbs_damage[:frame] += 1
next unless mbs_damage[:frame] % mbs_damage[:interval] == 0
type = mbs_damage[:type]
rate = mbs_damage[:rate]
init = mbs_damage[:init]
left = mbs_damage[:left]
if type == "lin"
hp_d = [[(init * rate).round, left].min, 1].max
elsif type == "pro"
hp_d = [[(left * rate).round, left].min, 1].max
else
next
end
if mbs_damage[:damage]
self.hp -= hp_d
elsif not mbs_damage[:damage] and not dead?
self.hp += hp_d
end
mbs_damage[:left] -= hp_d
@mbs_damages[index] = nil if mbs_damage[:left] <= 0
end
@mbs_damages.compact!
end
end
class Scene_Battle
alias mother_battle_system_update_basic_sndp update_basic
def update_basic
for battler in all_battle_members
next if battler.mbs_damages.nil?
battler.refresh_mbs
if battler.dead? and not battler.mbs_death
battler.mbs_death = true
battler.perform_collapse_effect
end
end
@actor_window.refresh
@enemy_window.refresh
refresh_status
mother_battle_system_update_basic_sndp
end
end