Quests Schema
Database tabellen voor het quest systeem.
Overzicht
Het quest systeem ondersteunt:
- Verschillende quest types (main, side, daily, weekly)
- Meerdere objective types
- NPC quest givers
- Rewards en voortgang tracking
QuestDefinition
│
├── QuestObjectiveType (objective templates)
│
└── PlayerQuest (speler instanties)
└── objective_progress (JSON)
Tabellen
quest_definition
Quest templates/definities.
#[table(name = quest_definition, public)]
pub struct QuestDefinition {
#[primary_key]
pub quest_id: String, // "welcome_to_treehouse"
pub title: String,
pub description: String,
pub category: String, // "main", "side", "daily", "weekly", "event"
pub difficulty: u8, // 1-5 sterren
pub min_level: u8, // Minimaal speler level
pub prerequisites: String, // JSON: ["quest_id_1", "quest_id_2"]
pub objectives: String, // JSON: objective array
pub rewards: String, // JSON: rewards object
pub time_limit_minutes: u32, // 0 = geen limiet
pub repeatable: bool,
pub cooldown_minutes: u32, // Voor herhaalbare quests
pub giver_npc: Option<String>,// NPC die quest geeft
pub is_active: bool, // Kan uitgeschakeld worden
}
Categories:
| Categorie | Beschrijving |
|---|---|
| main | Hoofdverhaal quests |
| side | Optionele side quests |
| daily | Dagelijks herhaalbaar |
| weekly | Wekelijks herhaalbaar |
| event | Speciale evenementen |
Objectives JSON Format
[
{
"type": "collect",
"target": "wortel",
"amount": 10,
"description": "Verzamel 10 wortels"
},
{
"type": "talk",
"target": "boer_piet",
"description": "Praat met Boer Piet"
},
{
"type": "deliver",
"target": "boer_piet",
"item": "wortel",
"amount": 5,
"description": "Lever 5 wortels aan Boer Piet"
}
]
Rewards JSON Format
{
"eikels": 100,
"beukenootjes": 500,
"xp": 50,
"items": [
{"item_id": "gouden_schep", "quantity": 1}
],
"unlock": "farming_level_2"
}
quest_objective_type
Definities van objective types.
#[table(name = quest_objective_type, public)]
pub struct QuestObjectiveType {
#[primary_key]
pub type_id: String, // "collect", "deliver", "talk"
pub display_name: String,
pub description: String,
}
Objective Types:
| Type | Beschrijving | Target |
|---|---|---|
| collect | Items verzamelen | item_id |
| deliver | Items afleveren bij NPC | npc_id + item_id |
| talk | Met NPC praten | npc_id |
| harvest | Gewassen oogsten | crop_id of "any" |
| craft | Items crafting | recipe_id |
| visit | Locatie bezoeken | location_id |
| reach_level | Level bereiken | skill_id + level |
player_quest
Speler's actieve en voltooide quests.
#[table(name = player_quest, public)]
pub struct PlayerQuest {
#[primary_key]
#[auto_inc]
pub id: u64,
pub player: Identity,
pub quest_id: String,
pub status: String, // "active", "completed", "failed", "abandoned"
pub started_at: Timestamp,
pub completed_at: Option<Timestamp>,
pub objective_progress: String, // JSON voortgang
pub times_completed: u32, // Voor herhaalbare quests
}
Status Flow:
start_quest
│
▼
┌────────┐
│ active │
└────┬───┘
│
┌──────────┼──────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌──────┐ ┌─────────┐
│completed│ │failed│ │abandoned│
└─────────┘ └──────┘ └─────────┘
Progress JSON Format
{
"collect_wortel": 7,
"talk_boer_piet": true,
"deliver_wortel": 3
}
Voorbeeld Quests
Tutorial Quest
{
"quest_id": "welcome_to_treehouse",
"title": "Welkom in de Boomhut!",
"description": "Leer de basis van het spel.",
"category": "main",
"difficulty": 1,
"min_level": 0,
"prerequisites": "[]",
"objectives": "[
{\"type\": \"visit\", \"target\": \"treehouse\", \"description\": \"Bezoek je boomhut\"},
{\"type\": \"talk\", \"target\": \"oma_wilma\", \"description\": \"Praat met Oma Wilma\"}
]",
"rewards": "{\"beukenootjes\": 100, \"xp\": 25}",
"repeatable": false,
"is_active": true
}
Daily Quest
{
"quest_id": "daily_harvest",
"title": "Dagelijkse Oogst",
"description": "Help de boerderij met de dagelijkse oogst.",
"category": "daily",
"difficulty": 2,
"objectives": "[
{\"type\": \"harvest\", \"target\": \"any\", \"amount\": 5, \"description\": \"Oogst 5 gewassen\"}
]",
"rewards": "{\"eikels\": 10, \"xp\": 15}",
"repeatable": true,
"cooldown_minutes": 1440
}
Queries
Beschikbare quests voor speler
-- Quests die speler kan starten
SELECT qd.* FROM quest_definition qd
WHERE qd.is_active = true
AND qd.min_level <= :player_level
AND qd.quest_id NOT IN (
SELECT quest_id FROM player_quest
WHERE player = :identity
AND (status = 'completed' AND repeatable = false)
OR status = 'active'
)
Actieve quests
SELECT pq.*, qd.title, qd.objectives
FROM player_quest pq
JOIN quest_definition qd ON pq.quest_id = qd.quest_id
WHERE pq.player = :identity AND pq.status = 'active'