Battle.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { _decorator, Component } from 'cc';
  2. import { DataSystem } from '../core/data/DataSystem';
  3. import { Utils } from '../core/utils/Utils';
  4. import { ConfigData } from '../data/ConfigData';
  5. import { BattleData, Camp } from './BattleData';
  6. import { BuffData } from './BuffData';
  7. import { HeroData } from './HeroData';
  8. import { HitData } from './HitData';
  9. import { MonsterData } from './MonsterData';
  10. const { ccclass, property } = _decorator;
  11. @ccclass('Battle')
  12. export class Battle extends Component {
  13. private data: BattleData;
  14. onLoad() {
  15. this.data = DataSystem.createData<BattleData>(BattleData);
  16. DataSystem.createData(BuffData);
  17. }
  18. update(dt: number) {
  19. DataSystem.watch(BattleData, "_hitMonster") && this.hitMonster();
  20. DataSystem.watch(BattleData, "_isHeroChange") && this.heroChange();
  21. }
  22. /**当上阵英雄发生改变时 */
  23. private heroChange(): void {
  24. if (this.data._isHeroChange) {
  25. this.data._isHeroChange = false;
  26. let camps = [{ camp: 1, count: 0 }, { camp: 2, count: 0 }, { camp: 3, count: 0 }, { camp: 4, count: 0 }];
  27. for (let i = 1; i <= this.data.heros.size; i++) {
  28. if (this.data.heros.get(i).id) {
  29. let camp = DataSystem.getData(ConfigData)["general"][this.data.heros.get(i).id]["camp"];
  30. camps[camp - 1].count++;
  31. }
  32. }
  33. camps = camps.sort(function (a, b) {
  34. if (a.count > b.count) {
  35. return -1;
  36. } else {
  37. return 1;
  38. }
  39. });
  40. this.data.campsData = camps.concat();
  41. for (let j = 1; j <= this.data.heros.size; j++) {
  42. if (this.data.heros.get(j)._buff) {
  43. this.data.heros.get(j)._buff.removeBuff();
  44. }
  45. }
  46. if (this.data.campsData[0].camp == Camp.shu && this.data.campsData[0].count >= 3) {
  47. for (let i = 1; i <= this.data.heros.size; i++) {
  48. if (this.data.heros.get(i).id && DataSystem.getData(ConfigData)["general"][this.data.heros.get(i).id]["camp"] == Camp.shu) {
  49. let buffID = DataSystem.getData(ConfigData)["fetter"][3]["nation"].split(",")[Camp.shu - 1];
  50. let buff = DataSystem.getData(ConfigData)["buff"][buffID];
  51. this.data.heros.get(i)._addBuff.push(buff);
  52. }
  53. }
  54. }
  55. this.checkFetters();
  56. }
  57. }
  58. /**结算伤害 */
  59. private hitMonster(): void {
  60. let general = DataSystem.getData(ConfigData)["general"];
  61. let monster = DataSystem.getData(ConfigData)["monster"];
  62. let skill = DataSystem.getData(ConfigData)["skill"];
  63. for (let i = 0; i < this.data._hitMonster.length; i++) {
  64. if (this.data && this.data._monsters[this.data._hitMonster[i].target]) {
  65. let from: HeroData = this.data.heros.get(this.data._hitMonster[i].from);
  66. let target: MonsterData = this.data._monsters[this.data._hitMonster[i].target].data;
  67. let hit = new HitData();
  68. //闪避 0 (acc-miss)/10000
  69. let missRandom = Utils.random_both(0, 10000);
  70. if (from.id && missRandom <= (general[from.id]["acc"] + from._dyMiss) - monster[target.id]["miss"]) {
  71. //普攻 (初始攻击+(lv-1)*upRatio[star])*(1+羁绊攻击)*speed *skill。skillValue[random(min,max)]
  72. hit.hit = (general[from.id]["attack"] + (from.lv - 1) * parseInt(general[from.id]["upRatio"].split(",")[from.starLv - 1])) * (1 + from._dyAttack) * general[from.id]["attSpeed"] * (Utils.random_both(parseInt(skill[general[from.id]["skillID"]]["skillValue"].split(",")[0]), parseInt(skill[general[from.id]["skillID"]]["skillValue"].split(",")[1])) / 10000);
  73. //暴击 普攻*1.5 | cri + 羁绊暴击/100000
  74. let criRandom = Utils.random_both(0, 10000);
  75. if (criRandom <= general[from.id]["cri"] + from._dyCri) {
  76. hit.isCri = true;
  77. hit.hit *= 1.5;
  78. }
  79. hit.hit = Math.floor(hit.hit);
  80. this.checkCampSkill(Camp.wu, target);
  81. this.checkCampSkill(Camp.qun, target, hit.hit);
  82. this.checkCampSkill(Camp.wei, from);
  83. hit.from = from.id + "普攻";
  84. if (isNaN(hit.hit)) {
  85. console.error("伤害数值出现NAN!!");
  86. console.error(`公式:(${general[from.id]["attack"]} + ${from.lv} - 1 *${parseInt(general[from.id]["upRatio"].split(",")[from.starLv - 1])}) * (1+${from._dyAttack}) * ${general[from.id]["attSpeed"]} * random(${parseInt(skill[general[from.id]["skillID"]]["skillValue"].split(",")[0])},${parseInt(skill[general[from.id]["skillID"]]["skillValue"].split(",")[1])})/10000`);
  87. }
  88. } else {
  89. hit.isMiss = true;
  90. }
  91. target._hit.push(hit);
  92. }
  93. }
  94. this.data._hitMonster = [];
  95. }
  96. /**检查羁绊加成 */
  97. private checkFetters(): void {
  98. let fetterID = 0;
  99. switch (this.data.campsData[0].count) {
  100. case 2:
  101. fetterID = 1;
  102. break;
  103. case 3:
  104. fetterID = 2;
  105. if (this.data.campsData[1].count == 2) {
  106. fetterID = 3;
  107. }
  108. break;
  109. case 4: case 5:
  110. fetterID = this.data.campsData[0].count;
  111. break;
  112. }
  113. if (fetterID) {
  114. let buffs: Array<string> = DataSystem.getData(ConfigData)["fetter"][fetterID]["activeBuff"].split(",");
  115. for (let j = 0; j < buffs.length; j++) {
  116. let buff = DataSystem.getData(ConfigData)["buff"][buffs[j]];
  117. for (let i = 1; i <= this.data.heros.size; i++) {
  118. if (this.data.heros.get(i).id) {
  119. this.data.heros.get(i)._addBuff.push(buff);
  120. }
  121. }
  122. }
  123. }
  124. }
  125. /**检查阵营技能 */
  126. private checkCampSkill(camp: Camp, target: MonsterData | HeroData, hit?: number): void {
  127. if (this.data.campsData[0].count >= 3 && this.data.campsData[0].camp == camp) {
  128. let buffID = DataSystem.getData(ConfigData)["fetter"][this.data.campsData[0].count]["nation"].split(",")[camp - 1];
  129. let buff = DataSystem.getData(ConfigData)["buff"][buffID];
  130. let random = Utils.random_both(0, 10000);
  131. if (hit) {
  132. buff["hit"] = hit;
  133. }
  134. if (random < buff["rate"]) {
  135. if (target instanceof HeroData) {
  136. if (DataSystem.getData(ConfigData)["general"][target.id]["camp"] == camp) {
  137. target._addBuff.push(buff);
  138. }
  139. } else {
  140. target._addBuff.push(buff);
  141. }
  142. }
  143. }
  144. }
  145. public onBtn(): void {
  146. this.data.useLeaderSkill = { id: 3, lv: 1 };
  147. }
  148. }