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
497 메시지 얼굴표시 9 허걱 2009.09.23 5001
496 상태/속성 어떤 상태일때에만 사용가능한 스킬 14 file 좀비사냥꾼 2009.03.25 3266
495 메시지 어드밴스 텍스트 시스템 13 file 카르와푸딩의아틀리에 2009.06.30 4918
494 기타 액터선택지제작 간편화 스크립트 7 Evangelista 2009.02.26 4082
493 액알 스크립트 33 츠키아 2008.08.11 5826
492 버그픽스 애니메이션 표시 위치 수정 (Fix Animation Position) 2 file AltusZeon 2014.02.12 1288
491 기타 앞에있는 이벤트 아이디 찾기 6 허걱 2009.08.21 2091
490 기타 아키루냥님 요청 스크립트(자작) 4 file Last H 2009.02.22 2754
489 아이템 아이템입수 화면 16 file RPGbooster 2008.10.08 4526
488 아이템 아이템의 공격횟수 추가 8 star211 2010.01.19 2413
487 이름입력 아이템, 장비, 스킬 이름 색깔 바꾸기 14 까까까 2011.03.04 3732
486 아이템 아이템 획득 팝업 스크립트 24 아방스 2009.01.07 3805
485 아이템 아이템 프라이스 체인저?? Man... 2008.10.28 2385
484 장비 아이템 장비시 스킬습득, 'SW_EquipFinisher' by Siot Warrior 19 file 시옷전사 2010.08.31 3029
483 이름입력 아이템 이름을 내마음대로 정하자! name_changer 1.0v 26 file Last H 2009.02.25 4067
482 이름입력 아이템 이름 바꾸기 버전 (헤르코스님의 한글 입력) 7 Last H 2009.12.20 2722
481 아이템 아이템 분류 19 file RPGbooster 2008.10.11 3309
» 아이템 아이템 믹서 21 file 미양 2010.07.02 3983
479 아이템 아이템 무게, 아이템별 소지수 적용 16 file 허걱 2010.11.11 2981
478 기타 아이콘 캐릭터 17 file 허걱 2010.02.28 4224
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