Aschbourne_PRC8/_module/nss/mk_inc_vfx.nss
Jaysyn904 903f023230 Major update
Created top hak for crafting dialog.  Moved Bioware creature abilities to top hak.  Fixed DMFI wand handouts.  Added DMFI language handouts.  Added CCOH 6.  Disabled PC corpse system.  Modified new player startup system.  Full compile.  Updated release archive.
2024-09-17 13:24:57 -04:00

666 lines
20 KiB
Plaintext
Raw Permalink Blame History

//////////////////////////////////////////////////////////////////////////////
// mk_inc_vfx.nss
//////////////////////////////////////////////////////////////////////////////
#include "mk_inc_version"
#include "mk_inc_tools"
#include "mk_inc_body"
const string MK_VFX_BIOWARE_2DA = "visualeffects";
const string MK_VFX_MODE = "mk_vfx_mode";
const string MK_VFX_PER_PAGE = "MK_VFX_PER_PAGE";
const string MK_DEF_VFX = "mk_def_vfx";
const string MK_VFX_CURRENT_VFX = "MK_VFX_CURRENT_VFX";
const string MK_VFX_CURRENT_ROW = "MK_VFX_CURRENT_ROW";
const string MK_EFFECT_SCALE = "MK_EFFECT_SCALE";
const string MK_EFFECT_TRANSLATE = "MK_EFFECT_TRANSLATE";
const string MK_EFFECT_ROTATE = "MK_EFFECT_ROTATE";
/*
const int MK_VFX_MODE_GLEYES = 0;
const int MK_VFX_MODE_LIGHTS = 1;
const int MK_VFX_MODE_CEP = 2;
const int MK_VFX_MODE_USER = 3;
const int MK_VFX_MODE_ALL = 4;
const int MK_VFX_MODE_ERROR = -1;
*/
// initializes the vfx filter system
// sets the 2da file used (mk_sys_vfx.2da or mk_def_vfx.2da)
// returns FALSE if none of these files were found.
int MK_VFX_Initialize(object oPC);
//////////////////////////////////////////////////////////////////////////////
string MK_VFX_Get_VFXModeFile(object oPC);
//////////////////////////////////////////////////////////////////////////////
string MK_VFX_Get2DAFile(object oPC, int nVFXmode);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_GetVFX(object oPC, int nVFXmode, int nRow, object oTarget = OBJECT_SELF);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_GetVFXIsValid(object oPC, int nVFXmode, int nRow, object oTarget = OBJECT_SELF);
//////////////////////////////////////////////////////////////////////////////
//string MK_VFX_GetValueColumn(int nVFXmode, object oPC = OBJECT_SELF);
//////////////////////////////////////////////////////////////////////////////
string MK_VFX_GetTag(int nVFX);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_GetHasVFX(object oPC, int nVFX, object oTarget);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_RemoveVFX(object oPC, int nVFX, object oPC);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_ApplyVFX(object oPC, int nVFX, object oPC, int nVFXmode=-1, int nRow=-1);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_GetNumberOfVFXPerPage(object oPC);
//////////////////////////////////////////////////////////////////////////////
void MK_VFX_RemoveAllEffects(object oPC, int nEffectType=EFFECT_TYPE_VISUALEFFECT, int nEffectSubType=0);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_GetVFXMode(object oPC);
//////////////////////////////////////////////////////////////////////////////
void MK_VFX_SetVFXMode(int nVFXMode, object oPC);
string MK_EFFECT_GetTag(effect e);
effect MK_EFFECT_VisualEffect(int nVisualEffectId, int nMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
float MK_EFFECT_GetScale(effect e);
vector MK_EFFECT_GetTranslate(effect e);
vector MK_EFFECT_GetRotate(effect e);
effect MK_EFFECT_GetCurrentEffect(object oTarget);
void MK_EFFECT_UpdateEffect(object oTarget, int nVFX, object oPC, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0]);
void MK_VFX_ApplyVisualEffect(int nVisualEffectId, object oTarget, int nSubType, int nDurationType, float fDuration=0.0f, string sTag="", int bMissEffect=FALSE, float fScale=1.0f, vector vTranslate=[0.0,0.0,0.0], vector vRotate=[0.0,0.0,0.0], int bDelay=FALSE);
//////////////////////////////////////////////////////////////////////////////
int MK_VFX_Initialize(object oPC)
{
MK_DEBUG_TRACE("MK_HEAD:Initialize('"+GetName(oPC)+"')");
int bReturn = TRUE;
string s2DA = "mk_def_vfx";
if (Get2DAString(s2DA, "NAME", 0) == "MK_VFX_ALL")
{
MK_DEBUG_TRACE(" > "+s2DA+".2DA found ("+Get2DAString(s2DA, "NAME", 0)+").");
SetLocalString(oPC, MK_DEF_VFX, s2DA);
}
else
{
s2DA = "mk_sys_vfx";
if (Get2DAString(s2DA, "NAME", 0) == "MK_VFX_ALL")
{
MK_DEBUG_TRACE(" > "+s2DA+".2DA found.");
SetLocalString(oPC, MK_DEF_VFX, s2DA);
}
else
{
MK_DEBUG_TRACE(" > "+s2DA+".2DA not found.");
DeleteLocalString(oPC, MK_DEF_VFX);
SendMessageToPC(oPC, "VFX filter definition files 'mk_def_vfx.2da' or 'mk_sys_vfx.2da' not found!");
bReturn = FALSE;
}
}
return bReturn;
}
int MK_VFX_GetCurrentVFX()
{
return GetLocalInt(OBJECT_SELF, MK_VFX_CURRENT_VFX);
}
void MK_VFX_SetCurrentVFX(int nVFX)
{
SetLocalInt(OBJECT_SELF, MK_VFX_CURRENT_VFX, nVFX);
}
int MK_VFX_GetCurrentRow()
{
return GetLocalInt(OBJECT_SELF, MK_VFX_CURRENT_ROW);
}
void MK_VFX_SetCurrentRow(int nRow)
{
SetLocalInt(OBJECT_SELF, MK_VFX_CURRENT_ROW, nRow);
}
string MK_VFX_Get_VFXModeFile(object oPC)
{
return GetLocalString(oPC, MK_DEF_VFX);
}
int MK_VFX_GetVFXMode(object oPC)
{
return GetLocalInt(oPC, MK_VFX_MODE);
}
void MK_VFX_SetVFXMode(int nVFXMode, object oPC)
{
SetLocalInt(oPC, MK_VFX_MODE, nVFXMode);
}
int MK_VFX_GetVFXIsValid(object oPC, int nVFXmode, int nRow, object oTarget)
{
int bReturn = FALSE;
int nVFX = MK_VFX_GetVFX(oPC, nVFXmode, nRow, oTarget);
if (nVFX!=-1)
{
bReturn = (Get2DAString(MK_VFX_BIOWARE_2DA, "Type_FD", nVFX)!="");
}
return bReturn;
}
int MK_VFX_GetNumberOfVFXPerPage(object oPC)
{
return GetLocalInt(oPC, MK_VFX_PER_PAGE);
}
string MK_VFX_Get2DAFile(object oPC, int nVFXmode)
{
string s2DA = Get2DAString(MK_VFX_Get_VFXModeFile(oPC), "2DAFILE", nVFXmode);
if (s2DA=="")
{
s2DA = MK_VFX_BIOWARE_2DA;
}
return s2DA;
}
string MK_VFX_GetRaceGenderColumn(object oTarget)
{
int nRacialType = GetRacialType(oTarget);
string sAppearance =Get2DAString("racialtypes", "Appearance", nRacialType);
if (sAppearance!="")
{
nRacialType = MK_Search2DAFile("racialtypes", "Appearance", sAppearance, 50);
}
return Get2DAString("racialtypes", "Label", nRacialType)+"_"+MK_GetGenderAsString(oTarget);
}
int MK_VFX_GetVFX(object oPC, int nVFXMode, int nRow, object oTarget)
{
int nVFX=-1;
string s2DA = Get2DAString(MK_VFX_Get_VFXModeFile(oPC), "2DAFILE", nVFXMode);
// MK_DEBUG_TRACE("MK_VFX_GetVFX("+IntToString(nVFXMode)+","+IntToString(nRow)+"): s2DA="+s2DA);
if (s2DA=="")
{
nVFX = nRow;
}
else
{
string sColumn = MK_VFX_GetRaceGenderColumn(oTarget);
nVFX = MK_Get2DAInt(s2DA, sColumn, nRow, -1);
// MK_DEBUG_TRACE(" > sColumn="+sColumn+", nVFX="+IntToString(nVFX));
if (nVFX == -1)
{
nVFX = MK_Get2DAInt(s2DA, "Default", nRow, -1);
// MK_DEBUG_TRACE(" > nVFX="+IntToString(nVFX));
}
}
return nVFX;
}
string MK_VFX_GetTag(int nVFX)
{
return "MK_VFX_"+MK_IntToString(nVFX, 5, "0");
}
int MK_VFX_GetHasVFX(object oPC, int nVFX, object oTarget)
{
if (MK_VERSION_GetIsVersionLower_1_74(oPC))
{
return FALSE;
}
string sTag = MK_VFX_GetTag(nVFX);
effect eEff = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEff))
{
if (MK_EFFECT_GetTag(eEff) == sTag)
{
return TRUE;
}
eEff = GetNextEffect(oTarget);
}
return FALSE;
}
int MK_VFX_RemoveVFX(object oTarget, int nVFX, object oPC)
{
if (MK_VERSION_GetIsVersionLower_1_74(oPC))
{
SendMessageToPC(oPC, "EE features are disabled. Can't remove specific effects!");
return FALSE;
}
string sTag = MK_VFX_GetTag(nVFX);
effect eEff = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEff))
{
if (MK_EFFECT_GetTag(eEff) == sTag)
{
RemoveEffect(oTarget, eEff);
return TRUE;
}
eEff = GetNextEffect(oTarget);
}
// SendMessageToPC(oPC, "Specified effect not found!");
return FALSE;
}
int MK_VFX_ApplyVFX(object oTarget, int nVFX, object oPC, int nVFXmode, int nRow)
{
int nDurationType = DURATION_TYPE_INSTANT;
int nSubType = SUBTYPE_MAGICAL;
string s2DAFile = MK_VFX_Get2DAFile(oPC, nVFXmode);
if (s2DAFile!="")
{
if (nRow==-1) nRow = nVFX;
string sTypeFD = Get2DAString(s2DAFile, "Type_FD", nRow);
if ((sTypeFD == "D") || (sTypeFD == "B"))
{
if (Get2DAString(s2DAFile, "Supernatural", nRow) == "1")
{
nSubType = SUBTYPE_SUPERNATURAL;
}
nDurationType = DURATION_TYPE_PERMANENT;
}
}
MK_VFX_ApplyVisualEffect(nVFX, oTarget, nSubType, nDurationType, 0.0f, MK_VFX_GetTag(nVFX));
SendMessageToPC(oPC, "Applying specified vfx (name="+Get2DAString(s2DAFile, "Label", nRow)+","+IntToString(nVFX)+")!");
/*
effect eEffect = MK_EFFECT_VisualEffect(nVFX);
int nDurationType = DURATION_TYPE_INSTANT;
string s2DAFile = MK_VFX_Get2DAFile(nVFXmode);
if (s2DAFile!="")
{
if (nRow==-1) nRow = nVFX;
string sTypeFD = Get2DAString(s2DAFile, "Type_FD", nRow);
if ((sTypeFD == "D") || (sTypeFD == "B"))
{
if (Get2DAString(s2DAFile, "Supernatural", nRow) == "1")
{
eEffect = SupernaturalEffect(eEffect);
}
nDurationType = DURATION_TYPE_PERMANENT;
}
}
// if (MK_VERSION_GetIsVersionGreaterEqual_1_74(oPC))
// {
// eEffect = TagEffect(eEffect, MK_VFX_GetTag(nVFX));
// }
SendMessageToPC(oPC, "Applying specified vfx (name="+Get2DAString(s2DAFile, "Label", nRow)+","+IntToString(nVFX)+")!");
ApplyEffectToObject(nDurationType, eEffect, oPC);
*/
return TRUE;
}
void MK_VFX_RemoveAllEffects(object oTarget, int nEffectType, int nEffectSubType)
{
effect eEffect = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEffect))
{
if ( ( GetEffectType (eEffect) == nEffectType ) &&
( (nEffectSubType==0) || (GetEffectSubType(eEffect) == nEffectSubType)) )
{
RemoveEffect(oTarget, eEffect);
}
eEffect = GetNextEffect(oTarget);
}
}
/*
struct MK_VFX_DESCRIPTION
{
string sDescription;
string sPrefix1;
string sPrefix2;
};
struct MK_VFX_DESCRIPTION MK_VFX_SetDescription(string sName)
{
struct MK_VFX_DESCRIPTION desc;
int nPos0 = FindSubString(sName, "_");
int nPos1 = ( (nPos0 == -1) ? -1 : MK_VERSION_FindSubString(sName, "_", nPos0+1) );
int nLen = GetStringLength(sName);
if (nPos1!=-1)
{
desc.sPrefix1 = GetStringLeft(sName, nPos0);
if (desc.sPrefix1 == "SCENE")
{
desc.sPrefix2 = "";
desc.sDescription = GetStringRight(sName, nLen - nPos0 - 1);
}
else
{
desc.sPrefix2 = GetSubString(sName, nPos0+1, nPos1 - nPos0 -1);
desc.sDescription = GetStringRight(sName, nLen - nPos1 - 1);
}
}
else if (nPos0!=-1)
{
desc.sDescription = GetStringRight(sName, nLen - nPos0 - 1);
desc.sPrefix1 = GetStringLeft(sName, nPos0);
desc.sPrefix2 = "";
}
else
{
desc.sDescription = sName;
desc.sPrefix1 = "";
desc.sPrefix2 = "";
}
return desc;
}
*/
string MK_VFX_GetDescription(int nVFXmode, int nVFX, string sName)
{
string sDescription;
switch (nVFXmode)
{
case 0:
{
int nLen = GetStringLength(sName);
int nNewLen = -1;
if ((nLen>25) && (nVFX>=100))
{
nNewLen = 24;
}
else if ((nLen>26) && (nVFX>=10))
{
nNewLen = 25;
}
else if (nLen>27)
{
nNewLen = 26;
}
if (nNewLen!=-1)
{
sName = GetStringLeft(sName, nNewLen)+"..";
}
sDescription = sName + " ("+IntToString(nVFX)+")";
break;
}
default:
sDescription = sName + " ("+IntToString(nVFX)+")";
break;
}
/*
case 1:
case 2:
case 3:
sDescription = sName + " ("+IntToString(nVFX)+")";
break;
default:
{
struct MK_VFX_DESCRIPTION desc = MK_VFX_SetDescription(sName);
sDescription = desc.sDescription + " ("+IntToString(nVFX);
if ((desc.sPrefix1 != "VFX") && (desc.sPrefix1 != ""))
{
sDescription += (", " + desc.sPrefix1);
}
if (desc.sPrefix2 != "")
{
sDescription += (", " + desc.sPrefix2);
}
sDescription += ")";
break;
}
}
*/
return sDescription;
}
effect MK_EFFECT_VisualEffect(int nVisualEffectId, int nMissEffect, float fScale, vector vTranslate, vector vRotate)
{
effect e;
if (MK_VERSION_GetIsBuildVersionGreaterEqual(OBJECT_SELF, 8193, 14))
{
MK_DEBUG_TRACE("EffectVisualEffect("+IntToString(nVisualEffectId)
+", "+IntToString(nMissEffect)
+", "+FloatToString(fScale, 7, 3)
+", ("+FloatToString(vTranslate.x, 7, 3)
+", "+FloatToString(vTranslate.y, 7, 3)
+", "+FloatToString(vTranslate.z, 7, 3)+")"
+", ("+FloatToString(vRotate.x, 7, 3)
+", "+FloatToString(vRotate.y, 7, 3)
+", "+FloatToString(vRotate.z, 7, 3)+")");
e = EffectVisualEffect(nVisualEffectId, nMissEffect, fScale, vTranslate, vRotate);
}
else
{
MK_DEBUG_TRACE("EffectVisualEffect("+IntToString(nVisualEffectId)+")");
e = EffectVisualEffect(nVisualEffectId);
}
if (MK_VERSION_GetIsVersionGreaterEqual_1_74())
{
string sTag = MK_VFX_GetTag(nVisualEffectId);
if (MK_VERSION_GetIsBuildVersionGreaterEqual(OBJECT_SELF, 8193, 14))
{
sTag += "$$$";
sTag += (FloatToString(fScale, 7, 3) + "<22>");
sTag += (FloatToString(vTranslate.x, 9, 3)
+FloatToString(vTranslate.y, 9, 3)
+FloatToString(vTranslate.z, 9, 3) + "<22>");
sTag += (FloatToString(vRotate.x , 9, 3)
+FloatToString(vRotate.y , 9, 3)
+FloatToString(vRotate.z , 9, 3) + "$");
}
MK_DEBUG_TRACE(" > sTag = '"+sTag+"'");
e = TagEffect(e, sTag);
}
return e;
}
string MK_EFFECT_GetTag(effect e)
{
string sTag = GetEffectTag(e);
int nPos = FindSubString(sTag, "$$$");
if (nPos!=-1)
{
sTag = GetStringLeft(sTag, nPos);
}
return sTag;
}
float MK_EFFECT_GetScale(effect e)
{
float fScale = 1.0f;
string sTag = GetEffectTag(e);
int nPos = FindSubString(sTag, "$$$");
if (nPos != -1)
{
sTag = GetSubString(sTag, nPos+3, 7);
fScale = StringToFloat(sTag);
}
return fScale;
}
vector MK_EFFECT_GetTranslate(effect e)
{
vector vTrans = [0.0, 0.0, 0.0];
string sTag = GetEffectTag(e);
int nPos = FindSubString(sTag, "$$$");
if (nPos != -1)
{
sTag = GetSubString(sTag, nPos+3+10, 28);
vTrans.x = StringToFloat(GetSubString(sTag,0,9));
vTrans.y = StringToFloat(GetSubString(sTag,9,9));
vTrans.z = StringToFloat(GetSubString(sTag,18,9));
}
return vTrans;
}
vector MK_EFFECT_GetRotate(effect e)
{
vector vRotate = [0.0, 0.0, 0.0];
string sTag = GetEffectTag(e);
int nPos = FindSubString(sTag, "$$$");
if (nPos != -1)
{
sTag = GetSubString(sTag, nPos+3+10+28, 28);
vRotate.x = StringToFloat(GetSubString(sTag,0,9));
vRotate.y = StringToFloat(GetSubString(sTag,9,9));
vRotate.z = StringToFloat(GetSubString(sTag,18,9));
}
return vRotate;
}
effect MK_EFFECT_GetCurrentEffect(object oTarget)
{
int nVFX = MK_VFX_GetCurrentVFX();
string sTag = MK_VFX_GetTag(nVFX);
effect eEff = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEff))
{
if (MK_EFFECT_GetTag(eEff) == sTag)
{
return eEff;
}
eEff = GetNextEffect(oTarget);
}
effect e;
return e;
}
void MK_EFFECT_UpdateEffect(object oTarget, int nVFX, object oPC, float fScale, vector vTranslate, vector vRotate)
{
MK_DEBUG_TRACE("UpdateEffect(...,"+IntToString(nVFX)+", "+FloatToString(fScale, 7, 3)+")");
if (nVFX!=-1)
{
string sTag = MK_VFX_GetTag(nVFX);
effect e = GetFirstEffect(oTarget);
while (GetIsEffectValid(e))
{
if (MK_EFFECT_GetTag(e) == sTag)
{
MK_DEBUG_TRACE(" > effect found!");
int nSubType = GetEffectSubType(e);
int nDurationType = GetEffectDurationType(e);
int nDurationRemaining = GetEffectDurationRemaining(e);
RemoveEffect(oTarget, e);
effect eEff = MK_EFFECT_VisualEffect(nVFX, FALSE, fScale, vTranslate, vRotate);
switch (nSubType)
{
case SUBTYPE_SUPERNATURAL:
eEff = SupernaturalEffect(eEff);
break;
case SUBTYPE_MAGICAL:
eEff = MagicalEffect(eEff);
break;
case SUBTYPE_EXTRAORDINARY:
eEff = ExtraordinaryEffect(eEff);
break;
}
MK_DEBUG_TRACE(" > nDurationType="+IntToString(nDurationType));
SetLocalString(oPC, MK_EFFECT_SCALE, FloatToString(fScale, 7, 3));
SetLocalString(oPC, MK_EFFECT_TRANSLATE, "("+FloatToString(vTranslate.x,7,3)+
FloatToString(vTranslate.y, 7, 3)+
FloatToString(vTranslate.z, 7, 3)+")");
SetLocalString(oPC, MK_EFFECT_ROTATE, "("+FloatToString(vRotate.x,7,3)+
FloatToString(vRotate.y, 7, 3)+
FloatToString(vRotate.z, 7, 3)+")");
DelayCommand(0.0f, ApplyEffectToObject(nDurationType, eEff, oTarget, IntToFloat(nDurationRemaining)));
// ApplyEffectToObject(nDurationType, eEff, oPC, IntToFloat(nDurationRemaining));
return;
}
e = GetNextEffect(oTarget);
}
MK_DEBUG_TRACE(" > effect not found!");
}
}
void MK_VFX_ApplyVisualEffect(int nVisualEffectId, object oTarget, int nSubType, int nDurationType, float fDuration, string sTag, int bMissEffect, float fScale, vector vTranslate, vector vRotate, int bDelay)
{
if (MK_VERSION_GetIsBuildVersionGreaterEqual(OBJECT_SELF, 8193, 14))
{
effect e = EffectVisualEffect(nVisualEffectId, bMissEffect, fScale, vTranslate, vRotate);
switch (nSubType)
{
case SUBTYPE_EXTRAORDINARY:
e = ExtraordinaryEffect(e);
break;
case SUBTYPE_SUPERNATURAL:
e = SupernaturalEffect(e);
break;
}
if (sTag!="")
{
e = TagEffect(e, sTag);
}
if (bDelay)
{
DelayCommand(0.0f, ApplyEffectToObject(nDurationType, e, oTarget, fDuration));
}
else
{
ApplyEffectToObject(nDurationType, e, oTarget, fDuration);
}
}
else
{
string sScript="mk_apply_vis_eff";
object oObject = oTarget;
SetLocalInt(oObject, "PARAM_01", nVisualEffectId);
SetLocalObject(oObject, "PARAM_02", oTarget);
SetLocalInt(oObject, "PARAM_03", nSubType);
SetLocalInt(oObject, "PARAM_04", nDurationType);
SetLocalFloat(oObject, "PARAM_05", fDuration);
SetLocalString(oObject, "PARAM_06", sTag);
SetLocalInt(oObject, "PARAM_07", bDelay);
ExecuteScript(sScript, oObject);
}
}
/*
void main()
{
}
/**/