WoR_PRC8/_module/nss/sw_main_inc.nss
Jaysyn904 b5e28e52f4 Initial commit
Initial commit [1.18]
2025-04-03 11:49:34 -04:00

2800 lines
96 KiB
Plaintext

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