From 6fcce370c005c20e1f647d5e912e4e98bcc4bb79 Mon Sep 17 00:00:00 2001 From: Kurfursten Date: Mon, 18 May 2020 16:14:13 -0500 Subject: [PATCH] Better Teleports (#26459) * Better Teleports * betterport --- code/game/atoms_movable.dm | 19 +++++++++++++++ .../objects/items/weapons/storage/lockbox.dm | 20 ++-------------- code/modules/clothing/suits/armor.dm | 24 ++----------------- 3 files changed, 23 insertions(+), 40 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6d0da02bb2a..f04b690f27f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1089,6 +1089,25 @@ return TRUE return FALSE +/atom/movable/proc/teleport_radius(var/range) + var/list/best_options = list() + var/list/backup_options = list() + var/turf/picked + for(var/turf/T in orange(range, src)) + if(T.x>world.maxx-6 || T.x<6 || T.y>world.maxy-6 || T.y<6) //Conditions we will NEVER accept: too close to edge + continue + if(istype(T,/turf/space) || T.density) //Only as a fallback: dense turf or space + backup_options += T + continue + best_options += T + if(best_options.len) + picked = pick(best_options) + else if(backup_options.len) + picked = pick(backup_options) + else + return + forceMove(picked) + // -- trackers /atom/movable/proc/add_tracker(var/datum/tracker/T) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index e6f5cd4dafe..2eff284056b 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -513,25 +513,9 @@ return ..() /obj/item/weapon/storage/lockbox/advanced/proc/react() - var/list/turfs = new/list() - for(var/turf/T in orange(6, loc)) - if(istype(T,/turf/space)) - continue - if(T.density) - continue - if(T.x>world.maxx-6 || T.x<6) - continue - if(T.y>world.maxy-6 || T.y<6) - continue - turfs += T - if(!turfs.len) - turfs += pick(/turf in orange(6)) - var/turf/picked = pick(turfs) - if(!isturf(picked)) - return + teleport_radius(6) visible_message("\The [src] displaces itself with its reactive teleport system!") - playsound(src, 'sound/effects/teleport.ogg', 30, 1) - forceMove(picked) + playsound(src, 'sound/effects/teleport.ogg', 50, 1) /obj/item/weapon/storage/lockbox/advanced/energyshotgun/New() ..() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 71dc23d04f9..87cec2a7d03 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -296,29 +296,9 @@ if(L.wear_suit != src) //Not worn return 0 //Don't do anything - var/list/turfs = new/list() - - for(var/turf/T in orange(6, loc)) - if(istype(T,/turf/space)) - continue - if(T.density) - continue - if(T.x>world.maxx-6 || T.x<6) - continue - if(T.y>world.maxy-6 || T.y<6) - continue - turfs += T - if(!turfs.len) - turfs += pick(/turf in orange(6)) - var/turf/picked = pick(turfs) - if(!isturf(picked)) - return - + L.teleport_radius(6) L.visible_message("The reactive teleport system flings [L] clear of \the [blocked]!", "The reactive teleport system flings you clear of \the [blocked].") - - playsound(L, 'sound/effects/teleport.ogg', 30, 1) - - L.forceMove(picked) + playsound(L, 'sound/effects/teleport.ogg', 50, 1) return 1