survivor

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

commit
8c2f6384e6adcf1e6dbfcd1d1faa50752ec5386e
parent
d4ea28b4263fa72330c688ccbfd73045dde50f3c
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-02-19 18:53
reusable position type

Diffstat

M src/enemies.rs 7 +++----
M src/game.rs 66 ++++++++++++++++++++++++++++++------------------------------

2 files changed, 36 insertions, 37 deletions


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

@@ -1,5 +1,6 @@
    1     1 // https://vampire-survivors.fandom.com/wiki/Enemies
    2     2 
   -1     3 use crate::game::Pos;
    3     4 use crate::sprites;
    4     5 
    5     6 pub struct EnemyType {
@@ -11,8 +12,7 @@ pub struct EnemyType {
   11    12 }
   12    13 
   13    14 pub struct Enemy {
   14    -1     pub x: f32,
   15    -1     pub y: f32,
   -1    15     pub p: Pos,
   16    16     pub health: f32,
   17    17     pub t: &'static EnemyType,
   18    18 }
@@ -154,8 +154,7 @@ pub fn get_enemy(x: f32, y: f32, i: usize) -> Enemy {
  154   154     let t = wave[i % wave.len()];
  155   155 
  156   156     return Enemy {
  157    -1         x: x,
  158    -1         y: y,
   -1   157         p: Pos { x: x, y: y },
  159   158         health: t.health,
  160   159         t: t,
  161   160     };

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

@@ -22,14 +22,13 @@ pub enum Dir {
   22    22     Stop,
   23    23 }
   24    24 
   25    -1 pub struct Diamond {
   -1    25 pub struct Pos {
   26    26     pub x: f32,
   27    27     pub y: f32,
   28    28 }
   29    29 
   30    30 pub struct Player {
   31    -1     pub x: f32,
   32    -1     pub y: f32,
   -1    31     pub p: Pos,
   33    32     pub dir: Dir,
   34    33     pub face: Dir,
   35    34     pub speed: f32,
@@ -48,8 +47,7 @@ pub struct Player {
   48    47 impl Player {
   49    48     pub fn new() -> Self {
   50    49         return Self {
   51    -1             x: 0.0,
   52    -1             y: 0.0,
   -1    50             p: Pos { x: 0.0, y: 0.0 },
   53    51             dir: Dir::Stop,
   54    52             face: Dir::Right,
   55    53             speed: 30.0,
@@ -105,7 +103,7 @@ impl Player {
  105   103 
  106   104 pub struct Game {
  107   105     pub player: Player,
  108    -1     pub diamonds: Vec<Diamond>,
   -1   106     pub diamonds: Vec<Pos>,
  109   107     pub enemies: Vec<enemies::Enemy>,
  110   108     pub i_enemy: usize,
  111   109     rng: random::Rng,
@@ -124,10 +122,10 @@ impl Game {
  124   122 
  125   123     fn move_player(&mut self, dt: f32) {
  126   124         match self.player.dir {
  127    -1             Dir::Up => self.player.y -= self.player.speed * dt,
  128    -1             Dir::Right => self.player.x += self.player.speed * dt,
  129    -1             Dir::Down => self.player.y += self.player.speed * dt,
  130    -1             Dir::Left => self.player.x -= self.player.speed * dt,
   -1   125             Dir::Up => self.player.p.y -= self.player.speed * dt,
   -1   126             Dir::Right => self.player.p.x += self.player.speed * dt,
   -1   127             Dir::Down => self.player.p.y += self.player.speed * dt,
   -1   128             Dir::Left => self.player.p.x -= self.player.speed * dt,
  131   129             Dir::Stop => {}
  132   130         };
  133   131     }
@@ -136,8 +134,8 @@ impl Game {
  136   134         for i in 0..self.enemies.len() {
  137   135             let enemy = &self.enemies[i];
  138   136 
  139    -1             let dxp = self.player.x - enemy.x;
  140    -1             let dyp = self.player.y - enemy.y;
   -1   137             let dxp = self.player.p.x - enemy.p.x;
   -1   138             let dyp = self.player.p.y - enemy.p.y;
  141   139             let dp = (dxp * dxp + dyp * dyp).sqrt();
  142   140 
  143   141             let mut dx = dxp / dp;
@@ -147,8 +145,8 @@ impl Game {
  147   145                 if i != j {
  148   146                     let other = &self.enemies[j];
  149   147 
  150    -1                     let dxm = other.x - enemy.x;
  151    -1                     let dym = other.y - enemy.y;
   -1   148                     let dxm = other.p.x - enemy.p.x;
   -1   149                     let dym = other.p.y - enemy.p.y;
  152   150                     let dm = (dxm * dxm + dym * dym).sqrt();
  153   151 
  154   152                     if dm < enemy.t.size + other.t.size {
@@ -163,8 +161,8 @@ impl Game {
  163   161             dy /= d;
  164   162 
  165   163             let mut enemy = &mut self.enemies[i];
  166    -1             enemy.x += dx * enemy.t.speed * dt;
  167    -1             enemy.y += dy * enemy.t.speed * dt;
   -1   164             enemy.p.x += dx * enemy.t.speed * dt;
   -1   165             enemy.p.y += dy * enemy.t.speed * dt;
  168   166         }
  169   167     }
  170   168 
@@ -182,8 +180,8 @@ impl Game {
  182   180             };
  183   181 
  184   182             self.enemies.push(enemies::get_enemy(
  185    -1                 spawn_x + self.player.x - width / 2.0,
  186    -1                 spawn_y + self.player.y - height / 2.0,
   -1   183                 spawn_x + self.player.p.x - width / 2.0,
   -1   184                 spawn_y + self.player.p.y - height / 2.0,
  187   185                 self.i_enemy,
  188   186             ));
  189   187             self.i_enemy += 1;
@@ -193,14 +191,16 @@ impl Game {
  193   191     fn despawn_enemies(&mut self, width: f32, height: f32) {
  194   192         self.enemies = std::mem::take(&mut self.enemies)
  195   193             .into_iter()
  196    -1             .filter(|e| (e.y - self.player.y).abs() < height && (e.x - self.player.x).abs() < width)
   -1   194             .filter(|e| {
   -1   195                 (e.p.y - self.player.p.y).abs() < height && (e.p.x - self.player.p.x).abs() < width
   -1   196             })
  197   197             .collect();
  198   198     }
  199   199 
  200   200     fn apply_damage(&mut self, dt: f32) {
  201   201         for enemy in self.enemies.iter_mut() {
  202    -1             let dx = self.player.x - enemy.x;
  203    -1             let dy = self.player.y - enemy.y;
   -1   202             let dx = self.player.p.x - enemy.p.x;
   -1   203             let dy = self.player.p.y - enemy.p.y;
  204   204             let dx2 = dx * dx;
  205   205             let dy2 = dy * dy;
  206   206 
@@ -218,9 +218,9 @@ impl Game {
  218   218             .into_iter()
  219   219             .filter(|enemy| {
  220   220                 if enemy.health <= 0.0 {
  221    -1                     self.diamonds.push(Diamond {
  222    -1                         x: enemy.x,
  223    -1                         y: enemy.y,
   -1   221                     self.diamonds.push(Pos {
   -1   222                         x: enemy.p.x,
   -1   223                         y: enemy.p.y,
  224   224                     });
  225   225                     return false;
  226   226                 } else {
@@ -234,8 +234,8 @@ impl Game {
  234   234         self.diamonds = std::mem::take(&mut self.diamonds)
  235   235             .into_iter()
  236   236             .filter(|diamond| {
  237    -1                 let dx = self.player.x - diamond.x;
  238    -1                 let dy = self.player.y - diamond.y;
   -1   237                 let dx = self.player.p.x - diamond.x;
   -1   238                 let dy = self.player.p.y - diamond.y;
  239   239                 let d = dx * dx + dy * dy;
  240   240                 if d < self.player.diamond_radius * self.player.diamond_radius {
  241   241                     self.player.xp += 1;
@@ -263,8 +263,8 @@ impl Game {
  263   263     pub fn render(&mut self, win: &mut win::Window) {
  264   264         let height = win::iconvert_y(win.height);
  265   265         let width = win::iconvert_x(win.width);
  266    -1         let dx = width / 2.0 - self.player.x;
  267    -1         let dy = height / 2.0 - self.player.y;
   -1   266         let dx = width / 2.0 - self.player.p.x;
   -1   267         let dy = height / 2.0 - self.player.p.y;
  268   268 
  269   269         win.fill([0x33, 0x88, 0x22]);
  270   270         win.circle(
@@ -279,9 +279,9 @@ impl Game {
  279   279         }
  280   280 
  281   281         let mut player_rendered = false;
  282    -1         self.enemies.sort_unstable_by_key(|e| e.y as i32);
   -1   282         self.enemies.sort_unstable_by_key(|e| e.p.y as i32);
  283   283         for enemy in self.enemies.iter() {
  284    -1             if !player_rendered && enemy.y > self.player.y {
   -1   284             if !player_rendered && enemy.p.y > self.player.p.y {
  285   285                 win.sprite(
  286   286                     width / 2.0,
  287   287                     height / 2.0,
@@ -292,10 +292,10 @@ impl Game {
  292   292             }
  293   293 
  294   294             win.sprite(
  295    -1                 enemy.x + dx,
  296    -1                 enemy.y + dy,
   -1   295                 enemy.p.x + dx,
   -1   296                 enemy.p.y + dy,
  297   297                 enemy.t.sprite,
  298    -1                 enemy.x > self.player.x,
   -1   298                 enemy.p.x > self.player.p.x,
  299   299             );
  300   300         }
  301   301         if !player_rendered {