rustic_mountain_core/objects/
flag.rs

1use std::{cell::RefCell, rc::Rc};
2
3use crate::{draw_time, structures::*, Celeste};
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize)]
7pub struct Flag {
8    score: u8,
9    show: bool,
10}
11impl Flag {
12    pub fn init(celeste: &mut Celeste, x: f32, y: f32) -> Object {
13        Object {
14            pos: Vector { x: x + 5.0, 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: 8.0,
22                h: 8.0,
23            },
24            flip: FlipState { x: false, y: false },
25            collidable: true,
26            solids: false,
27            obj_type: ObjectType::Flag(Rc::new(RefCell::new(Self {
28                score: celeste
29                    .got_fruit
30                    .iter()
31                    .map(|x| if *x { 1 } else { 0 })
32                    .sum(),
33                // .fold(0, |acc, x| acc +),
34                show: false,
35            }))), // score =
36            draw: ObjFunc(Self::draw),
37            update: ObjFunc(Self::update),
38            name: "Flag",
39        }
40    }
41    pub fn update(_obj: &mut Object, _celeste: &mut Celeste) {}
42    pub fn draw(obj: &mut Object, celeste: &mut Celeste) {
43        let tref = match &mut obj.obj_type {
44            ObjectType::Flag(p) => p.clone(),
45            _ => unreachable!(),
46        };
47        let mut this = tref.borrow_mut();
48
49        obj.spr = 118 + ((celeste.frames / 5) % 3) as u8;
50        obj.draw_sprite(celeste);
51
52        if this.show {
53            celeste.mem.rectfill(32, 2, 96, 31, 0);
54            celeste.mem.spr(26, 55, 6, None);
55            celeste.mem.print(&format!("x{}", this.score), 64, 9, 7);
56            draw_time(celeste, 49, 16);
57            celeste
58                .mem
59                .print(&format!("deaths:{}", celeste.deaths), 48, 24, 7);
60        } else if obj.check(celeste, "Player", 0.0, 0.0).is_some() {
61            // sfx 55
62            // sfx timer = 30
63            this.show = true;
64        }
65    }
66}