feat(Go-Tool):
2020/12/31:新增项目案例(角色技能树)
2020/12/31: 修改diliver包结构
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* @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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user