Advanced particles (#1555)

* Update to bug report form

* Update bug_report.yaml

* Update AUTHORS.md

- Tomo (general coding, special FX coding, bug fixing)

* Update CHANGELOG.md

* Update CHANGELOG.md

* Update bug_report.yaml

* Expose ObjectSlot

* Docs

* Code Update

* FinalPush

* Update CHANGELOG.md

* Update CHANGELOG.md

* Update CHANGELOG.md

* Expose startRot

* Expose startRot

* Remove Space.

* FirstCommit

* Cast gameobj to int

* Update

* WIP

* WIP

* wip

* Checks

* WIP

* WIP

* WIP

* Enum

* Enum revision

* Update CHANGELOG.md

* Revisions due to Develop changes

* CodeCleanup

* Revision to Code as per revised structure.

* Add friction and YVel

* Revisions

* LUA Docs

* RevisionDocs

* x

* Revisions

* Docs

* Docs

* Docs

* Docs

* Make wind default

* Light effect

* LightFinish

* Added Sounds

* Add sound docs

* Update particle anim types file

* Update EffectsFunctions.cpp

* Update EffectsFunctions.cpp

* FixAngle

* Fix StartRot

* Cleanup

* Add Savegame fields

* Add loadgame data.

* Fix bug on develop related to save value of xVel

* Address Comments

---------

Co-authored-by: Stranger1992 <84292688+Stranger1992@users.noreply.github.com>
Co-authored-by: Nemoel-Tomo <tomo_669@hotmail.com>
Co-authored-by: Jakub <kubabilinski03@gmail.com>
Co-authored-by: Jakub <80340234+Jakub768@users.noreply.github.com>
Co-authored-by: Lwmte <3331699+Lwmte@users.noreply.github.com>
Co-authored-by: Sezz <sezzary@outlook.com>
This commit is contained in:
TrainWrack 2025-03-08 22:45:25 -05:00 committed by GitHub
parent ba99f41fa0
commit e54fba1e4a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
72 changed files with 993 additions and 50 deletions

View file

@ -29,6 +29,8 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
- You must use this version: https://github.com/TombEngine/Resources/raw/refs/heads/main/Wad2%20Objects/Interactables/TEN_Waterfall_Emitter.wad2
### Lua API changes
* Implemented advanced particles allowing animations and other effects.
* Added Collision.Probe class for basic room collision detection.
* Added diary module.
* Added View.GetFlyByPosition() and View.GetFlyByRotation() functions to get flyby sequence parameters at a specified time point.

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>
@ -128,6 +129,10 @@
<td class="summary">Emit a particle.</td>
</tr>
<tr>
<td class="name" ><a href="#EmitAdvancedParticle">EmitAdvancedParticle(particleData)</a></td>
<td class="summary">Emit a particle with extensive configuration options including animations.</td>
</tr>
<tr>
<td class="name" ><a href="#EmitShockwave">EmitShockwave(pos, innerRadius, outerRadius, color, lifetime, speed, angle, hurtsLara)</a></td>
<td class="summary">Emit a shockwave, similar to that seen when a harpy projectile hits something.</td>
</tr>
@ -164,6 +169,13 @@
<td class="summary">Get the wind vector for the current game frame.</td>
</tr>
</table>
<h2><a href="#Tables">Tables</a></h2>
<table class="function_list">
<tr>
<td class="name" ><a href="#particleData">particleData</a></td>
<td class="summary">Structure for EmitAdvancedParticle table.</td>
</tr>
</table>
<br/>
<br/>
@ -327,6 +339,61 @@
</span> )</pre>
</ul>
</dd>
<dt>
<a name = "EmitAdvancedParticle"></a>
<strong>EmitAdvancedParticle(particleData)</strong>
</dt>
<dd>
Emit a particle with extensive configuration options including animations.
<h3>Parameters:</h3>
<ul>
<li><span class="parameter">particleData</span>
<span class="types"><a class="type" href="../1 modules/Effects.html#particleData">particleData</a></span>
The table holding all the particle data.
</li>
</ul>
<h3>Usage:</h3>
<ul>
<pre class="example"><span class="keyword">local</span> particle = {
position = GetMoveableByName(<span class="string">"camera_target_6"</span>) :GetPosition(),
velocity = Vec3(<span class="number">0</span>, <span class="number">0</span>, <span class="number">10</span>),
objectID = TEN.Objects.ObjID.CUSTOM_BAR_GRAPHIC,
spriteIndex = <span class="number">0</span>,
lifetime = <span class="number">10</span>,
maxYVelocity = <span class="number">0</span>,
gravity = <span class="number">0</span>,
friction = <span class="number">10</span>,
startRotation = <span class="number">0</span>,
rotationSpeed = <span class="number">0</span>,
startSize = <span class="number">80</span>,
endSize = <span class="number">80</span>,
wind = <span class="keyword">false</span>,
startColor = TEN.Color(<span class="number">128</span>, <span class="number">128</span>, <span class="number">128</span>),
endColor = TEN.Color(<span class="number">128</span>, <span class="number">128</span>, <span class="number">128</span>),
blendMode = TEN.Effects.BlendID.ADDITIVE,
damage = <span class="keyword">true</span>,
poison = <span class="keyword">false</span>,
burn = <span class="keyword">false</span>,
damageHit = <span class="number">80</span>,
sound = <span class="number">197</span>,
light = <span class="keyword">true</span>,
lightRadius = <span class="number">6</span>,
lightFlicker = <span class="number">5</span>,
animated = <span class="keyword">true</span>,
frameRate = .<span class="number">25</span>,
animationType = TEN.Effects.ParticleAnimationType.LOOP,
}
EmitAdvancedParticle(particle)</pre>
</ul>
</dd>
<dt>
<a name = "EmitShockwave"></a>
@ -641,6 +708,161 @@
</dd>
</dl>
<h2 class="section-header "><a name="Tables"></a>Tables</h2>
<dl class="function">
<dt>
<a name = "particleData"></a>
<strong>particleData</strong>
</dt>
<dd>
Structure for EmitAdvancedParticle table.
<h3>Fields:</h3>
<ul>
<li><span class="parameter">position</span>
<span class="types"><a class="type" href="../3 primitive classes/Vec3.html#">Vec3</a></span>
World position.
</li>
<li><span class="parameter">velocity</span>
<span class="types"><a class="type" href="../3 primitive classes/Vec3.html#">Vec3</a></span>
Velocity.
</li>
<li><span class="parameter">spriteSeqID</span>
<span class="types"><a class="type" href="../4 enums/Objects.ObjID.html#">ObjID</a></span>
ID of the sprite sequence object. <strong>Default: Objects.ObjID.DEFAULT_SPRITES</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">spriteIndex</span>
<span class="types"><span class="type">int</span></span>
ID of the sprite in the sprite sequence object.<strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">lifetime</span>
<span class="types"><span class="type">float</span></span>
Lifespan in seconds. <strong>Default: 2</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">maxYVelocity</span>
<span class="types"><span class="type">float</span></span>
Specifies ithe maximum Y velocity for the particle. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">gravity</span>
<span class="types"><span class="type">float</span></span>
Specifies if the particle will fall over time. Positive values ascend, negative values descend. Recommended range: [-1000 and 1000]. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">friction</span>
<span class="types"><span class="type">float</span></span>
Specifies the friction with which the particle will slow down over time. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">startRot</span>
<span class="types"><span class="type">float</span></span>
Rotation at start of life. <strong>Default: random</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">rotationSpeed</span>
<span class="types"><span class="type">float</span></span>
Rotational velocity in degrees. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">startSize</span>
<span class="types"><span class="type">float</span></span>
Size at start of life. <strong>Default: 10</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">endSize</span>
<span class="types"><span class="type">float</span></span>
Size at end of life. The particle will linearly shrink or grow toward this size over its lifespan. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">startColor</span>
<span class="types"><a class="type" href="../3 primitive classes/Color.html#">Color</a></span>
Color at start of life. <strong>Default: Color(255, 255, 255)</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">endColor</span>
<span class="types"><a class="type" href="../3 primitive classes/Color.html#">Color</a></span>
Color to fade toward. This will finish long before the end of the particle's life due to internal math. <strong>Default: Color(255, 255, 255)</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">blendMode</span>
<span class="types"><a class="type" href="../4 enums/Effects.BlendID.html#">BlendID</a></span>
Render blend mode. <strong>TEN.Effects.BlendID.ALPHABLEND</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">damage</span>
<span class="types"><span class="type">bool</span></span>
Specify if the particle will harm the player on collision. <strong>Default: false</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">poison</span>
<span class="types"><span class="type">bool</span></span>
Specify if the particle will poison the player on collision. <strong>Default: false</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">burn</span>
<span class="types"><span class="type">bool</span></span>
Specify if the particle will burn the player on collision. <strong>Default: false</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">wind</span>
<span class="types"><span class="type">bool</span></span>
Specify if the particle will be affected by wind in outside rooms. <strong>Default: false</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">damageHit</span>
<span class="types"><span class="type">int</span></span>
Specify the damage particle will harm the player on collision. <strong>Default: 2</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">light</span>
<span class="types"><span class="type">bool</span></span>
Specify if the particle will be emit a light based on its color. Recommended for single particles. <strong>Default: false</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">lightRadius</span>
<span class="types"><span class="type">int</span></span>
measured in "clicks" or 256 world units. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">lightFlicker</span>
<span class="types"><span class="type">int</span></span>
The interval at which light should flicker. <strong>Default: 0</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">sound</span>
<span class="types"><span class="type">int</span></span>
ID to play. Corresponds to the value in the sound XML file or Tomb Editor's "Sound Infos" window. Looping sounds recommended. <strong>Default: None</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">animated</span>
<span class="types"><span class="type">bool</span></span>
Specify if the particle will be animated. <strong>Default: false</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">animationType</span>
<span class="types"><a class="type" href="../4 enums/Effects.ParticleAnimationType.html#">ParticleAnimationType</a></span>
Specify the the type of animation the particle will use. <strong>Default: TEN.Effects.ParticleAnimationType.LOOP</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">frameRate</span>
<span class="types"><span class="type">float</span></span>
The framerate with which the particle will be animated. <strong>Default: 1</strong>
(<em>optional</em>)
</li>
</ul>
</dd>
</dl>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <here>Effects.BlendID</here></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <here>Effects.EffectID</here></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -0,0 +1,169 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.7.2 (Developer) Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
<div id="container">
<div id="product">
<div id="product_logo"></div>
<div id="product_name"><big><b></b></big></div>
<div id="product_description"></div>
</div> <!-- id="product" -->
<div id="main">
<!-- Menu -->
<div id="navigation">
<br/>
<h1>&nbsp;TombEngine</h1>
<ul>
<li><a href="../index.html">Index</a></li>
</ul>
<h2>1 Modules</h2>
<ul class="nowrap">
<li> <a href="../1 modules/Effects.html">Effects</a></li>
<li> <a href="../1 modules/Flow.html">Flow</a></li>
<li> <a href="../1 modules/Input.html">Input</a></li>
<li> <a href="../1 modules/Inventory.html">Inventory</a></li>
<li> <a href="../1 modules/Logic.html">Logic</a></li>
<li> <a href="../1 modules/Objects.html">Objects</a></li>
<li> <a href="../1 modules/Sound.html">Sound</a></li>
<li> <a href="../1 modules/Strings.html">Strings</a></li>
<li> <a href="../1 modules/Util.html">Util</a></li>
<li> <a href="../1 modules/View.html">View</a></li>
</ul>
<h2>2 Classes</h2>
<ul class="nowrap">
<li> <a href="../2 classes/Flow.Level.html">Flow.Level</a></li>
<li> <a href="../2 classes/Flow.Settings.html">Flow.Settings</a></li>
<li> <a href="../2 classes/Flow.Statistics.html">Flow.Statistics</a></li>
<li> <a href="../2 classes/Objects.AIObject.html">Objects.AIObject</a></li>
<li> <a href="../2 classes/Objects.Camera.html">Objects.Camera</a></li>
<li> <a href="../2 classes/Objects.LaraObject.html">Objects.LaraObject</a></li>
<li> <a href="../2 classes/Objects.Moveable.html">Objects.Moveable</a></li>
<li> <a href="../2 classes/Objects.Room.html">Objects.Room</a></li>
<li> <a href="../2 classes/Objects.Sink.html">Objects.Sink</a></li>
<li> <a href="../2 classes/Objects.SoundSource.html">Objects.SoundSource</a></li>
<li> <a href="../2 classes/Objects.Static.html">Objects.Static</a></li>
<li> <a href="../2 classes/Objects.Volume.html">Objects.Volume</a></li>
<li> <a href="../2 classes/Strings.DisplayString.html">Strings.DisplayString</a></li>
<li> <a href="../2 classes/View.DisplaySprite.html">View.DisplaySprite</a></li>
</ul>
<h2>3 Primitive Classes</h2>
<ul class="nowrap">
<li> <a href="../3 primitive classes/Flow.Fog.html">Flow.Fog</a></li>
<li> <a href="../3 primitive classes/Flow.InventoryItem.html">Flow.InventoryItem</a></li>
<li> <a href="../3 primitive classes/Flow.LensFlare.html">Flow.LensFlare</a></li>
<li> <a href="../3 primitive classes/Flow.SkyLayer.html">Flow.SkyLayer</a></li>
<li> <a href="../3 primitive classes/Flow.Starfield.html">Flow.Starfield</a></li>
<li> <a href="../3 primitive classes/Color.html">Color</a></li>
<li> <a href="../3 primitive classes/Rotation.html">Rotation</a></li>
<li> <a href="../3 primitive classes/Time.html">Time</a></li>
<li> <a href="../3 primitive classes/Vec2.html">Vec2</a></li>
<li> <a href="../3 primitive classes/Vec3.html">Vec3</a></li>
</ul>
<h2>4 Enums</h2>
<ul class="nowrap">
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <here>Effects.ParticleAnimationType</here></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>
<li> <a href="../4 enums/Input.ActionID.html">Input.ActionID</a></li>
<li> <a href="../4 enums/Objects.AmmoType.html">Objects.AmmoType</a></li>
<li> <a href="../4 enums/Objects.HandStatus.html">Objects.HandStatus</a></li>
<li> <a href="../4 enums/Objects.WeaponType.html">Objects.WeaponType</a></li>
<li> <a href="../4 enums/Objects.MoveableStatus.html">Objects.MoveableStatus</a></li>
<li> <a href="../4 enums/Objects.ObjID.html">Objects.ObjID</a></li>
<li> <a href="../4 enums/Objects.RoomFlagID.html">Objects.RoomFlagID</a></li>
<li> <a href="../4 enums/Objects.RoomReverb.html">Objects.RoomReverb</a></li>
<li> <a href="../4 enums/Sound.SoundTrackType.html">Sound.SoundTrackType</a></li>
<li> <a href="../4 enums/Strings.DisplayStringOption.html">Strings.DisplayStringOption</a></li>
<li> <a href="../4 enums/Util.LogLevel.html">Util.LogLevel</a></li>
<li> <a href="../4 enums/View.AlignMode.html">View.AlignMode</a></li>
<li> <a href="../4 enums/View.CameraType.html">View.CameraType</a></li>
<li> <a href="../4 enums/View.PostProcessMode.html">View.PostProcessMode</a></li>
<li> <a href="../4 enums/View.ScaleMode.html">View.ScaleMode</a></li>
</ul>
<h2>5 Lua utility modules</h2>
<ul class="nowrap">
<li> <a href="../5 lua utility modules/Diary.html">Diary</a></li>
<li> <a href="../5 lua utility modules/EventSequence.html">EventSequence</a></li>
<li> <a href="../5 lua utility modules/Timer.html">Timer</a></li>
<li> <a href="../5 lua utility modules/Type.html">Type</a></li>
</ul>
</div>
<div id="content">
<h1>Enum <code>Effects.ParticleAnimationType</code></h1>
<p>Constants for particle animation type constants.</p>
<p>
</p>
<h2><a href="#Tables">Tables</a></h2>
<table class="function_list">
<tr>
<td class="name" ><a href="#Effects.ParticleAnimationType">Effects.ParticleAnimationType</a></td>
<td class="summary">Table of Effects.ParticleAnimationType type constants.</td>
</tr>
</table>
<br/>
<br/>
<h2 class="section-header "><a name="Tables"></a>Tables</h2>
<dl class="function">
<dt>
<a name = "Effects.ParticleAnimationType"></a>
<strong>Effects.ParticleAnimationType</strong>
</dt>
<dd>
<p>Table of Effects.ParticleAnimationType type constants. To be used with particles.</p>
<ul>
<li><code>LOOP</code> - Frames loop sequentially.</li>
<li><code>ONE_SHOT</code> - Frames play once and freeze on the last frame.</li>
<li><code>BACK_AND_FORTH</code> - Frames bounce back and forth.</li>
<li><code>LIFE_TIME_SPREAD</code> - Frames are distributed over the particle's lifetime</li>
</ul>
</dd>
</dl>
</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="https://github.com/hispidence/TEN-LDoc">TEN-LDoc</a> (a fork of <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a>)</i>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <here>Flow.ErrorMode</here></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <here>Flow.FreezeMode</here></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <here>Flow.GameStatus</here></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="../4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="../4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="../4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="../4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="../4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="../4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="../4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>

View file

@ -79,6 +79,7 @@
<li> <a href="4 enums/Collision.MaterialType.html">Collision.MaterialType</a></li>
<li> <a href="4 enums/Effects.BlendID.html">Effects.BlendID</a></li>
<li> <a href="4 enums/Effects.EffectID.html">Effects.EffectID</a></li>
<li> <a href="4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></li>
<li> <a href="4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></li>
<li> <a href="4 enums/Flow.FreezeMode.html">Flow.FreezeMode</a></li>
<li> <a href="4 enums/Flow.GameStatus.html">Flow.GameStatus</a></li>
@ -296,6 +297,10 @@ local door = GetMoveableByName("door_type4_14")
<td class="name" ><a href="4 enums/Effects.EffectID.html">Effects.EffectID</a></td>
<td class="summary">Constants for effect IDs.</td>
</tr>
<tr>
<td class="name" ><a href="4 enums/Effects.ParticleAnimationType.html">Effects.ParticleAnimationType</a></td>
<td class="summary">Constants for particle animation type constants.</td>
</tr>
<tr>
<td class="name" ><a href="4 enums/Flow.ErrorMode.html">Flow.ErrorMode</a></td>
<td class="summary">Constants for error modes.</td>

View file

@ -30,6 +30,7 @@
#include "Sound/sound.h"
#include "Specific/clock.h"
#include "Specific/level.h"
#include "Specific/trutils.h"
using namespace TEN::Collision::Point;
using namespace TEN::Effects::Blood;
@ -188,6 +189,86 @@ void SetSpriteSequence(Particle& particle, GAME_OBJECT_ID objectID)
particle.SpriteID = (int)round(Lerp(0.0f, spriteCount, normalizedAge));
}
void SetAdvancedSpriteSequence(Particle& particle, GAME_OBJECT_ID objectID, ParticleAnimType animationType, float frameRate)
{
// Ensure valid lifespan
if (particle.life <= 0)
{
particle.on = false;
ParticleDynamics[particle.dynamic].On = false;
return;
}
// Calculate particle's age and normalized progress
float particleAge = particle.sLife - particle.life; // Elapsed time since spawn
float normalizedAge = particleAge / particle.sLife; // Progress as a fraction [0.0, 1.0]
// Retrieve sprite sequence information
//int firstFrame = Objects[objectID].meshIndex; // Starting sprite index
int totalFrames = -Objects[objectID].nmeshes; // Total frames (assuming nmeshes is negative)
if (totalFrames <= 0)
{
particle.SpriteSeqID = objectID;
particle.SpriteID = 0; // Default to the first frame if no valid frames exist
return;
}
particle.SpriteSeqID = objectID;
// Handle animation modes
switch (animationType)
{
case ParticleAnimType::Loop: // Frames loop sequentially
{
float frameDuration = frameRate > 0 ? 1.0f / frameRate : 1.0f / totalFrames; // Duration per frame
int currentFrame = (int)(particleAge / frameDuration) % totalFrames; // Wrap frames
particle.SpriteID = currentFrame;
break;
}
case ParticleAnimType::OneShot: // Frames play once, then freeze on the last frame
{
float totalDuration = frameRate > 0 ? totalFrames / frameRate : particle.sLife;
int currentFrame = (int)(particleAge / (totalDuration / totalFrames));
if (currentFrame >= totalFrames)
currentFrame = totalFrames - 1; // Clamp to the last frame
particle.SpriteID = currentFrame;
break;
}
case ParticleAnimType::BackAndForth: // Frames go forward and then backward
{
float frameDuration = frameRate > 0 ? 1.0f / frameRate : 1.0f / totalFrames;
int totalFrameSteps = totalFrames * 2 - 2; // Forward and backward frames (avoiding double-count of last frame)
int step = (int)(particleAge / frameDuration) % totalFrameSteps;
int currentFrame = step < totalFrames ? step : totalFrames - (step - totalFrames) - 1;
particle.SpriteID = currentFrame;
break;
}
case ParticleAnimType::LifetimeSpread: // Distribute all frames evenly over lifetime
{
int currentFrame = (int)(normalizedAge * totalFrames);
if (currentFrame >= totalFrames)
currentFrame = totalFrames - 1; // Clamp to the last frame
particle.SpriteID = currentFrame;
break;
}
case ParticleAnimType::None: // Distribute all frames evenly over lifetime
{
particle.SpriteID = 0;
break;
}
default: // Default behavior: keep the first frame
particle.SpriteID = 0;
break;
}
}
void UpdateWibble()
{
// Update oscillator seed.
@ -351,8 +432,56 @@ void UpdateSparks()
if (spark.flags & SP_EXPLOSION)
SetSpriteSequence(spark, ID_EXPLOSION_SPRITES);
if (spark.flags & SP_ANIMATED)
{
ParticleAnimType animationType = static_cast<ParticleAnimType>(spark.animationType);
GAME_OBJECT_ID spriteObject = static_cast<GAME_OBJECT_ID>(spark.SpriteSeqID);
SetAdvancedSpriteSequence(spark, spriteObject, animationType, spark.framerate);
}
if (spark.flags & SP_SOUND)
SoundEffect(spark.sound, &Pose(Vector3(spark.x, spark.y, spark.z)), SoundEnvironment::Always);
if (spark.flags & SP_LIGHT)
{
float radius = spark.lightRadius * spark.size / spark.sSize;
// Decrease flicker timer if set
if (spark.lightFlicker > 0)
{
spark.lightFlicker--;
if (spark.lightFlicker <= 0)
{
// Apply random flicker effect
int random = GetRandomControl();
int colorOffset = (random % 21) - 10; // Random change between -10 and +10
byte r = std::clamp(spark.r + colorOffset, 0, 255);
byte g = std::clamp(spark.g + colorOffset, 0, 255);
byte b = std::clamp(spark.b + colorOffset, 0, 255);
// Reset flicker timer
spark.lightFlicker = spark.lightFlickerS;
// Emit flickering light
SpawnDynamicPointLight(Vector3(spark.x, spark.y, spark.z), ScriptColor(r, g, b), radius, false, GetHash(std::string()));
}
else
{
// Normal light emission while flicker is counting down
SpawnDynamicPointLight(Vector3(spark.x, spark.y, spark.z), ScriptColor(spark.r, spark.g, spark.b), radius, false, GetHash(std::string()));
}
}
else
{
// If flicker is disabled or 0, just emit normal light
SpawnDynamicPointLight(Vector3(spark.x, spark.y, spark.z), ScriptColor(spark.r, spark.g, spark.b), radius, false, GetHash(std::string()));
}
}
if ((spark.flags & SP_FIRE && LaraItem->Effect.Type == EffectType::None) ||
(spark.flags & SP_DAMAGE) ||
(spark.flags & SP_DAMAGE) ||
(spark.flags & SP_POISON))
{
int ds = spark.size * (spark.scalar / 2.0);
@ -367,10 +496,10 @@ void UpdateSparks()
ItemBurn(LaraItem);
if (spark.flags & SP_DAMAGE)
DoDamage(LaraItem, 2);
DoDamage(LaraItem, spark.damage);
if (spark.flags & SP_POISON)
Lara.Status.Poison += 5;
Lara.Status.Poison += spark.damage;
}
}
}

View file

@ -42,6 +42,18 @@ enum SpriteEnumFlag
SP_PLASMAEXP = (1 << 13),
SP_POISON = (1 << 14),
SP_COLOR = (1 << 15),
SP_ANIMATED = (1 << 16),
SP_LIGHT = (1 << 17),
SP_SOUND = (1 << 18),
};
enum ParticleAnimType
{
None,
OneShot,
Loop,
BackAndForth,
LifetimeSpread
};
// Used by Particle.nodeNumber.
@ -130,8 +142,8 @@ struct Particle
short rotAdd; // TODO: Due to legacy conventions, assigned values must be shifted >> 4.
short gravity;
unsigned short flags; // SP_enum
unsigned int flags; // SP_enum
float sSize;
float dSize;
float size;
@ -160,6 +172,16 @@ struct Particle
unsigned char extras;
signed char dynamic;
unsigned char nodeNumber; // ParticleNodeOffsetIDs enum.
int damage;
float framerate;
ParticleAnimType animationType;
int lightRadius;
int lightFlicker;
int lightFlickerS;
int sound;
int PrevX;
int PrevY;
@ -245,6 +267,7 @@ void ClearInactiveEffects(std::vector<TEffect>& effects)
Particle* GetFreeParticle();
void SetSpriteSequence(Particle& particle, GAME_OBJECT_ID objectID);
void SetAdvancedSpriteSequence(Particle& particle, GAME_OBJECT_ID objectID, ParticleAnimType animationType, float frameRate);
void DetatchSpark(int num, SpriteEnumFlag type);
void UpdateSparks();

View file

@ -1149,11 +1149,13 @@ const std::vector<byte> SaveGame::Build()
Save::ParticleInfoBuilder particleInfo{ fbb };
particleInfo.add_animation_type(particle->animationType);
particleInfo.add_b(particle->b);
particleInfo.add_col_fade_speed(particle->colFadeSpeed);
particleInfo.add_d_b(particle->dB);
particleInfo.add_sprite_index(particle->SpriteSeqID);
particleInfo.add_sprite_id(particle->SpriteID);
particleInfo.add_damage(particle->damage);
particleInfo.add_d_g(particle->dG);
particleInfo.add_d_r(particle->dR);
particleInfo.add_d_size(particle->dSize);
@ -1161,11 +1163,15 @@ const std::vector<byte> SaveGame::Build()
particleInfo.add_extras(particle->extras);
particleInfo.add_fade_to_black(particle->fadeToBlack);
particleInfo.add_flags(particle->flags);
particleInfo.add_framerate(particle->framerate);
particleInfo.add_friction(particle->friction);
particleInfo.add_fx_obj(particle->fxObj);
particleInfo.add_g(particle->g);
particleInfo.add_gravity(particle->gravity);
particleInfo.add_life(particle->life);
particleInfo.add_light_radius(particle->lightRadius);
particleInfo.add_light_flicker(particle->lightFlicker);
particleInfo.add_light_flicker_s(particle->lightFlickerS);
particleInfo.add_max_y_vel(particle->maxYvel);
particleInfo.add_node_number(particle->nodeNumber);
particleInfo.add_on(particle->on);
@ -1180,9 +1186,10 @@ const std::vector<byte> SaveGame::Build()
particleInfo.add_s_life(particle->sLife);
particleInfo.add_s_r(particle->sR);
particleInfo.add_s_size(particle->sSize);
particleInfo.add_sound(particle->sound);
particleInfo.add_blend_mode((int)particle->blendMode);
particleInfo.add_x(particle->x);
particleInfo.add_x_vel(particle->sSize);
particleInfo.add_x_vel(particle->xVel);
particleInfo.add_y(particle->y);
particleInfo.add_y_vel(particle->yVel);
particleInfo.add_z(particle->z);
@ -2224,6 +2231,14 @@ static void ParseEffects(const Save::SaveGame* s)
particle->roomNumber = particleInfo->room_number();
particle->nodeNumber = particleInfo->node_number();
particle->targetPos = ToVector3(particleInfo->target_pos());
particle->animationType = (ParticleAnimType)particleInfo->animation_type();
particle->damage = particleInfo->damage();
particle->framerate = particleInfo->framerate();
particle->lightRadius = particleInfo->light_radius();
particle->lightFlicker = particleInfo->light_flicker();
particle->lightFlickerS = particleInfo->light_flicker_s();
particle->sound = particleInfo->sound();
}
for (int i = 0; i < s->bats()->size(); i++)

View file

@ -312,6 +312,7 @@ static constexpr char ScriptReserved_EnableEvent[] = "EnableEvent";
static constexpr char ScriptReserved_DisableEvent[] = "DisableEvent";
static constexpr char ScriptReserved_EmitParticle[] = "EmitParticle";
static constexpr char ScriptReserved_EmitAdvancedParticle[] = "EmitAdvancedParticle";
static constexpr char ScriptReserved_EmitLightningArc[] = "EmitLightningArc";
static constexpr char ScriptReserved_EmitShockwave[] = "EmitShockwave";
static constexpr char ScriptReserved_EmitLight[] = "EmitLight";
@ -384,6 +385,7 @@ static constexpr char ScriptReserved_EndReason[] = "EndReason";
static constexpr char ScriptReserved_EventType[] = "EventType";
static constexpr char ScriptReserved_AlignMode[] = "AlignMode";
static constexpr char ScriptReserved_ScaleMode[] = "ScaleMode";
static constexpr char ScriptReserved_ParticleAnimationType[] = "ParticleAnimationType";
static constexpr char ScriptReserved_LevelVars[] = "LevelVars";
static constexpr char ScriptReserved_GameVars[] = "GameVars";

View file

@ -2,26 +2,26 @@
#include "Renderer/RendererEnums.h"
/// Constants for blend mode IDs.
// @enum Effects.BlendID
// @pragma nostrip
/// Table of Effects.BlendID constants.
//
// - `OPAQUE`
// - `ALPHA_TEST`
// - `ADDITIVE`
// - `NO_DEPTH_TEST`
// - `SUBTRACTIVE`
// - `EXCLUDE`
// - `SCREEN`
// - `LIGHTEN`
// - `ALPHA_BLEND`
//
// @table Effects.BlendID
namespace TEN::Scripting::Effects
{
/// Constants for blend mode IDs.
// @enum Effects.BlendID
// @pragma nostrip
/// Table of Effects.BlendID constants.
//
// - `OPAQUE`
// - `ALPHA_TEST`
// - `ADDITIVE`
// - `NO_DEPTH_TEST`
// - `SUBTRACTIVE`
// - `EXCLUDE`
// - `SCREEN`
// - `LIGHTEN`
// - `ALPHA_BLEND`
//
// @table Effects.BlendID
static const auto BLEND_IDS = std::unordered_map<std::string, BlendMode>
{
{ "OPAQUE", BlendMode::Opaque },

View file

@ -2,26 +2,26 @@
#include "Game/items.h"
/// Constants for effect IDs.
// @enum Effects.EffectID
// @pragma nostrip
/// Table of Effects.EffectID constants.
// To be used with @{Objects.Moveable.SetEffect} and @{Objects.Moveable.GetEffect} functions.
//
// - `NONE`
// - `FIRE`
// - `SPARKS`
// - `SMOKE`
// - `ELECTRIC_IGNITE`
// - `RED_IGNITE`
// - `CADAVER`
// - `CUSTOM`
//
// @table Effects.EffectID
namespace TEN::Scripting::Effects
{
/// Constants for effect IDs.
// @enum Effects.EffectID
// @pragma nostrip
/// Table of Effects.EffectID constants.
// To be used with @{Objects.Moveable.SetEffect} and @{Objects.Moveable.GetEffect} functions.
//
// - `NONE`
// - `FIRE`
// - `SPARKS`
// - `SMOKE`
// - `ELECTRIC_IGNITE`
// - `RED_IGNITE`
// - `CADAVER`
// - `CUSTOM`
//
// @table Effects.EffectID
static const auto EFFECT_IDS = std::unordered_map<std::string, EffectType>
{
{ "NONE", EffectType::None },
@ -37,3 +37,4 @@ namespace TEN::Scripting::Effects
{ "REDIGNITE", EffectType::RedIgnite }
};
}

View file

@ -20,6 +20,7 @@
#include "Scripting/Internal/ScriptUtil.h"
#include "Scripting/Internal/TEN/Effects/BlendIDs.h"
#include "Scripting/Internal/TEN/Effects/EffectIDs.h"
#include "Scripting/Internal/TEN/Effects/ParticleAnimTypes.h"
#include "Scripting/Internal/TEN/Types/Color/Color.h"
#include "Scripting/Internal/TEN/Types/Vec3/Vec3.h"
#include "Scripting/Internal/TEN/Types/Vec2/Vec2.h"
@ -210,6 +211,156 @@ namespace TEN::Scripting::Effects
if (TestEnvironment(RoomEnvFlags::ENV_FLAG_WIND, part.roomNumber))
part.flags |= SP_WIND;
}
/// Emit a particle with extensive configuration options including animations.
// @function EmitAdvancedParticle
// @tparam ParticleData ParticleData The table holding all the particle data.
// @usage
// local particle = {
// position = GetMoveableByName("camera_target_6") :GetPosition(),
// velocity = Vec3(0, 0, 10),
// spriteSeqID = TEN.Objects.ObjID.CUSTOM_BAR_GRAPHIC,
// spriteID = 0,
// lifetime = 10,
// maxYVelocity = 0,
// gravity = 0,
// friction = 10,
// startRotation = 0,
// rotationSpeed = 0,
// startSize = 80,
// endSize = 80,
// startColor = TEN.Color(128, 128, 128),
// endColor = TEN.Color(128, 128, 128),
// blendMode = TEN.Effects.BlendID.ADDITIVE,
// wind = false,
// damage = true,
// poison = false,
// burn = false,
// damageHit = 80,
// sound = 197,
// light = true,
// lightRadius = 6,
// lightFlicker = 5,
// animated = true,
// frameRate = .25,
// animationType = TEN.Effects.ParticleAnimationType.LOOP,
// }
// EmitAdvancedParticle(particle)
static void EmitAdvancedParticle(sol::table ParticleData)
{
constexpr auto DEFAULT_START_SIZE = 10.0f;
constexpr auto DEFAULT_LIFE = 2.0f;
constexpr auto SECS_PER_FRAME = 1.0f / (float)FPS;
auto convertedSpriteSeqID = ParticleData.get_or("spriteSeqID", ID_DEFAULT_SPRITES);
if (!CheckIfSlotExists(convertedSpriteSeqID, "EmitParticle() script function."))
return;
auto& part = *GetFreeParticle();
part.on = true;
part.SpriteSeqID = convertedSpriteSeqID;
part.SpriteID = ParticleData.get_or("spriteID", 0);
auto bMode = ParticleData.get_or("blendMode", BlendMode::AlphaBlend);
part.blendMode = bMode;
Vec3 pos = ParticleData["position"];
part.x = pos.x;
part.y = pos.y;
part.z = pos.z;
part.roomNumber = FindRoomNumber(Vector3i(pos.x, pos.y, pos.z));
Vec3 vel = ParticleData["velocity"];
part.xVel = short(vel.x * 32);
part.yVel = short(vel.y * 32);
part.zVel = short(vel.z * 32);
float rotAdd = ParticleData.get_or("rotationSpeed", 0.0f);
float rotAng = ParticleData.get_or("startRotation", TO_DEGREES(Random::GenerateAngle()));
part.rotAng = ANGLE(rotAng) >> 4;
part.rotAdd = ANGLE(rotAdd) >> 4;
part.sSize =
part.size = ParticleData.get_or("startSize", DEFAULT_START_SIZE);
part.dSize = ParticleData.get_or("endSize", 0.0f);
part.scalar = 2;
part.gravity = (short)std::clamp((float) ParticleData.get_or("gravity", 0.0f), (float)SHRT_MIN, (float)SHRT_MAX);
part.friction = ParticleData.get_or("friction", 0);
part.maxYvel = ParticleData.get_or("maxYVelocity", 0);
auto convertedStartColor = ParticleData.get_or("startColor", ScriptColor(255, 255, 255));
part.sR = convertedStartColor.GetR();
part.sG = convertedStartColor.GetG();
part.sB = convertedStartColor.GetB();
auto convertedEndColor = ParticleData.get_or("endColor", ScriptColor(255, 255, 255));
part.dR = convertedEndColor.GetR();
part.dG = convertedEndColor.GetG();
part.dB = convertedEndColor.GetB();
float convertedLife = std::max(0.1f, (float) ParticleData.get_or("lifetime", DEFAULT_LIFE));
part.life =
part.sLife = (int)round(convertedLife / SECS_PER_FRAME);
part.colFadeSpeed = part.life / 2;
part.fadeToBlack = part.life / 3;
part.flags = SP_SCALE | SP_ROTATE | SP_DEF | SP_EXPDEF;
part.damage = ParticleData.get_or("damageHit", 2);
bool convertedApplyPoison = ParticleData.get_or("poison", false);
if (convertedApplyPoison)
part.flags |= SP_POISON;
bool convertedApplyDamage = ParticleData.get_or("damage", false);
if (convertedApplyDamage)
part.flags |= SP_DAMAGE;
bool convertedApplyBurn = ParticleData.get_or("burn", false);
if (convertedApplyBurn)
part.flags |= SP_FIRE;
int convertedApplySound = ParticleData.get_or("sound", -1);
if (convertedApplySound > 0)
{
part.flags |= SP_SOUND;
part.sound = convertedApplySound;
}
bool convertedApplyLight = ParticleData.get_or("light", false);
if (convertedApplyLight)
{
part.flags |= SP_LIGHT;
int lightRadius = ParticleData.get_or("lightRadius", 0);
part.lightRadius = lightRadius * BLOCK(0.25f);
int flicker = ParticleData.get_or("lightFlicker", 0);
if (flicker > 0)
{
part.lightFlicker = ParticleData.get_or("lightFlicker", 0);
part.lightFlickerS = ParticleData.get_or("lightFlicker", 0);
}
}
bool animatedSpr = ParticleData.get_or("animated", false);
if (animatedSpr)
{
ParticleAnimType applyAnim = ParticleData.get_or("animationType", ParticleAnimType::Loop);
float applyFramerate = ParticleData.get_or("frameRate", 1.0f);
part.flags |= SP_ANIMATED;
part.framerate = applyFramerate;
part.animationType = ParticleAnimType(std::clamp(int(applyAnim), int(ParticleAnimType::None), int(ParticleAnimType::LifetimeSpread)));
}
bool convertedApplyWind = ParticleData.get_or("wind", false);
if (convertedApplyWind)
{
if (TestEnvironment(RoomEnvFlags::ENV_FLAG_WIND, part.roomNumber))
part.flags |= SP_WIND;
}
}
/***Emit a shockwave, similar to that seen when a harpy projectile hits something.
@function EmitShockwave
@ -299,11 +450,11 @@ namespace TEN::Scripting::Effects
TriggerBlood(pos.x, pos.y, pos.z, -1, ValueOr<int>(count, 1));
}
/// Emit air bubble in a water room.
// @function EmitAirBubble
// @tparam Vec3 pos World position where the effect will be spawned. Must be in a water room.
// @tparam[opt] float size Sprite size. __Default: 32__
// @tparam[opt] float amp Oscillation amplitude. __Default: 32__
/// Emit air bubble in a water room.
// @function EmitAirBubble
// @tparam Vec3 pos World position where the effect will be spawned. Must be in a water room.
// @tparam[opt] float size Sprite size. __Default: 32__
// @tparam[opt] float amp Oscillation amplitude. __Default: 32__
static void EmitAirBubble(const Vec3& pos, TypeOrNil<float> size, TypeOrNil<float> amp)
{
constexpr auto DEFAULT_SIZE = 128.0f;
@ -362,6 +513,7 @@ namespace TEN::Scripting::Effects
tableEffects.set_function(ScriptReserved_EmitLightningArc, &EmitLightningArc);
tableEffects.set_function(ScriptReserved_EmitParticle, &EmitParticle);
tableEffects.set_function(ScriptReserved_EmitAdvancedParticle, &EmitAdvancedParticle);
tableEffects.set_function(ScriptReserved_EmitShockwave, &EmitShockwave);
tableEffects.set_function(ScriptReserved_EmitLight, &EmitLight);
tableEffects.set_function(ScriptReserved_EmitSpotLight, &EmitSpotLight);
@ -375,5 +527,38 @@ namespace TEN::Scripting::Effects
auto handler = LuaHandler{ state };
handler.MakeReadOnlyTable(tableEffects, ScriptReserved_BlendID, BLEND_IDS);
handler.MakeReadOnlyTable(tableEffects, ScriptReserved_EffectID, EFFECT_IDS);
handler.MakeReadOnlyTable(tableEffects, ScriptReserved_ParticleAnimationType, PARTICLE_ANIM_TYPES);
}
}
/// Structure for EmitAdvancedParticle table.
// @table ParticleData
// @tfield Vec3 position World position.
// @tfield Vec3 velocity Velocity.
// @tfield[opt] Objects.ObjID spriteSeqID ID of the sprite sequence object. __Default: Objects.ObjID.DEFAULT_SPRITES__
// @tfield[opt] int spriteID ID of the sprite in the sprite sequence object.__Default: 0__
// @tfield[opt] float lifetime Lifespan in seconds. __Default: 2__
// @tfield[opt] float maxYVelocity Specifies ithe maximum Y velocity for the particle. __Default: 0__
// @tfield[opt] float gravity Specifies if the particle will fall over time. Positive values ascend, negative values descend. Recommended range: [-1000 and 1000]. __Default: 0__
// @tfield[opt] float friction Specifies the friction with which the particle will slow down over time. __Default: 0__
// @tfield[opt] float startRotation Rotation at start of life. __Default: random__
// @tfield[opt] float rotationSpeed Rotational velocity in degrees. __Default: 0__
// @tfield[opt] float startSize Size at start of life. __Default: 10__
// @tfield[opt] float endSize Size at end of life. The particle will linearly shrink or grow toward this size over its lifespan. __Default: 0__
// @tfield[opt] Color startColor Color at start of life. __Default: Color(255, 255, 255)__
// @tfield[opt] Color endColor Color to fade toward. This will finish long before the end of the particle's life due to internal math. __Default: Color(255, 255, 255)__
// @tfield[opt] Effects.BlendID blendMode Render blend mode. __TEN.Effects.BlendID.ALPHA_BLEND__
// @tfield[opt] bool damage Specify if the particle will harm the player on collision. __Default: false__
// @tfield[opt] bool poison Specify if the particle will poison the player on collision. __Default: false__
// @tfield[opt] bool burn Specify if the particle will burn the player on collision. __Default: false__
// @tfield[opt] bool wind Specify if the particle will be affected by wind in outside rooms. __Default: false__
// @tfield[opt] int damageHit Specify the damage particle will harm the player on collision. __Default: 2__
// @tfield[opt] bool light Specify if the particle will be emit a light based on its color. Caution: Recommended only for a single particle. Having too many particles with lights can overflow the light system. __Default: false__
// @tfield[opt] int lightRadius measured in "clicks" or 256 world units. __Default: 0__
// @tfield[opt] int lightFlicker The interval at which light should flicker. __Default: 0__
// @tfield[opt] int sound ID to play. Corresponds to the value in the sound XML file or Tomb Editor's "Sound Infos" window. Looping sounds recommended. Caution: Recommended only for a single particle. Having too many particles with sounds can overflow the sound system. __Default: None__
// @tfield[opt] bool animated Specify if the particle will be animated. __Default: false__
// @tfield[opt] Effects.ParticleAnimationType animationType Specify the the type of animation the particle will use. __Default: TEN.Effects.ParticleAnimationType.LOOP__
// @tfield[opt] float frameRate The framerate with which the particle will be animated. __Default: 1__

View file

@ -0,0 +1,27 @@
#pragma once
#include "Game/effects/effects.h"
namespace TEN::Scripting::Effects
{
/// Constants for particle animation type constants.
// @enum Effects.ParticleAnimationType
// @pragma nostrip
/// Table of Effects.ParticleAnimationType type constants. To be used with particles.
//
// - `LOOP` - Frames loop sequentially.
// - `ONE_SHOT` - Frames play once and freeze on the last frame.
// - `BACK_AND_FORTH` - Frames bounce back and forth.
// - `LIFE_TIME_SPREAD` - Frames are distributed over the particle's lifetime
//
// @table Effects.ParticleAnimationType
static const auto PARTICLE_ANIM_TYPES = std::unordered_map<std::string, ParticleAnimType>
{
{ "LOOP", ParticleAnimType::Loop },
{ "ONE_SHOT", ParticleAnimType::OneShot },
{ "BACK_AND_FORTH", ParticleAnimType::BackAndForth },
{ "LIFE_TIME_SPREAD", ParticleAnimType::LifetimeSpread } // TODO: Rename to LIFETIME_SPREAD.
};
}

View file

@ -4954,6 +4954,13 @@ struct ParticleInfoT : public flatbuffers::NativeTable {
int32_t node_number = 0;
std::unique_ptr<TEN::Save::Vector3> target_pos{};
int32_t sprite_id = 0;
int32_t damage = 0;
float framerate = 0.0f;
int32_t animation_type = 0;
int32_t light_radius = 0;
int32_t light_flicker = 0;
int32_t light_flicker_s = 0;
int32_t sound = 0;
};
struct ParticleInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@ -4999,7 +5006,14 @@ struct ParticleInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
VT_ROOM_NUMBER = 74,
VT_NODE_NUMBER = 76,
VT_TARGET_POS = 78,
VT_SPRITE_ID = 80
VT_SPRITE_ID = 80,
VT_DAMAGE = 82,
VT_FRAMERATE = 84,
VT_ANIMATION_TYPE = 86,
VT_LIGHT_RADIUS = 88,
VT_LIGHT_FLICKER = 90,
VT_LIGHT_FLICKER_S = 92,
VT_SOUND = 94
};
int32_t x() const {
return GetField<int32_t>(VT_X, 0);
@ -5118,6 +5132,27 @@ struct ParticleInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
int32_t sprite_id() const {
return GetField<int32_t>(VT_SPRITE_ID, 0);
}
int32_t damage() const {
return GetField<int32_t>(VT_DAMAGE, 0);
}
float framerate() const {
return GetField<float>(VT_FRAMERATE, 0.0f);
}
int32_t animation_type() const {
return GetField<int32_t>(VT_ANIMATION_TYPE, 0);
}
int32_t light_radius() const {
return GetField<int32_t>(VT_LIGHT_RADIUS, 0);
}
int32_t light_flicker() const {
return GetField<int32_t>(VT_LIGHT_FLICKER, 0);
}
int32_t light_flicker_s() const {
return GetField<int32_t>(VT_LIGHT_FLICKER_S, 0);
}
int32_t sound() const {
return GetField<int32_t>(VT_SOUND, 0);
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<int32_t>(verifier, VT_X) &&
@ -5159,6 +5194,13 @@ struct ParticleInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
VerifyField<int32_t>(verifier, VT_NODE_NUMBER) &&
VerifyField<TEN::Save::Vector3>(verifier, VT_TARGET_POS) &&
VerifyField<int32_t>(verifier, VT_SPRITE_ID) &&
VerifyField<int32_t>(verifier, VT_DAMAGE) &&
VerifyField<float>(verifier, VT_FRAMERATE) &&
VerifyField<int32_t>(verifier, VT_ANIMATION_TYPE) &&
VerifyField<int32_t>(verifier, VT_LIGHT_RADIUS) &&
VerifyField<int32_t>(verifier, VT_LIGHT_FLICKER) &&
VerifyField<int32_t>(verifier, VT_LIGHT_FLICKER_S) &&
VerifyField<int32_t>(verifier, VT_SOUND) &&
verifier.EndTable();
}
ParticleInfoT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
@ -5287,6 +5329,27 @@ struct ParticleInfoBuilder {
void add_sprite_id(int32_t sprite_id) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_SPRITE_ID, sprite_id, 0);
}
void add_damage(int32_t damage) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_DAMAGE, damage, 0);
}
void add_framerate(float framerate) {
fbb_.AddElement<float>(ParticleInfo::VT_FRAMERATE, framerate, 0.0f);
}
void add_animation_type(int32_t animation_type) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_ANIMATION_TYPE, animation_type, 0);
}
void add_light_radius(int32_t light_radius) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_LIGHT_RADIUS, light_radius, 0);
}
void add_light_flicker(int32_t light_flicker) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_LIGHT_FLICKER, light_flicker, 0);
}
void add_light_flicker_s(int32_t light_flicker_s) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_LIGHT_FLICKER_S, light_flicker_s, 0);
}
void add_sound(int32_t sound) {
fbb_.AddElement<int32_t>(ParticleInfo::VT_SOUND, sound, 0);
}
explicit ParticleInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
@ -5338,8 +5401,22 @@ inline flatbuffers::Offset<ParticleInfo> CreateParticleInfo(
int32_t room_number = 0,
int32_t node_number = 0,
const TEN::Save::Vector3 *target_pos = 0,
int32_t sprite_id = 0) {
int32_t sprite_id = 0,
int32_t damage = 0,
float framerate = 0.0f,
int32_t animation_type = 0,
int32_t light_radius = 0,
int32_t light_flicker = 0,
int32_t light_flicker_s = 0,
int32_t sound = 0) {
ParticleInfoBuilder builder_(_fbb);
builder_.add_sound(sound);
builder_.add_light_flicker_s(light_flicker_s);
builder_.add_light_flicker(light_flicker);
builder_.add_light_radius(light_radius);
builder_.add_animation_type(animation_type);
builder_.add_framerate(framerate);
builder_.add_damage(damage);
builder_.add_sprite_id(sprite_id);
builder_.add_target_pos(target_pos);
builder_.add_node_number(node_number);
@ -9810,6 +9887,13 @@ inline void ParticleInfo::UnPackTo(ParticleInfoT *_o, const flatbuffers::resolve
{ auto _e = node_number(); _o->node_number = _e; }
{ auto _e = target_pos(); if (_e) _o->target_pos = std::unique_ptr<TEN::Save::Vector3>(new TEN::Save::Vector3(*_e)); }
{ auto _e = sprite_id(); _o->sprite_id = _e; }
{ auto _e = damage(); _o->damage = _e; }
{ auto _e = framerate(); _o->framerate = _e; }
{ auto _e = animation_type(); _o->animation_type = _e; }
{ auto _e = light_radius(); _o->light_radius = _e; }
{ auto _e = light_flicker(); _o->light_flicker = _e; }
{ auto _e = light_flicker_s(); _o->light_flicker_s = _e; }
{ auto _e = sound(); _o->sound = _e; }
}
inline flatbuffers::Offset<ParticleInfo> ParticleInfo::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ParticleInfoT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@ -9859,6 +9943,13 @@ inline flatbuffers::Offset<ParticleInfo> CreateParticleInfo(flatbuffers::FlatBuf
auto _node_number = _o->node_number;
auto _target_pos = _o->target_pos ? _o->target_pos.get() : 0;
auto _sprite_id = _o->sprite_id;
auto _damage = _o->damage;
auto _framerate = _o->framerate;
auto _animation_type = _o->animation_type;
auto _light_radius = _o->light_radius;
auto _light_flicker = _o->light_flicker;
auto _light_flicker_s = _o->light_flicker_s;
auto _sound = _o->sound;
return TEN::Save::CreateParticleInfo(
_fbb,
_x,
@ -9899,7 +9990,14 @@ inline flatbuffers::Offset<ParticleInfo> CreateParticleInfo(flatbuffers::FlatBuf
_room_number,
_node_number,
_target_pos,
_sprite_id);
_sprite_id,
_damage,
_framerate,
_animation_type,
_light_radius,
_light_flicker,
_light_flicker_s,
_sound);
}
inline SoundtrackT *Soundtrack::UnPack(const flatbuffers::resolver_function_t *_resolver) const {

View file

@ -375,6 +375,13 @@ table ParticleInfo {
node_number: int32;
target_pos: Vector3;
sprite_id: int32;
damage: int32;
framerate: float;
animation_type: int32;
light_radius: int32;
light_flicker: int32;
light_flicker_s: int32;
sound: int32;
}
table Soundtrack {

View file

@ -883,6 +883,7 @@ if not exist "%ScriptsDir%\Strings.lua" xcopy /Y "$(SolutionDir)Scripts\Strings.
<ClInclude Include="Scripting\Internal\ReservedScriptNames.h" />
<ClInclude Include="Scripting\Internal\ScriptAssert.h" />
<ClInclude Include="Scripting\Internal\ScriptUtil.h" />
<ClInclude Include="Scripting\Internal\TEN\Effects\ParticleAnimTypes.h" />
<ClInclude Include="Scripting\Internal\TEN\Collision\MaterialTypes.h" />
<ClInclude Include="Scripting\Internal\TEN\Collision\Probe.h" />
<ClInclude Include="Scripting\Internal\TEN\Objects\Lara\HandStatuses.h" />