查看: 7284|回复: 10

[已发主站] 【XP】数据库直接设定套装

[复制链接]

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2012-6-7 01:27:30 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Sion 于 2013-12-17 15:54 编辑

说明:本脚本通过自动状态来实现套装加成,就核心思路而言并不新鲜,但是脚本实现了100%插件化和基本不冲突。
使用者可直接通过数据库来设定套装数据(对于XP这种没有备注的工具来说,方式很傻瓜了),不需要用脚本语言来书写复杂的数组和Hash结构等。
示例见下图
state.png
weapon.png

[pre lang="ruby" line="1"]#==============================================================================
# ■ Set_Armor 套装插件脚本 by SailCat
#------------------------------------------------------------------------------
#  说明:支持数据库直接设定套装效果的轻量化插件式脚本。
#  由于本脚本基本上没有改动系统内容,故冲突可能性很低,除了和其他套装脚本冲突
# 以外,基本没有冲突。
#   使用方法:插入Main之前即可使用
#   数据库设定规则:
#   1.状态:将状态命名为“[套装名称]件数”的形式(如[密斯利尔]2),可以将该状态
#     定义为装备“密斯利尔”套2件时所附加的状态。
#     套装的加成奖励通过调节状态的参数来实现,注意定量最好设为0。
#     件数最小为1,最大不能超过5,否则是无效的。
#     有多个同名状态的话,则满足条件时都会附加,可借此突破状态的200%加成上限。
#   2.武器/防具:只需将武器/防具的名称开头部分设定为与套装名称相同即可。
#     如“密斯利尔”套装,只要将武器命名为“密斯利尔剑”、“密斯利尔的刃”,甚至
#     “密斯利尔的乱七八糟”都可以使得该武器成为套装组件,不需要通过脚本设定。
#   3.同一位置上如果存在多个可能的武器/防具,都属于套装组件,之间是互相替换的关
#     系,如[密斯利尔剑]和[密斯利尔枪]。
#   4.如确有必要,可以在脚本中104行之后手工定义套装、组件和状态,概不赘述。
#==============================================================================

#==============================================================================
# ■ RPG::State
#------------------------------------------------------------------------------
#  对状态数据库的重新解释。
#==============================================================================

module RPG
  class State
    # 是否为套装用状态(首字母为左方括号)
    def is_set_state?
      return name[0, 1] == "["
    end
    # 套装名称
    def set_name
      if not is_set_state?
        return ""
      elsif name[/^\[.*\]/] == nil
        return ""
      else
        set = name[/^\[.*\]/]
        return set[1, set.length - 2]
      end
    end
    # 触发状态的件数
    def set_count
      if set_name == ""
        return 0
      else
        return name.gsub(/^\[.*\]/, "").to_i
      end
    end
  end
end

#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
#  处理同伴的类。包含金钱以及物品的信息。本类的实例
# 请参考 $game_party。
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  # ● 追加实例变量
  #--------------------------------------------------------------------------
  attr_accessor :data_set_states           # 套装状态清单 Hash
  attr_accessor :data_set_items            # 套装组件清单 Hash
  #--------------------------------------------------------------------------
  # ● 初始化套装数据
  #--------------------------------------------------------------------------
  def init_data_sets
    @data_set_states = {}
    @data_set_items = {}
    # 扫描所有状态,取得套装状态清单
    for state in $data_states[1...$data_states.size]
      if state.is_set_state?
        unless @data_set_states.include?(state.set_name)
          @data_set_states[state.set_name] = {}
        end
        unless @data_set_states[state.set_name].include?(state.set_count)
          @data_set_states[state.set_name][state.set_count] = []
        end
        @data_set_states[state.set_name][state.set_count].push(state.id)
        @data_set_items[state.set_name] = []
      end
    end
    # 检索所有武器,将符合套装名称的武器加入组件清单
    for weapon in $data_weapons[1...$data_weapons.size]
      for state_name in @data_set_states.keys
        if weapon.name[0, state_name.length] == state_name
          @data_set_items[state_name].push(-weapon.id)
        end
      end
    end
    # 检索所有防具,将符合套装名称的防具加入组件清单
    for armor in $data_armors[1...$data_weapons.size]
      for state_name in @data_set_states.keys
        if armor.name[0, state_name.length] == state_name
          @data_set_items[state_name].push(armor.id)
        end
      end
    end
  end
end

#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  处理角色的类。本类在 Game_Actors 类 ($game_actors)
# 的内部使用、Game_Party 类请参考 ($game_party) 。
#==============================================================================

class Game_Actor < Game_Battler
  alias sailcat_equip equip
  alias sailcat_setup setup
  #--------------------------------------------------------------------------
  # ● 追加实例变量
  #--------------------------------------------------------------------------
  attr_accessor  :active_sets              # 当前已上身的套装
  #--------------------------------------------------------------------------
  # ● 设置
  #     actor_id : 角色 ID
  #--------------------------------------------------------------------------
  def setup(actor_id)
    sailcat_setup(actor_id)
    # 清除上身套装列表
    @active_sets = []
    # 更新套装状态
    update_set_state
  end
  #--------------------------------------------------------------------------
  # ● 变更装备
  #     equip_type : 装备类型
  #     id    : 武器 or 防具 ID  (0 为解除装备)
  #--------------------------------------------------------------------------
  def equip(equip_type, id)
    sailcat_equip(equip_type, id)
    # 更新套装状态
    update_set_state
  end
  #--------------------------------------------------------------------------
  # ● 更新套装状态
  #--------------------------------------------------------------------------
  def update_set_state
    # 如果数据没有初始化就初始化
    $game_party.init_data_sets if $game_party.data_set_states == nil
    # 获得当前装备
    my_armor_ids = [-@weapon_id, @armor1_id, @armor2_id, @armor3_id, @armor4_id]
    # 循环所有套装
    for set_name in $game_party.data_set_items.keys
      # 获得套装中装备的上身件数
      item_count = (my_armor_ids & $game_party.data_set_items[set_name]).size
      # 需要解除的状态列表
      remove_set = [1, 2, 3, 4, 5]
      # 如果件数至少为1件
      if item_count > 0
        # 更新上身套装列表
        @active_sets.push(set_name) unless @active_sets.include?(set_name)
        # 附加对应的套装状态
        add_set_states(set_name, item_count)
        # 删除当前件数
        remove_set.delete(item_count)
      # 如果件数为0件,且之前上身的套装列表中包含当前套装
      elsif @active_sets.include?(set_name)
        # 取消当前套装
        @active_sets.delete(set_name)
      # 和当前套装无关的情况下
      else
        # 什么也不做
        remove_set.clear
      end
      # 解除件数不相符合的的套装状态
      for i in remove_set
        remove_set_states(set_name, i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 附加套装状态
  #     set_name : 套装名称
  #     count    : 件数
  #--------------------------------------------------------------------------
  def add_set_states(set_name, count)
    # 循环所有状态,逐一附加
    unless $game_party.data_set_states[set_name][count] == nil
      for state_id in $game_party.data_set_states[set_name][count]
        add_state(state_id, true)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 解除套装状态
  #     set_name : 套装名称
  #     count    : 件数
  #--------------------------------------------------------------------------
  def remove_set_states(set_name, count)
    # 循环所有状态,逐一解除
    unless $game_party.data_set_states[set_name][count] == nil
      for state_id in $game_party.data_set_states[set_name][count]
        remove_state(state_id, true)
      end
    end
  end
end[/pre]
范例工程,猫儿的脚本原则上都是不给范例工程的,特别是这种100%插件化的脚本,但以防有懒人需要,下载就收10经验吧。
SetArmor.zip (203.81 KB, 下载次数: 235, 售价: 1 星屑)

评分

参与人数 1赞 +6 收起 理由
Shy07 + 6 主站收录

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2012-6-18 17:24:11 | 显示全部楼层
魔塔样板5161和7630能用不?

点评

你可以试试,这只是个插件而已  发表于 2012-6-18 22:47
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2012-6-19 12:09:03 | 显示全部楼层
这两个都把敌人的属性设定在了特技里面···所以很难说啊···上次hy11111的脚本没说清楚害得我乱插结果全局崩溃···

点评

先插到main前面,不能用就删掉,你也不损失什么。。。。。  发表于 2012-6-19 14:38
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2012-6-19 12:18:33 | 显示全部楼层
怎样才能把套装效果设定放到脚本编辑器里面···我是双角色归一合体为单角色能力···

点评

在104行前面自己写……  发表于 2012-6-19 14:38
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2012-6-19 15:22:08 | 显示全部楼层
怎么写···

评分

参与人数 1星屑 -240 收起 理由
冰舞蝶恋 -240 请善用编辑功能。4连帖。

查看全部评分

回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

 楼主| 发表于 2012-6-19 15:27:06 | 显示全部楼层
chd114 发表于 2012-6-19 15:22
怎么写···

郑重建议你使用本站其他人发布的通过脚本设定套装的插件……
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
0
星屑
2174
在线时间
163 小时
注册时间
2012-4-15
回帖
1
发表于 2012-6-23 13:08:30 | 显示全部楼层
97行应该是
for armor in $data_armors[1...$data_armors.size]
吧
回复

使用道具 举报

梦石
0
星屑
50
在线时间
9 小时
注册时间
2013-5-26
回帖
8
发表于 2013-5-31 01:29:10 | 显示全部楼层
{:2_261:}不行啊,打不开.....................................................................................................................................................................................
回复

使用道具 举报

梦石
0
星屑
50
在线时间
13 小时
注册时间
2013-8-7
回帖
5
发表于 2013-8-27 11:11:15 | 显示全部楼层
还是用不了啊
回复

使用道具 举报

梦石
0
星屑
50
在线时间
120 小时
注册时间
2013-8-26
回帖
61
发表于 2013-8-29 19:26:10 | 显示全部楼层
顶                            一下
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部