赞 | 6 |
VIP | 0 |
好人卡 | 3 |
积分 | 14 |
经验 | 12282 |
最后登录 | 2022-8-15 |
在线时间 | 295 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1373
- 在线时间
- 295 小时
- 注册时间
- 2014-6-24
- 帖子
- 100
|
3楼
楼主 |
发表于 2016-11-15 12:10:57
|
只看该作者
- =begin
- ==========================================================================
- 随机装备生成系统 v1.4
- ==========================================================================
- By 叶子 SailCat
-
- 这个系统是在SailCat的随机武器生成系统的基础上编写而成
- 类似《暗黑破坏神》的随机生成装备
-
- 4-10-2006 1.0
- -先行体验版
-
- 4-11-2006 1.1
- -事件调用失去武器防具时,从最后的一个开始失去
- -修正了生成装备时不会出现同样品质的前缀和后缀的BUG
- -部分参数变动,增加了忽略定量参数
- -避免了某些一时冲动插入本脚本,连数据库都不调一下的行为而导致的错误
-
- 4-30-2006 1.2
- -修正Window_Base描绘物品的BUG
- -修正杀死敌人不能获得装备的BUG
- -改写了生成装备ID时的冗余代码
-
- 5-19-2006 1.3
- -修正了一个致命BUG
-
- 11-29-2006 1.4
- -简化了品质设置
- -增加了装备初始权值的设定
- -删除了检查数据库的代码
- -修正了能否装备判定的BUG
-
- --------------------------------------------------------------------------
- 随机装备生成系统·核心
- --------------------------------------------------------------------------
- 本部分是随机装备生成系统的核心,基本不会造成与其它脚本冲突,但缺少“随机装备生
- 成系统·接入”的话,不能融合到游戏脚本中。
-
- -----------
- 使用前须知
- -----------
-
- -本系统分成两个部分,分别为“随机装备生成系统·核心”和
- “随机装备生成系统·接入”,使用时两个部分都要插入。
-
- -因为本系统对RPG底层数据结构的改动非常大,对RGSS完全不了解者不建议采用本系统。
-
- -强烈推荐下载范例工程,可以有一个更直观的认识。
-
- -虽然比SailCat原来的随机武器生成系统的冲突小了一点,但仍然具有很高的冲突性,
- 发生冲突的地方大部分都是在“随机装备生成系统·接入”中。
-
- -请仔细耐心阅读完全部说明,最好能看看范例工程中的数据库是怎样设置的。
-
- -----------
- 简要使用步骤
- -----------
-
- 1、插入“随机装备生成系统·核心”和“随机装备生成系统·接入”到Main之上
- (根据喜好还可以使用附带的已整合脚本:“得失物品金钱提示”和“装备属性显示”)
-
- 2、在数据库中的武器和防具部分设置分散数据用装备、前缀和后缀,
- ID请按 Ctrl+F 搜索“■ 随机武器”和“■ 随机防具”,在那里的常量设定里。
-
- -----------
- 深入说明(核心部分)
- -----------
-
- 在“随机装备生成系统·接入”中还有一些关于获得和失去武器的说明
-
- 1、主要名词解释
-
- 1.1 母本:
-
- 数据库中原本设定的武器(防具),作为随机生成装备数据的基础
- 如果母本的属性里面勾了某个品质(见1.5),它就不会被附加上该种品质的前缀和后缀
-
- 1.2 前缀:
-
- 数据库中指定ID范围的武器(防具),对随机生成装备的数据进行加成,同时在生成的装
- 备名称前面加上前缀名称,在生成的装备的说明后面加上前缀说明。
-
- 设定位置:数据库中的武器(防具)中
-
- 1.3 后缀
-
- 数据库中指定ID范围的武器(防具),对随机生成装备的数据进行加成,同时在生成的装
- 备名称前面加上后缀名称,在生成的装备的说明后面加上后缀说明。
-
- 设定位置:数据库中的武器(防具)中
-
- 1.4 分散数据处理ID
-
- 对应数据库中的装备ID,用来作装备数据浮动用。为了避免极品和垃圾相差太远,不建议
- 把分散数据处理用装备的数据设置得太夸张。
-
- 1.5 品质
-
- 每一个前缀和后缀都要选择它的品质,品质决定其出现概率
-
- 设定位置:数据库中的系统-属性,同时每一个前缀和后缀都要勾上对应品质
-
- 1.6 权值
-
- 权值决定了装备的颜色
- 生成装备的总权值 = 母本权值 + 所有前缀权值 + 所有后缀权值
-
- 权值设置方法(无论母本、前缀、后缀都可设置)
- 在装备的说明中加上: \权值[n]
- 那么它的权值就为n
- 不设置的话,权值默认为0
- 范例游戏中有设置权值
-
- 1.7 生成一个装备的简要流程(忽略参数和定量):
-
- 取得母本(例如事件-获得武器)
-
- |
-
- 装备数据的所有数据代入母本数据
-
- |
-
- -开始前缀处理:
-
- 按品质概率随机选取一个品质
-
- 在属于这个品质的所有前缀中随机取得一个前缀
-
- ·条件分歧:如果前缀没有勾选“no text”属性
-
- 装备的名称前插入前缀的名称
-
- 装备的说明后加入前缀的说明
-
- ·分歧结束
-
- 装备的动画ID = 前缀的动画ID(如果前缀的动画ID不为空)(只有武器才有动画ID)
-
- 装备的自动状态ID = 前缀的自动状态ID(如果前缀的自动状态ID不为空)(只用防具才有自动状态ID)
-
- 装备的价格 = 其本身 × 前缀的价格 × 0.01
-
- ·条件分歧:如果前缀勾选了“套用基准值”属性
-
- 装备的其余各项数字类数据(自动状态ID除外) = 其本身 + 前缀对应数据数字 × 母本基准值 × 0.01
-
- (例外:防具的回避修正忽略基准值,以100代替)
-
- ·除此以外的情况
-
- 装备的其余各项数字类数据(自动状态ID除外) = 其本身 × 前缀对应数据数字 × 0.01
-
- ·分歧结束
-
- 装备的属性(武器)、防御属性(防具)、附加状态(武器)、解除状态(武器)、
- 防御状态(防具) 为其本身与前缀的相同项目的并集(也就是加上前缀的属性、状态等)
-
- |
- -开始后缀处理(除了把名称插在后面之外,其余同前缀)
-
- |
-
- -开始分散数据处理(按照设定的分散数据处理次数重复处理):
-
- 按概率从分散数据处理ID中随机选出一个ID,取得数据库中ID对应的分散数据处理用装备
-
- 装备的价格 = 其本身 × 分散数据处理用装备的价格 × 0.01
-
- ·条件分歧:如果分散数据处理用装备勾选了“套用基准值”属性
-
- 装备的其余各项数字类数据(自动状态ID除外) = 其本身 + 分散数据处理用装备对应数据数字 × 母本基准值 × 0.01
-
- (例外:防具的回避修正忽略基准值,以100代替)
-
- ·除此以外的情况
-
- 装备的其余各项数字类数据(自动状态ID除外) = 其本身 × 分散数据处理用装备对应数据数字 × 0.01
-
- ·分歧结束
-
- 装备的属性(武器)、防御属性(防具)、附加状态(武器)、解除状态(武器)、
- 防御状态(防具) 为其本身与分散数据处理用装备的相同项目的并集
- (也就是加上分散数据处理用装备的属性、状态等)
-
- |
-
- -开始数据取整
-
- |
-
- -装备生成完毕
-
- 简单来说,进行加成就是以新数据(前缀或后缀)乘以旧数据(母本)除以100,同时将
- 新数据的各项属性和状态套入旧属性。
-
- 一般的话,一个没有勾选“套用基准值”属性的前缀或后缀,其各项数字类数据都是100
- 或接近于100,作为加成的百分比。如果勾选了“套用基准值”,除了要加成的项目,各
- 项数字都是0。
-
- 1.8 基准值:
-
- 如果前缀(后缀)勾选了“套用基准值”属性的话,用基准值来代替装备的数据进行加成
-
- 例如铜剑防御力为0,但有一个前缀是给武器加防御的,如果不套用基准值的话:
- 生成后装备防御力 = 铜剑防御力(0) × 前缀防御力(例如30) = 0
- 套用了基准值的话:
- 生成后装备防御力 = 铜剑防御力(0)+ 铜剑基准值(例如100) × 前缀防御力(30) = 30
-
- 装备基准值设置方法(只有母本才需要设置基准值)
- 在母本装备的说明中加上: \基准值[n]
- 那么它的基准值就为n
- 不设置的话,基准值默认为0
- 范例游戏的母本设置了基准值
-
- 1.9 定量
-
- 例如有一个前缀和一个后缀,前缀加自动状态“蓄力”,后缀加自动状态“屏障”
- 如果两个都没有设置定量或定量相同的话,生成的装备的自动状态为后缀的“屏障”
- 如果前缀设置的定量大于后缀的定量,那么这个装备的自动状态就为“蓄力”
- 假设这个母本本身带有自动状态,而它的定量比前后缀的定量都大,那么它附加的自动状
- 态就不会改变。
-
- 前后缀定量设置方法(无论母本、前缀、后缀都可设置)
- 在装备的说明中加上: \定量[n]
- 那么它的定量就为n
- 不设置的话,定量默认为0
- 范例游戏中没有设置定量
-
- 1.10 防具的前后缀种类(重要!只有防具才有这个设置)
-
- 默认的情况下,防具的前缀和后缀只能附加给相同种类的防具。
- 例如某前缀的种类为盾,那么这个前缀就只会在盾中出现。
- 如果想让一个前缀(后缀)能适用于不同种类的防具,除了设置几个同名不同种类的前缀
- (后缀)外,还可以为同一个前缀(后缀)增加种类。
-
- 前后缀种类设置方法(只有前缀和后缀才有这个设置)
- 在前后缀用装备的说明中加上: \种类[n]
- (n的值 0:盾 1:头部防具 2:身体防具 3:装饰品)
- 那么它也成为了第n类防具的前缀(后缀)。
-
- 这个控制码可以重复输入。
- 例如想让一个前缀能适用于所有防具,可以选择其种类为盾,在其说明中加上:
- \种类[1]\种类[2]\种类[3]
-
- 2、下面开始边设置边进行说明:
- =end
- # 2.1 设置生成装备名称颜色:
- #--------------------------------------------------------------------------
- # ● 获取名字颜色
- # 根据生成装备的总品质权值决定其名字颜色
- # rarity:品质权值
- #--------------------------------------------------------------------------
- def get_random_equipment_name_color(rarity)
- case rarity
- when 0
- # 白
- return Color.new(255,255,255)
- when 1
- # 绿
- return Color.new(0,255,0)
- when 2
- # 蓝
- return Color.new(0,120,255)
- when 4..5
- # 紫
- return Color.new(160, 0, 255)
- when 3
- # 红
- return Color.new(255,120,0)
- when 8..100
- # 金
- return Color.new(255,255,0)
- else
- # 灰
- return Color.new(160,160,160)
- end
- end
- module RPG
- #==========================================================================
- #-------------------------------------
- # ◎ 武器类
- #-------------------------------------
- #==========================================================================
-
- #--------------
- # 2.2 设置武器各种参数:
- #--------------
-
- #==========================================================================
- # ■ 随机武器
- #==========================================================================
- class Random_Weapon < Weapon
- #--------------------------------------------------------------------------
- # ● 定义常量
- #--------------------------------------------------------------------------
- # 以下的ID均是指数据库编号
- #--------------
- # 分散数据处理
- #--------------
- # 名词解释:分散数据处理的意思是每生成一个装备,对其各项数值进行浮动,从而
- # 使得即使是同名装备,它们的数据也不一样。
- #
- # 分散数据处理ID和出现概率(ID个数不限)
- # 格式:{ID=>概率, ID=>概率, ID=>概率...}
- # 大括号、等号、小于号、逗号都要用半角
- FIRST_PROCESS_ID = {14=>2, 15=>2, 16=>2, 17=>2, 18=>2, 19=>2, 20=>2,
- 21=>2, 22=>2, 23=>2}
- # 前缀
- #--------------
- # 就是在武器名前加上前缀的名称,同时使武器各项数值按照该前缀的数据进行加成
- # 前缀ID(数据库中对应武器ID,例如511..520表示从511到520号武器均为前缀)
- PREFIX_ID = 1..13
- # 每一个前缀记得要勾选品质属性,否则不会生成该前缀
- #--------------
- # 后缀
- #--------------
- # 除了把后缀名称加在武器名后,其余和前缀相同
- # 后缀ID
- SUFFIX_ID = 24..47#false
- #--------------
- # 品质属性
- #--------------
- # 品质属性ID,出现概率和权值(个数不限)
- # 权值:越高代表该品质越好,武器的总品质权值 = 武器母本、前缀和后缀(如果有的话)品质权值之和
- # 格式:{ID=>概率, ID=>概率, ID=>概率, ...}
- RARITY_ELEMENTS = {25=>60, 26=>20, 27=>10, 28=>3}
- #--------------
- # 套用基准值属性ID
- # 如果前缀或后缀勾选了这个属性,就会套用武器基准值。
- REFERENCE_VALUE_ELEMENT = 23
- #--------------
- # 不加入前后缀及说明属性ID
- # 如果前缀或后缀勾选了这个属性,就不在生成的武器名称中加入这个前缀或后缀的
- # 名称,也不加入前缀或后缀的说明
- NO_TEXT_ELEMENT = 24
- #--------------
- # 默认分散数据处理次数
- VARY_DATA_TIMES = 100
-
-
- # 设置防具参数基本同设置武器参数,请按Ctrl+F搜索“防具类”,在那里设置防具参
- # 数
-
- # 下面的prefix_rarity、parameter等参数比较复杂,不要求看懂。它们可以提供更丰
- # 富的扩展性。使用它们的话,需要具有基础RGSS知识。
-
- #--------------------------------------------------------------------------
- # ● 定义实例变量
- #--------------------------------------------------------------------------
- attr_accessor :type # 母本ID
- attr_accessor :reference_value # 基准值,数据加成时用
- attr_accessor :rarity # 总品质权值
- attr_accessor :reqlevel # 需求等级(暂时没有实际作用)
- #--------------------------------------------------------------------------
- # ● 初始化对像
- # id : 母本ID(数据库中ID)
- # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
- # 把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
- # 1:不生成前缀
- # 2:不生成后缀
- # 4:不带前缀名称
- # 8:不带后缀名称
- # 16:不进行分散数据处理
- # 32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
- # prefix_id:指定前缀ID,强行附加该前缀
- # suffix_id:指定后缀ID,强行附加该后缀
- #
- # 指定ID可以给武器附加上随机生成不会出现的前后缀(没有勾选品质属性的前后缀)
- #--------------------------------------------------------------------------
- def initialize(id, prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
- # 初始化数据
- @type = id
- @name = $data_weapons[id, true].name
- @icon_name = $data_weapons[id, true].icon_name
- @description = $data_weapons[id, true].description
- @reference_value = $data_weapons[id, true].reference_value
- @current_rating = $data_weapons[id, true].rating
- @animation1_id = $data_weapons[id, true].animation1_id
- @animation2_id = $data_weapons[id, true].animation2_id
- @price = $data_weapons[id, true].price
- [url=home.php?mod=space&uid=101599]@atk[/url] = $data_weapons[id, true].atk
- @pdef = $data_weapons[id, true].pdef
- @mdef = $data_weapons[id, true].mdef
- @str_plus = $data_weapons[id, true].str_plus
- @dex_plus = $data_weapons[id, true].dex_plus
- @agi_plus = $data_weapons[id, true].agi_plus
- @int_plus = $data_weapons[id, true].int_plus
- @element_set = $data_weapons[id, true].element_set
- @plus_state_set = $data_weapons[id, true].plus_state_set
- @minus_state_set = $data_weapons[id, true].minus_state_set
- @rarity = $data_weapons[id, true].rarity
- @reqlevel = 1
- # 随机生成数据处理
- random_data(prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
- end
- #--------------------------------------------------------------------------
- # ● 随机生成数据处理
- #--------------------------------------------------------------------------
- def random_data(prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
- # 前缀处理
- prefix_process(prefix_rarity, parameter, prefix_id)
- # 后缀处理
- suffix_process(suffix_rarity, parameter, suffix_id)
- # 分散数据处理
- vary_data(VARY_DATA_TIMES, parameter)
- # 数据取整
- integer_parameters
- end
- #--------------------------------------------------------------------------
- # ● 前缀处理
- # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
- # (从最左边为1开始)
- # parameter:参数
- # prefix_id:指定前缀ID
- #--------------------------------------------------------------------------
- def prefix_process(rarity_type=[], parameter=0, prefix_id=0)
- # 判断是否不进行前缀处理
- return if parameter & 0b1 == 0b1
- # 指定了品质的情况
- if rarity_type != []
- rarity_id = rarity_type[rand(rarity_type.size)]
- # 按概率随机选出品质的情况
- else
- temp = []
- for id in RARITY_ELEMENTS.keys
- RARITY_ELEMENTS[id].times do
- temp.push(id)
- end
- end
- return if temp == []
- rarity_id = temp[rand(temp.size)]
- end
- # 指定了前缀的情况
- if prefix_id > 0
- id = prefix_id
- # 随机选出品质对应的前缀的情况
- else
- # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
- return if $data_weapons[@type, true].element_set.include?(rarity_id)
- temp = []
- for i in PREFIX_ID
- if $data_weapons[i, true].element_set.include?(rarity_id)
- temp.push(i)
- end
- end
- return if temp == []
- id = temp[rand(temp.size)]
- end
- # 文字及动画ID处理
- text_process(id, parameter, 1)
- # 数据处理
- number_process(id, rarity_id)
- end
- #--------------------------------------------------------------------------
- # ● 后缀处理
- # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
- # (从最左边为1开始)
- # parameter:参数
- # suffix_id:指定后缀ID
- #--------------------------------------------------------------------------
- def suffix_process(rarity_type=0, parameter=0, suffix_id=0)
- # 判断是否不进行后缀处理
- return if parameter & 0b10 == 0b10
- # 指定了品质的情况
- if rarity_type != []
- rarity_id = rarity_type[rand(rarity_type.size)]
- # 按概率随机选出品质的情况
- else
- temp = []
- for id in RARITY_ELEMENTS.keys
- RARITY_ELEMENTS[id].times do
- temp.push(id)
- end
- end
- return if temp == []
- rarity_id = temp[rand(temp.size)]
- end
- # 指定了后缀的情况
- if suffix_id > 0
- id = suffix_id
- # 随机选出品质对应的后缀的情况
- else
- # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
- return if $data_weapons[@type, true].element_set.include?(rarity_id)
- temp = []
- for i in SUFFIX_ID
- if $data_weapons[i, true].element_set.include?(rarity_id)
- temp.push(i)
- end
- end
- return if temp == []
- id = temp[rand(temp.size)]
- end
- # 文字及动画ID处理
- text_process(id, parameter, 2)
- # 数据处理
- number_process(id, rarity_id)
- end
- #--------------------------------------------------------------------------
- # ● 文字及动画ID处理
- # fix:1为前缀,2为后缀
- #--------------------------------------------------------------------------
- def text_process(id, parameter=0, fix=0)
- # 名称和动画处理
- # 判断是否加入前后缀及说明
- if !$data_weapons[id, true].element_set.include?(NO_TEXT_ELEMENT)
- case fix
- when 1
- # 判断是否带前缀名称
- if parameter & 0b100 != 0b100
- @name = $data_weapons[id, true].name + @name
- end
- when 2
- # 判断是否带后缀名称
- if parameter & 0b1000 != 0b1000
- @name = @name + $data_weapons[id, true].name
- end
- end
- @description = @description + $data_weapons[id, true].description
- end
- if $data_weapons[@type, true].rating >= @current_rating or (parameter & 0b100000 == 0b100000)
- @icon_name = $data_weapons[id, true].icon_name if $data_weapons[id, true].icon_name != ''
- @animation1_id = $data_weapons[id, true].animation1_id if $data_weapons[id, true].animation1_id != 0
- @animation2_id = $data_weapons[id, true].animation2_id if $data_weapons[id, true].animation2_id != 0
- @current_rating = $data_weapons[@type, true].rating
- end
- end
- #--------------------------------------------------------------------------
- # ● 数字类数据处理
- #--------------------------------------------------------------------------
- def number_process(id, rarity_id = 0)
- # 判断是否套用基准值
- if $data_weapons[id, true].element_set.include?(REFERENCE_VALUE_ELEMENT)
- @price = @price * $data_weapons[id, true].price * 0.01
- @atk += @reference_value * $data_weapons[id, true].atk * 0.01
- @pdef += @reference_value * $data_weapons[id, true].pdef * 0.01
- @mdef += @reference_value * $data_weapons[id, true].mdef * 0.01
- @str_plus += @reference_value * $data_weapons[id, true].str_plus * 0.01
- @dex_plus += @reference_value * $data_weapons[id, true].dex_plus * 0.01
- @agi_plus += @reference_value * $data_weapons[id, true].agi_plus * 0.01
- @int_plus += @reference_value * $data_weapons[id, true].int_plus * 0.01
- else
- @price = @price * $data_weapons[id, true].price * 0.01
- @atk = @atk * $data_weapons[id, true].atk * 0.01
- @pdef = @pdef * $data_weapons[id, true].pdef * 0.01
- @mdef = @mdef * $data_weapons[id, true].mdef * 0.01
- @str_plus = @str_plus * $data_weapons[id, true].str_plus * 0.01
- @dex_plus = @dex_plus * $data_weapons[id, true].dex_plus * 0.01
- @agi_plus = @agi_plus * $data_weapons[id, true].agi_plus * 0.01
- @int_plus = @int_plus * $data_weapons[id, true].int_plus * 0.01
- end
- @element_set = ($data_weapons[id, true].element_set | @element_set) -
- [REFERENCE_VALUE_ELEMENT, NO_TEXT_ELEMENT] - RARITY_ELEMENTS.keys
- @plus_state_set = $data_weapons[id, true].plus_state_set | @plus_state_set
- @minus_state_set = $data_weapons[id, true].minus_state_set | @minus_state_set
- @rarity += $data_weapons[id, true].rarity
- end
- #--------------------------------------------------------------------------
- # ● 分散数据处理
- # times:处理次数
- # parameter:参数
- #--------------------------------------------------------------------------
- def vary_data(times=VARY_DATA_TIMES, parameter=0)
- # 判断是否不进行第一数据处理
- return if parameter & 0b10000 == 0b10000
- # 处理times次
- times.times do
- # 按概率随机选出ID
- temp = []
- for id in FIRST_PROCESS_ID.keys
- FIRST_PROCESS_ID[id].times do
- temp.push(id)
- end
- end
- return if temp == []
- id = temp[rand(temp.size)]
- # 数据处理
- number_process(id)
- end
- end
- #--------------------------------------------------------------------------
- # ● 数据取整
- #--------------------------------------------------------------------------
- def integer_parameters
- @price = @price.round
- @atk = @atk.round
- @pdef = @pdef.round
- @mdef = @mdef.round
- @str_plus = @str_plus.round
- @dex_plus = @dex_plus.round
- @agi_plus = @agi_plus.round
- @int_plus = @int_plus.round
- end
- #--------------------------------------------------------------------------
- # ● 定义名字颜色
- #--------------------------------------------------------------------------
- def name_color
- return get_random_equipment_name_color(@rarity)
- end
- end
- #==========================================================================
- # ■ 武器
- #==========================================================================
- class Weapon
- #--------------------------------------------------------------------------
- # ● 定义实例变量
- #--------------------------------------------------------------------------
- attr_accessor :reference_value # 基准值
- attr_accessor :rating # 定量
- attr_accessor :rarity # 权值
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- @description.slice!(/\\基准值\[([0-9]+)\]/)
- @reference_value = $1.to_i
- @description.slice!(/\\定量\[([0-9]+)\]/)
- @rating = $1.to_i
- @description.slice!(/\\权值\[(-*[0-9]+)\]/)
- @rarity = $1.to_i
- end
- end
- #==========================================================================
- #-------------------------------------
- # ◎ 防具类
- #-------------------------------------
- #==========================================================================
-
- #==========================================================================
- # ■ 随机防具
- #==========================================================================
- class Random_Armor < Armor
- #--------------------------------------------------------------------------
- # ● 定义常量
- #--------------------------------------------------------------------------
- # 以下的ID均是指数据库编号
- #--------------
- # 分散数据处理ID和出现概率(个数不限)
- # 格式:{ID=>概率, ID=>概率, ID=>概率...}
- # 大括号、等号、小于号、逗号都要用半角
- FIRST_PROCESS_ID = {1=>2, 2=>2, 3=>2, 4=>2, 5=>2, 6=>2, 7=>2,
- 8=>2, 9=>2, 10=>2, 11=>2, 12=>2}
- #--------------
- # 前缀ID
- PREFIX_ID = 13..26
- #--------------
- # 后缀ID
- SUFFIX_ID = 27..101
- #--------------
- # 品质属性ID,出现概率和权值(个数不限)
- # 权值:越高代表该品质越好,暂时没有实际作用
- # 格式:{ID=>概率, ID=>概率, ID=>概率, ...}
- RARITY_ELEMENTS = {25=>60, 26=>20, 27=>10, 28=>3}
- #--------------
- # 套用基准值属性ID
- REFERENCE_VALUE_ELEMENT = 23
- #--------------
- # 不加入前后缀及说明属性ID
- NO_TEXT_ELEMENT = 24
- #--------------
- # 默认分散数据处理次数
- VARY_DATA_TIMES = 100
- #--------------------------------------------------------------------------
- # ● 定义名字颜色
- #--------------------------------------------------------------------------
- def name_color #get_random_equipment_name_color(rarity)
- return get_random_equipment_name_color(@rarity)
- case @rarity
- when 1
- # 绿
- return Color.new(255,120,0)
- when 2..3
- # 蓝
- return Color.new(0,120,255)
- when 4
- # 紫
- return Color.new(160, 0, 255)
- when 6..7
- # 红
- return Color.new(255,120,0)
- when 8..40
- # 金
- return Color.new(255,255,0)
- else
- # 白
- return Color.new(255,255,255)
- end
- end
- #--------------------------------------------------------------------------
- # ● 定义实例变量
- #--------------------------------------------------------------------------
- attr_accessor :type # 母本ID
- attr_accessor :reference_value # 基准值,数据加成时用
- attr_accessor :rarity # 总品质权值
- attr_accessor :reqlevel # 需求等级(暂时没有实际作用)
- #--------------------------------------------------------------------------
- # ● 初始化对像
- # id : 母本ID(数据库中ID)
- # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
- # 把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
- # 1:不生成前缀
- # 2:不生成后缀
- # 4:不带前缀名称
- # 8:不带后缀名称
- # 16:不进行分散数据处理
- # 32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
- # prefix_id:指定前缀ID,强行附加该前缀
- # suffix_id:指定后缀ID,强行附加该后缀
- #--------------------------------------------------------------------------
- def initialize(id, prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
- @type = id
- @name = $data_armors[id, true].name
- @icon_name = $data_armors[id, true].icon_name
- @description = $data_armors[id, true].description
- @reference_value = $data_armors[id, true].reference_value
- @current_rating = $data_armors[id, true].rating
- @kind = $data_armors[id, true].kind
- @auto_state_id = $data_armors[id, true].auto_state_id
- @price = $data_armors[id, true].price
- @pdef = $data_armors[id, true].pdef
- @mdef = $data_armors[id, true].mdef
- [url=home.php?mod=space&uid=284635]@eva[/url] = $data_armors[id, true].eva
- @str_plus = $data_armors[id, true].str_plus
- @dex_plus = $data_armors[id, true].dex_plus
- @agi_plus = $data_armors[id, true].agi_plus
- @int_plus = $data_armors[id, true].int_plus
- @guard_element_set = $data_armors[id, true].guard_element_set
- @guard_state_set = $data_armors[id, true].guard_state_set
- @rarity = $data_armors[id, true].rarity
- @reqlevel = 1
- # 随机生成数据处理
- random_data(prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
- end
- #--------------------------------------------------------------------------
- # ● 随机生成数据处理
- #--------------------------------------------------------------------------
- def random_data(prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
- # 前缀处理
- prefix_process(prefix_rarity, parameter, prefix_id)
- # 后缀处理
- suffix_process(suffix_rarity, parameter, suffix_id)
- # 分散数据处理
- vary_data(VARY_DATA_TIMES, parameter)
- # 数据取整
- integer_parameters
- end
- #--------------------------------------------------------------------------
- # ● 前缀处理
- # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
- # (从最左边为1开始)
- # parameter:参数
- # prefix_id:指定前缀ID
- #--------------------------------------------------------------------------
- def prefix_process(rarity_type=[], parameter=0, prefix_id=0)
- # 判断是否不进行前缀处理
- return if parameter & 0b1 == 0b1
- # 指定了品质的情况
- if rarity_type != []
- rarity_id = rarity_type[rand(rarity_type.size)]
- # 按概率随机选出品质的情况
- else
- temp = []
- for id in RARITY_ELEMENTS.keys
- RARITY_ELEMENTS[id].times do
- temp.push(id)
- end
- end
- return if temp == []
- rarity_id = temp[rand(temp.size)]
- end
- # 指定了前缀的情况
- if prefix_id > 0
- id = prefix_id
- # 随机选出品质对应的前缀的情况
- else
- # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
- return if @guard_element_set.include?(rarity_id)
- temp = []
- for i in PREFIX_ID
- if $data_armors[i, true].guard_element_set.include?(rarity_id) and
- $data_armors[i, true].kinds.include?(@kind)
- temp.push(i)
- end
- end
- return if temp == []
- id = temp[rand(temp.size)]
- end
- # 文字、动画、图标和自动状态处理
- text_process(id, parameter, 1)
- # 数据处理
- number_process(id, rarity_id)
- end
- #--------------------------------------------------------------------------
- # ● 后缀处理
- # rarity_type:品质,0为随机选取,大于0则指定为第rarity_type个品质
- # (从最左边为1开始)
- # parameter:参数
- # suffix_id:指定后缀ID
- #--------------------------------------------------------------------------
- def suffix_process(rarity_type=0, parameter=0, suffix_id=0)
- # 判断是否不进行后缀处理
- return if parameter & 0b10 == 0b10
- # 指定了品质的情况
- if rarity_type != []
- rarity_id = rarity_type[rand(rarity_type.size)]
- # 按概率随机选出品质的情况
- else
- temp = []
- for id in RARITY_ELEMENTS.keys
- RARITY_ELEMENTS[id].times do
- temp.push(id)
- end
- end
- return if temp == []
- rarity_id = temp[rand(temp.size)]
- end
- # 指定了后缀的情况
- if suffix_id > 0
- id = suffix_id
- # 随机选出品质对应的后缀的情况
- else
- # 如果属性里勾了对应的品质的话就返回(除了指定了前后缀以外)
- return if @guard_element_set.include?(rarity_id)
- temp = []
- for i in SUFFIX_ID
- if $data_armors[i, true].guard_element_set.include?(rarity_id) and
- $data_armors[i, true].kinds.include?(@kind)
- temp.push(i)
- end
- end
- return if temp == []
- id = temp[rand(temp.size)]
- end
- # 文字、动画、图标和自动状态处理
- text_process(id, parameter, 2)
- # 数据处理
- number_process(id, rarity_id)
- end
- #--------------------------------------------------------------------------
- # ● 文字、动画、图标和自动状态处理
- # fix:1为前缀,2为后缀
- #--------------------------------------------------------------------------
- def text_process(id, parameter=0, fix=0)
- # 名称和动画处理
- # 判断是否加入前后缀及说明
- if !$data_armors[id, true].guard_element_set.include?(NO_TEXT_ELEMENT)
- case fix
- when 1
- # 判断是否带前缀名称
- if parameter & 0b100 != 0b100
- @name = $data_armors[id, true].name + @name
- end
- when 2
- # 判断是否带后缀名称
- if parameter & 0b1000 != 0b1000
- @name = @name + $data_armors[id, true].name
- end
- end
- @description = @description + $data_armors[id, true].description
- end
- if $data_armors[@type, true].rating >= @current_rating or (parameter & 0b100000 == 0b100000)
- @icon_name = $data_armors[id, true].icon_name if $data_armors[id, true].icon_name != ''
- @auto_state_id = $data_armors[id, true].auto_state_id if $data_armors[id, true].auto_state_id != 0
- @current_rating = $data_armors[id, true].rating
- end
- end
- #--------------------------------------------------------------------------
- # ● 数字类数据处理
- #--------------------------------------------------------------------------
- def number_process(id, rarity_id = 0)
- # 判断是否套用基准值
- if $data_armors[id, true].guard_element_set.include?(REFERENCE_VALUE_ELEMENT)
- @price = @price * $data_armors[id, true].price * 0.01
- @pdef += @reference_value * $data_armors[id, true].pdef * 0.01
- @mdef += @reference_value * $data_armors[id, true].mdef * 0.01
- @eva += 100 * $data_armors[id, true].eva * 0.01
- @str_plus += @reference_value * $data_armors[id, true].str_plus * 0.01
- @dex_plus += @reference_value * $data_armors[id, true].dex_plus * 0.01
- @agi_plus += @reference_value * $data_armors[id, true].agi_plus * 0.01
- @int_plus += @reference_value * $data_armors[id, true].int_plus * 0.01
- else
- @price = @price * $data_armors[id, true].price * 0.01
- @pdef = @pdef * $data_armors[id, true].pdef * 0.01
- @mdef = @mdef * $data_armors[id, true].mdef * 0.01
- @eva = @eva * $data_armors[id, true].eva * 0.01
- @str_plus = @str_plus * $data_armors[id, true].str_plus * 0.01
- @dex_plus = @dex_plus * $data_armors[id, true].dex_plus * 0.01
- @agi_plus = @agi_plus * $data_armors[id, true].agi_plus * 0.01
- @int_plus = @int_plus * $data_armors[id, true].int_plus * 0.01
- end
- @guard_element_set = ($data_armors[id, true].guard_element_set | @guard_element_set) -
- [REFERENCE_VALUE_ELEMENT, NO_TEXT_ELEMENT] - RARITY_ELEMENTS.keys
- @guard_state_set = $data_armors[id, true].guard_state_set | @guard_state_set
- @rarity += $data_armors[id, true].rarity
- end
- #--------------------------------------------------------------------------
- # ● 分散数据处理
- # times:处理次数
- # parameter:参数
- #--------------------------------------------------------------------------
- def vary_data(times=VARY_DATA_TIMES, parameter=0)
- # 判断是否不进行第一数据处理
- return if parameter & 0b10000 == 0b10000
- # 处理times次
- times.times do
- # 按概率随机选出ID
- temp = []
- for id in FIRST_PROCESS_ID.keys
- FIRST_PROCESS_ID[id].times do
- temp.push(id)
- end
- end
- return if temp == []
- id = temp[rand(temp.size)]
- # 数据处理
- number_process(id)
- end
- end
- #--------------------------------------------------------------------------
- # ● 数据取整
- #--------------------------------------------------------------------------
- def integer_parameters
- @price = @price.round
- @pdef = @pdef.round
- @mdef = @mdef.round
- @eva = @eva.round
- @str_plus = @str_plus.round
- @dex_plus = @dex_plus.round
- @agi_plus = @agi_plus.round
- @int_plus = @int_plus.round
- end
- end
-
- #==========================================================================
- # ■ 防具
- #==========================================================================
- class Armor
- #--------------------------------------------------------------------------
- # ● 定义实例变量
- #--------------------------------------------------------------------------
- attr_accessor :reference_value # 基准值
- attr_accessor :rating # 定量
- attr_accessor :rarity # 权值
- attr_accessor :kinds # 附加种类
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- @description.slice!(/\\基准值\[([0-9]+)\]/)
- @reference_value = $1.to_i
- @description.slice!(/\\定量\[([0-9]+)\]/)
- @rating = $1.to_i
- @description.slice!(/\\权值\[(-*[0-9]+)\]/)
- @rarity = $1.to_i
- @kinds = [@kind]
- last_kinds = nil
- while last_kinds != @kinds do
- last_kinds = @kinds.clone
- @description.sub!(/\\种类\[([0-9])\]/) { '' }
- @kinds.push($1.to_i) if $1 != nil
- end
- end
- end
- end
- #==============================================================================
- # ■ Game_System
- #------------------------------------------------------------------------------
- # 处理系统附属数据的类。也可执行诸如 BGM 管理之类的功能。本类的实例请参考
- # $game_system 。
- #==============================================================================
- class Game_System
- # 装备数据库
- attr_accessor :data_random_weapons
- attr_accessor :data_random_armors
- # 采用Hash保存数据的原因:以后可能会从内存中清除无用物品
- #--------------------------------------------------------------------------
- # ● 创造物品
- # 创造完毕后会返回物品对象ID
- # type_id : 物品母本ID(数据库ID)
- # kind : 种类,1是武器,2是防具
- #--------------------------------------------------------------------------
- def create_item(type_id, kind, prefix_rarity=[], suffix_rarity=[], parameter=0, prefix_id=0, suffix_id=0)
- # 防止出错
- if type_id == 0
- return 0
- end
- case kind
- when 1
- item = RPG::Random_Weapon.new(type_id, prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
- if @data_random_weapons.keys.max.nil?
- id = 1
- else
- id = @data_random_weapons.keys.max + 1
- end
- @data_random_weapons[id] = item
- item.id = id
- return id
- when 2
- item = RPG::Random_Armor.new(type_id, prefix_rarity, suffix_rarity, parameter, prefix_id, suffix_id)
- if @data_random_armors.keys.max.nil?
- id = 1
- else
- id = @data_random_armors.keys.max + 1
- end
- @data_random_armors[id] = item
- item.id = id
- return id
- end
- end
- end
- #==============================================================================
- # ■ Data_Random_Weapons
- #------------------------------------------------------------------------------
- # 随机武器数据的类。
- #==============================================================================
- class Data_Random_Weapons
- def initialize
- @data_weapons = load_data("Data/Weapons.rxdata")
- # 刷新数据
- for item in @data_weapons
- next if item == nil
- item.refresh
- end
- end
- #--------------------------------------------------------------------------
- # ● parent_data:是否取得母本数据
- #--------------------------------------------------------------------------
- def [](id, parent_data = false)
- if parent_data
- return @data_weapons[id]
- else
- return $game_system.data_random_weapons[id]
- end
- end
- def size
- return $game_system.data_random_weapons.size + @data_weapons.size
- end
- end
- #==============================================================================
- # ■ Data_Random_Armors
- #------------------------------------------------------------------------------
- # 随机防具数据的类。
- #==============================================================================
- class Data_Random_Armors
- def initialize
- @data_armors = load_data("Data/Armors.rxdata")
- # 刷新数据
- for item in @data_armors
- next if item == nil
- item.refresh
- end
- end
- #--------------------------------------------------------------------------
- # ● parent_data:是否取得母本数据
- #--------------------------------------------------------------------------
- def [](id, parent_data = false)
- if parent_data
- return @data_armors[id]
- else
- return $game_system.data_random_armors[id]
- end
- end
- def size
- return $game_system.data_random_armors.size + @data_armors.size
- end
- end
复制代码
- =begin
- ==========================================================================
- 随机装备生成系统 v1.4
- ==========================================================================
- By 叶子 SailCat
-
- 这个系统是在SailCat的随机武器生成系统的基础上编写而成
-
- --------------------------------------------------------------------------
- 随机装备生成系统·接入
- --------------------------------------------------------------------------
- 本部分是随机装备生成系统的接入部分,基本上所有可能冲突的地方都是在这里。
-
- -----------
- 使用说明(接入部分)
- -----------
-
- -获得装备原理(以武器为例):
-
- 用事件来获得武器的话,都会生成一把新武器,并不会获得以前已经生成过的武器。如果
- 用事件来失去武器,就会搜索母本相同的最新的一把武器,找到后就失去。
-
- 如果用脚本:
- 获得武器:
- $game_party.gain_weapon(weapon_id, n, new)
- 参数:
- new:为true时生成新武器,false时获得旧武器(更换装备时调用这个)
- weapon_id:new为true时为母本ID,new为false时为装备ID(同actor.weapon_id)
- n:n把。每把都会重新计算生成。
-
- 失去武器:
- $game_party.lose_weapon(weapon_id, n, serch)
- 参数:
- serch:为true时搜索母本相同的武器失去,false时为失去指定ID武器
- weapon_id:serch为true时为母本ID,serch为false时为装备ID(同actor.weapon_id)
- n:n把。
-
- 由于获得装备的函数跟原来不同,所以可能会跟商店、仓库类脚本冲突。
-
- 生成装备时还可以添加一些参数,实现生成普通装备或强行添加前后缀等,
- 具体请按Ctrl+F搜索“● 增加武器 (减少)”
- =end
- #==============================================================================
- # ■ Game_System
- #------------------------------------------------------------------------------
- # 处理系统附属数据的类。也可执行诸如 BGM 管理之类的功能。本类的实例请参考
- # $game_system 。
- #==============================================================================
- # 初始化装备数据库
- #==============================================================================
- class Game_System
- attr_accessor :data_random_weapons
- attr_accessor :data_random_armors
- alias sailcat_initialize initialize
- def initialize
- sailcat_initialize
- # 初始化装备数据库,所有随机生成的装备都在此数据库中
- @data_random_weapons = {}
- @data_random_armors = {}
- end
- end
- #==============================================================================
- # ■ Game_Actor
- #------------------------------------------------------------------------------
- # 处理角色的类。本类在 Game_Actors 类 ($game_actors)
- # 的内部使用、Game_Party 类请参考 ($game_party) 。
- #==============================================================================
- # 生成角色初始装备,装备判定、变更装备修正
- #==============================================================================
- class Game_Actor < Game_Battler
- #--------------------------------------------------------------------------
- # ● 设置
- # actor_id : 角色 ID
- #--------------------------------------------------------------------------
- def setup(actor_id)
- actor = $data_actors[actor_id]
- @actor_id = actor_id
- @name = actor.name
- @character_name = actor.character_name
- @character_hue = actor.character_hue
- @battler_name = actor.battler_name
- @battler_hue = actor.battler_hue
- @class_id = actor.class_id
- # 生成装备
- @weapon_id = $game_system.create_item(actor.weapon_id, 1)
- @armor1_id = $game_system.create_item(actor.armor1_id, 2)
- @armor2_id = $game_system.create_item(actor.armor2_id, 2)
- @armor3_id = $game_system.create_item(actor.armor3_id, 2)
- @armor4_id = $game_system.create_item(actor.armor4_id, 2)
- @level = actor.initial_level
- @exp_list = Array.new(101)
- make_exp_list
- @exp = @exp_list[@level]
- @skills = []
- @hp = maxhp
- @sp = maxsp
- @states = []
- @states_turn = {}
- @maxhp_plus = 0
- @maxsp_plus = 0
- @str_plus = 0
- @dex_plus = 0
- @agi_plus = 0
- @int_plus = 0
- # 学会特技
- for i in 1..@level
- for j in $data_classes[@class_id].learnings
- if j.level == i
- learn_skill(j.skill_id)
- end
- end
- end
- # 刷新自动状态
- update_auto_state(nil, $data_armors[@armor1_id])
- update_auto_state(nil, $data_armors[@armor2_id])
- update_auto_state(nil, $data_armors[@armor3_id])
- update_auto_state(nil, $data_armors[@armor4_id])
- end
- #--------------------------------------------------------------------------
- # ● 变更装备
- # equip_type : 装备类型
- # id : 武器 or 防具 ID (0 为解除装备)
- #--------------------------------------------------------------------------
- def equip(equip_type, id)
- # $game_party.gain_weapon(@weapon_id, 1, false),增加参数,不生成新装备
- case equip_type
- when 0 # 武器
- if id == 0 or $game_party.weapon_number(id) > 0
- $game_party.gain_weapon(@weapon_id, 1, false)
- @weapon_id = id
- $game_party.lose_weapon(id, 1)
- end
- when 1 # 盾
- if id == 0 or $game_party.armor_number(id) > 0
- update_auto_state($data_armors[@armor1_id], $data_armors[id])
- $game_party.gain_armor(@armor1_id, 1, false)
- @armor1_id = id
- $game_party.lose_armor(id, 1)
- end
- when 2 # 头
- if id == 0 or $game_party.armor_number(id) > 0
- update_auto_state($data_armors[@armor2_id], $data_armors[id])
- $game_party.gain_armor(@armor2_id, 1, false)
- @armor2_id = id
- $game_party.lose_armor(id, 1)
- end
- when 3 # 身体
- if id == 0 or $game_party.armor_number(id) > 0
- update_auto_state($data_armors[@armor3_id], $data_armors[id])
- $game_party.gain_armor(@armor3_id, 1, false)
- @armor3_id = id
- $game_party.lose_armor(id, 1)
- end
- when 4 # 装饰品
- if id == 0 or $game_party.armor_number(id) > 0
- update_auto_state($data_armors[@armor4_id], $data_armors[id])
- $game_party.gain_armor(@armor4_id, 1, false)
- @armor4_id = id
- $game_party.lose_armor(id, 1)
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 可以装备判定
- # item : 物品
- #--------------------------------------------------------------------------
- def equippable?(item)
- # 武器的情况
- if item.is_a?(RPG::Weapon)
- # 包含当前的职业可以装备武器的场合,调用type取得母本ID
- if item.is_a?(RPG::Random_Weapon)
- if $data_classes[@class_id].weapon_set.include?(item.type)
- return true
- end
- elsif $data_classes[@class_id].weapon_set.include?(item.id)
- return true
- end
- end
- # 防具的情况
- if item.is_a?(RPG::Armor)
- # 包含当前的职业可以装备防具的场合,调用type取得母本ID
- if item.is_a?(RPG::Random_Armor)
- if $data_classes[@class_id].armor_set.include?(item.type)
- return true
- end
- elsif $data_classes[@class_id].armor_set.include?(item.id)
- return true
- end
- end
- return false
- end
- end
- #==============================================================================
- # ■ Game_Party
- #------------------------------------------------------------------------------
- # 处理同伴的类。包含金钱以及物品的信息。本类的实例
- # 请参考 $game_party。
- #==============================================================================
- # 大幅度修改得失武器
- #==============================================================================
- class Game_Party
- #--------------------------------------------------------------------------
- # ● 增加武器 (减少)
- # weapon_id : 武器 ID
- # n : 个数
- # new : 是否创建新物品
- #
- # 当new为true时可以添加如下参数:
- # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
- # 把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
- # 1:不生成前缀
- # 2:不生成后缀
- # 4:不带前缀名称
- # 8:不带后缀名称
- # 16:不进行分散数据处理
- # 32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
- # prefix_id:指定前缀ID,强行附加该前缀
- # suffix_id:指定后缀ID,强行附加该后缀
- #
- # 指定ID可以给武器附加上随机生成不会出现的前后缀(没有勾选品质属性的前后缀)
- #--------------------------------------------------------------------------
- def gain_weapon(weapon_id, n, new = true, prefix_rarity=[], suffix_rarity=[],
- parameter=0, prefix_id=0, suffix_id=0)
- return if weapon_id <= 0
- # 增加的话
- if n > 0
- # 创建新物品的话,weapon_id当作母本ID
- if new
- n.times do
- @id = $game_system.create_item(weapon_id, 1, prefix_rarity,
- suffix_rarity, parameter, prefix_id, suffix_id)
- @weapons[@id] = 1
- end
- return @id
- # 直接增加
- else
- @weapons[weapon_id] = 1
- end
- # 减少的话
- elsif new
- n.abs.times do
- for weapon in $game_system.data_random_weapons.values.reverse
- if weapon.type == weapon_id and @weapons[weapon.id] == 1
- @id = weapon.id
- @weapons[weapon.id] = 0
- break
- end
- end
- end
- return @id
- else
- @weapons[weapon_id] = 0
- end
- end
- #--------------------------------------------------------------------------
- # ● 增加防具 (减少)
- # armor_id : 防具 ID
- # n : 个数
- # new : 是否创建新物品
- #
- # 当new为true时可以添加如下参数:
- # prefix_rarity:前缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # suffix_rarity:后缀品质数组,[]为随机选取,其余则在数组中随机选出一个
- # parameter:随机生成参数,为0为普通生成(带前后缀),为其它数则有不同效果:
- # 把需要的数加起来则为参数(例如不带前缀名称和不生成后缀为 2+4=6)
- # 1:不生成前缀
- # 2:不生成后缀
- # 4:不带前缀名称
- # 8:不带后缀名称
- # 16:不进行分散数据处理
- # 32:忽略定量,强行附加前缀和后缀的自动状态ID、动画ID、物品图标
- # prefix_id:指定前缀ID,强行附加该前缀
- # suffix_id:指定后缀ID,强行附加该后缀
- #
- # 指定ID可以给防具附加上随机生成不会出现的前后缀(没有勾选品质属性的前后缀)
- #--------------------------------------------------------------------------
- def gain_armor(armor_id, n, new = true, prefix_rarity=[], suffix_rarity=[],
- parameter=0, prefix_id=0, suffix_id=0)
- return if armor_id <= 0
- # 增加的话
- if n > 0
- # 创建新物品的话,armor_id当作母本ID
- if new
- n.times do
- @id = $game_system.create_item(armor_id, 2, prefix_rarity,
- suffix_rarity, parameter, prefix_id, suffix_id)
- @armors[@id] = 1
- end
- return @id
- # 直接增加
- else
- @armors[armor_id] = 1
- end
- # 减少的话
- elsif new
- n.abs.times do
- for armor in $game_system.data_random_armors.values.reverse
- if armor.type == armor_id and @armors[armor.id] == 1
- @id = armor.id
- @armors[armor.id] = 0
- break
- end
- end
- end
- return @id
- else
- @armors[armor_id] = 0
- end
- end
- #--------------------------------------------------------------------------
- # ● 减少武器
- # weapon_id : 武器 ID
- # n : 个数
- # serch : 为true时搜索同母本物品删除
- #--------------------------------------------------------------------------
- def lose_weapon(weapon_id, n, serch = false)
- # 调用 gain_weapon 的数值逆转
- gain_weapon(weapon_id, -n, serch)
- end
- #--------------------------------------------------------------------------
- # ● 减少防具
- # armor_id : 防具 ID
- # n : 个数
- #--------------------------------------------------------------------------
- def lose_armor(armor_id, n, serch = false)
- # 调用 gain_armor 的数值逆转
- gain_armor(armor_id, -n, serch)
- end
- end
- #==============================================================================
- # ■ Window_EquipItem
- #------------------------------------------------------------------------------
- # 装备画面、显示浏览变更装备的候补物品的窗口。
- #==============================================================================
- # 判定装备可能时取得母本,显示装备名称颜色
- #==============================================================================
- class Window_EquipItem < Window_Selectable4
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- if self.contents != nil
- self.contents.dispose
- self.contents = nil
- end
- @data = []
- # 添加可以装备的武器
- if @equip_type == 0
- weapon_set = $data_classes[@actor.class_id].weapon_set
- for i in 1...$data_weapons.size
- if $game_party.weapon_number(i) > 0 and weapon_set.include?(
- $game_system.data_random_weapons[i].type) # type取得母本
- @data.push($data_weapons[i])
- end
- end
- end
- # 添加可以装备的防具
- if @equip_type != 0
- armor_set = $data_classes[@actor.class_id].armor_set
- for i in 1...$data_armors.size
- if $game_party.armor_number(i) > 0 and armor_set.include?(
- $game_system.data_random_armors[i].type) # type取得母本
- if $data_armors[i].kind == @equip_type-1
- @data.push($data_armors[i])
- end
- end
- end
- end
- # 添加空白
- @data.push(nil)
- # 生成位图、描绘全部项目
- @item_max = @data.size
- self.contents = Bitmap.new(width - 32, row_max * 38)
- for i in 0...@item_max-1
- draw_item(i)
- end
- end
- #--------------------------------------------------------------------------
- # ● 项目的描绘
- # index : 项目符号
- #--------------------------------------------------------------------------
- def draw_item(index)
- item = @data[index]
- x = 4 + index % 21 * 36
- y = 4 + index / 21 * 36
- rect = Rect.new(x, y, 36, 36)
- case item
- when RPG::Weapon
- number = $game_party.weapon_number(item.id)
- when RPG::Armor
- number = $game_party.armor_number(item.id)
- end
- bitmap = RPG::Cache.icon(item.icon_name)
- self.contents.blt(x+0, y + 0, bitmap, Rect.new(0, 0, 36, 36), opacity)
- self.contents.font.size = 14
- self.contents.font.color = item.name_color
- #self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
- self.contents.font.color = normal_color
- #self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
- self.contents.draw_text(x-92, y-7, 124, 32, number.to_s, 2)
- end
- end
- #==============================================================================
- # ■ Window_Base
- #------------------------------------------------------------------------------
- # 游戏中全部窗口的超级类。
- #==============================================================================
- # 显示装备颜色
- #==============================================================================
- class Window_Base < Window
- ### Ryan ###
- alias ryan_draw_item_name draw_item_name
- ### Bern ###
- #--------------------------------------------------------------------------
- # ● 描绘物品名
- # item : 物品
- # x : 描画目标 X 坐标
- # y : 描画目标 Y 坐标
- #--------------------------------------------------------------------------
- def draw_item_name(item, x, y)
- if item == nil
- return
- end
- bitmap = RPG::Cache.icon(item.icon_name)
- self.contents.blt(x+2, y + 4, bitmap, Rect.new(0, 0, 36, 36))
- #self.contents.font.color = normal_color
- # 取得颜色
- if item.is_a?(RPG::Random_Weapon) or item.is_a?(RPG::Random_Armor)
- self.contents.font.color = item.name_color
- end
-
- self.contents.font.size = 14
- # self.contents.draw_text(x, y+28, 124, 32, item.name, 0)
- # self.contents.font.color = item.name_color
- end
- end
- #==============================================================================
- # ■ Window_ShopBuy
- #------------------------------------------------------------------------------
- # 商店画面、浏览显示可以购买的商品的窗口。
- #==============================================================================
- # 商店只出售母本
- #==============================================================================
- class Window_ShopBuy < Window_Selectable5
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- if self.contents != nil
- self.contents.dispose
- self.contents = nil
- end
- @data = []
- for goods_item in @shop_goods
- case goods_item[0]
- when 0
- item = $data_items[goods_item[1]]
- # 取得母本
- when 1
- item = $data_weapons[goods_item[1], true]
- # 取得母本
- when 2
- item = $data_armors[goods_item[1], true]
- end
- if item != nil
- @data.push(item)
- end
- end
- # 如果项目数不是 0 就生成位图、描绘全部项目
- @item_max = @data.size
- if @item_max > 0
- self.contents = Bitmap.new(width - 32, row_max * 38)
- for i in 0...@item_max
- draw_item(i)
- end
- end
- end
- end
- #==============================================================================
- # ■ Scene_Title
- #------------------------------------------------------------------------------
- # 处理标题画面的类。
- #==============================================================================
- # 绕过原来的$data_weapons和$data_armors
- #==============================================================================
- class Scene_Title
- #--------------------------------------------------------------------------
- # ● 住处理
- #--------------------------------------------------------------------------
- def main
- # 战斗测试的情况下
- if $BTEST
- battle_test
- return
- end
- # 载入数据库
- $data_actors = load_data("Data/Actors.rxdata")
- $data_classes = load_data("Data/Classes.rxdata")
- $data_skills = load_data("Data/Skills.rxdata")
- $data_items = load_data("Data/Items.rxdata")
- # 绕过原来的数据库,使得可以同时取得母本和生成的装备
- $data_weapons = Data_Random_Weapons.new
- $data_armors = Data_Random_Armors.new
- $data_enemies = load_data("Data/Enemies.rxdata")
- $data_troops = load_data("Data/Troops.rxdata")
- $data_states = load_data("Data/States.rxdata")
- $data_animations = load_data("Data/Animations.rxdata")
- $data_tilesets = load_data("Data/Tilesets.rxdata")
- $data_common_events = load_data("Data/CommonEvents.rxdata")
- $data_system = load_data("Data/System.rxdata")
- # 生成系统对像
- $game_system = Game_System.new
- # 生成标题图形
- @sprite = Sprite.new
- @sprite.bitmap = RPG::Cache.title($data_system.title_name)
- # 生成命令窗口
- s1 = "登录游戏"
- s2 = "读取存档"
- s3 = "退出"
- s4 = "版本"
- @command_window = Window_Command.new(160, [s1, s2, s3, s4])
- @command_window.back_opacity = 160
- @command_window.x = 400 - @command_window.width / 2
- @command_window.y = 190
- # 判定继续的有效性
- # 存档文件一个也不存在的时候也调查
- # 有効为 @continue_enabled 为 true、無効为 false
- @continue_enabled = false
- if FileTest.exist?("cdshjk.dll")
- @continue_enabled = true
- end
- # 继续为有效的情况下、光标停止在继续上
- # 无效的情况下、继续的文字显示为灰色
- if @continue_enabled
- @command_window.index = 1
- else
- @command_window.disable_item(1)
- end
- # 演奏标题 BGM
- $game_system.bgm_play($data_system.title_bgm)
- # 停止演奏 ME、BGS
- Audio.me_stop
- Audio.bgs_stop
- # 执行过渡
- Graphics.transition
- # 主循环
- loop do
- # 刷新游戏画面
- Graphics.update
- # 刷新输入信息
- Input.update
- # 刷新画面
- update
- # 如果画面被切换就中断循环
- if $scene != self
- break
- end
- end
- # 装备过渡
- Graphics.freeze
- # 释放命令窗口
- @command_window.dispose
- # 释放标题图形
- @sprite.bitmap.dispose
- @sprite.dispose
- end
- end
- #==============================================================================
- # ■ Scene_Battle (分割定义 2)
- #------------------------------------------------------------------------------
- # 处理战斗画面的类。
- #==============================================================================
- # 战斗后获得随机生成物品
- #==============================================================================
- class Scene_Battle
- #--------------------------------------------------------------------------
- # ● 开始结束战斗回合
- #--------------------------------------------------------------------------
- def start_phase5
- # 转移到回合 5
- @phase = 5
- # 演奏战斗结束 ME
- $game_system.me_play($game_system.battle_end_me)
- # 还原为战斗开始前的 BGM
- $game_system.bgm_play($game_temp.map_bgm)
- # 初始化 EXP、金钱、宝物
- exp = 0
- gold = 0
- treasures = []
- # 循环
- for enemy in $game_troop.enemies
- # 敌人不是隐藏状态的情况下
- unless enemy.hidden
- # 获得 EXP、增加金钱
- exp += enemy.exp
- gold += enemy.gold
- # 出现宝物判定
- if rand(100) < enemy.treasure_prob
- if enemy.item_id > 0
- treasures.push($data_items[enemy.item_id])
- end
- # 生成物品
- if enemy.weapon_id > 0
- treasures.push($data_weapons[$game_system.create_item(enemy.weapon_id, 1)])
- end
- if enemy.armor_id > 0
- treasures.push($data_armors[$game_system.create_item(enemy.armor_id, 2)])
- end
- end
- end
- end
- # 限制宝物数为 6 个
- treasures = treasures[0..8]
- # 获得 EXP
- for i in 0...$game_party.actors.size
- actor = $game_party.actors[i]
- if actor.cant_get_exp? == false
- last_level = actor.level
- actor.exp += exp
- if actor.level > last_level
- @status_window.level_up(i)
- end
- end
- end
- # 获得金钱
- $game_party.gain_gold(gold)
- # 获得宝物
- for item in treasures
- case item
- when RPG::Item
- $game_party.gain_item(item.id, 1)
- # 获得已生成物品
- when RPG::Weapon
- $game_party.gain_weapon(item.id, 1, false)
- when RPG::Armor
- $game_party.gain_armor(item.id, 1, false)
- end
- end
- # 生成战斗结果窗口
- @result_window = Window_BattleResult.new(exp, gold, treasures)
- # 设置等待计数
- @phase5_wait_count = 10
- end
- end
复制代码 |
|