Ga naar hoofdinhoud

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:

ParamTypeBeschrijving
club_idStringUnieke ID (url-safe)
nameStringClub naam
descriptionStringBeschrijving
is_publicboolOpen 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

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:

TypeVereisten
upgrade_clubhouse500 hout, 300 steen
build_farm200 hout, 100 potgrond
unlock_territory1000 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
]

Volgende