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