查看: 2120|回复: 0

[RMVA发布] 灵活的双持设定(双持角色依然可以持盾)

[复制链接]
梦石
0
星屑
1539
在线时间
11 小时
注册时间
2016-2-20
回帖
0
发表于 2016-3-1 23:46:31 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 yz54321 于 2016-3-1 23:51 编辑

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

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

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

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

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

代码:
[pre lang="ruby"]
class Game_Actor
  
  #--------------------------------------------------------------------------
  # ● 将装备类型变换为装备栏 ID 的列表
  #--------------------------------------------------------------------------
  alias FreeDualWield_slot_list slot_list
  def slot_list(etype_id)
    result = []
    equip_slots.each_with_index {|e, i|
      result.push(i) if etype_id == 0 && dual_wield? && i == 1 || e == etype_id
    }
    result
  end
  #--------------------------------------------------------------------------
  # ● 获取装备栏的数组
  #--------------------------------------------------------------------------
  alias FreeDualWield_equip_slots equip_slots
  def equip_slots
    return [0,1,2,3,4]
  end
  
  #--------------------------------------------------------------------------
  # ● 更换装备
  #     slot_id : 装备栏 ID
  #     item    : 武器/护甲(为 nil 时装备解除)
  #--------------------------------------------------------------------------
  alias FreeDualWield_change_equip change_equip
  def change_equip(slot_id, item)
    return unless trade_item_with_party(item, equips[slot_id])
   
    if !dual_wield_toka?(slot_id, item)
      return if item && equip_slots[slot_id] != item.etype_id
    end
    @equips[slot_id].object = item
    refresh
  end
  
  #--------------------------------------------------------------------------
  # ● 卸下无法装备的物品
  #     item_gain : 卸下的装备是否保留
  #--------------------------------------------------------------------------
  alias FreeDualWield_release_unequippable_items release_unequippable_items
  def release_unequippable_items(item_gain = true)
    @equips.each_with_index do |item, i|
      
      if !equippable?(item.object)
        trade_item_with_party(nil, item.object) if item_gain
        item.object = nil
      elsif dual_wield? && i == 1
        
        if feature_seal_shield?(@equips[0].object) || feature_seal_shield?(item.object)
         
          trade_item_with_party(nil, item.object) if item_gain
          item.object = nil
        end
      elsif item.object.etype_id != equip_slots
        
        trade_item_with_party(nil, item.object) if item_gain
        item.object = nil
        
      end
      
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 是否为双手武器
  #--------------------------------------------------------------------------
  def feature_seal_shield?(item)
    return false unless item && item.etype_id == 0
    feature = item.features.select {|ft| ft.code == 54 }
    feature_set = feature.inject([]) {|r, ft| r |= [ft.data_id] }
   
    return feature_set.include?(1)
  end
  #--------------------------------------------------------------------------
  # ● 是否为【双持】且【装备槽为副手】且【装备为单手武器】
  #--------------------------------------------------------------------------
  def dual_wield_toka?(slot_id, item)
    return  dual_wield? && slot_id == 1 &&  !feature_seal_shield?(item)
  end
  
   
end


class Window_EquipItem

  alias FreeDualWield_include? include?
  
  def include?(item)
    return true if item == nil
    return false unless item.is_a?(RPG::EquipItem)
    return false if @slot_id < 0
    return false unless @actor.equippable?(item)
   
    return true if @actor.dual_wield_toka?(@slot_id, item)
   
    return false if item.etype_id != @actor.equip_slots[@slot_id]
    return true
  end
end
[/pre]

评分

参与人数 1星屑 +10 收起 理由
漫漫人生路 + 10 塞糖

查看全部评分

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部