Post by cuteio14 on May 25, 2017 13:16:34 GMT
If you do not have the decoded files for Luxor 2 (or if you have messed up text in your files), go and find the decoded one.
This talks about how to mod Luxor 2. The files are different from Luxor Amun Rising, in which you currently mod.
THE MAIN POST WILL BE UPDATED ONCE THERE ARE NEW DISCOVERIES.
LEVELS
There are 5 level directories. 2 of them are for adventures (data\levels\adventure, data\levels\challenge). The rest are gauntlet, practice, and survival. There is also 2 .gvf files: difficulty.gvf and powerups.gvf.
DIFFICULTY.GVF
Here is the difficulty.gvf file:
The difficulty.gvf file is the rule for each difficulty. How does this work exactly? Let me tell you
Directory selects which level folder. Specifically data\levels\(DIRECTORY). If you add your own directory file and want that specific difficulty to go there, you can redirect the address to there.
CoinsForLife tells how many coins before you get an extra life.Setting "CoinsForLife = 1" is totally cheaty
MinCollapseCount is how many colored spheres before they match. It is set to 3 by default. However, changing it will either get worse or become boring.
SpeedScale is a speed multiplier (Maybe.)
IDK what StageStepSpeedScale does YET.
ScoreScale is a score multiplier
IDK what TimeScale & TimeScaleWarmup do. I don't think these is necessary
LivesBonus is how many points for an extra life. Just ignore the "i64" or you will break the game.
PerfectBonus is how many points for every perfect in bonus levels.
Now we are in the downgrades:
POWERUPS.GVF
Here is the file:
You may know what id does but, for the Powerup Spawning. The chances are like this: 1000/1000 = 100%
GAUNTLET, SURVIVAL, & PRACTICE
First off, Gauntlet is a dagger shooting minigame. IDK how the heck do you access it BTW.
What you may notice in the double.gvf is that there is this item called "ActivePaths". ActivePaths are how many paths active. That not being shown defaults to 1 Path.
MAPS
In a map file, there are so many files to modify. Take a look at "Carving the Obelisk" for example.
Now, if you want to create your own map, you can follow these specific things here:
.ui Files (Maps)
There are details for each item. Items with an asterisk(*) are important. Items with
uiSprite - The sprite item.
SceneLayer - You may understand what it is. For more details. here is the game_components.uis
This is usual if you want to sort out the layers. There are layers that go above the shooter and the spheres, so you may want to avoid that.
USAGE:
SceneLayer = "ExampleLayer"
Sprite* - The sprite itself. You have to direct it to an .spr file or stick with ".jpg*.tga"
USAGE:
Sprite = ~data/maps/(YOUR MAP NAME)/background.spr
Color - The color of the sprite. It's blending is the multiply blending. (It's pretty complicated for me to explain . You can try it out for yourself.)
USAGE:
Color = [ r, g, b, alpha]
SubAnim - The item which indicates the specific animation of the .spr file
USAGE:
SubAnim = "ExampleSubAnim"
FPS - The frame rate of an animation (If the sprite file is an animation)
USAGE:
FPS = 60.00
For tunnels, use "~data/maps/(YOUR MAP NAME)/background.jpg*data/maps/(YOUR MAP NAME)/background_alpha.tga"
.ofx Files (MAPS)
Take a look at warning.ofx for example
We will get to the "eiBezierLerp" when we reach "scripts"
eiParticleEmitter is what we are going to talk about.
eiParticleEmitter - The emitter item.
SceneLayer = (SAME AS ABOVE)
Sprite* = (SAME AS ABOVE)
Spline - The item that needs an .obj file. If you don't want to use it, leave just "Spline".
File = ~data/maps/(YOUR MAP NAME)/warning.obj
ParticleFollow - Follows the path
USAGE:
ParticleFollow = true/false
Palette (Unknown to me right now)
Emitter* - The place of origin for each particle.
LifespanInfinite - The particles keeps emitting
USAGE:
LifespanInfinite = True, False
PosRelative - IDK. = True, False
PlaceHorz/PlaceVert - Where the "center" is.
USAGE:
PlaceHorz = ZERO, CENTER, LEFT, RIGHT
PlaceVert = ZERO, CENTER, TOP, BOTTOM
PositionMin/PositionMax - Where the whole thing is
USAGE:
PlaceHorz = [x, y, z]
PlaceVert = [x, y, z]
VelocityMin/VelocityMax - Where the whole place of origin is going
USAGE:
VelocityMin = [x, y, z]
VelocityMax = [x, y, z]
AccelMin/AccelMax - Where the whole place of origin is accelerating
USAGE:
AccelMin = [x, y, z]
AccelMax = [x, y, z]
Particle*
Start - How many at the start = [min, max]
Max - How many at most = [min, max]
Rate - How often does it spawn = [min, max]
Lifespan - Particle Lifespan = [min, max]
AlphaFadeIn - Fading at the start = [min, max]
AlphaFadeOut - Fading at the end = [min, max]
SpawnRadiusMin - Minimum Radius = [x, y, z]
SpawnRadiusMax - Maximum Radius = [x, y, z]
Scale - (Multiplier, possibly)
ScaleVelocity - (Multiplier for Velocity, possibly)
ScaleAccel - (Acceleration Multiplier, possibly)
RotMin - Minimum Rotation. USE THE Z AXIS
USAGE:
RotMin = [x, y, z]
RotMax - Maximum Rotation. USE THE Z AXIS
USAGE:
RotMax = [x, y, z]
RotVelMin - Minimum Turning. USE THE Z AXIS
USAGE:
RotVelMin = [x, y, z]
RotVelMax - Maximum Turning. USE THE Z AXIS
USAGE:
RotVelMax = [x, y, z]
RotVelDrag -(Unknown to me right now)
RotAccMin - (Unknown to me right now)
RotAccMax -(Unknown to me right now)
Physics
VelocityMin/VelocityMax - Where the particle is going
USAGE:
VelocityMin = [x, y, z]
VelocityMax = [x, y, z]
AccelMin/AccelMax - Where the particle is accelerating
USAGE:
AccelMin = [x, y, z]
AccelMax = [x, y, z]
SCRIPTS
EFFECTS
Let's take a look at data\scripts\effects\ui\transition_in.ofx in my mod:
eiSound is the Sound FX item
File (Important) = ~data/sounds/(YOUR SOUND NAME)
NoDuration (Optional) = true, false
Now, Let us take a look at eiBezierLerp
StartTime - Time when it starts
USAGE:
StartTime = [min, max]
Persist - (Probably does nothing)
Duration* - How long it lasts
USAGE:
Duration = [min, max]
Target* = Color, Position, Rotation, Scale
Control - Easing, but more complex
USAGE:
Control= [min, max]
Val(Values)
1 - X axis (Position, Rotation, Scale)
2 - Y axis (Position, Rotation, Scale)
3 - Z axis (Position, Rotation, Scale)
4 - Alpha (Color)
Enable(NUMBER ON Val) = true, false
Mode = BLEND_TO 〈Original Place -> Modified Place〉, BLEND_FROM 〈Modified Place -> Original Place〉
If you want to use the existing .ofx file, use "# data/scripts/effects/(WHERE YOU WANT TO GO)"
This talks about how to mod Luxor 2. The files are different from Luxor Amun Rising, in which you currently mod.
THE MAIN POST WILL BE UPDATED ONCE THERE ARE NEW DISCOVERIES.
LEVELS
There are 5 level directories. 2 of them are for adventures (data\levels\adventure, data\levels\challenge). The rest are gauntlet, practice, and survival. There is also 2 .gvf files: difficulty.gvf and powerups.gvf.
DIFFICULTY.GVF
Here is the difficulty.gvf file:
// Difficulty File
// Defines global difficulty settings
Easy
{
Directory = "adventure"
StartStage = 1
FinalStage = 14
StartingLives = 4
CoinsForLife = 30
MinCollapseCount = 3
SpeedScale = 0.50
StageStepSpeedScale = 0.019
ScoreScale = 1.0
Timescale = 1.0
TimescaleWarmup = 1.5
LivesBonus = 50000i64
PerfectBonus = 10000i64
Downgrade
{
LossDelay = 1
Reductions = 5
MidSpeed = -5.0
MinSpeed = -0.2
SpawnStreak = 20
}
}
Medium
{
Directory = "adventure"
StartStage = 1
FinalStage = 14
StartingLives = 3
CoinsForLife = 30
MinCollapseCount = 3
SpeedScale = 0.75
StageStepSpeedScale = 0.019
ScoreScale = 1.5
Timescale = 1.0
TimescaleWarmup = 1.5
LivesBonus = 50000i64
PerfectBonus = 15000i64
Downgrade
{
LossDelay = 2
Reductions = 5
MidSpeed = -5.0
MinSpeed = -0.2
SpawnStreak = 20
}
}
Hard
{
Directory = "adventure"
StartStage = 1
FinalStage = 14
StartingLives = 2
CoinsForLife = 30
MinCollapseCount = 3
SpeedScale = 1.0
StageStepSpeedScale = 0.0
ScoreScale = 2.0
Timescale = 1.0
TimescaleWarmup = 1.5
LivesBonus = 50000i64
PerfectBonus = 20000i64
Downgrade
{
LossDelay = 0
Reductions = 0
MidSpeed = 0
MinSpeed = 0
SpawnStreak = 0
}
}
Insane
{
Directory = "challenge"
StartStage = 1
FinalStage = 5
StartingLives = 2
CoinsForLife = 30
MinCollapseCount = 3
SpeedScale = 1.0
StageStepSpeedScale = 0.0
ScoreScale = 3.0
Timescale = 1.0
TimescaleWarmup = 1.5
LivesBonus = 50000i64
PerfectBonus = 30000i64
Downgrade
{
LossDelay = 0
Reductions = 0
MidSpeed = 0
MinSpeed = 0
SpawnStreak = 0
}
}
The difficulty.gvf file is the rule for each difficulty. How does this work exactly? Let me tell you
Directory selects which level folder. Specifically data\levels\(DIRECTORY). If you add your own directory file and want that specific difficulty to go there, you can redirect the address to there.
CoinsForLife tells how many coins before you get an extra life.
MinCollapseCount is how many colored spheres before they match. It is set to 3 by default. However, changing it will either get worse or become boring.
SpeedScale is a speed multiplier (Maybe.)
IDK what StageStepSpeedScale does YET.
ScoreScale is a score multiplier
IDK what TimeScale & TimeScaleWarmup do. I don't think these is necessary
LivesBonus is how many points for an extra life. Just ignore the "i64" or you will break the game.
PerfectBonus is how many points for every perfect in bonus levels.
Now we are in the downgrades:
- IDK what LossDelay and Reductions do yet.
- MidSpeed - Speed in the middle of the path
- MinSpeed - Speed at the danger zone.
- SpawnStreak - Chances of falling coins
POWERUPS.GVF
Here is the file:
// Powerups File
// Defines global powerup spawning chances and scoring
// Powerup Spawning
spawn_reverse = 1000
spawn_slow = 1000
spawn_stop = 1000
spawn_speed_shot = 1000
spawn_lightning = 500
spawn_bomb = 500
spawn_color_bomb = 500
spawn_wild = 1000
spawn_scorpion = 500
spawn_powerup_net = 500
spawn_frenzy = 500
spawn_destroy_segment = 500
spawn_color_cloud = 500
spawn_lightning_storm = 500
// Powerup Scoring
scoring_coin = 250
scoring_gem_1 = 500
scoring_gem_2 = 750
scoring_gem_3 = 1000
scoring_gem_4 = 1250
scoring_gem_5 = 1500
scoring_gem_6 = 1750
scoring_gem_7 = 2000
scoring_gem_8 = 2250
scoring_gem_9 = 2500
scoring_gem_10 = 2750
scoring_gem_11 = 3000
scoring_gem_12 = 3250
scoring_gem_13 = 3500
scoring_gem_14 = 3750
scoring_gem_15 = 4000
You may know what id does but, for the Powerup Spawning. The chances are like this: 1000/1000 = 100%
GAUNTLET, SURVIVAL, & PRACTICE
First off, Gauntlet is a dagger shooting minigame. IDK how the heck do you access it BTW.
What you may notice in the double.gvf is that there is this item called "ActivePaths". ActivePaths are how many paths active. That not being shown defaults to 1 Path.
MAPS
In a map file, there are so many files to modify. Take a look at "Carving the Obelisk" for example.
- background.jpg
- background_alpha.tga
- idle.ofx
- map.ui
- path.obj
- pyramid.spr
- reflect_alpha.tga
- rules.gvf
- warning.jpg
- warning.ofx
- warning1.obj
- warning2.obj
- warning3.obj
- warning4.obj
- warning_alpha.tga
Now, if you want to create your own map, you can follow these specific things here:
.ui Files (Maps)
uiFrame Map
{
Width = 800.000000
Height = 600.000000
uiSprite Background
{
SceneLayer = "GameBackgroundBase"
Sprite = ~data/maps/CarvingtheObelisk/background.jpg
}
uiSprite Pyramid
{
SceneLayer = "GameBackgroundTier1"
Position = [ 34.000000, 448.000000, 0.000000 ]
Sprite = ~data/maps/CarvingtheObelisk/pyramid.spr
}
uiFrame warning
{
Position = [ 46.998810, 471.000000, 0.000000 ]
uiSprite Gem
{
SceneLayer = "GameWarningEffects"
Color = [ 1.000000, 1.000000, 1.000000, 0.000000 ]
Sprite = ~data/maps/carvingtheobelisk/warning.jpg*data/maps/carvingtheobelisk/warning_alpha.tga
}
}
objEffectMap Warning_1
{
Effect = ~data/maps/carvingtheobelisk/warning.ofx
}
objEffectMap Idle
{
Effect = ~data/maps/carvingtheobelisk/idle.ofx
}
}
There are details for each item. Items with an asterisk(*) are important. Items with
uiSprite - The sprite item.
SceneLayer - You may understand what it is. For more details. here is the game_components.uis
uiContainer GameComponents
{
objSceneLayer GameBackgroundBase
objSceneLayer GameBallReflections
objSceneLayer GameBackgroundBase2
objSceneLayerGroup Hidden
{
objSceneLayer GameBallShadows
objSceneLayer GameBalls
{
Sort = true
}
objSceneLayer GameBallIdleEffects
}
objSceneLayer GameBackgroundTier0
objSceneLayer GameBackgroundTier1
objSceneLayerGroup Normal
{
objSceneLayer GameBallShadows
objSceneLayer GameShooter
objSceneLayer GameShooterBeam
objSceneLayer GameBalls
{
Sort = true
}
objSceneLayer GameBallIdleEffects
objSceneLayer GameBackgroundTier2
objSceneLayer GameReticle
objSceneLayer GameShooterBeamEffects
objSceneLayer GamePowerups
objSceneLayer GameCollapses
objSceneLayer GameBallCollapseEffects
objSceneLayer GameScores
}
objSceneLayer GameWarningEffects
objSceneLayer GameBackgroundTier3
objSceneLayer GameComponentsDebug
objSceneLayerGroup Root
{
objSceneLayer GameShooter
objSceneLayer GameBalls
{
Sort = true
}
objSceneLayer GamePowerups
objSceneLayer GameCollapses
objSceneLayer GameScores
objSceneLayer GameMask
{
Global = true
}
objSceneLayer GameBanner
{
Global = true
}
}
}
USAGE:
SceneLayer = "ExampleLayer"
Sprite* - The sprite itself. You have to direct it to an .spr file or stick with ".jpg*.tga"
USAGE:
Sprite = ~data/maps/(YOUR MAP NAME)/background.spr
Color - The color of the sprite. It's blending is the multiply blending. (It's pretty complicated for me to explain . You can try it out for yourself.)
USAGE:
Color = [ r, g, b, alpha]
SubAnim - The item which indicates the specific animation of the .spr file
USAGE:
SubAnim = "ExampleSubAnim"
FPS - The frame rate of an animation (If the sprite file is an animation)
USAGE:
FPS = 60.00
For tunnels, use "~data/maps/(YOUR MAP NAME)/background.jpg*data/maps/(YOUR MAP NAME)/background_alpha.tga"
.ofx Files (MAPS)
Take a look at warning.ofx for example
objEffect warning
{
ObjectOffset = ""
eiParticleEmitter Warning_1
{
SceneLayer = "GameWarningEffects"
Sprite
{
File = ~data/sprites/particles/spark_ball_2.spr
}
Spline
{
File = ~data/maps/carvingtheobelisk/warning_1.obj
ParticleFollow = true
}
Palette
Emitter
{
LifespanInfinite = false
PosRelative = true
PlaceHorz = ZERO
PlaceVert = ZERO
}
Particles
{
Start = [ 1, 1 ]
Rate = [ 0.000000, 0.000000 ]
Lifespan = [ 0.750000, 0.750000 ]
ScaleVelocity = [ 1.000000, 1.000000 ]
}
Physics
}
eiParticleEmitter Warning_2
{
SceneLayer = "GameWarningEffects"
Sprite
{
File = ~data/sprites/particles/spark_ball_2.spr
}
Spline
{
File = ~data/maps/carvingtheobelisk/warning_2.obj
ParticleFollow = true
}
Palette
Emitter
{
LifespanInfinite = false
PosRelative = true
PlaceHorz = ZERO
PlaceVert = ZERO
}
Particles
{
Start = [ 1, 1 ]
Rate = [ 0.000000, 0.000000 ]
Lifespan = [ 0.750000, 0.750000 ]
ScaleVelocity = [ 1.000000, 1.000000 ]
}
Physics
}
eiParticleEmitter Warning_3
{
SceneLayer = "GameWarningEffects"
Sprite
{
File = ~data/sprites/particles/spark_ball_2.spr
}
Spline
{
File = ~data/maps/carvingtheobelisk/warning_3.obj
ParticleFollow = true
}
Palette
Emitter
{
LifespanInfinite = false
PosRelative = true
PlaceHorz = ZERO
PlaceVert = ZERO
}
Particles
{
Start = [ 1, 1 ]
Rate = [ 0.000000, 0.000000 ]
Lifespan = [ 0.750000, 0.750000 ]
ScaleVelocity = [ 1.000000, 1.000000 ]
}
Physics
}
eiParticleEmitter Warning_4
{
SceneLayer = "GameWarningEffects"
Sprite
{
File = ~data/sprites/particles/spark_ball_2.spr
}
Spline
{
File = ~data/maps/carvingtheobelisk/warning_4.obj
ParticleFollow = true
}
Palette
Emitter
{
LifespanInfinite = false
PosRelative = true
PlaceHorz = ZERO
PlaceVert = ZERO
}
Particles
{
Start = [ 1, 1 ]
Rate = [ 0.000000, 0.000000 ]
Lifespan = [ 0.750000, 0.750000 ]
ScaleVelocity = [ 1.000000, 1.000000 ]
}
Physics
}
objEffect warning
{
ObjectOffset = "Warning.Gem"
eiBezierLerp Gem
{
Duration = [ 0.500000, 0.500000 ]
Target = "Color"
Val4 = [ 1.000000, 1.000000 ]
Enable4 = true
}
eiBezierLerp Gem
{
StartTime = [ 0.500000, 0.500000 ]
Duration = [ 0.500000, 0.500000 ]
Target = "Color"
Enable4 = true
}
}
}
We will get to the "eiBezierLerp" when we reach "scripts"
eiParticleEmitter is what we are going to talk about.
eiParticleEmitter - The emitter item.
SceneLayer = (SAME AS ABOVE)
Sprite* = (SAME AS ABOVE)
Spline - The item that needs an .obj file. If you don't want to use it, leave just "Spline".
File = ~data/maps/(YOUR MAP NAME)/warning.obj
ParticleFollow - Follows the path
USAGE:
ParticleFollow = true/false
Palette (Unknown to me right now)
Emitter* - The place of origin for each particle.
LifespanInfinite - The particles keeps emitting
USAGE:
LifespanInfinite = True, False
PosRelative - IDK. = True, False
PlaceHorz/PlaceVert - Where the "center" is.
USAGE:
PlaceHorz = ZERO, CENTER, LEFT, RIGHT
PlaceVert = ZERO, CENTER, TOP, BOTTOM
PositionMin/PositionMax - Where the whole thing is
USAGE:
PlaceHorz = [x, y, z]
PlaceVert = [x, y, z]
VelocityMin/VelocityMax - Where the whole place of origin is going
USAGE:
VelocityMin = [x, y, z]
VelocityMax = [x, y, z]
AccelMin/AccelMax - Where the whole place of origin is accelerating
USAGE:
AccelMin = [x, y, z]
AccelMax = [x, y, z]
Particle*
Start - How many at the start = [min, max]
Max - How many at most = [min, max]
Rate - How often does it spawn = [min, max]
Lifespan - Particle Lifespan = [min, max]
AlphaFadeIn - Fading at the start = [min, max]
AlphaFadeOut - Fading at the end = [min, max]
SpawnRadiusMin - Minimum Radius = [x, y, z]
SpawnRadiusMax - Maximum Radius = [x, y, z]
Scale - (Multiplier, possibly)
ScaleVelocity - (Multiplier for Velocity, possibly)
ScaleAccel - (Acceleration Multiplier, possibly)
RotMin - Minimum Rotation. USE THE Z AXIS
USAGE:
RotMin = [x, y, z]
RotMax - Maximum Rotation. USE THE Z AXIS
USAGE:
RotMax = [x, y, z]
RotVelMin - Minimum Turning. USE THE Z AXIS
USAGE:
RotVelMin = [x, y, z]
RotVelMax - Maximum Turning. USE THE Z AXIS
USAGE:
RotVelMax = [x, y, z]
RotVelDrag -(Unknown to me right now)
RotAccMin - (Unknown to me right now)
RotAccMax -(Unknown to me right now)
Physics
VelocityMin/VelocityMax - Where the particle is going
USAGE:
VelocityMin = [x, y, z]
VelocityMax = [x, y, z]
AccelMin/AccelMax - Where the particle is accelerating
USAGE:
AccelMin = [x, y, z]
AccelMax = [x, y, z]
SCRIPTS
EFFECTS
Let's take a look at data\scripts\effects\ui\transition_in.ofx in my mod:
objEffect TransitionIn
{
objEffect Background
{
ObjectOffset = "Background"
objEffect Mask
{
ObjectOffset = "Mask"
eiBezierLerp Unhide
{
StartTime = [ 0.500000, 0.500000 ]
Persist = true
Duration = [ 0.250000, 0.250000 ]
Target = "Color"
Val4 = [ 1.000000, 1.000000 ]
Enable4 = true
Mode = BLEND_TO
}
}
objEffect Top
{
ObjectOffset = "One"
eiBezierLerp Move_In_Scale
{
Duration = [ 0.500000, 0.500000 ]
Target = "scale"
Controls = [ 0.150000, 1.000000 ]
Val1 = [ 6.250000, 6.250000 ]
Enable1 = true
Val2 = [ 6.250000, 6.250000 ]
Enable2 = true
Mode = BLEND_FROM
}
eiBezierLerp Move_In_Position
{
Duration = [ 0.500000, 0.500000 ]
Target = "Position"
Controls = [ 0.150000, 1.000000 ]
Val1 = [ -2250.000000, -2250.000000 ]
Enable1 = true
Val2 = [ -1125.000000, -1125.000000 ]
Enable2 = true
Mode = BLEND_FROM
}
}
}
eiSound SFX
{
File = ~data/sounds/trans.ogg
NoDuration = true
}
}
eiSound is the Sound FX item
File (Important) = ~data/sounds/(YOUR SOUND NAME)
NoDuration (Optional) = true, false
Now, Let us take a look at eiBezierLerp
StartTime - Time when it starts
USAGE:
StartTime = [min, max]
Persist - (Probably does nothing)
Duration* - How long it lasts
USAGE:
Duration = [min, max]
Target* = Color, Position, Rotation, Scale
Control - Easing, but more complex
USAGE:
Control= [min, max]
Val(Values)
1 - X axis (Position, Rotation, Scale)
2 - Y axis (Position, Rotation, Scale)
3 - Z axis (Position, Rotation, Scale)
4 - Alpha (Color)
Enable(NUMBER ON Val) = true, false
Mode = BLEND_TO 〈Original Place -> Modified Place〉, BLEND_FROM 〈Modified Place -> Original Place〉
If you want to use the existing .ofx file, use "# data/scripts/effects/(WHERE YOU WANT TO GO)"