<이벤트로 스킬 레벨을 조작하는>
·있는 레벨로 설정한다
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
여기서 #이라고 되있는 것은 주석인데, 그것을 참조하며 밑을 수정하면 자신의 게임에 유용히 사용할 수 있습니다^^
그러면 스크립트 능력이 오를지도;;;;
이상 부카제의 허졉한 강좌였습니다.
출처 - 공작소
댓글 남기고 펐음 악플 삼가
출처-공작소 에서퍼온거