tiler_core/field/
four_rooms.rs

1use crate::field::{Cell, CellSize, Coords, GenerateResult, Size, COLORS};
2use crate::locale::Locale;
3use rand::{RngCore, SeedableRng};
4use rand_chacha::ChaCha20Rng;
5
6pub const STRART_CELLS: &'static [Locale<'static>] = &[
7    Locale {
8        ru: "Диагональ",
9        en: "Diagonal",
10    },
11    Locale {
12        ru: "Стороны",
13        en: "Side-toside",
14    },
15    Locale {
16        ru: "Meeting",
17        en: "Meeting",
18    },
19];
20
21pub fn generate_fn<'a>(
22    size: Size,
23    start_points_type: usize,
24    count_colors: usize,
25    seed: [u8; 32],
26) -> GenerateResult {
27    let mut r: ChaCha20Rng = SeedableRng::from_seed(seed);
28    let mut data: Vec<Cell> = vec![];
29    let count_colors = match count_colors >= 4 {
30        true => count_colors,
31        false => 4,
32    };
33
34    let count_colors = match count_colors < COLORS.len() {
35        true => count_colors,
36        false => COLORS.len() - 1,
37    };
38
39    let size_x = size.x * 2 + 1;
40    let size_y = size.y * 2 + 1;
41
42    for room in 0..4 {
43        let dx = match room {
44            1 | 3 => size.x + 1,
45            _ => 0,
46        };
47
48        let dy = match room {
49            2 | 3 => size.y + 1,
50            _ => 0,
51        };
52
53        for i in 0..size.x {
54            for j in 0..size.y {
55                let mut neighbors: Vec<usize> = vec![];
56                let offset = ((size.x * size.y) * room) as usize;
57                if i > 0 {
58                    neighbors.push(((i - 1) * size.y + j) as usize + offset);
59                }
60                if i < size.x - 1 {
61                    neighbors.push(((i + 1) * size.y + j) as usize + offset);
62                }
63                if j > 0 {
64                    neighbors.push((i * size.y + j - 1) as usize + offset);
65                }
66                if j < size.y - 1 {
67                    neighbors.push((i * size.y + j + 1) as usize + offset);
68                }
69
70                let cell = Cell {
71                    coord: Coords {
72                        x: (1.0 / size_x as f32) * (i + dx) as f32,
73                        y: (1.0 / size_y as f32) * (j + dy) as f32,
74                    },
75                    owner: None,
76                    color: (r.next_u32() % count_colors as u32) as usize,
77                    size: CellSize {
78                        x: (1.0 / size_x as f32),
79                        y: (1.0 / size_y as f32),
80                    },
81                    neighbors: neighbors,
82                };
83
84                data.push(cell);
85            }
86        }
87    }
88
89    let mut start_cells: Vec<Vec<usize>> = vec![];
90
91    match start_points_type {
92        1 => {
93            start_cells.push(vec![
94                (size.x * size.y * 0 + 0) as usize,
95                (size.x * size.y * 0 + size.y * (size.x - 1)) as usize,
96                (size.x * size.y * 1 + 0) as usize,
97                (size.x * size.y * 1 + size.y * (size.x - 1)) as usize,
98                (size.x * size.y * 2 + 0) as usize,
99                (size.x * size.y * 2 + size.y * (size.x - 1)) as usize,
100                (size.x * size.y * 3 + 0) as usize,
101                (size.x * size.y * 3 + size.y * (size.x - 1)) as usize,
102            ]);
103            start_cells.push(vec![
104                (size.x * size.y * 0 + (size.y - 1)) as usize,
105                (size.x * size.y * 0 + size.x * size.y - 1) as usize,
106                (size.x * size.y * 1 + (size.y - 1)) as usize,
107                (size.x * size.y * 1 + size.x * size.y - 1) as usize,
108                (size.x * size.y * 2 + (size.y - 1)) as usize,
109                (size.x * size.y * 2 + size.x * size.y - 1) as usize,
110                (size.x * size.y * 3 + (size.y - 1)) as usize,
111                (size.x * size.y * 3 + size.x * size.y - 1) as usize,
112            ]);
113        }
114        2 => {
115            start_cells.push(vec![
116                (size.x * size.y * 0 + 0) as usize,
117                (size.x * size.y * 0 + size.x * size.y - 1) as usize,
118                (size.x * size.y * 1 + 0) as usize,
119                (size.x * size.y * 1 + size.x * size.y - 1) as usize,
120                (size.x * size.y * 2 + 0) as usize,
121                (size.x * size.y * 2 + size.x * size.y - 1) as usize,
122                (size.x * size.y * 3 + 0) as usize,
123                (size.x * size.y * 3 + size.x * size.y - 1) as usize,
124            ]);
125            start_cells.push(vec![
126                (size.x * size.y * 0 + (size.y - 1)) as usize,
127                (size.x * size.y * 0 + size.y * (size.x - 1)) as usize,
128                (size.x * size.y * 1 + (size.y - 1)) as usize,
129                (size.x * size.y * 1 + size.y * (size.x - 1)) as usize,
130                (size.x * size.y * 2 + (size.y - 1)) as usize,
131                (size.x * size.y * 2 + size.y * (size.x - 1)) as usize,
132                (size.x * size.y * 3 + (size.y - 1)) as usize,
133                (size.x * size.y * 3 + size.y * (size.x - 1)) as usize,
134            ]);
135        }
136        _ => {
137            start_cells.push(vec![
138                (size.x * size.y * 0) as usize,
139                (size.x * size.y * 1) as usize,
140                (size.x * size.y * 2) as usize,
141                (size.x * size.y * 3) as usize,
142            ]);
143            start_cells.push(vec![
144                (size.x * size.y * 1 - 1) as usize,
145                (size.x * size.y * 2 - 1) as usize,
146                (size.x * size.y * 3 - 1) as usize,
147                (size.x * size.y * 4 - 1) as usize,
148            ]);
149        }
150    }
151
152    for (idx, item) in start_cells.iter().enumerate() {
153        for point in item {
154            let mut cell = data[*point].clone();
155            cell.owner = Some(idx);
156            data[*point] = cell;
157        }
158    }
159
160    GenerateResult {
161        data: data,
162        start_cells: start_cells,
163        size: Size {
164            x: size_x,
165            y: size_y,
166        },
167    }
168}