12121
This commit is contained in:
171
Web/src/utility/FightTool.ts
Normal file
171
Web/src/utility/FightTool.ts
Normal file
@@ -0,0 +1,171 @@
|
||||
interface IUnitFight {
|
||||
atkHarm: number,
|
||||
defHarm: number,
|
||||
stateData: Array<string>,
|
||||
remData: Array<any>,
|
||||
}
|
||||
export class FightTool {
|
||||
public static FightHandle(atkUser: IUserAttr, defUser: IUserAttr): IFightData {
|
||||
let result = 0;
|
||||
let myHarm = 0;
|
||||
let otHarm = 0;
|
||||
let myStateData: Array<string> = [];
|
||||
let myRemData: Array<any> = [];
|
||||
let otStateData: Array<string> = [];
|
||||
let otRemData: Array<any> = [];
|
||||
|
||||
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<string> = [];
|
||||
let remData: Array<any> = [];
|
||||
//闪避处理
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user