Commit | Line | Data |
---|---|---|
79914631 | 1 | use AppState; |
eb253fcc | 2 | use core::app::StateChange; |
bf7b5671 | 3 | use core::controller::ControllerManager; |
5d7eff9e TW |
4 | use core::level::{Level, LevelGenerator}; |
5 | use core::object::{Object, Objects, ObjectState}; | |
6 | use core::object::character::Character; | |
6566d7e5 | 7 | use core::render::Renderer; |
b0566120 | 8 | use sdl2::event::Event; |
a6b57e45 | 9 | use sdl2::keyboard::Keycode; |
bf7b5671 | 10 | use sprites::SpriteManager; |
953b4c96 | 11 | use teststate::TestState; |
902b2b31 | 12 | use time::Duration; |
b0566120 TW |
13 | |
14 | ////////// GAMESTATE /////////////////////////////////////////////////////////// | |
15 | ||
16 | #[derive(Default)] | |
17 | pub struct GameState { | |
18 | world: World, | |
79914631 | 19 | lvlgen: LevelGenerator, |
7b724ff3 | 20 | debug_mode: bool, |
b0566120 TW |
21 | } |
22 | ||
23 | impl GameState { | |
24 | pub fn new() -> Self { | |
9a6d1261 | 25 | let lvlgen = LevelGenerator::new(0); |
b0566120 | 26 | GameState { |
79914631 TW |
27 | world: World::new(lvlgen.generate()), |
28 | lvlgen, | |
7b724ff3 | 29 | ..Default::default() |
b0566120 TW |
30 | } |
31 | } | |
32 | } | |
33 | ||
34 | impl AppState for GameState { | |
a82a4d23 | 35 | fn enter(&mut self, ctrl_man: &ControllerManager) { |
3fd8761b TW |
36 | for (_k, v) in ctrl_man.controllers.iter() { |
37 | self.world.add(Box::new(Character::new(v.clone()))); | |
b0566120 TW |
38 | } |
39 | } | |
40 | ||
41 | fn leave(&mut self) {} | |
42 | ||
eb253fcc | 43 | fn update(&mut self, dt: Duration) -> Option<StateChange> { |
b0566120 | 44 | self.world.update(dt); |
eb253fcc | 45 | None |
b0566120 TW |
46 | } |
47 | ||
6566d7e5 | 48 | fn render(&mut self, renderer: &mut Renderer, sprites: &SpriteManager) { |
7b724ff3 | 49 | self.world.render(renderer, sprites, self.debug_mode); |
b0566120 TW |
50 | } |
51 | ||
eb253fcc | 52 | fn handle_event(&mut self, event: Event) -> Option<StateChange> { |
a6b57e45 | 53 | match event { |
eb253fcc TW |
54 | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => { |
55 | return Some(StateChange::Pop) | |
56 | } | |
57 | Event::KeyDown { keycode: Some(Keycode::Return), .. } => { | |
b0137bb6 | 58 | return Some(StateChange::Push(Box::new(TestState::new()))) |
eb253fcc | 59 | } |
7b724ff3 TW |
60 | Event::KeyDown { keycode: Some(Keycode::KpEnter), .. } => { |
61 | self.debug_mode = !self.debug_mode; | |
62 | } | |
a6b57e45 | 63 | Event::KeyDown { keycode: Some(Keycode::Space), .. } => { |
79914631 TW |
64 | self.lvlgen.seed = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs() as u32; |
65 | self.world.level = self.lvlgen.generate(); | |
a6b57e45 TW |
66 | } |
67 | Event::KeyDown { keycode: Some(Keycode::KpPlus), .. } => { | |
79914631 | 68 | self.lvlgen.iterations += 1; |
79914631 | 69 | self.world.level = self.lvlgen.generate(); |
a6b57e45 TW |
70 | } |
71 | Event::KeyDown { keycode: Some(Keycode::KpMinus), .. } => { | |
9768e2bb TW |
72 | if self.lvlgen.iterations > 0 { |
73 | self.lvlgen.iterations -= 1; | |
9a6d1261 TW |
74 | self.world.level = self.lvlgen.generate(); |
75 | } | |
76 | } | |
77 | Event::KeyDown { keycode: Some(Keycode::KpMultiply), .. } => { | |
78 | self.lvlgen.wall_smooth_radius += 1; | |
79 | self.world.level = self.lvlgen.generate(); | |
80 | } | |
81 | Event::KeyDown { keycode: Some(Keycode::KpDivide), .. } => { | |
82 | if self.lvlgen.wall_smooth_radius > 0 { | |
83 | self.lvlgen.wall_smooth_radius -= 1; | |
9768e2bb TW |
84 | self.world.level = self.lvlgen.generate(); |
85 | } | |
c80ba7f7 | 86 | } |
a6b57e45 TW |
87 | _ => {} |
88 | } | |
eb253fcc | 89 | None |
a6b57e45 | 90 | } |
b0566120 TW |
91 | } |
92 | ||
93 | ////////// WORLD /////////////////////////////////////////////////////////////// | |
94 | ||
95 | #[derive(Default)] | |
96 | pub struct World { | |
97 | level: Level, | |
3583c453 | 98 | objects: Objects, |
b0566120 TW |
99 | } |
100 | ||
101 | impl World { | |
79914631 | 102 | pub fn new(level: Level) -> Self { |
b0566120 | 103 | World { |
79914631 | 104 | level, |
b0566120 TW |
105 | ..Default::default() |
106 | } | |
107 | } | |
108 | ||
902b2b31 | 109 | pub fn update(&mut self, dt: Duration) { |
3583c453 TW |
110 | let mut breeding_ground = vec!(); |
111 | ||
112 | for i in (0..self.objects.len()).rev() { | |
5d7eff9e | 113 | if self.objects[i].update(&mut breeding_ground, &self.level, dt) == ObjectState::Dead { |
3583c453 TW |
114 | self.objects.remove(i); // swap_remove is more efficient, but changes the order of the array |
115 | } | |
116 | } | |
117 | ||
118 | for o in breeding_ground { | |
119 | self.add(o); | |
b0566120 | 120 | } |
3fd8761b TW |
121 | |
122 | println!("\x1b[Kobject count: {}\x1b[1A", self.objects.len()); // clear line, print, move cursor up | |
b0566120 TW |
123 | } |
124 | ||
7b724ff3 TW |
125 | pub fn render(&mut self, renderer: &mut Renderer, sprites: &SpriteManager, debug_mode: bool) { |
126 | self.level.render(renderer, sprites, debug_mode); | |
b0566120 | 127 | for o in &mut self.objects { |
6566d7e5 | 128 | o.render(renderer, sprites); |
b0566120 TW |
129 | } |
130 | } | |
131 | ||
132 | pub fn add(&mut self, object: Box<dyn Object>) { | |
133 | self.objects.push(object); | |
134 | } | |
135 | } |