Clubs Reducers
Reducers voor het club systeem.
Club Aanmaken
create_club
Maak een nieuwe club aan.
#[reducer]
pub fn create_club(
ctx: &ReducerContext,
club_id: String,
name: String,
description: String,
is_public: bool,
) -> Result<(), String>
Parameters:
| Param | Type | Beschrijving |
|---|---|---|
| club_id | String | Unieke ID (url-safe) |
| name | String | Club naam |
| description | String | Beschrijving |
| is_public | bool | Open voor iedereen? |
Validatie:
- club_id uniek
- Aanmaker heeft geen andere club
Side effects:
- Aanmaker wordt automatisch owner
- Initiële territory toegewezen
Client:
func create_club(id: String, name: String, desc: String, public: bool) -> void:
var result = await client.call_reducer("create_club", [id, name, desc, public])
if result.status == "failed":
show_error(result.message)
else:
show_success("Club aangemaakt!")
Lidmaatschap
join_club
Word lid van een publieke club.
#[reducer]
pub fn join_club(
ctx: &ReducerContext,
club_id: String,
) -> Result<(), String>
Validatie:
- Club is publiek OF speler heeft invite
- Speler is nog geen lid
- Club is niet vol
leave_club
Verlaat een club.
#[reducer]
pub fn leave_club(
ctx: &ReducerContext,
club_id: String,
) -> Result<(), String>
Note: Owner kan niet verlaten zonder eerst ownership over te dragen.
invite_to_club
Nodig speler uit voor club (officer+).
#[reducer]
pub fn invite_to_club(
ctx: &ReducerContext,
club_id: String,
player_username: String,
) -> Result<(), String>
Permissions: Owner of Officer
accept_invite
Accepteer club uitnodiging.
#[reducer]
pub fn accept_invite(
ctx: &ReducerContext,
invite_id: u64,
) -> Result<(), String>
kick_member
Verwijder lid uit club (officer+).
#[reducer]
pub fn kick_member(
ctx: &ReducerContext,
club_id: String,
player_identity: Identity,
) -> Result<(), String>
Permissions:
- Officer kan members kicken
- Owner kan officers en members kicken
Rollen
set_member_role
Wijzig rol van een lid (owner only).
#[reducer]
pub fn set_member_role(
ctx: &ReducerContext,
club_id: String,
player_identity: Identity,
new_role: String, // "officer" of "member"
) -> Result<(), String>
transfer_ownership
Draag club ownership over.
#[reducer]
pub fn transfer_ownership(
ctx: &ReducerContext,
club_id: String,
new_owner: Identity,
) -> Result<(), String>
Resources
donate_to_club
Doneer resources aan club.
#[reducer]
pub fn donate_to_club(
ctx: &ReducerContext,
club_id: String,
resource_type: String,
amount: u64,
) -> Result<(), String>
Effecten:
- Resources van speler afgetrokken
- Club resources verhoogd
- Contribution points toegevoegd aan lid
Client:
func donate(club_id: String, type: String, amount: int) -> void:
# Check eerst of speler genoeg heeft
var current = inventory_manager.get_resource(type)
if current < amount:
show_error("Niet genoeg %s!" % type)
return
client.reducers.donate_to_club(club_id, type, amount)
Projecten
start_project
Start een club project (officer+).
#[reducer]
pub fn start_project(
ctx: &ReducerContext,
club_id: String,
project_type: String,
) -> Result<(), String>
Project Types:
| Type | Vereisten |
|---|---|
| upgrade_clubhouse | 500 hout, 300 steen |
| build_farm | 200 hout, 100 potgrond |
| unlock_territory | 1000 eikels |
contribute_to_project
Draag bij aan actief project.
#[reducer]
pub fn contribute_to_project(
ctx: &ReducerContext,
project_id: u64,
resource_type: String,
amount: u64,
) -> Result<(), String>
Effecten:
- Resources van speler afgetrokken
- Project progress bijgewerkt
- ClubContribution record aangemaakt (audit)
- Contribution points voor lid
Client:
func contribute(project_id: int, type: String, amount: int) -> void:
client.reducers.contribute_to_project(project_id, type, amount)
# Progress listener
func _on_project_updated(old_project, new_project) -> void:
progress_bar.value = new_project.progress_percent
if new_project.completed and not old_project.completed:
show_notification("Project voltooid!")
cancel_project
Annuleer project en refund resources (owner only).
#[reducer]
pub fn cancel_project(
ctx: &ReducerContext,
project_id: u64,
) -> Result<(), String>
Note: Bijdragen worden proportioneel teruggestort.
Club Territory
claim_plot
Claim een plot in club territory.
#[reducer]
pub fn claim_plot(
ctx: &ReducerContext,
club_id: String,
plot_x: i32,
plot_y: i32,
) -> Result<(), String>
Validatie:
- Lid van de club
- Plot binnen territory radius
- Plot nog niet geclaimd
Voorbeeld Flow
Club Opzetten
# 1. Club aanmaken
await client.call_reducer("create_club", [
"forest_friends",
"De Bosvrienden",
"Een gezellige club voor natuurliefhebbers!",
true # Publiek
])
# 2. Vrienden uitnodigen
await client.call_reducer("invite_to_club", [
"forest_friends",
"friend_username"
])
# 3. Project starten wanneer leden joinen
await client.call_reducer("start_project", [
"forest_friends",
"build_farm"
])
Bijdragen Tracker UI
func _update_leaderboard() -> void:
var members = []
for member in client.db.club_member.iter():
if member.club_id == current_club_id:
members.append({
"player": member.player,
"points": member.contribution_points
})
members.sort_custom(func(a, b): return a.points > b.points)
for i in range(min(10, members.size())):
leaderboard_labels[i].text = "%d. %s - %d pts" % [
i + 1,
_get_player_name(members[i].player),
members[i].points
]