364 lines
16 KiB
Plaintext
364 lines
16 KiB
Plaintext
//DMFI Universal Wand scripts by hahnsoo
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//This initializes the rest dialog.
|
|
//If limited by Time, report how long it will take before the PC can rest again
|
|
//If DM, tell the DM the interval of time between rests.
|
|
//If limited by placeable, report that the PC needs a restable object nearby
|
|
//If DM, tell the DM that the rest is limited by placeables.
|
|
//If limited by Armor, report that the PC is wearing armor that prevents resting
|
|
//If DM, tell the DM that the rest is limited by armor weight.
|
|
//If in an area that doesn't allow spell memorization, report this to the PC
|
|
//If DM, tell the DM that spell memorization is restricted in this area.
|
|
//If hit point restrictions are "up", tell the PC how many hitpoints they would gain by resting
|
|
//If DM, tell the DM what level of Hitpoint restrictions are in effect.
|
|
void SetRestTokens(object oPC)
|
|
{
|
|
object oArea = GetArea(oPC);
|
|
int iSettings = GetLocalInt(oPC, "dmfi_r_settings");
|
|
int iMinutesPerHour = FloatToInt(HoursToSeconds(1))/60;
|
|
SetCustomToken(20792, IntToString(iMinutesPerHour));
|
|
SetCustomToken(20793, IntToString(iMinutesPerHour * 2));
|
|
SetCustomToken(20794, IntToString(iMinutesPerHour * 4));
|
|
SetCustomToken(20795, IntToString(iMinutesPerHour * 6));
|
|
SetCustomToken(20796, IntToString(iMinutesPerHour * 8));
|
|
SetCustomToken(20797, IntToString(iMinutesPerHour * 12));
|
|
SetCustomToken(20798, IntToString(iMinutesPerHour * 24));
|
|
|
|
if (GetIsDM(oPC))
|
|
{
|
|
string sRest = "";
|
|
if (iSettings & 0x00000080)
|
|
{
|
|
SetCustomToken(20789, "[LOCAL]");
|
|
sRest = sRest + "[LOCAL] settings in effect";
|
|
if (iSettings & 0x00000002)
|
|
sRest = sRest + "\nThis is a No Rest area";
|
|
else if (!(iSettings & 0x00000001))
|
|
sRest = sRest + "\nThis is an Unlimited Rest area";
|
|
}
|
|
else
|
|
{
|
|
SetCustomToken(20789, "[GLOBAL]");
|
|
sRest = sRest + "[GLOBAL] settings in effect";
|
|
if (iSettings & 0x00000002)
|
|
sRest = sRest + "\nNo Rest is set globally";
|
|
else if (!(iSettings & 0x00000001))
|
|
sRest = sRest + "\nUnlimited Rest is set globally";
|
|
}
|
|
if (iSettings & 0x00000004)
|
|
{
|
|
sRest = sRest + "\nRest is limited by Time: ";
|
|
switch (iSettings & 0x00000f00)
|
|
{
|
|
default:
|
|
case 0x00000100: sRest = sRest + "1 hour"; break;
|
|
case 0x00000200: sRest = sRest + "2 hours"; break;
|
|
case 0x00000300: sRest = sRest + "4 hours"; break;
|
|
case 0x00000400: sRest = sRest + "6 hours"; break;
|
|
case 0x00000500: sRest = sRest + "8 hours"; break;
|
|
case 0x00000600: sRest = sRest + "12 hours"; break;
|
|
case 0x00000700: sRest = sRest + "24 hours"; break;
|
|
}
|
|
}
|
|
if (iSettings & 0x00000008) //Placeables
|
|
{
|
|
sRest = sRest + "\nRest is limited by Placeables: ";
|
|
if (!(iSettings & 0x00001000)) sRest = sRest + "DMFI_placeables ";
|
|
if (iSettings & 0x00002000) sRest = sRest + "Campfires ";
|
|
if (iSettings & 0x00004000) sRest = sRest + "Bed_Rolls ";
|
|
if (iSettings & 0x00008000) sRest = sRest + "Beds ";
|
|
if (iSettings & 0x00010000) sRest = sRest + "Tents ";
|
|
if ((iSettings & 0x00020000) || (iSettings & 0x00040000) || (iSettings & 0x00080000))
|
|
{
|
|
sRest = sRest + "\nClasses that ignore restrictions: ";
|
|
if (iSettings & 0x00020000) sRest = sRest + "Druids ";
|
|
if (iSettings & 0x00040000) sRest = sRest + "Rangers ";
|
|
if (iSettings & 0x00080000) sRest = sRest + "Barbarians ";
|
|
}
|
|
}
|
|
if (iSettings & 0x00000010) //Armor
|
|
{
|
|
sRest = sRest + "\nRest is limited by Armor: ";
|
|
switch (iSettings & 0x00f00000)
|
|
{
|
|
default:
|
|
case 0x00100000: sRest = sRest + "2 pounds"; break;
|
|
case 0x00200000: sRest = sRest + "6 pounds"; break;
|
|
case 0x00300000: sRest = sRest + "11 pounds"; break;
|
|
case 0x00400000: sRest = sRest + "16 pounds"; break;
|
|
case 0x00500000: sRest = sRest + "31 pounds"; break;
|
|
case 0x00600000: sRest = sRest + "41 pounds"; break;
|
|
case 0x00700000: sRest = sRest + "46 pounds"; break;
|
|
}
|
|
}
|
|
if (iSettings & 0x00000020) //Hit point limits
|
|
{
|
|
sRest = sRest + "\nHit points are limited to: ";
|
|
switch (iSettings & 0x0f000000)
|
|
{
|
|
case 0x01000000: sRest = sRest + "0 HP"; break;
|
|
case 0x02000000: sRest = sRest + "1 HP/level"; break;
|
|
case 0x03000000: sRest = sRest + "(CON) HP"; break;
|
|
case 0x04000000: sRest = sRest + "10 percent of max"; break;
|
|
case 0x05000000: sRest = sRest + "25 percent of max"; break;
|
|
case 0x06000000: sRest = sRest + "50 percent of max"; break;
|
|
default:
|
|
case 0x07000000: sRest = sRest + "100 percent"; break;
|
|
}
|
|
}
|
|
if (iSettings & 0x00000040) //Spell memorization
|
|
{
|
|
sRest = sRest + "\nSpell memorization is OFF";
|
|
}
|
|
SetCustomToken(20791, sRest);
|
|
}
|
|
else //For PCs
|
|
{ //Setting rest tokens
|
|
string sRest = "";
|
|
if (iSettings & 0x00000080)
|
|
{
|
|
if (iSettings & 0x00000002)
|
|
sRest = sRest + "\nThis is a No Rest area";
|
|
else if (!(iSettings & 0x00000001))
|
|
sRest = sRest + "\nThis is an Unlimited Rest area";
|
|
}
|
|
else
|
|
{
|
|
if (iSettings & 0x00000002)
|
|
sRest = sRest + "\nNo Rest is set globally";
|
|
else if (!(iSettings & 0x00000001))
|
|
sRest = sRest + "\nUnlimited Rest is set globally";
|
|
}
|
|
if (iSettings & 0x00000004 && iSettings & 0x00000001)
|
|
{
|
|
int iTime = GetTimeHour() + GetCalendarDay() * 24 + GetCalendarMonth() * 24 * 28 + GetCalendarYear() * 24 * 28 * 12;
|
|
int iNext = GetLocalInt(oPC, "dmfi_r_nextrest");
|
|
if (iNext > iTime)
|
|
sRest = sRest + "\nYou may rest again in " + IntToString(iNext - iTime) + " hours";
|
|
}
|
|
if (iSettings & 0x00000008 && iSettings & 0x00000001) //Placeables
|
|
{
|
|
if (!(GetLevelByClass(CLASS_TYPE_DRUID, oPC) && (iSettings & 0x00020000)) ||
|
|
!(GetLevelByClass(CLASS_TYPE_RANGER, oPC) && (iSettings & 0x00040000)) ||
|
|
!(GetLevelByClass(CLASS_TYPE_BARBARIAN, oPC) && (iSettings & 0x00080000)))
|
|
{
|
|
object oPlaceable = GetFirstObjectInShape(SHAPE_SPHERE, 6.0f, GetLocation(oPC), TRUE, OBJECT_TYPE_PLACEABLE);
|
|
int iBreak = 0;
|
|
while (GetIsObjectValid(oPlaceable) && !iBreak)
|
|
{
|
|
if (!(iSettings & 0x00001000) && GetTag(oPlaceable) == "dmfi_rest") //DMFI Placeables: by default, ON
|
|
iBreak = 1;
|
|
if ((iSettings & 0x00002000) && GetStringLowerCase(GetName(oPlaceable)) == "campfire") //Campfires
|
|
iBreak = 1;
|
|
if ((iSettings & 0x00004000) && (GetStringLowerCase(GetName(oPlaceable)) == "bed roll" || GetStringLowerCase(GetName(oPlaceable)) == "bedroll")) //Bed rolls
|
|
iBreak = 1;
|
|
if ((iSettings & 0x00008000) && GetStringLowerCase(GetName(oPlaceable)) == "bed") //beds
|
|
iBreak = 1;
|
|
if ((iSettings & 0x00010000) && GetStringLowerCase(GetName(oPlaceable)) == "tent") //tents
|
|
iBreak = 1;
|
|
oPlaceable = GetNextObjectInShape(SHAPE_SPHERE, 6.0f, GetLocation(oPC), TRUE, OBJECT_TYPE_PLACEABLE);
|
|
}
|
|
if (!iBreak)
|
|
{
|
|
sRest = sRest + "\nYou are not near a rest placeable";
|
|
}
|
|
}
|
|
}
|
|
if ((iSettings & 0x00000010) && iSettings & 0x00000001)//Armor
|
|
{
|
|
int iArmor = (iSettings & 0x00f00000);
|
|
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
|
int iWeight = GetWeight(oArmor);
|
|
switch(iArmor)
|
|
{
|
|
default:
|
|
case 0x00100000: if (iWeight > 20) sRest = sRest + "\nYou cannot rest in armor heavier than Clothing"; break;
|
|
case 0x00200000: if (iWeight > 60) sRest = sRest + "\nYou cannot rest in armor heavier than Padded"; break;
|
|
case 0x00300000: if (iWeight > 110) sRest = sRest + "\nYou cannot rest in armor heavier than Leather"; break;
|
|
case 0x00400000: if (iWeight > 160) sRest = sRest + "\nYou cannot rest in armor heavier than Studded Leather"; break;
|
|
case 0x00500000: if (iWeight > 310) sRest = sRest + "\nYou cannot rest in armor heavier than Chain Shirt"; break;
|
|
case 0x00600000: if (iWeight > 410) sRest = sRest + "\nYou cannot rest in armor heavier than Chain Mail"; break;
|
|
case 0x00700000: if (iWeight > 460) sRest = sRest + "\nYou cannot rest in armor heavier than Banded Mail"; break;
|
|
}
|
|
}
|
|
if (iSettings & 0x00000020 && iSettings & 0x00000001) //Hit point limits
|
|
{
|
|
sRest = sRest + "\nOn Rest, you will regain ";
|
|
switch (iSettings & 0x0f000000)
|
|
{
|
|
case 0x01000000: sRest = sRest + "0 HP"; break;
|
|
case 0x02000000: sRest = sRest + IntToString(GetHitDice(oPC)) + " HP"; break;
|
|
case 0x03000000: sRest = sRest + IntToString(GetAbilityScore(oPC, ABILITY_CONSTITUTION)) + " HP"; break;
|
|
case 0x04000000: sRest = sRest + IntToString(GetMaxHitPoints(oPC)/10) + " HP"; break;
|
|
case 0x05000000: sRest = sRest + IntToString(GetMaxHitPoints(oPC)/4) + " HP"; break;
|
|
case 0x06000000: sRest = sRest + IntToString(GetMaxHitPoints(oPC)/2) + " HP"; break;
|
|
default:
|
|
case 0x07000000: sRest = sRest + "full HP"; break;
|
|
}
|
|
sRest = sRest + "\nResting will drop you from the party";
|
|
}
|
|
if (iSettings & 0x00000040 && iSettings & 0x00000001) //Spell memorization
|
|
{
|
|
sRest = sRest + "\nYou cannot memorize spells here";
|
|
}
|
|
SetCustomToken(20790, sRest);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
int StartingConditional()
|
|
{
|
|
object oPC = GetPCSpeaker();
|
|
DeleteLocalInt(oPC, "Tens");
|
|
int iOffset = GetLocalInt(oPC, "dmfi_univ_offset")+1;
|
|
string sOffset = GetLocalString(oPC, "dmfi_univ_conv");
|
|
SetLocalInt(oPC, "dmfi_univ_offset", iOffset);
|
|
|
|
if (sOffset == "afflict" && iOffset==1)
|
|
return TRUE;
|
|
else if (sOffset == "pc_emote" && iOffset==2)
|
|
return TRUE;
|
|
else if (sOffset == "emote" && iOffset==2)
|
|
return TRUE;
|
|
else if (sOffset == "encounter" && iOffset==3)
|
|
return TRUE;
|
|
else if (sOffset == "fx" && iOffset==4)
|
|
return TRUE;
|
|
else if (sOffset == "music" && iOffset==5)
|
|
return TRUE;
|
|
else if (sOffset == "sound" && iOffset==6)
|
|
return TRUE;
|
|
else if (sOffset == "xp" && iOffset==7)
|
|
return TRUE;
|
|
else if (sOffset == "onering" && iOffset==8)
|
|
return TRUE;
|
|
else if (sOffset == "pc_dicebag" && iOffset==9)
|
|
{
|
|
SetLocalInt(oPC, "dmfi_univ_offset", 8);
|
|
|
|
if (GetLocalInt(oPC, "dmfi_dicebag")==0)
|
|
SetCustomToken(20681, "Private");
|
|
else if (GetLocalInt(oPC, "dmfi_dicebag")==1)
|
|
SetCustomToken(20681, "Global");
|
|
else if (GetLocalInt(oPC, "dmfi_dicebag")==2)
|
|
SetCustomToken(20681, "Local");
|
|
else if (GetLocalInt(oPC, "dmfi_dicebag")==3)
|
|
SetCustomToken(20681, "DM Only");
|
|
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "dicebag" && iOffset==10)
|
|
{
|
|
SetLocalInt(oPC, "dmfi_univ_offset", 9);
|
|
|
|
if (GetLocalInt(oPC, "dmfi_dicebag")==0)
|
|
SetCustomToken(20681, "Private");
|
|
else if (GetLocalInt(oPC, "dmfi_dicebag")==1)
|
|
SetCustomToken(20681, "Global");
|
|
else if (GetLocalInt(oPC, "dmfi_dicebag")==2)
|
|
SetCustomToken(20681, "Local");
|
|
else if (GetLocalInt(oPC, "dmfi_dicebag")==3)
|
|
SetCustomToken(20681, "DM Only");
|
|
|
|
string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target"));
|
|
SetCustomToken(20680, sName);
|
|
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "voice" &&
|
|
GetIsObjectValid(GetLocalObject(oPC, "dmfi_univ_target")) &&
|
|
oPC != GetLocalObject(oPC, "dmfi_univ_target") &&
|
|
iOffset==11)
|
|
{
|
|
string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target"));
|
|
SetCustomToken(20680, sName);
|
|
// pc range single/party
|
|
int hookparty = GetLocalInt(oPC, "dmfi_MyListenerPartyMode");
|
|
if (hookparty == 0) SetCustomToken(20681, "*Single* / Party");
|
|
else SetCustomToken(20681, "Single / *Party*");
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "voice" &&
|
|
!GetIsObjectValid(GetLocalObject(oPC, "dmfi_univ_target")) &&
|
|
iOffset==12)
|
|
{
|
|
string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target"));
|
|
SetCustomToken(20680, sName);
|
|
// loc range earshot/area/module
|
|
int hookparty = GetLocalInt(oPC, "dmfi_MyListenerPartyMode");
|
|
if (hookparty == 0) SetCustomToken(20681, "*Earshot* / Area / Module");
|
|
else if (hookparty == 1) SetCustomToken(20681, "Earshot / *Area* / Module");
|
|
else SetCustomToken(20681, "Earshot / Area / *Module*");
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "voice" &&
|
|
GetIsObjectValid(GetLocalObject(oPC, "dmfi_univ_target")) &&
|
|
oPC == GetLocalObject(oPC, "dmfi_univ_target") &&
|
|
iOffset==13)
|
|
{
|
|
string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target"));
|
|
SetCustomToken(20680, sName);
|
|
// self bcast one dm/all dm
|
|
int hookbcast = GetLocalInt(oPC, "dmfi_MyListenerBcastMode");
|
|
if (hookbcast == 0) SetCustomToken(20681, "*Self* / All DMs");
|
|
else SetCustomToken(20681, "Self / *All DMs*");
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "faction" && iOffset==14)
|
|
{
|
|
int iLoop = 1;
|
|
string sName;
|
|
object sFaction;
|
|
while (iLoop < 10)
|
|
{
|
|
sFaction = GetLocalObject(oPC, "dmfi_customfaction" + IntToString(iLoop));
|
|
sName = GetName(sFaction);
|
|
SetCustomToken(20690 + iLoop, sName + "'s Faction ");
|
|
iLoop++;
|
|
}
|
|
|
|
SetCustomToken(20690, GetName(GetLocalObject(oPC, "dmfi_henchman")));
|
|
SetCustomToken(20784, FloatToString(GetLocalFloat(oPC, "dmfi_reputation")));
|
|
sName = GetName(GetLocalObject(oPC, "dmfi_univ_target"));
|
|
SetCustomToken(20680, sName);
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "dmw" && iOffset ==15)
|
|
{
|
|
SetCustomToken(20781, IntToString(GetLocalInt(oPC, "dmfi_alignshift")));
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "buff" && iOffset ==16)
|
|
{
|
|
if (GetLocalInt(oPC, "dmfi_buff_party")==0)
|
|
SetCustomToken(20783, "Single Target");
|
|
else
|
|
SetCustomToken(20783, "Party");
|
|
SetCustomToken(20782, GetLocalString(oPC, "dmfi_buff_level"));
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "rest" && iOffset == 17 && !GetIsDM(oPC) && GetLocalInt(oPC, "dmfi_norest")) //This is the case of a No-Rest situation
|
|
{
|
|
SetRestTokens(oPC);
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "rest" && iOffset == 18 && !GetIsDM(oPC) && !GetLocalInt(oPC, "dmfi_norest")) //This is the case of a Rest situation
|
|
{
|
|
SetRestTokens(oPC);
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "rest" && iOffset == 19 && GetIsDM(oPC)) //This is the case of a DM activating the rest menu
|
|
{
|
|
SetRestTokens(oPC);
|
|
return TRUE;
|
|
}
|
|
else if (sOffset == "naming" && iOffset==20)
|
|
{
|
|
string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target"));
|
|
SetCustomToken(20680, sName);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|