Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions backend/dojo_examples/combat_game/src/store.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ pub impl StoreImpl of StoreTrait {
// beast.experience);
// beast.experience = ExperienceTrrait::remaining_exp_after_level_up(beast.level,
beast.experience = 5;
beast.level += 1;

// Update beast stats
let mut beast_stats = self.read_beast_stats(beast_id);
Expand Down
71 changes: 71 additions & 0 deletions backend/dojo_examples/combat_game/src/systems/beast.cairo
Original file line number Diff line number Diff line change
@@ -1 +1,72 @@
use combat_game::types::beast_type::BeastType;
use combat_game::models::beast_stats::BeastStats;

#[starknet::interface]
pub trait IBeast<T> {
fn spawn_beast(ref self: T, beast_type: BeastType) -> u16;
fn level_up_beast(ref self: T, beast_id: u16);
fn update_beast_stats(ref self: T, beast_stats: BeastStats);
}

#[dojo::contract]
pub mod beast_system {
use super::{IBeast, BeastType, BeastStats};
use starknet::get_block_timestamp;
use combat_game::store::{StoreTrait};
use combat_game::models::beast_stats::BeastStatsActionTrait;

#[storage]
struct Storage {
beast_counter: u16,
}

// Constructor
fn dojo_init(ref self: ContractState) {
self.beast_counter.write(1);
}

#[abi(embed_v0)]
impl BeastImpl of IBeast<ContractState> {
fn spawn_beast(ref self: ContractState, beast_type: BeastType) -> u16 {
let mut world = self.world(@"combat_game");
let mut store = StoreTrait::new(world);

let beast_id = self.beast_counter.read();
self.beast_counter.write(beast_id + 1);

let beast = store.new_beast(beast_id, beast_type);
store.init_beast_skills(beast_id);

let beast_stats = BeastStatsActionTrait::new_beast_stats(
beast_id, beast_type, beast.level, get_block_timestamp()
);
store.write_beast_stats(beast_stats);
beast_id
}

fn level_up_beast(ref self: ContractState, beast_id: u16) {
let mut world = self.world(@"combat_game");
let mut store = StoreTrait::new(world);

let mut beast = store.read_beast(beast_id);
assert!(beast.level > 0, "Beast not found");
let mut beast_stats = store.read_beast_stats(beast_id);

beast.level += 1;
beast_stats.level_up(beast.beast_type);

store.write_beast(beast);
store.write_beast_stats(beast_stats);
}

fn update_beast_stats(ref self: ContractState, beast_stats: BeastStats) {
let mut world = self.world(@"combat_game");
let mut store = StoreTrait::new(world);

let mut beast = store.read_beast(beast_stats.beast_id);
assert!(beast.level > 0, "Beast not found");

store.write_beast_stats(beast_stats);
}
}
}