Skip to content

Instantly share code, notes, and snippets.

@ammaraskar
Last active May 31, 2026 21:01
Show Gist options
  • Select an option

  • Save ammaraskar/bc9b613e26f1a262ce0ea5dcf1e58478 to your computer and use it in GitHub Desktop.

Select an option

Save ammaraskar/bc9b613e26f1a262ce0ea5dcf1e58478 to your computer and use it in GitHub Desktop.
sims2 effects resource
meta:
id: effects
file-extension: effects
endian: le
seq:
- id: first_short
type: u2
- id: num_particles
type: u4
- id: particles
type: particle
repeat: expr
repeat-expr: num_particles
- id: num_meta_particles
type: u4
- id: meta_particles
type: meta_particle
repeat: expr
repeat-expr: num_meta_particles
- id: num_decals
type: u4
- id: decals
type: decal
repeat: expr
repeat-expr: num_decals
- id: num_brushes
type: u4
- id: num_scrubbers
type: u4
- id: num_sequences
type: u4
- id: sequences
type: sequence
repeat: expr
repeat-expr: num_sequences
- id: num_sounds
type: u4
- id: sounds
type: sound
repeat: expr
repeat-expr: num_sounds
- id: num_cameras
type: u4
- id: cameras
type: camera
repeat: expr
repeat-expr: num_cameras
- id: num_games
type: u4
- id: num_models
type: u4
- id: models
type: model
repeat: expr
repeat-expr: num_models
- id: num_screens
type: u4
- id: screens
type: screen
repeat: expr
repeat-expr: num_screens
- id: num_waters
type: u4
- id: waters
type: water
repeat: expr
repeat-expr: num_waters
- id: num_lights
type: u4
- id: visual_effect_version
type: u2
- id: num_visual_efects
type: u4
- id: visual_effects
type: visual_effect
repeat: expr
repeat-expr: num_visual_efects
- id: effect_ids
type: effect_id
repeat: until
repeat-until: _.effect_name.string == "end"
types:
effect_id:
seq:
- id: effect_name
type: length_prefixed_string
- id: effect_id
type: u4
vec2_float:
seq:
- id: x
type: f4
- id: y
type: f4
vec3_float:
seq:
- id: x
type: f4
- id: y
type: f4
- id: z
type: f4
vec3_float_list:
seq:
- id: num_elements
type: u4
- id: values
type: vec3_float
repeat: expr
repeat-expr: num_elements
bounding_box:
seq:
- id: corner1
type: vec3_float
- id: corner2
type: vec3_float
float_curve:
seq:
# TODO: there's a different type here, see if it shows up in practice.
# Marked by (type_and_length & 0xff000000) != 0
- id: type_and_length
type: u4
- id: curve_values
type: f4
repeat: expr
repeat-expr: type_and_length
wiggle:
seq:
- id: time_rate
type: f4
- id: rate_direction
type: vec3_float
- id: wiggle_direction
type: vec3_float
wiggle_list:
seq:
- id: num_wiggles
type: u4
- id: wiggles
type: wiggle
repeat: expr
repeat-expr: num_wiggles
tractor_point:
seq:
- id: vec1
type: vec3_float
- id: vec2
type: vec3_float
- id: float
type: f4
tractor_points:
seq:
- id: num_points
type: u4
- id: points
type: tractor_point
repeat: expr
repeat-expr: num_points
length_prefixed_string:
seq:
- id: length
type: u4
- id: string
type: str
terminator: 0
size: length
encoding: UTF-8
particle_rotation:
seq:
- id: unknown_rotation_u8
type: u1
- if: _parent.version < 6
id: rotate_mult_vary_range
type: f4
- if: _parent.version < 6
id: rotate_unknown_float
type: f4
- if: _parent.version >= 6
id: rotate_mult_vary_range_vec
type: vec2_float
- if: _parent.version >= 6
id: rotate_unknown_vec
type: vec2_float
- id: rotation_offsets
type: f4
- id: rotation_unknown_float
type: f4
collider:
seq:
- id: flags
type: u4
- id: unknown_byte
type: u1
if: (flags & 0x1) == 1
- id: unknown_string_1
type: length_prefixed_string
- id: unknown_vec1
type: vec3_float
- id: unknown_vec2
type: vec3_float
- id: unknown_vec3
type: vec3_float
- id: unknown_float1
type: f4
- id: unknown_float2
type: f4
- if: ((flags & 0x1) == 1) and (unknown_byte != 0)
id: unknown_float3
type: f4
- id: unknown_float4
type: f4
- id: unknown_float5
type: f4
- id: unknown_string_2
type: length_prefixed_string
- id: unknown_string_3
type: length_prefixed_string
colliders:
seq:
- id: num_colliders
type: u4
- id: collider
type: collider
repeat: expr
repeat-expr: num_colliders
random_walk:
seq:
- id: vec1
type: vec2_float
- id: vec2
type: vec2_float
- id: f1
type: f4
- id: f2
type: f4
- id: f3
type: f4
particle:
seq:
- id: version
type: u2
- if: version < 5
id: flags_old
type: u4
- if: version >= 5
type: u8
- id: life
type: vec2_float
- id: life_preroll
type: f4
- id: rate_delay
type: vec2_float
- id: rate_trigger
type: vec2_float
- id: unknown_bounding_box
type: bounding_box
- id: emit_speed
type: vec2_float
- id: emit_direction_bounding_box
type: bounding_box
- if: "version > 2"
id: unknown_float
type: f4
- id: rate_curve
type: float_curve
- id: rate_unknown_float1
type: f4
- id: unknown_short1
type: u2
- id: rate_speed_scale
type: f4
- id: size_curve
type: float_curve
- id: size_vary
type: f4
- id: aspect_curve
type: float_curve
- id: aspect_vary
type: f4
- id: rotate_axis
type: vec3_float
- id: unknown_vec3_float
type: vec3_float
- id: particle_rotation
type: particle_rotation
- id: unknown_float_curve1
type: float_curve
- id: unknown_float_curve2
type: float_curve
- if: version > 4
id: unknown_vec3_float_2
type: vec3_float_list
- if: version > 4
id: unknown_vec3_float_3
type: vec3_float
- id: alpha_curve
type: float_curve
- id: alpha_vary
type: f4
- id: color_rgb
type: vec3_float_list
- id: color_vary
type: vec3_float
- id: unknown_string
type: length_prefixed_string
- id: tile_count_u
type: u1
- id: tile_count_v
type: u1
- id: particle_alignment_type
type: u1
- id: particle_draw_type
type: u1
- id: layer
type: f4
- id: frame_speed
type: f4
- id: frame_start
type: u1
- id: frame_count
type: u1
- id: unknown_vec3_float_4
type: vec3_float
- id: unknown_float_2
type: f4
- id: unknown_float_3
type: f4
- id: unknown_vec3_float_5
type: vec3_float
- id: unknown_float_4
type: f4
- id: unknown_float_5
type: f4
- id: screw
type: f4
- id: unknown_wiggle
type: wiggle_list
- id: unknown_u1_1
type: u1
- id: unknown_u1_2
type: u1
- id: unknown_u1_3
type: u1
- id: unknown_u1_4
type: u1
- id: colliders
type: colliders
- id: unknown_string_2
type: length_prefixed_string
- if: version > 10
id: unknown_float_6
type: vec3_float
- id: terrain_bounce
type: f4
- id: unknown_float_7
type: f4
- id: unknown_float_8
type: f4
- id: terrain_repel_scout
type: f4
- id: terrain_repel_vertical
type: f4
- id: terrain_repel_kill_height
type: f4
- id: terrain_death
type: f4
- id: unknown_float_9
type: f4
- id: unknown_vec2_float_1
type: vec2_float
- id: random_walk_delay
type: vec2_float
- id: random_walk_strength
type: vec2_float
- id: random_walk_turn1
type: f4
- id: random_walk_turn2
type: f4
- if: version < 8
id: unknown_attractor_vec
type: vec3_float
- if: version < 8
id: attractor_strength_curve
type: float_curve
- if: version < 8
id: unknown_attractor_float
type: f4
meta_particle:
seq:
- id: version
type: u2
- id: flags
type: u8
- id: life
type: vec2_float
- id: life_preroll
type: f4
- id: rate_delay
type: vec2_float
- id: rate_trigger
type: vec2_float
- id: unknown_bounding_box
type: bounding_box
- id: emit_speed
type: vec2_float
- id: emit_direction_bounding_box
type: bounding_box
- if: "version > 1"
id: unknown_float
type: f4
- id: rate_curve
type: float_curve
- id: rate_unknown_float1
type: f4
- id: unknown_u4
type: u4
- id: size_curve
type: float_curve
- id: size_vary
type: f4
- id: aspect_curve
type: float_curve
- id: aspect_vary
type: f4
- id: rotate_curve
type: float_curve
- id: rotate_vary
type: f4
- id: rotate_offset
type: f4
- id: color_rgb
type: vec3_float_list
- id: color_vary
type: vec3_float
- id: alpha_curve
type: float_curve
- id: alpha_vary
type: f4
- id: base_effect_name
type: length_prefixed_string
- id: particle_alignment_type
type: u1
- id: unknown_vec3_float_1
type: vec3_float
- id: unknown_float_1
type: f4
- id: unknown_float_2
type: f4
- id: unknown_vec3_float_2
type: vec3_float
- id: unknown_float_3
type: f4
- id: unknown_float_4
type: f4
- id: unknown_wiggle
type: wiggle_list
- id: bloom_alpha_1
type: u1
- id: bloom_alpha_2
type: u1
- id: bloom_size_1
type: u1
- id: bloom_size_2
type: u1
- id: colliders
type: colliders
- id: terrain_bounce
type: f4
- id: unknown_float_7
type: f4
- id: unknown_float_8
type: f4
- id: terrain_repel_scout
type: f4
- id: terrain_repel_vertical
type: f4
- id: terrain_repel_kill_height
type: f4
- id: terrain_death
type: f4
- id: unknown_float_9
type: f4
- id: unknown_vec2_float_1
type: vec2_float
- id: random_walks
type: random_walk
repeat: expr
repeat-expr: 2
- id: walk_prefer_direction
type: vec3_float
- id: alignment_damp
type: f4
- id: alignment_bank_wind
type: f4
- id: alignment_bank
type: f4
- if: version < 4
id: attractor_vec
type: vec3_float
- if: version < 4
id: attractor_curve
type: float_curve
- if: version < 4
id: attractor_range
type: f4
- if: version < 3
id: tractor_points
type: tractor_points
- id: unknown_float_last
type: f4
decal:
seq:
- id: version
type: u2
- id: flags
type: u4
- id: texture_name
type: length_prefixed_string
- id: decal_draw_type
type: u1
- id: life_type
type: u1
- id: life
type: f4
- id: rotate_curve
type: float_curve
- id: size_curve
type: float_curve
- id: alpha_curve
type: float_curve
- id: color_rgb
type: vec3_float_list
- id: aspect_curve
type: float_curve
- id: alpha_vary
type: f4
- id: size_vary
type: f4
- id: rotate_vary
type: f4
- id: texture_repeat
type: f4
- id: texture_offset
type: vec2_float
sequence_effect:
seq:
- id: activate_time
type: vec2_float
- id: effect_name
type: length_prefixed_string
sequence:
seq:
- id: version
type: u2
- id: num_sequences
type: u4
- id: sequence
type: sequence_effect
repeat: expr
repeat-expr: num_sequences
- id: flags
type: u4
sound:
seq:
- id: version
type: u2
- id: flags
type: u4
- id: audio_id
type: u4
- id: location_update_delta
type: f4
- id: play_time
type: f4
- id: volume
type: f4
camera:
seq:
- id: version
type: u2
- id: flags
type: u4
- id: life
type: f4
- id: shake_fade_length
type: f4
- id: shake_amplitude
type: float_curve
- id: shake_frequency
type: float_curve
- id: shake_aspect
type: f4
- id: shake_type
type: u1
- id: heading
type: float_curve
- id: pitch
type: float_curve
- id: roll
type: float_curve
- id: orbit
type: float_curve
- id: field_of_view
type: float_curve
- id: near_clip
type: float_curve
- id: far_clip
type: float_curve
- id: zoom
type: s1
- id: rotate
type: s1
- id: attach_radius
type: f4
- id: camera_select
type: length_prefixed_string
model:
seq:
- id: version
type: u2
- id: model_name
type: length_prefixed_string
- id: size
type: f4
- id: color
type: vec3_float
- id: alpha
type: f4
screen:
seq:
- id: version
type: u2
- id: mode
type: u1
- id: flags
type: u4
- id: color_rgb
type: vec3_float_list
- id: strength
type: float_curve
- id: length
type: f4
- id: delay
type: f4
- id: texture
type: length_prefixed_string
water_zero_flag:
seq:
- id: drop_size
type: f4
- id: drop_depth
type: f4
- id: x
type: f4
water:
seq:
- id: version
type: u2
- id: flags
type: u4
- if: flags == 0
id: zero_variant
type: water_zero_flag
matrix:
seq:
- id: elements
type: vec3_float
repeat: expr
repeat-expr: 3
visual_effect_transform:
seq:
- id: byte_1
type: u1
- id: float_1
type: f4
- id: matrix_1
type: matrix
- id: vec_1
type: vec3_float
visual_effect:
seq:
- id: flags
type: u4
- id: short_1
type: u2
- if: _parent.visual_effect_version < 3
id: short_2
type: u2
- if: _parent.visual_effect_version >= 3
id: int_1
type: u4
- id: int_2
type: u4
- id: int_3
type: u4
- id: vec_1
type: vec2_float
- id: num_visual_descriptions
type: u4
- id: visual_effect_descriptions
type: visual_effect_description
repeat: expr
repeat-expr: num_visual_descriptions
visual_effect_description:
seq:
- id: base_effect
type: length_prefixed_string
- id: block_type
type: u1
- id: flags
type: u4
- id: transform
type: visual_effect_transform
- id: lod_begin
type: u1
- id: lod_end
type: u1
- id: emit_scale_begin
type: f4
- id: emit_scale_end
type: f4
- id: size_scale_begin
type: f4
- id: size_scale_end
type: f4
- id: alpha_scale_begin
type: f4
- id: alpha_scale_end
type: f4
- if: _parent._parent.visual_effect_version < 3
id: short_1
type: u2
- if: _parent._parent.visual_effect_version < 3
id: short_2
type: u2
- id: selection_group
type: u2
- id: selection_chance
type: u2
- id: time_scale
type: f4
- id: block_index
type: s4
@DeaExMachinaSims

DeaExMachinaSims commented May 31, 2026

Copy link
Copy Markdown

Thank you for providing this file!

Basegame FX parses well, Uni FX too, but there are issues in EP FX files beginning with Nightlife. Parsing stops somewhere around the particle -> collider segment (first or second listed particle, usually). Wish I could be of more help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment