查看: 1304|回复: 0

[原创发布] 新手写的一个多货币商店脚本

[复制链接]
梦石
0
星屑
677
在线时间
509 小时
注册时间
2011-4-25
回帖
155
发表于 2025-8-27 18:49:40 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 刘飞洋 于 2025-8-27 19:08 编辑

通过十号变量来切换商店显示的货币,本脚本还解决了其他第二货币脚本的buG,就是商店购买商品时会显示系统货币的BUG。
这是示意图片

捕获.PNG
捕获2.PNG
下面是脚本,新手写的,可能有点繁琐,大家可以提出自己的意见。
[pre lang="ruby"]#==============================================================================
# ■ 多货币系统·金银铜
#  新增两种货币类型,通过变量控制商店使用的货币
#  变量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
    [/pre]

后面我在研究怎么魔改菜单的货币窗口,目前的情况是,如果那个十号变量没有归零,菜单的货币窗口显示的是第三或第二货币。
我下一步要考虑的是,要不把游戏时间和步数窗口废掉,直接竖排显示三种货币,实际上可以魔改扩充更多货币,这只是个思路。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部