# 合成済みフラグを格納するハッシュを作成
clear_composed_flag if @item_composed == nil
# 合成済みフラグをセット
case item
when RPG::Item # アイテム
@item_composed[item.id] = flag
when RPG::Weapon # 武器
@weapon_composed[item.id] = flag
when RPG::Armor # 防具
@armor_composed[item.id] = flag
end
end
#--------------------------------------------------------------------------
# ○ アイテムの合成済み判定
# item : アイテム
#--------------------------------------------------------------------------
def item_composed?(item)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 合成済みフラグを格納するハッシュを作成
clear_composed_flag if @item_composed == nil
# 合成済み判定
case item
when RPG::Item # アイテム
return @item_composed[item.id]
when RPG::Weapon # 武器
return @weapon_composed[item.id]
when RPG::Armor # 防具
return @armor_composed[item.id]
end
return false
end
#--------------------------------------------------------------------------
# ○ アイテムの合成可能判定
# item : アイテム
#--------------------------------------------------------------------------
def item_can_compose?(item)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外は不可
return false unless item.is_compose? # 合成アイテム以外は不可
return false if gold < item.compose_cost # 資金不足なら不可
item.compose_materials.each { |material|
num = item_number(material.item)
# 素材不足なら不可
return false if num < material.number || num == 0
}
return true
end
#--------------------------------------------------------------------------
# ○ アイテムの合成可能数を取得
# item : アイテム
#--------------------------------------------------------------------------
def number_of_composable(item)
return 0 unless item.is_a?(RPG::BaseItem) # アイテム以外
return 0 unless item.is_compose? # 合成アイテム以外
number = ($imported["LimitBreak"] ? item.number_limit : 99)
if item.compose_cost > 0
number = [number, gold / item.compose_cost].min
end
# 素材数判定
item.compose_materials.each { |material|
next if material.number == 0 # 必要数 0 は無視
n = item_number(material.item) / material.number
number = [number, n].min
}
return number
end
end
class Window_ComposeItem < Window_ShopBuy
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
@data = []
for goods_item in @shop_goods
case goods_item[0]
when 0
item = $data_items[goods_item[1]]
when 1
item = $data_weapons[goods_item[1]]
when 2
item = $data_armors[goods_item[1]]
end
# 合成アイテムのみ追加
@data.push(item) if include?(item)
end
@item_max = @data.size
create_contents
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# ○ アイテムをリストに含めるかどうか
# item : アイテム
#--------------------------------------------------------------------------
def include?(item)
return false if item == nil # アイテムが nil なら含めない
return false unless item.is_compose? # 合成アイテムでなければ含めない
if KGC::ComposeItem::HIDE_SHORTAGE_RECIPE # 費用・素材不足を隠す場合
if !$game_party.item_composed?(item) && !enable?(item)
return false # 未合成かつ合成不可なら含めない
end
end
return true
end
#--------------------------------------------------------------------------
# ○ アイテムを許可状態で表示するかどうか
# item : アイテム
#--------------------------------------------------------------------------
def enable?(item)
return $game_party.item_can_compose?(item)
end
#--------------------------------------------------------------------------
# ● 項目の描画
# index : 項目番号
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
number = $game_party.item_number(item)
limit = ($imported["LimitBreak"] ? item.number_limit : 99)
rect = item_rect(index)
self.contents.clear_rect(rect)
draw_compose_item_name(item, rect.x, rect.y, enable?(item))
# 費用を描画
if !KGC::ComposeItem::HIDE_ZERO_COST || item.compose_cost > 0
rect.width -= 4
self.contents.draw_text(rect, item.compose_cost, 2)
end
end
if KGC::ComposeItem::HIDE_UNKNOWN_RECIPE_HELP
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
item = (index >= 0 ? @data[index] : nil)
if item == nil || $game_party.item_composed?(item)
# アイテムが nil か、合成済みなら [Window_ShopBuy] に任せる
super
else
@help_window.set_text(KGC::ComposeItem::UNKNOWN_RECIPE_HELP)
end
end
end
end
# コマンドウィンドウ非表示の場合、合成ウィンドウに切り替え
if KGC::ComposeItem::HIDE_COMMAND_WINDOW
@command_window.active = false
@dummy_window.visible = false
@buy_window.active = true
@buy_window.visible = true
@buy_window.update_help
@status_window.visible = true
@status_window.item = @buy_window.item
end
end
#--------------------------------------------------------------------------
# ● コマンドウィンドウの作成
#--------------------------------------------------------------------------
def create_command_window
s1 = Vocab::ComposeItem
s2 = Vocab::ShopSell
s3 = Vocab::ShopCancel
@command_window = Window_Command.new(384, [s1, s2, s3], 3)
@command_window.y = 56
if $game_temp.shop_purchase_only
@command_window.draw_item(1, false)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if KGC::ComposeItem::SWITCH_INFO_BUTTON != nil &&
Input.trigger?(KGC::ComposeItem::SWITCH_INFO_BUTTON)
Sound.play_cursor
@status_window.change_mode
end
end
#--------------------------------------------------------------------------
# ● 購入アイテム選択の更新
#--------------------------------------------------------------------------
def update_buy_selection
# コマンドウィンドウ非表示で B ボタンが押された場合
if KGC::ComposeItem::HIDE_COMMAND_WINDOW && Input.trigger?(Input::B)
Sound.play_cancel
$scene = Scene_Map.new
return
end
@status_window.item = @buy_window.item
if Input.trigger?(Input::C)
@item = @buy_window.item
# アイテムが無効なら選択不可
if @item == nil
Sound.play_buzzer
return
end
# 合成不可能 or 限界数まで所持している場合は選択不可
number = $game_party.item_number(@item)
limit = ($imported["LimitBreak"] ? @item.number_limit : 99)
if !$game_party.item_can_compose?(@item) || number == limit
Sound.play_buzzer
return
end
# 個数入力に切り替え
Sound.play_decision
max = $game_party.number_of_composable(@item)
max = [max, limit - number].min
@buy_window.active = false
@buy_window.visible = false
@number_window.set(@item, max, @item.compose_cost)
@number_window.active = true
@number_window.visible = true
return
end
super
end
#--------------------------------------------------------------------------
# ● 個数入力の決定
#--------------------------------------------------------------------------
def decide_number_input
if @command_window.index != 0 # 「合成する」以外
super
return
end
Sound.play_shop
@number_window.active = false
@number_window.visible = false
# 合成処理
operation_compose
@gold_window.refresh
@buy_window.refresh
@status_window.refresh
@buy_window.active = true
@buy_window.visible = true
end
#--------------------------------------------------------------------------
# ○ 合成の処理
#--------------------------------------------------------------------------
def operation_compose
$game_party.lose_gold(@number_window.number * @item.compose_cost)
if rand(10) > 1 # 3/5左右吧。。数学不好。。自己改
$game_party.gain_item(@item, @number_window.number)
compose_ok = true
else
compose_ok = false
t_window = Window_Base.new((640-200)/2,128,200,56)
t_window.contents = Bitmap.new( t_window.width - 32, t_window.height - 32)
t_window.contents.draw_text(0,0,208,24,"合成失败:")
t_window.opacity = 160
# 停顿 2/3秒
for i in 0..40
Graphics.update
end
# 淡出
for i in 0..30
t_window.opacity -= 30
t_window.contents_opacity -= 30
Graphics.update
end
t_window.dispose
end
# 素材を減らす
@item.compose_materials.each { |material|
$game_party.lose_item(material.item,
material.number * @number_window.number)
}
# 合成済みにする
$game_party.set_item_composed(@item,compose_ok)
end
end