rustic_mountain_core/objects/
fruit.rs1use 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 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); obj.destroy_self(celeste);
75 }
76 None => (),
77 }
78}