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