#===================================================================
# Jens009's Critical Flash
# August 4, 2008
# Version 1.0
# Description: Screen Flash when attacker deals critical damage
# Aliased used:
# jens009_add_critical_flash make_attack_damage_value
# Compatibility:
# All systems.
#=====================================================================
# Start Game_Battler_Edit
#====================================================================
class Game_Battler
alias jens009_add_critical_flash make_attack_damage_value
#===================================================================
# Start Method edit
#===================================================================
def make_attack_damage_value(attacker)
# Call Original Method
jens009_add_critical_flash(attacker)
# Check Critical Flag
if @critical == true
# Screen Flash
$game_troop.screen.start_flash(Color.new(255,83,119,200), 30)
end # END CHECK
end # END Method Edit
end # End Class Edit
↑위에꺼는 현재 쓰고있는 크리티컬시 플래쉬스크립트(VX용)
↓아래는 KGC배틀러 이펙트 스크립트 (XP용)
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆버틀러 효과 - KGC_BattlerEffect◆
#_/----------------------------------------------------------------------------
#_/ 행동시나 피데미지시에 버틀러 그래픽을 다양하게 애니메이션 시킵니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ 커스터마이즈 항목 - Customize ★
#==============================================================================
module KGC
# ◆방어시 효과 경감
# true (으)로 하면, 방어시는 효과가 작아진다.
BE_GUARD_REDUCTION = true
# ◆적효과역방향
# true (으)로 하면, 적의 효과는 역방향이 된다.
# (시이크·줌계는 그대로)
BE_ENEMY_REVERSE = true
# ◆시이크 회수
# 1회에 대해4프레임
BE_SHAKE_COUNT = 3
# ◆줌인 시간 【단위:프레임】
# 반드시 6 이상을 지정.
BE_ZOOM_IN_FRAME = 20
# ◆줌인 배율(소수점 사용가능)
BE_ZOOM_IN_MGN = 1.5
# ◆히트 백 시간 【단위:프레임】
# 반드시 6 이상을 지정.
BE_HITBACK_FRAME = 20
# ◆히트 백 거리 【단위:피크셀(px)】
# 너무 작으면 버그일지도.
BE_HITBACK_DISTANCE = 50
# ◆스텝 시간 【단위:프레임】
# 반드시 6 이상을 지정.
BE_STEP_F_FRAME = 10
# ◆스텝 거리 【단위:피크셀(px)】
# 너무 작으면 버그일지도.
BE_STEP_F_DISTANCE = 20
# ◆줌 아웃 시간 【단위:프레임】
# 반드시 6 이상을 지정.
BE_ZOOM_OUT_FRAME = 20
# ◆줌 아웃 배율(소수점 사용가능)
BE_ZOOM_OUT_MGN = 0.75
# ◆사이드스텝 시간 【단위:프레임】
# 반드시 6 이상을 지정.
BE_SIDE_STEP_FRAME = 10
# ◆사이드스텝 거리 【단위:피크셀(px)】
# 너무 작으면 버그일지도.
BE_SIDE_STEP_DISTANCE = 20
# ◆사이드스텝 방향 【단위:각도(0~359)】
# 0 (을)를 우측향으로서 반시계회전.
# (0 미만을 지정하면 랜덤화)
BE_SIDE_STEP_ANGLE = -1
# ◆대상 효과 개시 타이밍
# 【0…데미지 표시시 1…대상 애니메이션 개시시】
BE_TARGET_TIMING = 0
# ◆행동시 효과 제한
# 허가하는 행동을 배열로 해 대입.
# 【0…기본 행동 1…스킬 2…아이템】
BE_ACTION_PERMIT = [0]
# ◆액터 데미지 효과
# 【0…시이크 1…줌인 2…히트 백 3…스텝
# 4…줌 아웃 5…사이드스텝
# 그 외…아무것도 없음】
# (이하 같이)
BE_ACTOR_DAMAGE = 2
# ◆액터 행동 시효과
BE_ACTOR_ACTION = 3
# ◆에너미 데미지 효과
BE_ENEMY_DAMAGE = 0
# ◆에너미 행동 시효과
BE_ENEMY_ACTION = 3
end
#### BE_GUARD_REDUCTION
## Reduces scale of effect when guarding.
#### BE_ENEMY_REVERSE
## Reverses enemy's effect direction.
#### BE_SHAKE_COUNT
## Number of shake. (4 frames per 1 shake)
#### BE_ZOOM_IN_FRAME
## Zoom in duration. {Unit : frame}
# Should be 6 or more.
#### BE_ZOOM_IN_MGN
## Zoom magnification. (Can use decimal point.)
#### BE_HITBACK_FRAME
## Hitback duration. {Unit : frame}
# Should be 6 or more.
#### BE_HITBACK_DISTANCE
## Hitback distance. {Unit : pixel}
#### BE_STEP_F_FRAME
## Step duration. {Unit : frame}
# Should be 6 or more.
#### BE_STEP_F_DISTANCE
## Step distance. {Unit : pixel}
#### BE_ZOOM_OUT_FRAME
## Zoom out duration. {Unit : frame}
# Should be 6 or more.
#### BE_ZOOM_OUT_MGN
## Zoom magnification. (Can use decimal point.)
#### BE_SIDE_STEP_FRAME
## Side step duration. {Unit : frame}
# Should be 6 or more.
#### BE_SIDE_STEP_DISTANCE
## Side step distance. {Unit : pixel}
#### BE_SIDE_STEP_ANGLE
## Side step direction. {Unit : degree (0..359)}
#### BE_ACTOR_DAMAGE
## Actor's damage effect.
# << 0..Shake 1..Zoom in 2..Hitback 3..Step
# 4..Zoom out 5..Side Step
# Others..None >>
#### BE_ACTOR_ACTION
## Actor's action effect.
#### BE_ENEMY_DAMAGE
## Enemy's damage effect.
#### BE_ENEMY_ACTION
## Enemy's action effect.
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
$imported = {} if $imported == nil
$imported["BattlerEffect"] = true
if $game_special_elements == nil
$game_special_elements = {}
$data_system = load_data("Data/System.rxdata")
end
# 효과 강제 속성
$game_special_elements["battler_effect_force_attacker"] = /행동자 효과(d+)/
$game_special_elements["battler_effect_force_target"] = /대상 효과(d+)/
#==============================================================================
# ■ Game_Battler (분할 정의 1)
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :shake # 시이크후라그
attr_accessor :zoom_in # 줌인 플래그
attr_accessor :hitback # 히트 백 플래그
attr_accessor :step_f # 스텝 플래그
attr_accessor :zoom_out # 줌 아웃 플래그
attr_accessor :side_step # 사이드스텝후라그
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias initialize_KGC_BattlerEffect initialize
def initialize
# 원래의 처리를 실행
initialize_KGC_BattlerEffect
self.effect_reset
end
#--------------------------------------------------------------------------
# ● 효과 리셋트
#--------------------------------------------------------------------------
def effect_reset
@shake = false
@zoom_in = false
@hitback = false
@step_f = false
@zoom_out = false
@side_step = false
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# viewport : 뷰포트
# battler : 버틀러 (Game_Battler)
#--------------------------------------------------------------------------
alias initialize_KGC_BattlerEffect initialize
def initialize(viewport, battler = nil)
initialize_KGC_BattlerEffect(viewport, battler)
@_effect_reduction = false
@_shake_duration = 0
@_shake_count = 0
@_shake_x = 0
@_shake_y = 0
@_zoom_in_duration = 0
@_hitback_duration = 0
@_step_f_duration = 0
@_zoom_out_duration = 0
@_side_step_duration = 0
@_side_step_x = 0
@_side_step_y = 0
end
#--------------------------------------------------------------------------
# ● 시이크 개시
#--------------------------------------------------------------------------
def shake
@_effect_reduction = KGC::BE_GUARD_REDUCTION ? @battler.guarding? : false
@_shake_duration = 4
@_shake_count = KGC::BE_SHAKE_COUNT
@_shake_x = (@_effect_reduction ? rand(3) : rand(5)) + 1
@_shake_y = (@_effect_reduction ? rand(3) : rand(5)) + 1
@_shake_x *= -1 if rand(2) == 0
@_shake_y *= -1 if rand(2) == 0
end
#--------------------------------------------------------------------------
# ● 줌인 개시
#--------------------------------------------------------------------------
def zoom_in
@_effect_reduction = KGC::BE_GUARD_REDUCTION ? @battler.guarding? : false
@_zoom_in_duration = KGC::BE_ZOOM_IN_FRAME
end
#--------------------------------------------------------------------------
# ● 히트 백 개시
#--------------------------------------------------------------------------
def hitback
@_effect_reduction = KGC::BE_GUARD_REDUCTION ? @battler.guarding? : false
@_hitback_duration = KGC::BE_HITBACK_FRAME
@_default_y = self.y
end
#--------------------------------------------------------------------------
# ● 스텝 개시
#--------------------------------------------------------------------------
def step_f
@_effect_reduction = KGC::BE_GUARD_REDUCTION ? @battler.guarding? : false
@_step_f_duration = KGC::BE_STEP_F_FRAME
@_default_y = self.y
end
#--------------------------------------------------------------------------
# ● 줌 아웃 개시
#--------------------------------------------------------------------------
def zoom_out
@_effect_reduction = KGC::BE_GUARD_REDUCTION ? @battler.guarding? : false
@_zoom_out_duration = KGC::BE_ZOOM_OUT_FRAME
end
#--------------------------------------------------------------------------
# ● 사이드스텝 개시
#--------------------------------------------------------------------------
def side_step
@_effect_reduction = KGC::BE_GUARD_REDUCTION ? @battler.guarding? : false
@_side_step_duration = KGC::BE_SIDE_STEP_FRAME
if KGC::BE_SIDE_STEP_ANGLE < 0
ang = rand(360)
else
ang = KGC::BE_SIDE_STEP_ANGLE
end
rad = Math::PI * ang / 180
@_side_step_x = KGC::BE_SIDE_STEP_DISTANCE * Math.cos(rad)
@_side_step_y = KGC::BE_SIDE_STEP_DISTANCE * Math.sin(rad)
if @_effect_reduction
@_side_step_x /= 2
@_side_step_y /= 2
end
if @battler.is_a?(Game_Enemy) && KGC::BE_ENEMY_REVERSE
@_side_step_x *= -1
@_side_step_y *= -1
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
alias update_KGC_BattlerEffect update
def update
update_KGC_BattlerEffect
# 가시의 경우
if @battler != nil && @battler_visible
apply_effect
end
# Shake효과
if @_shake_duration > 0
update_shake
end
# ZoomIn효과
if @_zoom_in_duration > 0
update_zoom_in
end
# HitBack효과
if @_hitback_duration > 0
update_hitback
end
# Step효과
if @_step_f_duration > 0
update_step
end
# ZoomOut효과
if @_zoom_out_duration > 0
update_zoom_out
end
# SideStep효과
if @_side_step_duration > 0
update_side_step
end
end
#--------------------------------------------------------------------------
# ● 효과 적용
#--------------------------------------------------------------------------
def apply_effect
# 시이크
if @battler.shake
shake
@battler.shake = false
end
# 줌인
if @battler.zoom_in
zoom_in
@battler.zoom_in = false
end
# 히트 백
if @battler.hitback
hitback
@battler.hitback = false
end
# 스텝
if @battler.step_f
step_f
@battler.step_f = false
end
# 줌 아웃
if @battler.zoom_out
zoom_out
@battler.zoom_out = false
end
# 사이드스텝
if @battler.side_step
side_step
@battler.side_step = false
end
end
#--------------------------------------------------------------------------
# ● 시이크 갱신
#--------------------------------------------------------------------------
def update_shake
@_shake_duration -= 1
case @_shake_duration
when 3
self.x -= @_shake_x
self.y -= @_shake_y
when 1..2
self.x += @_shake_x
self.y += @_shake_y
when 0
self.x -= @_shake_x
self.y -= @_shake_y
end
if @_shake_duration == 0 && @_shake_count > 0
@_shake_count -= 1
@_shake_duration = 4
@_shake_x = (@_effect_reduction ? rand(3) : rand(5)) + 1
@_shake_y = (@_effect_reduction ? rand(3) : rand(5)) + 1
@_shake_x *= -1 if rand(2) == 0
@_shake_y *= -1 if rand(2) == 0
end
end
#--------------------------------------------------------------------------
# ● 줌인 갱신
#--------------------------------------------------------------------------
def update_zoom_in
@_zoom_in_duration -= 1
magnification = KGC::BE_ZOOM_IN_MGN * (@_effect_reduction ? 0.5 : 1.0)
case @_zoom_in_duration
when (KGC::BE_ZOOM_IN_FRAME - 3)...KGC::BE_ZOOM_IN_FRAME
self.zoom_x += (magnification - 1.0) / 3.0
self.zoom_y += (magnification - 1.0) / 3.0
self.oy = self.bitmap.height -
(self.bitmap.height * self.zoom_y - self.bitmap.height) / 4
when 1...(KGC::BE_ZOOM_IN_FRAME - 3)
self.zoom_x -= (magnification - 1.0) / (KGC::BE_ZOOM_IN_FRAME - 5)
self.zoom_y -= (magnification - 1.0) / (KGC::BE_ZOOM_IN_FRAME - 5)
self.oy = self.bitmap.height -
(self.bitmap.height * self.zoom_y - self.bitmap.height) / 4
when 0
self.zoom_x = 1.0
self.zoom_y = 1.0
self.oy = self.bitmap.height
end
end
#--------------------------------------------------------------------------
# ● 히트 백 갱신
#--------------------------------------------------------------------------
def update_hitback
@_hitback_duration -= 1
hitback_y = KGC::BE_HITBACK_DISTANCE * (@_effect_reduction ? 0.5 : 1.0)
hitback_y *= -1 if @battler.is_a?(Game_Enemy) && KGC::BE_ENEMY_REVERSE
case @_hitback_duration
when (KGC::BE_HITBACK_FRAME - 3)...KGC::BE_HITBACK_FRAME
self.oy -= hitback_y / 3.0
when 1...(KGC::BE_HITBACK_FRAME - 3)
self.oy += hitback_y / (KGC::BE_HITBACK_FRAME - 5)
when 0
self.oy = self.bitmap.height
end
end
#--------------------------------------------------------------------------
# ● 스텝 갱신
#--------------------------------------------------------------------------
def update_step
@_step_f_duration -= 1
step_f_y = KGC::BE_STEP_F_DISTANCE * (@_effect_reduction ? 0.5 : 1.0)
step_f_y *= -1 if @battler.is_a?(Game_Enemy) && KGC::BE_ENEMY_REVERSE
case @_step_f_duration
when (KGC::BE_STEP_F_FRAME - 3)...KGC::BE_STEP_F_FRAME
self.oy += step_f_y / 3.0
when 1...(KGC::BE_STEP_F_FRAME - 3)
self.oy -= step_f_y / (KGC::BE_STEP_F_FRAME - 5)
when 0
self.oy = self.bitmap.height
end
end
#--------------------------------------------------------------------------
# ● 줌 아웃 갱신
#--------------------------------------------------------------------------
def update_zoom_out
@_zoom_out_duration -= 1
magnification = KGC::BE_ZOOM_OUT_MGN * (@_effect_reduction ? 0.5 : 1.0)
case @_zoom_out_duration
when (KGC::BE_ZOOM_OUT_FRAME - 3)...KGC::BE_ZOOM_OUT_FRAME
self.zoom_x += (magnification - 1.0) / 3.0
self.zoom_y += (magnification - 1.0) / 3.0
self.oy = self.bitmap.height -
(self.bitmap.height * self.zoom_y - self.bitmap.height) / 4
when 1...(KGC::BE_ZOOM_OUT_FRAME - 3)
self.zoom_x -= (magnification - 1.0) / (KGC::BE_ZOOM_OUT_FRAME - 5)
self.zoom_y -= (magnification - 1.0) / (KGC::BE_ZOOM_OUT_FRAME - 5)
self.oy = self.bitmap.height -
(self.bitmap.height * self.zoom_y - self.bitmap.height) / 4
when 0
self.zoom_x = 1.0
self.zoom_y = 1.0
self.oy = self.bitmap.height
end
end
#--------------------------------------------------------------------------
# ● 사이드스텝 갱신
#--------------------------------------------------------------------------
def update_side_step
@_side_step_duration -= 1
case @_side_step_duration
when (KGC::BE_SIDE_STEP_FRAME - 3)...KGC::BE_SIDE_STEP_FRAME
self.ox += @_side_step_x / 3.0
self.oy += @_side_step_y / 3.0
when 1...(KGC::BE_SIDE_STEP_FRAME - 3)
self.ox -= @_side_step_x / (KGC::BE_SIDE_STEP_FRAME - 5)
self.oy -= @_side_step_y / (KGC::BE_SIDE_STEP_FRAME - 5)
when 0
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_Battle (분할 정의 4)
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● 프레임 갱신 (메인 국면 스텝 3 : 행동측 애니메이션)
#--------------------------------------------------------------------------
alias update_phase4_step3_KGC_BattlerEffect update_phase4_step3
def update_phase4_step3
# 원래의 처리를 실행
update_phase4_step3_KGC_BattlerEffect
# 행동시 효과를 적용
if KGC::BE_ACTION_PERMIT.include?(@active_battler.current_action.kind)
apply_action_effect(@active_battler, @active_battler.current_action.kind)
end
end
#--------------------------------------------------------------------------
# ● 행동측 효과 적용
#--------------------------------------------------------------------------
def apply_action_effect(battler, kind)
effect = -1
# 통상 공격
if kind == 0 && battler.current_action.basic == 0
if battler.is_a?(Game_Actor)
# 공격시 사용 무기 취득
if $imported["EquipExtension"] && battler.two_swords?
weapon = $data_weapons[battler.weapon_id(battler.attack_count)]
else
weapon = $data_weapons[battler.weapon_id]
end
if weapon != nil
# 효과 강제 속성 판정
weapon.element_set.each { |element|
if $data_system.elements[element] =~
$game_special_elements["battler_effect_force_attacker"]
effect = $1.to_i
break
end
}
end
else
# 방어 속성 판정
enemy = $data_enemies[battler.id]
(1...$data_system.elements.size).each { |i|
if $data_system.elements[i] =~
$game_special_elements["battler_effect_force_attacker"] &&
enemy.element_ranks[i] < 3
effect = $1.to_i
break
end
}
end
# 스킬
elsif kind == 1
if @skill != nil
# 효과 강제 속성 판정
@skill.element_set.each { |element|
if $data_system.elements[element] =~
$game_special_elements["battler_effect_force_attacker"]
effect = $1.to_i
break
end
}
end
# 아이템
elsif kind == 2
if @item != nil
# 효과 강제 속성 판정
@item.element_set.each { |element|
if $data_system.elements[element] =~
$game_special_elements["battler_effect_force_attacker"]
effect = $1.to_i
break
end
}
end
end
if effect == -1
effect = battler.is_a?(Game_Actor) ?
KGC::BE_ACTOR_ACTION : KGC::BE_ENEMY_ACTION
end
# 효과 적용
apply_effect(battler, effect)
end
#--------------------------------------------------------------------------
# ● 효과 적용
#--------------------------------------------------------------------------
def apply_effect(battler, type)
case type
when 0 # 시이크
battler.shake = true
when 1 # 줌인
battler.zoom_in = true
when 2 # 히트 백
battler.hitback = true
when 3 # 스텝
battler.step_f = true
when 4 # 줌 아웃
battler.zoom_out = true
when 5 # 사이드스텝
battler.side_step = true
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (메인 국면 스텝 4 : 대상측 애니메이션)
#--------------------------------------------------------------------------
alias update_phase4_step4_KGC_BattlerEffect update_phase4_step4
def update_phase4_step4
# 원래의 처리를 실행
update_phase4_step4_KGC_BattlerEffect
# 공격 애니메이션 개시시의 경우는 버틀러 효과 적용
apply_target_effect if KGC::BE_TARGET_TIMING == 1
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (메인 국면 스텝 5 : 데미지 표시)
#--------------------------------------------------------------------------
alias update_phase4_step5_KGC_BattlerEffect update_phase4_step5
def update_phase4_step5
# 원래의 처리를 실행
update_phase4_step5_KGC_BattlerEffect
# 데미지시의 경우는 버틀러 효과 적용
apply_target_effect if KGC::BE_TARGET_TIMING == 0
end
#--------------------------------------------------------------------------
# ● 대상측 효과 적용
#--------------------------------------------------------------------------
def apply_target_effect
# 피데미지 효과 발동
($game_party.actors + $game_troop.enemies).each { |battler|
# 데미지를 받았을 경우
if battler.damage != nil && battler.damage.is_a?(Numeric) &&
battler.damage > 0
effect = -1
# 통상 공격
if @active_battler.current_action.kind == 0 &&
@active_battler.current_action.basic == 0
if @active_battler.is_a?(Game_Actor)
# 공격시 사용 무기 취득
if $imported["EquipExtension"] && @active_battler.two_swords?
weapon = $data_weapons[@active_battler.weapon_id(@active_battler.attack_count)]
else
weapon = $data_weapons[@active_battler.weapon_id]
end
if weapon != nil
# 효과 강제 속성 판정
weapon.element_set.each { |element|
if $data_system.elements[element] =~
$game_special_elements["battler_effect_force_target"]
effect = $1.to_i
break
end
}
end
else
# 방어 속성 판정
enemy = $data_enemies[@active_battler.id]
(1...$data_system.elements.size).each { |i|
if $data_system.elements[i] =~
$game_special_elements["battler_effect_force_target"] &&
enemy.element_ranks[i] < 3
effect = $1.to_i
break
end
}
end
# 스킬
elsif @active_battler.current_action.kind == 1
if @skill != nil
# 효과 강제 속성 판정
@skill.element_set.each { |element|
if $data_system.elements[element] =~
$game_special_elements["battler_effect_force_target"]
effect = $1.to_i
break
end
}
end
# 아이템
elsif @active_battler.current_action.kind == 2
if @item != nil
# 효과 강제 속성 판정
@item.element_set.each { |element|
if $data_system.elements[element] =~
$game_special_elements["battler_effect_force_target"]
effect = $1.to_i
break
end
}
end
end
if effect == -1
effect = battler.is_a?(Game_Actor) ?
KGC::BE_ACTOR_DAMAGE : KGC::BE_ENEMY_DAMAGE
end
# 효과 적용
apply_effect(battler, effect)
end
}
end
end