class_name ActionFormat ## Byte Length: 2 [br] ## AC var signature: String = "AC" ## Byte Type: u8 [br] ## Byte Length: 2 var version: Version ## Byte Type: u16 [br] ## Byte Length: 2 var action_count: int ## Byte Type: u8 [br] ## Byte Length: 10 var reserved: PackedByteArray ## Length: [member action_count] var actions: Array[ActionData] ## Byte Type: u32 [br] ## Byte Length: 4 var event_count: int ## Length: [member event_count] var events: Array[Event] ## Byte Type: f32 [br] ## Byte Length: [member action_count] [br] ## The times are given in the unit of "ticks per displayed frame". [br] ## Multiply by 24 to get the time in milliseconds. var frame_times: Array[float] func get_byte_length() -> int: var length := 20 for action in actions: length += action.get_byte_length() length += Event.BYTE_LENGTH * event_count length += 4 * action_count return length static func from_bytes(bytes: ByteStream) -> ActionFormat: var action_format = ActionFormat.new() bytes.seek(2) @warning_ignore("shadowed_variable") var version = Version.new() version.minor = bytes.decode_u8() version.major = bytes.decode_u8() action_format.version = version if version.major < 2 and version.minor < 3: print(version) return action_format action_format.action_count = bytes.decode_u16() action_format.reserved = bytes.get_buffer(10).bytes action_format.actions = [] as Array[ActionData] for idx in action_format.action_count: var action = ActionData.from_bytes(bytes, version) action_format.actions.append(action) action_format.event_count = bytes.decode_u32() action_format.events = [] as Array[Event] for idx in action_format.event_count: var event = Event.from_bytes(bytes, version) action_format.events.append(event) action_format.frame_times = [] as Array[float] for idx in action_format.action_count: action_format.frame_times.append(bytes.decode_float()) return action_format class ActionData: ## Byte Type: u32 [br] ## Byte Length: 4 var motion_count: int ## Length: [member motion_count] var motions: Array[Motion] func get_byte_length() -> int: var length := 4 for motion in motions: length += motion.get_byte_length() return length static func from_bytes(bytes: ByteStream, version: Version) -> ActionData: var action = ActionData.new() action.motion_count = bytes.decode_u32() action.motions = [] as Array[Motion] for idx in action.motion_count: var motion = Motion.from_bytes(bytes, version) action.motions.append(motion) return action class Motion: ## Byte Type: u8 [br] ## Byte Length: 32 var unused: PackedByteArray ## Byte Type: u32 [br] ## Byte Length: 4 var sprite_layer_count: int ## Length: [member sprite_layer_count] var sprite_layers: Array[SpriteLayer] ## Byte Type: i32 [br] ## Byte Length: 4 var event_id: int ## Byte Type: u32 [br] ## Byte Length: 4 var sprite_anchor_count: int ## Length: [member sprite_anchor_count] var sprite_anchors: Array[SpriteAnchor] func get_byte_length() -> int: return 44 + SpriteLayer.BYTE_LENGTH * sprite_layer_count + SpriteAnchor.BYTE_LENGTH * sprite_anchor_count static func from_bytes(bytes: ByteStream, version: Version): var motion = Motion.new() motion.unused = bytes.get_buffer(32).bytes motion.sprite_layer_count = bytes.decode_u32() motion.sprite_layers = [] as Array[SpriteLayer] for idx in motion.sprite_layer_count: var sprite_layer = SpriteLayer.from_bytes(bytes, version) motion.sprite_layers.append(sprite_layer) motion.event_id = bytes.decode_s32() motion.sprite_anchor_count = bytes.decode_u32() motion.sprite_anchors = [] as Array[SpriteAnchor] for idx in motion.sprite_anchor_count: var sprite_anchor = SpriteAnchor.from_bytes(bytes, version) motion.sprite_anchors.append(sprite_anchor) return motion class SpriteLayer: const BYTE_LENGTH := 44 ## Byte Type: i32 [br] ## Byte Length: 4 var position_u: int ## Byte Type: i32 [br] ## Byte Length: 4 var position_v: int ## Byte Type: i32 [br] ## Byte Length: 4 var sprite_index: int ## Byte Type: u32 [br] ## Byte Length: 4 var flip_h: int ## Byte Type: u8 [br] ## Byte Length: 1 var color_r: int ## Byte Type: u8 [br] ## Byte Length: 1 var color_g: int ## Byte Type: u8 [br] ## Byte Length: 1 var color_b: int ## Byte Type: u8 [br] ## Byte Length: 1 var color_a: int ## Byte Type: f32 [br] ## Byte Length: 4 ## Versions: [2.3, 2.4] var scale: float ## Byte Type: f32 [br] ## Byte Length: 4 ## Versions: [2.5] var scale_u: float ## Byte Type: f32 [br] ## Byte Length: 4 ## Versions: [2.5] var scale_v: float ## Byte Type: i32 [br] ## Byte Length: 4 var rotation_degrees: int ## Byte Type: u32 [br] ## Byte Length: 4 var type: int ## Byte Type: u32 [br] ## Byte Length: 4 var width: int ## Byte Type: u32 [br] ## Byte Length: 4 var height: int func get_position() -> Vector2: return Vector2(position_u, position_v) func get_color() -> Color: return Color8(color_r, color_g, color_b, color_a) func get_scale() -> Vector2: if scale: return Vector2(scale, scale) else: return Vector2(scale_u, scale_v) func get_size() -> Vector2: if width and height: return Vector2(width, height) else: return Vector2.ZERO static func from_bytes(bytes: ByteStream, version: Version): var sprite_layer = SpriteLayer.new() sprite_layer.position_u = bytes.decode_s32() sprite_layer.position_v = bytes.decode_s32() sprite_layer.sprite_index = bytes.decode_s32() sprite_layer.flip_h = bytes.decode_u32() sprite_layer.color_r = bytes.decode_u8() sprite_layer.color_g = bytes.decode_u8() sprite_layer.color_b = bytes.decode_u8() sprite_layer.color_a = bytes.decode_u8() if version.major == 2 and version.minor >= 4: sprite_layer.scale_u = bytes.decode_float() sprite_layer.scale_v = bytes.decode_float() else: sprite_layer.scale = bytes.decode_float() sprite_layer.rotation_degrees = bytes.decode_s32() sprite_layer.type = bytes.decode_u32() if version.to_string() == "2.5": sprite_layer.width = bytes.decode_u32() sprite_layer.height = bytes.decode_u32() return sprite_layer class SpriteAnchor: const BYTE_LENGTH := 16 ## Byte Type: u8 [br] ## Byte Length: 4 var unused: PackedByteArray ## Byte Type: i32 [br] ## Byte Length: 4 var position_u: int ## Byte Type: i32 [br] ## Byte Length: 4 var position_v: int ## Byte Type: u32 [br] ## Byte Length: 4 var flag: int func get_position() -> Vector2: return Vector2(position_u, position_v) static func from_bytes(bytes: ByteStream, _version: Version): var sprite_anchor = SpriteAnchor.new() sprite_anchor.unused = bytes.get_buffer(4).bytes sprite_anchor.position_u = bytes.decode_s32() sprite_anchor.position_v = bytes.decode_s32() sprite_anchor.flag = bytes.decode_u32() return sprite_anchor class Event: const BYTE_LENGTH := 40 ## Byte Type: u8 [br] ## Byte Length: 40 var name: String static func from_bytes(bytes: ByteStream, _version: Version): var event = Event.new() event.name = bytes.get_string_from_utf8(BYTE_LENGTH) return event