matching original game scaling and mechanics

This commit is contained in:
Andrei Stoica 2024-11-22 07:49:45 -05:00
parent d0a788ae59
commit 5ab49b9610
2 changed files with 56 additions and 30 deletions

View File

@ -4,9 +4,14 @@ use bevy::prelude::Component;
#[derive(Debug, PartialEq)]
pub enum PurchasableObject {
Cookie,
Cursor,
Grandma,
Farm,
Mine,
Factory,
Bank,
Temple,
WizardTower,
}
#[derive(Component, Debug)]
@ -21,9 +26,14 @@ impl Display for PurchasableObject {
f,
"{}",
match self {
PurchasableObject::Cookie => "Cookie",
PurchasableObject::Cursor => "Cursor",
PurchasableObject::Grandma => "Grandma",
PurchasableObject::Farm => "Farm",
PurchasableObject::Mine => "Mine",
PurchasableObject::Factory => "Factory",
PurchasableObject::Bank => "Bank",
PurchasableObject::Temple => "Temple",
PurchasableObject::WizardTower => "Wizard Tower",
}
)
}
@ -31,39 +41,47 @@ impl Display for PurchasableObject {
#[derive(Component, Debug)]
pub struct PlayerStats {
pub money: f64,
pub cookies: f64,
}
impl PlayerStats {
pub fn new() -> PlayerStats {
return PlayerStats { money: 10.0 };
return PlayerStats { cookies: 0.0 };
}
}
pub fn get_current_price(object: &PurchasableObject, num_owned: &u32) -> f64 {
get_base_price(object) * (1.0 + get_scaling_factor(object) * f64::from(*num_owned))
get_base_price(object) * (1.0 + get_price_scaling_factor(object) * f64::from(*num_owned))
}
pub fn get_base_price(object: &PurchasableObject) -> f64 {
match object {
PurchasableObject::Cookie => 10.0,
PurchasableObject::Cursor => 100.0,
PurchasableObject::Grandma => 1000.0,
PurchasableObject::Cursor => 15.0,
PurchasableObject::Grandma => 100.0,
PurchasableObject::Farm => 1_100.0,
PurchasableObject::Mine => 21_000.0,
PurchasableObject::Factory => 130_000.0,
PurchasableObject::Bank => 1_400_000.0,
PurchasableObject::Temple => 20_000_000.0,
PurchasableObject::WizardTower => 330_000_000.0,
}
}
pub fn get_scaling_factor(object: &PurchasableObject) -> f64 {
pub fn get_price_scaling_factor(object: &PurchasableObject) -> f64 {
match object {
PurchasableObject::Cookie => 0.10,
PurchasableObject::Cursor => 0.15,
PurchasableObject::Grandma => 0.20,
_ => 0.15,
}
}
pub fn get_base_returns(object: &PurchasableObject) -> f64 {
match object {
PurchasableObject::Cookie => 1.0,
PurchasableObject::Cursor => 2.0,
PurchasableObject::Grandma => 5.0,
PurchasableObject::Cursor => 0.1,
PurchasableObject::Grandma => 1.0,
PurchasableObject::Farm => 8.0,
PurchasableObject::Mine => 47.0,
PurchasableObject::Factory => 260.0,
PurchasableObject::Bank => 1_400.0,
PurchasableObject::Temple => 7_800.0,
PurchasableObject::WizardTower => 44_000.0,
}
}

View File

@ -4,6 +4,12 @@ use bevy::app::{App, FixedUpdate};
use bevy::prelude::*;
use components::*;
#[derive(Debug)]
enum InputAction {
TapCookie,
Purchase(PurchasableObject),
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
@ -14,10 +20,6 @@ fn main() {
fn setup(mut commands: Commands) {
commands.spawn(PlayerStats::new());
commands.spawn(Purchased {
object: PurchasableObject::Cookie,
count: 1,
});
}
fn get_cash(time: Res<Time>, inv: Query<&Purchased>, mut stats: Query<&mut PlayerStats>) {
@ -27,11 +29,11 @@ fn get_cash(time: Res<Time>, inv: Query<&Purchased>, mut stats: Query<&mut Playe
new_cash += get_base_returns(&object) * f64::from(*count) * f64::from(time.delta_seconds());
}
stats.single_mut().money += new_cash;
stats.single_mut().cookies += new_cash;
}
fn display(inv: Query<&Purchased>, stats: Query<&PlayerStats>) {
println!("money: {}", stats.single().money);
println!("money: {}", stats.single().cookies);
println!("items:");
for Purchased { object, count } in &inv {
println!("\t{}: {}", object, count);
@ -46,28 +48,34 @@ fn handle_input(
) {
keys.get_just_pressed()
.filter_map(|key| match key {
KeyCode::KeyP => Some(PurchasableObject::Cookie),
KeyCode::KeyC => Some(PurchasableObject::Cursor),
KeyCode::KeyG => Some(PurchasableObject::Grandma),
KeyCode::Space => Some(InputAction::TapCookie),
KeyCode::KeyC => Some(InputAction::Purchase(PurchasableObject::Cursor)),
KeyCode::KeyG => Some(InputAction::Purchase(PurchasableObject::Grandma)),
_ => None,
})
.for_each(|item| {
.for_each(|action| {
let mut player_stats = stats.get_single_mut().unwrap();
let item = if let InputAction::Purchase(item) = action {
item
} else {
player_stats.cookies += 1.0;
return;
};
for mut object in &mut pur_items {
if object.object == item {
let price = get_current_price(&item, &object.count);
if price <= player_stats.money {
if price <= player_stats.cookies {
object.count += 1;
player_stats.money -= price;
player_stats.cookies -= price;
}
return;
}
}
if get_base_price(&item) <= player_stats.money {
println!("{}, {}", get_base_price(&item), player_stats.money);
player_stats.money -= get_base_price(&item);
if get_base_price(&item) <= player_stats.cookies {
println!("{}, {}", get_base_price(&item), player_stats.cookies);
player_stats.cookies -= get_base_price(&item);
commands.spawn(Purchased {
object: item,
count: 1,