diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm new file mode 100644 index 00000000000..b79588b78f3 --- /dev/null +++ b/code/game/objects/structures/coathanger.dm @@ -0,0 +1,53 @@ +/obj/structure/coatrack + name = "coat rack" + desc = "Rack that holds coats." + icon = 'icons/obj/coatrack.dmi' + icon_state = "coatrack0" + var/obj/item/clothing/suit/coat + var/list/allowed = list(/obj/item/clothing/suit/storage/labcoat, /obj/item/clothing/suit/storage/det_suit) + +/obj/structure/coatrack/attack_hand(mob/user as mob) + user.visible_message("[user] takes [coat] off \the [src].", "You take [coat] off the \the [src]") + if(!user.put_in_active_hand(coat)) + coat.loc = get_turf(user) + coat = null + update_icon() + +/obj/structure/coatrack/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/can_hang = 0 + for (var/T in allowed) + if(istype(W,T)) + can_hang = 1 + if (can_hang && !coat) + user.visible_message("[user] hangs [W] on \the [src].", "You hang [W] on the \the [src]") + coat = W + user.drop_item(src) + coat.loc = src + update_icon() + else + user << "You cannot hang [W] on [src]" + return ..() + +/obj/structure/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + var/can_hang = 0 + for (var/T in allowed) + if(istype(mover,T)) + can_hang = 1 + + if (can_hang && !coat) + src.visible_message("[mover] lands on \the [src].") + coat = mover + coat.loc = src + update_icon() + return 0 + else + return 1 + +/obj/structure/coatrack/update_icon() + overlays.Cut() + if (istype(coat, /obj/item/clothing/suit/storage/labcoat)) + overlays += image(icon, icon_state = "coat_lab") + if (istype(coat, /obj/item/clothing/suit/storage/labcoat/cmo)) + overlays += image(icon, icon_state = "coat_cmo") + if (istype(coat, /obj/item/clothing/suit/storage/det_suit)) + overlays += image(icon, icon_state = "coat_det") \ No newline at end of file diff --git a/code/game/objects/structures/tables_racks.dm.bak b/code/game/objects/structures/tables_racks.dm.bak new file mode 100644 index 00000000000..be396a3196f --- /dev/null +++ b/code/game/objects/structures/tables_racks.dm.bak @@ -0,0 +1,480 @@ +/* Tables and Racks + * Contains: + * Tables + * Wooden tables + * Reinforced tables + * Racks + */ + + +/* + * Tables + */ +/obj/structure/table + name = "table" + desc = "A square piece of metal standing on four metal legs. It can not move." + icon = 'icons/obj/structures.dmi' + icon_state = "table" + density = 1 + anchored = 1.0 + layer = 2.8 + throwpass = 1 //You can throw objects over this, despite it's density.") + var/parts = /obj/item/weapon/table_parts + +/obj/structure/table/New() + ..() + for(var/obj/structure/table/T in src.loc) + if(T != src) + del(T) + update_icon() + for(var/direction in list(1,2,4,8,5,6,9,10)) + if(locate(/obj/structure/table,get_step(src,direction))) + var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction)) + T.update_icon() + +/obj/structure/table/Del() + for(var/direction in list(1,2,4,8,5,6,9,10)) + if(locate(/obj/structure/table,get_step(src,direction))) + var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction)) + T.update_icon() + ..() + +/obj/structure/table/proc/destroy() + new parts(loc) + density = 0 + del(src) + + +/obj/structure/table/update_icon() + spawn(2) //So it properly updates when deleting + var/dir_sum = 0 + for(var/direction in list(1,2,4,8,5,6,9,10)) + var/skip_sum = 0 + for(var/obj/structure/window/W in src.loc) + if(W.dir == direction) //So smooth tables don't go smooth through windows + skip_sum = 1 + continue + var/inv_direction //inverse direction + switch(direction) + if(1) + inv_direction = 2 + if(2) + inv_direction = 1 + if(4) + inv_direction = 8 + if(8) + inv_direction = 4 + if(5) + inv_direction = 10 + if(6) + inv_direction = 9 + if(9) + inv_direction = 6 + if(10) + inv_direction = 5 + for(var/obj/structure/window/W in get_step(src,direction)) + if(W.dir == inv_direction) //So smooth tables don't go smooth through windows when the window is on the other table's tile + skip_sum = 1 + continue + if(!skip_sum) //means there is a window between the two tiles in this direction + if(locate(/obj/structure/table,get_step(src,direction))) + if(direction <5) + dir_sum += direction + else + if(direction == 5) //This permits the use of all table directions. (Set up so clockwise around the central table is a higher value, from north) + dir_sum += 16 + if(direction == 6) + dir_sum += 32 + if(direction == 8) //Aherp and Aderp. Jezes I am stupid. -- SkyMarshal + dir_sum += 8 + if(direction == 10) + dir_sum += 64 + if(direction == 9) + dir_sum += 128 + + var/table_type = 0 //stand_alone table + if(dir_sum%16 in cardinal) + table_type = 1 //endtable + dir_sum %= 16 + if(dir_sum%16 in list(3,12)) + table_type = 2 //1 tile thick, streight table + if(dir_sum%16 == 3) //3 doesn't exist as a dir + dir_sum = 2 + if(dir_sum%16 == 12) //12 doesn't exist as a dir. + dir_sum = 4 + if(dir_sum%16 in list(5,6,9,10)) + if(locate(/obj/structure/table,get_step(src.loc,dir_sum%16))) + table_type = 3 //full table (not the 1 tile thick one, but one of the 'tabledir' tables) + else + table_type = 2 //1 tile thick, corner table (treated the same as streight tables in code later on) + dir_sum %= 16 + if(dir_sum%16 in list(13,14,7,11)) //Three-way intersection + table_type = 5 //full table as three-way intersections are not sprited, would require 64 sprites to handle all combinations. TOO BAD -- SkyMarshal + switch(dir_sum%16) //Begin computation of the special type tables. --SkyMarshal + if(7) + if(dir_sum == 23) + table_type = 6 + dir_sum = 8 + else if(dir_sum == 39) + dir_sum = 4 + table_type = 6 + else if(dir_sum == 55 || dir_sum == 119 || dir_sum == 247 || dir_sum == 183) + dir_sum = 4 + table_type = 3 + else + dir_sum = 4 + if(11) + if(dir_sum == 75) + dir_sum = 5 + table_type = 6 + else if(dir_sum == 139) + dir_sum = 9 + table_type = 6 + else if(dir_sum == 203 || dir_sum == 219 || dir_sum == 251 || dir_sum == 235) + dir_sum = 8 + table_type = 3 + else + dir_sum = 8 + if(13) + if(dir_sum == 29) + dir_sum = 10 + table_type = 6 + else if(dir_sum == 141) + dir_sum = 6 + table_type = 6 + else if(dir_sum == 189 || dir_sum == 221 || dir_sum == 253 || dir_sum == 157) + dir_sum = 1 + table_type = 3 + else + dir_sum = 1 + if(14) + if(dir_sum == 46) + dir_sum = 1 + table_type = 6 + else if(dir_sum == 78) + dir_sum = 2 + table_type = 6 + else if(dir_sum == 110 || dir_sum == 254 || dir_sum == 238 || dir_sum == 126) + dir_sum = 2 + table_type = 3 + else + dir_sum = 2 //These translate the dir_sum to the correct dirs from the 'tabledir' icon_state. + if(dir_sum%16 == 15) + table_type = 4 //4-way intersection, the 'middle' table sprites will be used. + + if(istype(src,/obj/structure/table/reinforced)) + switch(table_type) + if(0) + icon_state = "reinf_table" + if(1) + icon_state = "reinf_1tileendtable" + if(2) + icon_state = "reinf_1tilethick" + if(3) + icon_state = "reinf_tabledir" + if(4) + icon_state = "reinf_middle" + if(5) + icon_state = "reinf_tabledir2" + if(6) + icon_state = "reinf_tabledir3" + else if(istype(src,/obj/structure/table/woodentable)) + switch(table_type) + if(0) + icon_state = "wood_table" + if(1) + icon_state = "wood_1tileendtable" + if(2) + icon_state = "wood_1tilethick" + if(3) + icon_state = "wood_tabledir" + if(4) + icon_state = "wood_middle" + if(5) + icon_state = "wood_tabledir2" + if(6) + icon_state = "wood_tabledir3" + else + switch(table_type) + if(0) + icon_state = "table" + if(1) + icon_state = "table_1tileendtable" + if(2) + icon_state = "table_1tilethick" + if(3) + icon_state = "tabledir" + if(4) + icon_state = "table_middle" + if(5) + icon_state = "tabledir2" + if(6) + icon_state = "tabledir3" + if (dir_sum in list(1,2,4,8,5,6,9,10)) + dir = dir_sum + else + dir = 2 + +/obj/structure/table/ex_act(severity) + switch(severity) + if(1.0) + del(src) + return + if(2.0) + if (prob(50)) + del(src) + return + if(3.0) + if (prob(25)) + destroy() + else + return + + +/obj/structure/table/blob_act() + if(prob(75)) + destroy() + +/obj/structure/table/attack_paw(mob/user) + if(HULK in user.mutations) + user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + visible_message("[user] smashes the [src] apart!") + destroy() + + +/obj/structure/table/attack_alien(mob/user) + visible_message("[user] slices [src] apart!") + +/obj/structure/table/attack_animal(mob/living/simple_animal/user) + if(user.wall_smash) + visible_message("[user] smashes [src] apart!") + destroy() + + + +/obj/structure/table/attack_hand(mob/user) + if(HULK in user.mutations) + visible_message("[user] smashes [src] apart!") + user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + destroy() + +/obj/structure/table/attack_tk() // no telehulk sorry + return + +/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + + if(istype(mover) && mover.checkpass(PASSTABLE)) + return 1 + else + return 0 + + +/obj/structure/table/MouseDrop_T(obj/O as obj, mob/user as mob) + + if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) + return + if(isrobot(user)) + return + user.drop_item() + if (O.loc != src.loc) + step(O, get_dir(O, src)) + return + + +/obj/structure/table/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) + var/obj/item/weapon/grab/G = W + if (istype(G.affecting, /mob/living)) + var/mob/living/M = G.affecting + if (G.state < 2) + if(user.a_intent == "hurt") + if (prob(15)) M.Weaken(5) + M.apply_damage(8,def_zone = "head") + visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!") + playsound(src.loc, 'sound/weapons/tablehit1.ogg', 50, 1) + else + user << "\red You need a better grip to do that!" + return + else + G.affecting.loc = src.loc + G.affecting.Weaken(5) + visible_message("\red [G.assailant] puts [G.affecting] on \the [src].") + del(W) + return + + if (istype(W, /obj/item/weapon/wrench)) + user << "\blue Now disassembling table" + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user,50)) + destroy() + return + + if(isrobot(user)) + return + + if(istype(W, /obj/item/weapon/melee/energy/blade)) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) + for(var/mob/O in viewers(user, 4)) + O.show_message("\blue The [src] was sliced apart by [user]!", 1, "\red You hear [src] coming apart.", 2) + destroy() + + user.drop_item(src) + return + + +/* + * Wooden tables + */ +/obj/structure/table/woodentable + name = "wooden table" + desc = "Do not apply fire to this. Rumour says it burns easily." + icon_state = "wood_table" + parts = /obj/item/weapon/table_parts/wood + +/* + * Reinforced tables + */ +/obj/structure/table/reinforced + name = "reinforced table" + desc = "A version of the four legged table. It is stronger." + icon_state = "reinf_table" + var/status = 2 + parts = /obj/item/weapon/table_parts/reinforced + + +/obj/structure/table/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + if(src.status == 2) + user << "\blue Now weakening the reinforced table" + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if (do_after(user, 50)) + if(!src || !WT.isOn()) return + user << "\blue Table weakened" + src.status = 1 + else + user << "\blue Now strengthening the reinforced table" + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if (do_after(user, 50)) + if(!src || !WT.isOn()) return + user << "\blue Table strengthened" + src.status = 2 + return + return + + if (istype(W, /obj/item/weapon/wrench)) + if(src.status == 2) + return + + ..() + +/* + * Racks + */ +/obj/structure/rack + name = "rack" + desc = "Different from the Middle Ages version." + icon = 'icons/obj/objects.dmi' + icon_state = "rack" + density = 1 + flags = FPRINT + anchored = 1.0 + throwpass = 1 //You can throw objects over this, despite it's density. + +/obj/structure/rack/ex_act(severity) + switch(severity) + if(1.0) + del(src) + if(2.0) + del(src) + if(prob(50)) + new /obj/item/weapon/rack_parts(src.loc) + if(3.0) + if(prob(25)) + del(src) + new /obj/item/weapon/rack_parts(src.loc) + +/obj/structure/rack/blob_act() + if(prob(75)) + del(src) + return + else if(prob(50)) + new /obj/item/weapon/rack_parts(src.loc) + del(src) + return + +/obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!| + return 1 + if(istype(mover) && mover.checkpass(PASSTABLE)) + return 1 + else + return 0 + +/obj/structure/rack/MouseDrop_T(obj/O as obj, mob/user as mob) + if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) + return + if(isrobot(user)) + return + user.drop_item() + if (O.loc != src.loc) + step(O, get_dir(O, src)) + return + +/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/wrench)) + new /obj/item/weapon/rack_parts( src.loc ) + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + del(src) + return + if(isrobot(user)) + return + user.drop_item() + if(W && W.loc) W.loc = src.loc + return + +/obj/structure/rack/meteorhit(obj/O as obj) + del(src) + + +/obj/structure/table/attack_hand(mob/user) + if(HULK in user.mutations) + visible_message("[user] smashes [src] apart!") + user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + new /obj/item/weapon/rack_parts(loc) + density = 0 + del(src) + + +/obj/structure/rack/attack_paw(mob/user) + if(HULK in user.mutations) + user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + visible_message("[user] smashes [src] apart!") + new /obj/item/weapon/rack_parts(loc) + density = 0 + del(src) + + +/obj/structure/rack/attack_alien(mob/user) + visible_message("[user] slices [src] apart!") + new /obj/item/weapon/rack_parts(loc) + density = 0 + del(src) + + +/obj/structure/rack/attack_animal(mob/living/simple_animal/user) + if(user.wall_smash) + visible_message("[user] smashes [src] apart!") + new /obj/item/weapon/rack_parts(loc) + density = 0 + del(src) + +/obj/structure/rack/attack_tk() // no telehulk sorry + return diff --git a/icons/obj/coatrack.dmi b/icons/obj/coatrack.dmi index 96c1171d82e..5d19abaeee7 100644 Binary files a/icons/obj/coatrack.dmi and b/icons/obj/coatrack.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 9662ab7119e..7e261d90e1c 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ