// Teleport Other Artifact -------------------------------------------------- class ArtiTeleportOther : Inventory { Default { +COUNTITEM +FLOATBOB +INVENTORY.INVBAR +INVENTORY.FANCYPICKUPSOUND Inventory.PickupFlash "PickupFlash"; Inventory.DefMaxAmount; Inventory.Icon "ARTITELO"; Inventory.PickupSound "misc/p_pkup"; Inventory.PickupMessage "$TXT_ARTITELEPORTOTHER"; Tag "$TAG_ARTITELEPORTOTHER"; } States { Spawn: TELO ABCD 5; Loop; } //=========================================================================== // // Activate Teleport Other // //=========================================================================== override bool Use (bool pickup) { Owner.SpawnPlayerMissile ("TelOtherFX1"); return true; } } // Teleport Other FX -------------------------------------------------------- class TelOtherFX1 : Actor { const TELEPORT_LIFE = 1; Default { Damage 10001; Projectile; -ACTIVATEIMPACT -ACTIVATEPCROSS +BLOODLESSIMPACT Radius 16; Height 16; Speed 20; } States { Spawn: TRNG E 5 Bright; TRNG D 4 Bright; TRNG C 3 Bright A_TeloSpawnC; TRNG B 3 Bright A_TeloSpawnB; TRNG A 3 Bright A_TeloSpawnA; TRNG B 3 Bright A_TeloSpawnB; TRNG C 3 Bright A_TeloSpawnC; TRNG D 3 Bright A_TeloSpawnD; Goto Spawn+2; Death: TRNG E 3 Bright; Stop; } private void TeloSpawn (class type) { Actor fx = Spawn (type, pos, ALLOW_REPLACE); if (fx) { fx.special1 = TELEPORT_LIFE; // Lifetime countdown fx.angle = angle; fx.target = target; fx.Vel = Vel / 2; } } void A_TeloSpawnA() { TeloSpawn ("TelOtherFX2"); } void A_TeloSpawnB() { TeloSpawn ("TelOtherFX3"); } void A_TeloSpawnC() { TeloSpawn ("TelOtherFX4"); } void A_TeloSpawnD() { TeloSpawn ("TelOtherFX5"); } void A_CheckTeleRing () { if (self.special1-- <= 0) { self.SetStateLabel("Death"); } } //=========================================================================== // // Perform Teleport Other // //=========================================================================== override int DoSpecialDamage (Actor target, int damage, Name damagetype) { if ((target.bIsMonster || target.player != NULL) && !target.bBoss && !target.bNoTeleOther) { if (target.player) { if (deathmatch) P_TeleportToDeathmatchStarts (target); else P_TeleportToPlayerStarts (target); } else { // If death action, run it upon teleport if (target.bIsMonster && target.special) { target.RemoveFromHash (); Actor caller = level.ActOwnSpecial? target : self.target; caller.A_CallSpecial(target.special, target.args[0], target.args[1], target.args[2], target.args[3], target.args[4]); target.special = 0; } // Send all monsters to deathmatch spots P_TeleportToDeathmatchStarts (target); } } return -1; } //=========================================================================== // // P_TeleportToPlayerStarts // //=========================================================================== private static void P_TeleportToPlayerStarts (Actor victim) { Vector3 dest; double destAngle; [dest, destAngle] = G_PickPlayerStart(0, PPS_FORCERANDOM | PPS_NOBLOCKINGCHECK); dest.Z = ONFLOORZ; victim.Teleport ((dest.xy, ONFLOORZ), destangle, TELF_SOURCEFOG | TELF_DESTFOG); } //=========================================================================== // // P_TeleportToDeathmatchStarts // //=========================================================================== private void P_TeleportToDeathmatchStarts (Actor victim) { Vector3 dest; double destAngle; [dest, destAngle] = G_PickDeathmatchStart(); if (destAngle < 65536) victim.Teleport((dest.xy, ONFLOORZ), destangle, TELF_SOURCEFOG | TELF_DESTFOG); else P_TeleportToPlayerStarts(victim); } } class TelOtherFX2 : TelOtherFX1 { Default { Speed 16; } States { Spawn: TRNG BCDCB 4 Bright; TRNG A 4 Bright A_CheckTeleRing; Loop; } } class TelOtherFX3 : TelOtherFX1 { Default { Speed 16; } States { Spawn: TRNG CDCBA 4 Bright; TRNG B 4 Bright A_CheckTeleRing; Loop; } } class TelOtherFX4 : TelOtherFX1 { Default { Speed 16; } States { Spawn: TRNG DCBAB 4 Bright; TRNG C 4 Bright A_CheckTeleRing; Loop; } } class TelOtherFX5 : TelOtherFX1 { Default { Speed 16; } States { Spawn: TRNG CBABC 4 Bright; TRNG D 4 Bright A_CheckTeleRing; Loop; } }