Project1

标题: 真实商店,如何让玩家卖出的商品不再卖给玩家 [打印本页]

作者: 无忧谷主幻    时间: 2022-5-10 23:37
标题: 真实商店,如何让玩家卖出的商品不再卖给玩家
真实商店2种功能为限制出售商品数量,以及玩家卖出的商品一直保存,等待玩家再次购买
现在我并不想要第二种功能,也就是像普通商店一样卖掉的东西就不再回来了,应该如何操作?
RUBY 代码复制
  1. #==============================================================================
  2. # 本脚本来自[url]www.66rpg.com[/url],转载和使用请保留此信息
  3. # 脚本名:真实商店,脚本作者:柳柳
  4. #==============================================================================
  5. #
  6. # 功能:
  7. #
  8. # 买进卖出的物品在商店有所体现,卖出后会在商店可买物品中出现,物品有数量限制
  9. # 商店可进货出货————总之就是模拟真实商店。
  10. #  
  11. # 这个脚本和原装商店并不冲突,两个商店可以并存。
  12. #
  13. # 使用方法:
  14. #
  15. # 1、在下面被井号框起来的中间部分,设置初期物品。格式如下:
  16. #    @goods[商店编号] = [ [种类,ID,可卖数量] ,  [种类,ID,可卖数量]......]
  17. #    其中种类,0为道具,1为武器,2为防具;ID是数据库编号
  18. #
  19. # 2、调用:$scene = Scene_Shop_Va.new(商店编号)  
  20. #    比如你可以直接测试$scene = Scene_Shop_Va.new(1),已经设置好了。
  21. #
  22. # 3、商店出货:$game_system.shop_change(商店编号,种类,ID,数量)
  23. #    如果是进货,把数量设置为负数即可
  24. #
  25. #==============================================================================
  26. # ■ Scene_Shop
  27. #------------------------------------------------------------------------------
  28. #  处理商店画面的类。
  29. #==============================================================================
  30. class Game_System
  31. attr_accessor :goods   
  32. alias vaule_shop_66RPG_initialize initialize
  33. def initialize
  34.    vaule_shop_66RPG_initialize
  35.    @goods = []
  36. ###########################################################################
  37.    # 初期的时候的商店物品,编号顺序:种类,ID,可卖数量
  38.    @goods[1] = [[0,1,15],[0,2,10],[0,3,3]]  #范例演示
  39.    @goods[2] = [[0,3,8],[1,4,1],[1,2,1],[1,3,1],[1,4,1]]  
  40.    @goods[3] = [[0,5,2],[1,3,1],[1,2,3]]  
  41. ###########################################################################
  42. end
  43. def shop_change(shop,kind,id,delnumber)
  44.    dl = delnumber
  45.    for dt in $game_system.goods[shop]
  46.      if (dt[0]==kind) and (dt[1]==id)
  47.        dt[2] -= dl
  48.        dt[2] = [dt[2],99].min
  49.        if dt[2] == 0
  50.          $game_system.goods[shop].delete(dt)
  51.        end
  52.        return
  53.      end
  54.    end
  55.    $game_system.goods[shop].push([kind,id,-delnumber])
  56. end
  57. end
  58.  
  59. class Scene_Shop_Va
  60. def initialize(shop_number)
  61.    # 当前商店编号
  62.    @shop_now = shop_number     
  63. end   
  64. #--------------------------------------------------------------------------
  65. # ● 主处理
  66. #--------------------------------------------------------------------------
  67. def main
  68.    # 生成帮助窗口
  69.    @help_window = Window_Help.new
  70.    # 生成指令窗口
  71.    @command_window = Window_ShopCommand.new
  72.    # 生成金钱窗口
  73.    @gold_window = Window_Gold.new
  74.    @gold_window.x = 480
  75.    @gold_window.y = 64
  76.    # 生成时间窗口
  77.    @dummy_window = Window_Base.new(0, 128, 640, 352)
  78.    # 生成购买窗口
  79.    @buy_window = Window_ShopBuy_Va.new($game_system.goods[@shop_now])
  80.    @buy_window.active = false
  81.    @buy_window.visible = false
  82.    @buy_window.help_window = @help_window
  83.    # 生成卖出窗口
  84.    @sell_window = Window_ShopSell.new
  85.    @sell_window.active = false
  86.    @sell_window.visible = false
  87.    @sell_window.help_window = @help_window
  88.    # 生成数量输入窗口
  89.    @number_window = Window_ShopNumber.new
  90.    @number_window.active = false
  91.    @number_window.visible = false
  92.    # 生成状态窗口
  93.    @status_window = Window_ShopStatus.new
  94.    @status_window.visible = false
  95.    # 执行过渡
  96.    Graphics.transition
  97.    # 主循环
  98.    loop do
  99.      # 刷新游戏画面
  100.      Graphics.update
  101.      # 刷新输入信息
  102.      Input.update
  103.      # 刷新画面
  104.      update
  105.      # 如果画面切换的话就中断循环
  106.      if $scene != self
  107.        break
  108.      end
  109.    end
  110.    # 准备过渡
  111.    Graphics.freeze
  112.    # 释放窗口
  113.    @help_window.dispose
  114.    @command_window.dispose
  115.    @gold_window.dispose
  116.    @dummy_window.dispose
  117.    @buy_window.dispose
  118.    @sell_window.dispose
  119.    @number_window.dispose
  120.    @status_window.dispose
  121. end
  122. #--------------------------------------------------------------------------
  123. # ● 刷新画面
  124. #--------------------------------------------------------------------------
  125. def update
  126.    # 刷新窗口
  127.    @help_window.update
  128.    @command_window.update
  129.    @gold_window.update
  130.    @dummy_window.update
  131.    @buy_window.update
  132.    @sell_window.update
  133.    @number_window.update
  134.    @status_window.update
  135.    # 指令窗口激活的情况下: 调用 update_command
  136.    if @command_window.active
  137.      update_command
  138.      return
  139.    end
  140.    # 购买窗口激活的情况下: 调用 update_buy
  141.    if @buy_window.active
  142.      update_buy
  143.      return
  144.    end
  145.    # 卖出窗口激活的情况下: 调用 update_sell
  146.    if @sell_window.active
  147.      update_sell
  148.      return
  149.    end
  150.    # 个数输入窗口激活的情况下: 调用 update_number
  151.    if @number_window.active
  152.      update_number
  153.      return
  154.    end
  155. end
  156. #--------------------------------------------------------------------------
  157. # ● 刷新画面 (指令窗口激活的情况下)
  158. #--------------------------------------------------------------------------
  159. def update_command
  160.    # 按下 B 键的情况下
  161.    if Input.trigger?(Input::B)
  162.      # 演奏取消 SE
  163.      $game_system.se_play($data_system.cancel_se)
  164.      # 切换到地图画面
  165.      $scene = Scene_Map.new
  166.      return
  167.    end
  168.    # 按下 C 键的情况下
  169.    if Input.trigger?(Input::C)
  170.      # 命令窗口光标位置分支
  171.      case @command_window.index
  172.      when 0  # 购买
  173.        # 演奏确定 SE
  174.        $game_system.se_play($data_system.decision_se)
  175.        # 窗口状态转向购买模式
  176.        @command_window.active = false
  177.        @dummy_window.visible = false
  178.        @buy_window.active = true
  179.        @buy_window.visible = true
  180.        @buy_window.refresh
  181.        @status_window.visible = true
  182.      when 1  # 卖出
  183.        # 演奏确定 SE
  184.        $game_system.se_play($data_system.decision_se)
  185.        # 窗口状态转向卖出模式
  186.        @command_window.active = false
  187.        @dummy_window.visible = false
  188.        @sell_window.active = true
  189.        @sell_window.visible = true
  190.        @sell_window.refresh
  191.      when 2  # 取消
  192.        # 演奏确定 SE
  193.        $game_system.se_play($data_system.decision_se)
  194.        # 切换到地图画面
  195.        $scene = Scene_Map.new
  196.      end
  197.      return
  198.    end
  199. end
  200. #--------------------------------------------------------------------------
  201. # ● 刷新画面 (购买窗口激活的情况下)
  202. #--------------------------------------------------------------------------
  203. def update_buy
  204.    # 设置状态窗口的物品
  205.    @status_window.item = @buy_window.item
  206.    # 按下 B 键的情况下
  207.    if Input.trigger?(Input::B)
  208.      # 演奏取消 SE
  209.      $game_system.se_play($data_system.cancel_se)
  210.      # 窗口状态转向初期模式
  211.      @command_window.active = true
  212.      @dummy_window.visible = true
  213.      @buy_window.active = false
  214.      @buy_window.visible = false
  215.      @status_window.visible = false
  216.      @status_window.item = nil
  217.      # 删除帮助文本
  218.      @help_window.set_text("")
  219.      return
  220.    end
  221.    # 按下 C 键的情况下
  222.    if Input.trigger?(Input::C)
  223.      # 获取物品
  224.      @item = @buy_window.item
  225.      # 物品无效的情况下、或者价格在所持金以上的情况下
  226.      if @item == nil or @item.price > $game_party.gold
  227.        # 演奏冻结 SE
  228.        $game_system.se_play($data_system.buzzer_se)
  229.        return
  230.      end
  231.      # 获取物品所持数
  232.      case @item
  233.      when RPG::Item
  234.        number = $game_party.item_number(@item.id)
  235.      when RPG::Weapon
  236.        number = $game_party.weapon_number(@item.id)
  237.      when RPG::Armor
  238.        number = $game_party.armor_number(@item.id)
  239.      end
  240.      # 如果已经拥有了 99 个情况下
  241.      if number == 99
  242.        # 演奏冻结 SE
  243.        $game_system.se_play($data_system.buzzer_se)
  244.        return
  245.      end
  246.      # 演奏确定 SE
  247.      $game_system.se_play($data_system.decision_se)
  248.      # 计算可以最多购买的数量
  249.      max = @item.price == 0 ? 99 : $game_party.gold / @item.price
  250.      max = [[max, 99 - number].min,@buy_window.item_number].min
  251.      # 窗口状态转向数值输入模式
  252.      @buy_window.active = false
  253.      @buy_window.visible = false
  254.      @number_window.set(@item, max, @item.price)
  255.      @number_window.active = true
  256.      @number_window.visible = true
  257.    end
  258. end
  259. #--------------------------------------------------------------------------
  260. # ● 画面更新 (卖出窗口激活的情况下)
  261. #--------------------------------------------------------------------------
  262. def update_sell
  263.    # 按下 B 键的情况下
  264.    if Input.trigger?(Input::B)
  265.      # 演奏取消 SE
  266.      $game_system.se_play($data_system.cancel_se)
  267.      # 窗口状态转向初期模式
  268.      @command_window.active = true
  269.      @dummy_window.visible = true
  270.      @sell_window.active = false
  271.      @sell_window.visible = false
  272.      @status_window.item = nil
  273.      # 删除帮助文本
  274.      @help_window.set_text("")
  275.      return
  276.    end
  277.    # 按下 C 键的情况下
  278.    if Input.trigger?(Input::C)
  279.      # 获取物品
  280.      @item = @sell_window.item
  281.      # 设置状态窗口的物品
  282.      @status_window.item = @item
  283.      # 物品无效的情况下、或者价格为 0 (不能卖出) 的情况下
  284.      if @item == nil or @item.price == 0
  285.        # 演奏冻结 SE
  286.        $game_system.se_play($data_system.buzzer_se)
  287.        return
  288.      end
  289.      # 演奏确定 SE
  290.      $game_system.se_play($data_system.decision_se)
  291.      # 获取物品的所持数
  292.      case @item
  293.      when RPG::Item
  294.        number = $game_party.item_number(@item.id)
  295.      when RPG::Weapon
  296.        number = $game_party.weapon_number(@item.id)
  297.      when RPG::Armor
  298.        number = $game_party.armor_number(@item.id)
  299.      end
  300.      # 最大卖出个数 = 物品的所持数
  301.      max = number
  302.      # 窗口状态转向个数输入模式
  303.      @sell_window.active = false
  304.      @sell_window.visible = false
  305.      @number_window.set(@item, max, @item.price / 2)
  306.      @number_window.active = true
  307.      @number_window.visible = true
  308.      @status_window.visible = true
  309.    end
  310. end
  311. #--------------------------------------------------------------------------
  312. # ● 刷新画面 (个数输入窗口激活的情况下)
  313. #--------------------------------------------------------------------------
  314. def update_number
  315.    # 按下 B 键的情况下
  316.    if Input.trigger?(Input::B)
  317.      # 演奏取消 SE
  318.      $game_system.se_play($data_system.cancel_se)
  319.      # 设置个数输入窗口为不活动·非可视状态
  320.      @number_window.active = false
  321.      @number_window.visible = false
  322.      # 命令窗口光标位置分支
  323.      case @command_window.index
  324.      when 0  # 购买
  325.        # 窗口状态转向购买模式
  326.        @buy_window.active = true
  327.        @buy_window.visible = true
  328.      when 1  # 卖出
  329.        # 窗口状态转向卖出模式
  330.        @sell_window.active = true
  331.        @sell_window.visible = true
  332.        @status_window.visible = false
  333.      end
  334.      return
  335.    end
  336.    # 按下 C 键的情况下
  337.    if Input.trigger?(Input::C)
  338.      # 演奏商店 SE
  339.      $game_system.se_play($data_system.shop_se)
  340.      # 设置个数输入窗口为不活动·非可视状态
  341.      @number_window.active = false
  342.      @number_window.visible = false
  343.      # 命令窗口光标位置分支
  344.      case @command_window.index
  345.      when 0  # 购买
  346.        # 购买处理
  347.        temp = 0
  348.        $game_party.lose_gold(@number_window.number * @item.price)
  349.        case @item
  350.        when RPG::Item
  351.          $game_party.gain_item(@item.id, @number_window.number)
  352.        when RPG::Weapon
  353.          $game_party.gain_weapon(@item.id, @number_window.number)
  354.          temp = 1
  355.        when RPG::Armor
  356.          $game_party.gain_armor(@item.id, @number_window.number)
  357.          temp = 2
  358.        end
  359.        goods_del(temp,@item.id,@number_window.number)
  360.        # 刷新各窗口
  361.        @buy_window = Window_ShopBuy_Va.new($game_system.goods[@shop_now])
  362.        @buy_window.help_window = @help_window
  363.        @gold_window.refresh
  364.        @buy_window.refresh
  365.        @status_window.refresh
  366.        # 窗口状态转向购买模式
  367.        @buy_window.active = true
  368.        @buy_window.visible = true
  369.      when 1  # 卖出
  370.        # 卖出处理
  371.        $game_party.gain_gold(@number_window.number * (@item.price / 2))
  372.        temp = 0
  373.        case @item
  374.        when RPG::Item
  375.          $game_party.lose_item(@item.id, @number_window.number)
  376.        when RPG::Weapon
  377.          $game_party.lose_weapon(@item.id, @number_window.number)
  378.          temp = 0
  379.        when RPG::Armor
  380.          $game_party.lose_armor(@item.id, @number_window.number)
  381.          temp = 0
  382.        end
  383.        # 刷新各窗口
  384.        goods_del(temp,@item.id,-@number_window.number)
  385.        @buy_window = Window_ShopBuy_Va.new($game_system.goods[@shop_now])
  386.        @buy_window.active = false
  387.        @buy_window.visible = false
  388.        @buy_window.help_window = @help_window
  389.        @gold_window.refresh
  390.        @sell_window.refresh
  391.        @status_window.refresh
  392.        # 窗口状态转向卖出模式
  393.        @sell_window.active = true
  394.        @sell_window.visible = true
  395.        @status_window.visible = false
  396.      end
  397.      return
  398.    end
  399. end
  400. # 删除可出售商品内容
  401. def goods_del(kind,id,delnumber)
  402.    dl = delnumber
  403.    for dt in $game_system.goods[@shop_now]
  404.      if (dt[0]==kind) and (dt[1]==id)
  405.        dt[2] -= dl
  406.        dt[2] = [dt[2],99].min
  407.        if dt[2] == 0
  408.          $game_system.goods[@shop_now].delete(dt)
  409.        end
  410.        return
  411.      end
  412.    end
  413.    $game_system.goods[@shop_now].push([kind,id,-delnumber])
  414. end
  415. end
  416.  
  417. #==============================================================================
  418. # ■ Window_ShopBuy_Va
  419. #------------------------------------------------------------------------------
  420. #  商店画面、浏览显示可以购买的商品的窗口。
  421. #==============================================================================
  422.  
  423. class Window_ShopBuy_Va < Window_Selectable
  424. attr_accessor :shop_goods
  425. #--------------------------------------------------------------------------
  426. # ● 初始化对像
  427. #     shop_goods : 商品
  428. #--------------------------------------------------------------------------
  429. def initialize(shop_goods)
  430.    super(0, 128, 368, 352)
  431.    @shop_goods = shop_goods
  432.    refresh
  433.    self.index = 0
  434. end
  435. #--------------------------------------------------------------------------
  436. # ● 获取物品
  437. #--------------------------------------------------------------------------
  438. def item
  439.    return @data[self.index]
  440. end
  441. #--------------------------------------------------------------------------
  442. # ● 获取物品
  443. #--------------------------------------------------------------------------
  444. def item_number
  445.    return @data_number[self.index]
  446. end
  447. #--------------------------------------------------------------------------
  448. # ● 刷新
  449. #--------------------------------------------------------------------------
  450. def refresh
  451.    if self.contents != nil
  452.      self.contents.dispose
  453.      self.contents = nil
  454.    end
  455.    @data = []
  456.    @data_number = []
  457.    for goods_item in @shop_goods
  458.      case goods_item[0]
  459.      when 0
  460.        item = $data_items[goods_item[1]]
  461.      when 1
  462.        item = $data_weapons[goods_item[1]]
  463.      when 2
  464.        item = $data_armors[goods_item[1]]
  465.      end
  466.      if (item != nil) and (goods_item[2] != 0)
  467.        @data.push(item)
  468.        @data_number.push(goods_item[2])
  469.      else
  470.        @data.delete(item)
  471.      end
  472.    end
  473.    # 如果项目数不是 0 就生成位图、描绘全部项目
  474.    @item_max = @data.size
  475.    if @item_max > 0
  476.      self.contents = Bitmap.new(width - 32, row_max * 32)
  477.      for i in 0...@item_max
  478.        draw_item(i)
  479.      end
  480.    end
  481. end
  482. #--------------------------------------------------------------------------
  483. # ● 描绘羡慕
  484. #     index : 项目编号
  485. #--------------------------------------------------------------------------
  486. def draw_item(index)
  487.    item = @data[index]
  488.    # 获取物品所持数
  489.    case item
  490.    when RPG::Item
  491.      number = $game_party.item_number(item.id)
  492.    when RPG::Weapon
  493.      number = $game_party.weapon_number(item.id)
  494.    when RPG::Armor
  495.      number = $game_party.armor_number(item.id)
  496.    end
  497.    # 价格在所持金以下、并且所持数不是 99 的情况下为普通文字颜色
  498.    # 除此之外的情况设置为无效文字色
  499.    if item.price <= $game_party.gold and number < 99
  500.      self.contents.font.color = normal_color
  501.    else
  502.      self.contents.font.color = disabled_color
  503.    end
  504.    x = 4
  505.    y = index * 32
  506.    rect = Rect.new(x, y, self.width - 32, 32)
  507.    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  508.    bitmap = RPG::Cache.icon(item.icon_name)
  509.    opacity = self.contents.font.color == normal_color ? 255 : 128
  510.    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  511.    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  512.    self.contents.draw_text(x + 240, y, 88, 32, "剩  ", 2)
  513.    self.contents.draw_text(x + 240, y, 88, 32, @data_number[index].to_s, 2)
  514.    self.contents.draw_text(x + 180, y, 88, 32, item.price.to_s, 2)
  515. end
  516. #--------------------------------------------------------------------------
  517. # ● 刷新帮助文本
  518. #--------------------------------------------------------------------------
  519. def update_help
  520.    @help_window.set_text(self.item == nil ? "" : self.item.description)
  521. end
  522. end
  523.  
  524.  
  525.  
  526.  
  527. #==============================================================================
  528. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  529. #==============================================================================

作者: 小怪兽奇奇侠    时间: 2022-5-11 00:10
大概看了一会,没有实际测试,不过这段程序思路非常清晰易懂,我想没有差错。你要的效果无非就是道具卖了,但是商店里不会出现卖掉的道具,那么只需要把384行也就是goods_del(temp,@item.id,-@number_window.number) 删掉或注释掉就好了。




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