Project1

标题: 请教制作个可储存道具的箱子,储存的道具可带到下个周目 [打印本页]

作者: taeckle    时间: 2021-5-14 06:30
标题: 请教制作个可储存道具的箱子,储存的道具可带到下个周目
目前完全没有思路,还请大神指点一二,多谢了!
作者: 真·可乐    时间: 2021-5-14 09:57
标题:
厚颜无耻地推荐一下这个脚本 至于物品仓库脚本看看有没有现有的脚本可以用。
作者: taeckle    时间: 2021-5-15 05:27
本帖最后由 taeckle 于 2021-5-16 07:06 编辑
真·可乐 发表于 2021-5-14 09:57
厚颜无耻地推荐一下这个脚本 至于物品仓库脚本看看有没有现有的脚本可以用。 ...


大神可以讲讲做这个脚本的思路吗?

比如我想达成每增加1个周目箱子可多储存3个道具,都要有哪些考虑呢?
作者: 765111039    时间: 2021-5-15 10:34
图书馆有一个制作二周目文件的脚本,使用那个脚本,把要存的东西做一个哈希表存进去就好了
作者: taeckle    时间: 2021-5-16 20:20
765111039 发表于 2021-5-15 10:34
图书馆有一个制作二周目文件的脚本,使用那个脚本,把要存的东西做一个哈希表存进去就好了 ...

好像这个只能设定要储存的道具,那要怎么设置储存箱储存道具的数量限制呢?
作者: 765111039    时间: 2021-5-17 14:13
taeckle 发表于 2021-5-16 20:20
好像这个只能设定要储存的道具,那要怎么设置储存箱储存道具的数量限制呢? ...

既然可以存那肯定可以读取啊,读取数据然后分歧判断就行了比如这样,你存进去a={w=>[],a=>[],wn=>[],an=>[]},这里面w作为武器,那么wn就可以作为对应的数量,a是防具,an是对应的数量,你只要限制wn和an就可以了,或者读取发放奖励的时候限定数量
作者: enghao_lim    时间: 2021-5-17 14:51
储存箱子不难,但前提是楼主你如何实现你的周目?根据你实现周目的方式再来谈如何实现箱子会更实际一点,大家更容易给出建议。在不知道你如何实现周目还愿意给建议的楼上几乎都是好人。
作者: soulsaga    时间: 2021-5-17 16:25
是每种道具的存放上限+3..还是道具总数算+3
作者: Cupidk爱呗茶    时间: 2021-5-18 21:21
本帖最后由 Cupidk爱呗茶 于 2021-8-13 23:50 编辑

花了一下午写的 虽说可能比不上论坛上其他大神的作品 而且代码方面会有点乱 不过我尽力了..
基本上算是实现了LZ所说的所有要求了 顺便..范例就收20星屑吧.. 希望不会无人问津  (
工程演示

范例
NG变量+多周目箱子.rar (450.03 KB, 下载次数: 17, 售价: 20 星屑)
脚本 ↓
箱子系统和跨存档变量均为原创
RUBY 代码复制
  1. # 简易跨存档变量 by cupidk rays 制作
  2. # 脚本特性: 生成的数据即便不进行存档也依旧不会消失 (制作多周目游戏)
  3. # 变量获取方法 CUPIDK::NGVAR.get_var(id)
  4. # 数据获取方法 CUPIDK::NGVAR.get_data
  5. module CUPIDK end
  6. module CUPIDK::NGVAR
  7.    # 被跨存档变量占用的变量位置
  8.  
  9.    VAR_RANGE = 1..100
  10.  
  11.   # 这里设置一些初始的数值 ↓
  12.    # 数字类变量初始化请写在这里
  13.    SETINIT_VAR = [0]
  14.  
  15.    NGTIMES_VARID = 1   # 存储周目数的跨存档变量ID
  16.  
  17.    NGCASE_SIZE = 3 # 这里设置每次周目额外获得的仓库容量上限
  18.  
  19.    SETINIT_VAR[NGTIMES_VARID] = 1  # 周目数初始化
  20.  
  21.  
  22.    # 各种数据类请保存在这里(如数组,哈希表等)
  23.    SETINIT_DATA = {
  24.    "NG_items" => {} , # 跨存档物品
  25.    }
  26.  
  27.   def self.init_Ngdata(name)
  28.     save_data(SETINIT_DATA, name)
  29.   end  
  30.   def self.data_set(name)
  31.     init_Ngdata(name) unless FileTest.exist?(name)
  32.     @Game_DataNg = load_data(name)
  33.   end  
  34.   def self.get_data
  35.     @Game_DataNg
  36.   end
  37.  
  38.   def self.init_Ngvar(name)
  39.     save_data(SETINIT_VAR, name)
  40.   end  
  41.   def self.var_set(name)
  42.     init_Ngvar(name) unless FileTest.exist?(name)
  43.     @Game_VarNg = load_data(name)
  44.   end  
  45.   def self.var_refresh(var_id, value, name = "Data/NGvar.rxdata")
  46.     @Game_VarNg[var_id] = value
  47.     save_data(@Game_VarNg, name)
  48.   end  
  49.   def self.get_var(var_id)
  50.     @Game_VarNg[var_id] || 0
  51.   end
  52. end
  53. class Scene_Title
  54.   include CUPIDK
  55.   alias :old_start_21518 :main
  56.   def main
  57.      NGVAR.data_set("Data/NGdata.rxdata")
  58.      NGVAR.var_set("Data/NGvar.rxdata")
  59.      old_start_21518
  60.    end   
  61. end
  62. class Game_Variables
  63.   include CUPIDK
  64.   alias_method "old_var_give_21518", "[]="
  65.   def []=(var_id, value)
  66.     return NGVAR.var_refresh(var_id, value) if NGVAR::VAR_RANGE === var_id
  67.     old_var_give_21518(var_id, value)
  68.   end
  69.   alias_method "old_var_21518", "[]"
  70.   def [](var_id)
  71.     return NGVAR.get_var(var_id) if NGVAR::VAR_RANGE === var_id
  72.     old_var_21518(var_id)
  73.   end
  74. end


RUBY 代码复制
  1. # 多周目物品箱   by cupidk rays
  2. # 需配合本工程内的跨存档变量
  3. # 使用方法 调用脚本$scene = Scene_NGCase.new
  4. class Game_Party; attr_accessor :items ; end  
  5. class Window_NgItem < Window_Item
  6.   def refresh
  7.     if self.contents != nil
  8.       self.contents.dispose
  9.       self.contents = nil
  10.     end
  11.     @data = []
  12.     (1...$data_items.size).each do |i|
  13.       if Ngitem_number(i) > 0
  14.         @data.push($data_items[i])
  15.       end
  16.     end
  17.     @item_max = @data.size
  18.     if @item_max > 0
  19.       self.contents = Bitmap.new(width - 32, row_max * 32)
  20.       (0...@item_max).each do |i|
  21.         draw_item(i)
  22.       end
  23.     end
  24.   end  
  25.   def Ngitem_number(id)
  26.     data = CUPIDK::NGVAR.get_data["NG_items"]
  27.     n = data.include?(id) ? data[id] : 0
  28.   end  
  29.   def draw_item(index)
  30.     item = @data[index]
  31.     number = Ngitem_number(item.id)
  32.     x = 4 + index % 2 * (288 + 32)
  33.     y = index / 2 * 32
  34.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  35.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  36.     bitmap = RPG::Cache.icon(item.icon_name)
  37.     opacity = self.contents.font.color == normal_color ? 255 : 128
  38.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  39.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  40.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  41.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  42.   end
  43. end  
  44. class Window_HaveItem < Window_Item
  45.    def draw_item(index)
  46.     item = @data[index]
  47.     case item
  48.     when RPG::Item
  49.       number = $game_party.item_number(item.id)
  50.     when RPG::Weapon
  51.       number = $game_party.weapon_number(item.id)
  52.     when RPG::Armor
  53.       number = $game_party.armor_number(item.id)
  54.     end
  55.     x = 4 + index % 2 * (288 + 32)
  56.     y = index / 2 * 32
  57.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  58.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  59.     bitmap = RPG::Cache.icon(item.icon_name)
  60.     opacity = self.contents.font.color == normal_color ? 255 : 128
  61.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  62.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  63.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  64.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  65.   end
  66. end  
  67. class Scene_NGCase
  68.   include CUPIDK
  69.   def main
  70.     # 生成帮助窗口、物品窗口
  71.     @help_window = Window_Help.new
  72.     @item_window = Window_HaveItem.new
  73.     @item_window.y += 285
  74.     @item_window.height = 130
  75.     @item_window.help_window = @help_window
  76.     @Ngitem_window = Window_NgItem.new
  77.     @Ngitem_window.help_window = @help_window
  78.     @Ngitem_window.height = 284
  79.     if $game_party.items.empty? || !$game_party.items.any? {|k,v| v >= 1 }
  80.       @item_window.active = false
  81.     else  
  82.       @Ngitem_window.active = false
  83.     end
  84.     # 执行过度
  85.     Graphics.transition
  86.     # 主循环
  87.     loop do
  88.       Graphics.update
  89.       Input.update
  90.       update
  91.       if $scene != self
  92.         break
  93.       end
  94.     end
  95.     Graphics.freeze
  96.     # 释放窗口
  97.     @help_window.dispose
  98.     @item_window.dispose
  99.     @Ngitem_window.dispose
  100.   end
  101.   # 画面更新
  102.   def update
  103.     @help_window.update
  104.     @item_window.update
  105.     @Ngitem_window.update
  106.     if @item_window.active
  107.       update_item
  108.       return
  109.     end
  110.     if @Ngitem_window.active
  111.       update_Ngitem
  112.       return
  113.     end
  114.   end  
  115.  
  116.   def Ngitems
  117.     NGVAR.get_data["NG_items"]
  118.   end  
  119.   # 跨存档储存窗口
  120.   def update_Ngitem
  121.     if Input.trigger?(Input::B)
  122.       $game_system.se_play($data_system.cancel_se)
  123.       $scene = Scene_Map.new
  124.       return
  125.     end
  126.     if Input.trigger?(Input::C)
  127.        @Ngitem = @Ngitem_window.item
  128.        num = 1
  129.        if NGVAR.get_data["NG_items"].include?(@Ngitem.id) && NGVAR.get_data["NG_items"][@Ngitem.id] >= num
  130.          NGVAR.get_data["NG_items"][@Ngitem.id] -= num
  131.          if $game_party.items.include?(@Ngitem.id)
  132.            $game_party.gain_item(@Ngitem.id, num)
  133.          else
  134.            $game_party.items[@Ngitem.id] = num
  135.          end  
  136.          $game_system.se_play($data_system.decision_se)
  137.          name = "Data/NGdata.rxdata"
  138.          save_data(NGVAR.get_data, name)
  139.          @item_window.refresh
  140.          @Ngitem_window.refresh
  141.        else
  142.         $game_system.se_play($data_system.cancel_se)
  143.        end  
  144.     end
  145.   end  
  146.   # 角色物品窗口
  147.   def update_item
  148.     if Input.trigger?(Input::B)
  149.        $game_system.se_play($data_system.cancel_se)
  150.        @Ngitem_window.active = true
  151.        @item_window.active = false
  152.       return
  153.     end
  154.     if Input.trigger?(Input::C)
  155.       @item = @item_window.item
  156.       id = NGVAR::NGTIMES_VARID
  157.       max = $game_variables[id] * NGVAR::NGCASE_SIZE
  158.       ngmax = NGVAR.get_data["NG_items"].select do |k, v|
  159.         v > 0
  160.       end  
  161.       if (NGVAR.get_data["NG_items"][@item.id].nil? || NGVAR.get_data["NG_items"][@item.id] == 0) &&
  162.         max <= ngmax.size
  163.         return $game_system.se_play($data_system.cancel_se)
  164.       end  
  165.       # 演奏确定 SE
  166.       num = 1
  167.       if $game_party.items.include?(@item.id) && $game_party.item_number(@item.id) >= num
  168.           $game_party.gain_item(@item.id, -num)
  169.         if NGVAR.get_data["NG_items"][@item.id]
  170.           NGVAR.get_data["NG_items"][@item.id] += num
  171.         else
  172.           NGVAR.get_data["NG_items"][@item.id] = num
  173.         end
  174.         $game_system.se_play($data_system.decision_se)
  175.         name = "Data/NGdata.rxdata"
  176.         save_data(NGVAR.get_data, name)
  177.         @item_window.refresh
  178.         @Ngitem_window.refresh
  179.       else
  180.         $game_system.se_play($data_system.cancel_se)
  181.       end  
  182.     end
  183.   end
  184. end

作者: taeckle    时间: 2021-6-13 21:48
Cupidk爱呗茶 发表于 2021-5-18 21:21
花了一下午写的 虽说可能比不上论坛上其他大神的作品 而且代码方面会有点乱 不过我尽力了..
基本 ...


大神请问下这个脚本的第3行里“# 变量获取方法 CUPIDK::NGVAR.get_var(id)”的那个“::”符号是啥意思啊?
作者: Cupidk爱呗茶    时间: 2021-6-14 22:13
本帖最后由 Cupidk爱呗茶 于 2021-6-14 22:24 编辑
taeckle 发表于 2021-6-13 21:48
大神请问下这个脚本的第3行里“# 变量获取方法 CUPIDK::NGVAR.get_var(id)”的那个“::”符号是啥意思啊 ...


是一个链接常量的用法 在脚本中的含义大概就是 获取CUPIDK模块中NGVAR模块
我们的跨存档变量就存储在NGVAR模块中
作者: taeckle    时间: 2021-6-16 05:56
Cupidk爱呗茶 发表于 2021-6-14 22:13
是一个链接常量的用法 在脚本中的含义大概就是 获取CUPIDK模块中NGVAR模块
我们的跨存档变量就存储在NGV ...

请问大神,那个NGVAR模块是CUPIDK模块的子模块吗?在一个大模块(CUPIDK)里是怎样再定义出一个小模块(NGVAR)的呢?
作者: 精灵使者    时间: 2021-6-20 09:26
taeckle 发表于 2021-6-16 05:56
请问大神,那个NGVAR模块是CUPIDK模块的子模块吗?在一个大模块(CUPIDK)里是怎样再定义出一个小模块(NGVA ...

不对,这个CPUICK直接在module里面写就行了,用的时候直接链接就行
作者: taeckle    时间: 2021-7-15 07:46
Cupidk爱呗茶 发表于 2021-6-14 22:13
是一个链接常量的用法 在脚本中的含义大概就是 获取CUPIDK模块中NGVAR模块
我们的跨存档变量就存储在NGV ...

报告大佬,您发布的存储箱代码测试结果为每周目增加储存的道具种类数量上限增加3,请问下怎么改成单纯道具数量增加3呢?
作者: Cupidk爱呗茶    时间: 2021-8-9 16:24
本帖最后由 Cupidk爱呗茶 于 2021-8-13 23:49 编辑
taeckle 发表于 2021-7-15 07:46
报告大佬,您发布的存储箱代码测试结果为每周目增加储存的道具种类数量上限增加3,请问下怎么改成单纯道 ...


非常抱歉最近有事回复迟了点 可以这样改
替换跨存档箱子中的这个方法
RUBY 代码复制
  1. # 角色物品窗口
  2.   def update_item
  3.     if Input.trigger?(Input::B)
  4.        $game_system.se_play($data_system.cancel_se)
  5.        @Ngitem_window.active = true
  6.        @item_window.active = false
  7.       return
  8.     end
  9.     if Input.trigger?(Input::C)
  10.         @item = @item_window.item
  11.         id = NGVAR::NGTIMES_VARID
  12.        max = $game_variables[id] * NGVAR::NGCASE_SIZE
  13.        ngmax = NGVAR.get_data["NG_items"].inject(0) do |result, item|
  14.          result + item[1]
  15.        end  
  16.       # 演奏确定 SE
  17.         num = 1
  18.         return $game_system.se_play($data_system.cancel_se) if ngmax + num > max
  19.        if $game_party.items.include?(@item.id) && $game_party.item_number(@item.id) >= num
  20.            $game_party.gain_item(@item.id, -num)
  21.          if NGVAR.get_data["NG_items"][@item.id]
  22.             NGVAR.get_data["NG_items"][@item.id] += num
  23.          else
  24.             NGVAR.get_data["NG_items"][@item.id] = num
  25.          end
  26.         $game_system.se_play($data_system.decision_se)
  27.         name = "Data/NGdata.rxdata"
  28.         save_data(NGVAR.get_data, name)
  29.         @item_window.refresh
  30.         @Ngitem_window.refresh
  31.        else
  32.         $game_system.se_play($data_system.cancel_se)
  33.       end  
  34.     end
  35.   end

作者: taeckle    时间: 2021-8-12 18:37
本帖最后由 taeckle 于 2021-8-12 19:11 编辑
Cupidk爱呗茶 发表于 2021-8-9 16:24
非常抱歉最近有事回复迟了点 可以这样改
替换跨存档箱子中的这个方法
  


大神你这段脚本哪句代码是控制箱子存储数量上限为$game_variable[1]*3的啊?我在你这段脚本里就没看到个数字3。。。




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