1use crossterm::style::Color::Rgb;
2
3use crate::core::load_map;
4use crate::functions::*;
5
6pub enum RenderInterface {
8 Default, MapFull, MapLayer(MapLayer), MiniMap, InvPage(InvPage), PlayerParams, InfoWorld, InfoItem }
17
18#[derive(Debug)]
20pub enum MapLayer {
21 Base,
22 Color,
23 Trigger,
24 Wall,
25 SumObj(Summon),
26 Explore }
28
29#[derive(Debug)]
31pub enum InvPage {
32 Page1, Page2 }
35
36#[derive(Debug)]
38pub enum Summon {
39 Static, Dynamic, NPC, Enemy }
44
45pub fn render_layer(x1: u16, y1: u16, x2: u16, y2: u16, layer: RenderInterface) {
47 let j = 1;
48 let i = 1;
49
50 let test_offset_x = 90;
51 let test_offset_y = 60;
52
53 match layer {
54 RenderInterface::Default => { let _ = printch(i, j, &'.'); },
55 RenderInterface::MapFull => { render_full_map(x1, y1, x2, y2, test_offset_x, test_offset_y); }, RenderInterface::MapLayer(ref ml) => {
57 match ml {
58 MapLayer::Base => { render_map_layer(x1, y1, x2, y2, MapLayer::Base, test_offset_x, test_offset_y); },
59 MapLayer::Color => { render_map_layer(x1, y1, x2, y2, MapLayer::Color, test_offset_x, test_offset_y); },
60 MapLayer::Trigger => { render_map_layer(x1, y1, x2, y2, MapLayer::Trigger, 0, 0); },
61 MapLayer::Wall => { render_map_layer(x1, y1, x2, y2, MapLayer::Wall, 0, 0); },
62 MapLayer::SumObj(ref object) => {
63 match object {
64 Summon::Static => printch(i, j, &'!'),
65 Summon::Dynamic => printch(i, j, &'@'),
66 Summon::NPC => printch(i, j, &'#'),
67 Summon::Enemy => printch(i, j, &'$')
68 }
69 }
70 MapLayer::Explore => { render_map_layer(x1, y1, x2, y2, MapLayer::Explore, 0, 0); }
71 };
72 },
73 RenderInterface::MiniMap => { let _ = printch(i, j, &'3'); },
74 RenderInterface::InvPage(ref page) => {
75 match page {
76 InvPage::Page1 => printch(i, j, &'F'),
77 InvPage::Page2 => printch(i, j, &'H')
78 };
79 },
80 RenderInterface::PlayerParams => { let _ = printch(i, j, &'5'); },
81 RenderInterface::InfoWorld => { let _ = printch(i, j, &'6'); },
82 RenderInterface::InfoItem => { let _ = printch(i, j, &'7'); }
83 };
84}
85
86pub fn render_full_map(x1: u16, y1: u16, x2: u16, y2: u16, x_offset: u16, y_offset: u16) {
87 let loaded_base = load_map(MapLayer::Base);
88 let loaded_color = load_map(MapLayer::Color);
89
90 let mut x_offset_counter: u16 = 0;
91 let mut y_offset_counter: u16 = 0;
92
93 let mut base_row_counter = 1;
94
95 for base_row in &loaded_base {
96
97 if y_offset_counter < y_offset { y_offset_counter = y_offset_counter + 1; continue; }
98
99 let mut base_col_counter = 1;
100 let temp_index_row = base_row_counter; let color_row = match loaded_color.get(temp_index_row - 1 + y_offset_counter as usize) { Some(some_string) => some_string,
104 None => ""
105 };
106
107 let color_chars_vec: Vec<char> = color_row.chars().collect();
108 let base_chars_vec: Vec<char> = base_row.chars().collect();
109
110 for base_char in base_chars_vec {
111
112 if x_offset_counter < x_offset { x_offset_counter = x_offset_counter + 1; continue; }
113
114 let temp_index_col = base_col_counter; let color_char = match color_chars_vec.get(temp_index_col - 1 + x_offset as usize) {
117 Some(some_char) => some_char,
118 None => &' '
119 };
120
121 match color_char { '.' => set_color(Rgb { r: 71, g: 107, b: 0 }, Rgb { r: 50, g: 92, b: 12 }),
123 '#' => set_color(Rgb { r: 96, g: 60, b: 0 }, Rgb { r: 87, g: 92, b: 0 }),
124 ',' => set_color(Rgb { r: 85, g: 56, b: 0 }, Rgb { r: 60, g: 90, b: 0 }),
125 'H' => set_color(Rgb { r: 71, g: 44, b: 0 }, Rgb { r: 54, g: 33, b: 0 }),
126 '=' => set_color(Rgb { r: 150, g: 107, b: 76 }, Rgb { r: 92, g: 61, b: 12 }),
127 _ => ()
128 }
129
130 printch(base_col_counter as u16 + x1 - 1, base_row_counter as u16 + y1 - 1, &base_char);
132
133 reset_color();
134
135 if base_col_counter >= x2 as usize - 1 { break; } else { base_col_counter = base_col_counter + 1; }
136 }
137
138 x_offset_counter = 0;
139
140 if base_row_counter >= y2 as usize { break; } else { base_row_counter = base_row_counter + 1; }
141 }
142}
143
144pub fn render_map_layer(x1: u16, y1: u16, x2: u16, y2: u16, map: MapLayer, x_offset: u16, y_offset: u16) {
146
147 let loaded_map_pack = load_map(map); let loaded_map: Vec<String> = loaded_map_pack; {let x1 = x1 + x_offset;
153 let x2 = x2 + x_offset;
154 let y1 = y1;
155 let y2 = y2;
156
157 let mut row_counter = 0;
158 let mut y_offset_counter = 0;
159
160 for map_row in &loaded_map {
161
162 let y2 = if y2 < y1 + 1 {y1+1} else {y2}; if y_offset_counter >= y_offset && row_counter <= y2-y1-1 {
165
166 let x2 = if x2 < x1 {x1} else {x2}; let end_x: u16 = if x2-x1+x_offset < map_row.len() as u16 {x2-x1+x_offset} else {map_row.len() as u16};
169 let end_y: u16 = if y1 + row_counter <= y2 {y1+row_counter} else {y2};
170 printmsg(x1-x_offset, end_y, &map_row[x_offset as usize..end_x as usize]);
171
172 row_counter = row_counter + 1;
173
174 } else { y_offset_counter = y_offset_counter + 1; }
175 }
176
177 }
178
179 }