diff --git a/modular_ss220/aesthetics/_aesthetics.dme b/modular_ss220/aesthetics/_aesthetics.dme
index 2fd0a930c535..844ab6d26152 100644
--- a/modular_ss220/aesthetics/_aesthetics.dme
+++ b/modular_ss220/aesthetics/_aesthetics.dme
@@ -28,6 +28,7 @@
#include "safe\code\safe.dm"
#include "shutters\code\shutters.dm"
#include "soap\code\soap.dm"
+#include "stamps\code\stamps.dm"
#include "surgery_table\code\surgery_table.dm"
#include "toolboxes\code\toolboxes.dm"
#include "wallcloset\code\wallcloset.dm"
diff --git a/modular_ss220/aesthetics/stamps/code/stamps.dm b/modular_ss220/aesthetics/stamps/code/stamps.dm
new file mode 100644
index 000000000000..e5a7d9cb47b4
--- /dev/null
+++ b/modular_ss220/aesthetics/stamps/code/stamps.dm
@@ -0,0 +1,78 @@
+// It's just works :skull:
+/obj/item/paper/stamp(obj/item/stamp/S)
+ if(istype(S, /obj/item/stamp/custom))
+ stamps += (!stamps || stamps == "" ? "
" : "") + ""
+ var/image/stampoverlay_custom = image('modular_ss220/aesthetics/stamps/icons/stamps.dmi')
+ var/x = rand(-2, 0)
+ var/y = rand(-1, 2)
+ offset_x += x
+ offset_y += y
+ stampoverlay_custom.pixel_x = x
+ stampoverlay_custom.pixel_y = y
+ stampoverlay_custom.icon_state = "paper_[S.icon_state]"
+ stamp_overlays += stampoverlay_custom
+
+ if(!ico)
+ ico = new
+ ico += "paper_[S.icon_state]"
+ if(!stamped)
+ stamped = new
+ stamped += S.type
+
+ update_icon(UPDATE_OVERLAYS)
+ else
+ . = ..()
+
+// TODO: Paperplane overlays code. Now there's no overlays at all on paperplanes because of /obj/item/paperplane/update_overlays()
+
+// I've made subclass for custom stamps, just for istype would work without more shiitier code that i already gave us
+/obj/item/stamp/custom
+ name = "DO NOT USE"
+ icon_state = ""
+
+/obj/item/stamp/custom/warden
+ name = "warden's rubber stamp"
+ icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi'
+ icon_state = "stamp-ward"
+ item_color = "hosred"
+
+/obj/item/stamp/custom/ploho
+ name = "'Very Bad, Redo' rubber stamp"
+ icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi'
+ icon_state = "stamp-ploho"
+ item_color = "hop"
+
+/obj/item/stamp/custom/bigdeny
+ name = "\improper BIG DENY rubber stamp"
+ icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi'
+ icon_state = "stamp-BIGdeny"
+ item_color = "redcoat"
+
+/obj/item/stamp/custom/navcom
+ name = "Nanotrasen Naval Command rubber stamp"
+ icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi'
+ icon_state = "stamp-navcom"
+ item_color = "captain"
+
+/obj/item/stamp/custom/mime
+ name = "mime's rubber stamp"
+ icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi'
+ icon_state = "stamp-mime"
+ item_color = "mime"
+
+/obj/item/stamp/custom/ussp
+ name = "old USSP rubber stamp"
+ icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi'
+ icon_state = "stamp-ussp"
+ item_color = "redcoat"
+
+// Adding new stamps to the list
+/datum/asset/simple/paper/New()
+ assets += list(
+ "large_stamp-ward.png" = 'modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ward.png',
+ "large_stamp-ploho.png" = 'modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ploho.png',
+ "large_stamp-BIGdeny.png" = 'modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-BIGdeny.png',
+ "large_stamp-navcom.png" = 'modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-navcom.png',
+ "large_stamp-mime.png" = 'modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-mime.png',
+ "large_stamp-ussp.png" = 'modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ussp.png'
+ )
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-BIGdeny.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-BIGdeny.png
new file mode 100644
index 000000000000..519810d4dd57
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-BIGdeny.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-mime.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-mime.png
new file mode 100644
index 000000000000..85b0968bc56f
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-mime.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-navcom.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-navcom.png
new file mode 100644
index 000000000000..9e28d9e1ceb3
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-navcom.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ploho.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ploho.png
new file mode 100644
index 000000000000..8583f2c8299c
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ploho.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ussp.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ussp.png
new file mode 100644
index 000000000000..a30accd4d998
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ussp.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ward.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ward.png
new file mode 100644
index 000000000000..d3bb8b204ef0
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/large_stamp-ward.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/paper_icons/ussplogo.png b/modular_ss220/aesthetics/stamps/icons/paper_icons/ussplogo.png
new file mode 100644
index 000000000000..018b340525e9
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/paper_icons/ussplogo.png differ
diff --git a/modular_ss220/aesthetics/stamps/icons/stamps.dmi b/modular_ss220/aesthetics/stamps/icons/stamps.dmi
new file mode 100644
index 000000000000..86d6c5dc1388
Binary files /dev/null and b/modular_ss220/aesthetics/stamps/icons/stamps.dmi differ
diff --git a/modular_ss220/aesthetics/zippo/code/zippo.dm b/modular_ss220/aesthetics/zippo/code/zippo.dm
index 8fcafcc30649..07e81da7a3bd 100644
--- a/modular_ss220/aesthetics/zippo/code/zippo.dm
+++ b/modular_ss220/aesthetics/zippo/code/zippo.dm
@@ -1,3 +1,53 @@
-/obj/item/lighter/zippo
+/obj/item/lighter/zippo/cap
+ name = "\improper Captain's zippo"
+ desc = "A limited edition gold Zippo espesially for NT Captains. Looks extremely expensive."
+ icon_state = "zippo-cap"
+ item_state = "zippo-cap"
icon = 'modular_ss220/aesthetics/zippo/icons/zippo.dmi'
- //TODO: give heads their zippos
+ lefthand_file = 'modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi'
+ righthand_file = 'modular_ss220/aesthetics/zippo/icons/items_righthand.dmi'
+
+/obj/item/lighter/zippo/hop
+ name = "\improper Head of Personnel's zippo"
+ desc = "A limited edition Zippo for NT Heads. Tries it best to look like captain's."
+ icon_state = "zippo-hop"
+ item_state = "zippo-hop"
+ icon = 'modular_ss220/aesthetics/zippo/icons/zippo.dmi'
+ lefthand_file = 'modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi'
+ righthand_file = 'modular_ss220/aesthetics/zippo/icons/items_righthand.dmi'
+
+/obj/item/lighter/zippo/hos
+ name = "\improper Head of Security's zippo"
+ desc = "A limited edition Zippo for NT Heads. Fuel it with clown's tears."
+ icon_state = "zippo-hos"
+ item_state = "zippo-hos"
+ icon = 'modular_ss220/aesthetics/zippo/icons/zippo.dmi'
+ lefthand_file = 'modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi'
+ righthand_file = 'modular_ss220/aesthetics/zippo/icons/items_righthand.dmi'
+
+/obj/item/lighter/zippo/cmo
+ name = "\improper Chief Medical Officer's zippo"
+ desc = "A limited edition Zippo for NT Heads. Made of hypoallergenic steel."
+ icon_state = "zippo-cmo"
+ item_state = "zippo-cmo"
+ icon = 'modular_ss220/aesthetics/zippo/icons/zippo.dmi'
+ lefthand_file = 'modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi'
+ righthand_file = 'modular_ss220/aesthetics/zippo/icons/items_righthand.dmi'
+
+/obj/item/lighter/zippo/ce
+ name = "\improper Chief Engineer's zippo"
+ desc = "A limited edition Zippo for NT Heads. Somebody've tried to repair cover with blue tape."
+ icon_state = "zippo-ce"
+ item_state = "zippo-ce"
+ icon = 'modular_ss220/aesthetics/zippo/icons/zippo.dmi'
+ lefthand_file = 'modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi'
+ righthand_file = 'modular_ss220/aesthetics/zippo/icons/items_righthand.dmi'
+
+/obj/item/lighter/zippo/rd
+ name = "\improper Research Director's zippo"
+ desc = "A limited edition Zippo for NT Heads. Uses advanced tech to make fire from plasma."
+ icon_state = "zippo-rd"
+ item_state = "zippo-rd"
+ icon = 'modular_ss220/aesthetics/zippo/icons/zippo.dmi'
+ lefthand_file = 'modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi'
+ righthand_file = 'modular_ss220/aesthetics/zippo/icons/items_righthand.dmi'
diff --git a/modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi b/modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi
new file mode 100644
index 000000000000..ce2381786c49
Binary files /dev/null and b/modular_ss220/aesthetics/zippo/icons/items_lefthand.dmi differ
diff --git a/modular_ss220/aesthetics/zippo/icons/items_righthand.dmi b/modular_ss220/aesthetics/zippo/icons/items_righthand.dmi
new file mode 100644
index 000000000000..3f8c776a05e6
Binary files /dev/null and b/modular_ss220/aesthetics/zippo/icons/items_righthand.dmi differ
diff --git a/modular_ss220/aesthetics/zippo/icons/zippo.dmi b/modular_ss220/aesthetics/zippo/icons/zippo.dmi
index 5113914135c9..130f58a2f4a6 100644
Binary files a/modular_ss220/aesthetics/zippo/icons/zippo.dmi and b/modular_ss220/aesthetics/zippo/icons/zippo.dmi differ
diff --git a/modular_ss220/objects/_objects.dm b/modular_ss220/objects/_objects.dm
index 1d263c97905c..34b6c1224188 100644
--- a/modular_ss220/objects/_objects.dm
+++ b/modular_ss220/objects/_objects.dm
@@ -14,3 +14,7 @@
new /datum/stack_recipe("reinforced plasteel platform", /obj/structure/platform/reinforced, 4, time = 40,one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("reinforced plasteel platform corner", /obj/structure/platform/reinforced/corner, 2, time = 30,one_per_turf = TRUE, on_floor = TRUE)
)
+
+ GLOB.wood_recipes += list(
+ new /datum/stack_recipe("tribune", /obj/structure/tribune, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE)
+ )
diff --git a/modular_ss220/objects/_objects.dme b/modular_ss220/objects/_objects.dme
index 1fd0cd8e134a..bbdacbc031cd 100644
--- a/modular_ss220/objects/_objects.dme
+++ b/modular_ss220/objects/_objects.dme
@@ -1,4 +1,7 @@
#include "_objects.dm"
-#include "code/platform.dm"
#include "code/miscellaneous.dm"
+#include "code/officetoys.dm"
+#include "code/papershredder.dm"
+#include "code/platform.dm"
+#include "code/tribune.dm"
diff --git a/modular_ss220/objects/code/miscellaneous.dm b/modular_ss220/objects/code/miscellaneous.dm
index c1c3c820255f..a0a759cfc125 100644
--- a/modular_ss220/objects/code/miscellaneous.dm
+++ b/modular_ss220/objects/code/miscellaneous.dm
@@ -27,3 +27,79 @@
/obj/structure/marker_beacon/spotlight/jade/update_icon_state()
set_light(light_range, light_power, LIGHT_COLOR_BLUEGREEN)
+
+// Pamphlets
+/obj/item/paper/pamphlet
+ name = "pamphlet"
+ desc = "A pamphlet that promotes something."
+ icon_state = "pamphlet"
+
+// TODO: Write something
+/obj/item/paper/pamphlet/deathsquad
+ name = "deathsquad pamphlet"
+ icon_state = "pamphlet-ds"
+
+/obj/item/paper/pamphlet/gateway
+ info = "Welcome to the Nanotrasen Gateway project...
\
+ Congratulations! If you're reading this, you and your superiors have decided that you're \
+ ready to commit to a life spent colonising the rolling hills of far away worlds. You \
+ must be ready for a lifetime of adventure, a little bit of hard work, and an award \
+ winning dental plan- but that's not all the Nanotrasen Gateway project has to offer.
\
+
Because we care about you, we feel it is only fair to make sure you know the risks \
+ before you commit to joining the Nanotrasen Gateway project. All away destinations have \
+ been fully scanned by a Nanotrasen expeditionary team, and are certified to be 100% safe. \
+ We've even left a case of space beer along with the basic materials you'll need to expand \
+ Nanotrasen's operational area and start your new life.
\
+ Gateway Operation Basics
\
+ All Nanotrasen approved Gateways operate on the same basic principals. They operate off \
+ area equipment power as you would expect, but they also require a backup wire with at least \
+ 128, 000 Watts of power running through it. Without this supply, it cannot safely function \
+ and will reject all attempts at operation.
\
+ Once it is correctly setup, and once it has enough power to operate, the Gateway will begin \
+ searching for an output location. The amount of time this takes is variable, but the Gateway \
+ interface will give you an estimate accurate to the minute. Power loss will not interrupt the \
+ searching process. Influenza will not interrupt the searching process. Temporal anomalies \
+ may cause the estimate to be inaccurate, but will not interrupt the searching process.
\
+ Life On The Other Side
\
+ Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \
+ This is a normal side effect of travelling vast distances in a short period of time. You should \
+ survey the immediate area, and attempt to locate your complimentary case of space beer. Our \
+ expeditionary teams have ensured the complete safety of all away locations, but in a small \
+ number of cases, the Gateway they have established may not be immediately obvious. \
+ Do not panic if you cannot locate the return Gateway. Begin colonisation of the destination. \
+
A New World
\
+ As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \
+ Though complete safety is assured, participants are advised to prepare for inhospitable \
+ environs."
+
+// TODO: Rewrite text (update info and add map)
+/obj/item/paper/pamphlet/deltainfo
+ name = "информационный буклет ИСН «Керберос»"
+ info = "Буклет нового сотрудника \
+ на борту НСС "Керберос"
\
+
Цель
\
+
Данное руководство было создано с целью \
+ облегчить процесс введения в работу станции нового экипажа, \
+ а также для информирования сотрудников об оптимальных маршрутах \
+ передвижения. В данном буклете находится основная карта "Кербероса" \
+ и несколько интересных фактов о станции.\
+
За время строительства проект станции претерпел несколько значительных \
+ изменений. Изначально новая станция должна была стать туристическим объектом, \
+ но после произошедшей в 2549 году серии террористических актов \
+ объект вошёл в состав парка научно-исследовательских станций корпорации. В \
+ нынешних технических туннелях до сих пор можно найти заброшенные комнаты для \
+ гостей, бары и клубы. В связи с плачевным состоянием несущих конструкций \
+ посещать эти части станции не рекомендуется, однако неиспользуемые площади \
+ могут быть использованы для строительства новых отсеков.\
+
Особенности станции
\
+
В отличие от большинства других научно-исследовательских станций Nanotrasen, \
+ таких как "Кибериада", ИСН "Керборос" имеет менее \
+ жёсткую систему контроля за личными вещами экипажа. В частности, в отсеках \
+ были построены дополнительные автолаты, в том числе публичные \
+ (в карго и РНД). Также, благодаря более высокому бюджету, были возведены \
+ новые отсеки, такие как ангар или склад в отсеке РнД.\
+ Был расширен отдел вирусологии и возведены новые техничесские туннели для \
+ новых проектов."
+
+/obj/item/paper/pamphlet/update_icon_state()
+ return
diff --git a/modular_ss220/objects/code/officetoys.dm b/modular_ss220/objects/code/officetoys.dm
new file mode 100644
index 000000000000..8583d4a1ee79
--- /dev/null
+++ b/modular_ss220/objects/code/officetoys.dm
@@ -0,0 +1,212 @@
+#define HOURGLASS_STATES 7 //Remember to update if you change the sprite
+
+// Hourglass
+/obj/item/hourglass
+ name = "hourglass"
+ desc = "Nanotrasen patented gravity invariant hourglass. Guaranteed to flow perfectly under any conditions."
+ icon = 'modular_ss220/objects/icons/officetoys.dmi'
+ icon_state = "hourglass_idle"
+ var/obj/effect/countdown/hourglass/countdown
+ var/time = 1 MINUTES
+ var/finish_time //So countdown doesn't need to fiddle with timers
+ var/timing_id //If present we're timing
+ var/hand_activated = TRUE
+
+/obj/item/hourglass/Initialize(mapload)
+ . = ..()
+ countdown = new(src)
+
+/obj/item/hourglass/attack_self(mob/user)
+ . = ..()
+ if(hand_activated)
+ toggle(user)
+
+/obj/item/hourglass/proc/toggle(mob/user)
+ if(!timing_id)
+ to_chat(user, span_notice("You flip the [src]."))
+ start()
+ flick("hourglass_flip",src)
+ else
+ to_chat(user, span_notice("You stop the [src].")) //Sand magically flows back because that's more convinient to use.
+ stop()
+
+/obj/item/hourglass/update_icon()
+ icon_state = "hourglass_[timing_id ? "active" : "idle"]"
+ return ..()
+
+/obj/item/hourglass/proc/start()
+ finish_time = world.time + time
+ timing_id = addtimer(CALLBACK(src, .proc/finish), time, TIMER_STOPPABLE)
+ countdown.start()
+ timing_animation()
+
+/obj/item/hourglass/proc/timing_animation()
+ var/step_time = time / HOURGLASS_STATES
+ animate(src, time = step_time, icon_state = "hourglass_1")
+ for(var/i in 2 to HOURGLASS_STATES)
+ animate(time = step_time, icon_state = "hourglass_[i]")
+
+/obj/item/hourglass/proc/stop()
+ if(timing_id)
+ deltimer(timing_id)
+ timing_id = null
+ countdown.stop()
+ finish_time = null
+ animate(src)
+ update_icon()
+
+/obj/item/hourglass/proc/finish()
+ visible_message(span_notice("[src] stops."))
+ stop()
+
+/obj/item/hourglass/Destroy()
+ QDEL_NULL(countdown)
+ . = ..()
+
+// Admin events zone
+/obj/item/hourglass/admin
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ anchored = TRUE
+ hand_activated = FALSE
+
+/obj/item/hourglass/admin/attack_hand(mob/user, list/modifiers)
+ . = ..()
+ if(user.client && user.client.holder)
+ toggle(user)
+
+/obj/item/hourglass/admin/attack_ghost(mob/user)
+ if(user.client && user.client.holder)
+ toggle(user)
+
+#undef HOURGLASS_STATES
+
+// Hourglass countdown
+/obj/effect/countdown/hourglass
+ name = "hourglass countdown"
+
+/obj/effect/countdown/hourglass/get_value()
+ var/obj/item/hourglass/H = attached_to
+ if(!istype(H))
+ return
+ else
+ var/time_left = max(0, (H.finish_time - world.time) / 10)
+ return round(time_left)
+
+/*
+* Office desk toys
+*/
+/obj/item/toy/desk
+ name = "desk toy master"
+ desc = "A object that does not exist. Parent Item."
+ icon = 'modular_ss220/objects/icons/officetoys.dmi'
+ layer = ABOVE_MOB_LAYER
+ var/on = 0
+ var/activation_sound = 'modular_ss220/objects/sound/officetoys/buttonclick.ogg'
+
+/obj/item/toy/desk/update_icon_state()
+ if(on)
+ icon_state = "[initial(icon_state)]-on"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/item/toy/desk/attack_self(mob/user)
+ on = !on
+ if(activation_sound)
+ playsound(src.loc, activation_sound, 75, 1)
+ update_icon()
+ return TRUE
+
+/obj/item/toy/desk/verb/rotate()
+ set name = "Rotate"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.incapacitated())
+ return
+ dir = turn(dir, 270)
+ return TRUE
+
+/obj/item/toy/desk/AltClick(mob/user)
+ if(user.incapacitated())
+ to_chat(user, span_warning("You can't do that right now!"))
+ return
+ if(!in_range(src, user))
+ return
+ else
+ rotate()
+
+/obj/item/toy/desk/officetoy
+ name = "office toy"
+ desc = "A generic microfusion powered office desk toy. Only generates magnetism and ennui."
+ icon_state = "desktoy"
+
+/obj/item/toy/desk/dippingbird
+ name = "dipping bird toy"
+ desc = "A ancient human bird idol, worshipped by clerks and desk jockeys."
+ icon_state = "dippybird"
+
+/obj/item/toy/desk/newtoncradle
+ name = "\improper Newton's cradle"
+ desc = "A ancient 21th century super-weapon model demonstrating that Sir Isaac Newton is the deadliest sonuvabitch in space."
+ icon_state = "newtoncradle"
+ var/datum/looping_sound/newtonballs/soundloop
+
+/obj/item/toy/desk/newtoncradle/Initialize()
+ ..()
+ soundloop = new(list(src), FALSE)
+
+/obj/item/toy/desk/newtoncradle/attack_self(mob/user)
+ on = !on
+ update_icon()
+ if(on)
+ soundloop.start()
+ else
+ soundloop.stop()
+
+/obj/item/toy/desk/fan
+ name = "office fan"
+ desc = "Your greatest fan."
+ icon_state = "fan"
+ var/datum/looping_sound/fanblow/soundloop
+
+/obj/item/toy/desk/fan/Initialize()
+ ..()
+ soundloop = new(list(src), FALSE)
+
+/obj/item/toy/desk/fan/attack_self(mob/user)
+ on = !on
+ update_icon()
+ if(on)
+ soundloop.start()
+ else
+ soundloop.stop()
+
+// Office toys spawner
+/obj/effect/spawner/lootdrop/officetoys
+ name = "office desk toy spawner"
+ icon = 'modular_ss220/objects/icons/officetoys.dmi'
+ icon_state = "spawner"
+ loot = list(
+ /obj/item/toy/desk/officetoy,
+ /obj/item/toy/desk/dippingbird,
+ /obj/item/toy/desk/newtoncradle,
+ /obj/item/toy/desk/fan,
+ /obj/item/hourglass
+ )
+
+// Item datums
+/datum/looping_sound/fanblow
+ start_sound = 'modular_ss220/objects/sound/officetoys/fan_start.ogg'
+ start_length = 40
+ mid_sounds = 'modular_ss220/objects/sound/officetoys/fan_mid1.ogg'
+ mid_length = 23
+ end_sound = 'modular_ss220/objects/sound/officetoys/fan_end.ogg'
+ volume = 30
+
+/datum/looping_sound/newtonballs
+ start_sound = FALSE
+ start_length = FALSE
+ mid_sounds = 'modular_ss220/objects/sound/officetoys/newtoncradle_mid1.ogg'
+ mid_length = 9
+ end_sound = FALSE
+ volume = 50
diff --git a/modular_ss220/objects/code/papershredder.dm b/modular_ss220/objects/code/papershredder.dm
new file mode 100644
index 000000000000..4be321163baa
--- /dev/null
+++ b/modular_ss220/objects/code/papershredder.dm
@@ -0,0 +1,142 @@
+/obj/machinery/papershredder
+ name = "paper shredder"
+ desc = "For those documents you don't want seen."
+ icon = 'modular_ss220/objects/icons/papershredder.dmi'
+ icon_state = "papershredder0"
+ density = TRUE
+ anchored = TRUE
+ var/max_paper = 15
+ var/paperamount = 0
+ var/list/shred_amounts = list(
+ /obj/item/photo = 1,
+ /obj/item/shredded_paper = 1,
+ /obj/item/paper = 1,
+ /obj/item/newspaper = 3,
+ /obj/item/card/id = 3,
+ /obj/item/paper_bundle = 3,
+ /obj/item/folder = 4,
+ /obj/item/book = 5
+ )
+
+/obj/machinery/papershredder/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/storage))
+ add_fingerprint(user)
+ empty_bin(user, W)
+ return
+ else
+ var/paper_result
+ for(var/shred_type in shred_amounts)
+ if(istype(W, shred_type))
+ paper_result = shred_amounts[shred_type]
+ if(paper_result)
+ if(paperamount == max_paper)
+ to_chat(user, span_warning("\The [src] is full; please empty it before you continue."))
+ return
+ paperamount += paper_result
+ qdel(W)
+ playsound(src.loc, 'modular_ss220/objects/sound/pshred.ogg', 75, 1)
+ if(paperamount > max_paper)
+ to_chat(user, span_danger("\The [src] was too full, and shredded paper goes everywhere!"))
+ for(var/i=(paperamount-max_paper);i>0;i--)
+ var/obj/item/shredded_paper/SP = get_shredded_paper()
+ SP.loc = get_turf(src)
+ SP.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), 1, 1)
+ paperamount = max_paper
+ update_icon()
+ add_fingerprint(user)
+ return
+ ..()
+
+ return
+
+/obj/machinery/papershredder/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ if(anchored)
+ WRENCH_ANCHOR_MESSAGE
+ else
+ WRENCH_UNANCHOR_MESSAGE
+
+/obj/machinery/papershredder/AltClick(mob/user)
+ . = ..()
+ empty_contents()
+
+/obj/machinery/papershredder/verb/empty_contents()
+ set name = "Empty Bin"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat || usr.restrained())
+ to_chat(usr, span_notice("You need your hands and legs free for this."))
+ return
+
+ if(!paperamount)
+ to_chat(usr, span_notice("\The [src] is empty."))
+ return
+
+ empty_bin(usr)
+
+/obj/machinery/papershredder/proc/empty_bin(mob/living/user, obj/item/storage/empty_into)
+
+ // Sanity.
+ if(empty_into && !istype(empty_into))
+ empty_into = null
+
+ if(empty_into && empty_into.contents.len >= empty_into.storage_slots)
+ to_chat(user, span_notice("\The [empty_into] is full."))
+ return
+
+ while(paperamount)
+ var/obj/item/shredded_paper/SP = get_shredded_paper()
+ if(!SP) break
+ if(empty_into)
+ empty_into.handle_item_insertion(SP)
+ if(empty_into.contents.len >= empty_into.storage_slots)
+ break
+ if(empty_into)
+ if(paperamount)
+ to_chat(user, span_notice("You fill \the [empty_into] with as much shredded paper as it will carry."))
+ else
+ to_chat(user, span_notice("You empty \the [src] into \the [empty_into]."))
+
+ else
+ to_chat(user, span_notice("You empty \the [src]."))
+ update_icon()
+
+/obj/machinery/papershredder/proc/get_shredded_paper()
+ if(!paperamount)
+ return
+ paperamount--
+ return new /obj/item/shredded_paper(get_turf(src))
+
+/obj/machinery/papershredder/update_icon_state()
+ icon_state = "papershredder[clamp(round(paperamount/3), 0, 5)]"
+
+/obj/item/shredded_paper/attackby(obj/item/W as obj, mob/user)
+ if(resistance_flags & ON_FIRE)
+ add_fingerprint(user)
+ return
+ if(is_hot(W, user))
+ add_fingerprint(user)
+ user.visible_message(span_danger("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap."), span_danger("You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap."))
+ fire_act()
+ else
+ ..()
+
+/obj/item/shredded_paper
+ name = "shredded paper"
+ icon = 'modular_ss220/objects/icons/papershredder.dmi'
+ icon_state = "shredp"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ resistance_flags = FLAMMABLE
+ layer = 4
+ max_integrity = 25
+ throw_range = 3
+ throw_speed = 2
+
+/obj/item/shredded_paper/Initialize()
+ . = ..()
+ if(prob(65)) color = pick("#8b8b8b","#e7e4e4", "#c9c9c9")
diff --git a/modular_ss220/objects/code/tribune.dm b/modular_ss220/objects/code/tribune.dm
new file mode 100644
index 000000000000..f43c4f25f16c
--- /dev/null
+++ b/modular_ss220/objects/code/tribune.dm
@@ -0,0 +1,82 @@
+/obj/structure/tribune
+ name = "tribune"
+ icon = 'modular_ss220/objects/icons/tribune.dmi'
+ icon_state = "nt_tribune"
+ desc = "A sturdy wooden tribune. When you look at it, you want to start making a speech."
+ density = TRUE
+ anchored = FALSE
+ max_integrity = 100
+ resistance_flags = FLAMMABLE
+ var/buildstacktype = /obj/item/stack/sheet/wood
+ var/buildstackamount = 5
+ var/mover_dir = null
+ var/ini_dir = null
+
+/obj/structure/tribune/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I)
+
+/obj/structure/tribune/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(flags & NODECONSTRUCT)
+ to_chat(user, span_warning("Try as you might, you can't figure out how to deconstruct [src]."))
+ return
+ if(!I.use_tool(src, user, 30, volume = I.tool_volume))
+ return
+ deconstruct(TRUE)
+
+/obj/structure/tribune/deconstruct()
+ // If we have materials, and don't have the NOCONSTRUCT flag
+ if(buildstacktype && (!(flags & NODECONSTRUCT)))
+ new buildstacktype(loc, buildstackamount)
+ ..()
+
+/obj/structure/tribune/proc/after_rotation(mob/user)
+ add_fingerprint(user)
+
+/obj/structure/tribune/Initialize(mapload) //Only for mappers
+ ..()
+ handle_layer()
+
+/obj/structure/tribune/setDir(newdir)
+ ..()
+ handle_layer()
+
+/obj/structure/tribune/Move(newloc, direct, movetime)
+ . = ..()
+ handle_layer()
+
+/obj/structure/tribune/proc/handle_layer()
+ if(dir == NORTH)
+ layer = LOW_ITEM_LAYER
+ else
+ layer = ABOVE_MOB_LAYER
+
+/obj/structure/tribune/AltClick(mob/user)
+ if(!Adjacent(user))
+ return
+ if(anchored)
+ to_chat(user, span_warning("It is fastened to the floor!"))
+ return
+ setDir(turn(dir, 90))
+ after_rotation(user)
+
+/obj/structure/tribune/CanPass(atom/movable/mover, turf/target, height=0)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir)
+ return !density
+ return 1
+
+/obj/structure/tribune/CheckExit(atom/movable/O, target)
+ if(istype(O) && O.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(O.loc, target) == dir)
+ return 0
+ return 1
+
+/obj/structure/tribune/centcom
+ name = "CentCom tribune"
+ icon = 'modular_ss220/objects/icons/tribune.dmi'
+ icon_state = "nt_tribune_cc"
+ desc = "A richly decorated tribune. Just looking at her makes your heart skip a beat."
diff --git a/modular_ss220/objects/icons/officetoys.dmi b/modular_ss220/objects/icons/officetoys.dmi
new file mode 100644
index 000000000000..15117c70246b
Binary files /dev/null and b/modular_ss220/objects/icons/officetoys.dmi differ
diff --git a/modular_ss220/objects/icons/papershredder.dmi b/modular_ss220/objects/icons/papershredder.dmi
new file mode 100644
index 000000000000..2cb519d6d4a2
Binary files /dev/null and b/modular_ss220/objects/icons/papershredder.dmi differ
diff --git a/modular_ss220/objects/icons/tribune.dmi b/modular_ss220/objects/icons/tribune.dmi
new file mode 100644
index 000000000000..5e8775263ec9
Binary files /dev/null and b/modular_ss220/objects/icons/tribune.dmi differ
diff --git a/modular_ss220/objects/sound/officetoys/buttonclick.ogg b/modular_ss220/objects/sound/officetoys/buttonclick.ogg
new file mode 100644
index 000000000000..0c03b6b6289a
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/buttonclick.ogg differ
diff --git a/modular_ss220/objects/sound/officetoys/fan_end.ogg b/modular_ss220/objects/sound/officetoys/fan_end.ogg
new file mode 100644
index 000000000000..1c50757d2b90
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/fan_end.ogg differ
diff --git a/modular_ss220/objects/sound/officetoys/fan_mid1.ogg b/modular_ss220/objects/sound/officetoys/fan_mid1.ogg
new file mode 100644
index 000000000000..1abf9b9b5e68
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/fan_mid1.ogg differ
diff --git a/modular_ss220/objects/sound/officetoys/fan_start.ogg b/modular_ss220/objects/sound/officetoys/fan_start.ogg
new file mode 100644
index 000000000000..5ff9b64ffccb
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/fan_start.ogg differ
diff --git a/modular_ss220/objects/sound/officetoys/microfan.ogg b/modular_ss220/objects/sound/officetoys/microfan.ogg
new file mode 100644
index 000000000000..26631f593245
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/microfan.ogg differ
diff --git a/modular_ss220/objects/sound/officetoys/newtoncradle.ogg b/modular_ss220/objects/sound/officetoys/newtoncradle.ogg
new file mode 100644
index 000000000000..48cf91228a1a
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/newtoncradle.ogg differ
diff --git a/modular_ss220/objects/sound/officetoys/newtoncradle_mid1.ogg b/modular_ss220/objects/sound/officetoys/newtoncradle_mid1.ogg
new file mode 100644
index 000000000000..35e6bb6ec62b
Binary files /dev/null and b/modular_ss220/objects/sound/officetoys/newtoncradle_mid1.ogg differ
diff --git a/modular_ss220/objects/sound/pshred.ogg b/modular_ss220/objects/sound/pshred.ogg
new file mode 100644
index 000000000000..a722f3006899
Binary files /dev/null and b/modular_ss220/objects/sound/pshred.ogg differ
diff --git a/modular_ss220/unique_objects/code/unique_objects.dm b/modular_ss220/unique_objects/code/unique_objects.dm
index e77558fa8a04..1d520ebe2271 100644
--- a/modular_ss220/unique_objects/code/unique_objects.dm
+++ b/modular_ss220/unique_objects/code/unique_objects.dm
@@ -55,6 +55,7 @@
anchored = TRUE
oreAmount = 0
+// Cyberiad statue
/obj/structure/statue/cyberiad
name = "статуя Кибериады"
desc = "Гигантская модель научной станции «Кибериада». Судя по отличиям в конструкции, станцию несколько раз перестраивали."
@@ -109,6 +110,61 @@
/obj/structure/statue/cyberiad/se
icon_state = "se"
+// Delta statue
+/obj/structure/statue/delta
+ name = "статуя Кербероса"
+ desc = "Гигантская модель научной станции «Керберос». Судя по отличиям в конструкции, станцию несколько раз перестраивали."
+ icon = 'modular_ss220/unique_objects/icons/delta.dmi'
+ anchored = TRUE
+ max_integrity = 500
+ oreAmount = 0
+
+/obj/structure/statue/delta/nw
+ icon_state = "nw"
+ density = FALSE
+ layer = ABOVE_ALL_MOB_LAYER
+
+/obj/structure/statue/delta/north
+ icon_state = "north"
+ density = FALSE
+ layer = ABOVE_ALL_MOB_LAYER
+
+/obj/structure/statue/delta/ne
+ icon_state = "ne"
+ density = FALSE
+ layer = ABOVE_ALL_MOB_LAYER
+
+// Adds transparency when the player gets behind an object, or is near it
+/obj/structure/statue/delta/nw/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/largetransparency, -3, -2, 6, 4)
+
+/obj/structure/statue/delta/north/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/largetransparency, -3, -2, 6, 4)
+
+/obj/structure/statue/delta/ne/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/largetransparency, -3, -2, 6, 4)
+
+/obj/structure/statue/delta/w
+ icon_state = "west"
+
+/obj/structure/statue/delta/c
+ icon_state = "center"
+
+/obj/structure/statue/delta/e
+ icon_state = "east"
+
+/obj/structure/statue/delta/sw
+ icon_state = "sw"
+
+/obj/structure/statue/delta/s
+ icon_state = "south"
+
+/obj/structure/statue/delta/se
+ icon_state = "se"
+
// =========== items ===========
/obj/item/clothing/head/helmet/skull/Yorick
name = "Йорик"
diff --git a/modular_ss220/unique_objects/icons/delta.dmi b/modular_ss220/unique_objects/icons/delta.dmi
new file mode 100644
index 000000000000..0ed292508122
Binary files /dev/null and b/modular_ss220/unique_objects/icons/delta.dmi differ