mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-29 10:31:34 +00:00
Miners can now purchase fulton extraction packs. Miners can now purchase fulton medivac packs. Two new fulton related bundles are available for purchase with vouchers.
188 lines
6.0 KiB
Plaintext
188 lines
6.0 KiB
Plaintext
var/list/total_extraction_beacons = list()
|
|
|
|
/obj/item/weapon/extraction_pack
|
|
name = "fulton material extraction pack"
|
|
desc = "A balloon that can be used to extract a target 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 = 3
|
|
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 = 0
|
|
|
|
/obj/item/weapon/extraction_pack/medivac
|
|
name = "fulton medivac extraction pack"
|
|
desc = "A specialized extraction balloon capable of safely extracting living targets."
|
|
uses_left = 1
|
|
safe_for_living_creatures = 1
|
|
|
|
/obj/item/weapon/extraction_pack/examine()
|
|
. = ..()
|
|
usr.show_message("It has [uses_left] uses remaining.", 1)
|
|
|
|
/obj/item/weapon/extraction_pack/attack_self(mob/user)
|
|
var/list/possible_beacons = list()
|
|
for(var/B in total_extraction_beacons)
|
|
var/obj/structure/extraction_point/EP = B
|
|
if(EP.beacon_network in beacon_networks)
|
|
possible_beacons += EP
|
|
|
|
if(!possible_beacons.len)
|
|
user << "There are no extraction beacons in existance!"
|
|
return
|
|
|
|
else
|
|
var/A
|
|
|
|
A = input("Select a beacon to connect to", "Balloon Extraction Pack", A) in possible_beacons
|
|
|
|
if(!A)
|
|
return
|
|
beacon = A
|
|
|
|
/obj/item/weapon/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params)
|
|
if(!beacon)
|
|
user << "[src] is not linked to a beacon, and cannot be used."
|
|
return
|
|
if(!can_use_indoors)
|
|
var/area/area = get_area(A)
|
|
if(!area.outdoors)
|
|
user << "[src] can only be used on things that are outdoors!"
|
|
return
|
|
if(!flag)
|
|
return
|
|
if(!istype(A))
|
|
return
|
|
else
|
|
if(!safe_for_living_creatures && check_for_living_mobs(A))
|
|
user << "[src] is not safe for use with living creatures, they wouldn't survive the trip back!"
|
|
if(A.loc == user || A == user) // no extracting stuff you're holding in your hands/yourself
|
|
return
|
|
if(A.anchored)
|
|
return
|
|
user << "<span class='notice'>You start attaching the pack to [A]...</span>"
|
|
if(do_after(user,50,target=A))
|
|
user << "<span class='notice'>You attach the pack to [A] and activate it.</span>"
|
|
uses_left--
|
|
if(uses_left <= 0)
|
|
user.drop_item(src)
|
|
loc = A
|
|
var/image/balloon
|
|
var/image/balloon2
|
|
var/image/balloon3
|
|
if(istype(A, /mob/living))
|
|
var/mob/living/M = A
|
|
M.Weaken(16) // Keep them from moving during the duration of the extraction
|
|
M.buckled = 0 // Unbuckle them to prevent anchoring problems
|
|
else
|
|
A.anchored = 1
|
|
A.density = 0
|
|
var/obj/effect/extraction_holder/holder_obj = new(A.loc)
|
|
holder_obj.appearance = A.appearance
|
|
A.loc = holder_obj
|
|
balloon2 = image('icons/obj/fulton_balloon.dmi',"fulton_expand")
|
|
balloon2.pixel_y = 10
|
|
balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
|
holder_obj.overlays += balloon2
|
|
sleep(4)
|
|
balloon = image('icons/obj/fulton_balloon.dmi',"fulton_balloon")
|
|
balloon.pixel_y = 10
|
|
balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
|
holder_obj.overlays -= balloon2
|
|
holder_obj.overlays += balloon
|
|
playsound(holder_obj.loc, 'sound/items/fulext_deploy.wav', 50, 1, -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.wav', 50, 1, -3)
|
|
animate(holder_obj, pixel_z = 1000, time = 30)
|
|
if(istype(A, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/L = A
|
|
L.SetParalysis(0)
|
|
L.drowsyness = 0
|
|
L.sleeping = 0
|
|
sleep(30)
|
|
var/list/flooring_near_beacon = list()
|
|
for(var/turf/open/floor in orange(1, beacon))
|
|
flooring_near_beacon += floor
|
|
holder_obj.loc = 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 = image('icons/obj/fulton_balloon.dmi',"fulton_retract")
|
|
balloon3.pixel_y = 10
|
|
balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
|
holder_obj.overlays -= balloon
|
|
holder_obj.overlays += balloon3
|
|
sleep(4)
|
|
holder_obj.overlays -= balloon3
|
|
A.anchored = 0 // 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.loc = 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 on to. Craft with metal to create a beacon."
|
|
icon = 'icons/obj/stock_parts.dmi'
|
|
icon_state = "subspace_amplifier"
|
|
|
|
/datum/crafting_recipe/fulton
|
|
name = "Fulton Recovery Beacon"
|
|
result = /obj/structure/extraction_point
|
|
reqs = list(/obj/item/fulton_core = 1, /obj/item/stack/sheet/metal = 5)
|
|
time = 15
|
|
category = CAT_MISC
|
|
|
|
/obj/structure/extraction_point
|
|
name = "fulton recovery beacon"
|
|
desc = "A beacon for the fulton recovery system. Hit a beacon with a pack to link the pack to a beacon."
|
|
icon = 'icons/obj/fulton.dmi'
|
|
icon_state = "extraction_point"
|
|
anchored = 1
|
|
density = 0
|
|
var/beacon_network = "station"
|
|
|
|
/obj/structure/extraction_point/New()
|
|
var/area/area_name = get_area(src)
|
|
name += " ([rand(100,999)]) ([area_name.name])"
|
|
total_extraction_beacons += src
|
|
..()
|
|
|
|
/obj/structure/extraction_point/Destroy()
|
|
total_extraction_beacons -= src
|
|
..()
|
|
|
|
/obj/effect/extraction_holder
|
|
name = "extraction holder"
|
|
desc = "you shouldnt see this"
|
|
var/atom/movable/stored_obj
|
|
|
|
/obj/item/weapon/extraction_pack/proc/check_for_living_mobs(atom/A)
|
|
if(istype(A, /mob/living))
|
|
var/mob/living/L = A
|
|
if(L.stat != DEAD)
|
|
return 1
|
|
for(var/thing in A.GetAllContents())
|
|
if(istype(A, /mob/living))
|
|
var/mob/living/L = A
|
|
if(L.stat != DEAD)
|
|
return 1
|
|
return 0 |