Farming Schema
Database tabellen voor het farming systeem.
Overzicht
Het farming systeem bestaat uit:
- Crop definitions - Gewas types en groei eigenschappen
- Farm plots - Akker percelen
- Planted crops - Actieve gewassen met groei status
CropDefinition
│
└── Crop (geplant op)
└── FarmPlot (speler's grond)
Tabellen
crop_definition
Definities van alle gewas types.
#[table(name = crop_definition, public)]
pub struct CropDefinition {
#[primary_key]
pub crop_id: String, // "wortel", "aardappel", "tomaat"
pub display_name: String, // "Wortel"
pub description: String,
pub seed_item_id: String, // FK naar item_definition
pub harvest_item_id: String, // Wat je krijgt bij oogst
pub growth_time_minutes: u32, // Tijd tot volgroeid
pub growth_stages: u8, // Aantal visuele stadia (3-5)
pub water_needs: u8, // 0=weinig, 1=normaal, 2=veel
pub season: String, // "spring", "summer", "fall", "any"
pub base_yield: u32, // Basis oogst hoeveelheid
pub max_yield: u32, // Max met bonussen
pub xp_reward: u32, // XP bij oogst
pub required_farming_level: u8,
pub sprite_path: String, // Sprite sheet pad
}
Seizoenen:
| Seizoen | Gewassen |
|---|---|
| spring | Wortels, Aardappels, Tulpen |
| summer | Tomaten, Maïs, Zonnebloemen |
| fall | Pompoenen, Appels, Druiven |
| any | Kruiden (altijd) |
farm_plot
Akker percelen van spelers.
#[table(name = farm_plot, public)]
pub struct FarmPlot {
#[primary_key]
#[auto_inc]
pub id: u64,
pub owner: Identity,
pub x: i32, // Plot positie
pub y: i32,
pub quality: u8, // 0-100 grondkwaliteit
pub is_watered: bool,
pub last_watered: Timestamp,
pub fertilizer_type: Option<String>,
pub fertilizer_expires: Option<Timestamp>,
pub plot_type: String, // "basic", "raised_bed", "greenhouse"
}
Plot Types:
| Type | Beschrijving | Bonus |
|---|---|---|
| basic | Standaard grond | Geen |
| raised_bed | Verhoogd bed | +10% yield |
| greenhouse | Kas | Elk seizoen + snellere groei |
crop (geplante gewassen)
Actief groeiende gewassen.
#[table(name = crop, public)]
pub struct Crop {
#[primary_key]
#[auto_inc]
pub id: u64,
pub plot_id: u64, // FK naar farm_plot
pub crop_type: String, // FK naar crop_definition
pub planted_at: Timestamp,
pub growth_stage: u8, // Huidige stadium (0 = zaad)
pub is_watered: bool,
pub last_watered: Timestamp,
pub is_ready: bool, // Klaar voor oogst
pub health: u8, // 0-100
pub quality_bonus: f32, // Extra kwaliteit multiplier
}
Groei Mechanisme
Groei Stadia
Stage 0: Zaad geplant
│ (20% tijd)
▼
Stage 1: Kiemplant
│ (30% tijd)
▼
Stage 2: Groei
│ (30% tijd)
▼
Stage 3: Bijna klaar
│ (20% tijd)
▼
Stage 4: Oogstbaar!
Water & Gezondheid
┌─────────────────────────────────────────────────┐
│ Water Status → Groei Effect │
├─────────────────────────────────────────────────┤
│ Niet water nodig: Normale groei │
│ Water gegeven: Snellere groei (+25%) │
│ Te lang droog: Health -10/uur, geen groei │
│ Health = 0: Gewas dood │
└─────────────────────────────────────────────────┘
Fertilizer (Mest)
Fertilizer types en effecten:
| Type | Effect | Duur |
|---|---|---|
| basic_fertilizer | +20% yield | 1 oogst |
| quality_fertilizer | +30% yield, +1 kwaliteit | 1 oogst |
| speed_fertilizer | -25% groeitijd | 1 oogst |
| miracle_grow | Alle bonussen | 3 oogsten |
Seizoen Systeem
Het spel heeft 4 seizoenen die roteren:
// Server berekent huidig seizoen
fn get_current_season() -> String {
let day_of_year = /* calculate from timestamp */;
match (day_of_year / 91) % 4 {
0 => "spring",
1 => "summer",
2 => "fall",
_ => "winter"
}
}
Winter:
- Geen buitengewassen
- Greenhouse werkt wel
- Indoor farming mogelijk
Voorbeeld Workflow
1. Plot Aanmaken
INSERT INTO farm_plot (owner, x, y, quality, plot_type)
VALUES (:identity, 10, 20, 50, 'basic')
2. Gewas Planten
-- Check: heeft speler het zaad?
-- Check: is het juiste seizoen?
-- Check: is de plot leeg?
INSERT INTO crop (plot_id, crop_type, planted_at, growth_stage, health)
VALUES (:plot_id, 'wortel', NOW(), 0, 100)
3. Water Geven
UPDATE crop SET is_watered = true, last_watered = NOW()
WHERE id = :crop_id
4. Oogsten
-- Als is_ready = true:
-- 1. Bereken yield (base * quality_bonus * fertilizer)
-- 2. Geef items aan speler
-- 3. Geef XP
-- 4. Verwijder crop of reset (voor multi-harvest)
DELETE FROM crop WHERE id = :crop_id
Queries
Speler's gewassen
SELECT c.*, cd.display_name, cd.growth_time_minutes, fp.x, fp.y
FROM crop c
JOIN crop_definition cd ON c.crop_type = cd.crop_id
JOIN farm_plot fp ON c.plot_id = fp.id
WHERE fp.owner = :identity
Gewassen die water nodig hebben
SELECT c.* FROM crop c
JOIN farm_plot fp ON c.plot_id = fp.id
WHERE fp.owner = :identity
AND c.is_watered = false
AND c.is_ready = false