우시로미야 리온 님 덕분에 SRPG2 스크립트를 구했습니다.
( 사실 버전 2.0이 나온 줄도 몰랐어요;;; 이 자리를 빌어 다시 한번 감사드립니다. 우시로미야 리온님 ///ㅅ///)
이게 일어 판이라서 우리들의 친구 이X트X스의 도움을 얻어 주석파트를 열심히 번역 중이었습니다.
사실 제가 조금 대학원 일때문에 바빠서 구한건 10월 3일인데 한글화를 오늘 다했네요;;;; 번역기 작업이라서
어색한 부분 같은 곳을 많이 수정해야하지만요;;
이식 작업하고 예제 파일 작업만 하고 일단 번역한 원본을 여기 올려 보렵니다...
지금 이 글은 그 이야기는 아니고;;
번역하던 와중에 거기 끼어있는 이 스크립트를 발견했습니다. 고로 이 스크립트는 펌이 되겠습니다...
꽤 괜찮더라고요. 제목 그대로 카드 슬롯 장비 스크립트 입니다. 장비 강화와 카드 슬롯 장비의 기능을 갖고 있습니다.
일단 화면부터 설명하면 레벨은 무기레벨입니다 ( 라그를 생각하시면 될것 같네요. ) 레벨마다 다른 강화석이 필요하고
레벨이 높은 무기는 강화 효과가 강해집니다. 내구도는 강화 한계입니다. 한번 강화할때마다 20씩 줄어들고 내구도가 100
보다 작아지면 내구도만큼의 확률로 강화성공률이 결정됩니다. 회심율은 크리티컬이고 중량은 장비의 무게입니다.
스크립트 상단에 직업별 중량 한계가 설정되어 있고 그 이상 장비하면 중량 초과로 민첩성과 회피율이 0이 됩니다.
속성은 무기 속성, 부가는 부가 상태입니다.
사용법 부터 설명하자면
1) 장비 강화 시스템
일단 강화석 아이템을 만듭니다. 강화석으로 설정하려면 아이템의 메모란에 목표 장비에 따라서
<무기 강화>, <방패 강화>, <투구 강화>, <갑옷 강화>, <장식품 강화> 를 기입합니다.
( 벌써부터 확장장비 스크립트랑 충돌할만한 조짐이 보입니다만 여기서는 원본을 중시해서 일단 수정치 아니하였습니다 )
장비레벨에 따라 강화석의 레벨을 조정하는 것은 기본데미지로 결정합니다. 장비레벨 1의 강화석을 만들고 싶으면 기본
데미지를 1로, 장비레벨 3의 강화석을 만들고 싶으면 기본데미지를 3으로 기입합니다.
장비에도 기입할 부분이 있습니다. 장비레벨을 결정할 때는 장비의 메모란에 <레벨 = n> 으로 기입해 줍니다. 중요한 사실은
레벨과 = 그리고 n 사이에 띄어쓰기를 조심해야 한다는 점입니다.
@level = note =~ /<레벨s*=s*(d+)>/i ? $1. to_i : 1
스크립트에서는 윗줄처럼 표시되어 있는데 아마도 s* 라는 문구가 띄어쓰기 문구인 것 같습니다 ( 추측;;; )
기본적으로 무기는 공격력, 방어구는 방어력을 강화하게 설정되어 있지만 장비의 메모란에
<성능 강화 = S>라고 기입하면 기입한 능력치가 올라갑니다.
( S = 공격력, 방어력, 정신력, 민첩성, 명중율, 회피율, 회심율 ) 중 하나만 가능합니다.
이 밖에도 이 스크립트는 장비마다 내구도와 능력치를 랜덤으로 주고 있습니다. 무기의 경우
@atk = rand(rand(note =~ /<랜덤 공격력s*=s*(d+)>/i ? $1. to_i : 4) + 1)
대략 이런 식입니다. 즉 <랜덤 공격력 = n> 을 기입하면 저 부분을 설정할 수 있는 듯 합니다. 추가 증감치라고 해야할까;;;
직접 실험해본 결과 공격력 5의 롱 소드가 5~8 정도의 공격력이 랜덤하게 설정되었습니다.
내구도는 @durability = 100 + rand(rand(101) + 1)의 식을 따라 랜덤하게 설정됩니다.
장비마다 설정가능한 항목은
@atk = rand(rand(note =~ /<랜덤 공격력s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@def = rand(rand(note =~ /<랜덤 방어력s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@spi = rand(rand(note =~ /<랜덤 정신력s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@agi = rand(rand(note =~ /<랜덤 민첩성s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@hit = rand(rand(note =~ /<랜덤 명중율s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@eva = rand(rand(note =~ /<랜덤 회피율s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@cri = rand(rand(note =~ /<랜덤 회심율s*=s*(d+)>/i ? $1. to_i : 0) + 1)
이정도 네요;
아, 장비의 중량은 <중량 = n> 으로 설정가능하며 기본 수치는 10입니다.
( 직업별로 중량이 정해진 것이 차후 수정했으면 하는 부분이네요.. 순수 공격력 같은데 연관되면 좋을지도...)
2) 카드 슬롯 시스템
역시 기본적으로 카드아이템 설정부터 알아봅시다. 역시 아이템의 메모란이 중요합니다. 카드로 설정하려면
아이템의 메모란에 목표 장비에 따라서 <무기 카드>, <방패 카드>, <투구 카드>, <갑옷 카드>, <장식품 카드> 를 기입합니다.
효과는 스탯 관련은 <카드 공격력 = n>, <카드 방어력 = n>, <카드 정신력 = n>, <카드 민첩성 = n>, <카드 명중율 =n>,
<카드 회피율 = n>, <카드 회심율 = n>을 기입하며 수치를 감소시키고 싶으면 n 대신에 -n을 기입하면 됩니다.
exa) 공격력 + 10의 카드를 만들고 싶다 : <카드 공격력 = 10>
명중율 - 5의 카드를 만들고 싶다 : <카드 명중율 = -5>
카드로 장비에 속성을 부여할 때는 카드아이템에 속성을 체크하면 됩니다. 마찬가지로 카드로 장비에 상태를 부가하고 싶을
때는 상태에 + 혹은 -를 해주면 됩니다.. ( 상태 부분은 확실히 체크해보지는 못했지만 무기가 아니라면 +이나 -이나 같을 것
으로 추측됩니다 )
그리고 가장 중요한 뽀대를 위한 접두어를 설정해줘야 합니다.
( 접미어도 있으면 좋겠지만 원본에는 빠져 있더군요... 이름이 너무 길어질 것을 우려했는 지도 모르겠습니다 )
접두어 설정은 <접두어 = S> 입니다. 위의 다른 기입문구와 마찬가지로 중요한 점은 S와 > 사이를 붙여 써야 한다는 점입니다.
실제로 테스트시 접두어가 안먹혀서 이래저래 손을 대본 결과 접두어와 =, =와 S, S와 >사이의 띄어쓰기가 중요하다는 결론을
얻었습니다. 같은 카드를 두개 끼면 접두어 앞에 더블, 세개 끼면 트리플, 네개 끼면 쿼드러플이라는 문구가 들어가게 설정되어
있다는 점은 라그를 떠올리게 하네요 ㅎㅅㅎ;
장비 강화 시스템과 마찬가지로 장비 아이템도 손봐줄 필요가 있습니다. 장비의 메모란에 <슬롯 = n>이라고 기입해야 장비에
카드를 추가할 슬롯이 생깁니다.
안타까운 점은 장비에 기능을 첨가하는 옵션을 카드에 줄 수 없다는 점입니다. 예를 들어 양손사용이나 선제 공격같은 옵션을
이야기합니다. 차후 수정할 수 있다면 수정하고 싶은 부분이네요.
아래는 스크립트 원본입니다.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
#==============================================================================
# RGSS2_카드 슬롯 장비 Ver0. 12
# tomoaky (http://hikimoki.web.infoseek.co.jp/)
#
# 2011/02/08 Ver0. 12
# ·조건 분기:엑터의 장비품 판정에 대응
# ·숍에서의 장비품 소지수가 올바르게 표시되지 않는 불편을 수정
# ·일부 윈도우의 거동을 변경
#
# 2010/04/16 Ver0. 11
# 2010/03/25 Ver0. 1 공개
#
# RPG 트크르 VX에 이하의 기능을 추가하는 스크립트 소재입니다
# ·동종의 장비품을 개개에 관리하는 사양으로 변경
# ·강화 아이템에 의한 장비품 강화
# ·카드에 의한 장비품 커스터마이즈
# ·장비 중량에 의한 민첩성과 회피율의 보정
#
# 또 , 이하의 제한이 더해집니다
# ·장비품의 소지수취득이나 증감에 있어서의 「장비품도 포함한다」가 무효
# ·무기(방어용 기구)의 증감 커맨드에서는 전에 있는 것으로부터 순서로 줄인다
#
# 다른 스크립트와의 병용을 고려하지 않는 만들기가 되어 있습니다,
# 경합에 의한 불편은 포기할까 자력으로 수정해 주세요.
#
# 자세한 사용법등은 사이트의 해설 페이지를 참조해 주세요.
#==============================================================================
$include_tiex = true
#==============================================================================
# ■ 설정 항목
#==============================================================================
module TIEX
# 속성 아이콘 인덱스(속성 ID 순서에 칸마로 단락지어 늘어놓는 , 선두는 nil)
ELEMENT_ICON = [
nil , 132, 2, 4, 14, 16, 12, 20, 135,
104, 105, 106, 107, 108, 109, 110, 111
]
# 빈카드 슬롯의 아이콘 인덱스
ICON_CARD_SLOT = 240
# 직업마다의 최대 적재량(직업 ID 순서에 칸마로 단락지어 늘어놓는 , 선두는 nil)
JOB_WEIGHT_MAX = [
nil , 100, 100, 100, 100, 100, 100, 100, 100
]
end
module Vocab
def self.hit # 명중율 파라미터의 이름(메모란에는 영향을 주지 않습니다)
return "명중율"
end
def self.eva # 회피율 파라미터의 이름(메모란에는 영향을 주지 않습니다)
return "회피율"
end
def self.cri # 위기 파라미터의 이름(메모란에는 영향을 주지 않습니다)
return "회심율"
end
end
module Sound
def self.play_item_power_up
Audio.se_play("Audio/SE/Saint9", 80, 100)
end
def self.play_item_break
Audio.se_play("Audio/SE/Crash", 80, 100)
end
def self.play_item_garbage
Audio.se_play("Audio/SE/Crash", 80, 100)
end
end
#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :item_check_number # 장비품의 개체 식별 넘버 카운터
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias tiex_game_system_initialize initialize
def initialize
tiex_game_system_initialize
@item_check_number = 0
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_reader :weapon # 무기 ID
attr_reader :armor1 # 방패 ID
attr_reader :armor2 # 두 방어용 기구 ID
attr_reader :armor3 # 체 방어용 기구 ID
attr_reader :armor4 # 장식품 ID
#--------------------------------------------------------------------------
# ● 셋업
# actor_id : 엑터 ID
#--------------------------------------------------------------------------
alias tiex_game_actor_setup setup
def setup(actor_id)
tiex_game_actor_setup(actor_id)
@weapon = WeaponEx.new(actor.weapon_id) if actor.weapon_id > 0
if actor.armor1_id > 0
@armor1 = two_swords_style ? WeaponEx.new(actor.armor1_id) : ArmorEx.new(actor.armor1_id)
end
@armor2 = ArmorEx.new(actor.armor2_id) if actor.armor2_id > 0
@armor3 = ArmorEx.new(actor.armor3_id) if actor.armor3_id > 0
@armor4 = ArmorEx.new(actor.armor4_id) if actor.armor4_id > 0
end
#--------------------------------------------------------------------------
# ● 무기 오브젝트의 배열 취득
#--------------------------------------------------------------------------
def weapons
result = []
result.push(@weapon)
result.push(@armor1) if two_swords_style
return result
end
#--------------------------------------------------------------------------
# ● 방어용 기구 오브젝트의 배열 취득
#--------------------------------------------------------------------------
def armors
result = []
result.push(@armor1) unless two_swords_style
result.push(@armor2)
result.push(@armor3)
result.push(@armor4)
return result
end
#--------------------------------------------------------------------------
# ● 기본 민첩성의 취득
#--------------------------------------------------------------------------
alias tiex_game_actor_base_agi base_agi
def base_agi
return 0 if over_weight? # 중량 과다하면 0을 돌려준다
return tiex_game_actor_base_agi
end
#--------------------------------------------------------------------------
# ● 명중율의 취득
#--------------------------------------------------------------------------
alias tiex_game_actor_hit hit
def hit
n = tiex_game_actor_hit
for item in armors.compact do n += item.hit end
return n
end
#--------------------------------------------------------------------------
# ● 회피율의 취득
#--------------------------------------------------------------------------
alias tiex_game_actor_eva eva
def eva
return 0 if over_weight? # 중량 과다하면 0을 돌려준다
n = tiex_game_actor_eva
for item in weapons.compact do n += item.eva end
return n
end
#--------------------------------------------------------------------------
# ● 위기율의 취득
#--------------------------------------------------------------------------
alias tiex_game_actor_cri cri
def cri
n = tiex_game_actor_cri
for item in equips.compact do n += item.cri end
return n
end
#--------------------------------------------------------------------------
# ○장비 중량의 취득
#--------------------------------------------------------------------------
def weight
n = 0
for item in equips.compact do n += item.weight end
return n
end
#--------------------------------------------------------------------------
# ○중량 과다 상태의 취득
#--------------------------------------------------------------------------
def over_weight?
return (weight > TIEX::JOB_WEIGHT_MAX[@class_id])
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 , WeaponEx.new(item_id) , test)
else
change_equip(equip_type , ArmorEx.new(item_id) , 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.is_a?(WeaponEx)
$game_party.weapons = $game_party.weapons - [item]
elsif item.is_a?(ArmorEx)
$game_party.armors = $game_party.armors - [item]
end
end
case equip_type
when 0 # 무기
@weapon = item
change_equip(1, nil , test) unless two_hands_legal? # 양손 소유 위반
when 1 # 방패
@armor1 = item
change_equip(0, nil , test) unless two_hands_legal? # 양손 소유 위반
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 : 아이템
#--------------------------------------------------------------------------
def equippable?(item)
if item.is_a? (RPG::Weapon) or item.is_a? (WeaponEx)
return self.class.weapon_set.include? (item.id)
elsif item.is_a? (RPG::Armor) or item.is_a? (ArmorEx)
return false if two_swords_style and item.kind == 0
return self.class.armor_set.include? (item.id)
end
return false
end
end
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_accessor :weapons # 소지품 배열(무기)
attr_accessor :armors # 소지품 배열(방어용 기구)
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
alias tiex_game_party_initialize initialize
def initialize
tiex_game_party_initialize
@weapons = [] # 소지품 배열 (무기 Ex오브젝트)
@armors = [] # 소지품 배열 (방어용 기구 Ex오브젝트)
end
#--------------------------------------------------------------------------
# ● 아이템 오브젝트의 배열 취득 (무기와 방어용 기구를 포함한다)
#--------------------------------------------------------------------------
def items
result = []
for i in @items.keys.sort
result.push($data_items[i]) if @items[i] > 0
end
for item in @weapons
result.push(item)
end
for item in @armors
result.push(item)
end
return result
end
#--------------------------------------------------------------------------
# ● 아이템의 소지수취득
# item : 아이템
#--------------------------------------------------------------------------
def item_number(item)
case item
when RPG::Item
number = @items[item.id]
when WeaponEx , RPG::Weapon
number = 0
for weapon in @weapons
number += 1 if item.id == weapon.id
end
when ArmorEx , RPG::Armor
number = 0
for armor in @armors
number += 1 if item.id == armor.id
end
end
return number == nil ? 0 : number
end
#--------------------------------------------------------------------------
# ● 아이템의 소지 판정
# item : 아이템
# include_equip : 장비품도 포함한다(미실장)
#--------------------------------------------------------------------------
def has_item? (item , include_equip = false)
return true if item_number(item) > 0
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 WeaponEx
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
when ArmorEx
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
#--------------------------------------------------------------------------
# ○아이템의 줄대체
#--------------------------------------------------------------------------
def sort_item
unless @weapons.empty?
@weapons.sort! do |a , b|
a.id <=> b.id
end
end
unless @armors.empty?
@armors.sort! do |a , b|
a.id <=> b.id
end
end
end
end
#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● 조건 분기
#--------------------------------------------------------------------------
alias tiex_game_interpreter_command_111 command_111
def command_111
result = false
if @params[0] == 4 # 엑터
actor = $game_actors[@params[1]]
if actor != nil
case @params[2]
when 0 # 파티에 있다
result = ($game_party.members.include? (actor))
when 1 # 이름
result = (actor.name == @params[3])
when 2 # 스킬
result = (actor.skill_learn? ($data_skills[@params[3]]))
when 3 # 무기
for item in actor.weapons
result = true if item.id == @params[3]
end
when 4 # 방어용 기구
for item in actor.armors
result = true if item.id == @params[3]
end
when 5 # 스테이트
result = (actor.state? (@params[3]))
end
@branch[@indent] = result # 판정 결과를 핫슈에 격납
if @branch[@indent] == true
@branch.delete(@indent)
return true
end
return command_skip
end
end
tiex_game_interpreter_command_111
end
#--------------------------------------------------------------------------
# ● 무기의 증감
#--------------------------------------------------------------------------
def command_127
value = operate_value(@params[1], @params[2], @params[3])
if value > 0
for i in 0...value
$game_party.gain_item(WeaponEx.new(@params[0]) , 1, @params[4])
end
else
$game_party.gain_item(WeaponEx.new(@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(ArmorEx.new(@params[0]) , 1, @params[4])
end
else
$game_party.gain_item(ArmorEx.new(@params[0]) , value , @params[4])
end
return true
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# x : 윈도우의 X 좌표
# y : 윈도우의 Y 좌표
# width : 윈도우의 폭
# height : 윈도우의 높이
#--------------------------------------------------------------------------
def initialize(x, y, width , height)
if (width == 544 and height == 360)
super(x, y, width , 208, 0)
@column_max = 16
elsif self.is_a? (Window_ShopSell)
super(x, y, width , 152, 0)
@column_max = 16
else
super(x, y, width , height)
@column_max = 2
end
self.index = 0
refresh
end
#--------------------------------------------------------------------------
# ○리프레쉬(소재의 사용처 선택중)
#--------------------------------------------------------------------------
def refresh_material(material)
@material = material
@data = []
for item in $game_party.items
next if item.is_a? (RPG::Item)
@data.push(item)
end
self.index = 0
@data.push(nil) if include? (nil)
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
@material = nil
end
#--------------------------------------------------------------------------
# ○리프레쉬(버리는 아이템 선택중)
#--------------------------------------------------------------------------
def refresh_garbage(garbage)
@garbage = garbage
@data = [@garbage]
self.index = 0
@data.push(nil) if include? (nil)
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
@garbage = nil
end
#--------------------------------------------------------------------------
# ● 항목의 묘화
# index : 항목 번호
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect(index)
self.contents.clear_rect(rect)
item = @data[index]
if item != nil
number = $game_party.item_number(item)
if @garbage != nil
enabled = true
elsif @material == nil
enabled = enable? (item)
else
enabled = item.material_can_use? (@material)
end
rect.width -= 4
if @column_max == 16 # 아이콘 모드라면 아이콘만
draw_icon(item.icon_index , rect.x + 4, rect.y , enabled)
if item.is_a? (RPG::Item) # 아이템만 개수를 표시한다
self.contents.font.size = 12
rect.y += 4
self.contents.draw_text(rect , number , 2)
end
else # 통상 모드라면 아이템명을 묘화
draw_item_name(item , rect.x , rect.y , enabled)
if item.is_a? (RPG::Item) # 아이템만 개수를 표시한다
self.contents.draw_text(rect , sprintf(":%2d", number) , 2)
end
end
end
end
end
#==============================================================================
# ■ Window_ItemStatus
#==============================================================================
class Window_ItemStatus < Window_Base
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
super(0, 264, 544, 152)
@item = nil
refresh
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update(item)
super()
if @item != item
@item = item
refresh
end
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
return if @item == nil
self.contents.font.size = Font.default_size
draw_icon(@item.icon_index , 0, 0, true)
self.contents.draw_text( 24, 0, 288, WLH , @item.name)
self.contents.draw_text(4, WLH * 1, 504, WLH , @item.description)
unless @item.is_a? (RPG::Item) # 아이템 이외의 경우
rect = self.contents.text_size(@item.name)
for i in 0...@item.slot_max
draw_icon(TIEX::ICON_CARD_SLOT , rect.width + i * 24 + 32, 0, true)
if i < @item.slot.size
icon_index = $data_items[@item.slot[i]]. icon_index
draw_icon(icon_index , rect.width + i * 24 + 32, 0, true)
end
end
self.contents.font.size = 16
self.contents.font.color = system_color
self.contents.draw_text(4, WLH * 2, 48, WLH , "레벨")
self.contents.draw_text( 106, WLH * 2, 48, WLH , Vocab::atk)
self.contents.draw_text( 208, WLH * 2, 48, WLH , Vocab::def)
self.contents.draw_text( 310, WLH * 2, 48, WLH , Vocab::spi)
self.contents.draw_text( 412, WLH * 2, 48, WLH , Vocab::agi)
self.contents.draw_text(4, WLH * 3, 48, WLH , "내구도")
self.contents.draw_text( 106, WLH * 3, 48, WLH , "명중율")
self.contents.draw_text( 208, WLH * 3, 48, WLH , "회피율")
self.contents.draw_text( 310, WLH * 3, 48, WLH , "회심율")
self.contents.draw_text( 412, WLH * 3, 48, WLH , "중량")
if @item.is_a? (WeaponEx)
self.contents.draw_text(4, WLH * 4, 96, WLH , "속성")
self.contents.draw_text( 256, WLH * 4, 96, WLH , "부가")
else
self.contents.draw_text(4, WLH * 4, 96, WLH , "반감")
self.contents.draw_text( 256, WLH * 4, 96, WLH , "방지")
end
self.contents.font.size = Font.default_size
self.contents.font.color = normal_color
self.contents.draw_text( 52, WLH * 2, 46, WLH , @item.level , 2)
self.contents.draw_text( 154, WLH * 2, 46, WLH , @item.atk , 2)
self.contents.draw_text( 256, WLH * 2, 46, WLH , @item.def , 2)
self.contents.draw_text( 358, WLH * 2, 46, WLH , @item.spi , 2)
self.contents.draw_text( 460, WLH * 2, 46, WLH , @item.agi , 2)
self.contents.draw_text( 52, WLH * 3, 46, WLH , @item.durability , 2)
self.contents.draw_text( 154, WLH * 3, 46, WLH , @item.hit , 2)
self.contents.draw_text( 256, WLH * 3, 46, WLH , @item.eva , 2)
self.contents.draw_text( 358, WLH * 3, 46, WLH , @item.cri , 2)
self.contents.draw_text( 460, WLH * 3, 46, WLH , @item.weight , 2)
x = 56
for id in @item.element_set
draw_icon(TIEX::ELEMENT_ICON[id], x, WLH * 4, true)
x += 24
end
x = 312
for id in @item.state_set
draw_icon($data_states[id]. icon_index , x, WLH * 4, true)
x += 24
end
end
end
end
#==============================================================================
# ■ Window_EquipItem
#==============================================================================
class Window_EquipItem < Window_Item
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
@column_max = 1
super
end
#--------------------------------------------------------------------------
# ● 아이템을 리스트에 포함할지 어떨지
# item : 아이템
#--------------------------------------------------------------------------
def include? (item)
return true if item == nil
if @equip_type == 0
return false unless item.is_a? (WeaponEx)
else
return false unless item.is_a? (ArmorEx)
return false unless item.kind == @equip_type - 1
end
return @actor.equippable? (item)
end
end
#==============================================================================
# ■ Window_EquipStatus
#==============================================================================
class Window_EquipStatus < Window_Base
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# x : 윈도우의 X 좌표
# y : 윈도우의 Y 좌표
# actor : 엑터
#--------------------------------------------------------------------------
def initialize(x, y, actor)
super(x, y, 208, 360)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_actor_name(@actor , 4, 0)
for i in 0..6
draw_parameter(0, WLH * (i + 1) , i)
end
# 중량의 표시
x, y = 0, WLH * (8 + 1)
self.contents.font.color = system_color
self.contents.draw_text(x + 4, y, 80, WLH , "중량")
self.contents.font.color = @actor.over_weight? ? knockout_color : normal_color
self.contents.draw_text(x + 90, y, 30, WLH , @actor.weight , 2)
self.contents.font.color = system_color
self.contents.draw_text(x + 122, y, 20, WLH , "→", 1)
if @new_weight != nil
if @new_weight > TIEX::JOB_WEIGHT_MAX[@actor.class_id]
self.contents.font.color = knockout_color
else
self.contents.font.color = normal_color
end
self.contents.draw_text(x + 142, y, 30, WLH , @new_weight , 2)
end
end
#--------------------------------------------------------------------------
# ● 장비 변경 후의 능력치 설정
# temp_actor : 장비 변경 후의 더미 엑터
#--------------------------------------------------------------------------
def set_new_parameters(new_atk , new_def , new_spi , new_agi , new_hit ,
new_eva , new_cri , new_weight)
if @new_atk != new_atk or @new_def != new_def or @new_spi != new_spi or
@new_agi != new_agi or @new_hit != new_hit or @new_eva != new_eva or
@new_cri != new_cri or @new_weight != new_weight
@new_atk = new_atk
@new_def = new_def
@new_spi = new_spi
@new_agi = new_agi
@new_hit = new_hit
@new_eva = new_eva
@new_cri = new_cri
@new_weight = new_weight
refresh
end
end
#--------------------------------------------------------------------------
# ● 능력치의 묘화
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# type : 능력치의 종류 (0~3)
#--------------------------------------------------------------------------
def draw_parameter(x, y, type)
case type
when 0
name = Vocab::atk
value = @actor.atk
new_value = @new_atk
when 1
name = Vocab::def
value = @actor.def
new_value = @new_def
when 2
name = Vocab::spi
value = @actor.spi
new_value = @new_spi
when 3
name = Vocab::agi
value = @actor.agi
new_value = @new_agi
when 4
name = Vocab::hit
value = @actor.hit
new_value = @new_hit
when 5
name = Vocab::eva
value = @actor.eva
new_value = @new_eva
when 6
name = Vocab::cri
value = @actor.cri
new_value = @new_cri
end
self.contents.font.color = system_color
self.contents.draw_text(x + 4, y, 80, WLH , name)
self.contents.font.color = normal_color
self.contents.draw_text(x + 90, y, 30, WLH , value , 2)
self.contents.font.color = system_color
self.contents.draw_text(x + 122, y, 20, WLH , "→", 1)
if new_value != nil
self.contents.font.color = new_parameter_color(value , new_value)
self.contents.draw_text(x + 142, y, 30, WLH , new_value , 2)
end
end
end
#==============================================================================
# ■ Window_Status
#==============================================================================
class Window_Status < Window_Base
#--------------------------------------------------------------------------
# ● 능력치의 묘화
# actor : 엑터
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
# type : 능력치의 종류 (0~3)
#--------------------------------------------------------------------------
def draw_actor_parameter(actor , x, y, type)
case type
when 0
parameter_name = Vocab::atk
parameter_value = actor.atk
when 1
parameter_name = Vocab::def
parameter_value = actor.def
when 2
parameter_name = Vocab::spi
parameter_value = actor.spi
when 3
parameter_name = Vocab::agi
parameter_value = actor.agi
when 4
parameter_name = Vocab::hit
parameter_value = actor.hit
when 5
parameter_name = Vocab::eva
parameter_value = actor.eva
when 6
parameter_name = Vocab::cri
parameter_value = actor.cri
end
self.contents.font.color = system_color
self.contents.draw_text(x, y, 120, WLH , parameter_name)
self.contents.font.color = normal_color
self.contents.draw_text(x + 120, y, 36, WLH , parameter_value , 2)
end
#--------------------------------------------------------------------------
# ● 능력치의 묘화
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
#--------------------------------------------------------------------------
def draw_parameters(x, y)
for i in 0..6
draw_actor_parameter(@actor , x, y + WLH * i, i)
end
end
#--------------------------------------------------------------------------
# ● 장비품의 묘화
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
#--------------------------------------------------------------------------
alias tiex_window_status_draw_equipments draw_equipments
def draw_equipments(x, y)
tiex_window_status_draw_equipments(x, y)
self.contents.font.color = system_color
self.contents.draw_text(x, y + 168, 120, WLH , "중량")
self.contents.font.color = @actor.over_weight? ? knockout_color : normal_color
self.contents.draw_text(x + 64, y + 168, 52, WLH , @actor.weight , 2)
self.contents.font.color = normal_color
self.contents.draw_text(x + 116, y + 168, 24, WLH , "/", 1)
self.contents.draw_text(x + 140, y + 168, 52, WLH , TIEX::JOB_WEIGHT_MAX[@actor.class_id], 2)
end
end
#==============================================================================
# ■ Window_ShopSell
#==============================================================================
class Window_ShopSell < Window_Item
#--------------------------------------------------------------------------
# ● 헬프 텍스트 갱신
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(item == nil ? "" : item.name)
end
end
#==============================================================================
# ■ Window_ShopStatus
#==============================================================================
class Window_ShopStatus < Window_Base
#--------------------------------------------------------------------------
# ● 엑터의 현장비와 능력치 변화의 묘화
# actor : 엑터
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
#--------------------------------------------------------------------------
def draw_actor_parameter_change(actor , x, y)
return if @item.is_a? (RPG::Item)
enabled = actor.equippable? (@item)
self.contents.font.color = normal_color
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(x, y, 200, WLH , actor.name)
if @item.is_a? (RPG::Weapon) or @item.is_a? (WeaponEx)
item1 = weaker_weapon(actor)
elsif actor.two_swords_style and @item.kind == 0
item1 = nil
else
item1 = actor.equips[1 + @item.kind]
end
if enabled
if @item.is_a? (RPG::Weapon) or @item.is_a? (WeaponEx)
atk1 = item1 == nil ? 0 : item1.atk
atk2 = @item == nil ? 0 : @item.atk
change = atk2 - atk1
else
def1 = item1 == nil ? 0 : item1.def
def2 = @item == nil ? 0 : @item.def
change = def2 - def1
end
self.contents.draw_text(x, y, 200, WLH , sprintf("%+d", change) , 2)
end
draw_item_name(item1 , x, y + WLH , enabled)
end
end
#==============================================================================
# ■ Scene_Item
#==============================================================================
class Scene_Item < Scene_Base
#--------------------------------------------------------------------------
# ● 개시 처리
#--------------------------------------------------------------------------
alias tiex_scene_item_start start
def start
@status_window = Window_ItemStatus.new
tiex_scene_item_start
@item_window.help_window = nil
@help_window.set_text("C … 사용 / B … 이전화면 / A … 정돈 / X … 파기")
end
#--------------------------------------------------------------------------
# ● 종료 처리
#--------------------------------------------------------------------------
alias tiex_scene_item_terminate terminate
def terminate
@status_window.dispose
tiex_scene_item_terminate
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
update_menu_background
@help_window.update
@item_window.update
@target_window.update
@status_window.update(@item_window.item)
if @material != nil
update_material_selection
elsif @garbage != nil
update_garbage_selection
elsif @item_window.active
update_item_selection
elsif @target_window.active
update_target_selection
end
end
#--------------------------------------------------------------------------
# ● 아이템 선택의 갱신
#--------------------------------------------------------------------------
alias tiex_scene_item_update_item_selection update_item_selection
def update_item_selection
if Input.trigger? (Input::X) # 아이템을 버린다
if @item_window.item == nil
Sound.play_buzzer
elsif @item_window.item.price == 0 # 귀중품은 버려지지 않는다
Sound.play_buzzer
else
Sound.play_decision
@garbage = @item_window.item
@item_window.refresh_garbage(@garbage)
@help_window.set_text("C … 정말로 파기한다 / B … 취소한다")
end
elsif Input.trigger? (Input::A) # 무기와 방어용 기구를 정돈한다
Sound.play_equip
$game_party.sort_item
@item_window.refresh
else
tiex_scene_item_update_item_selection
end
end
#--------------------------------------------------------------------------
# ● 아이템의 사용 (아군 대상 이외의 사용 효과를 적용)
#--------------------------------------------------------------------------
alias tiex_scene_item_use_item_nontarget use_item_nontarget
def use_item_nontarget
if @item.material?
@material = @item
@item_window.refresh_material(@material)
@help_window.set_text(sprintf("C … %s를 사용 / B … 취소", @material.name))
else
tiex_scene_item_use_item_nontarget
end
end
#--------------------------------------------------------------------------
# ● 소재 적용 아이템 선택의 갱신
#--------------------------------------------------------------------------
def update_material_selection
if Input.trigger? (Input::B)
Sound.play_cancel
@material = nil
@item_window.refresh
@help_window.set_text("C … 사용 / B … 이전화면 / A … 정돈 / X … 파기")
elsif Input.trigger? (Input::C)
@item = @item_window.item
if @item == nil or @item.is_a? (RPG::Item)
Sound.play_buzzer
return
end
result = @item.material_can_use?(@material) # 소재를 적용할 수 있을지 어떨지
if result
if @material.card_material? >= 0 # 소재가 카드의 경우
@item.card_set(@material)
Sound.play_item_power_up
else # 소재가 강화 아이템의 경우
if @item.power_up # 강화가 성공했을 경우
Sound.play_item_power_up
else # 강화가 실패했을 경우
if @item.is_a? (WeaponEx)
$game_party.weapons = $game_party.weapons - [@item]
elsif @item.is_a? (ArmorEx)
$game_party.armors = $game_party.armors - [@item]
end
Sound.play_item_break
end
end
$game_party.consume_item(@material) # 사용한 소재를 한가지 소비
@material = nil
@item_window.refresh
@help_window.set_text("C … 사용 / B … 이전화면 / A … 정돈 / X … 파기")
else
Sound.play_buzzer
end
end
end
#--------------------------------------------------------------------------
# ● 버리는 아이템 선택의 갱신
#--------------------------------------------------------------------------
def update_garbage_selection
if Input.trigger? (Input::B)
Sound.play_cancel
@garbage = nil
@item_window.refresh
@help_window.set_text("C … 사용 / B … 이전화면 / A … 정돈 / X … 파기")
elsif Input.trigger? (Input::C)
Sound.play_item_garbage
if @garbage.is_a? (RPG::Item)
$game_party.lose_item(@garbage , 99)
elsif @garbage.is_a? (WeaponEx)
$game_party.weapons = $game_party.weapons - [@garbage]
elsif @garbage.is_a? (ArmorEx)
$game_party.armors = $game_party.armors - [@garbage]
end
@garbage = nil
@item_window.refresh
@help_window.set_text("C … 사용 / B … 이전화면 / A … 정돈 / X … 파기")
end
end
#--------------------------------------------------------------------------
# ● 타겟 윈도우의 표시
# right : 오른쪽 대고 플래그 (false 라면 왼쪽 맞춤)
#--------------------------------------------------------------------------
alias tiex_scene_item_show_target_window show_target_window
def show_target_window(right)
tiex_scene_item_show_target_window(true)
@status_window.close
end
#--------------------------------------------------------------------------
# ● 타겟 윈도우의 비표시
#--------------------------------------------------------------------------
alias tiex_scene_item_hide_target_window hide_target_window
def hide_target_window
tiex_scene_item_hide_target_window
@status_window.open
end
end
#==============================================================================
# ■ Scene_Equip
#==============================================================================
class Scene_Equip < Scene_Base
#--------------------------------------------------------------------------
# ● 개시 처리
#--------------------------------------------------------------------------
alias tiex_scene_equip_start start
def start
tiex_scene_equip_start
@item_status_window = Window_ItemStatus.new
@item_status_window.visible = false
end
#--------------------------------------------------------------------------
# ● 종료 처리
#--------------------------------------------------------------------------
alias tiex_scene_equip_terminate terminate
def terminate
@item_status_window.dispose
tiex_scene_equip_terminate
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
alias tiex_scene_equip_update update
def update
tiex_scene_equip_update
if Input.trigger? (Input::A)
if @item_status_window.visible
Sound.play_cancel
@item_status_window.visible = false
else
Sound.play_decision
@item_status_window.visible = true
end
end
if @equip_window.active
@item_status_window.update(@equip_window.item)
@item_status_window.y = 236
elsif @item_window.active
@item_status_window.update(@item_window.item)
@item_status_window.y = 56
end
end
#--------------------------------------------------------------------------
# ● 아이템 윈도우의 작성
#--------------------------------------------------------------------------
def create_item_windows
@item_windows = []
for i in 0...EQUIP_TYPE_MAX
@item_windows[i] = Window_EquipItem.new( 208, 208, 336, 208, @actor , i)
@item_windows[i]. help_window = @help_window
@item_windows[i]. visible = (@equip_index == i)
@item_windows[i]. y = 208
@item_windows[i]. height = 208
@item_windows[i]. active = false
@item_windows[i]. index = -1
end
end
#--------------------------------------------------------------------------
# ● 스테이터스 윈도우의 갱신
#--------------------------------------------------------------------------
def update_status_window
if @equip_window.active
@status_window.set_new_parameters(nil , nil , nil , nil , nil , nil , nil , nil)
elsif @item_window.active
temp_actor = @actor.clone
temp_actor.change_equip(@equip_window.index , @item_window.item , true)
new_atk = temp_actor.atk
new_def = temp_actor.def
new_spi = temp_actor.spi
new_agi = temp_actor.agi
new_hit = temp_actor.hit
new_eva = temp_actor.eva
new_cri = temp_actor.cri
new_weight = temp_actor.weight
@status_window.set_new_parameters(new_atk , new_def , new_spi , new_agi ,
new_hit , new_eva , new_cri , new_weight)
end
@status_window.update
end
end
#==============================================================================
# ■ Scene_Shop
#==============================================================================
class Scene_Shop < Scene_Base
#--------------------------------------------------------------------------
# ● 개시 처리
#--------------------------------------------------------------------------
alias tiex_scene_shop_start start
def start
tiex_scene_shop_start
@item_status_window = Window_ItemStatus.new
@item_status_window.visible = false
end
#--------------------------------------------------------------------------
# ● 종료 처리
#--------------------------------------------------------------------------
alias tiex_scene_shop_terminate terminate
def terminate
@item_status_window.dispose
tiex_scene_shop_terminate
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
alias tiex_scene_shop_update update
def update
tiex_scene_shop_update
@item_status_window.visible = @sell_window.active
end
#--------------------------------------------------------------------------
# ● 매각 아이템 선택의 갱신
#--------------------------------------------------------------------------
def update_sell_selection
@item_status_window.update(@sell_window.item)
if Input.trigger? (Input::B)
Sound.play_cancel
@command_window.active = true
@dummy_window.visible = true
@sell_window.active = false
@sell_window.visible = false
@status_window.item = nil
@help_window.set_text("")
elsif Input.trigger? (Input::C)
@item = @sell_window.item
@status_window.item = @item
if @item == nil or @item.price == 0
Sound.play_buzzer
else
Sound.play_decision
max = $game_party.item_number(@item)
@sell_window.active = false
@sell_window.visible = false
if @item.is_a? (RPG::Item)
@number_window.set(@item , max , @item.price / 2)
else
@number_window.set(@item , 1, @item.price / 2)
end
@number_window.active = true
@number_window.visible = true
@status_window.visible = true
end
end
end
#--------------------------------------------------------------------------
# ● 개수 입력의 결정
#--------------------------------------------------------------------------
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)
$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(WeaponEx.new(@item.id) , 1)
else
$game_party.gain_item(ArmorEx.new(@item.id) , 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? (WeaponEx)
$game_party.weapons = $game_party.weapons - [@item]
elsif @item.is_a? (ArmorEx)
$game_party.armors = $game_party.armors - [@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
module RPG
class Item < UsableItem
def material? # 아이템이 소재인가 어떤가를 돌려준다
return true if power_material? >= 0
return true if card_material? >= 0
return false
end
def power_material? # 아이템이 강화 소재라면 대상 종별을 돌려준다
return 0 if @note =~ /<무기 강화>/
return 1 if @note =~ /<방패 강화>/
return 2 if @note =~ /<투구 강화>/
return 3 if @note =~ /<갑옷 강화>/
return 4 if @note =~ /<장식품 강화>/
return -1
end
def card_material? # 아이템이 카드라면 대상 종별을 돌려준다
return 0 if @note =~ /<무기 카드>/
return 1 if @note =~ /<방패 카드>/
return 2 if @note =~ /<투구 카드>/
return 3 if @note =~ /<갑옷 카드>/
return 4 if @note =~ /<장식품 카드>/
return -1
end
def card_atk # 카드의 공격력 보정치를 취득
return (@note =~ /<카드 공격력s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def card_def # 카드의 방어력 보정치를 취득
return (@note =~ /<카드 방어력s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def card_spi # 카드의 정신력 보정치를 취득
return (@note =~ /<카드 정신력s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def card_agi # 카드의 민첩성 보정치를 취득
return (@note =~ /<카드 민첩성s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def card_hit # 카드의 명중율 보정치를 취득
return (@note =~ /<카드 명중율s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def card_eva # 카드의 회피율 보정치를 취득
return (@note =~ /<카드 회피율s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def card_cri # 카드의 회심율 보정치를 취득
return (@note =~ /<카드 회심율s*=s*(-*d+)>/i ? $1. to_i : 0)
end
def header_name # 카드의 접두어를 취득
return (@note =~ /<접두어s*=s*(S+?)>/i ? $1 : "")
end
end
end
class BaseItemEx
attr_reader :level
attr_reader :durability
attr_reader :weight
attr_reader :plus_power
attr_reader :slot
attr_reader :slot_max
attr_reader :note
def initialize
# 개체 식별 넘버
@check_number = $game_system.item_check_number
$game_system.item_check_number += 1
# 레벨
@level = note =~ /<레벨s*=s*(d+)>/i ? $1. to_i : 1
# 강화치
@plus_power = 0
# 랜덤치
@atk = rand(rand(note =~ /<랜덤 공격력s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@def = rand(rand(note =~ /<랜덤 방어력s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@spi = rand(rand(note =~ /<랜덤 정신력s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@agi = rand(rand(note =~ /<랜덤 민첩성s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@hit = rand(rand(note =~ /<랜덤 명중율s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@eva = rand(rand(note =~ /<랜덤 회피율s*=s*(d+)>/i ? $1. to_i : 0) + 1)
@cri = rand(rand(note =~ /<랜덤 회심율s*=s*(d+)>/i ? $1. to_i : 0) + 1)
# 내구성
@durability = 100 + rand(rand(101) + 1)
# 슬롯
@slot = []
@slot_max = note =~ /<슬롯s*=s*(d+)>/i ? $1. to_i : 0
# 중량
@weight = note =~ /<중량s*=s*(d+)>/i ? $1. to_i : 10
# 메모
@note = note
end
def id # ID의 취득
return @original_item.id
end
def name # 이름의 취득
text = @original_item.name
unless @slot.empty? # 슬롯이 배고픔으로 없으면 카드의 접두어를 부가
dummy_slot = @slot.clone
while(dummy_slot.size > 0)
id = dummy_slot.shift
item = $data_items[id]
text = sprintf("%s %s", item.header_name , text)
n = 1
for i in 0...dummy_slot.size
if dummy_slot[i] == id
n += 1
dummy_slot[i] = nil
end
end
dummy_slot.compact!
case n
when 2; text = sprintf("더블 %s", text)
when 3; text = sprintf("트리플 %s", text)
when 4; text = sprintf("쿼드러플 %s", text)
end
end
end
text = sprintf("+%d %s", @plus_power , text) if @plus_power > 0 # 강화치
return text
end
def icon_index # 아이콘 인덱스의 취득
return @original_item.icon_index
end
def description # 설명의 취득
return @original_item.description
end
def note # 메모의 취득
return @original_item.note
end
def price # 가격의 취득
return @original_item.price
end
def atk # 공격 힘의 취득
n = @original_item.atk + @atk
n += @level * @plus_power if @main_param == "공격력"
for id in @slot do n += $data_items[id].card_atk end
return n
end
def def # 방어 힘의 취득
n = @original_item.def + @def
n += @level * @plus_power if @main_param == "방어력"
for id in @slot do n += $data_items[id].card_def end
return n
end
def spi # 정신력의 취득
n = @original_item.spi + @spi
n += @level * @plus_power if @main_param == "정신력"
for id in @slot do n += $data_items[id].card_spi end
return n
end
def agi # 민첩성의 취득
n = @original_item.agi + @agi
n += @level * @plus_power if @main_param == "민첩성"
for id in @slot do n += $data_items[id].card_agi end
return n
end
def hit # 명중율의 취득
n = @hit
n += @plus_power if @main_param == "명중율"
for id in @slot do n += $data_items[id].card_hit end
return n
end
def eva # 회피율의 취득
n = @eva
n += @plus_power if @main_param == "회피율"
for id in @slot do n += $data_items[id].card_eva end
return n
end
def cri # 회심율의 취득
n = @cri
n += @plus_power if @main_param == "회심율"
for id in @slot do n += $data_items[id].card_cri end
return n
end
def element_set # 속성 ID배열의 취득
result = @original_item.element_set.clone
for id in @slot
result = result + $data_items[id].element_set
end
return result.uniq
end
def state_set # 부가(방지) 스테이트 배열의 취득
result = @original_item.state_set.clone
for id in @slot
result = result + $data_items[id].plus_state_set
result = result - $data_items[id].minus_state_set
end
return result.uniq
end
def material_can_use? (item) # 지정한 아이템을 소재로서 적용할 수 있을까를 돌려준다
type = item.power_material?
if (@plus_power < 10) and (self.level == item.base_damage) and
(self.is_a?(WeaponEx) and type == 0) or
(self.is_a?(ArmorEx) and type == kind + 1)
return true
end
type = item.card_material?
if (@slot_max > @slot.size) and ((self.is_a?(WeaponEx) and type == 0) or
(self.is_a?(ArmorEx) and type == kind + 1))
return true
end
return false
end
def power_up # 강화
if rand(100) < @durability
@plus_power += 1
@durability -= 20
return true
end
return false
end
def card_set(item) # 카드 세트
@slot.push(item.id)
end
end
class WeaponEx < BaseItemEx
def initialize(weapon_id)
@original_item = $data_weapons[weapon_id]
super()
# 메인 파라미터
if note =~ /<성능 강화s*=s*(공격력|방어력|정신력|민첩성|명중율|회피율|회심율)>/i
@main_param = $1
else
@main_param = "공격력"
end
# 랜덤치
@atk = rand(rand(note =~ /<랜덤 공격력s*=s*(d+)>/i ? $1. to_i : 4) + 1)
end
def animation_id # 애니메이션 ID의 취득
return @original_item.animation_id
end
def hit # 명중율의 취득
return super + @original_item.hit
end
def two_handed # 양손 소유 플래그의 취득
return @original_item.two_handed
end
def fast_attack # 턴내 선제 플래그의 취득
return @original_item.fast_attack
end
def dual_attack # 연속 공격 플래그의 취득
return @original_item.dual_attack
end
def critical_bonus # 위기 빈발 플래그의 취득
return @original_item.critical_bonus
end
end
class ArmorEx < BaseItemEx
def initialize(armor_id)
@original_item = $data_armors[armor_id]
super()
# 메인 파라미터
if note =~ /<성능 강화s*=s*(공격력|방어력|정신력|민첩성|명중율|회피율|회심율)>/i
@main_param = $1
else
@main_param = "방어력"
end
# 랜덤치
@def = rand(rand(note =~ /<랜덤 방어력s*=s*(d+)>/i ? $1. to_i : 4) + 1)
end
def kind # 종별의 취득
return @original_item.kind
end
def eva # 회피율의 취득
return super + @original_item.eva
end
def prevent_critical # 위기 방지 플래그의 취득
return @original_item.prevent_critical
end
def half_mp_cost # 소비 MP반플래그의 취득
return @original_item.half_mp_cost
end
def double_exp_gain # 취득 경험치 2배 플래그의 취득
return @original_item.double_exp_gain
end
def auto_hp_recover # HP자동 회복 플래그의 취득
return @original_item.auto_hp_recover
end
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------------