castlecore/
render.rs

1use crossterm::style::Color::Rgb;
2
3use crate::core::load_map;
4use crate::functions::*;
5
6/// Enum for use in match in functions as param
7pub enum RenderInterface {
8    Default, // Plug                                (Dev)
9    MapFull, // Regular                             (User)
10    MapLayer(MapLayer), // Onlu for development     (Dev)
11    MiniMap, // Non-regular                         (User)
12    InvPage(InvPage), // Regular                    (User)
13    PlayerParams, // Regular                        (User)
14    InfoWorld, // Regular                           (User)
15    InfoItem // Regular                             (User)
16}
17
18/// Map layers enum for RenderInterface
19#[derive(Debug)]
20pub enum MapLayer {
21    Base,
22    Color,
23    Trigger,
24    Wall,
25    SumObj(Summon),
26    Explore // bool (visible map for minimap)
27}
28
29/// Inventory Pages enum for RenderInterface
30#[derive(Debug)]
31pub enum InvPage {
32    Page1, // Like cells
33    Page2 // Like shells
34}
35
36/// Summon variations for RenderInterface (not logic or triggers)
37#[derive(Debug)]
38pub enum Summon {
39    Static, // Like chest (only render, not tringger or logic) // [][] of struct (x, y, type ... etc.)
40    Dynamic, //Like fireplace // [][] of struct (x, y, type ... etc.)
41    NPC, // Like trader in village // [][] of struct (x, y, type, hp, color ... etc.)
42    Enemy // Like golem // [][] of Enemy struct (x, y, hp, color ... etc.)
43}
44
45/// Render selected layer on current ractangle
46pub 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); }, // 80, 60 
56        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; // IDK
101
102        let color_row = match loaded_color.get(temp_index_row - 1 + y_offset_counter as usize) { // NEED TO REWRITE // TODO
103            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; // IDK
115
116            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 { // Need to rewrite with any map types
122                '.' => 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, base_row_counter as u16, &base_char);
131            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 /* - 1 (Removed, need to backup) */ { break; } else { base_row_counter = base_row_counter + 1; } 
141    }
142}
143
144/// Render Map Layer (only map layer) use load_map (will be rewrite, after this use RML in loop)
145pub 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);   // Need to move to loop (for 1 (or same) call load_map function)
148                                                        //       |
149    let loaded_map: Vec<String> = loaded_map_pack;      // ------+
150
151    {// Print layer
152        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}; // need to remove
163
164            if y_offset_counter >= y_offset && row_counter <= y2-y1-1 {
165                
166                let x2 = if x2 < x1 {x1} else {x2}; // need to remove
167                
168                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    //printmsg(x1, y1, &("x1: ".to_owned() + x1.to_string().as_str()));
180    //printmsg(x1, y1+1, &("x2: ".to_owned() + x2.to_string().as_str()));
181    
182    //printmsg(x1, y1+3, &("loaded_vector: ".to_owned() + loaded_map.len().to_string().as_str()));
183
184    //printmsg(x1, y1+5, &("loaded_info_0: ".to_owned() + loaded_info.0.to_string().as_str()));
185    //printmsg(x1, y1+6, &("loaded_info_1: ".to_owned() + loaded_info.1.to_string().as_str()));
186    
187}