// ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: //:::::::::::::::::::::::: Shayan's Subrace Engine ::::::::::::::::::::::::::::: // :::::::::::::::::::::::::: Extension: SWand ::::::::::::::::::::::::::::::::: // ::::::::::::Contact: http://p2.forumforfree.com/shayan.html:::::::::::::::::: // :::: // :::: Written by: DM_Moon // :: // :: Description: Subrace Conversation used in SSE's SWand system. // :: #include "sw_proto_inc" void swandScriptInit() { sw_gl_Permission=GetUserPermissionsForSWand(oMySpeaker, SWAND_PERMISSION_GET_PERMISSION, FALSE); sw_gl_Status=GetConversationStatus(oMySpeaker); } void SetupSpecialSWandUser(string Key, int Permissions=SWAND_PERMISSION_DM) { SetSSEInt(SWAND_PREFIX + SWAND_SPECIAL_USERS + Key, Permissions); } int GetSpecialSWandUserPermissionsByKey(string Key) { return GetSSEInt(SWAND_PREFIX + SWAND_SPECIAL_USERS + Key); } int GetSpecialSWandUserPermissions() { return GetSpecialSWandUserPermissionsByKey(GetPCPublicCDKey(oMySpeaker)); } void SetConversationStatus(object Player, int Status) { sw_gl_Status=Status; SetLocalInt(Player, SWAND_PREFIX + SWAND_CONVO_STATUS, Status); } int GetConversationStatus(object Player) { return GetLocalInt(Player, SWAND_PREFIX + SWAND_CONVO_STATUS); } void ResetConversationStatus(object Player) { sw_gl_Status=0; DeleteLocalInt(Player, SWAND_PREFIX + SWAND_CONVO_STATUS); } string GetAbilityScoreName(int Ability, int ShortName=FALSE) { string s=""; switch(Ability) { case ABILITY_STRENGTH: s = ShortName?"STR":"Strength"; break; case ABILITY_DEXTERITY: s = ShortName?"DEX":"Dexterity"; break; case ABILITY_CONSTITUTION: s = ShortName?"CON":"Constitution"; break; case ABILITY_INTELLIGENCE: s = ShortName?"INT":"Intelligence"; break; case ABILITY_WISDOM: s = ShortName?"WIS":"Wisdom"; break; case ABILITY_CHARISMA: s = ShortName?"CHA":"Charisma"; break; } return s; } string IntToColourString(int iInt, string sPrefix="", string sSurfix="", int AddSymbol=3, int AdjustZero=0, string sColourNegative=COLOUR_RED, string sColourPositive=COLOUR_GREEN, string sColourZero=COLOUR_WHITE) { string sReturn="", sColour="", sValue=IntToString(iInt); if(iInt<0) { sValue = GetSubString(sValue, 1, GetStringLength(sValue)-1); } if( iInt > AdjustZero) { sColour = sColourPositive; if(AddSymbol&1) sPrefix += "+"; } else if( iInt < AdjustZero) { sColour = sColourNegative; if( (AddSymbol&2) ) sPrefix += "-"; } else { sColour = sColourZero; } sReturn = ColourString(sPrefix + sValue + sSurfix, sColour); return sReturn; } int RoundOffToNearestInt(float fNum) { int WholeNum = FloatToInt(fNum); if((fNum - WholeNum) > 0.5) { return ++WholeNum; } else { return WholeNum; } } string GetNameOfLocationOnObject(object oObject) { string sReturn = "LOCATION: "; if(GetObjectType(oObject) == OBJECT_TYPE_ITEM) { sReturn += ColourString(GetName(GetItemPossessor(oObject) ), COLOUR_YELLOW); } else { object oArea = GetArea(oObject); if(GetIsObjectValid(oArea) ) sReturn += ColourString(GetName(oArea), COLOUR_YELLOW); else sReturn = ColourString("IN TRANSIT", COLOUR_YELLOW); } return sReturn; } string GetInfoCurrentTarget(object oTarget) { string sReturn; if(!GetIsObjectValid(oTarget)) return "No Target"; sReturn = "NAME: " + ColourString(GetName(oTarget)); if(SWAND_PLAYER_INFO&SWAND_PLAYER_INFO_LOGIN) sReturn+= "\nLOGIN: " + ColourString(GetPCPlayerName(oTarget), COLOUR_LRED); if(SWAND_PLAYER_INFO&SWAND_PLAYER_INFO_CD_KEY) sReturn+= "\nCD-KEY: " + ColourString(GetPCPublicCDKey(oTarget), COLOUR_LPURPLE); if(SWAND_PLAYER_INFO&SWAND_PLAYER_INFO_IP) sReturn+= "\nIP: " + ColourString(GetPCIPAddress(oTarget), COLOUR_LTEAL); if(SWAND_PLAYER_INFO&SWAND_PLAYER_INFO_LOCATION) sReturn+="\n"+GetNameOfLocationOnObject(oTarget); return sReturn; } string GenerateColorDisplayMessage(int MessageType=0, string Message="") { string sReturn; /*switch(MessageType) { case MESSAGE_TYPE_DEBUG: sReturn = ColourString("[DEBUG]: ", COLOUR_BLUE) + Message; break; case MESSAGE_TYPE_ERROR: sReturn = ColourString("[ERROR]: ", COLOUR_RED) + Message; break; case MESSAGE_TYPE_SUCCESS: sReturn = ColourString("[SUCCESS]: ", COLOUR_PURPLE) + Message; break; case MESSAGE_TYPE_WARNING: sReturn = ColourString("[WARNING]: ", COLOUR_RED) + Message; break; case MESSAGE_TYPE_ATTENTION: sReturn = ColourString("[ATTENTION]: ") + Message; break; case MESSAGE_TYPE_GRANTED: sReturn = ColourString("[GRANTED]: ", COLOUR_PURPLE) + Message; break; case MESSAGE_TYPE_DENIED: sReturn = ColourString("[DENIED]: ", COLOUR_RED) + Message; break; case MESSAGE_TYPE_LOG_FILE: sReturn = ColourString("[ADDED TO LOG]: ", COLOUR_BLUE) + Message; break; }*/ return Message; } 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; //NPC Classes case CLASS_TYPE_ABERRATION: sReturn += "Aberration"; break; case CLASS_TYPE_ANIMAL: sReturn += "Animal"; break; case CLASS_TYPE_BEAST: sReturn += "Beast"; break; case CLASS_TYPE_COMMONER: sReturn += "Commoner"; break; case CLASS_TYPE_CONSTRUCT: sReturn += "Construct"; break; case CLASS_TYPE_DRAGON: sReturn += "Dragon"; break; case CLASS_TYPE_ELEMENTAL: sReturn += "Elemental"; break; case CLASS_TYPE_FEY: sReturn += "Fey"; break; case CLASS_TYPE_GIANT: sReturn += "Giant"; break; case CLASS_TYPE_HUMANOID: sReturn += "Humaniod"; break; case CLASS_TYPE_MAGICAL_BEAST: sReturn += "Magical Beast"; break; case CLASS_TYPE_MONSTROUS: sReturn += "Monstrous"; break; case CLASS_TYPE_OOZE: sReturn += "Ooze"; break; case CLASS_TYPE_OUTSIDER: sReturn += "Outsider"; break; case CLASS_TYPE_UNDEAD: sReturn += "Undead"; break; case CLASS_TYPE_VERMIN: sReturn += "Vermin"; break; //Special/Unknown Class case CLASS_TYPE_INVALID: break; default: sReturn = "Unknown valid Class"; break; } return sReturn; } string GetClassAndLevel(int iPos, object o) { int ClassType = GetClassByPosition(iPos, o); if( (iPos < 1) || (4 < iPos) || (!GetIsObjectValid(o)) || (ClassType==CLASS_TYPE_INVALID) ) return ""; string Return = ""; if(iPos > 1) {Return = " / ";} Return += ClassIntToString(ClassType) + " (" + IntToString(GetLevelByClass(ClassType, o)) + ")"; return Return; } int GetUserPermissionsForSWand(object oPC, int Permissions=SWAND_PERMISSION_DM, int IsBetterAllowed=TRUE) { string Key = GetPCPublicCDKey(oPC); int SpecialUser=GetSpecialSWandUserPermissionsByKey(Key); int Return; if(!SpecialUser) { if(GetIsDM(oPC) || GetIsDMPossessed(oPC) || (SWAND_DEBUG && (GetPCPublicCDKey(oPC)!=GetPCPublicCDKey(oPC, TRUE)) ) ) Return=SWAND_PERMISSION_DM; else Return=SWAND_PERMISSION_PLAYER; } else Return = SpecialUser; if(Permissions != SWAND_PERMISSION_GET_PERMISSION) { Return = (Permissions == Return) || (IsBetterAllowed && (Return >= Permissions) ); } return Return; } void SendServerWideMessage(string sMessage, int MessageReceiver=SWAND_MESSAGE_RECEIVER_PC_AND_DM, int Important=FALSE) { //Stop the proccess if we are minimalistic and it is not important. if(MINIMALISE_SUBRACE_MESSAGES_TO_PC && !Important) return; sMessage = SUBRACE_ENGINE + sMessage; int BetterAllowed=FALSE; if(MessageReceiver == SWAND_MESSAGE_RECEIVER_PC_AND_DM) { BetterAllowed=TRUE; MessageReceiver = SWAND_PERMISSION_PLAYER; } object oPC = GetFirstPC(); while(GetIsObjectValid(oPC)) { //This trick only work because the SWAND_MESSAGE_RECEIVER_* and the SWAND_PERMISSION_* are "compatiable" (identical) if(GetUserPermissionsForSWand(oPC, MessageReceiver, BetterAllowed) ) { SendMessageToPC(oPC, sMessage); } oPC = GetNextPC(); } } void SaveCharacter(int Single=FALSE, object oPlayer=OBJECT_INVALID) { switch(Single) { case FALSE: SendServerWideMessage("Your character has been saved.", SWAND_MESSAGE_RECEIVER_PC_ONLY); ExportAllCharacters(); break; case 2: SHA_SendSubraceMessageToPC(oPlayer, "Character Save complete", FALSE); case TRUE: ExportSingleCharacter(oPlayer); break; } } 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 swand_CleanCache() { int i=0; int iCache = GetLocalInt(oMySpeaker, "swand_object_cache")+1; for(;i < iCache; i++) { DeleteLocalObject(oMySpeaker, "swand_object_cache" + IntToString(i)); } DeleteLocalInt(oMySpeaker, "swand_object_cache"); } void swand_EndConversation() { swandScriptInit(); int nCount; switch(sw_gl_Status) { //If aborting, the status will not be updated, thus a status running will be abort. case SWAND_CONVO_RUNNING: case SWAND_CONVO_ABORT: { //Handle Conversation Aborted event swand_CleanCache(); DeleteLocalObject(oMySpeaker, SWAND_PREFIX + SWAND_TARGET); DeleteSSEInt(SWAND_PREFIX + SWAND_LETO_TEST); ResetConversationStatus(oMySpeaker); break; } case SWAND_CONVO_CLOSE: { //Handle Conversation Closed event swand_CleanCache(); DeleteLocalObject(oMySpeaker, SWAND_PREFIX + SWAND_TARGET); DeleteSSEInt(SWAND_PREFIX + SWAND_LETO_TEST); ResetConversationStatus(oMySpeaker); break; } case SWAND_CONVO_UPDATE: { break; } } for(nCount = 0; nCount <= 9; nCount++) { swand_RemoveChoice(nCount); } DeleteLocalInt(oMySpeaker, "subrace_dm_wand_pos"); DeleteSSEInt(SWAND_PREFIX + SWAND_LETO_TEST); } void swand_BuildCache() { int nCount = 1; object oObject = GetFirstPC(); while(GetIsObjectValid(oObject)) { if(!GetIsDM(oObject)) { SetLocalObject(oMySpeaker, "swand_object_cache" + IntToString(nCount), oObject); nCount++; } oObject = GetNextPC(); } nCount--; SetLocalInt(oMySpeaker, "swand_object_cache", nCount); } int SWandLetoTest(int ForceTest=FALSE) { int Leto = GetSSEInt(SWAND_PREFIX + SWAND_LETO_TEST); if(Leto == SWAND_LETO_UNTESTED || ForceTest) { if(!ENABLE_LETO) { if(ForceTest) //Force means "Force". Ignore ENABLE_LETO setting. (though do not store it) { return LetoPingPong()?SWAND_LETO_DETECTED:SWAND_LETO_NOT_DETECTED; } return SWAND_LETO_NOT_ENABLED; } Leto = LetoPingPong()?SWAND_LETO_DETECTED:SWAND_LETO_NOT_DETECTED; SetSSEInt(SWAND_PREFIX + SWAND_LETO_TEST, Leto); } return Leto; } void Reset() { string sModule = GetModuleName(); if(sModule == "") { SHA_SendSubraceMessageToPC(oMySpeaker, GenerateColorDisplayMessage(0/*MESSAGE_TYPE_ERROR*/, "No Valid Module Name could be retrieved, Module Reset Cancelled"), TRUE); return; } SHA_SendSubraceMessageToPC(oMySpeaker, GenerateColorDisplayMessage(0/*MESSAGE_TYPE_SUCCESS*/, "The Module: " +sModule+" will load shortly."), TRUE); DelayCommand(5.0, SendServerWideMessage(GenerateColorDisplayMessage(0/*MESSAGE_TYPE_ATTENTION*/, "The Server will reset shortly."), SWAND_MESSAGE_RECEIVER_PC_AND_DM, TRUE)); DelayCommand(9.50, SaveCharacter() ); DelayCommand(10.0, StartNewModule(sModule)); } int ShutdownSSE() { SendServerWideMessage("SSE has been shutdown.", SWAND_MESSAGE_RECEIVER_DM_ONLY, TRUE); object oPC = GetFirstPC(); int ID; while(GetIsObjectValid(oPC)) { if(ID = GetPlayerSubraceID(oPC)) { SHA_SendSubraceMessageToPC(oPC, "Subrace Engine has been switched off in the Module! Your "+SUBRACE_WHEN_NOUN +" abilities will not function until it is turned back on.", TRUE); DeleteLocalInt(oPC, SUBRACE_INFO_LOADED_ON_PC); DeleteLocalInt(oPC, SUBRACE_IN_SPELL_DARKNESS); string SubraceStorage = GetSubraceStorageLocationByID(ID); int IsLightSens = GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_LIGHT_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS); int IsUndergSens = GetLocalGroupFlag(oStorer, SubraceStorage + "_" + 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(ID, oPC); int HasDiffStats = GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_STAT_MODIFIERS, FLAG1); if(HasDiffStats) { DeleteLocalInt(oPC, SUBRACE_STATS_STATUS); ClearSubraceTemporaryStats(oPC); } ClearSubraceEffects(oPC); ChangeToPCDefaultAppearance(oPC); DelayCommand(3.0, SearchAndDestroySkinsAndClaws(oPC)); } oPC = GetNextPC(); } return TRUE; } int StartSSE() { SendServerWideMessage("SSE has been started.", SWAND_MESSAGE_RECEIVER_DM_ONLY, TRUE ); object oPC = GetFirstPC(); while(!GetIsObjectValid(oPC) ) { SHA_SendSubraceMessageToPC(oPC, "Shayan's Subrace Engine has been switched on in the Module! Your " + SUBRACE_WHEN_NOUN +" functionalities will now resume.", TRUE); DelayCommand(1.0, ReapplySubraceAbilities(oPC) ); 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 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_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, SWAND_PREFIX + SWAND_TARGET); } void SetMyTarget(object oTarget) { SetLocalObject(oMySpeaker, SWAND_PREFIX + SWAND_TARGET, oTarget ); } string PrintSubraceSpecialRestrictions(string SubraceStorage) { SubraceStorage = SubraceStorage +"_"+SUBRACE_SPECIAL_RESTRICTION; int Count = GetSSEInt(SubraceStorage); string Test; int i=1; int Type, TestValue; string Varname, Database,Output="Special Restrictions\n\n"; int ReturnValue=TRUE; for( ; (i<=Count) && ReturnValue ; i++) { Test=SubraceStorage+IntToString(i); Type=GetSSEInt(Test); Varname=GetLocalString(oStorer, Test + SUBRACE_SPECIAL_RESTRICTION_VARNAME); Database=GetLocalString(oStorer, Test + SUBRACE_SPECIAL_RESTRICTION_DATABASE); Output += "\nRestriction " + IntToString(i); switch(Type & SUBRACE_SPECIAL_RESTRICTION_TYPE_ALL) { case SUBRACE_SPECIAL_RESTRICTION_TYPE_DATABASE: if(Database=="") Database = SUBRACE_DATABASE; Output += "\n In Database: " + Database + "\n the Variable: " + Varname; break; case SUBRACE_SPECIAL_RESTRICTION_TYPE_ITEM: Output += "\n Item (tag): " + Varname; break; case SUBRACE_SPECIAL_RESTRICTION_TYPE_LOCAL_VAR: { Output = "\n Local Variable: " + Varname; if(!GetIsObjectValid(GetObjectByTag(Database))) { Output = "\n on Object (tag): " + Database; } else { if(Database == "") { Output = "\n On Player: "; } else { Output = "\n On Possessed Item (tag): " + Database; } } break; } } if(Type) { Output += "\n must exist!"; } else { Output += "\n must " + ColourString("not", COLOUR_RED) + " exist!"; } } return Output; } string OutputSubraceInformation(int ID) { string SubraceStorage = GetSubraceStorageLocationByID(ID); string sReturn = ColourString(GetSubraceNameByID(ID), COLOUR_GREEN_SSE); if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDEAD, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += ColourString(" [Undead]", COLOUR_PURPLE); } int i=0; int iTemp = GetSSEInt(SubraceStorage + "_ALIAS"); if( (SSE_TREAT_ALIAS_AS_SUBRACE & 2) && iTemp) { sReturn += "\nAlias: "; for( i=1 ; i<=iTemp ; i++ ) { sReturn += " " + ColourString( GetLocalString(oStorer, SubraceStorage + "_ALIAS_" + IntToString(i) ) , COLOUR_LTEAL) + " "; } i=0; } iTemp = GetSSEInt(SubraceStorage + "_" + SUBRACE_GENDER_RES); if(iTemp) { //3.0.6.7 sReturn += "\nGender Requirements: " + ColourString(" Male ", ((iTemp & FLAG2)?COLOUR_RED:COLOUR_GREEN_SSE)) + ColourString(" Female ", ((iTemp & FLAG1)?COLOUR_RED:COLOUR_GREEN_SSE)); } sReturn += "\nRace Restriction:"; iTemp = GetSSEInt(SubraceStorage + "_" + SUBRACE_BASE_RACE) & SUBRACE_BASE_RACE_FLAGS; if( !iTemp ) { sReturn += ColourString(" No Restrictions", COLOUR_GREEN_SSE); } else { for( ; i < 7; i++) { if( (iTemp>>i) & FLAG1) { sReturn += " " + 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 = (GetSSEInt(SubraceStorage + "_" + SUBRACE_ALIGNMENT_RESTRICTION)>>1) & SMALLGROUP1; if( !iTemp ) { sReturn += "\nAlignment Restriction:" + 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 += ColourString(" (*)", COLOUR_LYELLOW)+"\n - Law/Chaos:"; break; } sReturn += " " + ColourString(GetAlignmentByFlagNumber(i), ((iTemp>>i) & FLAG1?COLOUR_GREEN_SSE:COLOUR_RED) ); if(i==5) sReturn += ColourString(" (*)", COLOUR_LYELLOW); } } if(GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_CLASS_RESTRICTION, FLAG1)) { //Check if we meet Class Req. sReturn += "\nClass Restriction: "; sReturn += ClassFlagToString(GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_CLASS_RESTRICTION)); } if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_PRESTIGIOUS_SUBRACE, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += "\n" + ColourString("Prestigious subrace", COLOUR_LTEAL); } iTemp = GetLocalGroupFlagValue(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_ECL); if(iTemp) { sReturn += "\n" + "ECL: " + IntToColourString( iTemp ); } return sReturn; } string OutputFullSubraceInformation(int ID, int Page=0) { //See OutputSubraceInformation for comments string SubraceStorage = GetSubraceStorageLocationByID(ID); string SubraceName = GetSubraceNameByID(ID); string sReturn = CapitalizeString(SUBRACE_WHEN_NOUN )+ " name: " + ColourString(SubraceName, COLOUR_GREEN_SSE ); string sTemp=""; int iTemp=0, i=0; switch(Page) { case PARAMS_PAGE_0: i=0; iTemp = GetSSEInt(SubraceStorage + "_ALIAS"); if( (SSE_TREAT_ALIAS_AS_SUBRACE & 2) && iTemp) { sReturn += "\nAlias: "; for( i=1 ; i<=iTemp ; i++ ) { sReturn += " " + ColourString( GetLocalString(oStorer, SubraceStorage + "_ALIAS_" + IntToString(i) ) , COLOUR_LTEAL) + " "; } i=0; } sReturn += "\n\n**** "+GetStringUpperCase(SUBRACE_WHEN_NOUN)+" RESTRICTIONS ****\n\n"; if(GetSSEInt(SubraceStorage + "_" + SUBRACE_GENDER_RES) > 0) { int iGen = GetSSEInt(SubraceStorage + "_" + SUBRACE_GENDER_RES); sReturn += "\nGender Requirements: " + ColourString(" Male ", ((iTemp & FLAG2)?COLOUR_GREEN_SSE:COLOUR_RED)) + ColourString(" Female ", ((iTemp & FLAG1)?COLOUR_GREEN_SSE:COLOUR_RED)); } sReturn += "\nRacial:"; iTemp = GetSSEInt(SubraceStorage + "_" + SUBRACE_BASE_RACE) & SUBRACE_BASE_RACE_FLAGS; i=0; if( !iTemp ) { sReturn += ColourString(" No Restrictions", COLOUR_GREEN_SSE); } else { for( ; i < 7; i++) { if( (iTemp>>i) & FLAG1) { sReturn += " " + ColourString(GetRaceByFlagNumber(i), COLOUR_GREEN_SSE); } } } iTemp = (GetSSEInt(SubraceStorage + "_" + SUBRACE_ALIGNMENT_RESTRICTION)>>1) & SMALLGROUP1; if( !iTemp ) { sReturn += "\nAlignment:" + 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 += ColourString(" (*)", COLOUR_LYELLOW)+"\n - Law/Chaos:"; break; } sReturn += " " + ColourString(GetAlignmentByFlagNumber(i), ((iTemp>>i) & FLAG1?COLOUR_GREEN_SSE:COLOUR_RED) ); if(i==5) sReturn += ColourString(" (*)", COLOUR_LYELLOW); } } if(GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_CLASS_RESTRICTION, FLAG1)) { sReturn += "\nClass Restriction: "; sReturn += ClassFlagToString(GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_CLASS_RESTRICTION)); } if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_PRESTIGIOUS_SUBRACE, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += "\n" + ColourString("Prestigious subrace", COLOUR_LTEAL) + "\nRequires " + IntToString(GetSSEInt(SubraceStorage + "_" + SUBRACE_PRESTIGIOUS_CLASS_RESTRICTION_MINIMUM_LEVELS) ) + " levels of either:"; iTemp = GetLocalFlag(oStorer, SubraceStorage + "_" + 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, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_ECL); if(iTemp) { sReturn += "\n" + "ECL: " + IntToColourString( iTemp ); } if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDEAD, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += ColourString(" [Undead]\n", COLOUR_PURPLE); } sReturn += "\n\n**** "+GetStringUpperCase(SUBRACE_WHEN_NOUN)+ " STATS ****\n\n"; iTemp = GetSSEInt(SubraceStorage + "_" + SUBRACE_FAVORED_CLASS); if(iTemp) { sReturn += "*Favored Classs:\n"; int MaleFavoredClass = GetLocalGroupFlagValue(oStorer, SubraceStorage + "_" + SUBRACE_FAVORED_CLASS, SUBRACE_FAVORED_CLASS_MALE_FLAG); int FemaleFavoredClass = GetLocalGroupFlagValue(oStorer, SubraceStorage + "_" + SUBRACE_FAVORED_CLASS, SUBRACE_FAVORED_CLASS_FEMALE_FLAG); if(FemaleFavoredClass != MaleFavoredClass) sReturn += " - Male: " + ColourString(ClassIntToString(MaleFavoredClass - 1), COLOUR_LBLUE) + "\n - Female: " + ColourString(ClassIntToString(FemaleFavoredClass - 1),COLOUR_LRED) + "\n\n"; else sReturn += " - " + ColourString(ClassIntToString(MaleFavoredClass - 1), COLOUR_GREEN_SSE) + "\n\n"; } iTemp = GetSSEInt(SubraceStorage + "_" + DAMAGE_AMOUNT_IN_LIGHT); if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_LIGHT_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += ColourString("*Light Sensitive", COLOUR_YELLOW) + "\n"; } if(iTemp) { sReturn += ColourString( ((iTemp > 0)? "*Takes " + ColourString(IntToString(iTemp), COLOUR_LRED) + " damage " : "*regenerates " + ColourString(IntToString(abs(iTemp)), COLOUR_GREEN_SSE) + " hitpoints ") + "in sunlight" , COLOUR_YELLOW) + "\n"; } if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDERGROUND_SENSITIVE, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += ColourString("*Underground Sensitive", COLOUR_LRED) + "\n"; } iTemp = GetSSEInt(SubraceStorage + "_" + DAMAGE_AMOUNT_IN_UNDERGROUND); if(iTemp) { sReturn += ColourString( ((iTemp > 0)? "*Takes " + ColourString(IntToString(iTemp), COLOUR_LRED) + " damage " : "*regenerates " + ColourString(IntToString(abs(iTemp)), COLOUR_GREEN_SSE) + " hitpoints ") + "in underground areas" , COLOUR_YELLOW) + "\n"; } i=0; while(i <=MAXIMUM_PLAYER_LEVEL) { if( GetSSEInt(SubraceStorage + "_" + IntToString(i) + "_" + APPEARANCE_CHANGE) ) { sReturn += CapitalizeString(SUBRACE_WHEN_NOUN) +" appearence alteration at level " + IntToString(i) + "\n"; } i++; } sReturn += "\n"+ColourString("(*)", COLOUR_LYELLOW)+ " - Only one Req. in this line is needed to be of this subrace."; break; case PARAMS_PAGE_4: sReturn += PrintSubraceItemRestrictions(SubraceStorage); break; case PARAMS_PAGE_5: sReturn += PrintSubraceSpecialRestrictions(SubraceStorage); break; default: sReturn += PrintSubraceStatModification(SubraceStorage, Page); break; } return sReturn; } string GetTestMatch(object oTarget, int ID) { //See OutputSubraceInformation for comments string SubraceStorage = GetSubraceStorageLocationByID(ID); string sReturn = CapitalizeString( SUBRACE_WHEN_NOUN ) + " name: " + ColourString(GetSubraceNameByID(ID), COLOUR_GREEN_SSE ); if(GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_UNDEAD, SUBRACE_BASE_INFORMATION_FLAGS)) { sReturn += ColourString(" [Undead]", COLOUR_PURPLE); } if(GetSSEInt(SubraceStorage + "_" + SUBRACE_GENDER_RES) > 0) { int iGen = GetSSEInt(SubraceStorage + "_" + SUBRACE_GENDER_RES); int Result; switch(GetGender(oTarget)) { case GENDER_MALE: Result = !(iGen & FLAG2); break; case GENDER_FEMALE: Result = !(iGen & FLAG1); break; } sReturn += "\nGender Requirements: " + ColourString((Result?"Passed":"Failed"),(Result)?COLOUR_GREEN_SSE:COLOUR_RED); } sReturn += "\nRace Restriction:"; int iTemp = GetSSEInt(SubraceStorage + "_" + SUBRACE_BASE_RACE) & SUBRACE_BASE_RACE_FLAGS; int i=0; if( !iTemp ) { sReturn += ColourString(" None", COLOUR_GREEN_SSE); } else { for( ; i < 7; i++) { sReturn += " " + ColourString(GetRaceByFlagNumber(i), GetClearenceColour(oTarget, GetRaceCodeByFlagNumber(i), ((iTemp>>i) & FLAG1), 0, i) ); } } iTemp = (GetSSEInt(SubraceStorage + "_" + SUBRACE_ALIGNMENT_RESTRICTION)>>1) & SMALLGROUP1; if( !iTemp ) { sReturn += "\nAlignment restriction:" + ColourString(" None", 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 += " " + ColourString(GetAlignmentByFlagNumber(i), GetClearenceColour(oTarget, GetAlignmentCodeByFlagNumber(i), (iTemp>>i)&FLAG1, 1, i)); } } if(GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_CLASS_RESTRICTION, FLAG1)) { //Check if we meet Class Req. int iRes = CheckIfPCMeetsClassCriteria(oTarget,SubraceStorage); sReturn += "\nClass Restriction: " + ColourString((iRes?"Passed":"Failed"), iRes?COLOUR_GREEN_SSE:COLOUR_RED); sReturn +="\nCan only be one of:\n" + ClassFlagToString(GetLocalFlag(oStorer, SubraceStorage + "_" + SUBRACE_CLASS_RESTRICTION)); } iTemp = GetLocalGroupFlag(oStorer, SubraceStorage + "_" + SUBRACE_BASE_INFORMATION, SUBRACE_BASE_INFORMATION_PRESTIGIOUS_SUBRACE, SUBRACE_BASE_INFORMATION_FLAGS)?1:0; sReturn += "\n\n* " + ColourString("Prestigious subrace", GetClearenceColour(oTarget, iTemp, CheckIfPCMeetsPrestigiousClassCriteria(oTarget, SubraceStorage), 2)); i=0; iTemp = CheckIfPCGetsAnyErrorsWithSubraceTest(oTarget, ID); while(iTemp ) { i += iTemp&FLAG1; iTemp>>=1; } sReturn += (i?"\n\nThe Engine has detected " + IntToString(i) + ((i==1)?" mismatch.":" mismatches."):"\n\nAcceptable "+ SUBRACE_WHEN_NOUN + " for " + GetName(GetMyTarget() ) ); return sReturn; } void SWandSendPlayerToSubraceStartLocation(object Player, string subrace) { string SubraceStorage = GetSubraceStorageLocation(subrace); string Waypoint; location lStart; object WP; AssignCommand(Player, ClearAllActions()); if(subrace != "") { Waypoint = GetLocalString(oStorer, SubraceStorage + "_" + SUBRACE_START_LOCATION); if(GetIsObjectValid(GetWaypointByTag(Waypoint))) { //let SSE take it from here. Subrace_MoveToStartLocation(Player, subrace); return; } } Waypoint = GetLocalString(OBJECT_SELF, SWAND_PREFIX + SWAND_CHOOSER_SETTINGS); WP = GetWaypointByTag(Waypoint); if( (Waypoint != "") && GetIsObjectValid(WP) ) { lStart= GetLocation(WP); SHA_SendSubraceMessageToPC(Player, "Porting to you to your Start location."); } else { //Non-valid waypoint... lStart = GetStartingLocation(); SHA_SendSubraceMessageToPC(Player, "Porting to you to the Start location of the Module."); } DelayCommand(0.5, AssignCommand(Player, JumpToLocation(lStart))); } void ChangeSubrace(object oTarget, int iSubrace) { if(GetLocalInt(oTarget, SWAND_PREFIX + SWAND_CHANGE_SUBRACE) ) { SHA_SendSubraceMessageToPC(oMySpeaker, "Attempt to change " + GetName(oTarget) + "'s "+ SUBRACE_WHEN_NOUN + " failed. Change Already in progress", TRUE); return; } DeleteSubraceInfoOnPC(oTarget, TRUE); string subrace = GetSubraceNameByID(iSubrace);//GetLocalString(oStorer, MODULE_SUBRACE_NUMBER + IntToString(iSubrace)); if(iSubrace != -1) { ApplySubrace(oTarget, subrace); DelayCommand(16.0, SHA_SendSubraceMessageToPC(oMySpeaker, GetName(oTarget) + "'s " + SUBRACE_WHEN_NOUN + " purge is complete.!", TRUE)); DelayCommand(16.0, DeleteLocalInt(oTarget, SWAND_PREFIX + SWAND_CHANGE_SUBRACE) ); } else { DelayCommand(2.5, SHA_SendSubraceMessageToPC(oTarget, "Your " + SUBRACE_WHEN_NOUN + " has been removed.", TRUE)); DelayCommand(6.0, SHA_SendSubraceMessageToPC(oMySpeaker, GetName(oTarget) + "'s "+SUBRACE_WHEN_NOUN +" switch is complete.!", TRUE)); DelayCommand(6.0, DeleteLocalInt(oTarget, SWAND_PREFIX + SWAND_CHANGE_SUBRACE) ); } if( (swand_ChooserSettings & SWAND_CHOOSER_IS_CHOOSER) && (swand_ChooserSettings & SWAND_CHOOSER_PORT_TO_SUBRACE_START_LOCATION_END_SUBRACE_MODIFICATION) ) { SWandSendPlayerToSubraceStartLocation(oTarget, subrace); } } string TempModTypeToString(float TempStat, int ModifierType) { string sReturn="Error Invalid Modifier Type"; switch(ModifierType) { case 0: sReturn="0"; break; case SUBRACE_STAT_MODIFIER_TYPE_PERCENTAGE: sReturn = IntToColourString(RoundOffToNearestInt(TempStat*100), "", "%"); break; case SUBRACE_STAT_MODIFIER_TYPE_POINTS: sReturn = IntToColourString(FloatToInt(TempStat)); break; } return sReturn; } string movementspeed(int iSpeed) { string sReturn =""; switch(iSpeed) { case MOVEMENT_SPEED_PC: //Shut up on PC Speed since it is 0 and will appear even if no speed change was requested. // sReturn += "\n - Movement Speed: 'PC-speed'"; break; case MOVEMENT_SPEED_VERY_SLOW: sReturn += "Movement Speed: Very Slow"; break; case MOVEMENT_SPEED_SLOW: sReturn += "Movement Speed: Slow"; break; case MOVEMENT_SPEED_NORMAL: sReturn += "Movement Speed: Normal"; break; case MOVEMENT_SPEED_FAST: sReturn += "Movement Speed: Fast"; break; case MOVEMENT_SPEED_VERY_FAST: sReturn += "Movement Speed: Very Fast"; break; case MOVEMENT_SPEED_DMSPEED: sReturn += "Movement Speed: 'DM-Speed'"; break; case MOVEMENT_SPEED_DEFAULT: sReturn += "Movement Speed: 'Default'"; break; case MOVEMENT_SPEED_IMMOBILE: sReturn += "Movement Speed: Immobile"; break; case MOVEMENT_SPEED_CURRENT: sReturn += "Movement Speed: 'Current Speed'"; break; } return sReturn; } string PrintSubraceStatModification(string SubraceStorage, int Page) { //TIME_DAY, TIME_NIGHT, TIME_BOTH. //SUBRACE_STAT_MODIFIER_TYPE_PERCENTAGE, int iTime = GetSSEInt(SubraceStorage + "_" + SUBRACE_STAT_MODIFIERS)&0x00000003; int iTypeDay = GetSSEInt(SubraceStorage + IntToString(TIME_DAY) + "_" + SUBRACE_STAT_MODIFIER_TYPE); int iTypeNight = GetSSEInt(SubraceStorage + IntToString(TIME_NIGHT) + "_" + SUBRACE_STAT_MODIFIER_TYPE); string sMidsep = /*(iTime&TIME_BOTH)?*/" - "/*:""*/; int i=0, iLevel=0, iBaseStat, iSet; float fStatDay, fStatNight; string sReturn="\n\n**** "+GetStringUpperCase(SUBRACE_WHEN_NOUN) +" STATS ****\n\n"; switch(Page) { case PARAMS_PAGE_1: if(iTime == 0) { sReturn += "No Temp. Modified Stats."; } else { sReturn += "Temp. Modified Stats.:\nDay - Night"; for( ; i < 6 ; i++) { fStatDay = GetLocalFloat(oStorer, SubraceStorage + IntToString(TIME_DAY) + "_" + GetSubraceStatStorageName(i, FALSE)) ; fStatNight = GetLocalFloat(oStorer, SubraceStorage + IntToString(TIME_NIGHT) + "_" + GetSubraceStatStorageName(i, FALSE)); sReturn += "\n" + GetAbilityScoreName(i, TRUE) + ": " +(i==3?" ":"")+ TempModTypeToString(fStatDay, iTypeDay) + sMidsep + GetAbilityScoreName(i, TRUE) + ": " + (i==3?" ":"") + TempModTypeToString(fStatNight, iTypeNight); } fStatDay = GetLocalFloat(oStorer, SubraceStorage + IntToString(TIME_DAY) + "_" + SUBRACE_STAT_AB_MODIFIER); fStatNight = GetLocalFloat(oStorer, SubraceStorage + IntToString(TIME_NIGHT) + "_" + SUBRACE_STAT_AB_MODIFIER); fStatDay = GetLocalFloat(oStorer, SubraceStorage + IntToString(TIME_DAY) + "_" + SUBRACE_STAT_AC_MODIFIER); fStatNight = GetLocalFloat(oStorer, SubraceStorage + IntToString(TIME_NIGHT) + "_" + SUBRACE_STAT_AC_MODIFIER); sReturn += "\nAB: " + TempModTypeToString(fStatDay, iTypeDay)+" "+sMidsep+"AB: " + TempModTypeToString(fStatNight, iTypeNight); sReturn += "\nAC: " + TempModTypeToString(fStatDay, iTypeDay)+" "+sMidsep+"AC: " + TempModTypeToString(fStatNight, iTypeNight); } break; case PARAMS_PAGE_2: sReturn += "Base Modified Stats (Leto)"; for( ; iLevel <=MAXIMUM_PLAYER_LEVEL ; iLevel++) { sMidsep = SubraceStorage + "_" + IntToString(iLevel); if(GetSSEInt( sMidsep + "_"+ SUBRACE_HAS_BASE_STAT_MODIFIERS)) { iSet = GetSSEInt(sMidsep + "_" + SUBRACE_BASE_STAT_MODIFIERS_REPLACE); if(iSet) { sReturn += "\n\nBaseStat are at level " + IntToString(iLevel) + " set to:"; } else { sReturn += "\n\nBaseStat are at level " + IntToString(iLevel) + " altered with:"; } for(i=0 ; i < 6 ; i++) { iBaseStat = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(i, TRUE)); if(iBaseStat) { sReturn += "\n - " + GetAbilityScoreName(i, TRUE) + ": " + (i==3?" ":"") + IntToColourString(iBaseStat, "", "", !iSet); } } } } iSet = GetSSEInt(sMidsep + "_" + SUBRACE_BASE_STAT_SPD_MODIFIER); if(iSet) { sReturn += "\n - " + movementspeed(iSet); } break; case PARAMS_PAGE_3: sReturn += "Estimation of stats (Currently Leto only) with this " + SUBRACE_WHEN_NOUN +"."; object oObject = GetMyTarget(); int iStr = GetAbilityScore(oObject, ABILITY_STRENGTH, TRUE); int iDex = GetAbilityScore(oObject, ABILITY_DEXTERITY, TRUE); int iCon = GetAbilityScore(oObject, ABILITY_CONSTITUTION, TRUE); int iInt = GetAbilityScore(oObject, ABILITY_INTELLIGENCE, TRUE); int iWis = GetAbilityScore(oObject, ABILITY_WISDOM, TRUE); int iCha = GetAbilityScore(oObject, ABILITY_CHARISMA, TRUE); int iBaseStr = GetAbilityScore(oObject, ABILITY_STRENGTH, TRUE); int iBaseDex = GetAbilityScore(oObject, ABILITY_DEXTERITY, TRUE); int iBaseCon = GetAbilityScore(oObject, ABILITY_CONSTITUTION, TRUE); int iBaseInt = GetAbilityScore(oObject, ABILITY_INTELLIGENCE, TRUE); int iBaseWis = GetAbilityScore(oObject, ABILITY_WISDOM, TRUE); int iBaseCha = GetAbilityScore(oObject, ABILITY_CHARISMA, TRUE); for( ; iLevel <=MAXIMUM_PLAYER_LEVEL ; iLevel++) { sMidsep = SubraceStorage + "_" + IntToString(iLevel); if(GetSSEInt( sMidsep + "_"+ SUBRACE_HAS_BASE_STAT_MODIFIERS)) { sReturn += "\n\nAt level " + IntToString(iLevel) + ":"; if(GetSSEInt(sMidsep + "_" + SUBRACE_BASE_STAT_MODIFIERS_REPLACE)) { iStr = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_STRENGTH, TRUE)); iDex = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_DEXTERITY, TRUE)); iCon = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_CONSTITUTION, TRUE)); iInt = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_INTELLIGENCE, TRUE)); iWis = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_WISDOM, TRUE)); iCha = GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_CHARISMA, TRUE)); } else { iStr += GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_STRENGTH, TRUE)); iDex += GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_DEXTERITY, TRUE)); iCon += GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_CONSTITUTION, TRUE)); iInt += GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_INTELLIGENCE, TRUE)); iWis += GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_WISDOM, TRUE)); iCha += GetSSEInt(sMidsep + "_" + GetSubraceStatStorageName(ABILITY_CHARISMA, TRUE)); } sReturn += "\n - " + GetAbilityScoreName(ABILITY_STRENGTH, TRUE) + ": " + IntToColourString(iStr, "", "", 0, iBaseStr); sReturn += "\n - " + GetAbilityScoreName(ABILITY_DEXTERITY, TRUE) + ": " + IntToColourString(iDex, "", "", 0, iBaseDex); sReturn += "\n - " + GetAbilityScoreName(ABILITY_CONSTITUTION, TRUE) + ": " + IntToColourString(iCon, "", "", 0, iBaseCon); sReturn += "\n - " + GetAbilityScoreName(ABILITY_INTELLIGENCE, TRUE) + ": " + IntToColourString(iInt, "", "", 0, iBaseInt); sReturn += "\n - " + GetAbilityScoreName(ABILITY_WISDOM, TRUE) + ": " + IntToColourString(iWis, "", "", 0, iBaseWis); sReturn += "\n - " + GetAbilityScoreName(ABILITY_CHARISMA, TRUE) + ": " + IntToColourString(iCha, "", "", 0, iBaseCha); iSet = GetSSEInt(sMidsep + "_" + SUBRACE_BASE_STAT_SPD_MODIFIER); if(iSet) { sReturn += "\n - " + movementspeed(iSet); } } } break; } sReturn += "\n\n"; return sReturn; } string GenerateRestrictionsDisplay(int Restrictions) { string sReturn; string sColourOn="", sColourOff=""; int Test=0; if(!Restrictions) { return sReturn + ColourString("None", COLOUR_GREEN); } sReturn +="\n"; if(Restrictions&ITEM_TYPE_REQ_ALL) { sReturn +="Items must fit in ALL restrictions"; } else { sReturn +="Items must fit in just one of restrictions"; } sColourOn= COLOUR_RED; sColourOff = COLOUR_GREEN; sReturn +="\n\nWeapon restrictions:\nTypes:"; Test = Restrictions&ITEM_TYPE_WEAPON; if( (Test==ITEM_TYPE_WEAPON) || (!Test) ) { sReturn += ColourString(" All", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - "; sReturn += ColourString("Melee", (Test&ITEM_TYPE_WEAPON_MELEE?sColourOn:sColourOff)); sReturn += "\n - "; sReturn += ColourString("Ranged [Throwing].", (Test&ITEM_TYPE_WEAPON_RANGED_THROW?sColourOn:sColourOff)); sReturn += "\n - "; sReturn += ColourString("Ranged [Launchers].", (Test&ITEM_TYPE_WEAPON_RANGED_LAUNCHER?sColourOn:sColourOff)); } Test = Restrictions&ITEM_TYPE_WEAPON_SIZE_ANY; sReturn += "\nSize"; if( (Test==ITEM_TYPE_WEAPON_SIZE_ANY) || (!Test) ) { sReturn += ColourString(" All", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - " + ColourString("Tiny", (Test&ITEM_TYPE_WEAPON_SIZE_TINY?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Small", (Test&ITEM_TYPE_WEAPON_SIZE_SMALL?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Medium", (Test&ITEM_TYPE_WEAPON_SIZE_MEDIUM?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Large", (Test&ITEM_TYPE_WEAPON_SIZE_LARGE?sColourOn:sColourOff)); } sReturn +="\nProf:"; Test = Restrictions&ITEM_TYPE_WEAPON_PROF_ANY; if( (Test==ITEM_TYPE_WEAPON_PROF_ANY) || (!Test) ) { sReturn += ColourString(" All", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - " + ColourString("Simple", (Test&ITEM_TYPE_WEAPON_PROF_SIMPLE?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Martial", (Test&ITEM_TYPE_WEAPON_PROF_MARTIAL?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Exotic", (Test&ITEM_TYPE_WEAPON_PROF_EXOTIC?sColourOn:sColourOff)); } sReturn +="\n\n"; Test = Restrictions&ITEM_TYPE_FULL_ARMOR_SET; if( (Test==ITEM_TYPE_FULL_ARMOR_SET) || (!Test) ) { sReturn +="Armor/Shield/Helm Restrictions:"; sReturn += ColourString(" All", (Test?sColourOn:sColourOff)); } else { sReturn +="Armor Restrictions:"; Test = Restrictions&ITEM_TYPE_ARMOR; if( (Test==ITEM_TYPE_ARMOR) || (!Test) ) { sReturn += ColourString(" All", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - " + ColourString(" Cloth", (Restrictions&ITEM_TYPE_ARMOR_TYPE_CLOTH?sColourOn:sColourOff)); if( (!Test) || ((Test&ITEM_TYPE_ARMOR_TYPE_LIGHT)==ITEM_TYPE_ARMOR_TYPE_LIGHT) ) { sReturn += "\n - " + ColourString(" Light", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - Light: "; sReturn += ColourString("1", (Restrictions&ITEM_TYPE_ARMOR_AC_1?sColourOn:sColourOff)); sReturn += ", "; sReturn += ColourString("2", (Restrictions&ITEM_TYPE_ARMOR_AC_2?sColourOn:sColourOff)); sReturn += ", "; sReturn += ColourString("3", (Restrictions&ITEM_TYPE_ARMOR_AC_3?sColourOn:sColourOff)); sReturn += " AC"; } if( (!Test) || ((Test&ITEM_TYPE_ARMOR_TYPE_MEDIUM)==ITEM_TYPE_ARMOR_TYPE_MEDIUM) ) { sReturn += "\n - " + ColourString(" Medium", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - Medium: "; sReturn += ColourString("4", (Restrictions&ITEM_TYPE_ARMOR_AC_4?sColourOn:sColourOff)); sReturn += ", "; sReturn += ColourString("5", (Restrictions&ITEM_TYPE_ARMOR_AC_5?sColourOn:sColourOff)); sReturn += ", "; sReturn += ColourString("6", (Restrictions&ITEM_TYPE_ARMOR_AC_6?sColourOn:sColourOff)); sReturn += " AC"; } if( (!Test) || ((Test&ITEM_TYPE_ARMOR_TYPE_HEAVY)==ITEM_TYPE_ARMOR_TYPE_HEAVY) ) { sReturn += "\n - " + ColourString(" Heavy", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - Heavy: "; sReturn += ColourString("7", (Restrictions&ITEM_TYPE_ARMOR_AC_7?sColourOn:sColourOff)); sReturn += ", "; sReturn += ColourString("8", (Restrictions&ITEM_TYPE_ARMOR_AC_8?sColourOn:sColourOff)); sReturn += " AC"; } } sReturn+= "\n - " + ColourString("Helm", (Restrictions&ITEM_TYPE_HELM?sColourOn:sColourOff)); sReturn +="\n\nShield Restrictions:"; Test = Restrictions&ITEM_TYPE_SHIELD_ANY; if( (Test==ITEM_TYPE_SHIELD_ANY) || (!Test) ) { sReturn += ColourString(" All", (Test?sColourOn:sColourOff)); } else { sReturn += "\n - " + ColourString("Small", (Restrictions&ITEM_TYPE_SHIELD_SMALL?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Large", (Restrictions&ITEM_TYPE_SHIELD_LARGE?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Tower", (Restrictions&ITEM_TYPE_SHIELD_TOWER?sColourOn:sColourOff)); } } sReturn +="\n\nOther Restrictions:"; sReturn += "\n - " + ColourString("Jewlery", (Restrictions&ITEM_TYPE_JEWLERY?sColourOn:sColourOff)); sReturn += "\n - " + ColourString("Misc. Clothing", (Restrictions&ITEM_TYPE_MISC_CLOTHING?sColourOn:sColourOff)); return sReturn; } string PrintSubraceItemRestrictions(string SubraceStorage) { string sReturn = "\n\nItem restrictions:"; string sRestrictionInfo = SubraceStorage + "_" + SUBRACE_ITEM_RESTRICTION + "_"; int r_Day = GetSSEInt(sRestrictionInfo + IntToString(TIME_DAY)); int r_Night = GetSSEInt(sRestrictionInfo + IntToString(TIME_NIGHT)); int r_Normal = GetSSEInt(sRestrictionInfo + IntToString(TIME_SPECIAL_APPEARANCE_NORMAL)); int r_Morph = GetSSEInt(sRestrictionInfo + IntToString(TIME_SPECIAL_APPEARANCE_SUBRACE)); if(r_Morph && r_Normal) { sReturn += " Form-based\n\n"; sReturn += "Special Form: " + GenerateRestrictionsDisplay(r_Morph); sReturn += "\n\nNormal Form: " + GenerateRestrictionsDisplay(r_Normal); } else if( (r_Morph || r_Normal) && (r_Day || r_Night) ) { sReturn += " Time & Form-based\n\n"; sReturn += "Special Form: " + GenerateRestrictionsDisplay(r_Morph); sReturn += "\n\nNormal Form: " + GenerateRestrictionsDisplay(r_Normal); sReturn += "\n\nDay Time: " + GenerateRestrictionsDisplay(r_Day); sReturn += "\n\nNight Time: " + GenerateRestrictionsDisplay(r_Night); } else { sReturn += " Time-based\n\n"; sReturn += "Day Time: " + GenerateRestrictionsDisplay(r_Day); sReturn += "\n\nNight Time: " + GenerateRestrictionsDisplay(r_Night); } return sReturn; } int GetSWandChooserSettings(object Chooser=OBJECT_SELF) { return GetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_SETTINGS); } int swand_PlayerIsAllowedToChangeSubrace(object Player) { return( (! GetPlayerSubraceID(Player) ) && (SWAND_CHOOSER_ALLOW_SUBRACELESS_TO_TAKE_SUBRACE & swand_ChooserSettings ) && (GetHitDice(Player)<= SWAND_LOW_LEVEL_SUBRACE_CHANGE) ); } void SetSWandChooserSettings(string WaypointTagForTheSubraceless="", int AllowSubracelessPlayersToTakeASubrace=TRUE, int AllowSubracelessPlayersPortToStart=TRUE, int CanBeUsedSubraceStartLocationPortal=FALSE, int PortOnSubraceModification=TRUE, object Chooser=OBJECT_SELF) { int Settings = SWAND_CHOOSER_IS_CHOOSER | (AllowSubracelessPlayersToTakeASubrace?SWAND_CHOOSER_ALLOW_SUBRACELESS_TO_TAKE_SUBRACE:0) | (PortOnSubraceModification?SWAND_CHOOSER_PORT_TO_SUBRACE_START_LOCATION_END_SUBRACE_MODIFICATION:0) | (AllowSubracelessPlayersPortToStart?SWAND_CHOOSER_ALLOW_SUBRACELESS_TO_PORT_TO_START_LOCATION:0) | (CanBeUsedSubraceStartLocationPortal?SWAND_CHOOSER_START_LOCATION_PORTAL:0); SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_SETTINGS, Settings); if ( WaypointTagForTheSubraceless != "") { SetLocalString(Chooser, SWAND_PREFIX + SWAND_CHOOSER_SETTINGS, WaypointTagForTheSubraceless); } } string PrintSWandChooserSettings(int Verbose=FALSE, int PRMessage=FALSE, object Chooser=OBJECT_SELF) { Chooser = GetIsPC(OBJECT_SELF)?GetModule():OBJECT_SELF; int Settings = GetSWandChooserSettings(Chooser); string Message = ""; string Waypointtag; object Waypoint = OBJECT_INVALID; if(Settings & SWAND_CHOOSER_IS_CHOOSER) { Waypointtag = GetLocalString(Chooser, SWAND_PREFIX + SWAND_CHOOSER_SETTINGS); Message = "This Subrace Chooser:"; if( (Settings & SWAND_CHOOSER_ALLOW_SUBRACELESS_TO_TAKE_SUBRACE) && (SWAND_LOW_LEVEL_SUBRACE_CHANGE > 0) ) { Message += "\n - allows "+SUBRACE_WHEN_NOUN+"less players below level " + IntToString(SWAND_LOW_LEVEL_SUBRACE_CHANGE + 1) + " to get a "+SUBRACE_WHEN_NOUN+"."; } if(Settings & SWAND_CHOOSER_START_LOCATION_PORTAL) { Message += "\n - allows all players to be ported to their "+SUBRACE_WHEN_NOUN+"'s start location."; } else if(Settings & SWAND_CHOOSER_ALLOW_SUBRACELESS_TO_PORT_TO_START_LOCATION) { Message += "\n - allows "+SUBRACE_WHEN_NOUN+"less players to be ported to their start location."; } if(Settings & SWAND_CHOOSER_PORT_TO_SUBRACE_START_LOCATION_END_SUBRACE_MODIFICATION) { Message += "\n - will port players, who obtains a "+SUBRACE_WHEN_NOUN+" from this chooser to their new start location."; } if(Verbose) { if(Waypointtag != "") { Message += "\nWaypoint tag for "+SUBRACE_WHEN_NOUN+"less players: " + ColourString(Waypointtag, COLOUR_LBLUE); Waypoint = GetWaypointByTag(Waypointtag); if(GetIsObjectValid(Waypoint)) { Message += "\nPorting "+SUBRACE_WHEN_NOUN+"less players to the area: " + ColourString( GetName(GetArea(Waypoint)), COLOUR_LGREEN ); } else { Message += "\nWaypoint was " + ColourString("not", COLOUR_RED) + " detected, please check the supplied tag. "+ CapitalizeString(SUBRACE_WHEN_NOUN) +"less players are ported to the start location of the Module"; } } else { Message += "\nWaypoint tag not supplied, porting "+SUBRACE_WHEN_NOUN+"less players to the start location of the module."; } } } return Message; } /******************************************************************************* *********************** SWand Conversation Menus *************************** *******************************************************************************/ int swand_BuildConversationDialog(int nCurrent, int nChoice, int iConversation, int iParams, int iFunction=0) { switch(iConversation) { case CONV_START: if(sw_gl_Permission>=SWAND_PERMISSION_DM) return swand_conv_Start_DM(nCurrent, nChoice, iParams, iFunction); return swand_conv_Start_PC(nCurrent, nChoice, iParams, iFunction); case CONV_LIST_OBJECTS: return swand_conv_ListObjects(nCurrent, nChoice, iParams, iFunction); case CONV_LIST_RACES: return swand_conv_ListRaces(nCurrent, nChoice, iParams, iFunction); case CONV_READ_RACE: if(sw_gl_Permission>=SWAND_PERMISSION_DM) return swand_conv_ReadRaces_DM(nCurrent, nChoice, iParams, iFunction); return swand_conv_ReadRaces_PC(nCurrent, nChoice, iParams, iFunction); case CONV_WORK_TARGET: return swand_conv_WorkWithTarget(nCurrent, nChoice, iParams, iFunction); case CONV_MATCH: if(sw_gl_Permission>=SWAND_PERMISSION_DM) return swand_conv_Match_DM(nCurrent, nChoice, iParams, iFunction); return swand_conv_Match_PC(nCurrent, nChoice, iParams, iFunction); case CONV_TEST_LETO: return swand_conv_LetoTest(nCurrent, nChoice, iParams, iFunction); case CONV_CONFIRM_SUBRACE_CHANGE: if(sw_gl_Permission>=SWAND_PERMISSION_DM) return swand_conv_ConfirmSubraceChange_DM(nCurrent, nChoice, iParams, iFunction); return swand_conv_ConfirmSubraceChange_PC(nCurrent, nChoice, iParams, iFunction); } return FALSE; } void swand_BuildConversation(int iConversation, int iParams, int iFunction = 0, int iMenu=0) { int iLast; int iTemp; int iChoice = 1; int iCurrent = 1; int iMatch; if(iMenu & MENU_PREV) { //Get the number choice to start with iCurrent = GetLocalInt(oMySpeaker, "swand_dialogprev"); swand_BuildChoice(9, "More Options >>", iConversation, iFunction, iParams, MENU_NEXT); //Since we're going to the previous page, there will be a next SetLocalInt(oMySpeaker, "swand_dialognext", iCurrent); iChoice = 8; for(;iChoice >= 0; iChoice--) { int iTemp1 = iCurrent; int iTemp2 = iCurrent; iMatch = iTemp2; while((iCurrent == iMatch) && (iTemp2 > 0)) { iTemp2--; iMatch = swand_BuildConversationDialog(iTemp2, iChoice, iConversation, iParams, iFunction); } if(iTemp2 <= 0) { //we went back too far for some reason, so make this choice blank swand_RemoveChoice(iChoice); } iLast = iTemp; iTemp = iTemp1; iTemp1 = iMatch; iCurrent = iMatch; } if(iMatch > 0) { swand_BuildChoice(1, "Previous Options <<", iConversation, iFunction, iParams, MENU_PREV); SetLocalInt(oMySpeaker, "swand_dialogprev", iLast); } //fill the NPC's dialog spot //(saved for last because the build process tromps on it) swand_BuildConversationDialog(0, 0, iConversation, iParams, iFunction); } else { //fill the NPC's dialog spot swand_BuildConversationDialog(0, 0, iConversation, iParams, iFunction); //A "next->" choice was selected if(iMenu & MENU_NEXT) { //get the number choice to start with iCurrent = GetLocalInt(oMySpeaker, "swand_dialognext"); //set this as the number for the "previous" choice to use SetLocalInt(oMySpeaker, "swand_dialogprev", iCurrent); //Set the first dialog choice to be "previous" iChoice = 2; swand_BuildChoice(1, "Previous Options <<", iConversation, iFunction, iParams, MENU_PREV); } //Loop through to build the dialog list for(;iChoice <= 10; iChoice++) { iMatch = swand_BuildConversationDialog(iCurrent, iChoice, iConversation, iParams, iFunction); //nLast will be the value of the choice before the last one iLast = iTemp; iTemp = iMatch; if(iMatch > 0) { iCurrent = iMatch; } else if(iMatch == 0) { iLast = 0; } iCurrent++; } //If there were enough choices to fill 10 spots, make spot 9 a "next" if(iLast > 0) { swand_BuildChoice(9, "More Options >>", iConversation, iFunction, iParams, MENU_NEXT); SetLocalInt(oMySpeaker, "swand_dialognext", iLast); } } } int swand_conv_Start_DM(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; switch(nCurrent) { case 0: nCurrent = 0; sText = "Welcome to Shayan's Subrace Engine's SWand." + "\nEngine Version: " + ColourString(SUBRACE_ENGINE_VERSION, COLOUR_LBLUE) + "\nWand Version: " + ColourString(SWAND_VERSION, COLOUR_LBLUE ) + "\nStatus: " + (GetIsSSEDisabled()?ColourString("\nSSE is DISABLED MODULE WIDE!", COLOUR_RED):ColourString("\nSSE is ACTIVATED and functioning!", COLOUR_GREEN_SSE)) + (GetIsSSEDisabledInArea(GetArea(oMySpeaker))?ColourString("\nThe Engine is disabled in this Area", COLOUR_YELLOW):ColourString("\nThe Engine is enabled in this Area", COLOUR_GREEN_SSE)) + "\n\n" + PrintSWandChooserSettings(TRUE); iCall = 0; break; case 1: sText = (GetIsObjectValid(GetMyTarget()))?"Work with my target: "+ ColourString(GetName(GetMyTarget()) ):""; iCall = CONV_WORK_TARGET; break; case 2: sText = "List players"; iCall = CONV_LIST_OBJECTS|CONV_DO_FUNCTION; iFunction = FUNCTION_BUILD_CACHE; break; case 3: sText = "List "+SUBRACE_WHEN_NOUN+"s"; iCall = CONV_LIST_RACES; iParams = CONV_READ_RACE; iFunction = 0; break; case 4: sText = (GetIsObjectValid(GetMyTarget()))?"Show me all "+SUBRACE_WHEN_NOUN+"s available to my target...":""; iCall = CONV_LIST_RACES; iParams = CONV_READ_RACE; iFunction = 1; break; case 5: if(SWAND_RESTRICT_LETO || (sw_gl_Permission==SWAND_PERMISSION_ADMIN) ) { //Admins ignore restrictions sText = "Check NWNX-Leto"; iCall = CONV_TEST_LETO; iParams = 0; } break; case 6: sText = "Reset Server"; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_DO_RESET; break; case 7: sText = (GetIsSSEDisabledInArea(GetArea(oMySpeaker))?ColourString("Enable"):ColourString("Disable", COLOUR_RED)) + " Shayan's Subrace Engine in this area"; iCall = CONV_DO_FUNCTION|CONV_START;//To update "case 0" iFunction = FUNCTION_DO_DISABLE_ENGINE; break; case 8: sText = (GetIsSSEDisabled()?ColourString("START"):ColourString("STOP", COLOUR_RED)) + " Shayan's Subrace Engine in the Module."; iCall = CONV_DO_FUNCTION|CONV_START;//To update "case 0" iFunction = FUNCTION_DO_SHUTDOWN_ENGINE; break; case 9: sText = "Save all characters (Uses the ExportAllCharacters)"; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_SAVE_CHARACTER; iParams = 0; break; case 10: sText = (GetIsObjectValid(GetMyTarget()))?"Open the SChooser Interface to "+ GetName(GetMyTarget()):""; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_OPEN_SCHOOSER; iParams = 0; break; default: nCurrent = 0; iFunction = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iParams); return nCurrent; } int swand_conv_ListObjects(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = CONV_WORK_TARGET| CONV_DO_FUNCTION; object oObject; int nCache = GetLocalInt(oMySpeaker, "swand_object_cache"); iFunction = FUNCTION_CACHE_2_TARGET; switch(nCurrent) { case 0: nCurrent = 0; sText = "Which player do you wish to target?"; iCall = 0; break; default: //Find the next object in the cache which is valid oObject = GetLocalObject(oMySpeaker, "swand_object_cache" + IntToString(nCurrent)); while((! GetIsObjectValid(oObject)) && (nCurrent <= nCache)) { nCurrent++; oObject = GetLocalObject(oMySpeaker, "swand_object_cache" + IntToString(nCurrent)); } if(nCurrent > nCache) { //We've run out of cache, any other spots in this list should be //skipped nCurrent = 0; sText = ""; iCall = 0; iFunction = 0; iParams = 0; } else { //We found an Object, set up the list entry sText = GetInfoCurrentTarget(oObject); iParams = nCurrent; } break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iParams); return nCurrent; } int swand_conv_ListRaces(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = 0; int Done=TRUE; int iSubraceCount = GetSSEInt(MODULE_SUBRACE_COUNT); switch(nCurrent) { case 0: nCurrent = 0; sText = "Which "+SUBRACE_WHEN_NOUN+" do you wish to select?"; iCall = 0; break; default: if(nCurrent > iSubraceCount) { //We've run out of cache, any other spots in this list should be //skipped //nCurrent = 0; sText=""; return 0; } else { object oTarget = GetMyTarget(); switch(iFunction) { case 1: while(sText == "" && nCurrent <= iSubraceCount) { if(CheckIfPCMeetsBaseRaceCriteria(oTarget, GetSubraceStorageLocationByID(nCurrent)) ) { sText = OutputSubraceInformation(nCurrent); iCall = iParams; iCallParams = nCurrent; Done=FALSE; break; } nCurrent++; } break; case 2: while(sText == "" && nCurrent <= iSubraceCount) { if(!CheckIfPCGetsAnyErrorsWithSubraceTest(oTarget, nCurrent)) { sText = OutputSubraceInformation(nCurrent); iCall = iParams; iCallParams = nCurrent; Done=FALSE; break; } nCurrent++; } break; default: sText = OutputSubraceInformation(nCurrent); iCall = iParams; iCallParams = nCurrent; Done=FALSE; break; } } break; if(Done) { sText=""; iCall=0; iCallParams = nCurrent; } } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_ReadRaces_DM(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = iParams & PARAMS_PAGE_FILTER_OUT; switch(nCurrent) { case 0: sText = OutputFullSubraceInformation(iParams & PARAMS_PAGE_FILTER_OUT, iParams &~PARAMS_PAGE_FILTER_OUT); iCall = 0; break; case 1: sText = (GetIsObjectValid(GetMyTarget()))? "Work with my target: "+ ColourString(GetName(GetMyTarget()) ):""; iCall = CONV_MATCH; break; case 2: sText = "Show Base information"; iCall = CONV_READ_RACE; break; case 3: sText = "Show Temp. Stat information"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_1; break; case 4: sText = "Show Base Stat information (Leto)"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_2; break; case 5: sText = (GetIsObjectValid(GetMyTarget())? "Estimate "+ ColourString(GetName(GetMyTarget()))+"'s stats with this "+SUBRACE_WHEN_NOUN:""); iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_3; break; case 6: sText = "Show the "+SUBRACE_WHEN_NOUN+"'s item restrictions"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_4; break; case 7: sText = "Show the "+SUBRACE_WHEN_NOUN+"'s special restrictions"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_5; break; case 8: sText = "Back to "+SUBRACE_WHEN_NOUN+" list"; iCall = CONV_LIST_RACES; iCallParams = CONV_READ_RACE; break; case 9: sText = "Back to Main Menu"; iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_WorkWithTarget(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = 0; int iFunction =0; switch(nCurrent) { case 0: sText = GetInfoCurrentTarget(GetMyTarget() ); break; case 1: sText = "Give player a new "+SUBRACE_WHEN_NOUN+". This will remove the old "+SUBRACE_WHEN_NOUN+"."; iCall = CONV_LIST_RACES; iCallParams = CONV_MATCH; break; case 2: sText = "Purge player's "+SUBRACE_WHEN_NOUN; iCall = CONV_CONFIRM_SUBRACE_CHANGE; iCallParams = -1; break; case 3: break; case 7: sText = "Search for a new player to work with."; iCall = CONV_LIST_OBJECTS|CONV_DO_FUNCTION; iFunction = FUNCTION_BUILD_CACHE; break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_Match_DM(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = iParams; switch(nCurrent) { case 0: sText = GetTestMatch(GetMyTarget(), iParams ); break; case 1: sText = "Change "+SUBRACE_WHEN_NOUN; iCall = CONV_CONFIRM_SUBRACE_CHANGE; break; case 7: sText = "Select a different "+SUBRACE_WHEN_NOUN; iCall = CONV_LIST_RACES; iCallParams = CONV_MATCH; break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_LetoTest(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iFunction = SWandLetoTest(iParams & 0x80000000); iParams &= 0x7FFFFFFF; object oTarget; string sFilename; string sLoc; switch(nCurrent) { case 0: switch(iParams) { case 0x00000000: sText = "SWand Leto Test Menu: " + (iParams & 0x80000000?"Test is Forced!\n":"\n"); switch(iFunction) { case SWAND_LETO_DETECTED: sText += "LetoScript detected!"; SetLocalString(oStorer, "SUBR_PlayerName", "[Login]"); sText += "\n\nServervault Path: " + LETO_GetBicPath_Wand(oStorer); DeleteLocalString(oStorer, "SUBR_PlayerName"); break; case SWAND_LETO_NOT_DETECTED: sText += "SWand was unable to detect LetoScript"; break; case SWAND_LETO_NOT_ENABLED: sText += "SSE was not compiled with Leto Enabled, therefore no test was made."; sText += "\n\nTo enable Leto, open sha_subr_consts " + "and change the ENABLE_LETO constant to TRUE"; break; default: //This cannot not possibly happen, but if it does, at least they can report it. sText += "Error...? SWandLetoTest returned unexpected value.\n"+ "See the manual's Contact Page for support."; break; } break; case 0x00000001: if( SWandLetoTest()==SWAND_LETO_DETECTED ) //Retest incase the initial test was bypassing SSE ENABLE_LETO { sText = "Leto Information:"+ "\n\n" +(LETO_ACTIVATE_PORTAL? "Use Portal: Yes\nIP: " + LETO_PORTAL_IP_ADDRESS + "\nPassword: " + (( (SWAND_RESTRICT_LETO-1) || (sw_gl_Permission==SWAND_PERMISSION_ADMIN) )?LETO_PORTAL_SERVER_PASSWORD:"********") + "\nWaypoint Tag: " + LETO_PORTAL_WAYPOINT + "\nKeep PC In Place: " + (LETO_PORTAL_KEEP_CHARACTER_IN_THE_SAME_PLACE? "Yes":"No") : "Use Portal: No\nDo Auto-Booting: " + (LETO_AUTOMATICALLY_BOOT?"Yes":"No") + "\nBoot Delay: " + IntToString(LETO_AUTOMATIC_PORTAL_DELAY) + " seconds" ); oTarget = GetMyTarget(); if(GetIsObjectValid(oTarget) && !GetIsDM(oTarget) && GetIsPC(oTarget) ) { sText += "\n\nPath: " + LETO_GetBicPath_Wand(oTarget); sText += "\nFilename: " + GetLocalString(oTarget, "SUBR_FileName"); sText += "\nNB: the filename may not be accurate, check the Leto boards for issues about 'FindNewestBic' or filename issues in general"; } else { SetLocalString(oStorer, "SUBR_PlayerName", "[Login]"); sText += "\n\nPath: " + LETO_GetBicPath_Wand(oStorer); DeleteLocalString(oStorer, "SUBR_PlayerName"); sText += "\nFileName: N/A"; sText += "\nPlease select a non-DM Player Character for a filename estimation"; } } else { sText = "'Off-line' Leto Information:"+ "\n\n" +(LETO_ACTIVATE_PORTAL? "Use Portal: Yes\nIP: " + LETO_PORTAL_IP_ADDRESS + "\nPassword: " + ((SWAND_RESTRICT_LETO-1)?LETO_PORTAL_SERVER_PASSWORD:"********") + "\nWaypoint Tag: " + LETO_PORTAL_WAYPOINT + "\nKeep PC In Place: " + (LETO_PORTAL_KEEP_CHARACTER_IN_THE_SAME_PLACE? "Yes":"No") : "Use Portal: No\nDo Auto-Booting: " + (LETO_AUTOMATICALLY_BOOT?"Yes":"No") + "\nBoot Delay: " + IntToString(LETO_AUTOMATIC_PORTAL_DELAY) + " seconds" ); } break; } break; case 1: switch(iParams) { case 0x00000000: switch(iFunction) { case SWAND_LETO_NOT_ENABLED: sText = "Bypass restrictions and force SWand to attempt to detect Leto."; iCall = CONV_TEST_LETO; iParams = 0x80000000; break; } break; } break; case 2: switch(iParams) { case 0x00000000: if(!(iParams &0x80000000)) { sText = "Display Leto-information (This might be the 'Off-line' information, if SSE is not compiled with Leto enabled)"; } else if(iFunction==SWAND_LETO_DETECTED) { sText = "Display Leto-information"; } else { sText = "Display 'Off-line' Leto-information"; } iCall = CONV_TEST_LETO; iParams = 0x00000001; break; } break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; iParams = 0; iFunction = 0; break; default: nCurrent = 0; iFunction = 0; iParams = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iParams); return nCurrent; } int swand_conv_ConfirmSubraceChange_DM(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = iParams; switch(nCurrent) { case 0: if(!GetLocalInt(GetMyTarget(), SWAND_CHANGE_SUBRACE)) { sText = "You are about to "+ ( (iParams!=-1)? ColourString("change ", COLOUR_YELLOW) + ColourString(GetName(GetMyTarget())) + "'s "+SUBRACE_WHEN_NOUN+" to " + ColourString(CapitalizeString( GetLocalString(oStorer, MODULE_SUBRACE_NUMBER + IntToString(iParams)) ), COLOUR_LBLUE ) : ColourString("remove ", COLOUR_RED)+ ColourString(GetName(GetMyTarget())) + "'s "+SUBRACE_WHEN_NOUN); } else { sText = GetName(GetMyTarget()) + "'s "+SUBRACE_WHEN_NOUN+" has been changed."; } break; case 1: if(!GetLocalInt(GetMyTarget(), SWAND_CHANGE_SUBRACE)) { sText = "Proceed with the change."; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_CHANGE_SUBRACE; } else { nCurrent = 0; } break; case 7: sText = "Select a different "+SUBRACE_WHEN_NOUN; iCall = CONV_LIST_RACES; iCallParams = CONV_MATCH; break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_Start_PC(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; switch(nCurrent) { case 0: nCurrent = 0; sText = "Welcome to SChooser for Shayan's Subrace Engine." + "\nEngine Version: " + ColourString(SUBRACE_ENGINE_VERSION, COLOUR_LBLUE) + "\nWand Version: " + ColourString(SWAND_VERSION, COLOUR_LBLUE ) + "\n\n" + PrintSWandChooserSettings(FALSE, TRUE); iCall = 0; break; case 1: if(swand_PlayerIsAllowedToChangeSubrace(oMySpeaker ) ) { sText = "Apply a new "+SUBRACE_WHEN_NOUN+"..."; iCall = CONV_LIST_RACES; iParams = CONV_MATCH; } break; case 2: sText = "Show me all "+SUBRACE_WHEN_NOUN+"s, to which my character meets all requirements..."; iCall = CONV_LIST_RACES; iParams = CONV_READ_RACE; iFunction = 2; break; case 3: sText = "Show me all "+SUBRACE_WHEN_NOUN+"s, which has the same base race as my character."; iCall = CONV_LIST_RACES; iParams = CONV_READ_RACE; iFunction = 1; break; case 4: sText = "Show me all "+SUBRACE_WHEN_NOUN+"s..."; iCall = CONV_LIST_RACES; iParams = CONV_READ_RACE; iFunction = 0; break; case 5: sText = "Reload my "+SUBRACE_WHEN_NOUN+". (May fix misc. such as wrong appearence)"; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_RELOAD_SUBRACE; break; case 6: sText = "Save my character."; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_SAVE_CHARACTER; iParams = 2; break; case 7: if( ( swand_PlayerIsAllowedToChangeSubrace(oMySpeaker) && (SWAND_CHOOSER_ALLOW_SUBRACELESS_TO_PORT_TO_START_LOCATION & swand_ChooserSettings)) ) { sText = "I do not wish a "+SUBRACE_WHEN_NOUN+", please port me to the start location for "+SUBRACE_WHEN_NOUN+"less players"; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_SEND_TO_SUBRACE_START_LOCATION; } break; case 8: if(SWAND_CHOOSER_START_LOCATION_PORTAL & swand_ChooserSettings ) { sText = "Send me to my start location."; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_SEND_TO_SUBRACE_START_LOCATION; } break; default: nCurrent = 0; iFunction = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iParams); return nCurrent; } int swand_conv_ReadRaces_PC(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = iParams&PARAMS_PAGE_FILTER_OUT; switch(nCurrent) { case 0: iCall = 0; sText = OutputFullSubraceInformation(iParams & PARAMS_PAGE_FILTER_OUT, iParams &~PARAMS_PAGE_FILTER_OUT); break; case 1: if(swand_PlayerIsAllowedToChangeSubrace(oMySpeaker) ) { sText = "I want this to be my new "+SUBRACE_WHEN_NOUN+"."; iCall = CONV_MATCH; } break; case 3: sText = "Show Temp. Stat information"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_1; break; case 4: sText = "Show Base Stat information (Leto)"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_2; break; case 5: sText = "Estimate my stats with this "+SUBRACE_WHEN_NOUN; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_3; break; case 6: sText = "Show the "+SUBRACE_WHEN_NOUN+"'s item restrictions"; iCall = CONV_READ_RACE; iCallParams |=PARAMS_PAGE_4; break; case 7: sText = "Back to "+SUBRACE_WHEN_NOUN+" list"; iCall = CONV_LIST_RACES; iCallParams = CONV_READ_RACE; break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_Match_PC(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = iParams; switch(nCurrent) { case 0: sText = GetTestMatch(oMySpeaker, iParams ); break; case 1: iFunction = CheckIfPCGetsAnyErrorsWithSubraceTest(oMySpeaker, iParams); if(!iFunction) { sText = "I wish to obtain this "+SUBRACE_WHEN_NOUN+"."; iCall = CONV_CONFIRM_SUBRACE_CHANGE; } else { iCall=0; while(iFunction ) { iCall += iFunction&FLAG1; iFunction>>=1; } sText = "There " + ((iCall!=1)?"were "+ IntToString(iCall) + " mismatches":"was a mismatch") + "."+ "\nYou cannot change into this "+SUBRACE_WHEN_NOUN+", if you do not meet the requirements for it."; iCall=0; } iFunction = 0; break; case 7: sText = "Select a different "+SUBRACE_WHEN_NOUN; iCall = CONV_LIST_RACES; iCallParams = CONV_MATCH; break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } int swand_conv_ConfirmSubraceChange_PC(int nCurrent, int nChoice, int iParams = 0, int iFunction = 0) { string sText = ""; int iCall = 0; int iCallParams = iParams; switch(nCurrent) { case 0: if(!GetLocalInt(GetMyTarget(), SWAND_PREFIX + SWAND_CHANGE_SUBRACE)) { sText = "You are about to "+ ( (iParams!=-1)? ColourString("change ", COLOUR_YELLOW) + ColourString("your") + " "+SUBRACE_WHEN_NOUN+" to " + ColourString(CapitalizeString( GetLocalString(oStorer, MODULE_SUBRACE_NUMBER + IntToString(iParams)) ), COLOUR_LBLUE ) : ColourString("remove ", COLOUR_RED)+ ColourString("your") + " "+SUBRACE_WHEN_NOUN); SetMyTarget(oMySpeaker); } else { sText = "Your "+SUBRACE_WHEN_NOUN+" has been changed."; } break; case 1: if(!GetLocalInt(GetMyTarget(), SWAND_PREFIX + SWAND_CHANGE_SUBRACE)) { sText = "Proceed with the change."; iCall = CONV_DO_FUNCTION; iFunction = FUNCTION_CHANGE_SUBRACE; } else { nCurrent = 0; } break; case 7: sText = "Select a different "+SUBRACE_WHEN_NOUN; iCall = CONV_LIST_RACES; iCallParams = CONV_MATCH; break; case 8: sText = ColourString("Back to Main Menu"); iCall = CONV_START; break; default: nCurrent = 0; break; } swand_BuildChoice(nChoice, sText, iCall, iFunction, iCallParams); return nCurrent; } void SetChooserStartMenu(int Conversation, int SpecialParameter=FALSE, int SpecialFunction=FALSE, int OneTime=FALSE, object Chooser=OBJECT_SELF) { if(OneTime) { SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_START_ONE_TIME, Conversation); SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_PARAM_ONE_TIME, SpecialParameter); SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_FUNC_ONE_TIME, SpecialFunction); } else { SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_START, Conversation); SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_PARAM, SpecialParameter); SetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_FUNC, SpecialFunction); } } int GetLocalOneTimeInt(object oObject, string sVarName) { int Value = GetLocalInt(oObject, sVarName); if(Value) { DeleteLocalInt(oObject, sVarName); } return Value; } int GetChooserStartMenu(object Chooser=OBJECT_SELF) { int Value = GetLocalOneTimeInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_START_ONE_TIME); if(!Value) { Value = GetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_START); } return Value; } int GetChooserStartFunction(object Chooser=OBJECT_SELF) { int Value = GetLocalOneTimeInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_FUNC_ONE_TIME); if(!Value) { Value = GetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_FUNC); } return Value; } int GetChooserStartParameter(object Chooser=OBJECT_SELF) { int Value = GetLocalOneTimeInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_PARAM_ONE_TIME); if(!Value) { Value = GetLocalInt(Chooser, SWAND_PREFIX + SWAND_CHOOSER_PARAM); } return Value; } void swand_StartConversation() { if(! GetIsObjectValid(oMySpeaker)) { return; } object oTarget = GetItemActivatedTarget(); object Chooser = GetIsPC(OBJECT_SELF)?GetModule():OBJECT_SELF; if(!GetUserPermissionsForSWand(oMySpeaker)) { SetMyTarget(oMySpeaker); } else if( GetIsPC( oTarget ) && !GetIsDM(oTarget) ) { SetMyTarget(oTarget); } int iConv = GetChooserStartMenu(Chooser); if(!iConv) iConv = CONV_START; swand_BuildConversation(iConv, GetChooserStartParameter(Chooser), GetChooserStartFunction(Chooser)); } void swand_RemoveChoice(int Choice) { string sChoice=IntToString(Choice); DeleteLocalString(oMySpeaker, "swand_dialog" + sChoice); DeleteLocalInt(oMySpeaker, "swand_call" + sChoice); DeleteLocalInt(oMySpeaker, "swand_params" + sChoice); DeleteLocalInt(oMySpeaker, "swand_function" + sChoice); DeleteLocalInt(oMySpeaker, "swand_menu" + sChoice); } void swand_BuildChoice(int Choice, string Text, int Conversation, int Function=0, int Params=0, int MenuOptions=0) { string sChoice=IntToString(Choice); SetLocalString(oMySpeaker, "swand_dialog"+sChoice, Text); SetLocalInt(oMySpeaker, "swand_call"+sChoice, Conversation); SetLocalInt(oMySpeaker, "swand_function"+sChoice, Function); SetLocalInt(oMySpeaker, "swand_params"+sChoice, Params); SetLocalInt(oMySpeaker, "swand_menu"+sChoice, MenuOptions); } void swand_DoDialogChoice(int nChoice) { swandScriptInit(); int iCall = GetLocalInt(oMySpeaker, "swand_call" + IntToString(nChoice)); int iFunction = GetLocalInt(oMySpeaker, "swand_function"+IntToString(nChoice)); int iCallParams = GetLocalInt(oMySpeaker, "swand_params"+IntToString(nChoice)); int iMenu = GetLocalInt(oMySpeaker, "swand_menu"+IntToString(nChoice) ); ActionPauseConversation(); int i; object oTarget; if(iCall & CONV_DO_FUNCTION) { iCall &= ~CONV_DO_FUNCTION; switch(iFunction) { case FUNCTION_DO_RESET: Reset(); break; case FUNCTION_BUILD_CACHE: swand_BuildCache(); break; case FUNCTION_CACHE_2_TARGET: SetMyTarget(GetLocalObject(oMySpeaker, "swand_object_cache" + IntToString( iCallParams ) ) ); DelayCommand(1.0, swand_CleanCache()); break; case FUNCTION_OPEN_SCHOOSER: oTarget = GetMyTarget(); if(!GetIsInCombat(oTarget) && GetCommandable(oTarget)) { SHA_SendSubraceMessageToPC(oTarget, "Bringing up the SChooser interface!"); DelayCommand(1.0, AssignCommand(oTarget, ClearAllActions())); DelayCommand(1.0, AssignCommand(oTarget, ActionStartConversation(oTarget, "swand", FALSE, FALSE) )); SHA_SendSubraceMessageToPC(oMySpeaker, "No errors detected, bringing up SChooser."); } else { SHA_SendSubraceMessageToPC(oMySpeaker, "Failed, " + GetName(oTarget) + " is unable to start a conversation"); } break; case FUNCTION_CHANGE_SUBRACE: SHA_SendSubraceMessageToPC(oMySpeaker, "Switching the player's "+SUBRACE_WHEN_NOUN+"... please wait."); ChangeSubrace(GetMyTarget(), iCallParams); iCall = CONV_START; break; case FUNCTION_DO_DISABLE_ENGINE: i = !GetIsSSEDisabledInArea(GetArea(oMySpeaker)); SetLocalInt(GetArea(oMySpeaker), "DISABLE_SUBRACE_ENGINE", i); break; case FUNCTION_DO_SHUTDOWN_ENGINE: i = !GetIsSSEDisabled(); SetLocalInt(GetModule(), "SHUTDOWN_SSE", i); i?ShutdownSSE():StartSSE(); SHA_SendSubraceMessageToPC(oMySpeaker, "Switching the SSE " + (i?"Off":"On") + "."); break; case FUNCTION_SAVE_CHARACTER: SaveCharacter(iCallParams, GetMyTarget() ); break; case FUNCTION_RELOAD_SUBRACE: ReapplySubraceAbilities(GetMyTarget() ); break; case FUNCTION_SEND_TO_SUBRACE_START_LOCATION: oTarget = GetMyTarget(); if( (!GetIsObjectValid(oTarget)) && (!GetIsDM(oMySpeaker)) ) { oTarget = oMySpeaker; } SWandSendPlayerToSubraceStartLocation(oTarget, GetSubRace(oTarget)); break; } } swand_BuildConversation( iCall & CONV_REMOVE_PARAM , iCallParams, iFunction, iMenu); ActionResumeConversation(); }