| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- 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>(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<string> = 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 };
- }
- }
|