module main import vendor.raylib rl let minimum_window_height: i32 = 160 let window_text_padding: i32 = 40 let reference_window_height: f64 = 600.0 let overlay_title_font_size: i32 = 48 let overlay_instruction_font_size: i32 = 24 let overlay_title_y_offset: i32 = 60 let overlay_instruction_y_offset: i32 = 10 let overlay_second_instruction_y_offset: i32 = 42 let defeat_title = c"GAME OVER" let pause_title = c"PAUSED" let begin_title = c"FLAPPY BURD" let begin_instruction = c"Press SPACE or click to begin" let scale_for_window_height(value, window_height: i32): i32 { let scaled = (value.(f64) * window_height.(f64) / reference_window_height).(i32) if scaled < 1 { return 1 } return scaled } let scale_with_window_height(value: i32): i32 = scale_for_window_height(value, rl.get_screen_height()) let overlay_text_width(window_height: i32): i32 { let title_font_size = scale_for_window_height(overlay_title_font_size, window_height) let instruction_font_size = scale_for_window_height(overlay_instruction_font_size, window_height) let mut widest = rl.measure_text(defeat_title, title_font_size) let widths: [3]i32 = [ rl.measure_text(pause_title, title_font_size), rl.measure_text(begin_title, title_font_size), rl.measure_text(begin_instruction, instruction_font_size), ] for width in widths { if width > widest { widest = width } } return widest } let validate_window_size() { let screen_width = rl.get_screen_width() let screen_height = rl.get_screen_height() let mut required_height = screen_height if required_height < minimum_window_height { required_height = minimum_window_height } // Keep the bird on the left half of the screen at every aspect ratio. let mut required_width = (2.0 * bird_x * playfield_pixel_height_for(required_height).(f64)).(i32) let text_padding = scale_for_window_height(window_text_padding, required_height) let widest_text = overlay_text_width(required_height) if required_width < widest_text + text_padding { required_width = widest_text + text_padding } rl.set_window_min_size(required_width, minimum_window_height) if screen_width < required_width || screen_height < required_height { let mut corrected_width = screen_width if corrected_width < required_width { corrected_width = required_width } rl.set_window_size(corrected_width, required_height) } } let main() { rl.set_config_flags(.{ .WindowResizable, .WindowTopmost, .VsyncHint }) rl.init_window(800, 600, "Flappy Burd") defer rl.close_window() rl.set_exit_key(.Null) validate_window_size() rl.init_audio_device() defer rl.close_audio_device() let textures = GameAssets.load() defer textures.unload() rl.set_target_fps(256) let mut state = GameState.{ bird_y = 0.5, bird_velocity_y = 0.0, pipes = [.{ x = 0.0, gap_y = 0.5, passed = false }; pipe_buffer_size], delta_time = 0.0, background_scroll = 0.0, base_scroll = 0.0, started = false, paused = false, lost = false, time_since_loss = 0.0, show_collision_boxes = false, double_pipe_speed = false, points = 0, } reset_game(state.&mut) for !rl.window_should_close() { validate_window_size() update(state.&mut, textures.&) rl.begin_drawing() defer rl.end_drawing() render(state.&, textures.&) } }