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
477 HUD 아이콘 그리기 7 file 허걱 2009.08.20 4441
476 기타 아이디를 띄우기 20 12345678 2011.11.07 4626
475 HUD 아방스님이 올린 HUD를 개조했습니다. 7 file 스리아씨 2013.09.30 2683
474 HUD 심플한 맵 이름 띄우기 53 file RPGbooster 2008.10.08 6862
473 타이틀/게임오버 심플한 게임오버화면 28 file RPGbooster 2008.10.08 3328
472 심플하게 메뉴 띄우기 25 file RPGbooster 2008.10.08 3864
471 기타 심플 마우스 시스템 1.5 애드온 11 file RMdude 2009.02.11 4325
470 기타 시야범위 스크립트 18 file 좀비사냥꾼 2009.03.19 4047
469 기타 시야범위 스크립트 22 file 카르와푸딩의아틀리에 2009.06.30 4025
468 메뉴 시스템 옵션 스크립트의 사용방법 6 아방스 2009.06.04 2832
467 스텟포인트 배분하기 88 file RPGbooster 2008.10.08 6637
466 메뉴 스테이터스 화면 개조 - 커스텀 버전 13 file 훈덕 2009.06.15 4932
465 메뉴 스테이터스 창을 멋있게 쿨하게~!전신을 보여주자. 24 file 할렘 2009.02.06 6236
464 액터 스탯 시스탬 29 츠키아 2008.08.08 4214
463 메뉴 스타일 크로노 트리거 메뉴 31 file 콩밥 2010.07.19 4536
462 상점 스킬합성 상점 스크립트 23 file 미얼 2009.10.29 4498
461 스킬장착 시스템 17 file RPGbooster 2008.10.11 3585
460 장비 스킬습득장비 [죄송] 19 file RPGbooster 2008.10.11 4049
459 스킬분류 16 file RPGbooster 2008.10.11 2833
458 스킬 스킬북으로 스킬 레벨업!, 'SW_BookSkill' by SiotWarrior(재수정) 21 file 시옷전사 2011.05.15 2817
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