rustic_mountain_core/objects/
orb.rs

1use std::{cell::RefCell, rc::Rc};
2
3use crate::{
4    structures::*,
5    utils::{appr, cos, sin},
6    Celeste,
7};
8use serde::{Deserialize, Serialize};
9
10#[derive(Serialize, Deserialize)]
11pub struct Orb {}
12impl Orb {
13    pub fn init(_celeste: &mut Celeste, x: f32, y: f32) -> Object {
14        Object {
15            pos: Vector { x, y },
16            spd: Vector { x: 0.0, y: -4.0 },
17            rem: Vector { x: 0.0, y: 0.0 },
18            spr: 102,
19            hitbox: Rectangle {
20                x: 0.0,
21                y: 0.0,
22                w: 8.0,
23                h: 8.0,
24            },
25            flip: FlipState { x: false, y: false },
26            collidable: false,
27            solids: false,
28            obj_type: ObjectType::Orb(Rc::new(RefCell::new(Self {}))),
29            draw: ObjFunc(Self::draw),
30            update: ObjFunc(Self::update),
31            name: "Orb",
32        }
33    }
34    pub fn update(obj: &mut Object, _celeste: &mut Celeste) {}
35    pub fn draw(obj: &mut Object, celeste: &mut Celeste) {
36        obj.spd.y = appr(obj.spd.y, 0.0, 0.5);
37        if obj.spd.y == 0.0 {
38            let hit = obj.check(celeste, "Player", 0.0, 0.0);
39            match hit {
40                Some(i) => {
41                    let jref = celeste.objects[i].clone();
42                    let mut playerobj = jref.borrow_mut();
43                    let pref = match &mut playerobj.obj_type {
44                        ObjectType::Player(p) => p.clone(),
45                        _ => unreachable!(),
46                    };
47
48                    let mut player = pref.borrow_mut();
49                    // music timer 45
50                    // sfx 51
51                    celeste.freeze = 10;
52                    celeste.shake = 10;
53                    player.djump = 2;
54                    drop(player);
55                    drop(playerobj);
56                    drop(pref);
57                    drop(jref);
58                    // ^ take out of scope early
59                    obj.destroy_self(celeste);
60                    celeste.max_djump = 2;
61                }
62                _ => (),
63            }
64        }
65
66        obj.draw_sprite(celeste);
67        for x in 0..8 {
68            let i = x as f32 * 0.125;
69            celeste.mem.circfill(
70                (obj.pos.x + 4.0 + cos(celeste.frames as f32 / 30.0 + i) * 8.0) as u8,
71                (obj.pos.y + 4.0 + sin(celeste.frames as f32 / 30.0 + i) * 8.0) as u8,
72                1,
73                7,
74            )
75        }
76    }
77}