Files
Bubberstation/code/game/objects/structures/bedsheet_bin.dm
supersayu c172e52dce Adds telekinesis to click code. Fixes issue #1202, #1129, #247.
This adds two atom procs, attack_tk() and attack_self_tk().  attack_tk is used as per attack_hand; attack_self_tk exists on all atoms (not just items) but is similar to the item proc, but without the assumption that it is in the user's hand.

Removes the functionality where entering throw mode would create a tk grab, as it is redundant.

As a default, attack_tk does the following:
* Creates a telekinetic throw for items and un-anchored objects
* Does an attack_hand (paw, animal, etc) for anchored objects
* Does nothing to mobs

As a default, attack_self_tk does nothing.  An attack_self_tk was added to closets to open and close them since that's a common thing.

The following items have added attack_tk procs:
* Fire axe cabinet, extinguisher cabinet, and bedsheet bin will drop into their square instead of putting it in your hand
* Doors only open telekinetically if they require no access
* Chairs will rotate if nobody is buckled to them
* Filing cabinets will remove a paper at random.
* Tables and racks return to prevent telehulk smash

This is INCOMPLETE.  Adding proper TK interaction to everything is something best done in pieces.

In particular, interacting with mobs and items both open up the floodgates for bugs, so we/I need to decide how we want it to go before we commit, and then fix bugs along the way.  Stumbling forward, fixing bugs, and then changing course halfway would be a bad idea.
2013-09-17 18:19:09 -04:00

197 lines
4.1 KiB
Plaintext

/*
CONTAINS:
BEDSHEETS
LINEN BINS
*/
/obj/item/weapon/bedsheet
name = "bedsheet"
desc = "A surprisingly soft linen bedsheet."
icon = 'icons/obj/items.dmi'
icon_state = "sheet"
item_state = "bedsheet"
layer = 4.0
throwforce = 1
throw_speed = 1
throw_range = 2
w_class = 1.0
color = "white"
/obj/item/weapon/bedsheet/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
..()
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
user.drop_item()
if(layer == initial(layer))
layer = 5
else
layer = initial(layer)
add_fingerprint(user)
return
/obj/item/weapon/bedsheet/blue
icon_state = "sheetblue"
color = "blue"
/obj/item/weapon/bedsheet/green
icon_state = "sheetgreen"
color = "green"
/obj/item/weapon/bedsheet/orange
icon_state = "sheetorange"
color = "orange"
/obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple"
color = "purple"
/obj/item/weapon/bedsheet/rainbow
icon_state = "sheetrainbow"
color = "rainbow"
/obj/item/weapon/bedsheet/red
icon_state = "sheetred"
color = "red"
/obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow"
color = "yellow"
/obj/item/weapon/bedsheet/mime
icon_state = "sheetmime"
color = "mime"
/obj/item/weapon/bedsheet/clown
icon_state = "sheetclown"
color = "clown"
/obj/item/weapon/bedsheet/captain
icon_state = "sheetcaptain"
color = "captain"
/obj/item/weapon/bedsheet/rd
icon_state = "sheetrd"
color = "director"
/obj/item/weapon/bedsheet/medical
icon_state = "sheetmedical"
color = "medical"
/obj/item/weapon/bedsheet/hos
icon_state = "sheethos"
color = "hosred"
/obj/item/weapon/bedsheet/hop
icon_state = "sheethop"
color = "hop"
/obj/item/weapon/bedsheet/ce
icon_state = "sheetce"
color = "chief"
/obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown"
color = "brown"
/obj/structure/bedsheetbin
name = "linen bin"
desc = "A linen bin. It looks rather cosy."
icon = 'icons/obj/structures.dmi'
icon_state = "linenbin-full"
anchored = 1
var/amount = 10
var/list/sheets = list()
var/obj/item/hidden = null
/obj/structure/bedsheetbin/examine()
usr << desc
if(amount < 1)
usr << "There are no bed sheets in the bin."
return
if(amount == 1)
usr << "There is one bed sheet in the bin."
return
usr << "There are [amount] bed sheets in the bin."
/obj/structure/bedsheetbin/update_icon()
switch(amount)
if(0) icon_state = "linenbin-empty"
if(1 to 5) icon_state = "linenbin-half"
else icon_state = "linenbin-full"
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/bedsheet))
user.drop_item()
I.loc = src
sheets.Add(I)
amount++
user << "<span class='notice'>You put [I] in [src].</span>"
update_icon()
else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
user.drop_item()
I.loc = src
hidden = I
user << "<span class='notice'>You hide [I] among the sheets.</span>"
/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
return attack_hand(user)
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
if(amount >= 1)
amount--
var/obj/item/weapon/bedsheet/B
if(sheets.len > 0)
B = sheets[sheets.len]
sheets.Remove(B)
else
B = new /obj/item/weapon/bedsheet(loc)
B.loc = user.loc
user.put_in_hands(B)
user << "<span class='notice'>You take [B] out of [src].</span>"
update_icon()
if(hidden)
hidden.loc = user.loc
user << "<span class='notice'>[hidden] falls out of [B]!</span>"
hidden = null
add_fingerprint(user)
/obj/structure/bedsheetbin/attack_tk(mob/user as mob)
if(amount >= 1)
amount--
var/obj/item/weapon/bedsheet/B
if(sheets.len > 0)
B = sheets[sheets.len]
sheets.Remove(B)
else
B = new /obj/item/weapon/bedsheet(loc)
B.loc = loc
user << "<span class='notice'>You telekinetically remove [B] from [src].</span>"
update_icon()
if(hidden)
hidden.loc = loc
hidden = null
add_fingerprint(user)