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 28927
    37 기타 ACE) 오블리비언 락픽 구현 V0.5.2 7 file 77이알 2012.09.02 4811
    36 이동 및 탈것 8 방향 이동 스크립트 ( 사선 이동 캐릭터 그래픽 지원 ) 9 file 미루 2013.07.11 4845
    35 그래픽 Galy`s 캐릭터 그래픽 커스텀 3 스리아씨 2013.12.17 4893
    » 스킬 스킬 숙련도 시스템 8 아이미르 2012.02.24 4918
    33 전투 CP's Battle Engine by Neon Black 20 Alkaid 2013.02.14 4957
    32 전투 레벨업시 HP/MP 전체회복 9 쿠쿠밥솥 2012.02.05 5029
    31 타이틀/게임오버 타이틀 스크린 커스터마이징 11 file 라실비아 2013.08.12 5153
    30 전투 Schala 전투 시스템 (XAS에 의해 구동) 11 홍색의환상향 2013.05.05 5321
    29 상점 VXAce 상점 스크립트 V0.9 17 아이미르 2012.06.29 5380
    28 이동 및 탈것 RPG VX ACE ( RGSS3_8direction_move_v1.01 ) 8방향 스크립트 17 file 쿠쿠밥솥 2012.01.24 5412
    27 전투 [VX Ace] Damage Popup by Dargor 7 Alkaid 2011.12.04 5445
    26 메뉴 Customizable Main Menu 1.0b by modern algebra 4 file Alkaid 2012.02.13 5452
    25 HUD Variables-Display Script System 8 file 허걱 2012.05.27 5452
    24 기타 없는 것 같아서 올립니다. VX ACE 한계 돌파 스크립트입니다. 24 빙룡군 2012.07.07 5597
    23 아이템 물품 이름 컬러 변경 14 까까까 2012.01.04 5632
    22 키입력 키 입력 확장 - 전체키 + 마우스입력 40 file 허걱 2012.12.15 5781
    21 메뉴 ace용 mog메뉴와 mog전투 10 file 꿈꾸는사람 2012.08.04 6053
    20 전투 XAS Hero Edition Ace Experimental 0.5 6 Alkaid 2012.01.15 6130
    19 전투 VXAce 사이드뷰 스크립트 (번역) 23 아이미르 2012.12.10 6356
    18 미니맵 미니맵 표시 스크립트 21 file 아방스 2012.01.16 6488
    Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 Next
    / 11