제목이 내용입니다.
쓸 모 없는 아이템을 섞어서 새로운 아이템을 만듭니다.
(네이버 번역기로 돌려서 군데군데 어색한 문장이 있을 수 있습니다. 수정 가능하니 수정하시면 되겠습니다.)
출처 : 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
--------