spell_required - 法术需求表

法术需求表定义了学习某个法术所需的前置法术条件。这个表建立了法术之间的依赖关系,确保玩家按照正确的顺序学习法术,维护技能树的逻辑性和游戏的进阶体验。

表结构

字段名 类型 描述
spell_id mediumint unsigned 目标法术ID (主键)
详细说明:指定需要前置条件的目标法术ID。这是玩家想要学习的法术,必须满足前置条件才能学习。
适用法术类型:
  • 高级法术 - 需要学习基础法术后才能学习的高级版本
  • 专精法术 - 需要特定天赋或技能作为前置的专精法术
  • 组合法术 - 需要掌握多个基础法术才能学习的组合技能
  • 进阶技能 - 职业技能树中的进阶技能

常见示例:
  • 高级火球术 - 需要先学会基础火球术
  • 群体传送 - 需要先学会单体传送
  • 高级治疗 - 需要先学会基础治疗法术
  • 专精技能 - 需要先学会相关的基础技能
req_spell mediumint unsigned 前置法术ID
详细说明:指定学习目标法术所需的前置法术ID。玩家必须已经学会这个前置法术,才能学习目标法术。
前置类型:
  • 基础法术 - 同系列法术的基础版本
  • 相关技能 - 逻辑上相关的其他法术
  • 天赋技能 - 特定的天赋点投资
  • 专业技能 - 相关的专业技能

依赖关系:
  • 直接依赖 - 目标法术直接依赖前置法术
  • 逻辑依赖 - 基于游戏逻辑的合理依赖
  • 平衡依赖 - 为了游戏平衡而设置的依赖
  • 进阶依赖 - 技能进阶路径的依赖

设置原则:
  • 前置法术应该在逻辑上与目标法术相关
  • 前置法术的学习等级应该低于目标法术
  • 避免创建循环依赖关系
  • 考虑玩家的学习体验和进阶路径

功能说明

主要用途

工作机制

当玩家尝试学习法术时,系统会:

  1. 检查目标法术是否在此表中有前置要求
  2. 验证玩家是否已经学会所有前置法术
  3. 如果缺少前置法术,阻止学习并提示玩家
  4. 如果满足所有前置条件,允许学习目标法术
  5. 更新玩家的法术学习状态

依赖检查

配置示例

法师法术依赖关系

-- 高级火球术需要基础火球术
INSERT INTO spell_required (spell_id, req_spell) VALUES
(143, 133),     -- 火球术等级2需要火球术等级1
(145, 143),     -- 火球术等级3需要火球术等级2
(3140, 145);    -- 火球术等级4需要火球术等级3

-- 传送法术需要传送门法术
INSERT INTO spell_required (spell_id, req_spell) VALUES
(3561, 3562),   -- 传送:暴风城需要传送门:暴风城
(3563, 3566),   -- 传送:铁炉堡需要传送门:铁炉堡
(3565, 3567);   -- 传送:达纳苏斯需要传送门:达纳苏斯

牧师治疗法术依赖

-- 高级治疗法术需要基础治疗法术
INSERT INTO spell_required (spell_id, req_spell) VALUES
(2055, 2061),   -- 治疗术等级2需要治疗术等级1
(6063, 2055),   -- 治疗术等级3需要治疗术等级2
(6064, 6063);   -- 治疗术等级4需要治疗术等级3

-- 群体治疗需要单体治疗
INSERT INTO spell_required (spell_id, req_spell) VALUES
(596, 2061),    -- 祈祷之术需要治疗术
(23455, 596);   -- 强效祈祷之术需要祈祷之术

战士技能依赖关系

-- 高级战斗技能需要基础技能
INSERT INTO spell_required (spell_id, req_spell) VALUES
(284, 78),      -- 英勇打击等级2需要英勇打击等级1
(285, 284),     -- 英勇打击等级3需要英勇打击等级2
(1608, 285);    -- 英勇打击等级4需要英勇打击等级3

-- 专精技能需要基础技能
INSERT INTO spell_required (spell_id, req_spell) VALUES
(12294, 78),    -- 致死打击需要英勇打击
(23922, 2565);  -- 盾牌猛击需要盾牌格挡

专业技能依赖关系

-- 高级制作配方需要基础技能
INSERT INTO spell_required (spell_id, req_spell) VALUES
(2020, 2018),   -- 锻造技能等级2需要锻造技能等级1
(3100, 2020),   -- 锻造技能等级3需要锻造技能等级2
(3538, 3100);   -- 锻造技能等级4需要锻造技能等级3

-- 专精配方需要基础配方
INSERT INTO spell_required (spell_id, req_spell) VALUES
(9787, 2020),   -- 制作铜质剑需要基础锻造
(3491, 9787);   -- 制作青铜剑需要制作铜质剑

查询示例

查看特定法术的前置要求

SELECT sr.*, 
       s1.SpellName as target_spell_name,
       s2.SpellName as required_spell_name
FROM spell_required sr
LEFT JOIN spell_template s1 ON sr.spell_id = s1.ID
LEFT JOIN spell_template s2 ON sr.req_spell = s2.ID
WHERE sr.spell_id = 143  -- 查看火球术等级2的前置要求
ORDER BY sr.spell_id;

查找所有有前置要求的法术

SELECT sr.spell_id, s1.SpellName as spell_name, 
       COUNT(sr.req_spell) as requirement_count
FROM spell_required sr
LEFT JOIN spell_template s1 ON sr.spell_id = s1.ID
GROUP BY sr.spell_id, s1.SpellName
ORDER BY requirement_count DESC, sr.spell_id;

查找法术的完整依赖链

-- 递归查询法术的所有前置条件
WITH RECURSIVE spell_chain AS (
    -- 起始点:目标法术
    SELECT spell_id, req_spell, 1 as level
    FROM spell_required 
    WHERE spell_id = 3140  -- 火球术等级4
    
    UNION ALL
    
    -- 递归:查找前置法术的前置条件
    SELECT sr.spell_id, sr.req_spell, sc.level + 1
    FROM spell_required sr
    INNER JOIN spell_chain sc ON sr.spell_id = sc.req_spell
    WHERE sc.level < 10  -- 防止无限递归
)
SELECT sc.*, s1.SpellName as spell_name, s2.SpellName as required_spell_name
FROM spell_chain sc
LEFT JOIN spell_template s1 ON sc.spell_id = s1.ID
LEFT JOIN spell_template s2 ON sc.req_spell = s2.ID
ORDER BY sc.level DESC;

检查循环依赖

-- 查找可能的循环依赖
SELECT sr1.spell_id as spell_a, sr1.req_spell as spell_b,
       sr2.spell_id as spell_b_check, sr2.req_spell as spell_a_check
FROM spell_required sr1
JOIN spell_required sr2 ON sr1.spell_id = sr2.req_spell 
                        AND sr1.req_spell = sr2.spell_id
ORDER BY sr1.spell_id;

注意事项

⚠️ 重要提醒