From e2d8ff96d8f1f54b8e21b4de426301356a664d9d Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Sat, 7 Jun 2025 20:38:32 -0600 Subject: [PATCH 1/5] Adding basic achievements setup --- .../src/achievements/achievement.cairo | 34 +++++++++++++++++++ .../dojo_examples/combat_game/src/lib.cairo | 4 +++ 2 files changed, 38 insertions(+) create mode 100644 backend/dojo_examples/combat_game/src/achievements/achievement.cairo diff --git a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo new file mode 100644 index 0000000..5a271e1 --- /dev/null +++ b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo @@ -0,0 +1,34 @@ +#[derive(Copy, Drop, Serde, Debug, Introspect, PartialEq)] +pub enum Achievement { + FirstBlood, + Warrior, + Veteran, + Champion, + Legend, +} + +pub impl IntoAchievementU8 of Into { + #[inline(always)] + fn into(self: Achievement) -> u8 { + match self { + Achievement::FirstBlood => 0, + Achievement::Warrior => 1, + Achievement::Veteran => 2, + Achievement::Champion => 3, + Achievement::Legend => 4, + } + } +} + +pub impl IntoU8Achievement of Into { + #[inline(always)] + fn into(self: u8) -> Achievement { + match self { + 0 => Achievement::FirstBlood, + 1 => Achievement::Warrior, + 2 => Achievement::Veteran, + 3 => Achievement::Champion, + 4 => Achievement::Legend, + } + } +} \ No newline at end of file diff --git a/backend/dojo_examples/combat_game/src/lib.cairo b/backend/dojo_examples/combat_game/src/lib.cairo index 387f3d1..3df95ea 100644 --- a/backend/dojo_examples/combat_game/src/lib.cairo +++ b/backend/dojo_examples/combat_game/src/lib.cairo @@ -37,4 +37,8 @@ pub mod utils { pub mod string; } +pub mod achievements { + pub mod achievement; +} + pub mod tests {} From 4aefe74a61d3d2363485b0c383e8ed22a231eef4 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Sat, 7 Jun 2025 20:42:37 -0600 Subject: [PATCH 2/5] Adding None option for enum --- .../combat_game/src/achievements/achievement.cairo | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo index 5a271e1..f0aab09 100644 --- a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo +++ b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo @@ -5,6 +5,7 @@ pub enum Achievement { Veteran, Champion, Legend, + None, } pub impl IntoAchievementU8 of Into { @@ -16,6 +17,7 @@ pub impl IntoAchievementU8 of Into { Achievement::Veteran => 2, Achievement::Champion => 3, Achievement::Legend => 4, + Achievement::None => 5, } } } @@ -29,6 +31,7 @@ pub impl IntoU8Achievement of Into { 2 => Achievement::Veteran, 3 => Achievement::Champion, 4 => Achievement::Legend, + 5 => Achievement::None, } } } \ No newline at end of file From f9a1a48ab76bc2d5990c9b9fba3f6b4fb4143252 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Mon, 9 Jun 2025 21:41:34 -0600 Subject: [PATCH 3/5] Little refactor --- .../src/achievements/achievement.cairo | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo index f0aab09..954e87c 100644 --- a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo +++ b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo @@ -12,12 +12,12 @@ pub impl IntoAchievementU8 of Into { #[inline(always)] fn into(self: Achievement) -> u8 { match self { - Achievement::FirstBlood => 0, - Achievement::Warrior => 1, - Achievement::Veteran => 2, - Achievement::Champion => 3, - Achievement::Legend => 4, - Achievement::None => 5, + Achievement::None => 0, + Achievement::FirstBlood => 1, + Achievement::Warrior => 2, + Achievement::Veteran => 3, + Achievement::Champion => 4, + Achievement::Legend => 5, } } } @@ -26,12 +26,13 @@ pub impl IntoU8Achievement of Into { #[inline(always)] fn into(self: u8) -> Achievement { match self { - 0 => Achievement::FirstBlood, - 1 => Achievement::Warrior, - 2 => Achievement::Veteran, - 3 => Achievement::Champion, - 4 => Achievement::Legend, - 5 => Achievement::None, + 0 => Achievement::None, + 1 => Achievement::FirstBlood, + 2 => Achievement::Warrior, + 3 => Achievement::Veteran, + 4 => Achievement::Champion, + 5 => Achievement::Legend, + _ => Achievement::None, } } } \ No newline at end of file From 3b408642f5b7c2267eb8b9b960d1ba882e77ded9 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Tue, 10 Jun 2025 15:23:17 -0600 Subject: [PATCH 4/5] Adding imports required for achievements and conversions --- .../combat_game/src/achievements/achievement.cairo | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo index 954e87c..65d067b 100644 --- a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo +++ b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo @@ -1,3 +1,9 @@ +// Dojo achievements import +use achievement::types::task::{Task, TaskTrait}; + +// Into trait import +use core::traits::Into; + #[derive(Copy, Drop, Serde, Debug, Introspect, PartialEq)] pub enum Achievement { FirstBlood, From d78f799f87fb8a284c0dd90a44b24649bc71cc59 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Tue, 10 Jun 2025 15:47:17 -0600 Subject: [PATCH 5/5] Adding each impl for each functionality --- .../src/achievements/achievement.cairo | 127 +++++++++++++++++- 1 file changed, 125 insertions(+), 2 deletions(-) diff --git a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo index 65d067b..102501a 100644 --- a/backend/dojo_examples/combat_game/src/achievements/achievement.cairo +++ b/backend/dojo_examples/combat_game/src/achievements/achievement.cairo @@ -14,8 +14,131 @@ pub enum Achievement { None, } +#[generate_trait] +pub impl AchievementImpl of AchievementTrait { + #[inline] + fn identifier(self: Achievement) -> felt252 { + match self { + Achievement::None => '', + Achievement::FirstBlood => 'first blood', + Achievement::Warrior => 'warrior', + Achievement::Veteran => 'veteran', + Achievement::Champion => 'champion', + Achievement::Legend => 'legend', + } + } + + #[inline] + fn hidden(self: Achievement) -> bool { + match self { + Achievement::None => true, + _ => false, + } + } + + #[inline] + fn index(self: Achievement) -> u8 { + match self { + Achievement::None => 0, + Achievement::FirstBlood => 1, + Achievement::Warrior => 2, + Achievement::Veteran => 3, + Achievement::Champion => 4, + Achievement::Legend => 5, + } + } + + #[inline] + fn points(self: Achievement) -> u8 { + match self { + Achievement::None => 0, + Achievement::FirstBlood => 10, + Achievement::Warrior => 25, + Achievement::Veteran => 50, + Achievement::Champion => 100, + Achievement::Legend => 200, + } + } + + #[inline] + fn group(self: Achievement) -> felt252 { + match self { + Achievement::None => '', + Achievement::FirstBlood => 'Battle Master', + Achievement::Warrior => 'Battle Master', + Achievement::Veteran => 'Battle Master', + Achievement::Champion => 'Battle Master', + Achievement::Legend => 'Battle Master', + } + } + + #[inline] + fn icon(self: Achievement) -> felt252 { + match self { + Achievement::None => '', + Achievement::FirstBlood => 'fa-sword', + Achievement::Warrior => 'fa-shield', + Achievement::Veteran => 'fa-crown', + Achievement::Champion => 'fa-trophy', + Achievement::Legend => 'fa-dragon', + } + } + + #[inline] + fn title(self: Achievement) -> felt252 { + match self { + Achievement::None => '', + Achievement::FirstBlood => 'First Blood', + Achievement::Warrior => 'Seasoned Warrior', + Achievement::Veteran => 'Seasoned Veteran', + Achievement::Champion => 'Seasoned Champion', + Achievement::Legend => 'Seasoned Legend', + } + } + + #[inline] + fn description(self: Achievement) -> ByteArray { + match self { + Achievement::None => "", + Achievement::FirstBlood => "You've won your first battle, a true novice.", + Achievement::Warrior => "You've won 5 battles, a prodigy in the making.", + Achievement::Veteran => "You've won 15 battles, a heroic gamer.", + Achievement::Champion => "You've won 30 battles, an ultimate champion.", + Achievement::Legend => "You've won 50 battles, the one and only.", + } + } + + #[inline] + fn tasks(self: Achievement) -> Span { + match self { + Achievement::None => [].span(), + Achievement::FirstBlood => array![TaskTrait::new('First Blood', 1, "Win a game")].span(), + Achievement::Warrior => array![TaskTrait::new('Warrior', 5, "Win 5 games")].span(), + Achievement::Veteran => array![TaskTrait::new('Veteran', 15, "Win 15 games")].span(), + Achievement::Champion => array![TaskTrait::new('Champion', 30, "Win 30 games")].span(), + Achievement::Legend => array![TaskTrait::new('Legend', 50, "Win 50 games")].span(), + } + } + + #[inline] + fn start(self: Achievement) -> ByteArray { + "" + } + + #[inline] + fn end(self: Achievement) -> ByteArray { + "" + } + + #[inline] + fn data(self: Achievement) -> ByteArray { + "" + } +} + + pub impl IntoAchievementU8 of Into { - #[inline(always)] + #[inline] fn into(self: Achievement) -> u8 { match self { Achievement::None => 0, @@ -29,7 +152,7 @@ pub impl IntoAchievementU8 of Into { } pub impl IntoU8Achievement of Into { - #[inline(always)] + #[inline] fn into(self: u8) -> Achievement { match self { 0 => Achievement::None,