#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ 반사 스테이트 - KGC_Reflection ◆ VX ◆
#_/ ◇ Last update : 2009/09/04 ◇
#_/----------------------------------------------------------------------------
#_/ 상대의 공격을 뒤집는 스테이트를 작성합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ 커스터마이즈 항목 - Customize BEGIN ★
#==============================================================================
module KGC
module Reflection
# ◆ 물리 반사 메세지
PHYSIC_MSG = "공격을 뒤집었다!"
# ◆ 물리 반사 애니메이션 ID
PHYSIC_ANIME_ID = 91
# ◆ 마법 반사 메세지
MAGIC_MSG = "빛의 벽이 마법을 뒤집었다!"
# ◆ 마법 반사 애니메이션 ID
MAGIC_ANIME_ID = 91
end
end
#==============================================================================
# ☆ 커스터마이즈 항목 종료 - Customize END ☆
#==============================================================================
$imported = {} if $imported == nil
$imported["Reflection"] = true
module KGC
module Reflection
module Regexp
module UsableItem
# 반사 관통
PENETRATE_REFLECT = /<(?:PENETRATE_REFLECT|반사 관통)>/i
end
module State
# 물리 반사
REFLECT_PHYSIC = /<(?:REFLECT_PHYSIC|물리 반사)>/i
# 마법 반사
REFLECT_MAGIC = /<(?:REFLECT_MAGIC|마법 반사)>/i
# 반사 속성
REFLECT_ELEMENT = /<(?:REFLECT_ELEMENT|반사 속성)s*
(d+(?:s*,s*d+)*)?>/ix
end
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Vocab
#==============================================================================
module Vocab
# 물리 반사
ReflectPhysic = KGC::Reflection::PHYSIC_MSG
# 마법 반사
ReflectMagic = KGC::Reflection::MAGIC_MSG
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ RPG::UsableItem
#==============================================================================
class RPG::UsableItem < RPG::BaseItem
#--------------------------------------------------------------------------
# ○ 반사 스테이트의 캐쉬를 생성
#--------------------------------------------------------------------------
def create_reflection_cache
@__penetrate_reflect = false
self.note.each_line { |line|
case line
when KGC::Reflection::Regexp::UsableItem::PENETRATE_REFLECT
@__penetrate_reflect = true
end
}
end
#--------------------------------------------------------------------------
# ○ 반사 관통 가부
#--------------------------------------------------------------------------
def can_penetrate_reflect
create_reflection_cache if @__penetrate_reflect == nil
return @__penetrate_reflect
end
alias can_penetrate_reflect? can_penetrate_reflect
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ RPG::State
#==============================================================================
class RPG::State
#--------------------------------------------------------------------------
# ○ 반사 스테이트의 캐쉬를 생성
#--------------------------------------------------------------------------
def create_reflection_cache
@__reflect_physic = false
@__reflect_magic = false
@__reflect_elements = []
self.note.each_line { |line|
case line
when KGC::Reflection::Regexp::State::REFLECT_PHYSIC
@__reflect_physic = true
when KGC::Reflection::Regexp::State::REFLECT_MAGIC
@__reflect_magic = true
when KGC::Reflection::Regexp::State::REFLECT_ELEMENT
$1.scan(/d+/).each { |num| @__reflect_elements << num.to_i }
@__reflect_elements.uniq!
end
}
end
#--------------------------------------------------------------------------
# ○ 반사 스테이트인가
#--------------------------------------------------------------------------
def is_reflect?
return (physic_can_reflect? || magic_can_reflect?)
end
#--------------------------------------------------------------------------
# ○ 물리 반사 가부
#--------------------------------------------------------------------------
def physic_can_reflect
create_reflection_cache if @__reflect_physic == nil
return @__reflect_physic
end
alias physic_can_reflect? physic_can_reflect
#--------------------------------------------------------------------------
# ○ 마법 반사 가부
#--------------------------------------------------------------------------
def magic_can_reflect
create_reflection_cache if @__reflect_magic == nil
return @__reflect_magic
end
alias magic_can_reflect? magic_can_reflect
#--------------------------------------------------------------------------
# ○ 반사 가능 속성
#--------------------------------------------------------------------------
def reflectable_elements
create_reflection_cache if @__reflect_elements == nil
return @__reflect_elements
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :unreflectable # 반사 불가 플래그
attr_accessor :reflected # 반사가 끝난 플래그
#--------------------------------------------------------------------------
# ● 행동 효과의 보관 유지용 변수를 클리어
#--------------------------------------------------------------------------
alias clear_action_results_KGC_Reflection clear_action_results
def clear_action_results
clear_action_results_KGC_Reflection
@reflected = false
end
#--------------------------------------------------------------------------
# ● 통상 공격의 효과 적용
# attacker : 공격자
#--------------------------------------------------------------------------
alias attack_effect_KGC_Reflection attack_effect
def attack_effect(attacker)
reflection_effect(attacker)
return if @skipped
attack_effect_KGC_Reflection(attacker)
end
#--------------------------------------------------------------------------
# ● 스킬의 효과 적용
# user : 스킬의 사용자
# skill : 스킬
#--------------------------------------------------------------------------
alias skill_effect_KGC_Reflection skill_effect
def skill_effect(user, skill)
reflection_effect(user, skill)
return if @skipped
skill_effect_KGC_Reflection(user, skill)
end
#--------------------------------------------------------------------------
# ○ 반사 효과의 적용
# user : 행동자
# skill : 스킬 (nil (이)라면 통상 공격)
#--------------------------------------------------------------------------
def reflection_effect(user, skill = nil)
@reflected = false
return unless can_reflect?(user, skill)
clear_action_results
@skipped = true
@reflected = true
user.unreflectable = true
if skill == nil
user.attack_effect(user)
else
user.skill_effect(user, skill)
end
user.unreflectable = false
end
#--------------------------------------------------------------------------
# ○ 반사 가부 판정
# user : 스킬의 사용자
# skill : 스킬 (nil (이)라면 통상 공격)
#--------------------------------------------------------------------------
def can_reflect?(user, skill = nil)
return false if unreflectable # 반사 불가
return false if actor? && user.actor? # 아군이라면 반사하지 않는다
if skill != nil && skill.can_penetrate_reflect?
return false # 관통이라면 반사하지 않는다
end
if skill.is_a?(RPG::Skill)
element_set = ($imported["SetAttackElement"] ?
get_inherited_element_set(user, skill) : skill.elment_set)
else
element_set = user.element_set
end
physic = (skill == nil ? true : skill.physical_attack)
states.each { |state|
r_elements = state.reflectable_elements
unless r_elements.empty?
# 반사 불가능한 속성이 있으면 안 됨
return false if (r_elements & element_set).size != element_set.size
end
return true if state.physic_can_reflect? && physic
return true if state.magic_can_reflect? && !physic
}
return false
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 애니메이션의 표시
# targets : 대상자의 배열
# animation_id : 애니메이션 ID (-1: 통상 공격과 같다)
#--------------------------------------------------------------------------
alias display_animation_KGC_Reflection display_animation
def display_animation(targets, animation_id)
display_animation_KGC_Reflection(
remove_reflected_targets(targets), animation_id)
end
#--------------------------------------------------------------------------
# ● 공격 애니메이션의 표시
# targets : 대상자의 배열
# 적캐릭터의 경우는 [적의 통상 공격] 효과음을 연주해 일순간 기다린다.
# 액터의 경우는 쌍수검을 고려 (왼손 무기는 반전해 표시) .
#--------------------------------------------------------------------------
alias display_attack_animation_KGC_Reflection display_attack_animation
def display_attack_animation(targets)
display_attack_animation_KGC_Reflection(remove_reflected_targets(targets))
end
#--------------------------------------------------------------------------
# ○ 반사 가능한 대상자를 제거
# targets : 대상자의 배열
#--------------------------------------------------------------------------
def remove_reflected_targets(targets)
action = @active_battler.action
if !@reflected && (action.attack? || action.skill?)
obj = (action.skill? ? action.skill : nil)
targets = targets.clone
targets.delete_if { |target| target.can_reflect?(@active_battler, obj) }
end
return targets
end
#--------------------------------------------------------------------------
# ● 행동 결과의 표시
# target : 대상자
# obj : 스킬 또는 아이템
#--------------------------------------------------------------------------
alias display_action_effects_KGC_Reflection display_action_effects
def display_action_effects(target, obj = nil)
if target.reflected
@reflected = true
display_reflect(target, obj)
display_action_effects(@active_battler, obj)
@reflected = false
return
end
display_action_effects_KGC_Reflection(target, obj)
end
#--------------------------------------------------------------------------
# ○ 반사시의 메세지를 표시
# target : 대상자
# obj : 스킬 또는 아이템
#--------------------------------------------------------------------------
def display_reflect(target, obj)
physic = (obj == nil ? true : obj.physical_attack)
text = (physic ? Vocab::ReflectPhysic : Vocab::ReflectMagic)
@message_window.add_instant_text(text)
display_normal_animation([target], physic ?
KGC::Reflection::PHYSIC_ANIME_ID : KGC::Reflection::MAGIC_ANIME_ID)
wait_for_animation
if obj == nil
display_attack_animation([@active_battler])
else
display_animation([@active_battler], obj.animation_id)
end
@message_window.back_one
end
end
***사용법***
물리반사 스테이트작성.
스테이트의 메모란에 <물리 반사> (을)를 추가합니다.
이 기술을 추가한 스테이트가 부여되고 있는 동안은, 물리 공격을 반사
마법반사 스테이트작성.
스테이트의 메모란에 <마법 반사> (을)를 추가합니다.
이 기술을 추가한 스테이트가 부여되고 있는 동안은, 마법 공격을 반사
속성반사
스테이트의 메모란에 <반사 속성 n1, n2, ...> (을)를 추가합니다.
n1, n2, ...에는, 반사하는 속성을 , 단락으로 입력합니다.
<반사 속성 9> # 불길만 반사 <반사 속성 15, 16> # 신성, 암흑을 반사
공격이 가지는 속성이 반사 속성에모두포함되어 있는 경우만, 그 공격이 반사 대상이 됩니다.
(불길만을 반사 속성으로 해도, 불길+풍 등은 반사 불가)
반사 속성은, 물리 반사나 마법 반사와 함께 사용해 주세요.
단체에서는 기능하지 않습니다.
반사관통
스킬의 메모란에 <반사 관통> (을)를 추가하면, 그 스킬은 반사되지 않게 됩니다