じ☆ve冰风 发表于 2024-4-19 23:59:20

【简易坑爹系列】武器、装备及状态限制技能脚本

随手写了个脚本来回答问题RUBY 代码
#===============================================================================
# ■ 【简易坑爹系列】武器、装备及状态限制技能脚本
#-------------------------------------------------------------------------------
# 使用方法:
#   1. 插入Game_Actor之后,Main之前的任意位置。
#   1. 在下面设置需要被视为武器种类的属性名称。
#   2. 在属性列表内增加相对应的属性
#   3. 利用武器属性来设置种类,每个武器只能归类到一个种类。
#   4. 利用技能属性来设置发动技能需要的武器种类,可以设置多个,但只需满足其中
#      一个便可发动。
#   5. 没有设定条件的技能在任何武器或没有武器的情况下皆可发动。
#   6. 上面所述皆可运用在装备及状态
#===============================================================================
module WLS
#-----------------------------------------------------------------------------
# 名称列在此的属性会被视为武器种类处理。
# 被视为武器种类的属性将不会对伤害造成任何影响。
#-----------------------------------------------------------------------------
TYPES = ["剑", "刀", "杖"]
#-----------------------------------------------------------------------------
unlessdefined?(ACTOR)
    ACTOR= ::Game_Actor
    WEAPON = ::RPG::Weapon
    SKILL= ::RPG::Skill
    ITEM   = ::RPG::Item
    ARMOR= ::RPG::Armor
    ENEMY= ::RPG::Enemy
    CLASS= ::RPG::Class
    STATE= ::RPG::State
end
module_function
def elementSetClass(claz, prefix = '')
    copy_const(::Class.new(claz){
      define_method(prefix.to_s + 'element_set')do
      set = super.clone
      temp = ::WLS::TYPES.map{|t|$data_system.elements.index(t)}
      set.delete_if{|e|temp.include?(e)}
      return set
      end
    })
end
def elementRanksClass(claz)
    copy_const(::Class.new(claz){
      def element_ranks
      ranks = super.clone
      ::WLS::TYPES.eachdo |t|
          ranks[$data_system.elements.index(t)] = 3
      end
      return ranks
      end
    })
end
def copy_const(claz)
    claz.superclass.constants.eachdo |c|
      claz.const_set(c, claz.superclass.const_get(c))
    end
    return claz
end
def define_type(claz, var)
    claz.const_set(:VAR, var)
    claz.class_evaldo
      def type
      temp = WLS::TYPES.map{|t|$data_system.elements.index(t)}
      return instance_variable_get(self.class::VAR).find{|e|temp.include?(e)}
      end
    end
end
end
Game_Actor = Class.new(WLS::ACTOR)do
def skill_can_use?(skill)
    orig = super(skill)
    skill = skill.is_a?(RPG::Skill) ? skill : $data_skills
    types = [$data_weapons.type]
    types |= [@armor1_id, @armor2_id, @armor3_id, @armor4_id].map{|i|$data_armors.type}
    types |= @states.map{|s|$data_states.type}
    return((skill.required_types.empty? or skill.required_types.any?{|t|types.include?(t)})and orig)
end
end
module RPG
Weapon = ::WLS.elementSetClass(::WLS::WEAPON)
Skill = ::WLS.elementSetClass(::WLS::SKILL)
Item = ::WLS.elementSetClass(::WLS::ITEM)
Armor = ::WLS.elementSetClass(::WLS::ARMOR, :guard_)
State = ::WLS.elementSetClass(::WLS::STATE, :guard_)
Class = ::WLS.elementRanksClass(::WLS::CLASS)
Enemy = ::WLS.elementRanksClass(::WLS::ENEMY)
::WLS.define_type(Weapon, :@element_set)
::WLS.define_type(Armor, :@guard_element_set)
::WLS.define_type(State, :@guard_element_set)
class Skill
    def required_types
      temp = WLS::TYPES.map{|t|$data_system.elements.index(t)}
      return@element_set.find_all{|e|temp.include?(e)}
    end
end
end


测试的时候还被ruby坑得不轻
最新更新加了一些新功能,稍微调整了脚本,估计兼容VX
             本帖来自P1论坛作者英顺的马甲,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=393783若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 【简易坑爹系列】武器、装备及状态限制技能脚本