Project1

标题: 雪流星的多国货币脚本BUG…… [打印本页]

作者: 雌性触手    时间: 2011-11-9 17:18
标题: 雪流星的多国货币脚本BUG……
  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
复制代码
添加了之后商店打不开了……  然后试着
    脚本:$special_currency = n # <== n 为货币类型
    商店处理:商品列表
    脚本:call_new_shop
这样  的确是打开了  但是会同时打开两个……   

还有个BUG……   就是当第一种货币达到购买的条件时  换其他的货币可以购买 且不花钱……dsu_plus_rewardpost_czw
作者: 月夜神音    时间: 2011-11-10 05:02
把脚本:call_new_shop放到商店处理:商品列表前面,即可解决二次商店……
另外个BUG看清楚些,它是不是扣掉了第一种货币?
作者: 雌性触手    时间: 2011-11-10 10:37
本帖最后由 雌性触手 于 2011-11-10 10:38 编辑
月夜神音 发表于 2011-11-10 05:02
把脚本:call_new_shop放到商店处理:商品列表前面,即可解决二次商店……
另外个BUG看清楚些,它是不是扣 ...


还是一样的……ORZ        插入这个脚本就出现两个商店   不插入就不显示……


雌性触手于2011-11-10 10:37补充以下内容:
那个判定也有问题    虽然也扣除钱币  但是判定的却是 原货币   只要原货币足够  现有货币无论怎样都能成功购买。
作者: 月夜神音    时间: 2011-11-10 12:36
测试了一下
当我把call_new_shop放在商店处理后面,的确会出现2次商店的问题,但放在前面时就没了…………

奇怪……我就没遇到第2个BUG,LZ你把范例发来看?
作者: 雌性触手    时间: 2011-11-10 15:41
本帖最后由 雌性触手 于 2011-11-10 15:46 编辑

Project1.zip (255.92 KB, 下载次数: 202)



   因为我的工程太大了……  所以我就只把这个脚本新建了个工程……

效果也是一样。

还有……
  1.     gain_currency(类型, 数量)增加该类型货币
  2.     lose_currency(类型, 数量)减少该类型货币
  3.    
  4.     convert(类型, 变量ID) 将该变量内的数值转换为该类型并返回
  5.     currency_type(类型, 变量ID) 将该类型货币金额代入该变量
复制代码
这  只有上面两个可以……  下面按照变量增加却不行……
作者: 月夜神音    时间: 2011-11-12 16:31
  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
复制代码
奇怪?应该没什么差别啊?
作者: 雌性触手    时间: 2011-11-14 15:13
月夜神音 发表于 2011-11-12 16:31
奇怪?应该没什么差别啊?

  和我的一模一样啊 ……    难道只有我有这个问题?

不是吧?  明明是一样的脚本……




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