import { _decorator, Component } from 'cc'; import { DataSystem } from '../core/data/DataSystem'; import { Utils } from '../core/utils/Utils'; import { ConfigData } from '../data/ConfigData'; import { BattleData, Camp } from './BattleData'; import { BuffData } from './BuffData'; import { HeroData } from './HeroData'; import { HitData } from './HitData'; import { MonsterData } from './MonsterData'; const { ccclass, property } = _decorator; @ccclass('Battle') export class Battle extends Component { private data: BattleData; onLoad() { this.data = DataSystem.createData(BattleData); DataSystem.createData(BuffData); } update(dt: number) { DataSystem.watch(BattleData, "_hitMonster") && this.hitMonster(); DataSystem.watch(BattleData, "_isHeroChange") && this.heroChange(); } /**当上阵英雄发生改变时 */ private heroChange(): void { if (this.data._isHeroChange) { this.data._isHeroChange = false; let camps = [{ camp: 1, count: 0 }, { camp: 2, count: 0 }, { camp: 3, count: 0 }, { camp: 4, count: 0 }]; for (let i = 1; i <= this.data.heros.size; i++) { if (this.data.heros.get(i).id) { let camp = DataSystem.getData(ConfigData)["general"][this.data.heros.get(i).id]["camp"]; camps[camp - 1].count++; } } camps = camps.sort(function (a, b) { if (a.count > b.count) { return -1; } else { return 1; } }); this.data.campsData = camps.concat(); for (let j = 1; j <= this.data.heros.size; j++) { if (this.data.heros.get(j)._buff) { this.data.heros.get(j)._buff.removeBuff(); } } if (this.data.campsData[0].camp == Camp.shu && this.data.campsData[0].count >= 3) { for (let i = 1; i <= this.data.heros.size; i++) { if (this.data.heros.get(i).id && DataSystem.getData(ConfigData)["general"][this.data.heros.get(i).id]["camp"] == Camp.shu) { let buffID = DataSystem.getData(ConfigData)["fetter"][3]["nation"].split(",")[Camp.shu - 1]; let buff = DataSystem.getData(ConfigData)["buff"][buffID]; this.data.heros.get(i)._addBuff.push(buff); } } } this.checkFetters(); } } /**结算伤害 */ private hitMonster(): void { let general = DataSystem.getData(ConfigData)["general"]; let monster = DataSystem.getData(ConfigData)["monster"]; let skill = DataSystem.getData(ConfigData)["skill"]; for (let i = 0; i < this.data._hitMonster.length; i++) { if (this.data && this.data._monsters[this.data._hitMonster[i].target]) { let from: HeroData = this.data.heros.get(this.data._hitMonster[i].from); let target: MonsterData = this.data._monsters[this.data._hitMonster[i].target].data; let hit = new HitData(); //闪避 0 (acc-miss)/10000 let missRandom = Utils.random_both(0, 10000); if (from.id && missRandom <= (general[from.id]["acc"] + from._dyMiss) - monster[target.id]["miss"]) { //普攻 (初始攻击+(lv-1)*upRatio[star])*(1+羁绊攻击)*speed *skill。skillValue[random(min,max)] 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); //暴击 普攻*1.5 | cri + 羁绊暴击/100000 let criRandom = Utils.random_both(0, 10000); if (criRandom <= general[from.id]["cri"] + from._dyCri) { hit.isCri = true; hit.hit *= 1.5; } hit.hit = Math.floor(hit.hit); this.checkCampSkill(Camp.wu, target); this.checkCampSkill(Camp.qun, target, hit.hit); this.checkCampSkill(Camp.wei, from); hit.from = from.id + "普攻"; if (isNaN(hit.hit)) { console.error("伤害数值出现NAN!!"); 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`); } } else { hit.isMiss = true; } target._hit.push(hit); } } this.data._hitMonster = []; } /**检查羁绊加成 */ private checkFetters(): void { let fetterID = 0; switch (this.data.campsData[0].count) { case 2: fetterID = 1; break; case 3: fetterID = 2; if (this.data.campsData[1].count == 2) { fetterID = 3; } break; case 4: case 5: fetterID = this.data.campsData[0].count; break; } if (fetterID) { let buffs: Array = DataSystem.getData(ConfigData)["fetter"][fetterID]["activeBuff"].split(","); for (let j = 0; j < buffs.length; j++) { let buff = DataSystem.getData(ConfigData)["buff"][buffs[j]]; for (let i = 1; i <= this.data.heros.size; i++) { if (this.data.heros.get(i).id) { this.data.heros.get(i)._addBuff.push(buff); } } } } } /**检查阵营技能 */ private checkCampSkill(camp: Camp, target: MonsterData | HeroData, hit?: number): void { if (this.data.campsData[0].count >= 3 && this.data.campsData[0].camp == camp) { let buffID = DataSystem.getData(ConfigData)["fetter"][this.data.campsData[0].count]["nation"].split(",")[camp - 1]; let buff = DataSystem.getData(ConfigData)["buff"][buffID]; let random = Utils.random_both(0, 10000); if (hit) { buff["hit"] = hit; } if (random < buff["rate"]) { if (target instanceof HeroData) { if (DataSystem.getData(ConfigData)["general"][target.id]["camp"] == camp) { target._addBuff.push(buff); } } else { target._addBuff.push(buff); } } } } public onBtn(): void { this.data.useLeaderSkill = { id: 3, lv: 1 }; } }