2025-04-26 15:20:45 -04:00

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