diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index a43a5d81d3a..54229dcb58f 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -20,6 +20,13 @@
layer = 2.8
throwpass = 1 //You can throw objects over this, despite it's density.")
var/parts = /obj/item/weapon/table_parts
+ var/flipped = 0
+
+/obj/structure/table/proc/update_adjacent()
+ 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/New()
..()
@@ -27,16 +34,10 @@
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()
+ update_adjacent()
/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()
+ update_adjacent()
..()
/obj/structure/table/proc/destroy()
@@ -46,6 +47,25 @@
/obj/structure/table/update_icon()
+ if(flipped)
+ var/type = 0
+ var/tabledirs = 0
+ for(var/direction in list(turn(dir,90), turn(dir,-90)) )
+ var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction))
+ if (T && T.flipped)
+ type++
+ tabledirs |= direction
+ var/base = "table"
+ if (istype(src, /obj/structure/table/woodentable))
+ base = "wood"
+ icon_state = "[base]flip[type]"
+ if (type==1)
+ if (tabledirs & turn(dir,90))
+ icon_state = icon_state+"-"
+ if (tabledirs & turn(dir,-90))
+ icon_state = icon_state+"+"
+ return 1
+
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))
@@ -77,7 +97,8 @@
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)))
+ var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction))
+ if(T && !T.flipped)
if(direction <5)
dir_sum += direction
else
@@ -263,15 +284,26 @@
/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
+ if (flipped)
+ if (get_dir(loc, target) == dir)
+ return !density
+ else
+ return 1
+ return 0
+/obj/structure/table/CheckExit(atom/movable/O as mob|obj, target as turf)
+ if(istype(O) && O.checkpass(PASSTABLE))
+ return 1
+ if (flipped)
+ if (get_dir(loc, target) == dir)
+ return !density
+ else
+ return 1
+ return 1
/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))
@@ -326,6 +358,99 @@
user.drop_item(src)
return
+/obj/structure/table/proc/straight_table_check(var/direction)
+ var/turf/left = get_step(src,turn(direction,90))
+ var/turf/right = get_step(src,turn(direction,-90))
+ var/turf/next = get_step(src,direction)
+ if(locate(/obj/structure/table,left) || locate(/obj/structure/table,right))
+ return 0
+ var/obj/structure/table/T = locate(/obj/structure/table, next)
+ if (!T)
+ return 1
+ else
+ return T.straight_table_check(direction)
+
+/obj/structure/table/verb/do_flip()
+ set name = "Flip table"
+ set desc = "Flips a non-reinforced table"
+ set category = "Object"
+ set src in oview(1)
+
+ if (issilicon(usr))
+ usr << "You need hands for this."
+ return
+ if(!flip(get_cardinal_dir(usr,src)))
+ usr << "It won't budge."
+ else
+ usr.visible_message("[usr] flips \the [src]!")
+ return
+
+/obj/structure/table/proc/do_put()
+ set name = "Put table back"
+ set desc = "Puts flipped table back"
+ set category = "Object"
+ set src in oview(1)
+
+ if (!unflip())
+ usr << "It won't budge."
+ return
+
+
+/obj/structure/table/proc/flip(var/direction)
+ if (flipped)
+ return 0
+
+ if( !straight_table_check(turn(direction,90)) || !straight_table_check(turn(direction,-90)) )
+ return 0
+
+ verbs -=/obj/structure/table/verb/do_flip
+ verbs +=/obj/structure/table/proc/do_put
+
+ var/list/targets = list(get_step(src,dir),get_step(src,turn(dir, 45)),get_step(src,turn(dir, -45)))
+ for (var/atom/movable/A in get_turf(src))
+ if (!A.anchored)
+ spawn(0)
+ A.throw_at(pick(targets),1,1)
+
+ dir = direction
+ if(dir != NORTH)
+ layer = 5
+ flipped = 1
+ flags |= ON_BORDER
+ for(var/D in list(turn(direction, 90), turn(direction, -90)))
+ if(locate(/obj/structure/table,get_step(src,D)))
+ var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,D))
+ T.flip(direction)
+ update_icon()
+ update_adjacent()
+
+ return 1
+
+/obj/structure/table/proc/unflip()
+ if (!flipped)
+ return 0
+
+ var/can_flip = 1
+ for (var/mob/A in oview(src,0))//src.loc)
+ if (istype(A))
+ can_flip = 0
+ if (!can_flip)
+ return 0
+
+ verbs -=/obj/structure/table/proc/do_put
+ verbs +=/obj/structure/table/verb/do_flip
+
+ layer = initial(layer)
+ flipped = 0
+ flags &= ~ON_BORDER
+ for(var/D in list(turn(dir, 90), turn(dir, -90)))
+ if(locate(/obj/structure/table,get_step(src,D)))
+ var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,D))
+ T.unflip()
+ update_icon()
+ update_adjacent()
+
+ return 1
/*
* Wooden tables
@@ -346,6 +471,8 @@
var/status = 2
parts = /obj/item/weapon/table_parts/reinforced
+/obj/structure/table/reinforced/flip(var/direction)
+ return 0
/obj/structure/table/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/weldingtool))
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 9662ab7119e..17d6c281747 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ