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..8b45a0705154 --- /dev/null +++ b/modular_ss220/aesthetics/stamps/code/stamps.dm @@ -0,0 +1,82 @@ +// It's just works :skull: +/obj/item/paper/stamp(obj/item/stamp/stamp) + if(stamp.stampoverlay_custom_icon) + stamps += (!stamps || stamps == "" ? "
" : "") + "" + var/image/stampoverlay = image(stamp.stampoverlay_custom_icon) + var/x = rand(-2, 0) + var/y = rand(-1, 2) + offset_x += x + offset_y += y + stampoverlay.pixel_x = x + stampoverlay.pixel_y = y + stampoverlay.icon_state = "paper_[stamp.icon_state]" + stamp_overlays += stampoverlay + + if(!ico) + ico = new + ico += "paper_[stamp.icon_state]" + if(!stamped) + stamped = new + stamped += stamp.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() + +/obj/item/stamp + var/stampoverlay_custom_icon + +/obj/item/stamp/warden + name = "warden's rubber stamp" + icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + icon_state = "stamp-ward" + item_color = "hosred" + stampoverlay_custom_icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + +/obj/item/stamp/ploho + name = "'Very Bad, Redo' rubber stamp" + icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + icon_state = "stamp-ploho" + item_color = "hop" + stampoverlay_custom_icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + +/obj/item/stamp/bigdeny + name = "\improper BIG DENY rubber stamp" + icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + icon_state = "stamp-BIGdeny" + item_color = "redcoat" + stampoverlay_custom_icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + +/obj/item/stamp/navcom + name = "Nanotrasen Naval Command rubber stamp" + icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + icon_state = "stamp-navcom" + item_color = "captain" + stampoverlay_custom_icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + +/obj/item/stamp/mime + name = "mime's rubber stamp" + icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + icon_state = "stamp-mime" + item_color = "mime" + stampoverlay_custom_icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + +/obj/item/stamp/ussp + name = "old USSP rubber stamp" + icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + icon_state = "stamp-ussp" + item_color = "redcoat" + stampoverlay_custom_icon = 'modular_ss220/aesthetics/stamps/icons/stamps.dmi' + +// 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..61a0aadc729a --- /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 [src].")) + start() + flick("hourglass_flip",src) + else + to_chat(user, span_notice("You stop [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_REF(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..e0e70020e1f3 --- /dev/null +++ b/modular_ss220/objects/code/papershredder.dm @@ -0,0 +1,140 @@ +/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/item, mob/user, params) + if(istype(item, /obj/item/storage)) + add_fingerprint(user) + empty_bin(user, item) + return + var/paper_result + if(item.type in shred_amounts) + paper_result = shred_amounts[item.type] + if(!paper_result) + . = ..() + return + if(paperamount == max_paper) + to_chat(user, span_warning("[src] is full; please empty it before you continue.")) + return + paperamount += paper_result + qdel(item) + playsound(loc, 'modular_ss220/objects/sound/pshred.ogg', 75, 1) + if(paperamount > max_paper) + to_chat(user, span_danger("[src] was too full, and shredded paper goes everywhere!")) + for(var/i in 1 to paperamount-max_paper) + var/obj/item/shredded_paper/shredp = get_shredded_paper() + shredp.loc = get_turf(src) + shredp.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), 1, 1) + paperamount = max_paper + update_icon() + add_fingerprint(user) + +/obj/machinery/papershredder/wrench_act(mob/user, obj/item/tool) + . = TRUE + if(!tool.use_tool(src, user, 0, volume = tool.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("[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 && length(empty_into.contents) >= empty_into.storage_slots) + to_chat(user, span_notice("[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(length(empty_into.contents) >= empty_into.storage_slots) + break + if(empty_into) + if(paperamount) + to_chat(user, span_notice("You fill [empty_into] with as much shredded paper as it will carry.")) + else + to_chat(user, span_notice("You empty [src] into [empty_into].")) + + else + to_chat(user, span_notice("You empty [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/shredp as obj, mob/user) + if(resistance_flags & ON_FIRE) + add_fingerprint(user) + return + if(is_hot(shredp, user)) + add_fingerprint(user) + user.visible_message(span_danger("\The [user] burns right through [src], turning it to ash. It flutters through the air before settling on the floor in a heap."), span_danger("You burn right through [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..f683a108fa27 --- /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/tool) + . = TRUE + default_unfasten_wrench(user, tool) + +/obj/structure/tribune/screwdriver_act(mob/user, obj/item/tool) + . = TRUE + if(flags & NODECONSTRUCT) + to_chat(user, span_warning("Try as you might, you can't figure out how to deconstruct [src].")) + return + if(!tool.use_tool(src, user, 30, volume = tool.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 TRUE + if(get_dir(loc, target) == dir) + return !density + return TRUE + +/obj/structure/tribune/CheckExit(atom/movable/object, target) + if(istype(object) && object.checkpass(PASSGLASS)) + return TRUE + if(get_dir(object.loc, target) == dir) + return FALSE + return TRUE + +/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