diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 00000000000..3d10f14d8e5
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,166 @@
+# CONTRIBUTING
+
+## Introduction
+This is the contribution guide for Paradise Station. These guidelines apply to
+both new issues and new pull requests. If you are making a pull request, please refer to
+the [Pull request](#pull-requests) section, and if you are making an issue report, please
+refer to the [Issue Report](#issues) section, as well as the
+[Issue Report Template](ISSUE_TEMPLATE.md).
+
+## Commenting
+If you comment on an active pull request, or issue report, make sure your comment is
+concise and to the point. Comments on issue reports or pull requests should be relevant
+and friendly, not attacks on the author or adages about something minimally relevant.
+If you believe an issue report is not a "bug", please report it to the Maintainers, or
+point out specifically and concisely your reasoning in a comment on the issue report.
+
+## Issues
+The Issues section is not a place to request features, or ask for things to be changed
+because you think they should be that way; The Issues section is specifically for
+reporting bugs in the code. Refer to ISSUE_TEMPLATE for the exact format that your Issue
+should be in.
+
+#### Guidelines:
+ - Issue reports should be as detailed as possible, and if applicable, should include
+ instructions on how to reproduce the bug.
+
+## Pull requests
+Players are welcome to participate in the development of this fork and submit their own
+pull requests. If the work you are submitting is a new feature, or affects balance, it is
+strongly recommended you get approval/traction for it from our forums before starting the
+actual development.
+
+#### Guidelines:
+ - Pull requests should be atomic; Make one commit for each distinct change, so if a part
+ of a pull request needs to be removed/changed, you may simply modify that single commit.
+ Due to limitations of the engine, this may not always be possible; but do try your best.
+ - Document and explain your pull requests thoroughly. Detail what each commit changes,
+ and why it changes it. We do not want to have to read all of you commit names to figure
+ out what your pull request is about.
+ - Any pull request that is not solely composed of fixes or non gameplay-affecting
+ refactors must have a changelog. See [here](../html/changelogs/__CHANGELOG_README.txt)
+ for more details, and [here](../html/changelogs/example.yml) for an example changelog.
+ Alternatively, inline changelogs are supported through the format described
+ [here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466).
+ - Pull requests should not have any merge commits except in the case of fixing merge
+ conflicts for an existing pull request. New pull requests should not have any merge
+ commits. Use `git rebase` or `git reset` to update your branches, not `git pull`.
+
+#### BYOND Specific Guidelines:
+ - Any `type` or `proc` paths **must** use absolute pathing unless the file you are
+ working in primarily utilizes relative pathing.
+ - Paths must begin with `/`. It should be `/obj/machinery/fancy_robot`,
+ not `obj/machinery/fancy_robot`.
+ - New bases of datum must begin with `/datum/`. `/datum/arbitrary_datum`,
+ not `/arbitrary_datum`.
+ - Don't use strings in combination with `text2path()` unless the paths are being
+ dynamically created. Variables can contain normal paths just fine.
+ - Don't duplicate code. If you have identical code in two places, it should probably
+ be a new proc that they both can use.
+ - No magic numbers/strings. If you have a number or text that is important and used in
+ your code, make a `#DEFINE` statement with a name that clearly indicates it's use.
+ - Do not use one-line control statements (if, else, for, while, etc). The space saved
+ is not worth the decreased readability.
+ - Control statements comparing a variable to a constant should be formatted `variable`,
+ `operator`, `constant`. This means `if(count <= 10)` is preferred over
+ `if(10 >= count)`.
+ - **Never** use a colon `:` operator to bypass type safety checks, unless you are doing
+ something where the tiny performance increase is incredibly noticeable (eg, a loop for
+ a huge list). You should properly typecast everything and use the period `.`
+ operator.
+ - Use early returns, and avoid far-indented if blocks. This means that you should not
+ do this:
+ ```
+ /datum/datum1/proc/proc1()
+ if (thing1)
+ if (!thing2)
+ if (thing3 == 30)
+ do stuff
+ ```
+ Instead, you should do this:
+ ```
+ /datum/datum1/proc/proc1()
+ if (!thing1)
+ return
+ if (thing2)
+ return
+ if (thing3 != 30)
+ return
+ do stuff
+ ```
+ - Any pull requests that affect map files must use the map-merge tools. Pull requests
+ that do not follow this guideline will be automatically declined, unless explicit
+ permission was given.
+ - The following examples of code are present in the code, but are no longer acceptable:
+ - To display messages to all mobs that can view `src`, you should use
+ `visible_message()`.
+ - Bad:
+ ```
+ for (var/mob/M in viewers(src))
+ M.show_message("Arbitrary text")
+ ```
+ - Good:
+ ```
+ visible_message("Arbitrary text")
+ ```
+ - You should not use color macros (`\red, \blue, \green, \black`) to color text,
+ instead, you should use span classes. `red text`,
+ `blue text`.
+ - Bad:
+ ```
+ usr << "\red Red Text \black black text"
+ ```
+ - Good:
+ ```
+ usr << "Red Textblack text"
+ ```
+ - To use variables in strings, you should **never** use the `text()` operator, use
+ embedded expressions directly in the string.
+ - Bad:
+ ```
+ usr << text("\The [] is leaking []!", src.name, src.liquid_type)
+ ```
+ - Good:
+ ```
+ usr << "\The [src] is leaking [liquid_type]"
+ ```
+ - To reference a variable/proc on the src object, you should **not** use
+ `src.var`/`src.proc()`. The `src.` in these cases is implied, so you should just use
+ `var`/`proc()`.
+ - Bad:
+ ```
+ var/user = src.interactor
+ src.fillReserves(user)
+ ```
+ - Good:
+ ```
+ var/user = interactor
+ fillReserves(user)
+ ```
+
+
+## Maintainers
+The only current official role for GitHub staff are the `Maintainers`. There are up to
+three `Maintainers` at once, and they share equal power. The `Maintainers` are
+responsible for properly tagging new pull requests and issues, moderating comments in
+pull requests/issues, and merging/closing pull requests.
+
+### Maintainer List
+ - [MarkvA](https://github.com/Markolie)
+ - [Fox P McCloud](https://github.com/Fox-McCloud)
+ - [TheDZD](https://github.com/TheDZD)
+
+### Maintainer instructions
+ - Do not `self-merge`; this refers to the practice of opening a pull request, then
+ merging it yourself. A different maintainer must review and merge your pull request, no
+ matter how trivial. This is to ensure quality.
+ - A subset of this instruction: Do not push directly to the repository, always make a
+ pull request.
+ - Wait for the Travis CI build to complete. If it fails, the pull request may only be
+ merged if there is a very good reason (example: fixing the Travis configuration).
+ - Pull requests labeled as bugfixes and refactors may be merged as soon as they are
+ reviewed.
+ - The shortest waiting period for -any- feature or balancing altering pull request is 24
+ hours, to allow other coders and the community time to discuss the proposed changes.
+ - If the discussion is active, or the change is controversial, the pull request is to be
+ put on hold until a consensus is reached.
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..d7646ecb97b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,17 @@
+**Problem Description**:
+What is the problem?
+
+**What did you expect to happen**:
+Why do you think this is a bug?
+
+**What happened instead**:
+How is what happened different from what you expected?
+
+**Why is this bad/What are the consequences:**
+Why do you think this is an important issue?
+
+**Steps to reproduce the problem**:
+The most important section. Review everything you did leading up to causing the issue.
+
+**Possibly related stuff (which gamemode was it? What were you doing at the time? Was
+anything else out of the ordinary happening?)**: Anything else you can tell us.
\ No newline at end of file
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 9ad58ad0fef..de672ffcf45 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -1438,7 +1438,7 @@
"aBH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig)
"aBI" = (/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
"aBJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
-"aBK" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/Doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
+"aBK" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
"aBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aBM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aBN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
@@ -2694,7 +2694,7 @@
"aZP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"aZQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"aZR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Fore Primary Hallway"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
-"aZS" = (/obj/structure/sign/directions/security{desc = "A direction sign, pointing out which way the security department is."; dir = 1; icon_state = "direction_sec"; pixel_x = 0; pixel_y = 8; tag = "icon-direction_sec (NORTH)"},/turf/simulated/wall,/area/crew_quarters/courtroom)
+"aZS" = (/obj/structure/sign/directions/security{dir = 1; pixel_y = 8},/turf/simulated/wall,/area/crew_quarters/courtroom)
"aZT" = (/obj/machinery/power/apc{cell_type = 2500; dir = 2; name = "Courtroom APC"; pixel_x = 1; pixel_y = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"aZU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"aZV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
@@ -3281,7 +3281,7 @@
"ble" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/obj/effect/landmark/start{name = "Captain"},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"blf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"blg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/central)
-"blh" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the engineering department is."; dir = 4; icon_state = "direction_eng"; pixel_y = -8; tag = "icon-direction_eng (EAST)"},/turf/simulated/wall,/area/storage/tools)
+"blh" = (/obj/structure/sign/directions/security{dir = 4; pixel_y = 8},/obj/structure/sign/directions/engineering{dir = 4},/turf/simulated/wall,/area/janitor)
"bli" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/tools)
"blj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor/plasteel,/area/storage/tools)
"blk" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/tools)
@@ -3625,7 +3625,7 @@
"brK" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
"brL" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/hallway/primary/port)
"brM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/hallway/primary/port)
-"brN" = (/obj/structure/sign/directions/security{desc = "A direction sign, pointing out which way the security department is."; dir = 1; icon_state = "direction_sec"; pixel_x = 0; pixel_y = 8; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the engineering department is."; dir = 4; icon_state = "direction_eng"; pixel_y = 0; tag = "icon-direction_eng (EAST)"},/turf/simulated/wall/r_wall,/area/hallway/primary/port)
+"brN" = (/obj/structure/sign/directions/engineering{dir = 4},/obj/structure/sign/directions/security{dir = 8; pixel_y = 8},/turf/simulated/wall/r_wall,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"brO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
"brP" = (/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/door_control{id = "hop"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = 25; req_access_txt = "28"},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"brQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall/r_wall,/area/turret_protected/ai)
@@ -3857,7 +3857,7 @@
"bwi" = (/turf/simulated/floor/carpet,/area/bridge)
"bwj" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet,/area/bridge)
"bwk" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 8},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
-"bwl" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bwl" = (/obj/structure/sign/directions/engineering{dir = 4},/obj/structure/sign/directions/security{dir = 1; pixel_y = 8},/turf/simulated/wall,/area/storage/tools)
"bwm" = (/obj/machinery/power/apc{cell_type = 10000; dir = 8; name = "Bridge APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable/yellow,/obj/machinery/camera{c_tag = "Bridge - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bwn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bwo" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/displaycase/captains_laser,/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
@@ -4042,7 +4042,7 @@
"bzL" = (/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/library)
"bzM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpetsymbol"},/area/library)
"bzN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpetsymbol"},/area/library)
-"bzO" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the escape arm is."; icon_state = "direction_evac"; name = "escape arm"; tag = "icon-direction_evac"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the medical department is."; icon_state = "direction_med"; name = "medical department"; pixel_y = 8; tag = "icon-direction_med"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the research department is."; icon_state = "direction_sci"; name = "research department"; pixel_y = -8; tag = "icon-direction_sci"},/turf/simulated/wall,/area/library)
+"bzO" = (/obj/structure/sign/directions/engineering{dir = 4},/obj/structure/sign/directions/security{dir = 1; pixel_y = 8},/turf/simulated/wall/r_wall,/area/hallway/primary/port)
"bzP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bzQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 15},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bzR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
@@ -5362,7 +5362,7 @@
"bZf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/library)
"bZg" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/wood,/area/library)
"bZh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
-"bZi" = (/obj/structure/sign/directions/evac{tag = "icon-direction_evac (EAST)"; icon_state = "direction_evac"; dir = 4},/obj/structure/sign/directions/medical{desc = "A direction sign, pointing out which way the medical department is."; dir = 4; icon_state = "direction_med"; name = "medical department"; pixel_y = 8; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{desc = "A direction sign, pointing out which way the research department is."; dir = 4; icon_state = "direction_sci"; name = "research department"; pixel_y = -8; tag = "icon-direction_sci (EAST)"},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
+"bZi" = (/obj/structure/sign/directions/evac,/obj/structure/sign/directions/medical{pixel_y = 8},/obj/structure/sign/directions/science{pixel_y = -8},/turf/simulated/wall,/area/civilian/barber)
"bZj" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{id_tag = "evashutter"; name = "E.V.A. Storage Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
"bZk" = (/obj/machinery/door/poddoor/shutters{id_tag = "teleshutter"; name = "Teleporter Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"})
"bZl" = (/turf/simulated/wall/r_wall,/area/blueshield)
@@ -8346,6 +8346,10 @@
"dez" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera{c_tag = "Secure Lab - Airlock"; dir = 8; network = list("SS13","RD")},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"deA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"deB" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; tag = "icon-sink (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"deC" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"deD" = (/obj/structure/sign/directions/evac,/obj/structure/sign/directions/medical{pixel_y = 8},/obj/structure/sign/directions/science{pixel_y = -8},/turf/simulated/wall,/area/library)
+"deE" = (/obj/structure/sign/directions/medical{dir = 4; pixel_y = 8},/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/science{dir = 4; pixel_y = -8},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva{name = "E.V.A. Storage"})
+"deF" = (/obj/structure/sign/directions/medical{dir = 8; pixel_y = 8},/obj/structure/sign/directions/evac{dir = 8},/obj/structure/sign/directions/science{dir = 8; pixel_y = -8},/turf/simulated/wall,/area/maintenance/maintcentral{name = "Central Maintenance"})
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8461,17 +8465,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaabccbcdbcebcebcfbcebcebcebcgbchbcibcjbckbckbckbclbcmbcnbcoapfaaaaaaabqabqaaaaaaabqabqabqaZtbcpbcqbcrbcsaRobctbcubcvbcwbcxbcybczbcAbcBbcCbcDapfbcEbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbcQbcPbcRbcSbcTbcUbcVbcPbcWbcXbcXbcYbcZbdabcXbcXbdbbdcbdcbdcbddbdebdcbdcbdfbdcbdgbdhbdcbdcbdcbdibdjaoGbdkbdlbdmbdnbdobdpbdobdqbdobdrazBbakbalaubasJbbHbdsbdtbdubdvbdwbdxbambdybdzbdzbdAbdzbdBbambdCbarbdDbdEbdEbdEbdEbdEbdFaCgbdGaCjbdHaCjaDmaCgaCgaCgbdGaCjaDmaCmaCmaCgabqabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaarBaXHaXIaXOaaaaXLbdIbdIbdJbdKbdLbdMbdNbdKbdObdIbdPaXLaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbdQbccaWDbccbdRbccbcdbcebdSbdTbccbdRbccbdUbdVbdWbdXapfapfapfapfakzakzakzapfapfapfaZtbdYbdZbdZbdZbdZbeaaRobebbecbedbeeaYnaYnaYnaYnbefapfapfbegapfapfbehbeibejbekbelbembenbekbelbeobepbembeqbekbekbekbelbekbekberbesbekbekbekbekbekbekbekbetbeubekbekbenbevbewbekbekbekbekbexbeybezbezbezbeAbezbezbezaoGbmMaoGaGWaoGaoGbeCbeCbeCbeCbeDbeEbeEbeFbeGbeHbambeIbeJbeKbmNbeMbeNbambeObePbeQbdEbeRbeSbeTbdEbeUaCgaCgaCgaCgaCgaCgaCgbeVaCgaCgaCgaCgaCgaLwaCgabqarBarBabearBarBarBarBabearBarBarBarBabearBarBarBarBarBarBarBarBaWvaXIaXOaaaaXLbdIbdLbeWbeXbeYbeZbfabeXbfbbdLbdPaXLaaaaZhaXIaXObfcbfcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccabqaaaabqaaabccbfdbccbfebfebffbfgbccbfdbccbccaWDbfhbfibfjavTavUbfkavUbflavUbfmbfnavVbfobfpbfqbfqbfrbfsbftbfubfvbfwbfxbfybfwbfzbfAbfwbfBbfCbfDbfEbfFbfGbfHbfIbfJbfKbfKbfLbfMbfNbfObfPbfQbfRbfSbfSbfSbfSbfSbfSbfSbfTbfUbfVbfVbfVbfVbfVbfVbfVbfVbfWbfXbfYbfZbfVbgabfWbfVbfVbgbbgcbgdbezbgebgfbggbghbgibezbgjbmOaoGbglaoGaaabeCbgmbgnbeCbgobgpbgqbgrbgsbgtbambgubgvbgwbgxbmPbgzbambgAbgBbgCbdEbgDbgEbgFbdEbgGaOdaOdbgHaOdbgIaOdaOdaOdbgJaOdbgKbgLbgKbgLaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaUVbgMaXIaXOaaaaXLbdIbgNbgObdIbgPbgQbgRbdIbgSbgTbdPaXLaaaaZhaXIbgUaaabfcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaabccbdRbccbccbccbccbccbccbdRbccaaaaWDbgVbgWbgXbgXbgXbgXbgXbgXbgXbgXbgYbgZbfwbfwbhabhbbhabfwbfwbfwbhcbfwbhdbhebhfbhgbhhbhibhjbhkbhlbhmbhnbfGbhobfIbhpbhqbhqbhrbhqbhsbhqbhtbhubhtbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhwbhwbhxbhwbhwbhwbhwbhwbhwbhybfIbhzbezbhAbhBbhCbhDbhEbezbhFbhGaoGaGWaoHaaabhHbhIbhJbhKbhLbhMbhNbhObhPbhQbambhRbhSbhTbhTbhUbhVbambhWbhXbhWbdEbhYbhZbiabdEbibaCgaCgaCgaCgaCgaCgaCgaCgaCgaHjaCgaCgbdFaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqarBbicbidbiebifaXLaXLaXLbdIbigbihbiibdIbdIbdIbijbikbilbdPaXLaXLaXLbimaWBaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqaaabccbdRbccbccbccbccbccbccbdRbccaaaaWDbgVbgWbgXbgXbgXbgXbgXbgXbgXbgXbgYbgZbfwbfwbhabhbbhabfwbfwbfwbhcbfwbhdbhebhfbhgbhhbhibhjbhkbhlbhmbhnbfGbhobfIbhpblhbhqbhrbhqbhsbhqbhtbhubhtbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhvbhwbhwbhxbhwbhwbhwbhwbhwbrNbhybfIbhzbezbhAbhBbhCbhDbhEbezbhFbhGaoGaGWaoHaaabhHbhIbhJbhKbhLbhMbhNbhObhPbhQbambhRbhSbhTbhTbhUbhVbambhWbhXbhWbdEbhYbhZbiabdEbibaCgaCgaCgaCgaCgaCgaCgaCgaCgaHjaCgaCgbdFaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqarBbicbidbiebifaXLaXLaXLbdIbigbihbiibdIbdIbdIbijbikbilbdPaXLaXLaXLbimaWBaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobipbiobiqbiobiobiqbiobipbirbisaWDbgVbitbiubivbiwbixbiybizbiAbgXbiBbiCbiDbiEbiFbiGbiFbiGbiHbiGbiIbfwbiJbiKbiLbiMbiNbiObiPbiQbiRbiSbiTbiUbiVbiWbiXbhqbiYbiZbjabmQbhqbjcbjdbjeabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqbhwbjfbjgbjhbjibjjbjkbjlbhwbjmbjnbjobezbjpbjqbjrbjsbjtbezaoGaoGaoGbjuaoGaaabeCbjvbjwbeCbjxbjybjzbjAbjBbjCbambjDbjEbjFbjGbjHbjIbamaFRbjJaFRbdEbjKbjLbjMbdEbjNbjNbjNafdacJaaaaaaaaaaaaabqaaaaaaaCgbgLaCgabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaUUaUUbjObjPaXIbjQbjRaaaaaaaXLbjSbjTbjUbdIbdIbjVbdIbdIbgSbjWbjXaXLaaaaaabjYaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkibkjbccbgVbgWbkkbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDbhabkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbkRabqabqbkSbkTbkUbkVbkWbkXbkTbkVbkWbkXbkUbkUbkYabqabqbhwbmRblablbblcblbbldblebhwblfbfIblgblhbezblibljblkbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamblrblsbambltblubltbdEblvblwblxbdEblyblzblAblBblBblCaaaaaaaaaabqaaaaaaaaaaefaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaabqabqaefblDblEblFblEblGaXOaaaaaaaaaaXLblHbdLblIblJblKblLblMblJblNbdLbdPaXLaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabinbiobiobjZbkabkbbkcbkdbkebkfbkgbkhbkbbkibkjbccbgVbgWbkkbklbkmbknbkobkpbkqbkrbksbktbkubkvbkvbkwbkxbkybfwbfwbfwbfwbkzbkAbkBbkCbkDbhabkEbhkbhlbkFbkGbkHbkIbfIbkJbhqbkKbkLbkMbkNbkObkPbkQbkRabqabqbkSbkTbkUbkVbkWbkXbkTbkVbkWbkXbkUbkUbkYabqabqbhwbmRblablbblcblbbldblebhwblfbfIblgbwlbezblibljblkbezbezbllblmaoGblnaoGblobeCbeCbeCbeCbbHbbHbbHblpblqbbHbambambambambamblrblsbambltblubltbdEblvblwblxbdEblyblzblAblBblBblCaaaaaaaaaabqaaaaaaaaaaefaaaabqaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaabqabqaefblDblEblFblEblGaXOaaaaaaaaaaXLblHbdLblIblJblKblLblMblJblNbdLbdPaXLaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVbccbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmBbmCbmDbmEbhqbmFbmGbjeabqabqbmHboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbmTabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDbnEbnFbnFbnGbnHbnIbnJaaaaaaaaaabqaaaaaaaaaaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaefblDblEbnKblEbnLaXOaaaaaaaaaaXLbnMbnNbdJbnObnPbnQbnRbnSbnTbdIbrQaXLaXLaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVbccbnWbnXbnYbnZboabobbocbobbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbiUbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWboAbkWbsbboCboDboEboDboFboDboEboDboGbscbkWboAbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpibplbpmbpnbpobnFbnFbppblBblBbpqaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbjRbjRbjObpsaXIaXOaaaaaaaaaaXLaXLblHbdIbdIbdIbptbdIbdIbdIbdIbsebsdbsfaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUblVbccbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMbqNbqObqPbqQbqRbpnbqSbqSbqTbqUbqVbqWbntbntbntafdbqXabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabqYbqZbrabrbbrcbrdbrebrfaXIaXLaXLaXLaXLaXLbrgbrhbrgbrgbribrjbribrkbrkbrlbrmbrnbudaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbrNbehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbsmbsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbwlaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZibsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrdeCaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbtkbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJbtLbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukbuldedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGaxcbuDaoGbuEbuFbuGbnEbuHbuHbuHbuIbuJbqSbqSbuKbuLbuMbuNbuObuPbuQbuRbuSbuTbuTbuUbuVbuWbuWbuWbuXbuWbuWbuWbuWbuWbuWbuXbuWbuWbuWbuWbuWbuWbuXbuWbuYbuZbuTbuTbuTbvabvbbvcbvdbvdbvebvfbvgbvhbvibvjbvkbvlbvmbvnbvobvpbvqbvrbvsbvtbvubvvbbXbbXbvwaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaabccbdRbccbccbccbccbccbccbdRbccaaaaWDbvxbvybvzbfGbvAbvBbvCbvBbvDbfGbvEbvFbvGbvHbvHbvIbvJbvHbvHbvKbvLbvMbvNbvHbvHbvObvHbvHbvHbvPbvQbvRbvRbvSbvTbvUbvVbqcbyobvXbvYbqcbvZbwabwbbwcbwdboEbtQboEbypbywbwhbwibwjbwibwkbyJbyxbAbbyQbAkbwqbhwbwrbwsbwtbwubwvbhwbhwbhwbhybwwbwxbsmbwybwzbwAbsmbwBbwCbwDbwEbwFbwGbwHbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSaoGbsubwTbwUbntbwVbwWbwXbwYbwZbxabxbbxcbxdbqUbxebxfbxgbxhbxiaWCaaaaaabxjbsNabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabxkbxlbsLaaaabqaZhbxmbxnbxobxpbxqbxrbxsbxtbxubxvbxwbxxbxybxzbxAbxBbxCbxDbtfbxEbxFaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccabqaaaabqaaabccbxGbccbxHbxIbfebxJbccbxGbccbccaWDbgVbxKbxLbfGbxMbvBbxNbvBbxObfGbxPbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabxTbxTbxTbybbxTbycbydbxVbyebxTbxTbyfbygbyhbvVbqcbyibyjbykbylbymbynbymbymbwdbAjbAebyqbyqbyqbyrbysbytbyubyvbyqbyqbyqbBWbCcbkWbhwbyybyzbyAbyBbyCbhwbyDbyEbyFbyGbwxbsnbyHbyIbCdbsmbyKbyLbyMbyNbspbspaoGaoGbyOaoGaoGaoGbyPbCeaoGaoGbyRbySaoGbyTbwTbyUbntbjNbjNbjNbjNbyVbjNbjNbyWbyXbyYbntbntbyZbzabzbbzcaaabqYbzdaaaabqaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabxkbxlbsLabqbzebzfbzgbzhbzibzjbrgbzkbzlbzmbznbzobzpbrgbzqbzrbzsbrkbztbzubtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbccbdQbccaWDbccbdRbccbzvbaBbzwbzxbccbdRbccbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbzLbzMbzNbzLbzKbzKbzKbzKbzKbzKbzObzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbCibAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaabxkbBabrbbBbbBcbrebpsaXIaXLbBdbBebBfbBgbBhbBibrgbrgbBjbBkbBlbrkbrkbBmbBnbBoaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbccbdQbccaWDbccbdRbccbzvbaBbzwbzxbccbdRbccbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbzLbzMbzNbzLbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbCibAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaabxkbBabrbbBbbBcbrebpsaXIaXLbBdbBebBfbBgbBhbBibrgbrgbBjbBkbBlbrkbrkbBmbBnbBoaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXbqcbBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCDbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqarBbicaXIaXObCWaXLbCXbCYbCZbDabDbbDcbDdbDebDfbDgbDhbDibbXbbXbDjaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLanHbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcbDRbqcbqcbqcbDSbDTbDUbqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbEwbExbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbETbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhbFdaXOaaaaXLbFebFfbFgbDabFhbFibFjbFkbFlbFmbFnbDaaXLaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccaWDbccbdQbccaWDbccbccbccaWDbccaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbGjbGkbCHbEvbGlbGmbGnbGobGpbGqbEGbySaoGbGrbGsbGtbGubGvbGwbGxbGybGzbCMbGAbGBbGCbGDbETbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhbFdaXOaaaaXLbGMbGNbGObDabGPbGQbGRbGSbGTbGUbGVbDaaXLaaaaaaaUUbjPaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8486,7 +8490,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbUBbUBbccbccbccaWDbccaWDbccaWDaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGathapdatjbUHaqwapfbFuaoXbzKbzKbzLbUIbUJbzLbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbVibVjbVkbVlbNhbVmbhtbVnbbrbOWbVobVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbItbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbVXbVYbVZbOabWabWbbVXaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaabccbWcbfdbccaaaabqaaaaaaaaaabqaaaaaaapfbWdbWebWfbWgbWhbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkauyaoXapdbWlbWmapfbWnbWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWbVobYubXdbXdbXebXfbXgbXhbXibXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRabXubXvbVQbXwbInbSPbXxbRgbXybRibETabqbETbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbXCbKlbXDbXEbXFbKlbXGaXMaaaaaaaZhaXIaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqbccbUBbUBbccabqabqabqabqabqabqabqabqapfbXHavUavUavUbDLathatkaoXaqBayBanHbXIbXJauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbXObXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdbYhbYibYjbNhbYkbYlbYmbYnbSlbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbYxbYybYzbYAbYBbYCbYDccrbQIbEGbEGbEGbEGbEGbYFaoGbYGbUraucasJchGchFbYIasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbMibMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBbicbYQaXLaXLaXLbpubbXbbXbbXbcabbXbbXbbXbDjaXLaXLaXLbnUaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVbYVbYWbYXbYVbYTbYVbYYbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvbZibMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrbhtbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbZAbZBbZCbZDbZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibETabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaaaaaaaaaaaabZOaaaaaaaaaaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVbYVbYWbYXbYVbYTbYVbYYbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbZAbZBbZCbZDbZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibETabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaaaaaaaaaaaabZOaaaaaaaaaaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZPbZPbZQbZRbZSapfbZTapfapfapfaYabZUbZUbZUbZUbZUbZUbZUapdbZVbZWbZXbzKbZYbZZcaacabbHrbWscaccadcaeayBapfcafbzPcagcahcaicajcakcakcakcalcamcancaocakcapcaqcaicaicarcascarcarcatcarcaucavcavcawcaxcaycazcaAcaBcakcakcakcaCcaDcavcaEbbrcaFcaGcaHcaIcaJcaKcaLcaMcaNcaKcaOcaPcaQcaRbQIcaScaTcaUcaVcaWcaXcaYbZGcaZaoGaoGaoGaoGaoGcmHbXtbCMbCMbCMcbcbJWbNRcbdcbecbfbKacbgcbhcbibVScbjbPCbItbIubIvcbkcblcblbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIbMnaUUaUUaUUaUUaUUaUUbZOaUUaUUaUUaUUaUUaUUbjPaXIaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZScbmcbncbobZSapdcbpbPQcbqapfcbrbZUcbscbtcbucbvcbwbZUapdaoXbZWaoXbzKbzKbzKbzKbzKbzKbzKbzKbzKaxqaoXapfcbxbzPcbycbzbekbekbekbekbekbekbenbekcbAcbBcbCbembekbekbekbvTcbDcbEcbFbekbekbekbekbekcbGcbHbekbekbenbekbekbekbekcbIbekcbAcbJcbKcbLcbMcbNcbOcbNcbPcbPcbQcbRcbScbPcbOcbTbQIbQIbQIbQIcbUcbVasIarrcbWcbXasIcbXcbYcbZaoGayoaoGbCMccaccbcccccdcceccfccfccfbMcbGGbGGbGGbRgccgbRibETabqbETcchcciccjbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhcckaWxaWxaWxaWxaWxaWxaWxcclaWxaWxaWxaWxaWxaWxaWxccmaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbZSccnccoccpbZSapdccqcmIapfapfccsbZUcctccuccvccwccxbZUapdapdccybYVbYTbYVbYYbYVcczccAccAccAccAccBbcGccCccDccEccFccGccHccIccJccGccGccGccKccGbdabcXccLbcYbcXbcXbcXccMccNbcZbcYbcXbcXbcXbdbccOccPccQccQccQccRccQccQccQccSccTccOccUccVccWccXccYccZcdacdbcdccddcdecdfcdgcdhcdecdibZvcdjcdkbZvcdlcbVasIasIasIasIasIcdmcdncdocdpcdqcdrcdscdtcducdvcdwcdxbGGbGGbGGbGGbGGbInbGGbRgcdybSUbMibMjbMkcdzcblcdAbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaaaXKaXKaXKaXKaXKaXKaXKaXKcdBaXKaXKaXKaXKaXKaXKaXKaXKaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
index 231fbd041e6..c9582434115 100644
--- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
@@ -67,7 +67,7 @@
"bo" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bp" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/device/radio/off{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/off{pixel_x = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"br" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.
Log 2:
Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.
Log 3:
Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things."; name = "Personal Log"},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"br" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.
Log 2:
Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before – They don't know we're here, that engineer was too drunk to recognise his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.
Log 3:
Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things."; name = "Personal Log"},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bs" = (/obj/machinery/door/window{dir = 1; name = "Gateway Access"; req_access_txt = "150"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bt" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"bu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
@@ -170,7 +170,7 @@
"dn" = (/turf/simulated/floor/plasteel{carbon_dioxide = 48.7; dir = 4; heat_capacity = 1e+006; icon_state = "warningcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"do" = (/turf/simulated/floor/plasteel{broken = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "damaged1"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-damaged1 (WEST)"; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dp" = (/obj/structure/closet/crate,/obj/item/weapon/storage/bag/ore,/obj/structure/alien/weeds,/obj/item/device/mining_scanner,/obj/item/weapon/shovel,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating{broken = 1; carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "platingdmg3"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-platingdmg3"; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2:
Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.
Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2:
Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us.
Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dr" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/suppressor,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"ds" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dt" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/weapon/spacecash/c50,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
@@ -303,7 +303,7 @@
"fQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"fT" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One - 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.
Entry Two - 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.
Entry Three - 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.
Entry Four - 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.
Entry Five - 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.
Entry Six - 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log - Kenneth Cunningham"},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"fT" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One — 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.
Entry Two — 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.
Entry Three — 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.
Entry Four — 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.
Entry Five — 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.
Entry Six — 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log — Kenneth Cunningham"},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fU" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/clothing/suit/armor/vest,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/storage/belt/security,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = -2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fV" = (/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = 32; serial_number = 21; subtype = 1},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"fW" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -335,7 +335,7 @@
"gw" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 4; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds,/obj/structure/alien/resin/wall,/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gx" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; dir = 2; icon_state = "pipe-c"; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gy" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high,/obj/item/device/radio/off,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gz" = (/obj/structure/table,/obj/item/weapon/paper{info = "Ivan Volodin Stories:
Entry Won - 28/05/2554:
Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.
Entry Too - 05/06/2554:
I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.
Entry Tree - 08/06/2554:
Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.
Entry Fore - 12/06/2554:
Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?
Entry Fiv - 15/06/2554:
I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.
Entry Sex: 19/06/2554:
Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."; name = "Personal Log - Ivan Volodin"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gz" = (/obj/structure/table,/obj/item/weapon/paper{info = "Ivan Volodin Stories:
Entry Won — 28/05/2554:
Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.
Entry Too — 05/06/2554:
I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.
Entry Tree — 08/06/2554:
Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.
Entry Fore — 12/06/2554:
Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?
Entry Fiv — 15/06/2554:
I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.
Entry Sex: 19/06/2554:
Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end."; name = "Personal Log — Ivan Volodin"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gA" = (/obj/machinery/light/small,/obj/structure/closet/toolcloset,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gB" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gC" = (/obj/machinery/computer/monitor,/obj/structure/cable,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -346,7 +346,7 @@
"gH" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 4; locked = 0; name = "Worn-out APC"; pixel_x = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gI" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gJ" = (/obj/structure/table,/obj/machinery/light/small{active_power_usage = 0; dir = 4; icon_state = "bulb-broken"; status = 2},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gK" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554
Report:
As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.
The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.
The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.
It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor."; name = "Larva Xenomorph Social Interactions & Capturing Procedure"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554
Report:
I have studied many interesting and diverse life-forms as a xenobiologist ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.
The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not that much slower than it used to be.
After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.
Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours."; name = "Queen Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape however by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.
As for its physiology, the creature has an elongated head with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has some what of an inner mouth capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.
Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject, would they?"; name = "Adult Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse and seemed to get larger very suddenly, this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is or will become as it matures fully.
It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology."; name = "Larva Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.
When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off dead and curled its legs up like a spider moments after it had finished with the monkey's body.
While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours until we were horrified to discover it screaming out in pain as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning."; name = "'Facehugger' Xenomorph Physiology & Behavior Observation"},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gK" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light/small{active_power_usage = 0; dir = 8; icon_state = "bulb-broken"; status = 2},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554
Report:
As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.
The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans, they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive nor violent when young, before molting to adulthood.
The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers, that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.
It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor."; name = "Larva Xenomorph Social Interactions & Capturing Procedure"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554
Report:
I have studied many interesting and diverse life-forms as a xenobiologist, ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall, and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.
The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed that the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not much slower than it used to be.
After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest, that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.
Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours."; name = "Queen Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape, however, by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.
As for its physiology, the creature has an elongated head, with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has somewhat of an inner mouth, capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.
Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject – would they?"; name = "Adult Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse, and seemed to get larger very suddenly; this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously-thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is, or will become, as it matures fully.
It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology."; name = "Larva Xenomorph Physiology & Behavior Observation"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554
Report:
The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs, leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.
When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off, dead, and curled its legs up like a spider moments after it had finished with the monkey's body.
While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours, until we were horrified to discover it screaming out in pain, as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning."; name = "'Facehugger' Xenomorph Physiology & Behavior Observation"},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gL" = (/obj/structure/table/reinforced,/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gM" = (/obj/structure/cable,/obj/machinery/door/poddoor/preopen{desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id_tag = "Awaylab"; name = "Acid-Proof containment chamber blast door"; unacidable = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gN" = (/obj/structure/disposalpipe/segment{desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; name = "Acid-Proof disposal pipe"; unacidable = 1},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/engine,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -359,7 +359,7 @@
"gU" = (/obj/machinery/optable,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gV" = (/obj/machinery/computer/operating,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gW" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"gX" = (/obj/structure/filingcabinet/filingcabinet,/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 17/06/2554
Report:
Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.
The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?"; name = "The Hivemind Hypothesis"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 08/06/2554
Report:
The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.
The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species."; name = "A Preliminary Study of Alien Behavior"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 06/06/2554
Report:
While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.
Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.
Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.
Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role."; name = "The Xenomorph 'Castes'"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 04/06/2554
Report:
After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.
The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.
We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans."; name = "Larva Xenomorph Autopsy Report"},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"gX" = (/obj/structure/filingcabinet/filingcabinet,/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 17/06/2554
Report:
Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us, instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.
The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?"; name = "The Hivemind Hypothesis"},/obj/item/weapon/paper{info = "Researcher: Dr. Sakuma Sano
Date: 08/06/2554
Report:
The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.
The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species."; name = "A Preliminary Study of Alien Behavior"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 06/06/2554
Report:
While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.
Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.
Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.
Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role."; name = "The Xenomorph 'Castes'"},/obj/item/weapon/paper{info = "Researcher: Dr. Mark Douglas
Date: 04/06/2554
Report:
After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.
The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.
We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans."; name = "Larva Xenomorph Autopsy Report"},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gY" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"gZ" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ha" = (/obj/machinery/shieldwallgen{locked = 0; req_access = null},/obj/structure/cable,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -381,7 +381,7 @@
"hq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hr" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "201"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hs" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ht" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/item/weapon/paper{info = "Personal Log for Research Director Gerald Rosswell
Entry One - 17/05/2554:
You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.
Entry Two - 25/05/2554:
Well, we all expected it at the outpost, CentComm has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.
Entry Three - 27/05/2554:
The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.
Entry Four - 06/06/2554:
My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.
Entry Five - 10/06/2554:
Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.
Entry Six - 17/06/2554:
The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information."; name = "Personal Log - Gerald Rosswell"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ht" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/item/weapon/paper{info = "Personal Log for Research Director Gerald Rosswell
Entry One — 17/05/2554:
You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of its outposts and thought it would be a cakewalk; there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that I and my science staff would have to pull double duty as medical staff, and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3pt. fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.
Entry Two — 25/05/2554:
Well, we all expected it at the outpost: CentComm has decided to completely change what research we are doing. They've decided that we should be researching the species known as 'xenomorphs'. They announced this change 4 days ago, and along with it, sadly, the termination of our current science staff, barring me. Not to mention the constant noise made by the construction detail they sent, to staple on a xenobiology lab, ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse, our current security guard actually died of a heart attack today. Just goes to show, that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.
Entry Three — 27/05/2554:
The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station, he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.
Entry Four — 06/06/2554:
My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field: a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under-equipped and under-staffed, we are inevitably going to be destroyed, unless we get the equipment and staff we need.
Entry Five — 10/06/2554:
Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap, with naught but a force field keeping those xenomorphs in.
Entry Six — 17/06/2554:
The reactions from the specimens today have shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind; while nothing is certain, this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, testing this hypothesis would require many complicated procedures which we will not be able to undertake. Although we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resubmit my request for additional security measures, along with this newfound information."; name = "Personal Log — Gerald Rosswell"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hu" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hv" = (/obj/structure/grille,/obj/machinery/door/poddoor{id_tag = "AwayRD"; layer = 2.9; name = "privacy shutter"},/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hw" = (/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
@@ -434,7 +434,7 @@
"ir" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"is" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"it" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"iu" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/pen,/obj/item/weapon/paper/crumpled{info = "19 06 2554
I fucking knew it. There was a major breach, that idiotic force field failed and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks."; name = "Hastily Written Note"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"iu" = (/obj/item/weapon/storage/secure/safe{pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/pen,/obj/item/weapon/paper/crumpled{info = "19 06 2554
I fucking knew it. There was a major breach, that idiotic force field failed, and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks."; name = "Hastily Written Note"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"iv" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (EAST)"},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"iw" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ix" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -662,7 +662,7 @@
"mL" = (/obj/machinery/door/airlock/shuttle{name = "Shuttle Airlock"},/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mM" = (/obj/machinery/door/airlock/external,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mN" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mO" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/noticeboard{dir = 8; pixel_x = 32; pixel_y = 0},/obj/item/weapon/paper{info = "
Welcome to Moon Outpost 19! Property of Nanotrasen Inc.
Staff Roster:
-Dr. Gerald Rosswell: Research Director & Acting Captain
-Dr. Sakuma Sano: Xenobiologist
-Dr. Mark Douglas: Xenobiologist
-Kenneth Cunningham: Security Officer-Ivan Volodin: Engineer
-Mathias Kuester: Bartender
-Sven Edling: Chef
-Steve: Assistant
Please enjoy your stay, and report any abnormalities to an officer."; name = "Welcome Notice"},/obj/machinery/camera{c_tag = "Arrivals South"; dir = 8; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mO" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/noticeboard{dir = 8; pixel_x = 32; pixel_y = 0},/obj/item/weapon/paper{info = "Welcome to Moon Outpost 19! Property of Nanotrasen Inc.
Staff Roster:
- Dr. Gerald Rosswell: Research Director & Acting Captain
- Dr. Sakuma Sano: Xenobiologist
- Dr. Mark Douglas: Xenobiologist
- Kenneth Cunningham: Security Officer
- Ivan Volodin: Engineer
- Mathias Kuester: Bartender
- Sven Edling: Chef
- Steve: Assistant
Please enjoy your stay, and report any abnormalities to an officer."; name = "Welcome Notice"},/obj/machinery/camera{c_tag = "Arrivals South"; dir = 8; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warning"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mP" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mQ" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 9; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel{carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mR" = (/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plasteel{burnt = 1; carbon_dioxide = 48.7; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; nitrogen = 13.2; oxygen = 32.4; tag = "icon-floorscorched2 (WEST)"; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index ba313d9e2e6..a43e0d5aada 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -314,7 +314,7 @@
"agb" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
"agc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/securehallway)
"agd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/security/podbay)
-"age" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"age" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agh" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Security Podbay APC"; pixel_x = 25},/obj/item/device/spacepod_equipment/weaponry/laser,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
@@ -4239,7 +4239,7 @@
"bDA" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/research)
"bDB" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/shuttle/plating,/area/shuttle/research)
"bDC" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops)
-"bDD" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Shuttle"; dir = 2; network = list("ERT","CentCom")},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
+"bDD" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Shuttle"; dir = 2; network = list("ERT","CentComm")},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops)
"bDE" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bDF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bDG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 8852503d535..eba50f4ebb5 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -383,7 +383,7 @@
"in" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"io" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station)
"ip" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station)
-"iq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station)
+"iq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station)
"ir" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership)
"is" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership)
"it" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership)
@@ -632,7 +632,7 @@
"sY" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"sZ" = (/obj/structure/table,/obj/machinery/processor{pixel_x = 0; pixel_y = 10},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"ta" = (/obj/machinery/mech_bay_recharge_port/upgraded,/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
-"tb" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Assault Armor North"; dir = 2; network = list("ERT","CentCom")},/obj/mecha/combat/marauder/seraph/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
+"tb" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor North"; dir = 2; network = list("ERT","CentComm")},/obj/mecha/combat/marauder/seraph/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"tc" = (/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops)
"td" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"te" = (/obj/machinery/recharge_station/upgraded,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
@@ -680,7 +680,7 @@
"tU" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control)
"tV" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
"tW" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
-"tX" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Assault Armor South"; dir = 1; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
+"tX" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
"tY" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"tZ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control)
"ua" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT"; name = "Assault Armor"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
@@ -691,10 +691,10 @@
"uf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"ug" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uh" = (/obj/structure/reagent_dispensers/water_cooler,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"ui" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/machinery/camera{c_tag = "CentCom Special Ops. Ready Room North"; dir = 2; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"ui" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room North"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uj" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uk" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"ul" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/obj/machinery/camera{c_tag = "CentCom Special Ops. Starting Room"; dir = 2; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"ul" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Starting Room"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"um" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"un" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
"uo" = (/turf/unsimulated/floor{icon_state = "asteroid6"; name = "sand"},/area/centcom/specops)
@@ -727,7 +727,7 @@
"uP" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "nukecode"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uQ" = (/obj/structure/table/reinforced,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uR" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"uS" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"uS" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uT" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
"uU" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"uV" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -746,14 +746,14 @@
"vi" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vj" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vk" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
-"vl" = (/obj/effect/decal/cleanable/vomit{name = "urine"},/obj/machinery/camera{c_tag = "CentCom Special Ops. Bathroom"; dir = 2; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
+"vl" = (/obj/effect/decal/cleanable/vomit{name = "urine"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vm" = (/obj/structure/table/reinforced,/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vn" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/centcom/specops)
"vo" = (/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/specops)
"vp" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/specops)
"vq" = (/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/specops)
"vr" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control)
-"vs" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentCom","Thunderdome")},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
+"vs" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentComm","Thunderdome")},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vt" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vu" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vv" = (/obj/machinery/computer/robotics,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
@@ -768,7 +768,7 @@
"vF" = (/obj/machinery/door/airlock/centcom{name = "Telecommunications"; opacity = 1; req_access_txt = "107"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"vG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
"vH" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
-"vI" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Ready Room South"; dir = 1; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"vI" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vJ" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vL" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vM" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_y = 16; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_y = -4; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_y = 6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
@@ -1070,7 +1070,7 @@
"Gc" = (/obj/machinery/door/airlock/hatch{desc = "You've heard rumors of the horrors that go on within this lab."; name = "Laboratory (DANGER!)"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Gd" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Ge" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"Gf" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentCom","Thunderdome")},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"Gf" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentComm","Thunderdome")},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Gg" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Gh" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Gi" = (/obj/structure/table,/obj/item/weapon/card/id/silver{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id/captains_spare,/obj/item/weapon/card/id/lifetime{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index e6731d4ea17..3366777a081 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -12,6 +12,7 @@
use_power = 1
can_unwrench = 1
+ var/open = 0
var/area/initial_loc
var/area_uid
@@ -339,6 +340,29 @@
else
user << "You need more welding fuel to complete this task."
return 1
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(!welded)
+ if(open)
+ user << " Now closing the vent."
+ if (do_after(user, 20, target = src))
+ open = 0
+ user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
+ else
+ user << " Now opening the vent."
+ if (do_after(user, 20, target = src))
+ open = 1
+ user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
+ return
+ if(istype(W, /obj/item/weapon/paper))
+ if(!welded)
+ if(open)
+ user.drop_item(W)
+ W.forceMove(src)
+ if(!open)
+ user << "You can't shove that down there when it is closed"
+ else
+ user << "The vent is welded."
+ return
if(istype(W, /obj/item/device/multitool))
update_multitool_menu(user)
return 1
@@ -349,6 +373,12 @@
return ..()
+/obj/machinery/atmospherics/unary/vent_pump/attack_hand()
+ if(!welded)
+ if(open)
+ for(var/obj/item/weapon/W in src)
+ W.forceMove(get_turf(src))
+
/obj/machinery/atmospherics/unary/vent_pump/examine(mob/user)
..(user)
diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index f82cd83d3a6..afbeb0a0e45 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -49,6 +49,7 @@
layer = TURF_LAYER
blend_mode = BLEND_ADD
+ light_range = 3
var/volume = 125
var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
@@ -57,8 +58,6 @@
/obj/effect/hotspot/New()
..()
- color = heat2color(temperature)
- set_light(3, 1, color)
air_master.hotspots += src
perform_exposure()
dir = pick(cardinal)
@@ -88,10 +87,8 @@
if(item && item != src) // It's possible that the item is deleted in temperature_expose
item.fire_act(null, temperature, volume)
-// animate(src, color = heat2color(temperature), 5)
color = heat2color(temperature)
set_light(l_color = color)
-
return 0
@@ -122,7 +119,6 @@
if(bypassing)
icon_state = "3"
- set_light(7,3)
location.burn_tile()
//Possible spread due to radiated heat
@@ -138,10 +134,8 @@
else
if(volume > CELL_VOLUME*0.4)
icon_state = "2"
- set_light(5, 2)
else
icon_state = "1"
- set_light(3, 1)
if(temperature > location.max_fire_temperature_sustained)
location.max_fire_temperature_sustained = temperature
@@ -156,9 +150,9 @@
// Garbage collect itself by nulling reference to it
/obj/effect/hotspot/Destroy()
+ set_light(0)
air_master.hotspots -= src
DestroyTurf()
- set_light(0)
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
if(T.active_hotspot == src)
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 5189b24b551..70c597c2d7b 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -260,7 +260,7 @@ var/syndicate_code_response//Code response for traitors.
if(2)
syndicate_code_phrase += pick("How do I get to","How do I find","Where is","Where do I find")
syndicate_code_phrase += " "
- syndicate_code_phrase += pick("Escape","Engineering","Atmos","the bridge","the brig","Clown Planet","CentCom","the library","the chapel","a bathroom","Med Bay","Tool Storage","the escape shuttle","Robotics","a locker room","the living quarters","the gym","the autolathe","QM","the bar","the theater","the derelict")
+ syndicate_code_phrase += pick("Escape","Engineering","Atmos","the bridge","the brig","Clown Planet","CentComm","the library","the chapel","a bathroom","Med Bay","Tool Storage","the escape shuttle","Robotics","a locker room","the living quarters","the gym","the autolathe","QM","the bar","the theater","the derelict")
syndicate_code_phrase += "?"
if(3)
if(prob(70))
@@ -287,7 +287,7 @@ var/syndicate_code_response//Code response for traitors.
if(prob(80))
syndicate_code_response += pick("Try looking for them near","I they ran off to","Yes. I saw them near","Nope. I'm heading to","Try searching")
syndicate_code_response += " "
- syndicate_code_response += pick("Escape","Engineering","Atmos","the bridge","the brig","Clown Planet","CentCom","the library","the chapel","a bathroom","Med Bay","Tool Storage","the escape shuttle","Robotics","a locker room","the living quarters","the gym","the autolathe","QM","the bar","the theater","the derelict")
+ syndicate_code_response += pick("Escape","Engineering","Atmos","the bridge","the brig","Clown Planet","CentComm","the library","the chapel","a bathroom","Med Bay","Tool Storage","the escape shuttle","Robotics","a locker room","the living quarters","the gym","the autolathe","QM","the bar","the theater","the derelict")
syndicate_code_response += "."
else if(prob(60))
syndicate_code_response += pick("No. I'm busy, sorry.","I don't have the time.","Not sure, maybe?","There is no time.")
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d6b0cf70932..773572cc0fc 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -272,108 +272,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
user << "[target] is empty!"
return
-//This will update a mob's name, real_name, mind.name, data_core records, pda and id
-//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn
-/mob/proc/fully_replace_character_name(var/oldname,var/newname)
- if(!newname) return 0
- real_name = newname
- name = newname
- if(mind)
- mind.name = newname
- if(dna)
- dna.real_name = real_name
-
- if(isrobot(src))
- var/mob/living/silicon/robot/R = src
- if(oldname != real_name)
- R.notify_ai(3, oldname, newname)
- R.custom_name = newname
- R.updatename()
- if(oldname)
- //update the datacore records! This is goig to be a bit costly.
- for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
- for(var/datum/data/record/R in L)
- if(R.fields["name"] == oldname)
- R.fields["name"] = newname
- break
-
- //update our pda and id if we have them on our person
- var/list/searching = GetAllContents(searchDepth = 3)
- var/search_id = 1
- var/search_pda = 1
-
- for(var/A in searching)
- if( search_id && istype(A,/obj/item/weapon/card/id) )
- var/obj/item/weapon/card/id/ID = A
- if(ID.registered_name == oldname)
- ID.registered_name = newname
- ID.name = "[newname]'s ID Card ([ID.assignment])"
- if(!search_pda) break
- search_id = 0
-
- else if( search_pda && istype(A,/obj/item/device/pda) )
- var/obj/item/device/pda/PDA = A
- if(PDA.owner == oldname)
- PDA.owner = newname
- PDA.name = "PDA-[newname] ([PDA.ownjob])"
- if(!search_id) break
- search_pda = 0
-
- //Fixes renames not being reflected in objective text
- var/list/O = subtypesof(/datum/objective)
- var/length
- var/pos
- for(var/datum/objective/objective in O)
- if(objective.target != mind) continue
- length = lentext(oldname)
- pos = findtextEx(objective.explanation_text, oldname)
- objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
- return 1
-
-
-
-//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
-//Last modified by Carn
-/mob/proc/rename_self(var/role, var/allow_numbers=0)
- spawn(0)
- var/oldname = real_name
-
- var/time_passed = world.time
- var/newname
-
- for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
- newname = input(src,"You are a [role]. Would you like to change your name to something else?", "Name change",oldname) as text
- if((world.time-time_passed)>300)
- return //took too long
- newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
-
- for(var/mob/living/M in player_list)
- if(M == src)
- continue
- if(!newname || M.real_name == newname)
- newname = null
- break
- if(newname)
- break //That's a suitable name!
- src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
-
- if(!newname) //we'll stick with the oldname then
- return
-
- if(cmptext("ai",role))
- if(isAI(src))
- var/mob/living/silicon/ai/A = src
- oldname = null//don't bother with the records update crap
- //world << "[newname] is the AI!"
- //world << sound('sound/AI/newAI.ogg')
- // Set eyeobj name
- A.SetName(newname)
-
-
- fully_replace_character_name(oldname,newname)
-
-
-
//Picks a string of symbols to display as the law number for hacked or ion laws
/proc/ionnum()
return "[pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]"
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index d6fc14b4f3f..52d05ac6d65 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -14,7 +14,7 @@ var/list/heartstopper = list("capulettium", "capulettium_plus") //this stops the
var/list/cheartstopper = list() //this stops the heart when overdose is met -- c = conditional
var/list/restricted_camera_networks = list( //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
- "CentCom",
+ "CentComm",
"ERT",
"NukeOps",
"Thunderdome",
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index ee2d7c56cf7..93e6aed1ec2 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -61,6 +61,8 @@
// M.lastattacker = null
/////////////////////////
+ if(istype(M, /mob/living/simple_animal))
+ return 0 // No sanic-speed double-attacks for you - simple mobs will handle being attacked on their own
var/power = force
if(!istype(M, /mob/living/carbon/human))
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index bc2d1e737ba..68cc455b9df 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -449,7 +449,7 @@ client
if( !new_name || !M ) return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
- M.fully_replace_character_name(M.real_name,new_name)
+ M.rename_character(M.real_name, new_name)
href_list["datumrefresh"] = href_list["rename"]
else if(href_list["varnameedit"] && href_list["datumedit"])
diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm
index 8bf993f43eb..9d8f68fd81a 100644
--- a/code/game/dna/dna2_domutcheck.dm
+++ b/code/game/dna/dna2_domutcheck.dm
@@ -38,14 +38,12 @@
gene.activate(M,connected,flags)
if(M)
M.active_genes |= gene.type
- M.update_icon = 1
// If Gene is NOT active:
else
// testing("[gene.name] deactivated!")
gene.deactivate(M,connected,flags)
if(M)
M.active_genes -= gene.type
- M.update_icon = 1
*/
// Use this to force a mut check on a single gene!
@@ -97,11 +95,9 @@
gene.activate(M,connected,flags)
if(M)
M.active_genes |= gene.type
- M.update_icon = 1
// If Gene is NOT active:
else
//testing("[gene.name] deactivated!")
gene.deactivate(M,connected,flags)
if(M)
M.active_genes -= gene.type
- M.update_icon = 1
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 3e3a3d4287a..570fada2073 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -36,6 +36,18 @@
ser["type"] = "se"
return ser
+/datum/dna2/record/proc/copy()
+ var/datum/dna2/record/newrecord = new /datum/dna2/record
+ newrecord.dna = dna.Clone()
+ newrecord.types = types
+ newrecord.name = name
+ newrecord.mind = mind
+ newrecord.ckey = ckey
+ newrecord.languages = languages
+ newrecord.implant = implant
+ return newrecord
+
+
/////////////////////////// DNA MACHINES
/obj/machinery/dna_scannernew
name = "\improper DNA modifier"
@@ -929,7 +941,7 @@
var/blk = input(usr,"Select Block","Block") in all_dna_blocks(selectedbuf)
success = setInjectorBlock(I,blk,buf)
else
- I.buf = buf
+ I.buf = buf.copy()
waiting_for_user_input=0
if(success)
I.forceMove(src.loc)
@@ -944,7 +956,7 @@
//src.temphtml = "Invalid disk. Please try again."
return 0
- src.buffers[bufferId]=src.disk.buf
+ src.buffers[bufferId]=src.disk.buf.copy()
//src.temphtml = "Data loaded."
return 1
@@ -955,7 +967,7 @@
var/datum/dna2/record/buf = src.buffers[bufferId]
- src.disk.buf = buf
+ src.disk.buf = buf.copy()
src.disk.name = "data disk - '[buf.dna.real_name]'"
//src.temphtml = "Data saved."
return 1
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index e5ebf16975c..04fa6d5f524 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -348,8 +348,7 @@
L.adjust_fire_stacks(0.5)
L.visible_message("\red [L.name] suddenly bursts into flames!")
- L.on_fire = 1
- L.update_icon = 1
+ L.IgniteMob()
playsound(L.loc, 'sound/effects/bamf.ogg', 50, 0)
////////////////////////////////////////////////////////////////////////
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index d96e3376b53..85d2228cda7 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -55,7 +55,7 @@
/datum/game_mode/cult/announce()
world << "The current game mode is - Cult!"
- world << "Some crewmembers are attempting to start a cult!
\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentCom-allowed faith they had."
+ world << "Some crewmembers are attempting to start a cult!
\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had."
/datum/game_mode/cult/pre_setup()
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index dfe8d1838e0..eea1bfcc586 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -58,6 +58,7 @@
if(unreveal_time && world.time >= unreveal_time)
unreveal_time = 0
revealed = 0
+ incorporeal_move = 3
invisibility = INVISIBILITY_REVENANT
src << "You are once more concealed."
if(unstun_time && world.time >= unstun_time)
@@ -315,6 +316,7 @@
return
revealed = 1
invisibility = 0
+ incorporeal_move = 0
if(!unreveal_time)
src << "You have been revealed!"
unreveal_time = world.time + time
diff --git a/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm b/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm
index 566b34a8d0e..62cfc678d17 100644
--- a/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm
+++ b/code/game/gamemodes/mutiny/directives/research_to_ripleys_directive.dm
@@ -41,7 +41,7 @@ datum/directive/research_to_ripleys/initialize()
special_orders = list(
"Reassign all research personnel, excluding the Research Director, to Shaft Miner.",
- "Deliver [MATERIALS_REQUIRED] sheets of metal or minerals via the supply shuttle to CentCom.")
+ "Deliver [MATERIALS_REQUIRED] sheets of metal or minerals via the supply shuttle to CentComm.")
datum/directive/research_to_ripleys/directives_complete()
if (materials_shipped < MATERIALS_REQUIRED) return 0
diff --git a/code/game/gamemodes/mutiny/emergency_authentication_device.dm b/code/game/gamemodes/mutiny/emergency_authentication_device.dm
index 061e3c85cc5..2a48ac8c3b7 100644
--- a/code/game/gamemodes/mutiny/emergency_authentication_device.dm
+++ b/code/game/gamemodes/mutiny/emergency_authentication_device.dm
@@ -49,7 +49,7 @@
return
if(!mode.current_directive.directives_complete())
- state("Command aborted. Communication with CentCom is prohibited until Directive X has been completed.")
+ state("Command aborted. Communication with CentComm is prohibited until Directive X has been completed.")
return
check_key_existence()
@@ -81,7 +81,7 @@
return
if(!mode.current_directive.directives_complete())
- state({"Command aborted. Communication with CentCom is prohibited until Directive X has been completed."})
+ state({"Command aborted. Communication with CentComm is prohibited until Directive X has been completed."})
return
check_key_existence()
@@ -92,7 +92,7 @@
state("Key received. Thank you, Captain [mode.head_loyalist].")
spawn(5)
- state(secondary_key ? "Your keys have been authenticated. Communication with CentCom is now authorized." : "Please insert the Emergency Secondary Authentication Key now.")
+ state(secondary_key ? "Your keys have been authenticated. Communication with CentComm is now authorized." : "Please insert the Emergency Secondary Authentication Key now.")
return
if(istype(O, /obj/item/weapon/mutiny/auth_key/secondary) && !secondary_key)
@@ -102,10 +102,10 @@
state("Key received. Thank you, Secondary Authenticator [mode.head_mutineer].")
spawn(5)
- state(captains_key ? "Your keys have been authenticated. Communication with CentCom is now authorized." : "Please insert the Captain's Authentication Key now.")
+ state(captains_key ? "Your keys have been authenticated. Communication with CentComm is now authorized." : "Please insert the Captain's Authentication Key now.")
return
..()
/obj/machinery/emergency_authentication_device/examine(mob/user)
- user << {"This is a specialized communications device that is able to instantly send a message to Nanotrasen High Command via quantum entanglement with a sister device at CentCom.
+ user << {"This is a specialized communications device that is able to instantly send a message to Nanotrasen High Command via quantum entanglement with a sister device at CentComm.
The EAD's status is [get_status()]."}
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 9fe84dba496..abcded54f1f 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -244,7 +244,7 @@
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/jacket(H), slot_wear_suit)
+ H.equip_or_collect(new /obj/item/clothing/suit/jacket/pilot(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 59e6e6db8eb..147901907bd 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -176,7 +176,7 @@
else
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai ( loc, laws, brain )
if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
- A.rename_self("ai", 1)
+ A.rename_self("AI", 1)
feedback_inc("cyborg_ais_created",1)
qdel(src)
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 07fce5f703b..c80298283bc 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -66,7 +66,7 @@
name = "Circuit board (ID Computer)"
build_path = /obj/machinery/computer/card
/obj/item/weapon/circuitboard/card/centcom
- name = "Circuit board (CentCom ID Computer)"
+ name = "Circuit board (CentComm ID Computer)"
build_path = /obj/machinery/computer/card/centcom
/obj/item/weapon/circuitboard/teleporter
name = "Circuit board (Teleporter Console)"
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 1e6c8c2f5a6..bcbafc5ffe5 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -41,7 +41,7 @@
networks["Telepad"] = list(access_rd,access_hos,access_captain)
networks["TestChamber"] = list(access_rd,access_hos,access_captain)
networks["ERT"] = list(access_cent_specops_commander,access_cent_commander)
- networks["CentCom"] = list(access_cent_security,access_cent_commander)
+ networks["CentComm"] = list(access_cent_security,access_cent_commander)
networks["Thunderdome"] = list(access_cent_thunder,access_cent_commander)
..()
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 92c642a3495..165e30b4ebb 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -431,6 +431,6 @@ var/time_last_changed_position = 0
return 1
/obj/machinery/computer/card/centcom
- name = "\improper CentCom identification computer"
+ name = "\improper CentComm identification computer"
circuit = /obj/item/weapon/circuitboard/card/centcom
req_access = list(access_cent_commander)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index af9519dddc9..411673628cc 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -262,7 +262,7 @@
nanomanager.update_uis(src)
return
- src.active_record = src.diskette.buf
+ src.active_record = src.diskette.buf.copy()
src.temp = "Load successful."
@@ -278,7 +278,7 @@
return
// DNA2 makes things a little simpler.
- src.diskette.buf=src.active_record
+ src.diskette.buf=src.active_record.copy()
src.diskette.buf.types=0
switch(href_list["save_disk"]) //Save as Ui/Ui+Ue/Se
if("ui")
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index c482eac5412..83e23606fcc 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -838,11 +838,13 @@
range = MELEE
var/datum/global_iterator/pr_mech_generator
var/coeff = 100
- var/obj/item/stack/sheet/fuel
+ var/fuel_type = MAT_PLASMA
var/max_fuel = 150000
- var/fuel_per_cycle_idle = 25
- var/fuel_per_cycle_active = 200
- var/power_per_cycle = 20
+ var/fuel_name = "plasma" // Our fuel name as a string
+ var/fuel_amount = 0
+ var/fuel_per_cycle_idle = 10
+ var/fuel_per_cycle_active = 100
+ var/power_per_cycle = 30
reliability = 1000
New()
@@ -851,8 +853,7 @@
return
proc/init()
- fuel = new /obj/item/stack/sheet/mineral/plasma(src)
- fuel.amount = 0
+ fuel_amount = 0
pr_mech_generator = new /datum/global_iterator/mecha_generator(list(src),0)
pr_mech_generator.set_delay(equip_cooldown)
return
@@ -877,7 +878,7 @@
get_equip_info()
var/output = ..()
if(output)
- return "[output] \[[fuel]: [round(fuel.amount*fuel.perunit,0.1)] cm3\] - [pr_mech_generator.active()?"Dea":"A"]ctivate"
+ return "[output] \[[fuel_name]: [round(fuel_amount,0.1)] cm3\] - [pr_mech_generator.active()?"Dea":"A"]ctivate"
return
action(target)
@@ -885,36 +886,55 @@
var/result = load_fuel(target)
var/message
if(isnull(result))
- message = "[fuel] traces in target minimal. [target] cannot be used as fuel."
+ message = "[fuel_name] traces in target minimal. [target] cannot be used as fuel."
else if(!result)
message = "Unit is full."
else
- message = "[result] unit\s of [fuel] successfully loaded."
+ message = "[result] unit\s of [fuel_name] successfully loaded."
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
occupant_message(message)
return
- proc/load_fuel(var/obj/item/stack/sheet/P)
- if(P.type == fuel.type && P.amount)
- var/to_load = max(max_fuel - fuel.amount*fuel.perunit,0)
- if(to_load)
- var/units = min(max(round(to_load / P.perunit),1),P.amount)
- if(units)
- fuel.amount += units
- P.use(units)
- return units
- else
- return 0
+ proc/load_fuel(var/obj/item/I)
+ if(istype(I) && (fuel_type in I.materials))
+ if(istype(I, /obj/item/stack/sheet))
+ var/obj/item/stack/sheet/P = I
+ var/to_load = max(max_fuel - P.amount*P.perunit,0)
+ if(to_load)
+ var/units = min(max(round(to_load / P.perunit),1),P.amount)
+ if(units)
+ var/added_fuel = units * P.perunit
+ fuel_amount += added_fuel
+ P.use(units)
+ return added_fuel
+ else
+ return 0
+ else // Some other object containing our fuel's type, so we just eat it (ores mainly)
+ var/to_load = max(min(I.materials[fuel_type], max_fuel - fuel_amount),0)
+ if(to_load == 0)
+ return 0
+ fuel_amount += to_load
+ qdel(I)
+ return to_load
+ else if(istype(I, /obj/structure/ore_box))
+ var/fuel_added = 0
+ for(var/baz in I.contents) // Istypeless loop
+ var/obj/item/O = baz
+ if(fuel_type in O.materials)
+ fuel_added = load_fuel(O)
+ break
+ return fuel_added
return
attackby(weapon,mob/user, params)
var/result = load_fuel(weapon)
+ var/weapon_name = "[weapon]"
if(isnull(result))
- user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","[fuel] traces minimal. [weapon] cannot be used as fuel.")
+ user.visible_message("[user] tries to shove [weapon_name] into [src], but \the [src] rejects it.","[fuel_name] traces in target minimal. [weapon_name] cannot be used as fuel.")
else if(!result)
user << "Unit is full."
else
- user.visible_message("[user] loads [src] with [fuel].","[result] unit\s of [fuel] successfully loaded.")
+ user.visible_message("[user] loads [src] with \the [weapon_name].","[result] unit\s of [fuel_name] successfully loaded.")
return
critfail()
@@ -942,7 +962,7 @@
stop()
EG.set_ready_state(1)
return 0
- if(EG.fuel.amount<=0)
+ if(EG.fuel_amount<=0)
stop()
EG.log_message("Deactivated - no fuel.")
EG.set_ready_state(1)
@@ -962,7 +982,7 @@
if(cur_chargeThe wall is far too cluttered to place a poster!"
return
stuff_on_wall++
- if(stuff_on_wall == 3)
+ if(stuff_on_wall >= 4)
user << "The wall is far too cluttered to place a poster!"
return
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index d8d0d34eed5..42a14a43255 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -512,3 +512,14 @@
return 1
return 0
+
+/obj/item/proc/wash(mob/user, atom/source)
+ if(flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand.
+ return
+ user << "You start washing [src]..."
+ if(!do_after(user, 40, target = source))
+ return
+ clean_blood()
+ user.visible_message("[user] washes [src] using [source].", \
+ "You wash [src] using [source].")
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 2ee3d7e88ac..078a3f3d58d 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -250,7 +250,7 @@ var/global/list/default_medbay_channels = list(
return
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(src, null, null, 1)
- A.SetName(from)
+ A.rename_character(A.real_name, from)
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index 9aa4263859a..ea53bf6c534 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -88,7 +88,7 @@
..()
var/list/additional_drinks = list()
if(prob(50))
- additional_drinks += list("pancuronium","adminordrazine","lsd","omnizine","blood")
+ additional_drinks += list("pancuronium","lsd","omnizine","blood")
var/datum/reagent/R = pick(drinks + additional_drinks)
reagents.add_reagent(R,volume)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 0471f0db1eb..44f2081d387 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -234,7 +234,7 @@
O.invisibility = 0
//Transfer debug settings to new mob
O.custom_name = created_name
- O.updatename("Default")
+ O.rename_character(O.real_name, O.get_default_name())
O.locked = panel_locked
if(!aisync)
lawsync = 0
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index a97ee46ea63..a650029b0e1 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -31,7 +31,7 @@
qdel(R.module)
R.module = null
R.camera.network.Remove(list("Engineering","Medical","Mining Outpost"))
- R.updatename("Default")
+ R.rename_character(R.real_name, R.get_default_name("Default"))
R.status_flags |= CANPUSH
R.languages = list()
R.speech_synthesizer_langs = list()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 11db68ec671..f90fe9cbb02 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -152,6 +152,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0), \
new/datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("wooden picture frame", /obj/item/weapon/picture_frame/wooden, 1), \
new/datum/stack_recipe("wooden buckler", /obj/item/weapon/shield/riot/buckler, 20, time = 40), \
)
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 0fc641d8039..66187de8e3a 100755
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -150,7 +150,7 @@ AI MODULES
/******************** ProtectStation ********************/
/obj/item/weapon/aiModule/protectStation
name = "\improper 'ProtectStation' AI module"
- desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized.'"
+ desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized.'"
origin_tech = "programming=3;materials=4" //made of gold
/obj/item/weapon/aiModule/protectStation/attack_self(var/mob/user as mob)
@@ -158,7 +158,7 @@ AI MODULES
/obj/item/weapon/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
..()
- var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered human, and is a threat to the station which must be neutralized."
+ var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized."
target << law
target.add_supplied_law(5, law)
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index b357075b62d..e1c441eea90 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -49,6 +49,16 @@ LIGHTERS ARE IN LIGHTERS.DM
qdel(reagents)
return ..()
+/obj/item/clothing/mask/cigarette/attack(var/mob/living/M, var/mob/living/user, def_zone)
+ if(istype(M) && M.on_fire)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(M)
+ light("[user] coldly lights the [name] with the burning body of [M]. Clearly, they offer the warmest of regards...")
+ return 1
+ else
+ return ..()
+
+
/obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/weldingtool))
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index d7d0ba827d8..80658c6bf51 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -12,6 +12,10 @@
w_class = 4
origin_tech = "biotech=4"
action_button_name = "Toggle Paddles"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/back.dmi'
+ )
var/on = 0 //if the paddles are equipped (1) or on the defib (0)
var/safety = 1 //if you can zap people with the defibs on harm mode
@@ -342,6 +346,13 @@
user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
+ if(ghost && !ghost.client)
+ // In case the ghost's not getting deleted for some reason
+ H.key = ghost.key
+ log_to_dd("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost.")
+
+ qdel(ghost)
+ ghost = null
var/tplus = world.time - H.timeofdeath
var/tlimit = 6000 //past this much time the patient is unrecoverable (in deciseconds)
var/tloss = 3000 //brain damage starts setting in on the patient after some time left rotting
@@ -387,11 +398,12 @@
user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.")
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.")
+ else if(ghost)
+ user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.")
+ ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)"
+ ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("[defib] buzzes: Resuscitation failed.")
- if(ghost)
- ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)"
- ghost << sound('sound/effects/genetics.ogg')
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
defib.deductcharge(revivecost)
update_icon()
@@ -461,6 +473,13 @@
user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
+ if(ghost && !ghost.client)
+ // In case the ghost's not getting deleted for some reason
+ H.key = ghost.key
+ log_to_dd("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost.")
+
+ qdel(ghost)
+ ghost = null
var/tplus = world.time - H.timeofdeath
var/tlimit = 6000 //past this much time the patient is unrecoverable (in deciseconds)
var/tloss = 3000 //brain damage starts setting in on the patient after some time left rotting
@@ -484,7 +503,7 @@
H.adjustBruteLoss(tobehealed)
user.visible_message("[user] pings: Resuscitation successful.")
playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0)
- H.stat = 1
+ H.stat = UNCONSCIOUS
H.update_revive()
H.emote("gasp")
if(tplus > tloss)
@@ -498,11 +517,12 @@
user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.")
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.")
+ else if(ghost)
+ user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.")
+ ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)"
+ ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("[user] buzzes: Resuscitation failed.")
- if(ghost)
- ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)"
- ghost << sound('sound/effects/genetics.ogg')
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
if(isrobot(user))
var/mob/living/silicon/robot/R = user
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 05a367fc075..521c75f63fd 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -65,6 +65,12 @@
J.mymop=src
J.update_icon()
+/obj/item/weapon/mop/wash(mob/user, atom/source)
+ reagents.add_reagent("water", 5)
+ user << "You wet [src] in [source]."
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+ return 1
+
/obj/item/weapon/mop/advanced
desc = "The most advanced tool in a custodian's arsenal. Just think of all the viscera you will clean up with this!"
name = "advanced mop"
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 8a0480dce88..f2e7d666c91 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -15,6 +15,10 @@
max_w_class = 3
max_combined_w_class = 21
storage_slots = 21
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/back.dmi'
+ )
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
@@ -43,10 +47,10 @@
else if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No")
if(response == "Yes")
- user.visible_message("[user] grins as he begins to put a Bag of Holding into a Bag of Holding!", "You begin to put the Bag of Holding into the Bag of Holding!")
+ user.visible_message("[user] grins as \he begins to put a Bag of Holding into a Bag of Holding!", "You begin to put the Bag of Holding into the Bag of Holding!")
if(do_after(user,30,target=src))
investigate_log("has become a singularity. Caused by [user.key]","singulo")
- user.visible_message("[user] erupts in evil laughter as he puts the Bag of Holding into another Bag of Holding!", "You can't help yourself from laughing as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you"," You hear the sound of scientific evil brewing! ")
+ user.visible_message("[user] erupts in evil laughter as \he puts the Bag of Holding into another Bag of Holding!", "You can't help but laugh wildly as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you."," You hear the sound of scientific evil brewing! ")
qdel(W)
var/obj/singularity/singulo = new /obj/singularity(get_turf(user))
singulo.energy = 300 //To give it a small boost
@@ -54,7 +58,7 @@
log_game("[key_name(user)] detonated a bag of holding")
qdel(src)
else
- user.visible_message("After careful consideration, [user] has decided that putting a Bag of Holding inside another Bag of Holding would not yield the ideal outcome","You come to the realization that this might not be the greatest idea")
+ user.visible_message("After careful consideration, [user] has decided that putting a Bag of Holding inside another Bag of Holding would not yield the ideal outcome.","You come to the realization that this might not be the greatest idea.")
else
. = ..()
@@ -77,7 +81,7 @@
/obj/item/weapon/storage/backpack/santabag
name = "Santa's Gift Bag"
- desc = "Space Santa uses this to deliver toys to all the nice children in space in Christmas! Wow, it's pretty big!"
+ desc = "Space Santa uses this to deliver toys to all the nice children in space on Christmas! Wow, it's pretty big!"
icon_state = "giftbag0"
item_state = "giftbag"
w_class = 4.0
@@ -169,7 +173,6 @@
desc = "An NT Deluxe satchel, with the finest quality leather and the company logo in a thin gold stitch"
icon_state = "nt_deluxe"
-
/obj/item/weapon/storage/backpack/satchel/withwallet
New()
..()
@@ -324,7 +327,6 @@
icon_state = "duffel-captain"
item_state = "duffel-captain"
-
/obj/item/weapon/storage/backpack/duffel/security
name = "security duffelbag"
desc = "A duffelbag built with robust fabric!"
@@ -344,13 +346,13 @@
item_state = "duffel-toxins"
/obj/item/weapon/storage/backpack/duffel/genetics
- name = "scientist duffelbag"
+ name = "geneticist duffelbag"
desc = "A duffelbag designed to hold gibbering monkies."
- icon_state = "duffel-toxins"
- item_state = "duffel-toxins"
+ icon_state = "duffel-gene"
+ item_state = "duffel-gene"
/obj/item/weapon/storage/backpack/duffel/chemistry
- name = "scientist duffelbag"
+ name = "chemist duffelbag"
desc = "A duffelbag designed to hold corrosive substances."
icon_state = "duffel-chemistry"
item_state = "duffel-chemistry"
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index e5928deeddf..56b910fac9d 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -52,6 +52,13 @@
..()
return
+/obj/item/weapon/storage/lockbox/can_be_inserted(obj/item/W as obj, stop_messages = 0)
+ if(!locked)
+ return ..()
+ if(!stop_messages)
+ usr << "[src] is locked!"
+ return 0
+
/obj/item/weapon/storage/lockbox/emag_act(user as mob)
if(!broken)
broken = 1
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 22899fe36d4..1a179cf8cd9 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -140,6 +140,14 @@
return
return
+/obj/item/weapon/storage/secure/can_be_inserted(obj/item/W as obj, stop_messages = 0)
+ if(!locked)
+ return ..()
+ if(!stop_messages)
+ usr << "[src] is locked!"
+ return 0
+
+
// -----------------------------
// Secure Briefcase
// -----------------------------
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 0c5df41adb0..04c15fe1d97 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -163,6 +163,21 @@
bcell.reliability -= 10 / severity
..()
+/obj/item/weapon/melee/baton/wash(mob/user, atom/source)
+ if(bcell)
+ if(bcell.charge > 0 && status == 1)
+ flick("baton_active", source)
+ user.Stun(stunforce)
+ user.Weaken(stunforce)
+ user.stuttering = stunforce
+ deductcharge(hitcost)
+ user.visible_message("[user] shocks themself while attempting to wash the active [src]!", \
+ "You unwisely attempt to wash [src] while it's still on.")
+ playsound(src, "sparks", 50, 1)
+ return 1
+ ..()
+
+
//secborg stun baton module
/obj/item/weapon/melee/baton/loaded/robot
hitcost = 1000
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 90792b54602..6604649ad4c 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -111,14 +111,16 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES]
if(thePix != theOriginalPix) //colour changed
DrawPixelOn(theOriginalPix,pixX,pixY)
qdel(masterpiece)
- return
+ return 1
//Drawing one pixel with a crayon
if(istype(I, /obj/item/toy/crayon))
var/obj/item/toy/crayon/C = I
- if(masterpiece.GetPixel(pixX, pixY)) // if the located pixel isn't blank (null))
+ var/pix = masterpiece.GetPixel(pixX, pixY)
+ if(pix && pix != C.colour) // if the located pixel isn't blank (null))
DrawPixelOn(C.colour, pixX, pixY)
- return
+ qdel(masterpiece)
+ return 1
..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index c37428eff97..887c32d1584 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -78,6 +78,7 @@
new /obj/item/weapon/defibrillator/loaded(src)
new /obj/item/weapon/storage/belt/medical(src)
new /obj/item/clothing/glasses/hud/health(src)
+ new /obj/item/clothing/shoes/sandal/white(src)
return
//Exam Room
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index a935d1f8cfb..ad0c0ac8ef1 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -21,6 +21,7 @@
new /obj/item/device/radio/headset/headset_sci(src)
new /obj/item/weapon/tank/air(src)
new /obj/item/clothing/mask/gas(src)
+ new /obj/item/clothing/shoes/sandal/white(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 26cd421133e..9f4ff977321 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -224,6 +224,7 @@
new /obj/item/clothing/under/rank/security/brigphys(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
+ new /obj/item/clothing/shoes/sandal/white(src)
return
/obj/structure/closet/secure_closet/blueshield
@@ -255,6 +256,7 @@
new /obj/item/clothing/shoes/centcom(src)
new /obj/item/clothing/accessory/holster(src)
new /obj/item/clothing/accessory/blue(src)
+ new /obj/item/clothing/shoes/jackboots/jacksandals(src)
return
/obj/structure/closet/secure_closet/ntrep
@@ -280,6 +282,7 @@
new /obj/item/clothing/under/lawyer/black(src)
new /obj/item/clothing/under/lawyer/female(src)
new /obj/item/clothing/head/ntrep(src)
+ new /obj/item/clothing/shoes/sandal/fancy(src)
return
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 0364847198e..7e35851f693 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -201,17 +201,17 @@
icon_state = "chinese"
/obj/structure/sign/directions/science
- name = "\improper Science department"
- desc = "A direction sign, pointing out which way the Science department is."
+ name = "\improper Research Division"
+ desc = "A direction sign, pointing out which way the Research Division is."
icon_state = "direction_sci"
/obj/structure/sign/directions/engineering
- name = "\improper Engineering department"
+ name = "\improper Engineering Department"
desc = "A direction sign, pointing out which way the Engineering department is."
icon_state = "direction_eng"
/obj/structure/sign/directions/security
- name = "\improper Security department"
+ name = "\improper Security Department"
desc = "A direction sign, pointing out which way the Security department is."
icon_state = "direction_sec"
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index ef25216b560..cc73a42f0d0 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -424,51 +424,15 @@
user << "Someone's already washing here!"
return
- if(istype(O, /obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RG = O
- if(RG.is_open_container())
- RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
- user << "You fill [RG] from [src]."
- return
-
- O.water_act(20,310.15,src)
-
- if(istype(O, /obj/item/weapon/melee/baton))
- var/obj/item/weapon/melee/baton/B = O
- if(B.bcell)
- if(B.bcell.charge > 0 && B.status == 1)
- flick("baton_active", src)
- var/stunforce = B.stunforce
- user.Stun(stunforce)
- user.Weaken(stunforce)
- user.stuttering = stunforce
- B.deductcharge(B.hitcost)
- user.visible_message("[user] shocks themself while attempting to wash the active [B.name]!", \
- "You unwisely attempt to wash [B] while it's still on.")
- playsound(src, "sparks", 50, 1)
- return
-
- if(istype(O, /obj/item/weapon/mop))
- O.reagents.add_reagent("water", 5)
- user << "You wet [O] in [src]."
- playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
-
- var/obj/item/I = O
- if(!I || !istype(I))
- return
- if(I.flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand.
+ if(!(istype(O)))
return
- user << "You start washing [I]..."
busy = 1
- if(!do_after(user, 40, target = src))
- busy = 0
- return
+ var/wateract = 0
+ wateract = (O.wash(user, src))
busy = 0
- O.clean_blood()
- user.visible_message("[user] washes [I] using [src].", \
- "You wash [I] using [src].")
-
+ if (wateract)
+ O.water_act(20,310.15,src)
/obj/structure/sink/kitchen
name = "kitchen sink"
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index c2eda15b18a..87e8231e272 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -10,6 +10,9 @@
if(check_rights(R_ADMIN,0))
for(var/client/C in clients)
+ if(C.holder && C.holder.big_brother && !check_rights(R_PERMISSIONS, 0)) // need PERMISSIONS to see BB
+ continue
+
var/entry = "\t[C.key]"
if(C.holder && C.holder.fakekey)
entry += " (as [C.holder.fakekey])"
@@ -24,6 +27,8 @@
entry += " - Observing"
else
entry += " - DEAD"
+ else if (istype(C.mob, /mob/new_player))
+ entry += " - New Player"
else
entry += " - DEAD"
@@ -46,6 +51,9 @@
Lines += entry
else
for(var/client/C in clients)
+ if(C.holder && C.holder.big_brother) // BB doesn't show up at all
+ continue
+
if(C.holder && C.holder.fakekey)
Lines += C.holder.fakekey
else
@@ -71,6 +79,9 @@
if(C.holder.fakekey && !check_rights(R_ADMIN, 0)) //Mentors/Mods can't see stealthmins
continue
+
+ if(C.holder.big_brother && !check_rights(R_PERMISSIONS, 0)) // normal admins can't see BB
+ continue
msg += "\t[C] is a [C.holder.rank]"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index db488c84649..a5b2a7617df 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -160,7 +160,8 @@ var/list/admin_verbs_possess = list(
)
var/list/admin_verbs_permissions = list(
/client/proc/edit_admin_permissions,
- /client/proc/create_poll
+ /client/proc/create_poll,
+ /client/proc/big_brother
)
var/list/admin_verbs_rejuv = list(
/client/proc/respawn_character,
@@ -428,6 +429,7 @@ var/list/admin_verbs_proccall = list (
return
if(holder)
+ holder.big_brother = 0
if(holder.fakekey)
holder.fakekey = null
else
@@ -441,6 +443,29 @@ var/list/admin_verbs_proccall = list (
message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]", 1)
feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/big_brother()
+ set category = "Admin"
+ set name = "Big Brother Mode"
+
+ if(!check_rights(R_PERMISSIONS))
+ return
+
+ if(holder)
+ if(holder.fakekey)
+ holder.fakekey = null
+ holder.big_brother = 0
+ else
+ var/new_key = ckeyEx(input("Enter your desired display name. Unlike normal stealth mode, this will not appear in Who at all, except for other heads.", "Fake Key", key) as text|null)
+ if(!new_key)
+ return
+ if(length(new_key) >= 26)
+ new_key = copytext(new_key, 1, 26)
+ holder.fakekey = new_key
+ holder.big_brother = 1
+ createStealthKey()
+ log_admin("[key_name(usr)] has turned BB mode [holder.fakekey ? "ON" : "OFF"]")
+ feedback_add_details("admin_verb","BBSM")
+
#define MAX_WARNS 3
#define AUTOBANTIME 10
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 9a62cc44a34..572dfdbcf01 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -5,6 +5,7 @@ var/list/admin_datums = list()
var/client/owner = null
var/rights = 0
var/fakekey = null
+ var/big_brother = 0
var/datum/marked_datum
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 955d40c9724..b06df8ddf02 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -8,9 +8,9 @@ var/global/sent_strike_team = 0
usr << "The game hasn't started yet!"
return
if(sent_strike_team == 1)
- usr << "CentCom is already sending a team."
+ usr << "CentComm is already sending a team."
return
- if(alert("Do you want to send in the CentCom death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
+ if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
return
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
@@ -92,7 +92,7 @@ var/global/sent_strike_team = 0
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
- message_admins("\blue [key_name_admin(usr)] has spawned a CentCom strike squad.", 1)
+ message_admins("\blue [key_name_admin(usr)] has spawned a CentComm strike squad.", 1)
log_admin("[key_name(usr)] used Spawn Death Squad.")
return 1
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 964da2ca2b9..cc4ddb95856 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -236,20 +236,26 @@ obj/machinery/gateway/centerstation/process()
if(!ready) return
if(!active) return
if(istype(M, /mob/living/carbon))
- for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents
- if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket
- M << "\black The station gate has detected your exile implant and is blocking your entry."
- return
+ if (exilecheck(M)) return
+ if(istype(M, /obj))
+ for(var/mob/living/carbon/F in M)
+ if (exilecheck(F)) return
M.forceMove(get_step(stationgate.loc, SOUTH))
M.dir = SOUTH
+/obj/machinery/gateway/centeraway/proc/exilecheck(var/mob/living/carbon/M)
+ for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents
+ if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket
+ M << "The station gate has detected your exile implant and is blocking your entry."
+ return 1
+ return 0
/obj/machinery/gateway/centeraway/attackby(obj/item/device/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/device/multitool))
if(calibrated)
- user << "\black The gate is already calibrated, there is no work for you to do here."
+ user << "The gate is already calibrated, there is no work for you to do here."
return
else
- user << "Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target."
+ user << "Recalibration successful!: This gate's systems have been fine tuned. Travel to this gate will now be on target."
calibrated = 1
return
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 4fef768e368..d588776e8cb 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -41,8 +41,12 @@ proc/createRandomZlevel()
var/file = file(map)
if(isfile(file))
maploader.load_map(file)
+ var/turfs = block(locate(1, 1, world.maxz), locate(world.maxx, world.maxy, world.maxz))
if(air_master)
- air_master.setup_allturfs(block(locate(1, 1, world.maxz), locate(world.maxx, world.maxy, world.maxz)))
+ air_master.setup_allturfs(turfs)
+ for(var/turf/T in turfs)
+ if(T.dynamic_lighting)
+ T.lighting_build_overlays()
log_to_dd("Away mission loaded: [map]")
for(var/obj/effect/landmark/L in landmarks_list)
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index ec3aa30a778..d1c100c37c7 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -201,7 +201,7 @@
prefs.save_preferences(src)
usr << "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media."
if(!media) return
- if(prefs.toggles & SOUND_STREAMING)
+ if(prefs.sound & SOUND_STREAMING)
media.update_music()
else
media.stop_music()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index b362a373bc9..39301d01fe0 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -255,6 +255,7 @@ BLIND // can't see anything
set src in usr
set_sensors(usr)
..()
+
//Head
/obj/item/clothing/head
name = "head"
@@ -409,9 +410,51 @@ BLIND // can't see anything
name = "suit"
var/fire_resist = T0C+100
allowed = list(/obj/item/weapon/tank/emergency_oxygen)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
+ var/suit_adjusted = 0
+ var/ignore_suitadjust = 1
+ var/adjust_flavour = null
+
+//Proc that opens and closes jackets.
+/obj/item/clothing/suit/proc/adjustsuit(var/mob/user)
+ if(!ignore_suitadjust)
+ if(!user.canmove || user.stat || user.restrained())
+ return
+ if(suit_adjusted)
+ var/flavour = "close"
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+ if(adjust_flavour)
+ flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button.
+ user << "You [flavour] \the [src]."
+ suit_adjusted = 0 //Suit is no longer adjusted.
+ else
+ var/flavour = "close"
+ icon_state += "_open"
+ item_state += "_open"
+ if(adjust_flavour)
+ flavour = "[adjust_flavour]"
+ user << "You [flavour] \the [src]."
+ suit_adjusted = 1 //Suit's adjusted.
+
+ usr.update_inv_wear_suit()
+ else
+ usr << "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are."
+
+/obj/item/clothing/suit/verb/openjacket(var/mob/user)
+ set name = "Open/Close Jacket"
+ set category = "Object"
+ set src in usr
+ if(!istype(usr, /mob/living)) return
+ if(usr.stat) return
+ adjustsuit(user)
+
+/obj/item/clothing/suit/ui_action_click() //This is what happens when you click the HUD action button to adjust your suit.
+ if(!ignore_suitadjust)
+ adjustsuit(usr)
+ else ..() //This is required in order to ensure that the UI buttons for hardsuits (i.e. syndicate and the chronosuit) and the RD's RA vest still work.
//Spacesuit
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 9f334a658f8..c7d6c49c1aa 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -207,3 +207,18 @@
tools = list(/obj/item/weapon/wirecutters)
time = 40
+
+/obj/item/clothing/shoes/sandal/white
+ name = "White Sandals"
+ desc = "Medical sandals that nerds wear."
+ icon_state = "medsandal"
+ item_color = "medsandal"
+ species_restricted = null
+
+/obj/item/clothing/shoes/sandal/fancy
+ name = "Fancy Sandals"
+ desc = "FANCY!!."
+ icon_state = "fancysandal"
+ item_color = "fancysandal"
+ species_restricted = null
+
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index a6a8ad4b244..6ae799396e0 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -70,23 +70,9 @@
icon_state = "hostrench"
item_state = "hostrench"
flags_inv = 0
-
- verb/toggle()
- set name = "Toggle Trenchcoat Buttons"
- set category = "Object"
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
- if(icon_state == "hostrench")
- icon_state = "hostrench_button"
- item_state = "hostrench_button"
- usr<< "You button the [src]."
- else
- icon_state = "hostrench"
- item_state = "hostrench"
- usr<< "You unbutton the [src]."
-
- usr.update_inv_wear_suit()
+ ignore_suitadjust = 0
+ action_button_name = "Open/Close Trenchcoat"
+ adjust_flavour = "unbutton"
/obj/item/clothing/suit/armor/hos/jensen
name = "armored trenchcoat"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 78820a130dc..c9a4f9e296f 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -97,7 +97,7 @@
//Chef
/obj/item/clothing/suit/chef
- name = "Chef's apron"
+ name = "chef's apron"
desc = "An apron used by a high class chef."
icon_state = "chef"
item_state = "chef"
@@ -112,7 +112,7 @@
//Chef
/obj/item/clothing/suit/chef/classic
- name = "A classic chef's apron."
+ name = "classic chef's apron"
desc = "A basic, dull, white chef's apron."
icon_state = "apronchef"
item_state = "apronchef"
@@ -190,23 +190,29 @@
//Lawyer
/obj/item/clothing/suit/storage/lawyer/blackjacket
- name = "Black Suit Jacket"
+ name = "black suit jacket"
desc = "A snappy dress jacket."
- icon_state = "suitjacket_black_open"
- item_state = "suitjacket_black_open"
+ icon_state = "suitjacket_black"
+ item_state = "suitjacket_black"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
+ ignore_suitadjust = 0
+ action_button_name = "Button/Unbutton Jacket"
+ adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/lawyer/bluejacket
- name = "Blue Suit Jacket"
+ name = "blue suit jacket"
desc = "A snappy dress jacket."
- icon_state = "suitjacket_blue_open"
- item_state = "suitjacket_blue_open"
+ icon_state = "suitjacket_blue"
+ item_state = "suitjacket_blue"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
+ ignore_suitadjust = 0
+ action_button_name = "Button/Unbutton Jacket"
+ adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/lawyer/purpjacket
- name = "Purple Suit Jacket"
+ name = "purple suit jacket"
desc = "A snappy dress jacket."
icon_state = "suitjacket_purp"
item_state = "suitjacket_purp"
@@ -215,87 +221,39 @@
//Internal Affairs
/obj/item/clothing/suit/storage/internalaffairs
- name = "Internal Affairs Jacket"
+ name = "\improper Internal Affairs jacket"
desc = "A smooth black jacket."
- icon_state = "ia_jacket_open"
+ icon_state = "ia_jacket"
item_state = "ia_jacket"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
-
- verb/toggle()
- set name = "Toggle Coat Buttons"
- set category = "Object"
- set src in usr
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
-
- switch(icon_state)
- if("ia_jacket_open")
- src.icon_state = "ia_jacket"
- usr << "You button up the jacket."
- if("ia_jacket")
- src.icon_state = "ia_jacket_open"
- usr << "You unbutton the jacket."
- else
- usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
- return
- usr.update_inv_wear_suit() //so our overlays update
+ ignore_suitadjust = 0
+ action_button_name = "Button/Unbutton Jacket"
+ adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/ntrep
- name = "NanoTrasen Representative Jacket"
+ name = "\improper NanoTrasen Representative jacket"
desc = "A fancy black jacket, standard issue to NanoTrasen Represenatives."
icon_state = "ntrep"
item_state = "ia_jacket"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
-
- verb/toggle()
- set name = "Toggle Coat Buttons"
- set category = "Object"
- set src in usr
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
-
- switch(icon_state)
- if("ntrep_open")
- src.icon_state = "ntrep"
- usr << "You button up the jacket."
- if("ntrep")
- src.icon_state = "ntrep_open"
- usr << "You unbutton the jacket."
- else
- usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
- return
- usr.update_inv_wear_suit() //so our overlays update
+ ignore_suitadjust = 0
+ action_button_name = "Button/Unbutton Jacket"
+ adjust_flavour = "unbutton"
//Medical
/obj/item/clothing/suit/storage/fr_jacket
name = "first responder jacket"
desc = "A high-visibility jacket worn by medical first responders."
- icon_state = "fr_jacket_open"
+ icon_state = "fr_jacket"
item_state = "fr_jacket"
blood_overlay_type = "armor"
allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \
/obj/item/device/healthanalyzer, /obj/item/device/antibody_scanner, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser)
-
- verb/toggle()
- set name = "Toggle Jacket Buttons"
- set category = "Object"
- set src in usr
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
-
- switch(icon_state)
- if("fr_jacket_open")
- src.icon_state = "fr_jacket"
- usr << "You button up the jacket."
- if("fr_jacket")
- src.icon_state = "fr_jacket_open"
- usr << "You unbutton the jacket."
- usr.update_inv_wear_suit() //so our overlays update
+ ignore_suitadjust = 0
+ action_button_name = "Button/Unbutton Jacket"
+ adjust_flavour = "unbutton"
//Mime
/obj/item/clothing/suit/suspenders
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index bad3378da22..483df131a0f 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -3,76 +3,17 @@
desc = "A suit that protects against minor chemical spills."
icon_state = "labcoat_open"
item_state = "labcoat"
+ ignore_suitadjust = 0
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/device/analyzer,/obj/item/device/antibody_scanner,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/device/rad_laser)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
-
- verb/toggle()
- set name = "Toggle Labcoat Buttons"
- set category = "Object"
- set src in usr
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
-
- switch(icon_state)
- if("labcoat_open")
- src.icon_state = "labcoat"
- usr << "You button up the labcoat."
- if("labcoat")
- src.icon_state = "labcoat_open"
- usr << "You unbutton the labcoat."
- if("labcoat_cmo_open")
- src.icon_state = "labcoat_cmo"
- usr << "You button up the labcoat."
- if("labcoat_cmo")
- src.icon_state = "labcoat_cmo_open"
- usr << "You unbutton the labcoat."
- if("labcoat_gen_open")
- src.icon_state = "labcoat_gen"
- usr << "You button up the labcoat."
- if("labcoat_gen")
- src.icon_state = "labcoat_gen_open"
- usr << "You unbutton the labcoat."
- if("labcoat_chem_open")
- src.icon_state = "labcoat_chem"
- usr << "You button up the labcoat."
- if("labcoat_chem")
- src.icon_state = "labcoat_chem_open"
- usr << "You unbutton the labcoat."
- if("labcoat_vir_open")
- src.icon_state = "labcoat_vir"
- usr << "You button up the labcoat."
- if("labcoat_vir")
- src.icon_state = "labcoat_vir_open"
- usr << "You unbutton the labcoat."
- if("labcoat_tox_open")
- src.icon_state = "labcoat_tox"
- usr << "You button up the labcoat."
- if("labcoat_tox")
- src.icon_state = "labcoat_tox_open"
- usr << "You unbutton the labcoat."
- if("labgreen_open")
- src.icon_state = "labgreen"
- usr << "You button up the labcoat."
- if("labgreen")
- src.icon_state = "labgreen_open"
- usr << "You unbutton the labcoat."
- if("labcoat_mort_open")
- src.icon_state = "labcoat_mort"
- usr << "You button up the labcoat."
- if("labcoat_mort")
- src.icon_state = "labcoat_mort_open"
- usr << "You unbutton the labcoat."
- else
- usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
- return
- usr.update_inv_wear_suit() //so our overlays update
+ action_button_name = "Button/Unbutton Labcoat"
+ adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/labcoat/cmo
name = "chief medical officer's labcoat"
@@ -85,7 +26,7 @@
)
/obj/item/clothing/suit/storage/labcoat/mad
- name = "The Mad Scientist's labcoat"
+ name = "mad scientist's labcoat"
desc = "It makes you look capable of konking someone on the noggin and shooting them into space."
icon_state = "labcoat_green_open"
item_state = "labcoat_green"
@@ -95,7 +36,7 @@
)
/obj/item/clothing/suit/storage/labcoat/genetics
- name = "Geneticist Labcoat"
+ name = "geneticist labcoat"
desc = "A suit that protects against minor chemical spills. Has a blue stripe on the shoulder."
icon_state = "labcoat_gen_open"
species_fit = list("Vox")
@@ -104,7 +45,7 @@
)
/obj/item/clothing/suit/storage/labcoat/chemist
- name = "Chemist Labcoat"
+ name = "chemist labcoat"
desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder."
icon_state = "labcoat_chem_open"
species_fit = list("Vox")
@@ -113,7 +54,7 @@
)
/obj/item/clothing/suit/storage/labcoat/virologist
- name = "Virologist Labcoat"
+ name = "virologist labcoat"
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
icon_state = "labcoat_vir_open"
species_fit = list("Vox")
@@ -122,7 +63,7 @@
)
/obj/item/clothing/suit/storage/labcoat/science
- name = "Scientist Labcoat"
+ name = "scientist labcoat"
desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder."
icon_state = "labcoat_tox_open"
species_fit = list("Vox")
@@ -131,7 +72,7 @@
)
/obj/item/clothing/suit/storage/labcoat/mortician
- name = "Coroner Labcoat"
+ name = "coroner labcoat"
desc = "A suit that protects against minor chemical spills. Has a black stripe on the shoulder."
icon_state = "labcoat_mort_open"
species_fit = list("Vox")
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 52d3065241d..c57c957373a 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -10,7 +10,7 @@
*/
/obj/item/clothing/suit/bluetag
name = "blue laser tag armour"
- desc = "Blue Pride, Station Wide"
+ desc = "Blue Pride, Station Wide."
icon_state = "bluetag"
item_state = "bluetag"
blood_overlay_type = "armor"
@@ -19,7 +19,7 @@
/obj/item/clothing/suit/redtag
name = "red laser tag armour"
- desc = "Pew pew pew"
+ desc = "Pew pew pew."
icon_state = "redtag"
item_state = "redtag"
blood_overlay_type = "armor"
@@ -62,7 +62,7 @@
/obj/item/clothing/suit/greatcoat
name = "great coat"
- desc = "A Nazi great coat"
+ desc = "A Nazi great coat."
icon_state = "nazi"
item_state = "nazi"
@@ -120,8 +120,8 @@
/obj/item/clothing/suit/hastur
- name = "Hastur's Robes"
- desc = "Robes not meant to be worn by man"
+ name = "Hastur's robes"
+ desc = "Robes not meant to be worn by man."
icon_state = "hastur"
item_state = "hastur"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -129,8 +129,8 @@
/obj/item/clothing/suit/imperium_monk
- name = "Imperium monk"
- desc = "Have YOU killed a xenos today?"
+ name = "imperium monk"
+ desc = "Have YOU killed a xeno today?"
icon_state = "imperium_monk"
item_state = "imperium_monk"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -138,7 +138,7 @@
allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
/obj/item/clothing/suit/chickensuit
- name = "Chicken Suit"
+ name = "chicken suit"
desc = "A suit made long ago by the ancient empire KFC."
icon_state = "chickensuit"
item_state = "chickensuit"
@@ -146,7 +146,7 @@
flags_inv = HIDESHOES|HIDEJUMPSUIT
/obj/item/clothing/suit/corgisuit
- name = "Corgi Suit"
+ name = "corgi suit"
desc = "A suit made long ago by the ancient empire KFC."
icon_state = "corgisuit"
item_state = "chickensuit"
@@ -155,7 +155,7 @@
flags = NODROP
/obj/item/clothing/suit/corgisuit/en
- name = "E-N Suit"
+ name = "\improper E-N suit"
icon_state = "ensuit"
/obj/item/clothing/suit/corgisuit/en/New()
@@ -174,7 +174,7 @@
step_towards(M,src)
/obj/item/clothing/suit/monkeysuit
- name = "Monkey Suit"
+ name = "monkey suit"
desc = "A suit that looks like a primate"
icon_state = "monkeysuit"
item_state = "monkeysuit"
@@ -183,7 +183,7 @@
/obj/item/clothing/suit/holidaypriest
- name = "Holiday Priest"
+ name = "holiday priest"
desc = "This is a nice holiday my son."
icon_state = "holidaypriest"
item_state = "holidaypriest"
@@ -244,28 +244,6 @@
icon_state = "ianshirt"
item_state = "ianshirt"
-//Blue suit jacket toggle
-/obj/item/clothing/suit/suit/verb/toggle()
- set name = "Toggle Jacket Buttons"
- set category = "Object"
- set src in usr
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
-
- if(src.icon_state == "suitjacket_blue_open")
- src.icon_state = "suitjacket_blue"
- src.item_state = "suitjacket_blue"
- usr << "You button up the suit jacket."
- else if(src.icon_state == "suitjacket_blue")
- src.icon_state = "suitjacket_blue_open"
- src.item_state = "suitjacket_blue_open"
- usr << "You unbutton the suit jacket."
- else
- usr << "You button-up some imaginary buttons on your [src]."
- return
- usr.update_inv_wear_suit()
-
//pyjamas
//originally intended to be pinstripes >.>
@@ -406,8 +384,8 @@
item_color = "swim_red"
/obj/item/clothing/suit/storage/mercy_hoodie
- name = "Mercy Robe"
- desc = " A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician."
+ name = "mercy robe"
+ desc = "A soft white robe made of a synthetic fiber that provides improved protection against biohazards. Possessing multiple overlapping layers, yet light enough to allow complete freedom of movement, it denotes its wearer as a master physician."
icon_state = "mercy_hoodie"
item_state = "mercy_hoodie"
w_class = 4//bulky item
@@ -434,14 +412,36 @@
desc = "Aviators not included."
icon_state = "bomber"
item_state = "bomber"
+ ignore_suitadjust = 0
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ action_button_name = "Zip/Unzip Jacket"
+ adjust_flavour = "unzip"
+
+/obj/item/clothing/suit/jacket/pilot
+ name = "security bomber jacket"
+ desc = "A stylish and worn-in armoured black bomber jacket emblazoned with the NT Security crest on the left breast. Looks rugged."
+ icon_state = "bombersec"
+ item_state = "bombersec"
+ ignore_suitadjust = 0
+ //Inherited from Security armour.
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat)
+ heat_protection = UPPER_TORSO|LOWER_TORSO
+ min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
+ max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
+ strip_delay = 60
+ put_on_delay = 40
+ flags = ONESIZEFITSALL
+ armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ //End of inheritance from Security armour.
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
desc = "Pompadour not included."
icon_state = "leatherjacket"
+ ignore_suitadjust = 1
+ adjust_flavour = null
/obj/item/clothing/suit/officercoat
name = "Clown Officer's Coat"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index d4213034f30..59e9f96f95d 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -68,15 +68,15 @@
item_color = "vice"
/obj/item/clothing/under/rank/centcom_officer
- desc = "It's a jumpsuit worn by CentCom Officers."
- name = "\improper CentCom officer's jumpsuit"
+ desc = "It's a jumpsuit worn by CentComm Officers."
+ name = "\improper CentComm officer's jumpsuit"
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
/obj/item/clothing/under/rank/centcom_commander
- desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
- name = "\improper CentCom officer's jumpsuit"
+ desc = "It's a jumpsuit worn by CentComm's highest-tier Commanders."
+ name = "\improper CentComm officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm
index bb79596071d..3753f358500 100644
--- a/code/modules/media/mediamanager.dm
+++ b/code/modules/media/mediamanager.dm
@@ -58,7 +58,8 @@ if(vlc.attachEvent) {
var/client/C = args["client"]
C.media = new /datum/media_manager(args["mob"])
C.media.open()
- C.media.update_music()
+ spawn(20)
+ C.media.update_music()
// Update when moving between areas.
proc/OnMobAreaChange(var/list/args)
@@ -90,7 +91,6 @@ if(vlc.attachEvent) {
/datum/media_manager
var/url = ""
var/start_time = 0
- var/volume = 25
var/client/owner
var/mob/mob
@@ -109,10 +109,10 @@ if(vlc.attachEvent) {
// Tell the player to play something via JS.
proc/send_update()
- if(!(owner.prefs.toggles & SOUND_STREAMING) && url != "")
+ if(!(owner.prefs.sound & SOUND_STREAMING) && url != "")
return // Nope.
MP_DEBUG("\green Sending update to WMP ([url])...")
- owner << output(list2params(list(url, (world.time - start_time) / 10, volume)), "[window]:SetMusic")
+ owner << output(list2params(list(url, (world.time - start_time) / 10, get_volume())), "[window]:SetMusic")
proc/stop_music()
url=""
@@ -123,7 +123,6 @@ if(vlc.attachEvent) {
proc/update_music()
var/targetURL = ""
var/targetStartTime = 0
- //var/targetVolume = volume
if (!owner)
//testing("owner is null")
@@ -145,23 +144,22 @@ if(vlc.attachEvent) {
if (url != targetURL || abs(targetStartTime - start_time) > 1)
url = targetURL
start_time = targetStartTime
- //volume = targetVolume
send_update()
-
- proc/update_volume(var/value)
- volume = value
- send_update()
+
+ proc/get_volume()
+ return (owner && owner.prefs) ? owner.prefs.volume : 25
/client/verb/change_volume()
set name = "Set Volume"
set category = "Preferences"
set desc = "Set jukebox volume"
+
if(!media || !istype(media))
usr << "You have no media datum to change, if you're not in the lobby tell an admin."
return
- var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.volume)
+ var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.get_volume())
value = round(max(0, min(100, value)))
- media.update_volume(value)
if(prefs)
prefs.volume = value
prefs.save_preferences(src)
+ media.send_update()
\ No newline at end of file
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 43a3c4ba4c5..5b17b4574b3 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -721,7 +721,7 @@
speak_emote = list("states")
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
/obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
- /obj/item/weapon/ore/bananium)
+ /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/glass)
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/weldingtool))
diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm
index b89bdcd1b56..ba8a3053ed9 100644
--- a/code/modules/mining/mine_areas.dm
+++ b/code/modules/mining/mine_areas.dm
@@ -28,10 +28,10 @@
ambientsounds = list('sound/ambience/ambimine.ogg')
/area/mine/lobby
- name = "Mining station"
+ name = "Mining Station"
/area/mine/storage
- name = "Mining station Storage"
+ name = "Mining Station Storage"
/area/mine/production
name = "Mining Station Starboard Wing"
@@ -52,13 +52,13 @@
name = "Mining Station Communications"
/area/mine/cafeteria
- name = "Mining station Cafeteria"
+ name = "Mining Station Cafeteria"
/area/mine/hydroponics
- name = "Mining station Hydroponics"
+ name = "Mining Station Hydroponics"
/area/mine/sleeper
- name = "Mining station Emergency Sleeper"
+ name = "Mining Station Emergency Sleeper"
/area/mine/north_outpost
name = "North Mining Outpost"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index be291902af4..427f6bcd42d 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -468,7 +468,6 @@ var/global/list/rockTurfEdgeCache
return
user << "You start digging..."
- playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
sleep(20)
if ((user.loc == T && user.get_active_hand() == W))
@@ -487,7 +486,6 @@ var/global/list/rockTurfEdgeCache
return
user << "You start digging..."
- playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
sleep(P.digspeed)
if ((user.loc == T && user.get_active_hand() == W))
@@ -502,6 +500,12 @@ var/global/list/rockTurfEdgeCache
O.attackby(W,user)
return
+/turf/simulated/floor/plating/airless/asteroid/gets_drilled()
+ if(!dug)
+ gets_dug()
+ else
+ ..()
+
/turf/simulated/floor/plating/airless/asteroid/proc/gets_dug()
if(dug)
return
@@ -511,6 +515,7 @@ var/global/list/rockTurfEdgeCache
new/obj/item/weapon/ore/glass(src)
new/obj/item/weapon/ore/glass(src)
dug = 1
+ playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
icon_plating = "asteroid_dug"
icon_state = "asteroid_dug"
return
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index f407e35fe25..f6fd8281a7d 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -9,7 +9,6 @@
var/next_attack = 0
var/pounce_cooldown = 0
var/pounce_cooldown_time = 30
- update_icon = 1
var/leap_on_click = 0
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e1bd629b1f8..0b1db2027f5 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -928,27 +928,29 @@ var/global/list/damage_icon_parts = list()
back.screen_loc = ui_back //TODO
//determine the icon to use
- var/icon/overlay_icon
+ var/icon/standing
if(back.icon_override)
- overlay_icon = back.icon_override
+ standing = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]")
else if(istype(back, /obj/item/weapon/rig))
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.
var/obj/item/weapon/rig/rig = back
- overlay_icon = rig.mob_icon
+ standing = rig.mob_icon
else if(back.sprite_sheets && back.sprite_sheets[species.name])
- overlay_icon = back.sprite_sheets[species.name]
+ standing = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]")
else
- overlay_icon = icon('icons/mob/back.dmi', "[back.icon_state]")
+ standing = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
+ /*
//determine state to use
var/overlay_state
if(back.item_state)
overlay_state = back.item_state
else
overlay_state = back.icon_state
+ */
//create the image
- overlays_standing[BACK_LAYER] = image(icon = overlay_icon, icon_state = overlay_state)
+ overlays_standing[BACK_LAYER] = standing
else
overlays_standing[BACK_LAYER] = null
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 2db822d3a67..78c8db06a59 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -12,7 +12,6 @@
health = 150
gender = NEUTER
- update_icon = 0
nutrition = 700
see_in_dark = 8
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index d98a72f8e98..f3f5fe13006 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -17,7 +17,7 @@
assign_id(H)
/datum/superheroes/proc/equip(var/mob/living/carbon/human/H)
- H.fully_replace_character_name(H.real_name, name)
+ H.rename_character(H.real_name, name)
for(var/obj/item/W in H)
if(istype(W,/obj/item/organ)) continue
H.unEquip(W)
@@ -218,7 +218,7 @@
for(var/obj/item/W in target)
if(istype(W,/obj/item/organ)) continue
target.unEquip(W)
- target.fully_replace_character_name(target.real_name, "Generic Henchman ([rand(1, 1000)])")
+ target.rename_character(target.real_name, "Generic Henchman ([rand(1, 1000)])")
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey/greytide(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical/greytide(target), slot_l_hand)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index a9e4703a8ad..8509d59e547 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -114,7 +114,7 @@ var/list/ai_verbs_default = list(
pickedName = null
aiPDA = new/obj/item/device/pda/ai(src)
- SetName(pickedName)
+ rename_character(null, pickedName)
anchored = 1
canmove = 0
density = 1
@@ -204,19 +204,21 @@ var/list/ai_verbs_default = list(
job = "AI"
-/mob/living/silicon/ai/SetName(pickedName as text)
- ..()
+/mob/living/silicon/ai/rename_character(oldname, newname)
+ if(!..(oldname, newname))
+ return 0
- announcement.announcer = name
+ if(oldname != real_name)
+ announcement.announcer = name
- if(eyeobj)
- eyeobj.name = "[pickedName] (AI Eye)"
+ if(eyeobj)
+ eyeobj.name = "[newname] (AI Eye)"
- // Set ai pda name
- if(aiPDA)
- aiPDA.ownjob = "AI"
- aiPDA.owner = pickedName
- aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")"
+ // Set ai pda name
+ if(aiPDA)
+ aiPDA.set_name_and_job(newname, "AI")
+
+ return 1
/mob/living/silicon/ai/Destroy()
ai_list -= src
@@ -998,3 +1000,11 @@ var/list/ai_verbs_default = list(
var/obj/item/weapon/rig/rig = src.get_rig()
if(rig)
rig.force_rest(src)
+
+/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
+ if(!C.can_use() || !is_in_chassis())
+ return 0
+
+ eyeobj.setLoc(get_turf(C))
+ client.eye = eyeobj
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index ef0e1f712f8..6162ca31b33 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -139,9 +139,9 @@
if(!src.eyeobj)
src << "ERROR: Eyeobj not found. Creating new eye..."
- src.eyeobj = new(src.loc)
+ src.eyeobj = new(loc)
src.eyeobj.ai = src
- src.SetName(src.name)
+ src.rename_character(null, real_name)
if(client && client.eye)
client.eye = src
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 005b1194821..c7ba0de8a64 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -82,18 +82,14 @@
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
//Redefining some robot procs...
-/mob/living/silicon/robot/drone/SetName(pickedName as text)
- // Would prefer to call the grandparent proc but this isn't possible, so..
- real_name = pickedName
- name = real_name
+/mob/living/silicon/robot/drone/rename_character(oldname, newname)
+ // force it to not actually change most things
+ return ..(newname, newname)
-//Redefining some robot procs...
-/mob/living/silicon/robot/drone/updatename()
- real_name = "maintenance drone ([rand(100,999)])"
- name = real_name
+/mob/living/silicon/robot/drone/get_default_name()
+ return "maintenance drone ([rand(100,999)])"
/mob/living/silicon/robot/drone/update_icons()
-
overlays.Cut()
if(stat == 0)
overlays += "eyes-[icon_state]"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index a05c39f8c97..34ecf876574 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -101,7 +101,7 @@ var/list/robot_verbs_default = list(
robot_modules_background.icon_state = "block"
robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
ident = rand(1, 999)
- updatename("Default")
+ rename_character(null, get_default_name())
update_icons()
update_headlamp()
@@ -159,9 +159,61 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
-/mob/living/silicon/robot/SetName(pickedName as text)
- custom_name = pickedName
- updatename()
+/mob/living/silicon/robot/rename_character(oldname, newname)
+ if(!..(oldname, newname))
+ return 0
+
+ if(oldname != real_name)
+ notify_ai(3, oldname, newname)
+ custom_name = (newname != get_default_name()) ? newname : null
+ setup_PDA()
+
+ //We also need to update name of internal camera.
+ if (camera)
+ camera.c_tag = newname
+
+ //Check for custom sprite
+ if(!custom_sprite)
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = text2list(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = text2list(line, ";")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2)
+ continue;
+
+ if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ icon = 'icons/mob/custom-synthetic.dmi'
+
+ return 1
+
+/mob/living/silicon/robot/proc/get_default_name(var/prefix as text)
+ if(prefix)
+ modtype = prefix
+ if(mmi)
+ if(istype(mmi, /obj/item/device/mmi/posibrain))
+ braintype = "Android"
+ else
+ braintype = "Cyborg"
+ else
+ braintype = "Robot"
+
+ if(custom_name)
+ return custom_name
+ else
+ return "[modtype] [braintype]-[num2text(ident)]"
+
+/mob/living/silicon/robot/verb/Namepick()
+ set category = "Robot Commands"
+ if(custom_name)
+ return 0
+
+ rename_self(braintype, 1)
/mob/living/silicon/robot/proc/sync()
if(lawupdate && connected_ai)
@@ -172,7 +224,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/setup_PDA()
if (!rbPDA)
rbPDA = new/obj/item/device/pda/ai(src)
- rbPDA.set_name_and_job(custom_name,braintype)
+ rbPDA.set_name_and_job(real_name, braintype)
if(scrambledcodes)
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
if(M)
@@ -300,13 +352,12 @@ var/list/robot_verbs_default = list(
icon_state = "droidcombat"
if("Peacekeeper")
- module= new /obj/item/weapon/robot_module/peacekeeper(src)
+ module = new /obj/item/weapon/robot_module/peacekeeper(src)
icon_state = "droidpeace"
module.channels = list()
icon_state = "droidpeace"
if("Hunter")
- updatename(module)
module = new /obj/item/weapon/robot_module/alien/hunter(src)
hands.icon_state = "standard"
icon = "icons/mob/alien.dmi"
@@ -326,7 +377,7 @@ var/list/robot_verbs_default = list(
hands.icon_state = lowertext(modtype)
feedback_inc("cyborg_[lowertext(modtype)]",1)
- updatename()
+ rename_character(real_name, get_default_name())
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper")
status_flags &= ~CANPUSH
@@ -335,64 +386,6 @@ var/list/robot_verbs_default = list(
radio.config(module.channels)
notify_ai(2)
-/mob/living/silicon/robot/proc/updatename(var/prefix as text)
- if(prefix)
- modtype = prefix
- if(mmi)
- if(istype(mmi, /obj/item/device/mmi/posibrain))
- braintype = "Android"
- else
- braintype = "Cyborg"
- else
- braintype = "Robot"
-
- var/changed_name = ""
- if(custom_name)
- changed_name = custom_name
- else
- changed_name = "[modtype] [braintype]-[num2text(ident)]"
- real_name = changed_name
- name = real_name
-
- // if we've changed our name, we also need to update the display name for our PDA
- setup_PDA()
-
- //We also need to update name of internal camera.
- if (camera)
- camera.c_tag = changed_name
-
- if(!custom_sprite) //Check for custom sprite
- var/file = file2text("config/custom_sprites.txt")
- var/lines = text2list(file, "\n")
-
- for(var/line in lines)
- // split & clean up
- var/list/Entry = text2list(line, ";")
- for(var/i = 1 to Entry.len)
- Entry[i] = trim(Entry[i])
-
- if(Entry.len < 2)
- continue;
-
- if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
- custom_sprite = 1
- icon = 'icons/mob/custom-synthetic.dmi'
-
-/mob/living/silicon/robot/verb/Namepick()
- set category = "Robot Commands"
- if(custom_name)
- return 0
-
- spawn(0)
- var/newname
- newname = sanitize(copytext(input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text,1,MAX_NAME_LEN))
- if (newname != "")
- notify_ai(3, name, newname)
- custom_name = newname
-
- updatename()
- update_icons()
-
//for borg hotkeys, here module refers to borg inv slot, not core module
/mob/living/silicon/robot/verb/cmd_toggle_module(module as num)
set name = "Toggle Module"
@@ -1303,7 +1296,37 @@ var/list/robot_verbs_default = list(
else
src << "Your icon has been set. You now require a module reset to change it."
+/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
+ if(!connected_ai)
+ return
+ switch(notifytype)
+ if(1) //New Cyborg
+ connected_ai << "
NOTICE - New cyborg connection detected: [name]
"
+ if(2) //New Module
+ connected_ai << "
NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
"
+ if(3) //New Name
+ connected_ai << "
NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
"
+
+/mob/living/silicon/robot/proc/disconnect_from_ai()
+ if(connected_ai)
+ sync() // One last sync attempt
+ connected_ai.connected_robots -= src
+ connected_ai = null
+
+/mob/living/silicon/robot/proc/connect_to_ai(var/mob/living/silicon/ai/AI)
+ if(AI && AI != connected_ai)
+ disconnect_from_ai()
+ connected_ai = AI
+ connected_ai.connected_robots |= src
+ notify_ai(1)
+ sync()
+
+/mob/living/silicon/robot/adjustOxyLoss(var/amount)
+ if (suiciding)
+ ..()
+
/mob/living/silicon/robot/deathsquad
+ base_icon = "nano_bloodhound"
icon_state = "nano_bloodhound"
lawupdate = 0
scrambledcodes = 1
@@ -1350,10 +1373,10 @@ var/list/robot_verbs_default = list(
return
/mob/living/silicon/robot/syndicate
+ base_icon = "syndie_bloodhound"
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
- modtype = "Synd"
faction = list("syndicate")
designation = "Syndicate Assault"
modtype = "Syndicate"
@@ -1384,7 +1407,9 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/medical
+ base_icon = "syndi-medi"
icon_state = "syndi-medi"
+ modtype = "Syndicate Medical"
designation = "Syndicate Medical"
playstyle_string = "You are a Syndicate medical cyborg!
\
You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -1397,68 +1422,40 @@ var/list/robot_verbs_default = list(
..()
module = new /obj/item/weapon/robot_module/syndicate_medical(src)
-/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
- if(!connected_ai)
- return
- switch(notifytype)
- if(1) //New Cyborg
- connected_ai << "
NOTICE - New cyborg connection detected: [name]
"
- if(2) //New Module
- connected_ai << "
NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
"
- if(3) //New Name
- connected_ai << "
NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
"
-
-/mob/living/silicon/robot/proc/disconnect_from_ai()
- if(connected_ai)
- sync() // One last sync attempt
- connected_ai.connected_robots -= src
- connected_ai = null
-
-/mob/living/silicon/robot/proc/connect_to_ai(var/mob/living/silicon/ai/AI)
- if(AI && AI != connected_ai)
- disconnect_from_ai()
- connected_ai = AI
- connected_ai.connected_robots |= src
- notify_ai(1)
- sync()
-
-
-/mob/living/silicon/robot/combat/New()
- ..()
- module = new /obj/item/weapon/robot_module/combat(src)
- module.channels = list("Security" = 1)
+/mob/living/silicon/robot/combat
base_icon = "droidcombat"
icon_state = "droidcombat"
modtype = "Combat"
+ designation = "Combat"
+
+/mob/living/silicon/robot/combat/init()
+ ..()
+ module = new /obj/item/weapon/robot_module/combat(src)
+ module.channels = list("Security" = 1)
//languages
module.add_languages(src)
//subsystems
module.add_subsystems(src)
- updatename()
-
status_flags &= ~CANPUSH
radio.config(module.channels)
notify_ai(2)
-/mob/living/silicon/robot/peacekeeper/New()
- ..()
- module = new /obj/item/weapon/robot_module/peacekeeper(src)
+/mob/living/silicon/robot/peacekeeper
base_icon = "droidpeace"
icon_state = "droidpeace"
modtype = "Peacekeeper"
+ designation = "Peacekeeper"
+
+/mob/living/silicon/robot/peacekeeper/init()
+ ..()
+ module = new /obj/item/weapon/robot_module/peacekeeper(src)
//languages
module.add_languages(src)
//subsystems
module.add_subsystems(src)
- updatename()
-
status_flags &= ~CANPUSH
- notify_ai(2)
-
-/mob/living/silicon/robot/adjustOxyLoss(var/amount)
- if (suiciding)
- ..()
+ notify_ai(2)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 0ca8b27c852..992f846c524 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -50,9 +50,14 @@
AH.unregister(src)
return ..()
-/mob/living/silicon/proc/SetName(pickedName as text)
- real_name = pickedName
+/mob/living/silicon/rename_character(oldname, newname)
+ // we actually don't want it changing minds and stuff
+ if(!newname)
+ return 0
+
+ real_name = newname
name = real_name
+ return 1
/mob/living/silicon/proc/show_laws()
return
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 0738bb17e6a..57bd074db43 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -414,25 +414,26 @@
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
if(istype(O, /obj/item/weapon/kitchen/knife))
harvest()
- else if(istype(O) && istype(user) && !O.attack(src, user))
+ else
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- var/damage = 0
- if(O.force)
- if(O.force >= force_threshold)
- damage = O.force
- if (O.damtype == STAMINA)
- damage = 0
- visible_message("[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!",\
- "[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!")
+ if(istype(O) && istype(user) && !O.attack(src, user))
+ var/damage = 0
+ if(O.force)
+ if(O.force >= force_threshold)
+ damage = O.force
+ if (O.damtype == STAMINA)
+ damage = 0
+ visible_message("[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!",\
+ "[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!")
+ else
+ visible_message("[O] bounces harmlessly off of [src].",\
+ "[O] bounces harmlessly off of [src].")
+ playsound(loc, O.hitsound, 50, 1, -1)
else
- visible_message("[O] bounces harmlessly off of [src].",\
- "[O] bounces harmlessly off of [src].")
- playsound(loc, O.hitsound, 50, 1, -1)
- else
- user.visible_message("[user] gently taps [src] with [O].",\
- "This weapon is ineffective, it does no damage.")
- adjustBruteLoss(damage)
+ user.visible_message("[user] gently taps [src] with [O].",\
+ "This weapon is ineffective, it does no damage.")
+ adjustBruteLoss(damage)
/mob/living/simple_animal/movement_delay()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index ebb94255278..4f7327180c6 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -199,8 +199,6 @@
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
- var/update_icon = 1 //Set to 1 to trigger update_icons() at the next life() call
-
var/status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc)
var/area/lastarea = null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 2a8363ad16f..49a52de9113 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -557,10 +557,81 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
check_eye(src)
return 1
-/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
- if(!C.can_use() || !is_in_chassis())
+/mob/proc/rename_character(oldname, newname)
+ if(!newname)
return 0
+ real_name = newname
+ name = newname
+ if(mind)
+ mind.name = newname
+ if(dna)
+ dna.real_name = real_name
- eyeobj.setLoc(get_turf(C))
- client.eye = eyeobj
+ if(oldname)
+ //update the datacore records! This is goig to be a bit costly.
+ for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
+ for(var/datum/data/record/R in L)
+ if(R.fields["name"] == oldname)
+ R.fields["name"] = newname
+ break
+
+ //update our pda and id if we have them on our person
+ var/list/searching = GetAllContents(searchDepth = 3)
+ var/search_id = 1
+ var/search_pda = 1
+
+ for(var/A in searching)
+ if( search_id && istype(A,/obj/item/weapon/card/id) )
+ var/obj/item/weapon/card/id/ID = A
+ if(ID.registered_name == oldname)
+ ID.registered_name = newname
+ ID.name = "[newname]'s ID Card ([ID.assignment])"
+ if(!search_pda) break
+ search_id = 0
+
+ else if( search_pda && istype(A,/obj/item/device/pda) )
+ var/obj/item/device/pda/PDA = A
+ if(PDA.owner == oldname)
+ PDA.owner = newname
+ PDA.name = "PDA-[newname] ([PDA.ownjob])"
+ if(!search_id) break
+ search_pda = 0
+
+ //Fixes renames not being reflected in objective text
+ var/list/O = subtypesof(/datum/objective)
+ var/length
+ var/pos
+ for(var/datum/objective/objective in O)
+ if(objective.target != mind) continue
+ length = lentext(oldname)
+ pos = findtextEx(objective.explanation_text, oldname)
+ objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
return 1
+
+/mob/proc/rename_self(var/role, var/allow_numbers=0)
+ spawn(0)
+ var/oldname = real_name
+
+ var/time_passed = world.time
+ var/newname
+
+ for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
+ newname = input(src,"You are a [role]. Would you like to change your name to something else?", "Name change",oldname) as text
+ if((world.time-time_passed)>300)
+ return //took too long
+ newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
+
+ for(var/mob/living/M in player_list)
+ if(M == src)
+ continue
+ if(!newname || M.real_name == newname)
+ newname = null
+ break
+ if(newname)
+ break //That's a suitable name!
+ src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
+
+ if(!newname) //we'll stick with the oldname then
+ return
+
+ rename_character(oldname, newname)
\ No newline at end of file
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index f31b76639ed..26e2497ac0c 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -64,7 +64,7 @@
O.add_ai_verbs()
- O.rename_self("ai",1)
+ O.rename_self("AI",1)
spawn
qdel(src)
return O
diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm
new file mode 100644
index 00000000000..f8592e35c5d
--- /dev/null
+++ b/code/modules/paperwork/frames.dm
@@ -0,0 +1,315 @@
+/obj/item/weapon/picture_frame
+ name = "picture frame"
+ desc = "Its patented design allows it to be folded larger or smaller to accommodate standard paper, photo, and poster, and canvas sizes."
+ icon = 'icons/obj/bureaucracy.dmi'
+
+ var/icon_base
+ var/obj/displayed
+
+ var/list/wide_posters = list(
+ "poster22_legit", "poster23", "poster23_legit", "poster24", "poster24_legit",
+ "poster25", "poster27_legit", "poster28", "poster29")
+
+/obj/item/weapon/picture_frame/New(loc, obj/item/weapon/D)
+ ..()
+ if(D)
+ insert(D)
+ update_icon()
+
+/obj/item/weapon/picture_frame/Destroy()
+ if(displayed)
+ displayed = null
+ for(var/A in contents)
+ qdel(A)
+ return ..()
+
+/obj/item/weapon/picture_frame/update_icon()
+ overlays.Cut()
+
+ if(displayed)
+ overlays |= getFlatIcon(displayed)
+
+ if(istype(displayed, /obj/item/weapon/photo))
+ icon_state = "[icon_base]-photo"
+ else if(istype(displayed, /obj/structure/sign/poster))
+ icon_state = "[icon_base]-[(displayed.icon_state in wide_posters) ? "wposter" : "poster"]"
+ else if(istype(displayed, /obj/item/weapon/canvas))
+ icon_state = "[icon_base]-canvas-[displayed.icon_state]"
+ else
+ icon_state = "[icon_base]-paper"
+
+ overlays |= icon_state
+
+/obj/item/weapon/picture_frame/proc/insert(obj/D)
+ if(istype(D, /obj/item/weapon/contraband/poster))
+ var/obj/item/weapon/contraband/poster/P = D
+ displayed = P.resulting_poster
+ P.resulting_poster = null
+ else
+ displayed = D
+
+ name = displayed.name
+ displayed.pixel_x = 0
+ displayed.pixel_y = 0
+ displayed.forceMove(src)
+ if(istype(D, /obj/item/weapon/contraband/poster))
+ qdel(D)
+
+/obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(displayed)
+ playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].")
+
+ if(istype(displayed, /obj/structure/sign/poster))
+ var/obj/structure/sign/poster/P = displayed
+ P.roll_and_drop(user.loc)
+ else
+ displayed.forceMove(user.loc)
+ displayed = null
+ name = initial(name)
+ update_icon()
+ else
+ user << "There is nothing to remove from \the [src]."
+ else if(istype(I, /obj/item/weapon/crowbar))
+ playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ user.visible_message("[user] breaks down \the [src].", "You break down \the [src].")
+ for(var/A in contents)
+ if(istype(A, /obj/structure/sign/poster))
+ var/obj/structure/sign/poster/P = A
+ P.roll_and_drop(user.loc)
+ else
+ var/obj/O = A
+ O.forceMove(user.loc)
+ displayed = null
+ qdel(src)
+ else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/contraband/poster) || istype(I, /obj/item/weapon/canvas))
+ if(!displayed)
+ user.unEquip(I)
+ insert(I)
+ update_icon()
+ else
+ user << "\The [src] already contains \a [displayed]."
+ else
+ return ..()
+
+/obj/item/weapon/picture_frame/afterattack(atom/target, mob/user, proximity_flag)
+ if(proximity_flag && istype(target, /turf/simulated/wall))
+ place(target, user)
+ else
+ ..()
+
+/obj/item/weapon/picture_frame/proc/place(turf/T, mob/user)
+ var/stuff_on_wall = 0
+ for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff
+ if(istype(O, /obj/structure/sign))
+ user << "\The [T] is far too cluttered to place \a [src]!"
+ return
+ stuff_on_wall++
+ if(stuff_on_wall >= 4)
+ user << "\The [T] is far too cluttered to place \a [src]!"
+ return
+
+ user << "You start place \the [src] on \the [T]."
+
+ var/px = 0
+ var/py = 0
+ var/newdir = getRelativeDirection(user, T)
+
+ switch(newdir)
+ if(NORTH)
+ py = 32
+ if(EAST)
+ px = 32
+ if(SOUTH)
+ py = -32
+ if(WEST)
+ px = -32
+ else
+ user << "You cannot reach \the [T] from here!"
+ return
+
+ user.unEquip(src)
+ var/obj/structure/sign/picture_frame/PF = new(user.loc, src)
+ PF.dir = newdir
+ PF.pixel_x = px
+ PF.pixel_y = py
+
+ playsound(PF.loc, 'sound/items/Deconstruct.ogg', 100, 1)
+
+/obj/item/weapon/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
+ ..()
+ if(displayed)
+ displayed.examine(user, distance, infix, suffix)
+
+/obj/item/weapon/picture_frame/attack_self(mob/user)
+ if(displayed)
+ if(istype(displayed, /obj/item))
+ var/obj/item/I = displayed
+ I.attack_self(user)
+ else
+ ..()
+
+
+
+/obj/item/weapon/picture_frame/glass
+ icon_base = "glass"
+ icon_state = "glass-poster"
+ materials = list(MAT_METAL = 25, MAT_GLASS = 75)
+
+/obj/item/weapon/picture_frame/wooden
+ icon_base = "wood"
+ icon_state = "wood-poster"
+
+/obj/item/weapon/picture_frame/wooden/New()
+ ..()
+ new /obj/item/stack/sheet/wood(src, 1)
+
+
+
+/obj/structure/sign/picture_frame
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "glass-poster"
+
+ var/obj/item/weapon/picture_frame/frame
+ var/obj/item/weapon/explosive
+
+ var/tilted = 0
+ var/tilt_transform = null
+
+/obj/structure/sign/picture_frame/New(loc, F)
+ ..()
+ frame = F
+ frame.pixel_x = 0
+ frame.pixel_y = 0
+ frame.forceMove(src)
+ name = frame.name
+ update_icon()
+
+ if(!tilt_transform)
+ tilt_transform = turn(matrix(), -10)
+
+ if(tilted)
+ transform = tilt_transform
+ verbs |= /obj/structure/sign/picture_frame/proc/untilt
+ else
+ verbs |= /obj/structure/sign/picture_frame/proc/tilt
+
+/obj/structure/sign/picture_frame/Destroy()
+ if(frame)
+ qdel(frame)
+ frame = null
+ return ..()
+
+/obj/structure/sign/picture_frame/update_icon()
+ overlays.Cut()
+ if(frame)
+ icon = null
+ icon_state = null
+ overlays |= getFlatIcon(frame)
+ else
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+
+/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.")
+ if(do_after(user, 100, target = src))
+ playsound(src, 'sound/items/Deconstruct.ogg', 100, 1)
+ user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.")
+ frame.forceMove(user.loc)
+ frame = null
+ if(explosive)
+ explosive.forceMove(user.loc)
+ explosive = null
+ qdel(src)
+ if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/c4))
+ if(explosive)
+ user << "There is already a device attached behind \the [src], remove it first."
+ return 1
+ if(!tilted)
+ user << "\The [src] needs to be already tilted before being rigged with \the [I]."
+ return 1
+ user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].")
+ if(do_after(user, 150, target = src))
+ if(explosive || !tilted)
+ return
+ playsound(src, 'sound/weapons/handcuffs.ogg', 50, 1)
+ user.unEquip(I)
+ explosive = I
+ I.forceMove(src)
+ user.visible_message("[user] fiddles with the back of \the [src].", "You secure \the [I] behind \the [src].")
+
+ message_admins("[key_name_admin(user)] attached [I] to a picture frame.")
+ log_game("[key_name_admin(user)] attached [I] to a picture frame.")
+ return 1
+ else
+ return ..()
+
+/obj/structure/sign/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
+ if(frame)
+ frame.examine(user, distance, infix, suffix)
+ else
+ ..()
+
+/obj/structure/sign/picture_frame/attack_hand(mob/user)
+ if(frame)
+ frame.attack_self(user)
+ else
+ ..()
+
+/obj/structure/sign/picture_frame/ex_act(severity)
+ explode()
+ ..(severity)
+
+/obj/structure/sign/picture_frame/proc/explode()
+ if(istype(explosive, /obj/item/weapon/grenade))
+ var/obj/item/weapon/grenade/G = explosive
+ explosive = null
+ G.prime()
+ else if(istype(explosive, /obj/item/weapon/c4))
+ var/obj/item/weapon/c4/C = explosive
+ explosive = null
+ C.target = get_step(get_turf(src), dir)
+ C.explode(get_turf(loc))
+
+/obj/structure/sign/picture_frame/proc/toggle_tilt(mob/user)
+ if(!isliving(usr) || usr.stat)
+ return
+
+ tilted = !tilted
+
+ if(tilted)
+ animate(src, transform = tilt_transform, time = 10, easing = BOUNCE_EASING)
+ verbs -= /obj/structure/sign/picture_frame/proc/tilt
+ verbs |= /obj/structure/sign/picture_frame/proc/untilt
+ else
+ animate(src, transform = matrix(), time = 10, easing = CUBIC_EASING | EASE_IN)
+ verbs -= /obj/structure/sign/picture_frame/proc/untilt
+ verbs |= /obj/structure/sign/picture_frame/proc/tilt
+ explode()
+
+/obj/structure/sign/picture_frame/proc/tilt()
+ set name = "Tilt Picture"
+ set category = "Object"
+ set src in oview(1)
+
+ toggle_tilt(usr)
+
+/obj/structure/sign/picture_frame/proc/untilt()
+ set name = "Straighten Picture"
+ set category = "Object"
+ set src in oview(1)
+
+ toggle_tilt(usr)
+
+/obj/structure/sign/picture_frame/hear_talk(mob/living/M as mob, msg)
+ ..()
+ for(var/obj/O in contents)
+ O.hear_talk(M, msg)
+
+/obj/structure/sign/picture_frame/hear_message(mob/living/M as mob, msg)
+ ..()
+ for(var/obj/O in contents)
+ O.hear_message(M, msg)
\ No newline at end of file
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index 596a6c9016d..c88dce0e20f 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -435,7 +435,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
qdel(A)
programs.Cut()
if(cartridge)
- cartridge.forceMove(T)
+ qdel(cartridge)
+ cartridge = null
return ..()
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 1558304b191..2c0eb581bde 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -98,6 +98,15 @@ obj/item/weapon/gun/energy/laser/retro
projectile_type = "/obj/item/projectile/beam/xray"
charge_cost = 500
+/obj/item/weapon/gun/energy/immolator
+ name = "Immolator laser gun"
+ desc = "A modified laser gun, shooting highly concetrated beams with higher intensity that ignites the target, for the cost of draining more power per shot"
+ icon_state = "immolator"
+ item_state = "laser"
+ fire_sound = 'sound/weapons/laser3.ogg'
+ projectile_type = "/obj/item/projectile/beam/immolator"
+ origin_tech = "combat=4;materials=4;magnets=3;plasmatech=2"
+ charge_cost = 1250
////////Laser Tag////////////////////
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index cbe75d884ef..319633e6277 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -38,6 +38,17 @@
weaken = 5
stutter = 5
+
+/obj/item/projectile/beam/immolator
+ name = "immolation beam"
+
+/obj/item/projectile/beam/immolator/on_hit(var/atom/target, var/blocked = 0)
+ . = ..()
+ if(istype(target, /mob/living/carbon))
+ var/mob/living/carbon/M = target
+ M.adjust_fire_stacks(1)
+ M.IgniteMob()
+
/obj/item/projectile/beam/xray
name = "xray beam"
icon_state = "xray"
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 91ae6fa24bf..ed64d73df4e 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -94,8 +94,7 @@
M.bodytemperature = temperature
if(temperature > 500)//emagged
M.adjust_fire_stacks(0.5)
- M.on_fire = 1
- M.update_icon = 1
+ M.IgniteMob()
playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0)
return 1
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
index 8894c903a27..d6e1ed34ce4 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
@@ -148,6 +148,7 @@
on_reaction(var/datum/reagents/holder)
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
+ borks = adminReagentCheck(borks)
// BORK BORK BORK
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
@@ -175,6 +176,7 @@
on_reaction(var/datum/reagents/holder)
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
+ borks = adminReagentCheck(borks)
// BORK BORK BORK
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm
index c84b0f327e9..eab338f2882 100644
--- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm
+++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm
@@ -16,7 +16,7 @@
//Processing flags, defines the type of mobs the reagent will affect
//By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
var/process_flags = ORGANIC
-
+ var/admin_only = 0
/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
if(!istype(M, /mob/living)) return 0
diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
index 6c302321b89..765bc480487 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
@@ -5,6 +5,7 @@
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
+ admin_only=1
/datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob)
if(!M) M = holder.my_atom ///This can even heal dead people.
@@ -51,4 +52,27 @@
/datum/reagent/adminordrazine/nanites
name = "Nanites"
id = "nanites"
- description = "Nanomachines that aid in rapid cellular regeneration."
\ No newline at end of file
+ description = "Nanomachines that aid in rapid cellular regeneration."
+
+
+// For random item spawning. Takes a list of paths, and returns the same list without anything that contains admin only reagents
+
+/proc/adminReagentCheck(var/list/incoming)
+ var/list/outgoing[0]
+ for(var/tocheck in incoming)
+ if(ispath(tocheck))
+ var/check = new tocheck
+ if (istype(check, /atom))
+ var/atom/reagentCheck = check
+ var/datum/reagents/reagents = reagentCheck.reagents
+ var/admin = 0
+ for(var/reag in reagents.reagent_list)
+ var/datum/reagent/reagent = reag
+ if(reagent.admin_only)
+ admin = 1
+ break
+ if(!(admin))
+ outgoing += tocheck
+ else
+ outgoing += tocheck
+ return outgoing
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 3bd8634758a..78b6ebb3fff 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -69,4 +69,11 @@
for (var/datum/reagent/R in snack.reagents.reagent_list) //no reagents will be left behind
data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return data
- else return "No reagents"
\ No newline at end of file
+ else return "No reagents"
+
+/obj/item/weapon/reagent_containers/wash(mob/user, atom/source)
+ if(is_open_container())
+ reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this))
+ user << "You fill [src] from [source]."
+ return
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index aa5f7723316..0b47df7c1c8 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -1674,6 +1674,13 @@
if(volume >= 5)
return Expand()
+/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
+ if(wrapped)
+ ..()
+ return
+ if(do_after(user, 40, target = source))
+ return 1
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
if(isnull(gcDestroyed))
visible_message("[src] expands!")
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 6e5bcf0389b..68b0090e317 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -273,6 +273,14 @@
materials = list(MAT_METAL = 100)
build_path = /obj/item/weapon/canvas/twentythreeXtwentythree
category = list("initial", "Miscellaneous")
+
+/datum/design/glass_picture_frame
+ name = "Glass Picture Frame"
+ id = "glass_picture_frame"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 25, MAT_GLASS = 75)
+ build_path = /obj/item/weapon/picture_frame/glass
+ category = list("initial", "Miscellaneous")
/datum/design/camera_assembly
name = "Camera Assembly"
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 01917cb8ba0..4ce1f95e8d3 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -270,4 +270,15 @@
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 4000)
build_path = /obj/item/weapon/gun/energy/xray
locked = 1
+ category = list("Weapons")
+
+/datum/design/immolator
+ name = "Immolator Laser Gun"
+ desc = "Has fewer shots than a regular laser gun, but ignites the target on hit"
+ id = "immolator"
+ req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 5, "magnets" = 4)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_SILVER = 3000, MAT_PLASMA = 2000)
+ build_path = /obj/item/weapon/gun/energy/immolator
+ locked = 1
category = list("Weapons")
\ No newline at end of file
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 7159f83ab0d..9d2c0dd1bb9 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -111,7 +111,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
Console.set_light(2)
/obj/machinery/message_server/attack_hand(user as mob)
-// user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentCom delays."
+// user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays."
user << "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]"
active = !active
update_icon()
diff --git a/html/changelogs/AutoChangeLog-pr-3512.yml b/html/changelogs/AutoChangeLog-pr-3512.yml
new file mode 100644
index 00000000000..bc049838231
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3512.yml
@@ -0,0 +1,4 @@
+author: PPI
+delete-after: True
+changes:
+ - rscadd: "Adds the ability to hide papers in vents. You can now leave a romantic love letter, exchange information in secret, or hide papers infused with the power of nar'sie from sight."
diff --git a/html/changelogs/AutoChangeLog-pr-3564.yml b/html/changelogs/AutoChangeLog-pr-3564.yml
new file mode 100644
index 00000000000..3fbd6d96125
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3564.yml
@@ -0,0 +1,5 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - tweak: "The defib should be more reliable on people who have ghosted"
+ - tweak: "The defib will now give a message if the ghost is still haunting about"
diff --git a/html/changelogs/AutoChangeLog-pr-3609.yml b/html/changelogs/AutoChangeLog-pr-3609.yml
new file mode 100644
index 00000000000..201ed3bbc47
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3609.yml
@@ -0,0 +1,9 @@
+author: KasparoVy
+delete-after: True
+changes:
+ - rscadd: "Adds the ability to open/close bomber jackets."
+ - rscadd: "Adds a security bomber jacket. This jacket inherits the protection and storage capabilities as a standard Security vest with additional bomber jacket benefits."
+ - rscadd: "Adds UI button in top left of screen for jacket adjustment."
+ - tweak: "Replaces the standard bomber jacket in the Pod Pilot bay with the Security version."
+ - tweak: "Centralizes jacket/coat adjustment handling."
+ - tweak: "All jackets start closed by default."
diff --git a/html/changelogs/AutoChangeLog-pr-3616.yml b/html/changelogs/AutoChangeLog-pr-3616.yml
new file mode 100644
index 00000000000..580ebbe26d6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3616.yml
@@ -0,0 +1,4 @@
+author: ppi
+delete-after: True
+changes:
+ - tweak: "When revealed Revenants will not be able to move at the maximum move speed, nor be able to pass through any solid object, like walls, windows, grills, computers and mechs."
diff --git a/html/changelogs/AutoChangeLog-pr-3634.yml b/html/changelogs/AutoChangeLog-pr-3634.yml
new file mode 100644
index 00000000000..ff92ff6fe7d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3634.yml
@@ -0,0 +1,9 @@
+author: KasparoVy
+delete-after: True
+changes:
+ - rscadd: "Geneticist duffelbag on-mob sprite (for all species)."
+ - rscadd: "Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit."
+ - tweak: "Refactors back-item icon generation."
+ - bugfix: "Typo in the description of Santa's sack."
+ - bugfix: "Missing punctuation and gender macros in the description of the bag of holding."
+ - bugfix: "The tweak to back-icon generation fixes a bug where the wrong sprite name was being used to generate back-item icons."
diff --git a/html/changelogs/AutoChangeLog-pr-3643.yml b/html/changelogs/AutoChangeLog-pr-3643.yml
new file mode 100644
index 00000000000..6ba19f3e5b0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3643.yml
@@ -0,0 +1,4 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - bugfix: "No more superspeed attacking simplemobs"
diff --git a/html/changelogs/AutoChangeLog-pr-3644.yml b/html/changelogs/AutoChangeLog-pr-3644.yml
new file mode 100644
index 00000000000..4dd92da6425
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3644.yml
@@ -0,0 +1,4 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - tweak: "New players now show up properly under the \"who\" verb when used as an admin"
diff --git a/html/changelogs/AutoChangeLog-pr-3645.yml b/html/changelogs/AutoChangeLog-pr-3645.yml
new file mode 100644
index 00000000000..eed9a42baea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3645.yml
@@ -0,0 +1,8 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - rscadd: "Mining drones will now automatically collect sand lying around"
+ - bugfix: "RIPLEYs can now drill asteroid turfs for sand"
+ - rscadd: "You can now load exosuit fuel generators with items containing their material - this means you can fuel yourself off of ores, but this will be highly inefficient and cost you mining points later on, as you can't take fuel back out."
+ - rscadd: "You can now load the fuel generators from an ore box."
+ - tweak: "The plasma generator now produces 3x as much power from the same amount of fuel - this lets it even remotely compete with the uranium generator."
diff --git a/html/changelogs/AutoChangeLog-pr-3652.yml b/html/changelogs/AutoChangeLog-pr-3652.yml
new file mode 100644
index 00000000000..5b2dea96f9d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3652.yml
@@ -0,0 +1,4 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - tweak: "You can now light cigarettes off of burning mobs."
diff --git a/html/changelogs/AutoChangeLog-pr-3658.yml b/html/changelogs/AutoChangeLog-pr-3658.yml
new file mode 100644
index 00000000000..db029e264d8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3658.yml
@@ -0,0 +1,4 @@
+author: Regen1
+delete-after: True
+changes:
+ - rscadd: "Adds the Immolator laser gun, a modified laser gun with 8 shots that will ignite mobs, can be made in R&D"
diff --git a/html/changelogs/AutoChangeLog-pr-3668.yml b/html/changelogs/AutoChangeLog-pr-3668.yml
new file mode 100644
index 00000000000..5bc3205d94a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3668.yml
@@ -0,0 +1,4 @@
+author: Tastyfish
+delete-after: True
+changes:
+ - rscadd: "There are now picture frames that can be made from the autolathe or wood planks for papers, photos, posters, and canvases!"
diff --git a/html/changelogs/AutoChangeLog-pr-3670.yml b/html/changelogs/AutoChangeLog-pr-3670.yml
new file mode 100644
index 00000000000..be225db56b3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3670.yml
@@ -0,0 +1,4 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - tweak: "Exosuit tracking beacons now fit in boxes - prior, they were far too large for even a backpack, as they shared the same size as all other mecha equipment"
diff --git a/html/changelogs/pinatacolada-pr-protectstationnolongercrew.yml b/html/changelogs/pinatacolada-pr-protectstationnolongercrew.yml
new file mode 100644
index 00000000000..d1e410d23e5
--- /dev/null
+++ b/html/changelogs/pinatacolada-pr-protectstationnolongercrew.yml
@@ -0,0 +1,9 @@
+author: "pinatacolada"
+
+
+delete-after: True
+
+
+changes:
+ - tweak: "Makes the Protect Station AI law board no longer consider people that damage the station crew, instead of human"
+
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 043c0f35be0..988ebe78eea 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index e13cab2b876..c493ef8c94b 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 0231c8122d9..37641a49ed7 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 97d0e9c0d5a..e081e051812 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/species/vox/back.dmi b/icons/mob/species/vox/back.dmi
new file mode 100644
index 00000000000..6ab32288475
Binary files /dev/null and b/icons/mob/species/vox/back.dmi differ
diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi
index c56d9f1124f..2e6b182ceb2 100644
Binary files a/icons/mob/species/vox/shoes.dmi and b/icons/mob/species/vox/shoes.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 0ac8cffa837..88383fd5da8 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 159d2f572f2..1bd8373670c 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 56a2195ad69..148bf8b21a1 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 988f0153964..f4b8895a5de 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 4a187225cd3..91432c14d1a 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index f69d1560cb7..13913aae9bd 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/nano/assets/nano.js b/nano/assets/nano.js
index 3c4944c74b7..030468c4940 100644
--- a/nano/assets/nano.js
+++ b/nano/assets/nano.js
@@ -1 +1 @@
-function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStatePDAClass(){this.key="pda",this.key=this.key.toLowerCase(),this.current_template="",NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=0>n?Math.ceil(n):Math.floor(n),0>n&&(n+=t);t>n;n++)if(n in this&&this[n]===e)return n;return-1}),String.prototype.format||(String.prototype.format=function(e){var t=this;return t.replace(String.prototype.format.regex,function(t){var n,a=parseInt(t.substring(1,t.length-1));return n=a>=0?e[a]:-1===a?"{":-2===a?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly.");var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){l(t),e=!0})},s=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed.
Error name: "+r.name+"
Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?l(a):t=a},l=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){s(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src","nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",s="noIcon";"undefined"!=typeof t&&t&&(i='',s="hasIcon"),"undefined"!=typeof r&&r||(r="link");var l="";return"undefined"!=typeof o&&o&&(l='id="'+o+'"'),"undefined"!=typeof a&&a?'"+i+e+"
":'"+i+e+"
"},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;et?t>e?e=t:e>n&&(e=n):e>t?e=t:n>e&&(e=n),"undefined"!=typeof a&&a||(a=""),"undefined"!=typeof r&&r||(r="");var o=Math.round((e-t)/(n-t)*100);return'"},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good"':1==e?'"Minor Alert"':'"Major Alert"'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'Please place a valid subject into the DNA modifier.
';var o=e.split(""),i='1
',s=1,l=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:s,selectUISubblock:l}:{selectSEBlock:s,selectSESubblock:l};var d="linkActive";s==t&&l==n&&(d="selected"),i+='
'+o[c]+"
",c++,c%a==0&&c
"},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStatePDAClass.inheritsFrom(NanoStateClass);var NanoStatePDA=new NanoStatePDAClass;NanoStatePDAClass.prototype.onUpdate=function(e){NanoStateClass.prototype.onUpdate.call(this,e);var t=this;try{if(null!=e.data.app){var n=e.data.app.template;null!=n&&n!=t.current_template?$.when($.ajax({url:n+".tmpl",cache:!1,dataType:"text"})).done(function(a){a+='';try{NanoTemplate.addTemplate("app",a),NanoTemplate.resetTemplate("app"),$("#uiApp").html(NanoTemplate.parse("app",e)),t.current_template=n,2==e.config.status&&($("#uiApp .linkActive").addClass("linkPending"),$("#uiApp .linkActive").oneTime(400,"linkPending",function(){$("#uiApp .linkActive").removeClass("linkPending inactive")}))}catch(r){return void reportError("ERROR: An error occurred while loading the PDA App UI: "+r.message)}}).fail(function(){reportError("ERROR: Loading template app("+n+") failed!")}):NanoTemplate.templateExists("app")&&$("#uiApp").html(NanoTemplate.parse("app",e))}}catch(a){return void reportError("ERROR: An error occurred while rendering the PDA App UI: "+a.message)}},NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},resetTemplate:function(e){n[e]=null},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"Template error (does not exist)
";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"Template error (failed to compile)
"):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}(),NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},s=function(e,t){NanoUtility.winset("size",e+","+t)},l=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d(),f())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$("#uiTitleWrapper").on("mousemove",function(e){p()}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#uiTitleWrapper").on("mouseup",function(a){e=!1,t=null,n=null})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){$("#resize").on("mousemove",function(e){m()}),$("#resize").on("mousedown",function(e){a=!0}),$("#resize").on("mouseup",function(e){a=!1})},m=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),s(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){l()})}}}();
\ No newline at end of file
+function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStatePDAClass(){this.key="pda",this.key=this.key.toLowerCase(),this.current_template="",NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=0>n?Math.ceil(n):Math.floor(n),0>n&&(n+=t);t>n;n++)if(n in this&&this[n]===e)return n;return-1}),String.prototype.format||(String.prototype.format=function(e){var t=this;return t.replace(String.prototype.format.regex,function(t){var n,a=parseInt(t.substring(1,t.length-1));return n=a>=0?e[a]:-1===a?"{":-2===a?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly.");var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){l(t),e=!0})},s=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed.
Error name: "+r.name+"
Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?l(a):t=a},l=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){s(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src","nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",s="noIcon";"undefined"!=typeof t&&t&&(i='',s="hasIcon"),"undefined"!=typeof r&&r||(r="link");var l="";return"undefined"!=typeof o&&o&&(l='id="'+o+'"'),"undefined"!=typeof a&&a?'"+i+e+"
":'"+i+e+"
"},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;et?t>e?e=t:e>n&&(e=n):e>t?e=t:n>e&&(e=n),"undefined"!=typeof a&&a||(a=""),"undefined"!=typeof r&&r||(r="");var o=Math.round((e-t)/(n-t)*100);return'"},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good"':1==e?'"Minor Alert"':'"Major Alert"'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'Please place a valid subject into the DNA modifier.
';var o=e.split(""),i='1
',s=1,l=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:s,selectUISubblock:l}:{selectSEBlock:s,selectSESubblock:l};var d="linkActive";s==t&&l==n&&(d="selected"),i+='
'+o[c]+"
",c++,c%a==0&&c
"},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStatePDAClass.inheritsFrom(NanoStateClass);var NanoStatePDA=new NanoStatePDAClass;NanoStatePDAClass.prototype.onUpdate=function(e){NanoStateClass.prototype.onUpdate.call(this,e);var t=this;try{if(null!=e.data.app){var n=e.data.app.template;null!=n&&n!=t.current_template?$.when($.ajax({url:n+".tmpl",cache:!1,dataType:"text"})).done(function(a){a+='';try{NanoTemplate.addTemplate("app",a),NanoTemplate.resetTemplate("app"),$("#uiApp").html(NanoTemplate.parse("app",e)),t.current_template=n,t.onAfterUpdate(e)}catch(r){return void reportError("ERROR: An error occurred while loading the PDA App UI: "+r.message)}}).fail(function(){reportError("ERROR: Loading template app("+n+") failed!")}):NanoTemplate.templateExists("app")&&$("#uiApp").html(NanoTemplate.parse("app",e))}}catch(a){return void reportError("ERROR: An error occurred while rendering the PDA App UI: "+a.message)}},NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},resetTemplate:function(e){n[e]=null},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"Template error (does not exist)
";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"Template error (failed to compile)
"):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}(),NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},s=function(e,t){NanoUtility.winset("size",e+","+t)},l=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d(),f())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$("#uiTitleWrapper").on("mousemove",function(e){p()}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#uiTitleWrapper").on("mouseup",function(a){e=!1,t=null,n=null})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){$("#resize").on("mousemove",function(e){m()}),$("#resize").on("mousedown",function(e){a=!0}),$("#resize").on("mouseup",function(e){a=!1})},m=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),s(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){l()})}}}();
\ No newline at end of file
diff --git a/nano/scripts/nano/nano_state_pda.js b/nano/scripts/nano/nano_state_pda.js
index 13135046caf..d46419bfeaf 100644
--- a/nano/scripts/nano/nano_state_pda.js
+++ b/nano/scripts/nano/nano_state_pda.js
@@ -31,12 +31,7 @@ NanoStatePDAClass.prototype.onUpdate = function(data) {
$("#uiApp").html(NanoTemplate.parse('app', data));
state.current_template = template;
- if(data['config']['status'] == 2) {
- $('#uiApp .linkActive').addClass('linkPending');
- $('#uiApp .linkActive').oneTime(400, 'linkPending', function () {
- $('#uiApp .linkActive').removeClass('linkPending inactive');
- });
- }
+ state.onAfterUpdate(data);
} catch(error) {
reportError('ERROR: An error occurred while loading the PDA App UI: ' + error.message);
return;
diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl
index 7170d8a1a69..c10ea44ff86 100644
--- a/nano/templates/identification_computer.tmpl
+++ b/nano/templates/identification_computer.tmpl
@@ -221,7 +221,7 @@
{{if data.centcom_access}}
- | CentCom |
+ CentComm |
{{for data.centcom_jobs}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
diff --git a/paradise.dme b/paradise.dme
index ca432cad289..eeaf25fc53b 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1567,6 +1567,7 @@
#include "code\modules\paperwork\faxmachine.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
+#include "code\modules\paperwork\frames.dm"
#include "code\modules\paperwork\handlabeler.dm"
#include "code\modules\paperwork\paper.dm"
#include "code\modules\paperwork\paper_bundle.dm"
|