Project1

标题: 灵活的双持设定(双持角色依然可以持盾) [打印本页]

作者: yz54321    时间: 2016-3-1 23:46
标题: 灵活的双持设定(双持角色依然可以持盾)
本帖最后由 yz54321 于 2016-3-1 23:51 编辑

个人觉得吧,双手、剑盾、双持都属于持械类型,一个职业应该能自由设定这三种类型的任意组合,即从完全不能拿武器盾牌到三种兼能共8种组合。
而va默认设定是双持角色副手不能拿盾,而且如果让他可那双手武器的话,会出现左右手各拿一把双手武器的问题。
这个脚本就是解决这个问题。

脚本功能具体说明:
具有双持特性的角色,
除了可以副手拿单手武器外,依然可以装备双手武器、盾牌,只要添加相应的可装备类型。
为副手更换装备时可选择盾牌或单手武器,不会出现双手武器(禁用盾牌的武器)。
装备双手武器时会卸下副手的装备,副手变为禁用状态。

使用:
在脚本编辑窗口的插件脚本下右键插入,将下面代码复制到新建出来脚本页里。
然后是术语里武器改成主手,盾牌改成副手什么的。

下面是实现的逻辑:
系统默认,如果角色具有双持特性的话,副手(默认拿盾牌那个)的装备类型会设为武器。
本脚本首先会把这个取消,双持角色副手依然为盾牌类型。
然后在获取副手装备列表、装备是否可装在副手、卸下无法装备的物品等地方增加是否双持的条件分支处理。

一些问题:
数据库里的设置依然是原来的样子,所以不能设置双持角色初始拿盾之类。
默认的“最强装备”选项依然是先确定主手装备,再确定副手装备,而不会主副手一起综合考虑。
因为接触脚本没多久,这是写的第一个脚本,不确定是否有考虑不周到的地方。

代码:
RUBY 代码复制
  1. class Game_Actor
  2.  
  3.   #--------------------------------------------------------------------------
  4.   # ● 将装备类型变换为装备栏 ID 的列表
  5.   #--------------------------------------------------------------------------
  6.   alias FreeDualWield_slot_list slot_list
  7.   def slot_list(etype_id)
  8.     result = []
  9.     equip_slots.each_with_index {|e, i|
  10.       result.push(i) if etype_id == 0 && dual_wield? && i == 1 || e == etype_id
  11.     }
  12.     result
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 获取装备栏的数组
  16.   #--------------------------------------------------------------------------
  17.   alias FreeDualWield_equip_slots equip_slots
  18.   def equip_slots
  19.     return [0,1,2,3,4]
  20.   end
  21.  
  22.   #--------------------------------------------------------------------------
  23.   # ● 更换装备
  24.   #     slot_id : 装备栏 ID
  25.   #     item    : 武器/护甲(为 nil 时装备解除)
  26.   #--------------------------------------------------------------------------
  27.   alias FreeDualWield_change_equip change_equip
  28.   def change_equip(slot_id, item)
  29.     return unless trade_item_with_party(item, equips[slot_id])
  30.  
  31.     if !dual_wield_toka?(slot_id, item)
  32.       return if item && equip_slots[slot_id] != item.etype_id
  33.     end
  34.     @equips[slot_id].object = item
  35.     refresh
  36.   end
  37.  
  38.   #--------------------------------------------------------------------------
  39.   # ● 卸下无法装备的物品
  40.   #     item_gain : 卸下的装备是否保留
  41.   #--------------------------------------------------------------------------
  42.   alias FreeDualWield_release_unequippable_items release_unequippable_items
  43.   def release_unequippable_items(item_gain = true)
  44.     @equips.each_with_index do |item, i|
  45.  
  46.       if !equippable?(item.object)
  47.         trade_item_with_party(nil, item.object) if item_gain
  48.         item.object = nil
  49.       elsif dual_wield? && i == 1
  50.  
  51.         if feature_seal_shield?(@equips[0].object) || feature_seal_shield?(item.object)
  52.  
  53.           trade_item_with_party(nil, item.object) if item_gain
  54.           item.object = nil
  55.         end
  56.       elsif item.object.etype_id != equip_slots[i]
  57.  
  58.         trade_item_with_party(nil, item.object) if item_gain
  59.         item.object = nil
  60.  
  61.       end
  62.  
  63.     end
  64.   end
  65.  
  66.   #--------------------------------------------------------------------------
  67.   # ● 是否为双手武器
  68.   #--------------------------------------------------------------------------
  69.   def feature_seal_shield?(item)
  70.     return false unless item && item.etype_id == 0
  71.     feature = item.features.select {|ft| ft.code == 54 }
  72.     feature_set = feature.inject([]) {|r, ft| r |= [ft.data_id] }
  73.  
  74.     return feature_set.include?(1)
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 是否为【双持】且【装备槽为副手】且【装备为单手武器】
  78.   #--------------------------------------------------------------------------
  79.   def dual_wield_toka?(slot_id, item)
  80.     return  dual_wield? && slot_id == 1 &&  !feature_seal_shield?(item)
  81.   end
  82.  
  83.  
  84. end
  85.  
  86.  
  87. class Window_EquipItem
  88.  
  89.   alias FreeDualWield_include? include?
  90.  
  91.   def include?(item)
  92.     return true if item == nil
  93.     return false unless item.is_a?(RPG::EquipItem)
  94.     return false if @slot_id < 0
  95.     return false unless @actor.equippable?(item)
  96.  
  97.     return true if @actor.dual_wield_toka?(@slot_id, item)
  98.  
  99.     return false if item.etype_id != @actor.equip_slots[@slot_id]
  100.     return true
  101.   end
  102. end





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