survivor

graphical action game for the linux terminal
git clone https://git.ce9e.org/survivor.git

commit
3d5cca8310af0dd53818b05ffd43012e5398e474
parent
0a3ae6623d8bc7398ea15a9b9c35aacea1bca8fd
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-03-26 21:52
add weapon struct

Diffstat

M src/game.rs 89 +++++++++++++++++++++++++++++++++----------------------------
M src/weapons.rs 37 ++++++++++++++++++++++++++++++-------

2 files changed, 78 insertions, 48 deletions


diff --git a/src/game.rs b/src/game.rs

@@ -47,6 +47,7 @@ pub struct Player {
   47    47     pub health_max: f32,
   48    48     pub health_recover: f32,
   49    49     pub power: f32,
   -1    50     pub weapons: Vec<weapons::Weapon>,
   50    51     pub damage_radius: f32,
   51    52     pub diamond_radius: f32,
   52    53     pub xp: f32,
@@ -67,6 +68,9 @@ impl Player {
   67    68             health_max: 50.0,
   68    69             health_recover: 0.0,
   69    70             power: 10.0,
   -1    71             weapons: vec![
   -1    72                 weapons::Weapon::new(&weapons::KNIFE),
   -1    73             ],
   70    74             damage_radius: 30.0,
   71    75             diamond_radius: 15.0,
   72    76             xp: 0.0,
@@ -106,9 +110,6 @@ pub struct Game {
  106   110     pub player: Player,
  107   111     pub diamonds: Vec<Pos>,
  108   112     pub enemies: Vec<enemies::Enemy>,
  109    -1     pub projectiles: Vec<weapons::Projectile>,
  110    -1     pub projectiles_cooldown: f32,
  111    -1     pub projectiles_last: f32,
  112   113     pub i_enemy: usize,
  113   114     rng: random::Rng,
  114   115 }
@@ -117,9 +118,6 @@ impl Game {
  117   118     pub fn new() -> Self {
  118   119         return Self {
  119   120             enemies: vec![],
  120    -1             projectiles: vec![],
  121    -1             projectiles_last: 0.0,
  122    -1             projectiles_cooldown: 4.0,
  123   121             diamonds: vec![],
  124   122             i_enemy: 0,
  125   123             player: Player::new(),
@@ -174,12 +172,14 @@ impl Game {
  174   172     }
  175   173 
  176   174     fn move_projectiles(&mut self, dt: f32) {
  177    -1         for projectile in self.projectiles.iter_mut() {
  178    -1             match projectile.dir {
  179    -1                 Dir::Up => projectile.p.y -= projectile.t.speed * dt,
  180    -1                 Dir::Right => projectile.p.x += projectile.t.speed * dt,
  181    -1                 Dir::Down => projectile.p.y += projectile.t.speed * dt,
  182    -1                 Dir::Left => projectile.p.x -= projectile.t.speed * dt,
   -1   175         for weapon in self.player.weapons.iter_mut() {
   -1   176             for projectile in weapon.projectiles.iter_mut() {
   -1   177                 match projectile.dir {
   -1   178                     Dir::Up => projectile.p.y -= weapon.speed * dt,
   -1   179                     Dir::Right => projectile.p.x += weapon.speed * dt,
   -1   180                     Dir::Down => projectile.p.y += weapon.speed * dt,
   -1   181                     Dir::Left => projectile.p.x -= weapon.speed * dt,
   -1   182                 }
  183   183             }
  184   184         }
  185   185     }
@@ -216,28 +216,31 @@ impl Game {
  216   216     }
  217   217 
  218   218     fn spawn_projectiles(&mut self, dt: f32) {
  219    -1         self.projectiles_last += dt;
  220    -1         if self.projectiles_last > self.projectiles_cooldown {
  221    -1             self.projectiles_last -= self.projectiles_cooldown;
  222    -1             self.projectiles.push(weapons::Projectile {
  223    -1                 p: self.player.p,
  224    -1                 dir: match &self.player.dir {
  225    -1                     Some(dir) => dir.clone(),
  226    -1                     None => self.player.face,
  227    -1                 },
  228    -1                 t: &weapons::KNIFE,
  229    -1             });
   -1   219         for weapon in self.player.weapons.iter_mut() {
   -1   220             weapon.last += dt;
   -1   221             if weapon.last > weapon.cooldown {
   -1   222                 weapon.last -= weapon.cooldown;
   -1   223                 weapon.projectiles.push(weapons::Projectile {
   -1   224                     p: self.player.p,
   -1   225                     dir: match &self.player.dir {
   -1   226                         Some(dir) => dir.clone(),
   -1   227                         None => self.player.face,
   -1   228                     },
   -1   229                 });
   -1   230             }
  230   231         }
  231   232     }
  232   233 
  233   234     fn despawn_projectiles(&mut self, width: f32, height: f32) {
  234    -1         self.projectiles = std::mem::take(&mut self.projectiles)
  235    -1             .into_iter()
  236    -1             .filter(|proj| {
  237    -1                 (proj.p.y - self.player.p.y).abs() < height
  238    -1                     && (proj.p.x - self.player.p.x).abs() < width
  239    -1             })
  240    -1             .collect();
   -1   235         for weapon in self.player.weapons.iter_mut() {
   -1   236             weapon.projectiles = std::mem::take(&mut weapon.projectiles)
   -1   237                 .into_iter()
   -1   238                 .filter(|proj| {
   -1   239                     (proj.p.y - self.player.p.y).abs() < height
   -1   240                         && (proj.p.x - self.player.p.x).abs() < width
   -1   241                 })
   -1   242                 .collect();
   -1   243         }
  241   244     }
  242   245 
  243   246     fn apply_damage(&mut self, dt: f32) {
@@ -255,10 +258,12 @@ impl Game {
  255   258             if dx2 + dy2 < self.player.damage_radius * self.player.damage_radius {
  256   259                 enemy.health -= self.player.power * dt;
  257   260             }
  258    -1             for projectile in self.projectiles.iter() {
  259    -1                 let projectile_size = enemy.t.size + projectile.t.size;
  260    -1                 if projectile.p.in_radius(&enemy.p, projectile_size) {
  261    -1                     enemy.health -= projectile.t.damage * self.player.power * dt;
   -1   261             for weapon in self.player.weapons.iter() {
   -1   262                 for projectile in weapon.projectiles.iter() {
   -1   263                     let projectile_size = enemy.t.size + weapon.t.size;
   -1   264                     if projectile.p.in_radius(&enemy.p, projectile_size) {
   -1   265                         enemy.health -= weapon.damage * self.player.power * dt;
   -1   266                     }
  262   267                 }
  263   268             }
  264   269         }
@@ -356,13 +361,15 @@ impl Game {
  356   361             );
  357   362         }
  358   363 
  359    -1         for projectile in self.projectiles.iter() {
  360    -1             win.sprite(
  361    -1                 projectile.p.x + dx,
  362    -1                 projectile.p.y + dy,
  363    -1                 projectile.t.sprite,
  364    -1                 projectile.dir,
  365    -1             );
   -1   364         for weapon in self.player.weapons.iter() {
   -1   365             for projectile in weapon.projectiles.iter() {
   -1   366                 win.sprite(
   -1   367                     projectile.p.x + dx,
   -1   368                     projectile.p.y + dy,
   -1   369                     weapon.t.sprite,
   -1   370                     projectile.dir,
   -1   371                 );
   -1   372             }
  366   373         }
  367   374     }
  368   375 }

diff --git a/src/weapons.rs b/src/weapons.rs

@@ -1,22 +1,45 @@
    1     1 use crate::game::{Dir, Pos};
    2     2 use crate::sprites;
    3     3 
    4    -1 pub struct ProjectileType {
    5    -1     pub speed: f32,
   -1     4 pub struct WeaponType {
   -1     5     pub base_speed: f32,
   -1     6     pub base_damage: f32,
   -1     7     pub base_cooldown: f32,
    6     8     pub size: f32,
    7    -1     pub damage: f32,
    8     9     pub sprite: &'static sprites::Sprite,
    9    10 }
   10    11 
   11    12 pub struct Projectile {
   12    13     pub p: Pos,
   13    14     pub dir: Dir,
   14    -1     pub t: &'static ProjectileType,
   15    15 }
   16    16 
   17    -1 pub const KNIFE: ProjectileType = ProjectileType {
   18    -1     speed: 200.0,
   -1    17 pub struct Weapon {
   -1    18     pub speed: f32,
   -1    19     pub damage: f32,
   -1    20     pub cooldown: f32,
   -1    21     pub last: f32,
   -1    22     pub t: &'static WeaponType,
   -1    23     pub projectiles: Vec<Projectile>,
   -1    24 }
   -1    25 
   -1    26 impl Weapon {
   -1    27     pub fn new(t: &'static WeaponType) -> Self {
   -1    28         return Self {
   -1    29             speed: t.base_speed,
   -1    30             damage: t.base_damage,
   -1    31             cooldown: t.base_cooldown,
   -1    32             last: 0.0,
   -1    33             t: t,
   -1    34             projectiles: vec![],
   -1    35         }
   -1    36     }
   -1    37 }
   -1    38 
   -1    39 pub const KNIFE: WeaponType = WeaponType {
   -1    40     base_speed: 200.0,
   -1    41     base_damage: 30.0,
   -1    42     base_cooldown: 4.0,
   19    43     size: 6.0,
   20    -1     damage: 30.0,
   21    44     sprite: &sprites::KNIFE,
   22    45 };