| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193 |
- local Msg = require("core.Msg")
- local Util = require("common.Util")
- local CombatObj = require("combat.CombatObj")
- local CombatDefine = require("combat.CombatDefine")
- local TargetMode = require("combat.TargetMode")
- local Skill = require("combat.Skill")
- local CombatBuff = require("combat.CombatBuff")
- local RoleAttr = require("role.RoleAttr")
- local RoleDefine = require("role.RoleDefine")
- local BeSkill = require("combat.BeSkill")
- local HeroExcel = require("excel.hero").hero
- local MonsterExcel = require("excel.monster").monster
- local BattleMonsterExcel = require("excel.battlemonster").monster
- local CombatExcel = require("excel.combat").combat
- local SkillExcel = require("excel.skill").skill
- -- local BufferExcel = require("excel.buffer").buffer
- -- local ProjectLogic = require("platform.ProjectLogic")
- objList = objList or {}
- helpList = helpList or {}
- attackOrder = attackOrder or {} -- 出手次序 [index]->pos
- round = round or 1 -- 当前回合
- attackIndex = attackIndex or 1 -- 当前进攻对象的index
- result = result or {} -- 计算结果
- sideAttrList = sideAttrList or {} -- 攻守双方人物属性
- skillUseList = skillUseList or {} -- 使用过的技能
- cmdUseList = cmdUseList or {} -- 使用过的额外作用setFightMode
- bufferUseList = bufferUseList or {} -- 使用过的buffer
- frameSkillList = frameSkillList or {} -- 当前小回合触发的被动技能
- frameBufferList = frameBufferList or {} -- 当前小回合触发的buffer
- mergeFrameBufferList = mergeFrameBufferList or {} --合并后的buffer
- frameSayList = frameSayList or {} -- 触发buffer的被动技能(需要喊话
- frameReviceList = frameReviceList or {} -- 复活列表
- fanjiList = fanjiList or {}
- beSkillUseList = beSkillUseList or {} -- 需要判断使用情况的技能
- isFanji = false
- comboType = 0
- isPVP = 0
- comboHurtRate = 0
- --[[
- commonArgs = {
- type -- 战斗类型
- hpLimit -- 血量上限,默认为角色HP,对应特定关卡
- }
- ]]
- commonArgs = commonArgs or {}
- comboList = comboList or {}
- beSkillPosUseList = beSkillPosUseList or {} --友军技能使用列表
- totalAtkCnt = 0 -- 总共攻击次数 reyes test
- maxRound = CombatDefine.COMBAT_ROUND_MAX
- petCD = CombatDefine.PET_CD
- nowAttacker = nowAttacker or nil
- firstAttack = {}
- fightMode = {0,0,0,0}
- initBackup = {0,0}
- comboPosList = {}
- totalHurt = 0
- function init(type)
- Util.initTable(objList)
- Util.initTable(helpList)
- Util.initTable(attackOrder)
- Util.initTable(result)
- Util.initTable(skillUseList)
- Util.initTable(cmdUseList)
- Util.initTable(bufferUseList)
- Util.initTable(frameSkillList)
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- Util.initTable(fanjiList)
- Util.initTable(beSkillUseList)
- Util.initTable(beSkillPosUseList)
- Util.initTable(commonArgs)
- Util.initTable(comboList)
- Util.initTable(initBackup)
- Util.initTable(frameReviceList)
- round = 0
- attackIndex = nil
- isFanji = false
- comboType = 0
- totalAtkCnt = 0
- totalHurt = 0
- commonArgs.type = type
- maxRound = CombatDefine.COMBAT_ROUND_MAX
- petCD = CombatDefine.PET_CD
- nowAttacker = nil
- local combatConfig = CombatExcel[type]
- if combatConfig and combatConfig.hpLimit == 1 then
- commonArgs.hpLimit = 1
- end
- isPVP = combatConfig.PVP
- end
- local function mergeFrameBuffer()
- Util.initTable(mergeFrameBufferList)
- mergeFrameBufferList = {[1] = {},[2] = {},[3] = {}}
- for k,v in ipairs(frameBufferList) do
- mergeFrameBufferList[v.op][v.id] = mergeFrameBufferList[v.op][v.id] or {}
- local obj = objList[v.pos]
- mergeFrameBufferList[v.op][v.id][v.pos] = mergeFrameBufferList[v.op][v.id][v.pos] or {id = v.id,cnt = 0,op = v.op,attrs = {},pos = v.pos,hpNow = obj.hp}
- local data = mergeFrameBufferList[v.op][v.id][v.pos]
- data.cnt = data.cnt + v.cnt
- if v.attrs then
- for k,v in pairs(v.attrs) do
- data.attrs[k] = data.attrs[k] or 0
- data.attrs[k] = data.attrs[k] + v
- end
- end
- end
- Util.initTable(frameBufferList)
- local len = 0
- for _,v in ipairs(mergeFrameBufferList) do
- for _,v1 in pairs(v) do
- for _,v2 in pairs(v1) do
- frameBufferList[#frameBufferList+1] = v2
- end
- end
- end
- end
- function setRoleAttr(side, attr)
- sideAttrList[side] = sideAttrList[side] or {}
- local sideAttr = sideAttrList[side]
- RoleAttr.initCombatAttr(sideAttr)
- if attr then
- for key, value in pairs(attr) do
- sideAttr[key] = value
- end
- end
- end
- function getValue(obj, key)
- if not obj then return 0 end
- if not obj.attr then return obj.pos end
- return obj.attr[key] or obj.pos
- end
- function setData(pos, hero)
- local obj = CombatObj.objs[pos]
- CombatObj.init(obj)
- --加入背包索引
- obj.bagIndex = hero.bagIndex or 0
- obj.uuid = hero.uuid
- obj.id = hero.id
- obj.job = hero.job
- obj.body = hero.body
- obj.head = hero.head
- obj.quality = hero.quality
- obj.star = hero.star
- obj.type = hero.type
- obj.lv = hero.lv
- obj.isGedangCnt = 0
- obj.camp = hero.camp
- obj.sex = hero.sex or 0
- obj.relic = hero.relic or {}
- obj.relic.relicID = hero.relic and hero.relic.relicID or 0
- obj.relic.star = hero.relic and hero.relic.star or 0
- obj.skillList = hero.skillList or {}
- obj.formationPos = hero.formationPos
- if CombatDefine.isBackup(obj) == CombatDefine.BACKUP_TYPE0 then
- obj.beSkillList = hero.beSkillList or {}
- else
- obj.beSkillList = {}
- obj.backUpSkillList = hero.beSkillList or {}
- end
- obj.normalTarget = nil
- obj.isBoss = hero.isBoss -- 仅显示用
- obj.isGongMing = hero.isGongMing or 0
- CombatObj.setInitAttr(obj, hero.attrs)
- obj.isSysAttrChange = nil
- obj.weaponEffectIdList = hero.weaponEffectIdList
- if hero.type == CombatDefine.COMBAT_OBJ_TYPE1 then
- obj.hurtType = HeroExcel[obj.id].hurtType
- else
- obj.hurtType = MonsterExcel[obj.id].hurtType
- if not obj.hurtType then
- obj.hurtType = BattleMonsterExcel[obj.id].hurtType or 0
- end
- end
- if pos == CombatDefine.BACKUP_POS[1] then
- initBackup[1] = obj.backupPos
- elseif pos == CombatDefine.BACKUP_POS[2] then
- initBackup[2] = obj.backupPos
- end
- objList[obj.pos] = obj
- end
- function setHelp(side,helpType,help)
- local pos = CombatDefine.getHelpPos(side,helpType)
- local obj = CombatObj.helps[pos]
- CombatObj.initHelp(obj)
- obj.id = help.id
- obj.lv = help.lv or 0
- obj.quality = help.quality or 0
- obj.head = help.head or 0
- obj.body = help.body or 0
- obj.icon = help.icon or 0
- obj.weight = help.weight or 0
- obj.height = help.height or 0
- obj.skillList = help.skillList or {}
- obj.beSkillList = help.beSkillList or {}
- obj.lvAttrsAdd = help.lvAttrsAdd or {}
- obj.zhuHun = help.zhuHun
- obj.jinglianLV = help.jinglianLV
- obj.skillLV = help.skillLV
- obj.hurt = help.hurt
- obj.args = help.args
- obj.buffers = help.buffers
- helpList[pos] = obj
- end
- function setMaxRound(value)
- maxRound = value
- end
- function setFightMode(data)
- for k in pairs(fightMode) do
- fightMode[k] = 0
- end
- if data then
- if data[1] == CombatDefine.FIGHT_MODE1 then
- fightMode = {data[1], data[2], data[3], 0}
- elseif data[1] == CombatDefine.FIGHT_MODE2 then
- fightMode = {data[1], data[2], data[3], data[4]}
- else
- fightMode = {data[1], data[2], data[3], 0}
- end
- end
- end
- local function cmp(a,b)
- if a.helpType ~= CombatDefine.HELP_TYPE0 or b.helpType ~= CombatDefine.HELP_TYPE0 then
- if a.helpType == CombatDefine.HELP_TYPE0 then
- return false
- elseif b.helpType == CombatDefine.HELP_TYPE0 then
- return true
- else
- local aSpeed = a.speed or 0
- local bSpeed = b.speed or 0
- if aSpeed > bSpeed then
- return true
- elseif aSpeed == bSpeed then
- return a.pos < b.pos
- else
- return false
- end
- end
- end
- local aSpeed = getValue(a, RoleDefine.SPEED)
- local bSpeed = getValue(b, RoleDefine.SPEED)
- if aSpeed > bSpeed then
- return true
- elseif aSpeed == bSpeed then
- return a.pos < b.pos
- else
- return false
- end
- end
- local function canAttack(obj)
- if not obj then
- return
- end
- if obj.helpType == CombatDefine.HELP_TYPE0 then
- local pos = obj.pos%CombatDefine.COMBAT_HERO_CNT
- if obj.hp > 0 and (pos > 0 or obj.backupPos) then
- -- 确定释放的技能是否带霸体
- local atkSkillID = getSkillID(obj)
- --local skillConfig = SkillExcel[atkSkillID]
- local skillConfig = Skill.GetSkillConfig(atkSkillID)
- if skillConfig and skillConfig.isBati == 1 then
- return true
- end
- if not CombatBuff.isStop(obj) then
- return true
- elseif CombatBuff.isStop(obj) then
- return false, "isStop"
- end
- end
- elseif obj.helpType == CombatDefine.HELP_TYPE1 then
- return petCD == 0
- elseif obj.helpType == CombatDefine.HELP_TYPE2 then
- elseif obj.helpType == CombatDefine.HELP_TYPE3 then
- elseif obj.helpType == CombatDefine.HELP_TYPE4 then
- end
- end
- function initAttackOrder()
- Util.initTable(attackOrder)
- -- 确定最高速度
- local atkSpeed = 0
- local atkSide = 0
- for i = 1, CombatDefine.COMBAT_HERO_ALL_CNT do
- local obj = objList[i]
- if canAttack(obj) then
- attackOrder[#attackOrder + 1] = obj
- local speed = getValue(obj, RoleDefine.SPEED)
- if speed > atkSpeed then
- atkSpeed = speed
- atkSide = obj.side
- end
- end
- end
- for _,pos in ipairs(CombatDefine.SIDE2HELPPOS[0]) do
- local obj = helpList[pos]
- if obj and canAttack(obj) then
- attackOrder[#attackOrder + 1] = obj
- obj.speed = nil
- if obj.side == atkSide then
- obj.speed = atkSpeed
- end
- end
- end
- table.sort(attackOrder,cmp)
- firstAttack = {true,true}
- end
- --用于战斗对象复活后插入出手列表的函数
- function InsertAttackOrder(pos)
- local targetObj = objList[pos]
- if not canAttack(targetObj) then
- return
- end
- local sameSideObjs = {}
- for i=1,#attackOrder do
- local obj = attackOrder[i]
- if obj.pos == pos then
- return
- end
- local res = canAttack(obj)
- if res and obj.side == targetObj.side then
- sameSideObjs[#sameSideObjs + 1] = obj
- end
- end
- sameSideObjs[#sameSideObjs + 1] = targetObj
- if #sameSideObjs > 1 then
- table.sort(sameSideObjs, cmp)
- --没过出手回合才加入
- if sameSideObjs[1].pos ~= pos then
- attackOrder[#attackOrder + 1] = targetObj
- end
- end
- end
- local tempList = {}
- function updateAttackOrder()
- for i = 1,#tempList do
- tempList[i] = nil
- end
- --当前不能出手, 但是下一轮可能可以出手的对象列表
- local maybeObjList = {}
- for i = 2,#attackOrder do
- local obj = attackOrder[i]
- -- if canAttack(obj) then
- -- tempList[#tempList + 1] = obj
- -- end
- local res1, tag = canAttack(obj)
- if res1 then
- tempList[#tempList + 1] = obj
- elseif tag == "isStop" then
- --那些被控制的英雄只有没过他的出手时机才加入列表中。可能会有给敌方驱散负面buff的技能, 所以不需要判断 tempList 里面是否有我方可出手英雄
- if #tempList > 0 then
- maybeObjList[#maybeObjList + 1] = obj
- end
- end
- end
- if #tempList > 1 then
- table.sort(tempList,cmp)
- end
- --只有当前轮有能出手的英雄, 才把 maybeObjList 中的对象加入到 tempList 中
- if #tempList >= 1 then
- for _, v in ipairs(maybeObjList) do
- tempList[#tempList + 1] = v
- end
- end
- for i = 1,#attackOrder do
- attackOrder[i] = tempList[i]
- end
- end
- local function clCombatResult()
- for i= 1,CombatDefine.COMBAT_HERO_ALL_CNT do
- local obj = objList[i]
- if obj then
- obj.combatResult[1] = 0
- obj.combatResult[2] = 0
- for k in pairs(obj.combatResult[3]) do
- obj.combatResult[3][k] = nil
- end
- obj.combatResult[4] = 0
- for k in pairs(obj.combatResult[5]) do
- obj.combatResult[5][k] = nil
- end
- end
- end
- end
- local function beforeCombat()
- Util.initTable(frameSkillList)
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- Util.initTable(fanjiList)
- Util.initTable(beSkillUseList)
- Util.initTable(beSkillPosUseList)
- Util.initTable(comboList)
- clCombatResult()
- isFanji = false
- comboType = 0
- end
- -- 战斗回合开始前操作
- function onRoundBegin()
- round = round + 1
- -- 超出15回合
- if round > maxRound then
- return
- end
- petCD = petCD - 1
- if round == 1 or petCD < 0 then
- petCD = CombatDefine.PET_CD - 1
- end
- attackIndex = 1
- --正常buffer添加只会在小回合结束后添加。此处大回合开始时触发被动技能添加buffer需要特殊处理添加战斗帧操作
- beforeCombat()
- BeSkill.onRoundBegin(round)
- initAttackOrder()
- --每回合开始处理buff
- if #frameBufferList > 0 or #frameSayList > 0 then
- addFrame()
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- end
- if fightMode[1] == CombatDefine.FIGHT_MODE1 then
- if round > fightMode[2] then
- fightMode[4] = fightMode[4] + fightMode[3]
- end
- end
- end
- function getNormalSkill(obj)
- return obj.skillList[#obj.skillList][1]
- end
- function getSkillID(obj)
- local skillID
- if obj.helpType == CombatDefine.HELP_TYPE0 then
- for i = 1,#obj.skillList do
- local skill = obj.skillList[i]
- if (skill[3] == 0 or (skill[2] - round) % skill[3] == 0) and Skill.SkillCondCheck(obj, skill[1]) then
- skillID = skill[1]
- skill[2] = round + skill[3]
- break
- end
- if skill[3] > 0 and skill[2] < round then
- skill[2] = skill[2] + skill[3]
- end
- end
- if CombatBuff.isStatus(obj,{"hunluan"}) or CombatBuff.isChaofen(obj) or CombatBuff.IsCanNoUseSkill(obj) then
- skillID = obj.skillList[#obj.skillList][1]
- end
- if fightMode[1] == CombatDefine.FIGHT_MODE2 then
- -- 如果是援军 必定选择大招
- if obj.backupPos ~= nil then
- for i = 1,#obj.skillList do
- local skill = obj.skillList[i]
- local skillList = fightMode[2]
- for k, v in pairs(skillList) do
- if v == skill[1] then
- skillID = skill[1]
- break
- end
- end
- end
- else
- -- 如果是第一回合 且不是防守方 使用大招
- if round == 1 then
- if obj.side == CombatDefine.ATTACK_SIDE then
- for i = 1,#obj.skillList do
- local skill = obj.skillList[i]
- --local skillConfig = SkillExcel[skill[1]]
- local skillConfig = Skill.GetSkillConfig(skill[1])
- if skillConfig.cvSound == 8 then
- skillID = skill[1]
- break
- end
- end
- end
- end
- end
- end
- elseif obj.helpType == CombatDefine.HELP_TYPE1 then
- for i = 1,#obj.skillList do
- local skill = obj.skillList[i]
- if (skill[3] == 0 or (skill[2] - round) % skill[3] == 0) and Skill.SkillCondCheck(obj, skill[1]) then
- skillID = skill[1]
- skill[2] = round + skill[3]
- break
- end
- end
- elseif obj.helpType == CombatDefine.HELP_TYPE2 then
- elseif obj.helpType == CombatDefine.HELP_TYPE3 then
- elseif obj.helpType == CombatDefine.HELP_TYPE4 then
- end
- skillID = BeSkill.onSkillID(obj,skillID)
- return skillID
- end
- function checkSideResult(pos)
- local cnt = 0
- local obj
- for i= 1,CombatDefine.COMBAT_HERO_CNT do
- if pos > CombatDefine.COMBAT_HERO_CNT then
- obj = objList[i]
- else
- obj = objList[i + CombatDefine.COMBAT_HERO_CNT]
- end
-
- if obj and obj.hp > 0 then
- cnt = cnt + 1
- end
- end
- if cnt == 0 then
- return true
- end
- end
- local function checkResult()
- local attackCnt = 0
- local defendCnt = 0
- local obj
- for i= 1,CombatDefine.COMBAT_HERO_CNT do
- obj = objList[i]
- if obj and obj.hp > 0 then
- attackCnt = attackCnt + 1
- end
- obj = objList[i + CombatDefine.COMBAT_HERO_CNT]
- if obj and obj.hp > 0 then
- defendCnt = defendCnt + 1
- end
- end
- result.attackCnt = attackCnt
- result.defendCnt = defendCnt
- if attackCnt > 0 and defendCnt == 0 then
- result.isWin = true
- end
- if attackCnt == 0 or defendCnt == 0 then
- return true
- end
- end
- -- 计算援军上阵附带属性比例
- local function calcBackUpSkill(obj, star)
- --local skillConfig = SkillExcel[CombatDefine.BACKUP_BUFF_SKILL[1]]
- local skillConfig = Skill.GetSkillConfig(CombatDefine.BACKUP_BUFF_SKILL[1])
- if not skillConfig then return end
- local buffers = CombatBuff.getSkillBuffers(skillConfig)
- if not buffers then return end
- for i = 1, #buffers do
- local bufferID = buffers[i][1]
- --local conf = BufferExcel[bufferID]
- local conf = CombatBuff.GetBuffConfig(bufferID)
- if conf then
- conf.attrRate = CombatDefine.BACKUP_BUFF_REATE[star]
- end
- end
- end
- local function checkBackup()
- for side = 1, 2 do
- local backupObj = objList[CombatDefine.BACKUP_POS[side]]
- if backupObj and not backupObj.backupPos then
- for index, pos in ipairs(CombatDefine.SIDE2POS[side]) do
- local obj = objList[pos]
- -- 剧情模式 强行把援军上阵到指定位置
- if fightMode[1] == CombatDefine.FIGHT_MODE2 then
- if not obj and round == fightMode[3] and index == fightMode[4] then
- backupObj.backupPos = pos
- local attrs = {}
- attrs[RoleDefine.BACKUP_COMBAT] = pos
- addFrame()
- setSkillID(backupObj,99999)
- setExtraHit(backupObj,nil,Skill.getCMD2ID("backup"),attrs)
- -- 使用上场技能 设定buffer的cmd 确定附加属性星级
- calcBackUpSkill(backupObj, backupObj.star)
- BeSkill.onBackupBegin(backupObj)
- -- 强制速度
- backupObj.attr[RoleDefine.SPEED] = 9999
- break
- end
- else
- if obj and obj.hp <= 0 and pos ~= CombatDefine.BACKUP_POS[side] then
- obj.beBackup = 1
- backupObj.backupPos = pos
- local attrs = {}
- attrs[RoleDefine.BACKUP_COMBAT] = pos
- addFrame()
- setSkillID(backupObj,99999)
- setExtraHit(backupObj,nil,Skill.getCMD2ID("backup"),attrs)
- -- 使用上场技能
- calcBackUpSkill(backupObj, backupObj.star)
- BeSkill.onBackupBegin(backupObj)
- break
- end
- end
- end
- end
- end
- end
- local function afterCombat(attacker,isRoundEnd)
- --回合结束处理被动技能时如果是最后一次攻击是反击,不会触发。
- if isRoundEnd then
- isFanji = false
- comboType = 0
- checkBackup()
- end
- --处理回合尾加只生效一轮的buffer,在大回合结束单独加一帧,大回合结束要删buffer。避免客户端出现先删后加的要求导致没有buffer可删。同时显示已经删掉的buffer
- if isRoundEnd and #frameBufferList > 0 then
- addFrame()
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
-
- BeSkill.onRoundEnd(isRoundEnd, attacker)
- CombatBuff.onRoundEnd(attacker,isRoundEnd)
-
- if #frameBufferList > 0 or #frameSayList > 0 then
- addFrame()
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
- afterRevice()
- if attacker and attacker.pos <= CombatDefine.COMBAT_HERO_ALL_CNT and firstAttack[attacker.side] then
- firstAttack[attacker.side] = false
- end
- end
- local function afterFanji()
- if #frameBufferList > 0 or #frameSayList > 0 then
- addFrame()
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for pos,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
- isFanji = false
- end
- function afterBuff()
- if #frameBufferList > 0 or #frameSayList > 0 then
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
- end
- local function afterCombo()
- if #frameBufferList > 0 or #frameSayList > 0 then
- addFrame()
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
- comboType = 0
- end
- function calcFrame()
- -- 没有能出手的人,开始下一个回合
- if not attackOrder[1] then
- onRoundBegin()
- end
- -- 超出15回合
- if round > maxRound then
- return
- end
- if not attackOrder[1] then
- -- 此回合 双方都没有能出手的英雄
- -- 回合 Buff结算
- afterCombat(nil ,not attackOrder[1])
- if checkResult() then return end
- return true
- end
- beforeCombat()
- local attacker = attackOrder[1]
- if attacker then
- -- 目前mpAtkRate 永远为nil
- local skillID,mpAtkRate = getSkillID(attacker)
- -- buff作用效果
- --skillID = 10131
- if skillID then
- Skill.use(attacker,skillID,mpAtkRate)
- addObjResultOut(attacker,round)
- end
- end
- --技能buff
- afterBuff()
- CombatBuff.beforeFanji()
- --BeSkill.beforeFanji(attacker)
- fanji()
- afterFanji()
- combo()
- afterCombo()
- afterRevice()
- updateAttackOrder()
- afterCombat(attacker,not attackOrder[1])
- if checkResult() then return end
- return true
- end
- function addFrame()
- if not result.frames then
- result.frames = {}
- end
- local frame = {}
- frame.round = round
- frame.petCD = petCD
- frame.skillList = {}
- frame.bufferList = {}
- frame.sayList = {}
- result.frames[#result.frames + 1] = frame
- return frame
- end
- function setSkillID(obj,skillID)
- onUseSkill(skillID)
- local pos = obj.pos
- local frame = result.frames[#result.frames]
- local skillData = {}
- skillData.attackPos = pos
- skillData.skillID = skillID
- skillData.hitList = {}
- skillData.extraList = {}
- skillData.petList = {}
- frame.skillList[#frame.skillList+1] = skillData
- end
- function setSaySkill(pos,skillID,contentType)
- if contentType == 0 then
- return
- end
- --if pos > CombatDefine.COMBAT_HERO_ALL_CNT then
- -- return
- --end
- onUseSkill(skillID)
- local frame = result.frames[#result.frames]
- frame.sayList[pos] = frame.sayList[pos] or {}
- frame.sayList[pos][#frame.sayList[pos]+ 1] = skillID
- end
- function setSkillHit(target,hpValue,mpValue,flag,attacker,skillID)
- local frame = result.frames[#result.frames]
- local skillFrame = frame.skillList[#frame.skillList]
- if not (not target.isPet and skillFrame.skillID == skillID and skillFrame.attackPos and skillFrame.attackPos == attacker.pos) then
- addFrame()
- setSkillID(attacker,skillID)
- frame = result.frames[#result.frames]
- skillFrame = frame.skillList[#frame.skillList]
- end
- local pos = target.pos
- if not skillFrame.hitList[pos] then
- skillFrame.hitList[pos] = {}
- end
-
- if not skillFrame.hitList[pos].attrs then
- skillFrame.hitList[pos].attrs = {}
- end
- skillFrame.hitList[pos].flag = flag or 0
- skillFrame.hitList[pos].hpNow = target.hp
- local frameAttrs = skillFrame.hitList[pos].attrs
- if hpValue and hpValue ~= 0 then
- frameAttrs[#frameAttrs + 1] = {RoleDefine.HP_COMBAT,hpValue}
- if target.side == CombatDefine.DEFEND_SIDE and hpValue < 0 then
- frameAttrs[#frameAttrs + 1] = {RoleDefine.HURT_COMBAT_TOTAL,math.floor(totalHurt)}
- end
- end
-
- end
- function isSkillFrameEmpty()
- local frame = result.frames and result.frames[#result.frames]
- if not frame then
- return true
- end
- local skillFrame = frame.skillList[#frame.skillList]
- if not skillFrame then
- return true
- end
- end
- function setExtraHit(target,hpValue,cmd,attrs)
- local frame = result.frames[#result.frames]
- local skillFrame = frame.skillList[#frame.skillList]
- --处理下没有使用技能的情况
- if not skillFrame then
- print("======================没有使用技能====================")
- setSkillID({pos = 99}, 66666)
- skillFrame = frame.skillList[#frame.skillList]
- end
- local pos = target.pos
- if not skillFrame.extraList[pos] then
- skillFrame.extraList[pos] = {}
- end
-
- if not skillFrame.extraList[pos].attrs then
- skillFrame.extraList[pos].attrs = {}
- end
- skillFrame.extraList[pos].flag = 0
- if not skillFrame.extraList[pos].cmd then
- skillFrame.extraList[pos].cmd = cmd or 0
- end
- skillFrame.extraList[pos].hpNow = target.hp
- local frameAttrs = skillFrame.extraList[pos].attrs
- if hpValue and hpValue ~= 0 then
- frameAttrs[#frameAttrs + 1] = {RoleDefine.HP_COMBAT,hpValue}
- if target.side == CombatDefine.DEFEND_SIDE and hpValue < 0 then
- frameAttrs[#frameAttrs + 1] = {RoleDefine.HURT_COMBAT_TOTAL,math.floor(totalHurt)}
- end
- end
- if attrs then
- for k,v in pairs(attrs) do
- frameAttrs[#frameAttrs + 1] = {k,v}
- end
- end
- onUseCmd(cmd)
- end
- function setBufferList(data)
- if not data then
- return
- end
- local frame = result.frames[#result.frames]
-
- if not frame.bufferList[data.pos] then
- frame.bufferList[data.pos] = {}
- end
-
- local bufferList = frame.bufferList[data.pos]
- local frameBuffer = {}
- frameBuffer.id = data.id
- frameBuffer.cnt = data.cnt
- frameBuffer.round = data.round
- frameBuffer.op = data.op
- frameBuffer.hpNow = data.hpNow
- frameBuffer.attrs = {}
- if data.attrs then
- local hpValue = 0
- for k,v in pairs(data.attrs) do
- frameBuffer.attrs[#frameBuffer.attrs + 1] = {k,v}
- if data.pos > CombatDefine.COMBAT_HERO_CNT and k == RoleDefine.HP_COMBAT and v < 0 then
- hpValue = hpValue + v
- end
- end
- if hpValue < 0 then
- frameBuffer.attrs[#frameBuffer.attrs + 1] = {RoleDefine.HURT_COMBAT_TOTAL,math.floor(totalHurt)}
- end
- end
- bufferList[#bufferList + 1] = frameBuffer
- end
- function onUseSkill(skillID)
- skillUseList[skillID] = 1
- end
- function onUseCmd(cmd)
- if not cmd or cmd == 0 then return end
- cmdUseList[cmd] = 1
- end
- function onAddBuffer(bufferID)
- bufferUseList[bufferID] = 1
- end
- function addFrameSkill(pos,skillID)
- frameSkillList[#frameSkillList + 1] = {pos,skillID}
- end
- function addFrameBuffer(obj,buffer,op,bufferCnt)
- local data = {}
- data.id = buffer.id
- data.cnt = bufferCnt or 1
- data.round = buffer.round
- data.op = op
- data.attrs = {}
- if buffer.attrs then
- for k,v in pairs(buffer.attrs) do
- if v ~= 0 then
- data.attrs[k] = data.attrs[k] or 0
- data.attrs[k] = data.attrs[k] + v
- end
- end
- end
- data.pos = obj.pos
- data.hpNow = obj.hp
- frameBufferList[#frameBufferList + 1] = data
- end
- function addSaySkill(obj,skillConfig)
- if skillConfig.contentType == 0 then
- return
- end
- if obj.pos > CombatDefine.COMBAT_HERO_ALL_CNT then
- return
- end
- frameSayList[#frameSayList + 1] = {obj.pos,skillConfig.id,skillConfig.contentType}
- end
- function addRevice(attackPos, obj, bufferID, skillID)
- frameReviceList[#frameReviceList + 1] = {obj.pos, attackPos, bufferID, skillID}
- end
- function afterRevice()
- if #frameReviceList > 0 then
- for k, v in ipairs(frameReviceList) do
- local obj = objList[v[1]]
- if obj then
- addFrame()
- CombatBuff.reviceObj(v[2], obj, v[3], v[4])
- end
- end
- Util.initTable(frameReviceList)
- if #frameBufferList > 0 or #frameSayList > 0 then
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
-
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
- end
- end
- function addBeSkillUse(obj,attackerPos,skillID)
- beSkillUseList[obj.pos] = beSkillUseList[obj.pos] or {}
- beSkillUseList[obj.pos][attackerPos] = beSkillUseList[obj.pos][attackerPos] or {}
- beSkillUseList[obj.pos][attackerPos][skillID] = beSkillUseList[obj.pos][attackerPos][skillID] or 0
- beSkillUseList[obj.pos][attackerPos][skillID] = beSkillUseList[obj.pos][attackerPos][skillID] + 1
- end
- function getBeSkillUse(obj,attackerPos,skillID)
- return beSkillUseList[obj.pos] and beSkillUseList[obj.pos][attackerPos] and beSkillUseList[obj.pos][attackerPos][skillID] or 0
- end
- function addBeSkillPosUse(pos,skillID)
- beSkillPosUseList[pos] = beSkillPosUseList[pos] or {}
- beSkillPosUseList[pos][skillID] = beSkillPosUseList[pos][skillID] or 0
- beSkillPosUseList[pos][skillID] = beSkillPosUseList[pos][skillID] + 1
- end
- function getBeSkillPosUse(pos,skillID)
- return beSkillPosUseList[pos] and beSkillPosUseList[pos][skillID]
- end
- function getBeSkillSideUse(pos,skillID)
- local side
- if pos <= CombatDefine.COMBAT_HERO_CNT then
- side = CombatDefine.ATTACK_SIDE
- elseif pos <= CombatDefine.COMBAT_HERO_ALL_CNT then
- side = CombatDefine.DEFEND_SIDE
- else
- return
- end
- local skillCnt = 0
- for _,v in ipairs(CombatDefine.SIDE2POS[side]) do
- if v ~= pos and beSkillPosUseList[v] and beSkillPosUseList[v][skillID] then
- skillCnt = skillCnt + beSkillPosUseList[v][skillID]
- end
- end
- return skillCnt
- end
- function setObjResult(pos,value)
- local obj
- if pos <= CombatDefine.COMBAT_HERO_ALL_CNT then
- obj = objList[pos]
- elseif pos == CombatDefine.PET_ATKPOS then
- obj = helpList[pos]
- elseif pos == CombatDefine.PET_DEFPOS then
- obj = helpList[pos]
- end
- if not obj then
- return
- end
- if value > 0 then
- obj.result[2] = obj.result[2] + value
- elseif value < 0 then
- obj.result[1] = obj.result[1] - value
- if obj.side == CombatDefine.ATTACK_SIDE then
- totalHurt = totalHurt - value
- end
- end
- end
- function fanji()
- isFanji = true
- for i = 1,#fanjiList do
- local fanjiData = fanjiList[i]
- if fanjiData[1].hp > 0 then
- Skill.use(fanjiData[1],fanjiData[2],fanjiData[3])
- end
- end
- end
- function comboAgain(obj, type, hurtRate, comboSkillID, skip)
- if not obj or obj.hp <=0 then return end
- local stop = CombatBuff.isStop(obj)
- --新增条件,如果控制buff只有chanrao也能继续执行
- if stop and skip == nil and not CombatBuff.IsJustHaveChanraoBuff(obj) then return end
- local skillID = comboSkillID or getSkillID(obj)
- if skillID then
- comboType = type
- comboHurtRate = hurtRate
- Skill.use(obj, skillID)
- comboType = 0
- end
- end
- function combo()
- local comboSkillID
- for k,v in pairs(comboPosList) do
- comboPosList[k] = nil
- end
- for k, v in ipairs(comboList) do
- --for i = 1,#comboList do
- local obj = v[1]
- if obj.hp > 0 then
- local type = v[2] or 0
- local hurtRate = v[3] or 10000
- comboSkillID = nil
- local argSkill = v[4] or 0
- if argSkill ~= 0 then
- comboSkillID = argSkill
- else
- if type == 2 then
- comboSkillID = getNormalSkill(obj)
- end
- end
- local t = v[5] or 1
- local skip = v[6]
- if not (comboPosList[obj.pos] and comboPosList[obj.pos][t] and comboPosList[obj.pos][0] >= 3) then --避免组合技能触发多次连击,比如10813
- comboAgain(obj, type, hurtRate, comboSkillID, skip)
- comboPosList[obj.pos] = comboPosList[obj.pos] or {}
- comboPosList[obj.pos][0] = comboPosList[obj.pos][0] or 0
- comboPosList[obj.pos][0] = comboPosList[obj.pos][0] + 1
- comboPosList[obj.pos][t] = 1
- end
- end
- end
- end
- function setObjBearResult(obj, value)
- if not obj then
- return
- end
- if value < 0 then
- obj.result[3] = obj.result[3] - value
- end
- end
- function addObjResultOut(obj, round)
- if not obj then
- return
- end
- if obj.pos > CombatDefine.COMBAT_HERO_ALL_CNT then
- obj.result[4] = obj.result[4] + 1
- else
- obj.result[4] = round
- end
- end
- --即时添加buffer帧
- function instantFrameBuffer(obj,skillID)
- if #frameBufferList > 0 or #frameSayList > 0 then
- addFrame()
- if obj and skillID then
- setSkillID(obj, skillID)
- end
- mergeFrameBuffer()
- for k,v in ipairs(frameBufferList) do
- setBufferList(v)
- end
- for _,v in ipairs(frameSayList) do
- setSaySkill(v[1],v[2],v[3])
- end
- Util.initTable(frameBufferList)
- Util.initTable(frameSayList)
- end
- end
|