Skip to content

Commit 57b5aa3

Browse files
authored
feat: add battle system (#156)
1 parent 9c0b80c commit 57b5aa3

7 files changed

Lines changed: 1014 additions & 56 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
dojo 1.1.1
1+
dojo 1.2.1
22
scarb 2.9.2

backend/dojo_examples/combat_game/src/achievements/achievement.cairo

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ pub impl AchievementImpl of AchievementTrait {
112112
fn tasks(self: Achievement) -> Span<Task> {
113113
match self {
114114
Achievement::None => [].span(),
115-
Achievement::FirstBlood => array![TaskTrait::new('First Blood', 1, "Win a game")].span(),
115+
Achievement::FirstBlood => array![TaskTrait::new('First Blood', 1, "Win a game")]
116+
.span(),
116117
Achievement::Warrior => array![TaskTrait::new('Warrior', 5, "Win 5 games")].span(),
117118
Achievement::Veteran => array![TaskTrait::new('Veteran', 15, "Win 15 games")].span(),
118119
Achievement::Champion => array![TaskTrait::new('Champion', 30, "Win 30 games")].span(),
@@ -164,4 +165,4 @@ pub impl IntoU8Achievement of Into<u8, Achievement> {
164165
_ => Achievement::None,
165166
}
166167
}
167-
}
168+
}

backend/dojo_examples/combat_game/src/helpers/experience_utils.cairo

Lines changed: 212 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ pub trait ExperienceCalculator {
22
fn calculate_exp_needed_for_level(level: u8) -> u16;
33

44
fn should_level_up(current_level: u8, current_exp: u16) -> bool;
5-
5+
66
fn remaining_exp_after_level_up(current_level: u8, current_exp: u16) -> u16;
77
}
88

@@ -19,21 +19,18 @@ pub impl ExperienceCalculatorImpl of ExperienceCalculator {
1919
fn remaining_exp_after_level_up(current_level: u8, current_exp: u16) -> u16 {
2020
if current_exp >= (current_level.into() * current_level.into() * 10_u16) {
2121
current_exp - (current_level.into() * current_level.into() * 10_u16)
22-
}
23-
24-
else {
22+
} else {
2523
current_exp
2624
}
2725
}
2826
}
2927

3028
#[cfg(test)]
3129
mod test {
32-
3330
use super::ExperienceCalculatorImpl;
3431

3532
#[test]
36-
fn test_calculate_exp_needed_for_level(){
33+
fn test_calculate_exp_needed_for_level() {
3734
let level_1: u8 = 1;
3835
let level_2: u8 = 2;
3936
let level_5: u8 = 5;
@@ -46,75 +43,241 @@ mod test {
4643
let exp_needed_for_level_10: u16 = 1000;
4744
let exp_needed_for_level_20: u16 = 4000;
4845

49-
assert_eq!(ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_1), exp_needed_for_level_1, "Experience needed for level 1 should be 10");
50-
assert_eq!(ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_2), exp_needed_for_level_2, "Experience needed for level 2 should be 40");
51-
assert_eq!(ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_5), exp_needed_for_level_5, "Experience needed for level 5 should be 250");
52-
assert_eq!(ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_10), exp_needed_for_level_10, "Experience needed for level 10 should be 1000");
53-
assert_eq!(ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_20), exp_needed_for_level_20, "Experience needed for level 10 should be 1000");
46+
assert_eq!(
47+
ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_1),
48+
exp_needed_for_level_1,
49+
"Experience needed for level 1 should be 10",
50+
);
51+
assert_eq!(
52+
ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_2),
53+
exp_needed_for_level_2,
54+
"Experience needed for level 2 should be 40",
55+
);
56+
assert_eq!(
57+
ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_5),
58+
exp_needed_for_level_5,
59+
"Experience needed for level 5 should be 250",
60+
);
61+
assert_eq!(
62+
ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_10),
63+
exp_needed_for_level_10,
64+
"Experience needed for level 10 should be 1000",
65+
);
66+
assert_eq!(
67+
ExperienceCalculatorImpl::calculate_exp_needed_for_level(level_20),
68+
exp_needed_for_level_20,
69+
"Experience needed for level 10 should be 1000",
70+
);
5471
}
5572

5673
#[test]
57-
fn should_level_up_test(){
74+
fn should_level_up_test() {
5875
let level_1: u8 = 1;
5976
let level_2: u8 = 2;
6077
let level_5: u8 = 5;
6178
let level_10: u8 = 10;
6279
let level_20: u8 = 20;
6380

81+
///For each level instance test there is an instance of the exact exp needed to level up,
82+
///currentexp greater the exp needed to level up, currentexp is less than what is needed.
6483

65-
///For each level instance test there is an instance of the exact exp needed to level up, currentexp greater the exp needed to level up,
66-
///currentexp is less than what is needed.
67-
68-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_1, current_exp: 10), true, "Should pass, exp needed to level up is 10");
69-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_1, current_exp: 11), true, "Should pass, exp needed to level up is 10");
70-
assert_ne!(ExperienceCalculatorImpl::should_level_up(current_level: level_1, current_exp: 9), true, "Should pass, exp needed to level up is 10");
84+
assert_eq!(
85+
ExperienceCalculatorImpl::should_level_up(current_level: level_1, current_exp: 10),
86+
true,
87+
"Should pass, exp needed to level up is 10",
88+
);
89+
assert_eq!(
90+
ExperienceCalculatorImpl::should_level_up(current_level: level_1, current_exp: 11),
91+
true,
92+
"Should pass, exp needed to level up is 10",
93+
);
94+
assert_ne!(
95+
ExperienceCalculatorImpl::should_level_up(current_level: level_1, current_exp: 9),
96+
true,
97+
"Should pass, exp needed to level up is 10",
98+
);
7199

72-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_2, current_exp: 41), true, "Should pass, exp needed to level up is 40");
73-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_2, current_exp: 40), true, "Should pass, exp needed to level up is 40");
74-
assert_ne!(ExperienceCalculatorImpl::should_level_up(current_level: level_2, current_exp: 39), true, "Should pass, exp needed to level up is 40");
100+
assert_eq!(
101+
ExperienceCalculatorImpl::should_level_up(current_level: level_2, current_exp: 41),
102+
true,
103+
"Should pass, exp needed to level up is 40",
104+
);
105+
assert_eq!(
106+
ExperienceCalculatorImpl::should_level_up(current_level: level_2, current_exp: 40),
107+
true,
108+
"Should pass, exp needed to level up is 40",
109+
);
110+
assert_ne!(
111+
ExperienceCalculatorImpl::should_level_up(current_level: level_2, current_exp: 39),
112+
true,
113+
"Should pass, exp needed to level up is 40",
114+
);
75115

76-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_5, current_exp: 250), true, "Should pass, exp needed to level up is 250");
77-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_5, current_exp: 251), true, "Should pass, exp needed to level up is 250");
78-
assert_ne!(ExperienceCalculatorImpl::should_level_up(current_level: level_5, current_exp: 249), true, "Should pass, exp needed to level up is 250");
116+
assert_eq!(
117+
ExperienceCalculatorImpl::should_level_up(current_level: level_5, current_exp: 250),
118+
true,
119+
"Should pass, exp needed to level up is 250",
120+
);
121+
assert_eq!(
122+
ExperienceCalculatorImpl::should_level_up(current_level: level_5, current_exp: 251),
123+
true,
124+
"Should pass, exp needed to level up is 250",
125+
);
126+
assert_ne!(
127+
ExperienceCalculatorImpl::should_level_up(current_level: level_5, current_exp: 249),
128+
true,
129+
"Should pass, exp needed to level up is 250",
130+
);
79131

80-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_10, current_exp: 1000), true, "Should pass, exp needed to level up is 100");
81-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_10, current_exp: 1001), true, "Should pass, exp needed to level up is 100");
82-
assert_ne!(ExperienceCalculatorImpl::should_level_up(current_level: level_10, current_exp: 999), true, "Should pass, exp needed to level up is 100");
132+
assert_eq!(
133+
ExperienceCalculatorImpl::should_level_up(current_level: level_10, current_exp: 1000),
134+
true,
135+
"Should pass, exp needed to level up is 100",
136+
);
137+
assert_eq!(
138+
ExperienceCalculatorImpl::should_level_up(current_level: level_10, current_exp: 1001),
139+
true,
140+
"Should pass, exp needed to level up is 100",
141+
);
142+
assert_ne!(
143+
ExperienceCalculatorImpl::should_level_up(current_level: level_10, current_exp: 999),
144+
true,
145+
"Should pass, exp needed to level up is 100",
146+
);
83147

84-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_20, current_exp: 4000), true, "Should pass, exp needed to level up is 4000");
85-
assert_eq!(ExperienceCalculatorImpl::should_level_up(current_level: level_20, current_exp: 4001), true, "Should pass, exp needed to level up is 4000");
86-
assert_ne!(ExperienceCalculatorImpl::should_level_up(current_level: level_20, current_exp: 3999), true, "Should pass, exp needed to level up is 4000");
148+
assert_eq!(
149+
ExperienceCalculatorImpl::should_level_up(current_level: level_20, current_exp: 4000),
150+
true,
151+
"Should pass, exp needed to level up is 4000",
152+
);
153+
assert_eq!(
154+
ExperienceCalculatorImpl::should_level_up(current_level: level_20, current_exp: 4001),
155+
true,
156+
"Should pass, exp needed to level up is 4000",
157+
);
158+
assert_ne!(
159+
ExperienceCalculatorImpl::should_level_up(current_level: level_20, current_exp: 3999),
160+
true,
161+
"Should pass, exp needed to level up is 4000",
162+
);
87163
}
88164

89165
#[test]
90-
fn remaining_exp_after_level_up_test(){
166+
fn remaining_exp_after_level_up_test() {
91167
let level_1: u8 = 1;
92168
let level_2: u8 = 2;
93169
let level_5: u8 = 5;
94170
let level_10: u8 = 10;
95171
let level_20: u8 = 20;
96172

97-
173+
assert_eq!(
174+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
175+
current_level: level_1, current_exp: 12,
176+
),
177+
2,
178+
"The remaining exp should be current_exp - exp_needed",
179+
);
180+
assert_eq!(
181+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
182+
current_level: level_1, current_exp: 17,
183+
),
184+
7,
185+
"The remaining exp should be current_exp - exp_needed",
186+
);
187+
assert_eq!(
188+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
189+
current_level: level_1, current_exp: 8,
190+
),
191+
8,
192+
"The remaining exp should be current_exp - exp_needed",
193+
);
98194

99-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_1, current_exp: 12), 2, "The remaining exp should be current_exp - exp_needed");
100-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_1, current_exp: 17), 7, "The remaining exp should be current_exp - exp_needed");
101-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_1, current_exp:8), 8, "The remaining exp should be current_exp - exp_needed");
102-
103-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_2, current_exp:44), 4, "The remaining exp should be current_exp - exp_needed");
104-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_2, current_exp:160), 120, "The remaining exp should be current_exp - exp_needed");
105-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_2, current_exp: 32), 32, "The remaining exp should be current_exp - exp_needed");
195+
assert_eq!(
196+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
197+
current_level: level_2, current_exp: 44,
198+
),
199+
4,
200+
"The remaining exp should be current_exp - exp_needed",
201+
);
202+
assert_eq!(
203+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
204+
current_level: level_2, current_exp: 160,
205+
),
206+
120,
207+
"The remaining exp should be current_exp - exp_needed",
208+
);
209+
assert_eq!(
210+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
211+
current_level: level_2, current_exp: 32,
212+
),
213+
32,
214+
"The remaining exp should be current_exp - exp_needed",
215+
);
106216

107-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_5, current_exp: 260), 10, "The remaining exp should be current_exp - exp_needed");
108-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_5, current_exp: 400), 150, "The remaining exp should be current_exp - exp_needed");
109-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_5, current_exp: 200), 200, "The remaining exp should be current_exp - exp_needed");
217+
assert_eq!(
218+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
219+
current_level: level_5, current_exp: 260,
220+
),
221+
10,
222+
"The remaining exp should be current_exp - exp_needed",
223+
);
224+
assert_eq!(
225+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
226+
current_level: level_5, current_exp: 400,
227+
),
228+
150,
229+
"The remaining exp should be current_exp - exp_needed",
230+
);
231+
assert_eq!(
232+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
233+
current_level: level_5, current_exp: 200,
234+
),
235+
200,
236+
"The remaining exp should be current_exp - exp_needed",
237+
);
110238

111-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_10, current_exp: 1020), 20, "The remaining exp should be current_exp - exp_needed");
112-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_10, current_exp: 2000), 1000, "The remaining exp should be current_exp - exp_needed");
113-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_10, current_exp: 950), 950, "The remaining exp should be current_exp - exp_needed");
239+
assert_eq!(
240+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
241+
current_level: level_10, current_exp: 1020,
242+
),
243+
20,
244+
"The remaining exp should be current_exp - exp_needed",
245+
);
246+
assert_eq!(
247+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
248+
current_level: level_10, current_exp: 2000,
249+
),
250+
1000,
251+
"The remaining exp should be current_exp - exp_needed",
252+
);
253+
assert_eq!(
254+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
255+
current_level: level_10, current_exp: 950,
256+
),
257+
950,
258+
"The remaining exp should be current_exp - exp_needed",
259+
);
114260

115-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_20, current_exp: 4100), 100, "The remaining exp should be current_exp - exp_needed");
116-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_20, current_exp: 4700), 700, "The remaining exp should be current_exp - exp_needed");
117-
assert_eq!(ExperienceCalculatorImpl::remaining_exp_after_level_up(current_level: level_20, current_exp: 3800), 3800, "The remaining exp should be current_exp - exp_needed");
118-
261+
assert_eq!(
262+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
263+
current_level: level_20, current_exp: 4100,
264+
),
265+
100,
266+
"The remaining exp should be current_exp - exp_needed",
267+
);
268+
assert_eq!(
269+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
270+
current_level: level_20, current_exp: 4700,
271+
),
272+
700,
273+
"The remaining exp should be current_exp - exp_needed",
274+
);
275+
assert_eq!(
276+
ExperienceCalculatorImpl::remaining_exp_after_level_up(
277+
current_level: level_20, current_exp: 3800,
278+
),
279+
3800,
280+
"The remaining exp should be current_exp - exp_needed",
281+
);
119282
}
120283
}

backend/dojo_examples/combat_game/src/lib.cairo

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,6 @@ pub mod achievements {
4141
pub mod achievement;
4242
}
4343

44-
pub mod tests {}
44+
pub mod tests {
45+
mod test_battle;
46+
}

backend/dojo_examples/combat_game/src/store.cairo

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use combat_game::{
44
constants::SECONDS_PER_DAY,
55
models::{
66
player::Player, beast::{Beast, BeastTrait}, skill, skill::{Skill, SkillTrait},
7-
beast_skill::BeastSkill, beast_stats::{BeastStats, BeastStatsActionTrait}, battle::{Battle, BattleTrait},
7+
beast_skill::BeastSkill, beast_stats::{BeastStats, BeastStatsActionTrait},
8+
battle::{Battle, BattleTrait},
89
},
910
types::{
1011
beast_type::BeastType, skill::SkillType, status_condition::StatusCondition,
@@ -20,7 +21,7 @@ struct Store {
2021
}
2122

2223
#[generate_trait]
23-
impl StoreImpl of StoreTrait {
24+
pub impl StoreImpl of StoreTrait {
2425
fn new(world: WorldStorage) -> Store {
2526
Store { world: world }
2627
}
@@ -242,7 +243,9 @@ impl StoreImpl of StoreTrait {
242243
fn create_rematch(ref self: Store, battle_id: u256) -> Battle {
243244
let battle = self.read_battle(battle_id);
244245

245-
let rematch = BattleTrait::new(battle_id, battle.player1, battle.player2, battle.battle_type);
246+
let rematch = BattleTrait::new(
247+
battle_id, battle.player1, battle.player2, battle.battle_type,
248+
);
246249
self.world.write_model(@rematch);
247250
rematch
248251
}

0 commit comments

Comments
 (0)