138 lines
4.7 KiB
Plaintext
138 lines
4.7 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Malor (Apport)
|
|
//:: malor.nss
|
|
//:: Copyright (c) 2025 WizardryEE Project
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Teleports the party to a random location in combat,
|
|
or to a selected dungeon level and location when
|
|
used in camp. If a party teleports into stone it
|
|
is lost forever, so the spell is best used in
|
|
conjunction with DUMAPIC.
|
|
Level 7 Mage spell.
|
|
|
|
In Wizardry: Proving Grounds of the Mad Overlord,
|
|
this is a Level 7 Mage field/support spell that
|
|
affects the entire party.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: WizardryEE Project
|
|
//:: Created On: April 26, 2025
|
|
//:://////////////////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
// Spell implementation for WizardryEE
|
|
// Core functionality: Teleport party
|
|
|
|
// 1. Get caster information
|
|
object oCaster = OBJECT_SELF;
|
|
object oMember; // Declare party member variable
|
|
object oArea;
|
|
object oTargetArea;
|
|
location lNewLoc;
|
|
location lTargetLoc;
|
|
vector vNewPos;
|
|
vector vTargetPos;
|
|
|
|
// 2. Check if in combat
|
|
int bInCombat = GetLocalInt(oCaster, "IN_COMBAT");
|
|
|
|
// 3. Create teleport visual effect
|
|
effect eTeleport = EffectVisualEffect(46); // Teleport visual effect
|
|
|
|
if (bInCombat)
|
|
{
|
|
// Random teleport during combat
|
|
|
|
// Get current area
|
|
oArea = GetArea(oCaster);
|
|
|
|
// Generate random coordinates within the area
|
|
float fAreaWidth = 100.0; // Example area size
|
|
float fAreaHeight = 100.0;
|
|
vNewPos.x = IntToFloat(Random(FloatToInt(fAreaWidth)));
|
|
vNewPos.y = IntToFloat(Random(FloatToInt(fAreaHeight)));
|
|
vNewPos.z = 0.0;
|
|
lNewLoc = Location(oArea, vNewPos, 0.0);
|
|
|
|
// Check if location is safe (not in stone)
|
|
if (!GetLocalInt(oArea, "LOCATION_SOLID"))
|
|
{
|
|
// Teleport each party member
|
|
oMember = GetFirstPC();
|
|
while (GetIsObjectValid(oMember))
|
|
{
|
|
// Apply teleport effect
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eTeleport, oMember);
|
|
|
|
// Move to new location
|
|
AssignCommand(oMember, JumpToLocation(lNewLoc));
|
|
|
|
oMember = GetNextPC();
|
|
}
|
|
|
|
FloatingTextStringOnCreature("MALOR: Party teleported to random location!", oCaster, TRUE);
|
|
}
|
|
else
|
|
{
|
|
// Teleport into stone - party is lost
|
|
oMember = GetFirstPC();
|
|
while (GetIsObjectValid(oMember))
|
|
{
|
|
// Apply teleport effect
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eTeleport, oMember);
|
|
|
|
// Mark as permanently lost
|
|
SetLocalInt(oMember, "PERMANENTLY_LOST", 1);
|
|
|
|
oMember = GetNextPC();
|
|
}
|
|
|
|
FloatingTextStringOnCreature("MALOR: Party teleported into stone and was lost forever!", oCaster, TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Targeted teleport during camp
|
|
|
|
// Get target level and coordinates from user input
|
|
int nTargetLevel = GetLocalInt(oCaster, "TELEPORT_TARGET_LEVEL");
|
|
float fTargetX = GetLocalFloat(oCaster, "TELEPORT_TARGET_X");
|
|
float fTargetY = GetLocalFloat(oCaster, "TELEPORT_TARGET_Y");
|
|
|
|
// Create target location
|
|
oTargetArea = GetObjectByTag("DUNGEON_LEVEL_" + IntToString(nTargetLevel));
|
|
vTargetPos.x = fTargetX;
|
|
vTargetPos.y = fTargetY;
|
|
vTargetPos.z = 0.0;
|
|
lTargetLoc = Location(oTargetArea, vTargetPos, 0.0);
|
|
|
|
// Check if location is safe
|
|
if (!GetLocalInt(oTargetArea, "LOCATION_SOLID"))
|
|
{
|
|
// Teleport each party member
|
|
oMember = GetFirstPC();
|
|
while (GetIsObjectValid(oMember))
|
|
{
|
|
// Apply teleport effect
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eTeleport, oMember);
|
|
|
|
// Move to target location
|
|
AssignCommand(oMember, JumpToLocation(lTargetLoc));
|
|
|
|
oMember = GetNextPC();
|
|
}
|
|
|
|
FloatingTextStringOnCreature("MALOR: Party teleported to level " +
|
|
IntToString(nTargetLevel) + " at (" +
|
|
FloatToString(fTargetX, 0, 0) + "," +
|
|
FloatToString(fTargetY, 0, 0) + ")!", oCaster, TRUE);
|
|
}
|
|
else
|
|
{
|
|
// Notify unsafe location
|
|
FloatingTextStringOnCreature("MALOR: Target location is in solid stone!", oCaster, TRUE);
|
|
}
|
|
}
|
|
} |