아이템

아이템 믹서

by 미양 posted Jul 02, 2010
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

제목이 내용입니다.

 

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

 

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

 

출처 : 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

 

--------