From 59484a1a061ddb7a38a9e109713011e7761a3a26 Mon Sep 17 00:00:00 2001 From: kyvg Date: Mon, 26 Feb 2024 18:29:21 +0200 Subject: [PATCH] Refactor Light Shield magic --- .eslintrc.js | 1 + .../Constuructors/DmgMagicConstructor.ts | 5 +- src/arena/LogService/utils/format-message.ts | 2 +- .../__snapshots__/lightShield.test.ts.snap | 16 ++-- src/arena/magics/lightShield.test.ts | 4 +- src/arena/magics/lightShield.ts | 83 +++++++++++-------- 6 files changed, 65 insertions(+), 46 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 614306c..3e9b521 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,6 +27,7 @@ module.exports = { 'no-param-reassign': 0, 'no-underscore-dangle': 0, 'consistent-return': 0, + 'no-use-before-define': 0, camelcase: 0, 'lines-between-class-members': ["error", "always", {exceptAfterSingleLine: true}], 'no-void': ['error', { allowAsStatement: true }], diff --git a/src/arena/Constuructors/DmgMagicConstructor.ts b/src/arena/Constuructors/DmgMagicConstructor.ts index a97d9ec..a9b09c9 100644 --- a/src/arena/Constuructors/DmgMagicConstructor.ts +++ b/src/arena/Constuructors/DmgMagicConstructor.ts @@ -39,9 +39,10 @@ export abstract class DmgMagic extends Magic { } modifyEffect(effect: number, { initiator, target } = this.params): number { + effect = this.applyCasterModifiers(effect, initiator); + effect = this.applyTargetModifiers(effect, target); + if (this.dmgType !== 'clear') { - effect = this.applyCasterModifiers(effect, initiator); - effect = this.applyTargetModifiers(effect, target); effect = this.applyResists(effect, target); } diff --git a/src/arena/LogService/utils/format-message.ts b/src/arena/LogService/utils/format-message.ts index e6c8a81..a4559a7 100644 --- a/src/arena/LogService/utils/format-message.ts +++ b/src/arena/LogService/utils/format-message.ts @@ -14,7 +14,7 @@ export function formatMessage(msgObj: SuccessArgs | FailArgs, depth = 0): string const affects = msgObj.affects.map((msgObj) => formatMessage(msgObj, depth + 1)); - return `${indent}${formatAction(msgObj)}\n${indent}${formatExp(msgObj)}\n${affects.join('\n')}`; + return `${indent}${formatAction(msgObj)}\n${indent}${formatExp(msgObj)}\n\n${affects.join('\n\n')}`; } return formatError(msgObj); diff --git a/src/arena/magics/__snapshots__/lightShield.test.ts.snap b/src/arena/magics/__snapshots__/lightShield.test.ts.snap index b0c1d3b..abc959d 100644 --- a/src/arena/magics/__snapshots__/lightShield.test.ts.snap +++ b/src/arena/magics/__snapshots__/lightShield.test.ts.snap @@ -4,11 +4,13 @@ exports[`lightShield initiator should be hit by light shield 1`] = ` "*asperiores* использовал _Световой щит_ на *asperiores* \\[ 📖6 ] *asperiores* использовал _Световой щит_ на *asperiores* -\\[ 📖6 ] -*alias* рубанул *asperiores* _Эпическим Мечом_ и нанёс *11* урона -\\[ asperiores 👊 💔-11/-3 📖88 ] - *asperiores* сотворил _Световой щит_ на *alias* нанеся 3 урона - \\[ alias 💔-3/5 📖0 ] - *asperiores* сотворил _Световой щит_ на *alias* нанеся 3 урона - \\[ alias 💔-3/2 📖0 ]" +\\[ 📖3 ] +*alias* рубанул *asperiores* _Эпическим Мечом_ и нанёс *10.72* урона +\\[ asperiores 👊 💔-10.72/-2.72 📖86 ] + + *asperiores* сотворил _Световой щит_ на *alias* нанеся 0.32 урона + \\[ alias 💔-0.32/7.68 📖9 ] + + *asperiores* сотворил _Световой щит_ на *alias* нанеся 0.16 урона + \\[ alias 💔-0.16/7.52 📖7 ]" `; diff --git a/src/arena/magics/lightShield.test.ts b/src/arena/magics/lightShield.test.ts index dd885a8..68d4741 100644 --- a/src/arena/magics/lightShield.test.ts +++ b/src/arena/magics/lightShield.test.ts @@ -26,7 +26,7 @@ describe('lightShield', () => { }); beforeEach(() => { - jest.spyOn(global.Math, 'random').mockReturnValue(0.15); + jest.spyOn(global.Math, 'random').mockReturnValue(0.01); }); afterEach(() => { @@ -38,6 +38,8 @@ describe('lightShield', () => { game.players.players[1].proc = 1; lightShield.cast(game.players.players[0], game.players.players[0], game); + game.players.players[0].proc = 0.5; + lightShield.cast(game.players.players[0], game.players.players[0], game); attack.cast(game.players.players[1], game.players.players[0], game); diff --git a/src/arena/magics/lightShield.ts b/src/arena/magics/lightShield.ts index c4db307..a877a9a 100644 --- a/src/arena/magics/lightShield.ts +++ b/src/arena/magics/lightShield.ts @@ -1,30 +1,48 @@ -import type { PostAffect } from '../Constuructors/interfaces/PostAffect'; -import { LongDmgMagic } from '../Constuructors/LongDmgMagicConstructor'; -import type { SuccessArgs } from '../Constuructors/types'; +/* eslint-disable @typescript-eslint/no-use-before-define, max-classes-per-file */ +import { DmgMagic } from '@/arena/Constuructors/DmgMagicConstructor'; +import type { PostAffect } from '@/arena/Constuructors/interfaces/PostAffect'; +import { LongMagic } from '@/arena/Constuructors/LongMagicConstructor'; +import type { MagicArgs } from '@/arena/Constuructors/MagicConstructor'; +import type { SuccessArgs } from '@/arena/Constuructors/types'; +import type GameService from '@/arena/GameService'; +import type { Player } from '@/arena/PlayersService'; + /** * Магический доспех * Основное описание магии общее требование есть в конструкторе */ -class LightShield extends LongDmgMagic implements PostAffect { - constructor() { - super({ - name: 'lightShield', - displayName: 'Световой щит', - desc: 'Возвращает часть физического урона в виде чистого, атакующему цель под действием щита', - cost: 3, - baseExp: 6, - costType: 'mp', - lvl: 1, - orderType: 'team', - aoeType: 'target', - magType: 'good', - chance: [100, 100, 100], - effect: ['1d1', '3d3', '5d5'], - profList: ['m'], - dmgType: 'clear', - }); + +const params = { + name: 'lightShield', + displayName: 'Световой щит', + desc: 'Возвращает часть физического урона в виде чистого, атакующему цель под действием щита', + cost: 3, + baseExp: 6, + costType: 'mp', + lvl: 1, + orderType: 'team', + aoeType: 'target', + magType: 'good', + chance: ['1d80', '1d90', '1d100'], + effect: ['1d1', '3d3', '5d5'], + profList: ['m'], +} satisfies MagicArgs; + +class LightShield extends DmgMagic { + cast(initiator: Player, target: Player, game: GameService): void { + this.params = { initiator, target, game }; + this.run(); + this.getExp(); + this.checkTargetIsDead(); } + run() { + const { target } = this.params; + target.stats.down('hp', this.effectVal()); + } +} + +class LightShieldBuff extends LongMagic implements PostAffect { run() { const { target, initiator } = this.params; target.flags.isLightShielded.push({ initiator: initiator.nick, val: initiator.proc }); @@ -37,22 +55,17 @@ class LightShield extends LongDmgMagic implements PostAffect { postAffect( { initiator, target, game } = this.params, + { effect } = { effect: 0 }, ): void | SuccessArgs | SuccessArgs[] { - return target.flags.isLightShielded.map(() => { - const effect = this.effectVal({ initiator: target, target: initiator, game }); - - initiator.stats.down('hp', effect); - - return super.getSuccessResult({ initiator: target, target: initiator, game }); + return target.flags.isLightShielded.map(({ val }) => { + target.setProc(effect * val * 0.01); + lightShield.cast(target, initiator, game); + return lightShield.getSuccessResult({ initiator: target, target: initiator, game }); }); } - - getSuccessResult({ initiator, target, game } = this.params): SuccessArgs { - return { - ...super.getSuccessResult({ initiator, target, game }), - actionType: 'magic', - }; - } } -export default new LightShield(); +const lightShield = new LightShield({ ...params, dmgType: 'clear' }); +const lightShieldBuff = new LightShieldBuff(params); + +export default lightShieldBuff;