-
Notifications
You must be signed in to change notification settings - Fork 0
/
DmgMagicConstructor.ts
91 lines (83 loc) · 2.61 KB
/
DmgMagicConstructor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import { floatNumber } from '../../utils/floatNumber';
import MiscService from '../MiscService';
import { Magic, MagicArgs } from './MagicConstructor';
import type { BaseNext, DamageType } from './types';
export type DmgMagicNext = BaseNext & {
actionType: 'dmg-magic'
dmg: number;
hp: number;
dmgType: DamageType;
}
export interface DmgMagicArgs extends MagicArgs {
dmgType: DamageType;
}
export interface DmgMagic extends DmgMagicArgs, Magic {
}
/**
* Общий конструктор не длительных магий
*/
export abstract class DmgMagic extends Magic {
status = {
exp: 0,
hit: 0,
};
/**
* Создание магии
*/
constructor({ dmgType, ...magObj }: DmgMagicArgs) {
super(magObj);
this.dmgType = dmgType;
}
/**
* Возвращает шанс прохождения магии
*/
effectVal(): number {
const { initiator, target } = this.params;
const initiatorMagicLvl = initiator.magics[this.name];
let eff = MiscService.dice(this.effect[initiatorMagicLvl - 1]) * initiator.proc;
if (this.dmgType !== 'clear') {
// правим урон от mgp цели и mga кастера
eff = eff * (1 + 0.004 * initiator.stats.val('mga'))
* (1 - 0.002 * target.stats.val('mgp'));
const resist = target.resists[this.dmgType];
if (resist) {
eff *= resist;
}
}
this.status.hit = eff;
return eff;
}
/**
* Функция списывающая с кастера требуемое
* кол-во единиц за использование магии
* Если кастеру хватило mp/en продолжаем,если нет, то возвращаем false
*/
getExp(): void {
const { initiator, target, game } = this.params;
if (game.isPlayersAlly(initiator, target) && !initiator.flags.isGlitched) {
this.status.exp = 0;
} else {
const dmgExp = Math.round(this.status.hit * 8) + this.baseExp;
this.status.exp = dmgExp;
initiator.stats.mode('up', 'exp', dmgExp);
}
}
/**
* Магия прошла удачно
* @param initiator объект персонажаы
* @param target объект цели магии
* @todo тут нужен вывод требуемых параметров
*/
next(): void {
const { game, target } = this.params;
const args: DmgMagicNext = {
...super.getNextArgs(),
actionType: 'dmg-magic',
dmg: floatNumber(this.status.hit),
hp: target.stats.val('hp'),
dmgType: this.dmgType,
};
game.addHistoryDamage(args);
game.battleLog.success(args);
}
}