rpgx_wasm/map/
effect.rs

1use crate::prelude::{WasmDelta, WasmRect};
2use crate::traits::WasmWrapper;
3use rpgx::prelude::Effect;
4use wasm_bindgen::prelude::*;
5
6#[wasm_bindgen(js_name = Effect)]
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub struct WasmEffect {
9    inner: Effect,
10}
11
12impl WasmWrapper<Effect> for WasmEffect {
13    fn inner(&self) -> &Effect {
14        &self.inner
15    }
16
17    fn into_inner(self) -> Effect {
18        self.inner
19    }
20
21    fn from_inner(inner: Effect) -> Self {
22        WasmEffect { inner }
23    }
24}
25
26#[wasm_bindgen(js_class = Effect)]
27impl WasmEffect {
28    // === Constructors ===
29
30    #[wasm_bindgen(js_name = none)]
31    pub fn none() -> WasmEffect {
32        WasmEffect {
33            inner: Effect::None,
34        }
35    }
36
37    #[wasm_bindgen(js_name = action)]
38    pub fn action(id: u32) -> WasmEffect {
39        WasmEffect {
40            inner: Effect::Action(id),
41        }
42    }
43
44    #[wasm_bindgen(js_name = texture)]
45    pub fn texture(id: u32) -> WasmEffect {
46        WasmEffect {
47            inner: Effect::Texture(id),
48        }
49    }
50
51    #[wasm_bindgen(js_name = render)]
52    pub fn render(id: u32) -> WasmEffect {
53        WasmEffect {
54            inner: Effect::Render(id),
55        }
56    }
57
58    #[wasm_bindgen(js_name = block)]
59    pub fn block(rect: &WasmRect) -> WasmEffect {
60        WasmEffect {
61            inner: Effect::Block(*rect.inner()),
62        }
63    }
64
65    // === Accessors ===
66
67    #[wasm_bindgen(js_name = kind)]
68    pub fn kind(&self) -> String {
69        match self.inner {
70            Effect::None => "None",
71            Effect::Action(_) => "Action",
72            Effect::Texture(_) => "Texture",
73            Effect::Render(_) => "Render",
74            Effect::Block(_) => "Block",
75        }
76        .to_string()
77    }
78
79    #[wasm_bindgen(js_name = asAction)]
80    pub fn as_action(&self) -> Option<u32> {
81        if let Effect::Action(id) = self.inner {
82            Some(id)
83        } else {
84            None
85        }
86    }
87
88    #[wasm_bindgen(js_name = asTexture)]
89    pub fn as_texture(&self) -> Option<u32> {
90        if let Effect::Texture(id) = self.inner {
91            Some(id)
92        } else {
93            None
94        }
95    }
96
97    #[wasm_bindgen(js_name = asRender)]
98    pub fn as_render(&self) -> Option<u32> {
99        if let Effect::Render(id) = self.inner {
100            Some(id)
101        } else {
102            None
103        }
104    }
105
106    #[wasm_bindgen(js_name = asBlock)]
107    pub fn as_block(&self) -> Option<WasmRect> {
108        if let Effect::Block(rect) = self.inner {
109            Some(WasmRect::from_inner(rect))
110        } else {
111            None
112        }
113    }
114
115    // === Methods ===
116
117    #[wasm_bindgen]
118    pub fn offset(&mut self, delta: &WasmDelta) {
119        self.inner.offset(*delta.inner());
120    }
121}