| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615 |
- --种族试炼
- --db
- --[=[
- key 为种族类型
- human.db.RacialTrial = {
- [1] = {
- lv = nil, --已经通关的层数
- dailyAwardCnt = nil, --每日可领取奖励次数/每日可通关次数
- },
- [2] = {
- lv = nil,
- dailyAwardCnt = nil,
- }
- }
- ]=]--
- local Msg = require("core.Msg")
- local Util = require("common.Util")
- local BagLogic = require("bag.BagLogic")
- local CombatDefine = require("combat.CombatDefine")
- local CombatLogic = require("combat.CombatLogic")
- local HeroLogic = require("hero.HeroLogic")
- local HeroConfig = require("excel.hero")
- local Grid = require("bag.Grid")
- local MonsterGrid = require("monster.MonsterGrid")
- local Lang = require("common.Lang")
- local Broadcast = require("broadcast.Broadcast")
- local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
- local TriggerDefine = require("trigger.TriggerDefine")
- local TriggerLogic = require("trigger.TriggerLogic")
- --开启玩法的等级要求
- local openCondLevel = 0
- --每日最多可领奖次数
- local dailyAwardTimes = 0
- --种族试炼关卡数据,key为种族,value为该种族的关卡配置
- -- local racialCfg = {
- -- --[camp] = {},
- -- --[camp] = {},
- -- }
- --日志Tag
- local RACIALTRIALLOG = "racialTrial"
- --种族 - 关卡开启时间映射表
- --1-妖族, 2-人族, 3-兽族,4-仙、魔族
- local RACIAL_OPENTIME = {
- [1] = {1,5,7},
- [2] = {2,5,7},
- [3] = {3,6,7},
- [4] = {4,6,7},
- }
- --战斗类型 - 种族映射表
- local COMBATTYPE_CAMP = {
- [CombatDefine.COMBAT_TYPE25] = 1,
- [CombatDefine.COMBAT_TYPE26] = 2,
- [CombatDefine.COMBAT_TYPE27] = 3,
- [CombatDefine.COMBAT_TYPE28] = {4,5},
- }
- local function updateCondValue()
- local cfg = require("excel.shilianTower")
- if not cfg then
- return
- end
- local condCfg = cfg.main[1]
- openCondLevel = condCfg.openlv
- dailyAwardTimes = condCfg.maxrewardnum
- end
- --生成配置
- -- local function generateCfg()
- -- local cfg = require("excel.shilianTower")
- -- if not cfg then
- -- return
- -- end
- -- local stageCfg = cfg.shilianTower
- -- racialCfg = { [1] = {}, [2] = {}, [3] = {}, [4] = {}}
- -- local n1,n2,n3,n4 = 0,0,0,0
- -- for _, v in ipairs(stageCfg) do
- -- if v.raceID == 101 then
- -- n1 = n1 + 1
- -- racialCfg[1][n1] = v
- -- elseif v.raceID == 102 then
- -- n2 = n2 + 1
- -- racialCfg[2][n2] = v
- -- elseif v.raceID == 103 then
- -- n3 = n3 + 1
- -- racialCfg[3][n3] = v
- -- elseif v.raceID == 104 then
- -- n4 = n4 + 1
- -- racialCfg[4][n4] = v
- -- end
- -- end
- -- end
- --通过种族类型获取配置
- local function getCfgByCamp(human, camp)
- local cfgVec = require("excel.shilianTower").shilianTower
- if not cfgVec then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- local config = {}
- local targetId = 0
- if camp == 1 then
- targetId = 101
- elseif camp == 2 then
- targetId = 102
- elseif camp == 3 then
- targetId = 103
- elseif camp == 4 then
- targetId = 104
- else
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
-
- local len = #config
- for _, v in ipairs(cfgVec) do
- if v.raceID == targetId then
- len = len + 1
- config[len] = v
- end
- end
- if len == 0 then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- return config
- end
- --初始化数据
- local function initData(human, camp)
- human.db.RacialTrial = human.db.RacialTrial or {}
- human.db.RacialTrial[camp] = {
- lv = 0,
- dailyAwardCnt = dailyAwardTimes
- }
- end
- --检测上阵英雄
- function checkUpdatePos(human, msg)
- local combatType = msg.type
- local condi_camp = COMBATTYPE_CAMP[combatType]
- if not condi_camp then
- return false
- end
- local heroList = Util.split(msg.heroList, ",")
- for i = 1, CombatDefine.COMBAT_HERO_CNT do
- local uuid = heroList[i] or ""
- if uuid ~= "0" and uuid ~= "" then
- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
- if not heroGrid then
- return false
- end
- --种族检测
- local heroCfg = HeroConfig.hero[heroGrid.id]
- if type(condi_camp) == "table" then
- local bl = false
- for _, camp in ipairs(condi_camp) do
- if camp == heroCfg.camp then
- bl = true
- break
- end
- end
- if not bl then
- return false
- end
- else
- if condi_camp ~= heroCfg.camp then
- return false
- end
- end
- end
- end
- return true
- end
- --红点检测
- function isDot(human,config)
- if human.db.lv < config.dotLv then
- return false
- end
- local wday = Util.getWeekDay()
- --转成大家熟悉的表示法
- if wday == 1 then
- wday = 7
- else
- wday = wday - 1
- end
- --入口的红点
- if config.id == RoleSystemDefine.ROLE_SYS_ID_1210 then
- --如果当天一个试炼都没有开启,则入口也不显示红点
- local bl = false
- for _, v in ipairs(RACIAL_OPENTIME) do
- for _, v2 in ipairs(v) do
- if v2 == wday then
- bl = true
- break
- end
- end
- if bl then
- break
- end
- end
- if not bl then
- return false
- end
- if human.db.RacialTrial then
- local num = 0
- for camp, v in pairs(human.db.RacialTrial) do
- --local campCfg = racialCfg[camp]
- local campCfg = getCfgByCamp(human, camp)
- if v.dailyAwardCnt <= 0 or v.lv >= #campCfg then
- num = num + 1
- end
- end
- if num >= #RACIAL_OPENTIME then
- return false
- end
- end
- else
- --具体某个种族关卡的红点
- local camp = 0
- if config.id == RoleSystemDefine.ROLE_SYS_ID_1211 then
- camp = 1
- elseif config.id == RoleSystemDefine.ROLE_SYS_ID_1212 then
- camp = 2
- elseif config.id == RoleSystemDefine.ROLE_SYS_ID_1213 then
- camp = 3
- elseif config.id == RoleSystemDefine.ROLE_SYS_ID_1214 then
- camp = 4
- else
- return false
- end
- --开启判断
- local bl = false
- local openDays = RACIAL_OPENTIME[camp]
- for _, v in ipairs(openDays) do
- if v == wday then
- bl = true
- break
- end
- end
- if not bl then
- return false
- end
- --当日奖励次数和最大关卡判断
- if human.db.RacialTrial and human.db.RacialTrial[camp] then
- local dailyAwardCnt = human.db.RacialTrial[camp].dailyAwardCnt
- local lv = human.db.RacialTrial[camp].lv
- --local campCfg = racialCfg[camp]
- local campCfg = getCfgByCamp(human, camp)
- if dailyAwardCnt <= 0 or lv >= #campCfg then
- return false
- end
- end
- end
- return true
- end
- --0点更新
- function updateDaily(human)
- updateCondValue()
- if human.db.lv < openCondLevel then
- return
- end
- -- if not next(racialCfg) then
- -- generateCfg()
- -- end
- --重置每日领奖次数/每日通关次数
- if human.db and human.db.RacialTrial then
- for _, v in pairs(human.db.RacialTrial) do
- v.dailyAwardCnt = dailyAwardTimes
- end
- end
- end
- function onLogin(human)
- updateCondValue()
- end
- --GM 修改某个种族的关卡, levelCnt表示要往前/后打多少关,但是不增加每日领奖次数
- function GmSetlevel(human, camp, levelCnt)
- if not camp or not levelCnt then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- local singleRacialCfg = getCfgByCamp(human, camp)
- --local singleRacialCfg = racialCfg[camp]
- if not singleRacialCfg then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- if not human.db.RacialTrial or not human.db.RacialTrial[camp] then
- initData(human, camp)
- end
- local racialTrialData = human.db.RacialTrial[camp]
- if levelCnt > 0 then
- local startIdx = racialTrialData.lv
- if startIdx + levelCnt > #singleRacialCfg then
- levelCnt = #singleRacialCfg - startIdx
- end
- local endIdx = startIdx + levelCnt
- for i= startIdx+1, endIdx do
- local rewardCfg = singleRacialCfg[i].reward
- for _,v in ipairs(rewardCfg) do
- BagLogic.addItem(human, v[1], v[2], RACIALTRIALLOG)
- end
- end
- end
- racialTrialData.lv = math.max(racialTrialData.lv + levelCnt, 0)
- end
- --GM 开启某个种族的试炼
- function GmOpenTrial(human, camp)
- if not camp then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- local wdDays = RACIAL_OPENTIME[camp]
- if not wdDays then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- local wday = Util.getWeekDay()
- if wday == 1 then
- wday = 7
- else
- wday = wday - 1
- end
- wdDays[#wdDays+1] = wday
- end
- --增加某个种族试炼关卡的每次奖励次数/通关数
- function GmAddDailyAwardCnt(human, camp, num)
- if not camp or not num then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- if not human.db.RacialTrial or not human.db.RacialTrial[camp] then
- initData(human, camp)
- end
- local racialTrialData = human.db.RacialTrial[camp]
- racialTrialData.dailyAwardCnt = math.max(racialTrialData.dailyAwardCnt + num, 0)
- end
- --------------------------------------------------战斗相关------------------------------------
- function getCombatMonsterOutID(human, side, args, combatType)
- if side ~= CombatDefine.DEFEND_SIDE then
- return
- end
- local camp = COMBATTYPE_CAMP[combatType]
- if type(camp) == "table" then
- camp = camp[1]
- end
- if not camp then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- local nowLelvel = 0
- if human.db.RacialTrial and human.db.RacialTrial[camp] then
- nowLelvel = human.db.RacialTrial[camp].lv
- end
- local configVec = getCfgByCamp(human, camp)
- local config = configVec[nowLelvel+1]
- --local config = racialCfg[camp][nowLelvel+1]
- if not config then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- return config.monsterOutID, config.zhandouli
- end
- function fight(human, args, combatType)
- local camp = COMBATTYPE_CAMP[combatType]
- if type(camp) == "table" then
- camp = camp[1]
- end
- if not camp then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- if human.db.RacialTrial and human.db.RacialTrial[camp] then
- local data = human.db.RacialTrial[camp]
- --当日没有挑战次数了
- if data.dailyAwardCnt and data.dailyAwardCnt <= 0 then
- return
- end
- --已经到最高层
- --local campCfg = racialCfg[camp]
- local campCfg = getCfgByCamp(human, camp)
- if data.lv and data.lv >= #campCfg then
- return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
- end
- end
- CombatLogic.combatBegin(human, nil, nil, combatType)
- end
- --战斗结束,未将战斗数据下发客户端前的处理
- function onFightEnd(human, result, combatType, param1, combatInfo)
- --没赢就不需要处理
- if CombatDefine.RESULT_WIN ~= result then
- return
- end
- local camp = COMBATTYPE_CAMP[combatType]
- if type(camp) == "table" then
- camp = camp[1]
- end
- if not camp then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- if not human.db.RacialTrial or not human.db.RacialTrial[camp] then
- --胜利才更新数据
- initData(human, camp)
- end
- local data = human.db.RacialTrial[camp]
- data.lv = data.lv + 1
- data.dailyAwardCnt = data.dailyAwardCnt - 1
- --local singleRacialCfg = racialCfg[camp]
- local singleRacialCfg = getCfgByCamp(human, camp)
- local rewardCfg = singleRacialCfg[data.lv].reward
- if not rewardCfg then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- --已经到最高层或者当日可挑战次数已用完则不能继续挑战
- combatInfo.endParam = "1"
- if data.lv >= #singleRacialCfg or data.dailyAwardCnt <= 0 then
- combatInfo.endParam = "0"
- end
- --发放奖励
- combatInfo.rewardItem = {}
- for i=1, #rewardCfg do
- local itemID = rewardCfg[i][1]
- local itemCnt = rewardCfg[i][2]
- combatInfo.rewardItem[i] = combatInfo.rewardItem[i] or {}
- combatInfo.rewardItem[i] = {itemID, itemCnt}
- BagLogic.addItem(human, itemID, itemCnt, RACIALTRIALLOG)
- end
- TriggerLogic.PublishEvent(TriggerDefine.ZHONGZU_LEVEL, human.db._id, camp, 1)
- end
- --------------------------------------------------Respone------------------------------------
- --入口查询
- function entranceQuery(human)
- if human.db.lv < openCondLevel then
- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
- end
- local wday = Util.getWeekDay()
- --转成大家熟悉的表示法
- if wday == 1 then
- wday = 7
- else
- wday = wday - 1
- end
- local msgRet = Msg.gc.GC_RACIALTRIAL_ENTRANCE_QUERY
- msgRet.list[0] = #RACIAL_OPENTIME
- for k,v in ipairs(RACIAL_OPENTIME) do
- msgRet.list[k].isOpen = 0
- msgRet.list[k].camp = k
- for _, day in ipairs(v) do
- if wday == day then
- msgRet.list[k].isOpen = 1
- msgRet.list[k].openWdays[0] = 0
- break
- end
- end
- if msgRet.list[k].isOpen == 0 then
- msgRet.list[k].openWdays[0] = #v
- for idx, val in ipairs(v) do
- msgRet.list[k].openWdays[idx] = val
- end
- end
- end
- Msg.send(msgRet, human.fd)
- end
- --单个种族关卡数据查询
- function stageQuery(human, camp_m)
- if not camp_m then
- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
- end
- if human.db.lv < openCondLevel then
- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
- end
- local nowLv = 0
- local dailyAwardCnt = dailyAwardTimes
- if human.db.RacialTrial and human.db.RacialTrial[camp_m] then
- nowLv = human.db.RacialTrial[camp_m].lv
- dailyAwardCnt = human.db.RacialTrial[camp_m].dailyAwardCnt
- end
- local msgRet = Msg.gc.GC_RACIALTRIAL_LEVEL_QUERY
- msgRet.data.dailyAwardCnt = dailyAwardCnt
- --正常显示(当前关卡-1 ~ 当前关卡+5) 的关卡
- local startIdx = nowLv - 1
- local endIdx = nowLv + 5
- --0层和第一层的的处理
- if nowLv <= 0 or nowLv == 1 then
- startIdx = 1
- endIdx = startIdx + 5
- end
- --local singleRecailCfg = racialCfg[camp_m]
- local singleRacialCfg = getCfgByCamp(human, camp_m)
- local levelMaxCnt = #singleRacialCfg
- --已经打到最高层的处理
- if nowLv >= levelMaxCnt then
- startIdx = nowLv - 5
- endIdx = nowLv
- elseif levelMaxCnt - nowLv < 5 then
- --local subLevel = levelMaxCnt - nowLv
- local subLevel = nowLv + 5 - levelMaxCnt
- startIdx = startIdx - subLevel
- endIdx = levelMaxCnt
- end
- --当前关卡前面不够5层的处理
- -- if levelMaxCnt - nowLv < 5 then
- -- --local subLevel = levelMaxCnt - nowLv
- -- local subLevel = nowLv + 5 - levelMaxCnt
- -- startIdx = startIdx - subLevel
- -- endIdx = levelMaxCnt
- -- end
- local stageData = msgRet.data.stageData
- stageData[0] = 0
- local cnt = 0
- for i = startIdx, endIdx do
- local singleCfg = singleRacialCfg[i]
- if not singleCfg then
- return
- end
- cnt = cnt + 1
- if i <= nowLv then
- stageData[cnt].isPass = 1
- elseif i == nowLv + 1 and dailyAwardCnt > 0 then --只能一关一关的挑战
- stageData[cnt].isPass = 2
- elseif i == nowLv + 1 and dailyAwardCnt <= 0 then --当日没有奖励次数了,但是还是需要显示挑战button
- stageData[cnt].isPass = 3
- else
- stageData[cnt].isPass = 0
- end
- stageData[cnt].power = 0
- stageData[cnt].levelIdex = i
- --奖励
- stageData[cnt].reward[0] = #singleCfg.reward
- for k, v in ipairs(singleCfg.reward) do
- Grid.makeItem(stageData[cnt].reward[k], v[1], v[2])
- end
- --怪物数据
- local objList = MonsterGrid.createMonsterObjListByMonsterOutID(singleCfg.monsterOutID)
- if not objList then
- return
- end
- stageData[cnt].monsterData[0] = #objList
- local power = 0
- for idx, monster in ipairs(objList) do
- stageData[cnt].monsterData[idx] = {
- lv = monster.lv,
- body = monster.body,
- camp = monster.camp,
- }
- power = power + (monster.power or 0)
- end
- stageData[cnt].power = power
- end
- stageData[0] = cnt
- Msg.send(msgRet, human.fd)
- end
|