# 合成済みフラグを格納するハッシュを作成
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 : アイテム
# flag : true..合成済み false..未合成
#--------------------------------------------------------------------------
def set_item_composed(item, flag = true)
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 # アイテム
@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 recipe_cleared?(item)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 判明フラグを格納するハッシュを作成
clear_recipe_cleared_flag if @item_recipe_cleared == nil
# 判定
case item
when RPG::Item # アイテム
return @item_recipe_cleared[item.id]
when RPG::Weapon # 武器
return @weapon_recipe_cleared[item.id]
when RPG::Armor # 防具
return @armor_recipe_cleared[item.id]
end
return false
end
#--------------------------------------------------------------------------
# ○ アイテムの判明フラグを設定
# item : アイテム
# flag : true..判明 false..未判明
#--------------------------------------------------------------------------
def set_recipe_cleared(item, flag = true)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 判明フラグを格納するハッシュを作成
clear_recipe_cleared_flag if @item_recipe_cleared == nil
# 判明フラグをセット
case item
when RPG::Item # アイテム
@item_recipe_cleared[item.id] = flag
when RPG::Weapon # 武器
@weapon_recipe_cleared[item.id] = flag
when RPG::Armor # 防具
@armor_recipe_cleared[item.id] = flag
end
end
#--------------------------------------------------------------------------
# ○ レシピ解禁判定
# item : アイテム
#--------------------------------------------------------------------------
def recipe_opened?(item)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 解禁フラグを格納するハッシュを作成
clear_recipe_opened_flag if @item_recipe_opened == nil
# 判定
case item
when RPG::Item # アイテム
return @item_recipe_opened[item.id]
when RPG::Weapon # 武器
return @weapon_recipe_opened[item.id]
when RPG::Armor # 防具
return @armor_recipe_opened[item.id]
end
return false
end
#--------------------------------------------------------------------------
# ○ アイテムの解禁フラグを設定
# item : アイテム
# flag : true..解禁 false..未解禁
#--------------------------------------------------------------------------
def set_recipe_opened(item, flag = true)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 解禁フラグを格納するハッシュを作成
clear_recipe_opened_flag if @item_recipe_opened == nil
# 解禁フラグをセット
case item
when RPG::Item # アイテム
@item_recipe_opened[item.id] = flag
when RPG::Weapon # 武器
@weapon_recipe_opened[item.id] = flag
when RPG::Armor # 防具
@armor_recipe_opened[item.id] = flag
end
end
#--------------------------------------------------------------------------
# ○ レシピ存在判定
# item : アイテム
#--------------------------------------------------------------------------
def recipe_exist?(item)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 存在フラグを格納するハッシュを作成
clear_recipe_exist_flag if @item_recipe_exist == nil
# 判定
case item
when RPG::Item # アイテム
return @item_recipe_exist[item.id]
when RPG::Weapon # 武器
return @weapon_recipe_exist[item.id]
when RPG::Armor # 防具
return @armor_recipe_exist[item.id]
end
return false
end
#--------------------------------------------------------------------------
# ○ アイテムの存在フラグを設定
# item : アイテム
# flag : true..存在 false..存在しない
#--------------------------------------------------------------------------
def set_recipe_exist(item, flag = true)
return false unless item.is_a?(RPG::BaseItem) # アイテム以外
return false unless item.is_compose? # 合成アイテム以外
# 存在フラグを格納するハッシュを作成
clear_recipe_exist_flag if @item_recipe_exist == nil
# 存在フラグをセット
case item
when RPG::Item # アイテム
@item_recipe_exist[item.id] = flag
when RPG::Weapon # 武器
@weapon_recipe_exist[item.id] = flag
when RPG::Armor # 防具
@armor_recipe_exist[item.id] = flag
end
end
#--------------------------------------------------------------------------
# ○ アイテム名マスク判定
# item : アイテム
#--------------------------------------------------------------------------
def item_name_mask?(item)
return false unless KGC::ComposeItem::MASK_UNKNOWN_RECIPE_NAME
return false if item_composed?(item) # 合成済み
return false if recipe_cleared?(item) # 判明済み
return true
end
#--------------------------------------------------------------------------
# ○ 素材非表示判定
# item : アイテム
#--------------------------------------------------------------------------
def item_compose_material_mask?(item)
return false unless KGC::ComposeItem::HIDE_UNKNOWN_RECIPE_MATERIAL
return false if item_composed?(item) # 合成済み
return false if recipe_cleared?(item) # 判明済み
return false if recipe_opened?(item) # 解禁済み
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::SHOW_COMPOSED_RECIPE
return true if $game_party.item_composed?(item)
end
# 判明 or 解禁 or 存在済みなら表示
exist_flag = $game_party.recipe_cleared?(item) ||
$game_party.recipe_opened?(item) || $game_party.recipe_exist?(item)
if KGC::ComposeItem::NEED_RECIPE_EXIST && exist_flag
return true
end
# 費用不足なら隠す
if KGC::ComposeItem::HIDE_SHORTAGE_COST
return false unless $game_party.item_compose_cost_satisfy?(item)
end
# 素材不足なら隠す
if KGC::ComposeItem::HIDE_SHORTAGE_MATERIAL
return false unless $game_party.item_compose_material_satisfy?(item)
end
if KGC::ComposeItem::NEED_RECIPE_EXIST
# 判明 or 解禁 or 存在していない
return false unless exist_flag
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)
if $game_party.item_name_mask?(item)
draw_masked_item_name(item, rect.x, rect.y, enable?(item))
else
draw_item_name(item, rect.x, rect.y, enable?(item))
end
# 費用を描画
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_name_mask?(item)
# アイテムが nil or マスクなしなら [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
@number_window.sell_flag = false
# コマンドウィンドウ非表示で 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 update_sell_selection
@number_window.sell_flag = true
super
end
#--------------------------------------------------------------------------
# ● 個数入力の決定
#--------------------------------------------------------------------------
def decide_number_input
if @command_window.index != 0 # 「合成する」以外
super
return
end