Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor

This commit is contained in:
Aurorablade
2016-02-24 06:27:16 -05:00
122 changed files with 1406 additions and 680 deletions
+166
View File
@@ -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("<span class='warning'>Arbitrary text</span>")
```
- Good:
```
visible_message("<span class='warning'>Arbitrary text</span>")
```
- You should not use color macros (`\red, \blue, \green, \black`) to color text,
instead, you should use span classes. `<span class='warning'>red text</span>`,
`<span class='notice'>blue text</span>`.
- Bad:
```
usr << "\red Red Text \black black text"
```
- Good:
```
usr << "<span class='warning'>Red Text</span>black 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.
+17
View File
@@ -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.
@@ -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
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -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)
+10 -10
View File
@@ -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&amp;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)
@@ -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 << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return 1
if(istype(W, /obj/item/weapon/screwdriver))
if(!welded)
if(open)
user << "<span class='notice'> Now closing the vent.</span>"
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 << "<span class='notice'> Now opening the vent.</span>"
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)
+2 -8
View File
@@ -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)
+2 -2
View File
@@ -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.")
-102
View File
@@ -272,108 +272,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
user << "<span class='notice'>[target] is empty!</span>"
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 << "<b>[newname] is the AI!</b>"
//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("!","@","#","$","%","^","&","*")]"
+1 -1
View File
@@ -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",
+2
View File
@@ -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))
+1 -1
View File
@@ -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"])
-4
View File
@@ -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
+15 -3
View File
@@ -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
+1 -2
View File
@@ -348,8 +348,7 @@
L.adjust_fire_stacks(0.5)
L.visible_message("\red <b>[L.name]</b> suddenly bursts into flames!")
L.on_fire = 1
L.update_icon = 1
L.IgniteMob()
playsound(L.loc, 'sound/effects/bamf.ogg', 50, 0)
////////////////////////////////////////////////////////////////////////
+1 -1
View File
@@ -55,7 +55,7 @@
/datum/game_mode/cult/announce()
world << "<B>The current game mode is - Cult!</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.<BR>\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.</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.<BR>\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.</B>"
/datum/game_mode/cult/pre_setup()
@@ -58,6 +58,7 @@
if(unreveal_time && world.time >= unreveal_time)
unreveal_time = 0
revealed = 0
incorporeal_move = 3
invisibility = INVISIBILITY_REVENANT
src << "<span class='revenboldnotice'>You are once more concealed.</span>"
if(unstun_time && world.time >= unstun_time)
@@ -315,6 +316,7 @@
return
revealed = 1
invisibility = 0
incorporeal_move = 0
if(!unreveal_time)
src << "<span class='revendanger'>You have been revealed!</span>"
unreveal_time = world.time + time
@@ -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
@@ -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 <b>Nanotrasen High Command</b> via quantum entanglement with a sister device at CentCom.<br>
user << {"This is a specialized communications device that is able to instantly send a message to <b>Nanotrasen High Command</b> via quantum entanglement with a sister device at CentComm.<br>
The EAD's status is [get_status()]."}
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
@@ -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)"
+1 -1
View File
@@ -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)
..()
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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")
+47 -26
View File
@@ -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)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[pr_mech_generator.active()?"Dea":"A"]ctivate</a>"
return "[output] \[[fuel_name]: [round(fuel_amount,0.1)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[pr_mech_generator.active()?"Dea":"A"]ctivate</a>"
return
action(target)
@@ -885,36 +886,55 @@
var/result = load_fuel(target)
var/message
if(isnull(result))
message = "<font color='red'>[fuel] traces in target minimal. [target] cannot be used as fuel.</font>"
message = "<font color='red'>[fuel_name] traces in target minimal. [target] cannot be used as fuel.</font>"
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.","<font color='red'>[fuel] traces minimal. [weapon] cannot be used as fuel.</font>")
user.visible_message("[user] tries to shove [weapon_name] into [src], but \the [src] rejects it.","<font color='red'>[fuel_name] traces in target minimal. [weapon_name] cannot be used as fuel.</font>")
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_charge<EG.chassis.cell.maxcharge)
use_fuel = EG.fuel_per_cycle_active
EG.chassis.give_power(EG.power_per_cycle)
EG.fuel.amount -= min(use_fuel/EG.fuel.perunit,EG.fuel.amount)
EG.fuel_amount -= min(use_fuel,EG.fuel_amount)
EG.update_equip_info()
return 1
@@ -972,6 +992,8 @@
desc = "Generates power using uranium. Pollutes the environment."
icon_state = "tesla"
origin_tech = "powerstorage=3;engineering=3"
fuel_name = "uranium" // Our fuel name as a string
fuel_type = MAT_URANIUM
max_fuel = 50000
fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30
@@ -980,8 +1002,7 @@
reliability = 1000
init()
fuel = new /obj/item/stack/sheet/mineral/uranium(src)
fuel.amount = 0
fuel_amount = 0
pr_mech_generator = new /datum/global_iterator/mecha_generator/nuclear(list(src),0)
pr_mech_generator.set_delay(equip_cooldown)
return
+1
View File
@@ -71,6 +71,7 @@
desc = "Device used to transmit exosuit data."
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
w_class = 2
origin_tech = "programming=2;magnets=2"
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
@@ -352,12 +352,12 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
if(!P.resulting_poster) return
var/stuff_on_wall = 0
for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff
if(istype(O,/obj/structure/sign/poster))
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 << "<span class='notice'>The wall is far too cluttered to place a poster!</span>"
return
stuff_on_wall++
if(stuff_on_wall == 3)
if(stuff_on_wall >= 4)
user << "<span class='notice'>The wall is far too cluttered to place a poster!</span>"
return
+11
View File
@@ -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 << "<span class='notice'>You start washing [src]...</span>"
if(!do_after(user, 40, target = source))
return
clean_blood()
user.visible_message("<span class='notice'>[user] washes [src] using [source].</span>", \
"<span class='notice'>You wash [src] using [source].</span>")
return 1
@@ -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",
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
@@ -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()
@@ -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), \
)
@@ -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)
+10
View File
@@ -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("<span class='notice'>[user] coldly lights the [name] with the burning body of [M]. Clearly, they offer the warmest of regards...</span>")
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))
+27 -7
View File
@@ -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("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
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("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.</span>")
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
else if(ghost)
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
ghost << "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)"
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
if(ghost)
ghost << "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (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("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
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("<span class='notice'>[user] pings: Resuscitation successful.</span>")
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("<span class='warning'>[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.</span>")
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("<span class='warning'>[user] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
else if(ghost)
user.visible_message("<span class='notice'>[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
ghost << "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)"
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='warning'>[user] buzzes: Resuscitation failed.</span>")
if(ghost)
ghost << "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (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
+6
View File
@@ -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 << "<span class='notice'>You wet [src] in [source].</span>"
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"
@@ -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("<span class='warning'>[user] grins as he begins to put a Bag of Holding into a Bag of Holding!</span>", "<span class='warning'>You begin to put the Bag of Holding into the Bag of Holding!</span>")
user.visible_message("<span class='warning'>[user] grins as \he begins to put a Bag of Holding into a Bag of Holding!</span>", "<span class='warning'>You begin to put the Bag of Holding into the Bag of Holding!</span>")
if(do_after(user,30,target=src))
investigate_log("has become a singularity. Caused by [user.key]","singulo")
user.visible_message("<span class='warning'>[user] erupts in evil laughter as he puts the Bag of Holding into another Bag of Holding!</span>", "<span class='warning'>You can't help yourself from laughing as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you</span>","<span class='warning'> You hear the sound of scientific evil brewing! </span>")
user.visible_message("<span class='warning'>[user] erupts in evil laughter as \he puts the Bag of Holding into another Bag of Holding!</span>", "<span class='warning'>You can't help but laugh wildly as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you.</span>","<span class='warning'> You hear the sound of scientific evil brewing! </span>")
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"
@@ -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 << "<span class='notice'>[src] is locked!</span>"
return 0
/obj/item/weapon/storage/lockbox/emag_act(user as mob)
if(!broken)
broken = 1
@@ -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 << "<span class='notice'>[src] is locked!</span>"
return 0
// -----------------------------
// Secure Briefcase
// -----------------------------
@@ -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("<span class='warning'>[user] shocks themself while attempting to wash the active [src]!</span>", \
"<span class='userdanger'>You unwisely attempt to wash [src] while it's still on.</span>")
playsound(src, "sparks", 50, 1)
return 1
..()
//secborg stun baton module
/obj/item/weapon/melee/baton/loaded/robot
hitcost = 1000
+5 -3
View File
@@ -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
..()
@@ -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
@@ -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
@@ -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
+4 -4
View File
@@ -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"
+5 -41
View File
@@ -424,51 +424,15 @@
user << "<span class='warning'>Someone's already washing here!</span>"
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 << "<span class='notice'>You fill [RG] from [src].</span>"
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("<span class='warning'>[user] shocks themself while attempting to wash the active [B.name]!</span>", \
"<span class='userdanger'>You unwisely attempt to wash [B] while it's still on.</span>")
playsound(src, "sparks", 50, 1)
return
if(istype(O, /obj/item/weapon/mop))
O.reagents.add_reagent("water", 5)
user << "<span class='notice'>You wet [O] in [src].</span>"
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 << "<span class='notice'>You start washing [I]...</span>"
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("<span class='notice'>[user] washes [I] using [src].</span>", \
"<span class='notice'>You wash [I] using [src].</span>")
if (wateract)
O.water_act(20,310.15,src)
/obj/structure/sink/kitchen
name = "kitchen sink"
+11
View File
@@ -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 += " <i>(as [C.holder.fakekey])</i>"
@@ -24,6 +27,8 @@
entry += " - <font color='gray'>Observing</font>"
else
entry += " - <font color='black'><b>DEAD</b></font>"
else if (istype(C.mob, /mob/new_player))
entry += " - <font color='green'>New Player</font>"
else
entry += " - <font color='black'><b>DEAD</b></font>"
@@ -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]"
+26 -1
View File
@@ -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
+1
View File
@@ -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
+3 -3
View File
@@ -8,9 +8,9 @@ var/global/sent_strike_team = 0
usr << "<font color='red'>The game hasn't started yet!</font>"
return
if(sent_strike_team == 1)
usr << "<font color='red'>CentCom is already sending a team.</font>"
usr << "<font color='red'>CentComm is already sending a team.</font>"
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
+12 -6
View File
@@ -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 << "<span class='notice'>The station gate has detected your exile implant and is blocking your entry.</span>"
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 << "<span class='notice'>The gate is already calibrated, there is no work for you to do here.</span>"
return
else
user << "<span class='boldnotice'>Recalibration successful!</span>: \black This gate's systems have been fine tuned. Travel to this gate will now be on target."
user << "<span class='boldnotice'>Recalibration successful!</span><span class='notice'>: This gate's systems have been fine tuned. Travel to this gate will now be on target.</span>"
calibrated = 1
return
+5 -1
View File
@@ -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)
+1 -1
View File
@@ -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()
+44 -1
View File
@@ -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 << "<span class='notice'>You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.</span>"
/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.
@@ -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
+3 -17
View File
@@ -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"
+28 -70
View File
@@ -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
+10 -69
View File
@@ -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")
+36 -36
View File
@@ -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"
+4 -4
View File
@@ -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"
+10 -12
View File
@@ -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()
+1 -1
View File
@@ -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))
+5 -5
View File
@@ -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"
+7 -2
View File
@@ -468,7 +468,6 @@ var/global/list/rockTurfEdgeCache
return
user << "<span class='notice'>You start digging...</span>"
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 << "<span class='notice'>You start digging...</span>"
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
@@ -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
@@ -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
@@ -12,7 +12,6 @@
health = 150
gender = NEUTER
update_icon = 0
nutrition = 700
see_in_dark = 8
@@ -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)
+21 -11
View File
@@ -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
@@ -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
@@ -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]"
+106 -109
View File
@@ -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 << "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=\ref[connected_ai];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>"
if(2) //New Module
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>"
if(3) //New Name
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>"
/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 = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
<b>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 << "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=\ref[connected_ai];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>"
if(2) //New Module
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>"
if(3) //New Name
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>"
/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)
+7 -2
View File
@@ -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
@@ -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("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
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("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
else
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
playsound(loc, O.hitsound, 50, 1, -1)
else
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
playsound(loc, O.hitsound, 50, 1, -1)
else
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
/mob/living/simple_animal/movement_delay()
-2
View File
@@ -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
+75 -4
View File
@@ -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)
+1 -1
View File
@@ -64,7 +64,7 @@
O.add_ai_verbs()
O.rename_self("ai",1)
O.rename_self("AI",1)
spawn
qdel(src)
return O
+315
View File
@@ -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("<span class=warning>[user] unfastens \the [displayed] out of \the [src].</span>", "<span class=warning>You unfasten \the [displayed] out of \the [src].</span>")
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 << "<span class=notice>There is nothing to remove from \the [src].</span>"
else if(istype(I, /obj/item/weapon/crowbar))
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("<span class=warning>[user] breaks down \the [src].</span>", "<span class=warning>You break down \the [src].</span>")
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 << "<span class=notice>\The [src] already contains \a [displayed].</span>"
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 << "<span class='notice'>\The [T] is far too cluttered to place \a [src]!</span>"
return
stuff_on_wall++
if(stuff_on_wall >= 4)
user << "<span class='notice'>\The [T] is far too cluttered to place \a [src]!</span>"
return
user << "<span class='notice'>You start place \the [src] on \the [T].</span>"
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 << "<span class='notice'>You cannot reach \the [T] from here!</span>"
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("<span class=warning>[user] begins to unfasten \the [src] from the wall.</span>", "<span class=warning>You begin to unfasten \the [src] from the wall.</span>")
if(do_after(user, 100, target = src))
playsound(src, 'sound/items/Deconstruct.ogg', 100, 1)
user.visible_message("<span class=warning>[user] unfastens \the [src] from the wall.</span>", "<span class=warning>You unfasten \the [src] from the wall.</span>")
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 << "<span class='warning'>There is already a device attached behind \the [src], remove it first.</span>"
return 1
if(!tilted)
user << "<span class='warning'>\The [src] needs to be already tilted before being rigged with \the [I].</span>"
return 1
user.visible_message("<span class=warning>[user] is fiddling around behind \the [src].</span>", "<span class=warning>You begin to secure \the [I] behind \the [src].</span>")
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("<span class='notice'>[user] fiddles with the back of \the [src].</span>", "<span class='notice'>You secure \the [I] behind \the [src].</span>")
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)
+2 -1
View File
@@ -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
@@ -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////////////////////
@@ -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"
@@ -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
@@ -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)
@@ -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
@@ -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."
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
+8 -1
View File
@@ -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"
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 << "<span class='notice'>You fill [src] from [source].</span>"
return
..()
@@ -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("<span class='notice'>[src] expands!</span>")
@@ -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"
@@ -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")
+1 -1
View File
@@ -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()
@@ -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."
@@ -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"
@@ -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."
@@ -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."
@@ -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."
@@ -0,0 +1,4 @@
author: Crazylemon64
delete-after: True
changes:
- bugfix: "No more superspeed attacking simplemobs"
@@ -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"

Some files were not shown because too many files have changed in this diff Show More