FuwenGrid.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. local FuwenExcel = require("excel.fuwen")
  2. local Util = require("common.Util")
  3. local FuwenLogic = require("fuwen.FuwenLogic")
  4. local PfLogic = require("platform.PfLogic")
  5. local FuwenDefine = require("fuwen.FuwenDefine")
  6. local Broadcast = require("broadcast.Broadcast")
  7. local Lang = require("common.Lang")
  8. FUWEN_SKILL_PRIM = FUWEN_SKILL_PRIM or {} --符文初级技能列表
  9. FUWEN_SKILL_INTE = FUWEN_SKILL_INTE or {} --符文中级技能列表
  10. FUWEN_SKILL_HIGH = FUWEN_SKILL_HIGH or {} --符文高级技能列表
  11. FUWEN_SKILL_TOP = FUWEN_SKILL_TOP or {} --符文顶级技能列表
  12. FUWEN_SKILL_RARE = FUWEN_SKILL_RARE or {} --符文稀有技能列表
  13. function initAfterHot()
  14. Util.initTable(FUWEN_SKILL_PRIM)
  15. Util.initTable(FUWEN_SKILL_INTE)
  16. Util.initTable(FUWEN_SKILL_HIGH)
  17. Util.initTable(FUWEN_SKILL_TOP)
  18. Util.initTable(FUWEN_SKILL_RARE)
  19. for fuwenID, config in pairs(FuwenExcel.skill) do
  20. if config.isFuwenSkill == 1 then -- 符文技能
  21. if config.lv == 1 then
  22. FUWEN_SKILL_PRIM[#FUWEN_SKILL_PRIM + 1] = fuwenID
  23. elseif config.lv == 2 then
  24. FUWEN_SKILL_INTE[#FUWEN_SKILL_INTE + 1] = fuwenID
  25. elseif config.lv == 3 then
  26. FUWEN_SKILL_HIGH[#FUWEN_SKILL_HIGH + 1] = fuwenID
  27. elseif config.lv == 4 then
  28. FUWEN_SKILL_TOP[#FUWEN_SKILL_TOP + 1] = fuwenID
  29. end
  30. if config.rare == 1 then
  31. FUWEN_SKILL_RARE[#FUWEN_SKILL_RARE + 1] = fuwenID
  32. end
  33. end
  34. end
  35. end
  36. function create(id)
  37. local tb = {}
  38. tb.id = id
  39. tb.attr = {}
  40. tb.skill = nil
  41. -- 生成随机属性和技能
  42. genFuwenAttr(tb,nil)
  43. tb.attrTemp = {}
  44. tb.skillTemp = nil
  45. return tb
  46. end
  47. function genFuwenAttr(fuwenGrid, luckRefresh)
  48. Util.initTable(fuwenGrid.attr)
  49. Util.initTable(fuwenGrid.skill)
  50. local choseSkill = {}
  51. local fuwenConfig = FuwenExcel.fuwen[fuwenGrid.id]
  52. if fuwenConfig == nil then
  53. return
  54. end
  55. -- 绝对值属性抽选 必定有且仅有1条
  56. local cnt = #fuwenConfig.absAttrPool
  57. local randIndex = math.random(1, cnt)
  58. local attrKey = fuwenConfig.absAttrPool[randIndex][1]
  59. local attrVal = fuwenConfig.absAttrPool[randIndex][2]
  60. fuwenGrid.attr[1] = {attrKey, attrVal}
  61. -- 百分比属性抽选 不一定有
  62. cnt = #fuwenConfig.percentAttrPool
  63. if cnt > 0 then
  64. local randIndex = math.random(1, cnt)
  65. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  66. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  67. fuwenGrid.attr[2] = {attrKey, attrVal}
  68. if fuwenGrid.id == 80006 then
  69. randIndex = math.random(1, cnt)
  70. attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  71. attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  72. fuwenGrid.attr[3] = {attrKey, attrVal}
  73. end
  74. end
  75. --幸运重铸技能抽选
  76. if luckRefresh == 1 then
  77. cnt = #fuwenConfig.skillRate
  78. fuwenGrid.skill = fuwenGrid.skill or {}
  79. local skillConfig = FuwenExcel.skill
  80. local total = 0
  81. for i = 1,cnt do
  82. if fuwenConfig.skillRate[i][3] >= 1 or fuwenConfig.skillRate[i][4] >= 1 then
  83. total = total + fuwenConfig.skillRate[i][5]
  84. end
  85. end
  86. local randomNum = math.random(1, total)
  87. local skillGroup = nil
  88. for i = 1,cnt do
  89. if fuwenConfig.skillRate[i][3] >= 1 or fuwenConfig.skillRate[i][4] >= 1 then
  90. if randomNum <= fuwenConfig.skillRate[i][5] then
  91. skillGroup = fuwenConfig.skillRate[i]
  92. break
  93. else
  94. randomNum = randomNum - fuwenConfig.skillRate[i][5]
  95. end
  96. end
  97. end
  98. if skillGroup ~= nil then
  99. local primSkillCnt = skillGroup[1] or 0
  100. local inteSkillCnt = skillGroup[2] or 0
  101. local highSkillCnt = skillGroup[3] or 0
  102. local topSkillCnt = skillGroup[4] or 0
  103. --local isHighRare = true
  104. --if highSkillCnt >= 1 and topSkillCnt >= 1 then
  105. -- local randCnt = math.random(1, 2)
  106. -- if randCnt == 2 then
  107. -- isHighRare = false
  108. -- end
  109. --elseif topSkillCnt > 1 then
  110. -- isHighRare = false
  111. --end
  112. local allSkillCnt = 0
  113. local skillRandomIndex = 0
  114. for i = 1,primSkillCnt do
  115. local maxPrimSkillCnt = #FUWEN_SKILL_PRIM
  116. while true do
  117. skillRandomIndex = math.random(1,maxPrimSkillCnt)
  118. local newSkill = FUWEN_SKILL_PRIM[skillRandomIndex]
  119. if choseSkill[skillConfig[newSkill].groupID] == nil then
  120. allSkillCnt = allSkillCnt + 1
  121. fuwenGrid.skill[allSkillCnt] = newSkill
  122. choseSkill[skillConfig[newSkill].groupID] = 1
  123. break
  124. end
  125. end
  126. end
  127. for i = 1,inteSkillCnt do
  128. local maxInteSkillCnt = #FUWEN_SKILL_INTE
  129. while true do
  130. skillRandomIndex = math.random(1,maxInteSkillCnt)
  131. local newSkill = FUWEN_SKILL_INTE[skillRandomIndex]
  132. if choseSkill[skillConfig[newSkill].groupID] == nil then
  133. allSkillCnt = allSkillCnt + 1
  134. fuwenGrid.skill[allSkillCnt] = newSkill
  135. choseSkill[skillConfig[newSkill].groupID] = 1
  136. break
  137. end
  138. end
  139. end
  140. for i = 1,highSkillCnt do
  141. local maxHighSkillCnt = 0
  142. --if i == 1 and isHighRare then
  143. -- maxHighSkillCnt = #FUWEN_SKILL_RARE
  144. -- while true do
  145. -- skillRandomIndex = math.random(1,maxHighSkillCnt)
  146. -- local newSkill = FUWEN_SKILL_RARE[skillRandomIndex]
  147. -- if choseSkill[skillConfig[newSkill].groupID] == nil then
  148. -- allSkillCnt = allSkillCnt + 1
  149. -- fuwenGrid.skill[allSkillCnt] = newSkill
  150. -- choseSkill[skillConfig[newSkill].groupID] = 1
  151. -- break
  152. -- end
  153. -- end
  154. --else
  155. maxHighSkillCnt = #FUWEN_SKILL_HIGH
  156. while true do
  157. skillRandomIndex = math.random(1,maxHighSkillCnt)
  158. local newSkill = FUWEN_SKILL_HIGH[skillRandomIndex]
  159. if choseSkill[skillConfig[newSkill].groupID] == nil then
  160. allSkillCnt = allSkillCnt + 1
  161. fuwenGrid.skill[allSkillCnt] = newSkill
  162. choseSkill[skillConfig[newSkill].groupID] = 1
  163. break
  164. end
  165. end
  166. --end
  167. end
  168. for i = 1,topSkillCnt do
  169. local maxTopSkillCnt = 0
  170. if i == 1 and not isHighRare then
  171. maxTopSkillCnt = #FUWEN_SKILL_RARE
  172. while true do
  173. skillRandomIndex = math.random(1,maxTopSkillCnt)
  174. local newSkill = FUWEN_SKILL_RARE[skillRandomIndex]
  175. if choseSkill[skillConfig[newSkill].groupID] == nil then
  176. allSkillCnt = allSkillCnt + 1
  177. fuwenGrid.skill[allSkillCnt] = newSkill
  178. choseSkill[skillConfig[newSkill].groupID] = 1
  179. break
  180. end
  181. end
  182. else
  183. maxTopSkillCnt = #FUWEN_SKILL_TOP
  184. skillRandomIndex = math.random(1,maxTopSkillCnt)
  185. while true do
  186. skillRandomIndex = math.random(1,maxTopSkillCnt)
  187. local newSkill = FUWEN_SKILL_TOP[skillRandomIndex]
  188. if choseSkill[skillConfig[newSkill].groupID] == nil then
  189. allSkillCnt = allSkillCnt + 1
  190. fuwenGrid.skill[allSkillCnt] = newSkill
  191. choseSkill[skillConfig[newSkill].groupID] = 1
  192. break
  193. end
  194. end
  195. end
  196. end
  197. end
  198. return
  199. end
  200. -- 抽选技能组合
  201. cnt = #fuwenConfig.skillRate
  202. if cnt > 0 then
  203. fuwenGrid.skill = fuwenGrid.skill or {}
  204. local skillConfig = FuwenExcel.skill
  205. local total = 0
  206. for i = 1,cnt do
  207. total = total + fuwenConfig.skillRate[i][5]
  208. end
  209. local randomNum = math.random(1, total)
  210. local skillGroup = nil
  211. for i = 1,cnt do
  212. if randomNum <= fuwenConfig.skillRate[i][5] then
  213. skillGroup = fuwenConfig.skillRate[i]
  214. break
  215. else
  216. randomNum = randomNum - fuwenConfig.skillRate[i][5]
  217. end
  218. end
  219. if skillGroup ~= nil then
  220. local primSkillCnt = skillGroup[1] or 0
  221. local inteSkillCnt = skillGroup[2] or 0
  222. local highSkillCnt = skillGroup[3] or 0
  223. local topSkillCnt = skillGroup[4] or 0
  224. local allSkillCnt = 0
  225. local skillRandomIndex = 0
  226. for i = 1,primSkillCnt do
  227. local maxPrimSkillCnt = #FUWEN_SKILL_PRIM
  228. while true do
  229. skillRandomIndex = math.random(1,maxPrimSkillCnt)
  230. local newSkill = FUWEN_SKILL_PRIM[skillRandomIndex]
  231. if choseSkill[skillConfig[newSkill].groupID] == nil then
  232. allSkillCnt = allSkillCnt + 1
  233. fuwenGrid.skill[allSkillCnt] = newSkill
  234. choseSkill[skillConfig[newSkill].groupID] = 1
  235. break
  236. end
  237. end
  238. end
  239. for i = 1,inteSkillCnt do
  240. local maxInteSkillCnt = #FUWEN_SKILL_INTE
  241. while true do
  242. skillRandomIndex = math.random(1,maxInteSkillCnt)
  243. local newSkill = FUWEN_SKILL_INTE[skillRandomIndex]
  244. if choseSkill[skillConfig[newSkill].groupID] == nil then
  245. allSkillCnt = allSkillCnt + 1
  246. fuwenGrid.skill[allSkillCnt] = newSkill
  247. choseSkill[skillConfig[newSkill].groupID] = 1
  248. break
  249. end
  250. end
  251. end
  252. for i = 1,highSkillCnt do
  253. local maxHighSkillCnt = #FUWEN_SKILL_HIGH
  254. while true do
  255. skillRandomIndex = math.random(1,maxHighSkillCnt)
  256. local newSkill = FUWEN_SKILL_HIGH[skillRandomIndex]
  257. if choseSkill[skillConfig[newSkill].groupID] == nil then
  258. allSkillCnt = allSkillCnt + 1
  259. fuwenGrid.skill[allSkillCnt] = newSkill
  260. choseSkill[skillConfig[newSkill].groupID] = 1
  261. break
  262. end
  263. end
  264. end
  265. for i = 1,topSkillCnt do
  266. local maxTopSkillCnt = #FUWEN_SKILL_TOP
  267. while true do
  268. skillRandomIndex = math.random(1,maxTopSkillCnt)
  269. local newSkill = FUWEN_SKILL_TOP[skillRandomIndex]
  270. if choseSkill[skillConfig[newSkill].groupID] == nil then
  271. allSkillCnt = allSkillCnt + 1
  272. fuwenGrid.skill[allSkillCnt] = newSkill
  273. choseSkill[skillConfig[newSkill].groupID] = 1
  274. break
  275. end
  276. end
  277. end
  278. end
  279. end
  280. end
  281. function setFuwenSkillAttrByGM(human,fuwenID,attr1,val1,attr2,val2,skill1,skill2)
  282. local fuwen = {}
  283. fuwen.id = fuwenID
  284. fuwen.attr = {}
  285. fuwen.skill = {}
  286. fuwen.attr[1] = {attr1,val1}
  287. fuwen.attr[2] = {attr2,val2}
  288. fuwen.skill[1] = skill1
  289. fuwen.skill[2] = skill2
  290. FuwenLogic.addByGrid(human,fuwen,"gm")
  291. end
  292. -- 返回符文背包空余格子数
  293. function getEmptyCnt(human)
  294. local emptyCnt = 0
  295. for i = 1, FuwenDefine.FUWEN_BAG_MAX_CNT do
  296. if human.db.fuwenBag[i] == nil then
  297. emptyCnt = emptyCnt + 1
  298. end
  299. end
  300. return emptyCnt
  301. end
  302. -- 获得符文背包第一个空格子下标
  303. function getEmptyIndex(human)
  304. for index = 1, FuwenDefine.FUWEN_BAG_MAX_CNT do
  305. local grid = human.db.fuwenBag[index]
  306. if grid == nil then
  307. return index
  308. end
  309. end
  310. end
  311. function checkEmptyCnt(human,itemCnt)
  312. if itemCnt > getEmptyCnt(human) then
  313. return Broadcast.sendErr(human,Lang.COMMON_BAG_FULL)
  314. end
  315. return true
  316. end