osrs-tools 2.8.1 → 2.9.0
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.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/runescape/model/collection-log/CollectionLog.d.ts +8 -0
- package/dist/runescape/model/collection-log/CollectionLog.d.ts.map +1 -0
- package/dist/runescape/model/collection-log/CollectionLog.js +124 -0
- package/dist/runescape/model/collection-log/CollectionLog.model.d.ts +48 -0
- package/dist/runescape/model/collection-log/CollectionLog.model.d.ts.map +1 -0
- package/dist/runescape/model/collection-log/CollectionLog.model.js +13 -0
- package/dist/runescape/model/collection-log/index.d.ts +4 -0
- package/dist/runescape/model/collection-log/index.d.ts.map +1 -0
- package/dist/runescape/model/collection-log/index.js +2 -0
- package/dist/runescape/model/combat-achievements/CombatAchievement.model.d.ts +37 -0
- package/dist/runescape/model/combat-achievements/CombatAchievement.model.d.ts.map +1 -0
- package/dist/runescape/model/combat-achievements/CombatAchievement.model.js +17 -0
- package/dist/runescape/model/combat-achievements/CombatAchievements.d.ts +8 -0
- package/dist/runescape/model/combat-achievements/CombatAchievements.d.ts.map +1 -0
- package/dist/runescape/model/combat-achievements/CombatAchievements.js +80 -0
- package/dist/runescape/model/combat-achievements/index.d.ts +4 -0
- package/dist/runescape/model/combat-achievements/index.d.ts.map +1 -0
- package/dist/runescape/model/combat-achievements/index.js +2 -0
- package/dist/runescape/model/guilds/HunterGuild.d.ts +18 -0
- package/dist/runescape/model/guilds/HunterGuild.d.ts.map +1 -0
- package/dist/runescape/model/guilds/HunterGuild.js +65 -0
- package/dist/runescape/model/guilds/HunterGuildMaster.d.ts +29 -0
- package/dist/runescape/model/guilds/HunterGuildMaster.d.ts.map +1 -0
- package/dist/runescape/model/guilds/HunterGuildMaster.js +39 -0
- package/dist/runescape/model/guilds/HunterGuildProgress.d.ts +12 -0
- package/dist/runescape/model/guilds/HunterGuildProgress.d.ts.map +1 -0
- package/dist/runescape/model/guilds/HunterGuildProgress.js +27 -0
- package/dist/runescape/model/guilds/HunterRumour.d.ts +23 -0
- package/dist/runescape/model/guilds/HunterRumour.d.ts.map +1 -0
- package/dist/runescape/model/guilds/HunterRumour.js +43 -0
- package/dist/runescape/model/guilds/RumourLocation.d.ts +10 -0
- package/dist/runescape/model/guilds/RumourLocation.d.ts.map +1 -0
- package/dist/runescape/model/guilds/RumourLocation.js +12 -0
- package/dist/runescape/model/guilds/Rumours.d.ts +3 -0
- package/dist/runescape/model/guilds/Rumours.d.ts.map +1 -0
- package/dist/runescape/model/guilds/Rumours.js +303 -0
- package/dist/runescape/model/guilds/hunter/HunterGuild.d.ts +33 -0
- package/dist/runescape/model/guilds/hunter/HunterGuild.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/HunterGuild.js +107 -0
- package/dist/runescape/model/guilds/hunter/HunterGuildMaster.d.ts +52 -0
- package/dist/runescape/model/guilds/hunter/HunterGuildMaster.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/HunterGuildMaster.js +71 -0
- package/dist/runescape/model/guilds/hunter/HunterGuildMasterName.d.ts +21 -0
- package/dist/runescape/model/guilds/hunter/HunterGuildMasterName.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/HunterGuildMasterName.js +8 -0
- package/dist/runescape/model/guilds/hunter/HunterRumour.d.ts +33 -0
- package/dist/runescape/model/guilds/hunter/HunterRumour.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/HunterRumour.js +52 -0
- package/dist/runescape/model/guilds/hunter/RumourLocation.d.ts +48 -0
- package/dist/runescape/model/guilds/hunter/RumourLocation.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/RumourLocation.js +42 -0
- package/dist/runescape/model/guilds/hunter/Rumours.d.ts +11 -0
- package/dist/runescape/model/guilds/hunter/Rumours.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/Rumours.js +325 -0
- package/dist/runescape/model/guilds/hunter/index.d.ts +5 -0
- package/dist/runescape/model/guilds/hunter/index.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/index.js +4 -0
- package/dist/runescape/model/guilds/hunter/types.d.ts +32 -0
- package/dist/runescape/model/guilds/hunter/types.d.ts.map +1 -0
- package/dist/runescape/model/guilds/hunter/types.js +10 -0
- package/dist/runescape/model/guilds/index.d.ts +2 -0
- package/dist/runescape/model/guilds/index.d.ts.map +1 -0
- package/dist/runescape/model/guilds/index.js +1 -0
- package/dist/runescape/model/guilds/types.d.ts +44 -0
- package/dist/runescape/model/guilds/types.d.ts.map +1 -0
- package/dist/runescape/model/guilds/types.js +21 -0
- package/dist/runescape/model/hunter/HunterRumour.d.ts +155 -0
- package/dist/runescape/model/hunter/HunterRumour.d.ts.map +1 -0
- package/dist/runescape/model/hunter/HunterRumour.js +183 -0
- package/dist/runescape/model/hunter/HunterRumours.d.ts +70 -0
- package/dist/runescape/model/hunter/HunterRumours.d.ts.map +1 -0
- package/dist/runescape/model/hunter/HunterRumours.js +346 -0
- package/dist/runescape/model/hunter/index.d.ts +9 -0
- package/dist/runescape/model/hunter/index.d.ts.map +1 -0
- package/dist/runescape/model/hunter/index.js +9 -0
- package/dist/runescape/model/leagues/DemonicPact.d.ts +23 -0
- package/dist/runescape/model/leagues/DemonicPact.d.ts.map +1 -0
- package/dist/runescape/model/leagues/DemonicPact.js +210 -0
- package/dist/runescape/model/leagues/DemonicPact.model.d.ts +103 -0
- package/dist/runescape/model/leagues/DemonicPact.model.d.ts.map +1 -0
- package/dist/runescape/model/leagues/DemonicPact.model.js +17 -0
- package/dist/runescape/model/leagues/DemonicPactClasses.d.ts +539 -0
- package/dist/runescape/model/leagues/DemonicPactClasses.d.ts.map +1 -0
- package/dist/runescape/model/leagues/DemonicPactClasses.js +1085 -0
- package/dist/runescape/model/leagues/DemonicPactPlanningData.d.ts +4 -0
- package/dist/runescape/model/leagues/DemonicPactPlanningData.d.ts.map +1 -0
- package/dist/runescape/model/leagues/DemonicPactPlanningData.js +174 -0
- package/dist/runescape/model/leagues/DemonicPacts.d.ts +4 -0
- package/dist/runescape/model/leagues/DemonicPacts.d.ts.map +1 -0
- package/dist/runescape/model/leagues/DemonicPacts.js +66 -0
- package/dist/runescape/model/leagues/DemonicPactsLeague/DemonicPactsLeagueAreas.d.ts +23 -0
- package/dist/runescape/model/leagues/DemonicPactsLeague/DemonicPactsLeagueAreas.d.ts.map +1 -0
- package/dist/runescape/model/leagues/DemonicPactsLeague/DemonicPactsLeagueAreas.js +442 -0
- package/dist/runescape/model/leagues/LeaguesRegion.model.d.ts +33 -0
- package/dist/runescape/model/leagues/LeaguesRegion.model.d.ts.map +1 -0
- package/dist/runescape/model/leagues/LeaguesRegion.model.js +14 -0
- package/dist/runescape/model/leagues/LeaguesRegions.d.ts +10 -0
- package/dist/runescape/model/leagues/LeaguesRegions.d.ts.map +1 -0
- package/dist/runescape/model/leagues/LeaguesRegions.js +69 -0
- package/dist/runescape/model/leagues/LeaguesRelic.model.d.ts +31 -0
- package/dist/runescape/model/leagues/LeaguesRelic.model.d.ts.map +1 -0
- package/dist/runescape/model/leagues/LeaguesRelic.model.js +11 -0
- package/dist/runescape/model/leagues/LeaguesRelics.d.ts +8 -0
- package/dist/runescape/model/leagues/LeaguesRelics.d.ts.map +1 -0
- package/dist/runescape/model/leagues/LeaguesRelics.js +237 -0
- package/dist/runescape/model/leagues/RagingEchoesLeague/RagingEchoesLeague.d.ts +749 -0
- package/dist/runescape/model/leagues/RagingEchoesLeague/RagingEchoesLeague.d.ts.map +1 -0
- package/dist/runescape/model/leagues/RagingEchoesLeague/RagingEchoesLeague.js +856 -0
- package/dist/runescape/model/leagues/general/Leagues.d.ts +70 -0
- package/dist/runescape/model/leagues/general/Leagues.d.ts.map +1 -0
- package/dist/runescape/model/leagues/general/Leagues.js +141 -0
- package/dist/runescape/model/leagues/index.d.ts +4 -0
- package/dist/runescape/model/leagues/index.d.ts.map +1 -0
- package/dist/runescape/model/leagues/index.js +3 -0
- package/dist/runescape/model/leagues/model.d.ts +32 -0
- package/dist/runescape/model/leagues/model.d.ts.map +1 -0
- package/dist/runescape/model/leagues/model.js +19 -0
- package/dist/runescape/model/skills/Skill.d.ts +22 -0
- package/dist/runescape/model/skills/Skill.d.ts.map +1 -0
- package/dist/runescape/model/skills/Skill.js +1 -0
- package/dist/runescape/model/skills/attack/Attack.d.ts +15 -0
- package/dist/runescape/model/skills/attack/Attack.d.ts.map +1 -0
- package/dist/runescape/model/skills/attack/Attack.js +19 -0
- package/dist/runescape/model/skills/attack/AttackLevelUnlocks.d.ts +6 -0
- package/dist/runescape/model/skills/attack/AttackLevelUnlocks.d.ts.map +1 -0
- package/dist/runescape/model/skills/attack/AttackLevelUnlocks.js +47 -0
- package/dist/runescape/model/skills/attack/index.d.ts +3 -0
- package/dist/runescape/model/skills/attack/index.d.ts.map +1 -0
- package/dist/runescape/model/skills/attack/index.js +2 -0
- package/dist/runescape/model/skills/hunter/Hunter.d.ts +5 -0
- package/dist/runescape/model/skills/hunter/Hunter.d.ts.map +1 -0
- package/dist/runescape/model/skills/hunter/Hunter.js +6 -0
- package/dist/runescape/model/skills/hunter/HunterNpcs.d.ts +1 -0
- package/dist/runescape/model/skills/hunter/HunterNpcs.d.ts.map +1 -0
- package/dist/runescape/model/skills/hunter/HunterNpcs.js +1 -0
- package/dist/runescape/model/skills/hunter/index.d.ts +2 -0
- package/dist/runescape/model/skills/hunter/index.d.ts.map +1 -0
- package/dist/runescape/model/skills/hunter/index.js +1 -0
- package/dist/runescape/model/skills/index.d.ts +3 -0
- package/dist/runescape/model/skills/index.d.ts.map +1 -0
- package/dist/runescape/model/skills/index.js +2 -0
- package/dist/runescape/resources/QuestData.json +5454 -0
- package/dist/runescape/resources/diary/diaries.json +1484 -0
- package/dist/runescape/resources/diary/diariesArray.json +0 -0
- package/dist/runescape/resources/leagues/demonicPacts.leagues7.json +2449 -0
- package/dist/runescape/resources/quest/exp.json +1333 -0
- package/dist/runescape/resources/quest/questData.json +5790 -0
- package/dist/runescape/resources/quest/questDataArray.json +5489 -0
- package/dist/runescape/resources/quest/subquestArray.json +58 -0
- package/dist/runescape/resources/quest/testObj.json +5682 -0
- package/dist/runescape/resources/quest/testarray.json +5589 -0
- package/dist/runescape/resources/quests/CooksAssistant.json +34 -0
- package/dist/runescape/resources/slayer/slayer.json +3581 -0
- package/dist/runescape/resources/slayer/slayerData.json +4431 -0
- package/dist/runescape/resources/slayer/tasks/json/Chaeldar.json +348 -0
- package/dist/runescape/resources/slayer/tasks/json/Duradel.json +541 -0
- package/dist/runescape/resources/slayer/tasks/json/Krystilia.json +2 -0
- package/dist/runescape/resources/slayer/tasks/json/Mazchna.json +379 -0
- package/dist/runescape/resources/slayer/tasks/json/Neive.json +320 -0
- package/dist/runescape/resources/slayer/tasks/json/Spria.json +345 -0
- package/dist/runescape/resources/slayer/tasks/json/Tureal.json +341 -0
- package/dist/runescape/resources/slayer/tasks/json/Vannaka.json +547 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -25,6 +25,9 @@ export * from "./runescape/model/clue/ClueScrollHelper";
|
|
|
25
25
|
export * from "./runescape/model/Item/Item";
|
|
26
26
|
export * from "./runescape/model/Item/models";
|
|
27
27
|
export { SlayerMaster, Task, Assignment, Turael, Spria, Mazchna, Vannaka, Chaeldar, KonarQuoMaten, Nieve, Duradel, Krystilia, SlayerUnlock, SlayerExtend, SlayerBuy, SLAYER_UNLOCKS, SLAYER_EXTENDS, SLAYER_BUYS, SlayerLocation, SlayerBoss, POINTS_TABLE, getMasterByName, getAllMasters, getMastersByMinimumLevel, getMastersByProgression, } from "./runescape/model/slayer";
|
|
28
|
+
export * from "./runescape/model/guilds";
|
|
29
|
+
export * from "./runescape/model/leagues";
|
|
30
|
+
export * from "./runescape/model/skills";
|
|
28
31
|
export * from "./runescape/model/Requirement";
|
|
29
32
|
export * from "./runescape/errors";
|
|
30
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yCAAyC,CAAC;AAGxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,KAAK,EACL,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yCAAyC,CAAC;AAGxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,KAAK,EACL,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -28,6 +28,12 @@ export * from "./runescape/model/Item/Item";
|
|
|
28
28
|
export * from "./runescape/model/Item/models";
|
|
29
29
|
// Slayer system (refactored exports)
|
|
30
30
|
export { SlayerMaster, Task, Assignment, Turael, Spria, Mazchna, Vannaka, Chaeldar, KonarQuoMaten, Nieve, Duradel, Krystilia, SlayerUnlock, SlayerExtend, SlayerBuy, SLAYER_UNLOCKS, SLAYER_EXTENDS, SLAYER_BUYS, SlayerLocation, SlayerBoss, POINTS_TABLE, getMasterByName, getAllMasters, getMastersByMinimumLevel, getMastersByProgression, } from "./runescape/model/slayer";
|
|
31
|
+
// Guilds system
|
|
32
|
+
export * from "./runescape/model/guilds";
|
|
33
|
+
// Leagues system
|
|
34
|
+
export * from "./runescape/model/leagues";
|
|
35
|
+
// Skills system
|
|
36
|
+
export * from "./runescape/model/skills";
|
|
31
37
|
// Core requirement types
|
|
32
38
|
export * from "./runescape/model/Requirement";
|
|
33
39
|
export * from "./runescape/errors";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CollectionLogCategory, CollectionLogDataset, CollectionLogEntry, CollectionLogItem, CollectionLogProgressSummary } from "./CollectionLog.model";
|
|
2
|
+
export declare const COLLECTION_LOG_DATASET: CollectionLogDataset;
|
|
3
|
+
export declare function getCollectionLogEntries(dataset?: CollectionLogDataset): CollectionLogEntry[];
|
|
4
|
+
export declare function getCollectionLogEntryById(entryId: string, dataset?: CollectionLogDataset): CollectionLogEntry | undefined;
|
|
5
|
+
export declare function getCollectionLogEntriesByCategory(category: CollectionLogCategory, dataset?: CollectionLogDataset): CollectionLogEntry[];
|
|
6
|
+
export declare function getMissingCollectionLogItems(obtainedItemIds: readonly string[], dataset?: CollectionLogDataset): CollectionLogItem[];
|
|
7
|
+
export declare function calculateCollectionLogProgress(obtainedItemIds: readonly string[], dataset?: CollectionLogDataset): CollectionLogProgressSummary;
|
|
8
|
+
//# sourceMappingURL=CollectionLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionLog.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/collection-log/CollectionLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EAErB,oBAAoB,EACpB,kBAAkB,EAElB,iBAAiB,EACjB,4BAA4B,EAC7B,MAAM,uBAAuB,CAAC;AAwB/B,eAAO,MAAM,sBAAsB,EAAE,oBA2CpC,CAAC;AAWF,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,oBAA6C,GAAG,kBAAkB,EAAE,CAEpH;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,oBAA6C,GACrD,kBAAkB,GAAG,SAAS,CAGhC;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,GAAE,oBAA6C,GACrD,kBAAkB,EAAE,CAEtB;AAED,wBAAgB,4BAA4B,CAC1C,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,OAAO,GAAE,oBAA6C,GACrD,iBAAiB,EAAE,CAKrB;AAoCD,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,OAAO,GAAE,oBAA6C,GACrD,4BAA4B,CAgB9B"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { COLLECTION_LOG_CATEGORIES, CollectionLogCategory, } from "./CollectionLog.model";
|
|
2
|
+
const COLLECTION_LOG_SOURCE = "https://oldschool.runescape.wiki/w/Collection_log";
|
|
3
|
+
const item = (id, name) => ({
|
|
4
|
+
id,
|
|
5
|
+
name,
|
|
6
|
+
wikiUrl: COLLECTION_LOG_SOURCE,
|
|
7
|
+
});
|
|
8
|
+
const entry = (id, name, category, activity, items) => ({
|
|
9
|
+
id,
|
|
10
|
+
name,
|
|
11
|
+
category,
|
|
12
|
+
activity,
|
|
13
|
+
items,
|
|
14
|
+
});
|
|
15
|
+
export const COLLECTION_LOG_DATASET = {
|
|
16
|
+
source: COLLECTION_LOG_SOURCE,
|
|
17
|
+
entries: [
|
|
18
|
+
entry("cl-zulrah", "Zulrah", CollectionLogCategory.Bosses, "Zulrah", [
|
|
19
|
+
item("cl-zulrah-magic-fang", "Magic fang"),
|
|
20
|
+
item("cl-zulrah-serp-visage", "Serpentine visage"),
|
|
21
|
+
item("cl-zulrah-tanz-fang", "Tanzanite fang"),
|
|
22
|
+
item("cl-zulrah-pet", "Pet snakeling"),
|
|
23
|
+
]),
|
|
24
|
+
entry("cl-vorkath", "Vorkath", CollectionLogCategory.Bosses, "Vorkath", [
|
|
25
|
+
item("cl-vorkath-draconic-visage", "Draconic visage"),
|
|
26
|
+
item("cl-vorkath-skeletal-visage", "Skeletal visage"),
|
|
27
|
+
item("cl-vorkath-dragonbone-necklace", "Dragonbone necklace"),
|
|
28
|
+
item("cl-vorkath-head", "Vorkath's head"),
|
|
29
|
+
item("cl-vorkath-pet", "Vorki"),
|
|
30
|
+
]),
|
|
31
|
+
entry("cl-barrows", "Barrows Chests", CollectionLogCategory.Bosses, "Barrows", [
|
|
32
|
+
item("cl-barrows-dharok-helm", "Dharok's helm"),
|
|
33
|
+
item("cl-barrows-karil-top", "Karil's leathertop"),
|
|
34
|
+
item("cl-barrows-ahrim-top", "Ahrim's robetop"),
|
|
35
|
+
item("cl-barrows-guthan-spear", "Guthan's warspear"),
|
|
36
|
+
]),
|
|
37
|
+
entry("cl-cox", "Chambers of Xeric", CollectionLogCategory.Raids, "Chambers of Xeric", [
|
|
38
|
+
item("cl-cox-twisted-bow", "Twisted bow"),
|
|
39
|
+
item("cl-cox-ancestral-top", "Ancestral robe top"),
|
|
40
|
+
item("cl-cox-dex-scroll", "Dexterous prayer scroll"),
|
|
41
|
+
item("cl-cox-kodai-insignia", "Kodai insignia"),
|
|
42
|
+
item("cl-cox-olmlet", "Olmlet"),
|
|
43
|
+
]),
|
|
44
|
+
entry("cl-tob", "Theatre of Blood", CollectionLogCategory.Raids, "Theatre of Blood", [
|
|
45
|
+
item("cl-tob-scythe", "Scythe of vitur"),
|
|
46
|
+
item("cl-tob-rapier", "Ghrazi rapier"),
|
|
47
|
+
item("cl-tob-sanguinesti", "Sanguinesti staff"),
|
|
48
|
+
item("cl-tob-lil-zik", "Lil' zik"),
|
|
49
|
+
]),
|
|
50
|
+
entry("cl-toa", "Tombs of Amascut", CollectionLogCategory.Raids, "Tombs of Amascut", [
|
|
51
|
+
item("cl-toa-shadow", "Tumeken's shadow"),
|
|
52
|
+
item("cl-toa-fang", "Osmumten's fang"),
|
|
53
|
+
item("cl-toa-ward", "Elidinis' ward"),
|
|
54
|
+
item("cl-toa-ics", "Icthlarin's shroud"),
|
|
55
|
+
item("cl-toa-pet", "Tumeken's guardian"),
|
|
56
|
+
]),
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
function normalizeIdSet(itemIds) {
|
|
60
|
+
return new Set(itemIds.map((itemId) => itemId.trim().toLowerCase()));
|
|
61
|
+
}
|
|
62
|
+
function percent(obtained, total) {
|
|
63
|
+
if (total === 0)
|
|
64
|
+
return 0;
|
|
65
|
+
return Number(((obtained / total) * 100).toFixed(2));
|
|
66
|
+
}
|
|
67
|
+
export function getCollectionLogEntries(dataset = COLLECTION_LOG_DATASET) {
|
|
68
|
+
return [...dataset.entries];
|
|
69
|
+
}
|
|
70
|
+
export function getCollectionLogEntryById(entryId, dataset = COLLECTION_LOG_DATASET) {
|
|
71
|
+
const normalizedEntryId = entryId.trim().toLowerCase();
|
|
72
|
+
return dataset.entries.find((logEntry) => logEntry.id.toLowerCase() === normalizedEntryId);
|
|
73
|
+
}
|
|
74
|
+
export function getCollectionLogEntriesByCategory(category, dataset = COLLECTION_LOG_DATASET) {
|
|
75
|
+
return dataset.entries.filter((logEntry) => logEntry.category === category);
|
|
76
|
+
}
|
|
77
|
+
export function getMissingCollectionLogItems(obtainedItemIds, dataset = COLLECTION_LOG_DATASET) {
|
|
78
|
+
const obtainedIds = normalizeIdSet(obtainedItemIds);
|
|
79
|
+
return dataset.entries
|
|
80
|
+
.flatMap((logEntry) => logEntry.items)
|
|
81
|
+
.filter((logItem) => !obtainedIds.has(logItem.id.toLowerCase()));
|
|
82
|
+
}
|
|
83
|
+
function entryProgress(logEntry, obtainedIds) {
|
|
84
|
+
const obtained = logEntry.items.filter((logItem) => obtainedIds.has(logItem.id.toLowerCase())).length;
|
|
85
|
+
const missingItemIds = logEntry.items
|
|
86
|
+
.filter((logItem) => !obtainedIds.has(logItem.id.toLowerCase()))
|
|
87
|
+
.map((logItem) => logItem.id);
|
|
88
|
+
return {
|
|
89
|
+
entryId: logEntry.id,
|
|
90
|
+
entryName: logEntry.name,
|
|
91
|
+
category: logEntry.category,
|
|
92
|
+
total: logEntry.items.length,
|
|
93
|
+
obtained,
|
|
94
|
+
completionPercent: percent(obtained, logEntry.items.length),
|
|
95
|
+
missingItemIds,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function categoryProgress(category, entrySummaries) {
|
|
99
|
+
const categoryEntries = entrySummaries.filter((entrySummary) => entrySummary.category === category);
|
|
100
|
+
const total = categoryEntries.reduce((runningTotal, entrySummary) => runningTotal + entrySummary.total, 0);
|
|
101
|
+
const obtained = categoryEntries.reduce((runningTotal, entrySummary) => runningTotal + entrySummary.obtained, 0);
|
|
102
|
+
return {
|
|
103
|
+
category,
|
|
104
|
+
total,
|
|
105
|
+
obtained,
|
|
106
|
+
completionPercent: percent(obtained, total),
|
|
107
|
+
missingItemIds: categoryEntries.flatMap((entrySummary) => entrySummary.missingItemIds),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function calculateCollectionLogProgress(obtainedItemIds, dataset = COLLECTION_LOG_DATASET) {
|
|
111
|
+
const obtainedIds = normalizeIdSet(obtainedItemIds);
|
|
112
|
+
const byEntry = dataset.entries.map((logEntry) => entryProgress(logEntry, obtainedIds));
|
|
113
|
+
const byCategory = COLLECTION_LOG_CATEGORIES.map((category) => categoryProgress(category, byEntry));
|
|
114
|
+
const total = byEntry.reduce((runningTotal, entrySummary) => runningTotal + entrySummary.total, 0);
|
|
115
|
+
const obtained = byEntry.reduce((runningTotal, entrySummary) => runningTotal + entrySummary.obtained, 0);
|
|
116
|
+
return {
|
|
117
|
+
total,
|
|
118
|
+
obtained,
|
|
119
|
+
completionPercent: percent(obtained, total),
|
|
120
|
+
byEntry,
|
|
121
|
+
byCategory,
|
|
122
|
+
missingItemIds: byEntry.flatMap((entrySummary) => entrySummary.missingItemIds),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export declare enum CollectionLogCategory {
|
|
2
|
+
Bosses = "Bosses",
|
|
3
|
+
Raids = "Raids",
|
|
4
|
+
Minigames = "Minigames",
|
|
5
|
+
Clues = "Clues"
|
|
6
|
+
}
|
|
7
|
+
export interface CollectionLogItem {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
wikiUrl: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CollectionLogEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
category: CollectionLogCategory;
|
|
16
|
+
activity: string;
|
|
17
|
+
items: readonly CollectionLogItem[];
|
|
18
|
+
}
|
|
19
|
+
export interface CollectionLogDataset {
|
|
20
|
+
source: string;
|
|
21
|
+
entries: readonly CollectionLogEntry[];
|
|
22
|
+
}
|
|
23
|
+
export interface CollectionLogEntryProgress {
|
|
24
|
+
entryId: string;
|
|
25
|
+
entryName: string;
|
|
26
|
+
category: CollectionLogCategory;
|
|
27
|
+
total: number;
|
|
28
|
+
obtained: number;
|
|
29
|
+
completionPercent: number;
|
|
30
|
+
missingItemIds: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface CollectionLogCategoryProgress {
|
|
33
|
+
category: CollectionLogCategory;
|
|
34
|
+
total: number;
|
|
35
|
+
obtained: number;
|
|
36
|
+
completionPercent: number;
|
|
37
|
+
missingItemIds: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface CollectionLogProgressSummary {
|
|
40
|
+
total: number;
|
|
41
|
+
obtained: number;
|
|
42
|
+
completionPercent: number;
|
|
43
|
+
byEntry: CollectionLogEntryProgress[];
|
|
44
|
+
byCategory: CollectionLogCategoryProgress[];
|
|
45
|
+
missingItemIds: string[];
|
|
46
|
+
}
|
|
47
|
+
export declare const COLLECTION_LOG_CATEGORIES: readonly CollectionLogCategory[];
|
|
48
|
+
//# sourceMappingURL=CollectionLog.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionLog.model.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/collection-log/CollectionLog.model.ts"],"names":[],"mappings":"AAAA,oBAAY,qBAAqB;IAC/B,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,SAAS,cAAc;IACvB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,UAAU,EAAE,6BAA6B,EAAE,CAAC;IAC5C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,EAAE,SAAS,qBAAqB,EAK5D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export var CollectionLogCategory;
|
|
2
|
+
(function (CollectionLogCategory) {
|
|
3
|
+
CollectionLogCategory["Bosses"] = "Bosses";
|
|
4
|
+
CollectionLogCategory["Raids"] = "Raids";
|
|
5
|
+
CollectionLogCategory["Minigames"] = "Minigames";
|
|
6
|
+
CollectionLogCategory["Clues"] = "Clues";
|
|
7
|
+
})(CollectionLogCategory || (CollectionLogCategory = {}));
|
|
8
|
+
export const COLLECTION_LOG_CATEGORIES = [
|
|
9
|
+
CollectionLogCategory.Bosses,
|
|
10
|
+
CollectionLogCategory.Raids,
|
|
11
|
+
CollectionLogCategory.Minigames,
|
|
12
|
+
CollectionLogCategory.Clues,
|
|
13
|
+
];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { COLLECTION_LOG_CATEGORIES, CollectionLogCategory } from "./CollectionLog.model";
|
|
2
|
+
export type { CollectionLogItem, CollectionLogEntry, CollectionLogDataset, CollectionLogEntryProgress, CollectionLogCategoryProgress, CollectionLogProgressSummary, } from "./CollectionLog.model";
|
|
3
|
+
export { COLLECTION_LOG_DATASET, getCollectionLogEntries, getCollectionLogEntryById, getCollectionLogEntriesByCategory, getMissingCollectionLogItems, calculateCollectionLogProgress, } from "./CollectionLog";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/collection-log/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzF,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iCAAiC,EACjC,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { COLLECTION_LOG_CATEGORIES, CollectionLogCategory } from "./CollectionLog.model";
|
|
2
|
+
export { COLLECTION_LOG_DATASET, getCollectionLogEntries, getCollectionLogEntryById, getCollectionLogEntriesByCategory, getMissingCollectionLogItems, calculateCollectionLogProgress, } from "./CollectionLog";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare enum CombatAchievementTier {
|
|
2
|
+
Easy = "Easy",
|
|
3
|
+
Medium = "Medium",
|
|
4
|
+
Hard = "Hard",
|
|
5
|
+
Elite = "Elite",
|
|
6
|
+
Master = "Master",
|
|
7
|
+
Grandmaster = "Grandmaster"
|
|
8
|
+
}
|
|
9
|
+
export interface CombatAchievementTask {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
tier: CombatAchievementTier;
|
|
13
|
+
activity: string;
|
|
14
|
+
description: string;
|
|
15
|
+
wikiUrl: string;
|
|
16
|
+
requirements?: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
export interface CombatAchievementsDataset {
|
|
19
|
+
seasonLabel: string;
|
|
20
|
+
source: string;
|
|
21
|
+
tasks: readonly CombatAchievementTask[];
|
|
22
|
+
}
|
|
23
|
+
export interface CompletionSummary {
|
|
24
|
+
total: number;
|
|
25
|
+
completed: number;
|
|
26
|
+
completionPercent: number;
|
|
27
|
+
}
|
|
28
|
+
export interface TierProgressSummary extends CompletionSummary {
|
|
29
|
+
tier: CombatAchievementTier;
|
|
30
|
+
missingTaskIds: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface CombatAchievementsProgressSummary extends CompletionSummary {
|
|
33
|
+
byTier: TierProgressSummary[];
|
|
34
|
+
missingTaskIds: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare const COMBAT_ACHIEVEMENT_TIERS: readonly CombatAchievementTier[];
|
|
37
|
+
//# sourceMappingURL=CombatAchievement.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatAchievement.model.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/combat-achievements/CombatAchievement.model.ts"],"names":[],"mappings":"AAAA,oBAAY,qBAAqB;IAC/B,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,WAAW,gBAAgB;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,IAAI,EAAE,qBAAqB,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iCAAkC,SAAQ,iBAAiB;IAC1E,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAO3D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export var CombatAchievementTier;
|
|
2
|
+
(function (CombatAchievementTier) {
|
|
3
|
+
CombatAchievementTier["Easy"] = "Easy";
|
|
4
|
+
CombatAchievementTier["Medium"] = "Medium";
|
|
5
|
+
CombatAchievementTier["Hard"] = "Hard";
|
|
6
|
+
CombatAchievementTier["Elite"] = "Elite";
|
|
7
|
+
CombatAchievementTier["Master"] = "Master";
|
|
8
|
+
CombatAchievementTier["Grandmaster"] = "Grandmaster";
|
|
9
|
+
})(CombatAchievementTier || (CombatAchievementTier = {}));
|
|
10
|
+
export const COMBAT_ACHIEVEMENT_TIERS = [
|
|
11
|
+
CombatAchievementTier.Easy,
|
|
12
|
+
CombatAchievementTier.Medium,
|
|
13
|
+
CombatAchievementTier.Hard,
|
|
14
|
+
CombatAchievementTier.Elite,
|
|
15
|
+
CombatAchievementTier.Master,
|
|
16
|
+
CombatAchievementTier.Grandmaster,
|
|
17
|
+
];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CombatAchievementTask, CombatAchievementsDataset, CombatAchievementsProgressSummary, CombatAchievementTier } from "./CombatAchievement.model";
|
|
2
|
+
export declare const COMBAT_ACHIEVEMENTS_DATASET: CombatAchievementsDataset;
|
|
3
|
+
export declare function getAllCombatAchievementTasks(dataset?: CombatAchievementsDataset): CombatAchievementTask[];
|
|
4
|
+
export declare function getCombatAchievementTaskById(taskId: string, dataset?: CombatAchievementsDataset): CombatAchievementTask | undefined;
|
|
5
|
+
export declare function getCombatAchievementTasksByTier(tier: CombatAchievementTier, dataset?: CombatAchievementsDataset): CombatAchievementTask[];
|
|
6
|
+
export declare function getMissingCombatAchievementTasks(completedTaskIds: readonly string[], dataset?: CombatAchievementsDataset): CombatAchievementTask[];
|
|
7
|
+
export declare function calculateCombatAchievementProgress(completedTaskIds: readonly string[], dataset?: CombatAchievementsDataset): CombatAchievementsProgressSummary;
|
|
8
|
+
//# sourceMappingURL=CombatAchievements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatAchievements.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/combat-achievements/CombatAchievements.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,yBAAyB,EACzB,iCAAiC,EACjC,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AAqBnC,eAAO,MAAM,2BAA2B,EAAE,yBAiBzC,CAAC;AAWF,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,yBAAuD,GAAG,qBAAqB,EAAE,CAEtI;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,yBAAuD,GAC/D,qBAAqB,GAAG,SAAS,CAGnC;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,qBAAqB,EAC3B,OAAO,GAAE,yBAAuD,GAC/D,qBAAqB,EAAE,CAEzB;AAED,wBAAgB,gCAAgC,CAC9C,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,OAAO,GAAE,yBAAuD,GAC/D,qBAAqB,EAAE,CAGzB;AAED,wBAAgB,kCAAkC,CAChD,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,OAAO,GAAE,yBAAuD,GAC/D,iCAAiC,CA+BnC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { COMBAT_ACHIEVEMENT_TIERS, CombatAchievementTier, } from "./CombatAchievement.model";
|
|
2
|
+
const COMBAT_ACHIEVEMENTS_SOURCE = "https://oldschool.runescape.wiki/w/Combat_Achievements";
|
|
3
|
+
const task = (id, name, tier, activity, description, requirements) => ({
|
|
4
|
+
id,
|
|
5
|
+
name,
|
|
6
|
+
tier,
|
|
7
|
+
activity,
|
|
8
|
+
description,
|
|
9
|
+
wikiUrl: COMBAT_ACHIEVEMENTS_SOURCE,
|
|
10
|
+
requirements,
|
|
11
|
+
});
|
|
12
|
+
export const COMBAT_ACHIEVEMENTS_DATASET = {
|
|
13
|
+
seasonLabel: "OSRS Permanent",
|
|
14
|
+
source: COMBAT_ACHIEVEMENTS_SOURCE,
|
|
15
|
+
tasks: [
|
|
16
|
+
task("ca-easy-barrows-brothers", "Barrows Novice", CombatAchievementTier.Easy, "Barrows", "Defeat all six Barrows brothers at least once."),
|
|
17
|
+
task("ca-easy-zulrah-kill", "Snaketamer", CombatAchievementTier.Easy, "Zulrah", "Defeat Zulrah once."),
|
|
18
|
+
task("ca-medium-vorkath-5", "Dragon Hunter", CombatAchievementTier.Medium, "Vorkath", "Defeat Vorkath 5 times."),
|
|
19
|
+
task("ca-medium-gauntlet-complete", "Crystalline Combat", CombatAchievementTier.Medium, "The Gauntlet", "Complete the Gauntlet once."),
|
|
20
|
+
task("ca-hard-cg-complete", "Corrupted Challenger", CombatAchievementTier.Hard, "The Corrupted Gauntlet", "Complete the Corrupted Gauntlet once."),
|
|
21
|
+
task("ca-hard-zulrah-50", "Zulrah Veteran", CombatAchievementTier.Hard, "Zulrah", "Defeat Zulrah 50 times."),
|
|
22
|
+
task("ca-elite-cox-complete", "Xeric's Recruit", CombatAchievementTier.Elite, "Chambers of Xeric", "Complete a Chambers of Xeric raid.", ["Xeric's Talisman or team access"]),
|
|
23
|
+
task("ca-elite-tob-complete", "Theatre Initiate", CombatAchievementTier.Elite, "Theatre of Blood", "Complete a Theatre of Blood raid."),
|
|
24
|
+
task("ca-master-toa-expert", "Expert Invader", CombatAchievementTier.Master, "Tombs of Amascut", "Complete an Expert mode Tombs of Amascut raid.", ["Configured invocation level for Expert mode"]),
|
|
25
|
+
task("ca-master-inferno-complete", "Infernal Conqueror", CombatAchievementTier.Master, "The Inferno", "Complete the Inferno."),
|
|
26
|
+
task("ca-gm-colosseum-sol", "Sunfire Victor", CombatAchievementTier.Grandmaster, "Fortis Colosseum", "Defeat Sol Heredit in the Fortis Colosseum."),
|
|
27
|
+
task("ca-gm-speedrun-toa", "Desert Blitz", CombatAchievementTier.Grandmaster, "Tombs of Amascut", "Complete Tombs of Amascut under a strict speed target.", ["High-end gear and optimized raid route"]),
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
function normalizeIdSet(taskIds) {
|
|
31
|
+
return new Set(taskIds.map((taskId) => taskId.trim().toLowerCase()));
|
|
32
|
+
}
|
|
33
|
+
function percent(completed, total) {
|
|
34
|
+
if (total === 0)
|
|
35
|
+
return 0;
|
|
36
|
+
return Number(((completed / total) * 100).toFixed(2));
|
|
37
|
+
}
|
|
38
|
+
export function getAllCombatAchievementTasks(dataset = COMBAT_ACHIEVEMENTS_DATASET) {
|
|
39
|
+
return [...dataset.tasks];
|
|
40
|
+
}
|
|
41
|
+
export function getCombatAchievementTaskById(taskId, dataset = COMBAT_ACHIEVEMENTS_DATASET) {
|
|
42
|
+
const normalizedTaskId = taskId.trim().toLowerCase();
|
|
43
|
+
return dataset.tasks.find((combatTask) => combatTask.id.toLowerCase() === normalizedTaskId);
|
|
44
|
+
}
|
|
45
|
+
export function getCombatAchievementTasksByTier(tier, dataset = COMBAT_ACHIEVEMENTS_DATASET) {
|
|
46
|
+
return dataset.tasks.filter((combatTask) => combatTask.tier === tier);
|
|
47
|
+
}
|
|
48
|
+
export function getMissingCombatAchievementTasks(completedTaskIds, dataset = COMBAT_ACHIEVEMENTS_DATASET) {
|
|
49
|
+
const completedIds = normalizeIdSet(completedTaskIds);
|
|
50
|
+
return dataset.tasks.filter((combatTask) => !completedIds.has(combatTask.id.toLowerCase()));
|
|
51
|
+
}
|
|
52
|
+
export function calculateCombatAchievementProgress(completedTaskIds, dataset = COMBAT_ACHIEVEMENTS_DATASET) {
|
|
53
|
+
const completedIds = normalizeIdSet(completedTaskIds);
|
|
54
|
+
const byTier = COMBAT_ACHIEVEMENT_TIERS.map((tier) => {
|
|
55
|
+
const tierTasks = getCombatAchievementTasksByTier(tier, dataset);
|
|
56
|
+
const completed = tierTasks.filter((combatTask) => completedIds.has(combatTask.id.toLowerCase())).length;
|
|
57
|
+
const missingTaskIds = tierTasks
|
|
58
|
+
.filter((combatTask) => !completedIds.has(combatTask.id.toLowerCase()))
|
|
59
|
+
.map((combatTask) => combatTask.id);
|
|
60
|
+
return {
|
|
61
|
+
tier,
|
|
62
|
+
total: tierTasks.length,
|
|
63
|
+
completed,
|
|
64
|
+
completionPercent: percent(completed, tierTasks.length),
|
|
65
|
+
missingTaskIds,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
const total = dataset.tasks.length;
|
|
69
|
+
const completed = dataset.tasks.filter((combatTask) => completedIds.has(combatTask.id.toLowerCase())).length;
|
|
70
|
+
const missingTaskIds = dataset.tasks
|
|
71
|
+
.filter((combatTask) => !completedIds.has(combatTask.id.toLowerCase()))
|
|
72
|
+
.map((combatTask) => combatTask.id);
|
|
73
|
+
return {
|
|
74
|
+
total,
|
|
75
|
+
completed,
|
|
76
|
+
completionPercent: percent(completed, total),
|
|
77
|
+
byTier,
|
|
78
|
+
missingTaskIds,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { COMBAT_ACHIEVEMENT_TIERS, CombatAchievementTier } from "./CombatAchievement.model";
|
|
2
|
+
export type { CombatAchievementTask, CombatAchievementsDataset, TierProgressSummary, CompletionSummary, CombatAchievementsProgressSummary, } from "./CombatAchievement.model";
|
|
3
|
+
export { COMBAT_ACHIEVEMENTS_DATASET, getAllCombatAchievementTasks, getCombatAchievementTaskById, getCombatAchievementTasksByTier, getMissingCombatAchievementTasks, calculateCombatAchievementProgress, } from "./CombatAchievements";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/combat-achievements/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC5F,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,iBAAiB,EACjB,iCAAiC,GAClC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { COMBAT_ACHIEVEMENT_TIERS, CombatAchievementTier } from "./CombatAchievement.model";
|
|
2
|
+
export { COMBAT_ACHIEVEMENTS_DATASET, getAllCombatAchievementTasks, getCombatAchievementTaskById, getCombatAchievementTasksByTier, getMissingCombatAchievementTasks, calculateCombatAchievementProgress, } from "./CombatAchievements";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HunterRumourAssignment } from './types';
|
|
2
|
+
import { HunterRumour } from './HunterRumour';
|
|
3
|
+
import { HunterGuildMaster, HunterGuildMasterName } from './HunterGuildMaster';
|
|
4
|
+
import { HunterGuildProgress } from './HunterGuildProgress';
|
|
5
|
+
/**
|
|
6
|
+
* The Hunter Guild module encapsulates all data and logic related to the Hunter Guild, including its masters, rumours, and player progress. It provides methods to retrieve masters and rumours, determine eligibility, and assign rumours to players based on their level, completed quests, and current progress.
|
|
7
|
+
* Note: The rumours are defined in a separate module to avoid circular dependencies, as HunterRumour references HunterGuildMaster and vice versa.
|
|
8
|
+
*/
|
|
9
|
+
export declare const HUNTER_GUILD: {
|
|
10
|
+
wikiUrl: string;
|
|
11
|
+
masters: HunterGuildMaster[];
|
|
12
|
+
getMasterByName(masterName: HunterGuildMasterName): HunterGuildMaster | undefined;
|
|
13
|
+
getAllMasters(): HunterGuildMaster[];
|
|
14
|
+
getRumourById(rumourId: string): HunterRumour | undefined;
|
|
15
|
+
getEligibleRumours(masterName: HunterGuildMasterName, hunterLevel: number, completedQuests?: string[], progress?: HunterGuildProgress): HunterRumour[];
|
|
16
|
+
assignRumour(masterName: HunterGuildMasterName, hunterLevel: number, completedQuests?: string[], progress?: HunterGuildProgress, randomizer?: () => number): HunterRumourAssignment | null;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=HunterGuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HunterGuild.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/guilds/HunterGuild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D;;;GAGG;AACH,eAAO,MAAM,YAAY;;;gCAKK,qBAAqB,GAAG,iBAAiB,GAAG,SAAS;qBAIhE,iBAAiB,EAAE;4BAIZ,MAAM,GAAG,YAAY,GAAG,SAAS;mCAK3C,qBAAqB,eACpB,MAAM,oBACF,MAAM,EAAE,aACf,mBAAmB,GAC5B,YAAY,EAAE;6BA4BH,qBAAqB,eACpB,MAAM,oBACF,MAAM,EAAE,aACf,mBAAmB,eACjB,MAAM,MAAM,GACvB,sBAAsB,GAAG,IAAI;CAoBjC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { HunterGuildMaster } from './HunterGuildMaster';
|
|
2
|
+
import { HunterGuildProgress } from './HunterGuildProgress';
|
|
3
|
+
import { HUNTER_RUMOUR_REGISTRY } from './Rumours';
|
|
4
|
+
const HUNTER_GUILD_MASTERS = [
|
|
5
|
+
new HunterGuildMaster('Gilman', 'Novice', 46),
|
|
6
|
+
new HunterGuildMaster('Cervus', 'Adept', 57),
|
|
7
|
+
new HunterGuildMaster('Ornus', 'Adept', 57),
|
|
8
|
+
new HunterGuildMaster('Aco', 'Expert', 72),
|
|
9
|
+
new HunterGuildMaster('Teco', 'Expert', 72),
|
|
10
|
+
new HunterGuildMaster('Wolf', 'Master', 91, true),
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* The Hunter Guild module encapsulates all data and logic related to the Hunter Guild, including its masters, rumours, and player progress. It provides methods to retrieve masters and rumours, determine eligibility, and assign rumours to players based on their level, completed quests, and current progress.
|
|
14
|
+
* Note: The rumours are defined in a separate module to avoid circular dependencies, as HunterRumour references HunterGuildMaster and vice versa.
|
|
15
|
+
*/
|
|
16
|
+
export const HUNTER_GUILD = {
|
|
17
|
+
wikiUrl: 'https://runescape.wiki/w/Hunter_Guild',
|
|
18
|
+
masters: [...HUNTER_GUILD_MASTERS],
|
|
19
|
+
getMasterByName(masterName) {
|
|
20
|
+
return HUNTER_GUILD_MASTERS.find((master) => master.name === masterName);
|
|
21
|
+
},
|
|
22
|
+
getAllMasters() {
|
|
23
|
+
return [...HUNTER_GUILD_MASTERS];
|
|
24
|
+
},
|
|
25
|
+
getRumourById(rumourId) {
|
|
26
|
+
return HUNTER_RUMOUR_REGISTRY.find((rumour) => rumour.id === rumourId);
|
|
27
|
+
},
|
|
28
|
+
getEligibleRumours(masterName, hunterLevel, completedQuests = [], progress = new HunterGuildProgress()) {
|
|
29
|
+
const master = HUNTER_GUILD_MASTERS.find((entry) => entry.name === masterName);
|
|
30
|
+
if (!master || !master.canAssignAnswers(hunterLevel, completedQuests)) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
return HUNTER_RUMOUR_REGISTRY.filter((rumour) => {
|
|
34
|
+
if (!rumour.canBeAssignedByMaster(masterName)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (!rumour.isEligible(hunterLevel, completedQuests)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (progress.isAssigned(rumour.id)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (!progress.backToBackEnabled && progress.lastCompletedRumourId === rumour.id) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
assignRumour(masterName, hunterLevel, completedQuests = [], progress = new HunterGuildProgress(), randomizer = Math.random) {
|
|
50
|
+
const eligibleRumours = this.getEligibleRumours(masterName, hunterLevel, completedQuests, progress);
|
|
51
|
+
if (eligibleRumours.length === 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const index = Math.floor(randomizer() * eligibleRumours.length);
|
|
55
|
+
const selectedRumour = eligibleRumours[index];
|
|
56
|
+
const assignment = {
|
|
57
|
+
id: `${masterName}-${selectedRumour.id}-${Date.now()}`,
|
|
58
|
+
masterName,
|
|
59
|
+
rumourId: selectedRumour.id,
|
|
60
|
+
assignedAt: new Date(),
|
|
61
|
+
};
|
|
62
|
+
progress.addAssignment(assignment);
|
|
63
|
+
return assignment;
|
|
64
|
+
},
|
|
65
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { HunterRumourTier } from './types';
|
|
2
|
+
export declare const HunterGuildMasterName: {
|
|
3
|
+
readonly GILMAN: "Gilman";
|
|
4
|
+
readonly CERVUS: "Cervus";
|
|
5
|
+
readonly ORNUS: "Ornus";
|
|
6
|
+
readonly ACO: "Aco";
|
|
7
|
+
readonly TECO: "Teco";
|
|
8
|
+
readonly WOLF: "Wolf";
|
|
9
|
+
};
|
|
10
|
+
export type HunterGuildMasterName = typeof HunterGuildMasterName[keyof typeof HunterGuildMasterName];
|
|
11
|
+
/**
|
|
12
|
+
* Represents a Hunter Guild Master, who can assign rumours to players based on their
|
|
13
|
+
* Hunter level,
|
|
14
|
+
* completed quests, and the tier of the rumour.
|
|
15
|
+
* Each master has specific requirements for assigning rumours,
|
|
16
|
+
* and some may require the completion of certain quests (e.g., "At First Light")
|
|
17
|
+
* to unlock higher-tier rumours.
|
|
18
|
+
* The HunterGuildMaster class encapsulates the properties and logic related to each master,
|
|
19
|
+
* allowing for easy retrieval and eligibility checks when assigning rumours to players.
|
|
20
|
+
*/
|
|
21
|
+
export declare class HunterGuildMaster {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly tier: HunterRumourTier;
|
|
24
|
+
readonly minimumLevel: number;
|
|
25
|
+
readonly requiresAtFirstLight: boolean;
|
|
26
|
+
constructor(name: string, tier: HunterRumourTier, minimumLevel: number, requiresAtFirstLight?: boolean);
|
|
27
|
+
canAssignAnswers(hunterLevel: number, completedQuests?: string[]): boolean;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=HunterGuildMaster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HunterGuildMaster.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/guilds/HunterGuildMaster.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAE1C,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC;AAErG;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;gBAGrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,MAAM,EACpB,oBAAoB,UAAQ;IAQ9B,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,GAAE,MAAM,EAAO,GAAG,OAAO;CAW/E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const HunterGuildMasterName = {
|
|
2
|
+
GILMAN: 'Gilman',
|
|
3
|
+
CERVUS: 'Cervus',
|
|
4
|
+
ORNUS: 'Ornus',
|
|
5
|
+
ACO: 'Aco',
|
|
6
|
+
TECO: 'Teco',
|
|
7
|
+
WOLF: 'Wolf',
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Represents a Hunter Guild Master, who can assign rumours to players based on their
|
|
11
|
+
* Hunter level,
|
|
12
|
+
* completed quests, and the tier of the rumour.
|
|
13
|
+
* Each master has specific requirements for assigning rumours,
|
|
14
|
+
* and some may require the completion of certain quests (e.g., "At First Light")
|
|
15
|
+
* to unlock higher-tier rumours.
|
|
16
|
+
* The HunterGuildMaster class encapsulates the properties and logic related to each master,
|
|
17
|
+
* allowing for easy retrieval and eligibility checks when assigning rumours to players.
|
|
18
|
+
*/
|
|
19
|
+
export class HunterGuildMaster {
|
|
20
|
+
name;
|
|
21
|
+
tier;
|
|
22
|
+
minimumLevel;
|
|
23
|
+
requiresAtFirstLight;
|
|
24
|
+
constructor(name, tier, minimumLevel, requiresAtFirstLight = false) {
|
|
25
|
+
this.name = name;
|
|
26
|
+
this.tier = tier;
|
|
27
|
+
this.minimumLevel = minimumLevel;
|
|
28
|
+
this.requiresAtFirstLight = requiresAtFirstLight;
|
|
29
|
+
}
|
|
30
|
+
canAssignAnswers(hunterLevel, completedQuests = []) {
|
|
31
|
+
if (hunterLevel < this.minimumLevel) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (this.requiresAtFirstLight && !completedQuests.includes('At First Light')) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HunterRumourAssignment } from './types';
|
|
2
|
+
export declare class HunterGuildProgress {
|
|
3
|
+
activeAssignments: HunterRumourAssignment[];
|
|
4
|
+
lastCompletedRumourId?: string;
|
|
5
|
+
backToBackEnabled: boolean;
|
|
6
|
+
constructor(activeAssignments?: HunterRumourAssignment[], lastCompletedRumourId?: string, backToBackEnabled?: boolean);
|
|
7
|
+
isAssigned(rumourId: string): boolean;
|
|
8
|
+
addAssignment(assignment: HunterRumourAssignment): void;
|
|
9
|
+
completeRumour(rumourId: string): void;
|
|
10
|
+
clearAssignments(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=HunterGuildProgress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HunterGuildProgress.d.ts","sourceRoot":"","sources":["../../../../source/runescape/model/guilds/HunterGuildProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,qBAAa,mBAAmB;IAC9B,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;IAC5C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;gBAGzB,iBAAiB,GAAE,sBAAsB,EAAO,EAChD,qBAAqB,CAAC,EAAE,MAAM,EAC9B,iBAAiB,UAAQ;IAO3B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,aAAa,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI;IAOvD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKtC,gBAAgB,IAAI,IAAI;CAIzB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class HunterGuildProgress {
|
|
2
|
+
activeAssignments;
|
|
3
|
+
lastCompletedRumourId;
|
|
4
|
+
backToBackEnabled;
|
|
5
|
+
constructor(activeAssignments = [], lastCompletedRumourId, backToBackEnabled = false) {
|
|
6
|
+
this.activeAssignments = [...activeAssignments];
|
|
7
|
+
this.lastCompletedRumourId = lastCompletedRumourId;
|
|
8
|
+
this.backToBackEnabled = backToBackEnabled;
|
|
9
|
+
}
|
|
10
|
+
isAssigned(rumourId) {
|
|
11
|
+
return this.activeAssignments.some((assignment) => assignment.rumourId === rumourId);
|
|
12
|
+
}
|
|
13
|
+
addAssignment(assignment) {
|
|
14
|
+
if (this.isAssigned(assignment.rumourId)) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.activeAssignments.push(assignment);
|
|
18
|
+
}
|
|
19
|
+
completeRumour(rumourId) {
|
|
20
|
+
this.activeAssignments = this.activeAssignments.filter((assignment) => assignment.rumourId !== rumourId);
|
|
21
|
+
this.lastCompletedRumourId = rumourId;
|
|
22
|
+
}
|
|
23
|
+
clearAssignments() {
|
|
24
|
+
this.activeAssignments = [];
|
|
25
|
+
this.lastCompletedRumourId = undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|