rustic_mountain_core/objects/
smoke.rs1use 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}