RMXP

아이템선택창에 지정한 아이템만 표시되도록 하기

by 하진 posted Aug 31, 2012
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
아방스 스크립트게시판에도 올라온 LEPIN님의
'아이템 선택 시스템'의 일부 개조를 시도하고 있는데요... 막혀버려서 질문 올립니다.

이 스크립트의 원래 기능은 Scene을 호출해 아이템 선택창을 띄우고, 아이템을 선택하면 해당아이템 ID를 지정변수에다 받는 겁니다.

그런데 원래대로라면, 가지고 있는 모든 아이템이 표시되지만 (메뉴의 아이템창과 마찬가지로)
제가 필요한 기능은... 일부 지정한 아이템들 중에서만, 소유중이면 표시되도록 하는 거거든요.
(목록에 뜰 대상을 소유중인 전체아이템 → 소유중인 일부 지정아이템으로)


활용하려는 상황은 이렇습니다.
예1) 보석상에게 소유중인 패물을 처분하려고 할 때, 보석상에게 말을 걸면 아이템선택창(Scene)을 호출,
이 창에서는 소유중인 아이템 중 패물들(스크립트에서 지정해둔 아이템들)만 표시되어, 패물들 중에서만 선택할 수 있도록 하는 겁니다.
(잡다구리한 무기, 방어구, 물약 등등은 뜨지 않고요)

예2) 펫에게 먹이를 주려고 할 때, 먹이선택창(Scene)을 호출,
이 창에서는 소유중인 아이템 중 먹이들(스크립트에서 지정해둔 아이템들)만 표시되어, 먹이가 되는 아이템 중에서만 선택할 수 있고요.

물론 선택한 다음에는, 받은 변수값에 따라 각 이벤트내용 전개하고요...



(사실 방법을 생각해보니
  1. 아이템을 item / weapon / armor로 구분하듯이 따로 구분을 하나 더 만들거나 ('food'라든가 'gem'이라든가)
  2. 아니면 '아이템선택창' 스크립트에서 표시할 아이템을 지정하거나
  둘 중 하나일 것 같았는데요.
  후자쪽이 비교적 간단하고...안전할 것 같아서요.)

일단 수정해야 할 부분은, 아이템을 표시하는 부분(분홍색글씨)인 것 같은데...
어떻게 고쳐야 할 지가...

특정아이템 소유 여부로 따지기 위해
if $game_party.item_number(70) >= 1 (ID:70번 아이템을 1개 이상 갖고 있는가?)
이 구문을 활용해야겠다 생각까지는 들었는데요.
for i in...이라든가...? item = @data[index] 라든가...?? 이런 부분을... 못 알아먹겠으니....... 손을 못 대겠네요.

어떻게 수정되어야 구현이 될 지, 조언을 좀 부탁드립니다.



(이하 스크립트 일부)

class Window_Item_Select < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 640, 416)
    @column_max = 2
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 아이템의 취득
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # 아이템을 추가
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    # 항목수가 0 이 아니면 비트 맵을 작성해, 전항목을 묘화
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
   #--------------------------------------------------------------------------
  # ● 항목의 묘화
  #     index : 항목 번호
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    self.contents.font.color = normal_color
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end



* 지금 스크립트게시판에 있는 원문 스크립트(http://avangs.info/rgss_xp/249354 이거)의 경우, 중간에 작은 오타(?) 때문에 오류가 납니다. 일단 저는 어떻게 수정해서 고쳐놨는데...
  LEPIN님의 허가가 있으면, 차후 수정된 스크립트 전문을 스크립트게시판에 올릴 수 있을지 모르겠네요.