From e6eae111f1af96626afc428b3497b887eed55e82 Mon Sep 17 00:00:00 2001 From: mengyxu Date: Wed, 14 May 2025 18:01:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EBUFF=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.新增BUFF类 2.buff相关技能逻辑调整,战斗逻辑调整 3.新增神话装备:龙腾护心镜 --- src/config/equips/neck.ts | 1 + src/config/i18n/zh/euips.ts | 4 +- src/config/i18n/zh/skills.ts | 18 ++++-- src/config/skill/armor.ts | 5 +- src/config/skill/base.ts | 6 +- src/config/skill/buff.ts | 112 +++++++++++++++++++++++++++++++++++ src/config/skill/index.ts | 1 + src/config/skill/neck.ts | 57 +++++++++++------- src/config/skill/ring.ts | 44 +++++--------- src/config/skill/weapon.ts | 3 +- src/tool/caller/battle.ts | 75 ++++++++++++++++++++--- src/views/dungeon/battle.vue | 11 +--- 12 files changed, 259 insertions(+), 78 deletions(-) create mode 100644 src/config/skill/buff.ts diff --git a/src/config/equips/neck.ts b/src/config/equips/neck.ts index 8ee66e0..ccccd4a 100644 --- a/src/config/equips/neck.ts +++ b/src/config/equips/neck.ts @@ -45,6 +45,7 @@ export const neckColorfulCategorys: Categorys[] = [ ], 'ShaYi' ), + new Categorys('longteng', 'neck/龙腾护心镜.png', [{ type: 'hp', valCoefficient: 3 }], 'LongTeng'), ]; export const neckUniqueCategorys: Categorys[] = [ diff --git a/src/config/i18n/zh/euips.ts b/src/config/i18n/zh/euips.ts index 7fac102..cdf2c46 100644 --- a/src/config/i18n/zh/euips.ts +++ b/src/config/i18n/zh/euips.ts @@ -99,14 +99,14 @@ export const neck = { duanji: ['断·极', '若众生都断了情欲,那世间岂不是一色苍凉。'], hushi: ['虎视', '我看见了你,偷丹贼。 ----三仙的丹房'], xuenu: ['血怒', '我们都曾把愤怒埋藏在鲜血里。'], + guiyan: ['鬼眼', '多少楼台平山演,鬼使飞阁绿林空。'], + longteng: ['龙腾护心镜', '腾龙即出,四海来朝。'], chitong: ['赤瞳金玉坠', '传闻为仙族神器。佩戴者回洞悉敌人的弱点。'], fannao: ['百八烦恼珠', '求人不如求己。'], zhuxian: ['诛仙', '原来,神的身体流动的血,都是冷的。'], fodengyou: ['佛灯油', '听说灵山永寂,灯影不摇,我若去了,便叫它风起云动。 ----黄风大圣'], - guiyan: ['鬼眼', '多少楼台平山演,鬼使飞阁绿林空。'], aige: ['姜氏哀歌', '这悲伤的歌声浸透了这条项链,你听。'], limao: ['狸猫内丹', '影中之影,幻中之幻。'], - longteng: ['龙腾护心镜', '腾龙即出,四海来朝。'], lenglong: ['冷龙', '避暑圣物。'], liuli: ['琉璃碎片', '有人在人间寻找了它整整五百年。'], nvwangfeng: ['女王蜂项链', '以毒攻毒,百毒不侵。'], diff --git a/src/config/i18n/zh/skills.ts b/src/config/i18n/zh/skills.ts index 07142cf..7fd4724 100644 --- a/src/config/i18n/zh/skills.ts +++ b/src/config/i18n/zh/skills.ts @@ -1,12 +1,12 @@ export const action = '主动'; export const passive = '被动'; -export const control = ['${0}使用了${1},', '${0}被控制${1}回合', '控制失败', '${0}被控制,无法释放技能,剩余${1}回合']; +export const control = ['${0}使用了${1},', '${0}被控制${1}回合', '控制失败', '${0}被控制,无法释放技能。']; export const crit = ['触发了暴击']; export const attack = ['普通攻击', '伤害倍率100%', '${0}使用了${1}${4},对${2}造成了${3}点伤害']; export const iceBlade = ['冰刃', '暴击时有${0}几率释放冰线冲击,附加${1}%攻击力的伤害和${2}回合冰冻效果。', '触发了冰刃,附加${0}点伤害,冰冻${1}${2}回合']; -export const seeRed = ['见红', '伤害倍率${0}%,冷却${1}回合。']; +export const seeRed = ['见红', '伤害倍率${0}%,并使目标进入${2}回合流血状态,冷却${1}回合。']; export const qici = ['鳍刺', '攻击时有${0}%概率对目标造成流血,持续${1}回合。']; export const bhxdjc = [ @@ -23,18 +23,24 @@ export const duan = ['断', '攻击目标后,若目标血量低于${0}%,则 export const hongyan = ['红眼', '生命低于${0}%时,提高${1}点基础攻击力,且攻击附加${2}%攻击力的伤害。', '血量低于${0}%,触发红眼,附加${1}点伤害。']; export const shayi = [ '杀意', - '攻击时增加一层杀意(提升${0}%基础攻击力),被暴击则减少${1}层,杀意最多叠加${2}层。', + '攻击时增加一层杀意(每层杀意提升${0}%基础攻击力),被暴击则减少${1}层,杀意最多叠加${2}层。', '增加一层杀意,当前${0}层', '被暴击,减少${0}层杀意。', ]; export const numu = ['怒目', '被攻击时提升${0}%基础攻击力,最多叠加${1}层。', '增加一层怒目,当前${0}层']; +export const longteng = ['龙腾护佑', '获得${0}%伤害减免,被攻击时有${1}%概率获得${2}%生命上限的护盾。', '触发龙腾护佑,获得${0}点护盾。']; export const SLWX = ['森罗万象', '增加${0}%攻击加成、伤害加成、暴击率、暴击伤害。']; export const jinggangzhuo = ['金刚琢', '攻击时有${0}%几率使目标进入缴械状态${1}回合。', '触发金刚镯,目标缴械${0}回合']; export const fengxie = ['奉邪', '每次暴击,增加${0}%的暴击伤害,最多叠加${1}层,未暴击时层数清零。', '触发奉邪,当前${0}层。', '奉邪层数清零。']; export const shizhong = ['噬忠', '每次被暴击,增加${0}%的暴击伤害减免,最多叠加${1}层,持续到战斗结束。', '触发噬忠,当前${0}层。']; export const shenshang = ['神赏', '暴击时有${0}%概率恢复自身生命${1}点。', '触发神赏,恢复生命${0}点。']; -export const tongjuefanji = ['痛觉反击', '每次受到暴击时,对目标使用刺痛反击,伤害倍率${0}%。', '触发反击,对${0}造成${1}点伤害。']; +export const tongjuefanji = [ + '痛觉反击', + '每次受到暴击时,对目标使用刺痛反击,伤害倍率${0}%。', + '触发反击,对${0}造成${1}点伤害。', + '${0}被控制,无法释放技能。', +]; export const fate = ['化缘', '副本掉落金币奖励提高${0}%。']; export const vampire = ['汲血', '生命偷取${0}%。', '触发汲血,偷取${0}点生命']; @@ -51,6 +57,10 @@ export const furenpihu = [ '血量低于${0}%,触发白骨夫人的庇护,获得${1}%伤害减免', ]; +export const atkbuff = ['提升${0}点基础攻击力。', '提升${0}%基础攻击力。']; +export const critbuff = ['提升${0}%暴击率。', '提升${0}%暴击伤害。', '提升${0}%暴击减免。', '提升${0}%暴击伤害减免。']; +export const defbuff = ['提升${0}点防御。', '提升${0}%防御。', '获得${0}%伤害减免。']; + //未实装,待补充 export const ruiyayin = ['锐牙印', '攻击时有${0}概率偷取目标${1}%暴击率,持续${2}回合。']; diff --git a/src/config/skill/armor.ts b/src/config/skill/armor.ts index 830e7a0..c35abc5 100644 --- a/src/config/skill/armor.ts +++ b/src/config/skill/armor.ts @@ -16,8 +16,9 @@ export class BHXDJC extends PrePassiveSkill { return owner.attr.curHp / owner.attr.hp < this.hpPercent / 100; } takeEffect(owner: BattleRole, target: BattleRole): void { - owner.shield = Math.ceil((owner.attr.hp * this.shieldPercentOfHp) / 100); - owner.battleLog(replace(t('skill.bhxdjc.2'), [owner.shield])); + const shield = Math.ceil((owner.attr.hp * this.shieldPercentOfHp) / 100); + owner.shield += shield; + owner.battleLog(replace(t('skill.bhxdjc.2'), [shield])); } } //铁壁 diff --git a/src/config/skill/base.ts b/src/config/skill/base.ts index 72c5e4a..b1314aa 100644 --- a/src/config/skill/base.ts +++ b/src/config/skill/base.ts @@ -1,6 +1,7 @@ import { BattleRole, callReducPercent, replace } from '@/tool'; import { type_boss } from '@/config'; import i18n from '../i18n'; +import { ControlAbnormal } from './buff'; const { t } = i18n; export interface Skill { order: number; @@ -139,11 +140,10 @@ export abstract class Control extends ActionSkill { abstract rate: number; abstract bossRate: number; use(owner: BattleRole, target: BattleRole) { - owner.dmg = 0; const rate = target.type == type_boss ? this.bossRate : this.rate; let log = t('skill.control.2'); if (Math.random() < rate / 100) { - target.control = target.control > this.last ? target.control : this.last; + target.putBuff(new ControlAbnormal(this.name, this.last)); log = replace(t('skill.control.1'), [t(target.type), this.last]); } log = log = replace(t('skill.control.0'), [t(owner.type), t('skill.' + this.name + '.0')]) + log; @@ -170,7 +170,7 @@ export class Attack extends ActionSkill { } } } -//主动增益技能(buff) +//主动增益技能 export abstract class BuffSkill extends ActionSkill { abstract last: number; rmdLast = 0; diff --git a/src/config/skill/buff.ts b/src/config/skill/buff.ts new file mode 100644 index 0000000..5410f79 --- /dev/null +++ b/src/config/skill/buff.ts @@ -0,0 +1,112 @@ +import { BattleRole, callDmgReduc, replace } from '@/tool'; +import i18n from '../i18n'; +const { t } = i18n; + +//增益BUFF +export abstract class Buff { + order: number = 1; + type: string = 'buff'; + name: string; + layer: number = 1; + maxLayer: number = 1; + last: number; + + constructor(name: string, last: number, maxLayer?: number) { + this.name = name; + this.last = last; + this.maxLayer = maxLayer || 1; + } + abstract desc(): string; + check(): boolean { + if (this.layer <= 0) { + return false; + } + if (this.last > 0) { + this.last--; + } + return this.last > 0; + } + addLayer(add: number) { + const n = this.layer + add; + if (n > this.maxLayer) { + this.layer = this.maxLayer; + } else if (n < 0) { + this.layer = 0; + } else { + this.layer = n; + } + } + abstract takeEffect(owner: BattleRole): void; +} +//减益BUFF +export abstract class Debuff extends Buff { + type: string = 'debuff'; +} +//异常 +export abstract class Abnormal extends Buff { + type: string = 'abnormal'; +} +//百分比增益BUFF +export abstract class PercentBuff extends Buff { + percent: number; + constructor(name: string, percent: number, last: number, maxLayer?: number) { + super(name, last, maxLayer); + this.percent = percent; + } + abstract desc(): string; + abstract takeEffect(owner: BattleRole): void; +} +//攻击增益BUFF +export class AtkPercentBuff extends PercentBuff { + desc(): string { + return replace(t('skill.atkbuff.1'), [this.percent * this.layer]); + } + takeEffect(owner: BattleRole): void { + owner.extraAttr.baseAtk += (this.percent / 100) * this.layer * owner.attr.baseAtk; + } +} +//爆伤增益BUFF +export class CritDmgBuff extends PercentBuff { + desc(): string { + return replace(t('skill.critbuff.1'), [this.percent * this.layer]); + } + takeEffect(owner: BattleRole): void { + owner.extraAttr.critDmg += this.percent * this.layer; + } +} +//爆伤减免增益BUFF +export class CritDmgReducBuff extends PercentBuff { + desc(): string { + return replace(t('skill.critbuff.3'), [this.percent * this.layer]); + } + takeEffect(owner: BattleRole): void { + owner.extraAttr.critDmgReduc += this.percent * this.layer; + } +} + +//伤害减免增益BUFF +export class DmgReducBuff extends Buff { + dmgReduc: number; + constructor(name: string, dmgReduc: number, last: number, maxLayer?: number) { + super(name, last, maxLayer); + this.dmgReduc = dmgReduc; + } + desc(): string { + return replace(t('skill.defbuff.2'), [this.dmgReduc * this.layer]); + } + takeEffect(owner: BattleRole): void { + owner.extraAttr.dmgReduc = callDmgReduc(owner.extraAttr.dmgReduc, this.dmgReduc); + } +} +//控制异常 +export class ControlAbnormal extends Abnormal { + constructor(name: string, last: number) { + super(name, last); + } + desc(): string { + return t('skill.' + this.name + '.0'); + } + takeEffect(owner: BattleRole): void { + owner.action = null; + } +} diff --git a/src/config/skill/index.ts b/src/config/skill/index.ts index 92f2aff..687ef7c 100644 --- a/src/config/skill/index.ts +++ b/src/config/skill/index.ts @@ -6,3 +6,4 @@ export * from './ring'; export * from './jewelry'; export * from './bracers'; export * from './pants'; +export * from './buff'; diff --git a/src/config/skill/neck.ts b/src/config/skill/neck.ts index 120c265..f62969b 100644 --- a/src/config/skill/neck.ts +++ b/src/config/skill/neck.ts @@ -1,6 +1,7 @@ -import { SufPassiveSkill, PassiveSkill, PrePassiveSkill } from './base'; +import { SufPassiveSkill, PassiveSkill, PrePassiveSkill, CounterSkill } from './base'; import i18n from '../i18n'; import { BattleRole, replace } from '@/tool'; +import { AtkPercentBuff, DmgReducBuff } from './buff'; const { t } = i18n; //断 @@ -44,35 +45,34 @@ export class HongYan extends PrePassiveSkill { } } //杀意 -export class ShaYi extends PrePassiveSkill { +export class ShaYi extends SufPassiveSkill { name: string = 'shayi'; atkPercent: number = 3; - layer: number = 0; maxLayer: number = 10; reduc: number = 3; desc(): string { return replace(t('skill.shayi.1'), [this.atkPercent, this.reduc, this.maxLayer]); } trigger(owner: BattleRole, target: BattleRole): boolean { - return true; + return owner.dmg > 0; } takeEffect(owner: BattleRole, target: BattleRole): void { - owner.extraAttr.baseAtk += (this.atkPercent / 100) * this.layer * owner.attr.baseAtk; - } - afterAtk(owner: BattleRole, target: BattleRole): void { - this.layer < this.maxLayer && this.layer++; - owner.battleLog(replace(t('skill.shayi.2'), [this.layer])); + const shayi = new AtkPercentBuff(this.name, this.atkPercent, 9999, this.maxLayer); + owner.putBuff(shayi); + owner.battleLog(replace(t('skill.shayi.2'), [shayi.layer])); } onAtked(owner: BattleRole, target: BattleRole): void { if (target.crit) { - this.layer -= this.reduc; - this.layer < 0 && (this.layer = 0); - owner.battleLog(replace(t('skill.shayi.2'), [this.reduc])); + const shayi = new AtkPercentBuff(this.name, this.atkPercent, 9999, this.maxLayer); + shayi.layer = -1 * this.reduc; + owner.putBuff(shayi); + owner.battleLog(replace(t('skill.shayi.3'), [this.reduc])); } } } + //怒目 -export class NuMu extends PrePassiveSkill { +export class NuMu extends CounterSkill { name: string = 'numu'; atkPercent: number = 3; layer: number = 0; @@ -81,15 +81,32 @@ export class NuMu extends PrePassiveSkill { return replace(t('skill.numu.1'), [this.atkPercent, this.maxLayer]); } trigger(owner: BattleRole, target: BattleRole): boolean { - return true; + return target.dmg > 0; } takeEffect(owner: BattleRole, target: BattleRole): void { - owner.extraAttr.baseAtk += (this.atkPercent / 100) * this.layer * owner.attr.baseAtk; + const numu = new AtkPercentBuff(this.name, this.atkPercent, 9999, this.maxLayer); + owner.putBuff(numu); + owner.battleLog(replace(t('skill.numu.2'), [numu.layer])); } - onAtked(owner: BattleRole, target: BattleRole): void { - if (target.dmg > 0) { - this.layer < this.maxLayer && this.layer++; - owner.battleLog(replace(t('skill.numu.2'), [this.layer])); - } +} +//longteng +export class LongTeng extends CounterSkill { + name: string = 'longteng'; + dmgReduc: number = 8; + rate: number = 8; + shieldPercentOfHp: number = 8; + desc(): string { + return replace(t('skill.longteng.1'), [this.dmgReduc, this.rate, this.shieldPercentOfHp]); + } + beforeBattle(owner: BattleRole, target: BattleRole): void { + owner.putBuff(new DmgReducBuff(this.name, this.dmgReduc, 9999)); + } + trigger(owner: BattleRole, target: BattleRole): boolean { + return target.dmg > 0 && Math.random() < this.rate / 100; + } + takeEffect(owner: BattleRole, target: BattleRole): void { + const shield = Math.ceil((owner.attr.hp * this.shieldPercentOfHp) / 100); + owner.shield += shield; + owner.battleLog(replace(t('skill.longteng.2'), [shield])); } } diff --git a/src/config/skill/ring.ts b/src/config/skill/ring.ts index b82c839..99cf3ef 100644 --- a/src/config/skill/ring.ts +++ b/src/config/skill/ring.ts @@ -1,6 +1,7 @@ import { SufPassiveSkill, PrePassiveSkill, PassiveSkill, CounterSkill } from './base'; import i18n from '../i18n'; import { BattleRole, callDmgPercent, replace } from '@/tool'; +import { ControlAbnormal, CritDmgBuff, CritDmgReducBuff } from './buff'; const { t } = i18n; //森罗万象 @@ -34,13 +35,13 @@ export class JinGangZhuo extends SufPassiveSkill { return Math.random() < this.rate / 100; } takeEffect(owner: BattleRole, target: BattleRole): void { - target.control = target.control > this.last ? target.control : this.last; + target.putBuff(new ControlAbnormal(this.name, this.last)); owner.battleLog(replace(t('skill.jinggangzhuo.2'), [this.last])); } } //奉邪 -export class FengXie extends PassiveSkill { +export class FengXie extends SufPassiveSkill { name: string = 'fengxie'; critDmg: number = 50; layer: number = 0; @@ -48,31 +49,23 @@ export class FengXie extends PassiveSkill { desc(): string { return replace(t('skill.fengxie.1'), [this.critDmg, this.maxLayer]); } - beforeAtk(owner: BattleRole, target: BattleRole): void { - this.takeEffect(owner, target); - } trigger(owner: BattleRole, target: BattleRole): boolean { - return owner.crit; + return owner.dmg > 0; } takeEffect(owner: BattleRole, target: BattleRole): void { - owner.extraAttr.critDmg = this.critDmg * this.layer; - } - afterAtk(owner: BattleRole, target: BattleRole): void { - if (!this.trigger(owner, target)) { - return; - } - if (this.layer < this.maxLayer) { - this.layer++; - owner.battleLog(replace(t('skill.fengxie.2'), [this.layer])); + const fengxie = new CritDmgBuff(this.name, this.critDmg, 9999, this.maxLayer); + if (owner.crit) { + owner.putBuff(fengxie); + owner.battleLog(replace(t('skill.fengxie.2'), [fengxie.layer])); } else { - this.layer = 0; + owner.buff.delete(this.name); owner.battleLog(t('skill.fengxie.3')); } } } //噬忠 -export class ShiZhong extends PassiveSkill { +export class ShiZhong extends CounterSkill { name: string = 'shizhong'; critDmgReduc: number = 50; layer: number = 0; @@ -80,20 +73,13 @@ export class ShiZhong extends PassiveSkill { desc(): string { return replace(t('skill.shizhong.1'), [this.critDmgReduc, this.maxLayer]); } - beforeAtk(owner: BattleRole, target: BattleRole): void { - this.takeEffect(owner, target); - } trigger(owner: BattleRole, target: BattleRole): boolean { return target.crit; } takeEffect(owner: BattleRole, target: BattleRole): void { - owner.extraAttr.critDmgReduc = this.critDmgReduc * this.layer; - } - onAtked(owner: BattleRole, target: BattleRole): void { - if (this.trigger(owner, target)) { - this.layer < this.maxLayer && this.layer++; - owner.battleLog(replace(t('skill.shizhong.2'), [this.layer])); - } + const shizhong = new CritDmgReducBuff(this.name, this.critDmgReduc, 9999, this.maxLayer); + owner.putBuff(shizhong); + owner.battleLog(replace(t('skill.shizhong.2'), [shizhong.layer])); } } @@ -125,8 +111,8 @@ export class TongJueFanJi extends CounterSkill { return target.crit; } takeEffect(owner: BattleRole, target: BattleRole): void { - if (owner.control > 0) { - const log = replace(t('skill.control.3'), [t(owner.type), owner.control]); + if (!owner.action) { + const log = replace(t('skill.tongjuefanji.3'), [t(owner.type)]); owner.battleLog(log); return; } diff --git a/src/config/skill/weapon.ts b/src/config/skill/weapon.ts index f444be7..9340fbf 100644 --- a/src/config/skill/weapon.ts +++ b/src/config/skill/weapon.ts @@ -1,6 +1,7 @@ import { Attack, SufPassiveSkill } from './base'; import i18n from '../i18n'; import { replace, BattleRole } from '@/tool'; +import { ControlAbnormal } from './buff'; const { t } = i18n; export class IceBlade extends SufPassiveSkill { @@ -17,7 +18,7 @@ export class IceBlade extends SufPassiveSkill { takeEffect(owner: BattleRole, target: BattleRole): void { const additional = Math.ceil((owner.atk * this.percent) / 100); target.addHp(-1 * additional); - target.control = target.control > this.last ? target.control : this.last; + target.putBuff(new ControlAbnormal(this.name, this.last)); owner.battleLog(replace(t('skill.iceBlade.2'), [additional, t(target.type), this.last])); } } diff --git a/src/tool/caller/battle.ts b/src/tool/caller/battle.ts index bcb8859..33455ff 100644 --- a/src/tool/caller/battle.ts +++ b/src/tool/caller/battle.ts @@ -9,7 +9,9 @@ export class BattleRole { passives: Skills.Skill[] = new Array(); commit; type: string; - control: number = 0; + buff: Map = new Map(); + debuff: Map = new Map(); + abnormal: Map = new Map(); //临时状态 action: Skills.ActionSkill | null = null; atk: number = 0; @@ -77,6 +79,10 @@ export class BattleRole { this.passives.forEach((skill) => { skill.beforeAtk(this, target); }); + //攻击前计算自身增益buff和异常buff以及目标减益 + this.callBuff(); + this.callAbnormal(); + target.callDebuff(); this.action?.use(this, target); //攻击后触发的被动技能 this.passives.forEach((skill) => { @@ -137,13 +143,6 @@ export class BattleRole { * @returns */ callDmg = (target: BattleRole) => { - //被控制时无法攻击 - if (this.control > 0) { - const log = replace(t('skill.control.3'), [t(this.type), this.control]); - this.battleLog(log); - this.control--; - return; - } const attr = this.attr; const extra = this.extraAttr; const baseAtk = attr.baseAtk + extra.baseAtk; //基础攻击 @@ -155,7 +154,7 @@ export class BattleRole { this.crit = Math.random() < crit / 100; if (this.crit) { let critDmg = attr.critDmg + extra.critDmg - target.attr.critDmgReduc - target.extraAttr.critDmg; //目标最终承受暴击伤害 - critDmg < 100 ? 100 : critDmg; //暴击伤害不低于100% + critDmg = critDmg < 100 ? 100 : critDmg; //暴击伤害不低于100% this.baseDmg *= critDmg / 100; //暴击时目标承受伤害 } const reducPercent = callReducPercent(target.attr.def + target.extraAttr.def, target.attr.lv); //目标防御提供的减伤比例 @@ -163,9 +162,53 @@ export class BattleRole { const takeDmgPercent = (1 - reducPercent) * (1 - dmgReduc / 100); //目标承受伤害比例 const bloc = target.attr.bloc + target.extraAttr.bloc; //目标格挡值 this.dmg = Math.ceil(this.baseDmg * takeDmgPercent - bloc); //目标承受伤害 + this.dmg < 1 && (this.dmg = 1); }; + + putBuff(buff: Skills.Buff) { + const name = buff.name; + const type = buff.type; + const exit: Skills.Buff = this[type].get(name); + this[type].set(name, buff); + if (exit) { + buff.addLayer(exit.layer); + } + } + + callBuff() { + this.buff.forEach((value: Skills.Buff, key: string) => { + value.takeEffect(this); + }); + } + callAbnormal() { + this.abnormal.forEach((value: Skills.Buff, key: string) => { + value.takeEffect(this); + }); + } + callDebuff() { + this.debuff.forEach((value: Skills.Buff, key: string) => { + value.takeEffect(this); + }); + } + checkBuff() { + checkBuf(this.buff); + checkBuf(this.abnormal); + checkBuf(this.debuff); + } } +const checkBuf = (map: Map) => { + const keys: string[] = new Array(); + map.forEach((value: Skills.Buff, key: string, map: Map) => { + if (!value || !value.check()) { + keys.push(key); + } + }); + keys.forEach((key: string) => { + map.delete(key); + }); +}; + export const createBattleRole = (player: Player, monster: Monster, commit) => { const playerRole = new BattleRole(player.attribute, commit, 'player'); const palyerEquips = [player.weapon, player.armor, player.neck, player.ring, player.jewelry, player.pants, player.shoes, player.bracers]; @@ -180,6 +223,20 @@ export const createBattleRole = (player: Player, monster: Monster, commit) => { return { player: playerRole, monster: monsterRole }; }; +export const battleOneBout = (player: BattleRole, monster: BattleRole): boolean => { + player.attack(monster); + if (player.isDeath() || monster.isDeath()) { + return true; + } + monster.attack(player); + if (player.isDeath() || monster.isDeath()) { + return true; + } + player.checkBuff(); + monster.checkBuff(); + return false; +}; + /** * 初始化装备技能 * @param equip 装备 diff --git a/src/views/dungeon/battle.vue b/src/views/dungeon/battle.vue index 1635d32..9339b62 100644 --- a/src/views/dungeon/battle.vue +++ b/src/views/dungeon/battle.vue @@ -17,7 +17,7 @@ import { useStore } from "vuex"; import { computed, nextTick, onMounted, ref, watch } from "vue"; import { useI18n } from "vue3-i18n"; import { dungeon_icon, player_move_time, player_battle_time, difficultys } from "@/config"; -import { createBattleRole, BattleRole, replace } from "@/tool"; +import { createBattleRole, battleOneBout, BattleRole, replace } from "@/tool"; const { t } = useI18n(); const { state, commit, dispatch } = useStore(); @@ -150,13 +150,8 @@ const battleWithMonster = (monster) => { const oneBout = (player: BattleRole, monster: BattleRole, battleTime: number) => { return new Promise((resolve, reject) => { battle.value.timeOut = setTimeout(() => { - player.attack(monster); - if (player.isDeath() || monster.isDeath()) { - resolve(true); - return; - } - monster.attack(player); - if (player.isDeath() || monster.isDeath()) { + const finished = battleOneBout(player, monster); + if (finished) { resolve(true); return; }