VX 스크립트

아이템
2010.07.02 22:01

아이템 믹서

조회 수 3983 추천 수 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 5398
66 메뉴 KGC - 커스텀 메뉴 커멘드 (번역) 1 듀란테 2015.07.27 1078
65 메뉴 Etude87's Menu Editor for VX 25 습작 2015.01.14 1461
64 메뉴 Etude87_Ace_Style_Formation_Change ver.1.01 습작 2014.10.05 758
63 HUD 아방스님이 올린 HUD를 개조했습니다. 7 file 스리아씨 2013.09.30 2684
62 아이템 드롭 아이템 확장 6 신규회원 2012.02.24 2977
61 전투 VX SRPG3d 수정본(1) 12 아이미르 2011.10.19 4617
60 전투 VX SRPG 스크립트를 살짝 손대봤습니다. 13 아이미르 2011.03.31 3428
59 메뉴 기본메인 메뉴 아이콘 추가 10 아방스 2010.12.11 4573
58 전투 사이드 뷰 시스템 [시트르산님 제공] 56 아방스 2010.11.29 7499
57 메뉴 kgc 파라미터 배분 09/07/25 13 시트르산 2010.09.24 2327
56 기타 집안의 가구를 내마음대로 데코레이션하기 15 file EuclidE 2010.09.18 4303
55 기타 みんと씨의 RMVX 샘플 프로젝트 1.11 (2009-11-05) 6 Alkaid 2010.09.13 2005
54 맵/타일 맵상 캐릭터 그래픽 확대 / 축소 이벤트 스크립트 6 시트르산 2010.09.10 3023
53 상태/속성 Full Status CMS 1.0d by Modern Algebra 1 file Alkaid 2010.09.03 2408
52 메뉴 자작 메뉴 스크립트 for VX(L's Simple Custom Menu VX ver.) 5 Alkaid 2010.09.02 4705
51 기타 개인판타지메뉴+업그래이드 배틀 23 file 콩밥 2010.08.02 4211
50 메뉴 스타일 크로노 트리거 메뉴 31 file 콩밥 2010.07.19 4536
» 아이템 아이템 믹서 21 file 미양 2010.07.02 3983
48 메뉴 매우 간단명료한 메뉴. 32 file 비극ㆍ 2010.04.23 6619
47 기타 메뉴에서 애니매이션 사용! 12 비극ㆍ 2010.04.19 3022
Board Pagination Prev 1 2 3 4 Next
/ 4