897 lines
32 KiB
Plaintext
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) );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|