rustic_mountain_core/objects/
orb.rs1use 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 celeste.freeze = 10;
52 celeste.shake = 10;
53 player.djump = 2;
54 drop(player);
55 drop(playerobj);
56 drop(pref);
57 drop(jref);
58 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}