rustic_mountain_core/objects/
platform.rs1use 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 }
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}