2025/09/04 Update
Implemented class titles for randomized mobs with class levels. Full compile.
This commit is contained in:
@@ -1,4 +1,30 @@
|
||||
void main()
|
||||
{
|
||||
object oPC = GetEnteringObject();
|
||||
|
||||
if (GetIsPC(oPC))
|
||||
{
|
||||
string sDestTag = GetLocalString(oPC, "Respawn");
|
||||
if (sDestTag == "")
|
||||
{
|
||||
sDestTag = "EN4_Respawn";
|
||||
}
|
||||
|
||||
object oSpawnPoint = GetObjectByTag(sDestTag);
|
||||
if (GetIsObjectValid(oSpawnPoint))
|
||||
{
|
||||
AssignCommand(oPC, JumpToLocation(GetLocation(oSpawnPoint)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// optional debug
|
||||
FloatingTextStringOnCreature("Invalid spawn point: " + sDestTag, oPC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* void main()
|
||||
{
|
||||
object oPC;
|
||||
object oSpawnPoint;
|
||||
@@ -13,4 +39,4 @@ if (GetIsPC(oPC))
|
||||
AssignCommand(oPC,JumpToLocation(GetLocation(oSpawnPoint)));
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
@@ -4,7 +4,7 @@
|
||||
// ms_name_inc.nss //
|
||||
// //
|
||||
// By Thrym of Markshire 5/21/06 //
|
||||
// Updated by: Jaysyn 2021/12/03 //
|
||||
// Updated by: Jaysyn 2025-09-04 21:26:03 //
|
||||
// //
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
@@ -60,13 +60,13 @@
|
||||
|
||||
#include "prc_inc_racial"
|
||||
|
||||
|
||||
|
||||
///// FUNCTION DECLARATIONS ////////////////////////////////////////////////////
|
||||
|
||||
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF);
|
||||
//:: Function to get the class type with the highest level
|
||||
int GetHighestClassType(object oNPC = OBJECT_SELF);
|
||||
|
||||
int GetHighestClassLevel(object oCreature = OBJECT_SELF);
|
||||
//:: Returns class level based NPC titles
|
||||
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF);
|
||||
|
||||
// Generates a Random First Name
|
||||
// based on Race and Gender
|
||||
@@ -89,9 +89,25 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF);
|
||||
|
||||
///// FUNCTIONS ////////////////////////////////////////////////////////////////
|
||||
|
||||
// Function to get the name of a class
|
||||
string GetClassName(int nClass)
|
||||
{
|
||||
// Look up the StrRef as a string in spells.2da
|
||||
string sStrRef = Get2DAString("classes", "Name", nClass);
|
||||
|
||||
// Convert to an integer
|
||||
int nStrRef = StringToInt(sStrRef);
|
||||
|
||||
// Look up the name in the dialog.tlk file
|
||||
string sClassName = GetStringByStrRef(nStrRef);
|
||||
|
||||
// return the spell's name
|
||||
return sClassName;
|
||||
}
|
||||
|
||||
void ms_Nomenclature(object oNPC = OBJECT_SELF)
|
||||
{
|
||||
string sRandomName = GetLocalString(oNPC, "SET_NAME");
|
||||
string sRandomName = GetLocalString(oNPC, "SET_NAME");
|
||||
string sTitle = GetLocalString(oNPC, "TITLE");
|
||||
string sPostfix = GetLocalString(oNPC, "POSTFIX");
|
||||
string sBaseRace = GetLocalString(oNPC, "BASE_RACE");
|
||||
@@ -99,11 +115,17 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
|
||||
|
||||
int bClassTitle = GetLocalInt(oNPC,"CLASS_TITLE");
|
||||
|
||||
|
||||
//:: Handles class level based NPC titles
|
||||
if (bClassTitle)
|
||||
{
|
||||
sClassTitle = GetClassLevelTitle(GetHighestClassLevel(oNPC), oNPC);
|
||||
int nClassType = GetHighestClassType(oNPC);
|
||||
sClassTitle = GetClassLevelTitle(nClassType, oNPC);
|
||||
|
||||
string sClassName = GetClassName(nClassType);
|
||||
|
||||
sRandomName = sBaseRace +" "+ sClassTitle;
|
||||
DelayCommand(0.0f, SetName(oNPC, (sRandomName)));
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Handles class based Henchman titles
|
||||
@@ -961,7 +983,7 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
|
||||
|
||||
if (sRandomName != "")
|
||||
{
|
||||
if (sRandomName == "RANDOM")
|
||||
if (sRandomName == "RANDOM")
|
||||
{
|
||||
switch (GetLocalInt(oNPC, "NAME_TYPE"))
|
||||
{
|
||||
@@ -969,13 +991,8 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
|
||||
default: sRandomName = sTitle + " " + ms_RandomFirstName(oNPC) + " " + sPostfix; break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bClassTitle)
|
||||
{
|
||||
sRandomName = sBaseRace +" "+ sTitle;
|
||||
}
|
||||
|
||||
SetName(oNPC, (sRandomName));
|
||||
|
||||
DelayCommand(0.0f, SetName(oNPC, (sRandomName)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1048,62 +1065,75 @@ string ms_RandomLastName(object oNPC = OBJECT_SELF)
|
||||
return Name;
|
||||
}
|
||||
|
||||
//:: Function to get the highest class level of an object, excluding racialtype classes
|
||||
int GetHighestClassLevel(object oCreature)
|
||||
// Returns the class constant (int) for the creature's highest class by level.
|
||||
// Skips racial type pseudo-classes. Returns -1 if none.
|
||||
int GetHighestClassType(object oNPC = OBJECT_SELF)
|
||||
{
|
||||
int nHighestLevel = -1;
|
||||
int nClassTypes = 254; // Maximum number of class types
|
||||
object oPC = GetFirstPC();
|
||||
|
||||
if (!GetIsObjectValid(oNPC)) return -1;
|
||||
|
||||
int nBestClass = -1;
|
||||
int nBestLevel = -1;
|
||||
int i;
|
||||
int nClass;
|
||||
int nLevel;
|
||||
int nMaxClasses = 254;
|
||||
|
||||
for (i = 0; i <= nClassTypes; i++)
|
||||
i = 1;
|
||||
while (i <= nMaxClasses)
|
||||
{
|
||||
// Check if the class type is excluded
|
||||
if (i == CLASS_TYPE_ABERRATION ||
|
||||
i == CLASS_TYPE_ANIMAL ||
|
||||
i == CLASS_TYPE_BEAST ||
|
||||
i == CLASS_TYPE_CONSTRUCT ||
|
||||
i == CLASS_TYPE_DRAGON ||
|
||||
i == CLASS_TYPE_ELEMENTAL ||
|
||||
i == CLASS_TYPE_FEY ||
|
||||
i == CLASS_TYPE_GIANT ||
|
||||
i == CLASS_TYPE_HUMANOID ||
|
||||
i == CLASS_TYPE_MAGICAL_BEAST ||
|
||||
i == CLASS_TYPE_MONSTROUS ||
|
||||
i == CLASS_TYPE_OOZE ||
|
||||
i == CLASS_TYPE_OUTSIDER ||
|
||||
i == CLASS_TYPE_PLANT ||
|
||||
i == CLASS_TYPE_SHAPECHANGER ||
|
||||
i == CLASS_TYPE_UNDEAD ||
|
||||
i == CLASS_TYPE_VERMIN)
|
||||
continue;
|
||||
|
||||
int nLevel = GetLevelByClass(i, oCreature);
|
||||
if (nLevel > 0)
|
||||
nClass = GetClassByPosition(i, oNPC);
|
||||
if (nClass != -1)
|
||||
{
|
||||
if (nLevel > nHighestLevel)
|
||||
// skip racial types
|
||||
if (nClass == CLASS_TYPE_ABERRATION ||
|
||||
nClass == CLASS_TYPE_ANIMAL ||
|
||||
nClass == CLASS_TYPE_BEAST ||
|
||||
nClass == CLASS_TYPE_CONSTRUCT ||
|
||||
nClass == CLASS_TYPE_DRAGON ||
|
||||
nClass == CLASS_TYPE_ELEMENTAL ||
|
||||
nClass == CLASS_TYPE_FEY ||
|
||||
nClass == CLASS_TYPE_GIANT ||
|
||||
nClass == CLASS_TYPE_HUMANOID ||
|
||||
nClass == CLASS_TYPE_MAGICAL_BEAST ||
|
||||
nClass == CLASS_TYPE_MONSTROUS ||
|
||||
nClass == CLASS_TYPE_OOZE ||
|
||||
nClass == CLASS_TYPE_OUTSIDER ||
|
||||
nClass == CLASS_TYPE_PLANT ||
|
||||
nClass == CLASS_TYPE_SHAPECHANGER ||
|
||||
nClass == CLASS_TYPE_UNDEAD ||
|
||||
nClass == CLASS_TYPE_VERMIN)
|
||||
{
|
||||
nHighestLevel = nLevel;
|
||||
// skip
|
||||
}
|
||||
else
|
||||
{
|
||||
nLevel = GetLevelByClass(nClass, oNPC);
|
||||
if (nLevel > nBestLevel)
|
||||
{
|
||||
nBestLevel = nLevel;
|
||||
nBestClass = nClass;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break; // Reached an invalid class level, exit the loop
|
||||
}
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
return nHighestLevel;
|
||||
return nBestClass;
|
||||
}
|
||||
|
||||
|
||||
//:: Handles class level based NPC titles
|
||||
//:: Returns class level based NPC titles
|
||||
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
{
|
||||
object oPC = GetFirstPC();
|
||||
|
||||
string sTitle;
|
||||
int nHighClass = GetHighestClassLevel(oNPC);
|
||||
int nLevel = GetLevelByClass(nHighClass, oNPC);
|
||||
int nGender = GetGender(oNPC);
|
||||
|
||||
switch (nHighClass)
|
||||
int nLevel = GetLevelByClass(nClassType, oNPC);
|
||||
int nGender = GetGender(oNPC);
|
||||
|
||||
switch (nClassType)
|
||||
{
|
||||
case CLASS_TYPE_BARBARIAN:
|
||||
switch(nLevel)
|
||||
@@ -1174,8 +1204,8 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
{sTitle = "Conqueress"; break;}
|
||||
else
|
||||
{sTitle = "Conqueror"; break;}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_ROGUE:
|
||||
switch(nLevel)
|
||||
@@ -1236,6 +1266,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Master Rogue"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_BARD:
|
||||
switch(nLevel)
|
||||
@@ -1335,6 +1366,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Master Bard"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_SORCERER:
|
||||
case CLASS_TYPE_WIZARD:
|
||||
@@ -1396,6 +1428,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Archmage"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_CLERIC:
|
||||
switch(nLevel)
|
||||
@@ -1468,6 +1501,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
{sTitle = "High Priest"; break;}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_DRUID:
|
||||
switch(nLevel)
|
||||
@@ -1528,6 +1562,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Archdruid"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_FIGHTER:
|
||||
switch(nLevel)
|
||||
@@ -1588,6 +1623,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Grandmaster"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_MONK:
|
||||
switch(nLevel)
|
||||
@@ -1659,6 +1695,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "High Master"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_PALADIN:
|
||||
switch(nLevel)
|
||||
@@ -1730,7 +1767,8 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "High Master"; break;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_RANGER:
|
||||
switch(nLevel)
|
||||
{
|
||||
@@ -1817,10 +1855,10 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Ranger Lord"; break;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return sTitle;
|
||||
}
|
||||
|
||||
//::void main (){}
|
||||
//::void main (){}
|
@@ -6,7 +6,6 @@
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////////
|
||||
|
||||
#include "ms_name_inc"
|
||||
|
||||
void NoDropGear(object oNPC)
|
||||
@@ -101,5 +100,6 @@ void main()
|
||||
|
||||
|
||||
//:: Markshire Nomeclature
|
||||
ms_Nomenclature(oNPC);
|
||||
DelayCommand(0.0f, ms_Nomenclature(oNPC));
|
||||
//DoDebug("prc_pwonspawn: Finished.");
|
||||
}
|
Reference in New Issue
Block a user