2020-08-25 15:46:38 +08:00
|
|
|
|
RoleManager = {}
|
2020-05-09 13:31:21 +08:00
|
|
|
|
local this = RoleManager
|
|
|
|
|
|
|
|
|
|
-- 将死之人
|
|
|
|
|
local _DeadRoleList = {}
|
|
|
|
|
-- 重生之人
|
|
|
|
|
local _ReliveRoleList = {}
|
|
|
|
|
-- 所有角色
|
|
|
|
|
local PosList = {}
|
|
|
|
|
-- 删除节点
|
|
|
|
|
local removeObjList = BattleList.New()
|
|
|
|
|
-- 角色对象池
|
|
|
|
|
local rolePool = BattleObjectPool.New(function ()
|
|
|
|
|
return RoleLogic.New()
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local bMyAllDead
|
|
|
|
|
local bEnemyAllDead
|
|
|
|
|
|
|
|
|
|
-- 初始化
|
|
|
|
|
function this.Init()
|
|
|
|
|
|
|
|
|
|
bMyAllDead = false
|
|
|
|
|
bEnemyAllDead = false
|
|
|
|
|
|
|
|
|
|
this.Clear()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 角色数据添加
|
|
|
|
|
local curUid
|
|
|
|
|
function this.AddRole(roleData, position)
|
|
|
|
|
if not curUid then
|
|
|
|
|
curUid = 0
|
|
|
|
|
end
|
|
|
|
|
curUid = curUid + 1
|
|
|
|
|
local role = rolePool:Get()
|
|
|
|
|
role:Init(curUid, roleData, position)
|
|
|
|
|
-- objList:Add(curUid, role)
|
|
|
|
|
if roleData.camp == 0 then
|
|
|
|
|
PosList[position] = role -- 1-6 我方英雄
|
|
|
|
|
else
|
|
|
|
|
PosList[position + 6] = role-- 7-12 敌方英雄
|
|
|
|
|
end
|
|
|
|
|
if not role:IsRealDead() then
|
|
|
|
|
BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
function this.Update()
|
|
|
|
|
|
|
|
|
|
bMyAllDead = true
|
|
|
|
|
bEnemyAllDead = true
|
|
|
|
|
for _, v in pairs(PosList) do
|
|
|
|
|
if not v:IsRealDead() then
|
|
|
|
|
v:Update()
|
|
|
|
|
if v.camp == 0 then
|
|
|
|
|
bMyAllDead = false
|
|
|
|
|
else
|
|
|
|
|
bEnemyAllDead = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if bEnemyAllDead then
|
|
|
|
|
BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderEnd, BattleLogic.CurOrder)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 获取结果
|
|
|
|
|
function this.GetResult()
|
|
|
|
|
if bMyAllDead then
|
|
|
|
|
return 0
|
|
|
|
|
end
|
|
|
|
|
if bEnemyAllDead then
|
|
|
|
|
return 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 加入将死的人
|
|
|
|
|
function this.AddDeadRole(role)
|
|
|
|
|
_DeadRoleList[role.position + role.camp * 6] = role
|
|
|
|
|
end
|
|
|
|
|
-- 检测是有人将死
|
|
|
|
|
function this.CheckDead()
|
|
|
|
|
local isDeadFrame = false
|
|
|
|
|
local removePos = {}
|
|
|
|
|
for pos, role in pairs(_DeadRoleList) do
|
|
|
|
|
if role:GoDead() then
|
|
|
|
|
isDeadFrame = true
|
|
|
|
|
table.insert(removePos, pos)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
for _, pos in ipairs(removePos) do
|
|
|
|
|
_DeadRoleList[pos] = nil
|
|
|
|
|
end
|
|
|
|
|
return isDeadFrame
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 加入复活之人
|
|
|
|
|
function this.AddReliveRole(role)
|
|
|
|
|
_ReliveRoleList[role.position + role.camp * 6] = role
|
|
|
|
|
end
|
|
|
|
|
-- 检测是否有人复活
|
|
|
|
|
function this.CheckRelive()
|
|
|
|
|
local isReliveFrame = false
|
|
|
|
|
local removePos = {}
|
|
|
|
|
for pos, role in pairs(_ReliveRoleList) do
|
|
|
|
|
if role:Relive() then
|
|
|
|
|
isReliveFrame = true
|
|
|
|
|
table.insert(removePos, pos)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
for _, pos in ipairs(removePos) do
|
|
|
|
|
_ReliveRoleList[pos] = nil
|
|
|
|
|
end
|
|
|
|
|
return isReliveFrame
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 获取角色数据
|
|
|
|
|
function this.GetRole(camp, pos)
|
|
|
|
|
return PosList[pos + camp*6]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 获取某阵营所有角色
|
|
|
|
|
function this.GetRoleByCamp(camp)
|
|
|
|
|
local list = {}
|
|
|
|
|
for i = 1, 6 do
|
|
|
|
|
list[i] = PosList[i + camp * 6]
|
|
|
|
|
end
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 查找角色
|
|
|
|
|
function RoleManager.Query(func, inCludeDeadRole)
|
|
|
|
|
local list = {}
|
|
|
|
|
local index = 1
|
|
|
|
|
if func then
|
|
|
|
|
for pos, v in pairs(PosList) do
|
|
|
|
|
if func(v) and (inCludeDeadRole or not v:IsRealDead()) then
|
|
|
|
|
list[index] = v
|
|
|
|
|
index = index + 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-06-18 20:39:29 +08:00
|
|
|
|
table.sort(list, function(a, b)
|
|
|
|
|
return a.position < b.position
|
|
|
|
|
end)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
return list
|
|
|
|
|
end
|
2020-11-28 15:18:50 +08:00
|
|
|
|
-- 查找角色(不包含死亡和拥有不灭的) 2020/11/28 王振兴
|
|
|
|
|
function RoleManager.QueryNoDead(func)
|
|
|
|
|
local list = {}
|
|
|
|
|
local index = 1
|
|
|
|
|
if func then
|
|
|
|
|
for pos, v in pairs(PosList) do
|
|
|
|
|
if func(v) and not v:IsRealDead() and v.deadFilter then
|
|
|
|
|
list[index] = v
|
|
|
|
|
index = index + 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
table.sort(list, function(a, b)
|
|
|
|
|
return a.position < b.position
|
|
|
|
|
end)
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
-- 查找角色(无排序,无死亡单位,无不灭) 2020/11/28 王振兴
|
|
|
|
|
function RoleManager.NoOrder(func)
|
|
|
|
|
local list = {}
|
|
|
|
|
local index = 1
|
|
|
|
|
if func then
|
|
|
|
|
for pos, v in pairs(PosList) do
|
|
|
|
|
if func(v) and not v:IsRealDead() and v.deadFilter then
|
|
|
|
|
list[index] = v
|
|
|
|
|
index = index + 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
BattleUtil.RandomList(list)
|
|
|
|
|
return list
|
|
|
|
|
end
|
2020-05-09 13:31:21 +08:00
|
|
|
|
|
|
|
|
|
--对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
|
|
|
|
|
function this.GetAggro(role)
|
|
|
|
|
-- 计算开始位置
|
|
|
|
|
local startPos = role.position
|
|
|
|
|
startPos = startPos > 3 and startPos - 3 or startPos
|
|
|
|
|
local target
|
|
|
|
|
local enemyCamp = role.camp == 0 and 1 or 0
|
|
|
|
|
|
|
|
|
|
-- c=0 前排 c=1 后排
|
|
|
|
|
for c = 0, 1 do
|
|
|
|
|
startPos = startPos + c*3
|
|
|
|
|
-- 向左
|
|
|
|
|
for i = startPos, c*3+1, -1 do
|
|
|
|
|
local pos = i + enemyCamp * 6
|
|
|
|
|
if PosList[pos] and not PosList[pos]:IsRealDead() then
|
|
|
|
|
target = PosList[pos]
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if target then return target end
|
|
|
|
|
-- 向右
|
|
|
|
|
for i = startPos + 1, c*3+3 do
|
|
|
|
|
local pos = i + enemyCamp * 6
|
|
|
|
|
if PosList[pos] and not PosList[pos]:IsRealDead() then
|
|
|
|
|
target = PosList[pos]
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if target then return target end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 获取没有进入死亡状态的仇恨目标
|
|
|
|
|
function this.GetAliveAggro(role)
|
|
|
|
|
-- 计算开始位置
|
|
|
|
|
local startPos = role.position
|
|
|
|
|
startPos = startPos > 3 and startPos - 3 or startPos
|
|
|
|
|
local target
|
|
|
|
|
local enemyCamp = role.camp == 0 and 1 or 0
|
|
|
|
|
|
|
|
|
|
-- c=0 前排 c=1 后排
|
|
|
|
|
for c = 0, 1 do
|
|
|
|
|
startPos = startPos + c*3
|
|
|
|
|
-- 向左
|
|
|
|
|
for i = startPos, c*3+1, -1 do
|
|
|
|
|
local pos = i + enemyCamp * 6
|
|
|
|
|
if PosList[pos] and not PosList[pos]:IsDead() then
|
|
|
|
|
target = PosList[pos]
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if target then return target end
|
|
|
|
|
-- 向右
|
|
|
|
|
for i = startPos + 1, c*3+3 do
|
|
|
|
|
local pos = i + enemyCamp * 6
|
|
|
|
|
if PosList[pos] and not PosList[pos]:IsDead() then
|
|
|
|
|
target = PosList[pos]
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if target then return target end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
|
|
|
|
|
function this.GetArrAggroList(role, arr)
|
|
|
|
|
-- 重构数据
|
|
|
|
|
local plist = {}
|
|
|
|
|
for _, role in ipairs(arr) do
|
|
|
|
|
plist[role.position] = role
|
|
|
|
|
end
|
|
|
|
|
-- 计算开始位置
|
|
|
|
|
local startPos = role.position
|
|
|
|
|
startPos = startPos > 3 and startPos - 3 or startPos
|
|
|
|
|
local targetList = {}
|
|
|
|
|
-- c=0 前排 c=1 后排
|
|
|
|
|
for c = 0, 1 do
|
|
|
|
|
startPos = startPos + c*3
|
|
|
|
|
-- 向左
|
|
|
|
|
for i = startPos, c*3+1, -1 do
|
|
|
|
|
local pos = i
|
|
|
|
|
if plist[pos] and not plist[pos]:IsRealDead() then
|
|
|
|
|
table.insert(targetList, plist[pos])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- 向右
|
|
|
|
|
for i = startPos + 1, c*3+3 do
|
|
|
|
|
local pos = i
|
|
|
|
|
if plist[pos] and not plist[pos]:IsRealDead() then
|
|
|
|
|
table.insert(targetList, plist[pos])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-06-18 20:39:29 +08:00
|
|
|
|
table.sort(targetList, function(a, b)
|
|
|
|
|
return a.position < b.position
|
|
|
|
|
end)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
return targetList
|
|
|
|
|
end
|
2020-08-26 13:11:00 +08:00
|
|
|
|
|
|
|
|
|
--对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
|
|
|
|
|
function this.GetAggroHero(role,arr)
|
|
|
|
|
-- 计算开始位置
|
|
|
|
|
if not arr then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local startPos = role.position
|
|
|
|
|
local targetList={}
|
|
|
|
|
startPos = startPos > 3 and startPos - 3 or startPos
|
2021-03-30 17:17:10 +08:00
|
|
|
|
local smallRole=nil
|
|
|
|
|
local smallPos=0
|
|
|
|
|
local bigRole=nil
|
|
|
|
|
local bigPos=0
|
2020-08-26 13:11:00 +08:00
|
|
|
|
for _, v in ipairs(arr) do
|
|
|
|
|
local pos= v.position>3 and v.position -3 or v.position
|
|
|
|
|
if pos==startPos then
|
|
|
|
|
table.insert(targetList,v)
|
2021-03-30 17:17:10 +08:00
|
|
|
|
break
|
|
|
|
|
elseif pos<startPos then
|
|
|
|
|
if smallRole then
|
|
|
|
|
if pos>smallPos then
|
|
|
|
|
smallRole=v
|
|
|
|
|
smallPos=pos
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
smallRole=v
|
|
|
|
|
smallPos=pos
|
|
|
|
|
end
|
|
|
|
|
elseif pos>startPos then
|
|
|
|
|
if bigRole then
|
|
|
|
|
if pos<bigPos then
|
|
|
|
|
bigRole=v
|
|
|
|
|
bigPos=pos
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
bigRole=v
|
|
|
|
|
bigPos=pos
|
|
|
|
|
end
|
2020-08-26 13:11:00 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if #targetList==0 then
|
2021-03-30 17:17:10 +08:00
|
|
|
|
if smallRole then
|
|
|
|
|
table.insert(targetList,smallRole)
|
|
|
|
|
else
|
|
|
|
|
if bigRole then
|
|
|
|
|
table.insert(targetList,bigRole)
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-08-26 13:11:00 +08:00
|
|
|
|
end
|
|
|
|
|
return targetList
|
|
|
|
|
end
|
2020-05-09 13:31:21 +08:00
|
|
|
|
--获取对位相邻站位的人 chooseType 1 我方 2 敌方(对位的敌人受到嘲讽的影响,若对位的敌人死亡,则选取相邻最近的作为目标)
|
|
|
|
|
function this.GetNeighbor(role, chooseType)
|
|
|
|
|
local posList = {}
|
|
|
|
|
local target
|
|
|
|
|
if chooseType == 1 then
|
|
|
|
|
target = role
|
|
|
|
|
else
|
|
|
|
|
if role.lockTarget and not role.lockTarget:IsRealDead() then
|
|
|
|
|
target = role.lockTarget
|
|
|
|
|
else
|
|
|
|
|
target = this.GetAggro(role)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if target then
|
|
|
|
|
local list = this.Query(function (r) return r.camp == target.camp end)
|
|
|
|
|
for i=1, #list do
|
|
|
|
|
if not list[i]:IsRealDead() then
|
|
|
|
|
if list[i].position == target.position + 3 -- 后排的人
|
|
|
|
|
or list[i].position == target.position - 3 -- 前排的人
|
|
|
|
|
or (math.abs(target.position - list[i].position) <= 1 and math.floor((target.position-1)/3) == math.floor((list[i].position-1)/3)) then -- 旁边的人和自己
|
|
|
|
|
table.insert(posList, list[i])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-06-18 20:39:29 +08:00
|
|
|
|
table.sort(posList, function(a, b)
|
|
|
|
|
return a.position < b.position
|
|
|
|
|
end)
|
2020-05-09 13:31:21 +08:00
|
|
|
|
return posList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function this.Clear()
|
|
|
|
|
|
|
|
|
|
for _, obj in pairs(PosList) do
|
|
|
|
|
obj:Dispose()
|
|
|
|
|
removeObjList:Add(obj)
|
|
|
|
|
end
|
|
|
|
|
PosList = {}
|
|
|
|
|
|
|
|
|
|
while removeObjList.size > 0 do
|
|
|
|
|
rolePool:Put(removeObjList.buffer[removeObjList.size])
|
|
|
|
|
removeObjList:Remove(removeObjList.size)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
_DeadRoleList = {}
|
|
|
|
|
_ReliveRoleList = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 多波
|
|
|
|
|
function this.ClearEnemy()
|
|
|
|
|
local removePos = {}
|
|
|
|
|
for pos, obj in pairs(PosList) do
|
|
|
|
|
if obj.camp == 1 then
|
|
|
|
|
removePos[pos] = 1
|
|
|
|
|
BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, obj)
|
|
|
|
|
obj:Dispose()
|
|
|
|
|
removeObjList:Add(obj)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
for pos, _ in pairs(removePos) do
|
|
|
|
|
PosList[pos] = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return this
|