osrs-tools 2.10.0 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +42 -341
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/runescape/model/slayer/core/Mortifier.d.ts +48 -0
  5. package/dist/runescape/model/slayer/core/Mortifier.js +100 -0
  6. package/dist/runescape/model/slayer/core/MortimerSlayerMaster.d.ts +71 -0
  7. package/dist/runescape/model/slayer/core/MortimerSlayerMaster.js +98 -0
  8. package/dist/runescape/model/slayer/core/SlayerMaster.d.ts +6 -1
  9. package/dist/runescape/model/slayer/core/SlayerMaster.js +10 -1
  10. package/dist/runescape/model/slayer/core/index.d.ts +4 -0
  11. package/dist/runescape/model/slayer/core/index.js +2 -0
  12. package/dist/runescape/model/slayer/core/types.d.ts +2 -0
  13. package/dist/runescape/model/slayer/index.d.ts +3 -3
  14. package/dist/runescape/model/slayer/index.js +2 -2
  15. package/dist/runescape/model/slayer/masters/Chaeldar.js +1 -0
  16. package/dist/runescape/model/slayer/masters/Duradel.js +1 -0
  17. package/dist/runescape/model/slayer/masters/KonarQuoMaten.js +1 -0
  18. package/dist/runescape/model/slayer/masters/Krystilia.js +1 -0
  19. package/dist/runescape/model/slayer/masters/Mazchna.js +1 -0
  20. package/dist/runescape/model/slayer/masters/Mortimer.d.ts +21 -0
  21. package/dist/runescape/model/slayer/masters/Mortimer.js +37 -0
  22. package/dist/runescape/model/slayer/masters/Nieve.js +1 -0
  23. package/dist/runescape/model/slayer/masters/Spria.js +1 -0
  24. package/dist/runescape/model/slayer/masters/Turael.js +1 -0
  25. package/dist/runescape/model/slayer/masters/Vannaka.js +1 -0
  26. package/dist/runescape/model/slayer/masters/index.d.ts +2 -0
  27. package/dist/runescape/model/slayer/masters/index.js +2 -0
  28. package/dist/runescape/model/slayer/masters/registry.d.ts +2 -1
  29. package/dist/runescape/model/slayer/masters/registry.js +1 -0
  30. package/dist/runescape/model/slayer/masters.d.ts +1 -1
  31. package/dist/runescape/model/slayer/masters.js +1 -1
  32. package/dist/runescape/model/slayer/task/MortimerTasks.d.ts +14 -0
  33. package/dist/runescape/model/slayer/task/MortimerTasks.js +227 -0
  34. package/dist/runescape/model/slayer/tasks/index.d.ts +1 -0
  35. package/dist/runescape/model/slayer/tasks/index.js +1 -0
  36. package/package.json +1 -1
@@ -0,0 +1,71 @@
1
+ import { Mortifier } from './Mortifier';
2
+ import { SlayerMaster } from './SlayerMaster';
3
+ import { Task } from './Task';
4
+ import { SlayerMasterConfig } from './types';
5
+ /**
6
+ * Configuration for Mortimer, extending the standard SlayerMaster config with the
7
+ * quirks that make him behave differently to every other Slayer Master.
8
+ * Reference: https://oldschool.runescape.wiki/w/Mortimer
9
+ */
10
+ export interface MortimerSlayerMasterConfig extends SlayerMasterConfig {
11
+ /** Slayer points cost to skip a task offer (Mortimer: 100, vs. the usual 30). */
12
+ skipCost?: number;
13
+ /** Number of block slots Mortimer offers (Mortimer: 2, vs. the usual 6/7). */
14
+ blockSlots?: number;
15
+ /** Slayer points cost per block slot (Mortimer: 120). */
16
+ blockSlotCost?: number;
17
+ /** Number of task choices offered before the "Third Task Choice" Mortifier is unlocked. */
18
+ baseTaskChoiceCount?: number;
19
+ /** Number of task choices offered once the "Third Task Choice" Mortifier is unlocked. */
20
+ extendedTaskChoiceCount?: number;
21
+ }
22
+ /**
23
+ * Mortimer - a planned Slayer Master for the upcoming Wyrmscraig island.
24
+ *
25
+ * Unlike other masters, Mortimer:
26
+ * - Offers multiple task choices per visit (2, or 3 after 50 completed tasks) rather than
27
+ * assigning a single task outright.
28
+ * - Only assigns monsters that have a superior variant.
29
+ * - Can assign Venators directly.
30
+ * - Uses the Mortifier system in place of standard Slayer point rewards as the main incentive.
31
+ * - Has a significantly higher skip cost and far fewer, more expensive block slots.
32
+ *
33
+ * NOTE: This content had not been released at time of writing (Player Designed Island
34
+ * Competition submission); values are subject to change.
35
+ */
36
+ declare class MortimerSlayerMaster extends SlayerMaster {
37
+ skipCost: number;
38
+ blockSlots: number;
39
+ blockSlotCost: number;
40
+ baseTaskChoiceCount: number;
41
+ extendedTaskChoiceCount: number;
42
+ constructor(config: MortimerSlayerMasterConfig);
43
+ /**
44
+ * All creatures Mortimer assigns have superior variants - this is his defining trait.
45
+ */
46
+ hasSuperiorVariants(): boolean;
47
+ /**
48
+ * Mortimer is the only Slayer Master who can assign Venators directly.
49
+ */
50
+ assignsVenatorsDirectly(): boolean;
51
+ getSkipCost(): number;
52
+ getBlockSlots(): number;
53
+ getBlockSlotCost(): number;
54
+ /**
55
+ * Get the Mortifiers currently unlocked for a player, based on tasks completed with Mortimer.
56
+ */
57
+ getAvailableMortifiers(completedTasks: number): Mortifier[];
58
+ /**
59
+ * Number of task choices offered on a given visit: 2 by default, 3 once the
60
+ * "Third Task Choice" Mortifier is unlocked at 50 completed tasks.
61
+ */
62
+ getTaskChoiceCount(completedTasks: number): number;
63
+ /**
64
+ * Get a set of distinct, weighted-random task choices for a Mortimer visit.
65
+ * The number of choices scales with completedTasks (see getTaskChoiceCount()).
66
+ * Mortimer never offers the same task twice in a single set of choices.
67
+ * @returns {Task[]} The offered tasks. May be shorter than requested if there aren't enough distinct unblocked tasks.
68
+ */
69
+ getTaskChoices(completedTasks?: number): Task[];
70
+ }
71
+ export { MortimerSlayerMaster };
@@ -0,0 +1,98 @@
1
+ import { getAvailableMortifiers } from './Mortifier';
2
+ import { SlayerMaster } from './SlayerMaster';
3
+ /**
4
+ * Mortimer - a planned Slayer Master for the upcoming Wyrmscraig island.
5
+ *
6
+ * Unlike other masters, Mortimer:
7
+ * - Offers multiple task choices per visit (2, or 3 after 50 completed tasks) rather than
8
+ * assigning a single task outright.
9
+ * - Only assigns monsters that have a superior variant.
10
+ * - Can assign Venators directly.
11
+ * - Uses the Mortifier system in place of standard Slayer point rewards as the main incentive.
12
+ * - Has a significantly higher skip cost and far fewer, more expensive block slots.
13
+ *
14
+ * NOTE: This content had not been released at time of writing (Player Designed Island
15
+ * Competition submission); values are subject to change.
16
+ */
17
+ class MortimerSlayerMaster extends SlayerMaster {
18
+ skipCost;
19
+ blockSlots;
20
+ blockSlotCost;
21
+ baseTaskChoiceCount;
22
+ extendedTaskChoiceCount;
23
+ constructor(config) {
24
+ super(config);
25
+ this.skipCost = config.skipCost ?? 100;
26
+ this.blockSlots = config.blockSlots ?? 2;
27
+ this.blockSlotCost = config.blockSlotCost ?? 120;
28
+ this.baseTaskChoiceCount = config.baseTaskChoiceCount ?? 2;
29
+ this.extendedTaskChoiceCount = config.extendedTaskChoiceCount ?? 3;
30
+ }
31
+ /**
32
+ * All creatures Mortimer assigns have superior variants - this is his defining trait.
33
+ */
34
+ hasSuperiorVariants() {
35
+ return true;
36
+ }
37
+ /**
38
+ * Mortimer is the only Slayer Master who can assign Venators directly.
39
+ */
40
+ assignsVenatorsDirectly() {
41
+ return true;
42
+ }
43
+ getSkipCost() {
44
+ return this.skipCost;
45
+ }
46
+ getBlockSlots() {
47
+ return this.blockSlots;
48
+ }
49
+ getBlockSlotCost() {
50
+ return this.blockSlotCost;
51
+ }
52
+ /**
53
+ * Get the Mortifiers currently unlocked for a player, based on tasks completed with Mortimer.
54
+ */
55
+ getAvailableMortifiers(completedTasks) {
56
+ return getAvailableMortifiers(completedTasks);
57
+ }
58
+ /**
59
+ * Number of task choices offered on a given visit: 2 by default, 3 once the
60
+ * "Third Task Choice" Mortifier is unlocked at 50 completed tasks.
61
+ */
62
+ getTaskChoiceCount(completedTasks) {
63
+ const thirdChoiceUnlocked = this.getAvailableMortifiers(completedTasks).some(mortifier => mortifier.name === 'Third Task Choice');
64
+ return thirdChoiceUnlocked ? this.extendedTaskChoiceCount : this.baseTaskChoiceCount;
65
+ }
66
+ /**
67
+ * Get a set of distinct, weighted-random task choices for a Mortimer visit.
68
+ * The number of choices scales with completedTasks (see getTaskChoiceCount()).
69
+ * Mortimer never offers the same task twice in a single set of choices.
70
+ * @returns {Task[]} The offered tasks. May be shorter than requested if there aren't enough distinct unblocked tasks.
71
+ */
72
+ getTaskChoices(completedTasks = 0) {
73
+ const choiceCount = this.getTaskChoiceCount(completedTasks);
74
+ const remainingTasks = this.getAvailableTasks().slice();
75
+ const choices = [];
76
+ while (choices.length < choiceCount && remainingTasks.length > 0) {
77
+ const totalWeight = remainingTasks.reduce((total, task) => total + (task.weight || 0), 0);
78
+ if (totalWeight <= 0)
79
+ break;
80
+ const randomWeight = Math.random() * totalWeight;
81
+ let cumulativeWeight = 0;
82
+ let selectedIndex = -1;
83
+ for (let i = 0; i < remainingTasks.length; i++) {
84
+ cumulativeWeight += remainingTasks[i].weight || 0;
85
+ if (randomWeight <= cumulativeWeight) {
86
+ selectedIndex = i;
87
+ break;
88
+ }
89
+ }
90
+ if (selectedIndex === -1)
91
+ break;
92
+ choices.push(remainingTasks[selectedIndex]);
93
+ remainingTasks.splice(selectedIndex, 1);
94
+ }
95
+ return choices;
96
+ }
97
+ }
98
+ export { MortimerSlayerMaster };
@@ -15,11 +15,12 @@ declare class SlayerMaster {
15
15
  minimumCombatLevel: number;
16
16
  tasks: Task[];
17
17
  wikiUrl: string;
18
+ imageUrl: string;
18
19
  taskPoints: Record<number, number>;
19
20
  eliteDiaryTaskPoints?: Record<number, number>;
20
21
  blockedTasks: Set<string>;
21
22
  constructor(options: SlayerMasterConfig);
22
- constructor(name: string, tasks: Task[], location: string, levelRequirement: number, url: string, taskPoints: Record<number, number>, eliteDiaryTaskPoints?: Record<number, number>);
23
+ constructor(name: string, tasks: Task[], location: string, levelRequirement: number, url: string, taskPoints: Record<number, number>, eliteDiaryTaskPoints?: Record<number, number>, imageUrl?: string);
23
24
  /**
24
25
  * Calculate the total weight of all tasks assigned to this Slayer Master.
25
26
  * @returns {number} The total weight of all tasks assigned to this Slayer Master.
@@ -43,6 +44,10 @@ declare class SlayerMaster {
43
44
  * Get the wiki URL of the Slayer Master
44
45
  */
45
46
  getWikiUrl(): string;
47
+ /**
48
+ * Get the URL of the Slayer Master's portrait image
49
+ */
50
+ getImageUrl(): string;
46
51
  /**
47
52
  * Get a random task based on the weighting system of the tasks.
48
53
  * Tasks with higher weights have a higher chance of being selected.
@@ -13,11 +13,12 @@ class SlayerMaster {
13
13
  minimumCombatLevel = 0; // Level requirement to access this Slayer Master (optional, can be set later if needed)
14
14
  tasks; // Array of tasks assigned to this Slayer Master. This holds the actual tasks that players can be assigned to kill.
15
15
  wikiUrl = ''; // URL for the Slayer Master (optional, can be set later if needed)
16
+ imageUrl = ''; // URL of the Slayer Master's portrait image, sourced from the OSRS Wiki (optional, can be set later if needed)
16
17
  taskPoints; // Mapping of task intervals to points
17
18
  eliteDiaryTaskPoints; // Mapping of task intervals to points
18
19
  blockedTasks = new Set(); // Names (lowercased) of tasks this master will not assign
19
20
  // Constructor implementation
20
- constructor(nameOrOptions, tasks, location, levelRequirement, url, taskPoints, eliteDiaryTaskPoints) {
21
+ constructor(nameOrOptions, tasks, location, levelRequirement, url, taskPoints, eliteDiaryTaskPoints, imageUrl) {
21
22
  // Handle options object pattern (modern API)
22
23
  if (typeof nameOrOptions === 'object' && !Array.isArray(nameOrOptions)) {
23
24
  const options = nameOrOptions;
@@ -26,6 +27,7 @@ class SlayerMaster {
26
27
  this.location = options.location || '';
27
28
  this.minimumCombatLevel = options.minimumCombatLevel || 0;
28
29
  this.wikiUrl = options.wikiUrl || '';
30
+ this.imageUrl = options.imageUrl || '';
29
31
  this.taskPoints = options.pointsTable || {};
30
32
  this.eliteDiaryTaskPoints = options.eliteDiaryTaskPoints;
31
33
  }
@@ -36,6 +38,7 @@ class SlayerMaster {
36
38
  this.location = location || '';
37
39
  this.minimumCombatLevel = levelRequirement || 0;
38
40
  this.wikiUrl = url || '';
41
+ this.imageUrl = imageUrl || '';
39
42
  this.taskPoints = taskPoints || {};
40
43
  this.eliteDiaryTaskPoints = eliteDiaryTaskPoints;
41
44
  }
@@ -83,6 +86,12 @@ class SlayerMaster {
83
86
  getWikiUrl() {
84
87
  return this.wikiUrl;
85
88
  }
89
+ /**
90
+ * Get the URL of the Slayer Master's portrait image
91
+ */
92
+ getImageUrl() {
93
+ return this.imageUrl;
94
+ }
86
95
  /**
87
96
  * Get a random task based on the weighting system of the tasks.
88
97
  * Tasks with higher weights have a higher chance of being selected.
@@ -3,6 +3,10 @@
3
3
  * Exports the fundamental classes and types for the Slayer system
4
4
  */
5
5
  export { Assignment } from './Assignment';
6
+ export type { MortifierConfig } from './Mortifier';
7
+ export { getAvailableMortifiers, getMortifierByName, Mortifier, MORTIFIERS } from './Mortifier';
8
+ export type { MortimerSlayerMasterConfig } from './MortimerSlayerMaster';
9
+ export { MortimerSlayerMaster } from './MortimerSlayerMaster';
6
10
  export { SlayerMaster } from './SlayerMaster';
7
11
  export type { TaskJson } from './Task';
8
12
  export { Task } from './Task';
@@ -3,6 +3,8 @@
3
3
  * Exports the fundamental classes and types for the Slayer system
4
4
  */
5
5
  export { Assignment } from './Assignment';
6
+ export { getAvailableMortifiers, getMortifierByName, Mortifier, MORTIFIERS } from './Mortifier';
7
+ export { MortimerSlayerMaster } from './MortimerSlayerMaster';
6
8
  export { SlayerMaster } from './SlayerMaster';
7
9
  export { Task } from './Task';
8
10
  export { POINTS_TABLE, SlayerBoss, SlayerLocation, TASK_DEFAULTS } from './types';
@@ -101,6 +101,8 @@ export interface SlayerMasterConfig {
101
101
  name: string;
102
102
  location: string;
103
103
  wikiUrl: string;
104
+ /** URL of the master's portrait image, sourced from the OSRS Wiki. */
105
+ imageUrl?: string;
104
106
  minimumCombatLevel: number;
105
107
  tasks: any[];
106
108
  pointsTable: Record<number, number>;
@@ -3,11 +3,11 @@
3
3
  * Complete slayer system including masters, tasks, rewards, and utilities
4
4
  * Reference: https://oldschool.runescape.wiki/w/Slayer
5
5
  */
6
- export type { SlayerMasterConfig, TaskDefinition, TaskOptions, TaskQuantity } from './core';
7
- export { Assignment, SlayerMaster, Task } from './core';
6
+ export type { MortifierConfig, MortimerSlayerMasterConfig, SlayerMasterConfig, TaskDefinition, TaskOptions, TaskQuantity, } from './core';
7
+ export { Assignment, getAvailableMortifiers, getMortifierByName, Mortifier, MORTIFIERS, MortimerSlayerMaster, SlayerMaster, Task, } from './core';
8
8
  export { POINTS_TABLE, SlayerBoss, SlayerLocation, TASK_DEFAULTS } from './core';
9
9
  export type { SlayerMasterProgression } from './masters';
10
- export { Chaeldar, Duradel, getAllMasters, getMasterByName, getMastersByMinimumLevel, getMastersByProgression, getRandomMasterForLevel, KonarQuoMaten, Krystilia, Mazchna, Nieve, Spria, Turael, Vannaka, } from './masters';
10
+ export { Chaeldar, Duradel, getAllMasters, getMasterByName, getMastersByMinimumLevel, getMastersByProgression, getRandomMasterForLevel, KonarQuoMaten, Krystilia, Mazchna, Mortimer, Nieve, Spria, Turael, Vannaka, } from './masters';
11
11
  export { SlayerBuy, SlayerExtend, SlayerUnlock } from './rewards';
12
12
  export { SLAYER_BUYS, SLAYER_EXTENDS, SLAYER_UNLOCKS } from './rewards';
13
13
  export { calculateBuysCost, calculateUnlocksCost, getBuyByItem, getBuysByCostRange, getBuysByRequirement, getExtendByName, getExtendsForTask, getUnlockByName, getUnlocksByCostRange, } from './rewards';
@@ -3,9 +3,9 @@
3
3
  * Complete slayer system including masters, tasks, rewards, and utilities
4
4
  * Reference: https://oldschool.runescape.wiki/w/Slayer
5
5
  */
6
- export { Assignment, SlayerMaster, Task } from './core';
6
+ export { Assignment, getAvailableMortifiers, getMortifierByName, Mortifier, MORTIFIERS, MortimerSlayerMaster, SlayerMaster, Task, } from './core';
7
7
  export { POINTS_TABLE, SlayerBoss, SlayerLocation, TASK_DEFAULTS } from './core';
8
- export { Chaeldar, Duradel, getAllMasters, getMasterByName, getMastersByMinimumLevel, getMastersByProgression, getRandomMasterForLevel, KonarQuoMaten, Krystilia, Mazchna, Nieve, Spria, Turael, Vannaka, } from './masters';
8
+ export { Chaeldar, Duradel, getAllMasters, getMasterByName, getMastersByMinimumLevel, getMastersByProgression, getRandomMasterForLevel, KonarQuoMaten, Krystilia, Mazchna, Mortimer, Nieve, Spria, Turael, Vannaka, } from './masters';
9
9
  // ===== Rewards =====
10
10
  export { SlayerBuy, SlayerExtend, SlayerUnlock } from './rewards';
11
11
  export { SLAYER_BUYS, SLAYER_EXTENDS, SLAYER_UNLOCKS } from './rewards';
@@ -21,6 +21,7 @@ export const Chaeldar = new SlayerMaster({
21
21
  250: 70,
22
22
  50: 15,
23
23
  },
24
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Chaeldar.png',
24
25
  location: 'Zanaris',
25
26
  minimumCombatLevel: 70,
26
27
  name: 'Chaeldar',
@@ -22,6 +22,7 @@ export const Duradel = new SlayerMaster({
22
22
  250: 75,
23
23
  50: 15, // +25 bonus
24
24
  },
25
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Duradel.png',
25
26
  location: 'Shilo Village',
26
27
  minimumCombatLevel: 50,
27
28
  name: 'Duradel',
@@ -21,6 +21,7 @@ export const KonarQuoMaten = new SlayerMaster({
21
21
  250: 70,
22
22
  50: 15,
23
23
  },
24
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Konar_quo_Maten.png',
24
25
  location: 'Mount Karuulm',
25
26
  minimumCombatLevel: 75,
26
27
  name: 'Konar Quo Maten',
@@ -22,6 +22,7 @@ export const Krystilia = new SlayerMaster({
22
22
  250: 525,
23
23
  50: 225,
24
24
  },
25
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Krystilia.png',
25
26
  location: 'Edgeville',
26
27
  minimumCombatLevel: 1,
27
28
  name: 'Krystilia',
@@ -21,6 +21,7 @@ export const Mazchna = new SlayerMaster({
21
21
  250: 70,
22
22
  50: 15,
23
23
  },
24
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Mazchna.png',
24
25
  location: 'Canifis',
25
26
  minimumCombatLevel: 20,
26
27
  name: 'Mazchna',
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Mortimer - Slayer Master
3
+ * Location: Wyrmscraig
4
+ * Wiki: https://oldschool.runescape.wiki/w/Mortimer
5
+ *
6
+ * NOTE: Mortimer is planned content for the upcoming Wyrmscraig island (Player Designed
7
+ * Island Competition, designed by ScreteMonge) and had not been released at time of writing.
8
+ * Values here reflect the published design and may change before/if this ships live.
9
+ */
10
+ import { MortimerSlayerMaster } from '../core/MortimerSlayerMaster';
11
+ /**
12
+ * Mortimer - Slayer Master of Wyrmscraig
13
+ *
14
+ * Rather than a standard Slayer point table, Mortimer's primary incentive is the Mortifier
15
+ * system (see MortimerSlayerMaster.getAvailableMortifiers()) - though one Mortifier
16
+ * ("Bonus Slayer Points") does award extra Slayer points on top of a task. Every monster he
17
+ * assigns has a superior variant, and he offers 2 task choices per visit (3 once the "Third
18
+ * Task Choice" Mortifier is unlocked at 50 completed tasks), instead of assigning a single task.
19
+ */
20
+ export declare const Mortimer: MortimerSlayerMaster;
21
+ export default Mortimer;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Mortimer - Slayer Master
3
+ * Location: Wyrmscraig
4
+ * Wiki: https://oldschool.runescape.wiki/w/Mortimer
5
+ *
6
+ * NOTE: Mortimer is planned content for the upcoming Wyrmscraig island (Player Designed
7
+ * Island Competition, designed by ScreteMonge) and had not been released at time of writing.
8
+ * Values here reflect the published design and may change before/if this ships live.
9
+ */
10
+ import { MortimerSlayerMaster } from '../core/MortimerSlayerMaster';
11
+ import { mortimerTasks } from '../task/MortimerTasks';
12
+ import { registerMaster } from './registry';
13
+ /**
14
+ * Mortimer - Slayer Master of Wyrmscraig
15
+ *
16
+ * Rather than a standard Slayer point table, Mortimer's primary incentive is the Mortifier
17
+ * system (see MortimerSlayerMaster.getAvailableMortifiers()) - though one Mortifier
18
+ * ("Bonus Slayer Points") does award extra Slayer points on top of a task. Every monster he
19
+ * assigns has a superior variant, and he offers 2 task choices per visit (3 once the "Third
20
+ * Task Choice" Mortifier is unlocked at 50 completed tasks), instead of assigning a single task.
21
+ */
22
+ export const Mortimer = new MortimerSlayerMaster({
23
+ blockSlotCost: 120,
24
+ blockSlots: 2,
25
+ // Mortimer had not been released at time of writing; this is concept art (by Mod Jerv), not an in-game portrait.
26
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Wyrmscraig%20-%20Activities%20%26%20Lock%20In%20Poll%20(5).png',
27
+ location: 'Wyrmscraig',
28
+ minimumCombatLevel: 0,
29
+ name: 'Mortimer',
30
+ pointsTable: {},
31
+ skipCost: 100,
32
+ tasks: mortimerTasks,
33
+ wikiUrl: 'https://oldschool.runescape.wiki/w/Mortimer',
34
+ });
35
+ // Register in the masters registry
36
+ registerMaster(Mortimer);
37
+ export default Mortimer;
@@ -22,6 +22,7 @@ export const Nieve = new SlayerMaster({
22
22
  250: 525,
23
23
  50: 225,
24
24
  },
25
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Nieve.png',
25
26
  location: "Nieve's Cave",
26
27
  minimumCombatLevel: 85,
27
28
  name: 'Nieve',
@@ -21,6 +21,7 @@ export const Spria = new SlayerMaster({
21
21
  250: 70,
22
22
  50: 15,
23
23
  },
24
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Spria.png',
24
25
  location: 'Draynor Village',
25
26
  minimumCombatLevel: 1,
26
27
  name: 'Spria',
@@ -21,6 +21,7 @@ export const Turael = new SlayerMaster({
21
21
  250: 70,
22
22
  50: 15,
23
23
  },
24
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Turael.png',
24
25
  location: 'Burthope',
25
26
  minimumCombatLevel: 1,
26
27
  name: 'Turael',
@@ -21,6 +21,7 @@ export const Vannaka = new SlayerMaster({
21
21
  250: 70,
22
22
  50: 15,
23
23
  },
24
+ imageUrl: 'https://oldschool.runescape.wiki/w/Special:FilePath/Vannaka.png',
24
25
  location: 'Edgeville Dungeon',
25
26
  minimumCombatLevel: 40,
26
27
  name: 'Vannaka',
@@ -11,11 +11,13 @@ import './KonarQuoMaten';
11
11
  import './Nieve';
12
12
  import './Duradel';
13
13
  import './Krystilia';
14
+ import './Mortimer';
14
15
  export { Chaeldar } from './Chaeldar';
15
16
  export { Duradel } from './Duradel';
16
17
  export { KonarQuoMaten } from './KonarQuoMaten';
17
18
  export { Krystilia } from './Krystilia';
18
19
  export { Mazchna } from './Mazchna';
20
+ export { Mortimer } from './Mortimer';
19
21
  export { Nieve } from './Nieve';
20
22
  export { Spria } from './Spria';
21
23
  export { Turael } from './Turael';
@@ -13,6 +13,7 @@ import './KonarQuoMaten'; // Combat 75
13
13
  import './Nieve'; // Combat 85
14
14
  import './Duradel'; // Combat 50 (but elite rewards)
15
15
  import './Krystilia'; // Combat 1 (Wilderness)
16
+ import './Mortimer'; // Wyrmscraig (planned/unreleased)
16
17
  import { initializeMastersRegistry, } from './registry';
17
18
  // Export individual masters
18
19
  export { Chaeldar } from './Chaeldar';
@@ -20,6 +21,7 @@ export { Duradel } from './Duradel';
20
21
  export { KonarQuoMaten } from './KonarQuoMaten';
21
22
  export { Krystilia } from './Krystilia';
22
23
  export { Mazchna } from './Mazchna';
24
+ export { Mortimer } from './Mortimer';
23
25
  export { Nieve } from './Nieve';
24
26
  export { Spria } from './Spria';
25
27
  export { Turael } from './Turael';
@@ -45,5 +45,6 @@ export declare enum SlayerMasterProgression {
45
45
  KONAR = "Konar quo Maten",// Combat 75
46
46
  NIEVE = "Nieve",// Combat 85
47
47
  DURADEL = "Duradel",// Combat 50
48
- KRYSTILIA = "Krystilia"
48
+ KRYSTILIA = "Krystilia",// Combat 1 (Wilderness)
49
+ MORTIMER = "Mortimer"
49
50
  }
@@ -73,4 +73,5 @@ export var SlayerMasterProgression;
73
73
  SlayerMasterProgression["NIEVE"] = "Nieve";
74
74
  SlayerMasterProgression["DURADEL"] = "Duradel";
75
75
  SlayerMasterProgression["KRYSTILIA"] = "Krystilia";
76
+ SlayerMasterProgression["MORTIMER"] = "Mortimer";
76
77
  })(SlayerMasterProgression || (SlayerMasterProgression = {}));
@@ -2,6 +2,6 @@
2
2
  * Slayer Masters Module - Barrel Export
3
3
  * Re-exports all masters and utilities from the masters directory
4
4
  */
5
- export { Chaeldar, Duradel, KonarQuoMaten, Krystilia, Mazchna, Nieve, Spria, Turael, Vannaka } from './masters/index';
5
+ export { Chaeldar, Duradel, KonarQuoMaten, Krystilia, Mazchna, Mortimer, Nieve, Spria, Turael, Vannaka, } from './masters/index';
6
6
  export type { SlayerMasterProgression as SlayerMasterProgressionType } from './masters/registry';
7
7
  export { getAllMasters, getMasterByName, getMastersByMinimumLevel, getMastersByProgression, getRandomMasterForLevel, initializeMastersRegistry, registerMaster, SlayerMasterProgression, } from './masters/registry';
@@ -2,5 +2,5 @@
2
2
  * Slayer Masters Module - Barrel Export
3
3
  * Re-exports all masters and utilities from the masters directory
4
4
  */
5
- export { Chaeldar, Duradel, KonarQuoMaten, Krystilia, Mazchna, Nieve, Spria, Turael, Vannaka } from './masters/index';
5
+ export { Chaeldar, Duradel, KonarQuoMaten, Krystilia, Mazchna, Mortimer, Nieve, Spria, Turael, Vannaka, } from './masters/index';
6
6
  export { getAllMasters, getMasterByName, getMastersByMinimumLevel, getMastersByProgression, getRandomMasterForLevel, initializeMastersRegistry, registerMaster, SlayerMasterProgression, } from './masters/registry';
@@ -0,0 +1,14 @@
1
+ import { Task } from '../core/Task';
2
+ /**
3
+ * Mortimer's task list.
4
+ * Reference: https://oldschool.runescape.wiki/w/Mortimer
5
+ *
6
+ * Every task Mortimer assigns has a superior variant (see MortimerSlayerMaster.hasSuperiorVariants()).
7
+ * Quantities, extended quantities and weights below are taken directly from the Wiki's task table.
8
+ *
9
+ * Gryphons, Custodian stalkers, Venators and Aquanites are Wyrmscraig-exclusive monsters with no
10
+ * established Slayer level requirement at time of writing, so their `requirements` are left empty.
11
+ * This content was planned but not yet released; details are subject to change.
12
+ */
13
+ declare const mortimerTasks: Task[];
14
+ export { mortimerTasks };