Ace 스크립트

출처 : KMS

http://ytomy.sakura.ne.jp/tkool/rpgtech/php/tech.php?tool=VXAce&cat=tech_vxace/skill&tech=skill_level

 

스킬마다 숙련도를 적용할 수 있게 해주는 스크립트입니다. 좋아보여서 퍼왔습니다.

 

일단 스크립트 원문부터

 

-------------------------------------------------------------------------------------------------------------------------------------

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ 스킬 숙련도 - KMS_SkillLevel ◆ VX Ace ◆
#_/    ◇ Last update : 2012/02/12 (TOMY@Kamesoft) ◇
#_/----------------------------------------------------------------------------
#_/  스킬에 숙련도의 개념을 추가합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ 설정 항목 - BEGIN Setting ★
#==============================================================================

module KMS_SkillLevel
  # ◆ 숙련도 상한
  EXP_MAX = 999

  # ◆ 적에게도 숙련도를 적용한다
  ENABLE_FOR_ENEMY = false
  # ◆ 메뉴 화면에서 사용했을 경우도 숙련도를 올린다
  ENABLE_ON_MENU   = false
end

#==============================================================================
# ☆ 설정 여기까지 - END Setting ☆
#==============================================================================

$kms_imported = {} if $kms_imported == nil
$kms_imported["SkillLevel"] = true

module KMS_SkillLevel
  # 디버그 플래그
  DEBUG = false

  # 숙련도 증가량
  #  기술예 : <숙련도 증가량 2>
  REGEX_SXP_GAIN = /<(?:숙련도 증가량|SXP_GAIN)\s*(\d+)>/i

  # 숙련도 보정
  REGEX_REV = /(?:숙련도 보정|SXP_REV)\s*/i

  # 행동 속도 보정
  #  기술예 : <숙련도 보정 속도 sxp / 50>
  REGEX_SPEED_REV = /<#{REGEX_REV}(?:속도|SPEED)\s+(.+)>/i

  # 성공율 보정
  #  기술예 : <숙련도 보정 성공율 sxp / 50>
  REGEX_SUCCESS_REV = /<#{REGEX_REV}(?:성공율|SUCCESS)\s+(.+)>/i

  # 숙련도용 제어 문자
  #  \SXP / \SXP[actor_id,skill_id] / \SXP[skill_id]
  #  \S 하지만 정의가 끝난 상태라면 미스가능성이 있으므로 \_SXP 에도 대응
  REGEX_TEXT_SXP      = /\e_?SXP\[(\d+)\s*,\s*(\d+)]/i
  REGEX_TEXT_SXP_HELP = /\e_?SXP(?:\[(\d+)\])?/i
end

# *****************************************************************************

#==============================================================================
# □ KMS_Commands
#==============================================================================

module KMS_Commands
  module_function
  #--------------------------------------------------------------------------
  # ○ 액터의 숙련도의 증감
  #--------------------------------------------------------------------------
  def gain_actor_skill_exp(actor_id, skill_id, n)
    return if $game_actors[actor_id].nil?
    $game_actors[actor_id].gain_skill_exp(skill_id, n)
  end
  #--------------------------------------------------------------------------
  # ○ 액터의 숙련도를 클리어
  #--------------------------------------------------------------------------
  def clear_actor_skill_exp(actor_id)
    return if $game_actors[actor_id].nil?
    $game_actors[actor_id].clear_skill_exp
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================

class Game_Interpreter
  # 이벤트 커멘드로부터 직접 커멘드를 두드릴 수 있도록(듯이) 한다
  include KMS_Commands
end

#==============================================================================
# ■ RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ○ 숙련도 캐쉬 작성
  #--------------------------------------------------------------------------
  def __create_skill_level_cache
    @__skill_exp_gain = 1
    @__speed_rev_by_skill_exp_formula   = "0"
    @__success_rev_by_skill_exp_formula = "0"

    note.each_line { |line|
      case line
      when KMS_SkillLevel::REGEX_SXP_GAIN
        @__skill_exp_gain = $1.to_i
      when KMS_SkillLevel::REGEX_SPEED_REV
        @__speed_rev_by_skill_exp_formula = $1
        print "Speed rev[#{id}]: #{$1}\n" if KMS_SkillLevel::DEBUG
      when KMS_SkillLevel::REGEX_SUCCESS_REV
        @__success_rev_by_skill_exp_formula = $1
        print "Success rev[#{id}]: #{$1}\n" if KMS_SkillLevel::DEBUG
      end
    }
  end
  protected :__create_skill_level_cache
  #--------------------------------------------------------------------------
  # ○ 숙련도 증가량 취득
  #--------------------------------------------------------------------------
  def skill_exp_gain
    __create_skill_level_cache if @__skill_exp_gain.nil?
    return @__skill_exp_gain
  end
  #--------------------------------------------------------------------------
  # ○ 행동 속도 보정 취득
  #--------------------------------------------------------------------------
  def speed_rev_by_skill_exp_formula
    __create_skill_level_cache if @__speed_rev_by_skill_exp_formula.nil?
    return @__speed_rev_by_skill_exp_formula
  end
  #--------------------------------------------------------------------------
  # ○ 성공율 보정 취득
  #--------------------------------------------------------------------------
  def success_rev_by_skill_exp_formula
    __create_skill_level_cache if @__success_rev_by_skill_exp_formula.nil?
    return @__success_rev_by_skill_exp_formula
  end
end

#==============================================================================
# ■ Game_Action
#==============================================================================

class Game_Action
  #--------------------------------------------------------------------------
  # ● 행동 속도의 계산
  #--------------------------------------------------------------------------
  alias speed_KMS_SkillLevel speed
  def speed
    n  = speed_KMS_SkillLevel

    # 속도 보정의 적용
    n += subject.speed_rev_by_skill_exp(item) if item

    return n
  end
end

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  alias initialize_KMS_SkillLevel initialize
  def initialize
    initialize_KMS_SkillLevel

    @skill_exp = {}
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도의 취득
  #--------------------------------------------------------------------------
  def skill_exp(skill_id)
    @skill_exp = {}          if @skill_exp.nil?
    @skill_exp[skill_id] = 0 unless @skill_exp.include?(skill_id)

    return @skill_exp[skill_id]
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도의 가산
  #--------------------------------------------------------------------------
  def gain_skill_exp(skill_id, n = 1)
    # 기본 액션은 가산하지 않는다
    return if skill_id == attack_skill_id || skill_id == guard_skill_id

    lv = skill_exp(skill_id)
    @skill_exp[skill_id] = [ [lv + n, 0 ].max, KMS_SkillLevel::EXP_MAX ].min

    if KMS_SkillLevel::DEBUG
      print "#{name} 숙련도 [#{skill_id}] = #{@skill_exp[skill_id]}\n"
    end
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도의 초기화
  #--------------------------------------------------------------------------
  def clear_skill_exp
    @skill_exp = {}
  end
  #--------------------------------------------------------------------------
  # ○ 현재의 액션의 숙련도를 취득
  #     skill_id : 대상 스킬 ID (생략시는 현재의 행동)
  #--------------------------------------------------------------------------
  def sxp(skill_id = 0)
    if skill_id > 0
      return skill_exp(skill_id)
    else
      return current_skill_exp
    end
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도에 의한 행동 속도 보정을 취득
  #     item : 대상 행동
  #--------------------------------------------------------------------------
  def speed_rev_by_skill_exp(item)
    return 0 unless item.is_a?(RPG::Skill)

    formula = item.speed_rev_by_skill_exp_formula
    formula = formula.gsub(/sxp/i) { "skill_exp(item.id)" }
    return eval(formula)
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도에 의한 성공율 보정을 취득
  #     item : 대상 행동
  #--------------------------------------------------------------------------
  def success_rev_by_skill_exp(item)
    return 0 unless item.is_a?(RPG::Skill)

    formula = item.success_rev_by_skill_exp_formula
    formula = formula.gsub(/sxp/i) { "skill_exp(item.id)" }
    return eval(formula)
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ 현재의 행동의 스킬 숙련도를 취득
  #--------------------------------------------------------------------------
  def current_skill_exp
    if current_action.item && current_action.item.is_a?(RPG::Skill)
      return skill_exp(current_action.item.id)
    else
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도 가산 처리
  #--------------------------------------------------------------------------
  def gain_skill_exp_effect(item)
    return unless item.is_a?(RPG::Skill)

    if $game_party.in_battle || KMS_SkillLevel::ENABLE_ON_MENU
      gain_skill_exp(item.id, item.skill_exp_gain)
    end
  end
  #--------------------------------------------------------------------------
  # ● 스킬/아이템의 사용
  #    행동 측에 대해 불려 가 사용 대상 이외에 대하는 효과를 적용한다.
  #--------------------------------------------------------------------------
  alias use_item_KMS_SkillLevel use_item
  def use_item(item)
    use_item_KMS_SkillLevel(item)

    gain_skill_exp_effect(item)
  end
  #--------------------------------------------------------------------------
  # ● 스킬/아이템의 명중율 계산
  #--------------------------------------------------------------------------
  alias item_hit_KMS_SkillLevel item_hit
  def item_hit(user, item)
    # 숙련도에 의한 성공율 보정치를 가산
    rate_rev  = user.success_rev_by_skill_exp(item) * 0.01
    rate_rev *= user.hit if item.physical?

    return item_hit_KMS_SkillLevel(user, item) + rate_rev
  end
end

#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ○ 스킬 숙련도의 가산
  #--------------------------------------------------------------------------
  def gain_skill_exp(skill_id, n = 1)
    # 아무것도 하지 않는다
  end
end unless KMS_SkillLevel::ENABLE_FOR_ENEMY

#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● 제어 문자의 사전 변환
  #--------------------------------------------------------------------------
  alias convert_escape_characters_KMS_SkillLevel convert_escape_characters
  def convert_escape_characters(text)
    result = convert_escape_characters_KMS_SkillLevel(text).clone

    result.gsub!(KMS_SkillLevel::REGEX_TEXT_SXP) {
      actor = $game_actors[$1.to_i]
      if actor
        actor.skill_exp($2.to_i)
      else
        ""
      end
    }
    return result
  end
end

#==============================================================================
# ■ Window_Help
#==============================================================================

class Window_Help < Window_Base
  #--------------------------------------------------------------------------
  # ● 아이템 설정
  #     item : 스킬, 아이템등
  #--------------------------------------------------------------------------
  alias set_item_KMS_SkillLevel set_item
  def set_item(item)
    @current_item = item

    set_item_KMS_SkillLevel(item)
  end
  #--------------------------------------------------------------------------
  # ○ 액터의 설정
  #--------------------------------------------------------------------------
  def set_actor(actor)
    @current_actor = actor
  end
  #--------------------------------------------------------------------------
  # ● 제어 문자의 사전 변환
  #--------------------------------------------------------------------------
  unless method_defined?(:convert_escape_characters_KMS_SkillLevel)
    alias convert_escape_characters_KMS_SkillLevel convert_escape_characters
  end
  def convert_escape_characters(text)
    result = convert_escape_characters_KMS_SkillLevel(text).clone

    result.gsub!(KMS_SkillLevel::REGEX_TEXT_SXP_HELP) {
      if @current_actor
        if $1.nil? && @current_item.is_a?(RPG::Skill)
          # 현재의 스킬
          @current_actor.skill_exp(@current_item.id)
        else
          # ID 지정
          @current_actor.skill_exp($1.to_i)
        end
      else
        ""
      end
    }
    return result
  end
end

#==============================================================================
# ■ Window_SkillList
#==============================================================================

class Window_SkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 헬프 텍스트 갱신
  #--------------------------------------------------------------------------
  alias update_help_KMS_SkillLevel update_help
  def update_help
    @help_window.set_actor(@actor)

    update_help_KMS_SkillLevel

    @help_window.set_actor(nil)
  end
end

#==============================================================================
# ■ Scene_Skill
#==============================================================================

class Scene_Skill < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● 아이템의 사용
  #--------------------------------------------------------------------------
  alias use_item_KMS_SkillLevel use_item
  def use_item
    use_item_KMS_SkillLevel

    @help_window.set_actor(@actor)
    @help_window.refresh
    @help_window.set_actor(nil)
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 커멘드[스킬]
  #--------------------------------------------------------------------------
  alias command_skill_KMS_SkillLevel command_skill
  def command_skill
    @help_window.clear

    command_skill_KMS_SkillLevel
  end
end
-----------------------------------------------------------------------------------------------------------------------------------------

 

  • 특징
  • 1. 대미지 계산식에서 숙련도를 참조 가능 - a.sxp 사용 스킬의 숙련도 a.sxp(100) 100번스킬의 숙련도
  •                                                                           방어자의 숙련도도 사용가능
  •  
  • 2.숙련도를 속도보정치, 성공율에 반영 가능 - 스킬의 메모란에
  • <sxp_rev {param} {formula}>을 기입하면 됩니다. 사용가능한 파라미터는 속도보정과 성공율
  • exa) <sxp_rev speed sxp> 숙련도만큼 속도 +
  •       <sxp_rev success sxp/100> 숙련도% 만큼 성공률 +
  • 3. 숙련도를 제어 문자로 참조 가능
  • exa) 스킬의 설명란에 숙련도 표시 가능 \sxp, \_sxp 양쪽 가능
  • \sxp 숙련도 표시. 스킬의 헬프란에서만 가능
  • \sxp[n] n번 스킬 숙련도 표시. 스킬의 헬프란에서만 가능
  • \sxp[m,n] m번 액터의 n번 스킬 숙련도 표시.
  •  

    Who's 아이미르

    ?

    허루쿠... 임용고시 공부해야되는데 이러고 있다....

     

    알만툴의 중독성은 쩔어준다는;;;

    • ?
      Bluesky(新) 2012.02.25 08:41

      사이트 감사합니다 ㅋ.

      숙련도란. 또 하나의 다른 능력치라고 볼 수 있기 때문에 더욱 더 강한 공격이 가능해지면서 동시에 더욱 더 복잡한 식이 완성되겠네요..

    • ?
      시옷청룡 2012.02.25 22:57

      아으 어렵네요

    • ?
      네이피어 2012.02.29 18:53

      어렵군요.. 'ㅅ'

      모든 스킬에 대한 스크립트를 만들어야 하나요?

      아니면 이거 하나가지고 모든 스킬에 적용이 되나요..

      (음.. 아무래도 선자쪽이겟지요?)

    • ?
      아이미르 2012.02.29 19:32
      그렇다기보다는 스킬에 숙련도라는 파라미터를 하나 더 생성한다는 게 좀더 명확합니다 . 스킬에 연관시키려면 스킬 계산식에 특정 단어를 도입해야합니다 a.atk 처럼 a.sxp같이 쓰는 겁니다
    • ?
      minibalrog 2012.03.30 22:45

      감사합니다. 잘 쓸께요

      곧 장비 숙련도도 나오는건가요? ㅡ.ㅡ+ 기대~

      (스크립하나 못만드는 주제에 ㅈㅅ)


    • ?
      로히 2012.05.20 22:13
      어떻게 사용 되는지, 그리고 숙련치가 얼마나 가산되는지를 잘 모르겠네요...

      잘 쓰면 매우 훌륭한 스크립트인 것 같은데 괜찮으시면 설명 조금 해주실 수 있으신가요?
    • ?
      도라이몽1호 2013.06.14 19:51
      감사합니닼^ㅡ^
    • ?
      Yuinu 2013.10.20 22:45

      이상하게 22줄에서 오류가 나타나네요.
      제가 보기엔 이유가 없어보이는데...

      ------------------------------------------------------------------------------

      아 제가 실수했었네요;;

      맨위 ------ 이부분까지 넣어버려서 오류가 났었어요ㅎㅎ..;


    List of Articles
    번호 분류 제목 글쓴이 날짜 조회 수
    공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 5110
    공지 RPG VX ACE 유용한 링크 모음 16 아방스 2012.01.03 28925
    37 HUD Variables-Display Script System 8 file 허걱 2012.05.27 5451
    36 전투 vx ace 애니메이션 배틀 3 gor 2012.05.27 7664
    35 메시지 [스크립트] Ace Message System - by. Yanfly 17 file 허걱 2012.05.21 7252
    34 전투 [스크립트] Sideview Battle System ver. 1.00 (일본어) 7 file 허걱 2012.05.20 6912
    33 이동 및 탈것 [스크립트] Setp Sound (발걸음 소리) 20 file 허걱 2012.05.19 4655
    32 기타 원하는 글씨체로 변경하기 12 조말생 2012.04.20 8847
    31 전투 SRPG 컨버터 for Ace (SRPGコンバータ for Ace) by AD.Bank 27 file 습작 2012.04.17 7274
    30 메뉴 [VX Ace] 다이얼 링 메뉴 스크립트 8 file RaonHank 2012.04.16 6670
    29 변수/스위치 Etude87_Variables_Ace 6 file 습작 2012.04.13 3368
    28 스킬 VXACE 패시브 스킬 스크립트 Ver. 0.82 21 file 아이미르 2012.03.07 6669
    27 전투 전투시 나오는 메세지 삭제 10 Nintendo 2012.03.03 4358
    » 스킬 스킬 숙련도 시스템 8 아이미르 2012.02.24 4918
    25 메뉴 Customizable Main Menu 1.0b by modern algebra 4 file Alkaid 2012.02.13 5449
    24 타이틀/게임오버 타이틀 화면 없이 게임을 시작하게 만드는법. 6 마에르드 2012.02.11 4585
    23 전투 능력 강화/약화의 누적식 개조(버그수정) 13 아이미르 2012.02.08 3876
    22 장비 장비 장착을 통한 스킬 습득 및 삭제 4 아이미르 2012.02.05 3597
    21 전투 Ace 경험치 직접 설정 12 쿠쿠밥솥 2012.02.05 4004
    20 전투 레벨업시 HP/MP 전체회복 9 쿠쿠밥솥 2012.02.05 5029
    19 장비 사용자 장비 슬롯 1.1 27 file 아방스 2012.01.31 6615
    18 아이템 양손무기 작착 스크립트 [Dual Wield -> Free Hands Version 1.0] 7 file 아방스 2012.01.31 4633
    Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 Next
    / 11