Project1

标题: 希望能实现装备类型冲突的效果 [打印本页]

作者: 野村千雪    时间: 2013-11-24 15:39
标题: 希望能实现装备类型冲突的效果
本帖最后由 野村千雪 于 2013-11-25 17:21 编辑

{:2_263:}虽然之前就问过了,不过这次目的更明确,希望有人能帮到我.....
简单来说我希望能通过脚本实现:
某几个类别的武器和盾无法同时装备,装备其中一方的话会使原来装备的另一方的装备自动卸下
比如说
装备弓,铳枪这类远程武器的时候,如果原来装备有盾类装备,盾类装备将自动卸下,但是作为远程武器的弹药类(装备位置为盾)能够和远程武器同时装备
装备远程武器的时候,如果装备上盾,远程武器将自动卸下
就我个人来说,我设定的远程武器只有弓、铳枪这两种,盾则分为四种

虽然不知道能不能作为参考,下面的脚本是装备双手武器时,自动卸下盾装备位置的装备脚本
  1. #==============================================================================
  2. # ■ Game_BattlerBase
  3. #------------------------------------------------------------------------------
  4. #  管理战斗者的类。主要含有能力值计算的方法。Game_Battler 类的父类。
  5. #==============================================================================

  6. class Game_BattlerBase
  7.   
  8.   alias double_equip_equip_type_sealed? equip_type_sealed?
  9.   #--------------------------------------------------------------------------
  10.   # ● 判定装备是否被禁用
  11.   #--------------------------------------------------------------------------
  12.   def equip_type_sealed?(etype_id)
  13.     result = double_equip_equip_type_sealed?(etype_id)
  14.     result if result
  15.     result = weapons.size == 2 if etype_id == 0 and double_equip_equip_type_sealed?(1)
  16.     result
  17.   end
  18. end
复制代码

作者: dukesward    时间: 2013-11-25 05:44
帮你写了个副手装备拓展脚本,我是这么设定的不知道符不符合你要求:
1.根据武器类型和装备来判断是否可以装备。目前武器类型分为5种:单手,双手,弓,魔杖和火枪。相应的副手分为4种:盾,箭矢,魔法副手和弹药,装备双手的时候不能装备任何副手。
2.装备武器的时候自动检查副手装备类型,如果装备了错误的副手装备自动卸下。
3.可以通过在武器和护甲哈希表添加项目自定义武器/装备类型组合。使用时,在两个哈希表中添加同样的项目名,并加入对应的类型数组,举例如下:
假设要添加的武器类型在数据库中的类型5,对应的防具在数据库中的类型6,那么任意命名新类型为NEW (注意最好用大写字母)则
(i)在武器哈希表WEAPON_STATE中添加:"NEW" => [5],
(ii)在防具哈希表ARMOR_STATE中添加:"NEW" => [6], (注意项目名称"NEW"在两个哈希中必须一致。)
就可以了,详细的你自己可以测试。(*欢迎反映bug。)

附上范例:

副手扩展脚本.rar

1.42 MB, 下载次数: 77

副手扩展脚本


作者: 野村千雪    时间: 2013-11-25 17:21
本帖最后由 野村千雪 于 2013-11-25 18:46 编辑
dukesward 发表于 2013-11-25 05:44
帮你写了个副手装备拓展脚本,我是这么设定的不知道符不符合你要求:
1.根据武器类型和装备来判断是否可以 ...


{:2_280:}非常感谢,我要的就是这样的效果

@dukesward 不过用了这个脚本之后,装备魔杖的时候会自动禁止副手....明明没有设定成双手武器
脚本里只设定了盾只能在装备单手武器时装备,单手武器里没有设定
其他的单手武器能正常装备盾,就魔杖不行

发现哪里出问题了,那是因为脚本66行是直接把类型11的武器设定成双手武器,而我的魔杖刚好是编号11...
能否把这里设定设定根据武器库里的设定来判断?就像我提供的那个判断装备栏禁用并自动卸下的脚本那样,因为我的某些武器类型是同时拥有单手和双手武器的
原脚本除了类型11的武器外,都不是真正意义上的双手武器,盾装备栏并没有禁用,虽然没有能装备上去的装备
作者: 野村千雪    时间: 2013-11-25 19:00
本帖最后由 野村千雪 于 2013-11-25 19:39 编辑
dukesward 发表于 2013-11-25 05:44
帮你写了个副手装备拓展脚本,我是这么设定的不知道符不符合你要求:
1.根据武器类型和装备来判断是否可以 ...


{:2_272:}找到一个临时的解决办法
把你的脚本的72-83行注释掉
然后在这里插入1楼脚本的09-18行
这样一来就能解决双手武器盾并没有被禁用的问题,虽然光标移动到盾位置的时候还是能看到盾类装备就是了,但是点不进去
只是这样的话,就必须每一个双手武器都要自己去设定禁用盾装备,而脚本里的double也变得多余

好吧- -,刚发现这样改的话装备双手武器的时候副手不会自动卸下

原来是原脚本就有bug(大概是bug?),装备武器库设定了盾禁用的装备脚本里没有设定成双手的话,盾依旧能点进去,原装备的盾不会自动卸下
于是能不能把双手武器部分的判断改成和1楼的脚本类似的方式呢
我的某些武器类型是同时拥有单手和双手武器的
结果还是回到原点了= =
作者: 野村千雪    时间: 2013-11-25 20:02
本帖最后由 野村千雪 于 2013-11-25 20:04 编辑
dukesward 发表于 2013-11-25 05:44
帮你写了个副手装备拓展脚本,我是这么设定的不知道符不符合你要求:
1.根据武器类型和装备来判断是否可以 ...


按4楼最初的改法,或者把67,68行改为
  def side_change_ok?(slot_id)
    return self.weapons.empty? ? true : weapons.size == 2 if slot_id == 0 and side_change_ok(1)
后把58-62行注释掉
都能达到双手武器禁用副手的目的
认真想了下,发现这楼的思路是对的,但是考虑不全面而已
之所以副手不会卸下,那是因为并没有在double类里设定类型

由于我的脚本里使用了锻造屋脚本,武器类型过多的话图标会挤在一起,因此武器类型不能太多,这也是为什么我的一个类型的武器里同时有双手和单手武器,自然我不能为斧等类武器再多设定一个双手的类
所以我希望双手武器的判断不再由脚本设定,而是和1楼的脚本一样,通过武器库的设定来判断
作者: dukesward    时间: 2013-11-26 00:22
抱歉这里是我没写好,其实比较好的方法是这样,因为在武器哈希里已经定义了double的武器类型组,只要判断某个武器是否出现在该组里就行了。这样你只要把WEAPON_STATE填对就不会出错了。

附上范例:

副手扩展脚本.rar

1.42 MB, 下载次数: 58


作者: 野村千雪    时间: 2013-11-26 20:30
本帖最后由 野村千雪 于 2013-11-26 20:31 编辑
dukesward 发表于 2013-11-26 00:22
抱歉这里是我没写好,其实比较好的方法是这样,因为在武器哈希里已经定义了double的武器类型组,只要判断某 ...


{:2_283:}请问有办法实现判定双手武器的时候是根据武器在武器库是否禁用盾装备的么?
我的脚本里使用了锻造屋脚本,武器类型过多的话进入锻造界面后图标会挤在一起,因此武器类型不能太多,但单纯的武器种类就已经有10多种,再把双手武器分出来的话武器种类就太多了
作者: dukesward    时间: 2013-11-27 00:11
那你就把双手武器类型删掉,在WEAPON_STATE中添加你要禁用盾牌的武器类型不就行了?
作者: 野村千雪    时间: 2013-11-28 17:51
dukesward 发表于 2013-11-27 00:11
那你就把双手武器类型删掉,在WEAPON_STATE中添加你要禁用盾牌的武器类型不就行了? ...

{:2_263:}很抱歉又要打扰你了,因为脚本跳bug了
二刀流角色装备了第一把武器后光标移动到副手就会跳bug
如果没有装备武器光标移动到副手不会跳bug,但是不会显示任何能够装备的武器
作者: dukesward    时间: 2013-11-29 04:49
帮你改好了。把这个新的脚本插入就行。

RUBY 代码复制
  1. =begin
  2. ===============================================================================
  3. 副手拓展脚本 by dukesward
  4.  
  5. 使用方法:在武器状态哈希添加武器类型。
  6.  
  7. SINGLE: 单手武器
  8. DOUBLE: 双手武器
  9. BOW: 弓
  10. WAND: 魔法杖
  11. GUN: 铳(火枪)
  12.  
  13. 然后在防具状态哈希对应的数组中添加防具类型。
  14.  
  15. 例如:
  16. WEAPON_STATE中"SINGLE" => [1], 表示类型1的武器为单手武器。
  17. ARMOR_STATE中"SINGLE" => [1], 表示类型1的防具必须在使用单手武器的同时装备。
  18. ===============================================================================
  19. =end
  20.  
  21. #--------------------------------------------------------------------------
  22. # ● 武器状态哈希定义
  23. #--------------------------------------------------------------------------
  24. WEAPON_STATE = {
  25.   "SINGLE" => [1, 2, 4, 5, 7, 8],
  26.   "DOUBLE" => [3, 11],
  27.   "BOW"    => [6],
  28.   "WAND"   => [9],
  29.   "GUN"    => [10],
  30.   }
  31. #--------------------------------------------------------------------------
  32. # ● 防具状态哈希定义
  33. #--------------------------------------------------------------------------
  34. ARMOR_STATE = {
  35.   "SINGLE" => [5, 6],
  36.   "DOUBLE" => [],
  37.   "BOW"    => [8],
  38.   "WAND"   => [7],
  39.   "GUN"    => [9],
  40.   }
  41.  
  42. class RPG::Weapon < RPG::EquipItem
  43.   #--------------------------------------------------------------------------
  44.   # ● 武器为单手武器?
  45.   #--------------------------------------------------------------------------
  46.   def for_single
  47.     return WEAPON_STATE["SINGLE"].include?(wtype_id)
  48.   end
  49. end
  50.  
  51.  
  52. class Game_Actor < Game_Battler
  53.   #--------------------------------------------------------------------------
  54.   # ● 武器装备状态
  55.   #--------------------------------------------------------------------------
  56.   def equip_state
  57.     WEAPON_STATE.keys.each do |key|
  58.       return key if WEAPON_STATE[key].include?(weapons[0].wtype_id)
  59.     end
  60.     return "SINGLE"
  61.   end
  62.   #--------------------------------------------------------------------------
  63.   # ● 判定是否可以更换装备
  64.   #     slot_id : 装备栏 ID
  65.   #--------------------------------------------------------------------------
  66.   def equip_change_ok?(slot_id)
  67.     return false if equip_type_fixed?(equip_slots[slot_id])
  68.     return slot_id == 1 ? side_change_ok? : !equip_type_sealed?(equip_slots[slot_id])
  69.     return true
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● 判定是否可以使用副手装备
  73.   #     slot_id : 装备栏 ID
  74.   #--------------------------------------------------------------------------
  75.   def side_change_ok?
  76.     return self.weapons.empty? ? true :
  77.     !WEAPON_STATE["DOUBLE"].include?(self.weapons[0].wtype_id)
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● 卸下无法装备的物品
  81.   #     item_gain : 卸下的装备是否保留
  82.   #--------------------------------------------------------------------------
  83.   def release_unequippable_items(item_gain = true)
  84.     @equips.each_with_index do |item, i|
  85.       if !equip_allowed?(item.object, i) || item.object.etype_id != equip_slots[i]
  86.         trade_item_with_party(nil, item.object) if item_gain
  87.         item.object = nil
  88.       end
  89.     end
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ● 判定是否允许装备
  93.   #--------------------------------------------------------------------------
  94.   def equip_allowed?(item, slot_id)
  95.     return slot_id == 1 ? off_hand_equippable?(item) : equippable?(item)
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 判断副手装备类型
  99.   #--------------------------------------------------------------------------
  100.   def off_hand_equippable?(item)
  101.     return false unless item.is_a?(RPG::EquipItem)
  102.     if item.is_a?(RPG::Weapon)
  103.       return false if weapons && !weapons[0].for_single
  104.       return item.for_single ? true : false
  105.     end
  106.     if item.is_a?(RPG::Armor) && !weapons.empty?
  107.       return false if !ARMOR_STATE[equip_state].include?(item.atype_id)
  108.     end
  109.     return equip_atype_ok?(item.atype_id) if item.is_a?(RPG::Armor)
  110.     return false
  111.   end
  112. end
  113.  
  114.  
  115. class Window_EquipItem < Window_ItemList
  116.   #--------------------------------------------------------------------------
  117.   # ● 查询使用列表中是否含有此物品
  118.   #--------------------------------------------------------------------------
  119.   def include?(item)
  120.     return true if item == nil
  121.     return false unless item.is_a?(RPG::EquipItem)
  122.     return false if @slot_id < 0
  123.     return false if item.etype_id != @actor.equip_slots[@slot_id]
  124.     return @slot_id == 1 ? @actor.off_hand_equippable?(item) : @actor.equippable?(item)
  125.   end
  126. end





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