From 7167780254e247c468102820b99ff09408123a60 Mon Sep 17 00:00:00 2001 From: Yangqijun <40876894+Again1013@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:14:48 +0800 Subject: [PATCH 1/4] add models --- Scarb.lock | 15 ++++++----- Scarb.toml | 4 +-- src/models/dna.cairo | 63 +++++++++++++++++++++++++++++++------------- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/Scarb.lock b/Scarb.lock index 88a2125..527a123 100644 --- a/Scarb.lock +++ b/Scarb.lock @@ -3,19 +3,20 @@ version = 1 [[package]] name = "dojo" -version = "0.3.5" -source = "git+https://github.com/dojoengine/dojo#008b9e55da44c14e839ec8e1f62f0c2fef568f77" +version = "0.3.11" +source = "git+https://github.com/dojoengine/dojo#3ad461ed620872972e5bebc101bdabf7d90ccc33" dependencies = [ "dojo_plugin", ] [[package]] -name = "dojo_examples" +name = "dojo_plugin" +version = "0.3.11" +source = "git+https://github.com/dojoengine/dojo?tag=v0.3.11#1e651b5d4d3b79b14a7d8aa29a92062fcb9e6659" + +[[package]] +name = "realms_adventurers" version = "0.3.5" dependencies = [ "dojo", ] - -[[package]] -name = "dojo_plugin" -version = "0.3.6" diff --git a/Scarb.toml b/Scarb.toml index 236b934..7871e19 100644 --- a/Scarb.toml +++ b/Scarb.toml @@ -1,5 +1,5 @@ [package] -cairo-version = "2.2.0" +cairo-version = "2.3.1" name = "realms_adventurers" version = "0.3.5" @@ -7,7 +7,7 @@ version = "0.3.5" sierra-replace-ids = true [dependencies] -dojo = { git = "https://github.com/dojoengine/dojo", version = "0.3.5" } +dojo = { git = "https://github.com/dojoengine/dojo", version = "0.3.11" } [[target.dojo]] diff --git a/src/models/dna.cairo b/src/models/dna.cairo index 4ca178f..091d5f0 100644 --- a/src/models/dna.cairo +++ b/src/models/dna.cairo @@ -1,39 +1,64 @@ // the minimum DNA of an Adventurer -#[derive(Copy, Drop, Serde, Introspect)] -struct Vec2 { - x: u32, - y: u32 -} +use starknet::ContractAddress; -// Health is a component that can be attached to an entity -#[derive(Model, Copy, Drop, Serde, SerdeLen)] -struct Health { +// ID is a unique identifier for an entity +#[derive(Model, Copy, Drop, Serde)] +struct AdventurerId { #[key] - entity_id: u64, - health: u32, + player: ContractAddress, + adventurer_id: u64, +// +// think about the situation where player has a few adventurers +// model can't store array yet, so hard code +// second: u64, +// third: u64, +// } -// This can be inherited from the World, but leaving here for testing #[derive(Model, Copy, Drop, Serde)] -struct Position { +struct playerAddress { #[key] - entity_id: u64, - vec: Vec2, + adventurer_id: u64, + player: ContractAddress, } -// ID is a unique identifier for an entity +// Name is a component that can be attached to an entity #[derive(Model, Copy, Drop, Serde)] -struct AdventurerId { +struct Name { #[key] - entity_id: u64, - id: u64, + adventurer_id: u64, + name: felt252, } + // ID is a unique identifier for an entity #[derive(Model, Copy, Drop, Serde)] struct Energy { #[key] - entity_id: u64, + adventurer_id: u64, value: u64, } + +// Health is a component that can be attached to an entity +#[derive(Model, Copy, Drop, Serde, SerdeLen)] +struct Health { + #[key] + adventurer_id: u64, + health: u32, +} + + +// This can be inherited from the World, but leaving here for testing +#[derive(Model, Copy, Drop, Serde)] +struct Position { + #[key] + adventurer_id: u64, + vec: Vec2, +} + +#[derive(Copy, Drop, Serde, Introspect)] +struct Vec2 { + x: u32, + y: u32 +} From 7f495bdb86a1de82634c72a0eb552a1b171f7b8e Mon Sep 17 00:00:00 2001 From: Yangqijun <40876894+Again1013@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:08:55 +0800 Subject: [PATCH 2/4] optimize models --- .vscode/settings.json | 3 ++- Scarb.lock | 3 +-- Scarb.toml | 2 +- src/lib.cairo | 2 +- src/models/dna.cairo | 25 +++++++++++++++---------- src/systems.cairo | 1 + src/systems/spawn.cairo | 23 ++++++++++++++++++++--- 7 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 src/systems.cairo diff --git a/.vscode/settings.json b/.vscode/settings.json index c4414f5..62b4cb7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { // "cairo1.languageServerPath": "~/.dojo/bin/dojo-language-server", "cairo1.enableLanguageServer": true, - "cairo1.enableScarb": true + "cairo1.enableScarb": false, + "cairo1.languageServerPath": "/Users/xolo/.dojo/bin/dojo-language-server" } \ No newline at end of file diff --git a/Scarb.lock b/Scarb.lock index 527a123..be4f9c1 100644 --- a/Scarb.lock +++ b/Scarb.lock @@ -4,7 +4,7 @@ version = 1 [[package]] name = "dojo" version = "0.3.11" -source = "git+https://github.com/dojoengine/dojo#3ad461ed620872972e5bebc101bdabf7d90ccc33" +source = "git+https://github.com/dojoengine/dojo?tag=v0.3.11#1e651b5d4d3b79b14a7d8aa29a92062fcb9e6659" dependencies = [ "dojo_plugin", ] @@ -12,7 +12,6 @@ dependencies = [ [[package]] name = "dojo_plugin" version = "0.3.11" -source = "git+https://github.com/dojoengine/dojo?tag=v0.3.11#1e651b5d4d3b79b14a7d8aa29a92062fcb9e6659" [[package]] name = "realms_adventurers" diff --git a/Scarb.toml b/Scarb.toml index 7871e19..a422925 100644 --- a/Scarb.toml +++ b/Scarb.toml @@ -7,7 +7,7 @@ version = "0.3.5" sierra-replace-ids = true [dependencies] -dojo = { git = "https://github.com/dojoengine/dojo", version = "0.3.11" } +dojo = { git = "https://github.com/dojoengine/dojo", tag = "v0.3.11" } [[target.dojo]] diff --git a/src/lib.cairo b/src/lib.cairo index d99ad44..224a04b 100644 --- a/src/lib.cairo +++ b/src/lib.cairo @@ -1,2 +1,2 @@ mod models; - +mod systems; diff --git a/src/models/dna.cairo b/src/models/dna.cairo index 091d5f0..0678fb5 100644 --- a/src/models/dna.cairo +++ b/src/models/dna.cairo @@ -1,13 +1,13 @@ // the minimum DNA of an Adventurer - use starknet::ContractAddress; + // ID is a unique identifier for an entity #[derive(Model, Copy, Drop, Serde)] struct AdventurerId { #[key] player: ContractAddress, - adventurer_id: u64, + adventurer_id: u128, // // think about the situation where player has a few adventurers // model can't store array yet, so hard code @@ -19,7 +19,7 @@ struct AdventurerId { #[derive(Model, Copy, Drop, Serde)] struct playerAddress { #[key] - adventurer_id: u64, + adventurer_id: u128, player: ContractAddress, } @@ -27,7 +27,7 @@ struct playerAddress { #[derive(Model, Copy, Drop, Serde)] struct Name { #[key] - adventurer_id: u64, + adventurer_id: u128, name: felt252, } @@ -36,7 +36,7 @@ struct Name { #[derive(Model, Copy, Drop, Serde)] struct Energy { #[key] - adventurer_id: u64, + adventurer_id: u128, value: u64, } @@ -44,7 +44,7 @@ struct Energy { #[derive(Model, Copy, Drop, Serde, SerdeLen)] struct Health { #[key] - adventurer_id: u64, + adventurer_id: u128, health: u32, } @@ -53,12 +53,17 @@ struct Health { #[derive(Model, Copy, Drop, Serde)] struct Position { #[key] - adventurer_id: u64, - vec: Vec2, + adventurer_id: u128, + // which map is this adventurer in + locattion: u128, + // where is this adventurer in the map + vec: Vec3, } #[derive(Copy, Drop, Serde, Introspect)] -struct Vec2 { +struct Vec3 { x: u32, - y: u32 + y: u32, + // in case of 3d + z: u32 } diff --git a/src/systems.cairo b/src/systems.cairo new file mode 100644 index 0000000..f5384ed --- /dev/null +++ b/src/systems.cairo @@ -0,0 +1 @@ +mod spawn; \ No newline at end of file diff --git a/src/systems/spawn.cairo b/src/systems/spawn.cairo index f5400f2..c73d738 100644 --- a/src/systems/spawn.cairo +++ b/src/systems/spawn.cairo @@ -1,9 +1,26 @@ +use realms_adventurers::models::dna; + #[starknet::interface] trait IDNA { - fn spawn(self: @TContractState, location: u64); - fn move(self: @TContractState, adventurer_id: u64); + fn spawn(self: @TContractState, location: u128, vec: dna::Vec3); + fn move(self: @TContractState, location: u128, adventurer_id: u64); fn get_adventurer(self: @TContractState, adventurer_id: u64) -> u64; } #[dojo::contract] -mod spawn {} +mod spawn { + use super::IDNA; + use realms_adventurers::models::dna; + + // #[generate_trait] + // impl InternalImpl of InternalTrait {} + + // #[external(v0)] + impl DNAImpl of IDNA { + fn spawn(self: @ContractState, location: u128, vec: dna::Vec3) {} + fn move(self: @ContractState, location: u128, adventurer_id: u64) {} + fn get_adventurer(self: @ContractState, adventurer_id: u64) -> u64 { + 0 + } + } +} From 15866d8b61ce1a9ad2a2c7ab87ba7a29bcd13854 Mon Sep 17 00:00:00 2001 From: Yangqijun <40876894+Again1013@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:55:25 +0800 Subject: [PATCH 3/4] add spawn --- .vscode/settings.json | 2 +- src/models/dna.cairo | 14 +++++++++-- src/systems/spawn.cairo | 52 +++++++++++++++++++++++++++++++++++------ 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 62b4cb7..2c8c984 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { // "cairo1.languageServerPath": "~/.dojo/bin/dojo-language-server", "cairo1.enableLanguageServer": true, - "cairo1.enableScarb": false, + "cairo1.enableScarb": true, "cairo1.languageServerPath": "/Users/xolo/.dojo/bin/dojo-language-server" } \ No newline at end of file diff --git a/src/models/dna.cairo b/src/models/dna.cairo index 0678fb5..1be78ea 100644 --- a/src/models/dna.cairo +++ b/src/models/dna.cairo @@ -2,6 +2,16 @@ use starknet::ContractAddress; +const GAMEKEY: felt252 = 'Adventurer'; +// record the auto-increment id +#[derive(Model, Copy, Drop, Serde)] +struct GameData { + #[key] + key: felt252, + adventurer_id: u128, +} + + // ID is a unique identifier for an entity #[derive(Model, Copy, Drop, Serde)] struct AdventurerId { @@ -17,7 +27,7 @@ struct AdventurerId { } #[derive(Model, Copy, Drop, Serde)] -struct playerAddress { +struct PlayerAddress { #[key] adventurer_id: u128, player: ContractAddress, @@ -55,7 +65,7 @@ struct Position { #[key] adventurer_id: u128, // which map is this adventurer in - locattion: u128, + location: u128, // where is this adventurer in the map vec: Vec3, } diff --git a/src/systems/spawn.cairo b/src/systems/spawn.cairo index c73d738..42736cf 100644 --- a/src/systems/spawn.cairo +++ b/src/systems/spawn.cairo @@ -1,26 +1,64 @@ use realms_adventurers::models::dna; +use starknet::ContractAddress; #[starknet::interface] trait IDNA { - fn spawn(self: @TContractState, location: u128, vec: dna::Vec3); - fn move(self: @TContractState, location: u128, adventurer_id: u64); - fn get_adventurer(self: @TContractState, adventurer_id: u64) -> u64; + fn spawn(self: @TContractState, location: u128, vec: dna::Vec3, name: felt252); + fn move(self: @TContractState, location: u128, adventurer_id: u128); + fn get_adventurer(self: @TContractState, player: ContractAddress) -> u128; +} + +mod error { + const AdventurerAlreadyExists: felt252 = 'adventurer already exists'; } #[dojo::contract] mod spawn { - use super::IDNA; + use super::{IDNA, error}; use realms_adventurers::models::dna; + use starknet::{ContractAddress, get_caller_address}; // #[generate_trait] // impl InternalImpl of InternalTrait {} // #[external(v0)] impl DNAImpl of IDNA { - fn spawn(self: @ContractState, location: u128, vec: dna::Vec3) {} - fn move(self: @ContractState, location: u128, adventurer_id: u64) {} - fn get_adventurer(self: @ContractState, adventurer_id: u64) -> u64 { + // + fn spawn(self: @ContractState, location: u128, vec: dna::Vec3, name: felt252) { + let world = self.world_dispatcher.read(); + let player = get_caller_address(); + + assert( + get!(world, player, (dna::AdventurerId)) == 0, + error::AdventurerAlreadyExists + ); + + let adventurer_id = get!(world, dna::GAMEKEY, (dna::GameData)) + 1; + + set!( + world, + ( + dna::GameData { key: dna::GAMEKEY, adventurer_id: adventurer_id }, + dna::AdventurerId { player: player, adventurer_id: adventurer_id }, + dna::PlayerAddress { adventurer_id: adventurer_id, player: player }, + dna::Name { adventurer_id: adventurer_id, name: name }, + dna::Energy { adventurer_id: adventurer_id, value: 100 }, + dna::Health { adventurer_id: adventurer_id, health: 100 }, + dna::Position { + adventurer_id: adventurer_id, + location: location, + vec: dna::Vec3 { x: vec.x, y: vec.y, z: vec.z } + }, + ) + ); + // emit events + } + + fn move(self: @ContractState, location: u128, adventurer_id: u128) {} + + fn get_adventurer(self: @ContractState, player: ContractAddress) -> u128 { 0 } } } + From a1d5e8c0016b71e78ffe6c725bd67a4f75c79733 Mon Sep 17 00:00:00 2001 From: Yangqijun <40876894+Again1013@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:08:16 +0800 Subject: [PATCH 4/4] add test --- src/models/dna.cairo | 4 +-- src/systems/spawn.cairo | 59 ++++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/models/dna.cairo b/src/models/dna.cairo index 1be78ea..874a1bf 100644 --- a/src/models/dna.cairo +++ b/src/models/dna.cairo @@ -2,12 +2,12 @@ use starknet::ContractAddress; -const GAMEKEY: felt252 = 'Adventurer'; +const GAMEKEY: u128 = 0; // record the auto-increment id #[derive(Model, Copy, Drop, Serde)] struct GameData { #[key] - key: felt252, + game: u128, adventurer_id: u128, } diff --git a/src/systems/spawn.cairo b/src/systems/spawn.cairo index 42736cf..d889c6b 100644 --- a/src/systems/spawn.cairo +++ b/src/systems/spawn.cairo @@ -1,9 +1,9 @@ -use realms_adventurers::models::dna; +use realms_adventurers::models::dna::{Vec3}; use starknet::ContractAddress; #[starknet::interface] trait IDNA { - fn spawn(self: @TContractState, location: u128, vec: dna::Vec3, name: felt252); + fn spawn(self: @TContractState, location: u128, vec: Vec3, name: felt252); fn move(self: @TContractState, location: u128, adventurer_id: u128); fn get_adventurer(self: @TContractState, player: ContractAddress) -> u128; } @@ -15,43 +15,70 @@ mod error { #[dojo::contract] mod spawn { use super::{IDNA, error}; - use realms_adventurers::models::dna; + use realms_adventurers::models::dna::{ + GameData, GAMEKEY, AdventurerId, PlayerAddress, Name, Energy, Health, Position, Vec3 + }; use starknet::{ContractAddress, get_caller_address}; + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + Spawn: Spawn + } + + #[derive(Drop, starknet::Event)] + struct Spawn { + #[key] + player: ContractAddress, + #[key] + adventurer_id: u128 + } + // #[generate_trait] // impl InternalImpl of InternalTrait {} - // #[external(v0)] + #[external(v0)] + fn test(self: @ContractState) { + // let world = self.world_dispatcher.read(); + // let input: felt252 = get_caller_address().into(); + // world.delete_entity('AdventurerId', array![input].span()); + + DNAImpl::spawn(self, 1, Vec3 { x: 0, y: 0, z: 0 }, '1'); + } + + #[external(v0)] impl DNAImpl of IDNA { // - fn spawn(self: @ContractState, location: u128, vec: dna::Vec3, name: felt252) { + fn spawn(self: @ContractState, location: u128, vec: Vec3, name: felt252) { let world = self.world_dispatcher.read(); let player = get_caller_address(); assert( - get!(world, player, (dna::AdventurerId)) == 0, + get!(world, player, (AdventurerId)).adventurer_id == 0, error::AdventurerAlreadyExists ); - let adventurer_id = get!(world, dna::GAMEKEY, (dna::GameData)) + 1; + let adventurer_id = get!(world, GAMEKEY, (GameData)).adventurer_id + 1; set!( world, ( - dna::GameData { key: dna::GAMEKEY, adventurer_id: adventurer_id }, - dna::AdventurerId { player: player, adventurer_id: adventurer_id }, - dna::PlayerAddress { adventurer_id: adventurer_id, player: player }, - dna::Name { adventurer_id: adventurer_id, name: name }, - dna::Energy { adventurer_id: adventurer_id, value: 100 }, - dna::Health { adventurer_id: adventurer_id, health: 100 }, - dna::Position { + GameData { game: GAMEKEY, adventurer_id: adventurer_id }, + AdventurerId { player: player, adventurer_id: adventurer_id }, + PlayerAddress { adventurer_id: adventurer_id, player: player }, + Name { adventurer_id: adventurer_id, name: name }, + Energy { adventurer_id: adventurer_id, value: 100 }, + Health { adventurer_id: adventurer_id, health: 100 }, + Position { adventurer_id: adventurer_id, location: location, - vec: dna::Vec3 { x: vec.x, y: vec.y, z: vec.z } + vec: Vec3 { x: vec.x, y: vec.y, z: vec.z } }, ) ); - // emit events + + // emit events + emit!(world, Spawn { player: player, adventurer_id: adventurer_id }); } fn move(self: @ContractState, location: u128, adventurer_id: u128) {}