/
SimpleMonster.ts
80 lines (74 loc) · 2.28 KB
/
SimpleMonster.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
import { roll } from 'e';
import { MonsterSlayerMaster } from '../meta/monsterData';
import { CustomKillLogic, MonsterKillOptions, MonsterOptions } from '../meta/types';
import {
getAncientShardChanceFromHP,
getBrimKeyChanceFromCBLevel,
getTotemChanceFromHP
} from '../util/util';
import Bank from './Bank';
import LootTable from './LootTable';
import Monster from './Monster';
interface SimpleMonsterOptions extends MonsterOptions {
table?: LootTable;
onTaskTable?: LootTable;
pickpocketTable?: LootTable;
customKillLogic?: CustomKillLogic;
}
export default class SimpleMonster extends Monster {
public table?: LootTable;
public onTaskTable?: LootTable;
public pickpocketTable?: LootTable;
public customKillLogic?: CustomKillLogic;
constructor(options: SimpleMonsterOptions) {
let allItems: number[] = [];
if (options.table) {
allItems = allItems.concat(options.table.allItems);
}
if (options.pickpocketTable) {
allItems = allItems.concat(options.pickpocketTable.allItems);
}
super({ ...options, allItems: allItems });
this.table = options.table;
this.pickpocketTable = options.pickpocketTable;
this.onTaskTable = options.onTaskTable;
this.customKillLogic = options.customKillLogic;
}
public kill(quantity = 1, options: MonsterKillOptions = {}): Bank {
const loot = new Bank();
const canGetKey =
options.onSlayerTask && options.slayerMaster === MonsterSlayerMaster.Konar;
for (let i = 0; i < quantity; i++) {
if (canGetKey) {
if (roll(getBrimKeyChanceFromCBLevel(this.data.combatLevel))) {
loot.add('Brimstone key');
}
}
if (options.inCatacombs) {
if (roll(getAncientShardChanceFromHP(this.data.hitpoints))) {
loot.add('Ancient shard');
}
if (roll(getTotemChanceFromHP(this.data.hitpoints))) {
// Always drop Dark totem base and bot will transmog accordingly.
loot.add('Dark totem base');
}
}
if (options.onSlayerTask) {
if (this.onTaskTable) {
// Roll the monster's "on-task" table.
loot.add(this.onTaskTable.roll());
} else {
// Monster doesn't have a unique on-slayer table
loot.add(this.table.roll());
}
} else {
// Not on slayer task
loot.add(this.table.roll());
}
if (this.customKillLogic) {
this.customKillLogic(options, loot);
}
}
return loot;
}
}