screeps/objects/impls/
room_object.rs1use js_sys::Array;
2use wasm_bindgen::prelude::*;
3
4use crate::{
5 constants::EffectType,
6 local::Position,
7 objects::{Room, RoomPosition},
8 prelude::*,
9};
10
11#[wasm_bindgen]
12extern "C" {
13 #[derive(Clone, Debug)]
17 pub type RoomObject;
18
19 #[wasm_bindgen(method, getter = effects)]
23 fn effects_internal(this: &RoomObject) -> Option<Array>;
24
25 #[wasm_bindgen(method, getter = pos)]
34 pub fn js_pos(this: &RoomObject) -> RoomPosition;
35
36 #[wasm_bindgen(method, getter)]
42 pub fn room(this: &RoomObject) -> Option<Room>;
43}
44
45#[wasm_bindgen]
46extern "C" {
47 #[wasm_bindgen]
48 #[derive(Debug)]
49 pub type Effect;
50
51 #[wasm_bindgen(method, getter)]
52 pub fn effect(this: &Effect) -> EffectType;
53
54 #[wasm_bindgen(method, getter)]
55 pub fn level(this: &Effect) -> Option<u8>;
56
57 #[wasm_bindgen(method, getter = ticksRemaining)]
58 pub fn ticks_remaining(this: &Effect) -> u32;
59}
60
61impl<T> HasPosition for T
62where
63 T: AsRef<RoomObject>,
64{
65 fn pos(&self) -> Position {
66 self.as_ref().js_pos().into()
67 }
68}
69
70impl<T> RoomObjectProperties for T
71where
72 T: AsRef<RoomObject>,
73{
74 fn effects(&self) -> Vec<Effect> {
75 RoomObject::effects_internal(self.as_ref())
76 .map(|arr| arr.iter().map(JsCast::unchecked_into).collect())
77 .unwrap_or_default()
78 }
79
80 fn effects_raw(&self) -> Option<Array> {
81 RoomObject::effects_internal(self.as_ref())
82 }
83
84 fn room(&self) -> Option<Room> {
85 RoomObject::room(self.as_ref())
86 }
87}