Aschbourne_PRC8/_module/nss/mk_inc_head.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

407 lines
12 KiB
Plaintext

/////////////////////////////////////////////////////////////////////////////
//
// mk_inc_head.nss
//
/////////////////////////////////////////////////////////////////////////////
#include "mk_inc_debug"
#include "mk_inc_tools"
#include "mk_inc_array"
#include "mk_inc_body"
// name of the local that stores the head filter definition 2da file
const string MK_DEF_HEAD = "mk_def_head";
const string MK_HEAD_MAX_HEAD_ID = "MK_HEAD_MAX_ID";
const string MK_HEAD_SELECTED_FILTER = "MK_HEAD_SELECTED_FILTER";
const string MK_HEAD_VALID_HEADS = "MK_HEAD_VALID_HEADS";
const string MK_HEAD_DISABLE_CHANGE_FILTER = "MK_HEAD_DISABLE_CHANGE_FILTER";
const string MK_HEAD_DEFAULT_FILTER = "MK_HEAD_DEFAULT_FILTER";
const int MK_HEAD_NEXT = 1;
const int MK_HEAD_PREV = 2;
const int MK_HEAD_MODEL = 3;
/////////////////////////////////////////////////////////////////////////////
// initializes the head filter system
// sets the 2da file used (mk_sys_head.2da or mk_def_head.2da)
// returns FALSE if none of these files were found.
int MK_HEAD_Initialize(object oPC, object oTarget);
// returns the 2DA file used to store the valid filters (mk_sys_head or mk_def_head)
string MK_HEAD_Get2DAFile(object oPC);
// returns the max head ID. If no max head ID is set then 255 is returned
int MK_HEAD_GetMaxHeadID(object oPC);
// returns Get2DAString("mk_def_head", "2DAFILE", nFilterID)
string MK_HEAD_GetFilter2DAFile(object oPC, int nFilterID);
// returns RacialType_Gender
string MK_HEAD_GetBaseColumn(object oTarget);
// returns the column name for the specified object (racialtype, gender) and
// the specified filter ID (row in "mk_def_head")
string MK_HEAD_GetColumn(object oPC, object oTarget, int nFilterID);
// returns TRUE if the specified filter provides no heads for oTarget
int MK_HEAD_GetIsFilterEmpty(object oPC, object oTarget, int nFilterID);
// sets the head model to be used on the creature specified
// - oTarget: the creature to change the head for
// - nMode: MK_HEAD_NEXT: next valid head model number
// MK_HEAD_PREV: previous valid head model number
// MK_HEAD_MODEL: set head model number to nModelNumber
// - nModelNumber: model number used for mode MK_HEAD_MODEL
int MK_HEAD_SetCreatureHead(object oTarget, int nMode, int nModelNumber=-1);
string MK_HEAD_GetSelectedFilterAsText(object oPC, object oTarget);
// creates the valid heads string for oTarget on oTarget
string MK_HEAD_CreateValidHeadsString(object oTarget, object oPC);
string MK_HEAD_GetSelectedFilterString(object oTarget);
void MK_HEAD_SetSelectedFilterString(object oTarget, string sSelectedFilter);
int MK_HEAD_GetMaxHeadID(object oPC)
{
int nMaxID = GetLocalInt(oPC, MK_HEAD_MAX_HEAD_ID);
if (nMaxID==0)
{
nMaxID = 255;
}
return nMaxID;
}
int MK_HEAD_Initialize(object oPC, object oTarget)
{
MK_DEBUG_TRACE("MK_HEAD:Initialize('"+GetName(oPC)+"')");
int bReturn = TRUE;
string s2DA = "mk_def_head";
if (Get2DAString(s2DA, "NAME", 0) == "MK_HEAD_DEFAULT")
{
MK_DEBUG_TRACE(" > "+s2DA+".2DA found ("+Get2DAString(s2DA, "NAME", 0)+").");
SetLocalString(oPC, MK_DEF_HEAD, s2DA);
}
else
{
s2DA = "mk_sys_head";
if (Get2DAString(s2DA, "NAME", 0) == "MK_HEAD_DEFAULT")
{
MK_DEBUG_TRACE(" > "+s2DA+".2DA found.");
SetLocalString(oPC, MK_DEF_HEAD, s2DA);
}
else
{
MK_DEBUG_TRACE(" > "+s2DA+".2DA not found.");
DeleteLocalString(oPC, MK_DEF_HEAD);
SendMessageToPC(oPC, "Head filter definition files 'mk_def_head.2da' or 'mk_sys_head.2da' not found!");
bReturn = FALSE;
}
}
if (MK_HEAD_GetSelectedFilterString(oTarget)=="")
{
MK_HEAD_SetSelectedFilterString(oTarget, GetLocalString(oPC, MK_HEAD_DEFAULT_FILTER));
}
return bReturn;
}
string MK_HEAD_Get2DAFile(object oPC)
{
return GetLocalString(oPC, MK_DEF_HEAD);
}
int MK_HEAD_GetIsCCOHFilter(object oPC, int nFilterID)
{
return MK_Get2DAInt(MK_HEAD_Get2DAFile(oPC), "CCOH", nFilterID);
}
string MK_HEAD_GetFilter2DAFile(object oPC, int nFilterID)
{
return Get2DAString(MK_HEAD_Get2DAFile(oPC), "2DAFILE", nFilterID);
}
string MK_HEAD_GetBaseColumn(object oTarget)
{
int nRacialType = GetRacialType(oTarget);
int nGender = GetGender(oTarget);
string sColumn = Get2DAString("racialtypes", "Label", nRacialType)
+"_"
+MK_GetGenderAsString(oTarget);
return sColumn;
}
string MK_HEAD_GetColumn(object oPC, object oTarget, int nFilterID)
{
string sBaseColumn = MK_HEAD_GetBaseColumn(oTarget);
string sColumn = Get2DAString(MK_HEAD_Get2DAFile(oPC), sBaseColumn, nFilterID);
if (sColumn=="")
{
sColumn = sBaseColumn;
}
return sColumn;
}
string MK_HEAD_GetFilterLabel(object oPC, int nFilterID, object oTarget = OBJECT_SELF)
{
string sLabel="";
string s2DA = MK_HEAD_Get2DAFile(oPC);
int nStrRef = MK_Get2DAInt(s2DA, "STRREF", nFilterID);
if (nStrRef!=0)
{
sLabel = MK_TLK_GetStringByStrRef(nStrRef, GetGender(oTarget));
}
else
{
sLabel = Get2DAString(s2DA, "LABEL", nFilterID);
}
return sLabel;
}
int MK_HEAD_GetIsFilterEmpty(object oPC, object oTarget, int nFilterID)
{
string s2DAFile = MK_HEAD_GetFilter2DAFile(oPC, nFilterID);
if (MK_Get2DAInt(s2DAFile, "DISABLE", FALSE))
{
return TRUE;
}
string sColumn = MK_HEAD_GetColumn(oPC, oTarget, nFilterID);
// MK_DEBUG_TRACE("MK_HEAD_GetIsFilterEmpty("+IntToString(nFilterID)+"): s2DAfile='"+s2DAFile+"', sColumn='"+sColumn+"', CCOH="+(MK_HEAD_GetIsCCOHFilter(oPC, nFilterID) ? "J" : "N"));
if (MK_HEAD_GetIsCCOHFilter(oPC, nFilterID))
{
if (Get2DAString(s2DAFile, sColumn, 256)=="")
{
return TRUE;
}
}
// MK_DEBUG_TRACE("MK_HEAD_GetIsFilterEmpty: s2DAFile='"+s2DAFile+"', sColumn='"+sColumn+"'");
int iRow;
// MK_DEBUG_TRACE(" > MaxHeadID="+IntToString(MK_HEAD_GetMaxHeadID(oPC)));
for (iRow=1; iRow<=MK_HEAD_GetMaxHeadID(oPC); iRow++)
{
if (Get2DAString(s2DAFile, sColumn, iRow)!="")
{
// MK_DEBUG_TRACE(" > iRow="+IntToString(iRow)+", sValue='"+Get2DAString(s2DAFile, sColumn, iRow)+"'");
return FALSE;
}
}
return TRUE;
}
string MK_HEAD_GetSelectedFilterString(object oTarget)
{
return GetLocalString(oTarget, MK_HEAD_SELECTED_FILTER);
}
int MK_HEAD_GetFilterCount(object oTarget)
{
return MK_ARRAY_GetLocalArrayBoolLength(oTarget, MK_HEAD_SELECTED_FILTER);
}
void MK_HEAD_SetSelectedFilterString(object oTarget, string sSelectedFilter)
{
SetLocalString(oTarget, MK_HEAD_SELECTED_FILTER, sSelectedFilter);
}
void MK_HEAD_SelectFilter(object oTarget, int nFilterID, int bSelect)
{
MK_ARRAY_SetLocalArrayBool(oTarget, MK_HEAD_SELECTED_FILTER, nFilterID, bSelect);
}
int MK_HEAD_GetIsFilterSelected(object oTarget, int nFilterID)
{
return MK_ARRAY_GetLocalArrayBool(oTarget, MK_HEAD_SELECTED_FILTER, nFilterID);
}
string MK_HEAD_GetSelectedFilterAsText(object oPC, object oTarget)
{
string sSelectedFilter = MK_HEAD_GetSelectedFilterString(oTarget);
string s="";
int nLen = MK_HEAD_GetFilterCount(oTarget);
int iFilter;
// MK_DEBUG_TRACE("MK_HEAD_GetSelectedFilterAsText: sSelectedFilter='"+sSelectedFilter+"', nLen="+IntToString(nLen));
for (iFilter=0; iFilter<nLen; iFilter++)
{
if (MK_HEAD_GetIsFilterSelected(oTarget, iFilter))
{
s += MK_HEAD_GetFilterLabel(oPC, iFilter, oTarget);
s += ", ";
}
}
if (s=="")
{
s = "none";
}
else
{
s = GetStringLeft(s, GetStringLength(s)-2);
}
// MK_DEBUG_TRACE(" > sToken='"+s+"'");
return s;
}
int MK_HEAD_ToggleFilter(object oTarget, int nFilterID)
{
int bSelect = !MK_HEAD_GetIsFilterSelected(oTarget, nFilterID);
MK_HEAD_SelectFilter(oTarget, nFilterID, bSelect);
return bSelect;
}
string MK_HEAD_GetHeadsString(object oPC, object oTarget, int nFilterID, string sHeadsString="")
{
string s2DAFile = MK_HEAD_GetFilter2DAFile(oPC, nFilterID);
string sColumn = MK_HEAD_GetColumn(oPC, oTarget, nFilterID);
string s="";
int nLength = GetStringLength(sHeadsString);
int iRow;
for (iRow=0; iRow<MK_HEAD_GetMaxHeadID(oPC); iRow++)
{
string sValue = Get2DAString(s2DAFile, sColumn, iRow);
if ((sValue!="") ||
((iRow<nLength) && (GetSubString(sHeadsString, iRow, 1)=="1") ) )
{
s+="1";
}
else
{
s+="0";
}
}
return s;
}
void MK_HEAD_SetValidHeadsString(object oTarget, string sValidHeads)
{
MK_ARRAY_SetLocalArrayBuffer(oTarget, MK_HEAD_VALID_HEADS, sValidHeads);
// SetLocalString(oPC, MK_HEAD_VALID_HEADS, sValidHeads);
}
string MK_HEAD_GetValidHeadsString(object oTarget)
{
return MK_ARRAY_GetLocalArrayBuffer(oTarget, MK_HEAD_VALID_HEADS);
// return GetLocalString(oPC, MK_HEAD_VALID_HEADS);
}
string MK_HEAD_CreateValidHeadsString(object oTarget, object oPC)
{
string sSelectedFilter = MK_HEAD_GetSelectedFilterString(oTarget);
int nFilterCount = GetStringLength(sSelectedFilter);
// MK_DEBUG_TRACE("MK_HEAD_CreateValidHeadsString: sSelectedFilter='"+sSelectedFilter+"', nCount="+IntToString(nFilterCount));
int iFilter;
string sHeadsString="";
int nCount=0;
for (iFilter=0; iFilter<nFilterCount; iFilter++)
{
if (MK_HEAD_GetIsFilterSelected(oTarget, iFilter))
{
sHeadsString = MK_HEAD_GetHeadsString(oPC, oTarget, iFilter, sHeadsString);
// MK_DEBUG_TRACE(" > sHeadsString='"+sHeadsString+"'");
nCount++;
}
}
int iHeads;
string sValidHeads = "";
if (nCount>0)
{
int nHeadCount = GetStringLength(sHeadsString);
for (iHeads=0; iHeads<nHeadCount; iHeads++)
{
if (GetSubString(sHeadsString, iHeads, 1)=="1")
{
sValidHeads+=MK_ARRAY_LocalArraySortedInt_IntToString(iHeads);
}
}
}
else
{
int nHeadCount = MK_HEAD_GetMaxHeadID(oPC)+1;
for (iHeads=1; iHeads<nHeadCount; iHeads++)
{
sValidHeads+=MK_ARRAY_LocalArraySortedInt_IntToString(iHeads);
}
}
MK_HEAD_SetValidHeadsString(oTarget, sValidHeads);
return sValidHeads;
}
int MK_HEAD_SearchModelNumber(object oTarget, int nModelNumber)
{
return MK_ARRAY_SearchLocalArraySortedInt(oTarget, MK_HEAD_VALID_HEADS, nModelNumber);
}
int MK_HEAD_SetCreatureHead(object oTarget, int nMode, int nModelNumber)
{
int nReturn = -1;
// MK_DEBUG_TRACE("MK_HEAD_SetCreatureHead:");
switch (nMode)
{
case MK_HEAD_MODEL:
SetCreatureBodyPart(CREATURE_PART_HEAD, nModelNumber, oTarget);
nReturn = nModelNumber;
break;
case MK_HEAD_NEXT:
case MK_HEAD_PREV:
{
int nCurrent = GetCreatureBodyPart(CREATURE_PART_HEAD, oTarget);
int nPosCurrent = MK_HEAD_SearchModelNumber(oTarget, nCurrent);
int nPosNew, nNew;
int nHeadCount = MK_ARRAY_GetLocalArraySortedIntLength(oTarget, MK_HEAD_VALID_HEADS);
if (nPosCurrent==-1)
{
nPosNew = 0;
}
else
{
switch (nMode)
{
case MK_HEAD_PREV:
nPosNew = (nPosCurrent + nHeadCount - 1) % nHeadCount;
break;
case MK_HEAD_NEXT:
nPosNew = (nPosCurrent + 1) % nHeadCount;
break;
}
}
if (nPosNew>=0)
{
nNew = MK_ARRAY_GetLocalArraySortedInt(oTarget, MK_HEAD_VALID_HEADS, nPosNew);
}
if (nNew!=-1)
{
SetCreatureBodyPart(CREATURE_PART_HEAD, nNew, oTarget);
nReturn = nNew;
}
// MK_DEBUG_TRACE(" > nCurrent="+IntToString(nCurrent)+
// ", ValidHeads='"+sValidHeads+"', nPos="+IntToString(nPos)+
// ", nNew="+IntToString(nNew));
break;
}
}
return nReturn;
}
/*
void main()
{
}
/**/