法术需求表定义了学习某个法术所需的前置法术条件。这个表建立了法术之间的依赖关系,确保玩家按照正确的顺序学习法术,维护技能树的逻辑性和游戏的进阶体验。
字段名 | 类型 | 描述 |
---|---|---|
spell_id | mediumint unsigned | 目标法术ID (主键) |
详细说明:指定需要前置条件的目标法术ID。这是玩家想要学习的法术,必须满足前置条件才能学习。
适用法术类型:
常见示例:
|
||
req_spell | mediumint unsigned | 前置法术ID |
详细说明:指定学习目标法术所需的前置法术ID。玩家必须已经学会这个前置法术,才能学习目标法术。
前置类型:
依赖关系:
设置原则:
|
当玩家尝试学习法术时,系统会:
-- 高级火球术需要基础火球术
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;