After some prototyping I have what I think I want for the map. Just a simple piece of paper you take out that has the ASCII map on it.
This commit is contained in:
		
							parent
							
								
									acbf384e2a
								
							
						
					
					
						commit
						6c9016eb0f
					
				
					 21 changed files with 1184 additions and 92 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -22,7 +22,7 @@ tracy_build: | |||
| 	meson compile -j 10 -C builddir | ||||
| 
 | ||||
| test: build | ||||
| 	./builddir/runtests "[animation]" | ||||
| 	./builddir/runtests | ||||
| 
 | ||||
| run: build test | ||||
| 	powershell "cp ./builddir/zedcaster.exe ." | ||||
|  |  | |||
|  | @ -53,7 +53,8 @@ | |||
|     "tunnel_with_rocks": "assets/tunnel_with_rocks.png", | ||||
|     "tunnel_with_rocks_stage": "assets/tunnel_with_rocks_stage.png", | ||||
|     "ritual_crafting_area": "assets/ritual_crafting_area.png", | ||||
|     "the_ritual_circle": "assets/the_ritual_circle.png" | ||||
|     "the_ritual_circle": "assets/the_ritual_circle.png", | ||||
|     "paper_ui_background": "assets/paper_ui_background.png" | ||||
|   }, | ||||
|   "worldgen": { | ||||
|     "enemy_probability": 50, | ||||
|  |  | |||
							
								
								
									
										
											BIN
										
									
								
								assets/paper_ui_background.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/paper_ui_background.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 285 KiB | 
|  | @ -4,20 +4,20 @@ | |||
|     "foreground": [40, 15, 125], | ||||
|     "background": [200, 15, 75], | ||||
|     "collision": false, | ||||
|     "display":"\u289e" | ||||
|     "display":"." | ||||
|   }, | ||||
|   "WALL_PLAIN": { | ||||
|     "texture": "assets/wall_texture_test-256.png", | ||||
|     "foreground": [230, 20, 30], | ||||
|     "background": [230, 20, 120], | ||||
|     "collision": true, | ||||
|     "display": "\ua5b8" | ||||
|     "display": "#" | ||||
|   }, | ||||
|   "WALL_VINES": { | ||||
|     "texture": "assets/wall_with_vines-256.png", | ||||
|     "foreground": [230, 20, 30], | ||||
|     "background": [230, 20, 120], | ||||
|     "collision": false, | ||||
|     "display":"\u0799" | ||||
|     "display":"|" | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ constexpr const int GUECS_PADDING = 3; | |||
| constexpr const int GUECS_BORDER_PX = 1; | ||||
| constexpr const int GUECS_FONT_SIZE = 30; | ||||
| const sf::Color GUECS_FILL_COLOR = ColorValue::DARK_MID; | ||||
| const sf::Color GUECS_TEXT_COLOR = ColorValue::LIGHT_LIGHT; | ||||
| const sf::Color GUECS_BG_COLOR = ColorValue::MID; | ||||
| const sf::Color GUECS_BORDER_COLOR = ColorValue::MID; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										17
									
								
								guecs.cpp
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								guecs.cpp
									
										
									
									
									
								
							|  | @ -64,9 +64,18 @@ namespace guecs { | |||
|       text.init(cell, $font); | ||||
|     }); | ||||
| 
 | ||||
|     $world.query<lel::Cell, WideText>([this](auto, auto& cell, auto& text) { | ||||
|       text.init(cell, $font); | ||||
|     }); | ||||
| 
 | ||||
|     $world.query<lel::Cell, WideLabel>([this](auto, auto& cell, auto& text) { | ||||
|       text.init(cell, $font); | ||||
|     }); | ||||
| 
 | ||||
|     $world.query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) { | ||||
|         sprite.init(cell); | ||||
|     }); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   void UI::render(sf::RenderWindow& window) { | ||||
|  | @ -94,6 +103,14 @@ namespace guecs { | |||
|         window.draw(*text.text); | ||||
|     }); | ||||
| 
 | ||||
|     $world.query<WideLabel>([&](auto, auto& text) { | ||||
|         window.draw(*text.text); | ||||
|     }); | ||||
| 
 | ||||
|     $world.query<WideText>([&](auto, auto& text) { | ||||
|         window.draw(*text.text); | ||||
|     }); | ||||
| 
 | ||||
|     $world.query<Textual>([&](auto, auto& text) { | ||||
|         window.draw(*text.text); | ||||
|     }); | ||||
|  |  | |||
							
								
								
									
										77
									
								
								guecs.hpp
									
										
									
									
									
								
							
							
						
						
									
										77
									
								
								guecs.hpp
									
										
									
									
									
								
							|  | @ -18,12 +18,34 @@ namespace guecs { | |||
|   struct Label { | ||||
|     std::string label; | ||||
|     unsigned int size = GUECS_FONT_SIZE; | ||||
|     sf::Color color = GUECS_TEXT_COLOR; | ||||
|     shared_ptr<sf::Font> font = nullptr; | ||||
|     shared_ptr<sf::Text> text = nullptr; | ||||
| 
 | ||||
|     void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) { | ||||
|       dbc::check(font_ptr != nullptr, "you failed to initialize this Label"); | ||||
|       if(font == nullptr) font = font_ptr; | ||||
|       if(text == nullptr) text = make_shared<sf::Text>(*font, label, size); | ||||
|       text->setFillColor(color); | ||||
|       auto bounds = text->getLocalBounds(); | ||||
|       auto text_cell = lel::center(bounds.size.x, bounds.size.y, cell); | ||||
|       // this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box
 | ||||
|       text->setPosition({float(text_cell.x), float(text_cell.y) - text_cell.h / 2}); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   struct WideLabel { | ||||
|     std::wstring label; | ||||
|     unsigned int size = GUECS_FONT_SIZE; | ||||
|     sf::Color color = GUECS_TEXT_COLOR; | ||||
|     shared_ptr<sf::Font> font = nullptr; | ||||
|     shared_ptr<sf::Text> text = nullptr; | ||||
| 
 | ||||
|     void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) { | ||||
|       dbc::check(font_ptr != nullptr, "you failed to initialize this WideLabel"); | ||||
|       if(font == nullptr) font = font_ptr; | ||||
|       if(text == nullptr) text = make_shared<sf::Text>(*font, label, size); | ||||
|       text->setFillColor(color); | ||||
|       auto bounds = text->getLocalBounds(); | ||||
|       auto text_cell = lel::center(bounds.size.x, bounds.size.y, cell); | ||||
|       // this stupid / 2 is because SFML renders from baseline rather than from the claimed bounding box
 | ||||
|  | @ -34,13 +56,17 @@ namespace guecs { | |||
|   struct Textual { | ||||
|     std::string content; | ||||
|     unsigned int size = GUECS_FONT_SIZE; | ||||
|     sf::Color color = GUECS_TEXT_COLOR; | ||||
|     int padding = GUECS_PADDING; | ||||
|     shared_ptr<sf::Font> font = nullptr; | ||||
|     shared_ptr<sf::Text> text = nullptr; | ||||
| 
 | ||||
|     void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) { | ||||
|       dbc::check(font_ptr != nullptr, "you failed to initialize this Text"); | ||||
|       if(font == nullptr) font = font_ptr; | ||||
|       if(text == nullptr) text = make_shared<sf::Text>(*font, content, size); | ||||
|       text->setPosition({float(cell.x + GUECS_PADDING * 2), float(cell.y + GUECS_PADDING * 2)}); | ||||
|       text->setFillColor(color); | ||||
|       text->setPosition({float(cell.x + padding * 2), float(cell.y + padding * 2)}); | ||||
|       text->setCharacterSize(size); | ||||
|     } | ||||
| 
 | ||||
|  | @ -50,6 +76,29 @@ namespace guecs { | |||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   struct WideText { | ||||
|     std::wstring content; | ||||
|     unsigned int size = GUECS_FONT_SIZE; | ||||
|     sf::Color color = GUECS_TEXT_COLOR; | ||||
|     int padding = GUECS_PADDING; | ||||
|     shared_ptr<sf::Font> font = nullptr; | ||||
|     shared_ptr<sf::Text> text = nullptr; | ||||
| 
 | ||||
|     void init(lel::Cell &cell, shared_ptr<sf::Font> font_ptr) { | ||||
|       dbc::check(font_ptr != nullptr, "you failed to initialize this WideText"); | ||||
|       if(font == nullptr) font = font_ptr; | ||||
|       if(text == nullptr) text = make_shared<sf::Text>(*font, content, size); | ||||
|       text->setFillColor(color); | ||||
|       text->setPosition({float(cell.x + padding * 2), float(cell.y + padding * 2)}); | ||||
|       text->setCharacterSize(size); | ||||
|     } | ||||
| 
 | ||||
|     void update(std::wstring& new_content) { | ||||
|       content = new_content; | ||||
|       text->setString(content); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   struct Clickable { | ||||
|     /* This is actually called by UI::mouse and passed the entity ID of the
 | ||||
|      * button pressed so you can interact with it in the event handler. | ||||
|  | @ -59,6 +108,7 @@ namespace guecs { | |||
| 
 | ||||
|   struct Sprite { | ||||
|     std::string name; | ||||
|     int padding = GUECS_PADDING; | ||||
|     std::shared_ptr<sf::Sprite> sprite = nullptr; | ||||
|     std::shared_ptr<sf::Texture> texture = nullptr; | ||||
| 
 | ||||
|  | @ -67,26 +117,30 @@ namespace guecs { | |||
|         texture = sprite_texture.texture; | ||||
|         sprite = make_shared<sf::Sprite>(*texture); | ||||
|         sprite->setPosition({ | ||||
|             float(cell.x + GUECS_PADDING), | ||||
|             float(cell.y + GUECS_PADDING)}); | ||||
|             float(cell.x + padding), | ||||
|             float(cell.y + padding)}); | ||||
| 
 | ||||
|         auto size = texture->getSize(); | ||||
|         sprite->setScale({ | ||||
|             float(cell.w - GUECS_PADDING * 2) / size.x, | ||||
|             float(cell.h - GUECS_PADDING * 2) / size.y}); | ||||
|             float(cell.w - padding * 2) / size.x, | ||||
|             float(cell.h - padding * 2) / size.y}); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   struct Rectangle { | ||||
|     int padding = GUECS_PADDING; | ||||
|     sf::Color color = GUECS_FILL_COLOR; | ||||
|     sf::Color border_color = GUECS_BORDER_COLOR; | ||||
|     int border_px = GUECS_BORDER_PX; | ||||
|     shared_ptr<sf::RectangleShape> shape = nullptr; | ||||
| 
 | ||||
|     void init(lel::Cell& cell) { | ||||
|       sf::Vector2f size{float(cell.w) - GUECS_PADDING * 2, float(cell.h) - GUECS_PADDING * 2}; | ||||
|       sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2}; | ||||
|       if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size); | ||||
|       shape->setPosition({float(cell.x + GUECS_PADDING), float(cell.y + GUECS_PADDING)}); | ||||
|       shape->setFillColor(GUECS_FILL_COLOR); | ||||
|       shape->setOutlineColor(GUECS_BORDER_COLOR); | ||||
|       shape->setOutlineThickness(GUECS_BORDER_PX); | ||||
|       shape->setPosition({float(cell.x + padding), float(cell.y + padding)}); | ||||
|       shape->setFillColor(color); | ||||
|       shape->setOutlineColor(border_color); | ||||
|       shape->setOutlineThickness(border_px); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|  | @ -112,6 +166,7 @@ namespace guecs { | |||
|     float y = 0.0f; | ||||
|     float w = 0.0f; | ||||
|     float h = 0.0f; | ||||
|     sf::Color color = GUECS_BG_COLOR; | ||||
| 
 | ||||
|     shared_ptr<sf::RectangleShape> shape = nullptr; | ||||
| 
 | ||||
|  | @ -128,7 +183,7 @@ namespace guecs { | |||
|       sf::Vector2f size{float(w), float(h)}; | ||||
|       if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size); | ||||
|       shape->setPosition({float(x), float(y)}); | ||||
|       shape->setFillColor(GUECS_BG_COLOR); | ||||
|       shape->setFillColor(color); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										32
									
								
								gui_fsm.cpp
									
										
									
									
									
								
							
							
						
						
									
										32
									
								
								gui_fsm.cpp
									
										
									
									
									
								
							|  | @ -16,7 +16,6 @@ namespace gui { | |||
|     $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"), | ||||
|     $main_ui($window), | ||||
|     $level($levels.current()), | ||||
|     $map_ui($level), | ||||
|     $combat_ui($level), | ||||
|     $status_ui($level), | ||||
|     $font{FONT_FILE_NAME} | ||||
|  | @ -28,7 +27,6 @@ namespace gui { | |||
|       FSM_STATE(State, START, ev); | ||||
|       FSM_STATE(State, MOVING, ev); | ||||
|       FSM_STATE(State, ATTACKING, ev); | ||||
|       FSM_STATE(State, MAPPING, ev); | ||||
|       FSM_STATE(State, ROTATING, ev); | ||||
|       FSM_STATE(State, IDLE, ev); | ||||
|       FSM_STATE(State, IN_COMBAT, ev); | ||||
|  | @ -41,10 +39,7 @@ namespace gui { | |||
|   void FSM::START(Event ) { | ||||
|     $main_ui.update_level($level); | ||||
|     $level.world->set_the<Debug>({}); | ||||
| 
 | ||||
|     $main_ui.init(); | ||||
|     $map_ui.init(); | ||||
| 
 | ||||
|     $combat_ui.init(); | ||||
|     $status_ui.init(); | ||||
|     $status_ui.log("Welcome to the game!"); | ||||
|  | @ -57,23 +52,6 @@ namespace gui { | |||
|     state(State::IDLE); | ||||
|   } | ||||
| 
 | ||||
|   void FSM::MAPPING(Event ev) { | ||||
|     using enum Event; | ||||
|     // BUG: can't close window when in mapping
 | ||||
|     switch(ev) { | ||||
|       case MAP_OPEN: | ||||
|         state(State::IDLE); | ||||
|         break; | ||||
|       case CLOSE: | ||||
|         state(State::IDLE); | ||||
|         break; | ||||
|       case TICK: | ||||
|         break; | ||||
|       default: | ||||
|         dbc::log("invalid event sent to MAPPING"); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   void FSM::MOVING(Event ) { | ||||
|     // this should be an optional that returns a point
 | ||||
|     if(auto move_to = $main_ui.play_move()) { | ||||
|  | @ -148,7 +126,7 @@ namespace gui { | |||
|         state(State::ROTATING); | ||||
|         break; | ||||
|       case MAP_OPEN: | ||||
|         state(State::MAPPING); | ||||
|         $status_ui.map_open = !$status_ui.map_open; | ||||
|         break; | ||||
|       case ATTACK: | ||||
|         state(State::ATTACKING); | ||||
|  | @ -313,16 +291,15 @@ namespace gui { | |||
|       $boss_fight_ui->render($window); | ||||
|     } else { | ||||
|       $main_ui.render(); | ||||
| 
 | ||||
|       $status_ui.render($window); | ||||
| 
 | ||||
|       $combat_ui.render($window); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   void FSM::render() { | ||||
|     if(in_state(State::MAPPING)) { | ||||
|       $window.clear(); | ||||
|       $map_ui.render($window); | ||||
|     } else if(in_state(State::NEXT_LEVEL)) { | ||||
|     if(in_state(State::NEXT_LEVEL)) { | ||||
|       $window.clear(); | ||||
|       $boss_fight_ui->render($window); | ||||
|     } else { | ||||
|  | @ -416,7 +393,6 @@ namespace gui { | |||
| 
 | ||||
|     $status_ui.update_level($level); | ||||
|     $combat_ui.update_level($level); | ||||
|     $map_ui.update_level($level); | ||||
|     $main_ui.update_level($level); | ||||
|     $boss_fight_ui = $levels.create_bossfight($level.world); | ||||
|     $boss_fight_ui->init(); | ||||
|  |  | |||
|  | @ -3,7 +3,6 @@ | |||
| #include "stats.hpp" | ||||
| #include "levelmanager.hpp" | ||||
| #include "fsm.hpp" | ||||
| #include "map_view.hpp" | ||||
| #include "main_ui.hpp" | ||||
| #include "combat_ui.hpp" | ||||
| #include "status_ui.hpp" | ||||
|  | @ -16,7 +15,6 @@ namespace gui { | |||
|     IN_COMBAT, | ||||
|     COMBAT_ROTATE, | ||||
|     ATTACKING, | ||||
|     MAPPING, | ||||
|     ROTATING, | ||||
|     NEXT_LEVEL, | ||||
|     IDLE, | ||||
|  | @ -50,7 +48,6 @@ namespace gui { | |||
|       MainUI $main_ui; | ||||
|       GameLevel $level; | ||||
|       shared_ptr<BossFightUI> $boss_fight_ui = nullptr; | ||||
|       MapViewUI $map_ui; | ||||
|       CombatUI $combat_ui; | ||||
|       StatusUI $status_ui; | ||||
|       sf::Font $font; | ||||
|  |  | |||
							
								
								
									
										2
									
								
								main.cpp
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								main.cpp
									
										
									
									
									
								
							|  | @ -13,7 +13,6 @@ int main(int argc, char* argv[]) { | |||
|     ai::init("assets/ai.json"); | ||||
|     animation::init(); | ||||
| 
 | ||||
| 
 | ||||
|     sound::mute(true); | ||||
|     gui::FSM main; | ||||
|     main.event(gui::Event::STARTED); | ||||
|  | @ -31,7 +30,6 @@ int main(int argc, char* argv[]) { | |||
|       // ZED: need to sort out how to deal with this in the FSM
 | ||||
|       if(main.in_state(gui::State::IDLE) | ||||
|           || main.in_state(gui::State::NEXT_LEVEL) | ||||
|           || main.in_state(gui::State::MAPPING) | ||||
|           || main.in_state(gui::State::IN_COMBAT)) | ||||
|       { | ||||
|         if(main.autowalking) { | ||||
|  |  | |||
							
								
								
									
										67
									
								
								map_view.cpp
									
										
									
									
									
								
							
							
						
						
									
										67
									
								
								map_view.cpp
									
										
									
									
									
								
							|  | @ -6,64 +6,63 @@ | |||
| #include "rand.hpp" | ||||
| #include "animation.hpp" | ||||
| #include "rand.hpp" | ||||
| #include <codecvt> | ||||
| #include <iostream> | ||||
| 
 | ||||
| namespace gui { | ||||
|   using namespace components; | ||||
| 
 | ||||
|   MapViewUI::MapViewUI(GameLevel &level) : | ||||
|     $level(level) | ||||
|     $level(level), $tiles(level.map->width(), level.map->height()) | ||||
|   { | ||||
|     $gui.position(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); | ||||
|     $gui.layout( | ||||
|         "[*%(100,900)left|*%(200,900)map_grid| _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[_              | _                 | _]" | ||||
|         "[bottom_status_left | bottom_status_right ]"); | ||||
| 
 | ||||
|     auto cell = $gui.cell_for($gui.entity("map_grid")); | ||||
|     $grid.position(cell.x, cell.y, cell.w, cell.h); | ||||
|     $grid.layout( | ||||
|         "[cell_11|cell_12|cell_13|cell_14|cell_15|cell_16|cell_17]" | ||||
|         "[cell_21|cell_22|cell_23|cell_24|cell_25|cell_26|cell_27]" | ||||
|         "[cell_31|cell_32|cell_33|cell_34|cell_35|cell_36|cell_37]" | ||||
|         "[cell_41|cell_42|cell_43|cell_44|cell_45|cell_46|cell_47]" | ||||
|         "[cell_51|cell_52|cell_53|cell_54|cell_55|cell_56|cell_57]"); | ||||
|   } | ||||
| 
 | ||||
|   void MapViewUI::update_level(GameLevel &level) { | ||||
|     $level = level; | ||||
|   } | ||||
| 
 | ||||
|   void MapViewUI::init() { | ||||
|     $gui.world().set_the<guecs::Background>({$gui.$parser}); | ||||
| 
 | ||||
|   void MapViewUI::init(int x, int y, int w, int h) { | ||||
|     $gui.position(x, y, w, h); | ||||
|     $gui.layout( | ||||
|         "[*%(100,900)map_grid]" | ||||
|         "[_              ]" | ||||
|         "[_              ]" | ||||
|         "[_              ]" | ||||
|         "[_              ]" | ||||
|         "[_              ]" | ||||
|         "[_              ]" | ||||
|         "[_              ]" | ||||
|         "[_              ]"); | ||||
|     for(auto& [name, cell] : $gui.cells()) { | ||||
|       auto box = $gui.entity(name); | ||||
|       if(name != "map_grid") { | ||||
|       if(name == "status") { | ||||
|         $gui.set<guecs::Sprite>(box, {"paper_ui_background"}); | ||||
|       } else if(name != "map_grid") { | ||||
|         $gui.set<guecs::Rectangle>(box, {}); | ||||
|         $gui.set<guecs::Label>(box, {name}); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     auto grid = $gui.entity("map_grid"); | ||||
|     $gui.set<guecs::WideText>(grid, {L"Loading...", 25, ColorValue::DARK_LIGHT, 20}); | ||||
|     $gui.set<guecs::Sprite>(grid, {"paper_ui_background"}); | ||||
| 
 | ||||
|     $gui.init(); | ||||
| 
 | ||||
|     for(auto& [name, cell] : $grid.cells()) { | ||||
|       auto box = $grid.entity(name); | ||||
|       $grid.set<guecs::Rectangle>(box, {}); | ||||
|       $grid.set<guecs::Label>(box, {name}); | ||||
|     } | ||||
| 
 | ||||
|     $grid.init(); | ||||
|   } | ||||
| 
 | ||||
|   void MapViewUI::render(sf::RenderWindow &window) { | ||||
|     $tiles = $level.map->tiles(); | ||||
|     auto grid = $gui.entity("map_grid"); | ||||
|     auto player_pos = $level.world->get<Position>($level.player); | ||||
| 
 | ||||
|     std::string map_out = $tiles.to_string(player_pos.location.x, player_pos.location.y); | ||||
|     std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; | ||||
|     std::wstring map_wstr = converter.from_bytes(map_out); | ||||
| 
 | ||||
|     auto& map_text = $gui.get<guecs::WideText>(grid); | ||||
|     map_text.update(map_wstr); | ||||
| 
 | ||||
|     $gui.render(window); | ||||
|     $grid.render(window); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -2,16 +2,17 @@ | |||
| #include "levelmanager.hpp" | ||||
| #include "textures.hpp" | ||||
| #include "guecs.hpp" | ||||
| #include "tilemap.hpp" | ||||
| 
 | ||||
| namespace gui { | ||||
|   class MapViewUI { | ||||
|     public: | ||||
|       guecs::UI $gui; | ||||
|       guecs::UI $grid; | ||||
|       GameLevel $level; | ||||
|       TileMap $tiles; | ||||
| 
 | ||||
|       MapViewUI(GameLevel &level); | ||||
|       void init(); | ||||
|       void init(int x, int y, int w, int h); | ||||
|       void render(sf::RenderWindow &window); | ||||
|       void update_level(GameLevel &level); | ||||
|   }; | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| # clang might need _LIBCPP_ENABLE_CXX26_REMOVED_CODECVT | ||||
| 
 | ||||
| project('raycaster', 'cpp', | ||||
|   version: '0.1.0', | ||||
|   default_options: [ | ||||
|  |  | |||
|  | @ -379,6 +379,7 @@ void Raycaster::update_level(GameLevel level) { | |||
|   $sprites.clear(); | ||||
| 
 | ||||
|   $level = level; | ||||
|   // BUG: this is way too complex, please make it easier, the issue is that I need to convert the maps to visible tiles and that involves wstring convert, but this is many steps done probably over and over
 | ||||
|   auto& tiles = $level.map->tiles(); | ||||
|   $map = textures::convert_char_to_texture(tiles.$tile_ids); | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ struct Raycaster { | |||
|   double $dir_y = 0; | ||||
| 
 | ||||
|   // the 2d raycaster version of camera plane
 | ||||
|   double $plane_x = 0; | ||||
|   double $plane_x = 0.0; | ||||
|   double $plane_y = 0.66; | ||||
|   sf::Texture $view_texture; | ||||
|   sf::Sprite $view_sprite; | ||||
|  |  | |||
|  | @ -124,7 +124,9 @@ namespace gui { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /* WARNING: This is really not the greatest way to do this. */ | ||||
|   /* WARNING: This is really not the greatest way to do this.
 | ||||
|    * look in status_ui.update_level() | ||||
|    * */ | ||||
|   void RitualUI::update() { | ||||
|     dbc::log("RITUAL UPDATE NOT IMPLEMENTED"); | ||||
|   } | ||||
|  |  | |||
							
								
								
									
										1020
									
								
								scripts/gcovr_patched_coverage.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1020
									
								
								scripts/gcovr_patched_coverage.py
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -10,7 +10,8 @@ namespace gui { | |||
|   using std::any, std::any_cast, std::string, std::make_any; | ||||
| 
 | ||||
|   StatusUI::StatusUI(GameLevel level) : | ||||
|     $level(level), $ritual_ui(level) | ||||
|     $level(level), $ritual_ui(level), | ||||
|     $map_ui($level) | ||||
|   { | ||||
|     $gui.position(STATUS_UI_X, STATUS_UI_Y, STATUS_UI_WIDTH, STATUS_UI_HEIGHT); | ||||
|     $gui.layout( | ||||
|  | @ -37,6 +38,8 @@ namespace gui { | |||
|         $log_to = $gui.entity("log_view"); | ||||
|         $gui.set<Rectangle>($log_to, {}); | ||||
|         $gui.set<Textual>($log_to, {"Welcome to the Game!", 20}); | ||||
| 
 | ||||
|         $map_ui.init(cell.x, cell.y, cell.w, cell.h); | ||||
|       } else { | ||||
|         auto button = $gui.entity(name); | ||||
|         $gui.set<Rectangle>(button, {}); | ||||
|  | @ -134,6 +137,11 @@ namespace gui { | |||
| 
 | ||||
|   void StatusUI::render(sf::RenderWindow &window) { | ||||
|     $gui.render(window); | ||||
| 
 | ||||
|     if(map_open) { | ||||
|       $map_ui.render(window); | ||||
|     } | ||||
| 
 | ||||
|     $ritual_ui.render(window); | ||||
|   } | ||||
| 
 | ||||
|  | @ -146,6 +154,7 @@ namespace gui { | |||
| 
 | ||||
|   void StatusUI::update_level(GameLevel &level) { | ||||
|     $level = level; | ||||
|     $map_ui.update_level($level); | ||||
|     init(); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -5,16 +5,19 @@ | |||
| #include "textures.hpp" | ||||
| #include "guecs.hpp" | ||||
| #include "ritual_ui.hpp" | ||||
| #include "map_view.hpp" | ||||
| 
 | ||||
| namespace gui { | ||||
|   class StatusUI { | ||||
|     public: | ||||
|       bool map_open = false; | ||||
|       guecs::UI $gui; | ||||
|       DinkyECS::Entity $log_to; | ||||
|       std::map<std::string, size_t> $slots; | ||||
|       std::deque<std::string> $messages; | ||||
|       GameLevel $level; | ||||
|       RitualUI $ritual_ui; | ||||
|       MapViewUI $map_ui; | ||||
| 
 | ||||
|       StatusUI(GameLevel level); | ||||
|       void select_slot(DinkyECS::Entity ent, std::any data); | ||||
|  |  | |||
							
								
								
									
										17
									
								
								tilemap.cpp
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								tilemap.cpp
									
										
									
									
									
								
							|  | @ -1,6 +1,7 @@ | |||
| #include "tilemap.hpp" | ||||
| #include "dbc.hpp" | ||||
| #include "constants.hpp" | ||||
| #include <iostream> | ||||
| 
 | ||||
| using nlohmann::json; | ||||
| using components::Tile; | ||||
|  | @ -14,18 +15,26 @@ TileMap::TileMap(size_t width, size_t height) : | |||
| { | ||||
| } | ||||
| 
 | ||||
| void TileMap::dump(int show_x, int show_y) { | ||||
| std::string TileMap::to_string(int show_x, int show_y) { | ||||
|   std::string result; | ||||
| 
 | ||||
|   for(matrix::each_row it{$tile_ids}; it.next();) { | ||||
|     const Tile &cell = $display[it.y][it.x]; | ||||
| 
 | ||||
|     if(int(it.x) == show_x && int(it.y) == show_y) { | ||||
|       fmt::print("{}<", cell.display); | ||||
|       result += "@"; | ||||
|     } else { | ||||
|       fmt::print("{} ", cell.display); | ||||
|       result += cell.display; | ||||
|     } | ||||
| 
 | ||||
|     if(it.row) fmt::print("\n"); | ||||
|     if(it.row) result += "\n"; | ||||
|   } | ||||
| 
 | ||||
|   return result; | ||||
| } | ||||
| 
 | ||||
| void TileMap::dump(int show_x, int show_y) { | ||||
|   std::cout << to_string(show_x, show_y) << std::endl; | ||||
| } | ||||
| 
 | ||||
| void TileMap::set_tile(size_t x, size_t y, string tile_name) { | ||||
|  |  | |||
|  | @ -32,6 +32,7 @@ public: | |||
|   void set_tile(size_t x, size_t y, std::string tile_name); | ||||
|   std::vector<std::string> tile_names(bool collision); | ||||
| 
 | ||||
|   std::string to_string(int show_x, int show_y); | ||||
|   void dump(int show_x=-1, int show_y=-1); | ||||
|   bool INVARIANT(); | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Zed A. Shaw
						Zed A. Shaw