Expose different animation slots to scripting API

This commit is contained in:
Lwmte 2024-12-21 10:09:00 +01:00
parent d75bba698f
commit 0ae3888456
5 changed files with 57 additions and 8 deletions

View file

@ -58,6 +58,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Added optional cast shadow and name parameters for Effects.EmitLight() function.
* Added Effects.GetWind() function to get current wind speed vector.
* Added Moveable:GetCollidable() and Moveable:SetCollidable() functions.
* Added Moveable:GetAnimSlot() and optional second argument for Moveable:SetAnim() to access different animation slots.
* Added Rotation:Direction() method to get directional vector.
* Added support for transparency value in Strings.DisplayString class.
* Added extra argument for Sound.SetAmbientTrack() function to specify if new ambient track should play from the beginning.
@ -69,6 +70,7 @@ TombEngine releases are located in this repository (alongside with Tomb Editor):
* Fixed Strings.DisplayString class not supporting some Unicode characters and empty lines in multiline strings.
* Fixed Strings.DisplayString not being deallocated after showing.
* Fixed GameVars not transferring between levels in hub mode.
* Fixed incorrect return value of Moveable:GetAnim() function, if animation from another slot is currently playing.
* Fixed incorrect behaviour of Moveable:GetJointRotation() function.
* Fixed incorrect behaviour of Logic.EnableEvent() and Logic.DisableEvent() functions.
* Fixed Util.HasLineOfSight() not taking static meshes into consideration.

View file

@ -171,7 +171,11 @@ pickups, and Lara herself (see also <a href="../2 classes/Objects.LaraObject.htm
<td class="summary">Retrieve the index of the current animation.</td>
</tr>
<tr>
<td class="name" ><a href="#Moveable:SetAnim">Moveable:SetAnim(index)</a></td>
<td class="name" ><a href="#Moveable:GetAnimSlot">Moveable:GetAnimSlot()</a></td>
<td class="summary">Retrieve the slot ID of the animation.</td>
</tr>
<tr>
<td class="name" ><a href="#Moveable:SetAnim">Moveable:SetAnim(index[, slot])</a></td>
<td class="summary">Set the object's animation to the one specified by the given index.</td>
</tr>
<tr>
@ -774,10 +778,33 @@ shiva:SetObjectID(TEN.Objects.ObjID.BIGMEDI_ITEM)</pre>
</dd>
<dt>
<a name = "Moveable:GetAnimSlot"></a>
<strong>Moveable:GetAnimSlot()</strong>
</dt>
<dd>
Retrieve the slot ID of the animation.
In certain cases, moveable may play animations from another object slot. Use this
function when you need to identify such cases.
<h3>Returns:</h3>
<ol>
<span class="types"><span class="type">int</span></span>
animation slot ID
</ol>
</dd>
<dt>
<a name = "Moveable:SetAnim"></a>
<strong>Moveable:SetAnim(index)</strong>
<strong>Moveable:SetAnim(index[, slot])</strong>
</dt>
<dd>
Set the object's animation to the one specified by the given index.
@ -792,6 +819,11 @@ shiva:SetObjectID(TEN.Objects.ObjID.BIGMEDI_ITEM)</pre>
<span class="types"><span class="type">int</span></span>
the index of the desired anim
</li>
<li><span class="parameter">slot</span>
<span class="types"><span class="type">int</span></span>
slot ID of the desired anim (if omitted, moveable's own slot ID is used)
(<em>optional</em>)
</li>
</ul>

View file

@ -166,6 +166,7 @@ static constexpr char ScriptReserved_SetVelocity[] = "SetVelocity";
static constexpr char ScriptReserved_GetFrameNumber[] = "GetFrame";
static constexpr char ScriptReserved_GetEndFrame[] = "GetEndFrame";
static constexpr char ScriptReserved_SetFrameNumber[] = "SetFrame";
static constexpr char ScriptReserved_GetAnimSlot[] = "GetAnimSlot";
static constexpr char ScriptReserved_GetAnimNumber[] = "GetAnim";
static constexpr char ScriptReserved_SetAnimNumber[] = "SetAnim";
static constexpr char ScriptReserved_GetStateNumber[] = "GetState";

View file

@ -130,7 +130,7 @@ static std::unique_ptr<Moveable> Create(
if (std::holds_alternative<int>(animNumber))
{
ptr->SetAnimNumber(std::get<int>(animNumber));
ptr->SetAnimNumber(std::get<int>(animNumber), objID);
ptr->SetFrameNumber(USE_IF_HAVE(int, frameNumber, 0));
}
@ -245,11 +245,19 @@ void Moveable::Register(sol::state& state, sol::table& parent)
// @treturn int the index of the active animation
ScriptReserved_GetAnimNumber, &Moveable::GetAnimNumber,
/// Retrieve the slot ID of the animation.
// In certain cases, moveable may play animations from another object slot. Use this
// function when you need to identify such cases.
// @function Moveable:GetAnimSlot
// @treturn int animation slot ID
ScriptReserved_GetAnimSlot, &Moveable::GetAnimSlot,
/// Set the object's animation to the one specified by the given index.
// Performs no bounds checking. *Ensure the number given is correct, else
// object may end up in corrupted animation state.*
// @function Moveable:SetAnim
// @tparam int index the index of the desired anim
// @tparam[opt] int slot slot ID of the desired anim (if omitted, moveable's own slot ID is used)
ScriptReserved_SetAnimNumber, &Moveable::SetAnimNumber,
/// Retrieve frame number.
@ -878,14 +886,19 @@ void Moveable::SetStateNumber(int stateNumber)
m_item->Animation.TargetState = stateNumber;
}
int Moveable::GetAnimNumber() const
int Moveable::GetAnimSlot() const
{
return m_item->Animation.AnimNumber - Objects[m_item->ObjectNumber].animIndex;
return m_item->Animation.AnimObjectID;
}
void Moveable::SetAnimNumber(int animNumber)
int Moveable::GetAnimNumber() const
{
SetAnimation(m_item, animNumber);
return m_item->Animation.AnimNumber - Objects[m_item->Animation.AnimObjectID].animIndex;
}
void Moveable::SetAnimNumber(int animNumber, sol::optional<int> slotIndex)
{
SetAnimation(*m_item, (GAME_OBJECT_ID)slotIndex.value_or(m_item->ObjectNumber), animNumber);
}
int Moveable::GetFrameNumber() const

View file

@ -62,7 +62,8 @@ public:
void SetStateNumber(int stateNumber);
[[nodiscard]] int GetAnimNumber() const;
void SetAnimNumber(int animNumber);
[[nodiscard]] int GetAnimSlot() const;
void SetAnimNumber(int animNumber, sol::optional<int> slotIndex);
[[nodiscard]] int GetFrameNumber() const;
[[nodiscard]] int GetEndFrame() const;