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 5593
    공지 RPG VX ACE 유용한 링크 모음 16 아방스 2012.01.03 29399
    37 버그픽스 Graphical Object Global Reference ACE (세부적인 에러메세지 없는 RGSS Player 크래쉬 디버거) by Mithran 1 Alkaid 2014.03.03 1542
    36 HUD 화폐단위 표시 구분 5 file 허걱 2014.03.19 2970
    35 메시지 ListBox - 선택지 확장 스크립트 11 file 허걱 2014.04.03 3409
    34 그래픽 Mirror: EvenNumber Pictures - 짝수번호 그림 반전표시 by 허걱 1 file 허걱 2014.05.10 1822
    33 메뉴 스텟을 랭크로 나타내기 7 file Yeolde 2014.05.10 3558
    32 전투 사이드뷰 배틀 스크립트 (Animated Battlers By Jet10985) 6 file Rebiart 2014.05.18 4541
    31 메뉴 Etude87's Menu Editor 44 file 습작 2014.07.17 7027
    30 메시지 Message Skip [메세지 스킵] 5 file Lisky 2014.09.09 4224
    29 기타 Hurt Faces V1.2 (상처에 고통스러워하는 액터의 얼굴을 출력해봅시다.) 5 file spice 2014.09.19 3034
    28 전투 GTBS 2.4 버전 에코 2014.11.28 1917
    27 타이틀/게임오버 시작 전 로고 띄우기 7 file 냐냐 2014.12.04 3396
    26 기타 메시지 표시 중에 자동으로 타이머 멈추기 1 file Bunny_Boy 2014.12.07 1052
    25 전투 theolized 사이드뷰 스크립트 2 하늘바라KSND 2014.12.19 2503
    24 기타 Gamepad Extender 습작 2015.01.02 744
    23 기타 Improved Input System 1 습작 2015.01.02 1010
    22 직업 직업 경험치+능력치 설정 확장 7 file zubako 2015.01.27 4004
    21 미니맵 Etude87's KMS MiniMap Add-on ver.1.1.4 2 file 습작 2015.04.23 1972
    20 메시지 아이템 정보 메세지가 뜨는 아이템 획득 1 폴라 2015.05.21 2414
    19 이동 및 탈것 Khas Pathfinder(길찾기 스크립트) 15 찬잎 2015.07.10 1980
    18 버그픽스 RGSS3 Unofficial Bug Fix Snippets Alkaid 2015.09.09 686
    Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 Next
    / 11