use super::item::ShopItemWrapper; use crate::{ gamecore::{GameCore, GameState}, items::{AirBag, Flashlight, Flippers, ItemBase, StunGun}, lib::{utils::button::OnScreenButton, wrappers::audio::player::AudioPlayer}, }; use raylib::prelude::*; pub fn render_shop( draw_handle: &mut RaylibDrawHandle, _thread: &RaylibThread, _audio_system: &mut AudioPlayer, game_core: &mut GameCore, bounds: Rectangle, ) -> Option { // Render background draw_handle.draw_rectangle_rec(bounds, Color::new(255, 255, 255, 125)); draw_handle.draw_rectangle_lines_ex(bounds, 3, Color::BLACK); // Title draw_handle.draw_text( "SHOP", bounds.x as i32 + (bounds.width / 2.0) as i32 - 50, bounds.y as i32 + 20, 40, Color::BLACK, ); // Bounds for use in item row sizing let first_bounds = Rectangle { x: bounds.x + 5.0, y: bounds.y + 100.0, width: bounds.width - 10.0, height: 50.0, }; // Create items let mut stun_gun_buy_ui = ShopItemWrapper::new( match &game_core.player.inventory.stun_gun { Some(x) => match x.get_level() { 1 => StunGun::lvl2(), _ => StunGun::lvl3(), }, None => StunGun::lvl1(), }, &game_core.player.inventory.stun_gun, first_bounds, 0, ); let mut air_bag_buy_ui = ShopItemWrapper::new( match &game_core.player.inventory.air_bag { Some(x) => match x.get_level() { 1 => AirBag::lvl2(), _ => AirBag::lvl3(), }, None => AirBag::lvl1(), }, &game_core.player.inventory.air_bag, first_bounds, 1, ); let mut flashlight_buy_ui = ShopItemWrapper::new( match &game_core.player.inventory.flashlight { Some(x) => match x.get_level() { 1 => Flashlight::lvl2(), _ => Flashlight::lvl3(), }, None => Flashlight::lvl1(), }, &game_core.player.inventory.flashlight, first_bounds, 2, ); let mut flippers_buy_ui = ShopItemWrapper::new( match &game_core.player.inventory.flippers { Some(x) => match x.get_level() { 1 => Flippers::lvl2(), _ => Flippers::lvl3(), }, None => Flippers::lvl1(), }, &game_core.player.inventory.flippers, first_bounds, 3, ); // Render items stun_gun_buy_ui.render( draw_handle, &game_core.player, &game_core.player.inventory.stun_gun, ); air_bag_buy_ui.render( draw_handle, &game_core.player, &game_core.player.inventory.air_bag, ); flashlight_buy_ui.render( draw_handle, &game_core.player, &game_core.player.inventory.flashlight, ); flippers_buy_ui.render( draw_handle, &game_core.player, &game_core.player.inventory.flippers, ); // Handle buying items if stun_gun_buy_ui.can_player_afford(&game_core.player, &game_core.player.inventory.stun_gun) && stun_gun_buy_ui.user_clicked_buy(draw_handle) { let item = stun_gun_buy_ui.purchase(&mut game_core.player); game_core.player.inventory.stun_gun = Some(item); _audio_system.play_sound(&game_core.resources.ui_buy); } if air_bag_buy_ui.can_player_afford(&game_core.player, &game_core.player.inventory.air_bag) && air_bag_buy_ui.user_clicked_buy(draw_handle) { let item = air_bag_buy_ui.purchase(&mut game_core.player); game_core.player.inventory.air_bag = Some(item); _audio_system.play_sound(&game_core.resources.ui_buy); } if flashlight_buy_ui .can_player_afford(&game_core.player, &game_core.player.inventory.flashlight) && flashlight_buy_ui.user_clicked_buy(draw_handle) { let item = flashlight_buy_ui.purchase(&mut game_core.player); game_core.player.inventory.flashlight = Some(item); _audio_system.play_sound(&game_core.resources.ui_buy); } if flippers_buy_ui.can_player_afford(&game_core.player, &game_core.player.inventory.flippers) && flippers_buy_ui.user_clicked_buy(draw_handle) { let item = flippers_buy_ui.purchase(&mut game_core.player); game_core.player.inventory.flippers = Some(item); _audio_system.play_sound(&game_core.resources.ui_buy); } // Render the tooltip box let hovering_stun_gun = stun_gun_buy_ui.user_hovering_row(draw_handle); let hovering_air_bag = air_bag_buy_ui.user_hovering_row(draw_handle); let hovering_flashlight = flashlight_buy_ui.user_hovering_row(draw_handle); let hovering_flippers = flippers_buy_ui.user_hovering_row(draw_handle); let should_show_tooltip = hovering_stun_gun || hovering_air_bag || hovering_flashlight || hovering_flippers; if should_show_tooltip { // Create bounds let box_bounds = Rectangle { x: bounds.x + 5.0, y: bounds.y + 350.0, width: bounds.width - 10.0, height: 250.0, }; // Get the hovered item let hovered_item: &dyn ItemBase; if hovering_stun_gun { hovered_item = stun_gun_buy_ui.get_item(); } else if hovering_air_bag { hovered_item = air_bag_buy_ui.get_item(); } else if hovering_flashlight { hovered_item = flashlight_buy_ui.get_item(); } else { hovered_item = flippers_buy_ui.get_item(); } // Draw background box draw_handle.draw_rectangle_rec(box_bounds, Color::WHITE); draw_handle.draw_rectangle_lines_ex(box_bounds, 3, Color::BLACK); hovered_item.get_texture( draw_handle, &game_core.resources, Rectangle { x: box_bounds.x + (box_bounds.width / 2.0) - 40.0, y: box_bounds.y + 10.0, width: (80.0), height: (80.0), }, ); // Render item description draw_handle.draw_text( &hovered_item.get_description(), box_bounds.x as i32 + 10, box_bounds.y as i32 + 100, 30, Color::BLACK, ); } // Handle exit buttons let bottom_left_button_dimensions = Rectangle { x: bounds.x + 5.0, y: bounds.y + bounds.height - 50.0, width: (bounds.width / 2.0) - 15.0, height: 40.0, }; let bottom_right_button_dimensions = Rectangle { x: (bounds.x + bottom_left_button_dimensions.width) + 15.0, y: bottom_left_button_dimensions.y, width: bottom_left_button_dimensions.width, height: bottom_left_button_dimensions.height, }; let menu_button = OnScreenButton::new( "Menu".to_string(), bottom_left_button_dimensions, Color::WHITE, Color::BLACK, Color::GRAY, 30, true, ); let play_button = OnScreenButton::new( "Play".to_string(), bottom_right_button_dimensions, Color::WHITE, Color::BLACK, Color::GRAY, 30, true, ); // Render both menu_button.render(draw_handle); play_button.render(draw_handle); // Handle click actions on the buttons if draw_handle.is_mouse_button_pressed(MouseButton::MOUSE_LEFT_BUTTON) { // Handle saving core state if menu_button.is_hovered(draw_handle) || play_button.is_hovered(draw_handle) { let new_progress = game_core .player .create_statistics(game_core, draw_handle.get_time()); game_core.progress.update(&new_progress); _audio_system.play_sound(&game_core.resources.ui_click); } if menu_button.is_hovered(draw_handle) { return Some(GameState::MainMenu); } else if play_button.is_hovered(draw_handle) { // Reset the world game_core.world.reset(&mut game_core.player); // Start playing return Some(GameState::InGame); } } return None; } pub fn render_stats( draw_handle: &mut RaylibDrawHandle, game_core: &mut GameCore, bounds: Rectangle, ) { // Render background draw_handle.draw_rectangle_rec(bounds, Color::WHITE); draw_handle.draw_rectangle_lines_ex(bounds, 3, Color::BLACK); // Coins draw_handle.draw_text( &format!("Fish: {}", game_core.player.coins.min(999)), bounds.x as i32 + 5, bounds.y as i32 + 5, 20, Color::BLACK, ); }