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

Project1

 找回密码
 注册会员
搜索
查看: 14010|回复: 21

[RMVX发布] (9.26)VX给人物增加新能力,并使之受等级装备状态影响

 关闭 [复制链接]

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-8-3
帖子
976
发表于 2008-9-15 19:46:04 | 显示全部楼层 |阅读模式

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

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

x
最新动态:
9.26  刚又发现几个装备栏显示排列问题,已修正。另外注意状态栏备写的格式是<MDFR n>,中间有空格,n为使能力变为n%,而不是<MDF n>

--------------------------------------------------------------------------
VX默认的能力太少了,只有4个……貌似挺多人想增加新能力呢……不过过程比较复杂

就试着写个教程吧:



比如说你想加一个“魔抗”—— mdf,可以按照这些步骤:

(以下凡是有做改动的脚本页都建议备份,就是把原来的脚本复制到MAIN下面,以便改动失败时恢复。还有修改脚本的一大关键就是要擅于搜索关键字、擅于模仿原有代码)

建议备份以下脚本页
  1. Game_Actor
  2. Game_Actors
  3. Game_Battler
  4. Window_EquipStatus
  5. Scene_Equip
  6. Window_Base
  7. Window_Status
复制代码


1.如果你希望自己加的 魔抗 能够随着等级提升而自动增加,可以做一个魔抗初始值orimdf和魔抗-等级比率mdfpl,就是每升一级增加的魔抗数值。
Game_Actor中, 开始就有个  ●定义实例变量

这一部分中加入

  1. attr_accessor :orimdf                   # 魔抗初始值
  2. attr_accessor :mdfpl                    # mdf per level 魔抗-等级比率
复制代码


然后在Game_Actors里面为每个角色设orimdf、mdfpl初始值:

  1. #==============================================================================
  2. # ■ Game_Actors
  3. #------------------------------------------------------------------------------
  4. #  处理角色排列的类。本类的实例请参考
  5. #  $game_actors。
  6. #==============================================================================

  7. class Game_Actors
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     @data = []
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 获取角色
  16.   #     actor_id : 角色 ID
  17.   #--------------------------------------------------------------------------
  18.   def [](actor_id)
  19.     if @data[actor_id] == nil and $data_actors[actor_id] != nil
  20.       @data[actor_id] = Game_Actor.new(actor_id)
  21. #------------------以下--------------------------------------------
  22.           case actor_id                              #根据角色编号不同
  23.           when 1                                     #1号角色  
  24.                 @data[actor_id].orimdf = 20          #魔抗初始值         
  25.                 @data[actor_id].mdfpl = 6            #魔抗系数初始值
  26.           when 2                                     #2号角色
  27.                 @data[actor_id].orimdf = 10          #魔抗初始值  
  28.                 @data[actor_id].mdfpl = 2            #其他角色以此类推自己加
  29.           else
  30.                 @data[actor_id].orimdf = 5           #默认的情况下
  31.                 @data[actor_id].mdfpl = 1            
  32.           end
  33. #------------------以上--------------------------------------------
  34.     end
  35.     return @data[actor_id]
  36.   end
  37. end
复制代码


2.然后设置base_mdf,在Game_Actor里面不是有很多   # ● 获取基本攻击力、  # ● 获取基本防御力、  # ● 获取基本精神力  这一类的东东?
那么我们也加一个:

  1.   #--------------------------------------------------------------------------
  2.   # ● 获取基本魔抗
  3.   #--------------------------------------------------------------------------
  4.   def base_mdf
  5.     n = orimdf + mdfpl * level    #魔抗裸体基本值=初始值+等级提升值
  6.     for item in equips.compact do n += item.mdf end
  7.     return n
  8.   end
复制代码


3.接下来要做的事,就是在脚本编辑器左边,右键单击,搜索 “ atk ”,然后看看那些地方对atk的计算方法做了定义,就依样画葫芦添加一个mdf的对应定义。
Vocab中的就不用加了,
(以下为修改提示,“改”为修改相应名字的函数,“加”为直接添加到类(class)中函数与函数之间。最好还是自己弄懂,利用搜索找到正确位置增改)
Game_Battler

  1.   #--------------------------------------------------------------------------
  2.   # ● 清理能力值增加值
  3.   #--------------------------------------------------------------------------
  4.   def clear_extra_values
  5.     @maxhp_plus = 0
  6.     @maxmp_plus = 0
  7.     @atk_plus = 0
  8.     @def_plus = 0
  9.     @spi_plus = 0
  10.     @mdf_plus = 0    #这里加
  11.     @agi_plus = 0
  12.   end
复制代码


  1.   #--------------------------------------------------------------------------
  2.   # ● 获取魔抗
  3.   #--------------------------------------------------------------------------
  4.   def mdf
  5.     n = [[base_mdf + @mdf_plus, 1].max, 999].min
  6.     for state in states do n *= state.mdf_rate / 100.0 end
  7.     n = [[Integer(n), 1].max, 999].min
  8.     return n
  9.   end
复制代码


  1.   #--------------------------------------------------------------------------
  2.   # ● 设置魔抗增加值
  3.   #     new_mdf : 新的魔抗
  4.   #--------------------------------------------------------------------------
  5.   def mdf=(new_mdf)
  6.     @mdf_plus += new_mdf - self.mdf
  7.     @mdf_plus = [[@mdf_plus, -999].max, 999].min
  8.   end
复制代码




Window_EquipStatus

  1.   #--------------------------------------------------------------------------
  2.   # ● 刷新
  3.   #--------------------------------------------------------------------------
  4.   def refresh
  5.     self.contents.clear
  6.     draw_actor_name(@actor, 4, 0)
  7. #这里的NWLH原来全部是WLH,NWLH是新的行高基本值,在下面修改状态栏显示部分会提到
  8.     draw_parameter(0, NWLH * 1, 0)
  9.     draw_parameter(0, NWLH * 2, 1)
  10.     draw_parameter(0, NWLH * 3, 2)
  11.     draw_parameter(0, NWLH * 4, 3)
  12.     draw_parameter(0, NWLH * 5, 4)        #这里加
  13.   end
复制代码


  1.   #--------------------------------------------------------------------------
  2.   # ● 设置装备变更后的能力值
  3.   #     new_atk : 装备变更后的攻击力
  4.   #     new_def : 装备变更后的防御力
  5.   #     new_spi : 装备变更后的精神力
  6.   #     new_mdf : 装备变更后的魔抗
  7.   #     new_agi : 装备变更后的敏捷性
  8.   #--------------------------------------------------------------------------
  9.   def set_new_parameters(new_atk, new_def, new_spi, new_mdf, new_agi)
  10.     if @new_atk != new_atk or @new_def != new_def or
  11.        @new_spi != new_spi or @new_mdf != new_mdf or
  12.        @new_agi != new_agi             #这里加
  13.       @new_atk = new_atk
  14.       @new_def = new_def
  15.       @new_spi = new_spi
  16.       @new_mdf = new_mdf   #这里加
  17.       @new_agi = new_agi
  18.       refresh
  19.     end
  20.   end
复制代码



  1.   #--------------------------------------------------------------------------
  2.   # ● 描绘能力值
  3.   #     x    : 描绘目标 X 坐标
  4.   #     y    : 描绘目标 Y 坐标
  5.   #     type : 能力值种类 (0~4)
  6.   #--------------------------------------------------------------------------
  7.   def draw_parameter(x, y, type)
  8.     case type
  9.     when 0
  10.       name = Vocab::atk
  11.       value = @actor.atk
  12.       new_value = @new_atk
  13.     when 1
  14.       name = Vocab::def
  15.       value = @actor.def
  16.       new_value = @new_def
  17.     when 2
  18.       name = Vocab::spi
  19.       value = @actor.spi
  20.       new_value = @new_spi
  21.     when 3
  22.       name = "魔抗"
  23.       value = @actor.mdf
  24.       new_value = @new_mdf
  25.     when 4
  26.       name = Vocab::agi
  27.       value = @actor.agi
  28.       new_value = @new_agi
  29.     end
  30.     self.contents.font.color = system_color
  31.     self.contents.draw_text(x + 4, y, 80, NWLH, name)        
  32.     self.contents.font.color = normal_color
  33.     self.contents.draw_text(x + 70, y, 30, NWLH, value, 2)   
  34.     self.contents.font.color = system_color
  35.     self.contents.draw_text(x + 100, y, 20, NWLH, "→", 1)        
  36.     if new_value != nil
  37.       self.contents.font.color = new_parameter_color(value, new_value)
  38.       self.contents.draw_text(x + 125, y, 30, NWLH, new_value, 2)  
  39.     end
  40.   end
  41.        #<-这里新手使用者可能会漏写个CALSS的end,如果打开游戏出错说SyntaxError的错误,就可能是这里还要再加一个end
复制代码


Scene_Equip


  1.   #--------------------------------------------------------------------------
  2.   # ● 更新状态窗口
  3.   #--------------------------------------------------------------------------
  4.   def update_status_window
  5.     if @equip_window.active
  6.       @status_window.set_new_parameters(nil, nil, nil, nil, nil)  #多加一个nil,
  7.     elsif @item_window.active
  8.       temp_actor = @actor.clone
  9.       temp_actor.change_equip(@equip_window.index, @item_window.item, true)
  10.       new_atk = temp_actor.atk
  11.       new_def = temp_actor.def
  12.       new_spi = temp_actor.spi
  13.       new_mdf = temp_actor.mdf   #这里加
  14.       new_agi = temp_actor.agi
  15.       @status_window.set_new_parameters(new_atk, new_def, new_spi, new_mdf, new_agi) #这里
  16.     end
  17.     @status_window.update
  18.   end
复制代码




以下改动是为了在状态栏显示新能力,可以自己改显示字体大小:
Window_Base


  1. NWLH = 18      #新的行高基本值,可以自己改后面的数字,调整字体大小
  2.   #--------------------------------------------------------------------------
  3.   # ● 描绘能力值
  4.   #     actor : 角色
  5.   #     x     : 描绘目标 X 坐标
  6.   #     y     : 描绘目标 Y 坐标
  7.   #     type  : 能力值种类 (0~4)
  8.   #--------------------------------------------------------------------------
  9.   def draw_actor_parameter(actor, x, y, type)
  10.   #-------------------更改字体大小--------------------------
  11.     self.contents.font.size = NWLH      
  12.   #-------------------更改字体大小--------------------------
  13.     case type
  14.     when 0
  15.       parameter_name = Vocab::atk
  16.       parameter_value = actor.atk
  17.     when 1
  18.       parameter_name = Vocab::def
  19.       parameter_value = actor.def
  20.     when 2
  21.       parameter_name = Vocab::spi
  22.       parameter_value = actor.spi
  23.     when 3
  24.       parameter_name = "魔抗"
  25.       parameter_value = actor.mdf
  26.     when 4
  27.       parameter_name = Vocab::agi
  28.       parameter_value = actor.agi
  29.     end
  30.     self.contents.font.color = system_color
  31.    
  32.     self.contents.draw_text(x, y, 120, NWLH , parameter_name)   #NWLH原为WLH
  33.    
  34.     self.contents.font.color = normal_color
  35.    
  36.     self.contents.draw_text(x + 90, y, 36, NWLH , parameter_value, 2) #NWLH原为WLH
  37.   end
复制代码


Window_Status


  1.   #--------------------------------------------------------------------------
  2.   # ● 描绘能力值
  3.   #     x : 描绘目标 X 坐标
  4.   #     y : 描绘目标 Y 坐标
  5.   #--------------------------------------------------------------------------
  6.   def draw_parameters(x, y)
  7.     draw_actor_parameter(@actor, x, y + NWLH * 0, 0)
  8.     draw_actor_parameter(@actor, x, y + NWLH * 1, 1)
  9.     draw_actor_parameter(@actor, x, y + NWLH * 2, 2)
  10.     draw_actor_parameter(@actor, x, y + NWLH * 3, 3)
  11.     draw_actor_parameter(@actor, x, y + NWLH * 4, 4)      
  12.   end
  13.   
复制代码




4.然后让装备和状态也能增加新能力(插件型脚本,放在素材区使用):


  1. #============================================================================
  2. #       装备、状态增加新能力
  3. #       将本脚本放在素材区(MAIN上面,其他脚本下面)
  4. #       在数据库装备设置和状态设置里面的备注栏写上  <MDF n>  中间有空格,n为装备增加的能力值,以及状态使能力变为n%
  5. #============================================================================

  6. class RPG::BaseItem
  7.   
  8.   def mdf                                            #魔抗
  9.     m = 0
  10.     self.note.split(/{\r\n}+/).each { |line|
  11.       m = $1.to_i if line =~ /\<MDF (\d+)\>/
  12.     }   
  13.     return m
  14.   end
  15. end

  16. class RPG::State
  17.   
  18.   def mdf_rate                                            #魔抗改变比率
  19.     m = 100
  20.     self.note.split(/{\r\n}+/).each { |line|
  21.       m = $1.to_i if line =~ /\<MDFR (\d+)\>/
  22.     }   
  23.     return m
  24.   end
  25.   
  26. end
复制代码


好吧,这样应该就可以了吧……呼呼


差点忘了说了,要想让魔抗在战斗中实际造成影响,可以改Game_Battler里面的相关位置,比如默认设定是精神力也当魔抗用的,现在可以改改,找到make_obj_damage_value这个函数,改成

  1.   #--------------------------------------------------------------------------
  2.   # ● 计算特技以及物品造成的伤害
  3.   #     user : 使用特技以及物品的人
  4.   #     obj  : 特技以及物品
  5.   #    将结果代入 @hp_damage 或 @mp_damage。
  6.   #--------------------------------------------------------------------------
  7.   def make_obj_damage_value(user, obj)
  8.     damage = obj.base_damage                        # 获取基本伤害
  9.     if damage > 0                                   # 伤害为正数
  10.       damage += user.atk * 4 * obj.atk_f / 100      # 打击关系度: 使用者
  11.       damage += user.spi * 2 * obj.spi_f / 100      # 精神关系度: 使用者
  12.       unless obj.ignore_defense                     # 无视防御力以外
  13.         damage -= self.def * 2 * obj.atk_f / 100    # 打击关系度: 对象者
  14. #----------------------------------------------------------------
  15.         damage -= self.mdf * 1 * obj.spi_f / 100    # 魔抗关系度: 对象者
  16. #----------------------------------------------------------------
  17.       end
  18.       damage = 0 if damage < 0                      # 减少为 0
  19.     elsif damage < 0                                # 伤害为负数
  20.       damage -= user.atk * 4 * obj.atk_f / 100      # 打击关系度: 使用者
  21.       damage -= user.spi * 2 * obj.spi_f / 100      # 精神关系度: 使用者
  22.     end
  23.     damage *= elements_max_rate(obj.element_set)    # 属性修正
  24.     damage /= 100
  25.     damage = apply_variance(damage, obj.variance)   # 分散
  26.     damage = apply_guard(damage)                    # 防御修正
  27.     if obj.damage_to_mp  
  28.       @mp_damage = damage                           # MP 伤害
  29.     else
  30.       @hp_damage = damage                           # HP 伤害
  31.     end
  32.   end
复制代码


饭吃了一半,想起忘了给敌人加魔抗,又回来改了……
插件型脚本:
  1. #============================================================================
  2. #       敌人增加新能力
  3. #       将本脚本放在素材区(MAIN上面,其他脚本下面)
  4. #       在数据库敌人设置里面的备注栏写上  <MDF n>  中间有空格,n为敌人魔抗
  5. #       敌人魔抗不写则与精神一样
  6. #============================================================================

  7. class RPG::Enemy
  8.   #--------------------------------------------------------------------------
  9.   # ● 获取基本魔抗
  10.   #--------------------------------------------------------------------------
  11.   def mdf
  12.     m = self.spi
  13.     self.note.split(/{\r\n}+/).each { |line|
  14.       m = $1.to_i if line =~ /\<MDF (\d+)\>/
  15.     }   
  16.     return m
  17.   end
  18. end
  19. #==============================================================================
  20. # ■ Game_Enemy
  21. #------------------------------------------------------------------------------
  22. #  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
  23. # 内部使用。
  24. #==============================================================================

  25. class Game_Enemy < Game_Battler
  26.   #--------------------------------------------------------------------------
  27.   # ● 获取基本魔抗
  28.   #--------------------------------------------------------------------------
  29.   def base_mdf
  30.     return enemy.mdf
  31.   end
  32. end
复制代码


范例工程:
http://rpg.blue/upload_program/g ... y DRG_102859412.rar
范例中有改动的脚本名前面都加了"!"作为醒目标志,方便各位找到,不过未对相关脚本进行备份,因为是范例做坏了就删了重来……但是希望新人同志们在自己正在制作的游戏中养成备份的习惯~~

如果有什么疏漏之处麻烦指出……

TA还没有解放自身的潜力。

Lv1.梦旅人 (管理员)

八云紫的式神

梦石
0
星屑
104
在线时间
1202 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

发表于 2008-9-15 19:55:29 | 显示全部楼层
沙发……
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

天仙

梦石
0
星屑
55
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

发表于 2008-9-15 20:15:42 | 显示全部楼层
LZ学我骗帖{/hx}
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-5-12
帖子
41
发表于 2008-9-15 20:32:43 | 显示全部楼层
我来认真研究一下。。
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-8-3
帖子
976
 楼主| 发表于 2008-9-15 20:32:45 | 显示全部楼层
刚又改了几个不妥的地方,
主要是因为代码是从我在做的游戏里面拷过来的,我设置的新能力语句没有删除干净……
清理了一下,应该干净了

以下引用snstar2006于2008-9-15 12:15:42的发言:

LZ学我骗帖

偶才没有骗那么多{/tp}{/tp}{/tp},偶是好孩子{/hx}{/hx}{/hx}
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

kissye的宠物<

梦石
0
星屑
49
在线时间
1562 小时
注册时间
2008-8-11
帖子
6177

贵宾

发表于 2008-9-15 22:52:27 | 显示全部楼层
好麻烦·······
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-8-3
帖子
976
 楼主| 发表于 2008-9-15 22:57:01 | 显示全部楼层
以下引用木葬枫于2008-9-15 14:52:27的发言:

好麻烦·······


所以说整脚本的都是苦工……
过程麻烦还得保修
做其他方面的至少不用售后服务之类的

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

kissye的宠物<

梦石
0
星屑
49
在线时间
1562 小时
注册时间
2008-8-11
帖子
6177

贵宾

发表于 2008-9-15 22:58:54 | 显示全部楼层
以下引用drgdrg于2008-9-15 14:57:01的发言:


以下引用木葬枫于2008-9-15 14:52:27的发言:

好麻烦·······



所以说整脚本的都是苦工……
过程麻烦还得保修
做其他方面的至少不用售后服务之类的

努力研究哈,寒假回来我要看你最好最实用的脚本········
HOHO·····
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
49
在线时间
157 小时
注册时间
2007-12-16
帖子
3454
发表于 2008-9-16 00:15:11 | 显示全部楼层
不错{/qiang}
回复 支持 反对

使用道具 举报

[动态]受到SailCat的挑战,被揍得晕头转向。 (打开TA的战斗卡片)

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
2363
在线时间
3561 小时
注册时间
2006-9-6
帖子
37356

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

发表于 2008-9-16 01:11:34 | 显示全部楼层
虽然很好,
但是真麻烦…… = =
Lofter个站:点击进入吧 不要犹豫了come on baby! (闲水、游戏预告、游戏发布)

回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-8-20 21:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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