@ -1,4 +1,4 @@
# include "gui.hpp"
# include "gui_fsm .hpp"
# include <iostream>
# include <chrono>
# include <numeric>
@ -12,18 +12,16 @@ namespace gui {
using namespace components ;
FSM : : FSM ( ) :
$ window ( sf : : VideoMode ( { SCREEN_WIDTH , SCREEN_HEIGHT } ) , " Zed's Raycaster Thing " ) ,
$ renderer ( $ window ) ,
$ main_ui ( $ levels . current ( ) ) ,
$ renderer ( $ main_ui . $ window ) ,
$ level ( $ levels . current ( ) ) ,
$ map_view ( $ level ) ,
$ combat_view ( $ level ) ,
$ status_view ( $ level ) ,
$ overlay_view ( $ level , $ textures ) ,
$ map_ui ( $ level ) ,
$ combat_ui ( $ level ) ,
$ status_ui ( $ level ) ,
$ overlay_ui ( $ level , $ textures ) ,
$ font { FONT_FILE_NAME } ,
$ rayview ( $ textures , RAY_VIEW_WIDTH , RAY_VIEW_HEIGHT )
{
$ window . setVerticalSyncEnabled ( VSYNC ) ;
$ window . setFramerateLimit ( FRAME_LIMIT ) ;
$ textures . load_tiles ( ) ;
$ textures . load_sprites ( ) ;
}
@ -49,15 +47,15 @@ namespace gui {
$ rayview . set_position ( RAY_VIEW_X , RAY_VIEW_Y ) ;
$ rayview . position_camera ( $ player . x + 0.5 , $ player . y + 0.5 ) ;
$ combat_view . render ( $ textures ) ;
$ overlay_view . render ( ) ;
$ status_view . render ( $ textures ) ;
$ status_view . log ( " Welcome to the game! " ) ;
$ combat_ui . render ( $ textures ) ;
$ overlay_ui . render ( ) ;
$ status_ui . render ( $ textures ) ;
$ status_ui . log ( " Welcome to the game! " ) ;
$ renderer . init_terminal ( ) ;
$ map_view . create_render ( ) ;
$ map_view . resize_canvas ( ) ;
$ renderer . resize_grid ( MAX_FONT_SIZE , $ map_view ) ;
$ map_ui . create_render ( ) ;
$ map_ui . resize_canvas ( ) ;
$ renderer . resize_grid ( MAX_FONT_SIZE , $ map_ui ) ;
run_systems ( ) ;
state ( State : : IDLE ) ;
@ -125,7 +123,7 @@ namespace gui {
switch ( ev ) {
case QUIT :
$ window . close ( ) ;
$ main_ui . $ window . close ( ) ;
state ( State : : END ) ;
return ; // done
case MOVE_FORWARD :
@ -149,15 +147,15 @@ namespace gui {
state ( State : : ROTATING ) ;
break ;
case MAP_OPEN :
$ renderer . resize_grid ( MAX_FONT_SIZE , $ map_view ) ;
$ map_view . resize_canvas ( ) ;
$ renderer . resize_grid ( MAX_FONT_SIZE , $ map_ui ) ;
$ map_ui . resize_canvas ( ) ;
state ( State : : MAPPING ) ;
break ;
case ATTACK :
state ( State : : ATTACKING ) ;
break ;
case START_COMBAT :
$ overlay_view . show_sprite ( " top_right " , " cinqueda " ) ;
$ overlay_ui . show_sprite ( " top_right " , " cinqueda " ) ;
state ( State : : IN_COMBAT ) ;
break ;
case CLOSE :
@ -177,7 +175,7 @@ namespace gui {
switch ( ev ) {
case ATTACK :
$ status_view . log ( " You attack! " ) ;
$ status_ui . log ( " You attack! " ) ;
state ( State : : ATTACKING ) ;
break ;
case ROTATE_LEFT :
@ -189,11 +187,11 @@ namespace gui {
state ( State : : COMBAT_ROTATE ) ;
break ;
case STOP_COMBAT :
$ overlay_view . close_sprite ( " top_right " ) ;
$ overlay_ui . close_sprite ( " top_right " ) ;
state ( State : : IDLE ) ;
break ;
case QUIT :
$ window . close ( ) ;
$ main_ui . $ window . close ( ) ;
state ( State : : END ) ;
return ;
default :
@ -219,7 +217,7 @@ namespace gui {
}
void FSM : : keyboard ( ) {
while ( const auto keyev = $ window . pollEvent ( ) ) {
while ( const auto keyev = $ main_ui . $ window . pollEvent ( ) ) {
if ( keyev - > is < sf : : Event : : Closed > ( ) ) {
event ( Event : : QUIT ) ;
}
@ -274,11 +272,11 @@ namespace gui {
auto player = $ level . world - > get_the < Player > ( ) ;
auto & player_combat = $ level . world - > get < Combat > ( player . entity ) ;
player_combat . hp = player_combat . max_hp ;
$ combat_view . set_damage ( float ( player_combat . hp ) / float ( player_combat . max_hp ) ) ;
$ overlay_view . show_text ( " top_left " , " STATS " ) ;
$ combat_ui . set_damage ( float ( player_combat . hp ) / float ( player_combat . max_hp ) ) ;
$ overlay_ui . show_text ( " top_left " , " STATS " ) ;
} else {
// it's off now, close it
$ overlay_view . close_text ( " top_left " ) ;
$ overlay_ui . close_text ( " top_left " ) ;
}
}
@ -299,23 +297,23 @@ namespace gui {
$ stats . max , $ stats . n , VSYNC ,
FRAME_LIMIT , DEBUG_BUILD ) ;
$ overlay_view . update_text ( " top_left " , stats ) ;
$ overlay_ui . update_text ( " top_left " , stats ) ;
}
void FSM : : draw_blood ( ) {
auto player = $ level . world - > get_the < Player > ( ) ;
auto player_combat = $ level . world - > get < Combat > ( player . entity ) ;
if ( float ( player_combat . hp ) / float ( player_combat . max_hp ) < 0.5 ) {
$ overlay_view . show_sprite ( " middle " , " blood_splatter " ) ;
$ overlay_ui . show_sprite ( " middle " , " blood_splatter " ) ;
} else {
$ overlay_view . close_sprite ( " middle " ) ;
$ overlay_ui . close_sprite ( " middle " ) ;
}
}
void FSM : : draw_gui ( ) {
$ status_view . draw ( $ window ) ;
$ combat_view . draw ( $ window ) ;
$ overlay_view . draw ( $ window ) ;
$ status_ui . draw ( $ main_ui . $ window ) ;
$ combat_ui . draw ( $ main_ui . $ window ) ;
$ overlay_ui . draw ( $ main_ui . $ window ) ;
auto debug = $ level . world - > get_the < Debug > ( ) ;
if ( debug . FPS ) draw_stats ( ) ;
@ -323,12 +321,12 @@ namespace gui {
void FSM : : render ( ) {
if ( in_state ( State : : MAPPING ) ) {
$ window . clear ( ) ;
$ map_view . render ( ) ;
$ renderer . draw ( $ map_view ) ;
$ main_ui . $ window . clear ( ) ;
$ map_ui . render ( ) ;
$ renderer . draw ( $ map_ui ) ;
} else {
auto start = std : : chrono : : high_resolution_clock : : now ( ) ;
$ rayview . draw ( $ window ) ;
$ rayview . draw ( $ main_ui . $ window ) ;
auto end = std : : chrono : : high_resolution_clock : : now ( ) ;
auto elapsed = std : : chrono : : duration < double > ( end - start ) ;
$ stats . sample ( 1 / elapsed . count ( ) ) ;
@ -337,14 +335,14 @@ namespace gui {
draw_blood ( ) ;
}
$ window . display ( ) ;
$ main_ui . $ window . display ( ) ;
}
void FSM : : mouse ( ) {
if ( sf : : Mouse : : isButtonPressed ( sf : : Mouse : : Button : : Left ) ) {
sf : : Vector2f pos = $ window . mapPixelToCoords ( sf : : Mouse : : getPosition ( $ window ) ) ;
$ combat_view . $ gui . mouse ( pos . x , pos . y ) ;
$ status_view . $ gui . mouse ( pos . x , pos . y ) ;
sf : : Vector2f pos = $ main_ui . $ window . mapPixelToCoords ( sf : : Mouse : : getPosition ( $ main_ui . $ window ) ) ;
$ combat_ui . $ gui . mouse ( pos . x , pos . y ) ;
$ status_ui . $ gui . mouse ( pos . x , pos . y ) ;
}
}
@ -381,17 +379,17 @@ namespace gui {
auto & damage = std : : any_cast < Events : : Combat & > ( data ) ;
if ( damage . enemy_did > 0 ) {
$ status_view . log ( fmt : : format ( " Enemy HIT YOU for {} damage! " , damage . enemy_did ) ) ;
$ status_ui . log ( fmt : : format ( " Enemy HIT YOU for {} damage! " , damage . enemy_did ) ) ;
auto player_combat = world . get < Combat > ( player . entity ) ;
$ combat_view . set_damage ( float ( player_combat . hp ) / float ( player_combat . max_hp ) ) ;
$ combat_ui . set_damage ( float ( player_combat . hp ) / float ( player_combat . max_hp ) ) ;
} else {
$ status_view . log ( " Enemy MISSED YOU. " ) ;
$ status_ui . log ( " Enemy MISSED YOU. " ) ;
}
if ( damage . player_did > 0 ) {
$ status_view . log ( fmt : : format ( " You HIT enemy for {} damage! " , damage . player_did ) ) ;
$ status_ui . log ( fmt : : format ( " You HIT enemy for {} damage! " , damage . player_did ) ) ;
} else {
$ status_view . log ( " You MISSED the enemy. " ) ;
$ status_ui . log ( " You MISSED the enemy. " ) ;
}
}
break ;
@ -403,9 +401,9 @@ namespace gui {
break ;
case eGUI : : LOOT : {
// auto &item = std::any_cast<InventoryItem&>(data);
// $status_view .log(fmt::format("You picked up a {}.",
// $status_ui .log(fmt::format("You picked up a {}.",
// std::string(item.data["name"])));
$ status_view . log ( " You picked up an item. " ) ;
$ status_ui . log ( " You picked up an item. " ) ;
}
break ;
case eGUI : : ATTACK :
@ -418,10 +416,10 @@ namespace gui {
}
} break ;
case eGUI : : NOOP :
$ status_view . log ( fmt : : format ( " NOOP EVENT! {},{} " , evt , entity ) ) ;
$ status_ui . log ( fmt : : format ( " NOOP EVENT! {},{} " , evt , entity ) ) ;
break ;
default :
$ status_view . log ( fmt : : format ( " INVALID EVENT! {},{} " , evt , entity ) ) ;
$ status_ui . log ( fmt : : format ( " INVALID EVENT! {},{} " , evt , entity ) ) ;
}
}
}