设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2461|回复: 5
打印 上一主题 下一主题

[已经解决] 一键出售的问题

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1373
在线时间
295 小时
注册时间
2014-6-24
帖子
100
跳转到指定楼层
1
发表于 2016-11-15 02:36:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 【蛋塔】 于 2016-11-15 02:44 编辑

RUBY 代码复制
  1. #===============================================================================
  2. # 为了能够把数组读出来啦
  3. #===============================================================================
  4.  
  5. class Game_Party
  6.   attr_accessor :items
  7.   attr_accessor :weapons
  8.   attr_accessor :armors
  9. end
  10. #===============================================================================
  11.  
  12.  
  13. module Crysse
  14.   #===============================================================================
  15.   # 查找背包内的物品并返回数组
  16.   # 条件:稀有度,判定方向(< 小于 =等于 >大于)
  17.   #===============================================================================
  18.   def self.oks_search(rarity = 0, dir = "<=")
  19.     #防手滑
  20.     return {},{},0,0 if $game_party == nil
  21.  
  22.     res1 = {} #结果数组
  23.     res2 = {} #结果数组
  24.     amount = 0 #总价
  25.     count = 0 #计数
  26.  
  27.     # 执行筛选武器
  28.       $game_party.weapons.each{|i,n|
  29.           e = $data_weapons[i]
  30.           if( eval( e.rarity.to_s + dir + rarity.to_s))
  31.             res1[i] = n
  32.             amount += n * e.price
  33.             count += n
  34.           end
  35.       }
  36.     # 执行筛选防具
  37.       $game_party.armors.each{|i,n|
  38.           e = $data_armors[i]
  39.           if( eval( e.rarity.to_s + dir + rarity.to_s))
  40.             res2[i] = n
  41.             amount += n * e.price
  42.             count += n
  43.           end
  44.       }
  45.     #返回结果数组和总价
  46.     return res1,res2,amount,count
  47.   end
  48.   #=============================================================================
  49.   # 熟练地售出条件指定品质的装备
  50.   # 条件:稀有度,判定方向(< 小于 =等于 >大于)
  51.   # 可变调用,输入已经筛选的结果,或者是按照条件查找
  52.   #=============================================================================
  53.   #def self.oks_sale(rarity = 0, dir = "<=")
  54.   def self.oks_sale(ary = 0,dir = "<=")
  55.     ary = ary
  56.     if ary == 0
  57.       ary = oks_search(ary, dir)
  58.     end
  59.     res1 = ary[0]
  60.     res2 = ary[1]
  61.     amount = ary[2]
  62.     count = ary[3]
  63.     text = "售出#{count}件装备,获得#{amount}#{$data_system.words.gold},确定吗?"
  64.     #调用显示确认窗口
  65.     text_window = Window_Base.new(150,150,396,80)
  66.     text_window.contents = Bitmap.new(360,64)
  67.     text_window.contents.draw_text(0, 0, 360, 64, text)
  68.     window = Window_Command.new(128,["确定","取消"])
  69.     window.x = 150
  70.     window.y = 232
  71.     loop do
  72.       Input.update
  73.       Graphics.update
  74.       window.update
  75.       if Input.trigger?(Input::C)
  76.         case window.index
  77.         when 0
  78.           $game_system.se_play($data_system.decision_se)
  79.           res1.each{|i,n|$game_party.lose_weapon(i, n)}
  80.           res2.each{|i,n|$game_party.lose_armor(i, n)}
  81.           $game_party.gain_gold(amount)
  82.            Graphics.freeze
  83.           text_window.dispose
  84.           window.dispose
  85.           Graphics.transition
  86.           return true
  87.         when 1
  88.           $game_system.se_play($data_system.cancel_se)
  89.           Graphics.freeze
  90.           text_window.dispose
  91.           window.dispose
  92.           Graphics.transition
  93.           return false
  94.         end
  95.  
  96.       end
  97.       if Input.trigger?(Input::B)
  98.         $game_system.se_play($data_system.cancel_se)
  99.         Graphics.freeze
  100.         text_window.dispose
  101.         window.dispose
  102.         Graphics.transition
  103.         return false
  104.       end
  105.     end
  106.   end
  107.  
  108.   #=============================================================================
  109.   # 根据颜色选择
  110.   #=============================================================================
  111.   def self.oks_sale_color(colors = "白") #多选,oks_sale_color("灰白绿蓝紫红金")
  112.     rst = [{},{},0,0]
  113.     #colors = colors.scan(/./)
  114.     if colors.include?("灰") #0-
  115.       rst.addup(oks_search(0,"<"))
  116.     end
  117.     if colors.include?("白") #0
  118.       rst.addup(oks_search(0,"=="))
  119.     end
  120.     if colors.include?("绿") #1
  121.       rst.addup(oks_search(1,"=="))
  122.     end
  123.     if colors.include?("蓝") #23
  124.       rst.addup(oks_search(2,"=="))
  125.     end
  126.     if colors.include?("紫") #45
  127.       rst.addup(oks_search(4,"=="))
  128.       rst.addup(oks_search(5,"=="))
  129.     end
  130.     if colors.include?("红") #67
  131.       rst.addup(oks_search(3,"=="))
  132.     end
  133.     if colors.include?("金") #8+
  134.       rst.addup(oks_search(6,">="))
  135.     end
  136.     return oks_sale(rst)
  137.   end
  138.  
  139.   #=============================================================================
  140.   # 选择颜色并显示统计结果
  141.   #=============================================================================
  142.   def self.oks_sel
  143.     text_window = Window_Base.new(150,150,396,80)
  144.     text_window.contents = Bitmap.new(350,64)
  145.     text_window.contents.font.size = 15
  146.     text_window.contents.draw_text(0, 0, 350, 64, "↑选中 ↓取消 ←→移动 空格键出售 ESC退出")
  147.     w1 = Window_Base.new(150,150,396,80)
  148.     w1.contents = Bitmap.new(360,80)
  149.     i = 0
  150.     ary = ["灰","白","绿","蓝","紫","红","金"]
  151.     aryc = [ Color.new(160,160,160),
  152.               Color.new(255,255,255),
  153.               Color.new(0,255,0),
  154.               Color.new(0,120,255),
  155.               Color.new(160, 0, 255),
  156.               Color.new(255,120,0),
  157.               Color.new(255,255,0)
  158.           ]
  159.     arys = [false,false,false,false,false,false,false]
  160.     cur = 0
  161.     b = Color.new(0,255,0)
  162.     w = Color.new(255,255,255)
  163.     for c in 0..ary.size-1
  164.       if(cur == c)
  165.         w1.contents.fill_rect( 4+c * 24 - 1,3,18,18,b)
  166.         w1.contents.fill_rect( 4+c * 24 - 2,2,20,20,w)
  167.       end
  168.       if(arys[c])
  169.         w1.contents.fill_rect( 4+c * 24 - 4,0,24,24,b)
  170.       end
  171.       w1.contents.fill_rect( 4+c * 24,4,16,16,aryc[c])
  172.     end
  173.     ofr = Graphics.frame_rate
  174.     Graphics.frame_rate = 2
  175.     loop do
  176.       Input.update
  177.       Graphics.update
  178.       if(Input.trigger?(Input::C))
  179.         $game_system.se_play($data_system.decision_se)
  180.         cs = ""
  181.         for i in 0..ary.size-1
  182.           if(arys[i])
  183.             cs += ary[i]
  184.           end
  185.         end
  186.         Graphics.frame_rate = ofr
  187.         text_window.visible  = false
  188.         text_window.update
  189.         if(oks_sale_color cs)
  190.           break
  191.         end
  192.         text_window.visible  = true
  193.         text_window.update
  194.         ofr = Graphics.frame_rate
  195.         Graphics.frame_rate = 2
  196.       end
  197.       if(Input.trigger?(Input::B))
  198.         $game_system.se_play($data_system.cancel_se)
  199.         break
  200.       end
  201.       case(Input.dir4)
  202.       when 2
  203.         $game_system.se_play($data_system.cancel_se)
  204.         arys[cur] = false
  205.       when 4
  206.         cur = (cur + arys.size - 1) % arys.size
  207.       when 6
  208.         cur = (cur + arys.size + 1) % arys.size
  209.       when 8
  210.         $game_system.se_play($data_system.decision_se)
  211.         arys[cur] = true
  212.       end
  213.       w1.contents.clear
  214.       for c in 0..ary.size-1
  215.         if(arys[c])
  216.           w1.contents.fill_rect( 4+c * 24 - 4,0,24,24,b)
  217.         end
  218.         if(cur == c)
  219.           w1.contents.fill_rect( 4+c * 24 - 1,3,18,18,b)
  220.           w1.contents.fill_rect( 4+c * 24 - 2,2,20,20,w)
  221.         end
  222.         w1.contents.fill_rect( 4+c * 24,4,16,16,aryc[c])
  223.       end
  224.     end
  225.     Graphics.frame_rate = ofr
  226.     Graphics.freeze
  227.     w1.dispose
  228.     text_window.dispose
  229.     Graphics.transition
  230.   end
  231. end


我用的是叶子 的随机装备生成系统 v1.4脚本,为了过滤和快速卖掉没用的垃圾装备,所以找到了这个“一键出售装备”的脚本,可以选择装备的颜色进行一键出售
刚开始没发现什么问题,后来反复测试之后才发现存档的大小会受到“背包里的装备”的数量影响,背包中的装备越多越卡,这个很正常,但是我用了一键出售了啊 背包已经空了,但是存档还是那么大
一般正常的存档也就400-1000KB的大小,可是我这个获得越多装备保存后存档文件就越大,我尝试不停的获得装备 最后存档是无限大,弄到38MB...........我才发现原来一键出售卖出去的装备虽然已经获得了金币,也失去了装备,但实际上就跟没卖掉一样很卡很卡,背包是空的时候打开背包也很卡,存档只会不停的变大,最后造成无法读档,理论上存档文件大小不应该会这样,总感觉一键出售出去的装备并没有真正的出售 不断累积大量缓存数据 造成存档大到卡机并无法读档....总不会夸张到几十MB吧?而且读档存档都特别的卡。因为脚本不是自己的写的,本来自己也不是很懂脚本,所以就发上来求助了
(其他脚本我都隔开分别测试过了,已经确认是一键出售脚本的问题)
希望各位前辈能抽点时间帮我看看问题出在哪?万分感谢!

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 减少武器
  3.   #     weapon_id : 武器 ID
  4.   #     n         : 个数
  5.   #     serch     : 为true时搜索同母本物品删除
  6.   #--------------------------------------------------------------------------
  7.   def lose_weapon(weapon_id, n, serch = false)
  8.     # 调用 gain_weapon 的数值逆转
  9.     gain_weapon(weapon_id, -n, serch)
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 减少防具
  13.   #     armor_id : 防具 ID
  14.   #     n        : 个数
  15.   #--------------------------------------------------------------------------
  16.   def lose_armor(armor_id, n, serch = false)
  17.     # 调用 gain_armor 的数值逆转
  18.     gain_armor(armor_id, -n, serch)
  19.   end
  20. end

一键出售脚本中并没看到有上面这段减少装备的脚本,所以我猜想一键出售脚本应该还存在某些漏洞

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

来自 4楼
发表于 2016-11-15 22:00:08 | 只看该作者
看了脚本,存档无限增大的原因是显然的。

问题不在一键出售的脚本上面,而是在随机装备脚本上面。

随机装备脚本生成装备的机制是这样的,每获得一个装备,它都会先依照数据库为母本,创造一个数据随机的新装备,并且把这个装备添加到当前的临时数据缓存中。这个添加是永久的,也就是说一旦生成了某件装备,它就作为数据库的一部分一直存在于缓存中,不管你的背包是否有这件装备。因此把装备清除之后,存档越来越大是显而易见的。

至于打开背包的卡顿,也是这个问题。RMXP默认打开背包检查物品时,要逐个遍历数据库的所有物品,如果你的数据库很大,即使你的背包是空的,那么这个遍历将会消耗较多时间(计算机会花费较多时间最终判定你的背包里什么都没有)。

解决的办法,我提供一种思路:既然随机装备脚本生成了一件装备之后,这个装备就是独一无二的,因此,删掉这个装备的同时,也需要将临时数据库缓存对应的记录也删掉,这样就不会造成存档过大的问题。建议修改的地方是:
随机装备中的 gain_weapon lose_weapon 方法
随机装备中的 create_item 方法(这个方法里面有动态指定新装备 ID 的实现,因此删记录时必须同时改这里)

点评

谢谢版主提供思路~  发表于 2016-11-15 22:09
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

2
发表于 2016-11-15 10:06:00 | 只看该作者
一件出售的脚本79~81行是有增减装备的命令的。但是这个脚本基于默认的装备系统。

楼主所说的随机装备系统很可能更改了默认的装备系统结构,导致这个脚本不适用。

建议把随机装备系统一并发上来,因为这两个脚本并不是配套的。

点评

以下2条就是随机装备的核心脚本,谢谢版主的帮忙  发表于 2016-11-15 12:55
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1373
在线时间
295 小时
注册时间
2014-6-24
帖子
100
3
 楼主| 发表于 2016-11-15 12:10:57 | 只看该作者
RyanBern 发表于 2016-11-15 10:06
一件出售的脚本79~81行是有增减装备的命令的。但是这个脚本基于默认的装备系统。

楼主所说的随机装备系统 ...
  1. =begin
  2. ==========================================================================
  3.   随机装备生成系统 v1.4
  4. ==========================================================================

  5.   By 叶子 SailCat

  6.   这个系统是在SailCat的随机武器生成系统的基础上编写而成
  7.   类似《暗黑破坏神》的随机生成装备
  8.   
  9.   4-10-2006 1.0
  10.   -先行体验版
  11.   
  12.   4-11-2006 1.1
  13.   -事件调用失去武器防具时,从最后的一个开始失去
  14.   -修正了生成装备时不会出现同样品质的前缀和后缀的BUG
  15.   -部分参数变动,增加了忽略定量参数
  16.   -避免了某些一时冲动插入本脚本,连数据库都不调一下的行为而导致的错误
  17.   
  18.   4-30-2006 1.2
  19.   -修正Window_Base描绘物品的BUG
  20.   -修正杀死敌人不能获得装备的BUG
  21.   -改写了生成装备ID时的冗余代码
  22.   
  23.   5-19-2006 1.3
  24.   -修正了一个致命BUG
  25.   
  26.   11-29-2006 1.4
  27.   -简化了品质设置
  28.   -增加了装备初始权值的设定
  29.   -删除了检查数据库的代码
  30.   -修正了能否装备判定的BUG

  31. --------------------------------------------------------------------------
  32.   随机装备生成系统·核心
  33. --------------------------------------------------------------------------
  34.   本部分是随机装备生成系统的核心,基本不会造成与其它脚本冲突,但缺少“随机装备生
  35.   成系统·接入”的话,不能融合到游戏脚本中。
  36.   
  37. -----------
  38.   使用前须知
  39. -----------
  40.   
  41.   -本系统分成两个部分,分别为“随机装备生成系统·核心”和
  42.   “随机装备生成系统·接入”,使用时两个部分都要插入。
  43.   
  44.   -因为本系统对RPG底层数据结构的改动非常大,对RGSS完全不了解者不建议采用本系统。
  45.   
  46.   -强烈推荐下载范例工程,可以有一个更直观的认识。
  47.   
  48.   -虽然比SailCat原来的随机武器生成系统的冲突小了一点,但仍然具有很高的冲突性,
  49.   发生冲突的地方大部分都是在“随机装备生成系统·接入”中。
  50.   
  51.   -请仔细耐心阅读完全部说明,最好能看看范例工程中的数据库是怎样设置的。
  52.   
  53. -----------
  54.   简要使用步骤
  55. -----------

  56. 1、插入“随机装备生成系统·核心”和“随机装备生成系统·接入”到Main之上
  57. (根据喜好还可以使用附带的已整合脚本:“得失物品金钱提示”和“装备属性显示”)

  58. 2、在数据库中的武器和防具部分设置分散数据用装备、前缀和后缀,
  59. ID请按 Ctrl+F 搜索“■ 随机武器”和“■ 随机防具”,在那里的常量设定里。

  60. -----------
  61.   深入说明(核心部分)
  62. -----------
  63.   
  64.   在“随机装备生成系统·接入”中还有一些关于获得和失去武器的说明
  65.   
  66.   1、主要名词解释
  67.   
  68.   1.1 母本:
  69.   
  70.   数据库中原本设定的武器(防具),作为随机生成装备数据的基础
  71.   如果母本的属性里面勾了某个品质(见1.5),它就不会被附加上该种品质的前缀和后缀
  72.   
  73.   1.2 前缀:
  74.   
  75.   数据库中指定ID范围的武器(防具),对随机生成装备的数据进行加成,同时在生成的装
  76.   备名称前面加上前缀名称,在生成的装备的说明后面加上前缀说明。
  77.   
  78.   设定位置:数据库中的武器(防具)中
  79.   
  80.   1.3 后缀
  81.   
  82.   数据库中指定ID范围的武器(防具),对随机生成装备的数据进行加成,同时在生成的装
  83.   备名称前面加上后缀名称,在生成的装备的说明后面加上后缀说明。
  84.   
  85.   设定位置:数据库中的武器(防具)中
  86.   
  87.   1.4 分散数据处理ID
  88.   
  89.   对应数据库中的装备ID,用来作装备数据浮动用。为了避免极品和垃圾相差太远,不建议
  90.   把分散数据处理用装备的数据设置得太夸张。
  91.   
  92.   1.5 品质
  93.   
  94.   每一个前缀和后缀都要选择它的品质,品质决定其出现概率
  95.   
  96.   设定位置:数据库中的系统-属性,同时每一个前缀和后缀都要勾上对应品质
  97.   
  98.   1.6 权值
  99.   
  100.   权值决定了装备的颜色
  101.   生成装备的总权值 = 母本权值 + 所有前缀权值 + 所有后缀权值
  102.   
  103.   权值设置方法(无论母本、前缀、后缀都可设置)
  104.   在装备的说明中加上: \权值[n]
  105.   那么它的权值就为n
  106.   不设置的话,权值默认为0
  107.   范例游戏中有设置权值
  108.   
  109.   1.7 生成一个装备的简要流程(忽略参数和定量):
  110.   
  111.   取得母本(例如事件-获得武器)
  112.   
  113.     |
  114.   
  115.   装备数据的所有数据代入母本数据
  116.   
  117.     |
  118.    
  119.   -开始前缀处理:
  120.   
  121.   按品质概率随机选取一个品质
  122.   
  123.   在属于这个品质的所有前缀中随机取得一个前缀
  124.   
  125.   ·条件分歧:如果前缀没有勾选“no text”属性
  126.   
  127.     装备的名称前插入前缀的名称
  128.    
  129.     装备的说明后加入前缀的说明
  130.   
  131.   ·分歧结束
  132.   
  133.   装备的动画ID = 前缀的动画ID(如果前缀的动画ID不为空)(只有武器才有动画ID)
  134.   
  135.   装备的自动状态ID = 前缀的自动状态ID(如果前缀的自动状态ID不为空)(只用防具才有自动状态ID)
  136.   
  137.   装备的价格 = 其本身 × 前缀的价格 × 0.01
  138.   
  139.   ·条件分歧:如果前缀勾选了“套用基准值”属性
  140.   
  141.     装备的其余各项数字类数据(自动状态ID除外) = 其本身 + 前缀对应数据数字 × 母本基准值 × 0.01
  142.    
  143.     (例外:防具的回避修正忽略基准值,以100代替)
  144.   
  145.   ·除此以外的情况
  146.    
  147.     装备的其余各项数字类数据(自动状态ID除外) = 其本身 × 前缀对应数据数字 × 0.01
  148.   
  149.   ·分歧结束
  150.   
  151.   装备的属性(武器)、防御属性(防具)、附加状态(武器)、解除状态(武器)、
  152.   防御状态(防具) 为其本身与前缀的相同项目的并集(也就是加上前缀的属性、状态等)
  153.   
  154.     |

  155.   -开始后缀处理(除了把名称插在后面之外,其余同前缀)
  156.   
  157.     |
  158.   
  159.   -开始分散数据处理(按照设定的分散数据处理次数重复处理):
  160.   
  161.   按概率从分散数据处理ID中随机选出一个ID,取得数据库中ID对应的分散数据处理用装备
  162.   
  163.   装备的价格 = 其本身 × 分散数据处理用装备的价格 × 0.01
  164.   
  165.   ·条件分歧:如果分散数据处理用装备勾选了“套用基准值”属性
  166.   
  167.     装备的其余各项数字类数据(自动状态ID除外) = 其本身 + 分散数据处理用装备对应数据数字 × 母本基准值 × 0.01
  168.    
  169.     (例外:防具的回避修正忽略基准值,以100代替)
  170.   
  171.   ·除此以外的情况
  172.    
  173.     装备的其余各项数字类数据(自动状态ID除外) = 其本身 × 分散数据处理用装备对应数据数字 × 0.01
  174.   
  175.   ·分歧结束
  176.   
  177.   装备的属性(武器)、防御属性(防具)、附加状态(武器)、解除状态(武器)、
  178.   防御状态(防具) 为其本身与分散数据处理用装备的相同项目的并集
  179.   (也就是加上分散数据处理用装备的属性、状态等)
  180.   
  181.     |
  182.   
  183.   -开始数据取整
  184.   
  185.     |
  186.   
  187.   -装备生成完毕
  188.   
  189.   简单来说,进行加成就是以新数据(前缀或后缀)乘以旧数据(母本)除以100,同时将
  190.   新数据的各项属性和状态套入旧属性。
  191.   
  192.   一般的话,一个没有勾选“套用基准值”属性的前缀或后缀,其各项数字类数据都是100
  193.   或接近于100,作为加成的百分比。如果勾选了“套用基准值”,除了要加成的项目,各
  194.   项数字都是0。
  195.   
  196.   1.8 基准值:
  197.   
  198.   如果前缀(后缀)勾选了“套用基准值”属性的话,用基准值来代替装备的数据进行加成
  199.   
  200.   例如铜剑防御力为0,但有一个前缀是给武器加防御的,如果不套用基准值的话:
  201.   生成后装备防御力 = 铜剑防御力(0) × 前缀防御力(例如30) = 0
  202.   套用了基准值的话:
  203.   生成后装备防御力 = 铜剑防御力(0)+ 铜剑基准值(例如100) × 前缀防御力(30) = 30
  204.   
  205.   装备基准值设置方法(只有母本才需要设置基准值)
  206.   在母本装备的说明中加上: \基准值[n]
  207.   那么它的基准值就为n
  208.   不设置的话,基准值默认为0
  209.   范例游戏的母本设置了基准值
  210.   
  211.   1.9 定量
  212.   
  213.   例如有一个前缀和一个后缀,前缀加自动状态“蓄力”,后缀加自动状态“屏障”
  214.   如果两个都没有设置定量或定量相同的话,生成的装备的自动状态为后缀的“屏障”
  215.   如果前缀设置的定量大于后缀的定量,那么这个装备的自动状态就为“蓄力”
  216.   假设这个母本本身带有自动状态,而它的定量比前后缀的定量都大,那么它附加的自动状
  217.   态就不会改变。
  218.   
  219.   前后缀定量设置方法(无论母本、前缀、后缀都可设置)
  220.   在装备的说明中加上: \定量[n]
  221.   那么它的定量就为n
  222.   不设置的话,定量默认为0
  223.   范例游戏中没有设置定量
  224.   
  225.   1.10 防具的前后缀种类(重要!只有防具才有这个设置)
  226.   
  227.   默认的情况下,防具的前缀和后缀只能附加给相同种类的防具。
  228.   例如某前缀的种类为盾,那么这个前缀就只会在盾中出现。
  229.   如果想让一个前缀(后缀)能适用于不同种类的防具,除了设置几个同名不同种类的前缀
  230.   (后缀)外,还可以为同一个前缀(后缀)增加种类。
  231.   
  232.   前后缀种类设置方法(只有前缀和后缀才有这个设置)
  233.   在前后缀用装备的说明中加上: \种类[n]
  234.   (n的值  0:盾 1:头部防具 2:身体防具 3:装饰品)
  235.   那么它也成为了第n类防具的前缀(后缀)。
  236.   
  237.   这个控制码可以重复输入。
  238.   例如想让一个前缀能适用于所有防具,可以选择其种类为盾,在其说明中加上:
  239.   \种类[1]\种类[2]\种类[3]
  240.   
  241.   2、下面开始边设置边进行说明:
  242. =end

  243. # 2.1 设置生成装备名称颜色:

  244. #--------------------------------------------------------------------------
  245. # ● 获取名字颜色
  246. # 根据生成装备的总品质权值决定其名字颜色
  247. # rarity:品质权值
  248. #--------------------------------------------------------------------------
  249. def get_random_equipment_name_color(rarity)
  250.   case rarity
  251.   when 0
  252.     # 白
  253.     return Color.new(255,255,255)
  254.   when 1
  255.     # 绿
  256.     return Color.new(0,255,0)
  257.   when 2
  258.     # 蓝
  259.     return Color.new(0,120,255)
  260.   when 4..5
  261.     # 紫
  262.     return Color.new(160, 0, 255)
  263.   when 3
  264.     # 红
  265.     return Color.new(255,120,0)
  266.   when 8..100
  267.     # 金
  268.     return Color.new(255,255,0)
  269.   else
  270.     # 灰
  271.     return Color.new(160,160,160)
  272.   end
  273. end
  274. module RPG
  275.   #==========================================================================
  276.   #-------------------------------------
  277.   # ◎ 武器类
  278.   #-------------------------------------
  279.   #==========================================================================
  280.   
  281.   #--------------
  282.   # 2.2 设置武器各种参数:
  283.   #--------------
  284.   
  285.   #==========================================================================
  286.   # ■ 随机武器
  287.   #==========================================================================
  288.   class Random_Weapon < Weapon
  289.     #--------------------------------------------------------------------------
  290.     # ● 定义常量
  291.     #--------------------------------------------------------------------------
  292.     # 以下的ID均是指数据库编号
  293.     #--------------
  294.     # 分散数据处理
  295.     #--------------
  296.     # 名词解释:分散数据处理的意思是每生成一个装备,对其各项数值进行浮动,从而
  297.     # 使得即使是同名装备,它们的数据也不一样。
  298.     #
  299.     # 分散数据处理ID和出现概率(ID个数不限)
  300.     # 格式:{ID=>概率, ID=>概率, ID=>概率...}
  301.     # 大括号、等号、小于号、逗号都要用半角
  302.     FIRST_PROCESS_ID = {14=>2, 15=>2, 16=>2, 17=>2, 18=>2, 19=>2, 20=>2,
  303.     21=>2, 22=>2, 23=>2}
  304.     # 前缀
  305.     #--------------
  306.     # 就是在武器名前加上前缀的名称,同时使武器各项数值按照该前缀的数据进行加成
  307.     # 前缀ID(数据库中对应武器ID,例如511..520表示从511到520号武器均为前缀)
  308.     PREFIX_ID = 1..13
  309.     # 每一个前缀记得要勾选品质属性,否则不会生成该前缀
  310.     #--------------
  311.     # 后缀
  312.     #--------------
  313.     # 除了把后缀名称加在武器名后,其余和前缀相同
  314.     # 后缀ID
  315.     SUFFIX_ID = 24..47#false
  316.     #--------------
  317.     # 品质属性
  318.     #--------------
  319.     # 品质属性ID,出现概率和权值(个数不限)
  320.     # 权值:越高代表该品质越好,武器的总品质权值 = 武器母本、前缀和后缀(如果有的话)品质权值之和
  321.     # 格式:{ID=>概率, ID=>概率, ID=>概率, ...}
  322.     RARITY_ELEMENTS = {25=>60, 26=>20, 27=>10, 28=>3}
  323.     #--------------
  324.     # 套用基准值属性ID
  325.     # 如果前缀或后缀勾选了这个属性,就会套用武器基准值。
  326.     REFERENCE_VALUE_ELEMENT = 23
  327.     #--------------
  328.     # 不加入前后缀及说明属性ID
  329.     # 如果前缀或后缀勾选了这个属性,就不在生成的武器名称中加入这个前缀或后缀的
  330.     # 名称,也不加入前缀或后缀的说明
  331.     NO_TEXT_ELEMENT = 24
  332.     #--------------
  333.     # 默认分散数据处理次数
  334.     VARY_DATA_TIMES = 100
  335.    
  336.    
  337.     # 设置防具参数基本同设置武器参数,请按Ctrl+F搜索“防具类”,在那里设置防具参
  338.     # 数
  339.    
  340.     # 下面的prefix_rarity、parameter等参数比较复杂,不要求看懂。它们可以提供更丰
  341.     # 富的扩展性。使用它们的话,需要具有基础RGSS知识。
  342.    
  343.     #--------------------------------------------------------------------------
  344.     # ● 定义实例变量
  345.     #--------------------------------------------------------------------------
  346.     attr_accessor :type                 # 母本ID
  347.     attr_accessor :reference_value      # 基准值,数据加成时用
  348.     attr_accessor :rarity               # 总品质权值
  349.     attr_accessor :reqlevel             # 需求等级(暂时没有实际作用)
  350.     #--------------------------------------------------------------------------
  351.     # ● 初始化对像
  352.     # id : 母本ID(数据库中ID)
  353.     # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  354.     # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  355.     # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
  356.     #    把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
  357.     #    1:不生成前缀
  358.     #    2:不生成后缀
  359.     #    4:不带前缀名称
  360.     #    8:不带后缀名称
  361.     #    16:不进行分散数据处理
  362.     #    32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
  363.     # prefix_id:指定前缀ID,强行附加该前缀
  364.     # suffix_id:指定后缀ID,强行附加该后缀
  365.     #
  366.     # 指定ID可以给武器附加上随机生成不会出现的前后缀(没有勾选品质属性的前后缀)
  367.     #--------------------------------------------------------------------------
  368.     def initialize(id, prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
  369.       # 初始化数据
  370.       @type = id
  371.       @name = $data_weapons[id, true].name
  372.       @icon_name = $data_weapons[id, true].icon_name
  373.       @description = $data_weapons[id, true].description
  374.       @reference_value = $data_weapons[id, true].reference_value
  375.       @current_rating = $data_weapons[id, true].rating
  376.       @animation1_id = $data_weapons[id, true].animation1_id
  377.       @animation2_id = $data_weapons[id, true].animation2_id
  378.       @price = $data_weapons[id, true].price
  379.       [url=home.php?mod=space&uid=101599]@atk[/url] = $data_weapons[id, true].atk
  380.       @pdef = $data_weapons[id, true].pdef
  381.       @mdef = $data_weapons[id, true].mdef
  382.       @str_plus = $data_weapons[id, true].str_plus
  383.       @dex_plus = $data_weapons[id, true].dex_plus
  384.       @agi_plus = $data_weapons[id, true].agi_plus
  385.       @int_plus = $data_weapons[id, true].int_plus
  386.       @element_set = $data_weapons[id, true].element_set
  387.       @plus_state_set = $data_weapons[id, true].plus_state_set
  388.       @minus_state_set = $data_weapons[id, true].minus_state_set
  389.       @rarity = $data_weapons[id, true].rarity
  390.       @reqlevel = 1
  391.       # 随机生成数据处理
  392.       random_data(prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
  393.     end
  394.     #--------------------------------------------------------------------------
  395.     # ● 随机生成数据处理
  396.     #--------------------------------------------------------------------------
  397.     def random_data(prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
  398.       # 前缀处理
  399.       prefix_process(prefix_rarity, parameter, prefix_id)
  400.       # 后缀处理
  401.       suffix_process(suffix_rarity, parameter, suffix_id)
  402.       # 分散数据处理
  403.       vary_data(VARY_DATA_TIMES, parameter)
  404.       # 数据取整
  405.       integer_parameters
  406.     end
  407.     #--------------------------------------------------------------------------
  408.     # ● 前缀处理
  409.     # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
  410.     #    (从最左边为1开始)
  411.     # parameter:参数
  412.     # prefix_id:指定前缀ID
  413.     #--------------------------------------------------------------------------
  414.     def prefix_process(rarity_type=[], parameter=0, prefix_id=0)
  415.       # 判断是否不进行前缀处理
  416.       return if parameter & 0b1 == 0b1
  417.       # 指定了品质的情况
  418.       if rarity_type != []
  419.         rarity_id = rarity_type[rand(rarity_type.size)]
  420.       # 按概率随机选出品质的情况
  421.       else
  422.         temp = []
  423.         for id in RARITY_ELEMENTS.keys
  424.           RARITY_ELEMENTS[id].times do
  425.             temp.push(id)
  426.           end
  427.         end
  428.         return if temp == []
  429.         rarity_id = temp[rand(temp.size)]
  430.       end
  431.       # 指定了前缀的情况
  432.       if prefix_id > 0
  433.         id = prefix_id
  434.       # 随机选出品质对应的前缀的情况
  435.       else
  436.         # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
  437.         return if $data_weapons[@type, true].element_set.include?(rarity_id)
  438.         temp = []
  439.         for i in PREFIX_ID
  440.           if $data_weapons[i, true].element_set.include?(rarity_id)
  441.             temp.push(i)
  442.           end
  443.         end
  444.         return if temp == []
  445.         id = temp[rand(temp.size)]
  446.       end
  447.       # 文字及动画ID处理
  448.       text_process(id, parameter, 1)
  449.       # 数据处理
  450.       number_process(id, rarity_id)
  451.     end
  452.     #--------------------------------------------------------------------------
  453.     # ● 后缀处理
  454.     # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
  455.     #    (从最左边为1开始)
  456.     # parameter:参数
  457.     # suffix_id:指定后缀ID
  458.     #--------------------------------------------------------------------------
  459.     def suffix_process(rarity_type=0, parameter=0, suffix_id=0)
  460.       # 判断是否不进行后缀处理
  461.       return if parameter & 0b10 == 0b10
  462.       # 指定了品质的情况
  463.       if rarity_type != []
  464.         rarity_id = rarity_type[rand(rarity_type.size)]
  465.       # 按概率随机选出品质的情况
  466.       else
  467.         temp = []
  468.         for id in RARITY_ELEMENTS.keys
  469.           RARITY_ELEMENTS[id].times do
  470.             temp.push(id)
  471.           end
  472.         end
  473.         return if temp == []
  474.         rarity_id = temp[rand(temp.size)]
  475.       end
  476.       # 指定了后缀的情况
  477.       if suffix_id > 0
  478.         id = suffix_id
  479.       # 随机选出品质对应的后缀的情况
  480.       else
  481.         # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
  482.         return if $data_weapons[@type, true].element_set.include?(rarity_id)
  483.         temp = []
  484.         for i in SUFFIX_ID
  485.           if $data_weapons[i, true].element_set.include?(rarity_id)
  486.             temp.push(i)
  487.           end
  488.         end
  489.         return if temp == []
  490.         id = temp[rand(temp.size)]
  491.       end
  492.       # 文字及动画ID处理
  493.       text_process(id, parameter, 2)
  494.       # 数据处理
  495.       number_process(id, rarity_id)
  496.     end
  497.     #--------------------------------------------------------------------------
  498.     # ● 文字及动画ID处理
  499.     # fix:1为前缀,2为后缀
  500.     #--------------------------------------------------------------------------
  501.     def text_process(id, parameter=0, fix=0)
  502.       # 名称和动画处理
  503.       # 判断是否加入前后缀及说明
  504.       if !$data_weapons[id, true].element_set.include?(NO_TEXT_ELEMENT)
  505.         case fix
  506.         when 1
  507.           # 判断是否带前缀名称
  508.           if parameter & 0b100 != 0b100
  509.             @name = $data_weapons[id, true].name + @name
  510.           end
  511.         when 2
  512.           # 判断是否带后缀名称
  513.           if parameter & 0b1000 != 0b1000
  514.             @name = @name + $data_weapons[id, true].name
  515.           end
  516.         end
  517.         @description = @description + $data_weapons[id, true].description
  518.       end
  519.       if $data_weapons[@type, true].rating >= @current_rating or (parameter & 0b100000 == 0b100000)
  520.         @icon_name = $data_weapons[id, true].icon_name if $data_weapons[id, true].icon_name != ''
  521.         @animation1_id = $data_weapons[id, true].animation1_id if $data_weapons[id, true].animation1_id != 0
  522.         @animation2_id = $data_weapons[id, true].animation2_id if $data_weapons[id, true].animation2_id != 0
  523.         @current_rating = $data_weapons[@type, true].rating
  524.       end
  525.     end
  526.     #--------------------------------------------------------------------------
  527.     # ● 数字类数据处理
  528.     #--------------------------------------------------------------------------
  529.     def number_process(id, rarity_id = 0)
  530.       # 判断是否套用基准值
  531.       if $data_weapons[id, true].element_set.include?(REFERENCE_VALUE_ELEMENT)
  532.         @price = @price * $data_weapons[id, true].price * 0.01
  533.         @atk += @reference_value * $data_weapons[id, true].atk * 0.01
  534.         @pdef += @reference_value * $data_weapons[id, true].pdef * 0.01
  535.         @mdef += @reference_value * $data_weapons[id, true].mdef * 0.01
  536.         @str_plus += @reference_value * $data_weapons[id, true].str_plus * 0.01
  537.         @dex_plus += @reference_value * $data_weapons[id, true].dex_plus * 0.01
  538.         @agi_plus += @reference_value * $data_weapons[id, true].agi_plus * 0.01
  539.         @int_plus += @reference_value * $data_weapons[id, true].int_plus * 0.01
  540.       else
  541.         @price = @price * $data_weapons[id, true].price * 0.01
  542.         @atk = @atk * $data_weapons[id, true].atk * 0.01
  543.         @pdef = @pdef * $data_weapons[id, true].pdef * 0.01
  544.         @mdef = @mdef * $data_weapons[id, true].mdef * 0.01
  545.         @str_plus = @str_plus * $data_weapons[id, true].str_plus * 0.01
  546.         @dex_plus = @dex_plus * $data_weapons[id, true].dex_plus * 0.01
  547.         @agi_plus = @agi_plus * $data_weapons[id, true].agi_plus * 0.01
  548.         @int_plus = @int_plus * $data_weapons[id, true].int_plus * 0.01
  549.       end
  550.       @element_set = ($data_weapons[id, true].element_set | @element_set) -
  551.       [REFERENCE_VALUE_ELEMENT, NO_TEXT_ELEMENT] - RARITY_ELEMENTS.keys
  552.       @plus_state_set = $data_weapons[id, true].plus_state_set | @plus_state_set
  553.       @minus_state_set = $data_weapons[id, true].minus_state_set | @minus_state_set
  554.       @rarity += $data_weapons[id, true].rarity
  555.     end
  556.     #--------------------------------------------------------------------------
  557.     # ● 分散数据处理
  558.     # times:处理次数
  559.     # parameter:参数
  560.     #--------------------------------------------------------------------------
  561.     def vary_data(times=VARY_DATA_TIMES, parameter=0)
  562.       # 判断是否不进行第一数据处理
  563.       return if parameter & 0b10000 == 0b10000
  564.       # 处理times次
  565.       times.times do
  566.         # 按概率随机选出ID
  567.         temp = []
  568.         for id in FIRST_PROCESS_ID.keys
  569.           FIRST_PROCESS_ID[id].times do
  570.             temp.push(id)
  571.           end
  572.         end
  573.         return if temp == []
  574.         id = temp[rand(temp.size)]
  575.         # 数据处理
  576.         number_process(id)
  577.       end
  578.     end
  579.     #--------------------------------------------------------------------------
  580.     # ● 数据取整
  581.     #--------------------------------------------------------------------------
  582.     def integer_parameters
  583.       @price = @price.round
  584.       @atk = @atk.round
  585.       @pdef = @pdef.round
  586.       @mdef = @mdef.round
  587.       @str_plus = @str_plus.round
  588.       @dex_plus = @dex_plus.round
  589.       @agi_plus = @agi_plus.round
  590.       @int_plus = @int_plus.round
  591.     end
  592.     #--------------------------------------------------------------------------
  593.     # ● 定义名字颜色
  594.     #--------------------------------------------------------------------------
  595.     def name_color
  596.       return get_random_equipment_name_color(@rarity)
  597.     end
  598.   end
  599.   #==========================================================================
  600.   # ■ 武器
  601.   #==========================================================================
  602.   class Weapon
  603.     #--------------------------------------------------------------------------
  604.     # ● 定义实例变量
  605.     #--------------------------------------------------------------------------
  606.     attr_accessor :reference_value # 基准值
  607.     attr_accessor :rating          # 定量
  608.     attr_accessor :rarity          # 权值
  609.     #--------------------------------------------------------------------------
  610.     # ● 刷新
  611.     #--------------------------------------------------------------------------
  612.     def refresh
  613.       @description.slice!(/\\基准值\[([0-9]+)\]/)
  614.       @reference_value = $1.to_i
  615.       @description.slice!(/\\定量\[([0-9]+)\]/)
  616.       @rating = $1.to_i
  617.       @description.slice!(/\\权值\[(-*[0-9]+)\]/)
  618.       @rarity = $1.to_i
  619.     end
  620.   end

  621.   #==========================================================================
  622.   #-------------------------------------
  623.   # ◎ 防具类
  624.   #-------------------------------------
  625.   #==========================================================================
  626.   
  627.   #==========================================================================
  628.   # ■ 随机防具
  629.   #==========================================================================
  630.   class Random_Armor < Armor
  631.     #--------------------------------------------------------------------------
  632.     # ● 定义常量
  633.     #--------------------------------------------------------------------------
  634.     # 以下的ID均是指数据库编号
  635.     #--------------
  636.     # 分散数据处理ID和出现概率(个数不限)
  637.     # 格式:{ID=>概率, ID=>概率, ID=>概率...}
  638.     # 大括号、等号、小于号、逗号都要用半角
  639.     FIRST_PROCESS_ID = {1=>2, 2=>2, 3=>2, 4=>2, 5=>2, 6=>2, 7=>2,
  640.     8=>2, 9=>2, 10=>2, 11=>2, 12=>2}
  641.     #--------------
  642.     # 前缀ID
  643.     PREFIX_ID = 13..26
  644.     #--------------
  645.     # 后缀ID
  646.     SUFFIX_ID = 27..101
  647.     #--------------
  648.     # 品质属性ID,出现概率和权值(个数不限)
  649.     # 权值:越高代表该品质越好,暂时没有实际作用
  650.     # 格式:{ID=>概率, ID=>概率, ID=>概率, ...}
  651.     RARITY_ELEMENTS = {25=>60, 26=>20, 27=>10, 28=>3}
  652.     #--------------
  653.     # 套用基准值属性ID
  654.     REFERENCE_VALUE_ELEMENT = 23
  655.     #--------------
  656.     # 不加入前后缀及说明属性ID
  657.     NO_TEXT_ELEMENT = 24
  658.     #--------------
  659.     # 默认分散数据处理次数
  660.     VARY_DATA_TIMES = 100
  661.     #--------------------------------------------------------------------------
  662.     # ● 定义名字颜色
  663.     #--------------------------------------------------------------------------
  664.     def name_color #get_random_equipment_name_color(rarity)
  665.       return get_random_equipment_name_color(@rarity)
  666.       case @rarity
  667.       when 1
  668.         # 绿
  669.         return Color.new(255,120,0)
  670.       when 2..3
  671.         # 蓝
  672.         return Color.new(0,120,255)
  673.       when 4
  674.         # 紫
  675.         return Color.new(160, 0, 255)
  676.       when 6..7
  677.         # 红
  678.         return Color.new(255,120,0)
  679.       when 8..40
  680.         # 金
  681.         return Color.new(255,255,0)
  682.       else
  683.         # 白
  684.         return Color.new(255,255,255)
  685.       end
  686.     end
  687.     #--------------------------------------------------------------------------
  688.     # ● 定义实例变量
  689.     #--------------------------------------------------------------------------
  690.     attr_accessor :type      # 母本ID
  691.     attr_accessor :reference_value      # 基准值,数据加成时用
  692.     attr_accessor :rarity    # 总品质权值
  693.     attr_accessor :reqlevel  # 需求等级(暂时没有实际作用)
  694.     #--------------------------------------------------------------------------
  695.     # ● 初始化对像
  696.     # id : 母本ID(数据库中ID)
  697.     # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  698.     # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  699.     # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
  700.     #    把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
  701.     #    1:不生成前缀
  702.     #    2:不生成后缀
  703.     #    4:不带前缀名称
  704.     #    8:不带后缀名称
  705.     #    16:不进行分散数据处理
  706.     #    32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
  707.     # prefix_id:指定前缀ID,强行附加该前缀
  708.     # suffix_id:指定后缀ID,强行附加该后缀
  709.     #--------------------------------------------------------------------------
  710.     def initialize(id, prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
  711.       @type = id
  712.       @name = $data_armors[id, true].name
  713.       @icon_name = $data_armors[id, true].icon_name
  714.       @description = $data_armors[id, true].description
  715.       @reference_value = $data_armors[id, true].reference_value
  716.       @current_rating = $data_armors[id, true].rating
  717.       @kind = $data_armors[id, true].kind
  718.       @auto_state_id = $data_armors[id, true].auto_state_id
  719.       @price = $data_armors[id, true].price
  720.       @pdef = $data_armors[id, true].pdef
  721.       @mdef = $data_armors[id, true].mdef
  722.       [url=home.php?mod=space&uid=284635]@eva[/url] = $data_armors[id, true].eva
  723.       @str_plus = $data_armors[id, true].str_plus
  724.       @dex_plus = $data_armors[id, true].dex_plus
  725.       @agi_plus = $data_armors[id, true].agi_plus
  726.       @int_plus = $data_armors[id, true].int_plus
  727.       @guard_element_set = $data_armors[id, true].guard_element_set
  728.       @guard_state_set = $data_armors[id, true].guard_state_set
  729.       @rarity = $data_armors[id, true].rarity
  730.       @reqlevel = 1
  731.       # 随机生成数据处理
  732.       random_data(prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
  733.     end
  734.     #--------------------------------------------------------------------------
  735.     # ● 随机生成数据处理
  736.     #--------------------------------------------------------------------------
  737.     def random_data(prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
  738.       # 前缀处理
  739.       prefix_process(prefix_rarity, parameter, prefix_id)
  740.       # 后缀处理
  741.       suffix_process(suffix_rarity, parameter, suffix_id)
  742.       # 分散数据处理
  743.       vary_data(VARY_DATA_TIMES, parameter)
  744.       # 数据取整
  745.       integer_parameters
  746.     end
  747.     #--------------------------------------------------------------------------
  748.     # ● 前缀处理
  749.     # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
  750.     #    (从最左边为1开始)
  751.     # parameter:参数
  752.     # prefix_id:指定前缀ID
  753.     #--------------------------------------------------------------------------
  754.     def prefix_process(rarity_type=[], parameter=0, prefix_id=0)
  755.       # 判断是否不进行前缀处理
  756.       return if parameter & 0b1 == 0b1
  757.       # 指定了品质的情况
  758.       if rarity_type != []
  759.         rarity_id = rarity_type[rand(rarity_type.size)]
  760.       # 按概率随机选出品质的情况
  761.       else
  762.         temp = []
  763.         for id in RARITY_ELEMENTS.keys
  764.           RARITY_ELEMENTS[id].times do
  765.             temp.push(id)
  766.           end
  767.         end
  768.         return if temp == []
  769.         rarity_id = temp[rand(temp.size)]
  770.       end
  771.       # 指定了前缀的情况
  772.       if prefix_id > 0
  773.         id = prefix_id
  774.       # 随机选出品质对应的前缀的情况
  775.       else
  776.         # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
  777.         return if @guard_element_set.include?(rarity_id)
  778.         temp = []
  779.         for i in PREFIX_ID
  780.           if $data_armors[i, true].guard_element_set.include?(rarity_id) and
  781.             $data_armors[i, true].kinds.include?(@kind)
  782.             temp.push(i)
  783.           end
  784.         end
  785.         return if temp == []
  786.         id = temp[rand(temp.size)]
  787.       end
  788.       # 文字、动画、图标和自动状态处理
  789.       text_process(id, parameter, 1)
  790.       # 数据处理
  791.       number_process(id, rarity_id)
  792.     end
  793.     #--------------------------------------------------------------------------
  794.     # ● 后缀处理
  795.     # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
  796.     #    (从最左边为1开始)
  797.     # parameter:参数
  798.     # suffix_id:指定后缀ID
  799.     #--------------------------------------------------------------------------
  800.     def suffix_process(rarity_type=0, parameter=0, suffix_id=0)
  801.       # 判断是否不进行后缀处理
  802.       return if parameter & 0b10 == 0b10
  803.       # 指定了品质的情况
  804.       if rarity_type != []
  805.         rarity_id = rarity_type[rand(rarity_type.size)]
  806.       # 按概率随机选出品质的情况
  807.       else
  808.         temp = []
  809.         for id in RARITY_ELEMENTS.keys
  810.           RARITY_ELEMENTS[id].times do
  811.             temp.push(id)
  812.           end
  813.         end
  814.         return if temp == []
  815.         rarity_id = temp[rand(temp.size)]
  816.       end
  817.       # 指定了后缀的情况
  818.       if suffix_id > 0
  819.         id = suffix_id
  820.       # 随机选出品质对应的后缀的情况
  821.       else
  822.         # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
  823.         return if @guard_element_set.include?(rarity_id)
  824.         temp = []
  825.         for i in SUFFIX_ID
  826.           if $data_armors[i, true].guard_element_set.include?(rarity_id) and
  827.             $data_armors[i, true].kinds.include?(@kind)
  828.             temp.push(i)
  829.           end
  830.         end
  831.         return if temp == []
  832.         id = temp[rand(temp.size)]
  833.       end
  834.       # 文字、动画、图标和自动状态处理
  835.       text_process(id, parameter, 2)
  836.       # 数据处理
  837.       number_process(id, rarity_id)
  838.     end
  839.     #--------------------------------------------------------------------------
  840.     # ● 文字、动画、图标和自动状态处理
  841.     # fix:1为前缀,2为后缀
  842.     #--------------------------------------------------------------------------
  843.     def text_process(id, parameter=0, fix=0)
  844.       # 名称和动画处理
  845.       # 判断是否加入前后缀及说明
  846.       if !$data_armors[id, true].guard_element_set.include?(NO_TEXT_ELEMENT)
  847.         case fix
  848.         when 1
  849.           # 判断是否带前缀名称
  850.           if parameter & 0b100 != 0b100
  851.             @name = $data_armors[id, true].name + @name
  852.           end
  853.         when 2
  854.           # 判断是否带后缀名称
  855.           if parameter & 0b1000 != 0b1000
  856.             @name = @name + $data_armors[id, true].name
  857.           end
  858.         end
  859.         @description = @description + $data_armors[id, true].description
  860.       end
  861.       if $data_armors[@type, true].rating >= @current_rating or (parameter & 0b100000 == 0b100000)
  862.         @icon_name = $data_armors[id, true].icon_name if $data_armors[id, true].icon_name != ''
  863.         @auto_state_id = $data_armors[id, true].auto_state_id if $data_armors[id, true].auto_state_id != 0
  864.         @current_rating = $data_armors[id, true].rating
  865.       end
  866.     end
  867.     #--------------------------------------------------------------------------
  868.     # ● 数字类数据处理
  869.     #--------------------------------------------------------------------------
  870.     def number_process(id, rarity_id = 0)
  871.       # 判断是否套用基准值
  872.       if $data_armors[id, true].guard_element_set.include?(REFERENCE_VALUE_ELEMENT)
  873.         @price = @price * $data_armors[id, true].price * 0.01
  874.         @pdef += @reference_value * $data_armors[id, true].pdef * 0.01
  875.         @mdef += @reference_value * $data_armors[id, true].mdef * 0.01
  876.         @eva += 100 * $data_armors[id, true].eva * 0.01
  877.         @str_plus += @reference_value * $data_armors[id, true].str_plus * 0.01
  878.         @dex_plus += @reference_value * $data_armors[id, true].dex_plus * 0.01
  879.         @agi_plus += @reference_value * $data_armors[id, true].agi_plus * 0.01
  880.         @int_plus += @reference_value * $data_armors[id, true].int_plus * 0.01
  881.       else
  882.         @price = @price * $data_armors[id, true].price * 0.01
  883.         @pdef = @pdef * $data_armors[id, true].pdef * 0.01
  884.         @mdef = @mdef * $data_armors[id, true].mdef * 0.01
  885.         @eva = @eva * $data_armors[id, true].eva * 0.01
  886.         @str_plus = @str_plus * $data_armors[id, true].str_plus * 0.01
  887.         @dex_plus = @dex_plus * $data_armors[id, true].dex_plus * 0.01
  888.         @agi_plus = @agi_plus * $data_armors[id, true].agi_plus * 0.01
  889.         @int_plus = @int_plus * $data_armors[id, true].int_plus * 0.01
  890.       end
  891.       @guard_element_set = ($data_armors[id, true].guard_element_set | @guard_element_set) -
  892.       [REFERENCE_VALUE_ELEMENT, NO_TEXT_ELEMENT] - RARITY_ELEMENTS.keys
  893.       @guard_state_set = $data_armors[id, true].guard_state_set | @guard_state_set
  894.       @rarity += $data_armors[id, true].rarity
  895.     end
  896.     #--------------------------------------------------------------------------
  897.     # ● 分散数据处理
  898.     # times:处理次数
  899.     # parameter:参数
  900.     #--------------------------------------------------------------------------
  901.     def vary_data(times=VARY_DATA_TIMES, parameter=0)
  902.       # 判断是否不进行第一数据处理
  903.       return if parameter & 0b10000 == 0b10000
  904.       # 处理times次
  905.       times.times do
  906.         # 按概率随机选出ID
  907.         temp = []
  908.         for id in FIRST_PROCESS_ID.keys
  909.           FIRST_PROCESS_ID[id].times do
  910.             temp.push(id)
  911.           end
  912.         end
  913.         return if temp == []
  914.         id = temp[rand(temp.size)]
  915.         # 数据处理
  916.         number_process(id)
  917.       end
  918.     end
  919.     #--------------------------------------------------------------------------
  920.     # ● 数据取整
  921.     #--------------------------------------------------------------------------
  922.     def integer_parameters
  923.       @price = @price.round
  924.       @pdef = @pdef.round
  925.       @mdef = @mdef.round
  926.       @eva = @eva.round
  927.       @str_plus = @str_plus.round
  928.       @dex_plus = @dex_plus.round
  929.       @agi_plus = @agi_plus.round
  930.       @int_plus = @int_plus.round
  931.     end
  932.   end
  933.   
  934.   #==========================================================================
  935.   # ■ 防具
  936.   #==========================================================================
  937.   class Armor
  938.     #--------------------------------------------------------------------------
  939.     # ● 定义实例变量
  940.     #--------------------------------------------------------------------------
  941.     attr_accessor :reference_value # 基准值
  942.     attr_accessor :rating          # 定量
  943.     attr_accessor :rarity          # 权值
  944.     attr_accessor :kinds           # 附加种类
  945.     #--------------------------------------------------------------------------
  946.     # ● 刷新
  947.     #--------------------------------------------------------------------------
  948.     def refresh
  949.       @description.slice!(/\\基准值\[([0-9]+)\]/)
  950.       @reference_value = $1.to_i
  951.       @description.slice!(/\\定量\[([0-9]+)\]/)
  952.       @rating = $1.to_i
  953.       @description.slice!(/\\权值\[(-*[0-9]+)\]/)
  954.       @rarity = $1.to_i
  955.       @kinds = [@kind]
  956.       last_kinds = nil
  957.       while last_kinds != @kinds do
  958.         last_kinds = @kinds.clone
  959.         @description.sub!(/\\种类\[([0-9])\]/) { '' }
  960.         @kinds.push($1.to_i) if $1 != nil
  961.       end
  962.     end
  963.   end
  964. end

  965. #==============================================================================
  966. # ■ Game_System
  967. #------------------------------------------------------------------------------
  968. #  处理系统附属数据的类。也可执行诸如 BGM 管理之类的功能。本类的实例请参考
  969. # $game_system 。
  970. #==============================================================================

  971. class Game_System
  972.   # 装备数据库
  973.   attr_accessor :data_random_weapons
  974.   attr_accessor :data_random_armors
  975.   # 采用Hash保存数据的原因:以后可能会从内存中清除无用物品
  976.   #--------------------------------------------------------------------------
  977.   # ● 创造物品
  978.   # 创造完毕后会返回物品对象ID
  979.   #     type_id : 物品母本ID(数据库ID)
  980.   #     kind    : 种类,1是武器,2是防具
  981.   #--------------------------------------------------------------------------
  982.   def create_item(type_id, kind, prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
  983.     # 防止出错
  984.     if type_id == 0
  985.       return 0
  986.     end
  987.     case kind
  988.     when 1
  989.       item = RPG::Random_Weapon.new(type_id, prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
  990.       if @data_random_weapons.keys.max.nil?
  991.         id = 1
  992.       else
  993.         id = @data_random_weapons.keys.max + 1
  994.       end
  995.       @data_random_weapons[id] = item
  996.       item.id = id
  997.       return id
  998.     when 2
  999.       item = RPG::Random_Armor.new(type_id, prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
  1000.       if @data_random_armors.keys.max.nil?
  1001.         id = 1
  1002.       else
  1003.         id = @data_random_armors.keys.max + 1
  1004.       end
  1005.       @data_random_armors[id] = item
  1006.       item.id = id
  1007.       return id
  1008.     end
  1009.   end
  1010. end

  1011. #==============================================================================
  1012. # ■ Data_Random_Weapons
  1013. #------------------------------------------------------------------------------
  1014. #  随机武器数据的类。
  1015. #==============================================================================

  1016. class Data_Random_Weapons
  1017.   def initialize
  1018.     @data_weapons       = load_data("Data/Weapons.rxdata")
  1019.     # 刷新数据
  1020.     for item in @data_weapons
  1021.       next if item == nil
  1022.       item.refresh
  1023.     end
  1024.   end
  1025.   #--------------------------------------------------------------------------
  1026.   # ● parent_data:是否取得母本数据
  1027.   #--------------------------------------------------------------------------
  1028.   def [](id, parent_data = false)
  1029.     if parent_data
  1030.       return @data_weapons[id]
  1031.     else
  1032.       return $game_system.data_random_weapons[id]
  1033.     end
  1034.   end
  1035.   def size
  1036.     return $game_system.data_random_weapons.size + @data_weapons.size
  1037.   end
  1038. end

  1039. #==============================================================================
  1040. # ■ Data_Random_Armors
  1041. #------------------------------------------------------------------------------
  1042. #  随机防具数据的类。
  1043. #==============================================================================

  1044. class Data_Random_Armors
  1045.   def initialize
  1046.     @data_armors       = load_data("Data/Armors.rxdata")
  1047.     # 刷新数据
  1048.     for item in @data_armors
  1049.       next if item == nil
  1050.       item.refresh
  1051.     end
  1052.   end
  1053.   #--------------------------------------------------------------------------
  1054.   # ● parent_data:是否取得母本数据
  1055.   #--------------------------------------------------------------------------
  1056.   def [](id, parent_data = false)
  1057.     if parent_data
  1058.       return @data_armors[id]
  1059.     else
  1060.       return $game_system.data_random_armors[id]
  1061.     end
  1062.   end
  1063.   def size
  1064.     return $game_system.data_random_armors.size + @data_armors.size
  1065.   end
  1066. end
复制代码

  1. =begin
  2. ==========================================================================
  3.   随机装备生成系统 v1.4
  4. ==========================================================================

  5.   By 叶子 SailCat

  6.   这个系统是在SailCat的随机武器生成系统的基础上编写而成

  7. --------------------------------------------------------------------------
  8.   随机装备生成系统·接入
  9. --------------------------------------------------------------------------
  10.   本部分是随机装备生成系统的接入部分,基本上所有可能冲突的地方都是在这里。
  11.   
  12. -----------
  13.   使用说明(接入部分)
  14. -----------

  15.   -获得装备原理(以武器为例):
  16.   
  17.   用事件来获得武器的话,都会生成一把新武器,并不会获得以前已经生成过的武器。如果
  18.   用事件来失去武器,就会搜索母本相同的最新的一把武器,找到后就失去。
  19.   
  20.   如果用脚本:
  21.   获得武器:
  22.   $game_party.gain_weapon(weapon_id, n, new)
  23.   参数:
  24.   new:为true时生成新武器,false时获得旧武器(更换装备时调用这个)
  25.   weapon_id:new为true时为母本ID,new为false时为装备ID(同actor.weapon_id)
  26.   n:n把。每把都会重新计算生成。
  27.   
  28.   失去武器:
  29.   $game_party.lose_weapon(weapon_id, n, serch)
  30.   参数:
  31.   serch:为true时搜索母本相同的武器失去,false时为失去指定ID武器
  32.   weapon_id:serch为true时为母本ID,serch为false时为装备ID(同actor.weapon_id)
  33.   n:n把。
  34.   
  35.   由于获得装备的函数跟原来不同,所以可能会跟商店、仓库类脚本冲突。
  36.   
  37.   生成装备时还可以添加一些参数,实现生成普通装备或强行添加前后缀等,
  38.   具体请按Ctrl+F搜索“● 增加武器 (减少)”
  39. =end

  40. #==============================================================================
  41. # ■ Game_System
  42. #------------------------------------------------------------------------------
  43. #  处理系统附属数据的类。也可执行诸如 BGM 管理之类的功能。本类的实例请参考
  44. # $game_system 。
  45. #==============================================================================
  46. # 初始化装备数据库
  47. #==============================================================================

  48. class Game_System
  49.   attr_accessor :data_random_weapons
  50.   attr_accessor :data_random_armors
  51.   alias sailcat_initialize initialize
  52.   def initialize
  53.     sailcat_initialize
  54.     # 初始化装备数据库,所有随机生成的装备都在此数据库中
  55.     @data_random_weapons = {}
  56.     @data_random_armors = {}
  57.   end
  58. end

  59. #==============================================================================
  60. # ■ Game_Actor
  61. #------------------------------------------------------------------------------
  62. #  处理角色的类。本类在 Game_Actors 类 ($game_actors)
  63. # 的内部使用、Game_Party 类请参考 ($game_party) 。
  64. #==============================================================================
  65. # 生成角色初始装备,装备判定、变更装备修正
  66. #==============================================================================

  67. class Game_Actor < Game_Battler
  68.   #--------------------------------------------------------------------------
  69.   # ● 设置
  70.   #     actor_id : 角色 ID
  71.   #--------------------------------------------------------------------------
  72.   def setup(actor_id)
  73.     actor = $data_actors[actor_id]
  74.     @actor_id = actor_id
  75.     @name = actor.name
  76.     @character_name = actor.character_name
  77.     @character_hue = actor.character_hue
  78.     @battler_name = actor.battler_name
  79.     @battler_hue = actor.battler_hue
  80.     @class_id = actor.class_id
  81.     # 生成装备
  82.     @weapon_id = $game_system.create_item(actor.weapon_id, 1)
  83.     @armor1_id = $game_system.create_item(actor.armor1_id, 2)
  84.     @armor2_id = $game_system.create_item(actor.armor2_id, 2)
  85.     @armor3_id = $game_system.create_item(actor.armor3_id, 2)
  86.     @armor4_id = $game_system.create_item(actor.armor4_id, 2)
  87.     @level = actor.initial_level
  88.     @exp_list = Array.new(101)
  89.     make_exp_list
  90.     @exp = @exp_list[@level]
  91.     @skills = []
  92.     @hp = maxhp
  93.     @sp = maxsp
  94.     @states = []
  95.     @states_turn = {}
  96.     @maxhp_plus = 0
  97.     @maxsp_plus = 0
  98.     @str_plus = 0
  99.     @dex_plus = 0
  100.     @agi_plus = 0
  101.     @int_plus = 0
  102.     # 学会特技
  103.     for i in 1..@level
  104.       for j in $data_classes[@class_id].learnings
  105.         if j.level == i
  106.           learn_skill(j.skill_id)
  107.         end
  108.       end
  109.     end
  110.     # 刷新自动状态
  111.     update_auto_state(nil, $data_armors[@armor1_id])
  112.     update_auto_state(nil, $data_armors[@armor2_id])
  113.     update_auto_state(nil, $data_armors[@armor3_id])
  114.     update_auto_state(nil, $data_armors[@armor4_id])
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● 变更装备
  118.   #     equip_type : 装备类型
  119.   #     id    : 武器 or 防具 ID  (0 为解除装备)
  120.   #--------------------------------------------------------------------------
  121.   def equip(equip_type, id)
  122.     # $game_party.gain_weapon(@weapon_id, 1, false),增加参数,不生成新装备
  123.     case equip_type
  124.     when 0  # 武器
  125.       if id == 0 or $game_party.weapon_number(id) > 0
  126.         $game_party.gain_weapon(@weapon_id, 1, false)
  127.         @weapon_id = id
  128.         $game_party.lose_weapon(id, 1)
  129.       end
  130.     when 1  # 盾
  131.       if id == 0 or $game_party.armor_number(id) > 0
  132.         update_auto_state($data_armors[@armor1_id], $data_armors[id])
  133.         $game_party.gain_armor(@armor1_id, 1, false)
  134.         @armor1_id = id
  135.         $game_party.lose_armor(id, 1)
  136.       end
  137.     when 2  # 头
  138.       if id == 0 or $game_party.armor_number(id) > 0
  139.         update_auto_state($data_armors[@armor2_id], $data_armors[id])
  140.         $game_party.gain_armor(@armor2_id, 1, false)
  141.         @armor2_id = id
  142.         $game_party.lose_armor(id, 1)
  143.       end
  144.     when 3  # 身体
  145.       if id == 0 or $game_party.armor_number(id) > 0
  146.         update_auto_state($data_armors[@armor3_id], $data_armors[id])
  147.         $game_party.gain_armor(@armor3_id, 1, false)
  148.         @armor3_id = id
  149.         $game_party.lose_armor(id, 1)
  150.       end
  151.     when 4  # 装饰品
  152.       if id == 0 or $game_party.armor_number(id) > 0
  153.         update_auto_state($data_armors[@armor4_id], $data_armors[id])
  154.         $game_party.gain_armor(@armor4_id, 1, false)
  155.         @armor4_id = id
  156.         $game_party.lose_armor(id, 1)
  157.       end
  158.     end
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ● 可以装备判定
  162.   #     item : 物品
  163.   #--------------------------------------------------------------------------
  164.   def equippable?(item)
  165.     # 武器的情况
  166.     if item.is_a?(RPG::Weapon)
  167.       # 包含当前的职业可以装备武器的场合,调用type取得母本ID
  168.       if item.is_a?(RPG::Random_Weapon)
  169.         if $data_classes[@class_id].weapon_set.include?(item.type)
  170.           return true
  171.         end
  172.       elsif $data_classes[@class_id].weapon_set.include?(item.id)
  173.         return true
  174.       end
  175.     end
  176.     # 防具的情况
  177.     if item.is_a?(RPG::Armor)
  178.       # 包含当前的职业可以装备防具的场合,调用type取得母本ID
  179.       if item.is_a?(RPG::Random_Armor)
  180.         if $data_classes[@class_id].armor_set.include?(item.type)
  181.           return true
  182.         end
  183.       elsif $data_classes[@class_id].armor_set.include?(item.id)
  184.         return true
  185.       end
  186.     end
  187.     return false
  188.   end
  189. end

  190. #==============================================================================
  191. # ■ Game_Party
  192. #------------------------------------------------------------------------------
  193. #  处理同伴的类。包含金钱以及物品的信息。本类的实例
  194. # 请参考 $game_party。
  195. #==============================================================================
  196. # 大幅度修改得失武器
  197. #==============================================================================


  198. class Game_Party
  199.   #--------------------------------------------------------------------------
  200.   # ● 增加武器 (减少)
  201.   #     weapon_id : 武器 ID
  202.   #     n         : 个数
  203.   #     new       : 是否创建新物品
  204.   #
  205.   # 当new为true时可以添加如下参数:
  206.   # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  207.   # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  208.   # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
  209.   #    把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
  210.   #    1:不生成前缀
  211.   #    2:不生成后缀
  212.   #    4:不带前缀名称
  213.   #    8:不带后缀名称
  214.   #    16:不进行分散数据处理
  215.   #    32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
  216.   # prefix_id:指定前缀ID,强行附加该前缀
  217.   # suffix_id:指定后缀ID,强行附加该后缀
  218.   #
  219.   # 指定ID可以给武器附加上随机生成不会出现的前后缀(没有勾选品质属性的前后缀)
  220.   #--------------------------------------------------------------------------
  221.   def gain_weapon(weapon_id, n, new = true, prefix_rarity=[], suffix_rarity=[],
  222.     parameter=0, prefix_id=0, suffix_id=0)
  223.     return if weapon_id <= 0
  224.     # 增加的话
  225.     if n > 0
  226.       # 创建新物品的话,weapon_id当作母本ID
  227.       if new
  228.         n.times do
  229.           @id = $game_system.create_item(weapon_id, 1, prefix_rarity,
  230.           suffix_rarity, parameter, prefix_id, suffix_id)
  231.           @weapons[@id] = 1
  232.         end
  233.         return @id
  234.       # 直接增加
  235.       else
  236.         @weapons[weapon_id] = 1
  237.       end
  238.     # 减少的话
  239.     elsif new
  240.       n.abs.times do
  241.         for weapon in $game_system.data_random_weapons.values.reverse
  242.           if weapon.type == weapon_id and @weapons[weapon.id] == 1
  243.             @id = weapon.id
  244.             @weapons[weapon.id] = 0
  245.             break
  246.           end
  247.         end
  248.       end
  249.       return @id
  250.     else
  251.       @weapons[weapon_id] = 0
  252.     end
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ● 增加防具 (减少)
  256.   #     armor_id : 防具 ID
  257.   #     n        : 个数
  258.   #     new       : 是否创建新物品
  259.   #
  260.   # 当new为true时可以添加如下参数:
  261.   # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  262.   # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
  263.   # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
  264.   #    把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
  265.   #    1:不生成前缀
  266.   #    2:不生成后缀
  267.   #    4:不带前缀名称
  268.   #    8:不带后缀名称
  269.   #    16:不进行分散数据处理
  270.   #    32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
  271.   # prefix_id:指定前缀ID,强行附加该前缀
  272.   # suffix_id:指定后缀ID,强行附加该后缀
  273.   #
  274.   # 指定ID可以给防具附加上随机生成不会出现的前后缀(没有勾选品质属性的前后缀)
  275.   #--------------------------------------------------------------------------
  276.   def gain_armor(armor_id, n, new = true, prefix_rarity=[], suffix_rarity=[],
  277.     parameter=0, prefix_id=0, suffix_id=0)
  278.     return if armor_id <= 0
  279.     # 增加的话
  280.     if n > 0
  281.       # 创建新物品的话,armor_id当作母本ID
  282.       if new
  283.         n.times do
  284.           @id = $game_system.create_item(armor_id, 2, prefix_rarity,
  285.           suffix_rarity, parameter, prefix_id, suffix_id)
  286.           @armors[@id] = 1
  287.         end
  288.         return @id
  289.       # 直接增加
  290.       else
  291.         @armors[armor_id] = 1
  292.       end
  293.     # 减少的话
  294.     elsif new
  295.       n.abs.times do
  296.         for armor in $game_system.data_random_armors.values.reverse
  297.           if armor.type == armor_id and @armors[armor.id] == 1
  298.             @id = armor.id
  299.             @armors[armor.id] = 0
  300.             break
  301.           end
  302.         end
  303.       end
  304.       return @id
  305.     else
  306.       @armors[armor_id] = 0
  307.     end
  308.   end
  309.   #--------------------------------------------------------------------------
  310.   # ● 减少武器
  311.   #     weapon_id : 武器 ID
  312.   #     n         : 个数
  313.   #     serch     : 为true时搜索同母本物品删除
  314.   #--------------------------------------------------------------------------
  315.   def lose_weapon(weapon_id, n, serch = false)
  316.     # 调用 gain_weapon 的数值逆转
  317.     gain_weapon(weapon_id, -n, serch)
  318.   end
  319.   #--------------------------------------------------------------------------
  320.   # ● 减少防具
  321.   #     armor_id : 防具 ID
  322.   #     n        : 个数
  323.   #--------------------------------------------------------------------------
  324.   def lose_armor(armor_id, n, serch = false)
  325.     # 调用 gain_armor 的数值逆转
  326.     gain_armor(armor_id, -n, serch)
  327.   end
  328. end

  329. #==============================================================================
  330. # ■ Window_EquipItem
  331. #------------------------------------------------------------------------------
  332. #  装备画面、显示浏览变更装备的候补物品的窗口。
  333. #==============================================================================
  334. # 判定装备可能时取得母本,显示装备名称颜色
  335. #==============================================================================

  336. class Window_EquipItem < Window_Selectable4
  337.   #--------------------------------------------------------------------------
  338.   # ● 刷新
  339.   #--------------------------------------------------------------------------
  340.   def refresh
  341.     if self.contents != nil
  342.       self.contents.dispose
  343.       self.contents = nil
  344.     end
  345.     @data = []
  346.     # 添加可以装备的武器
  347.     if @equip_type == 0
  348.       weapon_set = $data_classes[@actor.class_id].weapon_set
  349.       for i in 1...$data_weapons.size
  350.         if $game_party.weapon_number(i) > 0 and weapon_set.include?(
  351.           $game_system.data_random_weapons[i].type) # type取得母本
  352.           @data.push($data_weapons[i])
  353.         end
  354.       end
  355.     end
  356.     # 添加可以装备的防具
  357.     if @equip_type != 0
  358.       armor_set = $data_classes[@actor.class_id].armor_set
  359.       for i in 1...$data_armors.size
  360.         if $game_party.armor_number(i) > 0 and armor_set.include?(
  361.           $game_system.data_random_armors[i].type) # type取得母本
  362.           if $data_armors[i].kind == @equip_type-1
  363.             @data.push($data_armors[i])
  364.           end
  365.         end
  366.       end
  367.     end
  368.     # 添加空白
  369.     @data.push(nil)
  370.     # 生成位图、描绘全部项目
  371.     @item_max = @data.size
  372.     self.contents = Bitmap.new(width - 32, row_max * 38)
  373.     for i in 0...@item_max-1
  374.       draw_item(i)
  375.     end
  376.   end
  377.   #--------------------------------------------------------------------------
  378.   # ● 项目的描绘
  379.   #     index : 项目符号
  380.   #--------------------------------------------------------------------------
  381.   def draw_item(index)
  382.     item = @data[index]
  383.     x = 4 + index % 21 * 36
  384.     y = 4 + index / 21 * 36
  385.     rect = Rect.new(x, y, 36, 36)
  386.     case item
  387.     when RPG::Weapon
  388.       number = $game_party.weapon_number(item.id)
  389.     when RPG::Armor
  390.       number = $game_party.armor_number(item.id)
  391.     end
  392.     bitmap = RPG::Cache.icon(item.icon_name)
  393.     self.contents.blt(x+0, y + 0, bitmap, Rect.new(0, 0, 36, 36), opacity)
  394.     self.contents.font.size = 14
  395.     self.contents.font.color = item.name_color
  396.     #self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  397.     self.contents.font.color = normal_color
  398.     #self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  399.     self.contents.draw_text(x-92, y-7, 124, 32, number.to_s, 2)
  400.   end
  401. end
  402. #==============================================================================
  403. # ■ Window_Base
  404. #------------------------------------------------------------------------------
  405. #  游戏中全部窗口的超级类。
  406. #==============================================================================
  407. # 显示装备颜色
  408. #==============================================================================

  409. class Window_Base < Window
  410.   ### Ryan ###
  411.   alias ryan_draw_item_name draw_item_name
  412.   ### Bern ###
  413.   #--------------------------------------------------------------------------
  414.   # ● 描绘物品名
  415.   #     item : 物品
  416.   #     x    : 描画目标 X 坐标
  417.   #     y    : 描画目标 Y 坐标
  418.   #--------------------------------------------------------------------------
  419.   def draw_item_name(item, x, y)
  420.     if item == nil
  421.       return
  422.     end
  423.     bitmap = RPG::Cache.icon(item.icon_name)
  424.     self.contents.blt(x+2, y + 4, bitmap, Rect.new(0, 0, 36, 36))
  425.     #self.contents.font.color = normal_color
  426.     # 取得颜色
  427.     if item.is_a?(RPG::Random_Weapon) or item.is_a?(RPG::Random_Armor)
  428.       self.contents.font.color = item.name_color
  429.     end
  430.    
  431.     self.contents.font.size = 14
  432.    # self.contents.draw_text(x, y+28, 124, 32, item.name, 0)
  433.    # self.contents.font.color = item.name_color
  434.   end
  435. end

  436. #==============================================================================
  437. # ■ Window_ShopBuy
  438. #------------------------------------------------------------------------------
  439. #  商店画面、浏览显示可以购买的商品的窗口。
  440. #==============================================================================
  441. # 商店只出售母本
  442. #==============================================================================

  443. class Window_ShopBuy < Window_Selectable5
  444.   #--------------------------------------------------------------------------
  445.   # ● 刷新
  446.   #--------------------------------------------------------------------------
  447.   def refresh
  448.     if self.contents != nil
  449.       self.contents.dispose
  450.       self.contents = nil
  451.     end
  452.     @data = []
  453.     for goods_item in @shop_goods
  454.       case goods_item[0]
  455.       when 0
  456.         item = $data_items[goods_item[1]]
  457.       # 取得母本
  458.       when 1
  459.         item = $data_weapons[goods_item[1], true]
  460.       # 取得母本
  461.       when 2
  462.         item = $data_armors[goods_item[1], true]
  463.       end
  464.       if item != nil
  465.         @data.push(item)
  466.       end
  467.     end
  468.     # 如果项目数不是 0 就生成位图、描绘全部项目
  469.     @item_max = @data.size
  470.     if @item_max > 0
  471.       self.contents = Bitmap.new(width - 32, row_max * 38)
  472.       for i in 0...@item_max
  473.         draw_item(i)
  474.       end
  475.     end
  476.   end
  477. end

  478. #==============================================================================
  479. # ■ Scene_Title
  480. #------------------------------------------------------------------------------
  481. #  处理标题画面的类。
  482. #==============================================================================
  483. # 绕过原来的$data_weapons和$data_armors
  484. #==============================================================================

  485. class Scene_Title
  486.   #--------------------------------------------------------------------------
  487.   # ● 住处理
  488.   #--------------------------------------------------------------------------
  489.   def main
  490.     # 战斗测试的情况下
  491.     if $BTEST
  492.       battle_test
  493.       return
  494.     end
  495.     # 载入数据库
  496.     $data_actors        = load_data("Data/Actors.rxdata")
  497.     $data_classes       = load_data("Data/Classes.rxdata")
  498.     $data_skills        = load_data("Data/Skills.rxdata")
  499.     $data_items         = load_data("Data/Items.rxdata")
  500.     # 绕过原来的数据库,使得可以同时取得母本和生成的装备
  501.     $data_weapons       = Data_Random_Weapons.new
  502.     $data_armors        = Data_Random_Armors.new
  503.     $data_enemies       = load_data("Data/Enemies.rxdata")
  504.     $data_troops        = load_data("Data/Troops.rxdata")
  505.     $data_states        = load_data("Data/States.rxdata")
  506.     $data_animations    = load_data("Data/Animations.rxdata")
  507.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  508.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  509.     $data_system        = load_data("Data/System.rxdata")
  510.     # 生成系统对像
  511.     $game_system = Game_System.new
  512.     # 生成标题图形
  513.     @sprite = Sprite.new
  514.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
  515.     # 生成命令窗口
  516.     s1 = "登录游戏"
  517.     s2 = "读取存档"
  518.     s3 = "退出"
  519.     s4 = "版本"
  520.     @command_window = Window_Command.new(160, [s1, s2, s3, s4])
  521.     @command_window.back_opacity = 160
  522.     @command_window.x = 400 - @command_window.width / 2
  523.     @command_window.y = 190
  524.     # 判定继续的有效性
  525.     # 存档文件一个也不存在的时候也调查
  526.     # 有効为 @continue_enabled 为 true、無効为 false
  527.     @continue_enabled = false
  528.     if FileTest.exist?("cdshjk.dll")
  529.       @continue_enabled = true
  530.     end
  531.     # 继续为有效的情况下、光标停止在继续上
  532.     # 无效的情况下、继续的文字显示为灰色
  533.     if @continue_enabled
  534.       @command_window.index = 1
  535.     else
  536.       @command_window.disable_item(1)
  537.     end
  538.     # 演奏标题 BGM
  539.     $game_system.bgm_play($data_system.title_bgm)
  540.     # 停止演奏 ME、BGS
  541.     Audio.me_stop
  542.     Audio.bgs_stop
  543.     # 执行过渡
  544.     Graphics.transition
  545.     # 主循环
  546.     loop do
  547.       # 刷新游戏画面
  548.       Graphics.update
  549.       # 刷新输入信息
  550.       Input.update
  551.       # 刷新画面
  552.       update
  553.       # 如果画面被切换就中断循环
  554.       if $scene != self
  555.         break
  556.       end
  557.     end
  558.     # 装备过渡
  559.     Graphics.freeze
  560.     # 释放命令窗口
  561.     @command_window.dispose
  562.     # 释放标题图形
  563.     @sprite.bitmap.dispose
  564.     @sprite.dispose
  565.   end
  566. end
  567. #==============================================================================
  568. # ■ Scene_Battle (分割定义 2)
  569. #------------------------------------------------------------------------------
  570. #  处理战斗画面的类。
  571. #==============================================================================
  572. # 战斗后获得随机生成物品
  573. #==============================================================================

  574. class Scene_Battle
  575.   #--------------------------------------------------------------------------
  576.   # ● 开始结束战斗回合
  577.   #--------------------------------------------------------------------------
  578.   def start_phase5
  579.     # 转移到回合 5
  580.     @phase = 5
  581.     # 演奏战斗结束 ME
  582.     $game_system.me_play($game_system.battle_end_me)
  583.     # 还原为战斗开始前的 BGM
  584.     $game_system.bgm_play($game_temp.map_bgm)
  585.     # 初始化 EXP、金钱、宝物
  586.     exp = 0
  587.     gold = 0
  588.     treasures = []
  589.     # 循环
  590.     for enemy in $game_troop.enemies
  591.       # 敌人不是隐藏状态的情况下
  592.       unless enemy.hidden
  593.         # 获得 EXP、增加金钱
  594.         exp += enemy.exp
  595.         gold += enemy.gold
  596.         # 出现宝物判定
  597.         if rand(100) < enemy.treasure_prob
  598.           if enemy.item_id > 0
  599.             treasures.push($data_items[enemy.item_id])
  600.           end
  601.           # 生成物品
  602.           if enemy.weapon_id > 0
  603.             treasures.push($data_weapons[$game_system.create_item(enemy.weapon_id, 1)])
  604.           end
  605.           if enemy.armor_id > 0
  606.             treasures.push($data_armors[$game_system.create_item(enemy.armor_id, 2)])
  607.           end
  608.         end
  609.       end
  610.     end
  611.     # 限制宝物数为 6 个
  612.     treasures = treasures[0..8]
  613.     # 获得 EXP
  614.     for i in 0...$game_party.actors.size
  615.       actor = $game_party.actors[i]
  616.       if actor.cant_get_exp? == false
  617.         last_level = actor.level
  618.         actor.exp += exp
  619.         if actor.level > last_level
  620.           @status_window.level_up(i)
  621.         end
  622.       end
  623.     end
  624.     # 获得金钱
  625.     $game_party.gain_gold(gold)
  626.     # 获得宝物
  627.     for item in treasures
  628.       case item
  629.       when RPG::Item
  630.         $game_party.gain_item(item.id, 1)
  631.       # 获得已生成物品
  632.       when RPG::Weapon
  633.         $game_party.gain_weapon(item.id, 1, false)
  634.       when RPG::Armor
  635.         $game_party.gain_armor(item.id, 1, false)
  636.       end
  637.     end
  638.     # 生成战斗结果窗口
  639.     @result_window = Window_BattleResult.new(exp, gold, treasures)
  640.     # 设置等待计数
  641.     @phase5_wait_count = 10
  642.   end
  643. end
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-27 04:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表