Spelers Schema
Alle tabellen gerelateerd aan spelers.
player
Basis spelerinformatie.
#[table(name = player, public)]
pub struct Player {
#[primary_key]
pub identity: Identity,
#[unique]
pub username: String,
pub display_name: String,
pub avatar_id: String,
pub created_at: Timestamp,
pub last_seen: Timestamp,
pub is_online: bool,
}
| Kolom | Type | Beschrijving |
|---|---|---|
| identity | Identity | Unieke cryptografische ID |
| username | String | Unieke gebruikersnaam (3-20 chars) |
| display_name | String | Weergavenaam |
| avatar_id | String | Geselecteerde avatar |
| created_at | Timestamp | Registratiedatum |
| last_seen | Timestamp | Laatste activiteit |
| is_online | bool | Online status |
player_stats
Speelstatistieken en progressie.
#[table(name = player_stats, public)]
pub struct PlayerStats {
#[primary_key]
pub identity: Identity,
pub level: u32,
pub experience: u64,
pub total_experience: u64,
pub play_time_minutes: u32,
pub quests_completed: u32,
pub items_collected: u32,
pub friends_count: u32,
}
| Kolom | Type | Beschrijving |
|---|---|---|
| level | u32 | Huidige level (1+) |
| experience | u64 | XP naar volgend level |
| total_experience | u64 | Totaal verdiende XP |
| play_time_minutes | u32 | Totale speeltijd |
| quests_completed | u32 | Voltooide quests |
| items_collected | u32 | Unieke items verzameld |
| friends_count | u32 | Aantal vrienden |
Level Formule
fn xp_for_level(level: u32) -> u64 {
// Elk level vereist meer XP
(level as u64 * 100) + ((level as u64).pow(2) * 10)
}
player_position
Locatie in de game wereld.
#[table(name = player_position, public)]
pub struct PlayerPosition {
#[primary_key]
pub identity: Identity,
pub x: f32,
pub y: f32,
pub scene: String,
pub direction: u8, // 0=down, 1=up, 2=left, 3=right
}
| Kolom | Type | Beschrijving |
|---|---|---|
| x | f32 | X coordinaat |
| y | f32 | Y coordinaat |
| scene | String | Scene naam ("treehouse", "forest", etc.) |
| direction | u8 | Kijkrichting |
player_resource
Valuta en grondstoffen (geen slot limiet).
#[table(name = player_resource, public)]
pub struct PlayerResource {
#[primary_key]
#[auto_inc]
pub id: u64,
#[index(btree)]
pub owner: Identity,
pub resource_type: String,
pub amount: u64,
}
| Kolom | Type | Beschrijving |
|---|---|---|
| owner | Identity | Eigenaar |
| resource_type | String | Type (zie onder) |
| amount | u64 | Hoeveelheid |
Resource Types
| Type | Beschrijving |
|---|---|
eikels | Hoofdvaluta |
beukenootjes | Kleine valuta (10 = 1 eikel) |
hout | Bouwgrondstof |
steen | Bouwgrondstof |
mest | Farming grondstof |
potgrond | Farming grondstof |
player_settings
Speler voorkeuren.
#[table(name = player_settings, public)]
pub struct PlayerSettings {
#[primary_key]
pub identity: Identity,
pub music_volume: u8, // 0-100
pub sfx_volume: u8, // 0-100
pub notifications: bool,
pub language: String, // "nl", "en"
pub show_online_status: bool,
}
player_achievement
Behaalde achievements.
#[table(name = player_achievement, public)]
pub struct PlayerAchievement {
#[primary_key]
#[auto_inc]
pub id: u64,
pub identity: Identity,
pub achievement_id: String,
pub earned_at: Timestamp,
}
daily_login
Dagelijkse login tracking.
#[table(name = daily_login, public)]
pub struct DailyLogin {
#[primary_key]
#[auto_inc]
pub id: u64,
pub identity: Identity,
pub date: String, // "2024-01-15"
pub streak: u32, // Consecutive days
pub reward_claimed: bool,
}
Relaties
Player (1) ───────── (1) PlayerStats
│
├─────────── (1) PlayerPosition
│
├─────────── (N) PlayerResource
│
├─────────── (1) PlayerSettings
│
├─────────── (N) PlayerAchievement
│
└─────────── (N) DailyLogin
Queries
Speler Opzoeken
// Via identity
let player = ctx.db.player()
.identity()
.find(&some_identity);
// Via username
let player = ctx.db.player()
.username()
.find(&"username".to_string());
Online Spelers
let online_players: Vec<Player> = ctx.db.player()
.iter()
.filter(|p| p.is_online)
.collect();
Top Spelers (Level)
SELECT p.username, s.level, s.total_experience
FROM player p
JOIN player_stats s ON p.identity = s.identity
ORDER BY s.level DESC, s.total_experience DESC
LIMIT 10