2025/09/04 Update

Implemented class titles for randomized mobs with class levels.
Full compile.
This commit is contained in:
Jaysyn904
2025-09-04 22:40:44 -04:00
parent a66fae8835
commit 5e36a8b4a6
85 changed files with 4626 additions and 249 deletions

View File

@@ -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)));
}
}
*/

View File

@@ -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 (){}

View File

@@ -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.");
}