mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 03:52:31 +00:00
Adds an immobilized trait.
Adds procs for several variable changes so we can respond to their events.
Adds some signals for said variables changing.
Need to turn the variation in number of usable legs and arms (get_num_legs() and get_num_arms()) into events we can respond to, but they are pretty annoying to do so. Probably for a different PR.
197 lines
6.6 KiB
Plaintext
197 lines
6.6 KiB
Plaintext
GLOBAL_LIST_EMPTY(total_extraction_beacons)
|
|
|
|
/obj/item/extraction_pack
|
|
name = "fulton extraction pack"
|
|
desc = "A balloon that can be used to extract equipment or personnel to a Fulton Recovery Beacon. Anything not bolted down can be moved. Link the pack to a beacon by using the pack in hand."
|
|
icon = 'icons/obj/fulton.dmi'
|
|
icon_state = "extraction_pack"
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
var/obj/structure/extraction_point/beacon
|
|
var/list/beacon_networks = list("station")
|
|
var/uses_left = 3
|
|
var/can_use_indoors
|
|
var/safe_for_living_creatures = 1
|
|
var/max_force_fulton = MOVE_FORCE_STRONG
|
|
|
|
/obj/item/extraction_pack/examine()
|
|
. = ..()
|
|
. += "It has [uses_left] use\s remaining."
|
|
|
|
/obj/item/extraction_pack/attack_self(mob/user)
|
|
var/list/possible_beacons = list()
|
|
for(var/B in GLOB.total_extraction_beacons)
|
|
var/obj/structure/extraction_point/EP = B
|
|
if(EP.beacon_network in beacon_networks)
|
|
possible_beacons += EP
|
|
|
|
if(!possible_beacons.len)
|
|
to_chat(user, "<span class='warning'>There are no extraction beacons in existence!</span>")
|
|
return
|
|
|
|
else
|
|
var/A
|
|
|
|
A = input("Select a beacon to connect to", "Balloon Extraction Pack", A) as null|anything in sortNames(possible_beacons)
|
|
|
|
if(!A)
|
|
return
|
|
beacon = A
|
|
to_chat(user, "<span class='notice'>You link the extraction pack to the beacon system.</span>")
|
|
|
|
/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params)
|
|
. = ..()
|
|
if(!beacon)
|
|
to_chat(user, "<span class='warning'>[src] is not linked to a beacon, and cannot be used!</span>")
|
|
return
|
|
if(!(beacon in GLOB.total_extraction_beacons))
|
|
beacon = null
|
|
to_chat(user, "<span class='warning'>The connected beacon has been destroyed!</span>")
|
|
return
|
|
if(!can_use_indoors)
|
|
var/area/area = get_area(A)
|
|
if(!area.outdoors)
|
|
to_chat(user, "<span class='warning'>[src] can only be used on things that are outdoors!</span>")
|
|
return
|
|
if(!flag)
|
|
return
|
|
if(!istype(A))
|
|
return
|
|
else
|
|
if(!safe_for_living_creatures && check_for_living_mobs(A))
|
|
to_chat(user, "<span class='warning'>[src] is not safe for use with living creatures, they wouldn't survive the trip back!</span>")
|
|
return
|
|
if(!isturf(A.loc)) // no extracting stuff inside other stuff
|
|
return
|
|
if(A.anchored || (A.move_resist > max_force_fulton))
|
|
return
|
|
to_chat(user, "<span class='notice'>You start attaching the pack to [A]...</span>")
|
|
if(do_after(user,50,target=A))
|
|
to_chat(user, "<span class='notice'>You attach the pack to [A] and activate it.</span>")
|
|
if(loc == user && istype(user.back, /obj/item/storage/backpack))
|
|
var/obj/item/storage/backpack/B = user.back
|
|
SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE)
|
|
uses_left--
|
|
if(uses_left <= 0)
|
|
user.transferItemToLoc(src, A, TRUE)
|
|
var/mutable_appearance/balloon
|
|
var/mutable_appearance/balloon2
|
|
var/mutable_appearance/balloon3
|
|
if(isliving(A))
|
|
var/mob/living/M = A
|
|
M.Paralyze(320) // Keep them from moving during the duration of the extraction
|
|
if(M.buckled)
|
|
M.buckled.unbuckle_mob(M, TRUE) // Unbuckle them to prevent anchoring problems
|
|
else
|
|
A.set_anchored(TRUE)
|
|
A.density = FALSE
|
|
var/obj/effect/extraction_holder/holder_obj = new(A.loc)
|
|
holder_obj.appearance = A.appearance
|
|
A.forceMove(holder_obj)
|
|
balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand")
|
|
balloon2.pixel_y = 10
|
|
balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
|
holder_obj.add_overlay(balloon2)
|
|
sleep(4)
|
|
balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon")
|
|
balloon.pixel_y = 10
|
|
balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
|
holder_obj.cut_overlay(balloon2)
|
|
holder_obj.add_overlay(balloon)
|
|
playsound(holder_obj.loc, 'sound/items/fultext_deploy.ogg', 50, TRUE, -3)
|
|
animate(holder_obj, pixel_z = 10, time = 20)
|
|
sleep(20)
|
|
animate(holder_obj, pixel_z = 15, time = 10)
|
|
sleep(10)
|
|
animate(holder_obj, pixel_z = 10, time = 10)
|
|
sleep(10)
|
|
animate(holder_obj, pixel_z = 15, time = 10)
|
|
sleep(10)
|
|
animate(holder_obj, pixel_z = 10, time = 10)
|
|
sleep(10)
|
|
playsound(holder_obj.loc, 'sound/items/fultext_launch.ogg', 50, TRUE, -3)
|
|
animate(holder_obj, pixel_z = 1000, time = 30)
|
|
if(ishuman(A))
|
|
var/mob/living/carbon/human/L = A
|
|
L.SetUnconscious(0)
|
|
L.drowsyness = 0
|
|
L.SetSleeping(0)
|
|
sleep(30)
|
|
var/list/flooring_near_beacon = list()
|
|
for(var/turf/open/floor in orange(1, beacon))
|
|
flooring_near_beacon += floor
|
|
holder_obj.forceMove(pick(flooring_near_beacon))
|
|
animate(holder_obj, pixel_z = 10, time = 50)
|
|
sleep(50)
|
|
animate(holder_obj, pixel_z = 15, time = 10)
|
|
sleep(10)
|
|
animate(holder_obj, pixel_z = 10, time = 10)
|
|
sleep(10)
|
|
balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract")
|
|
balloon3.pixel_y = 10
|
|
balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
|
holder_obj.cut_overlay(balloon)
|
|
holder_obj.add_overlay(balloon3)
|
|
sleep(4)
|
|
holder_obj.cut_overlay(balloon3)
|
|
A.set_anchored(FALSE) // An item has to be unanchored to be extracted in the first place.
|
|
A.density = initial(A.density)
|
|
animate(holder_obj, pixel_z = 0, time = 5)
|
|
sleep(5)
|
|
A.forceMove(holder_obj.loc)
|
|
qdel(holder_obj)
|
|
if(uses_left <= 0)
|
|
qdel(src)
|
|
|
|
|
|
/obj/item/fulton_core
|
|
name = "extraction beacon signaller"
|
|
desc = "Emits a signal which fulton recovery devices can lock onto. Activate in hand to create a beacon."
|
|
icon = 'icons/obj/stock_parts.dmi'
|
|
icon_state = "subspace_amplifier"
|
|
|
|
/obj/item/fulton_core/attack_self(mob/user)
|
|
if(do_after(user,15,target = user) && !QDELETED(src))
|
|
new /obj/structure/extraction_point(get_turf(user))
|
|
qdel(src)
|
|
|
|
/obj/structure/extraction_point
|
|
name = "fulton recovery beacon"
|
|
desc = "A beacon for the fulton recovery system. Activate a pack in your hand to link it to a beacon."
|
|
icon = 'icons/obj/fulton.dmi'
|
|
icon_state = "extraction_point"
|
|
anchored = TRUE
|
|
density = FALSE
|
|
var/beacon_network = "station"
|
|
|
|
/obj/structure/extraction_point/Initialize()
|
|
. = ..()
|
|
name += " ([rand(100,999)]) ([get_area_name(src, TRUE)])"
|
|
GLOB.total_extraction_beacons += src
|
|
|
|
/obj/structure/extraction_point/Destroy()
|
|
GLOB.total_extraction_beacons -= src
|
|
..()
|
|
|
|
/obj/effect/extraction_holder
|
|
name = "extraction holder"
|
|
desc = "you shouldn't see this"
|
|
var/atom/movable/stored_obj
|
|
|
|
/obj/item/extraction_pack/proc/check_for_living_mobs(atom/A)
|
|
if(isliving(A))
|
|
var/mob/living/L = A
|
|
if(L.stat != DEAD)
|
|
return 1
|
|
for(var/thing in A.GetAllContents())
|
|
if(isliving(A))
|
|
var/mob/living/L = A
|
|
if(L.stat != DEAD)
|
|
return 1
|
|
return 0
|
|
|
|
/obj/effect/extraction_holder/singularity_act()
|
|
return
|
|
|
|
/obj/effect/extraction_holder/singularity_pull()
|
|
return
|