UNPKG

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
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"];