Skip to content

Commit 06c69ee

Browse files
committed
overwork xp handling, killing givces more
1 parent 1cde48f commit 06c69ee

File tree

6 files changed

+48
-28
lines changed

6 files changed

+48
-28
lines changed

scripts/main.roto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn get_chaser_enemy_stats() -> EntityStats {
1515

1616
fn get_game_constants() -> GameConstants {
1717
# out of bounds margin, spawn target offset, goal wave
18-
GameConstants.new(50.0, 50.0, 1)
18+
GameConstants.new(50.0, 50.0, 10)
1919
}
2020

2121
fn get_wave_composition(wave_number: u32) -> WaveComposition {

src/gamestate/mod.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub struct GameState {
4747
pub projectiles_to_despawn: HashSet<EntityId>,
4848
pub message_from_elf: Option<String>,
4949
pub assets: Assets,
50+
pub num_lvlups: u32,
5051
}
5152

5253
impl GameState {
@@ -125,10 +126,11 @@ I will summon magic to to beat the evil!.
125126
projectiles_to_despawn: HashSet::new(),
126127
message_from_elf: Some(tmp.to_owned()),
127128
assets,
129+
num_lvlups: 1,
128130
}
129131
}
130132

131-
pub fn check_collisions(&mut self) {
133+
pub fn check_collisions(&mut self) -> u32 {
132134
// Check player-enemy collisions
133135
let mut game_over = false;
134136
for enemy in &self.enemies {
@@ -148,11 +150,11 @@ I will summon magic to to beat the evil!.
148150
self.set_next_state(GameStateEnum::GameOver);
149151
}
150152

151-
// Check projectile-enemy collisions
152-
self.check_projectile_enemy_collisions();
153-
154153
// Check enemy-enemy collisions with elastic bounce
155154
self.check_enemy_collisions();
155+
156+
// Check projectile-enemy collisions
157+
self.check_projectile_enemy_collisions()
156158
}
157159

158160
fn check_enemy_collisions(&mut self) {
@@ -198,7 +200,8 @@ I will summon magic to to beat the evil!.
198200
}
199201
}
200202

201-
fn check_projectile_enemy_collisions(&mut self) {
203+
fn check_projectile_enemy_collisions(&mut self) -> u32 {
204+
let mut killed_enemies = 0;
202205
for projectile in &self.projectiles {
203206
for enemy in &self.enemies {
204207
let collision_data = check_collision(
@@ -209,7 +212,10 @@ I will summon magic to to beat the evil!.
209212
);
210213

211214
if collision_data.collided {
215+
killed_enemies += 1;
212216
self.enemies_to_despawn.insert(enemy.id);
217+
// we killed it by ourselves, one more xp:
218+
213219
// Energy balls get removed on hit, pulses stay
214220
match projectile.projectile_type {
215221
ProjectileType::EnergyBall | ProjectileType::HomingMissile => {
@@ -222,6 +228,7 @@ I will summon magic to to beat the evil!.
222228
}
223229
}
224230
}
231+
killed_enemies
225232
}
226233

227234
pub fn check_player_bounds(&mut self) {
@@ -286,6 +293,13 @@ I will summon magic to to beat the evil!.
286293
if is_key_pressed(KeyCode::P) {
287294
self.paused = !self.paused;
288295
}
296+
297+
if is_key_pressed(KeyCode::X) {
298+
self.num_lvlups = self.player.add_xp(100);
299+
if self.num_lvlups > 0 {
300+
self.set_next_state(GameStateEnum::WeaponSelection);
301+
}
302+
}
289303
}
290304

291305
pub fn reload_roto_scripts(&mut self) {
@@ -458,17 +472,7 @@ I will summon magic to to beat the evil!.
458472
}
459473

460474
pub fn process_despawns(&mut self) {
461-
// Award XP for each enemy killed
462-
let enemies_killed = self.enemies_to_despawn.len() as u32;
463-
if enemies_killed > 0 {
464-
// Award 1 XP per enemy killed
465-
let leveled_up = self.player.add_xp(enemies_killed);
466-
467-
// If player leveled up, transition to weapon selection
468-
if leveled_up {
469-
self.set_next_state(GameStateEnum::WeaponSelection);
470-
}
471-
}
475+
self.enemies_to_despawn.len() as u32;
472476

473477
self.enemies
474478
.retain(|e| !self.enemies_to_despawn.contains(&e.id));

src/gamestate/playing.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use macroquad::prelude::*;
33
use super::GameState;
44
use crate::DT;
55
use crate::enemy::EnemyType;
6+
use crate::gamestate::GameStateEnum;
67
use crate::roto_script::WaveConfig;
78

89
pub fn process(gs: &mut GameState) {
@@ -72,9 +73,20 @@ pub fn update_logic(gs: &mut GameState) {
7273
gs.despawn_enemies_out_of_bounds();
7374

7475
// This may trigger game over
75-
gs.check_collisions();
76+
let num_kills = gs.check_collisions();
7677
gs.check_player_bounds();
7778

79+
// leveling:
80+
let enemies_died = gs.enemies_to_despawn.len() as u32;
81+
// Award 1 XP per enemy killed
82+
let leveled_up = gs.player.add_xp(enemies_died + num_kills);
83+
gs.num_lvlups = leveled_up;
84+
85+
// If player leveled up, transition to weapon selection
86+
if leveled_up > 0 {
87+
gs.set_next_state(GameStateEnum::WeaponSelection);
88+
}
89+
7890
// Process all despawns at the end
7991
gs.process_despawns();
8092
}

src/gamestate/weapon_selection.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ pub fn process(gs: &mut GameState) {
2222
} else if is_key_pressed(KeyCode::Key3) {
2323
handle_weapon_selection(gs, WeaponType::HomingMissile);
2424
}
25+
26+
if gs.num_lvlups == 0 {
27+
gs.set_next_state(super::GameStateEnum::Playing);
28+
}
2529
}
2630

2731
fn handle_weapon_selection(gs: &mut GameState, weapon_type: WeaponType) {
@@ -31,14 +35,14 @@ fn handle_weapon_selection(gs: &mut GameState, weapon_type: WeaponType) {
3135
if let Some(index) = weapons.iter().position(|w| w.weapon_type == weapon_type) {
3236
// Player has this weapon - upgrade it
3337
gs.player.level_up_weapon(index);
34-
gs.set_next_state(super::GameStateEnum::Playing);
3538
} else {
3639
// Player doesn't have this weapon - add it (if room available)
3740
if weapons.len() < 3 {
3841
gs.player.add_weapon(weapon_type);
39-
gs.set_next_state(super::GameStateEnum::Playing);
4042
}
4143
}
44+
45+
gs.num_lvlups -= 1;
4246
}
4347

4448
pub fn draw(gs: &GameState) {
@@ -70,9 +74,10 @@ pub fn draw(gs: &GameState) {
7074

7175
fn draw_weapon_selection(gs: &GameState, context: WeaponSelectionContext) {
7276
// Draw title
77+
let lvl_str = format!("{} LEVEL UP(s) - SELECT OUR MAGIC!", gs.num_lvlups);
7378
let title = match context {
7479
WeaponSelectionContext::InitialSelection => "SELECT OUR MAGIC!",
75-
WeaponSelectionContext::LevelUp => "LEVEL UP - SELECT OUR MAGIC!",
80+
WeaponSelectionContext::LevelUp => lvl_str.as_str(),
7681
};
7782
let title_size = 40.0;
7883
let title_width = measure_text(title, None, title_size as u16, 1.0).width;

src/main.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::rc::Rc;
2-
31
use macroquad::prelude::*;
42

53
mod collision;

src/player.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl Player {
4949
} else {
5050
let mut total = 0;
5151
for i in 1..=level {
52-
total += 5 * i;
52+
total += 9 * i;
5353
}
5454
total
5555
}
@@ -59,15 +59,16 @@ impl Player {
5959
Self::xp_for_level(self.level + 1)
6060
}
6161

62-
pub fn add_xp(&mut self, xp: u32) -> bool {
62+
pub fn add_xp(&mut self, xp: u32) -> u32 {
63+
let mut num_levelups = 0u32;
6364
self.xp += xp;
6465

6566
// Check if we leveled up
66-
if self.xp >= self.xp_for_next_level() {
67+
while self.xp >= self.xp_for_next_level() {
6768
self.level += 1;
68-
return true; // Level up occurred
69+
num_levelups += 1;
6970
}
70-
false
71+
num_levelups
7172
}
7273

7374
pub fn get_level(&self) -> u32 {

0 commit comments

Comments
 (0)