查看: 2980|回复: 13

[已经解决] 求背包容量(负重)脚本

[复制链接]

素材区好人

梦石
5
星屑
12559
在线时间
4347 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

发表于 2016-10-16 00:40:04 | 显示全部楼层 |阅读模式

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

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

×
这次也是照常搜索过结果大部分都失效了
希望现有容量和最高容量在物品菜单中就能显示,如果容量已满,开宝箱则获取失败(但是宝箱不消失)
至于商店购买和贩卖就不用考虑了

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2016-10-16 13:26:16 | 显示全部楼层
唔……有几个几个问题点:
1-1,容量是指每个角色都有容量值,然后队伍总容量是整队人的容量值加起来?或是队伍容量值只是个可以设定的变量?
1-2,基于1-1,如果是前者,那个队伍有人离队的话,缺少的队伍容量肿么办?扩展一下这个问题,如果队伍容量是可变的变量值,那么减少这个值之后,溢出的那部分容量肿么办?
2,容量数值只在物品背包界面显示?是要肿么显示呢?放个独立小窗还是直接显示在哪个窗口里?
3,也就是说商店买东西的话不管溢出的容量?
4,箱子的话大概得手动加条件分歧。
回复

使用道具 举报

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2016-10-16 15:28:13 | 显示全部楼层
本帖最后由 cinderelmini 于 2016-10-16 18:01 编辑
无忧谷主幻 发表于 2016-10-16 14:33
虽然勉强也可以……
能在背包中显示吗?


唔。。。大概写了一个……Main前什么的……
用法在代码开头有说明,可以在物品/武器/防具的说明栏最后面加上“♂数值”(不含引号)设置重量,
不设置的话统一默认设定为代码里设置的默认重量。
基于默认系统,搬运大概需要整合?

  1. #===================================
  2. # ○ 使用方法
  3. #-----------------------------------
  4. # 事件中使用【脚本】功能输入以下功能执行相关操作:
  5. #·set_burden_max(max)
  6. #  设置新的最大负重值(初始默认10),括弧里填新的最大值数字
  7. #·refresh_burden
  8. #  刷新总负重值,本方法在获得/失去物品时会自动执行,大概不会在事件中用到。
  9. #
  10. # 宝箱事件中使用条件分歧的【脚本】功能输入:
  11. #·burden_max?
  12. #  判定目前是否已经满负重
  13. #·burden_max?(type, id)
  14. #  判定加上指定类型和ID的项目的负重后是否满负重
  15. #  type:类型(可填的类型有  :item/:weapon/:armor)
  16. #  id  :项目的ID
  17. #
  18. # ※注意:事件中增加物品如果不加满负重判定的话会直接加进去。
  19. #===================================


  20. # 一些事件脚本用的便捷方法
  21. class Interpreter
  22.   def set_burden_max(max)
  23.     $game_party.set_burden_max(max)
  24.   end
  25.   
  26.   def refresh_burden
  27.     $game_party.refresh_burden
  28.   end
  29.   
  30.   def burden_max?(type = nil, id = nil)
  31.     return $game_party.burden_max? unless (type and id)
  32.     return $game_party.test_burden_max?(type, id)
  33.   end
  34.   
  35. end



  36. class Window_Burden < Window_Base
  37.   #-----------------------------------
  38.   # ○ 初始化
  39.   #-----------------------------------
  40.   def initialize
  41.     super(640 - 160, 480 - 64, 160, 64)
  42.     self.contents = Bitmap.new(width - 32, height - 32)
  43.     self.z = 99
  44.     refresh
  45.   end
  46.   #-----------------------------------
  47.   # ○ 刷新
  48.   #-----------------------------------
  49.   def refresh
  50.     return if (@burden == $game_party.burden and @burden_max == $game_party.burden_max)
  51.     @burden = $game_party.burden
  52.     @burden_max = $game_party.burden_max
  53.     self.contents.clear
  54.     self.contents.font.color = system_color
  55.     self.contents.draw_text(0, 0, contents.width, 32, "负重:")
  56.    
  57.     color = @burden >= @burden_max ? Color.new(255, 0, 0) : normal_color
  58.     self.contents.font.color = color
  59.     text = sprintf("%s/%s", @burden, @burden_max)
  60.     self.contents.draw_text(0, 0, contents.width, 32, text, 2)
  61.   end
  62. end


  63. class Scene_Item
  64.   alias sny46_161016_main main
  65.   def main
  66.     @burden_window = Window_Burden.new
  67.     sny46_161016_main
  68.     @burden_window.dispose
  69.   end
  70.   
  71.   alias sny46_161016_update update
  72.   def update
  73.     @burden_window.refresh
  74.     sny46_161016_update
  75.   end
  76. end








  77. # 一些数据扩展
  78. module RPG
  79.   
  80.   # 在物品/武器/防具的说明栏最后面加上“♂重量数值”设置单个项目的重量
  81.   # 不设定的话会使用下面的默认值作为项目的重量
  82.   
  83.   # 默认物品的重量值
  84.   DefaultBurden = 5
  85.   
  86.   class Weapon
  87.     def burden
  88.       num = (@description.split(/♂/)[1] || DefaultBurden)
  89.       return num.to_i
  90.     end
  91.     def description
  92.       return (@description.split(/♂/)[0] || @description)
  93.     end
  94.   end
  95.   class Armor
  96.     def burden
  97.       num = (@description.split(/♂/)[1] || DefaultBurden)
  98.       return num.to_i
  99.     end
  100.     def description
  101.       return (@description.split(/♂/)[0] || @description)
  102.     end
  103.   end
  104.   class Item
  105.     def burden
  106.       num = (@description.split(/♂/)[1] || DefaultBurden)
  107.       return num.to_i
  108.     end
  109.     def description
  110.       return (@description.split(/♂/)[0] || @description)
  111.     end
  112.   end
  113.   
  114. end



  115. class Game_Party
  116.   
  117.   #-----------------------------------
  118.   # ○ 定义俩变量
  119.   #-----------------------------------
  120.   attr_reader :burden
  121.   attr_reader :burden_max
  122.   
  123.   #-----------------------------------
  124.   # ○ 初始化
  125.   #-----------------------------------
  126.   alias sny46_161016_init initialize
  127.   def initialize
  128.     sny46_161016_init
  129.     @burden = 0      # 初始负重值
  130.     @burden_max = 10 # 初始最大负重值
  131.     refresh_burden
  132.   end
  133.   
  134.   #-----------------------------------
  135.   # ○ 增加物品 (减少)
  136.   #-----------------------------------
  137.   alias sny46_161016_gain_item gain_item
  138.   def gain_item(item_id, n)
  139.     sny46_161016_gain_item(item_id, n)
  140.     refresh_burden
  141.   end
  142.   #-----------------------------------
  143.   # ○ 增加武器 (减少)
  144.   #-----------------------------------
  145.   alias sny46_161016_gain_weapon gain_weapon
  146.   def gain_weapon(weapon_id, n)
  147.     sny46_161016_gain_weapon(weapon_id, n)
  148.     refresh_burden
  149.   end
  150.   #-----------------------------------
  151.   # ○ 增加防具 (减少)
  152.   #-----------------------------------
  153.   alias sny46_161016_gain_armor gain_armor
  154.   def gain_armor(armor_id, n)
  155.     sny46_161016_gain_armor(armor_id, n)
  156.     refresh_burden
  157.   end
  158.   
  159.   
  160.   #-----------------------------------
  161.   # ○ 整体刷新当前总负重
  162.   #-----------------------------------
  163.   def refresh_burden
  164.     @burden = 0
  165.     @items.each{|id, num| num.times{@burden += $data_items[id].burden}}
  166.     @weapons.each{|id, num| num.times{@burden += $data_weapons[id].burden}}
  167.     @armors.each{|id, num| num.times{@burden += $data_armors[id].burden}}
  168.   end
  169.   
  170.   #-----------------------------------
  171.   # ○ 设置新的最大负重值
  172.   #-----------------------------------
  173.   def set_burden_max(n)
  174.     @burden_max = n
  175.   end
  176.   
  177.   #-----------------------------------
  178.   # ○ 判定当前是否满负重
  179.   #-----------------------------------
  180.   def burden_max?
  181.     return @burden >= @burden_max
  182.   end
  183.   
  184.   #-----------------------------------
  185.   # ○ 判定加上某个值是否满负重
  186.   #-----------------------------------
  187.   def test_burden_max?(type, id)
  188.     return true if burden_max?
  189.     case type
  190.     when :item
  191.       n = $data_items[id].burden
  192.     when :armor
  193.       n = $data_armors[id].burden
  194.     when :weapon
  195.       n = $data_weapons[id].burden
  196.     else
  197.       n = 0
  198.     end
  199.     return (@burden + n >= @burden_max)
  200.   end
  201.   
  202. end
复制代码

评分

参与人数 2星屑 +500 梦石 +1 收起 理由
RyanBern + 100 + 1 认可答案
无忧谷主幻 + 400 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2016-10-16 09:41:07 | 显示全部楼层
我是用的限制携带种类上限。不是负重。
就是一个变量表示最大能带几种道具。
另一个变量表示当前带了几种道具。
我是改了脚本。不是插件脚本。
  1.   #--------------------------------------------------------------------------
  2.   # ● 增加物品 (减少)
  3.   #     item_id : 物品 ID
  4.   #     n       : 个数
  5.   #--------------------------------------------------------------------------
  6.   def gain_item(item_id, n)
  7.     a = item_number(item_id)
  8.     # 更新 hash 的个数数据
  9.     if item_id > 0
  10.       if $game_variables[54] >= 10
  11.                               else
  12.       @items[item_id] = [[item_number(item_id) + n, 0].max, 10].min
  13.       if @items.include?(item_id)
  14.                 if n >= 0
  15.                   if a == 0
  16.           $game_variables[54] += 1
  17.           end
  18.         end
  19.       end
  20.                    if   a > 0
  21.                      if item_number(item_id) == 0
  22.           $game_variables[54] -= 1
  23. end
  24.       end
  25.     end
  26.     end
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   # ● 增加武器 (减少)
  30.   #     weapon_id : 武器 ID
  31.   #     n         : 个数
  32.   #--------------------------------------------------------------------------
  33.   def gain_weapon(weapon_id, n)
  34.     a = weapon_number(weapon_id)
  35.     # 更新 hash 的个数数据
  36.     if weapon_id > 0
  37.             if $game_variables[54] >= 10
  38.            else
  39.       @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 10].min
  40.     if @weapons.include?(weapon_id)
  41.                       if n >= 0
  42.                   if a == 0               
  43.           $game_variables[54] += 1
  44.           end
  45.         end
  46.       end
  47.                    if   a > 0
  48.                      if weapon_number(weapon_id) == 0
  49.           $game_variables[54] -= 1
  50. end
  51.       end
  52.     end
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 增加防具 (减少)
  57.   #     armor_id : 防具 ID
  58.   #     n        : 个数
  59.   #--------------------------------------------------------------------------
  60.   def gain_armor(armor_id, n)
  61.         a = armor_number(armor_id)
  62.             # 更新 hash 的个数数据
  63.     if armor_id > 0
  64.             if $game_variables[54] >= 10
  65.             else
  66.           @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 10].min
  67.     if @armors.include?(armor_id)
  68.                       if n >= 0
  69.                   if a == 0               
  70.           $game_variables[54] += 1
  71.           end
  72.         end
  73.       end
  74.                    if   a > 0
  75.                      if armor_number(armor_id) == 0
  76.           $game_variables[54] -= 1
  77. end
  78.       end
  79.     end
  80.   end
  81.   end
复制代码

评分

参与人数 1星屑 +80 收起 理由
无忧谷主幻 + 80 塞糖

查看全部评分

回复

使用道具 举报

素材区好人

梦石
5
星屑
12559
在线时间
4347 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

 楼主| 发表于 2016-10-16 14:31:36 | 显示全部楼层

()

本帖最后由 无忧谷主幻 于 2016-10-16 14:36 编辑
cinderelmini 发表于 2016-10-16 13:26
唔……有几个几个问题点:
1-1,容量是指每个角色都有容量值,然后队伍总容量是整队人的容量值加起来?或是 ...

1-1,这个不用考虑,因为队伍就一个人
1-2,因为自始至终就一个人,所以不用考虑了
2,只要能显示就行了(当然新增个窗口比较美观吧)
1111.jpg
3,没有商店,所以不用考虑
4,嗯,也可以
回复

使用道具 举报

素材区好人

梦石
5
星屑
12559
在线时间
4347 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

 楼主| 发表于 2016-10-16 14:33:05 | 显示全部楼层
yang1zhi 发表于 2016-10-16 09:41
我是用的限制携带种类上限。不是负重。
就是一个变量表示最大能带几种道具。
另一个变量表示当前带了几种 ...

虽然勉强也可以……
能在背包中显示吗?

点评

可以的,在背包那里建个窗口,显示变量就可以。  发表于 2016-10-16 22:35
回复

使用道具 举报

素材区好人

梦石
5
星屑
12559
在线时间
4347 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

 楼主| 发表于 2016-10-16 16:10:38 | 显示全部楼层
cinderelmini 发表于 2016-10-16 15:28
唔。。。大概写了一个……Main前什么的……
用法在代码开头有说明,可以在物品/武器/防具的说明栏最后面 ...

还是有2个问题:
1,判断物品1是否超过负重,条件分歧应该写
burden_max?(item, 1)吗?
1.jpg
2,现有负重的刷新:
在使用物品或丢弃物品后没有及时刷新,必须关闭物品菜单再打开才会更新
丢弃物品[pre lang="ruby"]module RB_ItemDump
  # 不可丢弃的物品ID
  NOT_FOR_DUMP_ITEMS = []
  # 不可丢弃的武器ID
  NOT_FOR_DUMP_WEAPONS = []
  # 不可丢弃的防具ID
  NOT_FOR_DUMP_ARMORS = []
  def not_for_dump?(item)
    case item
    when RPG::Item
      return NOT_FOR_DUMP_ITEMS.include?(item.id)
    when RPG::Weapon
      return NOT_FOR_DUMP_WEAPONS.include?(item.id)
    when RPG::Armor
      return NOT_FOR_DUMP_ARMORS.include?(item.id)
    else
      return true
    end
  end
end
class Window_ItemCommand < Window_Command
  include RB_ItemDump
  attr_accessor :calling_window
  def initialize(width, commands)
    super(width, commands)
    @item = nil
    @calling_window = nil
    self.z = 120
    self.active = false
    self.visible = false
  end
  def item=(item)
    @item = item
    refresh
  end
  def refresh
    self.contents.clear
    (0...@item_max).each do |i|
      draw_item(i, normal_color)
    end
    unless @item.is_a?(RPG::Item) && $game_party.item_can_use?(@item.id)
      disable_item(0)
    end
    if not_for_dump?(@item)
      disable_item(1)
    end
  end
  def adjust_position
    if @calling_window.nil?
      return
    end
    if @calling_window.cursor_y + 32 + self.height < 480
      self.y = @calling_window.cursor_y + 32
    else
      self.y = @calling_window.cursor_y - self.height
    end
    self.x = @calling_window.cursor_x
  end
end

class Window_Selectable
  def cursor_x
    cursor_width = self.width / @column_max - 32
    x = @index % @column_max * (cursor_width + 32) + self.x + 16
    return x
  end
  def cursor_y
    y = @index / @column_max * 32 - self.oy + self.y + 16
    return y
  end
end


class Window_Dump < Window_Base
  def initialize
    super(0, 0, 176, 96)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.x = 320 - width / 2
    self.y = 240 - height / 2
    self.z = 200
    self.active = false
    self.visible = false
    @number = 1
  end
  def set(max)
    @Max = max
    @number = 1
    refresh
  end
  def number
    return @number
  end
  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(0, 0, 144, 32, "输入丢弃个数")
    self.contents.font.color = normal_color
    self.contents.draw_text(72, 32, 32, 32, "×")
    self.contents.draw_text(104, 32, 24, 32, @number.to_s, 2)
    self.cursor_rect.set(100, 32, 32, 32)
  end
  def update
    super
    if self.active
      # 光标右 (+1)
      if Input.repeat?(Input::RIGHT) and @number < @max
        $game_system.se_play($data_system.cursor_se)
        @number += 1
        refresh
      end
      # 光标左 (-1)
      if Input.repeat?(Input::LEFT) and @number > 1
        $game_system.se_play($data_system.cursor_se)
        @number -= 1
        refresh
      end
      # 光标上 (+10)
      if Input.repeat?(Input::UP) and @number < @max
        $game_system.se_play($data_system.cursor_se)
        @number = [@number + 10, @max].min
        refresh
      end
      # 光标下 (-10)
      if Input.repeat?(Input::DOWN) and @number > 1
        $game_system.se_play($data_system.cursor_se)
        @number = [@number - 10, 1].max
        refresh
      end
    end
  end
end


class Scene_Item
  include RB_ItemDump
  alias rb_main main
  def main
    @dump_window = Window_Dump.new
    @command_window = Window_ItemCommand.new(108, ["使用", "丢弃"])
    rb_main
    @dump_window.dispose
    @command_window.dispose
  end
  def update
    @command_window.calling_window = @item_window
    @dump_window.update
    @command_window.update
    @help_window.update
    @item_window.update
    @target_window.update
    if @item_window.active
      update_item
      return
    end
    if @target_window.active
      update_target
      return
    end
    if @command_window.active
      update_command
      return
    end
    if @dump_window.active
      update_dump
      return
    end
  end
  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(0)
      return
    end
    if Input.trigger?(Input::C)
      @item = @item_window.item
      if @item.nil?
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      @command_window.item = @item
      @command_window.adjust_position
      @command_window.index = 0
      @command_window.active = true
      @command_window.visible = true
      @item_window.active = false
      return
    end
  end
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.visible = false
      @command_window.active = false
      @item_window.active = true
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0
        unless @item.is_a?(RPG::Item) && $game_party.item_can_use?(@item.id)
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        if @item.scope >= 3
          @command_window.active = false
          @command_window.visible = false
          @target_window.x = (@item_window.index + 1) % 2 * 304
          @target_window.visible = true
          @target_window.active = true
          if @item.scope == 4 || @item.scope == 6
            @target_window.index = -1
          else
            @target_window.index = 0
          end
        else
          if @item.common_event_id > 0
            $game_temp.common_event_id = @item.common_event_id
            $game_system.se_play(@item.menu_se)
            if @item.consumable
              $game_party.lose_item(@item.id, 1)
              @item_window.draw_item(@item_window.index)
            end
            $scene = Scene_Map.new
            return
          end
        end
      when 1
        if not_for_dump?(@item)
          $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.weapon_number(@item.id)
        end
        $game_system.se_play($data_system.decision_se)
        @dump_window.set(number)
        @dump_window.visible = true
        @dump_window.active = true
        @command_window.visible = false
        @command_window.active = false
      end
    end
    return
  end
  def update_dump
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @dump_window.visible = false
      @dump_window.active = false
      @command_window.active = true
      @command_window.visible = true
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.shop_se)
      number = @dump_window.number
      case @item
      when RPG::Item
        $game_party.lose_item(@item.id, number)
      when RPG::Weapon
        $game_party.lose_weapon(@item.id, number)
      when RPG::Armor
        $game_party.lose_armor(@item.id, number)
      end
      @dump_window.visible = false
      @dump_window.active = false
      @item_window.active = true
      @item_window.refresh
      return
    end
  end
end[/pre]

点评

嗯,虽然使用还是无法更新,但是丢弃的话完全问题、至于前者我尽量通过事件解决吧,非常感谢  发表于 2016-10-16 20:07
实在不行的话,就在你这楼代码的275和276行之间(@item_window.refresh下面)插入一行:@burden_window.refresh  发表于 2016-10-16 19:06
哦~负重的问题把代码218行的等号去掉就好,刷新的问题。。。。好奇怪。。。  发表于 2016-10-16 19:05
条件分歧解决,但如果背包目前重量5则只能再拿4个重量1的物品,也就是如果等于最大负重也无法拿起来。刷新问题换位置仍然失败,无论是丢弃.使用  发表于 2016-10-16 18:31
至于刷新问题,试试把咱代码里的81行和82行换个位置看看……  发表于 2016-10-16 18:02
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部