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

Project1

 找回密码
 注册会员
搜索
查看: 3140|回复: 0
打印 上一主题 下一主题

[交流讨论] 装备类型、数量相关功能

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

跳转到指定楼层
1
发表于 2017-11-17 17:45:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 chd114 于 2017-11-18 19:04 编辑

这个帖子的脚:
1、可以给一个装备增加多个类型(既可以有武器的类型也可以有防具的类型,比如一个斧头可以同时有数据库设置的斧头的类型和额外设置的盾牌的类型)
2、允许一个装备在不同的槽位上进行装备(比如本帖脚本中对1号武器设置,使其允许在盾牌的槽位上进行装备)
3、当实现以上的功能时,意味着你可以同时装备多个一样的装备,这时候你可以使用【装备数量限制】和【装备冲突】的功能了,装备数量限制可以设定一个你一次装备多个相同装备的最大值(适用于二刀流,你可以设置一个攻击999的斧头然后在这里面把这把斧头的最大装备数量设成1防止二刀流同时有两把这样的斧头而攻击爆表),装备冲突可以让你指定的一件装备不能和其他你指定的装备同时装备(只需要单向设置就能双向生效,比如你设置1号武器不能和10号防具同时装备,装备1号武器时不能装备10号防具,先装备10号防具的时候也不能装备1号武器)
4、这里的脚本与对装备风格修改相关的脚本(比如@VIPArcher 的装备风格扩充)存在冲突导致bug的可能,导致bug的原因是因为你的装备风格并没有按照数字从小到大进行排序,这个bug会导致你卸下的装备变成备用装备中的第一个(如果没有备用装备则你卸下的装备消失)5、2017年11月18日 19:00:00已经更新,修复了4的情况,如果还有其他问题请发到VA的版块并@我5、现在最强装备支持了多类型多槽位的装备

RUBY 代码复制
  1. =begin
  2. 给一个装备多种类型、位置分类,只有角色能使用一个装备下设定的所有类型的装备才能使用
  3. =end
  4. module Equip#(武器ID为-1~-999,防具ID为1~999)
  5.   #装备位置(0为武器,1开始都是防具)
  6.   Etype = {
  7.   -1=>[1],
  8.   #61=>[1,2],#61号防具可以当作1号槽位和2号槽位的防具
  9.   }
  10.   #装备类型(武器类型为-1~-999,防具类型为1~999)
  11.   Type = {
  12.   #-1=>[-2],#1号武器还可以是2号类型的武器
  13.   #61=>[-2],#61号防具还可以是2号类型的武器
  14.   }
  15. end
  16. (-999..999).each{|i|Equip::Etype[i]||=[];Equip::Type[i]||=[]}
  17. class RPG::EquipItem
  18.   def etypes
  19.     Equip::Etype[self.is_a?(RPG::Weapon)? -self.id : self.id].push(self.etype_id).uniq
  20.   end
  21.   def types
  22.     i=self.is_a?(RPG::Weapon)? -self.wtype_id : self.atype_id
  23.     Equip::Type[self.is_a?(RPG::Weapon)? -self.id : self.id].push(i).uniq
  24.   end
  25. end

RUBY 代码复制
  1. =begin
  2. 给一个装备数量上的限制、兼容性设置
  3. 使得一件装备无法重复装备或者无法与其他装备同时装备
  4. =end
  5. module Equip#(武器ID为-1~-999,防具ID为1~999)
  6.   #数量限制(武器ID为-1~-999,防具ID为1~999)
  7.   Number = {
  8.   61=>2,
  9.   }
  10.   #禁止同时装备(武器ID为-1~-999,防具ID为1~999)
  11.   SameTime = {
  12.   61=>[-1],#1号武器无需额外设置禁止使用61号防具
  13.   }
  14. end
  15. (-999..999).each{|i|Equip::Number[i]||=999;Equip::SameTime[i]||=[]}


RUBY 代码复制
  1. class Game_Battler#Game_Actor
  2.   def equiprepeat
  3.     @equiprepeat=Hash.new(0)
  4.     equips.each do |e
  5.       if e.is_a?(RPG::Weapon)
  6.         @equiprepeat[-e.id] += 1
  7.       elsif e.is_a?(RPG::Armor)
  8.         @equiprepeat[e.id] += 1
  9.       end
  10.     end
  11.     @equiprepea
  12.   end
  13. end



RUBY 代码复制
  1. [/i][/i][/i][/i][i][i][i][i][i][i]class Game_BattlerBase
  2. [/i][/i][/i][/i][/i][/i][i][i][i][i][i][i]  #--------------------------------------------------------------------------
  3.   # ● 判定武器类型是否屏蔽
  4.   #--------------------------------------------------------------------------
  5.   def weapon_type_cover?(stype_id)
  6.     cover_weapon.include?(stype_id)
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 判定防具类型是否屏蔽
  10.   #--------------------------------------------------------------------------
  11.   def armor_type_cover?(stype_id)
  12.     cover_armor.include?(stype_id)
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 获取可用武器类型时除去屏蔽(删除)武器类型
  16.   #--------------------------------------------------------------------------
  17.   def add_weapon_types
  18.     features_set(FEATURE_EQUIP_WTYPE).delete_if &method(:weapon_type_cover?)
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 获取可用防具类型时除去屏蔽(删除)防具类型
  22.   #--------------------------------------------------------------------------
  23.   def add_armor_types
  24.     features_set(FEATURE_EQUIP_ATYPE).delete_if &method(:armor_type_cover?)
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 判定物品是否可以装备
  28.   #--------------------------------------------------------------------------
  29.   def equippable?(item)
  30.     return false if item.is_a?(RPG::Item)
  31.     return false unless item.is_a?(RPG::EquipItem)
  32.     return false if equip_type_sealed?(item.etype_id)
  33.  
  34.     etid = item.is_a?(RPG::Weapon)? -item.wtype_id : item.atype_id
  35.     cetid = item.is_a?(RPG::Weapon)? -item.id : item.id
  36.     equipcan=0
  37.     cen=[]
  38.     @equips.each_with_index do |item, i|
  39.       if item.object!=nil
  40.       cen.push(item.object.is_a?(RPG::Weapon)? -item.object.id : item.object.id)
  41.       end
  42.     end
  43.     return false if Equip::Number[cetid]<=cen.select{|x|x==cetid}.size
  44.  
  45.     for i in cen
  46.       return false if Equip::SameTime[cetid].include?(i)
  47.       return false if Equip::SameTime[i].include?(cetid)
  48.     end
  49.  
  50.     for i in item.types
  51.       if i<0
  52.       return false if !(equip_wtype_ok?(-i) && !weapon_type_cover?(-i))
  53.       else
  54.       return false if !(equip_atype_ok?(i) && !armor_type_cover?(i))
  55.       end
  56.     end
  57.     return true
  58.   end
  59. end
  60.  
  61. class Game_Actor
  62.   #--------------------------------------------------------------------------
  63.   # ● 实例变量
  64.   #--------------------------------------------------------------------------
  65.   attr_writer   :cover_weapon               # 屏蔽武器类型
  66.   attr_writer   :cover_armor                # 屏蔽防具类型
  67.   #--------------------------------------------------------------------------
  68.   # ○ 屏蔽装备类型取得
  69.   #--------------------------------------------------------------------------
  70.   def cover_weapon
  71.     @cover_weapon||=[]
  72.     return @cover_weapon
  73.   end
  74.   def cover_armor
  75.     @cover_armor||=[]
  76.     return @cover_armor
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 更换装备
  80.   #     slot_id : 装备栏 ID
  81.   #     item    : 武器/护甲(为 nil 时装备解除)
  82.   #--------------------------------------------------------------------------
  83.   def change_equip(slot_id, item)
  84.     return unless trade_item_with_party(item, equips[slot_id])
  85.     if item!=nil
  86.       if equips[slot_id]!=nil
  87.         return if item && !item.etypes.include?(equip_slots[slot_id]) && !equips[slot_id].etypes.include?(item.etype_id)
  88.       else
  89.         return if item && !item.etypes.include?(equip_slots[slot_id])
  90.       end
  91.     end
  92.     @equips[slot_id].object = item
  93.     refresh
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 装备上最强装备
  97.   #--------------------------------------------------------------------------
  98.   def optimize_equipments
  99.     clear_equipments
  100.     equip_slots.size.times do |i|
  101.       next if !equip_change_ok?(i)
  102.       items = $game_party.equip_items.select do |item|
  103.         item.etypes.include?(equip_slots[i]) &&
  104.         equippable?(item) && item.performance >= 0
  105.       end
  106.       change_equip(i, items.max_by {|item| item.performance })
  107.     end
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 卸下无法装备的物品
  111.   #     item_gain : 卸下的装备是否保留
  112.   #--------------------------------------------------------------------------
  113.   def release_unequippable_items(item_gain = true)
  114.     loop do
  115.       last_equips = equips.dup
  116.       return if equips == last_equips
  117.     end
  118.       @equips.each_with_index do |item, i|
  119.       if item.object!=nil
  120.         if equip_slots[i]!=nil
  121.         if !equippable?(item.object) || (!item.etypes.include?(equip_slots[i]) && !equip_slots[i].etypes.include?(item))
  122.           trade_item_with_party(nil, item.object) if item_gain
  123.           item.object = nil
  124.         end
  125.         else
  126.         if !equippable?(item.object) || !item.etypes.include?(equip_slots[i])
  127.           trade_item_with_party(nil, item.object) if item_gain
  128.           item.object = nil
  129.         end
  130.         end
  131.       end
  132.     end
  133.   end
  134. end
  135.  
  136. class Window_EquipItem < Window_ItemList
  137.   #--------------------------------------------------------------------------
  138.   # ● 查询使用列表中是否含有此物品
  139.   #--------------------------------------------------------------------------
  140.   def include?(item)
  141.     return true if item == nil
  142.     return false unless item.is_a?(RPG::EquipItem)
  143.     return false if @slot_id < 0
  144.     return false if !item.etypes.include?(@actor.equip_slots[@slot_id])
  145.     return @actor.equippable?(item)
  146.   end
  147.  
  148. end




评分

参与人数 1+1 收起 理由
jianyulei + 1 精品文章

查看全部评分

[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 05:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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