VX 스크립트

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ 반사 스테이트 - 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>  # 신성, 암흑을 반사

공격이 가지는 속성이 반사 속성에모두포함되어 있는 경우만, 그 공격이 반사 대상이 됩니다.
(불길만을 반사 속성으로 해도, 불길+풍 등은 반사 불가)

반사 속성은, 물리 반사나 마법 반사와 함께 사용해 주세요.
단체에서는 기능하지 않습니다.

 

반사관통

스킬의 메모란에 <반사 관통> (을)를 추가하면, 그 스킬은 반사되지 않게 됩니다

Who's 카르와푸딩의아틀리에

profile

엘카르디아 제작자 (현재 MV로 리메이크중)

유튜브

https://www.youtube.com/channel/UCMwirNTR-pOEzJNB0jL3y_g

트위터

https://twitter.com/karsis98

블로그

https://blog.naver.com/karsis98

Comment '4'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 5398
217 빠른 스킬사용 6 file RPGbooster 2008.10.08 2814
216 오디오 사운드 자동 변환 설정 rukan 2009.07.01 1461
215 오디오 사운드테스트 스크립트 13 file 카르와푸딩의아틀리에 2009.08.19 2106
214 전투 사이드 뷰 시스템 [시트르산님 제공] 56 아방스 2010.11.29 7499
213 전투 사이드뷰 스크립트 [2003 전투 방식] 39 아방스 2008.03.09 8406
212 전투 사이드뷰 애드온 7 비극ㆍ 2010.08.21 6758
211 전투 사이드뷰배틀3.3 + ATB1.1 스크립트. 65 할렘 2009.02.01 10946
210 전투 사이드뷰배틀에서 시각적으로 위치 지정하기 9 file 078656577er 2009.10.14 4910
209 전투 사이드뷰배틀에서 찌르기 공격 가능하게 7 078656577er 2009.09.16 3223
208 기타 사이드뷰배틀에서 찌르기 공격 가능하게(Upgrade!) 6 078656577er 2009.10.15 2838
207 상점 상점 무기, 방어구 능력치 비교 스크립트! 18 불독 2008.12.25 3611
206 상점 상점 아이템 목록 정리 14 정의로운녀석 2008.07.22 3771
205 상점 상점 할인 스크립트(변수를 이용한 물건 가격 조정) 9 달표범 2009.09.04 3185
204 상점 상점에서 아이템 분류 5 file 파이어 2011.01.23 3510
203 상점 상점을 색다르게 바꿔주는 스크립트 34 file 할렘 2009.02.02 6301
202 상점 상점의 자세한 표시 32 file RPGbooster 2008.10.11 4008
201 상태/속성 상태 메뉴 변경 스크립트 45 죄송해욧! 2008.03.01 4284
200 맵/타일 새로운 월드맵 만들기 (로맨싱사가풍) 37 file 078656577er 2009.10.09 6151
199 전투 새로운 전투돌입효과 29 file RPGbooster 2008.10.08 5079
198 새로운 종류의 세이브 스크립트!! 8 Man... 2008.10.28 3517
Board Pagination Prev 1 ... 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Next
/ 32