건의 및 신고

조회 수 548 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

<이벤트로 스킬 레벨을 조작하는>
·있는 레벨로 설정한다
 set_skill_level(actor_id, skill_id, level)
   actor_id:액터 ID
   skill_id:스킬 ID
   level:설정 레벨
 (예) 아르시스의 크로스컷의 레벨을 10으로 설정한다.
   → set_skill_level(1,57,10)
·현재의 레벨을  1올린다
 skill_level_up(actor_id, skill_id)
 (예) 아르시스의 크로스컷의 레벨을  1올린다.
   → skill_level_up(1,57)
·현재의 레벨을  1내린다
 skill_level_down(actor_id, skill_id)
 (예) 아르시스의 크로스컷의 레벨을  1내린다.
   → skill_level_down(1,57)

<스킬 경험치의 표시>
적당한 윈도우(Window_Base 부하)에,
draw_skill_exp(acto,skill_id,x,y)와 기술한다.
  actor:액터
  skill_id:스킬 ID
  x:x방향 묘화 위치
  y:y방향 묘화 위치

이 위에거랑 스크립트상의 주석이 사용법임

그런데 이 위의 것을 참조하는 것보다 스크립트를 참조하는 것이 유용해요!

----------------------------절취선--------------------------

#==============================================================================
# ■ 스킬 업데이트   Ver. 4.6.1                     by Claimh
#------------------------------------------------------------------------------
#     스킬 마다 레벨제를 도입한다
#     전투중에 스킬을 사용하는 만큼, 위력 상승, 소비 SP감소, 명중율 상승
#     ※스킬 경험치의 표시:draw_skill_exp
#==============================================================================

module Skill_updata
  S_MIGHT = []
  S_COST = []
  S_HIT = []
  S_LEVEL = []
  S_INTER = []
  S_SLOPE = []
  S_ANIME = []
  S_ELEMENT = []
  S_STATE_P = []
  S_STATE_N = []
#==============================================================================
# □ 커스터마이즈 포인트
#==============================================================================
  #----------------------------------------------------------------------------
  # 기본 설정(여기만 설정하면, 다음은 필요 없을지도 모릅니다)
  #----------------------------------------------------------------------------
  # 위력 상승을 사용한다
  SKILL_MIGHT_UP = true          # 무효화→false
  # SP소비 감소를 사용한다
  SP_COST_DOWN = true            # 무효화→false
  # 명중율 상승을 사용한다
  SKILL_HIT_UP = true            # 무효화→false
  # 속성 변화를 사용한다
  ELEMENT_CHANGE = true          # 무효화→false
  # 스테이트 변화를 사용한다
  STATE_CHANGE = true            # 무효화→false
 
  # Lv업 표시를 한다
  SHOW_SKILL_LV_UP = true        # 무효화→false
  # Lv업시의 SE
  SKILLUP_SE = "056-Right02"     # 필요없으면 nil
  # 메뉴 사용시에도 올라간다(LV업 표시는 없습니다)
  MENU_COUNT = false

  # 스킬 레벨 상승 간격(몇회 사용할 때 마다 Lv 올라갈까)
  UPDATA_INTERVAL = 2            # 1이상
  # 한계 레벨
  LEVEL_LIMIT = 20               # 1이상

  # 위력 상승률(%)
  MIGHT_RATE = 0.5
  # SP소비 감소율(%)
  COST_RATE = 3
  # 명중 상승률(%)
  HIT_RATE = 1

  #----------------------------------------------------------------------------
  # 스킬&액터별 상세 설정
  #----------------------------------------------------------------------------
  # 한계 레벨
  # S_LEVEL[스킬 ID] = [액터 ID=>위력 상승률, …]
  # ※설정이 없는 경우→기본 설정(LEVEL_LIMIT)이 적응됩니다
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_LEVEL[57] = {0=>10,1=>18, 2=>12, 3=>5, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
  S_LEVEL[61] = {0=>10,1=>12, 2=>18, 3=>15, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
 
  # 스킬&액터별 위력 상승률
  # S_MIGHT[스킬 ID] = [액터 ID=>위력 상승률, …]
  # ※설정이 없는 경우→기본 설정(MIGHT_RATE)이 적응됩니다
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_MIGHT[57] = {0=>2,1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_MIGHT[61] = {0=>2,1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 스킬&액터별 SP소비 감소율
  # S_COST[스킬 ID] = [액터 ID=>SP소비 감소율, …]
  # ※설정이 없는 경우→기본 설정(COST_RATE)이 적응됩니다
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_COST[57] = {0=>2,1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_COST[61] = {0=>2,1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 스킬&액터 별명 나카가미승율
  # S_HIT[스킬 ID] = [액터 ID=>명중 상승률, …]
  # ※설정이 없는 경우→기본 설정(HIT_RATE)이 적응됩니다
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_HIT[57] = {0=>1,1=>2, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}
  S_HIT[61] = {0=>1,1=>1, 2=>2, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}

  #----------------------------------------------------------------------------
  # 스킬의 성장의 상세 설정
  #----------------------------------------------------------------------------
  # 스킬의 성장 패턴
  # 0:스킬을 일정 회수 사용하면 레벨업
  # 1:스킬을 일정 회수+레벨마다의 기울기분 사용하면 레벨업
  SKILL_PATTERN = 0
 
  # 스킬 레벨 상승 간격(몇회 사용할 때 마다 Lv 올라갈까)
  # S_INTER[스킬 ID] = [액터 ID=>상승 간격, …]
  #  ※설정이 없는 경우→기본 설정(UPDATA_INTERVAL)이 적응됩니다
  #  ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_INTER[57] = {0=>10,1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}
 
  # 스킬 레벨 상승의 기울기(스킬의 성장 패턴:1을 사용하는 경우만 필요)
  # S_SLOPE[스킬 ID] = [액터 ID=>상승의 기울어, …]
  #  ※설정이 없는 경우는 1이 됩니다.
  #  ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다
  S_SLOPE[57] = {0=>10,1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}

  #----------------------------------------------------------------------------
  # 스킬이 성장한다고 애니메이션 변화시킨다(설정이 없으면 무시)
  #  기입 형태: S_ANIME[스킬 ID] = [액터 ID=>[[레벨, 애니메이션 ID]], ···]
  #----------------------------------------------------------------------------
  # 스킬 성장에 의한 애니메이션 변화를 실시해?
  USE_S_ANIME = true
 
  # 설정예
  # 아르시스는 크로스컷이 Lv.5, Lv.10(이)가 된다고 애니메이션이 바뀐다
  # 바질은 크로스컷이 Lv.11이 된다고 애니메이션이 바뀐다
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_ANIME[57] = {0=>[[5, 69]], 1=>[[5, 69], [10, 70]], 2=>[[11, 70]]}

  #----------------------------------------------------------------------------
  # 속성 변화/스테이트 변화(설정이 없으면 무시)
  #----------------------------------------------------------------------------
  # 속성 변화
  # S_ELEMENT[스킬 ID] = {액터 ID=>{레벨=>[속성 ID,속성 ID…]}, ····}
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_ELEMENT[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 스테이트 변화+
  # S_STATE_P[스킬 ID] = {액터 ID=>{레벨=>[스테이트 ID,스테이트 ID…]}, ····}
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_STATE_P[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 스테이트 변화-
  # S_STATE_N[스킬 ID] = {액터 ID=>{레벨=>[스테이트 ID,스테이트 ID…]}, ····}
  # ※액터 ID에 0을 지정하면 전액터 공통 설정이 됩니다.
  S_STATE_N[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

#==============================================================================
# □ 커스터마이즈 포인트 종료
#==============================================================================
end


class Game_Actor
  include Skill_updata
  attr_accessor   :skill_use      # 스킬 사용 회수
  attr_accessor   :skill_level    # 스킬 레벨
  attr_accessor   :skill_power    # 스킬 위력 갱신치
  attr_accessor   :skill_sp_cost  # 스킬 SP소비 갱신치
  attr_accessor   :skill_hit      # 스킬 명중율
  attr_accessor   :skill_up       # 레벨업 플래그
  attr_accessor   :skill_list     # 스킬 EXP 리스트
  alias skill_updata_init setup
  def setup(actor_id)
    skill_updata_init(actor_id)
    @skill_use = []
    @skill_level = []
    @skill_power = []
    @skill_sp_cost = []
    @skill_hit = []
    @skill_up = false
    @skill_list = []
    for id in 1...$data_skills.size
      @skill_use[id] = 0
      @skill_level[id] = 0
      @skill_power[id] = $data_skills[id].power
      @skill_sp_cost[id] = $data_skills[id].sp_cost
      @skill_hit[id] = $data_skills[id].hit
      @skill_list[id] = make_skill_list(id)
    end
  end

  #--------------------------------------------------------------------------
  # ● 스킬 EXP 계산
  #--------------------------------------------------------------------------
  def make_skill_list(skill_id)
    interval = S_INTER[skill_id]
    if !interval.nil? and !interval[@actor_id].nil?
      up_interval = interval[@actor_id]
    elsif !interval.nil? and !interval[0].nil?
      up_interval = interval[0]
    else
      up_interval = UPDATA_INTERVAL
    end
    # 기울기
    slope = S_SLOPE[skill_id]
    if !slope.nil? and !slope[@actor_id].nil?
      up_slope = slope[@actor_id]
    elsif !slope.nil? and !slope[0].nil?
      up_slope = slope[0]
    else
      up_slope = 1
    end
    limit = S_LEVEL[skill_id]
    # 한계 레벨
    if !limit.nil? and !limit[@actor_id].nil?
      limit_lv = limit[@actor_id]
    elsif !limit.nil? and !limit[0].nil?
      limit_lv = limit[0]
    else
      limit_lv = LEVEL_LIMIT
    end
    list = []
    list[0] = 0
    # 스킬 EXP 리스트 작성
    for lv in 1...limit_lv+1
      exp = 0
      case SKILL_PATTERN
      when 0
        exp = up_interval * lv
      when 1
        exp = list[lv-1] + up_slope * lv + up_interval
      end
      list[lv] = exp.truncate
    end
    return list
  end
end


class Game_Battler
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● 스킬의 효과 적용(약간 강행.)
  #--------------------------------------------------------------------------
  alias skill_effect_update skill_effect
  def skill_effect(user, skill)
    up_flag = false
    if user.is_a?(Game_Actor) and ($scene.is_a?(Scene_Battle) or MENU_COUNT)
      skill_update_main(user, skill)
      skill_base = $data_skills[skill.id].dup
      # 위력 상승
      if SKILL_MIGHT_UP
        skill.power = user.skill_power[skill.id]
      end
      # 명중율 상승
      if SKILL_HIT_UP
        skill.hit = user.skill_hit[skill.id]
      end
      # 속성 변화
      if ELEMENT_CHANGE and S_ELEMENT != []
        ele1 = S_ELEMENT[skill.id]
        if !ele1.nil? and !ele1[user.id].nil?
          ele2 = ele1[user.id]
        elsif !ele1.nil? and !ele1[0].nil?
          ele2 = ele1[0]
        else
          # 설정이 없으면 무시
          ele2 = nil
        end
        if !ele2.nil? and ele2[user.skill_level[skill.id]] != nil
          skill.element_set = ele2[user.skill_level[skill.id]]
        end
      end
      # 스테이트 변화
      if STATE_CHANGE
        if S_STATE_P != []
          pst1 = S_STATE_P[skill.id]
          if !pst1.nil? and !pst1[user.id].nil?
            pst2 = pst1[user.id]
          elsif !pst1.nil? and !pst1[0].nil?
            pst2 = pst1[0]
          else
            # 설정이 없으면 무시
            pst2 = nil
          end
          if pst2 != nil and pst2[user.skill_level[skill.id]] != nil
            skill.plus_state_set = pst2[user.skill_level[skill.id]]
          end
        end
        if S_STATE_N != []
          nst1 = S_STATE_N[skill.id]
          if !nst1.nil? and !nst1[user.id].nil?
            nst2 = nst1[user.id]
          elsif !nst1.nil? and !nst1[0].nil?
            nst2 = nst1[0]
          else
            # 설정이 없으면 무시
            nst2 = nil
          end
          if nst1 != nil and nst2[user.skill_level[skill.id]] != nil
            skill.minus_state_set = nst2[user.skill_level[skill.id]]
          end
        end
      end
      up_flag = true
    end
    ret = skill_effect_update(user, skill)    # 원물
    if up_flag
      $data_skills[skill.id] = skill_base.dup
      # Miss시에는 후 반환
      if self.damage == "Miss"
        skill_use_recount(user, skill)
      end
    end
    return ret
  end
 
  #--------------------------------------------------------------------------
  # ● 스킬 업 카운트
  #--------------------------------------------------------------------------
  def skill_update_main(actor, skill)
    # 스킬 사용 회수의 카운트
    actor.skill_use[skill.id] += 1
    # 리밋트 취득
    limit = S_LEVEL[skill.id]
    if !limit.nil? and !limit[actor.id].nil?
      s_limit = limit[actor.id]
    elsif !limit.nil? and !limit[0].nil?
      s_limit = limit[0]
    else
      s_limit = LEVEL_LIMIT
    end
    # 개서 한계 도달
    if s_limit == false or actor.skill_level[skill.id] < s_limit
      # 레벨업 간격 취득
      interval = actor.skill_list[skill.id]
      # 개서 회수 도달
      if actor.skill_use[skill.id] == interval[actor.skill_level[skill.id]+1]
        # 스킬 레벨 상승
        actor.skill_level[skill.id] += 1
        actor.skill_up = true
        # 위력 상승 = 유효
        if SKILL_MIGHT_UP
          might = S_MIGHT[skill.id]
          if !might.nil? and !might[actor.id].nil?
            might_rate = might[actor.id]
          elsif !might.nil? and !might[0].nil?
            might_rate = might[0]
          else
            might_rate = MIGHT_RATE
          end
          # 보정치 갱신
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
        # SP소비 감소 = 유효
        if SP_COST_DOWN
          cost = S_COST[skill.id]
          if !cost.nil? and !cost[actor.id].nil?
            cost_rate = cost[actor.id]
          elsif !cost.nil? and !cost[0].nil?
            cost_rate = cost[0]
          else
            cost_rate = COST_RATE
          end
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
          # SP소비가 0 이하는 있을 수 없다
          if actor.skill_sp_cost[skill.id] < 0
            actor.skill_sp_cost[skill.id] = 0
          end
        end
        # 명중율 상승 = 유효
        if SKILL_HIT_UP
          hit = S_HIT[skill.id]
          if !hit.nil? and !hit[actor.id].nil?
            hit_rate = hit[actor.id]
          elsif !hit.nil? and !hit[0].nil?
            hit_rate = hit[0]
          else
            hit_rate = HIT_RATE
          end
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
          # 100이상은 있을 수 없다
          if actor.skill_hit[skill.id] > 100
            actor.skill_hit[skill.id] = 100
          end
        end
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # ● 재카운트
  #--------------------------------------------------------------------------
  def skill_use_recount(actor, skill)
    if actor.skill_up
      actor.skill_level[skill.id] -= 1
      # 위력을 재계산
      if SKILL_MIGHT_UP
        actor.skill_power[skill.id] = skill.power
        might = S_MIGHT[skill.id]
        if !might.nil? and !might[actor.id].nil?
          might_rate = might[actor.id]
        elsif !might.nil? and !might[0].nil?
          might_rate = might[0]
        else
          might_rate = MIGHT_RATE
        end
        for i in 1...actor.skill_level[skill.id]
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
      end
      # SP소비 재계산
      if SP_COST_DOWN
        actor.skill_sp_cost[skill.id] = skill.sp_cost
        cost = S_COST[skill.id]
        if !cost.nil? and !cost[actor.id].nil?
          cost_rate = cost[actor.id]
        elsif !cost.nil? and !cost[0].nil?
          cost_rate = cost[0]
        else
          cost_rate = COST_RATE
        end
        for i in 1...actor.skill_level[skill.id]
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
        end
        # SP소비가 0 이하는 있을 수 없다
        if actor.skill_sp_cost[skill.id] < 0
          actor.skill_sp_cost[skill.id] = 0
        end
      end
      # 명중율 재계산
      if SKILL_HIT_UP
        actor.skill_hit[skill.id] = skill.hit
        hit = S_HIT[skill.id]
        if !hit.nil? and !hit[actor.id].nil?
          hit_rate = hit[actor.id]
        elsif !hit.nil? and !hit[0].nil?
          hit_rate = hit[0]
        else
          hit_rate = HIT_RATE
        end
        for i in 1...actor.skill_level[skill.id]
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
        end
        # 100이상은 있을 수 없다
        if actor.skill_hit[skill.id] > 100
          actor.skill_hit[skill.id] = 100
        end
      end
      actor.skill_up = false
    end
    actor.skill_use[skill.id] -= 1
  end
end

#==============================================================================
# 스킬 성장에 의한 애니메이션 변화
#==============================================================================
class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (메인 국면 스텝 4 : 대상측 애니메이션)
  #--------------------------------------------------------------------------
  alias update_phase4_step4_skillup update_phase4_step4
  def update_phase4_step4
    update_phase4_step4_skillup
    if @active_battler.is_a?(Game_Actor) and USE_S_ANIME
      s_anime = S_ANIME[@skill.id]
      if !s_anime.nil? and !s_anime[@active_battler.id].nil?
        s_anime_set = s_anime[@active_battler.id]
      elsif !s_anime.nil? and !s_anime[0].nil?
        s_anime_set = s_anime[0]
      else
        # 설정이 없으면 무시
        return
      end
      for i in 0...s_anime_set.size
        s_anime_def = s_anime_set[i]
        # 규정 레벨 이상이라면 애니메이션 변화
        if @active_battler.skill_level[@skill.id] >= s_anime_def[0]
          # 대상측 애니메이션을 설정
          for target in @target_battlers
            target.animation_id = s_anime_def[1]
          end
        end
      end
    end
  end
end

#==============================================================================
# 이하, 레벨업 표시부분 (레벨업 표시가 필요 없으면 지워도 OK)
#==============================================================================
class Scene_Battle
  include Skill_updata
  if SHOW_SKILL_LV_UP
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (메인 국면 스텝 2 : 액션 개시)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_skillup update_phase4_step2
  def update_phase4_step2
    if @active_battler.is_a?(Game_Actor)
      @active_battler.skill_up = false
    end
    @skillup = false
    update_phase4_step2_skillup   # 원물
  end

  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (메인 국면 스텝 3 : 행동측 애니메이션)
  #--------------------------------------------------------------------------
  alias update_phase4_step3_skillup update_phase4_step3
  def update_phase4_step3
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up != false
      @skillup = true
      @skill_up_window = Window_Skillup.new(@active_battler)
      if SKILLUP_SE != nil
        Audio.se_play("Audio/SE/" + SKILLUP_SE)
        sleep(0.1)
      end
    end
    update_phase4_step3_skillup
  end

  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (메인 국면 스텝 5 : 데미지 표시)
  #--------------------------------------------------------------------------
  alias update_phase4_step5_skillup update_phase4_step5
  def update_phase4_step5
    if @active_battler.is_a?(Game_Actor) and @skillup
      @skill_up_window.dispose
      @active_battler.skill_up = false
      @skillup = false
    end
    update_phase4_step5_skillup     # 원물
  end

  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  alias update_skillup update
  def update
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up and @skillup
      @skill_up_window.contents_opacity -= 4
    end
    update_skillup              # 원물
  end
  end # if SHOW_SKILL_LV_UP
end

class Window_Skillup < Window_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #     actor : 액터
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(actor.screen_x-140, 260, 250, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    self.contents.font.color = Color.new(255, 64, 0)
    self.contents.draw_text(80, 0, 150, 32, "LEVEL UP!")
  end
end

 

#==============================================================================
# 이하, 재정의 부분을 포함한다(SP소비 감소의 기능이 필요 없으면 지워도 OK)
#==============================================================================
class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 항목의 묘화(재정의)
  #     index : 항목 번호
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(skill.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
#-수정-----
    @actor.skill_level[skill.id] = 0 if @actor.skill_level[skill.id] == nil
    name_level = skill.name + "(Lv" + @actor.skill_level[skill.id].to_s + ")"
    self.contents.draw_text(x + 28, y, 204, 32, name_level, 0)
    @actor.skill_sp_cost[skill.id] = skill.sp_cost if @actor.skill_sp_cost[skill.id] == nil
    self.contents.draw_text(x + 232, y, 48, 32, @actor.skill_sp_cost[skill.id].to_s, 2)
#----------
  end
end

class Scene_Skill
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (타겟 윈도우가 액티브의 경우)(재정의)
  #--------------------------------------------------------------------------
  def update_target
    # B 버튼이 밀렸을 경우
    if Input.trigger?(Input::B)
      # 캔슬 SE 를 연주
      $game_system.se_play($data_system.cancel_se)
      # 타겟 윈도우를 소거
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # C 버튼이 밀렸을 경우
    if Input.trigger?(Input::C)
      # SP 조각등에서 사용할 수 없게 되었을 경우
      unless @actor.skill_can_use?(@skill.id)
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 타겟이 전체의 경우
      if @target_window.index == -1
        # 파티 전체에 스킬의 사용 효과를 적용
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # 타겟이 사용자의 경우
      if @target_window.index <= -2
        # 타겟의 액터에게 스킬의 사용 효과를 적용
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # 타겟이 단체의 경우
      if @target_window.index >= 0
        # 타겟의 액터에게 스킬의 사용 효과를 적용
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # 스킬을 사용했을 경우
      if used
        # 스킬의 사용시 SE 를 연주
        $game_system.se_play(@skill.menu_se)
#-----수정------------------------------------------------------
        @actor.skill_sp_cost[@skill.id] = @skill.sp_cost if @actor.skill_sp_cost[@skill.id] == nil
        # SP 소비
        @actor.sp -= @actor.skill_sp_cost[@skill.id]
#---------------------------------------------------------------
        # 각 윈도우의 내용을 재작성
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # 전멸의 경우
        if $game_party.all_dead?
          # 게임 오버 화면으로 전환해
          $scene = Scene_Gameover.new
          return
        end
        # 코먼 이벤트 ID 가 유효의 경우
        if @skill.common_event_id > 0
          # 코먼 이벤트 호출 예약
          $game_temp.common_event_id = @skill.common_event_id
          # 맵 화면으로 전환해
          $scene = Scene_Map.new
          return
        end
      end
      # 스킬을 사용하지 않았던 경우
      unless used
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● 스킬 액션 결과 작성
  #--------------------------------------------------------------------------
  alias make_skill_action_result_skill_update make_skill_action_result
  def make_skill_action_result
    make_skill_action_result_skill_update
    # SP 소비
    if SP_COST_DOWN and @active_battler.is_a?(Game_Actor)
      @active_battler.sp += @skill.sp_cost
      @active_battler.sp -= @active_battler.skill_sp_cost[@skill.id]
    end
  end
end

class Game_Battler
  #--------------------------------------------------------------------------
  # ● 스킬의 사용 가능 판정
  #     skill_id : 스킬 ID
  #--------------------------------------------------------------------------
  alias skill_update_can_use? skill_can_use?
  def skill_can_use?(skill_id)
    ret = skill_update_can_use?(skill_id)
    if !ret and SP_COST_DOWN
      # SP 가 부족한 경우는 사용 불가가 되었어?
      if $data_skills[skill_id].sp_cost > self.sp
        if self.is_a?(Game_Actor)
          skill_sp_cost = self.skill_sp_cost[skill_id]
          if skill_sp_cost < self.sp
            ret = true
          end
        end
      end
    end
    return ret
  end
end

#==============================================================================
# 이벤트 스크립트 조작
#==============================================================================
class Interpreter
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● 스킬 레벨 설정(레벨 세트)
  #     actor_id  :   액터 ID
  #     skill_id  :   스킬 ID
  #     level     :   설정 레벨
  #--------------------------------------------------------------------------
  def set_skill_level(actor_id, skill_id, level)
    actor = $game_actors[actor_id]
    skill = $data_skills[skill_id]
    # 리밋트 취득
    limit = S_LEVEL[skill_id]
    if !limit.nil? and !limit[actor.id].nil?
      s_limit = limit[actor.id]
    elsif !limit.nil? and !limit[0].nil?
      s_limit = limit[0]
    else
      s_limit = LEVEL_LIMIT
    end
    if level > s_limit or level < 0
      return
    end
    # 레벨
    actor.skill_level[skill.id] = level
    # 사용 회수
    use_list = actor.skill_list[skill.id]
    actor.skill_use[skill.id] = use_list[level]
    # 위력을 재계산
    if SKILL_MIGHT_UP
      actor.skill_power[skill.id] = skill.power
      might = S_MIGHT[skill.id]
      if !might.nil? and !might[actor.id].nil?
        might_rate = might[actor.id]
      elsif !might.nil? and !might[0].nil?
        might_rate = might[0]
      else
        might_rate = MIGHT_RATE
      end
      for i in 0...level
        actor.skill_power[skill.id] += skill.power * might_rate / 100
        actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
      end
    end
    # SP소비 재계산
    if SP_COST_DOWN
      actor.skill_sp_cost[skill.id] = skill.sp_cost
      cost = S_COST[skill.id]
      if !cost.nil? and !cost[actor.id].nil?
        cost_rate = cost[actor.id]
      elsif !cost.nil? and !cost[0].nil? and !cost.nil?
        cost_rate = cost[0]
      else
        cost_rate = COST_RATE
      end
      for i in 0...level
        actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
        actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
      end
      # SP소비가 0 이하는 있을 수 없다
      if actor.skill_sp_cost[skill.id] < 0
        actor.skill_sp_cost[skill.id] = 0
      end
    end
    # 명중율 재계산
    if SKILL_HIT_UP
      actor.skill_hit[skill.id] = skill.hit
      hit = S_HIT[skill.id]
      if !hit.nil? and !hit[actor.id].nil?
        hit_rate = hit[actor.id]
      elsif !hit.nil? and !hit[0].nil? and !hit.nil?
        hit_rate = hit[0]
      else
        hit_rate = HIT_RATE
      end
      for i in 0...level
        actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
        actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
      end
      # 100이상은 있을 수 없다
      if actor.skill_hit[skill.id] > 100
        actor.skill_hit[skill.id] = 100
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # ● 스킬 레벨 설정(레벨업)
  #     actor_id  :   액터 ID
  #     skill_id  :   스킬 ID
  #--------------------------------------------------------------------------
  def skill_level_up(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]+1)
  end
 
  #--------------------------------------------------------------------------
  # ● 스킬 레벨 설정(레벨 다운)
  #     actor_id  :   액터 ID
  #     skill_id  :   스킬 ID
  #--------------------------------------------------------------------------
  def skill_level_down(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]-1)
  end
end

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● 스킬 경험치의 표시(사용 회수/NEXT)
  #     actor        : 액터
  #     skill_id     : 스킬 ID
  #     x            : 묘화처 X 좌표
  #     y            : 묘화처 Y 좌표
  #--------------------------------------------------------------------------
  def draw_skill_exp(actor, skill_id, x, y)
    list = actor.skill_list[skill_id]
    limit = Skill_updata::S_LEVEL[skill_id]
    if !limit.nil? and !limit[actor.id].nil?
      skill_limit = limit[actor.id]
    elsif !limit.nil? and !limit[0].nil?
      skill_limit = limit[0]
    else
      skill_limit = Skill_updata::LEVEL_LIMIT
    end
    if actor.skill_level[skill_id] == skill_limit
      next_exp = "-"
    else
      next_exp = list[actor.skill_level[skill_id]+1].to_s
    end
    use = actor.skill_use[skill_id]
    skill_exp = use.to_s + "/" + next_exp
    self.contents.draw_text(x, y, 100, 32, skill_exp)
  end
end

----------------------------절취선----------------------------------

여기까지 복사하고요, 신모루치 제작 - 허졉한 스크립트 참조법!

스크립트 맨 위에서 바로 밑에 보면 이렇게 나와있음.

  #----------------------------------------------------------------------------
  # 기본 설정(여기만 설정하면, 다음은 필요 없을지도 모릅니다)
  #----------------------------------------------------------------------------
  # 위력 상승을 사용한다
  SKILL_MIGHT_UP = true          # 무효화→false
  # SP소비 감소를 사용한다
  SP_COST_DOWN = true            # 무효화→false
  # 명중율 상승을 사용한다
  SKILL_HIT_UP = true            # 무효화→false
  # 속성 변화를 사용한다
  ELEMENT_CHANGE = true          # 무효화→false
  # 스테이트 변화를 사용한다
  STATE_CHANGE = true            # 무효화→false
 
  # Lv업 표시를 한다
  SHOW_SKILL_LV_UP = true        # 무효화→false
  # Lv업시의 SE
  SKILLUP_SE = "056-Right02"     # 필요없으면 nil
  # 메뉴 사용시에도 올라간다(LV업 표시는 없습니다)
  MENU_COUNT = false

  # 스킬 레벨 상승 간격(몇회 사용할 때 마다 Lv 올라갈까)
  UPDATA_INTERVAL = 3            # 1이상
  # 한계 레벨
  LEVEL_LIMIT = 4               # 1이상

  # 위력 상승률(%)
  MIGHT_RATE = 0.5
  # SP소비 감소율(%)
  COST_RATE = 3
  # 명중 상승률(%)
  HIT_RATE = 1
여기서 #이라고 되있는 것은 주석인데, 그것을 참조하며 밑을 수정하면 자신의 게임에 유용히 사용할 수 있습니다^^

그러면 스크립트 능력이 오를지도;;;;

이상 부카제의 허졉한 강좌였습니다.

출처 - 공작소 

댓글 남기고 펐음 악플 삼가
출처-공작소 에서퍼온거

  • profile
    아방스 2008.01.31 17:04
    건의사항 게시판에는 홈페이지에 관련된 건의나 신고를 받는곳입니다. ^^;