From f34a45a18fbb042a90d2bd6d980c6d6e22743b24 Mon Sep 17 00:00:00 2001 From: Jonatan Chaverri Date: Fri, 4 Jul 2025 14:18:02 -0600 Subject: [PATCH] feat: add player system --- .../combat_game/src/models/player.cairo | 4 +- .../combat_game/src/systems/player.cairo | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/backend/dojo_examples/combat_game/src/models/player.cairo b/backend/dojo_examples/combat_game/src/models/player.cairo index 534b4e1..42565ac 100644 --- a/backend/dojo_examples/combat_game/src/models/player.cairo +++ b/backend/dojo_examples/combat_game/src/models/player.cairo @@ -11,8 +11,8 @@ pub struct Player { pub current_beast_id: u16, pub battles_won: u16, pub battles_lost: u16, - pub last_active_day: u32, - pub creation_day: u32, + pub last_active_day: u64, + pub creation_day: u64, } #[generate_trait] diff --git a/backend/dojo_examples/combat_game/src/systems/player.cairo b/backend/dojo_examples/combat_game/src/systems/player.cairo index 8b13789..99ffc41 100644 --- a/backend/dojo_examples/combat_game/src/systems/player.cairo +++ b/backend/dojo_examples/combat_game/src/systems/player.cairo @@ -1 +1,59 @@ +#[starknet::interface] +pub trait IPlayer { + fn spawn_player(ref self: T, initial_beast_id: u16); + fn update_profile(ref self: T, won: bool, current_beast_id: u16); +} +#[dojo::contract] +pub mod player_system { + use super::IPlayer; + + use combat_game::models::player::{Player, PlayerAssert}; + use combat_game::store::{StoreTrait}; + + use starknet::{get_caller_address, get_block_timestamp}; + + #[storage] + struct Storage { + player_counter: u256, + } + + // Constructor + fn dojo_init(ref self: ContractState) { + self.player_counter.write(1); + } + + #[abi(embed_v0)] + impl PlayerImpl of IPlayer { + fn spawn_player(ref self: ContractState, initial_beast_id: u16) { + let mut world = self.world(@"combat_game"); + let mut store = StoreTrait::new(world); + + let found = store.read_player(); + found.assert_not_exists(); + + let player = Player { + address: get_caller_address(), + current_beast_id: initial_beast_id, + battles_won: 0, + battles_lost: 0, + last_active_day: get_block_timestamp(), + creation_day: get_block_timestamp(), + }; + + store.write_player(player); + } + + fn update_profile(ref self: ContractState, won: bool, current_beast_id: u16) { + let mut world = self.world(@"combat_game"); + let mut store = StoreTrait::new(world); + + let mut player = store.read_player(); + player.assert_exists(); + + store.update_player_battle_result(won); + player.current_beast_id = current_beast_id; + store.write_player(player); + } + } +}