Merge branch 'master' into init_update_and_stuff

This commit is contained in:
alberyk
2022-03-05 17:05:46 -03:00
46 changed files with 347 additions and 405 deletions
@@ -307,9 +307,38 @@
desc = "A bowl. You bowl foods... wait, what?"
icon = 'icons/obj/kitchen.dmi'
icon_state = "mixingbowl"
filling_states = "-10;10;25;50;75;80;100"
center_of_mass = list("x" = 17,"y" = 7)
max_space = 30
matter = list(DEFAULT_WALL_MATERIAL = 300)
volume = 180
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,60,180)
/obj/item/reagent_containers/cooking_container/plate/bowl/on_reagent_change()
update_icon()
/obj/item/reagent_containers/cooking_container/plate/bowl/pickup(mob/user)
..()
update_icon()
/obj/item/reagent_containers/cooking_container/plate/bowl/dropped(mob/user)
..()
update_icon()
/obj/item/reagent_containers/cooking_container/plate/bowl/attack_hand()
..()
update_icon()
/obj/item/reagent_containers/cooking_container/plate/bowl/update_icon()
cut_overlays()
if(reagents?.total_volume)
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state][get_filling_state()]")
filling.color = reagents.get_color()
add_overlay(filling)
@@ -13,7 +13,6 @@
var/weed_kill_str = 0
/obj/item/plantspray/weeds // -- Skie
name = "weed-spray"
desc = "It's a toxic mixture, in spray form, to kill small weeds."
icon_state = "weedspray"
@@ -25,61 +24,6 @@
icon_state = "pestspray"
pest_kill_str = 6
/obj/item/plantspray/pests/old
name = "bottle of pestkiller"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
/obj/item/plantspray/pests/old/carbaryl
name = "bottle of carbaryl"
icon_state = "bottle16"
toxicity = 4
pest_kill_str = 2
/obj/item/plantspray/pests/old/lindane
name = "bottle of lindane"
icon_state = "bottle18"
toxicity = 6
pest_kill_str = 4
/obj/item/plantspray/pests/old/phosmet
name = "bottle of phosmet"
icon_state = "bottle15"
toxicity = 8
pest_kill_str = 7
// *************************************
// Weedkiller defines for hydroponics
// *************************************
/obj/item/weedkiller
name = "bottle of weedkiller"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
var/toxicity = 0
var/weed_kill_str = 0
/obj/item/weedkiller/triclopyr
name = "bottle of glyphosate"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
toxicity = 4
weed_kill_str = 2
/obj/item/weedkiller/lindane
name = "bottle of triclopyr"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle18"
toxicity = 6
weed_kill_str = 4
/obj/item/weedkiller/D24
name = "bottle of 2,4-D"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle15"
toxicity = 8
weed_kill_str = 7
// *************************************
// Nutrient defines for hydroponics
// *************************************
-1
View File
@@ -664,7 +664,6 @@ var/list/worths = list(
/obj/item/honey_frame = 15,
/obj/item/beehive_assembly = 100,
/obj/item/bee_pack = 200,
/obj/item/weedkiller = 30,
/obj/item/phylactery = 40000,
/obj/item/bluespace_crystal/artificial = 5000,
/obj/item/bluespace_crystal = 10000,
+24 -4
View File
@@ -125,7 +125,12 @@
name = "docility potion"
desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
icon_state = "bottle-1"
/obj/item/slimepotion/Initialize() // Better than hardsprited in stuff.
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-100")
filling.color = COLOR_PINK
add_overlay(filling)
/obj/item/slimepotion/attack(var/mob/living/carbon/slime/M, var/mob/user)
if(!istype(M, /mob/living/carbon/slime)) //If target is not a slime.
@@ -159,7 +164,12 @@
name = "advanced docility potion"
desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame. This one is meant for adult slimes"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
icon_state = "bottle-1"
/obj/item/slimepotion2/Initialize() // Better than hardsprited in stuff.
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-100")
filling.color = COLOR_PINK
add_overlay(filling)
/obj/item/slimepotion2/attack(mob/living/carbon/slime/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime.
@@ -190,7 +200,12 @@
name = "slime steroid"
desc = "A potent chemical mix that will cause a slime to generate more extract."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
icon_state = "bottle-1"
/obj/item/slimesteroid/Initialize() // Better than hardsprited in stuff.
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-100")
filling.color = COLOR_GREEN
add_overlay(filling)
/obj/item/slimesteroid/attack(mob/living/carbon/slime/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/slime)) //If target is not a slime.
@@ -214,7 +229,12 @@
name = "extract enhancer"
desc = "A potent chemical mix that will give a slime extract three uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
icon_state = "bottle-1"
/obj/item/slimesteroid2/Initialize() // Better than hardsprited in stuff.
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-100")
filling.color = COLOR_BLUE
add_overlay(filling)
/obj/effect/golemrune
anchored = TRUE
@@ -62,7 +62,8 @@
var/area/A = get_area(M)
loc_display = A.name
if(T.malfunction)
loc_display = pick(teleportlocs)
var/area/location = pick(the_station_areas)
loc_display = location.name
var/list/tracker_info = list(
"id" = T.id,
"loc_display" = loc_display,
@@ -8,6 +8,7 @@
var/amount_per_transfer_from_this = 5
var/possible_transfer_amounts = list(5,10,15,25,30)
var/volume = 30
var/filling_states // List of percentages full that have icons
var/accuracy = 1
var/fragile = 0 // If nonzero, above what force do we shatter?
var/shatter_sound = /decl/sound_category/glass_break_sound
@@ -58,6 +59,21 @@
/obj/item/reagent_containers/attack_self(mob/user)
return
/obj/item/reagent_containers/proc/get_filling_state()
var/percent = round((reagents.total_volume / volume) * 100)
var/list/increments = cached_number_list_decode(filling_states)
if(!length(increments))
return
var/last_increment = increments[1]
for(var/increment in increments)
if(percent < increment)
break
last_increment = increment
return last_increment
/obj/item/reagent_containers/throw_impact(atom/hit_atom, var/speed)
. = ..()
if(ismob(loc))
@@ -17,7 +17,8 @@
name = "blood pack"
desc = "Contains blood used for transfusion."
icon = 'icons/obj/bloodpack.dmi'
icon_state = "empty"
icon_state = "bloodpack"
filling_states = "-10;10;25;50;75;80;100"
w_class = ITEMSIZE_SMALL
volume = 200
@@ -55,15 +56,12 @@
/obj/item/reagent_containers/blood/update_icon()
cut_overlays()
if(volume)
var/percent = round(reagents.total_volume / volume * 100)
if(reagents.total_volume)
var/image/filling = image('icons/obj/bloodpack.dmi', "[round(percent,25)]")
filling.color = reagents.get_color()
add_overlay(filling)
add_overlay(image('icons/obj/bloodpack.dmi', "top"))
if(attached_mob)
add_overlay(image('icons/obj/bloodpack.dmi', "dongle"))
if(attached_mob)
add_overlay(image('icons/obj/bloodpack.dmi', "dongle"))
if(reagents && reagents.total_volume)
add_overlay(overlay_image('icons/obj/bloodpack.dmi', "[icon_state][get_filling_state()]", color = reagents.get_color()))
/obj/item/reagent_containers/blood/attack(mob/living/carbon/human/M as mob, mob/living/carbon/human/user as mob, var/target_zone)
if(user == M && (MODE_VAMPIRE in user.mind?.antag_datums))
@@ -259,7 +257,7 @@
/obj/item/reagent_containers/blood/empty
name = "empty blood pack"
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
icon_state = "empty"
icon_state = "bloodpack"
/obj/item/reagent_containers/blood/ripped
name = "ripped blood pack"
@@ -8,6 +8,8 @@
)
icon_state = "dropper"
item_state = "dropper"
worn_overlay = "filling"
build_from_parts = TRUE
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(1,2,3,4,5)
w_class = ITEMSIZE_TINY
@@ -93,9 +95,9 @@
/obj/item/reagent_containers/dropper/update_icon()
cut_overlays()
if(reagents)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]")
filling.color = reagents.get_color()
add_overlay(filling)
add_overlay(overlay_image('icons/obj/reagentfillings.dmi', "[icon_state]", color = reagents.get_color()))
worn_overlay_color = reagents.get_color() // handles inhands
update_held_icon()
/obj/item/reagent_containers/dropper/AltClick(mob/user)
var/N = input("Amount per transfer from this:", "[src]") as null|anything in possible_transfer_amounts
@@ -326,6 +326,7 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I
desc = "A plastic medicine cup. Like a shot glass for medicine."
icon = 'icons/obj/chemical.dmi'
icon_state = "medcup"
filling_states = "25;50;75;100"
drop_sound = 'sound/items/drop/drinkglass.ogg'
pickup_sound = 'sound/items/pickup/drinkglass.ogg'
possible_transfer_amounts = null
@@ -342,26 +343,6 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I
..()
update_icon()
/obj/item/reagent_containers/food/drinks/medcup/update_icon()
cut_overlays()
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]25")
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent) // offset by about 12.5 so it seems more gradual
if(0 to 37)
filling.icon_state = "[icon_state]25"
if(38 to 62)
filling.icon_state = "[icon_state]50"
if(63 to 87)
filling.icon_state = "[icon_state]75"
if(87 to INFINITY)
filling.icon_state = "[icon_state]100"
filling.color = reagents.get_color()
add_overlay(filling)
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/carton
@@ -596,4 +577,4 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I
drop_sound = 'sound/items/drop/papercup.ogg'
pickup_sound = 'sound/items/pickup/papercup.ogg'
center_of_mass = list("x"=16, "y"=14)
reagents_to_add = list(/decl/reagent/drink/milk/strawberry = 20)
reagents_to_add = list(/decl/reagent/drink/milk/strawberry = 20)
@@ -5,6 +5,7 @@
desc = "A glass jar. You can put the lid back on and use it for other things."
icon = 'icons/obj/drinks.dmi'
icon_state = "jar"
filling_states = "-10;10;25;50;75;80;100"
matter = list(MATERIAL_GLASS = 5000)
center_of_mass = list("x"=15, "y"=8)
w_class = ITEMSIZE_NORMAL
@@ -15,10 +16,10 @@
/obj/item/reagent_containers/glass/beaker/jar/attack_self(var/mob/user)
if(reagents.total_volume > 0)
to_chat(user, "<span class='warning'>You need to empty \the [src] first!</span>")
to_chat(user, SPAN_WARNING("You need to empty \the [src] first!"))
return
else
to_chat(user, "<span class='notice'>You put the lid on \the [src].</span>")
to_chat(user, SPAN_NOTICE("You put the lid on \the [src]."))
user.drop_from_inventory(src)
user.put_in_hands(new /obj/item/glass_jar) //found in glassjar.dm
qdel(src)
@@ -78,6 +78,7 @@
to_chat(user, "<span class='notice'>You set the label to \"[tmp_label]\".</span>")
label_text = tmp_label
update_name_label()
update_icon()
return
. = ..() // in the case of nitroglycerin, explode BEFORE it shatters
@@ -98,6 +99,7 @@
)
icon_state = "beaker"
item_state = "beaker"
filling_states = "20;40;60;80;100"
center_of_mass = list("x" = 15,"y" = 11)
matter = list(MATERIAL_GLASS = 500)
drop_sound = 'sound/items/drop/drinkglass.ogg'
@@ -129,24 +131,20 @@
/obj/item/reagent_containers/glass/beaker/update_icon()
cut_overlays()
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10")
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 9) filling.icon_state = "[icon_state]-10"
if(10 to 24) filling.icon_state = "[icon_state]10"
if(25 to 49) filling.icon_state = "[icon_state]25"
if(50 to 74) filling.icon_state = "[icon_state]50"
if(75 to 79) filling.icon_state = "[icon_state]75"
if(80 to 90) filling.icon_state = "[icon_state]80"
if(91 to INFINITY) filling.icon_state = "[icon_state]100"
if(reagents?.total_volume)
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-[get_filling_state()]")
filling.color = reagents.get_color()
add_overlay(filling)
if (!is_open_container())
add_overlay("lid_[initial(icon_state)]")
if(!is_open_container())
var/lid_icon = "lid_[icon_state]"
var/mutable_appearance/lid = mutable_appearance(icon, lid_icon)
add_overlay(lid)
if(label_text)
var/label_icon = "label_[icon_state]"
var/mutable_appearance/label = mutable_appearance(icon, label_icon)
add_overlay(label)
/obj/item/reagent_containers/glass/beaker/large
name = "large beaker"
@@ -11,6 +11,7 @@
)
icon_state = null
item_state = "bottle"
filling_states = "20;40;60;80;100"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10,15,25,30,60)
flags = 0
@@ -38,27 +39,23 @@
update_icon()
/obj/item/reagent_containers/glass/bottle/update_icon()
/obj/item/reagent_containers/glass/bottle/update_icon() // You know, bottles should be a subtype of beakers. But not gonna change a million and one paths today. - Wezzy.
cut_overlays()
if(reagents.total_volume && (icon_state == "bottle-1" || icon_state == "bottle-2" || icon_state == "bottle-3" || icon_state == "bottle-4"))
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10")
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 9) filling.icon_state = "[icon_state]--10"
if(10 to 24) filling.icon_state = "[icon_state]-10"
if(25 to 49) filling.icon_state = "[icon_state]-25"
if(50 to 74) filling.icon_state = "[icon_state]-50"
if(75 to 79) filling.icon_state = "[icon_state]-75"
if(80 to 90) filling.icon_state = "[icon_state]-80"
if(91 to INFINITY) filling.icon_state = "[icon_state]-100"
if(reagents?.total_volume)
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-[get_filling_state()]")
filling.color = reagents.get_color()
add_overlay(filling)
if (!is_open_container())
add_overlay("lid_bottle")
if(!is_open_container())
var/lid_icon = "lid_[icon_state]"
var/mutable_appearance/lid = mutable_appearance(icon, lid_icon)
add_overlay(lid)
if(label_text)
var/label_icon = "label_[icon_state]"
var/mutable_appearance/label = mutable_appearance(icon, label_icon)
add_overlay(label)
/obj/item/reagent_containers/glass/bottle/inaprovaline
name = "inaprovaline bottle"
@@ -15,9 +15,9 @@
slot_l_hand_str = 'icons/mob/items/lefthand_medical.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_medical.dmi',
)
item_state = "syringe_0"
icon_state = "0"
center_of_mass = list("x" = 16,"y" = 14)
item_state = "syringe"
build_from_parts = TRUE
matter = list(MATERIAL_GLASS = 150)
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(1, 2, 5, 10, 15)
@@ -28,15 +28,17 @@
noslice = 1
unacidable = 1 //glass
var/mode = SYRINGE_CAPPED
var/image/filling //holds a reference to the current filling overlay (used for syringe guns)
var/used = FALSE
var/dirtiness = 0
var/list/targets
var/list/datum/disease2/disease/viruses
var/image/filling //holds a reference to the current filling overlay
var/visible_name = "a syringe"
var/time = 30
var/last_jab = 0 //Spam prevention
center_of_mass = null
drop_sound = 'sound/items/drop/glass_small.ogg'
pickup_sound = 'sound/items/pickup/glass_small.ogg'
@@ -250,7 +252,7 @@
last_jab = 0
user.visible_message("<b>[user]</b> fumbles with \the [src]!", SPAN_NOTICE("You fumble with \the [src]!"))
return
user.visible_message(SPAN_WARNING("[user] injects [target] with \the [src]!"))
var/trans
if(ismob(target))
var/contained = reagentlist()
@@ -269,21 +271,23 @@
/obj/item/reagent_containers/syringe/update_icon()
cut_overlays()
var/matrix/tf = matrix()
if(istype(loc, /obj/item/storage))
tf.Turn(-90) //Vertical for storing compactly
tf.Translate(-3,0) //Could do this with pixel_x but let's just update the appearance once.
transform = tf
var/iconstring = initial(item_state)
if(mode == SYRINGE_BROKEN)
icon_state = "broken"
worn_overlay = null
return
if(mode == SYRINGE_CAPPED)
icon_state = "capped"
return
add_overlay("capped")
var/rounded_vol = round(reagents.total_volume, round(reagents.maximum_volume / 3))
if(reagents && reagents.total_volume)
worn_overlay = Clamp(round((reagents.total_volume / volume * 15),5), 1, 15) //rounded_vol
add_overlay(overlay_image('icons/obj/reagentfillings.dmi', "[iconstring][worn_overlay]", color = reagents.get_color()))
worn_overlay_color = reagents.get_color() // handles inhands
update_held_icon()
else
worn_overlay = 0
icon_state = "[worn_overlay]"
if(ismob(loc))
var/injoverlay
switch(mode)
@@ -292,16 +296,6 @@
if (SYRINGE_INJECT)
injoverlay = "inject"
add_overlay(injoverlay)
icon_state = "[rounded_vol]"
item_state = "syringe_[rounded_vol]"
if(reagents.total_volume)
filling = image('icons/obj/syringe.dmi', src, "syringe10")
filling.icon_state = "syringe[rounded_vol]"
filling.color = reagents.get_color()
add_overlay(filling)
/obj/item/reagent_containers/syringe/proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob)
if(mode == SYRINGE_CAPPED)
@@ -324,7 +318,7 @@
return
var/armor = H.get_blocked_ratio(target_zone, BRUTE, damage_flags = DAM_SHARP, damage = 5)*100
if (target != user && armor > 50 && prob(50))
if (target != user && armor > 50)
user.visible_message(SPAN_DANGER("[user] tries to stab \the [target] in the [hit_area] with \the [src], but the attack is deflected by [target.get_pronoun("his")] armor!"), SPAN_WARNING("You try to stab \the [target] in the [hit_area] with \the [src], but the attack is deflected by [target.get_pronoun("his")] armor!"))
user.remove_from_mob(src)
qdel(src)
@@ -344,7 +338,7 @@
user.visible_message(SPAN_DANGER("[user] stabs [target] with [src.name]!"))
target.take_organ_damage(3)// 7 is the same as crowbar punch
var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand
var/syringestab_amount_transferred = rand(0, (reagents.total_volume / 2)) //nerfed by popular demand
var/contained_reagents = reagents.get_reagents()
var/trans = reagents.trans_to_mob(target, syringestab_amount_transferred, CHEM_BLOOD)
if(isnull(trans)) trans = 0
@@ -359,16 +353,22 @@
if(user)
add_fingerprint(user)
update_icon()
/obj/item/reagent_containers/syringe/large
name = "large syringe"
desc = "A large syringe - for those patients who need a little more."
icon = 'icons/obj/large_syringe.dmi'
icon_state = "0"
possible_transfer_amounts = list(5, 15, 30)
volume = 30
/obj/item/reagent_containers/syringe/ld50_syringe
/obj/item/reagent_containers/syringe/large/ld50_syringe
name = "Lethal Injection Syringe"
desc = "A syringe used for lethal injections."
amount_per_transfer_from_this = 60
volume = 60
visible_name = "a giant syringe"
time = 300
/obj/item/reagent_containers/syringe/ld50_syringe/afterattack(obj/target, mob/user, flag)
/obj/item/reagent_containers/syringe/large/ld50_syringe/afterattack(obj/target, mob/user, flag)
if(mode == SYRINGE_DRAW && ismob(target)) // No drawing 50 units of blood at once
to_chat(user, SPAN_NOTICE("This needle isn't designed for drawing blood."))
return
@@ -376,6 +376,7 @@
to_chat(user, SPAN_NOTICE("This syringe is too big to stab someone with it."))
..()
////////////////////////////////////////////////////////////////////////////////
/// Syringes. END
////////////////////////////////////////////////////////////////////////////////
@@ -430,11 +431,10 @@
mode = SYRINGE_INJECT
update_icon()
/obj/item/reagent_containers/syringe/ld50_syringe/chloral
/obj/item/reagent_containers/syringe/large/ld50_syringe/chloral
reagents_to_add = list(/decl/reagent/polysomnine = 60)
/obj/item/reagent_containers/syringe/ld50_syringe/chloral/Initialize()
/obj/item/reagent_containers/syringe/large/ld50_syringe/chloral/Initialize()
. = ..()
mode = SYRINGE_INJECT
update_icon()
@@ -1,78 +0,0 @@
/spell/area_teleport
name = "Teleport"
desc = "This spell teleports you to a type of area of your selection."
feedback = "TP"
school = "abjuration"
charge_max = 600
invocation = "SCYAR NILA"
invocation_type = SpI_SHOUT
cooldown_min = 200 //100 deciseconds reduction per rank
smoke_spread = 1
smoke_amt = 5
var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list
var/invocation_area = 1 //if the invocation appends the selected area
cast_sound = 'sound/effects/teleport.ogg'
hud_state = "wiz_tele"
/spell/area_teleport/before_cast()
return
/spell/area_teleport/choose_targets()
var/A = null
if(!randomise_selection)
A = input("Area to teleport to", "Teleport", A) in teleportlocs
else
A = pick(teleportlocs)
var/area/thearea = teleportlocs[A]
return list(thearea)
/spell/area_teleport/cast(area/thearea, mob/user)
if(!istype(thearea) && istype(thearea, /list))
thearea = thearea[1]
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea))
if(!T.density)
var/clear = 1
if(T.is_hole) //No more teleporting in holes.
continue
for(var/obj/O in T)
if(O.density)
clear = 0
break
if(clear)
L+=T
if(!L.len)
to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
return
if(user && user.buckled_to)
var/obj/structure/bed/B = user.buckled_to
if(B && B.buckled)
B.user_unbuckle(user)
user.buckled_to = null
do_teleport(user,pick(L))
return
/spell/area_teleport/after_cast()
return
/spell/area_teleport/invocation(mob/user, area/chosenarea)
if(!istype(chosenarea))
return //can't have that, can we
if(!invocation_area || !chosenarea)
..()
else
invocation += "[uppertext(chosenarea.name)]"
..()
return