FFCalAttr.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. import Main from "../../main/Main";
  2. import { __EquipData,__GodCardLevel,__GodReborn } from "./sdata/SManage";
  3. import { EquipAttr, GodCardAttr, PetAttr } from "./udata/Player";
  4. //属性
  5. export interface FFAttr{
  6. id:number,
  7. post:number,//职业
  8. type:number,//1:小怪,2:boss,3:伙伴
  9. path:string,
  10. atk:number,
  11. def:number,
  12. hp:number,
  13. sp:number,
  14. // bjgl:number,//暴击概率
  15. // js:number,//减伤
  16. // shjc:number,//伤害加成
  17. // jnsh:number,//技能伤害
  18. water:number
  19. fire:number
  20. wind:number
  21. thunder:number
  22. earth:number
  23. sd:number,//射程
  24. weaponSkill//武器技能
  25. suitId:number//套装属性
  26. suitCount:number//套装凑齐数量
  27. attrs:Array<any>//装备携带的副属性{K:id,V:value}
  28. zdl:number,
  29. skin:string,//皮肤
  30. weapon:string,//武器
  31. bullet:string,//使用的子弹
  32. }
  33. /**
  34. * 属性计算
  35. */
  36. export default class FFCalAttr {
  37. public static getAttr(main:Main,petAttr:PetAttr):FFAttr{
  38. let roleData = main.sManage.getRoleById(petAttr.id);
  39. let data = {
  40. id:petAttr.id,
  41. type:3,
  42. post:roleData.post,
  43. path:'prefab/role/'+roleData.act,
  44. atk:roleData.atk,
  45. def:roleData.def,
  46. hp:roleData.hp,
  47. sp:roleData.sp,
  48. water:0,
  49. fire:0,
  50. wind:0,
  51. thunder:0,
  52. earth:0,
  53. sd:0,
  54. weaponSkill:0,
  55. suitId:0,
  56. suitCount:0,
  57. attrs:[],
  58. zdl:0,
  59. skin:'30000',//皮肤
  60. weapon:'',//武器
  61. bullet:null,
  62. };
  63. for (let i = 0; i < petAttr.equips.length; i++) {
  64. const element = petAttr.equips[i];
  65. //基础属性
  66. let equipData = main.sManage.getEquipById(element.id);
  67. if(equipData.type == 1){//武器
  68. data.weapon = ''+equipData.id
  69. data.bullet = equipData.bulletEffect
  70. }else if(equipData.type == 5){//皮肤
  71. data.skin = ''+equipData.id
  72. }
  73. data.atk += equipData.atk;
  74. data.def += equipData.def;
  75. data.hp += equipData.hp;
  76. data.sp += equipData.sp;
  77. data.sd += equipData.sd;
  78. if(equipData.skill > 0){
  79. data.weaponSkill = equipData.skill
  80. }
  81. //计算附加属性
  82. if(element.attr){
  83. for (let i = 0; i < element.attr.length; i++) {
  84. const attr = element.attr[i];
  85. let addAttr = true;
  86. for (let j = 0; j < data.attrs.length; j++) {
  87. const tmp = data.attrs[j];
  88. if(tmp.K == attr.K){
  89. tmp.V += attr.V
  90. addAttr = false
  91. break
  92. }
  93. }
  94. if(addAttr){
  95. data.attrs.push({
  96. K:attr.K,
  97. V:attr.V
  98. })
  99. }
  100. }
  101. }
  102. //计算强化属性
  103. let qhLevel = FFCalAttr.getEquipQH(main,element,equipData)
  104. if(qhLevel > 0){
  105. let __qhList = main.sManage.getEquipQHByType(equipData)
  106. let _qhAttr1 = __qhList[qhLevel - 1]
  107. data.atk += _qhAttr1.atk
  108. data.def += _qhAttr1.def
  109. data.hp += _qhAttr1.hp
  110. data.sp += _qhAttr1.sp
  111. }
  112. if(element.star > 0){
  113. data.atk += Math.floor(data.atk*element.star/10)
  114. data.def += Math.floor(data.def*element.star/10)
  115. data.hp += Math.floor(data.hp*element.star/10)
  116. data.sp += Math.floor(data.sp*element.star/10)
  117. }
  118. }
  119. //计算附加属性
  120. for (let i = 0; i < data.attrs.length; i++) {
  121. const element = data.attrs[i];
  122. if(element.K == 1){//攻
  123. data.atk += Math.floor(data.atk*element.V/100)
  124. }else if(element.K == 2){//防
  125. data.def += Math.floor(data.def*element.V/100)
  126. }else if(element.K == 3){//血
  127. data.hp += Math.floor(data.hp*element.V/100)
  128. }else if(element.K == 4){//速
  129. data.sp += Math.floor(data.sp*element.V/100)
  130. }else if(element.K == 5){//攻
  131. data.atk += Math.floor(data.atk*element.V/100)
  132. }else if(element.K == 6){//防
  133. data.def += Math.floor(data.def*element.V/100)
  134. }else if(element.K == 7){//血
  135. data.hp += Math.floor(data.hp*element.V/100)
  136. }else if(element.K == 8){//速
  137. data.sp += Math.floor(data.sp*element.V/100)
  138. }
  139. }
  140. //神卡增加属性
  141. let godCard = main.player.godCard
  142. for (const id in godCard) {
  143. let godCardAttr:GodCardAttr = godCard[id]
  144. let __godCard = main.sManage.getGodCardById(godCardAttr.id)
  145. FFCalAttr.addCardAttr(data,__godCard)
  146. if(godCardAttr.level > 0){
  147. let tmp = __godCard.list[godCardAttr.level-1]
  148. FFCalAttr.addCardAttr(data,tmp)
  149. }
  150. if(godCardAttr.reborn > 0){
  151. FFCalAttr.addCardAttr(data,__godCard.godReborn)
  152. }
  153. }
  154. //头像增加属性
  155. let roleIcons = main.player.roleIcon.open
  156. for (let i = 0; i < roleIcons.length; i++) {
  157. const element = roleIcons[i];
  158. let temp = main.sManage.getRoleIconById(element)
  159. data.atk += temp.atk
  160. data.def += temp.def
  161. data.hp += temp.hp
  162. data.sp += temp.sp
  163. }
  164. data.zdl = FFCalAttr.getZdl(data)
  165. if(!data.bullet){
  166. if(roleData.post == 1){
  167. data.bullet = main.sManage.getEquipById(1001).bulletEffect
  168. }else if(roleData.post == 2){
  169. data.bullet = main.sManage.getEquipById(1102).bulletEffect
  170. }else if(roleData.post == 3){
  171. data.bullet = main.sManage.getEquipById(1202).bulletEffect
  172. }
  173. }
  174. return data;
  175. }
  176. private static addCardAttr(data:FFAttr,attr){
  177. data.atk += attr.atk
  178. data.def += attr.def
  179. data.hp += attr.hp
  180. data.sp += attr.sp
  181. data.atk += attr.water
  182. data.def += attr.fire
  183. data.hp += attr.wind
  184. data.sp += attr.thunder
  185. data.sp += attr.earth
  186. }
  187. public static getEquipAttr(main:Main,equip:EquipAttr,equipData:__EquipData):FFAttr{
  188. let data = {
  189. id:0,
  190. type:3,
  191. post:0,
  192. path:null,
  193. atk:equipData.atk,
  194. def:equipData.def,
  195. hp:equipData.hp,
  196. sp:equipData.sp,
  197. water:0,
  198. fire:0,
  199. wind:0,
  200. thunder:0,
  201. earth:0,
  202. sd:0,
  203. weaponSkill:0,
  204. suitId:0,
  205. suitCount:0,
  206. attrs:[],
  207. zdl:0,
  208. skin:'30000',//皮肤
  209. weapon:'',//武器
  210. bullet:null
  211. };
  212. let qhLevel = FFCalAttr.getEquipQH(main,equip,equipData)
  213. if(qhLevel > 0){
  214. let __qhList = main.sManage.getEquipQHByType(equipData)
  215. let _qhAttr1 = __qhList[qhLevel - 1]
  216. data.atk += _qhAttr1.atk
  217. data.def += _qhAttr1.def
  218. data.hp += _qhAttr1.hp
  219. data.sp += _qhAttr1.sp
  220. }
  221. if(equip.star > 0){
  222. data.atk += Math.floor(data.atk*equip.star/10)
  223. data.def += Math.floor(data.def*equip.star/10)
  224. data.hp += Math.floor(data.hp*equip.star/10)
  225. data.sp += Math.floor(data.sp*equip.star/10)
  226. }
  227. //计算附加属性
  228. // if(equip.attr){
  229. // for (let i = 0; i < equip.attr.length; i++) {
  230. // const element = equip.attr[i];
  231. // if(element.K == 1){//攻
  232. // data.atk += Math.floor(data.atk*element.V/100)
  233. // }else if(element.K == 2){//防
  234. // data.def += Math.floor(data.def*element.V/100)
  235. // }else if(element.K == 3){//血
  236. // data.hp += Math.floor(data.hp*element.V/100)
  237. // }else if(element.K == 4){//速
  238. // data.sp += Math.floor(data.sp*element.V/100)
  239. // }else if(element.K == 5){//攻
  240. // data.atk += Math.floor(data.atk*element.V/100)
  241. // }else if(element.K == 6){//防
  242. // data.def += Math.floor(data.def*element.V/100)
  243. // }else if(element.K == 7){//血
  244. // data.hp += Math.floor(data.hp*element.V/100)
  245. // }else if(element.K == 8){//速
  246. // data.sp += Math.floor(data.sp*element.V/100)
  247. // }
  248. // }
  249. // }
  250. data.zdl = FFCalAttr.getZdl(data)
  251. return data
  252. }
  253. public static getZdl(data):number{
  254. return data.atk + data.def + Math.floor(data.hp/10) + data.sp
  255. }
  256. /**
  257. * 计算装备强化等级
  258. */
  259. public static getEquipQH(main:Main,equip:EquipAttr,equipData:__EquipData):number{
  260. if(equipData.type > 4){
  261. return 0
  262. }
  263. let qhList = main.sManage.getEquipQHByType(equipData)
  264. let qhLevel = -1
  265. for (let i = 0; i < qhList.length; i++) {
  266. const element = qhList[i];
  267. if(element.exp > equip.PI){
  268. qhLevel = i
  269. break
  270. }
  271. }
  272. if(qhLevel == -1){
  273. qhLevel = qhList.length
  274. }
  275. let max = equipData.level + equip.qhMax*5
  276. if(qhLevel > max){
  277. qhLevel = max
  278. }
  279. return qhLevel
  280. }
  281. /**
  282. * 计算装备强化等级
  283. */
  284. public static getEquipQHLevel(main:Main,PI:number,equipData:__EquipData):number{
  285. if(equipData.type > 4){
  286. return 0
  287. }
  288. let qhList = main.sManage.getEquipQHByType(equipData)
  289. for (let i = 0; i < qhList.length; i++) {
  290. const element = qhList[i];
  291. if(element.exp > PI){
  292. return i
  293. }
  294. }
  295. return qhList.length
  296. }
  297. /**
  298. * 获取神卡属性
  299. * @param godCardAttr
  300. */
  301. public static getGodCardAttr(main:Main,godCardAttr:GodCardAttr):FFAttr{
  302. let _godCard = main.sManage.getGodCardById(godCardAttr.id)
  303. let data = {
  304. id:0,
  305. type:3,
  306. post:0,
  307. path:null,
  308. atk:_godCard.atk,
  309. def:_godCard.def,
  310. hp:_godCard.hp,
  311. sp:_godCard.sp,
  312. bjgl:0,
  313. water:_godCard.water,
  314. fire:_godCard.fire,
  315. wind:_godCard.wind,
  316. thunder:_godCard.thunder,
  317. earth:_godCard.earth,
  318. sd:0,
  319. weaponSkill:0,
  320. suitId:0,
  321. suitCount:0,
  322. attrs:[],
  323. zdl:0,
  324. skin:'30000',//皮肤
  325. weapon:'',//武器
  326. bullet:null
  327. };
  328. if(godCardAttr.level > 0){
  329. let _godCardLevel = _godCard.list[godCardAttr.level - 1]
  330. data.atk += _godCardLevel.atk
  331. data.def += _godCardLevel.def
  332. data.hp += _godCardLevel.hp
  333. data.sp += _godCardLevel.sp
  334. data.water += _godCardLevel.water
  335. data.fire += _godCardLevel.fire
  336. data.wind += _godCardLevel.wind
  337. data.thunder += _godCardLevel.thunder
  338. data.earth += _godCardLevel.earth
  339. }
  340. if(godCardAttr.reborn > 0){
  341. let rebornData:__GodReborn = _godCard.godReborn
  342. data.atk += rebornData.atk
  343. data.def += rebornData.def
  344. data.hp += rebornData.hp
  345. data.sp += rebornData.sp
  346. data.water += rebornData.water
  347. data.fire += rebornData.fire
  348. data.wind += rebornData.wind
  349. data.thunder += rebornData.thunder
  350. data.earth += rebornData.earth
  351. }
  352. return data
  353. }
  354. }