f3c056f84e
2020/12/31:新增项目案例(角色技能树)
2020/12/31: 修改diliver包结构
146 lines
3.5 KiB
Go
146 lines
3.5 KiB
Go
/*
|
||
* @Author : huangzj
|
||
* @Time : 2020/12/29 16:20
|
||
* @Description:拓扑工具
|
||
*/
|
||
|
||
package SkillTopology
|
||
|
||
import "Go-Tool/ProgressTest/SkillTopology/model"
|
||
|
||
//设置技能提升,执行对应的方法
|
||
func SkillUpdate(topology *model.Topology, skillId int) {
|
||
//如果技能满足提升的条件
|
||
if CheckSkillUpdate(topology, skillId) {
|
||
skill := topology.SkillIdMap[skillId]
|
||
skill.Level = skill.Level + 1
|
||
//执行技能方法
|
||
skill.SkillFunc()
|
||
//更新节点信息
|
||
topology.SkillIdMap[skillId] = skill
|
||
//刷新对应父节点的属性
|
||
RefreshParent(skill)
|
||
//刷新对应子节点的属性
|
||
RefreshChildren(skill)
|
||
return
|
||
}
|
||
|
||
panic("技能未达到解锁要求")
|
||
}
|
||
|
||
//当技能发生变化的时候,刷新父节点对应的该技能的属性
|
||
func RefreshParent(skill *model.SkillNode) {
|
||
for _, parent := range skill.Parent {
|
||
children := make([]*model.SkillNode, 0)
|
||
for _, child := range parent.Children {
|
||
if child.SkillId != skill.SkillId {
|
||
children = append(children, child)
|
||
} else {
|
||
children = append(children, skill)
|
||
}
|
||
}
|
||
parent.Children = children
|
||
}
|
||
}
|
||
|
||
//当技能发生变化的时候,刷新子节点对应的技能的属性
|
||
func RefreshChildren(skill *model.SkillNode) {
|
||
for _, child := range skill.Children {
|
||
parent := make([]*model.SkillNode, 0)
|
||
for _, p := range child.Parent {
|
||
if child.SkillId != skill.SkillId {
|
||
parent = append(parent, p)
|
||
} else {
|
||
parent = append(parent, skill)
|
||
}
|
||
}
|
||
child.Parent = parent
|
||
}
|
||
}
|
||
|
||
//校验技能升级是否合法
|
||
func CheckSkillUpdate(topology *model.Topology, skillId int) bool {
|
||
skill := topology.SkillIdMap[skillId]
|
||
if topology == nil || topology.HeadSkillNode == nil || skill == nil {
|
||
return false
|
||
}
|
||
//父节点升级,直接返回true
|
||
if skill.Parent == nil {
|
||
return true
|
||
}
|
||
for _, parent := range skill.Parent {
|
||
if parent.Level == 0 {
|
||
return false
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
//执行所有等级大于0的技能效果
|
||
func DealWithUnLockSkill(topology *model.Topology) {
|
||
if topology == nil || topology.HeadSkillNode == nil {
|
||
return
|
||
}
|
||
node := topology.HeadSkillNode
|
||
travelDealSkillNode(node)
|
||
}
|
||
|
||
//获取技能Id对应的技能节点
|
||
func GetTopologyHeadMap(node *model.SkillNode) map[int]*model.SkillNode {
|
||
skillIdMap := make(map[int]*model.SkillNode, 0)
|
||
if node == nil {
|
||
return skillIdMap
|
||
}
|
||
//头节点的处理
|
||
skillIdMap[node.SkillId] = node
|
||
//遍历所有的子节点
|
||
travelSkillNode(node, skillIdMap)
|
||
return skillIdMap
|
||
}
|
||
|
||
//已经设置好子节点属性(Children),反推父节点属性(Parent)
|
||
func BackSteppingHeadWithChildren(node *model.SkillNode) *model.SkillNode {
|
||
if node == nil {
|
||
return node
|
||
}
|
||
//头节点的处理
|
||
travelNodeSetParent(node)
|
||
return node
|
||
}
|
||
|
||
func travelDealSkillNode(node *model.SkillNode) {
|
||
//执行对应的方法
|
||
if node.SkillFunc != nil && node.Level > 0 {
|
||
node.SkillFunc()
|
||
}
|
||
//递归遍历所有的子节点
|
||
for _, child := range node.Children {
|
||
travelDealSkillNode(child)
|
||
}
|
||
}
|
||
|
||
func travelNodeSetParent(node *model.SkillNode) {
|
||
for _, child := range node.Children {
|
||
if child != nil {
|
||
//有多个父的情况
|
||
if child.Parent != nil || len(child.Parent) != 0 {
|
||
child.Parent = append(child.Parent, node)
|
||
} else {
|
||
child.Parent = []*model.SkillNode{node}
|
||
}
|
||
//再深入到子节点的内部
|
||
travelNodeSetParent(child)
|
||
}
|
||
}
|
||
}
|
||
|
||
func travelSkillNode(node *model.SkillNode, skillIdMap map[int]*model.SkillNode) {
|
||
for _, child := range node.Children {
|
||
if child != nil {
|
||
skillIdMap[child.SkillId] = child
|
||
travelSkillNode(child, skillIdMap)
|
||
}
|
||
}
|
||
}
|