#==============================================================================
# ■ 多货币系统·金银铜
# 新增两种货币类型,通过变量控制商店使用的货币
# 变量ID=10控制货币类型(0=金币,1=银币,2=铜币)
# 灵狐阁主(刘飞洋)制作
# 货币操作脚本命令:
# - 金币:$game_party.gain_gold(数量) # 正数增加,负数减少
# - 银币:$game_party.gain_sliver(数量) # 正数增加,负数减少
# - 铜币:$game_party.gain_copper(数量) # 正数增加,负数减少
#==============================================================================
#==============================================================================
# ■ Game_Party
# 新增银币和铜币的属性及相关方法
#==============================================================================
class Game_Party
# 新增银币和铜币的读取器
attr_reader :sliver # 银币
attr_reader :copper # 铜币
#--------------------------------------------------------------------------
# ● 初始化对象(重写)
#--------------------------------------------------------------------------
alias original_initialize initialize
def initialize
original_initialize
@sliver = 0 # 新增:银币
@copper = 0 # 新增:铜币
end
#--------------------------------------------------------------------------
# ● 增加银币
# n : 数量(正数增加,负数减少)
#--------------------------------------------------------------------------
def gain_sliver(n)
@sliver = [[@sliver + n, 0].max, 9999999].min
end
#--------------------------------------------------------------------------
# ● 减少银币
# n : 数量
#--------------------------------------------------------------------------
def lose_sliver(n)
gain_sliver(-n)
end
#--------------------------------------------------------------------------
# ● 增加铜币
# n : 数量(正数增加,负数减少)
#--------------------------------------------------------------------------
def gain_copper(n)
@copper = [[@copper + n, 0].max, 9999999].min
end
#--------------------------------------------------------------------------
# ● 减少铜币
# n : 数量
#--------------------------------------------------------------------------
def lose_copper(n)
gain_copper(-n)
end
#--------------------------------------------------------------------------
# ● 获取当前活跃货币数量
#--------------------------------------------------------------------------
def current_currency
case $game_variables[10] # 变量10控制货币类型
when 1 then @sliver
when 2 then @copper
else @gold # 默认金币
end
end
#--------------------------------------------------------------------------
# ● 获取当前活跃货币名称
#--------------------------------------------------------------------------
def current_currency_name
case $game_variables[10]
when 1 then "银币" # 银币名称
when 2 then "铜币" # 铜币名称
else $data_system.words.gold # 原版金币名称
end
end
#--------------------------------------------------------------------------
# ● 减少当前活跃货币
# n : 数量
#--------------------------------------------------------------------------
def lose_current_currency(n)
case $game_variables[10]
when 1 then lose_sliver(n)
when 2 then lose_copper(n)
else lose_gold(n)
end
end
#--------------------------------------------------------------------------
# ● 增加当前活跃货币
# n : 数量
#--------------------------------------------------------------------------
def gain_current_currency(n)
case $game_variables[10]
when 1 then gain_sliver(n)
when 2 then gain_copper(n)
else gain_gold(n)
end
end
end
#==============================================================================
# ■ Window_Gold
# 修改金钱窗口以显示当前活跃货币
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● 刷新(重写)
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# 获取当前货币名称和数量
currency_name = $game_party.current_currency_name
amount = $game_party.current_currency
cx = contents.text_size(currency_name).width
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 120 - cx - 2, 32, amount.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(124 - cx, 0, cx, 32, currency_name, 2)
end
end
#==============================================================================
# ■ Window_ShopBuy
# 修改商店购买窗口显示当前货币
#==============================================================================
class Window_ShopBuy < Window_Selectable
#--------------------------------------------------------------------------
# ● 绘制项目(重写)
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
if item.price <= 0 or number == 99
self.contents.font.color = disabled_color
else
self.contents.font.color = normal_color
end
x = 4
y = index * 32
rect = Rect.new(x, y, self.width - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
# 显示价格和当前货币
currency_name = $game_party.current_currency_name
self.contents.draw_text(x + 240, y, 88, 32, item.price.to_s + " " + currency_name, 2)
end
end
#==============================================================================
# ■ Window_ShopNumber
# 修改数量选择窗口显示当前货币
#==============================================================================
class Window_ShopNumber < Window_Base
#--------------------------------------------------------------------------
# ● 设置(重写)
# item : 物品
# max : 最大数量
# price : 单价
#--------------------------------------------------------------------------
def set(item, max, price)
@item = item
@max = max
@price = price
@number = 1
currency_name = $game_party.current_currency_name
refresh
end
#--------------------------------------------------------------------------
# ● 刷新(重写)
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# 绘制物品名称
draw_item_name(@item, 4, 0)
# 绘制数量输入
self.contents.font.color = normal_color
self.contents.draw_text(272, 0, 32, 32, "×", 1)
self.contents.draw_text(304, 0, 24, 32, @number.to_s, 2)
# 绘制总价和当前货币
currency_name = $game_party.current_currency_name
total = @price * @number
self.contents.font.color = system_color
self.contents.draw_text(4, 32, 120, 32, "总计", 0)
self.contents.font.color = normal_color
self.contents.draw_text(124, 32, 160, 32, total.to_s + " " + currency_name, 2)
end
end
#==============================================================================
# ■ Scene_Shop
# 修改商店场景以支持多货币交易
#==============================================================================
class Scene_Shop
#--------------------------------------------------------------------------
# ● 刷新画面 (购买窗口激活的情况下)(修改)
#--------------------------------------------------------------------------
def update_buy
@status_window.item = @buy_window.item
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
@command_window.active = true
@dummy_window.visible = true
@buy_window.active = false
@buy_window.visible = false
@status_window.visible = false
@status_window.item = nil
@help_window.set_text("")
return
end
if Input.trigger?(Input::C)
@item = @buy_window.item
# 检查物品有效性和当前货币是否足够
if @item == nil or @item.price > $game_party.current_currency
$game_system.se_play($data_system.buzzer_se)
return
end
# 获取物品持有数量
case @item
when RPG::Item; number = $game_party.item_number(@item.id)
when RPG::Weapon; number = $game_party.weapon_number(@item.id)
when RPG::Armor; number = $game_party.armor_number(@item.id)
end
if number == 99
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
# 计算最大购买数量(基于当前货币)
max = @item.price == 0 ? 99 : $game_party.current_currency / @item.price
max = [max, 99 - number].min
@buy_window.active = false
@buy_window.visible = false
@number_window.set(@item, max, @item.price)
@number_window.active = true
@number_window.visible = true
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (个数输入窗口激活的情况下)(修改)
#--------------------------------------------------------------------------
def update_number
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
@number_window.active = false
@number_window.visible = false
case @command_window.index
when 0
@buy_window.active = true
@buy_window.visible = true
when 1
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
end
return
end
if Input.trigger?(Input::C)
$game_system.se_play($data_system.shop_se)
@number_window.active = false
@number_window.visible = false
case @command_window.index
when 0 # 购买处理(使用当前货币)
total_price = @number_window.number * @item.price
$game_party.lose_current_currency(total_price)
case @item
when RPG::Item; $game_party.gain_item(@item.id, @number_window.number)
when RPG::Weapon; $game_party.gain_weapon(@item.id, @number_window.number)
when RPG::Armor; $game_party.gain_armor(@item.id, @number_window.number)
end
@gold_window.refresh
@buy_window.refresh
@status_window.refresh
@buy_window.active = true
@buy_window.visible = true
when 1 # 卖出处理(获得当前货币)
total_price = @number_window.number * (@item.price / 2)
$game_party.gain_current_currency(total_price)
case @item
when RPG::Item; $game_party.lose_item(@item.id, @number_window.number)
when RPG::Weapon; $game_party.lose_weapon(@item.id, @number_window.number)
when RPG::Armor; $game_party.lose_armor(@item.id, @number_window.number)
end
@gold_window.refresh
@sell_window.refresh
@status_window.refresh
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
end
return
end
end
end