rustic_mountain_core/objects/
message.rs

1use std::{cell::RefCell, rc::Rc};
2
3use crate::{structures::*, Celeste};
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize)]
7pub struct Message {
8    index: f32,
9    last: f32,
10}
11impl Message {
12    pub fn init(_celeste: &mut Celeste, x: f32, y: f32) -> Object {
13        Object {
14            pos: Vector { x, y },
15            spd: Vector { x: 0.0, y: 0.0 },
16            rem: Vector { x: 0.0, y: 0.0 },
17            spr: 1,
18            hitbox: Rectangle {
19                x: 0.0,
20                y: 0.0,
21                w: 16.0,
22                h: 16.0,
23            },
24            flip: FlipState { x: false, y: false },
25            collidable: true,
26            solids: false,
27            obj_type: ObjectType::Message(Rc::new(RefCell::new(Self {
28                index: 0.0,
29                last: 0.0,
30            }))),
31            draw: ObjFunc(Self::draw),
32            update: ObjFunc(Self::update),
33            name: "Message",
34        }
35    }
36    pub fn update(_obj: &mut Object, _celeste: &mut Celeste) {}
37    pub fn draw(obj: &mut Object, celeste: &mut Celeste) {
38        let text: Box<[char]> =
39            "-- celeste mountain --#this memorial to those# perished on the climb"
40                .chars()
41                .collect();
42        let tref = match &mut obj.obj_type {
43            ObjectType::Message(p) => p.clone(),
44            _ => unreachable!(),
45        };
46        let mut this = tref.borrow_mut();
47
48        if obj.check(celeste, "Player", 4.0, 0.0).is_some() {
49            if this.index < text.len() as f32 {
50                this.index += 0.5;
51                if this.index >= this.last + 1.0 {
52                    this.last += 1.0;
53                    // sfx 35
54                }
55            }
56            let mut _x = 8;
57            let mut _y = 96;
58            for i in 1..this.index as i32 {
59                if text[i as usize] != '#' {
60                    celeste.mem.rectfill(_x - 2, _y - 2, _x + 7, _y + 6, 7);
61                    celeste.mem.print(&text[i as usize].to_string(), _x, _y, 0);
62                    _x += 5;
63                } else {
64                    _x = 8;
65                    _y += 7;
66                }
67            }
68        } else {
69            this.index = 0.0;
70            this.last = 0.0;
71        }
72    }
73}