rustic_mountain_core/objects/
smoke.rs

1use std::{cell::RefCell, rc::Rc};
2
3use rand::Rng;
4
5use crate::{structures::*, Celeste};
6use serde::{Deserialize, Serialize};
7
8#[derive(Serialize, Deserialize)]
9pub struct Smoke {
10    spr: f32,
11}
12impl Smoke {
13    pub fn init(celeste: &mut Celeste, x: f32, y: f32) -> Object {
14        Object {
15            pos: Vector {
16                x: x + celeste.mem.rng.gen_range(-1.0..1.0),
17                y: y + celeste.mem.rng.gen_range(-1.0..1.0),
18            },
19            spd: Vector {
20                x: celeste.mem.rng.gen_range(0.3..0.5),
21                y: -0.1,
22            },
23            rem: Vector { x: 0.0, y: 0.0 },
24            spr: 29,
25            hitbox: Rectangle {
26                x: 0.0,
27                y: 0.0,
28                w: 0.0,
29                h: 0.0,
30            },
31            flip: FlipState {
32                x: celeste.mem.rng.gen(),
33                y: celeste.mem.rng.gen(),
34            },
35            collidable: false,
36            solids: false,
37            obj_type: ObjectType::Smoke(Rc::new(RefCell::new(Self { spr: 29.0 }))),
38            draw: ObjFunc(Self::draw),
39            update: ObjFunc(Self::update),
40            name: "Smoke",
41        }
42    }
43    pub fn update(obj: &mut Object, celeste: &mut Celeste) {
44        let tref = match &mut obj.obj_type {
45            ObjectType::Smoke(p) => p.clone(),
46            _ => unreachable!(),
47        };
48        let mut this = tref.borrow_mut();
49        this.spr += 0.2;
50        if this.spr >= 32.0 {
51            obj.destroy_self(celeste);
52        }
53        obj.spr = this.spr as u8;
54    }
55    pub fn draw(obj: &mut Object, celeste: &mut Celeste) {
56        obj.draw_sprite(celeste);
57    }
58}