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