Ga naar hoofdinhoud

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:

SeizoenGewassen
springWortels, Aardappels, Tulpen
summerTomaten, Maïs, Zonnebloemen
fallPompoenen, Appels, Druiven
anyKruiden (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:

TypeBeschrijvingBonus
basicStandaard grondGeen
raised_bedVerhoogd bed+10% yield
greenhouseKasElk 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:

TypeEffectDuur
basic_fertilizer+20% yield1 oogst
quality_fertilizer+30% yield, +1 kwaliteit1 oogst
speed_fertilizer-25% groeitijd1 oogst
miracle_growAlle bonussen3 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

Volgende