Files
novafarma/src/data/QuestDataLoader.js
David Kotnik d5c7c3ee67 CHAR ANIMATIONS COMPLETE - 52 frames generated
Session: 11hr marathon (Jan 8, 2026)
Assets: 52 animation frames total
Progress: 36% to 54%

Kai: 20 frames (idle 4, walk 6, dig 5, swing 5)
Ana: 10 frames (idle 4, walk 6)
Gronk: 10 frames (idle 4, walk 6)
Susi: 12 frames (idle 4, run 6, bark 2)

Demo Status: 157/292 assets (54%)
Remaining: 135 assets

Files updated:
- TASK_TRACKER.md
- PRODUCTION_CHECKLIST.md
- 64 new PNG assets
- Susi reference updated
2026-01-08 04:03:10 +01:00

311 lines
13 KiB
JavaScript

/**
* QuestDataLoader.js
*
* Loads quest data from QUEST_MANIFEST.md v2.0
* Converts markdown quest definitions to QuestSystem format
*
* Integration: GameScene → QuestSystem → QuestDataLoader
*/
export default class QuestDataLoader {
/**
* Load all quests from Quest Manifest v2.0
* Returns array of quest objects ready for QuestSystem
*/
static loadAllQuests() {
const quests = [];
// Load all quests from manifest
quests.push(...this.getMainStoryQuests());
quests.push(...this.getCollectionQuests());
quests.push(...this.getSocialQuests());
quests.push(...this.getProgressionQuests());
quests.push(...this.getBiomeQuests());
return quests;
}
/**
* Main Story Quests (Kai's Journey - Ana's Search)
*/
static getMainStoryQuests() {
return [
// Q001: Kje Sem?
{
id: 'q001_kje_sem',
title: 'Kje Sem?',
type: 'main_story',
priority: 5,
description: 'Kai se zbudi v kleti brez spominov. Nekaj je narobe...',
objectives: [
{ id: 'wake_up', text: 'Prebudi se', type: 'flag', flag: 'awakened', complete: false },
{ id: 'explore', text: 'Raziskuj klet', type: 'flag', flag: 'explored_basement', complete: false },
{ id: 'find_exit', text: 'Najdi izhod', type: 'flag', flag: 'found_exit', complete: false }
],
rewards: { xp: 100, unlocks: ['surface'] },
dialogue: {
start: ["...au glava... kje sm?", "Čak... kdo SM jaz sploh?!"],
complete: ["Včeri sm bla tam, zdej pa tuki...", "MORŠ NEC NAJT!"]
},
vfx: { start: 'amnesia_blur', complete: 'clarity' },
npc: null,
location: 'basement'
},
// Q002: Prvi Koraki
{
id: 'q002_prvi_koraki',
title: 'Prvi Koraki',
type: 'main_story',
priority: 5,
description: 'Nauči se osnovnih preživetvenh veščin',
objectives: [
{ id: 'plant', text: 'Posadi prvo seme', type: 'action', action: 'plant', required: 1, current: 0 },
{ id: 'water', text: 'Zalij rastlino', type: 'action', action: 'water', required: 1, current: 0 },
{ id: 'harvest', text: 'Požanji prvo sadje', type: 'action', action: 'harvest', required: 1, current: 0 }
],
rewards: { xp: 200, items: ['seeds:10'], gold: 50 },
dialogue: {
start: ["Hm... mam tools pa zemljo...", "Probam narit farmo?"],
progress: ["Nice! Raste!"],
complete: ["DAAAAJ! Prva plants! Kul!"]
},
prerequisites: ['q001_kje_sem'],
npc: null,
location: 'farm'
},
// Q003: Glas v Glavi
{
id: 'q003_glas_v_glavi',
title: 'Glas v Glavi',
type: 'main_story',
priority: 5,
description: 'Sliš glas... nekje iz daljave... poznaš ta glas',
objectives: [
{ id: 'hear_voice', text: 'Poslušaj glas', type: 'flag', flag: 'heard_ana', complete: false },
{ id: 'find_photo', text: 'Najdi fotografijo', type: 'item', item: 'ana_photo', required: 1, current: 0 }
],
rewards: { xp: 500, items: ['ana_photo'], unlocks: ['twin_bond_system'] },
dialogue: {
start: ["...Kaj je to? Neki slišim...", "Dekle? Govori slovensko.. mam občutek da jo POZNAM?!"],
onVoice: ["Kai, a me slišiš?", "Ne skrbi zame... najd se..."],
complete: ["TA FOTKA! To je... ANA?!", "SESTRA! Moja SESTRA!", "...pomnim se! ANA JE ŽIVA!"]
},
vfx: { start: 'amnesia_blur', onVoice: 'echo', complete: 'flashback' },
prerequisites: ['q002_prvi_koraki'],
npc: null,
location: 'basement_hidden'
}
];
}
/**
* Collection Quests
*/
static getCollectionQuests() {
return [
// Q010: 80 Crops Challenge
{
id: 'q010_80_crops',
title: '80 Crops Challenge',
type: 'collection',
priority: 3,
description: 'Požanji VSE različne vrste sadja (80 total!)',
objectives: [
{ id: 'crops', text: 'Različne vrste sadja (0/80)', type: 'collection', collection: 'unique_crops', required: 80, current: 0 }
],
rewards: { xp: 5000, items: ['master_farmer_title'], gold: 10000, unlocks: ['greenhouse'] },
dialogue: {
start: ["80 različnih crops? Challenge accepted!"],
progress: ["Še {remaining} da konč!"],
complete: ["DAAAAAJ 80/80! MASTER FARMER STATUS UNLOCKED!"]
},
npc: null,
location: 'farm'
},
// Q011: Tree Planter
{
id: 'q011_tree_planter',
title: 'Tree Planter Supreme',
type: 'collection',
priority: 2,
description: 'Posadi vseh 11 vrst dreves',
objectives: [
{ id: 'trees', text: 'Različne vrste dreves (0/11)', type: 'collection', collection: 'unique_trees', required: 11, current: 0 }
],
rewards: { xp: 2000, items: ['tree_planter_title'], unlocks: ['forest_zone'] },
dialogue: {
start: ["11 vrst dreves... začenjam z oak!"],
complete: ["DONE! Ves forest je moj!"]
},
npc: 'arborist'
},
// Q020: Creature Catalog
{
id: 'q020_creature_catalog',
title: 'Creature Catalog Complete',
type: 'collection',
priority: 4,
description: 'Dokumentiraj vse 99 creatures',
objectives: [
{ id: 'creatures', text: 'Dokumentirani creatures (0/99)', type: 'collection', collection: 'creature_entries', required: 99, current: 0 }
],
rewards: { xp: 10000, items: ['master_zoologist_title'], unlocks: ['creature_lab'] },
dialogue: {
start: ["HOLY SHIT 99 creatures?! OK gremo!"],
progress: ["{current}/99... keep going!"],
complete: ["COMPLETE CREATURE CATALOG! SICK!"]
},
npc: 'researcher'
}
];
}
/**
* Social/NPC Quests
*/
static getSocialQuests() {
return [
// Q080: 166 Friends
{
id: 'q080_166_friends',
title: '166 Friends',
type: 'social',
priority: 2,
description: 'Spoznaj vse NPCje v igri',
objectives: [
{ id: 'npcs', text: 'Spoznani NPCji (0/166)', type: 'collection', collection: 'met_npcs', required: 166, current: 0 }
],
rewards: { xp: 15000, items: ['social_butterfly_title'], gold: 50000 },
dialogue: {
start: ["166 ljudi? Noben me ne pozna... but I'll try!"],
progress: ["{current} friends... getting there!"],
complete: ["166/166! EVERYONE KNOWS ME NOW!"]
},
npc: null
}
];
}
/**
* Progression/Building Quests
*/
static getProgressionQuests() {
return [
// Q040: Gothic Farm Empire
{
id: 'q040_gothic_empire',
title: 'Gothic Farm Empire',
type: 'building',
priority: 3,
description: 'Zgradi vse 6 osnovnih farm buildingov',
objectives: [
{ id: 'farmhouse', text: 'Zgradi Farmhouse', type: 'building', building: 'farmhouse', complete: false },
{ id: 'barn', text: 'Zgradi Barn', type: 'building', building: 'barn', complete: false },
{ id: 'silo', text: 'Zgradi Silo', type: 'building', building: 'silo', complete: false },
{ id: 'shed', text: 'Zgradi Shed', type: 'building', building: 'shed', complete: false },
{ id: 'well', text: 'Zgradi Well', type: 'building', building: 'well', complete: false },
{ id: 'windmill', text: 'Zgradi Windmill', type: 'building', building: 'windmill', complete: false }
],
rewards: { xp: 3000, items: ['master_builder_title'], unlocks: ['advanced_buildings'] },
dialogue: {
start: ["6 buildings... let's gooo!"],
complete: ["FARM EMPIRE COMPLETE!"]
},
npc: null
}
];
}
/**
* Biome/Exploration Quests
*/
static getBiomeQuests() {
return [
// Q050: Underwater Secrets
{
id: 'q050_underwater_secrets',
title: 'Underwater Secrets',
type: 'exploration',
priority: 4,
description: 'Raziskuj podvodni svet s popolnimi water physics!',
objectives: [
{ id: 'enter_water', text: 'Vstopi v vodo', type: 'flag', flag: 'entered_water', complete: false },
{ id: 'dive_deep', text: 'Potoniruj 50m globoko', type: 'action', action: 'dive', required: 50, current: 0 },
{ id: 'find_treasure', text: 'Najdi podvodni zaklad', type: 'item', item: 'underwater_treasure', required: 1, current: 0 }
],
rewards: { xp: 2000, items: ['diving_gear'], unlocks: ['water_biomes'] },
dialogue: {
start: ["Voda! Water physics so sick! Dreads plavajo! 😂"],
complete: ["Podvodni treasures found! DOPE!"]
},
vfx: { start: 'water_ripples', complete: 'treasure_glow' },
npc: null,
location: 'cenote'
},
// Q060: Baba Yaga's Challenge
{
id: 'q060_baba_yaga',
title: 'Baba Yaga\'s Challenge',
type: 'boss',
priority: 5,
description: 'Premagi Baba Yago in dobi broomstick!',
objectives: [
{ id: 'find_witch_forest', text: 'Najdi Witch Forest', type: 'flag', flag: 'found_witch_forest', complete: false },
{ id: 'defeat_baba', text: 'Premagi Baba Yago', type: 'kill', target: 'baba_yaga', required: 1, current: 0 }
],
rewards: { xp: 5000, items: ['baba_broomstick'], unlocks: ['flying_mount'] },
dialogue: {
start: ["Witch Forest... creepy af"],
onBoss: ["BABA YAGA?! OH SHIT!"],
complete: ["DEFEATED! Broomstick je moj! LETIM!"]
},
vfx: { start: 'dark_fog', onBoss: 'boss_appear', complete: 'boss_defeat' },
npc: null,
location: 'witch_forest'
},
// Q070: Jurassic Farm
{
id: 'q070_jurassic_farm',
title: 'Jurassic Farm',
type: 'exploration',
priority: 3,
description: 'Raziskuj Dinosaur Valley!',
objectives: [
{ id: 'find_valley', text: 'Najdi Dino Valley', type: 'flag', flag: 'found_dino_valley', complete: false },
{ id: 'tame_dino', text: 'Prijaj dinozavra', type: 'action', action: 'tame_dinosaur', required: 1, current: 0 }
],
rewards: { xp: 4000, items: ['dino_saddle'], unlocks: ['dino_mounts'] },
dialogue: {
start: ["DINOZAVRI?! WHAT?!"],
complete: ["TAMED T-REX! BEST DAY EVER!"]
},
vfx: { onTame: 'tame_success' },
npc: null,
location: 'dino_valley'
}
];
}
/**
* Get quest by ID
*/
static getQuestById(questId) {
const allQuests = this.loadAllQuests();
return allQuests.find(q => q.id === questId);
}
/**
* Get quests by type
*/
static getQuestsByType(type) {
const allQuests = this.loadAllQuests();
return allQuests.filter(q => q.type === type);
}
}