main.cpp (3459B)
1 #include "Aquarium.h" 2 #include "Config.h" 3 #include <chrono> 4 #include <iostream> 5 #include <thread> 6 7 #ifdef __OpenBSD__ 8 #include <unistd.h> 9 #endif 10 11 // Forward declaration 12 bool parseArguments(int argc, char *argv[]); 13 14 int main(int argc, char *argv[]) { 15 // Parse command line arguments 16 if (!parseArguments(argc, argv)) { 17 return 1; // Exit if parsing failed or help was shown 18 } 19 20 // Print configuration if debug mode is enabled 21 if (g_config.debug_mode) { 22 std::cout << "Configuration:\n"; 23 std::cout << " Fish count: " 24 << (g_config.initial_fish_count == -1 25 ? "auto" 26 : std::to_string(g_config.initial_fish_count)) 27 << "\n"; 28 std::cout << " Seaweed count: " 29 << (g_config.initial_seaweed_count == -1 30 ? "auto" 31 : std::to_string(g_config.initial_seaweed_count)) 32 << "\n"; 33 std::cout << " Max bubbles: " << g_config.max_bubbles << "\n"; 34 std::cout << " Frame delay: " << g_config.frame_delay_ms << "ms\n"; 35 std::cout << " Big entities: " 36 << (g_config.enable_big_entities ? "enabled" : "disabled") 37 << "\n"; 38 std::cout << " Bubbles: " 39 << (g_config.enable_bubbles ? "enabled" : "disabled") << "\n"; 40 std::cout << " Colors: " << (g_config.use_colors ? "enabled" : "disabled") 41 << "\n"; 42 std::cout << " Bold text: " << (g_config.use_bold ? "enabled" : "disabled") 43 << "\n"; 44 std::cout << " Max entities: " << g_config.max_entities << "\n"; 45 std::cout << "Press any key to continue...\n"; 46 std::cin.get(); 47 } 48 49 Aquarium &aquarium = Aquarium::getInstance(); 50 51 #ifdef __OpenBSD__ 52 if (pledge("stdio tty", NULL) == -1) { 53 perror("pledge"); 54 return 1; 55 } 56 #endif 57 58 // Initialize the aquarium display 59 aquarium.resize(); // Setup initial entities 60 61 // Variables for FPS calculation 62 auto last_time = std::chrono::steady_clock::now(); 63 int frame_count = 0; 64 double fps = 0.0; 65 66 // Main game loop 67 while (true) { 68 auto frame_start = std::chrono::steady_clock::now(); 69 70 int input = aquarium.checkInput(); 71 if (input == 'q' || input == 'Q' || input == 27) { // ESC key 72 break; 73 } 74 75 // Toggle debug info with 'd' key 76 if (input == 'd' || input == 'D') { 77 g_config.show_fps = !g_config.show_fps; 78 g_config.show_entity_count = !g_config.show_entity_count; 79 } 80 81 if (aquarium.checkResize()) { 82 aquarium.resize(); 83 } 84 85 aquarium.redraw(); 86 87 // Calculate FPS 88 if (g_config.show_fps) { 89 ++frame_count; 90 auto current_time = std::chrono::steady_clock::now(); 91 auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>( 92 current_time - last_time) 93 .count(); 94 95 if (elapsed >= 1000) { // Update FPS every second 96 fps = (frame_count * 1000.0) / elapsed; 97 frame_count = 0; 98 last_time = current_time; 99 } 100 } 101 102 // Sleep for configured frame delay 103 auto frame_end = std::chrono::steady_clock::now(); 104 auto frame_duration = std::chrono::duration_cast<std::chrono::milliseconds>( 105 frame_end - frame_start); 106 auto sleep_duration = 107 std::chrono::milliseconds(g_config.frame_delay_ms) - frame_duration; 108 109 if (sleep_duration > std::chrono::milliseconds(0)) { 110 std::this_thread::sleep_for(sleep_duration); 111 } 112 } 113 114 return 0; 115 }