Merge branch 'develop'

This commit is contained in:
Stranger1992 2025-03-29 16:11:13 +00:00
commit 7fe9f7ab9f
118 changed files with 1898 additions and 583 deletions

View file

@ -3,6 +3,26 @@
The dates are in European standard format where date is presented as **YYYY-MM-DD**.
TombEngine releases are located in this repository (alongside with Tomb Editor): https://github.com/TombEngine/TombEditorReleases
## [Version 1.8.1](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.8.1) - 2025-03-29
### Bug fixes
* Fixed pathfinding for friendly NPCs such as monkeys.
* Fixed particles remaining in the level after reloading from the savegame.
* Fixed particles being canceled by fog bulbs.
* Fixed crash in case hair object is the last object in a level.
* Fixed crash with incorrectly applied animated textures on static meshes.
* Fixed console window not hiding in non-debug mode on Windows 11.
* Fixed key binding settings saving for the current play session after hitting Esc to cancel.
* Fixed lensflare blending formula to avoid screen overbright.
### New features
* Added Firefly Emitter object (ID 1099) with corresponding sprite slot (ID 1379).
* Added live console input to perform Lua commands in realtime.
### Lua API changes
* Added missing constructor for `Collision.Probe` without room number.
* Added optional looping argument for `View.GetFlybyPosition` and `View.GetFlybyRotation` functions.
## [Version 1.8](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.8) - 2025-03-16
### Bug fixes
@ -24,7 +44,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed custom shatter sounds with custom sound IDs not playing correctly.
* Fixed crashes with sound samples larger than 2 megabytes.
### New Features
### New features
* Added multithreading and an option for it to flow system settings.
* Added ability to use floor trapdoors, keys and puzzle items underwater.
- You must update your Lara object: https://github.com/TombEngine/Resources/raw/main/Wad2%20Objects/Lara/TEN_Lara.wad2
@ -73,7 +93,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed gravity being applied underwater when exiting the fly cheat.
* Fixed gravity being applied when vaulting on the same frame as the player lands.
### New Features
### New features
* Added realtime shader reloading in debug mode by pressing F9 key.
* Added load, save, stopwatch and compass as a functional pick-up items with ability to add or remove them from inventory.
* Increased particle limit from 1024 to 4096.
@ -123,7 +143,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed spotlight shadows.
* Fixed Skeleton and Mummy not reacting to shotgun hits.
### New Features
### New features
* Added classic mirror effect with ability to reflect moveables and static meshes.
* Added ability to customize many hardcoded parameters, such as flare, weapon, and hair settings.
* Added dynamic shadow casting on objects and static meshes.
@ -199,7 +219,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed display sprites and display strings rendering in the inventory background.
* Fixed young Lara hair drawing. https://tombengine.com/docs/level-settings/#young_lara
### New Features
### New features
* Added high framerate mode (also known as 60 FPS mode).
* Added a customisable global lensflare effect. https://tombengine.com/docs/level-settings/#lensflare
* Added a customisable starry sky and meteor effect. https://tombengine.com/docs/level-settings/#stars
@ -259,7 +279,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed bottom collision for solid static meshes.
* Fixed T-Rex's head rotation.
### New Features
### New features
* Auto-switch to a crawl state if player start position is in a crawlspace.
* Allow directional flame emitter (negative OCBs) to be rotated at any angle.
* Revise wall spikes:
@ -306,7 +326,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed incorrect light collection in some cases.
* Fixed normal mapping for rooms, items, and statics.'
### New Features
### New features
* Added ambient occlusion (SSAO).
* Added new post-process workflow (monochrome, negative, exclusion) with tinting.
* Added SMAA antialiasing instead of MSAA.
@ -365,7 +385,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fix camera snap when disengaging the look-around mode.
* Fix TR4 mapper not being visible.
### New Features
### New features
* Improve head-on wall collision.
* Overhaul pushables:
- Separate climbable and non-climbable pushable object slots.
@ -448,7 +468,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fix incorrect culling for scaled static meshes.
* Fix normal mapping.
### New Features
### New features
* Add ability to save screenshot in the "Screenshots" subfolder by pressing the "Print screen" key.
* Implement separate audio track channel for playing voiceovers with subtitles in .srt format.
* Don't stop ambience when Lara dies.
@ -496,7 +516,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fix rendering for static meshes with custom blending modes and alpha transparency.
* Fix inconsistent multiline string spacing on different display modes.
### New Features
### New features
* Remove search object 4 hardcoded meshswap activated with a flipmap.
* Add TR1 cowboy.
* Add TR3 wall mounted blade.
@ -554,7 +574,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
- Please note you must use the patched version found here: https://github.com/TombEngine/Resources/blob/main/Wad2%20Objects/tr5_Imp.wad2
* Fix and improve wraith tails.
### New Features/Amedments
### New features/Amedments
* Add dedicated WRAITH_TRAP object with enhanced effects.
- OCB 0: Effect disabled.
- OCB 1: Effect enabled.
@ -603,7 +623,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fix TR3 big gun spawning rocket with 0 life which caused an immediate explosion.
* Fix TR3 Tony and add boss effect for him.
### New Features
### New features
* Add TR3 civvy.
* Add TR3 electric cleaner.
* Add TR3 Sophia Leigh with following OCBs:
@ -655,7 +675,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fix grenade and rocket launcher lighting.
* Fix ceiling trapdoor and floor trapdoor that Lara couldn't open manually.
### New Features
### New features
* Make enemies drop pickups at first available bounding box corner point, not centerpoint.
* Restore original volumetric explosion effects.
* Add TR3 lizard and Puna.
@ -707,7 +727,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fix bone rotations of some entities.
* Fix Lara's animation for cog switch release.
### New Features
### New features
* Added new OCB to cog switch object:
- Use OCB 0 to have the traditional behaviour.
- Use any other OCB to can use the Cog Switch without need of any door linked.
@ -721,7 +741,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
## [Version 1.0.4](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.6.2) - 2022-12-16
### New Features
### New features
* Add generic assignable effects for moveables - fire, sparks, smoke and laser / electric ignite.
* Add ability to burn enemies with FLAME_EMITTER_1 and death blocks.
* Add wireframe mode and other visual debug information (switch by F10/F11 debug page scroll hotkeys).
@ -793,7 +813,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
## [Version 1.0.3](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.6.1) - 2022-11-18
### New Features
### New features
* Add ledge jumps (Lara object must be updated with new animations to make it work).
* Allow any object slot to be used as a meshswap.
* Add OCB 1 for rollingball to make it silent.
@ -861,7 +881,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
## [Version 1.0.2](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.6) - 2022-09-16
### New Features
### New features
* Fix removing Pistols with TakeItem and SetItemCount.
* Allow saving and loading of Vec3s in LevelVars and GameVars.
* Support volume triggers made with node editor.
@ -916,7 +936,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
## [Version 1.0.1](https://github.com/TombEngine/TombEditorReleases/releases/tag/v1.5.2) - 2022-08-16
### New Features
### New features
* Added antialiasing support.
* Added static mesh scaling support.
* Added free rotation for teeth spikes instead of using OCB codes.

View file

@ -12,7 +12,7 @@ new_type("luautil", "5 Lua utility modules", true)
not_luadoc = true
local version = "1.8"
local version = "1.8.1"
project = " TombEngine"
title = "TombEngine " .. version .. " Lua API"
description = "TombEngine " .. version .. " scripting interface"

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -784,12 +784,12 @@ EmitAdvancedParticle(particle)</pre>
(<em>optional</em>)
</li>
<li><span class="parameter">edgeFeatherMode</span>
<span class="types"><span class="type">Effects.StreamerFeatherMode</span></span>
Edge feather mode. <strong>Default: Effects.FeatherID.NONE</strong>
<span class="types"><a class="type" href="../4 enums/Effects.StreamerFeatherMode.html#">StreamerFeatherMode</a></span>
Edge feather mode. <strong>Default: Effects.StreamerFeatherMode.NONE</strong>
(<em>optional</em>)
</li>
<li><span class="parameter">lengthFeatherMode</span>
<span class="types"><span class="type">Effects.StreamerFeatherMode</span></span>
<span class="types"><a class="type" href="../4 enums/Effects.StreamerFeatherMode.html#">StreamerFeatherMode</a></span>
Length feather mode. <strong>UNIMPLEMENTED, currently will always leave a fading tail</strong>
(<em>optional</em>)
</li>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -176,11 +176,11 @@
<td class="summary">Play a flyby sequence.</td>
</tr>
<tr>
<td class="name" ><a href="#GetFlybyPosition">GetFlybyPosition(seqID, progress)</a></td>
<td class="name" ><a href="#GetFlybyPosition">GetFlybyPosition(seqID, progress[, loop])</a></td>
<td class="summary">Get a flyby sequence's position at a specified progress point in percent.</td>
</tr>
<tr>
<td class="name" ><a href="#GetFlybyRotation">GetFlybyRotation(seqID, progress)</a></td>
<td class="name" ><a href="#GetFlybyRotation">GetFlybyRotation(seqID, progress[, loop])</a></td>
<td class="summary">Get a flyby sequence's rotation at a specified progress point in percent.</td>
</tr>
<tr>
@ -499,7 +499,7 @@
</dd>
<dt>
<a name = "GetFlybyPosition"></a>
<strong>GetFlybyPosition(seqID, progress)</strong>
<strong>GetFlybyPosition(seqID, progress[, loop])</strong>
</dt>
<dd>
Get a flyby sequence's position at a specified progress point in percent.
@ -516,6 +516,11 @@
<span class="types"><span class="type">float</span></span>
Progress point in percent. Clamped to [0, 100].
</li>
<li><span class="parameter">loop</span>
<span class="types"><span class="type">bool</span></span>
Smooth the position near start and end points, as if the sequence is looped.
(<em>optional</em>)
</li>
</ul>
<h3>Returns:</h3>
@ -531,7 +536,7 @@
</dd>
<dt>
<a name = "GetFlybyRotation"></a>
<strong>GetFlybyRotation(seqID, progress)</strong>
<strong>GetFlybyRotation(seqID, progress[, loop])</strong>
</dt>
<dd>
Get a flyby sequence's rotation at a specified progress point in percent.
@ -548,6 +553,11 @@
<span class="types"><span class="type">float</span></span>
Progress point in percent. Clamped to [0, 100].
</li>
<li><span class="parameter">loop</span>
<span class="types"><span class="type">bool</span></span>
Smooth the position near start and end points, as if the sequence is looped.
(<em>optional</em>)
</li>
</ul>
<h3>Returns:</h3>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -122,7 +122,7 @@
<h2><a href="#Functions">Functions</a></h2>
<table class="function_list">
<tr>
<td class="name" ><a href="#Probe">Probe(pos, roomNumber)</a></td>
<td class="name" ><a href="#Probe">Probe(pos[, roomNumber])</a></td>
<td class="summary">Create a Probe at a specified world position in a room.</td>
</tr>
<tr>
@ -220,7 +220,7 @@
<dl class="function">
<dt>
<a name = "Probe"></a>
<strong>Probe(pos, roomNumber)</strong>
<strong>Probe(pos[, roomNumber])</strong>
</dt>
<dd>
Create a Probe at a specified world position in a room.
@ -235,7 +235,8 @@
</li>
<li><span class="parameter">roomNumber</span>
<span class="types"><span class="type">int</span></span>
[opt] Room number. Must be used if probing a position in an overlapping room.
Room number. Must be used if probing a position in an overlapping room.
(<em>optional</em>)
</li>
</ul>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -473,7 +473,7 @@ Invisible
<p>e.g. <code>myLevel.laraType = LaraType.Divesuit</code></p>
<p> <strong>(not yet fully implemented)</strong>
<p> <strong>Not yet fully implemented.</strong> Only types <code>Normal</code> and <code>Young</code> are guaranteed to work.

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -517,7 +517,7 @@
<ul>
<li><span class="parameter">objectCollision</span>
<span class="types"><span class="type">bool</span></span>
when enabled, camera will collide with moveables and statics. Disable or TR4-like camera behaviour.
when enabled, camera will collide with moveables and statics. Disable for TR4-like camera behaviour.
</li>
</ul>
@ -1255,7 +1255,7 @@
<ul>
<li><span class="parameter">errorMode</span>
<span class="types"><a class="type" href="../4 enums/Flow.ErrorMode.html#">ErrorMode</a></span>
error mode to use. */
error mode to use.
</li>
</ul>
@ -1278,7 +1278,7 @@
<ul>
<li><span class="parameter">multithreaded</span>
<span class="types"><span class="type">bool</span></span>
determines whether to use multithreading or not. */
determines whether to use multithreading or not.
</li>
</ul>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -130,7 +130,7 @@
<td class="summary">Retrieve the object ID</td>
</tr>
<tr>
<td class="name" ><a href="#Moveable:SetObjectID">Moveable:SetObjectID(ID)</a></td>
<td class="name" ><a href="#Moveable:SetObjectID">Moveable:SetObjectID(objectID)</a></td>
<td class="summary">Change the object's ID.</td>
</tr>
<tr>
@ -221,7 +221,7 @@
<td class="summary">Set the effect for this moveable.</td>
</tr>
<tr>
<td class="name" ><a href="#Moveable:SetCustomEffect">Moveable:SetCustomEffect(Color1, Color2[, timeout])</a></td>
<td class="name" ><a href="#Moveable:SetCustomEffect">Moveable:SetCustomEffect(color1, color2[, timeout])</a></td>
<td class="summary">Set custom colored burn effect to moveable</td>
</tr>
<tr>
@ -418,7 +418,7 @@
<td class="summary">Attach camera to an object.</td>
</tr>
<tr>
<td class="name" ><a href="#Moveable:AnimFromObject">Moveable:AnimFromObject(ObjectID, animNumber, stateID)</a></td>
<td class="name" ><a href="#Moveable:AnimFromObject">Moveable:AnimFromObject(objectID, animNumber, stateID)</a></td>
<td class="summary">Borrow animation from an object</td>
</tr>
</table>
@ -518,7 +518,7 @@ most can just be ignored (see usage).
<ol>
<span class="types"><a class="type" href="../4 enums/Objects.ObjID.html#">ObjID</a></span>
a number representing the ID of the object
a number representing the ID of the object.
</ol>
@ -527,7 +527,7 @@ most can just be ignored (see usage).
</dd>
<dt>
<a name = "Moveable:SetObjectID"></a>
<strong>Moveable:SetObjectID(ID)</strong>
<strong>Moveable:SetObjectID(objectID)</strong>
</dt>
<dd>
Change the object's ID. This will literally change the object.
@ -536,7 +536,7 @@ most can just be ignored (see usage).
<h3>Parameters:</h3>
<ul>
<li><span class="parameter">ID</span>
<li><span class="parameter">objectID</span>
<span class="types"><a class="type" href="../4 enums/Objects.ObjID.html#">ObjID</a></span>
the new ID
</li>
@ -795,7 +795,7 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<ol>
<span class="types"><a class="type" href="../3 primitive classes/Vec3.html#">Vec3</a></span>
pos World position.
World position.
</ol>
@ -815,7 +815,7 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<ul>
<li><span class="parameter">index</span>
<span class="types"><span class="type">int</span></span>
of a joint to get rotation
Index of a joint to get rotation.
</li>
</ul>
@ -1053,7 +1053,7 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
</dd>
<dt>
<a name = "Moveable:SetCustomEffect"></a>
<strong>Moveable:SetCustomEffect(Color1, Color2[, timeout])</strong>
<strong>Moveable:SetCustomEffect(color1, color2[, timeout])</strong>
</dt>
<dd>
Set custom colored burn effect to moveable
@ -1062,17 +1062,17 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<h3>Parameters:</h3>
<ul>
<li><span class="parameter">Color1</span>
<li><span class="parameter">color1</span>
<span class="types"><a class="type" href="../3 primitive classes/Color.html#">Color</a></span>
color the primary color of the effect (also used for lighting).
The primary color of the effect (also used for lighting).
</li>
<li><span class="parameter">Color2</span>
<li><span class="parameter">color2</span>
<span class="types"><a class="type" href="../3 primitive classes/Color.html#">Color</a></span>
color the secondary color of the effect.
The secondary color of the effect.
</li>
<li><span class="parameter">timeout</span>
<span class="types"><span class="type">float</span></span>
time (in seconds) after which effect turns off.
Time (in seconds) after which effect turns off.
(<em>optional</em>)
</li>
</ul>
@ -1096,7 +1096,7 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<ol>
<span class="types"><a class="type" href="../4 enums/Effects.EffectID.html#">EffectID</a></span>
Sffect type currently assigned.
Effect type currently assigned.
</ol>
@ -1116,7 +1116,7 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<ul>
<li><span class="parameter">index</span>
<span class="types"><span class="type">int</span></span>
of the ItemFlags, can be between 0 and 7.
Index of the ItemFlag, can be between 0 and 7.
</li>
</ul>
@ -1144,11 +1144,11 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<ul>
<li><span class="parameter">value</span>
<span class="types"><span class="type">short</span></span>
to store in the moveable's ItemFlags[index]
Value to store in the moveable's ItemFlags[index].
</li>
<li><span class="parameter">index</span>
<span class="types"><span class="type">int</span></span>
of the ItemFlags where store the value.
Index of the ItemFlag where to store the value.
</li>
</ul>
@ -1191,7 +1191,7 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<ul>
<li><span class="parameter">value</span>
<span class="types"><span class="type">short</span></span>
to store.
Value to store.
</li>
</ul>
@ -1248,18 +1248,22 @@ baddy:SetOnCollidedWithRoom(LevelFuncs.roomCollided)</pre>
<strong>Moveable:GetAIBits()</strong>
</dt>
<dd>
Get AIBits of object
<p>Get AIBits of object
This will return a table with six values, each corresponding to
an active behaviour. If the object is in a certain AI mode, the table will
have a <em>1</em> in the corresponding cell. Otherwise, the cell will hold
a <em>0</em>.</p>
<p> <br />1 - guard
<br />2 - ambush
<br />3 - patrol 1
<br />4 - modify
<br />5 - follow
<br />6 - patrol 2
<pre><code>1 - Guard
2 - Ambush
3 - Patrol 1
4 - Modify
5 - Follow
6 - Patrol 2
</code></pre>
@ -1681,7 +1685,7 @@ sas:SetPosition(newPos, <span class="keyword">false</span>)</pre>
<strong>Moveable:GetStatus()</strong>
</dt>
<dd>
Get the moveable's status. ()
Get the moveable's status.
@ -1702,7 +1706,7 @@ sas:SetPosition(newPos, <span class="keyword">false</span>)</pre>
<strong>Moveable:SetStatus(status)</strong>
</dt>
<dd>
Set the moveable's status. ()
Set the moveable's status.
@ -2103,15 +2107,15 @@ sas:SetPosition(newPos, <span class="keyword">false</span>)</pre>
<ul>
<li><span class="parameter">mesh</span>
<span class="types"><span class="type">int</span></span>
of a target moveable to use as a camera target
Mesh of a target moveable to use as a camera target.
</li>
<li><span class="parameter">target</span>
<span class="types"><a class="type" href="../2 classes/Objects.Moveable.html#Moveable">Moveable</a></span>
moveable to attach camera to
Target moveable to attach camera to.
</li>
<li><span class="parameter">mesh</span>
<span class="types"><span class="type">int</span></span>
of a target moveable to use as a camera target
Mesh of a target moveable to use as a camera target.
</li>
</ul>
@ -2122,7 +2126,7 @@ sas:SetPosition(newPos, <span class="keyword">false</span>)</pre>
</dd>
<dt>
<a name = "Moveable:AnimFromObject"></a>
<strong>Moveable:AnimFromObject(ObjectID, animNumber, stateID)</strong>
<strong>Moveable:AnimFromObject(objectID, animNumber, stateID)</strong>
</dt>
<dd>
Borrow animation from an object
@ -2131,17 +2135,17 @@ sas:SetPosition(newPos, <span class="keyword">false</span>)</pre>
<h3>Parameters:</h3>
<ul>
<li><span class="parameter">ObjectID</span>
<li><span class="parameter">objectID</span>
<span class="types"><a class="type" href="../4 enums/Objects.ObjID.html#">ObjID</a></span>
to take animation and stateID from,
Object ID to take animation and stateID from.
</li>
<li><span class="parameter">animNumber</span>
<span class="types"><span class="type">int</span></span>
animation from object
Animation from object.
</li>
<li><span class="parameter">stateID</span>
<span class="types"><span class="type">int</span></span>
state from object
state State from object.
</li>
</ul>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -127,11 +127,11 @@
</tr>
<tr>
<td class="name" ><a href="#minDistance">minDistance</a></td>
<td class="summary">(int) Minimum distance.</td>
<td class="summary">(float) Minimum distance.</td>
</tr>
<tr>
<td class="name" ><a href="#maxDistance">maxDistance</a></td>
<td class="summary">(int) Maximum distance.</td>
<td class="summary">(float) Maximum distance.</td>
</tr>
</table>
<h2><a href="#Functions">Functions</a></h2>
@ -171,8 +171,8 @@
<strong>minDistance</strong>
</dt>
<dd>
(int) Minimum distance.
This is the distance at which the fog starts.
(float) Minimum distance.
This is the distance at which the fog starts (in sectors).
@ -187,8 +187,8 @@
<strong>maxDistance</strong>
</dt>
<dd>
(int) Maximum distance.
This is the distance at which the fog reaches the maximum strength.
(float) Maximum distance.
This is the distance at which the fog reaches the maximum strength (in sectors).

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,7 @@
<li> <here>Collision.MaterialType</here></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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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> <here>Effects.FeatherMode</here></li>
<li> <here>Effects.StreamerFeatherMode</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>
@ -114,7 +114,7 @@
<div id="content">
<h1>Enum <code>Effects.FeatherMode</code></h1>
<h1>Enum <code>Effects.StreamerFeatherMode</code></h1>
<p>Constants for feather modes.</p>
<p>
@ -124,8 +124,8 @@
<h2><a href="#Tables">Tables</a></h2>
<table class="function_list">
<tr>
<td class="name" ><a href="#Effects.FeatherMode">Effects.FeatherMode</a></td>
<td class="summary">Table of Effects.FeatherMode constants.</td>
<td class="name" ><a href="#Effects.StreamerFeatherMode">Effects.StreamerFeatherMode</a></td>
<td class="summary">Table of Effects.StreamerFeatherMode constants.</td>
</tr>
</table>
@ -137,12 +137,12 @@
<dl class="function">
<dt>
<a name = "Effects.FeatherMode"></a>
<strong>Effects.FeatherMode</strong>
<a name = "Effects.StreamerFeatherMode"></a>
<strong>Effects.StreamerFeatherMode</strong>
</dt>
<dd>
<p>Table of Effects.FeatherMode constants.
<p>Table of Effects.StreamerFeatherMode constants.
To be used with <a href="../1 modules/Effects.html#EmitStreamer">Effects.EmitStreamer</a> function.</p>
<ul>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -952,6 +952,7 @@ DOPPELGANGER_ORIGIN
CORPSE
WRAITH_TRAP
WATERFALL_EMITTER
FIREFLY_EMITTER
MESHSWAP1
MESHSWAP2
MESHSWAP3
@ -1132,6 +1133,7 @@ AIR_BAR_TEXTURE
DASH_BAR_TEXTURE
SFX_BAR_TEXTURE
WATERFALL_SPRITES
FIREFLY_SPRITES
CROSSHAIR_GRAPHICS
SPEEDOMETER_GRAPHICS
CUSTOM_BAR_GRAPHICS
@ -1410,6 +1412,7 @@ AIR_BAR_TEXTURE
DASH_BAR_TEXTURE
SFX_BAR_TEXTURE
WATERFALL_SPRITES
FIREFLY_SPRITES
CROSSHAIR_GRAPHICS
SPEEDOMETER_GRAPHICS
CUSTOM_BAR_GRAPHICS

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="../4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>

View file

@ -3,7 +3,7 @@
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title>TombEngine 1.8 Lua API</title>
<title>TombEngine 1.8.1 Lua API</title>
<link rel="stylesheet" href="ldoc.css" type="text/css" />
</head>
<body>
@ -80,7 +80,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.FeatherMode.html">Effects.FeatherMode</a></li>
<li> <a href="4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</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>
@ -115,7 +115,7 @@
<div id="content">
<h2>TombEngine 1.8 scripting interface</h2>
<h2>TombEngine 1.8.1 scripting interface</h2>
<p>Welcome to the TombEngine scripting API.</p>
<p>Note that this is primarily a reference document, not a tutorial, so expect descriptions to be fairly sparse.
@ -305,7 +305,7 @@ local door = GetMoveableByName("door_type4_14")
<td class="summary">Constants for effect IDs.</td>
</tr>
<tr>
<td class="name" ><a href="4 enums/Effects.FeatherMode.html">Effects.FeatherMode</a></td>
<td class="name" ><a href="4 enums/Effects.StreamerFeatherMode.html">Effects.StreamerFeatherMode</a></td>
<td class="summary">Constants for feather modes.</td>
</tr>
<tr>

View file

@ -1,41 +1,41 @@
# TombEngine
# Tomb Engine
![Logo](https://github.com/MontyTRC89/TombEngine/blob/7c50d26ca898c74978336d41e16ce3ce0c8ecacd/TEN%20logo.png)
TombEngine (TEN) is an open-source, custom level engine which aims to abolish limits and fix bugs of the classic Tomb Raider games, introduce new features while refining old ones, and provide user-friendly level creation process. Current support includes:
- Lua (as the native scripting language)
- Many objects from the original series (1-5)
- Support for high framerate, antialiasing, mipmapping and SSAO
- Full diagonal geometry support
- Uncapped map size
- A streamlined player control scheme.
*Tomb Engine* (*TEN*) is an open-source custom level engine which aims to abolish limits and fix bugs of the classic Tomb Raider games. It aims to introduce new features, refine old ones, and provide a user-friendly level creation process. Current support includes:
- *Lua* as the native scripting language.
- Many objects from the original series (1-5).
- Support for high framerate, antialiasing, mipmapping, and SSAO.
- Full diagonal geometry support.
- Uncapped map size.
- A streamlined player control scheme..
If you would like to participate in TEN discussion with other TEN devs whether it is contributing, bugs or general discussion, then join this discord server: https://discord.gg/h5tUYFmres
Contributions are welcome. If you would like to participate in development to any degree, whether that be through suggestions, bug reports, or code, join our [Discord server](https://discord.gg/h5tUYFmres).
Tomb Engine should be used in conjuction with Tomb Editor. Tomb Editor is also open source written in C#, you can find the repository here: https://github.com/MontyTRC89/Tomb-Editor
*Tomb Engine* is used in conjunction with *Tomb Editor*. The repository can be found [here](https://github.com/MontyTRC89/Tomb-Editor).
# Compiling TombEngine
To compile TEN, ensure you have installed:
- Microsoft Visual Studio
- Tomb Editor (if you would like to create and test levels)
# Compiling *Tomb Engine*
To compile *TEN*, ensure you have installed:
- *Microsoft Visual Studio*
- *Tomb Editor* (for level creation and testing)
Steps:
1) Clone the repository to your GitHub Desktop
2) Open TombEngine.sln
4) Compile the solution
5) Once compiled, create a separate folder to serve as your main TEN directory (or create test TEN project using TombIDE)
6) Copy everything inside the Build folder to the main TEN directory
7) Ensure you have the necessary level data and texture files as well
8) In the case Windows warns about missing DLLs, (bass.dll, etc.) copy the missing DLL files found inside the Libs folder to your main TEN directory.
1) Clone the repository to your GitHub Desktop.
2) Open `TombEngine.sln`.
4) Compile the solution.
5) Once compiled, create a separate folder to serve as your main *TEN* directory (or create a test *TEN* project using *TombIDE*)
6) Copy everything inside the `Build` folder to the main *TEN* directory.
7) Ensure you have the necessary level data and texture files.
8) In case Windows warns about missing DLLs (bass.dll, etc.), copy the missing DLL files found inside the `Libs` folder to your main `TEN` directory.
Visual Studio may also warn about NuGet packages. To fix:
1) Delete the Packages folder
2) Go back to Microsoft Visual Studio
3) Right-click on the TombEngine solution in the Solution Explorer tab and select "Restore NuGet Packages"
4) If it doesn't help, manually install `directxtk_desktop_2019` and `Microsoft.XAudio2.Redist` packages via NuGet Package Manager
*Visual Studio* may warn about NuGet packages. To fix:
1) Delete the `Packages` folder.
2) Go back to *Microsoft Visual Studio*.
3) Right-click on the *TEN* solution in the *Solution Explorer* tab and select "Restore NuGet Packages".
4) If it doesn't help, manually install `directxtk_desktop_2019` and `Microsoft.XAudio2.Redist` packages via NuGet Package Manager.
Once done, you should be able to build a level with TombEditor and run it in TEN.
Once done, you should be able to build a level with *Tomb Editor* and run it in *TEN*.
# Disclaimer
This is a community project which is not affiliated with Core Design, Eidos Interactive, or Embracer Group AB. Tomb Raider is a registered trademark of Embracer Group AB. TombEngine is not be sold. The code is open-source to encourage contributions and to be used for study purposes. We are not responsible for illegal uses of this source code. This source code is released as-is and continues to be maintained by non-paid contributors in their free time.
This community project is unaffiliated with Core Design, Eidos Interactive, or Embracer Group AB. *Tomb Raider* is a registered trademark of Embracer Group AB. *Tomb Engine* is not for sale. The code is open-source to encourage contributions and for study purposes. We are not responsible for illegal uses of this source code. This source code is released as-is and continues to be maintained by non-paid contributors in their free time.

View file

@ -19,7 +19,7 @@ local settings = Flow.Settings.new()
settings.Flare.offset = Vec3(0, 0, 41)
settings.Flare.range = 9
settings.Flare.timeout = 60
settings.Flare.lensflareBrightness = 0.5
settings.Flare.lensflareBrightness = 1.0
settings.Flare.sparks = true
settings.Flare.smoke = true
settings.Flare.flicker = true
@ -35,6 +35,7 @@ local settings = Flow.Settings.new()
settings.System.errorMode = Flow.ErrorMode.WARN
settings.System.fastReload = true
settings.System.multithreaded = true
-- Hair[1] is normal player hair. Types [2] and [3] are for left and right young Lara hair.

View file

@ -27,6 +27,7 @@
#include "Objects/TR4/Entity/tr4_beetle_swarm.h"
#include "Objects/Utils/object_helper.h"
#include "Specific/level.h"
#include "Objects/Effects/Fireflies.h"
using namespace TEN::Effects::Hair;
using namespace TEN::Entities;
@ -174,6 +175,7 @@ void InitializeGameFlags()
FlipEffect = NO_VALUE;
FlipStatus = false;
NumRPickups = 0;
Camera.underwater = false;
}
@ -199,6 +201,7 @@ void InitializeSpecialEffects()
TEN::Entities::TR4::ClearBeetleSwarm();
TEN::Entities::Creatures::TR3::ClearFishSwarm();
TEN::Effects::Fireflies::ClearFireflySwarm();
}
void CustomObjects()
@ -208,6 +211,8 @@ void CustomObjects()
void InitializeObjects()
{
TENLog("Initializing objects...", LogLevel::Info);
AllocTR4Objects();
AllocTR5Objects();
@ -250,10 +255,6 @@ void InitializeObjects()
// User defined objects
CustomObjects();
HairEffect.Initialize();
InitializeSpecialEffects();
NumRPickups = 0;
CurrentSequence = 0;
SequenceResults[0][1][2] = 0;
SequenceResults[0][2][1] = 1;

View file

@ -711,6 +711,10 @@ Vector3i GetJointPosition(const ItemInfo& item, const CreatureBiteInfo& bite)
Vector3 GetJointOffset(GAME_OBJECT_ID objectID, int jointIndex)
{
const auto& object = Objects[objectID];
int boneIndex = object.boneIndex + (jointIndex * 4);
if (g_Level.Bones.size() <= boneIndex)
return Vector3::Zero;
int* bonePtr = &g_Level.Bones[object.boneIndex + (jointIndex * 4)];
return Vector3(*(bonePtr + 1), *(bonePtr + 2), *(bonePtr + 3));

View file

@ -1150,6 +1150,7 @@ bool StalkBox(ItemInfo* item, ItemInfo* enemy, int boxNumber)
{
if (enemy == nullptr || boxNumber == NO_VALUE)
return false;
auto* box = &g_Level.PathfindingBoxes[boxNumber];
int xRange = STALK_DIST + ((box->bottom - box->top) * BLOCK(1));
@ -1635,8 +1636,11 @@ void CreatureMood(ItemInfo* item, AI_INFO* AI, bool isViolent)
auto* LOT = &creature->LOT;
auto* enemy = creature->Enemy;
if (enemy == nullptr)
return;
// HACK: Fallback to bored mood from attack mood if enemy was cleared.
// Replaces previous "fix" with early exit, because it was breaking friendly NPC pathfinding. -- Lwmte, 24.03.25
if (enemy == nullptr && creature->Mood == MoodType::Attack)
creature->Mood = MoodType::Bored;
int boxNumber;
switch (creature->Mood)
@ -1645,7 +1649,7 @@ void CreatureMood(ItemInfo* item, AI_INFO* AI, bool isViolent)
boxNumber = LOT->Node[GetRandomControl() * LOT->ZoneCount >> 15].boxNumber;
if (ValidBox(item, AI->zoneNumber, boxNumber))
{
if (StalkBox(item, enemy, boxNumber) && enemy->HitPoints > 0 && creature->Enemy)
if (StalkBox(item, enemy, boxNumber) && creature->Enemy && enemy->HitPoints > 0)
{
TargetBox(LOT, boxNumber);
creature->Mood = MoodType::Bored;

View file

@ -59,6 +59,7 @@
#include "Specific/Input/Input.h"
#include "Specific/level.h"
#include "Specific/winmain.h"
#include "Objects/Effects/Fireflies.h"
using namespace std::chrono;
using namespace TEN::Effects;
@ -89,6 +90,7 @@ using namespace TEN::Math;
using namespace TEN::Renderer;
using namespace TEN::Entities::Creatures::TR3;
using namespace TEN::Entities::Effects;
using namespace TEN::Effects::Fireflies;
constexpr auto DEATH_NO_INPUT_TIMEOUT = 10 * FPS;
constexpr auto DEATH_INPUT_TIMEOUT = 3 * FPS;
@ -211,6 +213,7 @@ GameStatus GamePhase(bool insideMenu)
UpdateLocusts();
UpdateUnderwaterBloodParticles();
UpdateFishSwarm();
UpdateFireflySwarm();
UpdateGlobalLensFlare();
// Update HUD.
@ -389,6 +392,7 @@ GameStatus DoLevel(int levelIndex, bool loadGame)
InitializeCamera();
InitializeSpotCamSequences(isTitle);
InitializeItemBoxData();
InitializeSpecialEffects();
// Initialize scripting.
InitializeScripting(levelIndex, loadGame);

View file

@ -17,6 +17,7 @@
#include "Game/Setup.h"
#include "Sound/sound.h"
#include "Specific/level.h"
#include "Objects/Effects/Fireflies.h"
#include "Objects/Generic/puzzles_keys.h"
#include "Objects/TR3/Entity/FishSwarm.h"
#include "Objects/TR4/Entity/tr4_beetle_swarm.h"
@ -29,6 +30,7 @@ using namespace TEN::Effects::Environment;
using namespace TEN::Effects::Footprint;
using namespace TEN::Effects::Hair;
using namespace TEN::Entities::Creatures::TR3;
using namespace TEN::Effects::Fireflies;
int FlipEffect;
@ -90,6 +92,7 @@ void ClearSwarmEnemies(ItemInfo* item)
ClearBeetleSwarm();
ClearLocusts();
ClearFishSwarm();
ClearFireflySwarm();
}
void FlashOrange(ItemInfo* item)

View file

@ -690,7 +690,7 @@ namespace TEN::Gui
CurrentSettings.IgnoreInput = true;
}
if (CurrentSettings.NewKeyWaitTimer > 0.0f)
if (CurrentSettings.NewKeyWaitTimer > 0)
{
ClearAllActions();
@ -699,15 +699,15 @@ namespace TEN::Gui
bool legacy30FpsDoneDraw = false;
bool decreaseCounter = false;
while (CurrentSettings.NewKeyWaitTimer > 0.0f)
while (CurrentSettings.NewKeyWaitTimer > 0)
{
g_Synchronizer.Sync();
while (g_Synchronizer.Synced())
{
CurrentSettings.NewKeyWaitTimer -= 1.0f;
if (CurrentSettings.NewKeyWaitTimer <= 0.0f)
CurrentSettings.NewKeyWaitTimer = 0.0f;
CurrentSettings.NewKeyWaitTimer--;
if (CurrentSettings.NewKeyWaitTimer <= 0)
CurrentSettings.NewKeyWaitTimer = 0;
if (!fromPauseMenu)
{
@ -760,7 +760,7 @@ namespace TEN::Gui
g_Bindings.SetKeyBinding(InputDeviceID::Custom, InputActionID(baseIndex + SelectedOption), selectedKeyID);
DefaultConflict();
CurrentSettings.NewKeyWaitTimer = 0.0f;
CurrentSettings.NewKeyWaitTimer = 0;
CurrentSettings.IgnoreInput = true;
return;
}
@ -850,6 +850,7 @@ namespace TEN::Gui
if (SelectedOption == (OptionCount - 2))
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
ApplyDefaultBindings();
return;
}
@ -858,9 +859,11 @@ namespace TEN::Gui
if (SelectedOption == (OptionCount - 1))
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
CurrentSettings.Configuration.Bindings = g_Bindings.GetBindingProfile(InputDeviceID::Custom);
g_Configuration.Bindings = g_Bindings.GetBindingProfile(InputDeviceID::Custom);
SaveConfiguration();
MenuToDisplay = fromPauseMenu ? Menu::Pause : Menu::Options;
SelectedOption = 2;
return;
@ -870,7 +873,9 @@ namespace TEN::Gui
if (SelectedOption == OptionCount)
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
g_Bindings.SetBindingProfile(InputDeviceID::Custom, CurrentSettings.Configuration.Bindings);
MenuToDisplay = fromPauseMenu ? Menu::Pause : Menu::Options;
SelectedOption = 2;
return;
@ -881,6 +886,8 @@ namespace TEN::Gui
{
SoundEffect(SFX_TR4_MENU_SELECT, nullptr, SoundEnvironment::Always);
g_Bindings.SetBindingProfile(InputDeviceID::Custom, CurrentSettings.Configuration.Bindings);
MenuToDisplay = Menu::Options;
SelectedOption = 2;
}

View file

@ -113,7 +113,7 @@ namespace TEN::Gui
int SelectedScreenResolution = 0;
bool IgnoreInput = false; // Ignore input until all actions are inactive.
float NewKeyWaitTimer = 0.0f;
int NewKeyWaitTimer = 0;
};
class GuiController

View file

@ -10,6 +10,7 @@
#include "Game/control/flipeffect.h"
#include "Game/control/lot.h"
#include "Game/control/volume.h"
#include "Objects/Effects/Fireflies.h"
#include "Game/effects/item_fx.h"
#include "Game/effects/effects.h"
#include "Game/effects/weather.h"
@ -43,8 +44,9 @@
using namespace flatbuffers;
using namespace TEN::Collision::Floordata;
using namespace TEN::Control::Volumes;
using namespace TEN::Effects::Items;
using namespace TEN::Effects::Environment;
using namespace TEN::Effects::Fireflies;
using namespace TEN::Effects::Items;
using namespace TEN::Entities::Creatures::TR3;
using namespace TEN::Entities::Generic;
using namespace TEN::Entities::Switches;
@ -924,6 +926,38 @@ const std::vector<byte> SaveGame::Build()
}
auto fishSwarmOffset = fbb.CreateVector(fishSwarm);
std::vector<flatbuffers::Offset<Save::FireflyData>> fireflySwarm;
for (const auto& firefly : FireflySwarm)
{
Save::FireflyDataBuilder fireflySave{ fbb };
fireflySave.add_sprite_index(firefly.SpriteSeqID);
fireflySave.add_sprite_id(firefly.SpriteID);
fireflySave.add_blend_mode((int)firefly.blendMode);
fireflySave.add_scalar(firefly.scalar);
fireflySave.add_position(&FromVector3(firefly.Position));
fireflySave.add_room_number(firefly.RoomNumber);
fireflySave.add_position_target(&FromVector3(firefly.PositionTarget));
fireflySave.add_orientation(&FromEulerAngles(firefly.Orientation));
fireflySave.add_velocity(firefly.Velocity);
fireflySave.add_target_item_number((firefly.TargetItemPtr == nullptr) ? -1 : firefly.TargetItemPtr->Index);
fireflySave.add_z_vel(firefly.zVel);
fireflySave.add_life(firefly.Life);
fireflySave.add_number(firefly.Number);
fireflySave.add_d_r(firefly.rB);
fireflySave.add_d_g(firefly.gB);
fireflySave.add_d_b(firefly.bB);
fireflySave.add_r(firefly.r);
fireflySave.add_g(firefly.g);
fireflySave.add_b(firefly.b);
fireflySave.add_on(firefly.on);
fireflySave.add_size(firefly.size);
fireflySave.add_rot_Ang(firefly.rotAng);
auto fireflySaveOffset = fireflySave.Finish();
fireflySwarm.push_back(fireflySaveOffset);
}
auto fireflySwarmOffset = fbb.CreateVector(fireflySwarm);
// TODO: In future, we should save only active FX, not whole array.
// This may come together with Monty's branch merge -- Lwmte, 10.07.22
@ -1545,6 +1579,7 @@ const std::vector<byte> SaveGame::Build()
sgb.add_next_item_active(NextItemActive);
sgb.add_items(serializedItemsOffset);
sgb.add_fish_swarm(fishSwarmOffset);
sgb.add_firefly_swarm(fireflySwarmOffset);
sgb.add_fxinfos(serializedEffectsOffset);
sgb.add_next_fx_free(NextFxFree);
sgb.add_next_fx_active(NextFxActive);
@ -2289,6 +2324,38 @@ static void ParseEffects(const Save::SaveGame* s)
FishSwarm.push_back(fish);
}
// Load firefly swarm.
for (int i = 0; i < s->firefly_swarm()->size(); i++)
{
const auto& fireflySave = s->firefly_swarm()->Get(i);
auto firefly = FireflyData{};
firefly.SpriteSeqID = fireflySave->sprite_index();
firefly.SpriteID = fireflySave->sprite_id();
firefly.blendMode = (BlendMode)fireflySave->blend_mode();
firefly.scalar = fireflySave->scalar();
firefly.Position = ToVector3(fireflySave->position());
firefly.RoomNumber = fireflySave->room_number();
firefly.PositionTarget = ToVector3(fireflySave->position_target());
firefly.Orientation = ToEulerAngles(fireflySave->orientation());
firefly.Velocity = fireflySave->velocity();
firefly.TargetItemPtr = (fireflySave->target_item_number() == -1) ? nullptr : &g_Level.Items[fireflySave->target_item_number()];
firefly.zVel = fireflySave->z_vel();
firefly.Life = fireflySave->life();
firefly.Number = fireflySave->number();
firefly.rB = fireflySave->d_r();
firefly.gB = fireflySave->d_g();
firefly.bB = fireflySave->d_b();
firefly.r = fireflySave->r();
firefly.g = fireflySave->g();
firefly.b = fireflySave->b();
firefly.on = fireflySave->on();
firefly.size = fireflySave->size();
firefly.rotAng = fireflySave->rot_Ang();
FireflySwarm.push_back(firefly);
}
// Load particles.
for (int i = 0; i < s->particles()->size(); i++)
{

View file

@ -839,7 +839,7 @@ int Spline(int x, int* knots, int nk)
return ((__int64)x * (((__int64)x * (((__int64)x * c1 >> 16) + c2) >> 16) + (k[2] >> 1) + ((-k[0] - 1) >> 1)) >> 16) + k[1];
}
Pose GetCameraTransform(int sequence, float alpha)
Pose GetCameraTransform(int sequence, float alpha, bool loop)
{
alpha = std::clamp(alpha, 0.0f, 1.0f);
@ -873,15 +873,43 @@ Pose GetCameraTransform(int sequence, float alpha)
}
// Compute spline interpolation of main flyby camera parameters.
auto origin = Vector3(Spline(splineAlpha, xOrigins.data(), splinePoints),
Spline(splineAlpha, yOrigins.data(), splinePoints),
Spline(splineAlpha, zOrigins.data(), splinePoints));
auto getInterpolatedPoint = [&](float t, std::vector<int>& x, std::vector<int>& y, std::vector<int>& z)
{
int tAlpha = int(t * (float)USHRT_MAX);
return Vector3(Spline(tAlpha, x.data(), splinePoints),
Spline(tAlpha, y.data(), splinePoints),
Spline(tAlpha, z.data(), splinePoints));
};
auto target = Vector3(Spline(splineAlpha, xTargets.data(), splinePoints),
Spline(splineAlpha, yTargets.data(), splinePoints),
Spline(splineAlpha, zTargets.data(), splinePoints));
auto getInterpolatedRoll = [&](float t)
{
int tAlpha = int(t * (float)USHRT_MAX);
return Spline(tAlpha, rolls.data(), splinePoints);
};
short orientZ = Spline(splineAlpha, rolls.data(), splinePoints);
Vector3 origin = {};
Vector3 target = {};
short orientZ = 0;
constexpr float BLEND_RANGE = 0.1f;
constexpr float BLEND_START = BLEND_RANGE;
constexpr float BLEND_END = 1.0f - BLEND_RANGE;
// If loop is enabled and we are at the start or end of the sequence, blend between the last and first cameras.
if (loop && (alpha < BLEND_START || alpha >= BLEND_END))
{
float blendFactor = (alpha < BLEND_START) ? 0.5f + (alpha / BLEND_RANGE) * 0.5f : (alpha - BLEND_END) / BLEND_START * 0.5f;
origin = Vector3::Lerp(getInterpolatedPoint(BLEND_END, xOrigins, yOrigins, zOrigins), getInterpolatedPoint(BLEND_START, xOrigins, yOrigins, zOrigins), blendFactor);
target = Vector3::Lerp(getInterpolatedPoint(BLEND_END, xTargets, yTargets, zTargets), getInterpolatedPoint(BLEND_START, xTargets, yTargets, zTargets), blendFactor);
orientZ = Lerp(getInterpolatedRoll(BLEND_END), getInterpolatedRoll(BLEND_START), blendFactor);
}
else
{
origin = getInterpolatedPoint(alpha, xOrigins, yOrigins, zOrigins);
target = getInterpolatedPoint(alpha, xTargets, yTargets, zTargets);
orientZ = getInterpolatedRoll(alpha);
}
auto pose = Pose(origin, EulerAngles(target - origin));
pose.Orientation.z = orientZ;

View file

@ -64,4 +64,4 @@ void InitializeSpotCam(short sequence);
void CalculateSpotCameras();
int Spline(int x, int* knots, int nk);
Pose GetCameraTransform(int sequence, float alpha);
Pose GetCameraTransform(int sequence, float alpha, bool loop);

View file

@ -0,0 +1,445 @@
#include "framework.h"
#include "Objects/Effects/Fireflies.h"
#include "Game/collision/collide_item.h"
#include "Game/collision/collide_room.h"
#include "Game/collision/Point.h"
#include "Game/control/box.h"
#include "Game/control/flipeffect.h"
#include "Game/effects/effects.h"
#include "Game/effects/Streamer.h"
#include "Game/effects/tomb4fx.h"
#include "Game/items.h"
#include "Game/Lara/lara.h"
#include "Game/Lara/lara_helpers.h"
#include "Game/misc.h"
#include "Game/Setup.h"
#include "Math/Math.h"
#include "Renderer/Renderer.h"
#include "Specific/clock.h"
#include "Specific/level.h"
using namespace TEN::Collision::Point;
using namespace TEN::Math;
using namespace TEN::Renderer;
using namespace TEN::Effects::Streamer;
namespace TEN::Effects::Fireflies
{
constexpr auto FIREFLY_COHESION_FACTOR = 600.1f;
constexpr auto FIREFLY_SPACING_FACTOR = 600.0f;
constexpr auto FIREFLY_CATCH_UP_FACTOR = 0.2f;
constexpr auto FIREFLY_TARGET_DISTANCE_MAX = SQUARE(BLOCK(1.0f));
constexpr auto FIREFLY_BASE_SEPARATION_DISTANCE = 10.0f;
constexpr auto FIREFLY_FLEE_DISTANCE = BLOCK(0.7);
constexpr auto MAX_FIREFLIES = 92;
constexpr auto DEFAULT_FIREFLY_COUNT = 20;
constexpr auto FIREFLY_RISE_UP_FACTOR = 200;
constexpr auto MAX_AREA_RANGE = 8;
constexpr auto LIGHT_ALPHA_CYCLE_DURATION = 120.0f;
std::vector<FireflyData> FireflySwarm = {};
std::unordered_map<int, int> nextFireflyNumberMap; // Numbering the Fireflies for Streamer effect.
void InitializeFireflySwarm(short itemNumber)
{
auto& item = g_Level.Items[itemNumber];
item.Animation.Velocity.z = Random::GenerateFloat(32.0f, 160.0f);
item.HitPoints = DEFAULT_FIREFLY_COUNT;
item.ItemFlags[FirefliesItemFlags::TargetItemPtr] = item.Index;
item.ItemFlags[FirefliesItemFlags::Light] = 1; // 0 = Turn off light effect, 1 = turn on light (DEFAULT).
item.ItemFlags[FirefliesItemFlags::TriggerFlags] = std::clamp((int)item.TriggerFlags, -MAX_AREA_RANGE, MAX_AREA_RANGE);
item.ItemFlags[FirefliesItemFlags::Spawncounter] = 0;
item.ItemFlags[FirefliesItemFlags::RemoveFliesEffect] = 0;
// Firefly numbers that has the light.
item.ItemFlags[FirefliesItemFlags::LightIndex1] = NO_VALUE;
item.ItemFlags[FirefliesItemFlags::LightIndex2] = NO_VALUE;
}
void SpawnFireflySwarm(ItemInfo& item, int triggerFlags)
{
constexpr auto VEL_MAX = 34.0f;
constexpr auto VEL_MIN = 6.0f;
// Create new firefly.
auto& firefly = GetNewEffect(FireflySwarm, MAX_FIREFLIES);
unsigned char r = 255;
unsigned char g = 255;
unsigned char b = 255;
if (triggerFlags >= 0)
{
float brightnessShift = Random::GenerateFloat(-0.1f, 0.1f);
r = std::clamp(item.Model.Color.x / 2.0f + brightnessShift, 0.0f, 1.0f) * UCHAR_MAX;
g = std::clamp(item.Model.Color.y / 2.0f + brightnessShift, 0.0f, 1.0f) * UCHAR_MAX;
b = std::clamp(item.Model.Color.z / 2.0f + brightnessShift, 0.0f, 1.0f) * UCHAR_MAX;
firefly.SpriteSeqID = ID_FIREFLY_SPRITES;
firefly.SpriteID = 0;
firefly.blendMode = BlendMode::Additive;
firefly.scalar = 3.0f;
firefly.size = 1.0f;
}
else
{
firefly.SpriteSeqID = ID_FIREFLY_SPRITES;
firefly.SpriteID = 1;
firefly.blendMode = BlendMode::Subtractive;
firefly.scalar = 1.2f;
firefly.size = 1.2f;
}
firefly.r = firefly.rB = r;
firefly.g = firefly.gB = g;
firefly.b = firefly.bB = b;
firefly.rotAng = ANGLE(0.0f);
if (item.TriggerFlags > 8)
firefly.rotAng = ANGLE(90.0f);
firefly.on = true;
firefly.Position = item.Pose.Position.ToVector3();
firefly.RoomNumber = item.RoomNumber;
firefly.Orientation = item.Pose.Orientation;
firefly.Velocity = Random::GenerateFloat(VEL_MIN, VEL_MAX);
firefly.zVel = 0.3f;
firefly.Life = Random::GenerateInt(1, 400);
firefly.TargetItemPtr = &g_Level.Items[item.ItemFlags[FirefliesItemFlags::TargetItemPtr]];
int& nextFireflyNumber = nextFireflyNumberMap[item.Index];
firefly.Number = nextFireflyNumber++;
}
void ControlFireflySwarm(short itemNumber)
{
auto& item = g_Level.Items[itemNumber];
if (!TriggerActive(&item))
{
// Remove all fireflies associated with this item.
RemoveFireflies(item);
// Reset ItemFlags.
if (item.HitPoints == NOT_TARGETABLE)
item.HitPoints = item.ItemFlags[FirefliesItemFlags::Spawncounter];
item.ItemFlags[FirefliesItemFlags::Spawncounter] = 0;
item.ItemFlags[FirefliesItemFlags::LightIndex1] = NO_VALUE;
item.ItemFlags[FirefliesItemFlags::LightIndex2] = NO_VALUE;
return;
}
constexpr auto ALPHA_PAUSE_DURATION = 2.0f;
static float frameCounter = 0.0f;
// Increment the counter variable in each frame.
frameCounter += 1.0f;
if (item.HitPoints != NOT_TARGETABLE)
{
int fireflyCount = item.HitPoints - item.ItemFlags[FirefliesItemFlags::Spawncounter];
if (fireflyCount < 0)
{
int firefliesToTurnOff = -fireflyCount;
for (auto& firefly : FireflySwarm)
{
if (firefly.TargetItemPtr == &item && firefly.Life > 0.0f)
{
firefly.Life = 0.0f;
firefly.on = false;
firefliesToTurnOff--;
if (firefliesToTurnOff == 0)
break;
}
}
}
else if (fireflyCount > 0)
{
for (int i = 0; i < fireflyCount; i++)
{
SpawnFireflySwarm(item, item.TriggerFlags);
}
}
item.ItemFlags[FirefliesItemFlags::Spawncounter] = item.HitPoints;
item.HitPoints = NOT_TARGETABLE;
}
// Update color values for blinking effect.
float alphaFactor;
for (auto& firefly : FireflySwarm)
{
auto targetItem = firefly.TargetItemPtr;
if (targetItem == &item)
{
// Choose one of the available firefly number that has the light.
if (targetItem->ItemFlags[FirefliesItemFlags::LightIndex1] == NO_VALUE && targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
{
targetItem->ItemFlags[FirefliesItemFlags::LightIndex1] = Random::GenerateInt(0, targetItem->TriggerFlags);
}
// Two lights max for each cluster.
if (targetItem->ItemFlags[FirefliesItemFlags::LightIndex2] == NO_VALUE && targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
{
targetItem->ItemFlags[FirefliesItemFlags::LightIndex2] = Random::GenerateInt(0, targetItem->TriggerFlags);
}
auto posBase = firefly.Position;
auto rotMatrix = firefly.Orientation.ToRotationMatrix();
auto pos = posBase + Vector3::Transform(Vector3(0, 0, 30), rotMatrix);
auto direction0 = Geometry::RotatePoint(posBase, EulerAngles::Identity);
short orient2D = firefly.Orientation.z;
if (targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
{
StreamerEffect.Spawn(targetItem->Index, firefly.Number, pos, direction0, orient2D,
Vector4(firefly.r / (float)UCHAR_MAX, firefly.g / (float)UCHAR_MAX, firefly.b / (float)UCHAR_MAX, 1.0f),
Vector4::Zero,
6.3f - (firefly.zVel / 12), ((firefly.Velocity / 8) + firefly.zVel * 3) / (float)UCHAR_MAX, 0.0f, -0.1f, 90.0f, StreamerFeatherMode::None, BlendMode::Additive);
}
else if (targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] < 0)
{
StreamerEffect.Spawn(targetItem->Index, firefly.Number, pos, direction0, orient2D,
Vector4((firefly.r / 2) / (float)UCHAR_MAX, (firefly.g / 2) / (float)UCHAR_MAX, (firefly.b / 2) / (float)UCHAR_MAX, 0.2f),
Vector4((firefly.r / 3) / (float)UCHAR_MAX, (firefly.g / 3) / (float)UCHAR_MAX, (firefly.b / 3) / (float)UCHAR_MAX, 0.2f),
0.0f, 0.4f, 0.0f, 0.2f, 0.0f, StreamerFeatherMode::None, BlendMode::Subtractive);
}
if ((targetItem->ItemFlags[FirefliesItemFlags::LightIndex1] == firefly.Number || targetItem->ItemFlags[FirefliesItemFlags::LightIndex2] == firefly.Number) &&
targetItem->ItemFlags[FirefliesItemFlags::Light] == 1)
{
float totalCycleDuration = 2 * (LIGHT_ALPHA_CYCLE_DURATION + ALPHA_PAUSE_DURATION);
float alphaTime = fmod(frameCounter, totalCycleDuration);
if (alphaTime < ALPHA_PAUSE_DURATION)
{
alphaFactor = 1.0f; // Pause on Alpha 1.
}
else if (alphaTime < ALPHA_PAUSE_DURATION + LIGHT_ALPHA_CYCLE_DURATION)
{
alphaFactor = 1.0f - ((alphaTime - ALPHA_PAUSE_DURATION) / LIGHT_ALPHA_CYCLE_DURATION);
}
else if (alphaTime < 2 * ALPHA_PAUSE_DURATION + LIGHT_ALPHA_CYCLE_DURATION)
{
alphaFactor = 0.0f; // Pause on Alpha 0.
targetItem->ItemFlags[FirefliesItemFlags::LightIndex1] = NO_VALUE;
targetItem->ItemFlags[FirefliesItemFlags::LightIndex2] = NO_VALUE;
}
else
{
alphaFactor = (alphaTime - 2 * ALPHA_PAUSE_DURATION - LIGHT_ALPHA_CYCLE_DURATION) / LIGHT_ALPHA_CYCLE_DURATION;
}
SpawnDynamicLight(firefly.Position.x, firefly.Position.y, firefly.Position.z, 3,
static_cast<unsigned char>(std::clamp(firefly.r * alphaFactor, 0.0f, (float)firefly.r)),
static_cast<unsigned char>(std::clamp(firefly.g * alphaFactor, 0.0f, (float)firefly.g)),
static_cast<unsigned char>(std::clamp(firefly.b * alphaFactor, 0.0f, (float)firefly.b)));
}
}
}
}
void UpdateFireflySwarm()
{
constexpr auto FLEE_VEL = 1.5f;
constexpr auto ALPHA_PAUSE_DURATION = 100.0f;
static const auto SPHERE = BoundingSphere(Vector3::Zero, BLOCK(1 / 8.0f));
if (FireflySwarm.empty())
return;
const auto& playerItem = *LaraItem;
static float frameCounter = 0.0f;
// Increment the counter variable in each frame.
frameCounter += 1.0f;
for (auto& firefly : FireflySwarm)
{
if (firefly.Life <= 0.0f || !firefly.on)
continue;
auto targetItem = firefly.TargetItemPtr;
if (targetItem->ItemFlags[FirefliesItemFlags::RemoveFliesEffect])
{
firefly.r = 0;
firefly.g = 0;
firefly.b = 0;
continue;
}
firefly.StoreInterpolationData();
firefly.PositionTarget = Random::GeneratePointInSphere(SPHERE);
int multiplierX = CLICK(targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] * 2);
int multiplierY = CLICK(targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] * 4);
int multiplierZ = CLICK(targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] * 2);
auto spheroidAxis = Vector3(multiplierX, multiplierY, multiplierZ);
auto itemPos = Vector3i(targetItem->Pose.Position.x, targetItem->Pose.Position.y - FIREFLY_RISE_UP_FACTOR, targetItem->Pose.Position.z);
// Calculate desired position based on target object and random offsets.
auto desiredPos = itemPos + Random::GeneratePointInSpheroid(firefly.PositionTarget, EulerAngles::Identity, spheroidAxis);
auto dir = desiredPos - firefly.Position;
auto dirs = dir.ToVector3();
dirs.Normalize();
auto dirNorm = dirs;
// Define cohesion factor to keep fireflies close together.
float distToTarget = dirs.Length();
float targetVel = (distToTarget * FIREFLY_COHESION_FACTOR) + Random::GenerateFloat(3.0f, 5.0f);
firefly.Velocity = std::min(targetVel, targetItem->Animation.Velocity.z - 21.0f);
// If firefly is too far from target, increase velocity to catch up.
if (distToTarget > FIREFLY_TARGET_DISTANCE_MAX)
firefly.Velocity += FIREFLY_CATCH_UP_FACTOR;
// Translate.
auto moveDir = firefly.Orientation.ToDirection();
moveDir.Normalize();
firefly.Position += (moveDir * firefly.Velocity) / 26.0f;
firefly.Position += (moveDir * FIREFLY_SPACING_FACTOR) / 26.0f;
auto orientTo = Geometry::GetOrientToPoint(firefly.Position, desiredPos.ToVector3());
firefly.Orientation.Lerp(orientTo, 0.1f);
// Update color values for blinking effect.
float totalCycleDuration = 2 * (LIGHT_ALPHA_CYCLE_DURATION + ALPHA_PAUSE_DURATION);
float alphaTime = fmod(frameCounter + firefly.Life, totalCycleDuration);
float alphaFactor;
if (alphaTime < ALPHA_PAUSE_DURATION)
{
alphaFactor = 1.0f;
}
else if (alphaTime < ALPHA_PAUSE_DURATION + LIGHT_ALPHA_CYCLE_DURATION)
{
alphaFactor = 1.0f - ((alphaTime - ALPHA_PAUSE_DURATION) / LIGHT_ALPHA_CYCLE_DURATION);
}
else if (alphaTime < 2 * ALPHA_PAUSE_DURATION + LIGHT_ALPHA_CYCLE_DURATION)
{
alphaFactor = 0.0f;
}
else
{
alphaFactor = (alphaTime - 2 * ALPHA_PAUSE_DURATION - LIGHT_ALPHA_CYCLE_DURATION) / LIGHT_ALPHA_CYCLE_DURATION;
}
firefly.r = static_cast<unsigned char>(firefly.rB * alphaFactor);
firefly.g = static_cast<unsigned char>(firefly.gB * alphaFactor);
firefly.b = static_cast<unsigned char>(firefly.bB * alphaFactor);
for (const auto& otherFirefly : FireflySwarm)
{
if (&firefly == &otherFirefly)
continue;
float distToOtherFirefly = Vector3i::Distance(firefly.Position, otherFirefly.Position);
float distToPlayer = Vector3i::Distance(firefly.Position, playerItem.Pose.Position);
// If player is too close, flee.
if (distToPlayer < FIREFLY_FLEE_DISTANCE && playerItem.Animation.ActiveState != 2)
{
auto separationDir = firefly.Position - playerItem.Pose.Position.ToVector3();
separationDir.Normalize();
// Reduce the Y component of the escape direction.
separationDir.y *= Random::GenerateFloat(0.0f, 0.4f);
// Normalize the direction again to get the length of the vector.
separationDir.Normalize();
firefly.Position += separationDir * FLEE_VEL;
auto orientTo = Geometry::GetOrientToPoint(firefly.Position, separationDir);
firefly.Orientation.Lerp(orientTo, 0.05f);
firefly.Velocity -= std::min(FLEE_VEL, firefly.TargetItemPtr->Animation.Velocity.z - 1.0f);
if (Random::TestProbability(1.0f / 700.0f) &&
targetItem->ItemFlags[FirefliesItemFlags::Light] == 1 &&
targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
{
if (firefly.zVel == 0.3f)
{
firefly.zVel = 50.0f;
}
}
if (firefly.zVel > 50.0f)
firefly.zVel = 0.3f;
}
if (distToOtherFirefly < FIREFLY_BASE_SEPARATION_DISTANCE)
{
auto separationDir = firefly.Position - otherFirefly.Position;
separationDir.Normalize();
firefly.Position += separationDir * (FIREFLY_BASE_SEPARATION_DISTANCE - distToOtherFirefly);
}
}
auto pointColl = GetPointCollision(firefly.Position, firefly.RoomNumber);
// Update firefly room number.
if (pointColl.GetRoomNumber() != firefly.RoomNumber &&
pointColl.GetRoomNumber() != NO_VALUE)
{
firefly.RoomNumber = pointColl.GetRoomNumber();
}
if (targetItem->ItemFlags[FirefliesItemFlags::Light] == 1 && targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
{
if (Random::TestProbability(1.0f / (700.0f - (float)(targetItem->ItemFlags[FirefliesItemFlags::Spawncounter] * 2))))
firefly.zVel = 100.0f;
if (firefly.zVel > 1.0f)
firefly.zVel -= 2.0f;
if (firefly.zVel <= 1.0f)
firefly.zVel = 0.3f;
}
}
}
void RemoveFireflies(ItemInfo& item)
{
FireflySwarm.erase(std::remove_if(FireflySwarm.begin(), FireflySwarm.end(),
[&item](FireflyData& firefly)
{
if (firefly.TargetItemPtr == &item)
{
firefly.Life = 0.0f;
firefly.on = false;
return true;
}
return false;
}), FireflySwarm.end());
nextFireflyNumberMap.erase(item.Index);
}
void ClearFireflySwarm()
{
FireflySwarm.clear();
nextFireflyNumberMap.clear();
}
}

View file

@ -0,0 +1,76 @@
#pragma once
#include "Game/items.h"
#include "Math/Math.h"
using namespace TEN::Math;
namespace TEN::Effects::Fireflies
{
enum FirefliesItemFlags
{
TargetItemPtr,
Light,
TriggerFlags,
Spawncounter,
RemoveFliesEffect,
LightIndex1,
LightIndex2
};
struct FireflyData
{
int SpriteSeqID = ID_DEFAULT_SPRITES;
int SpriteID = SPR_UNDERWATERDUST;
BlendMode blendMode;
unsigned int scalar;
Vector3 Position = Vector3::Zero;
int RoomNumber = 0;
Vector3 PositionTarget = Vector3::Zero;
EulerAngles Orientation = EulerAngles::Identity;
float Velocity = 0.0f;
ItemInfo* TargetItemPtr = nullptr;
float zVel;
float Life = 0.0f;
int Number = 0;
unsigned char rB;
unsigned char gB;
unsigned char bB;
unsigned char r;
unsigned char g;
unsigned char b;
bool on;
float size;
short rotAng;
int PrevX;
int PrevY;
int PrevZ;
byte PrevR;
byte PrevG;
byte PrevB;
void StoreInterpolationData()
{
PrevX = Position.x;
PrevY = Position.y;
PrevZ = Position.z;
PrevR = r;
PrevG = g;
PrevB = b;
}
};
extern std::vector<FireflyData> FireflySwarm;
void InitializeFireflySwarm(short itemNumber);
void ControlFireflySwarm(short itemNumber);
void UpdateFireflySwarm();
void ClearFireflySwarm();
void SpawnFireflySwarm(ItemInfo& item, int triggerFlags);
void RemoveFireflies(ItemInfo& item);
}

View file

@ -17,6 +17,7 @@
#include "Game/Lara/lara_helpers.h"
#include "Game/Setup.h"
#include "Math/Math.h"
#include "Objects/Effects/Fireflies.h"
#include "Scripting/Include/Flow/ScriptInterfaceFlowHandler.h"
#include "Sound/sound.h"
#include "Specific/level.h"
@ -25,9 +26,13 @@ using namespace TEN::Collision::Point;
using namespace TEN::Effects::Ripple;
using namespace TEN::Effects::Splash;
using namespace TEN::Math;
using namespace TEN::Effects::Fireflies;
namespace TEN::Entities::TR3
{
constexpr auto FLY_EFFECT_MAX_WIDTH = -1;
constexpr auto FLY_AMOUNT = 16;
enum CorpseState
{
CORPSE_STATE_GROUNDED = 0,
@ -51,19 +56,25 @@ namespace TEN::Entities::TR3
if (item.TriggerFlags == 1)
{
item.ItemFlags[1] = (int)CorpseFlag::Hang;
item.ItemFlags[7] = (int)CorpseFlag::Hang;
item.Animation.AnimNumber = object.animIndex + CORPSE_ANIM_HANG;
item.Animation.ActiveState = CORPSE_STATE_HANG;
}
else
{
item.ItemFlags[1] = (int)CorpseFlag::Grounded;
item.ItemFlags[7] = (int)CorpseFlag::Grounded;
item.Animation.AnimNumber = object.animIndex + CORPSE_ANIM_GROUNDED;
item.Animation.ActiveState = CORPSE_STATE_GROUNDED;
}
item.ItemFlags[FirefliesItemFlags::RemoveFliesEffect] = 0;
AddActiveItem(itemNumber);
item.Status = ITEM_ACTIVE;
item.ItemFlags[FirefliesItemFlags::TargetItemPtr] = item.Index;
item.ItemFlags[FirefliesItemFlags::TriggerFlags] = -1;
item.HitPoints = FLY_AMOUNT;
}
void ControlCorpse(short itemNumber)
@ -71,9 +82,11 @@ namespace TEN::Entities::TR3
auto& item = g_Level.Items[itemNumber];
const auto& object = Objects[item.ObjectNumber];
if (item.ItemFlags[1] == (int)CorpseFlag::Fall)
if (item.ItemFlags[7] == (int)CorpseFlag::Fall)
{
bool isWater = TestEnvironment(RoomEnvFlags::ENV_FLAG_WATER, item.RoomNumber);
bool isSwamp = TestEnvironment(RoomEnvFlags::ENV_FLAG_SWAMP, item.RoomNumber);
float verticalVelCoeff = isWater ? 81.0f : 1.0f;
auto pointColl = GetPointCollision(item);
@ -94,31 +107,37 @@ namespace TEN::Entities::TR3
ItemNewRoom(itemNumber, pointColl.GetRoomNumber());
}
pointColl = GetPointCollision(item);
// Remove fly effect when in water.
if (isWater || isSwamp)
{
item.ItemFlags[FirefliesItemFlags::RemoveFliesEffect] = 1;
}
auto bounds = GameBoundingBox(&item);
item.Animation.IsAirborne = true;
if (pointColl.GetFloorHeight() < item.Pose.Position.y)
if (pointColl.GetFloorHeight() <= item.Pose.Position.y - bounds.Y2)
{
if (!isWater)
{
item.Pose.Position.y = item.Pose.Position.y - item.Animation.Velocity.y;
item.Pose.Position.y = pointColl.GetFloorHeight();
SoundEffect(SFX_TR4_CROCGOD_LAND, &item.Pose);
}
else
{
item.Pose.Position.y = item.Pose.Position.y;
item.Pose.Position.y = pointColl.GetFloorHeight();
}
item.Animation.IsAirborne = false;
item.Animation.Velocity = Vector3::Zero;
item.Animation.TargetState = CORPSE_STATE_LAND;
item.Animation.AnimNumber = object.animIndex + CORPSE_ANIM_LAND;
AlignEntityToSurface(&item, Vector2(object.radius));
item.ItemFlags[1] = (int)CorpseFlag::Grounded;
item.ItemFlags[7] = (int)CorpseFlag::Grounded;
return;
}
else
else if (item.Animation.ActiveState == CORPSE_STATE_FALL)
{
if (isWater)
{
@ -133,17 +152,56 @@ namespace TEN::Entities::TR3
AnimateItem(&item);
if (!TriggerActive(&item))
return;
if (!TriggerActive(&item) || item.ItemFlags[FirefliesItemFlags::RemoveFliesEffect] == 1)
{
// Remove all fireflies associated with this item.
RemoveFireflies(item);
int meshCount = object.nmeshes;
for (int i = 0; i < meshCount; i++)
{
if (Random::TestProbability(1 / 72.0f))
{
auto pos = GetJointPosition(&item, i).ToVector3();
SpawnCorpseEffect(pos);
// Reset ItemFlags.
if (item.HitPoints == NOT_TARGETABLE)
item.HitPoints = FLY_AMOUNT;
item.ItemFlags[FirefliesItemFlags::Spawncounter] = 0;
return;
}
else
{
AddActiveItem(itemNumber);
item.Status = ITEM_ACTIVE;
}
// Spawn fly effect.
if (item.HitPoints != NOT_TARGETABLE)
{
int fireflyCount = item.HitPoints - item.ItemFlags[FirefliesItemFlags::Spawncounter];
if (fireflyCount < 0)
{
int firefliesToTurnOff = -fireflyCount;
for (auto& firefly : FireflySwarm)
{
if (firefly.TargetItemPtr == &item && firefly.Life > 0.0f)
{
firefly.Life = 0.0f;
firefly.on = false;
firefliesToTurnOff--;
if (firefliesToTurnOff == 0)
break;
}
}
}
else if (fireflyCount > 0)
{
for (int i = 0; i < fireflyCount; i++)
{
SpawnFireflySwarm(item, FLY_EFFECT_MAX_WIDTH);
}
}
item.ItemFlags[FirefliesItemFlags::Spawncounter] = item.HitPoints;
item.HitPoints = NOT_TARGETABLE;
}
}
@ -160,9 +218,9 @@ namespace TEN::Entities::TR3
{
DoBloodSplat(pos->x, pos->y, pos->z, Random::GenerateInt(4, 8), source.Pose.Orientation.y, pos->RoomNumber);
if (target.ItemFlags[1] == (int)CorpseFlag::Hang)
if (target.ItemFlags[7] == (int)CorpseFlag::Hang)
{
target.ItemFlags[1] = (int)CorpseFlag::Fall;
target.ItemFlags[7] = (int)CorpseFlag::Fall;
target.Animation.AnimNumber = object.animIndex + CORPSE_ANIM_FALL;
target.Animation.ActiveState = CORPSE_STATE_FALL;
}

View file

@ -0,0 +1,146 @@
#include "framework.h"
#include "Objects/TR5/Trap/MovingLaser.h"
#include "Game/animation.h"
#include "Game/collision/collide_item.h"
#include "Game/collision/collide_room.h"
#include "Game/collision/Point.h"
#include "Game/collision/Sphere.h"
#include "Game/control/control.h"
#include "Game/effects/effects.h"
#include "Game/effects/light.h"
#include "Game/items.h"
#include "Game/Lara/lara.h"
#include "Sound/sound.h"
#include "Specific/level.h"
using namespace TEN::Collision::Sphere;
namespace TEN::Entities::Traps
{
constexpr auto MOVING_LASER_DAMAGE = 100;
constexpr auto MOVING_LASER_VELOCITY_MIN = 1.0f;
constexpr auto MOVING_LASER_ACCEL = 1.0f;
constexpr auto MOVING_LASER_PAUSE_FRAME_COUNT = 30;
enum class MovingLaserFlags
{
Velocity,
PauseTimer,
DirectionSign,
DistanceTraveled,
VelocityCalc
};
void InitializeMovingLaser(short itemNumber)
{
auto& item = g_Level.Items[itemNumber];
item.ItemFlags[(int)MovingLaserFlags::DirectionSign] = 1;
item.ItemFlags[(int)MovingLaserFlags::Velocity] = 10;
// Offset by 1/4 block to make it dangerous at sector edges.
item.Pose.Translate(item.Pose.Orientation, -BLOCK(0.25f));
}
void ControlMovingLaser(short itemNumber)
{
auto& item = g_Level.Items[itemNumber];
if (!TriggerActive(&item))
return;
// Calculate distances.
float moveDist = BLOCK(item.TriggerFlags) + BLOCK(0.5f);
float distPerFrame = (BLOCK(item.ItemFlags[(int)MovingLaserFlags::Velocity]) * 0.25f) / (float)FPS;
item.Animation.ActiveState = 0;
// TODO: Use SpawnDynamicPointLight().
SpawnDynamicLight(
item.Pose.Position.x, item.Pose.Position.y - 64, item.Pose.Position.z, (Random::GenerateInt() % 2) + 8,
(Random::GenerateInt() % 4) + 24, Random::GenerateInt() % 4, Random::GenerateInt() % 2);
/*auto lightPos = item.Pose.Position.ToVector3() + Vector3(0.0f, -64, 0.0f);
auto lightColor = Color(Random::GenerateFloat(0.1f, 0.2f), Random::GenerateFloat(0.0f, 0.01f), Random::GenerateFloat(Random::GenerateFloat(0.0f, 0.01f)));
float lightFalloff = ??
SpawnDynamicPointLight(lightPos, lightPos, lightFalloff);*/
// TODO: Demagic.
// Used for flicker.
item.MeshBits = -1 - (GetRandomControl() & 20);
if (item.TriggerFlags == 0)
{
AnimateItem(&item);
return;
}
if (item.ItemFlags[(int)MovingLaserFlags::PauseTimer] > 0)
{
item.ItemFlags[(int)MovingLaserFlags::PauseTimer]--;
if (item.ItemFlags[(int)MovingLaserFlags::PauseTimer] == 0)
{
item.ItemFlags[(int)MovingLaserFlags::DirectionSign] *= -1;
item.ItemFlags[(int)MovingLaserFlags::DistanceTraveled] = 0;
}
AnimateItem(&item);
return;
}
item.Pose.Translate(item.Pose.Orientation, (item.ItemFlags[(int)MovingLaserFlags::DirectionSign] * item.ItemFlags[(int)MovingLaserFlags::VelocityCalc]));
item.ItemFlags[(int)MovingLaserFlags::DistanceTraveled] += item.ItemFlags[(int)MovingLaserFlags::VelocityCalc];
if (item.ItemFlags[(int)MovingLaserFlags::DistanceTraveled] < (moveDist - BLOCK(0.5f)))
{
item.ItemFlags[(int)MovingLaserFlags::VelocityCalc] = std::min(distPerFrame, item.ItemFlags[(int)MovingLaserFlags::VelocityCalc] + MOVING_LASER_ACCEL);
}
else
{
item.ItemFlags[(int)MovingLaserFlags::VelocityCalc] = std::max(MOVING_LASER_VELOCITY_MIN, item.ItemFlags[(int)MovingLaserFlags::VelocityCalc] - MOVING_LASER_ACCEL);
}
if (item.ItemFlags[(int)MovingLaserFlags::DistanceTraveled] >= moveDist)
{
item.ItemFlags[(int)MovingLaserFlags::PauseTimer] = MOVING_LASER_PAUSE_FRAME_COUNT;
}
if (item.ItemFlags[(int)MovingLaserFlags::PauseTimer] == 0)
{
SoundEffect(SFX_TR5_MOVING_LASER_LOOP, &item.Pose, SoundEnvironment::Always);
}
// Update room if necessary.
int roomNumber = GetPointCollision(item).GetRoomNumber();
if (roomNumber != item.RoomNumber)
ItemNewRoom(itemNumber, roomNumber);
AnimateItem(&item);
}
void CollideMovingLaser(short itemNumber, ItemInfo* playerItem, CollisionInfo* coll)
{
auto& item = g_Level.Items[itemNumber];
// Collide with objects.
if (item.Status == ITEM_ACTIVE)
{
if (!TestBoundsCollide(&item, playerItem, coll->Setup.Radius))
return;
HandleItemSphereCollision(item, *playerItem);
}
else if (item.Status != ITEM_INVISIBLE)
{
ObjectCollision(itemNumber, playerItem, coll);
}
// Damage player.
if (TestBoundsCollide(&item, playerItem, coll->Setup.Radius))
{
DoDamage(playerItem, MOVING_LASER_DAMAGE);
DoLotsOfBlood(playerItem->Pose.Position.x, playerItem->Pose.Position.y + CLICK(3), playerItem->Pose.Position.z, 4, playerItem->Pose.Orientation.y, playerItem->RoomNumber, 3);
playerItem->TouchBits.ClearAll();
}
}
}

View file

@ -1,134 +0,0 @@
#include "framework.h"
#include "Objects/TR5/Trap/tr5_movinglaser.h"
#include "Game/animation.h"
#include "Game/collision/collide_item.h"
#include "Game/collision/collide_room.h"
#include "Game/collision/Point.h"
#include "Game/collision/Sphere.h"
#include "Game/control/control.h"
#include "Game/effects/effects.h"
#include "Game/effects/light.h"
#include "Game/items.h"
#include "Game/Lara/lara.h"
#include "Sound/sound.h"
#include "Math/Utils.h"
#include "Specific/level.h"
using namespace TEN::Collision::Sphere;
namespace TEN::Entities::Traps
{
enum MovingLaserFlags
{
Speed,
PauseCounter,
Direction,
DistanceTravelled,
SpeedCalc
};
constexpr auto MOVING_LASER_DAMAGE = 100;
constexpr int PAUSE_FRAMES = 30;
constexpr float MAX_SPEED_THRESHOLD = 0.9f;
constexpr float MIN_SPEED = 1.0f;
constexpr float ACCELERATION = 1.0f;
void InitializeMovingLaser(short itemNumber)
{
auto& item = g_Level.Items[itemNumber];
item.ItemFlags[MovingLaserFlags::Direction] = 1;
item.ItemFlags[MovingLaserFlags::Speed] = 10;
item.Pose.Translate(item.Pose.Orientation, -CLICK(1)); // Offset by one click to make it dangerous at the edges of the block.
}
void ControlMovingLaser(short itemNumber)
{
auto& item = g_Level.Items[itemNumber];
if (!TriggerActive(&item))
return;
float moveDistance = (BLOCK(1) * item.TriggerFlags) + CLICK(2); // Use OCB to calculate the distance and add 2 clicks.
float distancePerFrame = ((float)(CLICK(1)) * item.ItemFlags[MovingLaserFlags::Speed]) / FPS; // Calculate distance per frame
item.Animation.ActiveState = 0;
SpawnDynamicLight(item.Pose.Position.x, item.Pose.Position.y - 64, item.Pose.Position.z, (Random::GenerateInt() % 2) + 8, (Random::GenerateInt() % 4) + 24, Random::GenerateInt() % 4, Random::GenerateInt() % 2);
item.MeshBits = -1 - (GetRandomControl() & 0x14); // To make lasers flicker
if (item.TriggerFlags == 0)
{
AnimateItem(&item);
return;
}
if (item.ItemFlags[MovingLaserFlags::PauseCounter] > 0)
{
item.ItemFlags[MovingLaserFlags::PauseCounter]--;
if (item.ItemFlags[MovingLaserFlags::PauseCounter] == 0)
{
item.ItemFlags[MovingLaserFlags::Direction] *= -1;
item.ItemFlags[MovingLaserFlags::DistanceTravelled] = 0;
}
AnimateItem(&item);
return;
}
item.Pose.Translate(item.Pose.Orientation, (item.ItemFlags[MovingLaserFlags::Direction] * item.ItemFlags[MovingLaserFlags::SpeedCalc]));
item.ItemFlags[MovingLaserFlags::DistanceTravelled] += item.ItemFlags[MovingLaserFlags::SpeedCalc];
if (item.ItemFlags[DistanceTravelled] < (moveDistance -BLOCK(0.5f)))
item.ItemFlags[SpeedCalc] = std::min(distancePerFrame, item.ItemFlags[MovingLaserFlags::SpeedCalc] + ACCELERATION);
else
item.ItemFlags[SpeedCalc] = std::max(MIN_SPEED, item.ItemFlags[MovingLaserFlags::SpeedCalc] - ACCELERATION);
if (item.ItemFlags[MovingLaserFlags::DistanceTravelled] >= moveDistance)
{
item.ItemFlags[MovingLaserFlags::PauseCounter] = PAUSE_FRAMES;
}
if (item.ItemFlags[MovingLaserFlags::PauseCounter] == 0)
{
SoundEffect(SFX_TR5_MOVING_LASER_LOOP, &item.Pose, SoundEnvironment::Always);
}
// Update room if necessary.
short new_room = item.RoomNumber;
GetPointCollision(item).GetRoomNumber();
if (new_room != item.RoomNumber)
ItemNewRoom(itemNumber, new_room);
AnimateItem(&item);
}
void CollideMovingLaser(short itemNumber, ItemInfo* playerItem, CollisionInfo* coll)
{
auto& item = g_Level.Items[itemNumber];
// Collide with objects.
if (item.Status == ITEM_ACTIVE)
{
if (!TestBoundsCollide(&item, playerItem, coll->Setup.Radius))
return;
HandleItemSphereCollision(item, *playerItem);
}
else if (item.Status != ITEM_INVISIBLE)
{
ObjectCollision(itemNumber, playerItem, coll);
}
// Damage entity.
if (TestBoundsCollide(&item, playerItem, coll->Setup.Radius))
{
DoDamage(playerItem, MOVING_LASER_DAMAGE);
DoLotsOfBlood(playerItem->Pose.Position.x, playerItem->Pose.Position.y + CLICK(3), playerItem->Pose.Position.z, 4, playerItem->Pose.Orientation.y, playerItem->RoomNumber, 3);
playerItem->TouchBits.ClearAll();
}
}
}

View file

@ -42,6 +42,7 @@
#include "Objects/TR5/Emitter/tr5_spider_emitter.h"
#include "Objects/TR5/Emitter/tr5_smoke_emitter.h"
#include "Objects/TR5/Emitter/Waterfall.h"
#include "Objects/Effects/Fireflies.h"
// Objects
#include "Objects/TR5/Light/tr5_light.h"
@ -57,15 +58,15 @@
// Traps
#include "Objects/Effects/EmberEmitter.h"
#include "Objects/Effects/tr5_electricity.h"
#include "Objects/TR5/Trap/LaserBarrier.h"
#include "Objects/TR5/Trap/LaserBeam.h"
#include "Objects/TR5/Trap/MovingLaser.h"
#include "Objects/TR5/Trap/ZipLine.h"
#include "Objects/Effects/tr5_electricity.h"
#include "Objects/TR5/Object/tr5_rollingball.h"
#include "Objects/TR5/Trap/tr5_ventilator.h"
#include "Objects/TR5/Trap/tr5_romehammer.h"
#include "Objects/TR5/Trap/tr5_fallingceiling.h"
#include "Objects/TR5/Trap/tr5_movinglaser.h"
#include "Objects/TR5/Trap/tr5_explosion.h"
#include "Objects/TR5/Trap/tr5_wreckingball.h"
@ -81,6 +82,7 @@ using namespace TEN::Effects::WaterfallEmitter;
using namespace TEN::Entities::Creatures::TR5;
using namespace TEN::Entities::Switches;
using namespace TEN::Entities::Traps;
using namespace TEN::Effects::Fireflies;
static void StartEntity(ObjectInfo *obj)
{
@ -796,6 +798,14 @@ static void StartObject(ObjectInfo *obj)
obj->control = ControlEmberEmitter;
}
obj = &Objects[ID_FIREFLY_EMITTER];
if (obj->loaded)
{
obj->Initialize = InitializeFireflySwarm;
obj->control = ControlFireflySwarm;
obj->drawRoutine = NULL;
}
obj = &Objects[ID_GEN_SLOT1];
if (obj->loaded)
{

View file

@ -817,6 +817,7 @@ enum GAME_OBJECT_ID : short
ID_CORPSE,
ID_WRAITH_TRAP,
ID_WATERFALL_EMITTER,
ID_FIREFLY_EMITTER,
ID_MESHSWAP1 = 1100,
ID_MESHSWAP2,
@ -1006,8 +1007,8 @@ enum GAME_OBJECT_ID : short
ID_DASH_BAR_TEXTURE,
ID_SFX_BAR_TEXTURE,
ID_WATERFALL_SPRITES,
// 1379
ID_CROSSHAIR_GRAPHICS = 1380,
ID_FIREFLY_SPRITES,
ID_CROSSHAIR_GRAPHICS,
ID_SPEEDOMETER_GRAPHICS,
ID_CUSTOM_BAR_GRAPHICS,
ID_CUSTOM_AMMO_GRAPHICS,

View file

@ -37,8 +37,8 @@ namespace TEN::Renderer::ConstantBuffers
//--
Vector4 FogColor;
//--
int FogMinDistance;
int FogMaxDistance;
float FogMinDistance;
float FogMaxDistance;
float NearPlane;
float FarPlane;
//--

View file

@ -409,6 +409,7 @@ namespace TEN::Renderer
void PrepareFires(RenderView& view);
void PrepareParticles(RenderView& view);
void PrepareSmokes(RenderView& view);
void PrepareFireflies(RenderView& view);
void PrepareElectricity(RenderView& view);
void PrepareHelicalLasers(RenderView& view);
void PrepareBlood(RenderView& view);

View file

@ -1759,6 +1759,7 @@ namespace TEN::Renderer
PrepareStreamers(view);
PrepareLaserBarriers(view);
PrepareSingleLaserBeam(view);
PrepareFireflies(view);
// Sprites grouped in buckets for instancing. Non-commutative sprites are collected at a later stage.
SortAndPrepareSprites(view);
@ -1830,7 +1831,7 @@ namespace TEN::Renderer
}
else
{
cameraConstantBuffer.FogMaxDistance = 0;
cameraConstantBuffer.FogMaxDistance = 0.0f;
cameraConstantBuffer.FogColor = Vector4::Zero;
}
@ -2571,6 +2572,12 @@ namespace TEN::Renderer
if (!SetupBlendModeAndAlphaTest(bucket.BlendMode, rendererPass, p))
continue;
if (_staticTextures.size() <= bucket.Texture)
{
TENLog("Attempted to set incorrect static mesh texture atlas", LogLevel::Warning);
continue;
}
BindTexture(TextureRegister::ColorMap,
&std::get<0>(_staticTextures[bucket.Texture]),
SamplerStateRegister::AnisotropicClamp);

View file

@ -35,6 +35,7 @@
#include "Scripting/Include/Flow/ScriptInterfaceFlowHandler.h"
#include "Specific/level.h"
#include "Structures/RendererSpriteBucket.h"
#include "Objects/Effects/Fireflies.h"
using namespace TEN::Effects::Blood;
using namespace TEN::Effects::Bubble;
@ -48,6 +49,7 @@ using namespace TEN::Effects::Streamer;
using namespace TEN::Entities::Creatures::TR5;
using namespace TEN::Entities::Traps;
using namespace TEN::Math;
using namespace TEN::Effects::Fireflies;
extern BLOOD_STRUCT Blood[MAX_SPARKS_BLOOD];
extern FIRE_SPARKS FireSparks[MAX_SPARKS_FIRE];
@ -330,6 +332,49 @@ namespace TEN::Renderer
}
}
void Renderer::PrepareFireflies(RenderView& view)
{
if (!Objects[ID_FIREFLY_EMITTER].loaded)
return;
for (auto& firefly : FireflySwarm)
{
if (!firefly.on)
continue;
if (!CheckIfSlotExists(ID_SPARK_SPRITE, "Particle rendering"))
continue;
auto axis = Vector3(0,0,0);
axis.Normalize();
firefly.scalar = 3;
firefly.size = 3;
auto pos = Vector3::Lerp(
Vector3(firefly.PrevX, firefly.PrevY, firefly.PrevZ),
Vector3(firefly.Position.x, firefly.Position.y, firefly.Position.z),
GetInterpolationFactor());
pos = Vector3(firefly.Position.x, firefly.Position.y, firefly.Position.z);
// Disallow sprites out of bounds.
int spriteIndex = Objects[firefly.SpriteSeqID].meshIndex + firefly.SpriteID;
spriteIndex = std::clamp(spriteIndex, 0, (int)_sprites.size());
AddSpriteBillboard(
&_sprites[spriteIndex],
pos,
Color(firefly.r / (float)UCHAR_MAX, firefly.g / (float)UCHAR_MAX, firefly.b / (float)UCHAR_MAX, 1.0f),
TO_RAD(firefly.rotAng << 4), firefly.scalar,
Vector2(firefly.size, firefly.size),
firefly.blendMode, true, view);
}
}
void Renderer::PrepareSmokes(RenderView& view)
{
for (const auto& smoke : SmokeSparks)

View file

@ -1331,7 +1331,7 @@ namespace TEN::Renderer
PrintDebugMessage("RoomNumber: %d", LaraItem->RoomNumber);
PrintDebugMessage("PathfindingBoxID: %d", LaraItem->BoxNumber);
PrintDebugMessage((Lara.Context.WaterSurfaceDist == -NO_HEIGHT ? "WaterSurfaceDist: N/A" : "WaterSurfaceDist: %d"), Lara.Context.WaterSurfaceDist);
PrintDebugMessage("Room Position: %d, %d, %d, %d", room.Position.z, room.Position.z, room.Position.z + BLOCK(room.XSize), room.Position.z + BLOCK(room.ZSize));
PrintDebugMessage("Room Bounds: (%d, %d), (%d, %d)", room.Position.x, room.Position.z, room.Position.x + BLOCK(room.XSize), room.Position.z + BLOCK(room.ZSize));
PrintDebugMessage("Room.y, minFloor, maxCeiling: %d, %d, %d ", room.Position.y, room.BottomHeight, room.TopHeight);
PrintDebugMessage("Camera Position: %d, %d, %d", Camera.pos.x, Camera.pos.y, Camera.pos.z);
PrintDebugMessage("Camera LookAt: %d, %d, %d", Camera.target.x, Camera.target.y, Camera.target.z);

View file

@ -62,6 +62,7 @@ public:
virtual void OnUseItem(GAME_OBJECT_ID objectNumber) = 0;
virtual void OnFreeze() = 0;
virtual void AddConsoleInput(const std::string& input) = 0;
virtual void ShortenTENCalls() = 0;
virtual void FreeLevelScripts() = 0;
virtual void ResetScripts(bool clearGameVars) = 0;

View file

@ -38,8 +38,8 @@ public:
virtual WeatherType GetWeatherType() const = 0;
virtual RGBAColor8Byte GetSkyLayerColor(int index) const = 0;
virtual RGBAColor8Byte GetFogColor() const = 0;
virtual short GetFogMinDistance() const = 0;
virtual short GetFogMaxDistance() const = 0;
virtual float GetFogMinDistance() const = 0;
virtual float GetFogMaxDistance() const = 0;
virtual short GetFarView() const = 0;
virtual int GetSecrets() const = 0;
virtual std::string GetAmbientTrack() const = 0;

View file

@ -26,6 +26,7 @@ namespace TEN::Scripting::Collision
void Probe::Register(sol::table& parent)
{
using ctors = sol::constructors<
Probe(const Vec3&),
Probe(const Vec3&, int),
Probe(const Vec3&, int, const Vec3&, float),
Probe(const Vec3&, int, const Rotation&, float),
@ -65,13 +66,17 @@ namespace TEN::Scripting::Collision
/// Create a Probe at a specified world position in a room.
// @function Probe
// @tparam Vec3 pos World position.
// @tparam int roomNumber[opt] Room number. Must be used if probing a position in an overlapping room.
// @tparam[opt] int roomNumber Room number. Must be used if probing a position in an overlapping room.
// @treturn Probe A new Probe.
Probe::Probe(const Vec3& pos, TypeOrNil<int> roomNumber)
Probe::Probe(const Vec3& pos)
{
auto convertedPos = pos.ToVector3i();
int roomNumberValue = ValueOr<int>(roomNumber, FindRoomNumber(convertedPos));
_pointCollision = GetPointCollision(convertedPos, roomNumberValue);
_pointCollision = GetPointCollision(convertedPos, FindRoomNumber(convertedPos));
}
Probe::Probe(const Vec3& pos, int roomNumber)
{
_pointCollision = GetPointCollision(pos.ToVector3i(), roomNumber);
}
/// Create a Probe that casts from an origin world position in a room in a given direction for a specified distance.
@ -326,9 +331,9 @@ namespace TEN::Scripting::Collision
// @function Preview
void Probe::Preview()
{
constexpr auto TARGET_RADIUS = 100.0f;
constexpr auto SPHERE_RADIUS = TARGET_RADIUS * 0.6f;
constexpr auto COLOR = Color(1.0f, 1.0f, 1.0f, 0.4f);
constexpr auto TARGET_RADIUS = BLOCK(0.08f);
constexpr auto SPHERE_RADIUS = TARGET_RADIUS * 0.4f;
constexpr auto COLOR = Color(1.0f, 1.0f, 0.8f, 0.2f);
constexpr auto DEBUG_PAGE = RendererDebugPage::CollisionStats;
auto pos = _pointCollision.GetPosition().ToVector3();

View file

@ -31,7 +31,8 @@ namespace TEN::Scripting::Collision
// Constructors
Probe() = default;
Probe(const Vec3& pos, TypeOrNil<int> roomNumber);
Probe(const Vec3& pos);
Probe(const Vec3& pos, int roomNumber);
Probe(const Vec3& origin, int roomNumber, const Vec3& dir, float dist);
Probe(const Vec3& origin, int roomNumber, const Rotation& rot, float dist);
Probe(const Vec3& origin, int roomNumber, const Rotation& rot, const Vec3& relOffset);

View file

@ -551,7 +551,7 @@ namespace TEN::Scripting::Effects
// @tparam[opt] float vel Movement velocity in world units per second. __Default: 0__
// @tparam[opt] float expRate Width expansion rate in world units per second. __Default: 0__
// @tparam[opt] float rotRate Rotation rate in degrees per second. __Default: 0__
// @tparam[opt] Effects.StreamerFeatherMode edgeFeatherMode Edge feather mode. __Default: Effects.FeatherID.NONE__
// @tparam[opt] Effects.StreamerFeatherMode edgeFeatherMode Edge feather mode. __Default: Effects.StreamerFeatherMode.NONE__
// @tparam[opt] Effects.StreamerFeatherMode lengthFeatherMode Length feather mode. __UNIMPLEMENTED, currently will always leave a fading tail__
// @tparam[opt] Effects.BlendID blendID Renderer blend ID. __Default: Effects.BlendID.ALPHA_BLEND__
static void EmitStreamer(const Moveable& mov, TypeOrNil<int> tag, const Vec3& pos, const Vec3& dir, TypeOrNil<float> rot, TypeOrNil<ScriptColor> startColor, TypeOrNil<ScriptColor> endColor,

View file

@ -3,10 +3,10 @@
#include "Game/effects/Streamer.h"
/// Constants for feather modes.
// @enum Effects.FeatherMode
// @enum Effects.StreamerFeatherMode
// @pragma nostrip
/// Table of Effects.FeatherMode constants.
/// Table of Effects.StreamerFeatherMode constants.
// To be used with @{Effects.EmitStreamer} function.
//
// - `NONE`
@ -14,7 +14,7 @@
// - `LEFT`
// - `RIGHT`
//
// @table Effects.FeatherMode
// @table Effects.StreamerFeatherMode
using namespace TEN::Effects::Streamer;

View file

@ -23,13 +23,13 @@ void Fog::Register(sol::table& parent)
// @mem color
"color", sol::property(&Fog::GetColor, &Fog::SetColor),
/// (int) Minimum distance.
// This is the distance at which the fog starts.
/// (float) Minimum distance.
// This is the distance at which the fog starts (in sectors).
// @mem minDistance
"minDistance", &Fog::MinDistance,
/// (int) Maximum distance.
// This is the distance at which the fog reaches the maximum strength.
/// (float) Maximum distance.
// This is the distance at which the fog reaches the maximum strength (in sectors).
// @mem maxDistance
"maxDistance", &Fog::MaxDistance
);
@ -42,7 +42,7 @@ void Fog::Register(sol::table& parent)
@treturn Fog A fog object.
@function Fog
*/
Fog::Fog(ScriptColor const& col, short minDistance, short maxDistance)
Fog::Fog(ScriptColor const& col, float minDistance, float maxDistance)
{
SetColor(col);
MinDistance = minDistance;

View file

@ -13,11 +13,11 @@ struct Fog
byte R{ 0 };
byte G{ 0 };
byte B{ 0 };
short MinDistance{ 0 };
short MaxDistance{ 0 };
float MinDistance{ 0 };
float MaxDistance{ 0 };
Fog() = default;
Fog(ScriptColor const& color, short minDistance, short maxDistance);
Fog(ScriptColor const& color, float minDistance, float maxDistance);
void SetColor(ScriptColor const& color);
ScriptColor GetColor() const;

Some files were not shown because too many files have changed in this diff Show more