tiler_core/field/
four_rooms.rs1use 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}