santa/
vehicles.rs

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    // Paths to SVGs to draw in sequence
11    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        // TODO I don't know what I'm doing
56        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    /// (max speed, max energy)
67    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}