rustic_mountain_core/objects/
platform.rs

1use std::{cell::RefCell, rc::Rc};
2
3use crate::{structures::*, Celeste};
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize)]
7pub struct Platform {
8    last: f32,
9    dir: f32,
10}
11impl Platform {
12    pub fn init(_celeste: &mut Celeste, x: f32, y: f32, spr: u8) -> Object {
13        Object {
14            pos: Vector { x: x - 4.0, y },
15            spd: Vector { x: 0.0, y: 0.0 },
16            rem: Vector { x: 0.0, y: 0.0 },
17            spr,
18            hitbox: Rectangle {
19                x: 0.0,
20                y: 0.0,
21                w: 16.0,
22                h: 8.0,
23            },
24            flip: FlipState { x: false, y: false },
25            collidable: true,
26            solids: false,
27            obj_type: ObjectType::Platform(Rc::new(RefCell::new(Self {
28                last: -4.0,
29                dir: if spr == 11 { -1.0 } else { 1.0 },
30            }))),
31            draw: ObjFunc(Self::draw),
32            update: ObjFunc(Self::update),
33            name: "Platform",
34        }
35    }
36    pub fn update(obj: &mut Object, celeste: &mut Celeste) {
37        let tref = match &mut obj.obj_type {
38            ObjectType::Platform(p) => p.clone(),
39            _ => unreachable!(),
40        };
41        let mut this = tref.borrow_mut();
42        obj.spd.x = this.dir * 0.65;
43        if obj.pos.x < -16.0 {
44            obj.pos.x = 128.0;
45        } else if obj.pos.x > 128.0 {
46            obj.pos.x = -16.0;
47        }
48
49        if obj.check(celeste, "Player", 0.0, 0.0).is_none() {
50            match obj.check(celeste, "Player", 0.0, -1.0) {
51                Some(pind) => {
52                    let playerref = celeste.objects[pind].clone();
53                    let mut playerobj = playerref.borrow_mut();
54                    playerobj.do_move(celeste, obj.pos.x - this.last, 0.0, 1.0);
55                    // drop(&playerref);
56                }
57                None => (),
58            }
59        }
60        this.last = obj.pos.x;
61    }
62    pub fn draw(obj: &mut Object, celeste: &mut Celeste) {
63        let tref = match &mut obj.obj_type {
64            ObjectType::Platform(p) => p.clone(),
65            _ => unreachable!(),
66        };
67        let _this = tref.borrow_mut();
68        for i in 0..2 {
69            celeste.mem.spr(
70                11 + i,
71                obj.pos.x as i32 + (i * 8) as i32,
72                obj.pos.y as i32 - 1,
73                None,
74            )
75        }
76    }
77}