rustic_mountain_core/objects/
flag.rs1use 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 show: false,
35 }))), 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 this.show = true;
64 }
65 }
66}