VX 스크립트

우시로미야 리온 님 덕분에 SRPG2 스크립트를 구했습니다.

( 사실 버전 2.0이 나온 줄도 몰랐어요;;; 이 자리를 빌어 다시 한번 감사드립니다. 우시로미야 리온님 ///ㅅ///)

이게 일어 판이라서 우리들의 친구 이X트X스의 도움을 얻어 주석파트를 열심히 번역 중이었습니다.

사실 제가 조금 대학원 일때문에 바빠서 구한건 10월 3일인데 한글화를 오늘 다했네요;;;; 번역기 작업이라서

어색한 부분 같은 곳을 많이 수정해야하지만요;;

 

이식 작업하고 예제 파일 작업만 하고 일단 번역한 원본을 여기 올려 보렵니다...

지금 이 글은 그 이야기는 아니고;;

 

카드 슬롯 시스템의 사용예시.JPG

 

번역하던 와중에 거기 끼어있는 이 스크립트를 발견했습니다. 고로 이 스크립트는 펌이 되겠습니다...

꽤 괜찮더라고요. 제목 그대로 카드 슬롯 장비 스크립트 입니다. 장비 강화와 카드 슬롯 장비의 기능을 갖고 있습니다.

일단 화면부터 설명하면 레벨은 무기레벨입니다 ( 라그를 생각하시면 될것 같네요. ) 레벨마다 다른 강화석이 필요하고

레벨이 높은 무기는 강화 효과가 강해집니다. 내구도는 강화 한계입니다. 한번 강화할때마다 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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

출처 :  http://hikimoki.sakura.ne.jp/html/srpg2.html

Who's 아이미르

?

허루쿠... 임용고시 공부해야되는데 이러고 있다....

 

알만툴의 중독성은 쩔어준다는;;;

Comment '18'
  • profile
    습작 2011.10.13 20:51

    최신버전 3 아닌가요?

    3에서 장비 레벨 스크립트가 동봉되어 있었던 기억이 있습니다.

  • ?
    아이미르 2011.10.13 21:01

    최신버전이 3이었군요... 일어 사이트라서 뭐가 뭔지 몰라서 가르쳐준 사이트만 들어가서 잘 몰랐네요... 하는 김에 3도 찾아볼까...

  • ?
    Bluesky(新) 2011.10.15 18:56

    몇가지 질문 드릴게요.

    1. 최대 강화 수치 한계치

    ( 최대 몇 까지 강화가 가능한가요? )

    2. 단숨에 강화 올리기

    + 6. + 7 강화석 사용시 0에서 +6. +7 등.. 한번에 강화 수치을 올리는 방법

  • ?
    Bluesky(新) 2011.10.15 19:27

    그럼 그 부분을 수정 하면 강화가 더 올라갈수도 있겠군요.. 후훗..

    답변 감사합니다. 다른 스크립트들도 기대 할테니 빨리 다음 스크립트 올려주세요!

  • ?
    아이미르 2011.10.15 19:14

    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
    에 보면 @plus_power < 10 부분이 있습니다. 즉 강화 한계는 10까지 입니다.

     

    일단 이 스크립트는 단숨에 강화를 올리는 부분을 지원하지 않고 있는 것 같네요.. 차근차근 살펴봤는데 그런 부분이 안보입니다 (긁적)

  • profile
    미니♂ban♀ 2011.10.16 18:47

    이거 스크립트간의 충돌이 너무 심하네요.

    KGC_EquipExtension <-- 우선 장비 늘리는 스크립트가 충돌이 일어나구요.

    KGC_CategorizeItem<-- 아이템 분류 스크립트는 쓸쑤가 없는듯 충돌이 일어나네요.

    시옷전사님의 SW_EchantScroll<--장비 강화 스크립트랑 SW_BookSkill<-- 스킬샾 배우기 스크립트는 충돌이 심해서 위치를 잘 잡아야 충돌이 그나마 적어지구요.

    그리고 이 스크립트 자체가 스크립트 간의 충돌에 뒤엉켜서 이 스크립트도 충돌도 일어나네요.

  • ?
    아이미르 2011.10.18 08:26

    에... 제 능력으로는 무리입니다... 사실 저도 이걸 그냥 소개만 한거지 ... 이걸 고칠 능력이 없답니다.

     

    안타까운 현실이네요 (먼산)

  • ?
    manikjw 2011.11.09 13:22

    이거 혹시 데모버전은 없나요? 스크립트만으로는 잘 이해가 안되서;

    강화석 아이템은 어떻게 구해서 어떻게 강화하고 카드슬롯 시스템도

    잘 이해가 안되는데 부가설명이나 플레이할 데모버전이라도 좀 올려주셨으면 (굽신굽신)

  • ?
    아이미르 2011.11.09 19:32

    메일 주소 남겨주세요

  • ?
    만능태도 2012.06.22 16:18

    이대로는 사용이 불가능 ㅠㅠ 수정해줘야 합니다. 아마 번역기 돌리는 과정에서 잘못된듯.

     

    \ 이것들이 대부분 빠져있어 명령어를 인식을 못하네요. 수정중에 있습니다 ㅎ

  • ?
    만능태도 2012.06.22 16:20

    또한 랜덤옵션의 경우 강화석 자체에 부여되는 기능이 아닌 무기에 부여되는 기능임을 테스트를 통해 확인했습니다.

     

    즉, 강화석을 통해 특정 능력치를 올려주고 싶으면 스크립트 최하단 부분을 직접 수정해야 합니다.

     

    또한 속성치의 부여도 강화석을 통해서는 할 수 없습니다. (스크립트 문제인듯, 번역과정에서)

     

    즉, 강화석으로는 오로지 공/방 만 올라가게 되어있습니다.

    (스크립트에 관련 내용은 있는데 다른 옵션의 경우 상향이 되질 않는군요. 즉 번역과정에서 \ 빠진것처럼 다른 수식들이 좀 빠진것같습니다.)

    수정해보려고 했는데 말을 안듣네요 ㄷㄷ...

  • ?
    만능태도 2012.06.22 16:29

    카드로 부여하는 속성이나 능력치는 정상적으로 반영되나, 강화석의 경우 해당 강화의 공/방만 반영되고 있는것을 확인했습니다.

    아마 마지막 문단에 있는

     

    <성능강화 = 성능> 이 명령어가 말을 안듣는거 같네요.

  • ?
    만능태도 2012.06.22 16:36

    성능강화 오류 원인을 찾아냈습니다.

    무기/방어구 등에 성능강화를 써주고 해당 성능강화가 씌여 있는 아이템에 강화석을 사용할 경우 해당 스텟이 증가함을 확인했습니다.

     

    즉, 아이템 자체에 강화성능을 써주어야 하며, 강화석에 따른 아이템 성능강화는 불가합니다. (스크립트를 수정하지 않는한)

  • ?
    김능지 2012.07.07 21:12
    카드나 강화석을 만들 때 그냥 포션처럼 일회용으로 만들어서 메모만 넣어주면 되나요?
    그런데 무기 메모에 슬롯을 추가해도 아이템 정보를 보면 슬롯이 없는데.. 왜 이러는거죠?..
    혹시 데모파일 있으시다면 주실 수 있으신가요.. ㅠㅠ
  • profile
    빙하 2012.11.07 15:09
    무기에 슬롯을 넣을수가 없어요.....
    어떻게 된걸까요오.....
  • profile
    빙하 2012.11.07 15:44
    아무리 해도 <슬롯 = n>명령어가 안먹혀서 아예 모든 아이템 기본 슬롯을 0이상으로 고쳐버린....
  • ?
    아이미르 2012.11.10 22:20
    vx에서 손땐지 오래되서 기억이 안나네요... 하다못해 원본이라도 있으면 올려드릴 텐데...;;; 자료가 증발했습니다... 에휴...
  • profile
    빙하 2012.11.11 20:24
    원인 발견!
    원인은 [\]문자가 몽땅 실종되었었기 때문입니다아!

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 5452
577 전투 XAS Hero Edition VX 15 Alkaid 2011.12.28 4237
576 변수/스위치 Etude87_Variables_VX 1 file 습작 2011.11.26 2611
575 기타 아이디를 띄우기 20 12345678 2011.11.07 4629
574 전투 Animated Battlers VX 3.5 by DerVVulfman 2 Alkaid 2011.11.02 3102
573 스킬 Yanfly Engine RD - Custom Dmg Formulas (커스텀 데미지, 관계도) 6 file communnn 2011.10.25 3377
572 스킬 Yanfly Engine RD - Display Skill Query (스킬 상세 정보) 8 file communnn 2011.10.24 3405
571 기타 Kylock1.2+(RMDude-Kylock1.5) Time System Script 4 file communnn 2011.10.20 2597
570 전투 VX SRPG3d 수정본(1) 12 아이미르 2011.10.19 4621
569 스킬 스킬, 아이템 적아 구분 없이 쓰기 10 file EuclidE 2011.10.16 2901
568 전투 VX SRPG3d(한글번역) 8 file 아이미르 2011.10.15 5040
» 장비 카드 슬롯 장비 스크립트 18 file 아이미르 2011.10.13 4135
566 스킬 Simple Sort Inventory 2.0 by cozziekuns 1 file Alkaid 2011.09.29 2352
565 맵/타일 Roguelike Random Dungeon Generator 2.0 by cozziekuns 4 file Alkaid 2011.09.29 2563
564 메시지 HG_POP_TEXT (맵 화면에 문자 표시) 4 file 허걱 2011.09.16 3590
563 파티 파티원이 따라다니는 스크립트 11 file 놀러 2011.09.15 3988
562 기타 [XP / VX 공용] rand() 함수 확장 스크립트 4 허걱 2011.09.13 2365
561 전투 VX SRPG 스크립트를 수정해봤습니다(8) - 누적수정 30 아이미르 2011.09.09 3917
560 장비 초보적인 장비레벨 개념 스크립트 - 수정 및 덤 9 아이미르 2011.09.06 2659
559 기타 여러스크립트(목적은 포인트) 12 file 인생은 힘들다. 2011.08.26 3090
558 스킬 SW_BookSkill && EchantScroll(상호충돌수정버전) 6 시옷전사 2011.08.22 1758
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 32 Next
/ 32