1use geom::{Speed, Time};
2use widgetry::{GeomBatch, Prerender};
3
4pub struct Vehicle {
5 pub name: String,
6
7 pub speed: Speed,
8 pub max_energy: usize,
9
10 draw_frames: Vec<&'static str>,
12 scale: f64,
13}
14
15impl Vehicle {
16 pub fn get(name: &str) -> Vehicle {
17 match name {
18 "bike" => Vehicle {
19 name: "bike".to_string(),
20
21 speed: Speed::miles_per_hour(30.0),
22 max_energy: 100,
23
24 draw_frames: vec!["bike1.svg", "bike2.svg", "bike1.svg", "bike3.svg"],
25 scale: 0.05,
26 },
27 "sleigh" => Vehicle {
28 name: "sleigh".to_string(),
29
30 speed: Speed::miles_per_hour(25.0),
31 max_energy: 300,
32
33 draw_frames: vec!["sleigh.svg"],
34 scale: 0.08,
35 },
36 "cargo bike" => Vehicle {
37 name: "cargo bike".to_string(),
38
39 speed: Speed::miles_per_hour(40.0),
40 max_energy: 150,
41
42 draw_frames: vec![
43 "cargo_bike1.svg",
44 "cargo_bike2.svg",
45 "cargo_bike1.svg",
46 "cargo_bike3.svg",
47 ],
48 scale: 0.05,
49 },
50 x => panic!("Don't know vehicle {}", x),
51 }
52 }
53
54 pub fn animate(&self, prerender: &Prerender, time: Time) -> GeomBatch {
55 let rate = 0.1;
57 let frame = (time.inner_seconds() / rate) as usize;
58
59 let path = format!(
60 "system/assets/santa/{}",
61 self.draw_frames[frame % self.draw_frames.len()]
62 );
63 GeomBatch::load_svg(prerender, &path).scale(self.scale)
64 }
65
66 pub fn max_stats() -> (Speed, usize) {
68 let mut speed = Speed::ZERO;
69 let mut energy = 0;
70 for x in ["bike", "cargo bike", "sleigh"] {
71 let vehicle = Vehicle::get(x);
72 speed = speed.max(vehicle.speed);
73 energy = energy.max(vehicle.max_energy);
74 }
75 (speed, energy)
76 }
77}