use std::fmt;
use crate::gml::GMCode;
use crate::prelude::*;
use crate::wad::GMRef;
use crate::wad::deserialize::reader::DataReader;
use crate::wad::elements::GMElement;
use crate::wad::serialize::builder::DataBuilder;
#[derive(Clone, PartialEq)]
pub struct Action {
pub code: GMRef<GMCode>,
pub(super) __exists: bool,
}
impl Action {
#[must_use]
pub const fn new(code: GMRef<GMCode>) -> Self {
Self { code, __exists: true }
}
}
impl GMElement for Action {
fn deserialize(reader: &mut DataReader) -> Result<Self> {
let lib_id = reader.read_u32()?;
reader.assert_int(lib_id, 1, "Lib ID")?;
let _id = reader.read_u32()?;
let kind = reader.read_u32()?;
reader.assert_int(kind, 7, "Kind")?;
let use_relative = reader.read_bool32()?;
reader.assert_bool(use_relative, false, "Use Relative")?;
let is_question = reader.read_bool32()?;
reader.assert_bool(is_question, false, "Is Question")?;
let _use_apply_to = reader.read_bool32()?;
let exe_type = reader.read_u32()?;
reader.assert_int(exe_type, 2, "Exe Type")?;
let _action_name: Option<String> = reader.read_gm_string_opt()?;
let code: Option<GMRef<GMCode>> = reader.read_resource_by_id_opt()?;
let _argument_count = reader.read_u32()?;
let who = reader.read_i32()?;
reader.assert_int(who, -1, "Who")?;
let relative = reader.read_bool32()?;
reader.assert_bool(relative, false, "Relative")?;
let is_not = reader.read_bool32()?;
reader.assert_bool(is_not, false, "Is Not")?;
let unknown_always_zero = reader.read_u32()?;
reader.assert_int(unknown_always_zero, 0, "Unknown always zero")?;
Ok(Self {
code: code.unwrap_or(GMRef::new(0)),
__exists: code.is_some(),
})
}
fn serialize(&self, builder: &mut DataBuilder) -> Result<()> {
builder.write_u32(1); builder.write_u32(603); builder.write_u32(7); builder.write_bool32(false); builder.write_bool32(false); builder.write_bool32(false); builder.write_u32(2); builder.write_gm_string(""); builder.write_resource_id(self.code);
builder.write_u32(0); builder.write_i32(-1); builder.write_bool32(false); builder.write_bool32(false); builder.write_u32(0); Ok(())
}
}
impl fmt::Debug for Action {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Action")
.field("code", &self.code)
.finish_non_exhaustive()
}
}