setup shop structure
This commit is contained in:
parent
12ed150a17
commit
2844e5ac0b
55
src/items.rs
55
src/items.rs
@ -3,8 +3,55 @@ use serde::{Serialize, Deserialize};
|
|||||||
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
|
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
|
||||||
#[serde(tag = "t", content = "c")]
|
#[serde(tag = "t", content = "c")]
|
||||||
pub enum ShopItems {
|
pub enum ShopItems {
|
||||||
StunGun(u8),
|
StunGun(u8, u8, String),
|
||||||
AirBag,
|
AirBag(u8, u8, String),
|
||||||
Flashlight(u8),
|
Flashlight(u8, u8, String),
|
||||||
Flippers(u8)
|
Flippers(u8, u8, String)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ShopItems{
|
||||||
|
|
||||||
|
pub fn get_inital_items() -> [ShopItems; 4]{
|
||||||
|
|
||||||
|
[ShopItems::StunGun(1, 10, String::from("Stun Gun")), ShopItems::AirBag(1, 10, String::from("Air Bag")),
|
||||||
|
ShopItems::Flashlight(1, 12, String::from("Flash Light")), ShopItems::Flippers(1, 10, String::from("Flippers"))]
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_level(item: &ShopItems) -> u8{
|
||||||
|
|
||||||
|
|
||||||
|
match item {
|
||||||
|
ShopItems::StunGun(x, _, _) => *x,
|
||||||
|
ShopItems::AirBag(x, _, _) => *x,
|
||||||
|
ShopItems::Flashlight(x, _, _) => *x,
|
||||||
|
ShopItems::Flippers(x, _, _) => *x
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn get_cost(item: &ShopItems) -> u8{
|
||||||
|
|
||||||
|
match item {
|
||||||
|
ShopItems::StunGun(x, _, _) => *x,
|
||||||
|
ShopItems::AirBag(x, _, _) => *x,
|
||||||
|
ShopItems::Flashlight(x, _, _) => *x,
|
||||||
|
ShopItems::Flippers(x, _, _) => *x
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_name(item: &ShopItems) -> String{
|
||||||
|
|
||||||
|
match item {
|
||||||
|
ShopItems::StunGun(_, _, x) => x.to_string(),
|
||||||
|
ShopItems::AirBag(_, _, x) => x.to_string(),
|
||||||
|
ShopItems::Flashlight(_, _, x) => x.to_string(),
|
||||||
|
ShopItems::Flippers(_, _, x) => x.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,15 +1,16 @@
|
|||||||
mod hud;
|
mod hud;
|
||||||
mod playerlogic;
|
mod playerlogic;
|
||||||
|
mod shop;
|
||||||
|
|
||||||
use raylib::prelude::*;
|
use raylib::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{gamecore::{self, GameCore, GameState}, lib::wrappers::audio::player::AudioPlayer};
|
||||||
gamecore::{GameCore, GameState},
|
|
||||||
lib::wrappers::audio::player::AudioPlayer,
|
use self::shop::Shop;
|
||||||
};
|
|
||||||
|
|
||||||
use super::screen::Screen;
|
use super::screen::Screen;
|
||||||
|
|
||||||
|
#[derive(PartialEq)]
|
||||||
pub enum InGameState {
|
pub enum InGameState {
|
||||||
BUYING,
|
BUYING,
|
||||||
SWIMMING,
|
SWIMMING,
|
||||||
@ -17,12 +18,14 @@ pub enum InGameState {
|
|||||||
|
|
||||||
pub struct InGameScreen {
|
pub struct InGameScreen {
|
||||||
current_state: InGameState,
|
current_state: InGameState,
|
||||||
|
shop: Shop,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InGameScreen {
|
impl InGameScreen {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
current_state: InGameState::SWIMMING,
|
current_state: InGameState::BUYING,
|
||||||
|
shop: Shop::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,6 +49,31 @@ impl Screen for InGameScreen {
|
|||||||
// Calculate DT
|
// Calculate DT
|
||||||
let dt = draw_handle.get_time() - game_core.last_frame_time;
|
let dt = draw_handle.get_time() - game_core.last_frame_time;
|
||||||
|
|
||||||
|
// Window dimensions
|
||||||
|
let win_height = draw_handle.get_screen_height();
|
||||||
|
let win_width = draw_handle.get_screen_width();
|
||||||
|
let window_center = Vector2 {
|
||||||
|
x: (win_width as f32 / 2.0),
|
||||||
|
y: (win_height as f32 / 2.0),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Creates items for shop
|
||||||
|
if draw_handle.get_time() - game_core.last_state_change_time >= 0.05{
|
||||||
|
self.shop.create_items(Vector2::new(win_width as f32, win_height as f32));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if draw_handle.get_time() - game_core.last_state_change_time >= 0.05
|
||||||
|
&& self.current_state == InGameState::BUYING{
|
||||||
|
|
||||||
|
shop::render_shop(draw_handle, game_core, self);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
// Update player movement
|
||||||
|
playerlogic::update_player_movement(draw_handle, game_core, window_center);
|
||||||
|
}
|
||||||
|
|
||||||
// Clear frame
|
// Clear frame
|
||||||
draw_handle.clear_background(Color::BLUE);
|
draw_handle.clear_background(Color::BLUE);
|
||||||
|
|
||||||
@ -54,16 +82,11 @@ impl Screen for InGameScreen {
|
|||||||
return Some(GameState::PauseMenu);
|
return Some(GameState::PauseMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Window dimensions
|
|
||||||
let win_height = draw_handle.get_screen_height();
|
|
||||||
let win_width = draw_handle.get_screen_width();
|
|
||||||
let window_center = Vector2 {
|
|
||||||
x: (win_width as f32 / 2.0),
|
|
||||||
y: (win_height as f32 / 2.0),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Update player movement
|
|
||||||
playerlogic::update_player_movement(draw_handle, game_core, window_center);
|
|
||||||
|
|
||||||
// Open a 2D context
|
// Open a 2D context
|
||||||
{
|
{
|
||||||
@ -86,6 +109,8 @@ impl Screen for InGameScreen {
|
|||||||
// Render the hud
|
// Render the hud
|
||||||
hud::render_hud(draw_handle, game_core, window_center);
|
hud::render_hud(draw_handle, game_core, window_center);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Handle player out of breath
|
// Handle player out of breath
|
||||||
if game_core.player.breath_percent == 0.0 {
|
if game_core.player.breath_percent == 0.0 {
|
||||||
return Some(GameState::GameEnd);
|
return Some(GameState::GameEnd);
|
||||||
|
120
src/logic/ingame/shop.rs
Normal file
120
src/logic/ingame/shop.rs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
use std::u8;
|
||||||
|
|
||||||
|
use raylib::prelude::*;
|
||||||
|
|
||||||
|
use crate::{gamecore::GameCore, items::ShopItems};
|
||||||
|
|
||||||
|
use super::{InGameScreen, InGameState};
|
||||||
|
|
||||||
|
|
||||||
|
pub struct Item{
|
||||||
|
|
||||||
|
x_pose: i32,
|
||||||
|
y_pose: i32,
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
cost: u8,
|
||||||
|
level: u8,
|
||||||
|
name: String,
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub struct Shop{
|
||||||
|
|
||||||
|
shop_items: Vec<Item>,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Shop {
|
||||||
|
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
shop_items: Vec::new(),
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_items(&mut self, screen_dimension: Vector2){
|
||||||
|
|
||||||
|
let items = ShopItems::get_inital_items();
|
||||||
|
|
||||||
|
let screen_width = screen_dimension.x as f32;
|
||||||
|
let screen_height = screen_dimension.y as f32;
|
||||||
|
|
||||||
|
let box_height = screen_height * 0.15;
|
||||||
|
let box_width = screen_width * 0.1;
|
||||||
|
|
||||||
|
let start_width = screen_width - (box_width * 4.0) - 40.0;
|
||||||
|
let draw_height = screen_height - 20.0 - box_height;
|
||||||
|
|
||||||
|
let mut item_vec = Vec::new();
|
||||||
|
|
||||||
|
for box_num in 0..4 {
|
||||||
|
let x_pose = start_width + box_width * box_num as f32;
|
||||||
|
|
||||||
|
item_vec.push(Item{
|
||||||
|
x_pose: (x_pose as i32),
|
||||||
|
y_pose: (draw_height as i32),
|
||||||
|
width: (box_width as i32),
|
||||||
|
height: (box_height as i32),
|
||||||
|
cost: (ShopItems::get_cost(&items.get(box_num).unwrap())),
|
||||||
|
level: (ShopItems::get_level(&items.get(box_num).unwrap())),
|
||||||
|
name: (ShopItems::get_name(&items.get(box_num).unwrap())),
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
self.shop_items = item_vec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn render_shop(
|
||||||
|
draw_handle: &mut RaylibDrawHandle,
|
||||||
|
game_core: &mut GameCore,
|
||||||
|
inGameScreen: &mut InGameScreen) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Pressing F exits from buying
|
||||||
|
if draw_handle.is_key_pressed(KeyboardKey::KEY_F){
|
||||||
|
inGameScreen.current_state = InGameState::SWIMMING;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Screen dimemensions
|
||||||
|
let screen_width = draw_handle.get_screen_width() as f32;
|
||||||
|
let screen_height = draw_handle.get_screen_height() as f32;
|
||||||
|
|
||||||
|
let box_height = screen_height * 0.15;
|
||||||
|
let box_width = screen_width * 0.1;
|
||||||
|
|
||||||
|
let start_width = screen_width - (box_width * 4.0) - 40.0;
|
||||||
|
let draw_height = screen_height - 20.0 - box_height;
|
||||||
|
//draw_handle.draw_rectangle(start_index as i32, (screen_height - 20.0 - box_height) as i32, box_width as i32, box_height as i32, Color::BLACK);
|
||||||
|
|
||||||
|
// Draws shop boxes
|
||||||
|
for box_num in 0..4 {
|
||||||
|
let x_pose = start_width + box_width * box_num as f32;
|
||||||
|
|
||||||
|
draw_handle.draw_rectangle_lines(x_pose as i32, draw_height as i32, box_width as i32, box_height as i32, Color::BLACK);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shop_logic() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user