コード: 全て選択
#==============================================================================
# ■ 白の魔様 アイテム合成 拡張 ver1.02
#------------------------------------------------------------------------------
# 白の魔様のアイテム合成スクリプトを拡張します
# 本家スクリプトよりも下に導入してください
#==============================================================================
#--------------------------------------------------------------------------
# ★追加機能
# ・装備中の武器/防具も合成対象に含まれるように改変
# ・装備中のキャラクターを順にフェード表示
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# ★仕様
# ・装備中の素材とそうでない素材が両方存在する場合は装備していない素材を
# 優先して消費する
# ・装備中キャラが複数存在する場合はパーティの先頭から順に装備を外される
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# ★改変箇所(再定義なので念のため記述)
# ・合成実行時に装備チェック&装備中なら外す処理を追加
# ・合成可能かの判定を装備もチェックしてから行う
# ・素材の個数が足りているかを装備からもチェック
# ・素材総数を装備から足して計算するように改変
# ・これらの改変に合わせアイテム名やアイコン描画処理も改変
# ・キャラクターグラフィックを縮小、半透明で描画する処理を追加
# ・アイコンとキャラグラを交互に表示するためにupdateを改変
# ・最大合成可能個数を計算する処理に装備チェックを追加
# (何個合成するかを入力するウインドウで必要)
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# ★更新履歴
# 1.01: 二刀流等、同じ装備を複数個所に装備している場合に
# 正しく処理されない不具合を修正
# 1.02: 装備解除処理で必要以上に装備を外してしまう事がある
不具合を修正
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# ★設定項目
# ・FADE_SPEED => キャラ表示の切り替え速度
# ・DRAW_E => キャラグラの左上にEを表示するか
#--------------------------------------------------------------------------
class Window_ItemSynthesisMaterial < Window_Base
FADE_SPEED = 5
DRAW_E = true
end
class Scene_ItemSynthesis < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 合成の実行
#--------------------------------------------------------------------------
def do_syntetic(number)
$game_party.lose_gold(number * buying_price)
$game_party.gain_item(@item, number)
@recipe = @list_window.recipe(@item)
for i in 1...@recipe.size
kind = @recipe[i][0]
id = @recipe[i][1]
num = @recipe[i][2]
if kind == "I"
item = $data_items[id]
elsif kind == "W"
item = $data_weapons[id]
elsif kind == "A"
item = $data_armors[id]
end
check_and_unequip(item,num*number)
$game_party.lose_item(item, num*number)
end
end
#--------------------------------------------------------------------------
# ● 装備解除が必要か判定し、必要なら解除
#--------------------------------------------------------------------------
def check_and_unequip(item,consume_amount)
required_number = consume_amount - $game_party.item_number(item)
return if required_number <= 0
count = 0
$game_party.members.each do |actor|
actor.equips.count(item).times do
slot_id = actor.equips.index(item)
actor.change_equip(slot_id,nil)
count += 1
break if count >= required_number
end
break if count >= required_number
end
end
#--------------------------------------------------------------------------
# ● 最大購入可能個数の取得
#--------------------------------------------------------------------------
def max_buy
max = $game_party.max_item_number(@item) - $game_party.item_number(@item)
@recipe = @list_window.recipe(@item)
for i in 1...@recipe.size
equipping_char = 0
kind = @recipe[i][0]
id = @recipe[i][1]
num = @recipe[i][2]
if kind == "I"
item = $data_items[id]
elsif kind == "W"
item = $data_weapons[id]
elsif kind == "A"
item = $data_armors[id]
end
$game_party.members.each do |actor|
next if item.nil?
equipping_char += actor.equips.count(item)
end
if num > 0
max_buf = ($game_party.item_number(item)+equipping_char) / num
else
max_buf = 999
end
max = [max, max_buf].min
end
buying_price == 0 ? max : [max, money / buying_price].min
end
end
class Window_ItemSynthesisList < Window_Selectable
#--------------------------------------------------------------------------
# ● アイテムを許可状態で表示するかどうか
#--------------------------------------------------------------------------
def have_mat?(recipe)
flag = true
if @money >= recipe[0]
for i in 1...recipe.size
kind = recipe[i][0]
id = recipe[i][1]
num = recipe[i][2]
if kind == "I"
item = $data_items[id]
elsif kind == "W"
item = $data_weapons[id]
elsif kind == "A"
item = $data_armors[id]
end
if $game_party.item_number(item) < [num, 1].max
equip_count = 0
$game_party.members.each do |actor|
equip_count += actor.equips.count(item)
end
flag = false if equip_count + $game_party.item_number(item) < [num, 1].max
end
end
else
flag = false
end
return flag
end
end
class Window_ItemSynthesisMaterial < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super(x, y, width, height)
@item = nil
@outward = true
@opacity = 255
refresh
end
#--------------------------------------------------------------------------
# ● アイテムの設定
#--------------------------------------------------------------------------
def set(item, recipe)
@item = item
@recipe = recipe
@make_number = 1
set_char_list
refresh
end
#--------------------------------------------------------------------------
# ● 装備中キャラリストを作成
#--------------------------------------------------------------------------
def set_char_list
return if @recipe.nil?
@char_list = []
@char_index = [-1]
@equipping_count = [{}]
@recipe.each do |r|
@char_index << -1
@char_list << []
if r[0] == "I"
item = $data_items[r[1]]
elsif r[0] == "W"
item = $data_weapons[r[1]]
elsif r[0] == "A"
item = $data_armors[r[1]]
end
next if !r.is_a?(Array)
@equipping_count << {}
$game_party.members.each do |actor|
@equipping_count.last[actor.id] = 0
next if item.nil?
if actor.equips.include?(item)
@char_list.last << actor.id
@equipping_count.last[actor.id] += actor.equips.count(item)
end
end
end
end
#--------------------------------------------------------------------------
# ● アイテム名の描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_item_name(item, x, y, enabled = true, width = 172)
return unless item
if @char_list[@recipe_index].empty? || @char_index[@recipe_index] == -1
draw_icon(item.icon_index, x, y, enabled)
else
draw_character(@char_list[@recipe_index][@char_index[@recipe_index]], x, y,enabled)
end
change_color(normal_color, enabled)
draw_text(x + 24, y, width, line_height, item.name)
end
#--------------------------------------------------------------------------
# ● アイコンの描画
# enabled : 有効フラグ。false のとき半透明で描画
#--------------------------------------------------------------------------
def draw_icon(icon_index, x, y, enabled = true)
bitmap = Cache.system("Iconset")
rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
opacity = @opacity
opacity = 128 if opacity > 128 && !enabled
if @char_list[@recipe_index].empty?
contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
else
contents.blt(x, y, bitmap, rect, opacity)
end
end
#--------------------------------------------------------------------------
# ● キャラクターの描画(透明度と拡大率の追加)
#--------------------------------------------------------------------------
def draw_character(id, x, y,enabled)
character_name = $game_actors[id].character_name
character_index = $game_actors[id].character_index
bitmap = Cache.character(character_name)
sign = character_name[/^[\!\$\~]./]
if sign && sign.include?('$')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
n = character_index
src_rect = Rect.new((n % 4 * 3 + 1) * cw, (n / 4 * 4) * ch, cw, ch)
opacity = @opacity
opacity = 128 if opacity > 128 && !enabled
# 透明度と拡大率を適用して描画
#self.contents.blt(x, y - ch, bitmap, src_rect, @opacity)
self.contents.stretch_blt(
Rect.new(x-2, y+22 - (ch * 0.75).to_i, (cw * 0.75).to_i, (ch * 0.75).to_i),
bitmap,
src_rect,
opacity
)
change_color(Color.new(150,255,100,opacity))
if DRAW_E
x2 = x
@equipping_count[@recipe_index][id].times do
draw_text(x2, y-8, width, line_height, "E")
x2 += 8
end
end
end
#--------------------------------------------------------------------------
# ● 素材情報の描画
#--------------------------------------------------------------------------
def draw_material_info(x, y)
rect = Rect.new(x, y, contents.width, line_height)
change_color(system_color)
contents.font.size = 18
draw_text(rect, "必要素材", 0)
if @recipe
for i in 1...@recipe.size
@recipe_index = i
kind = @recipe[i][0]
id = @recipe[i][1]
num = @recipe[i][2]
if kind == "I"
item = $data_items[id]
elsif kind == "W"
item = $data_weapons[id]
elsif kind == "A"
item = $data_armors[id]
end
item_number = item_number_total(num,item)
rect = Rect.new(x, y + line_height*i, contents.width, line_height)
enabled = true
enabled = false if [num*@make_number, 1].max > item_number
draw_item_name(item, rect.x, rect.y, enabled)
change_color(normal_color, enabled)
if num > 0
draw_text(rect, "#{num*@make_number}/#{item_number}", 2)
end
end
end
change_color(normal_color)
contents.font.size = 24
end
#--------------------------------------------------------------------------
# ● 素材総数を返す
#--------------------------------------------------------------------------
def item_number_total(num,item)
sum = @equipping_count[@recipe_index].values.inject(:+)
$game_party.item_number(item) + sum
end
#--------------------------------------------------------------------------
# ● 表示キャラ切り替え
#--------------------------------------------------------------------------
def change_char_index
for n in 1 ... @recipe.size
@char_index[n] == @char_list[n].size - 1 ? @char_index[n] = -1 : @char_index[n] += 1
end
end
#--------------------------------------------------------------------------
# ● 更新
#--------------------------------------------------------------------------
def update
super
return if !visible
if @outward
@opacity -= FADE_SPEED
if @opacity <= 0
@outward = false
change_char_index
end
else
@opacity += FADE_SPEED
@outward = true if @opacity >= 255
end
refresh
end
end