VX 스크립트

아이템
2010.07.02 22:01

아이템 믹서

조회 수 3986 추천 수 0 댓글 21
Atachment
첨부 '1'

제목이 내용입니다.

 

쓸 모 없는 아이템을 섞어서 새로운 아이템을 만듭니다.

 

(네이버 번역기로 돌려서 군데군데 어색한 문장이 있을 수 있습니다. 수정 가능하니 수정하시면 되겠습니다.)

 

출처 : http://hikimoki.hp.infoseek.co.jp/

 

#==============================================================================
# RGSS2_아이템 믹서
# tomoaky (http://hikimoki.hp.infoseek.co.jp/)
#
# 2010/03/01 공개
#
# 스크립트 에디터로 "▼ 소재" 아래 맞아에 삽입해 주세요.
#
# 이벤트 커멘드의 「스크립트」로
# $scene = Scene_ItemMixer.new
# (으)로 하면 아이템 믹서 씬에 이행 할 수 있습니다.
# 이른바 아이템 합성입니다만, 편성을 설정할 필요가 없고
# 재료로 지정한 아이템의 합계 파라미터에 가까운 아이템이
# 합성 결과적으로 자동 선택됩니다.
#
# 매우 사용하기 어려운 시스템입니다, 믹서를 위해서 아이템을
# 설정하지 않으면 터무니없음 차 마시기 내기인 아이템이 생성되어 버립니다.
#==============================================================================

#==============================================================================
# ■ 설정 항목
#==============================================================================
module TMIX
  # 사용 불가 아이템도 표시할지, false로 비표시
  # 표시하는 경우는 반투명 표시가 됩니다.
  UNUSABLE_INCLUDE = true

  # 믹스 할 수 있는 최대수를 설정하는 게임 변수 ID
  # 값이 1 이라면, 게임 변수 1 번의 값까지 동시에 아이템을 믹스 할 수 있습니다.
  VAR_MIX_MAX = 1

  # 재료에 사용한 아이템도 생성 후보로부터 제외하는, false로 제외하지 않는다
  # 제외하는 경우는, 재료와 같은 아이템이 생성되지 않게 됩니다.
  REMOVE_MATERIAL = true
  


  # 믹스수에 응한 마이너스 보정의 값(%)
  # 이 값이 5 의 경우, 2개 믹스로 성분 합계가―5%, 3개로―10%,
  # (와)과 같이 마이너스 보정되어서 갑니다, 최종적인 하한치는 원래의 값의10%입니다.

  MINUS_POINT = 5

# 재료로서 이용 가능할지의 플래그 초기치
  # 메모란에 재료 불가(or가능) 태그를 쓰지 않았던 경우는 이 값을 이용합니다.
  DEFAULT_MATERIAL_FLAG = true
 
# 생성품으로서 이용 가능할지의 플래그 초기치
  # 메모란에 생성 불가(or가능) 태그를 쓰지 않았던 경우는 이 값을 이용합니다.
  DEFAULT_MIX_FLAG = true
 
  # 속성과 스테이트의 영향력
  # 값이 큰 만큼 생성 결과가 속성(스테이트)에 좌우되기 쉬워집니다.
  ELEMENT_EFFECT = 30

  # 속성명의 설정
  ELEMENT_NAME = [
    "", "격", "참", "돌", "타", "궁", "편", "정", "흡",
    "염", "랭", "뢰", "수", "지", "풍", "성", "암"
  ]
 
  # 스테이트명의 설정
  STATE_NAME = [
    "", "사", "독", "암", "묵", "혼", "면", "마비", "스",
    "예", "경", "지", "속", "둔", "연", "우", "지"
  ]
end

module Sound
  # 믹스시에 재생하는 효과음
  def self.play_mix
    Audio.se_play("Audio/SE/Saint6.ogg", 80, 130)
  end
end

#==============================================================================
# ■ Window_MixerMessage
#==============================================================================
class Window_MixerMessage < Window_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize(item)
    text = sprintf("%s が完成した!", item.name)
    bitmap = Bitmap.new(16, 16)
    rect = bitmap.text_size(text)
    bitmap.dispose
    w = rect.width + 24 + 32
    super(272 - w / 2, 180, w, WLH + 32)
    draw_icon(item.icon_index, 0, 0)
    self.contents.draw_text(24, 0, rect.width, WLH, text)
    update
  end
end

#==============================================================================
# ■ Window_ItemMixerResult
#==============================================================================
class Window_ItemMixerResult < Window_Base
  #--------------------------------------------------------------------------
  # ● 定数
  #--------------------------------------------------------------------------
  WLH = 20                  # 행의 높이 기준치(Window Line Height)
  ATK       = 0
  DEF       = 1
  SPI       = 2
  AGI       = 3
  HIT       = 4
  EVA       = 5
  DAMAGE    = 6
  VARIANCE  = 7
  ATK_F     = 8
  SPI_F     = 9
  HP        = 10
  HP_RATE   = 11
  MP        = 12
  MP_RATE   = 13
  SPEED     = 14
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 56, 272, 360)
    @items = []
    @item_max = [$game_variables[TMIX::VAR_MIX_MAX], 2].max
    refresh
  end
#--------------------------------------------------------------------------
  # ● 재료 아이템을 하나 추가
  #--------------------------------------------------------------------------
  def add_item(item)
    return false if @items.size == @item_max  # 재료가 가득하면 종료
    @items.push(item)
    $game_party.lose_item(item, 1)        # 아이템을 소비
    return true
  end
  #--------------------------------------------------------------------------
  # ● 재료 아이템을 하나 캔슬
  #--------------------------------------------------------------------------
  def delete_item
    return false if @items.empty?         # 재료가 하늘이라면 종료
    $game_party.gain_item(@items.pop, 1)  # 아이템을 되돌린다
    return true
  end
  #--------------------------------------------------------------------------
  # ● 믹스 가능한 상태인지 어떤지를 돌려준다
  #--------------------------------------------------------------------------
  def valid?
    return (@items.size >= 2)
  end
  #--------------------------------------------------------------------------
  # ● 믹스의 실행
  #--------------------------------------------------------------------------
  def execute_mix
    d = 9999999
    for item in $data_items + $data_weapons + $data_armors
      next if item == nil
      next unless item.mix?
      next if TMIX::REMOVE_MATERIAL and @items.include?(item)
      n = 0
      if item.is_a?(RPG::Item)
        n += (@status[HP] - item.hp_recovery).abs
        n += (@status[HP_RATE] - item.hp_recovery_rate).abs
        n += (@status[MP] - item.mp_recovery).abs
        n += (@status[MP_RATE] - item.mp_recovery_rate).abs
        n += (@status[DAMAGE] - item.base_damage).abs
        n += (@status[VARIANCE] - item.variance).abs
        n += (@status[ATK_F] - item.atk_f).abs
        n += (@status[SPI_F] - item.spi_f).abs
        n += (@status[SPEED] - item.speed).abs
        for i in ATK..EVA do n += @status[i].abs end
        n -= (@state_set & item.plus_state_set).size * TMIX::ELEMENT_EFFECT
        n -= (@state_set & item.minus_state_set).size * TMIX::ELEMENT_EFFECT
      else
        for i in DAMAGE..SPEED do n += @status[i].abs end
        n += (@status[ATK] - item.atk).abs
        n += (@status[DEF] - item.def).abs
        n += (@status[SPI] - item.spi).abs
        n += (@status[AGI] - item.agi).abs
        n -= (@state_set & item.state_set).size * TMIX::ELEMENT_EFFECT
        if item.is_a?(RPG::Weapon)
          n += (@status[HIT] - item.hit).abs
          n += @status[EVA].abs
        else
          n += @status[HIT].abs
          n += (@status[EVA] - item.eva).abs
        end
      end
      n -= (@element_set & item.element_set).size * TMIX::ELEMENT_EFFECT
      if n < d
        d = n
        result = item
      end
    end
$game_party.gain_item(result, 1)  # 완성품을 입수
    @items = []                       # 재료를 하늘에 되돌린다
    return result
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    update_status       # 成分の合計値を計算
    self.contents.clear
    self.contents.font.size = 16
    self.contents.font.color = system_color
    self.contents.draw_text(0,   WLH * 0 + 24, 36, WLH, "공격")
    self.contents.draw_text(120, WLH * 0 + 24, 36, WLH, "방어")
    self.contents.draw_text(0,   WLH * 1 + 24, 36, WLH, "정신")
    self.contents.draw_text(120, WLH * 1 + 24, 36, WLH, "민첩")
    self.contents.draw_text(0,   WLH * 2 + 24, 36, WLH, "명중")
    self.contents.draw_text(120, WLH * 2 + 24, 36, WLH, "회피")
    self.contents.draw_text(0,   WLH * 3 + 24, 36, WLH, "데미지")
    self.contents.draw_text(120, WLH * 3 + 24, 36, WLH, "분산")
    self.contents.draw_text(0,   WLH * 4 + 24, 36, WLH, "HP")
    self.contents.draw_text(120, WLH * 4 + 24, 36, WLH, "MP")
    self.contents.draw_text(0,   WLH * 5 + 24, 36, WLH, "속성")
    self.contents.draw_text(0,   WLH * 6 + 24, 36, WLH, "스테이트")
    self.contents.font.color = normal_color
    for i in ATK..VARIANCE
      x = i % 2 * 120
      y = i / 2 * WLH + 24
      self.contents.draw_text(x, y, 112, WLH, @status[i], 2)
    end
    text = sprintf("%d + %d%", @status[HP], @status[HP_RATE])
    self.contents.draw_text(0,   WLH * 4 + 24, 112, WLH, text, 2)
    text = sprintf("%d + %d%", @status[MP], @status[MP_RATE])
    self.contents.draw_text(120, WLH * 4 + 24, 112, WLH, text, 2)
    text = ""
    for id in @element_set do text += TMIX::ELEMENT_NAME[id] end
    self.contents.draw_text(0, WLH * 5 + 24, 232, WLH, text, 2)
    text = ""
    for id in @state_set do text += TMIX::STATE_NAME[id] end
    self.contents.draw_text(0, WLH * 6 + 24, 232, WLH, text, 2)
    for i in 0...@item_max
      text = @items[i] == nil ? "----" : @items[i].name
      self.contents.draw_text(i % 2 * 120, i / 2 * WLH + 216, 112, WLH, text)
    end
    self.contents.font.size = 20
    self.contents.draw_text(0, 0, 240, WLH, "완성품의 성분 예상")
    self.contents.draw_text(0, 192, 240, WLH, "재료")
  end
  #--------------------------------------------------------------------------
  # ● 성분의 합계치를 계산
  #--------------------------------------------------------------------------
  def update_status
    @status = Table.new(32)
    @element_set = []
    @state_set = []
    for item in @items
      if item.is_a?(RPG::Item)
        @status[HP] += item.hp_recovery
        @status[HP_RATE] += item.hp_recovery_rate
        @status[MP] += item.mp_recovery
        @status[MP_RATE] += item.mp_recovery_rate
        @status[DAMAGE] += item.base_damage
        @status[VARIANCE] += item.variance
        @status[ATK_F] += item.atk_f
        @status[SPI_F] += item.spi_f
        @status[SPEED] += item.speed
        @state_set += item.plus_state_set
        @state_set += item.minus_state_set
      else
        @status[ATK] += item.atk
        @status[DEF] += item.def
        @status[SPI] += item.spi
        @status[AGI] += item.agi
        @state_set += item.state_set
        if item.is_a?(RPG::Weapon)
          @status[HIT] += item.hit
        else
          @status[EVA] += item.eva
        end
      end
      @element_set += item.element_set
    end
    @element_set.uniq!
    @state_set.uniq!
    n = [100 - (TMIX::MINUS_POINT * (@items.size - 1)), 10].max # 마이너스 보정치
    for i in 0...@status.xsize do @status[i] = @status[i] * n / 100 end
  end
end

#==============================================================================
# ■ Window_ItemMixer
#==============================================================================
class Window_ItemMixer < Window_Item
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @column_max = 1
    self.index = 0
    @item = 0   # おまじない
    refresh
  end
  #--------------------------------------------------------------------------
# ● 선택중의 아이템을 재료로서 사용할 수 있을 것인지 어떤지를 돌려준다
  #     item : 아이템
  #--------------------------------------------------------------------------
  def valid?(item)
    return false if item == nil
    return false if item.price == 0                     # 가격이 0 이라면 무효
    return item.mix_material?
  end
  #--------------------------------------------------------------------------
# ● 아이템을 리스트에 포함할지
  #     item : 아이템
  #--------------------------------------------------------------------------
  def include?(item)
    return false if item == nil
    return true if TMIX::UNUSABLE_INCLUDE
    return valid?(item)
  end
  #--------------------------------------------------------------------------
  # ● 아이템을 허가 상태로 표시할지
  #     item : 아이템
  #--------------------------------------------------------------------------
  def enable?(item)
    return valid?(item)
  end
end

#==============================================================================
# ■ Scene_ItemMixer
#==============================================================================
class Scene_ItemMixer < Scene_Base
  #--------------------------------------------------------------------------
# ● 오브젝트 초기화
  #     from_event : 이벤트로 불려 간 플래그
  #--------------------------------------------------------------------------
  def initialize(from_event = true)
    @from_event = from_event
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
#--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @help_window = Window_Help.new
    @item_window = Window_ItemMixer.new(272, 56, 272, 360)
    @item_window.help_window = @help_window
    @item_window.active = true
    @status_window = Window_ItemMixerResult.new
    @command_window = Window_Command.new(240, ["아이템을 생성한다", "캔슬"])
    @command_window.visible = false
    @command_window.active = false
    @command_window.x = 152
    @command_window.y = 180
  end
  #--------------------------------------------------------------------------
  # ● 종료 처리
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    @help_window.dispose
    @item_window.dispose
    @status_window.dispose
    @command_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 원래의 화면에 돌아온다
  #--------------------------------------------------------------------------
  def return_scene
    if @from_event
      $scene = Scene_Map.new
    else
      $scene = Scene_Menu.new(0)    # 이 인수가 메뉴 커멘드의 인덱스
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    @help_window.update
    @item_window.update
    @status_window.update
    @command_window.update
    if @message_window != nil
      update_message_selection
    elsif @item_window.active
      update_item_selection
    elsif @command_window.active
      update_command_selection
    end
  end
  #--------------------------------------------------------------------------
  # ● 아이템 선택의 갱신
  #--------------------------------------------------------------------------
  def update_item_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      if @status_window.delete_item
        @item_window.refresh
        @status_window.refresh
      else            # 재료가 하늘이라면 씬을 빠진다
        return_scene
      end
    elsif Input.trigger?(Input::C)
      if @item_window.valid?(@item_window.item)
        Sound.play_decision
        if @status_window.add_item(@item_window.item)
          @item_window.refresh
          @status_window.refresh
        else          # 재료가 가득하면 커멘드 윈도우를 연다
          @item_window.active = false
          @command_window.active = true
          @command_window.visible = true
          @command_window.index = 1
        end
      else
        Sound.play_buzzer
      end
    elsif Input.trigger?(Input::A)
      if @status_window.valid?    # 믹스 가능하면 커멘드 윈도우를 연다
        Sound.play_decision
        @item_window.active = false
        @command_window.active = true
        @command_window.visible = true
        @command_window.index = 1
      else
        Sound.play_buzzer
      end
    end
  end
  #--------------------------------------------------------------------------
# ● 커멘드 선택의 갱신
  #--------------------------------------------------------------------------
  def update_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @item_window.active = true
      @command_window.active = false
      @command_window.visible = false
    elsif Input.trigger?(Input::C)
      if @command_window.index == 0
        Sound.play_decision
        item = @status_window.execute_mix   # 믹스의 실행
        @item_window.refresh
        @status_window.refresh
        Sound.play_mix
        @message_window = Window_MixerMessage.new(item)
      else
        Sound.play_cancel
        @item_window.active = true
      end
      @command_window.active = false
      @command_window.visible = false
    end
  end
  #--------------------------------------------------------------------------
  # ● 메세지 표시중의 갱신
  #--------------------------------------------------------------------------
  def update_message_selection
    if Input.trigger?(Input::B) or Input.trigger?(Input::C)
      Sound.play_decision
      @message_window.dispose
      @message_window = nil
      @item_window.active = true
    end
  end
end

#==============================================================================
# ■ BaseItem
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
  # ● 믹스의 생성품으로서 이용할지를 돌려준다
  #--------------------------------------------------------------------------
  def mix?
    if @mix_flag == nil
      if @note =~ /<믹서 생성>/i
        @mix_flag = true
      elsif @note =~ /<믹서 생성 불가>/i
        @mix_flag = false
      else
        @mix_flag = TMIX::DEFAULT_MIX_FLAG
      end
    end
    return @mix_flag
  end
  #--------------------------------------------------------------------------
  # ● 믹스의 재료로서 이용할지를 돌려준다
  #--------------------------------------------------------------------------
  def mix_material?
    if @mix_material_flag == nil
      if @note =~ /<믹서 재료>/i
        @mix_material_flag = true
      elsif @note =~ /<믹서 재료 불가>/i
        @mix_material_flag = false
      else
        @mix_material_flag = TMIX::DEFAULT_MATERIAL_FLAG
      end
    end
    return @mix_material_flag
  end
end

 

--------

 


Comment '21'
  • ?
    카이온 2010.07.02 22:57

    사용하긴 어렵지만  사용할줄만 께달으면 매우  좋은 스크립트네요...

  • ?
    WinHouse 2010.07.03 14:37

    좋은 스크립트네요!

  • ?
    나이트퓨리 2010.07.08 17:25

    잘쓰겠습니다~

  • ?
    배군 2010.07.09 13:00

    무작위로 새로운아이템이 만들어지는건가요?

  • ?
    배군 2010.07.12 22:02

    예상한 대로군요. 예상외로 사용법도 꽤 쉽네요.

    뭐 이런건 제 게임엔 적용하기 어렵겠네요 ㅎㅎ. 나중에 새로운 게임 만들때 도입해 볼까? ㅋㅋ 언제 될까 ㅋㅋ.

  • ?
    미양 2010.07.10 09:00

    데이터 베이스의 아이템들 중 무작위로 하나가 나오는 것입니다.

  • profile
    여름의지배자 2010.07.17 16:16

    어려워보이는게 뭔지;;;

  • profile
    로타로리 2010.07.19 22:19

    음... 아이템 믹서기의 개념을 깨닫고...

    다운 받겠습니다...ㄷㄷ

  • ?
    jeda 2010.07.20 10:59

    조, 좋은 믹서기다..;;;

  • ?
    알피지매니아스 2010.07.21 11:44

    좋네요

  • ?
    뒹구르르 2010.07.22 11:07

    재밌네요.

  • ?
    둑배기 2010.07.22 15:38

    그런데 데이터베이스중에 무작위로 하나면 엄청난 아이템이 나올수도 있겠네요.

    퀘스트로만 얻을수있는 아이템도 나올수있다는..

  • ?
    이상한드링크 2010.07.30 12:41

    쓰는 법을 모르겠어요 ㅠ

  • ?
    이상한드링크 2010.08.06 19:45

    저거 스크립트 어디서부터 복사 해야 하나요? ㅠ

  • ?
    미양 2010.07.30 14:22

    이벤트 커맨드란, 문장의 표시와 같은 이벤트의 처리를 나타내는 클래스입니다.

     

    3번째 란을 보시면 스크립트라는 창이 있는데, 그것을 클릭하셔서 $scene = Scene_ItemMixer.new를 입력하시면 스크립트 효과를 볼 수 있습니다.

  • ?
    환영유카 2010.08.06 09:42

    나중에 쓰고싶네요...

  • ?
    리버스듀크 2010.08.20 01:26

    쓰기 어렵지만 좋은스크립트네요 ㅎ

  • ?
    시옷청룡 2010.11.19 22:10

    대박이군요;;

  • profile
    빠삐코선장 2011.04.15 16:56

    무작위로 말고 특정아이템끼리 하면 특정아이템끼리 나오게 할순 없나요?

    포션이랑 하이포션을 섞으면 풀포션이 나오게 한다든지...

  • profile
    빠삐코선장 2011.04.26 19:07

    역시...이벤트겠죠ㅠㅠㅠ


  • ?
    짐작 2011.04.18 17:41

    값을 설정해 주면 문제 없을 듯 합니다.

     

    예를 들어서, 포션에 1속성을, 하이포션에 2속성을, 풀포션에는 1,2 속성을 둘 다 넣습니다.

    그렇게 되면 포션과 하이포션을 섞었을 때 100%로 풀포션이 나오겠죠. 하지만 이건 속성이 많아지기 때문에 보기에 안좋습니다.

     

    한가지 방법이 더 있긴 합니다만, 이건 포션, 하이포션, 풀포션에 전부 1속성을 넣은 후 조합을 하는겁니다.

    이렇게 되면 포션, 하이포션, 풀포션의 확률이 분할되어 조합되겠지요. 하지만 이 방법을 쓰면 정확도가 낮아지기 때문에 1속성이 들어간 아이템들이 낮은 확률이지만 출현하기도 합니다.

     

    게임을 만드는 데 있어서 가장 좋은 방법은 이벤트로 만드는 겁니다. 스크립트는 단지 도와줄 뿐 ㅠ


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 3 습작 2012.12.24 5430
16 아이템 현재있는 파티원 선택 레벨업 아이템 만들기 1 file 싸패 2016.06.06 723
15 아이템 드롭 아이템 확장 6 신규회원 2012.02.24 2981
14 아이템 아이템 무게, 아이템별 소지수 적용 16 file 허걱 2010.11.11 2984
» 아이템 아이템 믹서 21 file 미양 2010.07.02 3986
12 아이템 아이템의 공격횟수 추가 8 star211 2010.01.19 2414
11 아이템 레벨,능력치,아이템소지갯수,소지금의 한계돌파스크립트 21 file 이탁 2009.01.28 4549
10 아이템 아이템 획득 팝업 스크립트 24 아방스 2009.01.07 3806
9 아이템 Item Price Changer 7 Man... 2008.10.28 1532
8 아이템 아이템 프라이스 체인저?? Man... 2008.10.28 2389
7 아이템 ~[Hide Item]~ Man... 2008.10.27 1599
6 아이템 아이템 분류 19 file RPGbooster 2008.10.11 3310
5 아이템 적과 만나지않는 아이템 12 file RPGbooster 2008.10.11 2718
4 아이템 편리한 디자인의 아이템메뉴 30 file RPGbooster 2008.10.11 5102
3 아이템 돈 아이템 장비를저장 11 file RPGbooster 2008.10.11 3455
2 아이템 아이템입수 화면 16 file RPGbooster 2008.10.08 4528
1 아이템 KGC]아이템 합성 29 file 찌나 2008.03.08 5127
Board Pagination Prev 1 Next
/ 1