BaiZhanChengShenDefine.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. -- 百战成神 常量定义
  2. --
  3. -- 玩法概要:
  4. -- 跨服 5v5 积分 PvP, 5 种族独立阵容(COMBAT_TYPE39~43), 5 局 3 胜制。
  5. -- 开服>=45 天可参与; 周六 0:10 ~ 周日 23:00 可挑战; 每轮开放后隔 3 个开放周,第 5 周再开新轮。
  6. -- 一次点击挑战仅扣 1 次(每日 5 次免费, 不足扣道具 115 x5)。
  7. -- 攻胜+100/攻负-50, 守胜+50/守负-50; 初始积分 3000。
  8. --
  9. -- 架构: 普通服 NS + 跨服 CS + Mongo DB(db_bzcs)
  10. -- 首次挑战完成 REGISTER; 阵容变更 UPDATE_SHOW; 积分/匹配/排行在跨服
  11. --------------------------------------------------------------------------------
  12. -- 活动时间 (Util.getWeekDay: 1=周日, 2=周一, 3=周二 ... 7=周六)
  13. --------------------------------------------------------------------------------
  14. BZCS_OPEN_WDAY_AREA = {7, 1} -- 可挑战星期: 周六~周日 (getWeekDay: 7=周六, 1=周日)
  15. BZCS_START_SEC = 600 -- 每日开始时刻: 0:10 (距 0 点秒数)
  16. BZCS_END_SEC = 82800 -- 每日结束时刻: 23:00
  17. BZCS_SKIP_OPEN_WEEKS = 3 -- 本轮开放后跳过的开放周数(第2~4周不开新轮)
  18. BZCS_CYCLE_DAYS = (1 + BZCS_SKIP_OPEN_WEEKS) * 7 -- 距上次开轮最少天数(28), 第5个开放周可开
  19. BZCS_OPEN_DAYS = 2 -- 单轮活动持续天数(周六+周日, 用于 IsRunning 校验)
  20. -- 开放结束日相对开始日的天数偏移(周六->周日为 1)
  21. function GetOpenEndDayOffset()
  22. local s = BZCS_OPEN_WDAY_AREA[1]
  23. local e = BZCS_OPEN_WDAY_AREA[2]
  24. if s <= e then
  25. return e - s
  26. end
  27. return e + 7 - s
  28. end
  29. --------------------------------------------------------------------------------
  30. -- 积分规则
  31. --------------------------------------------------------------------------------
  32. BZCS_INIT_SCORE = 3000 -- 每轮初始/重置积分
  33. BZCS_ATK_WIN_SCORE = 100 -- 进攻方整场获胜加分
  34. BZCS_ATK_LOSE_SCORE = -50 -- 进攻方整场失败扣分
  35. BZCS_DEF_WIN_SCORE = 50 -- 防守方整场获胜加分(对手进攻失败)
  36. BZCS_DEF_LOSE_SCORE = -50 -- 防守方整场失败扣分(对手进攻成功)
  37. -- excel.baiZhanChengShen.fightReward 配置 id
  38. BZCS_FIGHT_REWARD_WIN_ID = 1 -- 挑战整场胜利奖励
  39. BZCS_FIGHT_REWARD_LOSE_ID = 2 -- 挑战整场失败奖励
  40. --------------------------------------------------------------------------------
  41. -- 种族与战斗类型 (teamType 41~45, 见 excel/ssecy/combat.lua)
  42. -- race 1~5 与 camp 一致: 妖/人/兽/仙/魔
  43. --------------------------------------------------------------------------------
  44. BZCS_RACE_ORDER = {1, 2, 3, 4, 5}
  45. BZCS_RACE_COMBAT_TYPE = {39, 40, 41, 42, 43}
  46. BZCS_RACE_NAME = {"妖", "人", "兽", "仙", "魔"}
  47. BZCS_RACE_CNT = 5
  48. BZCS_WIN_TARGET = 3 -- 5 局 3 胜: 先赢 3 族或打满 5 族
  49. --------------------------------------------------------------------------------
  50. -- 挑战次数与门票
  51. --------------------------------------------------------------------------------
  52. BZCS_FREE_TIMES = 5 -- 每日免费挑战次数(0 点重置)
  53. BZCS_TICKET_ITEM_ID = 115 -- 挑战券道具 id
  54. BZCS_TICKET_COST = 5 -- 无免费时每次消耗数量
  55. --------------------------------------------------------------------------------
  56. -- 匹配与排行
  57. --------------------------------------------------------------------------------
  58. BZCS_OPPONENT_CNT = 3 -- 单次匹配对手数量
  59. BZCS_MATCH_CACHE_TTL = 30 -- 匹配列表内存缓存有效期(秒); 过期按 rank 轻量刷新展示
  60. BZCS_MATCH_STEP = 500 -- 积分匹配步进(第1步±500, 第2步±1000, 第3步±1500...)
  61. BZCS_MATCH_MAX_STEP = 50 -- 最大扩大步数(最多 ±25000 分范围)
  62. BZCS_RANK_MAX = 100 -- 客户端展示排行榜条数(全服积分榜含机器人, 规模更大)
  63. -- 全服排行: 积分高者优先; 同分则 scoreTime 小者优先(先达到该积分)
  64. BZCS_REWARD_RANK_MAX = 9999 -- 周期发奖最大排名(超出不发)
  65. --------------------------------------------------------------------------------
  66. -- 准入与其它
  67. --------------------------------------------------------------------------------
  68. BZCS_OPEN_SVR_DAY = 45 -- 开服天数>=此值本服才可参与
  69. BZCS_WARREPORT_MAX = 20 -- 玩家本地战报条数(新记录在前, 超出删最老)
  70. -- 战报类型 warType(客户端展示用)
  71. BZCS_WAR_TYPE_ATK_WIN = 1 -- 主动挑战获胜
  72. BZCS_WAR_TYPE_ATK_LOSE = 2 -- 主动挑战失败
  73. BZCS_WAR_TYPE_DEF_WIN = 3 -- 被挑战, 己方获胜
  74. BZCS_WAR_TYPE_DEF_LOSE = 4 -- 被挑战, 己方失败
  75. BZCS_AWARD_MAIL_ID = 7038 -- 周期结算邮件 id(需在 excel/mail 配置)
  76. -- 机器人池数量 = 策划 robotList 条数(见 GetRobotListCount)
  77. BZCS_SVR_BASE_NUM = 810537 -- 逻辑服 serverId 基准(Config.SVR_INDEX 等)
  78. BZCS_ROBOT_DISPLAY_SERVER_ID = 1 -- 协议下发: 机器人展示为第1服
  79. -- 逻辑服 serverId -> GC 协议展示服号(仅 NS 下发客户端时调用); isRobot=1 固定为第1服
  80. function ToClientServerId(serverId, isRobot)
  81. if isRobot == 1 then
  82. return BZCS_ROBOT_DISPLAY_SERVER_ID
  83. end
  84. if not serverId or serverId <= 0 then
  85. return 0
  86. end
  87. if serverId > BZCS_SVR_BASE_NUM then
  88. return serverId - BZCS_SVR_BASE_NUM
  89. end
  90. return serverId
  91. end
  92. --------------------------------------------------------------------------------
  93. -- 跨服 WL_BZCS_TIPS 错误码 (普通服收到后提示)
  94. --------------------------------------------------------------------------------
  95. BZCS_ERR_NOT_OPEN = 1 -- 活动未开启
  96. BZCS_ERR_NOT_ELIGIBLE = 2 -- 不满足参与条件
  97. BZCS_ERR_NO_TIMES = 3 -- 挑战次数不足
  98. BZCS_ERR_TARGET_INVALID = 4 -- 对手不存在
  99. BZCS_ERR_DATA = 5 -- 数据异常
  100. BZCS_ERR_IN_BATTLE = 6 -- 战斗中(重复挑战)
  101. --------------------------------------------------------------------------------
  102. -- LW_BZCS_UPDATE_SHOW 增量类型(showInfo 仅带变更字段, 跨服 MergeShowInfo 合并)
  103. --------------------------------------------------------------------------------
  104. BZCS_UPDATE_SHOW_NAME = 1 -- name
  105. BZCS_UPDATE_SHOW_HEAD = 3 -- head
  106. BZCS_UPDATE_SHOW_HEAD_FRAME = 4 -- headFrame
  107. BZCS_UPDATE_SHOW_LINEUP = 5 -- heroArr[race], 须配合 race 参数
  108. BZCS_UPDATE_SHOW_BODY = 6 -- body(形象, HEAD_TYPE_3)
  109. -- 将增量 showInfo 合并进跨服已有展示数据
  110. function MergeShowInfo(si, patch)
  111. if not si or not patch then return end
  112. if patch.name ~= nil then
  113. si.name = patch.name
  114. end
  115. if patch.head ~= nil then
  116. si.head = patch.head
  117. end
  118. if patch.headFrame ~= nil then
  119. si.headFrame = patch.headFrame
  120. end
  121. if patch.body ~= nil then
  122. si.body = patch.body
  123. end
  124. if patch.heroArr then
  125. si.heroArr = si.heroArr or {}
  126. for race, raceShow in pairs(patch.heroArr) do
  127. si.heroArr[race] = raceShow
  128. end
  129. end
  130. end
  131. --------------------------------------------------------------------------------
  132. -- robotList 配置(策划表 excel/ssecy/baiZhanChengShen.lua)
  133. -- score: 机器人积分
  134. -- monsterOutIDs[1..5]: 妖/人/兽/仙/魔 五族 monsterOutID, 每 ID 一支队伍(见 CombatLogic.getMonsterObjList)
  135. --------------------------------------------------------------------------------
  136. local BzcsConfig = require("excel.baiZhanChengShen")
  137. local CombatLogic = require("combat.CombatLogic")
  138. local robotListCount
  139. function GetRobotListCount()
  140. if robotListCount then
  141. return robotListCount
  142. end
  143. local max = 0
  144. for k in pairs(BzcsConfig.robotList or {}) do
  145. if type(k) == "number" and k > max then
  146. max = k
  147. end
  148. end
  149. robotListCount = max
  150. return max
  151. end
  152. -- bzcs_robot_N 与 robotList[N] 一一对应
  153. function GetRobotListIndex(uuid)
  154. if not uuid then return end
  155. local n = string.match(uuid, "^bzcs_robot_(%d+)$")
  156. if not n then return end
  157. local idx = tonumber(n)
  158. if not idx or idx < 1 or idx > GetRobotListCount() then return end
  159. return idx
  160. end
  161. function GetRobotListCfg(uuid)
  162. local idx = GetRobotListIndex(uuid)
  163. if not idx then return end
  164. return BzcsConfig.robotList[idx], idx
  165. end
  166. -- 由 monsterOutID 计算单族队伍战力(与战斗 getMonsterObjList 一致)
  167. function CalcMonsterOutPower(monsterOutID)
  168. if not monsterOutID then return 0 end
  169. local _, _, rolebase = CombatLogic.getMonsterObjList(monsterOutID)
  170. return rolebase and rolebase.zhandouli or 0
  171. end
  172. --------------------------------------------------------------------------------
  173. -- 战力与机器人阵容展开(机器人仅存 monsterOutID+racePower, 展示字段用时生成)
  174. --------------------------------------------------------------------------------
  175. local MonsterExcel
  176. local function getMonsterExcel()
  177. MonsterExcel = MonsterExcel or require("excel.monster")
  178. return MonsterExcel
  179. end
  180. -- 机器人单族仅存 monsterOutID+racePower, 有 monsterOutID 则需展开
  181. local function needExpandRaceShow(raceShow)
  182. return raceShow and raceShow.monsterOutID ~= nil
  183. end
  184. -- 由 monsterOut 展开英雄展示; racePower 均分到各英雄 heroPower(不修改入参)
  185. function ExpandBzcsRaceShow(raceShow)
  186. if not raceShow or not needExpandRaceShow(raceShow) then
  187. return raceShow
  188. end
  189. local excel = getMonsterExcel()
  190. local mout = excel.monsterOut[raceShow.monsterOutID]
  191. local racePower = raceShow.racePower or 0
  192. local heroArr = {}
  193. local cnt = 0
  194. if mout and mout.member then
  195. for idx, member in ipairs(mout.member) do
  196. if idx > 6 then break end
  197. cnt = cnt + 1
  198. end
  199. end
  200. local per = cnt > 0 and math.floor(racePower / cnt) or racePower
  201. local len = 0
  202. if mout and mout.member then
  203. for idx, member in ipairs(mout.member) do
  204. if idx > 6 then break end
  205. local mid = member[1]
  206. local mcf = excel.monster[mid]
  207. if mcf then
  208. len = len + 1
  209. heroArr[len] = {
  210. heroBody = mcf.body,
  211. heroStar = mcf.star or 0,
  212. heroLevel = member[2],
  213. heroCamp = mcf.camp or 0,
  214. heroIcon = mcf.head or 0,
  215. heroId = mid,
  216. heroQuality = mcf.heroQuality or 1,
  217. heroPower = per,
  218. }
  219. end
  220. end
  221. end
  222. if len == 0 then
  223. heroArr[1] = {
  224. heroPower = racePower,
  225. heroId = 0,
  226. heroBody = 0,
  227. heroStar = 0,
  228. heroLevel = 0,
  229. heroCamp = 0,
  230. heroIcon = 0,
  231. heroQuality = 1,
  232. }
  233. end
  234. return {
  235. heroArr = heroArr,
  236. formation = raceShow.formation or 1,
  237. helpSkillId = raceShow.helpSkillId or 0,
  238. elfList = raceShow.elfList,
  239. elfSkillIds = raceShow.elfSkillIds,
  240. monsterOutID = raceShow.monsterOutID,
  241. racePower = racePower,
  242. }
  243. end
  244. -- 单族队伍战力: 机器人用 racePower; 真人用 heroArr 内 heroPower 之和
  245. function CalcRaceTeamPower(raceShow)
  246. if not raceShow then return 0 end
  247. if raceShow.racePower then
  248. return raceShow.racePower
  249. end
  250. local sum = 0
  251. for _, h in ipairs(raceShow.heroArr or {}) do
  252. sum = sum + (h.heroPower or 0)
  253. end
  254. return sum
  255. end
  256. -- 玩家总战力 = 五族队伍战力之和
  257. function CalcPlayerPower(showInfo)
  258. if not showInfo then return 0 end
  259. local total = 0
  260. for _, race in ipairs(BZCS_RACE_ORDER) do
  261. total = total + CalcRaceTeamPower(showInfo.heroArr and showInfo.heroArr[race])
  262. end
  263. return total
  264. end