일단 장비 레벨 개념 스크립트라고 이름을 붙이긴 했지만
초보적인 개념이기도 하고 솔직히 스스로의 힘으로 만들려니 부족한 부분이 참 많아서
앞에 초보적이라는 말을 빼버릴 수가 없네요...
뼈대는 시옷전사님의 인챈트스크롤 스크립트에서 가져왔습니다. 일단 기본적으로 경험치는
액터와 동일하게 설정되어 있습니다. 모듈 앞부분의
EXP_BASIS = 40
EXP_INFLATION = 50
부분이 필요 경험치량 계산에 쓰이는 부분입니다. 액터란의 경험치 보정의
기본치와 증가도를 가져온 겁니다 . 기본치는 BASIS, 증가도는 INFLATION
경험치를 습득하기 위해서는 장비의 메모란에 <equiplevel>를 기입해야 합니다. 기입된 장비들은
장비란이나 아이템란에서 레벨이 표시됩니다. 안타깝지만 능력부족으로 경험치 부분은 묘화를 못했습니다.
그러면 메모란에 기입만 하면 되냐... 라고 하면 대답은 아닙니다...
스크립트 앞부분에서 아이템마다 제한 레벨을 설정해주어야 하며 또한 능력 개방 레벨도 지정해줘야 합니다.
무슨 뜻이냐면 무기라면 선제공격, 연속공격, 양손무기, 잦은 크리티컬 부분을 일컬음이고 방어구라면
크리티컬 방지, 소비마력절반, 획득 경험치 두배, 자동체력회복 옵션을 말하는 겁니다.
지정한 레벨이 되면 옵션이 개방 ( on, 스크립트로 말하면 true) 되지만 양손무기는 체크된 무기에 한해서
지정한 레벨이 되면 한손무기가 됩니다 ... 사실 양손무기라는게 페널티에 가까운 옵션이니까요.. (방패를 쓸수 없다
던가... 이도류에서 한손을 못쓴다던가...)
능력 상승부분은 명중률이나 회피율은 레벨당 +1입니다. 이 부분은 함수 부분에서 따로 정의할 수 있습니다. 장비
레벨 제한이 높다면 ( 예를 들어 99쯤 된다던가 하면) 이부분은 필히 수정해야겠죠... 잘못하면 명중률은 그렇다쳐도
회피율 400정도 되는 캐릭도 나올 것 같네요 @ㅅ@;;;
다른 부분은 기본 능력치의 10분의 1만큼 가산됩니다. 공격력이 10인 무기라면 레벨 1이 되면 공격력이 11, 레벨2
가 되면 공격력은 12가 되겠죠.
주의 사항은 첫째, 제 능력부족으로 장비 경험치 묘화가 안됩니다.. 레벨업을 할지 안할지는 저도 잘 모릅니다... 게다가
한번에 많은 렙업이 되는 걸 방지하기 위해서 한번에 999999999경험치를 먹어도 1업만 하도록 설정해두었습니다.
둘째, 장비의 속성과 상태부분또한 제 능력부족으로 설정하지 못했습니다. 이래저래 만져봤는데 속성유효도를 E로 지정해둔
몹이 데미지가 팍팍 들어가더라구요 ( 원래는 속성유효도를 E로 지정하면 0%, 즉 데미지를 입으면 안됩니다;;;;)
셋째, 이 스크립트는 앞에서도 말했던 것처럼 시옷전사님의 인챈트 스크롤 스크립트에 뼈대를 두고 있습니다... 따라서
인챈트 스크롤 스크립트와 양립이 안됩니다... 같은 함수를 재정의하고 있어서 양립되게 하려면 좀 만져줘야 합니다.
그냥 한번 살펴보시고 뜯어보시는 용도로 쓰시는 게 적당할 것 같네요
아래는 스크립트 원본, 예제를 미디어파이어로 첨부하겠습니다 .
P.S 미디어파이어로 예제를 첨부하려했는데 오늘따라 미디어파이어가 말썽이네요... 필요하신분은 쪽지 주시면
메일로 보내드릴게요...
-----------------------------------------------------------------------------------------------------------------------------------------------
음... 약간 수정했습니다. 일단 기본적으로는 경험치 쌓는 게 불가능하고요 앞부분에서 지정된 스크롤로
각성 시켜야 경험치를 얻을 수 있습니다. 그 다음에는 약간 버그 수정 정도네요.
아래는 스크립트 원본, 그 밑에는 이 스크립트가 스킬 필요조건이랑 호환이 잘 안되서 약간 수정해서 호환되게
만든 스킬 필요조건 스크립트 입니다.
-------------------------------------------------------------------------------------------------------------------------------------------
#==============================================================================
# ■ IMIR_EquipLevel
#------------------------------------------------------------------------------
# 장비에 레벨 개념을 부여하는 스크립트 입니다. 아래 모듈에서 세세하게 설정할 수 있으나
# 각성 스크롤로 각성시킨 장비에 한해서 경험치 습득이 가능합니다.
# 각성 요건은 장비의 한계 레벨이 0 초과일 것. 입니다.
# 기본적으로 경험치는 액터와 동일하게 습득하며 장비 레벨업시 기존의 10분의 1만큼
# 능력이 상승합니다( 공, 방, 정, 민, 가격 )
# 명중률과 회피율, 무기자체 크리티컬은 장비레벨의 10분의 1만큼 상승합니다.
# 속성과 상태에 대해서는 아직 미흡하여 차후 추가하도록 하겠습니다
# ( 가능하다면 ㅎㅅㅎ;)
# 시옷전사님의 인챈트스크롤 스크립트를 참조하였으며 인챈트스크롤 스크립트와는
# 양립이 불가능합니다 ( 같은 함수를 재정의하기 때문에...)
#==============================================================================
module IMIR
module EquipLevel
#--------------------------------------------------------------------------
# ● 장비 경험치 기본값 설정.
#--------------------------------------------------------------------------
EXP_BASIS = 40
EXP_INFLATION = 50
#--------------------------------------------------------------------------
# ● 무기 각성 주문서 일람.
#--------------------------------------------------------------------------
SCROLL_FOR_WEAPON = [1]
#--------------------------------------------------------------------------
# ● 방어구 각성 주문서 일람. 부위별로 하나씩 필요.
#--------------------------------------------------------------------------
SCROLL_FOR_ARMOR = [32, 33, 34, 35]
#--------------------------------------------------------------------------
# ● 무기 별 한계 레벨 설정
# ex. when 1 then return 1, when (무기 번호) then return (한계 레벨)
#--------------------------------------------------------------------------
def self.weapon_possible_level(weapon_id)
case weapon_id
when 14 then return 99
when 31 then return 1
else
return 0
end
end
#--------------------------------------------------------------------------
# ● 무기 별 양손사용 해제 레벨 설정
# ex. when 1 then return 1, when (무기 번호) then return (양손사용 해제 레벨)
#--------------------------------------------------------------------------
def self.one_hand_level(weapon_id)
case weapon_id
when 31 then return 1
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 무기 별 선제공격 개방 레벨 설정
# ex. when 1 then return 1, when (무기 번호) then return (선제공격 개방 레벨)
#--------------------------------------------------------------------------
def self.fast_attack_level(weapon_id)
case weapon_id
when 14 then return 4
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 무기 별 연속공격 개방 레벨 설정
# ex. when 1 then return 1, when (무기 번호) then return (연속공격 개방 레벨)
#--------------------------------------------------------------------------
def self.dual_attack_level(weapon_id)
case weapon_id
when 14 then return 5
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 무기 별 잦은치명타 개방 레벨 설정
# ex. when 1 then return 1, when (무기 번호) then return (잦은치명타 개방 레벨)
#--------------------------------------------------------------------------
def self.cri_bonus_level(weapon_id)
case weapon_id
when 14 then return 2
when 2 then return 3
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 방어구 별 한계 레벨 설정
# ex. when 1 then return 1, when (방어구 번호) then return (한계 레벨)
#--------------------------------------------------------------------------
def self.armor_possible_level(armor_id)
case armor_id
when 1 then return 2
when 2 then return 13
when 7 then return 3
when 13 then return 4
else
return 0
end
end
#--------------------------------------------------------------------------
# ● 방어구 별 치명타무효 개방 레벨 설정
# ex. when 1 then return 1, when (방어구 번호) then return (치명타무효 개방 레벨)
#--------------------------------------------------------------------------
def self.prevent_cri_level(armor_id)
case armor_id
when 1 then return 2
when 2 then return 2
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 방어구 별 소모마력감소 개방 레벨 설정
# ex. when 1 then return 1, when (방어구 번호) then return (소모마력감소 개방 레벨)
#--------------------------------------------------------------------------
def self.half_mp_level(armor_id)
case armor_id
when 1 then return 2
when 2 then return 2
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 방어구 별 추가경험습득 개방 레벨 설정
# ex. when 1 then return 1, when (방어구 번호) then return (추가경험습득 개방 레벨)
#--------------------------------------------------------------------------
def self.double_exp_level(armor_id)
case armor_id
when 7 then return 2
when 13 then return 2
else
return 99
end
end
#--------------------------------------------------------------------------
# ● 방어구 별 자동체력회복 개방 레벨 설정
# ex. when 1 then return 1, when (방어구 번호) then return (자동체력회복 개방 레벨)
#--------------------------------------------------------------------------
def self.auto_hp_level(armor_id)
case armor_id
when 7 then return 2
when 13 then return 2
else
return 99
end
end
end
end
#==============================================================================
# ■ RPG::Weapon
#------------------------------------------------------------------------------
# 무기를 위한 자료구조를 포함한 모듈입니다.
#==============================================================================
module RPG
class Weapon < BaseItem
attr_accessor :open_flag # 각성플래그
attr_accessor :w_cri #무기 크리티컬
#--------------------------------------------------------------------------
# ● 무기의 각성플래그 취득
#--------------------------------------------------------------------------
def open_flag
@open_flag = false if @open_flag == nil
return @open_flag
end
#--------------------------------------------------------------------------
# ● 무기의 가격 취득
#--------------------------------------------------------------------------
def price
@bonus_price = 0 if @bonus_price == nil
return @price + @bonus_price
end
#--------------------------------------------------------------------------
# ● 무기의 명중률 취득
#--------------------------------------------------------------------------
def hit
@bonus_hit = 0 if @bonus_hit == nil
return @hit + @bonus_hit
end
#--------------------------------------------------------------------------
# ● 무기의 공격력 취득
#--------------------------------------------------------------------------
def atk
@bonus_atk = 0 if @bonus_atk == nil
return @atk + @bonus_atk
end
#--------------------------------------------------------------------------
# ● 무기의 방어력 취득
#--------------------------------------------------------------------------
def def
@bonus_def = 0 if @bonus_def == nil
return @def + @bonus_def
end
#--------------------------------------------------------------------------
# ● 무기의 정신력 취득
#--------------------------------------------------------------------------
def spi
@bonus_spi = 0 if @bonus_spi == nil
return @spi + @bonus_spi
end
#--------------------------------------------------------------------------
# ● 무기의 민첩성 취득
#--------------------------------------------------------------------------
def agi
@bonus_agi = 0 if @bonus_agi == nil
return @agi + @bonus_agi
end
#--------------------------------------------------------------------------
# ● 무기 자체의 크리티컬 취득
#--------------------------------------------------------------------------
def w_cri
@w_cri = 0 if @w_cri == nil
return @w_cri
end
#--------------------------------------------------------------------------
# ● 무기의 양손 무기 판정 취득
#--------------------------------------------------------------------------
def two_handed
@bonus_two_handed = true if @bonus_two_handed == nil
if @bonus_two_handed
return @two_handed
else
return @bonus_two_handed
end
end
#--------------------------------------------------------------------------
# ● 무기의 선제 공격 판정 취득
#--------------------------------------------------------------------------
def fast_attack
@bonus_fast_attack = false if @bonus_fast_attack == nil
return @fast_attack || @bonus_fast_attack
end
#--------------------------------------------------------------------------
# ● 무기의 연속 공격 판정 취득
#--------------------------------------------------------------------------
def dual_attack
@bonus_dual_attack = false if @bonus_dual_attack == nil
return @dual_attack || @bonus_dual_attack
end
#--------------------------------------------------------------------------
# ● 무기의 잦은 치명타 판정 취득
#--------------------------------------------------------------------------
def critical_bonus
@bonus_critical_bonus = false if @bonus_critical_bonus == nil
return @critical_bonus || @bonus_critical_bonus
end
#--------------------------------------------------------------------------
# ● 무기인가 아닌가의 판정
#--------------------------------------------------------------------------
def weapon?
return true
end
#--------------------------------------------------------------------------
# ● 방어구인가 아닌가의 판정
#--------------------------------------------------------------------------
def armor?
return false
end
#--------------------------------------------------------------------------
# ● 주문서인가 아닌가의 판정
#--------------------------------------------------------------------------
def scroll?
return IMIR::EquipLevel::SCROLL_FOR_WEAPON.include?(@id)
end
#--------------------------------------------------------------------------
# ● 아군 효과 범위인가 아닌가의 판정
#--------------------------------------------------------------------------
def for_friend?
return true
end
#--------------------------------------------------------------------------
# ● 아군 전체 효과 범위인가 아닌가의 판정
#--------------------------------------------------------------------------
def for_all?
return false
end
#--------------------------------------------------------------------------
# ● 무기의 레벨 취득
#--------------------------------------------------------------------------
def item_level
@item_level = 0 if @item_level == nil
return @item_level
end
#--------------------------------------------------------------------------
# ● 무기의 경험치 취득
#--------------------------------------------------------------------------
def item_exp
@item_exp = 0 if @item_exp == nil
return @item_exp
end
#--------------------------------------------------------------------------
# ● 경험치 계산
#--------------------------------------------------------------------------
def make_item_exp_list
@item_exp_list = Array.new(101) if @item_exp_list == nil
@item_exp_list[1] = 100
@item_exp_list[100] = 0
m = IMIR::EquipLevel::EXP_BASIS
n = 0.75 + IMIR::EquipLevel::EXP_INFLATION / 200.0;
for i in 2..99
@item_exp_list[i] = @item_exp_list[i-1] + Integer(m)
m *= 1 + n;
n *= 0.9;
end
end
#--------------------------------------------------------------------------
# ● 경험치의 변경
# exp : 새로운 경험치
# show : 레벨업 표시 플래그
#--------------------------------------------------------------------------
def change_item_exp(exp, show)
@item_level = 0 if @item_level == nil
make_item_exp_list if @item_exp_list == nil
last_level = @item_level
@item_exp = [[exp, 9999999].min, 0].max
if @item_exp >= @item_exp_list[@item_level+1] and @item_exp_list[@item_level+1] > 0
item_level_up
end
if show and @item_level > last_level
display_item_level_up
end
end
#--------------------------------------------------------------------------
# ● 레벨업
#--------------------------------------------------------------------------
def item_level_up
@bonus_price = 0 if @bonus_price == nil
@bonus_hit = 0 if @bonus_hit == nil
@bonus_atk = 0 if @bonus_atk == nil
@bonus_def = 0 if @bonus_def == nil
@bonus_spi = 0 if @bonus_spi == nil
@bonus_agi = 0 if @bonus_agi == nil
@bonus_two_handed = true if @bonus_two_handed == nil
@bonus_fast_attack = false if @bonus_fast_attack == nil
@bonus_dual_attack = false if @bonus_dual_attack == nil
@bonus_critical_bonus = false if @bonus_critical_bonus == nil
@bonus_element_set = [] if @bonus_element_set == nil
@bonus_state_set = [] if @bonus_state_set == nil
@w_cri = 0 if @w_cri == nil
@item_level = 0 if @item_level == nil
unless @item_level >= IMIR::EquipLevel.weapon_possible_level(@id)
@item_level += 1
@item_exp = @item_exp_list[@item_level]
@bonus_price += $data_weapons[@id].price / 10
@w_cri += @item_level / 10
@bonus_hit += @item_level / 10
@bonus_atk += $data_weapons[@id].atk / 10
@bonus_def += $data_weapons[@id].def / 10
@bonus_spi += $data_weapons[@id].spi / 10
@bonus_agi += $data_weapons[@id].agi / 10
@bonus_two_handed = false if @item_level >= IMIR::EquipLevel.one_hand_level(@id)
@bonus_fast_attack = true if @item_level >= IMIR::EquipLevel.fast_attack_level(@id)
@bonus_dual_attack = true if @item_level >= IMIR::EquipLevel.dual_attack_level(@id)
@bonus_critical_bonus = true if @item_level >= IMIR::EquipLevel.cri_bonus_level(@id)
else
@item_exp = @item_exp_list[IMIR::EquipLevel.weapon_possible_level(@id)]
end
end
#--------------------------------------------------------------------------
# ● 레벨업 메세지의 표시
# new_skills : 새롭게 습득한 스킬의 배열
#--------------------------------------------------------------------------
def display_item_level_up
$game_message.new_page
text = sprintf("%s의 %s이 %s로 올랐다!", @name, Vocab::level, @item_level)
$game_message.texts.push(text)
if @item_level / 10 > (@item_level - 1) / 10
text = sprintf("%s의 명중률이 %s 올랐다!", @name, 1)
$game_message.texts.push(text)
end
if @item_level / 10 > (@item_level - 1) / 10
text = sprintf("%s의 크리티컬이 %s 올랐다!", @name, 1)
$game_message.texts.push(text)
end
if $data_weapons[@id].atk / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::atk, $data_weapons[@id].atk / 10)
$game_message.texts.push(text)
end
if $data_weapons[@id].def / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::def, $data_weapons[@id].def / 10)
$game_message.texts.push(text)
end
if $data_weapons[@id].spi / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::spi, $data_weapons[@id].spi / 10)
$game_message.texts.push(text)
end
if $data_weapons[@id].agi / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::agi, $data_weapons[@id].agi / 10)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.one_hand_level(@id)
text= sprintf("%s는 한손 사용이 가능해졌다!", @name)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.fast_attack_level(@id)
text= sprintf("%s는 선제 공격이 가능해졌다!", @name)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.dual_attack_level(@id)
text= sprintf("%s는 연속 공격이 가능해졌다!", @name)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.cri_bonus_level(@id)
text= sprintf("%s의 크리티컬률이 올라갔다!", @name)
$game_message.texts.push(text)
end
end
#--------------------------------------------------------------------------
# ● 경험치의 획득
# exp : 경험치의 증가량
# show : 레벨업 표시 플래그
#--------------------------------------------------------------------------
def gain_item_exp(exp, show)
if @open_flag
@item_exp = 0 if @item_exp == nil
change_item_exp(@item_exp + exp, show)
end
end
#--------------------------------------------------------------------------
# ● 무기의 각성
#--------------------------------------------------------------------------
def enchant(weapon)
@open_flag = true if IMIR::EquipLevel.weapon_possible_level(weapon.id) > 0
end
end
end
#==============================================================================
# ■ RPG::Armor
#------------------------------------------------------------------------------
# 방어구를 위한 자료구조를 포함한 모듈입니다.
#==============================================================================
module RPG
class Armor < BaseItem
attr_accessor :open_flag # 각성플래그
#--------------------------------------------------------------------------
# ● 방어구의 각성플래그 취득
#--------------------------------------------------------------------------
def open_flag
@open_flag = false if @open_flag == nil
return @open_flag
end
#--------------------------------------------------------------------------
# ● 방어구의 가격 취득
#--------------------------------------------------------------------------
def price
@bonus_price = 0 if @bonus_price == nil
return @price + @bonus_price
end
#--------------------------------------------------------------------------
# ● 방어구의 회피율 취득
#--------------------------------------------------------------------------
def eva
@bonus_eva = 0 if @bonus_eva == nil
return @eva + @bonus_eva
end
#--------------------------------------------------------------------------
# ● 방어구의 공격력 취득
#--------------------------------------------------------------------------
def atk
@bonus_atk = 0 if @bonus_atk == nil
return @atk + @bonus_atk
end
#--------------------------------------------------------------------------
# ● 방어구의 방어력 취득
#--------------------------------------------------------------------------
def def
@bonus_def = 0 if @bonus_def == nil
return @def + @bonus_def
end
#--------------------------------------------------------------------------
# ● 방어구의 정신력 취득
#--------------------------------------------------------------------------
def spi
@bonus_spi = 0 if @bonus_spi == nil
return @spi + @bonus_spi
end
#--------------------------------------------------------------------------
# ● 방어구의 민첩성 취득
#--------------------------------------------------------------------------
def agi
@bonus_agi = 0 if @bonus_agi == nil
return @agi + @bonus_agi
end
#--------------------------------------------------------------------------
# ● 방어구의 치명타 방지 판정 취득
#--------------------------------------------------------------------------
def prevent_critical
@bonus_prevent_critical = false if @bonus_prevent_critical == nil
return @prevent_critical || @bonus_prevent_critical
end
#--------------------------------------------------------------------------
# ● 방어구의 소비 MP 절반 판정 취득
#--------------------------------------------------------------------------
def half_mp_cost
@bonus_half_mp_cost = false if @bonus_half_mp_cost == nil
return @half_mp_cost || @bonus_half_mp_cost
end
#--------------------------------------------------------------------------
# ● 방어구의 획득 경험치 2배 판정 취득
#--------------------------------------------------------------------------
def double_exp_gain
@bonus_double_exp_gain = false if @bonus_double_exp_gain == nil
return @double_exp_gain || @bonus_double_exp_gain
end
#--------------------------------------------------------------------------
# ● 방어구의 HP 자동 회복 판정 취득
#--------------------------------------------------------------------------
def auto_hp_recover
@bonus_auto_hp_recover = false if @bonus_auto_hp_recover == nil
return @auto_hp_recover || @bonus_auto_hp_recover
end
#--------------------------------------------------------------------------
# ● 방어구의 레벨 취득
#--------------------------------------------------------------------------
def item_level
@item_level = 0 if @item_level == nil
return @item_level
end
#--------------------------------------------------------------------------
# ● 방어구의 경험치 취득
#--------------------------------------------------------------------------
def item_exp
@item_exp = 0 if @item_exp == nil
return @item_exp
end
#--------------------------------------------------------------------------
# ● 경험치 계산
#--------------------------------------------------------------------------
def make_item_exp_list
@item_exp_list = Array.new(101) if @item_exp_list == nil
@item_exp_list[1] = 100
@item_exp_list[100] = 0
m = IMIR::EquipLevel::EXP_BASIS
n = 0.75 + IMIR::EquipLevel::EXP_INFLATION / 200.0;
for i in 2..99
@item_exp_list[i] = @item_exp_list[i-1] + Integer(m)
m *= 1 + n;
n *= 0.9;
end
end
#--------------------------------------------------------------------------
# ● 경험치의 변경
# item_exp : 새로운 경험치
# show : 레벨업 표시 플래그
#--------------------------------------------------------------------------
def change_item_exp(exp, show)
@item_level = 0 if @item_level == nil
make_item_exp_list if @item_exp_list == nil
last_level = @item_level
@item_exp = [[exp, 9999999].min, 0].max
if @item_exp >= @item_exp_list[@item_level+1] and @item_exp_list[@item_level+1] > 0
item_level_up
@item_exp = @item_exp_list[@item_level]
end
if show and @item_level > last_level
display_item_level_up
end
end
#--------------------------------------------------------------------------
# ● 레벨업
#--------------------------------------------------------------------------
def item_level_up
@bonus_price = 0 if @bonus_price == nil
@bonus_eva = 0 if @bonus_eva == nil
@bonus_atk = 0 if @bonus_atk == nil
@bonus_def = 0 if @bonus_def == nil
@bonus_spi = 0 if @bonus_spi == nil
@bonus_agi = 0 if @bonus_agi == nil
@bonus_prevent_critical = false if @bonus_prevent_critical == nil
@bonus_half_mp_cost = false if @bonus_half_mp_cost == nil
@bonus_double_exp_gain = false if @bonus_double_exp_gain == nil
@bonus_auto_hp_recover = false if @bonus_auto_hp_recover == nil
@bonus_element_set = [] if @bonus_element_set == nil
@bonus_state_set = [] if @bonus_state_set == nil
@item_level = 0 if @item_level == nil
unless @item_level >= IMIR::EquipLevel.armor_possible_level(@id)
@item_level += 1
@item_exp = @item_exp_list[@item_level]
@bonus_price += $data_armors[@id].price / 10
@bonus_eva += @item_level / 10
@bonus_atk += $data_armors[@id].atk / 10
@bonus_def += $data_armors[@id].def / 10
@bonus_spi += $data_armors[@id].spi / 10
@bonus_agi += $data_armors[@id].agi / 10
@bonus_prevent_critical = true if @item_level >= IMIR::EquipLevel.prevent_cri_level(@id)
@bonus_half_mp_cost = true if @item_level >= IMIR::EquipLevel.half_mp_level(@id)
@bonus_double_exp_gain = true if @item_level >= IMIR::EquipLevel.double_exp_level(@id)
@bonus_auto_hp_recover = true if @item_level >= IMIR::EquipLevel.auto_hp_level(@id)
else
@item_exp = @item_exp_list[IMIR::EquipLevel.armor_possible_level(@id)]
end
end
#--------------------------------------------------------------------------
# ● 레벨업 메세지의 표시
# new_skills : 새롭게 습득한 스킬의 배열
#--------------------------------------------------------------------------
def display_item_level_up
$game_message.new_page
text = sprintf("%s의 %s이 %s로 올랐다!", @name, Vocab::level, @item_level)
$game_message.texts.push(text)
if $data_armors[@id].atk / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::atk, $data_armors[@id].atk / 10)
$game_message.texts.push(text)
end
if $data_armors[@id].def / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::def, $data_armors[@id].def / 10)
$game_message.texts.push(text)
end
if $data_armors[@id].spi / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::spi, $data_armors[@id].spi / 10)
$game_message.texts.push(text)
end
if $data_armors[@id].agi / 10 > 0
text = sprintf("%s의 %s이 %s 올랐다!", @name, Vocab::agi, $data_armors[@id].agi / 10)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.prevent_cri_level(@id)
text= sprintf("%s는 치명타 방어능력이 개방되었다!", @name)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.half_mp_level(@id)
text= sprintf("%s는 소모마력 감소능력이 개방되었다!", @name)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.double_exp_level(@id)
text= sprintf("%s는 추가경험 습득능력이 개방되었다!", @name)
$game_message.texts.push(text)
end
if @item_level == IMIR::EquipLevel.auto_hp_level(@id)
text= sprintf("%s의 자동 체력회복능력이 개방되었다!", @name)
$game_message.texts.push(text)
end
end
#--------------------------------------------------------------------------
# ● 경험치의 획득
# exp : 경험치의 증가량
# show : 레벨업 표시 플래그
#--------------------------------------------------------------------------
def gain_item_exp(exp, show)
if @open_flag
@item_exp = 0 if @item_exp == nil
change_item_exp(@item_exp + exp, show)
end
end
#--------------------------------------------------------------------------
# ● 방어구의 각성
#--------------------------------------------------------------------------
def enchant(weapon)
@open_flag = true if IMIR::EquipLevel.armor_possible_level(weapon.id) > 0
end
#--------------------------------------------------------------------------
# ● 무기인가 아닌가의 판정
#--------------------------------------------------------------------------
def weapon?
return false
end
#--------------------------------------------------------------------------
# ● 방어구인가 아닌가의 판정
#--------------------------------------------------------------------------
def armor?
return true
end
#--------------------------------------------------------------------------
# ● 주문서인가 아닌가의 판정
#--------------------------------------------------------------------------
def scroll?
return IMIR::EquipLevel::SCROLL_FOR_ARMOR.include?(@id)
end
#--------------------------------------------------------------------------
# ● 아군 효과 범위인가 아닌가의 판정
#--------------------------------------------------------------------------
def for_friend?
return true
end
#--------------------------------------------------------------------------
# ● 아군 전체 효과 범위인가 아닌가의 판정
#--------------------------------------------------------------------------
def for_all?
return false
end
end
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# 액터를 취급하는 클래스입니다.이 클래스는 Game_Actors 클래스 ($game_actors)
# 의 내부에서 사용되어 Game_Party 클래스 ($game_party)로부터도 참조됩니다.
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_reader :weapon
attr_reader :armor1
attr_reader :armor2
attr_reader :armor3
attr_reader :armor4
#--------------------------------------------------------------------------
# ● 셋업
# actor_id : 액터 ID
#--------------------------------------------------------------------------
alias :sw_es_game_actor_setup :setup
def setup(actor_id)
sw_es_game_actor_setup(actor_id)
@weapon = $data_weapons[@weapon_id].clone if @weapon_id > 0
if @armor1_id > 0
@armor1 = (two_swords_style ? $data_weapons[@weapon_id].clone : $data_armors[@armor1_id].clone)
end
@armor2 = $data_armors[@armor2_id].clone if @armor2_id > 0
@armor3 = $data_armors[@armor3_id].clone if @armor3_id > 0
@armor4 = $data_armors[@armor4_id].clone if @armor4_id > 0
end
#--------------------------------------------------------------------------
# ● 무기 오브젝트의 배열 취득
#--------------------------------------------------------------------------
def weapons
result = []
result.push(@weapon)
if two_swords_style
result.push(@armor1)
end
return result
end
#--------------------------------------------------------------------------
# ● 방어구 오브젝트의 배열 취득
#--------------------------------------------------------------------------
def armors
result = []
unless two_swords_style
result.push(@armor1)
end
result.push(@armor2)
result.push(@armor3)
result.push(@armor4)
return result
end
#--------------------------------------------------------------------------
# ● 장비의 변경 (ID 로 지정)
# equip_type : 장비 부위 (0..4)
# item_id : 무기 ID or 방어구 ID
# test : 테스트 플래그 (전투 테스트, 또는 장비 화면에서의 일시 장비)
# 이벤트 커멘드, 및 전투 테스트의 준비로 사용한다.
#--------------------------------------------------------------------------
def change_equip_by_id(equip_type, item_id, test = false)
if equip_type == 0 or (equip_type == 1 and two_swords_style)
change_equip(equip_type, $data_weapons[item_id].clone, test)
else
change_equip(equip_type, $data_armors[item_id].clone, test)
end
end
#--------------------------------------------------------------------------
# ● 장비의 변경 (오브젝트로 지정)
# equip_type : 장비 부위 (0..4)
# item : 무기 or 방어구 (nil 라면 장비 해제)
# test : 테스트 플래그 (전투 테스트, 또는 장비 화면에서의 일시 장비)
#--------------------------------------------------------------------------
def change_equip(equip_type, item, test = false)
last_item = equips[equip_type]
unless test
return if $game_party.item_number(item) == 0 if item != nil
$game_party.gain_item(last_item, 1)
if item != nil
if item.weapon?
$game_party.weapons.delete(item)
elsif item.armor?
$game_party.armors.delete(item)
end
end
end
case equip_type
when 0 # 무기
@weapon = item
unless two_hands_legal? # 양손 소유 위반의 경우
change_equip(1, nil, test) # 반대의 손의 장비를 제외한다
end
when 1 # 방패
@armor1 = item
unless two_hands_legal? # 양손 소유 위반의 경우
change_equip(0, nil, test) # 반대의 손의 장비를 제외한다
end
when 2 # 마리
@armor2 = item
when 3 # 신체
@armor3 = item
when 4 # 장식품
@armor4 = item
end
end
#--------------------------------------------------------------------------
# ● 양손 장비 합법 판정
#--------------------------------------------------------------------------
def two_hands_legal?
if weapons[0] != nil and weapons[0].two_handed
return false if @armor1 != nil
end
if weapons[1] != nil and weapons[1].two_handed
return false if @weapon != nil
end
return true
end
#--------------------------------------------------------------------------
# ● 장비 가능 판정
# item : 아이템
#--------------------------------------------------------------------------
alias :sw_es_actor_equippable? :equippable?
def equippable?(item)
if item.is_a?(RPG::Weapon)
return false if !(item.weapon?)
elsif item.is_a?(RPG::Armor)
return false if !(item.armor?)
end
sw_es_actor_equippable?(item)
end
#--------------------------------------------------------------------------
# ● 강화 가능 판정
#--------------------------------------------------------------------------
def enchant_legal?(item)
if item.is_a?(RPG::Weapon)
return false if @weapon == nil or @weapon.open_flag
return false if IMIR::EquipLevel.weapon_possible_level(@weapon.id) == 0
elsif item.is_a?(RPG::Armor)
if item.kind == 0
return false if @armor1 == nil or two_swords_style or @armor1.open_flag
return false if IMIR::EquipLevel.armor_possible_level(@armor1.id) == 0
elsif item.kind == 1
return false if @armor2 == nil or @armor2.open_flag
return false if IMIR::EquipLevel.armor_possible_level(@armor2.id) == 0
elsif item.kind == 2
return false if @armor3 == nil or @armor3.open_flag
return false if IMIR::EquipLevel.armor_possible_level(@armor3.id) == 0
elsif item.kind == 3
return false if @armor4 == nil or @armor4.open_flag
return false if IMIR::EquipLevel.armor_possible_level(@armor4.id) == 0
end
end
return true
end
#--------------------------------------------------------------------------
# ● 장비 강화
#--------------------------------------------------------------------------
def enchant_equip(item)
if item.is_a?(RPG::Weapon)
@weapon.enchant(@weapon)
elsif item.is_a?(RPG::Armor)
if item.kind == 0
@armor1.enchant(@armor1)
elsif item.kind == 1
@armor2.enchant(@armor2)
elsif item.kind == 2
@armor3.enchant(@armor3)
elsif item.kind == 3
@armor4.enchant(@armor4)
end
end
end
#--------------------------------------------------------------------------
# ● 경험치의 획득 (경험치 2 배의 옵션을 고려)
# exp : 경험치의 증가량
# show : 레벨업 표시 플래그
#--------------------------------------------------------------------------
def gain_exp(exp, show)
if double_exp_gain
change_exp(@exp + exp * 2, show)
else
change_exp(@exp + exp, show)
end
for equip in equips
next if equip == nil
equip.gain_item_exp(exp, true) if equip.is_a?(RPG::Weapon)
equip.gain_item_exp(exp, true) if equip.is_a?(RPG::Armor)
end
end
#~ #--------------------------------------------------------------------------
#~ # ● 크리티컬 확률의 취득
#~ #--------------------------------------------------------------------------
#~ def cri
#~ n = 4
#~ n += 4 if actor.critical_bonus
#~ for weapon in weapons.compact
#~ n += 4 if weapon.critical_bonus
#~ n += weapon.w_cri
#~ end
#~ return n
#~ end
end
#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
# 파티를 취급하는 클래스입니다.골드나 아이템등의 정보가 포함됩니다.이 쿠
# 라스의 인스턴스는 $game_party 로 참조됩니다.
#==============================================================================
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :weapons
attr_accessor :armors
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias :im_game_party_initialize :initialize
def initialize
im_game_party_initialize
@weapon_scrolls = {}
@armor_scrolls = {}
@weapons = []
@armors = []
end
#--------------------------------------------------------------------------
# ● 아이템 오브젝트의 배열 취득 (무기와 방어구를 포함한다)
#--------------------------------------------------------------------------
def items
result = []
for i in @items.keys.sort
result.push($data_items[i]) if @items[i] > 0
end
for i in @weapon_scrolls.keys.sort
result.push($data_weapons[i]) if @weapon_scrolls[i] > 0
end
for i in @armor_scrolls.keys.sort
result.push($data_armors[i]) if @armor_scrolls[i] > 0
end
for weapon in @weapons
result.push(weapon)
end
for armor in @armors
result.push(armor)
end
return result
end
#--------------------------------------------------------------------------
# ● 아이템의 소지수취득
# item : 아이템
#--------------------------------------------------------------------------
def item_number(item)
case item
when RPG::Item
number = @items[item.id]
when RPG::Weapon
if item.scroll?
number = @weapon_scrolls[item.id]
else
number = 1
end
when RPG::Armor
if item.scroll?
number = @armor_scrolls[item.id]
else
number = 1
end
end
return number == nil ? 0 : number
end
#--------------------------------------------------------------------------
# ● 아이템의 소지 판정
# item : 아이템
# include_equip : 장비품도 포함한다
#--------------------------------------------------------------------------
def has_item?(item, include_equip = false)
if item_number(item) > 0
return true
end
return false
end
#--------------------------------------------------------------------------
# ● 아이템의 증가 (감소)
# item : 아이템
# n : 개수
# include_equip : 장비품도 포함한다
#--------------------------------------------------------------------------
def gain_item(item, n, include_equip = false)
number = item_number(item)
case item
when RPG::Item
@items[item.id] = [[number + n, 0].max, 99].min
when RPG::Weapon
if item.scroll?
@weapon_scrolls[item.id] = [[number + n, 0].max, 99].min
else
if n > 0
@weapons.push(item)
elsif n < 0
for i in 0...@weapons.size
if @weapons[i].id == item.id
@weapons[i] = nil
n += 1
end
break if n == 0
end
@weapons.compact!
end
end
when RPG::Armor
if item.scroll?
@armor_scrolls[item.id] = [[number + n, 0].max, 99].min
else
if n > 0
@armors.push(item)
elsif n < 0
for i in 0...@armors.size
if @armors[i].id == item.id
@armors[i] = nil
n += 1
end
break if n == 0
end
@armors.compact!
end
end
end
end
#--------------------------------------------------------------------------
# ● 아이템의 소모
# item : 아이템
# 지정된 오브젝트가 소모 아이템이면, 소지수를 1 줄인다.
#--------------------------------------------------------------------------
alias :sw_es_consume_item :consume_item
def consume_item(item)
if item.is_a?(RPG::Weapon) or item.is_a?(RPG::Armor) and item.scroll?
lose_item(item, 1)
end
sw_es_consume_item(item)
end
#--------------------------------------------------------------------------
# ● 아이템의 사용 가능 판정
# item : 아이템
#--------------------------------------------------------------------------
alias :sw_es_item_can_use? :item_can_use?
def item_can_use?(item)
return true if item.is_a?(RPG::Weapon) or item.is_a?(RPG::Armor) and (item_number(item) != 0) and item.scroll?
sw_es_item_can_use?(item)
end
end
#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
# 아이템 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Item < Scene_Base
#--------------------------------------------------------------------------
# ● 타겟 선택의 갱신
#--------------------------------------------------------------------------
def update_target_selection
if Input.trigger?(Input::B)
Sound.play_cancel
if $game_party.item_number(@item) == 0 # 아이템을 다 사용했을 경우
@item_window.refresh # 윈도우의 내용을 재작성
end
hide_target_window
elsif Input.trigger?(Input::C)
if not $game_party.item_can_use?(@item)
Sound.play_buzzer
elsif @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor) and @item.scroll?
target = $game_party.members[@target_window.index]
if target.enchant_legal?(@item)
target.enchant_equip(@item)
$game_party.consume_item(@item)
@item_window.draw_item(@item_window.index)
se = RPG::SE.new("Applause")
se.play
@item_window.refresh # 윈도우의 내용을 재작성
$scene = Scene_Equip.new(@target_window.index)
else
Sound.play_buzzer
end
else
determine_target
end
end
end
end
#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
# 아이템 화면등에서, 소지 아이템의 일람을 표시하는 윈도우입니다.
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ● 스킬명의 묘화
# item : 아이템 (스킬, 무기, 방어구로도 가능)
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# enabled : 유효 플래그.false 때 반투명으로 묘화
#--------------------------------------------------------------------------
def draw_item_name(item, x, y, enabled = true)
if item != nil
draw_icon(item.icon_index, x, y, enabled)
self.contents.font.color.alpha = enabled ? 255 : 128
if item.is_a?(RPG::Item) or item.open_flag == false or item.scroll?
self.contents.font.color = normal_color
self.contents.draw_text(x + 24, y, 172, WLH, item.name)
elsif item.is_a?(RPG::Armor) and item.item_level >= IMIR::EquipLevel.armor_possible_level(item.id)
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. MAX"
self.contents.draw_text(x + 24, y, 172, WLH, text)
elsif item.is_a?(RPG::Weapon) and item.item_level >= IMIR::EquipLevel.weapon_possible_level(item.id)
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. MAX"
self.contents.draw_text(x + 24, y, 172, WLH, text)
else
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. " + item.item_level.to_s
self.contents.draw_text(x + 24, y, 172, WLH, text)
end
end
end
end
#==============================================================================
# ■ Window_Equip
#------------------------------------------------------------------------------
# 장비 화면에서, 액터가 현재 장비하고 있는 아이템을 표시하는 윈도우입니다.
#==============================================================================
class Window_Equip < Window_Selectable
#--------------------------------------------------------------------------
# ● 스킬명의 묘화
# item : 아이템 (스킬, 무기, 방어구로도 가능)
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# enabled : 유효 플래그.false 때 반투명으로 묘화
#--------------------------------------------------------------------------
def draw_item_name(item, x, y, enabled = true)
if item != nil
draw_icon(item.icon_index, x, y, enabled)
self.contents.font.color.alpha = enabled ? 255 : 128
if item.is_a?(RPG::Item) or item.open_flag == false or item.scroll?
self.contents.font.color = normal_color
self.contents.draw_text(x + 24, y, 172, WLH, item.name)
elsif item.is_a?(RPG::Armor) and item.item_level >= IMIR::EquipLevel.armor_possible_level(item.id)
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. MAX"
self.contents.draw_text(x + 24, y, 172, WLH, text)
elsif item.is_a?(RPG::Weapon) and item.item_level >= IMIR::EquipLevel.weapon_possible_level(item.id)
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. MAX"
self.contents.draw_text(x + 24, y, 172, WLH, text)
else
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. " + item.item_level.to_s
self.contents.draw_text(x + 24, y, 172, WLH, text)
end
end
end
end
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
# 게임중의 모든 윈도우의 슈퍼 클래스입니다.
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 아이템명의 묘화
# item : 아이템 (스킬, 무기, 방어구로도 가능)
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# enabled : 유효 플래그.false 때 반투명으로 묘화
#--------------------------------------------------------------------------
def draw_item_name(item, x, y, enabled = true)
if item != nil
draw_icon(item.icon_index, x, y, enabled)
self.contents.font.color.alpha = enabled ? 255 : 128
if item.is_a?(RPG::Skill) or item.is_a?(RPG::Item)
self.contents.font.color = normal_color
self.contents.draw_text(x + 24, y, 172, WLH, item.name)
elsif item.open_flag == false or item.scroll?
self.contents.font.color = normal_color
self.contents.draw_text(x + 24, y, 172, WLH, item.name)
elsif item.is_a?(RPG::Armor) and item.item_level >= IMIR::EquipLevel.armor_possible_level(item.id)
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. MAX"
self.contents.draw_text(x + 24, y, 172, WLH, text)
elsif item.is_a?(RPG::Weapon) and item.item_level >= IMIR::EquipLevel.weapon_possible_level(item.id)
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. MAX"
self.contents.draw_text(x + 24, y, 172, WLH, text)
else
self.contents.font.color = text_color(item.item_level)
text = item.name + " Lv. " + item.item_level.to_s
self.contents.draw_text(x + 24, y, 172, WLH, text)
end
end
end
end
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
# 이벤트 커멘드를 실행하는 interpreter입니다.이 클래스는 Game_Map 클래스,
# Game_Troop 클래스, Game_Event 클래스의 내부에서 사용됩니다.
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● 무기의 증감
#--------------------------------------------------------------------------
def command_127
value = operate_value(@params[1], @params[2], @params[3])
if value > 0
for i in 0...value
$game_party.gain_item($data_weapons[@params[0]].clone, 1, @params[4])
end
else
$game_party.gain_item($data_weapons[@params[0]], value, @params[4])
end
return true
end
#--------------------------------------------------------------------------
# ● 방어구의 증감
#--------------------------------------------------------------------------
def command_128
value = operate_value(@params[1], @params[2], @params[3])
if value > 0
for i in 0...value
$game_party.gain_item($data_armors[@params[0]].clone, 1, @params[4])
end
else
$game_party.gain_item($data_armors[@params[0]], value, @params[4])
end
return true
end
end
#==============================================================================
# ■ Scene_Shop
#------------------------------------------------------------------------------
# 상점 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Shop < Scene_Base
#--------------------------------------------------------------------------
# ● 개수 입력의 결정
#--------------------------------------------------------------------------
def decide_number_input
Sound.play_shop
@number_window.active = false
@number_window.visible = false
case @command_window.index
when 0 # 구입한다
$game_party.lose_gold(@number_window.number * @item.price)
if @item.is_a?(RPG::Item) or @item.scroll?
$game_party.gain_item(@item, @number_window.number)
else
for i in 0...@number_window.number
if @item.is_a?(RPG::Weapon)
$game_party.gain_item($data_weapons[@item.id].clone, 1)
elsif @item.is_a?(RPG::Armor)
$game_party.gain_item($data_armors[@item.id].clone, 1)
end
end
end
@gold_window.refresh
@buy_window.refresh
@status_window.refresh
@buy_window.active = true
@buy_window.visible = true
when 1 # 매각한다
$game_party.gain_gold(@number_window.number * (@item.price / 2))
if @item.is_a?(RPG::Item)
$game_party.lose_item(@item, @number_window.number)
else
if @item.is_a?(RPG::Weapon)
$game_party.weapons.delete(@item)
elsif @item.is_a?(RPG::Armor)
$game_party.armors.delete(@item)
end
end
@gold_window.refresh
@sell_window.refresh
@status_window.refresh
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
end
end
end
---------------------------------------------------------------------------------------------------------------------------
태그노트는스크립트 자료실을 뒤져주세요 TAG로 검색하시면 금방 나올겁니다.
-----------------------------------------------------------------------------------------------------------------------------
###########################
# Requirements for Skills # IMIR:EquipLevel Ver.
##############################################################################
# 버전 1.1
# 제작자: Queex
# 저작권: 비상업적 일반 창작자
# 필요 스크립트: TagNote 2.0 이상 (이 스크립트보다 위쪽에 위치하도록!)
# 번역: 훈덕
##############################################################################
# 스킬의 사용에 필요 조건이 생깁니다.
# 이것을 활용하여
# 기술을 사용하면 불화살이 소모되게 한다거나
# HP가 낮을 때만 발동되는 초필살기 등을 만들 수 있습니다.
#
# 필요 조건은 스킬의 메모 항목에 표기하면됩니다.
# 각 종류별로 하나의 태그만 인식됩니다.
#
#
# 무기의 메모 항목에 표기하는 태그:
# <weapon_type xxx>
#
# 아이템에 표기 가능한 태그:
# <include_battle_test> - 이 아이템을 테스트 전투에서 사용가능하게 해줌
#
# 스킬에 표기 가능한 태그:
# <weapon_type xxx> - 해당 종류의 무기로만 스킬 사용 가능
# <item_present id> - 파티가 해당 id의 아이템을 소유하고 있어야 스킬 사용 가능
# <item_consume id n> - 스킬 사용시 id 아이템을 n 개 소비
# <item_consume id> - 스킬 사용시 id 아이템을 1 개 소비
# <switch_on id> - id 스위치가 on일때
# <var_eq id n> - 변수번호 id가 n일때
# <var_up id n> - 변수번호 id가 n이상 일때
# <lev_up n> - 레벨이 n 이상일때
# <class_eq n> - 직업코드가 n일때
# <state n> - n번 상태일때 ( 상태창 열면 이름 옆의 숫자 )
# <gold n> - 골드가 n 이상일때
# <element n> - 공격 속성에 n번 속성이 있을 때
# <hp_percent_exceed per> - HP가 비율 per 이상
# <hp_percent_below per> - HP가 비율 per 미만
# <mp_percent_exceed per> - MP가 비율 per 이상
# <mp_percent_exceed per true> - MP를 비율 per 만큼 소비
# <mp_percent_below per> - MP가 비율 per 미만
# <free_hand> - 적어도 한 손이 빈손이어야 함
# <dual_weapon> - 이도류 사용
# <two_handed_weapon> - 양손무기 사용
#
#
# 예를 들어:
# <item_present 3>
# <item_consumed 4 2>
# <weapon_type bow>
#
# 위의 스킬을 사용하려면 id 3 아이템이 필요하고
# 사용할때 id 4 아이템을 2개씩 소비하며
# bow 타입으로 설정된 (메모란에 <weapon_type bow> 라고 입력한) 무기를 장비해야합니다.
#
#
#
#
# Note:
# This script also includes the function hands_free which returns the
# number of free hands for a Game_Actor.
#
# Version History:
# 0.4 - test release
# 0.5 - can specify some item to include in battle test
# 1.0 - Bugfix and update to TagNote 2.0
# 1.1 - Fix regressions
##############################################################################
class Game_Actor < Game_Battler
include TAGNOTE
def hands_free
if weapons[0] == nil
if @armor1 == nil
return 2
elsif weapons.length==2
if weapons[1].two_handed
return 0
else
return 1
end
else
return 1
end
elsif weapons[0].two_handed or @armor1 != nil
return 0
else
return 1
end
end
alias skill_req_skill_can_use? skill_can_use?
def skill_can_use?(skill)
if skill.id != 0
skill_note=$data_skills[skill.id].note
#Check for weapon type
skill_needs = get_tag(skill_note,"weapon_type") #weapon type string
if skill_needs != nil
if two_swords_style
if @weapon != nil and @armor1 != nil
return false unless has_tag_value?(@weapon.note,"weapon_type",skill_needs) or has_tag_value?(@armor1.note,"weapon_type",skill_needs)
elsif @weapon != nil
return false unless has_tag_value?(@weapon.note,"weapon_type",skill_needs)
elsif @armor1 != nil
return false unless has_tag_value?(@armor1.note,"weapon_type",skill_needs)
else
return false
end
else
return false unless @weapon != nil
return false unless has_tag_value?(@weapon.note,"weapon_type",skill_needs)
end
end
#Check for item presence
skill_needs = get_tag(skill_note,"item_present") #item id
if skill_needs != nil
return false unless $game_party.has_item?($data_items[skill_needs.to_i],true)
end
#Check for item consumption
skill_needs = get_tag(skill_note,"item_consume") #item id
if skill_needs !=nil
skill_needs_num = get_additional_tag(skill_note,"item_consume",2) #number
if skill_needs_num == nil
skill_needs_num = 1
end
return false unless $game_party.item_number($data_items[skill_needs.to_i])>=skill_needs_num.to_i
end
#Check for switch
skill_needs = get_tag(skill_note,"switch_on") #switch id
if skill_needs != nil
return false unless $game_switches[skill_needs.to_i] == true
end
#Check for variable_equal
skill_needs = get_tag(skill_note,"var_eq") #variable id
if skill_needs !=nil
skill_needs_num = get_additional_tag(skill_note,"var_eq",2) #number
if skill_needs_num == nil
skill_needs_num = 0
end
return false unless $game_variables[skill_needs.to_i] == skill_needs_num.to_i
end
#Check for variable_up
skill_needs = get_tag(skill_note,"var_up") #variable id
if skill_needs !=nil
skill_needs_num = get_additional_tag(skill_note,"var_up",2) #number
if skill_needs_num == nil
skill_needs_num = 0
end
return false unless $game_variables[skill_needs.to_i] >= skill_needs_num.to_i
end
#Check for level_up
skill_needs = get_tag(skill_note,"lev_up") #level
if skill_needs !=nil
return false unless level >= skill_needs.to_i
end
#Check for class_equal
skill_needs = get_tag(skill_note,"class_eq") #class id
if skill_needs !=nil
return false unless class_id == skill_needs.to_i
end
#Check for state
skill_needs = get_tag(skill_note,"state") #state id
if skill_needs != nil
return false unless state?(skill_needs.to_i)
end
#Check for gold
skill_needs = get_tag(skill_note,"gold") #gold
if skill_needs != nil
return false unless $game_party.gold >= skill_needs.to_i
end
#Check for element
skill_needs = get_tag(skill_note,"element") #gold
if skill_needs != nil
return false unless element_set.include?(skill_needs.to_i)
end
#Check for HP exceeds
skill_needs = get_tag(skill_note,"hp_percent_exceed") #percent
if skill_needs !=nil
return false unless (100.0 * @hp/maxhp)>=skill_needs.to_f
end
#Check for HP below
skill_needs = get_tag(skill_note,"hp_percent_below") #percent
if skill_needs != nil
return false unless (100.0 * @hp/maxhp)<skill_needs.to_f
end
#Check for MP exceeds
skill_needs = get_tag(skill_note,"mp_percent_exceed") #percent
if skill_needs != nil
return false unless (100.0 * @mp/maxmp)>=skill_needs.to_f
end
#Check for MP below
skill_needs = get_tag(skill_note,"mp_percent_below") #percent
if skill_needs != nil
return false unless (100.0* @mp/maxmp)<skill_needs.to_f
end
#Check for free hand
skill_needs = has_tag?(skill_note,"free_hand") #boolean
if skill_needs
return false unless hands_free>=1
end
#Check for dual weapons
skill_needs = has_tag?(skill_note,"dual_weapon") #boolean
if skill_needs
return false unless two_swords_style
return false unless weapons[0]!=nil and weapons[1]!=nil
end
#Check for two-handed weapon
skill_needs = has_tag?(skill_note,"two_handed_weapon") #boolean
if skill_needs
if two_swords_style
return false unless ( weapons[0]!= nil and weapons[0].two_handed) or (weapons[1] != nil and weapons[1].two_handed)
else
return false unless ( weapons[0]!= nil and weapons[0].two_handed)
end
end
return skill_req_skill_can_use?(skill)
end
end
def calc_mp_cost(skill)
base_cost=skill.mp_cost
mp_prop=get_tag(skill.note,"mp_percent_exceed")
if mp_prop!=nil
mp_lose=get_additional_tag_value(skill.note,"mp_percent_exceed",2)
if mp_lose.eql?("true")
base_cost=(mp_prop.to_f/100.0 * maxmp).to_i
end
end
if half_mp_cost
return base_cost / 2
else
return base_cost
end
end
end
class Scene_Battle < Scene_Base
include TAGNOTE
#--------------------------------------------------------------------------
# * Execute Battle Action: Skill
#--------------------------------------------------------------------------
alias skill_req_execute_action_skill execute_action_skill
def execute_action_skill
skill_req_execute_action_skill
skill = @active_battler.action.skill
#consume items required
skill_needs = get_tag(skill.note,"item_consume")
if skill_needs != nil
num_items = get_additional_tag(skill.note,"item_consume",2)
if num_items==nil
num_items=1
end
$game_party.lose_item($data_items[skill_needs.to_i],num_items.to_i,true)
end
end
end
class Game_Party < Game_Unit
include TAGNOTE
alias skill_req_setup_battle_test_members setup_battle_test_members
def setup_battle_test_members
skill_req_setup_battle_test_members
for i in 1...$data_items.size
if has_tag?($data_items[i].note,"include_battle_test")
@items[i] = 99
end
end
end
end