///////////////////////////////////////////////////////////////////////////// // // 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 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 sHeadsString='"+sHeadsString+"'"); nCount++; } } int iHeads; string sValidHeads = ""; if (nCount>0) { int nHeadCount = GetStringLength(sHeadsString); for (iHeads=0; iHeads=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() { } /**/