1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#[macro_export]
macro_rules! script {
    ($t:ident) => {
        static SCRIPT: ::std::sync::OnceLock<::std::sync::RwLock<$t>> =
            ::std::sync::OnceLock::new();

        #[no_mangle]
        pub fn init() {
            SCRIPT.get_or_init(Default::default);

            SCRIPT.get().unwrap().write().unwrap().init();
        }

        #[no_mangle]
        pub fn tick() {
            SCRIPT.get().unwrap().write().unwrap().tick();
        }

        #[no_mangle]
        pub fn event(event: i32) {
            let event = $crate::from_serialized_heap_ptr(event);

            SCRIPT.get().unwrap().write().unwrap().event(event);
        }
    };
}