Ga naar hoofdinhoud

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,
}
KolomTypeBeschrijving
identityIdentityUnieke cryptografische ID
usernameStringUnieke gebruikersnaam (3-20 chars)
display_nameStringWeergavenaam
avatar_idStringGeselecteerde avatar
created_atTimestampRegistratiedatum
last_seenTimestampLaatste activiteit
is_onlineboolOnline 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,
}
KolomTypeBeschrijving
levelu32Huidige level (1+)
experienceu64XP naar volgend level
total_experienceu64Totaal verdiende XP
play_time_minutesu32Totale speeltijd
quests_completedu32Voltooide quests
items_collectedu32Unieke items verzameld
friends_countu32Aantal 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
}
KolomTypeBeschrijving
xf32X coordinaat
yf32Y coordinaat
sceneStringScene naam ("treehouse", "forest", etc.)
directionu8Kijkrichting

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,
}
KolomTypeBeschrijving
ownerIdentityEigenaar
resource_typeStringType (zie onder)
amountu64Hoeveelheid

Resource Types

TypeBeschrijving
eikelsHoofdvaluta
beukenootjesKleine valuta (10 = 1 eikel)
houtBouwgrondstof
steenBouwgrondstof
mestFarming grondstof
potgrondFarming 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