Project1

标题: 自定义多货币脚本(4/5 更新) [打印本页]

作者: 雪流星    时间: 2008-3-12 19:30
标题: 自定义多货币脚本(4/5 更新)
自定义多货币脚本

翻译脚本翻的很累,休息的时候写的

自定义多种货币,可以互相兑换(兑换後自动取整)
在商店介面可以选择用哪一种货币购买

顺便增强了金钱窗口

应求增加让物品只能用特定货币购买的功能

使用脚本:
gain_currency(类型, 数量)增加金钱
lose_currency(类型, 数量)减少金钱
convert(类型, 变量ID)将该变量内的数值转换为该类型并返回
currency_type(类型, 变量ID)将该类型货币金额代入该变量

在物品(武器、防具亦可,技能尚未测试)的备注栏打上
<currency 类型>
则该物品只能使用该类型货币购买

在物品(武器、防具亦可,技能尚未测试)的备注栏打上
<n_currency 类型>
则该物品只能使用该类型以外的货币购买

两个同时定义时,会互相抵销
(例如:同一个物品同时定义了<currency 1> 和<n_currency 1>
也就是同时「只能使用1号货币」和「只能除用除1号以外的货币」
那麽就变成了全部都能使用)

类型为数字代号,就是在脚本中所设定好的顺序
0为默认金钱(直接用事件命令就行了)

☆只能用特定货币购买的商店 设定方法
    在召唤商店画面的NPC事件指令内容使用:
   
    脚本:$special_currency = n # <== n 为货币类型
    商店处理:商品列表
    脚本:call_new_shop
   
    设定後,该商店的「货币选择」选项无效

3/13更新部分:
1. 设置可以选择是否在菜单中显示新的金钱窗口
2. 更新在选择必须用特定货币购买时,在右侧窗口显示
3. 加强文字设定部分,方便脚本新手修改
4. 具体设置请看脚本中注释

3/14更新部分:
1. 可以设置多重购买货币
2. 新增「无法使用的货币」选项
3. 新增「无法显示的货币」选项

之所以加上那两个看似蛇足的功能,是为了能够让大家完成更加华丽的效果
例如无法使用的货币可以用来做「存款」的效果
    无法显示的货币也可以用来做一些隐藏式的货币

4/5更新部分:
1. 修改了物品可使用货币判断BUG
2. 更新功能:只能用特定货币购买的商店画面
3. 修改货币标签辨识符,用[ ] 代替 < >。

  1. module Currency
  2. #==============================================================================
  3. #                            设定部分
  4. #==============================================================================

  5.   # 货币名称 -- 在金钱窗口里使用
  6.   @name = ["金",   "银",   "币",   "款",   "汇"]
  7.   
  8.   
  9.   # 货币名称 -- 在商店里选择时使用
  10.   @iname =["金币", "银币", "铜币", "存款", "汇票"]
  11.   
  12.   
  13.   # 货币汇率 -- 计算价钱用
  14.   @rate = [ 1,     0.5,    0.25,   1,      1]
  15.   
  16.   # 无法使用的货币
  17.   @cannot_use =  [3, 4]
  18.   
  19.   # 不在金钱窗口显示的货币
  20.   @do_not_show = [4]
  21.   
  22.   # 货币文字 -- 商店画面选项理所显示的文字
  23.   def self.word
  24.     return "选择货币"
  25.   end
  26.    
  27.   # 只能用特定货币购买时显示的文字
  28.     # %s代表该货币
  29.   One_Currency = "只能用%s来购买!"
  30.   
  31.   
  32.   # 金钱窗口设置:是否在菜单显示新的金钱窗口
  33.   SHOW_NEW_CURRENCY = true
  34.   
  35. #==============================================================================
  36. #  设定部分结束
  37. #==============================================================================
  38. #==============================================================================
  39. #                            使用方法
  40. #==============================================================================
  41. =begin
  42.   在事件中使用脚本:
  43.     gain_currency(类型, 数量)增加该类型货币
  44.     lose_currency(类型, 数量)减少该类型货币
  45.    
  46.     convert(类型, 变量ID) 将该变量内的数值转换为该类型并返回
  47.     currency_type(类型, 变量ID) 将该类型货币金额代入该变量

  48.     在物品(武器、防具亦可,技能尚未测试)的备注栏打上
  49.               [currency 类型]
  50.     则该物品只能使用该类型货币购买

  51.     在物品(武器、防具亦可,技能尚未测试)的备注栏打上
  52.               [n_currency 类型]
  53.     则该物品只能使用该类型以外的货币购买

  54.     两个同时定义时,会互相抵销
  55.     (例如:同一个物品同时定义了[currency 1] 和[n_currency 1]
  56.       也就是同时「只能使用1号货币」和「只能除用除1号以外的货币」
  57.       那麽就变成了全部都能使用)

  58.     类型为数字代号,就是在脚本中所设定好的顺序(从0开始算)
  59.     0为默认金钱(直接用事件命令就行了)
  60.    
  61.     ☆只能用特定货币购买的商店 设定方法
  62.     在召唤商店画面的NPC事件指令内容使用:
  63.    
  64.     脚本:$special_currency = n # <== n 为货币类型
  65.     商店处理:商品列表
  66.     脚本:call_new_shop
  67.    
  68.     设定後,该商店的「货币选择」选项无效
  69.    
  70. =end
  71. #==============================================================================
  72. #  使用方法结束
  73. #==============================================================================
  74.   attr_accessor :name
  75.   attr_accessor :rate
  76.   def self.get_g_rate(i)
  77.     if  $game_party.gold != 0
  78.       p = @rate[i] * $game_party.gold
  79.       return p.to_i == 0? 1 : p.to_i
  80.     else
  81.       return 0
  82.     end
  83.   end
  84.   def self.get_n_rate(i, number)
  85.     if  number != 0
  86.       p = @rate[i] * number
  87.       return p.to_i == 0? 1 : p.to_i
  88.     else
  89.       return 0
  90.     end
  91.   end
  92.   def self.number
  93.     return @name.size
  94.   end
  95.   def self.name(i)
  96.     return @name[i]
  97.   end
  98.   def self.id(i)
  99.     return @iname[i]
  100.   end
  101.   def self.show?(id)
  102.     return !(@do_not_show.include?(id))
  103.   end
  104.   def self.can_use?(id, item=nil)
  105.     return false if @cannot_use.include?(id)
  106.     unless item == nil
  107.       if item.get_currency_use != nil
  108.         return true if item.get_currency_use.include?(id)
  109.       elsif item.get_currency_not_use != nil
  110.         return false if item.get_currency_not_use.include?(id)
  111.       else return true
  112.       end
  113.     else return true
  114.     end
  115.   end
  116. end
  117. class Game_Party < Game_Unit
  118.   attr_accessor   :curr
  119.   alias c_ini initialize
  120.   def initialize
  121.     c_ini
  122.     @curr = []
  123.     for i in 0...Currency.number
  124.       if @curr[i] == nil
  125.         @curr[i] = 0
  126.       end
  127.     end
  128.     @curr[0] = @gold
  129.   end
  130.   # 获得和失去金钱
  131.   def gain_curr(type, amount)
  132.     @curr[type] = [[@curr[type] + amount, 0].max, 9999999].min
  133.     @gold = @curr[0]
  134.   end
  135.   def lose_curr(type, amount)
  136.     gain_curr(type, -amount)
  137.   end
  138.   def gain_gold(n)
  139.     gain_curr(0, n)
  140.   end
  141.   def curr(n)
  142.     return @curr[n] == nil ? 0 : @curr[n]
  143.   end
  144. end

  145. class Game_Interpreter
  146.   # 获取货币
  147.   def gain_currency(type, amount)
  148.     $game_party.gain_curr(type, amount)
  149.   end
  150.   # 失去货币
  151.   def lose_currency(type, amount)
  152.     $game_party.lose_curr(type, amount)
  153.   end
  154.   # 货币兑换
  155.   def convert(type, vid)
  156.     return Currency.get_n_rate(type, $game_variables[vid])
  157.   end
  158.   # 获取货币持有量
  159.   def currency_type(type, vid)
  160.     $game_variables[vid] = $game_party.curr(type)
  161.   end
  162.   # 召唤商店画面
  163.   alias old_command_302 command_302
  164.   def command_302
  165.     if $special_shop != -1
  166.       $game_temp.shop_goods = [@params]
  167.       $game_temp.shop_purchase_only = @params[2]
  168.       loop do
  169.         @index += 1
  170.         if @list[@index].code == 605
  171.           $game_temp.shop_goods.push(@list[@index].parameters)
  172.         else
  173.           return false
  174.         end
  175.       end
  176.     else
  177.       old_command_302
  178.     end
  179.   end
  180.   def call_new_shop
  181.     $scene = Scene_Shop.new($special_shop)
  182.     $special_shop = -1
  183.   end
  184. end
  185. class Scene_Menu < Scene_Base
  186.   alias c_menu_start start
  187.   def start
  188.     c_menu_start
  189.     if Currency::SHOW_NEW_CURRENCY
  190.       @gold_window.dispose
  191.       @gold_window = Window_SGold.new(0, 0)
  192.       @gold_window.y = 416-@gold_window.height
  193.     end
  194.   end
  195. end
  196. class RPG::BaseItem
  197.   def get_currency_use
  198.     e = []
  199.     self.note.split(/[\r\n]+/).each { |line|
  200.       if line =~ /\[currency \d+\]/
  201.         a = line.split(/ /)[1]
  202.         d = ""
  203.         while ((c = a.slice!(/./m)) != nil)
  204.           d += c if c != ">"
  205.         end
  206.         e.push(d.to_i)
  207.       end
  208.     }
  209.     return e==[] ? nil : e
  210.   end
  211.   def get_currency_not_use
  212.     e = []
  213.     self.note.split(/[\r\n]+/).each { |line|
  214.       if line =~ /\[ncurrency \d+\]/
  215.         a = line.split(/ /)[1]
  216.         d = ""
  217.         while ((c = a.slice!(/./m)) != nil)
  218.           d += c if c != ">"
  219.         end
  220.         e.push(d.to_i)
  221.       end
  222.     }
  223.     return e==[] ? nil : e
  224.   end
  225. end

  226. #==============================================================================
  227. # ■ Window_SGold
  228. #------------------------------------------------------------------------------
  229. #  新的显示金钱窗口,可以显示多重货币。
  230. #==============================================================================
  231. class Window_SGold < Window_Base
  232.   def initialize(x, y, c=-1)
  233.     a = 1
  234.     @money = []
  235.     for i in 0...Currency::number
  236.       @money.push(i) if Currency.show?(i)
  237.     end
  238.     a = @money.size if c == -1
  239.     super(x, y, 160, a * WLH + 32)
  240.     @currency = c
  241.     refresh
  242.   end
  243.   def refresh
  244.     self.contents.clear
  245.    
  246.     if @currency == -1
  247.       for i in @money
  248.         draw_scurrency_value(i, 4, i*WLH, 120)
  249.       end
  250.     else
  251.       draw_scurrency_value(@currency, 4, 0, 120)
  252.     end
  253.   end
  254.   def draw_scurrency_value(i, x, y, width)
  255.     cx = contents.text_size(Vocab::gold).width
  256.     self.contents.font.color = normal_color
  257.     self.contents.draw_text(x, y, width-cx-2, WLH, $game_party.curr(i), 2)
  258.     self.contents.font.color = system_color
  259.     self.contents.draw_text(x, y, width, WLH, Currency.name(i), 2)
  260.   end
  261. end
  262.   
  263. #==============================================================================
  264. # ■ Window_ShopBuy
  265. #------------------------------------------------------------------------------
  266. #  商店画面、浏览显示可以购买的商品的窗口。
  267. #==============================================================================
  268. class Window_ShopBuy < Window_Selectable
  269.   #--------------------------------------------------------------------------
  270.   # ● 初始化对像
  271.   #     x : 窗口 X 座标
  272.   #     y : 窗口 Y 座标
  273.   #     c : 货币类型
  274.   #--------------------------------------------------------------------------
  275.   def initialize(x, y, c=0)
  276.     super(x, y, 304, 304)
  277.     @shop_goods = $game_temp.shop_goods
  278.     @currency = c
  279.     refresh
  280.     self.index = 0
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 绘制商品
  284.   #     index : 商品索引
  285.   #--------------------------------------------------------------------------
  286.   def draw_item(index)
  287.     item = @data[index]
  288.     number = $game_party.item_number(item)
  289.     price = Currency.get_n_rate(@currency, item.price)
  290.     gold  = Currency.get_g_rate(@currency)
  291.    
  292.     enabled = Currency.can_use?(@currency, item)
  293.     enabled = ( price <= gold and number < 99) if enabled
  294.    
  295.     rect = item_rect(index)
  296.     self.contents.clear_rect(rect)
  297.     draw_item_name(item, rect.x, rect.y, enabled)
  298.     rect.width -= 4
  299.     self.contents.draw_text(rect,price, 2)
  300.   end
  301. end
  302. class Window_ShopStatus < Window_Base
  303.   alias curr_refresh refresh
  304.   def refresh
  305.     curr_refresh
  306.     currency = []
  307.     money = ""
  308.     if @item != nil
  309.       for i in 0...Currency::number
  310.         currency.push(i) if Currency.can_use?(i, @item)
  311.       end
  312.       for i in currency
  313.         money += "、" if i>0 and i<=currency.size
  314.         money += Currency.name(i)
  315.       end
  316.       string = sprintf(Currency::One_Currency, money)
  317.       self.contents.draw_text(4, 24, 200, WLH, string,1)
  318.     end
  319.   end
  320. end
  321. #==============================================================================
  322. # ■ Scene_Shop
  323. #------------------------------------------------------------------------------
  324. #  处理商店画面的类。
  325. #==============================================================================

  326. class Scene_Shop < Scene_Base
  327.   def initialize(c=nil)
  328.     if c==nil
  329.       @special_currency = false
  330.       @currency = 0
  331.     else
  332.       @special_currency = true
  333.       @currency = c
  334.     end
  335.   end
  336.   #--------------------------------------------------------------------------
  337.   # ● 开始处理
  338.   #--------------------------------------------------------------------------
  339.   alias c_start start
  340.   def start
  341.     c_start
  342.     @command = []
  343.     for i in 0...Currency::number
  344.       if Currency.can_use?(i)
  345.         @command.push(Currency::id(i))
  346.       end
  347.     end
  348.       
  349.     @currency_window = Window_Command.new(160, @command, 1, 3)
  350.     @currency_window.x = 384
  351.     @currency_window.y = 56
  352.     @currency_window.active = false
  353.     @currency_window.visible = false
  354.     @gold_window = Window_SGold.new(384, 56, @currency)
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ● 结束处理
  358.   #--------------------------------------------------------------------------
  359.   alias c_term terminate
  360.   def terminate
  361.     c_term
  362.     @currency_window.dispose
  363.   end
  364.   #--------------------------------------------------------------------------
  365.   # ● 更新画面
  366.   #--------------------------------------------------------------------------
  367.   def update
  368.     super
  369.     update_menu_background
  370.     @help_window.update
  371.     @command_window.update
  372.     @gold_window.update
  373.     @dummy_window.update
  374.     @buy_window.update
  375.     @sell_window.update
  376.     @number_window.update
  377.     @status_window.update
  378.     @currency_window.update
  379.     if @command_window.active
  380.       update_command_selection
  381.     elsif @buy_window.active
  382.       update_buy_selection
  383.     elsif @sell_window.active
  384.       update_sell_selection
  385.     elsif @number_window.active
  386.       update_number_input
  387.     elsif @currency_window.active
  388.       update_currency_selection
  389.     end
  390.   end
  391.   #--------------------------------------------------------------------------
  392.   # ● 生成命令窗口
  393.   #--------------------------------------------------------------------------
  394.   def create_command_window
  395.     s1 = Vocab::ShopBuy
  396.     s2 = Vocab::ShopSell
  397.     s3 = Vocab::ShopCancel
  398.     s4 = Currency.word
  399.     @command_window = Window_Command.new(384, [s1, s2, s4, s3], 4)
  400.     @command_window.y = 56
  401.     @command_window.draw_item(2, false) if @special_currency
  402.     if $game_temp.shop_purchase_only
  403.       @command_window.draw_item(1, false)
  404.     end
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # ● 更新命令窗口
  408.   #--------------------------------------------------------------------------
  409.   def update_command_selection
  410.     if Input.trigger?(Input::B)
  411.       Sound.play_cancel
  412.       $scene = Scene_Map.new
  413.     elsif Input.trigger?(Input::C)
  414.       case @command_window.index
  415.       when 0  # 买入
  416.         Sound.play_decision
  417.         @command_window.active = false
  418.         @dummy_window.visible = false
  419.         @buy_window.active = true
  420.         @buy_window.visible = true
  421.         @buy_window.refresh
  422.         @status_window.visible = true
  423.       when 1  # 卖出
  424.         if $game_temp.shop_purchase_only
  425.           Sound.play_buzzer
  426.         else
  427.           Sound.play_decision
  428.           @command_window.active = false
  429.           @dummy_window.visible = false
  430.           @sell_window.active = true
  431.           @sell_window.visible = true
  432.           @sell_window.refresh
  433.         end
  434.       when 3  # 离开
  435.         Sound.play_decision
  436.         $scene = Scene_Map.new
  437.       when 2  # 货币
  438.         unless @special_currency
  439.           Sound.play_decision
  440.           @currency_window.active = true
  441.           @currency_window.visible = true
  442.           @command_window.active = false
  443.           @gold_window.visible = false
  444.         else
  445.           Sound.play_buzzer
  446.         end
  447.       end
  448.     end
  449.   end
  450.   #--------------------------------------------------------------------------
  451.   # ● 更新货币选择窗口
  452.   #--------------------------------------------------------------------------
  453.   def update_currency_selection
  454.     if Input.trigger?(Input::B)
  455.       Sound.play_cancel
  456.       @currency_window.active = false
  457.       @currency_window.visible = false
  458.       @command_window.active = true
  459.       @gold_window.visible = true
  460.     elsif Input.trigger?(Input::C)
  461.       Sound.play_decision
  462.       @currency_window.active = false
  463.       @currency_window.visible = false
  464.       @command_window.active = true
  465.       @currency = @currency_window.index
  466.       @buy_window.dispose
  467.       @buy_window = Window_ShopBuy.new(0, 112, @currency)
  468.       @buy_window.active = false
  469.       @buy_window.visible = false
  470.       @gold_window.dispose
  471.       @gold_window = Window_SGold.new(384, 56, @currency)
  472.     end
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● 更新买入选择
  476.   #--------------------------------------------------------------------------
  477.   def update_buy_selection
  478.     @status_window.item = @buy_window.item
  479.     if Input.trigger?(Input::B)
  480.       Sound.play_cancel
  481.       @command_window.active = true
  482.       @dummy_window.visible = true
  483.       @buy_window.active = false
  484.       @buy_window.visible = false
  485.       @status_window.visible = false
  486.       @status_window.item = nil
  487.       @help_window.set_text("")
  488.       return
  489.     end
  490.     if Input.trigger?(Input::C)
  491.       @item = @buy_window.item
  492.       number = $game_party.item_number(@item)
  493.       price = Currency.get_n_rate(@currency, @item.price)
  494.       gold  = Currency.get_g_rate(@currency)

  495.       enabled = Currency.can_use?(@currency, @item)
  496.       enabled = ( price <= gold and number < 99) if enabled
  497.       
  498.       unless enabled
  499.         Sound.play_buzzer
  500.       else
  501.         Sound.play_decision
  502.         max = price == 0 ? 99 : gold / @item.price
  503.         max = [max, 99 - number].min
  504.         @buy_window.active = false
  505.         @buy_window.visible = false
  506.         @number_window.set(@item, max, @item.price)
  507.         @number_window.active = true
  508.         @number_window.visible = true
  509.       end
  510.     end
  511.   end
  512.   #--------------------------------------------------------------------------
  513.   # ● 确认数值输入
  514.   #--------------------------------------------------------------------------
  515.   def decide_number_input
  516.     Sound.play_shop
  517.     @number_window.active = false
  518.     @number_window.visible = false
  519.     case @command_window.index
  520.     when 0  # 买入
  521.       gold = @number_window.number * @item.price
  522.       $game_party.lose_curr(@currency_window.index, gold)
  523.       
  524.       $game_party.gain_item(@item, @number_window.number)
  525.       @gold_window.refresh
  526.       @buy_window.refresh
  527.       @status_window.refresh
  528.       @buy_window.active = true
  529.       @buy_window.visible = true
  530.     when 1  # 卖出
  531.       gold = @number_window.number * (@item.price / 2)
  532.       $game_party.gain_curr(@currency_window.index, gold)
  533.       $game_party.lose_item(@item, @number_window.number)
  534.       @gold_window.refresh
  535.       @sell_window.refresh
  536.       @status_window.refresh
  537.       @sell_window.active = true
  538.       @sell_window.visible = true
  539.       @status_window.visible = false
  540.     end
  541.   end
  542. end
复制代码


截图:




如下设置事件後:

商店效果:

              [本贴由 风雪优游 于 2008-3-20 20:01:39 进行了编辑]
作者: 孤单de狗狗    时间: 2008-3-12 20:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-3-12 20:41
有空再做吧
作者: 火鸡三毛老大    时间: 2008-3-13 01:54
留着用....
作者: 越前リョーマ    时间: 2008-3-13 02:54
选择的话……

其实我觉得不同的物品要特定的钱种更好……
作者: 雪流星    时间: 2008-3-13 05:27
以下引用越前リョーマ于2008-3-12 18:54:16的发言:

选择的话……

其实我觉得不同的物品要特定的钱种更好……


我已经做了

作者: 风雪优游    时间: 2008-3-13 19:34
很喜欢,确认无错就可以发布了....已经更新完毕了吗?

作者: 雪流星    时间: 2008-3-14 07:48
已经更新完毕,风版请发布吧
作者: 风雪优游    时间: 2008-3-21 04:00
发布完毕,VIP+4
作者: 韩飞    时间: 2008-3-27 04:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-3-27 09:43
以下引用韩飞于2008-3-26 20:04:55的发言:

不知道为什么限制 使用特种货币购买无效啊....
怎么设置的不是物品的备注吗?右下角的...
请帮助一下
最好截图


设置这种限制是为了实现在不同地方使用不同货币的真实效果
你总不会拿RMB去英国买东西吧?

备注就是右下角的空位
作者: 韩飞    时间: 2008-3-28 00:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: 韩飞    时间: 2008-3-28 00:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-3-28 02:47
你会不会是用了我之前贴的、有BUG的版本?
重新在顶楼复制脚本看看
作者: 韩飞    时间: 2008-3-28 04:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-3-28 08:45
我再检查看看
反正这个脚本我还要更新
作者: 韩飞    时间: 2008-4-6 04:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-4-6 11:31
4/5更新部分:
1. 修改了物品可使用货币判断BUG
2. 更新功能:只能用特定货币购买的商店画面
3. 修改货币标签辨识符,用[ ] 代替 < >。

作者: shinliwei    时间: 2008-7-20 05:34
能测试下技能吗? 技能商店+技能货币结合起来用多好。
作者: 越前リョーマ    时间: 2008-7-21 02:18
可以拿来当物品交换功能……
作者: B_Bpl_ayl    时间: 2008-8-10 20:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: as3316    时间: 2008-10-12 23:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: CortesDevil    时间: 2010-8-29 13:31
不能直接显示吗.还要切换
作者: 负零    时间: 2010-8-31 01:01
是不是我脚本过多...
反正如果加入此脚本则 八大大的合成脚本失效,拿走又可以了,没报错





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1