Skip to content

Instantly share code, notes, and snippets.

@Daztek
Last active August 19, 2024 08:47
Show Gist options
  • Save Daztek/2b998b03ec289330b32ee17fd79fcd7d to your computer and use it in GitHub Desktop.
Save Daztek/2b998b03ec289330b32ee17fd79fcd7d to your computer and use it in GitHub Desktop.
/// @addtogroup effect Effect
/// @brief Utility functions to manipulate the builtin effect type.
/// @{
/// @file nwnx_effect.nss
#include "nwnx"
const string NWNX_Effect = "NWNX_Effect"; ///< @private
/// EQUIPPED effects are always associated with a slotted item:
/// Setting this duration type requires the effect creator
/// to be set to the (already equipped) item that should remove
/// this effect when unequipped.
/// Removal behaviour for effects where the creator is NOT a equipped
/// item is undefined.
/// They are not removed by resting, cannot be dispelled, etc.
const int DURATION_TYPE_EQUIPPED = 3;
/// These are feat/racial effects used internally by the game to
/// implement things like movement speed changes and darkvision.
/// They cannot be removed by resting, dispelling, etc.
const int DURATION_TYPE_INNATE = 4;
/// An unpacked effect
struct NWNX_EffectUnpacked
{
string sID; ///< @todo Describe
int nType; ///< @todo Describe
int nSubType; ///< @todo Describe
float fDuration; ///< @todo Describe
int nExpiryCalendarDay; ///< @todo Describe
int nExpiryTimeOfDay; ///< @todo Describe
object oCreator; ///< @todo Describe
int nSpellId; ///< @todo Describe
int bExpose; ///< @todo Describe
int bShowIcon; ///< @todo Describe
int nCasterLevel; ///< @todo Describe
effect eLinkLeft; ///< @todo Describe
int bLinkLeftValid; ///< @todo Describe
effect eLinkRight; ///< @todo Describe
int bLinkRightValid; ///< @todo Describe
int nNumIntegers; ///< @todo Describe
int nParam0; ///< @todo Describe
int nParam1; ///< @todo Describe
int nParam2; ///< @todo Describe
int nParam3; ///< @todo Describe
int nParam4; ///< @todo Describe
int nParam5; ///< @todo Describe
int nParam6; ///< @todo Describe
int nParam7; ///< @todo Describe
float fParam0; ///< @todo Describe
float fParam1; ///< @todo Describe
float fParam2; ///< @todo Describe
float fParam3; ///< @todo Describe
string sParam0; ///< @todo Describe
string sParam1; ///< @todo Describe
string sParam2; ///< @todo Describe
string sParam3; ///< @todo Describe
string sParam4; ///< @todo Describe
string sParam5; ///< @todo Describe
object oParam0; ///< @todo Describe
object oParam1; ///< @todo Describe
object oParam2; ///< @todo Describe
object oParam3; ///< @todo Describe
float fVector0_x; ///< @todo Describe
float fVector0_y; ///< @todo Describe
float fVector0_z; ///< @todo Describe
float fVector1_x; ///< @todo Describe
float fVector1_y; ///< @todo Describe
float fVector1_z; ///< @todo Describe
string sTag; ///< @todo Describe
string sItemProp; ///< @todo Describe
};
/// @brief Convert native effect type to unpacked structure.
/// @param e The effect to convert.
/// @return A constructed NWNX_EffectUnpacked.
struct NWNX_EffectUnpacked NWNX_Effect_UnpackEffect(effect e);
/// @brief Convert unpacked effect structure to native type.
/// @param e The NWNX_EffectUnpacked structure to convert.
/// @return The effect.
effect NWNX_Effect_PackEffect(struct NWNX_EffectUnpacked e);
/// @brief replace an already applied effect on an object
/// Only duration, subtype, tag and spell related fields can be overwritten.
/// @note eNew and eOld need to have the same type.
/// @return Number of internal effects updated.
int NWNX_Effect_ReplaceEffect(object obj, effect eOld, effect eNew);
/// @brief Gets the true effect count
/// @param oObject The object to get the count of.
/// @return the number of effects (item properties and other non-exposed effects included)
int NWNX_Effect_GetTrueEffectCount(object oObject);
/// @brief Gets a specific effect on an object. This can grab effects normally hidden from developers, such as item properties.
/// @param oObject The object with the effect
/// @param nIndex The point in the array to retrieve (0 to GetTrueEffectCount())
/// @return A constructed NWNX_EffectUnpacked.
struct NWNX_EffectUnpacked NWNX_Effect_GetTrueEffect(object oObject, int nIndex);
/// @brief Replaces an already applied effect with another.
/// @param oObject The object with the effect to replace
/// @param nIndex The array element to be replaced
/// @param e The unpacked effect to replace it with.
/// @note Cannot replace an effect with a different type or ID.
void NWNX_Effect_ReplaceEffectByIndex(object oObject, int nIndex, struct NWNX_EffectUnpacked e);
/// @brief Removes effect by ID
/// @param oObject The object to remove the effect from
/// @param sID The id of the effect, can be retrieved by unpacking effects.
/// @return FALSE/0 on failure TRUE/1 on success.
int NWNX_Effect_RemoveEffectById(object oObject, string sID);
/// @brief Applys an effect, bypassing any processing done by ApplyEffectToObject
/// @param eEffect The effect to be applied.
/// @param oObject The object to apply it to.
void NWNX_Effect_Apply(effect eEffect, object oObject);
/// @brief Sets an effect creator.
/// @param eEffect The effect to be modified.
/// @param oObject The effect creator.
/// @return The effect with creator field set.
effect NWNX_Effect_SetEffectCreator(effect eEffect, object oObject);
/// @brief Checks if the given effect is valid. Unlike the game builtin, this call considers internal types too.
/// @param eEffect The effect to check
/// @return TRUE if the effect is valid (including internal types).
int NWNX_Effect_GetIsEffectValid(effect eEffect);
/// @brief Returns the number of applied effects on the given object.
/// @param oObject The object to get the applied effect count for.
/// @return The number of applied effects, including internal.
int NWNX_Effect_GetAppliedEffectCount(object oObject);
/// @brief Returns the nNth applied effect on a object.
/// @param oObject The object to get the applied effect copy for.
/// @param nNth The effect index to get.
/// @note Make sure to check with NWNX_Effect_GetIsEffectValid, as this iterator also includes internal effects.
/// @return A copy of the applied game effect, or a invalid effect.
effect NWNX_Effect_GetAppliedEffect(object oObject, int nNth);
/// @}
struct NWNX_EffectUnpacked __NWNX_Effect_ResolveUnpack(string sFunc, int bLink=TRUE)
{
struct NWNX_EffectUnpacked n;
n.sItemProp = NWNX_GetReturnValueString();
n.sTag = NWNX_GetReturnValueString();
n.fVector1_z = NWNX_GetReturnValueFloat();
n.fVector1_y = NWNX_GetReturnValueFloat();
n.fVector1_x = NWNX_GetReturnValueFloat();
n.fVector0_z = NWNX_GetReturnValueFloat();
n.fVector0_y = NWNX_GetReturnValueFloat();
n.fVector0_x = NWNX_GetReturnValueFloat();
n.oParam3 = NWNX_GetReturnValueObject();
n.oParam2 = NWNX_GetReturnValueObject();
n.oParam1 = NWNX_GetReturnValueObject();
n.oParam0 = NWNX_GetReturnValueObject();
n.sParam5 = NWNX_GetReturnValueString();
n.sParam4 = NWNX_GetReturnValueString();
n.sParam3 = NWNX_GetReturnValueString();
n.sParam2 = NWNX_GetReturnValueString();
n.sParam1 = NWNX_GetReturnValueString();
n.sParam0 = NWNX_GetReturnValueString();
n.fParam3 = NWNX_GetReturnValueFloat();
n.fParam2 = NWNX_GetReturnValueFloat();
n.fParam1 = NWNX_GetReturnValueFloat();
n.fParam0 = NWNX_GetReturnValueFloat();
n.nParam7 = NWNX_GetReturnValueInt();
n.nParam6 = NWNX_GetReturnValueInt();
n.nParam5 = NWNX_GetReturnValueInt();
n.nParam4 = NWNX_GetReturnValueInt();
n.nParam3 = NWNX_GetReturnValueInt();
n.nParam2 = NWNX_GetReturnValueInt();
n.nParam1 = NWNX_GetReturnValueInt();
n.nParam0 = NWNX_GetReturnValueInt();
n.nNumIntegers = NWNX_GetReturnValueInt();
if(bLink)
{
n.bLinkRightValid = NWNX_GetReturnValueInt();
n.eLinkRight = NWNX_GetReturnValueEffect();
n.bLinkLeftValid = NWNX_GetReturnValueInt();
n.eLinkLeft = NWNX_GetReturnValueEffect();
}
else
{
n.bLinkRightValid = FALSE;
n.bLinkLeftValid = FALSE;
}
n.nCasterLevel = NWNX_GetReturnValueInt();
n.bShowIcon = NWNX_GetReturnValueInt();
n.bExpose = NWNX_GetReturnValueInt();
n.nSpellId = NWNX_GetReturnValueInt();
n.oCreator = NWNX_GetReturnValueObject();
n.nExpiryTimeOfDay = NWNX_GetReturnValueInt();
n.nExpiryCalendarDay = NWNX_GetReturnValueInt();
n.fDuration = NWNX_GetReturnValueFloat();
n.nSubType = NWNX_GetReturnValueInt();
n.nType = NWNX_GetReturnValueInt();
n.sID = NWNX_GetReturnValueString();
return n;
}
void __NWNX_Effect_ResolvePack(string sFunc, struct NWNX_EffectUnpacked e, int bReplace=FALSE)
{
if(!bReplace)
NWNX_PushArgumentInt(e.nType);
NWNX_PushArgumentInt(e.nSubType);
NWNX_PushArgumentFloat(e.fDuration);
NWNX_PushArgumentInt(e.nExpiryCalendarDay);
NWNX_PushArgumentInt(e.nExpiryTimeOfDay);
NWNX_PushArgumentObject(e.oCreator);
NWNX_PushArgumentInt(e.nSpellId);
NWNX_PushArgumentInt(e.bExpose);
NWNX_PushArgumentInt(e.bShowIcon);
NWNX_PushArgumentInt(e.nCasterLevel);
if(!bReplace)
{
NWNX_PushArgumentEffect(e.eLinkLeft);
NWNX_PushArgumentInt(e.bLinkLeftValid);
NWNX_PushArgumentEffect(e.eLinkRight);
NWNX_PushArgumentInt(e.bLinkRightValid);
}
NWNX_PushArgumentInt(e.nNumIntegers);
NWNX_PushArgumentInt(e.nParam0);
NWNX_PushArgumentInt(e.nParam1);
NWNX_PushArgumentInt(e.nParam2);
NWNX_PushArgumentInt(e.nParam3);
NWNX_PushArgumentInt(e.nParam4);
NWNX_PushArgumentInt(e.nParam5);
NWNX_PushArgumentInt(e.nParam6);
NWNX_PushArgumentInt(e.nParam7);
NWNX_PushArgumentFloat(e.fParam0);
NWNX_PushArgumentFloat(e.fParam1);
NWNX_PushArgumentFloat(e.fParam2);
NWNX_PushArgumentFloat(e.fParam3);
NWNX_PushArgumentString(e.sParam0);
NWNX_PushArgumentString(e.sParam1);
NWNX_PushArgumentString(e.sParam2);
NWNX_PushArgumentString(e.sParam3);
NWNX_PushArgumentString(e.sParam4);
NWNX_PushArgumentString(e.sParam5);
NWNX_PushArgumentObject(e.oParam0);
NWNX_PushArgumentObject(e.oParam1);
NWNX_PushArgumentObject(e.oParam2);
NWNX_PushArgumentObject(e.oParam3);
NWNX_PushArgumentFloat(e.fVector0_x);
NWNX_PushArgumentFloat(e.fVector0_y);
NWNX_PushArgumentFloat(e.fVector0_z);
NWNX_PushArgumentFloat(e.fVector1_x);
NWNX_PushArgumentFloat(e.fVector1_y);
NWNX_PushArgumentFloat(e.fVector1_z);
NWNX_PushArgumentString(e.sTag);
NWNX_PushArgumentString(e.sItemProp);
}
struct NWNX_EffectUnpacked NWNX_Effect_UnpackEffect(effect e)
{
string sFunc = "UnpackEffect";
NWNX_PushArgumentEffect(e);
NWNX_CallFunction(NWNX_Effect, sFunc);
return __NWNX_Effect_ResolveUnpack(sFunc);
}
effect NWNX_Effect_PackEffect(struct NWNX_EffectUnpacked e)
{
string sFunc = "PackEffect";
__NWNX_Effect_ResolvePack(sFunc, e);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueEffect();
}
int NWNX_Effect_ReplaceEffect(object obj, effect eOld, effect eNew)
{
string sFunc = "ReplaceEffect";
NWNX_PushArgumentEffect(eNew);
NWNX_PushArgumentEffect(eOld);
NWNX_PushArgumentObject(obj);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueInt();
}
int NWNX_Effect_GetTrueEffectCount(object oObject)
{
string sFunc = "GetTrueEffectCount";
NWNX_PushArgumentObject(oObject);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueInt();
}
struct NWNX_EffectUnpacked NWNX_Effect_GetTrueEffect(object oObject, int nIndex)
{
string sFunc = "GetTrueEffect";
NWNX_PushArgumentInt(nIndex);
NWNX_PushArgumentObject(oObject);
NWNX_CallFunction(NWNX_Effect, sFunc);
return __NWNX_Effect_ResolveUnpack(sFunc, FALSE);
}
void NWNX_Effect_ReplaceEffectByIndex(object oObject, int nIndex, struct NWNX_EffectUnpacked e)
{
string sFunc = "ReplaceEffectByIndex";
__NWNX_Effect_ResolvePack(sFunc, e, TRUE);
NWNX_PushArgumentInt(nIndex);
NWNX_PushArgumentObject(oObject);
NWNX_CallFunction(NWNX_Effect, sFunc);
}
int NWNX_Effect_RemoveEffectById(object oObject, string sID)
{
string sFunc = "RemoveEffectById";
NWNX_PushArgumentString(sID);
NWNX_PushArgumentObject(oObject);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueInt();
}
void NWNX_Effect_Apply(effect eEffect, object oObject)
{
string sFunc = "Apply";
NWNX_PushArgumentObject(oObject);
NWNX_PushArgumentEffect(eEffect);
NWNX_CallFunction(NWNX_Effect, sFunc);
}
effect NWNX_Effect_SetEffectCreator(effect eEffect, object oObject)
{
string sFunc = "SetEffectCreator";
NWNX_PushArgumentObject(oObject);
NWNX_PushArgumentEffect(eEffect);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueEffect();
}
int NWNX_Effect_GetIsEffectValid(effect eEffect)
{
string sFunc = "GetIsEffectValid";
NWNX_PushArgumentEffect(eEffect);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueInt();
}
int NWNX_Effect_GetAppliedEffectCount(object oObject)
{
string sFunc = "GetAppliedEffectCount";
NWNX_PushArgumentObject(oObject);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueInt();
}
effect NWNX_Effect_GetAppliedEffect(object oObject, int nNth)
{
string sFunc = "GetAppliedEffect";
NWNX_PushArgumentInt(nNth);
NWNX_PushArgumentObject(oObject);
NWNX_CallFunction(NWNX_Effect, sFunc);
return NWNX_GetReturnValueEffect();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment