rustic_mountain_core/objects/
fruit.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4use crate::{structures::*, utils::*, Celeste};
5
6use super::lifeup::LifeUp;
7use serde::{Deserialize, Serialize};
8
9#[derive(Serialize, Deserialize)]
10pub struct Fruit {
11    off: f32,
12    start: f32,
13}
14impl Fruit {
15    pub fn init(_celeste: &mut Celeste, x: f32, y: f32) -> Object {
16        Object {
17            pos: Vector { x, y },
18            spd: Vector { x: 0.0, y: 0.0 },
19            rem: Vector { x: 0.0, y: 0.0 },
20            spr: 26,
21            hitbox: Rectangle {
22                x: 0.0,
23                y: 0.0,
24                w: 8.0,
25                h: 8.0,
26            },
27            flip: FlipState { x: false, y: false },
28            collidable: true,
29            solids: false,
30            obj_type: ObjectType::Fruit(Rc::new(RefCell::new(Self { start: y, off: 0.0 }))),
31            draw: ObjFunc(Self::draw),
32            update: ObjFunc(Self::update),
33            name: "Fruit",
34        }
35    }
36    pub fn update(obj: &mut Object, celeste: &mut Celeste) {
37        let tref = match &mut obj.obj_type {
38            ObjectType::Fruit(p) => p.clone(),
39            _ => unreachable!(),
40        };
41        let mut this = tref.borrow_mut();
42        this.off += 0.025;
43        obj.pos.y = this.start + sin(this.off) * 2.5;
44
45        check_fruit(obj, celeste);
46    }
47    pub fn draw(obj: &mut Object, celeste: &mut Celeste) {
48        obj.draw_sprite(celeste);
49    }
50}
51
52pub fn check_fruit(obj: &mut Object, celeste: &mut Celeste) {
53    match obj.check(celeste, "Player", 0.0, 0.0) {
54        Some(i) => {
55            let jref = celeste.objects[i].clone();
56            let mut playerobj = jref.borrow_mut();
57            let pref = match &mut playerobj.obj_type {
58                ObjectType::Player(p) => p.clone(),
59                _ => unreachable!(),
60            };
61            let mut player = pref.borrow_mut();
62            player.djump = celeste.max_djump;
63            // sfx_timer = 20
64            //sfx 13
65            while celeste.got_fruit.len() <= celeste.level as usize {
66                celeste.got_fruit.push(false);
67            }
68            celeste.got_fruit[celeste.level as usize] = true;
69
70            let lifeup = Rc::new(RefCell::new(LifeUp::init(celeste, obj.pos.x, obj.pos.y)));
71            celeste.objects.push(lifeup);
72            drop(player);
73            drop(playerobj); //manual drop called so that player doesn't get deleted by the retain call
74            obj.destroy_self(celeste);
75        }
76        None => (),
77    }
78}