mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 11:05:03 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor
This commit is contained in:
@@ -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.
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -383,7 +383,7 @@
|
||||
"in" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
|
||||
"io" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station)
|
||||
"ip" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station)
|
||||
"iq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station)
|
||||
"iq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station)
|
||||
"ir" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership)
|
||||
"is" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership)
|
||||
"it" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership)
|
||||
@@ -632,7 +632,7 @@
|
||||
"sY" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
|
||||
"sZ" = (/obj/structure/table,/obj/machinery/processor{pixel_x = 0; pixel_y = 10},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
|
||||
"ta" = (/obj/machinery/mech_bay_recharge_port/upgraded,/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
|
||||
"tb" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Assault Armor North"; dir = 2; network = list("ERT","CentCom")},/obj/mecha/combat/marauder/seraph/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
|
||||
"tb" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor North"; dir = 2; network = list("ERT","CentComm")},/obj/mecha/combat/marauder/seraph/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
|
||||
"tc" = (/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/specops)
|
||||
"td" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
|
||||
"te" = (/obj/machinery/recharge_station/upgraded,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
|
||||
@@ -680,7 +680,7 @@
|
||||
"tU" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control)
|
||||
"tV" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
|
||||
"tW" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
|
||||
"tX" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Assault Armor South"; dir = 1; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
|
||||
"tX" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Assault Armor South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
|
||||
"tY" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
|
||||
"tZ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control)
|
||||
"ua" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "ASSAULT"; name = "Assault Armor"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
|
||||
@@ -691,10 +691,10 @@
|
||||
"uf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"ug" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uh" = (/obj/structure/reagent_dispensers/water_cooler,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"ui" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/machinery/camera{c_tag = "CentCom Special Ops. Ready Room North"; dir = 2; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"ui" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room North"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uj" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uk" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
|
||||
"ul" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/obj/machinery/camera{c_tag = "CentCom Special Ops. Starting Room"; dir = 2; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
|
||||
"ul" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Starting Room"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
|
||||
"um" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/device/radio/intercom/specops{pixel_y = 25},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"un" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
|
||||
"uo" = (/turf/unsimulated/floor{icon_state = "asteroid6"; name = "sand"},/area/centcom/specops)
|
||||
@@ -727,7 +727,7 @@
|
||||
"uP" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "nukecode"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uQ" = (/obj/structure/table/reinforced,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uR" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uS" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uS" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"uT" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
|
||||
"uU" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
|
||||
"uV" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
@@ -746,14 +746,14 @@
|
||||
"vi" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
"vj" = (/obj/structure/toilet{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
|
||||
"vk" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
|
||||
"vl" = (/obj/effect/decal/cleanable/vomit{name = "urine"},/obj/machinery/camera{c_tag = "CentCom Special Ops. Bathroom"; dir = 2; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
|
||||
"vl" = (/obj/effect/decal/cleanable/vomit{name = "urine"},/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
|
||||
"vm" = (/obj/structure/table/reinforced,/obj/item/ashtray/glass{icon_state = "ashtray_half_gl"},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"vn" = (/obj/machinery/door/poddoor/shutters{dir = 8; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/centcom/specops)
|
||||
"vo" = (/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/specops)
|
||||
"vp" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/specops)
|
||||
"vq" = (/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/specops)
|
||||
"vr" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control)
|
||||
"vs" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentCom","Thunderdome")},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
"vs" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentComm","Thunderdome")},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
"vt" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
"vu" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
"vv" = (/obj/machinery/computer/robotics,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
@@ -768,7 +768,7 @@
|
||||
"vF" = (/obj/machinery/door/airlock/centcom{name = "Telecommunications"; opacity = 1; req_access_txt = "107"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
|
||||
"vG" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
|
||||
"vH" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops)
|
||||
"vI" = (/obj/machinery/camera{c_tag = "CentCom Special Ops. Ready Room South"; dir = 1; network = list("ERT","CentCom")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"vI" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room South"; dir = 1; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"vJ" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"vL" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
|
||||
"vM" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_y = 16; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_y = -4; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_y = 6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
|
||||
@@ -1070,7 +1070,7 @@
|
||||
"Gc" = (/obj/machinery/door/airlock/hatch{desc = "You've heard rumors of the horrors that go on within this lab."; name = "Laboratory (DANGER!)"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Gd" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Ge" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Gf" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentCom","Thunderdome")},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Gf" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentComm","Thunderdome")},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Gg" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Gh" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
"Gi" = (/obj/structure/table,/obj/item/weapon/card/id/silver{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id/captains_spare,/obj/item/weapon/card/id/lifetime{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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("!","@","#","$","%","^","&","*")]"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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()]."}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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)
|
||||
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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]"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
O.add_ai_verbs()
|
||||
|
||||
O.rename_self("ai",1)
|
||||
O.rename_self("AI",1)
|
||||
spawn
|
||||
qdel(src)
|
||||
return O
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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
Reference in New Issue
Block a user