Clubs Schema
Database tabellen voor het club systeem.
Overzicht
Clubs zijn spelersgroepen met:
- Gedeelde resources en projecten
- Club territory met bouwgronden
- Bonussen en upgrades
- Lidmaatschap rangen
Club
│
├── ClubMember (leden)
│ └── Player
│
├── ClubResource (gedeelde resources)
│
├── ClubProject (bouwprojecten)
│ └── ClubContribution (bijdragen)
│
├── ClubBonus (actieve bonussen)
│
└── ClubMemberPlot (persoonlijke gronden)
Tabellen
club
Basis club informatie.
#[table(name = club, public)]
pub struct Club {
#[primary_key]
pub club_id: String, // "forest_friends"
pub name: String, // "De Bosvrienden"
pub description: String,
pub icon_path: String,
pub banner_path: String,
pub created_at: Timestamp,
pub created_by: Identity,
pub member_count: u32,
pub max_members: u32, // 10, 25, 50 (upgradeable)
pub level: u8, // Club level
pub xp: u64, // Club XP
pub is_public: bool, // Open voor iedereen?
pub join_requirement: String, // JSON: level, quest, etc.
pub territory_x: i32, // Club territory locatie
pub territory_y: i32,
pub territory_radius: i32,
}
club_member
Leden en hun rollen.
#[table(name = club_member, public)]
pub struct ClubMember {
#[primary_key]
#[auto_inc]
pub id: u64,
pub club_id: String,
pub player: Identity,
pub role: String, // "owner", "officer", "member"
pub joined_at: Timestamp,
pub contribution_points: u64, // Totale bijdrage
pub last_active: Timestamp,
}
Rollen:
| Rol | Rechten |
|---|---|
| owner | Alles + club verwijderen |
| officer | Leden beheren, projecten starten |
| member | Bijdragen aan projecten |
club_resource
Gedeelde club resources.
#[table(name = club_resource, public)]
pub struct ClubResource {
#[primary_key]
#[auto_inc]
pub id: u64,
pub club_id: String,
pub resource_type: String, // "hout", "steen", "eikels"
pub amount: u64,
}
club_project
Collaboratieve bouwprojecten.
#[table(name = club_project, public)]
pub struct ClubProject {
#[primary_key]
#[auto_inc]
pub id: u64,
pub club_id: String,
pub project_type: String, // "upgrade_clubhouse", "build_farm"
pub display_name: String,
pub description: String,
pub required_resources: String, // JSON: {"hout": 1000, "steen": 500}
pub contributed_resources: String, // JSON: huidige bijdragen
pub progress_percent: u8,
pub started_at: Timestamp,
pub started_by: Identity,
pub completed: bool,
}
Project Types:
| Type | Beschrijving | Vereisten |
|---|---|---|
| upgrade_clubhouse | Clubhuis verbeteren | 500 hout, 300 steen |
| build_farm | Gedeelde boerderij | 200 hout, 100 potgrond |
| unlock_territory | Groter gebied | 1000 eikels |
| build_shop | Club winkel | 400 hout, 200 steen |
club_contribution
Audit log van bijdragen.
#[table(name = club_contribution, public)]
pub struct ClubContribution {
#[primary_key]
#[auto_inc]
pub id: u64,
pub project_id: u64,
pub player: Identity,
pub resource_type: String,
pub amount: u64,
pub contributed_at: Timestamp,
}
club_bonus
Actieve club bonussen.
#[table(name = club_bonus, public)]
pub struct ClubBonus {
#[primary_key]
#[auto_inc]
pub id: u64,
pub club_id: String,
pub bonus_type: String, // "farm_speed", "harvest_bonus"
pub bonus_value: f32, // 1.1 = 10% bonus
pub active: bool,
}
Bonus Types:
| Type | Effect |
|---|---|
| farm_speed | Snellere gewasgroei |
| harvest_bonus | Extra oogst |
| xp_boost | Meer XP |
| craft_speed | Sneller crafting |
club_invite
Uitnodigingen voor spelers.
#[table(name = club_invite, public)]
pub struct ClubInvite {
#[primary_key]
#[auto_inc]
pub id: u64,
pub club_id: String,
pub invited_player: Identity,
pub invited_by: Identity,
pub invited_at: Timestamp,
pub expires_at: Timestamp,
}
club_member_plot
Persoonlijke bouwgronden binnen club territory.
#[table(name = club_member_plot, public)]
pub struct ClubMemberPlot {
#[primary_key]
#[auto_inc]
pub id: u64,
pub club_id: String,
pub member: Identity,
pub plot_x: i32,
pub plot_y: i32,
pub assigned_at: Timestamp,
}
Diagram
┌─────────────────┐
│ Club │
│─────────────────│
│ club_id (PK) │
│ name │
│ level │
│ territory_x/y │
└────────┬────────┘
│
┌────┴────────────┬──────────────┬───────────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────┐ ┌───────────┐ ┌───────────┐ ┌─────────────┐
│ ClubMember │ │ClubResource│ │ClubProject│ │ ClubBonus │
│─────────────│ │───────────│ │───────────│ │─────────────│
│ player │ │ type │ │ type │ │ bonus_type │
│ role │ │ amount │ │ progress │ │ bonus_value │
└─────────────┘ └───────────┘ └─────┬─────┘ └─────────────┘
│
▼
┌────────────────┐
│ClubContribution│
│────────────────│
│ player │
│ amount │
└────────────────┘
Queries
Club members laden
SELECT cm.*, p.username, p.display_name
FROM club_member cm
JOIN player p ON cm.player = p.identity
WHERE cm.club_id = :club_id
ORDER BY cm.role, cm.contribution_points DESC
Actieve projecten
SELECT * FROM club_project
WHERE club_id = :club_id AND completed = false