interface IUnitFight { atkHarm: number, defHarm: number, stateData: Array, remData: Array, } export class FightTool { public static FightHandle(atkUser: IUserAttr, defUser: IUserAttr): IFightData { let result = 0; let myHarm = 0; let otHarm = 0; let myStateData: Array = []; let myRemData: Array = []; let otStateData: Array = []; let otRemData: Array = []; var atkHandle = this.UnitFight(atkUser, defUser); myHarm += atkHandle.atkHarm; otHarm += atkHandle.defHarm; otStateData.push(...atkHandle.stateData); otRemData.push(...atkHandle.remData); if (defUser.isSystem == 1) { var defHandle = this.UnitFight(defUser, atkUser); myHarm += defHandle.defHarm; otHarm += defHandle.atkHarm; myStateData.push(...defHandle.stateData); myRemData.push(...defHandle.remData); } return { result, myHarm, otHarm, myStateData, myRemData, otStateData, otRemData }; } private static UnitFight(atkUser: IUserAttr, defUser: IUserAttr): IUnitFight { let atkHarm = 0; let defHarm = 0; let stateData: Array = []; let remData: Array = []; //闪避处理 if (defUser.dodge > 0) { let dodgeRide = defUser.dodge - atkUser.deadly + defUser.deadlyLess; if (dodgeRide > 0) { if (this.randomTrigger(dodgeRide)) { return { atkHarm: 0, defHarm: 0, stateData, remData }; } } } //士气处理 if (atkUser.upMorale > 0) { atkUser.minAtk = atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3); } if (defUser.upBlood > 0) { defUser.defense = defUser.defense * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3); } if (atkUser.minAtk > defUser.defense && defUser.defense > 0) { let harmRide = (atkUser.minAtk - defUser.defense) / defUser.defense; harmRide = harmRide > 1.2 ? 1.2 : harmRide; let fight_Harm = harmRide * atkUser.maxAtk; defHarm += 0 - fight_Harm; } else { defHarm = -1; } //暴击处理 if (atkUser.crit > 0) { if (this.randomTrigger(atkUser.crit)) { defHarm = defHarm * 1.5; } } //处理反弹 if (defUser.rebound > 0) { let reboundRide = defUser.rebound = atkUser.reboundLess; if (reboundRide > 0) { atkHarm = defHarm * reboundRide; } } defHarm += 0 - atkUser.harm_Add;//额外伤害 //连击处理 if (atkUser.atk_Next > 0) { if (this.randomTrigger(atkUser.atk_Next)) { defHarm = defHarm * 1.3; atkHarm = atkHarm * 1.3; } } //免伤处理 if (defUser.noHarm > 0 && defHarm < -1) { defHarm = defHarm * (1 - defUser.noHarm); defHarm = defHarm > 0 ? 0 : defHarm; } //吸血处理 if (defHarm < 0 && atkUser.inBlood > 0) { let inBloodRide = atkUser.inBlood - defUser.punish if (inBloodRide > 0) { atkHarm += (0 - defHarm) * inBloodRide; } } //#region 状态类处理 let slow = atkUser.slow - defUser.slowLess; if (this.randomTrigger(slow)) { stateData.push("Slow"); } let poison = atkUser.poison - defUser.poisonLess; if (this.randomTrigger(poison)) { stateData.push("Poison"); } let curse = atkUser.curse - defUser.curseLess; if (this.randomTrigger(curse)) { stateData.push("Curse"); } let weaken = atkUser.weaken - defUser.weakenLess; if (this.randomTrigger(weaken)) { stateData.push("Weaken"); } let depressed = atkUser.depressed - defUser.depressedLess; if (this.randomTrigger(depressed)) { stateData.push("Depressed"); } let breach = atkUser.breach - defUser.breachLess; if (this.randomTrigger(breach)) { stateData.push("Breach"); } let palsyatk = atkUser.palsyAtk - defUser.palsyAtkLess; if (this.randomTrigger(palsyatk)) { stateData.push("PalsyAtk"); } if (this.randomTrigger(atkUser.del_Fashion)) { if (defUser.code == 'Person') { remData.push({ "code": "Equ", "par": "Fashion", "count": 1 }); } } //#endregion //数值处理 atkHarm = Math.floor(atkHarm); defHarm = Math.floor(defHarm); return { atkHarm, defHarm, stateData, remData }; } private static randomTrigger(rate: number): boolean { // Math.random() 返回 [0,1) 浮点 const rand = Math.random(); return rand < rate; } }