From 37291bdbd9882d423ca87cdec273b5f9553ae232 Mon Sep 17 00:00:00 2001 From: Ibrahim Suleiman Date: Sun, 9 Feb 2025 15:39:42 +0100 Subject: [PATCH] chore: separate helper functions from constants --- onchain/Scarb.toml | 1 + onchain/src/constants.cairo | 206 ------------------------ onchain/src/helpers.cairo | 207 +++++++++++++++++++++++++ onchain/src/lib.cairo | 2 + onchain/src/systems/game_actions.cairo | 6 +- onchain/src/tests/test_game.cairo | 2 +- onchain/src/tests/test_helpers.cairo | 44 ++++++ 7 files changed, 259 insertions(+), 209 deletions(-) create mode 100644 onchain/src/helpers.cairo create mode 100644 onchain/src/tests/test_helpers.cairo diff --git a/onchain/Scarb.toml b/onchain/Scarb.toml index 0b4b599..3a24a7b 100644 --- a/onchain/Scarb.toml +++ b/onchain/Scarb.toml @@ -2,6 +2,7 @@ cairo-version = "=2.9.2" name = "starkludo" version = "0.1.0" +# edition = "2024_07" [cairo] sierra-replace-ids = true diff --git a/onchain/src/constants.cairo b/onchain/src/constants.cairo index c137261..fc8aef8 100644 --- a/onchain/src/constants.cairo +++ b/onchain/src/constants.cairo @@ -43,209 +43,3 @@ pub enum TileNode { B03, B04, } - -fn get_safe_positions() -> Array { - array![ - 1, - 9, - 14, - 22, - 27, - 35, - 40, - 48, - 1001, - 1002, - 1003, - 1004, - 1005, - 2001, - 2002, - 2003, - 2004, - 2005, - 3001, - 3002, - 3003, - 3004, - 3005, - 4001, - 4002, - 4003, - 4004, - 4005, - ] -} - -fn get_markers() -> Array { - array![ - 'r0', - 'r1', - 'r2', - 'r3', - 'g0', - 'g1', - 'g2', - 'g3', - 'y0', - 'y1', - 'y2', - 'y3', - 'b0', - 'b1', - 'b2', - 'b3', - ] -} - -fn find_index(value: felt252, a: Array) -> usize { - let mut i = 0; - loop { - if (i >= a.len()) { - break 0; - } else if (a.at(i) == @value) { - break i; - } - i += 1; - } -} - -fn get_start_points() -> Array { - array![0, 13, 26, 39] -} - -fn board_to_pos(arr: Array) -> Array { - let mut new_arr: Array = ArrayTrait::new(); - let mut i: u32 = 0; - - loop { - if i >= arr.len() { - break; - } - - let val = *arr.at(i); - let color: u32 = i / 4; - - let new_val = if val > 52 { - 51 + (val % 1000) - } else if val == 0 { - 0 - } else { - let diff = if val >= *get_start_points().at(color) { - val - *get_start_points().at(color) - } else { - val + 52 - *get_start_points().at(color) - }; - - if diff < 1 { - diff + 52 - } else { - diff - } - }; - - new_arr.append(new_val); - i += 1; - }; - - new_arr -} - -fn pos_to_board(arr: Array) -> Array { - let mut new_arr: Array = ArrayTrait::new(); - let mut i: u32 = 0; - - loop { - if i >= arr.len() { - break; - } - - let val = *arr.at(i); - let color: u32 = i / 4; - - let new_val = if val > 51 { - (color + 1) * 1000 + (val % 50) - 1 - } else if val == 0 { - 0 - } else { - let a = (*get_start_points().at(color) + val) % 52; - if a == 0 { - 52 - } else { - a - } - }; - - new_arr.append(new_val); - i += 1; - }; - - new_arr -} - -fn zero_address() -> ContractAddress { - contract_address_const::<0x0>() -} - -fn contains(array: Array, value: u32) -> bool { - let mut found = false; - for item in array { - if item == value { - found = true; - break; - } - }; - return found; -} - -fn get_cap_colors() -> Array { - array!['R', 'G', 'Y', 'B'] -} - -fn pos_reducer(data: Array, active_colors: Array) -> Array { - let mut game: Array = ArrayTrait::new(); - let cap_colors = get_cap_colors(); - - let mut active_piece_count: u32 = 0; - let mut i: u32 = 0; - loop { - if i >= data.len() { - break; - } - - let d = *data.at(i); - - // Determine the color index based on the current index - let color_index = i / 4; - let piece_index = i % 4; - - let mut active_colors_u32: Array = ArrayTrait::new(); - for color in active_colors.clone() { - active_colors_u32.append((color).into()); - }; - - // Check if the current color is in the active colors - if contains(active_colors_u32, color_index) { - let color_id = color_index; - - let color_char = *cap_colors.at(color_id.into()); - - let value = if d == 0 { - let piece_offset = piece_index + 1; - color_char * 100 + piece_offset.into() - } else if d > 1000 { - let remainder = d % 1000; - color_char * 1000 + remainder.into() - } else { - d.into() - }; - - game.append(value); - - active_piece_count += 1; - } - i += 1; - }; - - game -} diff --git a/onchain/src/helpers.cairo b/onchain/src/helpers.cairo new file mode 100644 index 0000000..0252729 --- /dev/null +++ b/onchain/src/helpers.cairo @@ -0,0 +1,207 @@ +use starknet::{ContractAddress, contract_address_const}; + +pub fn get_safe_positions() -> Array { + array![ + 1, + 9, + 14, + 22, + 27, + 35, + 40, + 48, + 1001, + 1002, + 1003, + 1004, + 1005, + 2001, + 2002, + 2003, + 2004, + 2005, + 3001, + 3002, + 3003, + 3004, + 3005, + 4001, + 4002, + 4003, + 4004, + 4005, + ] +} + +pub fn get_markers() -> Array { + array![ + 'r0', + 'r1', + 'r2', + 'r3', + 'g0', + 'g1', + 'g2', + 'g3', + 'y0', + 'y1', + 'y2', + 'y3', + 'b0', + 'b1', + 'b2', + 'b3', + ] +} + +pub fn find_index(value: felt252, a: Array) -> usize { + let mut i = 0; + loop { + if (i >= a.len()) { + break 0; + } else if (a.at(i) == @value) { + break i; + } + i += 1; + } +} + +pub fn get_start_points() -> Array { + array![0, 13, 26, 39] +} + +pub fn board_to_pos(arr: Array) -> Array { + let mut new_arr: Array = ArrayTrait::new(); + let mut i: u32 = 0; + + loop { + if i >= arr.len() { + break; + } + + let val = *arr.at(i); + let color: u32 = i / 4; + + let new_val = if val > 52 { + 51 + (val % 1000) + } else if val == 0 { + 0 + } else { + let diff = if val >= *get_start_points().at(color) { + val - *get_start_points().at(color) + } else { + val + 52 - *get_start_points().at(color) + }; + + if diff < 1 { + diff + 52 + } else { + diff + } + }; + + new_arr.append(new_val); + i += 1; + }; + + new_arr +} + +pub fn pos_to_board(arr: Array) -> Array { + let mut new_arr: Array = ArrayTrait::new(); + let mut i: u32 = 0; + + loop { + if i >= arr.len() { + break; + } + + let val = *arr.at(i); + let color: u32 = i / 4; + + let new_val = if val > 51 { + (color + 1) * 1000 + (val % 50) - 1 + } else if val == 0 { + 0 + } else { + let a = (*get_start_points().at(color) + val) % 52; + if a == 0 { + 52 + } else { + a + } + }; + + new_arr.append(new_val); + i += 1; + }; + + new_arr +} + +pub fn zero_address() -> ContractAddress { + contract_address_const::<0x0>() +} + +pub fn contains(array: Array, value: u32) -> bool { + let mut found = false; + for item in array { + if item == value { + found = true; + break; + } + }; + return found; +} + +pub fn get_cap_colors() -> Array { + array!['R', 'G', 'Y', 'B'] +} + +pub fn pos_reducer(data: Array, active_colors: Array) -> Array { + let mut game: Array = ArrayTrait::new(); + let cap_colors = get_cap_colors(); + + let mut active_piece_count: u32 = 0; + let mut i: u32 = 0; + loop { + if i >= data.len() { + break; + } + + let d = *data.at(i); + + // Determine the color index based on the current index + let color_index = i / 4; + let piece_index = i % 4; + + let mut active_colors_u32: Array = ArrayTrait::new(); + for color in active_colors.clone() { + active_colors_u32.append((color).into()); + }; + + // Check if the current color is in the active colors + if contains(active_colors_u32, color_index) { + let color_id = color_index; + + let color_char = *cap_colors.at(color_id.into()); + + let value = if d == 0 { + let piece_offset = piece_index + 1; + color_char * 100 + piece_offset.into() + } else if d > 1000 { + let remainder = d % 1000; + color_char * 1000 + remainder.into() + } else { + d.into() + }; + + game.append(value); + + active_piece_count += 1; + } + i += 1; + }; + + game +} diff --git a/onchain/src/lib.cairo b/onchain/src/lib.cairo index dd3f3b3..0971958 100644 --- a/onchain/src/lib.cairo +++ b/onchain/src/lib.cairo @@ -9,7 +9,9 @@ mod models { mod constants; mod errors; +mod helpers; mod tests { mod test_game; + mod test_helpers; } diff --git a/onchain/src/systems/game_actions.cairo b/onchain/src/systems/game_actions.cairo index 34a93ea..1434ea3 100644 --- a/onchain/src/systems/game_actions.cairo +++ b/onchain/src/systems/game_actions.cairo @@ -39,7 +39,7 @@ pub mod GameActions { use dojo::event::EventStorage; use origami_random::dice::{Dice, DiceTrait}; use starkludo::errors::Errors; - use starkludo::constants::{ + use starkludo::helpers::{ get_markers, find_index, pos_to_board, board_to_pos, get_safe_positions, contains, pos_reducer, get_cap_colors, }; @@ -660,7 +660,9 @@ pub mod GameActions { username_map.address } - fn get_next_color(ref self: ContractState, current_color: u8, isChance: bool, game_id: u64) -> u8 { + fn get_next_color( + ref self: ContractState, current_color: u8, isChance: bool, game_id: u64, + ) -> u8 { // Gather only active colors let mut active_colors: Array = self.get_active_colors(game_id); diff --git a/onchain/src/tests/test_game.cairo b/onchain/src/tests/test_game.cairo index 6fe713b..3a99815 100644 --- a/onchain/src/tests/test_game.cairo +++ b/onchain/src/tests/test_game.cairo @@ -22,7 +22,7 @@ mod tests { use starkludo::models::game::{GameMode, GameStatus}; use starkludo::errors::Errors; - use starkludo::constants::{find_index, board_to_pos, pos_to_board, contains, pos_reducer}; + use starkludo::helpers::{find_index, board_to_pos, pos_to_board, contains, pos_reducer}; /// Defines the namespace configuration for the Starkludo game system /// Returns a NamespaceDef struct containing namespace name and associated resources diff --git a/onchain/src/tests/test_helpers.cairo b/onchain/src/tests/test_helpers.cairo new file mode 100644 index 0000000..12066eb --- /dev/null +++ b/onchain/src/tests/test_helpers.cairo @@ -0,0 +1,44 @@ +#[cfg(test)] +mod test_helpers { + use starkludo::helpers::{get_start_points, get_markers}; + + // ******************************************* + // get_start_points + // ******************************************* + + #[test] + fn test_get_start_points_returns_successfully() { + let actual_result = get_start_points(); + let expected_result = array![0, 13, 26, 39]; + assert_eq!(actual_result, expected_result); + } + + + // ******************************************* + // get_markers + // ******************************************* + + #[test] + fn test_get_markers_returns_successfully() { + let actual_result = get_markers(); + let expected_result = array![ + 'r0', + 'r1', + 'r2', + 'r3', + 'g0', + 'g1', + 'g2', + 'g3', + 'y0', + 'y1', + 'y2', + 'y3', + 'b0', + 'b1', + 'b2', + 'b3', + ]; + assert_eq!(actual_result, expected_result); + } +}