osrs-tools
Version:
A comprehensive TypeScript library for Old School RuneScape (OSRS) data and utilities, including quest data, skill requirements, and game item information
126 lines (125 loc) • 5.21 kB
JavaScript
import { LevelRequirement, QuestRequirement, ItemRequirement } from "../Requirement";
import { ArdougneDiary as typedArdougneDiary } from "./ardougne/Ardougne";
import { KaramjaDiary as typedKaramjaDiary } from "./karamja/Karamja";
import { DesertDiary as typedDesertDiary } from "./desert/Desert";
import { VarrockDiary as typedVarrockDiary } from "./varrock/Varrock";
import { FremennikDiary as typedFremennikDiary } from "./fremennik/Fremennik";
import { KandarinDiary as typedKandarinDiary } from "./kandarin/Kandarin";
import { KourendKebosDiary as typedKourendKebosDiary } from "./kourend-kebos/KourendKebos";
import { LumbridgeDraynorDiary as typedLumbridgeDraynorDiary } from "./lumbridge-draynor/LumbridgeDraynor";
import { MorytaniaDiary as typedMorytaniaDiary } from "./morytania/Morytania";
import { WildernessDiary as typedWildernessDiary } from "./wilderness/Wilderness";
function mapSkillReq(skillReq) {
// skillReq: { skill: string, level: number, boostable: boolean }
if (!skillReq || !skillReq.skill)
return null;
return new LevelRequirement(skillReq.skill, skillReq.level ?? 1, !!skillReq.boostable);
}
function mapTask(task) {
const requirements = [];
if (task.requirements) {
// quests
if (Array.isArray(task.requirements.quests)) {
for (const q of task.requirements.quests) {
if (q && typeof q === "string")
requirements.push(new QuestRequirement(q));
}
}
// skills
if (Array.isArray(task.requirements.skills)) {
for (const s of task.requirements.skills) {
const lr = mapSkillReq(s);
if (lr)
requirements.push(lr);
}
}
}
// items are stored as freeform notes in the resource file
const notes = task.other?.itemsNeeded || task.other?.itemsNeeded === "" ? task.other.itemsNeeded : undefined;
return {
description: task.description || "",
requirements,
notes,
};
}
function mapLevel(level) {
if (!level)
return { tasks: [] };
const tasks = Array.isArray(level.tasks) ? level.tasks.map(mapTask) : [];
return {
itemReward: level.itemReward,
rewards: level.rewards,
tasks,
itemsRequired: level.itemsRequired,
itemRequirements: Array.isArray(level.itemsRequired) ? level.itemsRequired.map((s) => mapItemString(s)).filter(Boolean) : undefined,
questsRequired: level.questsRequired,
skillsRequired: level.skillsRequired,
};
}
function mapItemString(s) {
if (!s || typeof s !== "string")
return null;
// Try to extract a leading quantity: "3 strawberry seeds" or "2x item"
const qtyMatch = s.trim().match(/^(\d+)\s*(?:x|×)?\s*(.+)$/i);
let qty = 1;
let name = s.trim();
if (qtyMatch) {
qty = parseInt(qtyMatch[1], 10) || 1;
name = qtyMatch[2].trim();
}
// detect notes like '(noted)' or '(not consumed)'
const noted = /noted/i.test(name);
const notConsumed = /not consumed/i.test(name);
// strip parenthetical notes from name
name = name.replace(/\(.+\)/g, "").trim();
return new ItemRequirement(name, qty, { consumed: !notConsumed, noted, notes: s });
}
function buildDiary(key, raw) {
return {
name: raw.name || key,
itemReward: raw.itemReward,
rewards: raw.rewards,
easy: mapLevel(raw.easy),
medium: mapLevel(raw.medium),
hard: mapLevel(raw.hard),
elite: mapLevel(raw.elite),
};
}
export function getDiaryByName(name) {
// exact match first
if (diaries[name])
return diaries[name];
// try case-insensitive
const found = Object.keys(diaries).find((k) => k.toLowerCase() === name.toLowerCase());
return found ? diaries[found] : undefined;
}
export function getAllDiaries() {
return Object.values(diaries);
}
//Build the Diaries for Export
const diaries = {
"Ardougne Diary": typedArdougneDiary,
"Karamja Diary": typedKaramjaDiary,
"Desert Diary": typedDesertDiary,
"Varrock Diary": typedVarrockDiary,
"Fremennik Diary": typedFremennikDiary,
"Kandarin Diary": typedKandarinDiary,
"Kourend & Kebos Diary": typedKourendKebosDiary,
"Lumbridge & Draynor Diary": typedLumbridgeDraynorDiary,
"Morytania Diary": typedMorytaniaDiary,
"Wilderness Diary": typedWildernessDiary,
};
export default diaries;
// Named exports for convenient imports
export const ArdougneDiary = diaries["Ardougne Diary"];
export const DesertDiary = diaries["Desert Diary"];
export const FaladorDiary = diaries["Falador Diary"];
export const FremennikDiary = diaries["Fremennik Diary"];
export const KandarinDiary = diaries["Kandarin Diary"];
export const KaramjaDiary = diaries["Karamja Diary"];
export const KourendKebosDiary = diaries["Kourend & Kebos Diary"];
export const LumbridgeDraynorDiary = diaries["Lumbridge & Draynor Diary"];
export const MorytaniaDiary = diaries["Morytania Diary"];
export const VarrockDiary = diaries["Varrock Diary"];
export const WesternProvincesDiary = diaries["Western Provinces Diary"];
export const WildernessDiary = diaries["Wilderness Diary"];