Post by zatarita on Jul 7, 2022 12:16:56 GMT 10
So I originally wrote this tutorial for the discord server, and I figured it might be useful to drop here as well. This is the LIT definition as best I know it now. I will come back and add additional info, and pictures as time goes on.
So before I start it's important to explain that I use the name of the data types here
Byte = 1 Byte: Integer value < 255
uint16_t = 2 Bytes: Integer Value < 65535
uint32_t = 4 Bytes: Integer Value < 4294967295
Float = 4 Bytes: Decimal Value (eg 3.1415)
An array is also a grouped collection of something. For example an (x, y, z) position might be an array of Floats with a size of three.
It is just a group of something of a certain size. These are always sequential in the file, so they are grouped together.
An enum is a integer value of any type that can only be set to certain values, and these certain values define a state. For example Fog Type it is a byte, but there are only 5 values it can be set to (0, 2, 4, 5, 6, & 7)
nothing else has a defined meaning, and may crash the game.
Flags are an integer value that get added together. They are always a power of 2. For example Light Mask. This determines which objects the light will actually effect. (I will explain this more in detail later, just for example sake)
1: Player, 2: Enemy, 4: Object, 8: Effect, 16: SMD, 32: Item, 64: Sub Character, 128: Thermo (unused)
If we want the light to be able to effect the player, enemies, and SMD objects we would add, 1 + 2 + 16 which would give us 19. Everything else is ignored. These are called flags.
Also I use offsets. These offsets are relative to the start of the section of the file. This will make more sense with examples if you don't understand
The LIT File controls the Light, Wind, Blur, Depth of Field, and Distance Culling for a specific room. The LIT is broken up into Light Groups; and each Light Group is broken up into Lights. The Light Groups control the global settings for the room, all the lights contained within the Light Group are effected by the settings in the Light Group Properties.
The Light Group works together with the CAM file to determine which lights are activated for a current camera angle. This allows the game to turn off unseen lights and save resources. The game also limits how many lights can effect an object to 6. So by turning off lights not being used; it also reduces the chances of reaching that cap. Light groups consist of two parts. The first part is global properties. Things like tuning the child lights, fog, wind, blur, etc. This applies to each Light the Light Group owns. The second half of the Light Group are the lights them selves. The Light Group Properties will tell us how many lights it contains.
offset 0x00 (Green): uint16_t - Count; This tells us how many light groups are in the LIT file.
offset 0x02 (Red) : uint16_t - unknown
offset 0x04: Array{uint32_t}[Count] - Array of offsets pointing to the start of each light group. The size of this array will be different depending on the size of the count. Some rooms have 1 light group, others have more. Everything grayed out is the start of the light group itself.
offset 0x00: Color RGBA[byte, byte, byte, byte] - SMD Master Tint effects the color of SMD objects
offset 0x04: (Yellow) uint32_t - Light Count; How many lights there are in the light group.
offset 0x08 (Orange): Enum{uint32_t} - Fog Type {0: None, 2: Linear, 4: Exponential, 5: Exponential 2, 6: Reverese Exponential, 7: Reverse Exponential 2} determines the equation used to calculate light density over distance.
offset 0x0c (Yellow): Float - Fog Start; the start position for the fog
offset 0x10 (Purple): Float - Fog End; the position where the density of the fog is 100% and nothing can be seen beyond it. Note this works together with Distance Culling discussed later.
offset 0x14: Color RGBA[byte, byte, byte, byte] - Fog Color in RGBA8888
I'll be honest with you, I have to do more research on this. This is the names used by the developers for this data, and I'm unsure what it actually does.
offset 0x08 (Orange): Enum{uint32_t} - Fog Type {0: None, 2: Linear, 4: Exponential, 5: Exponential 2, 6: Reverese Exponential, 7: Reverse Exponential 2} determines the equation used to calculate light density over distance.
offset 0x0c (Yellow): Float - Fog Start; the start position for the fog
offset 0x10 (Purple): Float - Fog End; the position where the density of the fog is 100% and nothing can be seen beyond it. Note this works together with Distance Culling discussed later.
offset 0x14: Color RGBA[byte, byte, byte, byte] - Fog Color in RGBA8888
offset 0x28: uint32_t - Focal Distance used to calculate blur iterations
offset 0x2C: uint16_t - Focus Level of iteration of the blur applied. max 10
offset 0x2E: Enum{Byte} - Focus Mode {0: Near, 1: Far, 2: Follow Player Near, 3: Follow Player Far} Near is blur applied before the focus distance, Far is blur applied after the focus distance. Follow player means the focal distance uses the player's distance from the camera instead of the focus distance.
offset 0x2F: Byte - Blur Rate is actually used by the "Blur Settings" later in the file. I have NO clue why it's here. I will explain it in it's own section.
offset 0x30 (Orange): uint32_t - Room/Core LIT Tune; 0 if using the Core LIT for tuning, 1 if using the room's LIT for tuning. If 1, the rest of the settings can be set.
offset 0x34: Color RGBA[byte, byte, byte, byte] - Color tuning for SMD * Note * I don't go into much detail here, because this appears to not work.
offset 0x38: Color RGBA[byte, byte, byte, byte] - Color tuning for Enemy and Object color * Note * I don't go into much detail here, because this appears to not work.
offset 0x3C: Color RGBA[byte, byte, byte, byte] -Color tuning for Effect Color * Note * I don't go into much detail here, because this appears to not work.
offset 0x40 (Purple): Enum{Byte} - SMD Scale Multiplier {1: 1x, 2: 2x, 3: 4x} SMD Lighting Scale Multiplier. can be 1x, 2x, or 4x
offset 0x41 (Yellow): Enum{Byte} - Player Scale Multiplier {1: 1x, 2: 2x, 3: 4x} Player Lighting Scale Multipler. can be 1x, 2x, or 4x
offset 0x42: PADDING
offset 0x44 (Yellow): Float - Distance Culling (Pop In) is a percentage value between 0, and 1. This determines at what distance the engine should stop drawing SMD objects. This is a percentage from the END of the fog curtain (thanks kteo) Setting this to zero will remove any "Pop in" however will result in the highest performance impact.
offset 0x48: Byte - Unknown what this does, it is internally referred to as "Hokan" though.
(After optimization Settings there is a bunch of unused space. It's likely this is used internally by the game at run time and is left here as a spacer.)
offset 0xEC (orange): Byte - Wind Direction (0x80 = π = 180°; 0xFF = 2π = 360°) determines the wind direction. This is in radians, and is in relationship to the room's local north.
offset 0xED (yellow) : Byte - Wind Power (1 = 0.20 units) Determines the wind's intensity
offset 0xEE (green) : Byte - Wind Frequency (1 = 0.01 units) Determines the frequency of gusts
offset 0xEF: Byte - padding?
offset 0xF0 (Red): Enum{Byte} - Blur Type {0: Motion, 1: Zoom, 2: Add} determines the algorithm used to calculate blur. Motion blur is default, Zoom blur is like in the door transition effect, and Add is basically a "bloom" filter
offset 0xF1 (Green): Byte - Blur Power determines the intensity of the blur used.
NOTE Blur rate from "Focus Settings" (Purple) applies to this. It determines the duration between iterations of the blur. for example the duration between "snapshots" for the motions blur effect
offset 0xF2 (Red) : Byte - Mipmap Min LOD (Must be less than Mipmap Max LOD) Sets the minimum Level Of Detail (LOD) to be used when using a light group.
offset 0xF3 (Green): Byte - Mipmap Max LOD (Must be greater than Mipmap Min LOD) Sets the maximum LOD to be used when using a light group.
offset 0xF4 (Blue) : Enum{Byte} - Anisotropic Filtering Format {0: GX_ANISO_1, 1: GX_ANISO_2, 2: GX_ANISO_4} Determines the anisotrpic filtering format used to "smooth" jaged edges. Higher the value, the higher the performance impact but "better quality"
Offset 0xF5 (Red) : Byte - Room Contrast Level (max 3)
offset 0xF6 (Green) : Byte - Power; the amount to "squeeze" the contrast for light values after the Bias.
offset 0xF7 (Blue) : Byte - Bias shifts the contrast "starting point" to ignore lower light values.
offset 0xF8 (Orange): Float - LOD Bias shifts the game more towards lower LODs. More research is needed.
offset 0xFC: Color RGBA[byte, byte, byte, byte] - Ambient Enemies & Objects; the global tuning for Enemies and Objects
offset 0x100: Color RGBA[byte, byte, byte, byte] - Ambient Effects; the global tuning for Effects
offset 0x00 (Red) : Enum{Byte} - Light Format? {5: unknown, 7: default} Light Format is currently unknown. Might be a version indicator.
offset 0x01 (Orange): Enum{Byte} - Light Type {0: Constant, 1: Linear, 2: Quadratic, 3: Spotlight, 4: Custom, 5: Parallel, 6: Spot Quad, 7: Local Ambient} Type determines which type of light is cast from the light. EG, spot light, sunlight, point light.
offset 0x02 (Yellow) : Enum{Byte} - Light Attributes {0: Normal, 1: Flicker, 2: Wave, 3: Spot Rotate, 4: Shadow, 5: Path, 6: Fade. 7: Shine} Attributes determine extra information about how the light behaves/changes over time.
offset 0x03 (Green) : Flag{Byte} - Light Mask {1: Player, 2: Enemy, 4: Object, 8: Effect, 16: Ambient, 32: Item, 64: Sub Character, 128: Thermo (unused) } Light mask determines which objects the light effects. EG Ignore the player, but light ashlee. These are flags that get added together. See the first message for clarification on flags.
offset 0x04 (Purple): Float[3] - Position of the light as an array of floats (x,y,z)
offset 0x10 (Orange): Float - Casting range of the emitted light as a radius with the center point being the position above
offset 0x14: Color RGBA[byte, byte, byte, byte] - Color of the emitted light
offset 0x18 (Yellow): Float - Intensity of the emitted light.
offset 0x1C (Red) : Byte{Byte} - Parent {0: World, 1: Enemy, 2: SMD, 3: Etc Model, 4: Object} determines what (if any) object the light's position is attached to.
offset 0x1D (Orange): Byte - Subgroup; Determines the subgroup the lights belong to if any. Act's like a "layer" that can be disabled (somehow...?)
offset 0x1E (Yellow) : Flag{Byte} - Flags{0: None, 1: Ignore Tuning, 2: Electric Light, 4: Flashlight} Flags augment how the light behaves. This requires more research.
offset 0x1F (Green) : Byte - Priority of the light determines which light gets used if more than 6 lights are effecting an object. This isn't a guarentee, more of a preference. default 3
offset 0x20 (Blue) : uint16_t - Part/Bone number; If there is a parent set (such as an enemy, or SMD) This is the bone that the light get's parented to. Such as an entities hand, or face.
offset 0x22 (Purple) : uint16_t - Parent ID; If there is a parent set (such as an enemy, or SMD) this is the ID for the parent.
These are the parameters for each type of light (if there are any) Sadly due to the way this is set up, it would take a LONG TIME to make reference images for each of these. Hopefully you've figured out the pattern above for the offset's position. Sorry for my laziness I've been typing this for almost 4 hours now x.x
Type Constant:
None
Type Linear:
None
Type Quadratic:
offset 0x2C: Float - Smooth Edge
Type Spot Light:
offset 0x2C: Float[3] - Position (x, y, z)
offset 0x38: Float - Spot Light Range (Clamped > 1)
offset 0x3C: Float - Smooth Edge
Type Custom:
offset 0x2C: Float[3] - "Normal" (X, Y, Z)
offset 0x34: Float[3] - (A0, A1, A2)
offset 0x40: Float[3] - (K0, K1, K2)
> Unknown what these are.
Type Parallel:
offset 0x2C: Float[3] - Direction (X, Y, Z)
offset 0x3B: uint32_t - Use Local Direction (0 = false, 1 = true)
offset 0x3C: Float - Smooth Edge
Type Spot Quad:
offset 0x2C: Float[3] - Direction (X, Y, Z)
offset 0x38: Float - Spot Light Range (Clamped > 1)
offset 0x3C: Float - Smooth Edge
Type Local Ambient:
offset 0x2C Float - Smooth Edge
Smooth Edge seems to attempt to average the light values per edge instead of vertex.
There appears to be a bunch of unused bytes in here. This may be here as a spacer for the game to use at runtime, or it may be "clobber" space for the above parameters.
Offsets 0x6C - 0x84 is a multipurpose similar to the light type properties. These change depending on which value is set in the Light Attributes property.
Type Flicker:
offset 0x6C: Color RGBA[byte, byte, byte, byte] - Flicker Color
offset 0x70: Byte - Flicker Range
Flicker Range determines the "spread" of the flicker effect. Higher value is a more intense effect
Type Wave:
offset 0x6C: Float - Wave Center
offset 0x70: Float - Wave Amplitude
offset 0x74: Float - Wave Speed
offset 0x78: Float - Wave Period (Used at runtime)
More research is needed; however, This is a pulsing effect. The wave amplitude determines the intensity of the pulsing, and the Wave speed determines the speed of the pulsing. The wave period isn't a modifiable parameter; however, it is used by the game at runtime to keep track of the current position in the wave.
Type Spot Rotate:
offset 0x6C: Float[3] - Rotate (x,y,z)
Makes the light rotate. x,y,z speed of rotation.
Type Shadow:
offset 0x6D: Flag{Byte} - Use TEX (0: No TEX, 1: Use TEX, 4: Invert Text)
offset 0x6E: Enum{Byte} - Shadow Type {0: Normal, 1: Cast, 2: Cast Add, 3: Cast 2, 4: Cast Add 2, 5: Foot} (Note Normal and Foot allow TEX to be toggeled off)
Offset 0x6F: Byte - Ground Distance/TEX Number
More research needed
Type Path:
offset 0x6C: uint32_t - Path Start
offset 0x70: uint32_t - Path Position
offset 0x74: Flag{Byte} - Flags {0: None, 1: Loop, 2: Inverse}
offset 0x78: Byte - Path Index
Changes the light intensity over time using a predefined path. This isn't easy to mod, as the path seems to be a hard coded pointer into the exe.
Type Fade:
offset 0x6C: Float - Fade Start
offset 0x70: Float - Fade Speed
Light will start at the fade start point, and will gradually decrease over time
Type Shine:
offset 0x6C: Float[3] - Period (x, y, z (unused) )
offset 0x78: Float[3] - Speed (x, y, z (unused) )
Shine rotates the light in a unique way, hard to explain. Play with the parameters to get an idea of it.
So before I start it's important to explain that I use the name of the data types here
Byte = 1 Byte: Integer value < 255
uint16_t = 2 Bytes: Integer Value < 65535
uint32_t = 4 Bytes: Integer Value < 4294967295
Float = 4 Bytes: Decimal Value (eg 3.1415)
An array is also a grouped collection of something. For example an (x, y, z) position might be an array of Floats with a size of three.
It is just a group of something of a certain size. These are always sequential in the file, so they are grouped together.
An enum is a integer value of any type that can only be set to certain values, and these certain values define a state. For example Fog Type it is a byte, but there are only 5 values it can be set to (0, 2, 4, 5, 6, & 7)
nothing else has a defined meaning, and may crash the game.
Flags are an integer value that get added together. They are always a power of 2. For example Light Mask. This determines which objects the light will actually effect. (I will explain this more in detail later, just for example sake)
1: Player, 2: Enemy, 4: Object, 8: Effect, 16: SMD, 32: Item, 64: Sub Character, 128: Thermo (unused)
If we want the light to be able to effect the player, enemies, and SMD objects we would add, 1 + 2 + 16 which would give us 19. Everything else is ignored. These are called flags.
Also I use offsets. These offsets are relative to the start of the section of the file. This will make more sense with examples if you don't understand
The LIT File controls the Light, Wind, Blur, Depth of Field, and Distance Culling for a specific room. The LIT is broken up into Light Groups; and each Light Group is broken up into Lights. The Light Groups control the global settings for the room, all the lights contained within the Light Group are effected by the settings in the Light Group Properties.
The Light Group works together with the CAM file to determine which lights are activated for a current camera angle. This allows the game to turn off unseen lights and save resources. The game also limits how many lights can effect an object to 6. So by turning off lights not being used; it also reduces the chances of reaching that cap. Light groups consist of two parts. The first part is global properties. Things like tuning the child lights, fog, wind, blur, etc. This applies to each Light the Light Group owns. The second half of the Light Group are the lights them selves. The Light Group Properties will tell us how many lights it contains.
Header
offset 0x02 (Red) : uint16_t - unknown
offset 0x04: Array{uint32_t}[Count] - Array of offsets pointing to the start of each light group. The size of this array will be different depending on the size of the count. Some rooms have 1 light group, others have more. Everything grayed out is the start of the light group itself.
Light Group Properties
offset 0x04: (Yellow) uint32_t - Light Count; How many lights there are in the light group.
Fog settings
offset 0x0c (Yellow): Float - Fog Start; the start position for the fog
offset 0x10 (Purple): Float - Fog End; the position where the density of the fog is 100% and nothing can be seen beyond it. Note this works together with Distance Culling discussed later.
offset 0x14: Color RGBA[byte, byte, byte, byte] - Fog Color in RGBA8888
Mirror Fog Settings
I'll be honest with you, I have to do more research on this. This is the names used by the developers for this data, and I'm unsure what it actually does.
offset 0x08 (Orange): Enum{uint32_t} - Fog Type {0: None, 2: Linear, 4: Exponential, 5: Exponential 2, 6: Reverese Exponential, 7: Reverse Exponential 2} determines the equation used to calculate light density over distance.
offset 0x0c (Yellow): Float - Fog Start; the start position for the fog
offset 0x10 (Purple): Float - Fog End; the position where the density of the fog is 100% and nothing can be seen beyond it. Note this works together with Distance Culling discussed later.
offset 0x14: Color RGBA[byte, byte, byte, byte] - Fog Color in RGBA8888
Depth Of Field
offset 0x2C: uint16_t - Focus Level of iteration of the blur applied. max 10
offset 0x2E: Enum{Byte} - Focus Mode {0: Near, 1: Far, 2: Follow Player Near, 3: Follow Player Far} Near is blur applied before the focus distance, Far is blur applied after the focus distance. Follow player means the focal distance uses the player's distance from the camera instead of the focus distance.
offset 0x2F: Byte - Blur Rate is actually used by the "Blur Settings" later in the file. I have NO clue why it's here. I will explain it in it's own section.
Tuning settings
offset 0x34: Color RGBA[byte, byte, byte, byte] - Color tuning for SMD * Note * I don't go into much detail here, because this appears to not work.
offset 0x38: Color RGBA[byte, byte, byte, byte] - Color tuning for Enemy and Object color * Note * I don't go into much detail here, because this appears to not work.
offset 0x3C: Color RGBA[byte, byte, byte, byte] -Color tuning for Effect Color * Note * I don't go into much detail here, because this appears to not work.
offset 0x40 (Purple): Enum{Byte} - SMD Scale Multiplier {1: 1x, 2: 2x, 3: 4x} SMD Lighting Scale Multiplier. can be 1x, 2x, or 4x
offset 0x41 (Yellow): Enum{Byte} - Player Scale Multiplier {1: 1x, 2: 2x, 3: 4x} Player Lighting Scale Multipler. can be 1x, 2x, or 4x
offset 0x42: PADDING
Optimization Settings
offset 0x48: Byte - Unknown what this does, it is internally referred to as "Hokan" though.
(After optimization Settings there is a bunch of unused space. It's likely this is used internally by the game at run time and is left here as a spacer.)
Wind Settings
offset 0xED (yellow) : Byte - Wind Power (1 = 0.20 units) Determines the wind's intensity
offset 0xEE (green) : Byte - Wind Frequency (1 = 0.01 units) Determines the frequency of gusts
offset 0xEF: Byte - padding?
Blur Settings
offset 0xF1 (Green): Byte - Blur Power determines the intensity of the blur used.
NOTE Blur rate from "Focus Settings" (Purple) applies to this. It determines the duration between iterations of the blur. for example the duration between "snapshots" for the motions blur effect
LOD & Texture Filtering Settings
offset 0xF3 (Green): Byte - Mipmap Max LOD (Must be greater than Mipmap Min LOD) Sets the maximum LOD to be used when using a light group.
offset 0xF4 (Blue) : Enum{Byte} - Anisotropic Filtering Format {0: GX_ANISO_1, 1: GX_ANISO_2, 2: GX_ANISO_4} Determines the anisotrpic filtering format used to "smooth" jaged edges. Higher the value, the higher the performance impact but "better quality"
Contrast Settings
offset 0xF6 (Green) : Byte - Power; the amount to "squeeze" the contrast for light values after the Bias.
offset 0xF7 (Blue) : Byte - Bias shifts the contrast "starting point" to ignore lower light values.
offset 0xF8 (Orange): Float - LOD Bias shifts the game more towards lower LODs. More research is needed.
Other Tuning Settings
offset 0x100: Color RGBA[byte, byte, byte, byte] - Ambient Effects; the global tuning for Effects
Lights:
Next we have the lights themself. Each light group contains lights. These lights are effected by the Light Group Properties we just defined. There are different types of lights which each have their own editable settings. Because of this some of the bytes are multipurpose and can be used for different purposes depending on light type and attributes. Like before, I don't have enough colors for all of the structure, so I'm going to break it down into smaller sections. Let's take a look:
Light Metadata
offset 0x01 (Orange): Enum{Byte} - Light Type {0: Constant, 1: Linear, 2: Quadratic, 3: Spotlight, 4: Custom, 5: Parallel, 6: Spot Quad, 7: Local Ambient} Type determines which type of light is cast from the light. EG, spot light, sunlight, point light.
offset 0x02 (Yellow) : Enum{Byte} - Light Attributes {0: Normal, 1: Flicker, 2: Wave, 3: Spot Rotate, 4: Shadow, 5: Path, 6: Fade. 7: Shine} Attributes determine extra information about how the light behaves/changes over time.
offset 0x03 (Green) : Flag{Byte} - Light Mask {1: Player, 2: Enemy, 4: Object, 8: Effect, 16: Ambient, 32: Item, 64: Sub Character, 128: Thermo (unused) } Light mask determines which objects the light effects. EG Ignore the player, but light ashlee. These are flags that get added together. See the first message for clarification on flags.
Light Definition
offset 0x10 (Orange): Float - Casting range of the emitted light as a radius with the center point being the position above
offset 0x14: Color RGBA[byte, byte, byte, byte] - Color of the emitted light
offset 0x18 (Yellow): Float - Intensity of the emitted light.
Object Settings
offset 0x1D (Orange): Byte - Subgroup; Determines the subgroup the lights belong to if any. Act's like a "layer" that can be disabled (somehow...?)
offset 0x1E (Yellow) : Flag{Byte} - Flags{0: None, 1: Ignore Tuning, 2: Electric Light, 4: Flashlight} Flags augment how the light behaves. This requires more research.
offset 0x1F (Green) : Byte - Priority of the light determines which light gets used if more than 6 lights are effecting an object. This isn't a guarentee, more of a preference. default 3
offset 0x20 (Blue) : uint16_t - Part/Bone number; If there is a parent set (such as an enemy, or SMD) This is the bone that the light get's parented to. Such as an entities hand, or face.
offset 0x22 (Purple) : uint16_t - Parent ID; If there is a parent set (such as an enemy, or SMD) this is the ID for the parent.
Light Types
Offsets 0x2C - 0x40 has different uses depending on the Light Type assigned above.These are the parameters for each type of light (if there are any) Sadly due to the way this is set up, it would take a LONG TIME to make reference images for each of these. Hopefully you've figured out the pattern above for the offset's position. Sorry for my laziness I've been typing this for almost 4 hours now x.x
Type Constant:
None
Type Linear:
None
Type Quadratic:
offset 0x2C: Float - Smooth Edge
Type Spot Light:
offset 0x2C: Float[3] - Position (x, y, z)
offset 0x38: Float - Spot Light Range (Clamped > 1)
offset 0x3C: Float - Smooth Edge
Type Custom:
offset 0x2C: Float[3] - "Normal" (X, Y, Z)
offset 0x34: Float[3] - (A0, A1, A2)
offset 0x40: Float[3] - (K0, K1, K2)
> Unknown what these are.
Type Parallel:
offset 0x2C: Float[3] - Direction (X, Y, Z)
offset 0x3B: uint32_t - Use Local Direction (0 = false, 1 = true)
offset 0x3C: Float - Smooth Edge
Type Spot Quad:
offset 0x2C: Float[3] - Direction (X, Y, Z)
offset 0x38: Float - Spot Light Range (Clamped > 1)
offset 0x3C: Float - Smooth Edge
Type Local Ambient:
offset 0x2C Float - Smooth Edge
Smooth Edge seems to attempt to average the light values per edge instead of vertex.
There appears to be a bunch of unused bytes in here. This may be here as a spacer for the game to use at runtime, or it may be "clobber" space for the above parameters.
Attribute Types
Offsets 0x6C - 0x84 is a multipurpose similar to the light type properties. These change depending on which value is set in the Light Attributes property.
Type Flicker:
offset 0x6C: Color RGBA[byte, byte, byte, byte] - Flicker Color
offset 0x70: Byte - Flicker Range
Flicker Range determines the "spread" of the flicker effect. Higher value is a more intense effect
Type Wave:
offset 0x6C: Float - Wave Center
offset 0x70: Float - Wave Amplitude
offset 0x74: Float - Wave Speed
offset 0x78: Float - Wave Period (Used at runtime)
More research is needed; however, This is a pulsing effect. The wave amplitude determines the intensity of the pulsing, and the Wave speed determines the speed of the pulsing. The wave period isn't a modifiable parameter; however, it is used by the game at runtime to keep track of the current position in the wave.
Type Spot Rotate:
offset 0x6C: Float[3] - Rotate (x,y,z)
Makes the light rotate. x,y,z speed of rotation.
Type Shadow:
offset 0x6D: Flag{Byte} - Use TEX (0: No TEX, 1: Use TEX, 4: Invert Text)
offset 0x6E: Enum{Byte} - Shadow Type {0: Normal, 1: Cast, 2: Cast Add, 3: Cast 2, 4: Cast Add 2, 5: Foot} (Note Normal and Foot allow TEX to be toggeled off)
Offset 0x6F: Byte - Ground Distance/TEX Number
More research needed
Type Path:
offset 0x6C: uint32_t - Path Start
offset 0x70: uint32_t - Path Position
offset 0x74: Flag{Byte} - Flags {0: None, 1: Loop, 2: Inverse}
offset 0x78: Byte - Path Index
Changes the light intensity over time using a predefined path. This isn't easy to mod, as the path seems to be a hard coded pointer into the exe.
Type Fade:
offset 0x6C: Float - Fade Start
offset 0x70: Float - Fade Speed
Light will start at the fade start point, and will gradually decrease over time
Type Shine:
offset 0x6C: Float[3] - Period (x, y, z (unused) )
offset 0x78: Float[3] - Speed (x, y, z (unused) )
Shine rotates the light in a unique way, hard to explain. Play with the parameters to get an idea of it.