Jaysyn904 66a0a3e043 Initial commit
Initial commit.
2024-08-03 14:13:18 -04:00

897 lines
32 KiB
Plaintext

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::: Shayan's Subrace Engine :::::::::::::::::::::::::::::
// ::::::::::Extension: Moon's Subrace Selection Converstion for SSE :::::::::::
// ::::::::::::Contact: http://p2.forumforfree.com/shayan.html::::::::::::::::::
// ::::
// :::: Written by: DM_Moon
// ::
// :: Description: Subrace Conversation used in SSE's Wand system.
// ::
#include "mn_proto_inc"
string GetNameOfLocationOnObject(object oObject)
{
string sReturn = "LOCATION: ";
if(GetObjectType(oObject) == OBJECT_TYPE_ITEM)
{
sReturn += Moon_ColourString(GetName(GetItemPossessor(oObject) ), COLOUR_YELLOW);
}
else
{
object oArea = GetArea(oObject);
if(GetIsObjectValid(oArea) )
sReturn += Moon_ColourString(GetName(oArea), COLOUR_YELLOW);
else
sReturn = Moon_ColourString("IN TRANSIT", COLOUR_YELLOW);
}
return sReturn;
}
string GetInfoCurrentTarget(object oTarget)
{
string sReturn;
if(!GetIsObjectValid(oTarget)) return "No Target";
sReturn = "NAME: " + Moon_ColourString(GetName(oTarget)) + "\n" +
"LOGIN: " + Moon_ColourString(GetPCPlayerName(oTarget), COLOUR_LRED) + "\n" +
GetNameOfLocationOnObject(oTarget);
return sReturn;
}
string CreateDebugString(int iPart=0, string s="")
{
string sReturn;
switch(iPart)
{
case 0:
sReturn = Moon_ColourString("DEBUG: ", COLOUR_BLUE) + s;
break;
case 1:
sReturn = Moon_ColourString("ERROR: ", COLOUR_RED) + s;
break;
case 2:
sReturn = Moon_ColourString("SUCCESS: ", COLOUR_PURPLE) + s;
break;
case 3:
sReturn = Moon_ColourString("WARNING: ", COLOUR_RED) + s;
break;
case 4:
sReturn = Moon_ColourString("ATTENTION: ") + s;
break;
case 5:
sReturn = Moon_ColourString("GRANTED: ", COLOUR_PURPLE) + s;
break;
case 6:
sReturn = Moon_ColourString("DENIED: ", COLOUR_RED) + s;
break;
case 7:
sReturn = Moon_ColourString("LOG INFO: ", COLOUR_BLUE) + s;
break;
}
return sReturn;
}
string GetClassAndLevel(int iPos, object o)
{
int ClassType = GetClassByPosition(iPos, o);
if( (iPos < 1) || (4 < iPos) || (o == OBJECT_INVALID) )return "";
string c1 = "";
if(iPos > 1) {c1 = " / ";}
switch(ClassType)
{
case CLASS_TYPE_ARCANE_ARCHER: c1 = c1 + "Arcane Archer (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_ASSASSIN: c1 = c1 + "Assasin (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_BARBARIAN: c1 = c1 + "Barbarian (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_BARD: c1 = c1 + "Bard (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_BLACKGUARD: c1 = c1 + "Blackguard (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_CLERIC: c1 = c1 + "Cleric (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_DIVINE_CHAMPION: c1 = c1 + "Champion of Torm (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_DRAGON_DISCIPLE: c1 = c1 + "Red Dragon Disciple (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_DRUID: c1 = c1 + "Druid (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_DWARVEN_DEFENDER: c1 = c1 + "Dwarven Defender (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_FIGHTER: c1 = c1 + "Fighter (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_HARPER: c1 = c1 + "Harper Scout (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_MONK: c1 = c1 + "Monk (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_PALADIN: c1 = c1 + "Paladin (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_PALE_MASTER: c1 = c1 + "Pale Master (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_RANGER: c1 = c1 + "Ranger (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_ROGUE: c1 = c1 + "Rogue (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_SHADOWDANCER: c1 = c1 + "Shadow Dancer (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_SHIFTER: c1 = c1 + "Shifter (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_SORCERER: c1 = c1 + "Sorcerer(ess) (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_WEAPON_MASTER: c1 = c1 + "Weapon Master (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_WIZARD: c1 = c1 + "Wizard (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
case CLASS_TYPE_INVALID: c1 = ""; break;
default: c1 = c1 + "NPC Class (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; break;
}
return c1;
}
void Moon_DM_MSG(string sMSG)
{
SendMessageToAllDMs(sMSG);
}
void Moon_PC_MSG(object oPC, string sMSG)
{
SendMessageToPC(oPC, sMSG);
}
void SendServerWideMessage(string sMessage)
{
object oPC = GetFirstPC();
while(GetIsObjectValid(oPC))
{
SendMessageToPC(oPC, sMessage);
oPC = GetNextPC();
}
}
void WriteLog(string s)
{
WriteTimestampedLogEntry(s);
}
void SaveCharacter(int All=TRUE, object oPlayer=OBJECT_INVALID)
{
if(All)
ExportAllCharacters();
else ExportSingleCharacter(oPlayer);
}
string LETO_GetBicPath_Wand(object oPC)
{
string PlayerName = GetLocalString(oPC, "SUBR_PlayerName");
string BicFolderPath = "";
if(!USE_LOCAL_VAULT_CHARACTERS)
{
BicFolderPath = NWNPATH+"servervault/" + PlayerName + "/";
}
else
{
BicFolderPath = NWNPATH+"localvault/";
}
return BicFolderPath;
}
void moon_CleanCache()
{
int i=0;
int iCache = GetLocalInt(oMySpeaker, "moon_object_cache")+1;
for(;i < iCache; i++)
{
DeleteLocalObject(oMySpeaker, "moon_object_cache" + IntToString(i));
}
DeleteLocalInt(oMySpeaker, "moon_object_cache");
}
void moon_End_Conversation()
{
int nCount;
DeleteLocalInt(oMySpeaker, "mn_started");
for(nCount = 0; nCount <= 10; nCount++)
{
DeleteLocalString(oMySpeaker, "mn_dialog" + IntToString(nCount));
DeleteLocalInt(oMySpeaker, "mn_call" + IntToString(nCount));
DeleteLocalString(oMySpeaker, "mn_params" + IntToString(nCount));
DeleteLocalString(oMySpeaker, "mn_function" + IntToString(nCount));
DeleteLocalString(oMySpeaker, "mn_menu" + IntToString(nCount));
}
moon_CleanCache();
DeleteLocalInt(oMySpeaker, "subrace_dm_wand_pos");
DeleteLocalObject(oMySpeaker, MOON_PREFIX + MOON_TARGET);
}
void moon_BuildCache()
{
int nCount = 1;
object oObject = GetFirstPC();
while(GetIsObjectValid(oObject))
{
if(!GetIsDM(oObject))
{
SetLocalObject(oMySpeaker, "moon_object_cache" + IntToString(nCount), oObject);
nCount++;
}
oObject = GetNextPC();
}
nCount--;
SetLocalInt(oMySpeaker, "moon_object_cache", nCount);
}
void Reset()
{
string sModule = GetModuleName();
if(sModule == "")
{
Moon_PC_MSG(oMySpeaker, CreateDebugString(1, "No Valid Module Name could be retrieved, Module Reset Cancelled"));
return;
}
Moon_PC_MSG(oMySpeaker, CreateDebugString(2, "The Module: " +sModule+" will restart shortly."));
DelayCommand(5.0, SendServerWideMessage(CreateDebugString(3, "The Server will reset shortly.")));
DelayCommand(9.50, SaveCharacter() );
DelayCommand(10.0, StartNewModule(sModule));
}
int ShutdownSSE()
{
object oPC = GetFirstPC();
string subrace = "";
while((subrace = GetSubRace(oPC)) != "")
{
SHA_SendSubraceMessageToPC(oPC, "Subrace Engine has been switched off in the Module! Your subrace will not function until it is turned back on.", TRUE);
SetLocalInt(oPC, SUBRACE_INFO_LOADED_ON_PC, FALSE);
DeleteLocalInt(oPC, SUBRACE_IN_SPELL_DARKNESS);
string SubraceTag = SUBRACE_TAG + "_" + subrace;
int IsLightSens = GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_LIGHT_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS);
int IsUndergSens = GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDERGROUND_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS);
if(IsLightSens)
{
DeleteLocalInt(oPC,"SB_LGHT_DMGED");
}
if(IsUndergSens)
{
DeleteLocalInt(oPC,"SB_DARK_DMGED");
}
ApplyPermanentSubraceSpellResistance(subrace, oPC);
int HasDiffStats = GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_STAT_MODIFIERS, FLAG1);
if(HasDiffStats)
{
DeleteLocalInt(oPC, SUBRACE_STATS_STATUS);
ClearSubraceTemporaryStats(oPC);
}
ChangeToPCDefaultAppearance(oPC);
DelayCommand(3.0, SearchAndDestroySkinsAndClaws(oPC));
DelayCommand(4.0, SetLocalInt(oPC, SUBRACE_INFO_LOADED_ON_PC, TRUE));
oPC = GetNextPC();
}
return TRUE;
}
int StartSSE()
{
object oPC = GetFirstPC();
string subrace = "";
while((subrace = GetSubRace(oPC)) != "")
{
SHA_SendSubraceMessageToPC(oPC, "Subrace Engine has been switched on in the Module! Your subrace functionalities will now resume.", TRUE);
oPC = GetNextPC();
}
return TRUE;
}
int GetAlignmentCodeByFlagNumber(int iNumber)
{
int iAlign=iNumber;
switch(iNumber)
{
case 0: iAlign = ALIGNMENT_GOOD; break;
case 1: iAlign = ALIGNMENT_NEUTRAL; break;
case 2: iAlign = ALIGNMENT_EVIL; break;
case 3: iAlign = ALIGNMENT_LAWFUL; break;
case 4: iAlign = ALIGNMENT_NEUTRAL; break;
case 5: iAlign = ALIGNMENT_CHAOTIC; break;
}
return iAlign;
}
int GetRaceCodeByFlagNumber(int iNumber)
{
int iRace=iNumber;
switch(iNumber)
{
case 0: iRace = RACIAL_TYPE_DWARF; break;
case 1: iRace = RACIAL_TYPE_ELF; break;
case 2: iRace = RACIAL_TYPE_GNOME; break;
case 3: iRace = RACIAL_TYPE_HALFELF; break;
case 4: iRace = RACIAL_TYPE_HALFLING; break;
case 5: iRace = RACIAL_TYPE_HALFORC; break;
case 6: iRace = RACIAL_TYPE_HUMAN; break;
}
return iRace;
}
int GetPrestigeClassCodeByFlagNumber(int iNumber)
{
int iClass=iNumber;
switch(iNumber)
{
case 0: iClass = CLASS_TYPE_ARCANE_ARCHER; break;
case 1: iClass = CLASS_TYPE_ASSASSIN; break;
case 2: iClass = CLASS_TYPE_BLACKGUARD; break;
case 3: iClass = CLASS_TYPE_DIVINE_CHAMPION; break;
case 4: iClass = CLASS_TYPE_DRAGON_DISCIPLE; break;
case 5: iClass = CLASS_TYPE_DWARVEN_DEFENDER; break;
case 6: iClass = CLASS_TYPE_PALEMASTER; break;
case 7: iClass = CLASS_TYPE_SHADOWDANCER; break;
case 8: iClass = CLASS_TYPE_SHIFTER; break;
case 9: iClass = CLASS_TYPE_WEAPON_MASTER; break;
case 10: iClass = CLASS_TYPE_HARPER; break;
}
return iClass;
}
string GetClearenceColour(object oTarget, int iReq, int iParam, int iCode=0, int iSubCode=0)
{
string sReturn = COLOUR_PURPLE;
int iReturn=0;
switch(iCode)
{
case 0:
iReturn = 1<<( (iParam<<1) | ( (GetRacialType(oTarget)==iReq)?4:0) );
break;
case 1:
if(iSubCode < 3)
{
iReturn = 1<<( (iParam<<1) | ( (GetAlignmentGoodEvil(oTarget)==iReq)?4:0) );
}
else
{
iReturn = 1<<( (iParam<<1) | ( (GetAlignmentLawChaos(oTarget)==iReq)?4:0) );
}
break;
case 2:
iReturn = (iReq && (!iParam) )?0x00000002:0x00000040;
break;
}
switch(iReturn)
{
//Did not meet and nor should it be met.
case 0x00000001:
sReturn = COLOUR_DARK; break;
//Should meet but did not meet.
case 0x00000002:
sReturn = COLOUR_RED; break;
//Did not meet but is not neccesary.
case 0x00000004:
sReturn = COLOUR_YELLOW; break;
//Met, but was not a requirement
case 0x00000010:
sReturn = COLOUR_BLUE; break;
//Met Requirement.
case 0x00000040:
sReturn = COLOUR_GREEN; break;
}
return sReturn;
}
string ClassIntToString(int iClass)
{
string sReturn = "";
switch(iClass)
{
case CLASS_TYPE_ARCANE_ARCHER: sReturn = "Arcane Archer"; break;
case CLASS_TYPE_ASSASSIN: sReturn = "Assasin"; break;
case CLASS_TYPE_BARBARIAN: sReturn = "Barbarian"; break;
case CLASS_TYPE_BARD: sReturn = "Bard"; break;
case CLASS_TYPE_BLACKGUARD: sReturn = "Blackguard"; break;
case CLASS_TYPE_CLERIC: sReturn = "Cleric"; break;
case CLASS_TYPE_DIVINE_CHAMPION: sReturn = "Champion of Torm"; break;
case CLASS_TYPE_DRAGON_DISCIPLE: sReturn = "Red Dragon Disciple"; break;
case CLASS_TYPE_DRUID: sReturn = "Druid"; break;
case CLASS_TYPE_DWARVEN_DEFENDER: sReturn = "Dwarven Defender"; break;
case CLASS_TYPE_FIGHTER: sReturn = "Fighter"; break;
case CLASS_TYPE_HARPER: sReturn = "Harper Scout"; break;
case CLASS_TYPE_MONK: sReturn = "Monk"; break;
case CLASS_TYPE_PALADIN: sReturn = "Paladin"; break;
case CLASS_TYPE_PALE_MASTER: sReturn = "Pale Master"; break;
case CLASS_TYPE_RANGER: sReturn = "Ranger"; break;
case CLASS_TYPE_ROGUE: sReturn = "Rogue"; break;
case CLASS_TYPE_SHADOWDANCER: sReturn = "Shadow Dancer"; break;
case CLASS_TYPE_SHIFTER: sReturn = "Shifter"; break;
case CLASS_TYPE_SORCERER: sReturn = "Sorcerer(ess)"; break;
case CLASS_TYPE_WEAPON_MASTER: sReturn = "Weapon Master"; break;
case CLASS_TYPE_WIZARD: sReturn = "Wizard"; break;
case CLASS_TYPE_INVALID: break;
default: sReturn = "NPC Class"; break;
}
return sReturn;
}
string ClassFlagToString(int iFlag);
string ClassFlagToString(int iFlag)
{
string sRet = "";
if(iFlag & FLAG2)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_BARBARIAN);
if(iFlag & FLAG3)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_BARD);
if(iFlag & FLAG4)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_CLERIC);
if(iFlag & FLAG5)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_DRUID);
if(iFlag & FLAG6)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_FIGHTER);
if(iFlag & FLAG7)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_MONK);
if(iFlag & FLAG8)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_PALADIN);
if(iFlag & FLAG9)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_RANGER);
if(iFlag & FLAG10)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_ROGUE);
if(iFlag & FLAG11)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_SORCERER);
if(iFlag & FLAG12)
sRet += "\n-" + ClassIntToString(CLASS_TYPE_WIZARD);
return sRet;
}
string GetAlignmentByFlagNumber(int iNumber)
{
string sAlign;
switch(GetAlignmentCodeByFlagNumber(iNumber) )
{
case ALIGNMENT_GOOD: sAlign = "Good"; break;
case ALIGNMENT_NEUTRAL: sAlign = "Neutral"; break;
case ALIGNMENT_EVIL: sAlign = "Evil"; break;
case ALIGNMENT_LAWFUL: sAlign = "Lawful"; break;
// case ALIGNMENT_NEUTRAL: sAlign = "Neutral"; break;
case ALIGNMENT_CHAOTIC: sAlign = "Chaos"; break;
default: sAlign = "ERROR - INVALID INPUT: " + IntToString(iNumber); break;
}
return sAlign;
}
string GetRaceByFlagNumber(int iNumber)
{
string sRace;
switch(GetRaceCodeByFlagNumber(iNumber) )
{
case RACIAL_TYPE_HUMAN: sRace = "Human"; break;
case RACIAL_TYPE_HALFORC: sRace = "Half-Orc"; break;
case RACIAL_TYPE_HALFELF: sRace = "Half-Elf"; break;
case RACIAL_TYPE_GNOME: sRace = "Gnome"; break;
case RACIAL_TYPE_HALFLING: sRace = "Halfling"; break;
case RACIAL_TYPE_ELF: sRace = "Elf"; break;
case RACIAL_TYPE_DWARF: sRace = "Dwarf"; break;
default: sRace = "ERROR - INVALID INPUT: " + IntToString(iNumber); break;
}
return sRace;
}
string GetAreaTypeByFlagNumber(int iNumber)
{
string sAreaCode="";
switch(iNumber)
{
case 4:
sAreaCode = "Interior Areas"; break;
case 5:
sAreaCode = "Exterior Areas"; break;
case 6:
sAreaCode = "Artificial Areas"; break;
case 7:
sAreaCode = "Natural Areas"; break;
case 8:
sAreaCode = "Above-ground Areas"; break;
case 9:
sAreaCode = "Underground Areas"; break;
default:
sAreaCode = "Invalid Area Code: " + IntToString(iNumber); break;
}
return sAreaCode;
}
object GetMyTarget()
{
return GetLocalObject(oMySpeaker, MOON_PREFIX + MOON_TARGET);
}
void SetMyTarget(object oTarget)
{
SetLocalObject(oMySpeaker, MOON_PREFIX + MOON_TARGET, oTarget );
}
string OutputSubraceInformation(string subraceName)
{
string SubraceTag = SUBRACE_TAG + "_" + subraceName;
string sReturn = Moon_ColourString(CapitalizeString(subraceName), COLOUR_GREEN_SSE);
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDEAD, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += Moon_ColourString(" [Undead]", COLOUR_PURPLE);
}
if(GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_GENDER_RES) > 0)
{
int iGen = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_GENDER_RES);
if(iGen == GENDER_BOTH)
{ iGen = GENDER_MALE | GENDER_FEMALE; }
sReturn += "\nGender Requirements: " + Moon_ColourString(" Male ", ((iGen & GENDER_MALE)?COLOUR_GREEN_SSE:COLOUR_RED)) + Moon_ColourString(" Female ", ((iGen & GENDER_FEMALE)?COLOUR_GREEN_SSE:COLOUR_RED));
}
sReturn += "\nRace Restriction:";
//Shayan, don't look, it is about to become UGLY! (for you :P )
//iTemp and i are two integers, which are constantly changed rather than using
//a new integer each time.
// int iTemp = GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_RACE, SUBRACE_BASE_RACE_FLAGS, SUBRACE_BASE_RACE_FLAGS);
int iTemp = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_BASE_RACE) & SUBRACE_BASE_RACE_FLAGS;
int i=0;
if( !iTemp )
{
sReturn += Moon_ColourString(" No Restrictions", COLOUR_GREEN_SSE);
}
else
{
for( ; i < 7; i++)
{
if( (iTemp>>i) & FLAG1)
{
sReturn += " " + Moon_ColourString(GetRaceByFlagNumber(i), COLOUR_GREEN_SSE);
}
}
}
//Shayan, don't look, it is about to become UGLY! (for you :P )
//iTemp and i are two integers, which are constantly changed rather than using
//a new integer each time.
iTemp = (GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_ALIGNMENT_RESTRICTION)>>1) & SMALLGROUP1;
if( !iTemp )
{
sReturn += "\nAlignment Restriction:" + Moon_ColourString(" No Restrictions", COLOUR_GREEN_SSE);
}
else
{
for( i=0 ; i < 6; i++)
{
switch(i)
{
case 0:
sReturn += "\n - Good/Evil:"; break;
case 1:
case 2:
case 4:
case 5:
sReturn += ","; break;
case 3:
sReturn += Moon_ColourString(" (*)", COLOUR_LYELLOW)+"\n - Law/Chaos:"; break;
}
sReturn += " " + Moon_ColourString(GetAlignmentByFlagNumber(i), ((iTemp>>i) & FLAG1?COLOUR_GREEN_SSE:COLOUR_RED) );
if(i==5) sReturn += Moon_ColourString(" (*)", COLOUR_LYELLOW);
}
}
if(GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_CLASS_RESTRICTION, FLAG1))
{
//Check if we meet Class Req.
sReturn += "\nClass Restriction: ";
sReturn += ClassFlagToString(GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_CLASS_RESTRICTION));
}
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_PRESTIGIOUS_SUBRACE, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += "\n" + Moon_ColourString("Prestigious subrace", COLOUR_LTEAL);
}
iTemp = GetLocalGroupFlagValue(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_ECL);
if(iTemp != 0)
{
sReturn += "\n" + "ECL: " + Moon_ColourString( ((iTemp>0)?"+":"")+ IntToString(iTemp), COLOUR_LRED );
}
return sReturn;
}
string OutputFullSubraceInformation(string subraceName)
{
//See OutputSubraceInformation for comments
string SubraceTag = SUBRACE_TAG + "_" + subraceName;
string sReturn = "SUBRACE NAME: " + Moon_ColourString(CapitalizeString(subraceName), COLOUR_GREEN_SSE );
string sTemp="";
sReturn += "\n\n**** SUBRACE RESTRICTIONS ****\n\n";
if(GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_GENDER_RES) > 0)
{
int iGen = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_GENDER_RES);
if(iGen == GENDER_BOTH)
{ iGen = GENDER_MALE | GENDER_FEMALE; }
sReturn += "\nGender Requirements: " + Moon_ColourString(" Male ", ((iGen & GENDER_MALE)?COLOUR_GREEN_SSE:COLOUR_RED)) + Moon_ColourString(" Female ", ((iGen & GENDER_FEMALE)?COLOUR_GREEN_SSE:COLOUR_RED));
}
sReturn += "\nRacial:";
int iTemp = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_BASE_RACE) & SUBRACE_BASE_RACE_FLAGS;
int i=0;
if( !iTemp )
{
sReturn += Moon_ColourString(" No Restrictions", COLOUR_GREEN_SSE);
}
else
{
for( ; i < 7; i++)
{
if( (iTemp>>i) & FLAG1)
{
sReturn += " " + Moon_ColourString(GetRaceByFlagNumber(i), COLOUR_GREEN_SSE);
}
}
}
//Shayan, don't look, it is about to become UGLY! (for you :P ) <--- Too late I looked!!
//iTemp and i are two integers, which are constantly changed rather than using
//a new integer each time.
iTemp = (GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_ALIGNMENT_RESTRICTION)>>1) & SMALLGROUP1;
if( !iTemp )
{
sReturn += "\nAlignment:" + Moon_ColourString(" No Restrictions", COLOUR_GREEN_SSE);
}
else
{
for( i=0 ; i < 6; i++)
{
switch(i)
{
case 0:
sReturn += "\n - Good/Evil:"; break;
case 1:
case 2:
case 4:
case 5:
sReturn += ","; break;
case 3:
sReturn += Moon_ColourString(" (*)", COLOUR_LYELLOW)+"\n - Law/Chaos:"; break;
}
sReturn += " " + Moon_ColourString(GetAlignmentByFlagNumber(i), ((iTemp>>i) & FLAG1?COLOUR_GREEN_SSE:COLOUR_RED) );
if(i==5) sReturn += Moon_ColourString(" (*)", COLOUR_LYELLOW);
}
}
if(GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_CLASS_RESTRICTION, FLAG1))
{
sReturn += "\nClass Restriction: ";
sReturn += ClassFlagToString(GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_CLASS_RESTRICTION));
}
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_PRESTIGIOUS_SUBRACE, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += "\n" + Moon_ColourString("Prestigious subrace", COLOUR_LTEAL) +
"\nRequires " + IntToString(GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_PRESTIGIOUS_CLASS_RESTRICTION_MINIMUM_LEVELS) ) +
" levels of either:";
iTemp = GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_PRESTIGIOUS_CLASS_RESTRICTION,
MEDIUMGROUP1|TINYGROUP3);
i=2;
int iClass;
for( ; i < 4; i++)
{
iClass = GetClassByPosition(i, GetMyTarget() );
// if(PrestigeClassToFlags(iClass ) & FLAG1)
{
sReturn += "" + ClassIntToString(iClass);
}
}
}
iTemp = GetLocalGroupFlagValue(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_ECL);
if(iTemp != 0)
{
sReturn += "\n" + "ECL: " + Moon_ColourString( ((iTemp>0)?"+":"")+ IntToString(iTemp), COLOUR_LRED );
}
sReturn += "\n\n**** SUBRACE STATS ****\n\n";
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDEAD, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += Moon_ColourString(" [Undead]", COLOUR_PURPLE);
}
iTemp = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_FAVORED_CLASS);
if(iTemp != 0)
{
sReturn += "*Favored Classs:\n";
int MaleFavoredClass = GetLocalGroupFlagValue(oStorer, SubraceTag + "_" + SUBRACE_FAVORED_CLASS, SUBRACE_FAVORED_CLASS_MALE_FLAG);
int FemaleFavoredClass = GetLocalGroupFlagValue(oStorer, SubraceTag + "_" + SUBRACE_FAVORED_CLASS, SUBRACE_FAVORED_CLASS_FEMALE_FLAG);
if(FemaleFavoredClass != MaleFavoredClass)
sReturn += " - Male: " + Moon_ColourString(ClassIntToString(MaleFavoredClass - 1), COLOUR_LBLUE) +
"\n - Female: " + Moon_ColourString(ClassIntToString(FemaleFavoredClass - 1),COLOUR_LRED) + "\n\n";
else
sReturn += " - " +Moon_ColourString(ClassIntToString(MaleFavoredClass - 1), COLOUR_GREEN_SSE) + "\n\n";
}
iTemp = GetLocalInt(oStorer, SubraceTag + "_" + DAMAGE_AMOUNT_IN_LIGHT);
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_LIGHT_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += Moon_ColourString("*Light Sensitive", COLOUR_YELLOW) + "\n";
}
if(iTemp != 0)
{
sReturn += Moon_ColourString( ((iTemp > 0)?
"*Takes " + Moon_ColourString(IntToString(iTemp), COLOUR_LRED) + " damage "
:
"*regenerates " + Moon_ColourString(IntToString(abs(iTemp)), COLOUR_GREEN_SSE) + " hitpoints ") +
"in sunlight"
, COLOUR_YELLOW) + "\n";
}
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDERGROUND_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += Moon_ColourString("*Underground Sensitive", COLOUR_LRED) + "\n";
}
iTemp = GetLocalInt(oStorer, SubraceTag + "_" + DAMAGE_AMOUNT_IN_UNDERGROUND);
if(iTemp != 0)
{
sReturn += Moon_ColourString( ((iTemp > 0)?
"*Takes " + Moon_ColourString(IntToString(iTemp), COLOUR_LRED) + " damage "
:
"*regenerates " + Moon_ColourString(IntToString(abs(iTemp)), COLOUR_GREEN_SSE) + " hitpoints ") +
"in underground areas"
, COLOUR_YELLOW) + "\n";
}
i=0;
while(i <=MAXIMUM_PLAYER_LEVEL)
{
if( GetLocalInt(oStorer, SubraceTag + "_" + IntToString(i) + "_" + APPEARANCE_CHANGE) )
{
sReturn += "Subrace Appearence Alteration at level " + IntToString(i);
}
i++;
}
sReturn += "\n"+Moon_ColourString("(*)", COLOUR_LYELLOW)+ " - Only one Req. in this line is needed to be of this subrace.";
return sReturn;
}
string GetTestMatch(object oTarget, string subraceName)
{
//See OutputSubraceInformation for comments
string SubraceTag = SUBRACE_TAG + "_" + subraceName;
string sReturn = "SUBRACE NAME: " + Moon_ColourString(CapitalizeString(subraceName), COLOUR_GREEN_SSE );
if(GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDEAD, SUBRACE_BASE_INFORMATION_FLAGS))
{
sReturn += Moon_ColourString(" [Undead]", COLOUR_PURPLE);
}
if(GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_GENDER_RES) > 0)
{
int iGen = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_GENDER_RES);
if(iGen == GENDER_BOTH)
{ iGen = GENDER_MALE | GENDER_FEMALE; }
sReturn += "\nGender Requirements: " + Moon_ColourString((iGen & GetGender(oTarget))?"Passed":"Failed",(iGen & GetGender(oTarget))?COLOUR_GREEN_SSE:COLOUR_RED);
}
sReturn += "\nRace Restriction:";
int iTemp = GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_BASE_RACE) & SUBRACE_BASE_RACE_FLAGS;
int i=0;
if( !iTemp )
{
sReturn += Moon_ColourString(" No Restrictions", COLOUR_GREEN_SSE);
}
else
{
for( ; i < 7; i++)
{
sReturn += " " + Moon_ColourString(GetRaceByFlagNumber(i),
GetClearenceColour(oTarget, GetRaceCodeByFlagNumber(i), ((iTemp>>i) & FLAG1), 0, i) );
}
}
iTemp = (GetLocalInt(oStorer, SubraceTag + "_" + SUBRACE_ALIGNMENT_RESTRICTION)>>1) & SMALLGROUP1;
if( !iTemp )
{
sReturn += "\nAlignment Restriction:" + Moon_ColourString(" No Restrictions", COLOUR_GREEN_SSE );
}
else
{
for( i=0 ; i < 6; i++)
{
switch(i)
{
case 0:
sReturn += "\n - Good/Evil:"; break;
case 1:
case 2:
case 4:
case 5:
sReturn += ","; break;
case 3:
sReturn += "\n - Law/Chaos:"; break;
}
sReturn += " " + Moon_ColourString(GetAlignmentByFlagNumber(i), GetClearenceColour(oTarget, GetAlignmentCodeByFlagNumber(i), (iTemp>>i)&FLAG1, 1, i));
}
}
if(GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_CLASS_RESTRICTION, FLAG1))
{
//Check if we meet Class Req.
int iRes = CheckIfPCMeetsClassCriteria(oTarget,SubraceTag);
sReturn += "\nClass Restriction: " + Moon_ColourString((iRes?"Passed":"Failed"), iRes?COLOUR_GREEN_SSE:COLOUR_RED);
sReturn +="\nCan only be one of:\n" + ClassFlagToString(GetLocalFlag(oStorer, SubraceTag + "_" + SUBRACE_CLASS_RESTRICTION));
}
iTemp = GetLocalGroupFlag(oStorer, SubraceTag + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_PRESTIGIOUS_SUBRACE, SUBRACE_BASE_INFORMATION_FLAGS)?1:0;
sReturn += "\n\n* " + Moon_ColourString("Prestigious subrace",
GetClearenceColour(oTarget, iTemp, CheckIfPCMeetsPrestigiousClassCriteria(oTarget, SubraceTag), 2));
i=0;
iTemp = CheckIfPCGetsAnyErrorsWithSubraceTest(oTarget, SubraceTag);
while(iTemp )
{
i += iTemp&FLAG1;
iTemp>>=1;
}
sReturn += (i?"\n\nThe Engine has detected " + IntToString(i) + ((i==1)?" mismatch.":" mismatches."):"");
return sReturn;
}
void ChangeSubrace(object oTarget, int iSubrace)
{
if(GetLocalInt(oTarget, MOON_CHANGE_SUBRACE) )
{
SHA_SendSubraceMessageToPC(oMySpeaker, "Attempt to change " + GetName(oTarget) + "'s sub-race failed. Change Already in progress", TRUE);
return;
}
DeleteSubraceInfoOnPC(oTarget);
//SetLocalInt(OBJECT_SELF, SUBRACE_TAG + GetName(oTarget), iSubrace);
string Subrace = GetLocalString(oStorer, MODULE_SUBRACE_NUMBER + IntToString(iSubrace));
SetSubRace(oTarget, CapitalizeString(Subrace));
Subrace = GetStringLowerCase(Subrace);
if(iSubrace != -1)
{
ApplySubrace(oTarget, Subrace);
DelayCommand(16.0, SHA_SendSubraceMessageToPC(oMySpeaker, GetName(oTarget) + "'s sub-race switch is complete.!", TRUE));
DelayCommand(16.0, DeleteLocalInt(oTarget, MOON_CHANGE_SUBRACE) );
}
else
{
DelayCommand(2.5, SHA_SendSubraceMessageToPC(oTarget, "Your sub-race has been removed.", TRUE));
DelayCommand(6.0, SHA_SendSubraceMessageToPC(oMySpeaker, GetName(oTarget) + "'s sub-race switch is complete.!", TRUE));
DelayCommand(6.0, DeleteLocalInt(oTarget, MOON_CHANGE_SUBRACE) );
}
}