Upstream june 28 2023 (#302)

Fixes a bit. Can now wear lizards.
This commit is contained in:
nevimer
2023-06-28 18:09:47 -04:00
committed by GitHub
334 changed files with 8134 additions and 3806 deletions
+2
View File
@@ -90,6 +90,8 @@ Things you **CAN'T** do:
* [Close PRs](https://imgur.com/w2RqpX8.png): Only maintainers are allowed to close PRs. Do not hit that button.
* Close issues purely for breaking a template if the same information is contained without it.
For more information reference the [Issue Manager Guide](.github/guides/ISSUE_MANAGER.md).
</details>
## Development Guides
+49
View File
@@ -0,0 +1,49 @@
## What is an Issue Manager
Issue Managers proactively manage issues for the repo by providing feedback, performing triage, and troubleshooting problems. They search through the codebase to link relevant code, issues, and PRs that help contributors identify and solve an issue.
## Triage An Issue
New issues should be properly diagnosed by using several methods and tools below:
#### Emergency Issues
When examining new issues you should immediately notify a maintainer if you see the following:
- **Security Exploit** [[1]](https://github.com/tgstation/tgstation/issues/51654) [[2]](https://github.com/tgstation/tgstation/issues/38407) [[3]](https://github.com/tgstation/tgstation/issues/9900) - Something that can be used to bypass bans, give a player admin powers, cheats or hacks
- **Server Crashing** [[1]](https://github.com/tgstation/tgstation/issues/29342) [[2]](https://github.com/tgstation/tgstation/issues/25890) [[3]](https://github.com/tgstation/tgstation/issues/17475) - Something that is causing the server to _consistently_ crash
- **Server Lagging** [[1]](https://github.com/tgstation/tgstation/issues/60193) [[2]](https://github.com/tgstation/tgstation/issues/51927) [[3]](https://github.com/tgstation/tgstation/issues/32762) - Something that is causing a _severe_ amount of lag during the game
#### Link Code Snippets
To help triangulate bugs, search the GitHub repo to locate relevant code and attach it to an issue. Do this by creating a [link to the code](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet). This saves the contributors time from having to identify the problem and will be appreciated.
#### Use Gitblame
GitHub also has a tool called `gitblame` that is useful in [tracking code](https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#viewing-the-line-by-line-revision-history-for-a-file) to determine who and when someone made a change. This is ideally used to help solve old issues when there is uncertainty over which PR might have fixed it. It is also a good tool to use to link PRs that caused the issue.
#### Search For Keywords
When a new issue appears search for any keywords involved with the issue. This is important to prune for duplicates, match several issues to a test merge PR, or if you want to link multiple issues together since there is overlapping problems. (but not duplicate)
## Closing Issues
It is recommended to close issues in the following situations:
- **Feature Requests** [[1]](https://github.com/tgstation/tgstation/issues/55919) [[2]](https://github.com/tgstation/tgstation/issues/53342) [[3]](https://github.com/tgstation/tgstation/issues/45412) - The issue is a suggestion or request for a new feature to be added to the game.
- **Working as Intended** [[1]](https://github.com/tgstation/tgstation/issues/62619) [[2]](https://github.com/tgstation/tgstation/issues/61511) [[3]](https://github.com/tgstation/tgstation/issues/60942) - The issue is detailing a problem that is _specifically intended_ by the code and is not considered a bug.
- **Duplicates** [[1]](https://github.com/tgstation/tgstation/issues/62709) [[2]](https://github.com/tgstation/tgstation/issues/62364) [[3]](https://github.com/tgstation/tgstation/issues/61823) - The issue is detailing an identical problem from another issue. Do not automatically close the most recent issue. Instead compare both and close the one that provides the least information.
- **Removed Features** [[1]](https://github.com/tgstation/tgstation/issues/48255) [[2]](https://github.com/tgstation/tgstation/issues/47194) [[3]](https://github.com/tgstation/tgstation/issues/45653) - The issue is referring to something that was removed from the codebase and no longer exists.
- **Defective Issues** [[1]](https://github.com/tgstation/tgstation/issues/57366) [[2]](https://github.com/tgstation/tgstation/issues/48778) [[3]](https://github.com/tgstation/tgstation/issues/51520) - The issue is badly written and lacking information. Politely ask the person to add more information or rewrite the issue. If there is no response after a sufficient amount of time close the issue.
- **Irreproducible Issues** [[1]](https://github.com/tgstation/tgstation/issues/51493) [[2]](https://github.com/tgstation/tgstation/issues/22796) [[3]](https://github.com/tgstation/tgstation/issues/25610) - The issue is old, cannot be reproduced, and nobody has reported a duplicate issue recently. If you feel _confident_ that the issue has been fixed at some point, list your reasons or link possible PRs that could have fixed it.
- **Impossible to Fix Issues** [[1]](https://github.com/tgstation/tgstation/issues/524) [[2]](https://github.com/tgstation/tgstation/issues/2679) [[3]](https://github.com/tgstation/tgstation/issues/9637) - The issue is not possible to fix due to either vague details or a clearly defined problem.
## Reopening Issues
In special cases a closed issue should be reopened if:
- It has been updated with pertinent information (when before it was lacking info making it defective)
- The initial problem has reappeared (after it was presumably fixed in a PR)
- Someone feels that the issue was closed prematurely during discussion
If there is a dispute on whether an issue should remain closed, ask for a second opinion. Get clarification from another Issue Manager or Maintainer and respect their judgement as the final verdict.
@@ -7,7 +7,7 @@
/turf/open/misc/asteroid/airless,
/area/space)
"d" = (
/obj/effect/decal/remains/human/grave,
/obj/effect/decal/remains/human,
/turf/open/misc/asteroid/airless,
/area/space)
"e" = (
File diff suppressed because it is too large Load Diff
+249 -226
View File
@@ -1381,6 +1381,11 @@
/obj/effect/spawner/random/food_or_drink/snack,
/turf/open/floor/carpet/black,
/area/station/maintenance/port)
"aqb" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/mapping_helpers/airalarm/engine_access,
/turf/open/floor/engine,
/area/station/engineering/supermatter)
"aqc" = (
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
dir = 4
@@ -3930,6 +3935,11 @@
/obj/effect/turf_decal/tile/neutral/opposingcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/central/aft)
"aWt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible,
/obj/machinery/incident_display/delam/directional/south,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"aWu" = (
/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
@@ -8141,23 +8151,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/wood,
/area/station/maintenance/port/aft)
"bVI" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable,
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light_switch/directional/north,
/obj/machinery/camera/directional/north{
c_tag = "Engineering - Fore";
name = "engineering camera"
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/iron,
/area/station/engineering/main)
"bVJ" = (
/obj/machinery/camera/directional/north{
c_tag = "Central Hallway - Center";
@@ -11529,6 +11522,26 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/cargo/storage)
"cNk" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "sci-entrance"
},
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/duct,
/obj/effect/mapping_helpers/airlock/unres,
/turf/open/floor/iron,
/area/station/science/research)
"cNp" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -15080,15 +15093,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
"dKp" = (
/obj/machinery/rnd/production/protolathe/department/science,
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/obj/structure/sign/departments/science/alt/directional/east,
/obj/structure/sign/clock/directional/north,
/turf/open/floor/iron,
/area/station/science/lab)
"dKs" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -18064,6 +18068,13 @@
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"eyb" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"eyr" = (
/obj/item/kirbyplants/random,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -19161,13 +19172,6 @@
/obj/effect/turf_decal/tile/neutral/full,
/turf/open/floor/iron/large,
/area/station/medical/virology)
"eNt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/item/radio/intercom/directional/north,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"eNB" = (
/obj/effect/turf_decal/siding/green{
dir = 8
@@ -20104,19 +20108,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
"eYu" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/structure/sign/nanotrasen{
pixel_y = 32
},
/turf/open/floor/iron,
/area/station/engineering/main)
"eYy" = (
/obj/structure/cable,
/obj/structure/closet/secure_closet/atmospherics,
@@ -20735,14 +20726,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"ffN" = (
/obj/structure/sign/poster/random/directional/south,
/obj/effect/turf_decal/tile/red/opposingcorners{
dir = 1
},
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron,
/area/station/commons/lounge)
"ffP" = (
/obj/item/radio/intercom/directional/east,
/obj/item/kirbyplants/random,
@@ -25802,16 +25785,6 @@
/obj/item/toy/cards/deck,
/turf/open/floor/iron/grimy,
/area/station/service/abandoned_gambling_den)
"gtA" = (
/obj/structure/window/reinforced/spawner/directional/west,
/obj/item/mod/module/plasma_stabilizer,
/obj/item/mod/module/thermal_regulator,
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/turf/open/floor/iron,
/area/station/medical/storage)
"gtG" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -26382,6 +26355,16 @@
"gAw" = (
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter/room)
"gAx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"gAE" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/purple{
@@ -29120,6 +29103,22 @@
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/command/heads_quarters/rd)
"hlb" = (
/obj/structure/table/reinforced,
/obj/effect/spawner/random/entertainment/cigarette_pack{
pixel_x = 3;
pixel_y = 2
},
/obj/effect/spawner/random/entertainment/cigarette_pack{
pixel_x = 3;
pixel_y = 2
},
/obj/item/storage/box/coffeepack{
pixel_x = -13;
pixel_y = 7
},
/turf/open/floor/wood,
/area/station/engineering/break_room)
"hlj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/holopad,
@@ -30592,6 +30591,23 @@
dir = 1
},
/area/station/medical/morgue)
"hFR" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "sci-entrance"
},
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/structure/cable,
/obj/effect/mapping_helpers/airlock/unres,
/turf/open/floor/iron,
/area/station/science/research)
"hFS" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
@@ -35121,6 +35137,15 @@
},
/turf/open/floor/engine/vacuum,
/area/station/engineering/atmos)
"iMG" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/airalarm/directional/east,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"iMH" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/effect/decal/cleanable/dirt,
@@ -36719,6 +36744,19 @@
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical/medsci)
"jgg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/central/aft)
"jgl" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/grunge{
@@ -39130,6 +39168,22 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/cargo/lobby)
"jJX" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable,
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera/directional/north{
c_tag = "Engineering - Fore";
name = "engineering camera"
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/iron,
/area/station/engineering/main)
"jKb" = (
/obj/effect/turf_decal/siding/white{
dir = 5
@@ -40562,13 +40616,6 @@
},
/turf/open/floor/iron,
/area/station/maintenance/port)
"kbQ" = (
/obj/machinery/vending/coffee,
/obj/effect/turf_decal/bot,
/obj/structure/sign/clock/directional/south,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"kbT" = (
/obj/machinery/camera/directional/south{
c_tag = "Central Hallway - Center Port";
@@ -42902,6 +42949,13 @@
/obj/item/pen,
/turf/open/floor/iron,
/area/station/service/hydroponics)
"kGu" = (
/obj/machinery/vending/coffee,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"kGA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/carpet/red,
@@ -45108,13 +45162,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
"ljO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/status_display/ai/directional/north,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"ljP" = (
/obj/structure/cable,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -47900,6 +47947,17 @@
"lTv" = (
/turf/closed/wall,
/area/station/security/prison/safe)
"lTw" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/iron,
/area/station/engineering/main)
"lTx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
@@ -49167,23 +49225,6 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron,
/area/station/engineering/main)
"mnh" = (
/obj/structure/table/reinforced,
/obj/machinery/airalarm/directional/north,
/obj/effect/spawner/random/entertainment/cigarette_pack{
pixel_x = 3;
pixel_y = 2
},
/obj/effect/spawner/random/entertainment/cigarette_pack{
pixel_x = 3;
pixel_y = 2
},
/obj/item/storage/box/coffeepack{
pixel_x = -13;
pixel_y = 7
},
/turf/open/floor/wood,
/area/station/engineering/break_room)
"mnz" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -50135,18 +50176,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/corporate_showroom)
"mzO" = (
/obj/structure/table/reinforced,
/obj/machinery/newscaster/directional/north,
/obj/item/clipboard,
/obj/item/toy/figure/engineer{
pixel_x = -6
},
/obj/item/toy/figure/atmos{
pixel_x = 6
},
/turf/open/floor/wood,
/area/station/engineering/break_room)
"mzV" = (
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
@@ -59879,6 +59908,15 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
"pdE" = (
/obj/structure/sign/poster/random/directional/south,
/obj/effect/turf_decal/tile/red/opposingcorners{
dir = 1
},
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron,
/area/station/commons/lounge)
"pdF" = (
/obj/structure/closet/crate/preopen,
/obj/structure/sign/nanotrasen{
@@ -65403,26 +65441,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
"qsI" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/machinery/door/window/right/directional/west{
name = "Supply Storage";
req_access = list("medical")
},
/obj/item/storage/box/syringes,
/obj/item/storage/box/beakers{
pixel_x = 3;
pixel_y = 3
},
/obj/item/gun/syringe,
/obj/item/gun/syringe,
/obj/structure/table/reinforced,
/obj/structure/sign/clock/directional/east,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
/turf/open/floor/iron,
/area/station/medical/storage)
"qsN" = (
/obj/structure/chair{
dir = 4
@@ -68933,6 +68951,25 @@
/obj/structure/sign/poster/contraband/free_drone/directional/north,
/turf/open/floor/iron,
/area/station/science/research/abandoned)
"rmR" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/machinery/door/window/right/directional/west{
name = "Supply Storage";
req_access = list("medical")
},
/obj/item/storage/box/syringes,
/obj/item/storage/box/beakers{
pixel_x = 3;
pixel_y = 3
},
/obj/item/gun/syringe,
/obj/item/gun/syringe,
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
/turf/open/floor/iron,
/area/station/medical/storage)
"rmV" = (
/obj/machinery/newscaster/directional/east,
/obj/effect/turf_decal/bot,
@@ -73912,6 +73949,18 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/maintenance/department/medical/morgue)
"sAM" = (
/obj/structure/table/reinforced,
/obj/item/clipboard,
/obj/item/toy/figure/engineer{
pixel_x = -6
},
/obj/item/toy/figure/atmos{
pixel_x = 6
},
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/wood,
/area/station/engineering/break_room)
"sAU" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -76861,12 +76910,6 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/hallway/primary/central/aft)
"tou" = (
/obj/structure/sign/delamination_counter/directional/west,
/obj/machinery/airalarm/directional/north,
/obj/effect/mapping_helpers/airalarm/engine_access,
/turf/open/floor/engine,
/area/station/engineering/supermatter)
"toy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -79873,14 +79916,6 @@
},
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/rd)
"tYY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/airalarm/directional/east,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"tZi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -80193,25 +80228,6 @@
/obj/effect/turf_decal/tile/neutral/full,
/turf/open/floor/iron/large,
/area/station/security/processing)
"ucM" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "sci-entrance"
},
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/research)
"ucW" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -81383,22 +81399,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
"usV" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "sci-entrance"
},
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/research)
"utj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -81623,6 +81623,17 @@
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/medical/medsci)
"uwB" = (
/obj/structure/window/reinforced/spawner/directional/west,
/obj/item/mod/module/plasma_stabilizer,
/obj/item/mod/module/thermal_regulator,
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron,
/area/station/medical/storage)
"uwJ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -83855,6 +83866,14 @@
},
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"uYZ" = (
/obj/structure/sign/nanotrasen{
pixel_x = 32
},
/obj/item/kirbyplants/random,
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/wood,
/area/station/commons/dorms)
"uZf" = (
/obj/structure/flora/bush/flowers_br/style_random,
/obj/structure/flora/bush/lavendergrass,
@@ -84858,6 +84877,15 @@
"vmt" = (
/turf/closed/wall/r_wall,
/area/station/engineering/transit_tube)
"vmE" = (
/obj/machinery/rnd/production/protolathe/department/science,
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/obj/structure/sign/departments/science/alt/directional/east,
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/science/lab)
"vmK" = (
/obj/effect/turf_decal/siding/yellow,
/obj/structure/table,
@@ -85420,6 +85448,17 @@
/obj/structure/chair/office,
/turf/open/floor/carpet/orange,
/area/station/commons/dorms)
"vtG" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/firealarm/directional/north,
/obj/machinery/light_switch/directional/north{
pixel_x = -8
},
/turf/open/floor/iron,
/area/station/engineering/main)
"vtM" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -85482,14 +85521,6 @@
/obj/effect/turf_decal/tile/neutral/opposingcorners,
/turf/open/floor/iron,
/area/station/commons/vacant_room/commissary)
"vuy" = (
/obj/structure/sign/nanotrasen{
pixel_x = 32
},
/obj/item/kirbyplants/random,
/obj/structure/sign/clock/directional/north,
/turf/open/floor/wood,
/area/station/commons/dorms)
"vuG" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -86828,14 +86859,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"vKY" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/station/engineering/main)
"vLd" = (
/obj/machinery/light/small/directional/east,
/obj/structure/closet/secure_closet/brig{
@@ -90010,15 +90033,6 @@
},
/turf/open/floor/plating,
/area/station/command/bridge)
"wyJ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/obj/effect/landmark/start/hangover,
/obj/effect/decal/cleanable/dirt,
/obj/structure/sign/delamination_counter/directional/north,
/turf/open/floor/iron,
/area/station/engineering/break_room)
"wyN" = (
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
dir = 10
@@ -95708,6 +95722,15 @@
},
/turf/open/floor/iron,
/area/station/maintenance/port)
"xXE" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/obj/effect/landmark/start/hangover,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron,
/area/station/engineering/break_room)
"xXI" = (
/obj/structure/table/reinforced,
/obj/item/storage/box/bodybags{
@@ -116968,7 +116991,7 @@ glb
dRK
wcP
yeO
nbZ
aWt
nCi
kmS
fCk
@@ -117226,7 +117249,7 @@ vrs
qJI
iQV
nbZ
akM
nCi
cOx
uGn
axu
@@ -118759,7 +118782,7 @@ eHy
qJs
cxp
sHT
tou
aqb
tsa
bPI
sHT
@@ -119013,7 +119036,7 @@ lkN
cwp
ubM
gAw
eNt
eyb
ehD
sHT
sHT
@@ -119247,7 +119270,7 @@ tsB
sch
cKK
vQj
mzO
sAM
agA
hHJ
tgl
@@ -119270,7 +119293,7 @@ jZV
jZV
gAw
gAw
ljO
qJs
okr
bWa
nrP
@@ -119504,7 +119527,7 @@ lKe
nZW
qAz
vQj
mnh
hlb
agA
uzb
jLx
@@ -120021,7 +120044,7 @@ vQj
uCa
uCa
leE
wyJ
xXE
kyW
jzU
bAR
@@ -120298,7 +120321,7 @@ kGe
kGe
gtj
gAw
tYY
iMG
mTo
pjN
ckC
@@ -121833,7 +121856,7 @@ wxd
iBR
iBR
tqo
eYu
lTw
bfX
cui
maI
@@ -122089,8 +122112,8 @@ elK
jyz
xbD
kgP
lDV
bVI
tqo
jJX
vvH
oks
fSG
@@ -123118,7 +123141,7 @@ slp
slp
slp
bJI
vKY
vtG
mgk
cui
kpD
@@ -129829,11 +129852,11 @@ mUt
utj
tQt
xaS
ucM
cNk
qAG
kzT
alT
ucM
cNk
tWa
kSR
pba
@@ -130343,11 +130366,11 @@ oPE
flF
oqJ
saz
usV
hFR
nHB
mHq
qLE
usV
hFR
eAO
ban
jqx
@@ -132046,7 +132069,7 @@ aaa
aaa
aaa
sjt
kEn
gAx
kJd
wTn
sjt
@@ -132657,7 +132680,7 @@ pXk
hXQ
lfz
fvi
dKp
vmE
qvK
jFP
veR
@@ -133364,7 +133387,7 @@ pri
qkA
nWI
rbk
ffN
pdE
vnU
bTy
eex
@@ -138071,8 +138094,8 @@ ako
nFO
tqw
pIR
qsI
gtA
rmR
uwB
ako
ako
gMX
@@ -142662,7 +142685,7 @@ cBN
tXa
nXo
iVq
lRk
jgg
crR
iee
iYi
@@ -144979,7 +145002,7 @@ oOx
nVB
xCF
mgX
kbQ
kGu
oCP
tTM
nMG
@@ -147551,7 +147574,7 @@ vbH
gYS
lQt
oCP
vuy
uYZ
obO
nNq
aRZ
+152 -121
View File
@@ -688,16 +688,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"anI" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/light/directional/west,
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"anK" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 4
@@ -1249,6 +1239,13 @@
/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station,
/turf/open/floor/plating,
/area/mine/eva)
"auC" = (
/obj/machinery/suit_storage_unit/ce,
/obj/effect/turf_decal/stripes/line{
dir = 6
},
/turf/open/floor/iron/white/textured,
/area/station/command/heads_quarters/ce)
"auJ" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -7728,6 +7725,14 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/wood,
/area/station/maintenance/port/aft)
"csF" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/machinery/light/directional/east,
/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"csR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -16475,6 +16480,18 @@
},
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
"feW" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/effect/mapping_helpers/airlock/unres,
/turf/open/floor/iron/white,
/area/station/science/research)
"ffe" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/aft/lesser)
@@ -18254,6 +18271,16 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/project)
"fKt" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/security/prison/mess)
"fKv" = (
/obj/structure/fluff/tram_rail{
pixel_y = 17
@@ -19773,6 +19800,12 @@
/obj/structure/chair,
/turf/open/floor/iron/cafeteria,
/area/station/hallway/secondary/exit/departure_lounge)
"gjZ" = (
/obj/effect/turf_decal/siding/white,
/obj/machinery/light/directional/south,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/white/smooth_large,
/area/station/service/kitchen/diner)
"gka" = (
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter/room)
@@ -20346,6 +20379,11 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/service/kitchen/coldroom)
"gtb" = (
/obj/machinery/light/directional/north,
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/cargo/lobby)
"gtc" = (
/obj/effect/turf_decal/siding/white{
dir = 1
@@ -21396,6 +21434,14 @@
/obj/structure/sign/warning/biohazard,
/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
"gLT" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"gLZ" = (
/obj/structure/table,
/obj/item/flashlight/lamp,
@@ -24859,17 +24905,6 @@
/obj/item/crowbar,
/turf/open/floor/iron,
/area/station/command/teleporter)
"hVc" = (
/obj/machinery/door/poddoor/shutters/preopen{
dir = 8;
id = "hopqueue";
name = "HoP Queue Shutters"
},
/obj/effect/turf_decal/loading_area{
dir = 8
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"hVo" = (
/obj/effect/spawner/random/maintenance,
/obj/structure/table,
@@ -29672,14 +29707,6 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"jyh" = (
/obj/structure/table/wood,
/obj/effect/turf_decal/siding/wood{
dir = 8
},
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron,
/area/station/service/bar)
"jyz" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -45914,6 +45941,10 @@
},
/turf/open/floor/iron/grimy,
/area/station/commons/vacant_room/office)
"oCq" = (
/obj/machinery/incident_display/delam,
/turf/closed/wall/r_wall,
/area/station/command/bridge)
"oCs" = (
/obj/structure/table,
/obj/item/toy/figure/virologist{
@@ -47577,6 +47608,14 @@
dir = 1
},
/area/station/security/prison)
"peD" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/machinery/status_display/ai/directional/north,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"peV" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plating,
@@ -49731,11 +49770,6 @@
dir = 1
},
/area/station/engineering/lobby)
"pNV" = (
/obj/effect/turf_decal/siding/white,
/obj/machinery/light/directional/south,
/turf/open/floor/iron/white/smooth_large,
/area/station/service/kitchen/diner)
"pNY" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -52178,17 +52212,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
"qEZ" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/turf/open/floor/iron/white,
/area/station/science/research)
"qFn" = (
/obj/machinery/door/airlock/mining/glass{
name = "Mining Cabins"
@@ -52955,15 +52978,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
/turf/closed/wall/r_wall,
/area/station/engineering/atmos)
"qQs" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/machinery/light/directional/east,
/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible,
/obj/machinery/status_display/evac/directional/east,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"qQt" = (
/obj/machinery/light/small/directional/west,
/turf/open/misc/asteroid/snow/icemoon,
@@ -55071,10 +55085,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
"rzS" = (
/obj/structure/sign/departments/chemistry/pharmacy/directional/west,
/turf/open/openspace,
/area/station/medical/medbay/lobby)
"rAr" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -56663,6 +56673,11 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/crew_quarters/bar)
"rZO" = (
/obj/structure/sign/departments/chemistry/pharmacy/directional/west,
/obj/machinery/digital_clock/directional/south,
/turf/open/openspace,
/area/station/medical/medbay/lobby)
"rZR" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/effect/landmark/start/chief_medical_officer,
@@ -59173,6 +59188,18 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
"sOv" = (
/obj/machinery/door/poddoor/shutters/preopen{
dir = 8;
id = "hopqueue";
name = "HoP Queue Shutters"
},
/obj/effect/turf_decal/loading_area{
dir = 8
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"sOz" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -59859,6 +59886,10 @@
/obj/structure/flora/bush/sunny/style_random,
/turf/open/floor/grass,
/area/station/service/hydroponics)
"tbO" = (
/obj/machinery/incident_display/delam,
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter/room)
"tbQ" = (
/turf/open/floor/iron/grimy,
/area/station/maintenance/aft/greater)
@@ -63105,6 +63136,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply,
/turf/open/floor/iron/white,
/area/station/medical/virology)
"ueG" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/light/directional/west,
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"ueP" = (
/obj/structure/table,
/obj/structure/reagent_dispensers/servingdish,
@@ -65617,6 +65657,14 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
"uWG" = (
/obj/machinery/light/warm/directional/north,
/obj/effect/turf_decal/siding/wideplating/dark{
dir = 5
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison/rec)
"uWW" = (
/obj/structure/closet/cardboard,
/obj/effect/spawner/random/maintenance,
@@ -66445,14 +66493,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/disposal)
"vkz" = (
/obj/machinery/suit_storage_unit/ce,
/obj/effect/turf_decal/stripes/line{
dir = 6
},
/obj/structure/sign/delamination_counter/directional/north,
/turf/open/floor/iron/white/textured,
/area/station/command/heads_quarters/ce)
"vkD" = (
/obj/effect/turf_decal/trimline/blue/filled/warning{
dir = 1
@@ -68011,6 +68051,12 @@
},
/turf/open/floor/iron,
/area/station/command/heads_quarters/rd)
"vKe" = (
/obj/machinery/computer/security,
/obj/effect/turf_decal/tile/red/half/contrasted,
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/command/bridge)
"vKn" = (
/obj/item/radio/intercom/directional/north,
/obj/structure/table/wood,
@@ -68259,10 +68305,6 @@
},
/turf/open/floor/plating/elevatorshaft,
/area/mine/storage)
"vPh" = (
/obj/machinery/light/directional/north,
/turf/open/floor/iron,
/area/station/cargo/lobby)
"vPi" = (
/obj/structure/table/wood,
/obj/effect/spawner/random/maintenance/four,
@@ -68768,6 +68810,19 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"vXi" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/effect/landmark/navigate_destination,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/obj/effect/mapping_helpers/airlock/unres,
/turf/open/floor/iron/white,
/area/station/science/research)
"vXn" = (
/obj/structure/table,
/obj/item/food/pie/cream,
@@ -71185,13 +71240,6 @@
/obj/structure/table,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
"wJa" = (
/obj/machinery/light/warm/directional/north,
/obj/effect/turf_decal/siding/wideplating/dark{
dir = 5
},
/turf/open/floor/iron/dark/textured,
/area/station/security/prison/rec)
"wJd" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -71532,6 +71580,15 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured,
/area/station/security/processing)
"wOj" = (
/obj/structure/table/wood,
/obj/effect/turf_decal/siding/wood{
dir = 8
},
/obj/effect/turf_decal/tile/bar/opposingcorners,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron,
/area/station/service/bar)
"wOn" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -72648,18 +72705,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/plating,
/area/station/engineering/storage_shared)
"xfd" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/research{
name = "Research Division Access"
},
/obj/effect/landmark/navigate_destination,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/science/general,
/turf/open/floor/iron/white,
/area/station/science/research)
"xfn" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -74097,11 +74142,6 @@
"xCl" = (
/turf/open/floor/iron,
/area/station/science/robotics/lab)
"xCv" = (
/obj/machinery/computer/security,
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron,
/area/station/command/bridge)
"xCz" = (
/obj/structure/cable,
/turf/open/floor/plating,
@@ -74321,15 +74361,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
"xFM" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/light/directional/north,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/structure/sign/delamination_counter/directional/north,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"xFU" = (
/obj/structure/barricade/wooden,
/obj/structure/sign/warning/gas_mask/directional/south{
@@ -101687,7 +101718,7 @@ uOb
lBR
lBR
lBR
wJa
uWG
jRu
kzr
khb
@@ -103498,7 +103529,7 @@ ldH
ldH
ldH
ldH
fTb
fKt
iKw
iZs
sOT
@@ -179609,7 +179640,7 @@ pOJ
bIW
vLx
hkl
jyh
wOj
dMS
dEB
dMS
@@ -231025,7 +231056,7 @@ dBZ
dBZ
wcV
rCC
vPh
gtb
vQQ
vQQ
sve
@@ -232573,7 +232604,7 @@ rcE
rcE
rcE
rcE
hVc
sOv
jII
dnq
ylU
@@ -234351,7 +234382,7 @@ utR
pAZ
dYP
qWZ
xCv
vKe
vWL
nci
tPC
@@ -234937,7 +234968,7 @@ wCZ
azg
azg
pJy
qQs
csF
ban
wdL
dso
@@ -235441,7 +235472,7 @@ gTK
gTK
myX
sSJ
gka
tbO
eEh
fab
eDC
@@ -235452,7 +235483,7 @@ agm
fNN
esE
wuo
cSH
gLT
oyz
mLV
fDn
@@ -235709,7 +235740,7 @@ spv
dwy
spv
wuo
xFM
pry
kUz
mLV
gka
@@ -236717,7 +236748,7 @@ djO
hOc
bID
qnC
vkz
auC
uoF
pcg
deD
@@ -236994,7 +237025,7 @@ esE
fNN
esE
wuo
cSH
peD
iam
mLV
fDn
@@ -237507,7 +237538,7 @@ gVr
cll
shB
yeD
anI
ueG
iCg
kql
oNO
@@ -237948,7 +237979,7 @@ xwC
utR
pAZ
bln
qWZ
oCq
oxe
vmj
aqB
@@ -243873,7 +243904,7 @@ hgh
czS
fVo
qbd
rzS
rZO
hgh
pLt
mcW
@@ -245140,7 +245171,7 @@ fRI
mdZ
fWr
ggD
pNV
gjZ
cpY
pxF
iYi
@@ -253379,11 +253410,11 @@ emp
dEV
voH
thM
xfd
vXi
pJV
mZG
mZG
qEZ
feW
axc
dFW
aYJ
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+154 -115
View File
@@ -6317,6 +6317,10 @@
"bTo" = (
/turf/closed/wall,
/area/station/commons/storage/primary)
"bTq" = (
/obj/machinery/digital_clock,
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/qm)
"bTF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/status_display/ai/directional/south,
@@ -9689,6 +9693,13 @@
/obj/structure/cable,
/turf/open/floor/iron/smooth_large,
/area/station/hallway/primary/fore)
"cWB" = (
/obj/machinery/digital_clock{
pixel_y = 7;
pixel_x = -1
},
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter/room)
"cWH" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -12601,13 +12612,7 @@
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/port/central)
"dLz" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 8
},
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/dark_red{
dir = 4
},
/obj/effect/turf_decal/tile/red/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/warden)
"dLE" = (
@@ -16766,6 +16771,7 @@
/obj/item/statuebust/hippocratic{
pixel_y = 8
},
/obj/machinery/digital_clock/directional/west,
/turf/open/floor/carpet/green,
/area/command/heads_quarters/captain/private/nt_rep)
"eRt" = (
@@ -18035,15 +18041,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/coldroom)
"flJ" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 8
},
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
},
/turf/open/floor/iron/dark,
/area/station/security/warden)
"flP" = (
/obj/effect/turf_decal/trimline/purple/filled/warning{
dir = 8
@@ -18077,12 +18074,14 @@
"fmC" = (
/obj/machinery/computer/shuttle/labor,
/obj/structure/window/reinforced/spawner/directional/east,
/obj/machinery/status_display/ai/directional/north,
/obj/effect/turf_decal/tile/dark_red/half{
dir = 4
},
/obj/effect/turf_decal/bot,
/obj/machinery/light/cold/directional/north,
/obj/machinery/digital_clock/directional/north{
pixel_y = 36
},
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/bridge)
"fmD" = (
@@ -18911,7 +18910,6 @@
dir = 1
},
/obj/effect/turf_decal/siding/wood,
/obj/structure/sign/clock/directional/south,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/heads_quarters/qm)
@@ -19945,9 +19943,6 @@
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
"fRm" = (
/obj/structure/chair/sofa/corp/left{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
@@ -19957,6 +19952,9 @@
/obj/machinery/light/warm/directional/east,
/obj/machinery/light_switch/directional/east,
/obj/effect/landmark/start/paramedic,
/obj/structure/chair/sofa/corp/right{
dir = 1
},
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
"fRq" = (
@@ -20566,12 +20564,7 @@
/area/station/security/brig)
"gaJ" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 8
},
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
},
/obj/effect/turf_decal/tile/red/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/warden)
"gaQ" = (
@@ -21388,7 +21381,7 @@
/turf/open/floor/noslip,
/area/station/service/janitor)
"glp" = (
/obj/structure/sign/clock,
/obj/machinery/digital_clock,
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/rd)
"glq" = (
@@ -23231,7 +23224,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/machinery/airalarm/directional/north,
/obj/machinery/airalarm/directional/north{
pixel_y = 21
},
/obj/structure/rack,
/obj/item/stack/sheet/iron/fifty,
/obj/item/analyzer,
@@ -23654,7 +23649,6 @@
},
/area/station/hallway/primary/fore)
"gSK" = (
/obj/machinery/status_display/ai/directional/east,
/obj/effect/turf_decal/siding/dark_blue{
dir = 4
},
@@ -23716,6 +23710,12 @@
/obj/effect/turf_decal/tile/blue/diagonal_centre,
/turf/open/floor/iron/white/diagonal,
/area/station/medical/medbay/central)
"gTg" = (
/obj/machinery/digital_clock{
pixel_y = 5
},
/turf/closed/wall/r_wall,
/area/blueshield)
"gTJ" = (
/obj/effect/mapping_helpers/airlock/unres{
dir = 1
@@ -24351,12 +24351,11 @@
},
/area/station/hallway/primary/fore)
"hcw" = (
/obj/structure/disposalpipe/segment{
dir = 4
/obj/machinery/digital_clock{
pixel_y = 5
},
/obj/structure/sign/poster/random/directional/south,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/maintenance/starboard/aft)
/turf/closed/wall,
/area/station/engineering/main)
"hcD" = (
/obj/effect/turf_decal/bot,
/obj/structure/sign/warning/electric_shock/directional/east,
@@ -25207,7 +25206,7 @@
/turf/open/floor/iron/kitchen,
/area/station/service/kitchen)
"hqf" = (
/obj/structure/sign/clock,
/obj/machinery/digital_clock,
/turf/closed/wall/r_wall,
/area/station/security/warden)
"hqm" = (
@@ -27232,6 +27231,19 @@
/obj/effect/spawner/random/structure/girder,
/turf/open/floor/iron/smooth,
/area/station/maintenance/aft/upper)
"hTN" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/closet/firecloset/wall{
pixel_y = -32
},
/obj/effect/turf_decal/trimline/white/end{
dir = 1
},
/turf/open/floor/iron/smooth_edge{
dir = 1
},
/area/station/hallway/secondary/entry)
"hTP" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
@@ -28196,8 +28208,8 @@
pixel_x = 1;
pixel_y = 19
},
/obj/structure/sign/clock/directional/south,
/obj/structure/aquarium/prefilled,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/wood/large,
/area/station/command/heads_quarters/captain)
"ikp" = (
@@ -28696,7 +28708,7 @@
/turf/open/floor/iron/white/smooth_large,
/area/station/science/lab)
"iqx" = (
/obj/structure/sign/clock,
/obj/machinery/digital_clock,
/turf/closed/wall/r_wall,
/area/station/ai_monitored/security/armory)
"iqD" = (
@@ -32681,9 +32693,6 @@
},
/area/station/engineering/main)
"jvf" = (
/obj/structure/chair/sofa/corp/right{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
@@ -32691,6 +32700,9 @@
dir = 4
},
/obj/effect/landmark/start/orderly,
/obj/structure/chair/sofa/corp/left{
dir = 1
},
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
"jvg" = (
@@ -33618,6 +33630,13 @@
pixel_x = -2;
pixel_y = 5
},
/obj/machinery/requests_console/directional/south{
department = "Engineering";
name = "Engineering Requests Console";
dir = 4;
pixel_y = 0;
pixel_x = 30
},
/turf/open/floor/iron/smooth,
/area/station/engineering/lobby)
"jGT" = (
@@ -33706,9 +33725,17 @@
/turf/open/floor/iron/smooth,
/area/station/hallway/primary/aft)
"jHI" = (
/obj/structure/sign/clock,
/turf/closed/wall,
/area/station/commons/vacant_room)
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/trimline/neutral/filled/line,
/obj/effect/turf_decal/trimline/neutral/filled/line,
/obj/effect/turf_decal/trimline/neutral/filled/line,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark/smooth_edge{
dir = 1
},
/area/station/hallway/secondary/command)
"jHT" = (
/obj/machinery/smartfridge/extract/preloaded,
/obj/effect/turf_decal/trimline/purple/filled/line{
@@ -34556,7 +34583,6 @@
/obj/machinery/modular_computer/preset/command,
/obj/machinery/status_display/ai/directional/north,
/obj/effect/turf_decal/bot,
/obj/structure/sign/clock/directional/east,
/turf/open/floor/carpet/cyan,
/area/blueshield)
"jVx" = (
@@ -35511,8 +35537,10 @@
dir = 1
},
/obj/effect/turf_decal/delivery,
/obj/structure/sign/clock/directional/north,
/obj/machinery/light/cold/directional/north,
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/turf/open/floor/engine,
/area/station/ai_monitored/security/armory)
"kjL" = (
@@ -35529,7 +35557,6 @@
dir = 4
},
/obj/structure/cable,
/obj/structure/sign/delamination_counter/directional/east,
/obj/machinery/light/cold/directional/east,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
@@ -36281,7 +36308,6 @@
/turf/open/floor/iron/dark/smooth_large,
/area/station/science/robotics/lab)
"kvT" = (
/obj/structure/sign/clock/directional/north,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
},
@@ -39789,9 +39815,9 @@
/obj/structure/rack,
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/obj/effect/turf_decal/tile/dark_red/half,
/obj/machinery/camera/directional/south{
c_tag = "Armory - Interior"
@@ -40459,9 +40485,11 @@
/area/space/nearstation)
"lAT" = (
/obj/machinery/computer/prisoner/management,
/obj/structure/sign/clock/directional/north,
/obj/effect/turf_decal/bot,
/obj/machinery/light/directional/north,
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/turf/open/floor/carpet/royalblack,
/area/station/command/heads_quarters/hos)
"lBb" = (
@@ -41656,11 +41684,6 @@
dir = 4
},
/area/station/engineering/gravity_generator)
"lQU" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/secure_closet/evidence,
/turf/open/floor/iron/dark,
/area/station/security/warden)
"lQX" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/table,
@@ -46882,6 +46905,12 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/smooth_large,
/area/station/security/checkpoint/supply)
"npK" = (
/obj/machinery/digital_clock{
pixel_y = 5
},
/turf/closed/wall/r_wall,
/area/command/heads_quarters/captain/private/nt_rep)
"npP" = (
/obj/effect/turf_decal/siding/wood{
dir = 6
@@ -46975,7 +47004,8 @@
dir = 6
},
/obj/machinery/light_switch/directional/east{
pixel_x = 21
pixel_x = 21;
pixel_y = -7
},
/obj/structure/closet/secure_closet/courtroom,
/obj/item/megaphone{
@@ -49388,6 +49418,7 @@
pixel_x = -32;
pixel_y = 27
},
/obj/machinery/incident_display/delam/directional/south,
/turf/open/floor/iron/dark/smooth_large,
/area/station/command/bridge)
"nYj" = (
@@ -49493,7 +49524,6 @@
/obj/structure/sign/plaques/kiddie/perfect_man{
pixel_y = 32
},
/obj/structure/sign/clock/directional/east,
/turf/open/floor/wood/large,
/area/command/heads_quarters/captain/private/nt_rep)
"oaD" = (
@@ -49681,17 +49711,6 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/large,
/area/station/science/research)
"oei" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 8
},
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/dark_red{
dir = 4
},
/turf/open/floor/iron/dark,
/area/station/security/warden)
"oej" = (
/obj/effect/turf_decal/weather/sand{
dir = 4
@@ -51977,7 +51996,9 @@
layer = 2.9
},
/obj/machinery/status_display/evac/directional/west,
/obj/structure/sign/clock/directional/north,
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/obj/effect/turf_decal/trimline/dark_blue/filled,
/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner,
/obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{
@@ -52872,7 +52893,9 @@
/obj/item/toy/figure/captain{
pixel_y = 12
},
/obj/structure/sign/clock/directional/north,
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/turf/open/floor/carpet/royalblue,
/area/station/command/heads_quarters/captain/private)
"oXQ" = (
@@ -53297,6 +53320,10 @@
/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/lab)
"pdj" = (
/obj/machinery/incident_display/delam,
/turf/closed/wall/r_wall,
/area/station/security/checkpoint/engineering)
"pdt" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/box,
@@ -53427,7 +53454,6 @@
/obj/structure/closet{
name = "Evidence Closet"
},
/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron/dark,
/area/station/security/warden)
"peM" = (
@@ -54380,11 +54406,13 @@
/obj/item/toy/figure/lawyer{
pixel_y = 18
},
/obj/structure/sign/clock/directional/north,
/obj/effect/turf_decal/siding/wood{
dir = 5
},
/obj/effect/turf_decal/bot,
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/turf/open/floor/wood,
/area/station/service/lawoffice)
"psA" = (
@@ -56190,10 +56218,10 @@
},
/area/station/engineering/break_room)
"pTK" = (
/obj/structure/table/reinforced,
/obj/item/mmi,
/obj/item/assembly/prox_sensor,
/obj/effect/decal/cleanable/dirt,
/obj/structure/table,
/turf/open/floor/iron/smooth,
/area/station/science/research/abandoned)
"pUe" = (
@@ -57704,10 +57732,6 @@
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 10
},
/obj/machinery/requests_console/directional/south{
department = "Engineering";
name = "Engineering Requests Console"
},
/obj/effect/mapping_helpers/requests_console/supplies,
/obj/effect/mapping_helpers/requests_console/assistance,
/turf/open/floor/iron/smooth,
@@ -57902,6 +57926,12 @@
},
/turf/open/floor/iron/large,
/area/station/service/kitchen)
"qoE" = (
/obj/machinery/digital_clock{
pixel_y = 5
},
/turf/closed/wall,
/area/station/security/interrogation)
"qoG" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
@@ -59632,13 +59662,13 @@
/area/station/service/theater)
"qNc" = (
/obj/machinery/vending/cart,
/obj/structure/sign/clock/directional/east,
/obj/item/storage/lockbox/loyalty{
pixel_x = 2;
pixel_y = 18
},
/obj/effect/turf_decal/bot,
/obj/structure/sign/calendar/directional/south,
/obj/machinery/digital_clock/directional/east,
/turf/open/floor/carpet/executive,
/area/station/command/heads_quarters/hop)
"qNd" = (
@@ -61103,7 +61133,6 @@
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/medbay/central)
"rju" = (
/obj/structure/sign/clock/directional/east,
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
/obj/effect/turf_decal/siding/dark_blue{
@@ -63503,7 +63532,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/status_display/ai/directional/west,
/obj/structure/cable,
/obj/machinery/light/cold/directional/west,
/turf/open/floor/engine,
@@ -64634,7 +64662,7 @@
dir = 1
},
/obj/machinery/newscaster/directional/north{
pixel_x = 11
pixel_x = 9
},
/turf/open/floor/wood/large,
/area/station/science/research)
@@ -65678,10 +65706,9 @@
/turf/open/floor/iron/smooth,
/area/station/maintenance/aft/greater)
"sCG" = (
/obj/structure/closet/firecloset/wall{
pixel_y = 32
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/obj/effect/turf_decal/trimline/white/end,
/turf/open/floor/iron/smooth_edge,
/area/station/hallway/secondary/entry)
"sCH" = (
@@ -65772,6 +65799,7 @@
/area/station/engineering/atmos)
"sCX" = (
/obj/effect/turf_decal/trimline/white/mid_joiner,
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/iron/smooth_edge,
/area/station/hallway/secondary/entry)
"sCZ" = (
@@ -68203,6 +68231,7 @@
"the" = (
/obj/machinery/suit_storage_unit/engine,
/obj/effect/turf_decal/box,
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/iron/dark/smooth_large,
/area/station/engineering/storage)
"thf" = (
@@ -69030,7 +69059,6 @@
/turf/open/floor/iron/diagonal,
/area/station/hallway/secondary/service)
"tsb" = (
/obj/structure/chair/sofa/bench,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
@@ -69039,6 +69067,7 @@
pixel_y = 32
},
/obj/effect/landmark/start/assistant,
/obj/structure/chair/sofa/bench/right,
/turf/open/floor/iron/white/smooth_edge,
/area/station/medical/medbay/lobby)
"tsi" = (
@@ -69212,8 +69241,8 @@
dir = 8
},
/obj/structure/cable,
/obj/structure/sign/delamination_counter/directional/west,
/obj/machinery/light/cold/directional/west,
/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"tuF" = (
@@ -69422,7 +69451,9 @@
/turf/open/floor/iron/large,
/area/station/commons/fitness/recreation/entertainment)
"twZ" = (
/obj/structure/sign/clock,
/obj/machinery/digital_clock{
pixel_y = 6
},
/turf/closed/wall/r_wall,
/area/station/security/office)
"txh" = (
@@ -70488,7 +70519,9 @@
icon_state = "original"
},
/obj/item/toy/cattoy,
/obj/structure/sign/clock/directional/north,
/obj/machinery/digital_clock/directional/north{
pixel_y = 37
},
/turf/open/floor/carpet/blue,
/area/station/command/heads_quarters/cmo)
"tLN" = (
@@ -72707,6 +72740,9 @@
/obj/machinery/firealarm/directional/south,
/obj/structure/filingcabinet,
/obj/effect/turf_decal/bot,
/obj/machinery/digital_clock/directional/south{
pixel_y = -39
},
/turf/open/floor/iron/smooth_edge{
dir = 1
},
@@ -78172,6 +78208,10 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating/airless,
/area/station/cargo/sorting)
"vUB" = (
/obj/machinery/incident_display/delam,
/turf/closed/wall/r_wall,
/area/station/engineering/supermatter)
"vUC" = (
/obj/structure/chair/pew/left,
/turf/open/floor/iron/chapel{
@@ -79130,6 +79170,7 @@
/area/station/maintenance/port/fore)
"whY" = (
/obj/structure/closet/secure_closet/evidence,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/dark,
/area/station/security/warden)
"wia" = (
@@ -79346,6 +79387,10 @@
/obj/structure/fluff/beach_umbrella/syndi,
/turf/open/floor/iron/white/small,
/area/station/common/pool)
"wlh" = (
/obj/machinery/incident_display/delam,
/turf/closed/wall,
/area/station/engineering/main)
"wlj" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -83921,7 +83966,6 @@
/area/station/security/warden)
"xBW" = (
/obj/effect/turf_decal/bot,
/obj/structure/sign/poster/official/random/directional/north,
/obj/machinery/camera/directional/north,
/turf/open/floor/iron/dark/smooth_large,
/area/station/engineering/main)
@@ -85517,12 +85561,7 @@
/area/station/maintenance/port/aft)
"yaH" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 8
},
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
},
/obj/effect/turf_decal/tile/red/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/warden)
"ybj" = (
@@ -107958,11 +107997,11 @@ lkj
ttw
qjA
bgi
qjA
iTA
rQj
atf
rUz
qjA
hTN
iTA
bgi
qjA
ttw
@@ -117665,7 +117704,7 @@ doJ
doJ
doJ
cmH
cmH
gTg
cmH
eUl
cmH
@@ -118040,7 +118079,7 @@ qTC
hcL
wEV
jgd
xnw
pdj
lFP
rfv
uyT
@@ -118833,7 +118872,7 @@ vuq
adx
afy
qat
bZi
vUB
jrj
aaH
jko
@@ -118963,8 +119002,8 @@ hca
nEb
mzb
hEA
hvK
jHI
imR
eEN
cDV
ibV
@@ -120369,7 +120408,7 @@ rAU
cge
mxk
jQq
oCl
cWB
gME
tUK
nYt
@@ -120636,7 +120675,7 @@ bZi
rfD
dAY
mhx
bZi
vUB
cmr
fsX
ejY
@@ -121130,7 +121169,7 @@ lVG
nDn
hAj
enY
rAU
hcw
nFx
iPJ
iRb
@@ -121387,7 +121426,7 @@ fdG
mhY
vsS
qlQ
rAU
wlh
xBW
iPJ
vgy
@@ -122577,8 +122616,8 @@ cAy
aDR
yaH
dLz
oei
flJ
gaJ
dLz
gaJ
aDR
bzs
@@ -122833,7 +122872,7 @@ tpZ
uLY
aDR
wWQ
lQU
whY
whY
aDR
kIV
@@ -123059,7 +123098,7 @@ usB
jxu
usB
xlE
xlE
npK
xlE
iGu
xlE
@@ -123191,7 +123230,7 @@ fAJ
iAF
iAF
owb
hcw
tTt
vlh
the
eLf
@@ -125413,7 +125452,7 @@ ueZ
oae
qKi
xPP
qRF
qoE
kvT
fVF
gwF
@@ -125732,7 +125771,7 @@ iWQ
gnh
koK
fyT
onP
bTq
uRm
pNh
nMh
+183 -185
View File
@@ -1626,6 +1626,20 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
"aex" = (
/obj/structure/window/reinforced/spawner/directional/west,
/obj/structure/table/glass,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/cup/beaker/large{
pixel_x = 6;
pixel_y = 4
},
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
dir = 4
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"aey" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
@@ -4604,13 +4618,13 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
/obj/machinery/airalarm/directional/north,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/obj/structure/fireaxecabinet/directional/north,
/turf/open/floor/iron,
/area/station/command/bridge)
"aAE" = (
@@ -6221,7 +6235,7 @@
/area/station/commons/fitness/recreation)
"aMY" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/mid/directional/south,
/obj/structure/window/reinforced/tram/directional/south,
/turf/open/openspace,
/area/station/hallway/primary/tram/center)
"aNa" = (
@@ -8019,10 +8033,10 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
/obj/structure/sign/clock/directional/north,
/obj/machinery/camera/directional/north{
c_tag = "Command - Bridge North"
},
/obj/machinery/incident_display/dual/directional/north,
/turf/open/floor/iron,
/area/station/command/bridge)
"bsW" = (
@@ -9044,6 +9058,13 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron/dark,
/area/station/security/courtroom/holding)
"bLq" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 5
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"bLr" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -12819,12 +12840,15 @@
/turf/open/floor/iron/checker,
/area/station/service/kitchen)
"cZo" = (
/obj/structure/sign/collision_counter{
pixel_x = -4;
pixel_y = 2
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/effect/turf_decal/trimline/neutral/filled/warning,
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/closed/wall,
/area/station/medical/medbay/lobby)
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/incident_display/dual/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/tram/center)
"cZz" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -16057,6 +16081,13 @@
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/commons/fitness/recreation/entertainment)
"elu" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 1
},
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron,
/area/station/security/prison)
"elB" = (
/obj/effect/turf_decal/bot,
/obj/structure/rack,
@@ -16302,7 +16333,6 @@
},
/obj/machinery/newscaster/directional/south,
/obj/structure/reagent_dispensers/water_cooler,
/obj/structure/sign/delamination_counter/directional/west,
/turf/open/floor/iron,
/area/station/engineering/break_room)
"eqJ" = (
@@ -16507,12 +16537,6 @@
},
/turf/open/floor/glass/reinforced,
/area/station/security/warden)
"etQ" = (
/obj/effect/turf_decal/trimline/red/filled/line,
/obj/machinery/light/directional/south,
/obj/structure/sign/clock/directional/south,
/turf/open/floor/iron/dark,
/area/station/security/courtroom/holding)
"euC" = (
/turf/open/floor/wood/parquet,
/area/station/medical/psychology)
@@ -18723,7 +18747,7 @@
/area/station/science/ordnance/testlab)
"fnl" = (
/obj/machinery/light/directional/east,
/obj/item/radio/intercom/directional/east,
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/dark/side{
dir = 1
},
@@ -19731,13 +19755,6 @@
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron,
/area/station/commons/dorms)
"fGS" = (
/obj/machinery/modular_computer/preset/id{
dir = 1
},
/obj/structure/sign/clock/directional/south,
/turf/open/floor/iron/cafeteria,
/area/station/command/heads_quarters/rd)
"fGZ" = (
/obj/structure/table,
/obj/item/razor{
@@ -20083,6 +20100,16 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
"fNS" = (
/obj/structure/table,
/obj/item/radio/intercom/directional/east{
freerange = 1;
listening = 0;
name = "Custom Channel";
pixel_x = 0
},
/turf/open/floor/iron/dark/small,
/area/station/commons/vacant_room)
"fNV" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -21385,7 +21412,6 @@
dir = 10;
network = list("ss13","engine","engineering")
},
/obj/structure/sign/delamination_counter/directional/south,
/turf/open/floor/engine,
/area/station/engineering/supermatter)
"gpD" = (
@@ -21743,14 +21769,6 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron,
/area/station/cargo/miningdock)
"gxA" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/right/directional/north,
/obj/structure/chair/sofa/bench/tram/right{
dir = 8
},
/turf/open/openspace,
/area/station/hallway/primary/tram/center)
"gxO" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 9
@@ -23867,6 +23885,12 @@
/obj/machinery/newscaster/directional/north,
/turf/open/floor/wood/large,
/area/station/service/library)
"hnK" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/vacant_room)
"hnP" = (
/obj/effect/turf_decal/trimline/dark_green/filled/corner{
dir = 4
@@ -24221,6 +24245,7 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
/obj/machinery/incident_display/tram/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"hvJ" = (
@@ -24929,6 +24954,7 @@
c_tag = "Civilian - Recreational Area North-West"
},
/obj/item/toy/plush/lizard_plushie/space/green,
/obj/machinery/incident_display/dual/directional/north,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"hMs" = (
@@ -25241,6 +25267,7 @@
/obj/item/storage/toolbox/emergency,
/obj/item/wrench,
/obj/item/assembly/signaler,
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron,
/area/station/command/bridge)
"hSs" = (
@@ -28099,9 +28126,6 @@
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"iWm" = (
/obj/structure/sign/collision_counter{
pixel_x = -32
},
/obj/structure/table/reinforced,
/obj/item/storage/medkit/regular{
pixel_x = -5;
@@ -28111,6 +28135,7 @@
pixel_x = 8;
pixel_y = 4
},
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/station/command/bridge)
"iWz" = (
@@ -29187,16 +29212,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"jpw" = (
/obj/effect/turf_decal/trimline/yellow/filled/line,
/obj/structure/sign/clock/directional/south,
/obj/machinery/conveyor_switch/oneway{
id = "engineeringchute";
name = "Shipment Delivery Chute Activator";
pixel_x = -11
},
/turf/open/floor/iron,
/area/station/engineering/main)
"jpC" = (
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 4
@@ -29431,6 +29446,13 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
"jtP" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 5
},
/obj/item/kirbyplants/organic/plant10,
/turf/open/floor/iron/white,
/area/station/science/lobby)
"jud" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/landmark/event_spawn,
@@ -30608,6 +30630,16 @@
/obj/machinery/door/firedoor/border_only,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"jRq" = (
/obj/effect/turf_decal/trimline/yellow/filled/line,
/obj/machinery/conveyor_switch/oneway{
id = "engineeringchute";
name = "Shipment Delivery Chute Activator";
pixel_x = -11
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron,
/area/station/engineering/main)
"jRy" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -31830,6 +31862,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"knX" = (
/obj/effect/turf_decal/trimline/red/filled/line,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron,
/area/station/security/office)
"koj" = (
/obj/machinery/vending/wardrobe/jani_wardrobe,
/obj/structure/extinguisher_cabinet/directional/north,
@@ -32156,7 +32196,6 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
/obj/structure/fireaxecabinet/directional/north,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -33899,7 +33938,7 @@
/area/station/science/explab)
"kYp" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/right/directional/south,
/obj/structure/window/reinforced/tram/directional/south,
/obj/machinery/destination_sign/south{
pixel_y = -11
},
@@ -34186,9 +34225,6 @@
/obj/structure/disposalpipe/trunk{
dir = 2
},
/obj/structure/sign/collision_counter{
pixel_x = 32
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"lcn" = (
@@ -36309,12 +36345,6 @@
/obj/item/cultivator,
/turf/open/floor/iron/dark,
/area/station/security/prison/garden)
"lQC" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 5
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"lQE" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/directional/north,
@@ -37773,6 +37803,13 @@
name = "hyper-reinforced wall"
},
/area/station/science/ordnance/bomb)
"mpO" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 1
},
/obj/machinery/newscaster/directional/north,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"mpX" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/structure/table/wood,
@@ -38993,6 +39030,18 @@
},
/turf/open/floor/iron/white,
/area/station/medical/storage)
"mPu" = (
/obj/item/paper{
default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper.";
name = "initiation paperwork"
},
/obj/machinery/computer/records/medical/syndie{
dir = 1;
req_access = list("syndicate")
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark/small,
/area/station/commons/vacant_room)
"mPN" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron,
@@ -39219,6 +39268,16 @@
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/station/solars/starboard/fore)
"mWy" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/neutral/opposingcorners{
dir = 1
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
"mWK" = (
/obj/structure/chair/stool/directional/south,
/obj/effect/landmark/start/hangover,
@@ -41353,7 +41412,6 @@
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 1
},
/obj/machinery/newscaster/directional/north,
/obj/item/pai_card,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
@@ -41390,7 +41448,7 @@
/area/station/hallway/secondary/command)
"nKp" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/left/directional/north,
/obj/structure/window/reinforced/tram/directional/north,
/obj/structure/chair/sofa/bench/tram/right{
dir = 8
},
@@ -41734,7 +41792,7 @@
/area/station/engineering/main)
"nQc" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/right/directional/north,
/obj/structure/window/reinforced/tram/directional/north,
/obj/machinery/destination_sign/north{
pixel_y = 10
},
@@ -42177,20 +42235,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/science/lower)
"nXd" = (
/obj/structure/window/reinforced/spawner/directional/west,
/obj/structure/table/glass,
/obj/item/reagent_containers/dropper,
/obj/structure/sign/clock/directional/north,
/obj/item/reagent_containers/cup/beaker/large{
pixel_x = 6;
pixel_y = 4
},
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
dir = 4
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
"nXh" = (
/obj/effect/turf_decal/trimline/neutral/warning{
dir = 1
@@ -42244,21 +42288,6 @@
/obj/item/stamp/head/cmo,
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/cmo)
"nXN" = (
/obj/item/kirbyplants/organic/plant21,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
},
/obj/structure/extinguisher_cabinet/directional/east,
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
dir = 9
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
},
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/cmo)
"nXP" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -43056,7 +43085,10 @@
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
},
/obj/structure/extinguisher_cabinet/directional/north,
/obj/machinery/incident_display/tram/directional/north{
name = "darwin award counter";
desc = "A display that indicates how many dents that'll need fixed after the shift is over."
},
/turf/open/floor/iron,
/area/station/maintenance/port/central)
"onW" = (
@@ -43094,7 +43126,7 @@
/obj/machinery/destination_sign/north{
pixel_y = 10
},
/obj/structure/window/reinforced/tram/left/directional/north,
/obj/structure/window/reinforced/tram/directional/north,
/obj/structure/chair/sofa/bench/tram/right{
dir = 8
},
@@ -44019,6 +44051,13 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/security/brig)
"oII" = (
/obj/machinery/modular_computer/preset/id{
dir = 1
},
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/cafeteria,
/area/station/command/heads_quarters/rd)
"oIU" = (
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
@@ -44383,6 +44422,7 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/iron,
/area/station/maintenance/port/central)
"oRV" = (
@@ -45218,11 +45258,6 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/storage)
"piT" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/vacant_room)
"piX" = (
/turf/open/floor/engine/n2o,
/area/station/engineering/atmos)
@@ -45525,16 +45560,6 @@
dir = 1
},
/area/station/service/kitchen)
"pnz" = (
/obj/structure/sign/clock/directional/south,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/neutral/opposingcorners{
dir = 1
},
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
"pnF" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/siding/thinplating,
@@ -49334,11 +49359,6 @@
/obj/structure/table,
/obj/item/storage/toolbox/emergency,
/obj/item/crowbar,
/obj/structure/sign/collision_counter{
desc = "A display that indicates how many dents that'll need fixed after the shift is over.";
name = "darwin award counter";
pixel_x = 32
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/maintenance/port/central)
@@ -51842,12 +51862,6 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/white,
/area/station/science/auxlab/firing_range)
"rAZ" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 1
},
/turf/open/floor/iron,
/area/station/security/prison)
"rBb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -53031,7 +53045,7 @@
/area/station/security/warden)
"rZD" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/left/directional/south,
/obj/structure/window/reinforced/tram/directional/south,
/obj/structure/chair/sofa/bench/tram/right{
dir = 4
},
@@ -53421,14 +53435,6 @@
},
/turf/open/floor/catwalk_floor,
/area/station/hallway/primary/tram/right)
"sgt" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/right/directional/south,
/obj/structure/chair/sofa/bench/tram/right{
dir = 4
},
/turf/open/openspace,
/area/station/hallway/primary/tram/center)
"sgA" = (
/obj/structure/table,
/obj/machinery/light/small/directional/west,
@@ -54719,6 +54725,14 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
"sCp" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/structure/cable,
/obj/machinery/incident_display/delam/directional/north,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"sCv" = (
/obj/structure/table/wood,
/obj/machinery/light/dim/directional/north,
@@ -55072,17 +55086,6 @@
},
/turf/open/floor/iron,
/area/station/commons/dorms)
"sJp" = (
/obj/structure/table,
/obj/item/radio/intercom/directional/east{
freerange = 1;
listening = 0;
name = "Custom Channel";
pixel_x = 0
},
/obj/structure/sign/clock/directional/south,
/turf/open/floor/iron/dark/small,
/area/station/commons/vacant_room)
"sJx" = (
/obj/structure/chair{
dir = 1
@@ -55975,6 +55978,21 @@
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/station/asteroid)
"sYh" = (
/obj/item/kirbyplants/organic/plant21,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
},
/obj/structure/extinguisher_cabinet/directional/east,
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
dir = 9
},
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
},
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/cmo)
"sYk" = (
/obj/effect/turf_decal/trimline/neutral/filled/corner{
dir = 4
@@ -57107,17 +57125,6 @@
/obj/structure/chair,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"tsR" = (
/obj/item/paper{
default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper.";
name = "initiation paperwork"
},
/obj/machinery/computer/records/medical/syndie{
dir = 1;
req_access = list("syndicate")
},
/turf/open/floor/iron/dark/small,
/area/station/commons/vacant_room)
"tsV" = (
/obj/structure/window/reinforced/spawner/directional/west,
/obj/machinery/shower/directional/east,
@@ -58390,10 +58397,10 @@
/turf/closed/wall,
/area/station/hallway/secondary/entry)
"tPV" = (
/obj/machinery/status_display/evac/directional/north,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
/obj/machinery/incident_display/dual/directional/north,
/turf/open/floor/iron,
/area/station/engineering/main)
"tPW" = (
@@ -60908,7 +60915,7 @@
/obj/machinery/destination_sign/south{
pixel_y = -11
},
/obj/structure/window/reinforced/tram/left/directional/south,
/obj/structure/window/reinforced/tram/directional/south,
/obj/effect/landmark/start/hangover,
/obj/structure/chair/sofa/bench/tram/left{
dir = 8
@@ -61616,14 +61623,6 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/commons/vacant_room/office)
"uSU" = (
/obj/effect/turf_decal/trimline/red/filled/line,
/obj/structure/sign/clock/directional/south,
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/iron,
/area/station/security/office)
"uSV" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/machinery/chem_heater/withbuffer,
@@ -64378,13 +64377,6 @@
},
/turf/open/floor/carpet,
/area/station/command/meeting_room)
"vNd" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 5
},
/obj/item/kirbyplants/organic/plant10,
/turf/open/floor/iron/white,
/area/station/science/lobby)
"vNe" = (
/obj/effect/turf_decal/trimline/red/filled/corner{
dir = 4
@@ -68126,6 +68118,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/dorms)
"xmv" = (
/obj/effect/turf_decal/trimline/red/filled/line,
/obj/machinery/light/directional/south,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark,
/area/station/security/courtroom/holding)
"xmE" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 4
@@ -69797,7 +69795,7 @@
/area/station/engineering/supermatter)
"xVH" = (
/obj/structure/industrial_lift/tram,
/obj/structure/window/reinforced/tram/mid/directional/north,
/obj/structure/window/reinforced/tram/directional/north,
/turf/open/openspace,
/area/station/hallway/primary/tram/center)
"xVJ" = (
@@ -76061,7 +76059,7 @@ fTI
agz
agz
agz
piT
hnK
gcp
aaa
aaa
@@ -87763,7 +87761,7 @@ wkk
fZX
jLj
gvI
rAZ
elu
kHT
mIN
ezb
@@ -99399,7 +99397,7 @@ pwX
hJd
aYn
hJd
jpw
jRq
qHs
qHs
qHs
@@ -102228,7 +102226,7 @@ sHH
sHH
cjy
qHs
vqH
sCp
fuj
xEy
miU
@@ -141597,7 +141595,7 @@ exv
gNy
krT
aBI
sJp
fNS
gcp
aaa
aaa
@@ -141854,7 +141852,7 @@ exv
gNy
ydj
jap
tsR
mPu
gcp
aaa
aaa
@@ -149988,7 +149986,7 @@ kaD
qYj
ceW
oca
lQC
bLq
dDi
mtX
tPE
@@ -152313,7 +152311,7 @@ jvf
ook
mGQ
yiM
fpg
mpO
heY
ddh
mQp
@@ -157662,7 +157660,7 @@ avn
fAg
oUx
wbH
uSU
knX
jKq
jKq
jKq
@@ -161269,7 +161267,7 @@ oXb
hzV
drh
uMg
etQ
xmv
omm
abM
abM
@@ -166474,7 +166472,7 @@ qfg
qOY
iae
qeL
nXN
sYh
nXK
wdj
oGJ
@@ -168495,11 +168493,11 @@ aEk
rOu
umT
ykP
gxA
nKp
hio
rPq
aEq
sgt
rZD
ykP
lej
pxC
@@ -169016,8 +169014,8 @@ gUF
rlO
ykP
lej
fxs
lDt
cZo
wyd
mJc
kin
juV
@@ -169046,7 +169044,7 @@ adM
obH
aQk
jYS
nXd
aex
lVC
xiP
jYS
@@ -169274,7 +169272,7 @@ uGM
qwI
lej
fxs
cZo
wyd
wyd
rks
rks
@@ -169301,7 +169299,7 @@ vdX
wGF
isM
gUH
pnz
mWy
jYS
qrR
tMg
@@ -181118,7 +181116,7 @@ izy
tPu
ldG
pof
fGS
oII
pbH
uvU
umu
@@ -182639,7 +182637,7 @@ dfx
cey
stt
lfQ
vNd
jtP
nBM
sPQ
ezL
@@ -117,9 +117,9 @@
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"u" = (
@@ -39,10 +39,10 @@
/obj/item/gun/energy/e_gun/dragnet,
/obj/item/radio/intercom/directional/north,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/obj/item/melee/breaching_hammer,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"Mj" = (
@@ -50,5 +50,9 @@
#define COMSIG_ATOM_ATTACK_ROBOT "atom_attack_robot"
/// from base of atom/attack_robot_secondary(): (mob/user)
#define COMSIG_ATOM_ATTACK_ROBOT_SECONDARY "atom_attack_robot_secondary"
///from relay_attackers element: (atom/attacker)
///from relay_attackers element: (atom/attacker, attack_flags)
#define COMSIG_ATOM_WAS_ATTACKED "atom_was_attacked"
///The damage type of the weapon projectile is non-lethal stamina
#define ATTACKER_STAMINA_ATTACK (1<<0)
///the attacker is shoving the source
#define ATTACKER_SHOVING (1<<1)
@@ -224,6 +224,9 @@
///called when getting the item's exact ratio for cargo's profit, without selling the item.
#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry"
/// Called on component/uplink/OnAttackBy(..)
#define COMSIG_ITEM_ATTEMPT_TC_REIMBURSE "item_attempt_tc_reimburse"
// /obj/item/clothing signals
///from [/mob/living/carbon/human/Move]: ()
+8
View File
@@ -14,3 +14,11 @@
/// Emoji icon set
#define EMOJI_SET 'modular_skyrat/master_files/icons/emoji.dmi' // SKYRAT EDIT - ORIGINAL: 'icons/ui_icons/emoji/emoji.dmi'
// Font metrics bitfield
/// Include leading A width and trailing C width in GetWidth() or in DrawText()
#define INCLUDE_AC (1<<0)
DEFINE_BITFIELD(font_flags, list(
"INCLUDE_AC" = INCLUDE_AC,
))
+8
View File
@@ -11,6 +11,11 @@
#define SMOOTH_QUEUED (1<<4)
/// Smooths with objects, and will thus need to scan turfs for contents.
#define SMOOTH_OBJ (1<<5)
/// Uses directional object smoothing, so we care not only about something being on the right turf, but also its direction
/// Changes the meaning of smoothing_junction, instead of representing the directions we are smoothing in
/// it represents the sides of our directional border object that have a neighbor
/// Is incompatible with SMOOTH_CORNERS because border objects don't have corners
#define SMOOTH_BORDER_OBJECT (1<<6)
DEFINE_BITFIELD(smoothing_flags, list(
"SMOOTH_CORNERS" = SMOOTH_CORNERS,
@@ -19,6 +24,7 @@ DEFINE_BITFIELD(smoothing_flags, list(
"SMOOTH_BORDER" = SMOOTH_BORDER,
"SMOOTH_QUEUED" = SMOOTH_QUEUED,
"SMOOTH_OBJ" = SMOOTH_OBJ,
"SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT,
))
@@ -146,6 +152,8 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium
#define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle
#define SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM S_OBJ(26) ///obj/structure/window/reinforced/tram
#define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice
#define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk
+48 -23
View File
@@ -437,6 +437,7 @@
#define OFFSET_NECK "neck"
#define OFFSET_HELD "held"
#define OFFSET_ACCESSORY "accessory" // Skyrat edit - addition
#define OFFSET_HAIR "hair" // Skyrat edit - addition - Akulas
//MINOR TWEAKS/MISC
//#define AGE_MIN 17 //youngest a character can be //ORIGINAL
@@ -613,6 +614,26 @@
#define AI_EMOTION_BLUE_GLOW "Blue Glow"
#define AI_EMOTION_RED_GLOW "Red Glow"
///Defines for AI hologram preferences
#define AI_HOLOGRAM_BEAR "Bear"
#define AI_HOLOGRAM_CARP "Carp"
#define AI_HOLOGRAM_CAT "Cat"
#define AI_HOLOGRAM_CAT_2 "Cat Alternate"
#define AI_HOLOGRAM_CHICKEN "Chicken"
#define AI_HOLOGRAM_CORGI "Corgi"
#define AI_HOLOGRAM_COW "Cow"
#define AI_HOLOGRAM_CRAB "Crab"
#define AI_HOLOGRAM_DEFAULT "Default"
#define AI_HOLOGRAM_FACE "Floating Face"
#define AI_HOLOGRAM_FOX "Fox"
#define AI_HOLOGRAM_GOAT "Goat"
#define AI_HOLOGRAM_NARSIE "Narsie"
#define AI_HOLOGRAM_PARROT "Parrot"
#define AI_HOLOGRAM_PUG "Pug"
#define AI_HOLOGRAM_RATVAR "Ratvar"
#define AI_HOLOGRAM_SPIDER "Spider"
#define AI_HOLOGRAM_XENO "Xeno Queen"
/// Icon state to use for ai displays that just turns them off
#define AI_DISPLAY_DONT_GLOW "ai_off"
/// Throw modes, defines whether or not to turn off throw mode after
@@ -663,47 +684,48 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list(
/// Total number of layers for mob overlays
/// KEEP THIS UP-TO-DATE OR SHIT WILL BREAK
/// Also consider updating layers_to_offset
#define TOTAL_LAYERS 39 // SKYRAT EDIT CHANGE - ORIGINAL: #define TOTAL_LAYERS 33
#define TOTAL_LAYERS 40 // SKYRAT EDIT CHANGE - ORIGINAL: 34
/// Mutations layer - Tk headglows, cold resistance glow, etc
#define MUTATIONS_LAYER 39 // SKYRAT EDIT CHANGE - ORIGINAL: 33
#define MUTATIONS_LAYER 40 // SKYRAT EDIT CHANGE - ORIGINAL: 34
/// Mutantrace features (tail when looking south) that must appear behind the body parts
#define BODY_BEHIND_LAYER 38 // SKYRAT EDIT CHANGE - ORIGINAL: 32
#define BODY_BEHIND_LAYER 39 // SKYRAT EDIT CHANGE - ORIGINAL: 33
/// Layer for bodyparts that should appear behind every other bodypart - Mostly, legs when facing WEST or EAST
#define BODYPARTS_LOW_LAYER 37 // SKYRAT EDIT CHANGE - ORIGINAL: 31
#define BODYPARTS_LOW_LAYER 38 // SKYRAT EDIT CHANGE - ORIGINAL: 32
/// Layer for most bodyparts, appears above BODYPARTS_LOW_LAYER and below BODYPARTS_HIGH_LAYER
#define BODYPARTS_LAYER 36 // SKYRAT EDIT CHANGE - ORIGINAL: 30
#define BODYPARTS_LAYER 37 // SKYRAT EDIT CHANGE - ORIGINAL: 31
/// Mutantrace features (snout, body markings) that must appear above the body parts
#define BODY_ADJ_LAYER 35 // SKYRAT EDIT CHANGE - ORIGINAL: 29
#define BODY_ADJ_LAYER 36 // SKYRAT EDIT CHANGE - ORIGINAL: 30
/// Underwear, undershirts, socks, eyes, lips(makeup)
#define BODY_LAYER 34 // SKYRAT EDIT CHANGE - ORIGINAL: 28
#define BODY_LAYER 35 // SKYRAT EDIT CHANGE - ORIGINAL: 29
/// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define FRONT_MUTATIONS_LAYER 33 // SKYRAT EDIT CHANGE - ORIGINAL: 27
#define FRONT_MUTATIONS_LAYER 34 // SKYRAT EDIT CHANGE - ORIGINAL: 28
/// Damage indicators (cuts and burns)
#define DAMAGE_LAYER 32 // SKYRAT EDIT CHANGE - ORIGINAL: 26
// SKYRAT EDIT ADDITION BEGIN.
#define DAMAGE_LAYER 33 // SKYRAT EDIT CHANGE - ORIGINAL: 27
// SKYRAT EDIT ADDITION START
/// This layer is used for things that shouldn't be over clothes, but should be over mutations
#define BODY_FRONT_UNDER_CLOTHES 31
#define BODY_FRONT_UNDER_CLOTHES 32
// SKYRAT EDIT ADDITION END
/// Jumpsuit clothing layer
#define UNIFORM_LAYER 30 // SKYRAT EDIT CHANGE - ORIGINAL: 25
#define UNIFORM_LAYER 31 // SKYRAT EDIT CHANGE - ORIGINAL: 26
// SKYRAT EDIT ADDITION BEGIN - cursed layers under clothing
#define ANUS_LAYER 29
#define VAGINA_LAYER 28
#define PENIS_LAYER 27
#define NIPPLES_LAYER 26
#define BANDAGE_LAYER 25
#define ANUS_LAYER 30
#define VAGINA_LAYER 29
#define PENIS_LAYER 28
#define NIPPLES_LAYER 27
#define BANDAGE_LAYER 26
//SKYRAT EDIT ADDITION END
/// ID card layer
#define ID_LAYER 24
#define ID_LAYER 25
/// ID card layer (might be deprecated)
#define ID_CARD_LAYER 23
#define ID_CARD_LAYER 24
/// Layer for bodyparts that should appear above every other bodypart - Currently only used for hands
#define BODYPARTS_HIGH_LAYER 22
#define BODYPARTS_HIGH_LAYER 23
/// Gloves layer
#define GLOVES_LAYER 21
#define GLOVES_LAYER 22
/// Shoes layer
#define SHOES_LAYER 20
#define SHOES_LAYER 21
/// Layer for masks that are worn below ears and eyes (like Balaclavas) (layers below hair, use flagsinv=HIDEHAIR as needed)
#define LOW_FACEMASK_LAYER 20
/// Ears layer (Spessmen have ears? Wow)
#define EARS_LAYER 19
/// Suit layer (armor, coats, etc.)
@@ -770,6 +792,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
"[ID_CARD_LAYER]" = UPPER_BODY, // unused
"[ID_LAYER]" = UPPER_BODY,
"[FACEMASK_LAYER]" = UPPER_BODY,
"[LOW_FACEMASK_LAYER]" = UPPER_BODY,
// These two are cached, and have their appearance shared(?), so it's safer to just not touch it
"[MUTATIONS_LAYER]" = NO_MODIFY,
"[FRONT_MUTATIONS_LAYER]" = NO_MODIFY,
@@ -798,6 +821,8 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
#define EXTERNAL_FRONT_UNDER_CLOTHES (1 << 4)
/// Draws organ on the ABOVE_BODY_FRONT_HEAD_LAYER
#define EXTERNAL_FRONT_OVER (1 << 5)
/// Draws organ on the HEAD_LAYER, for things that need to be above hair but below hats.
#define EXTERNAL_FRONT_ABOVE_HAIR (1 << 6)
// SKYRAT EDIT END (not touching what comes next because we don't actually have to (nor want to))
/// Draws organ on all EXTERNAL layers
#define ALL_EXTERNAL_OVERLAYS EXTERNAL_FRONT | EXTERNAL_ADJACENT | EXTERNAL_BEHIND
+5 -1
View File
@@ -54,7 +54,11 @@
#define QDELETED(X) (isnull(X) || QDELING(X))
#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE)
// This is a bit hacky, we do it to avoid people relying on a return value for the macro
// If you need that you should use QDEL_IN_STOPPABLE instead
#define QDEL_IN(item, time) ; \
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time);
#define QDEL_IN_STOPPABLE(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE)
#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
#define QDEL_NULL(item) qdel(item); item = null
#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
+5 -5
View File
@@ -146,11 +146,11 @@
#define MAX_ADDICTION_POINTS 1000
///Addiction start/ends
#define WITHDRAWAL_STAGE1_START_CYCLE 61
#define WITHDRAWAL_STAGE1_END_CYCLE 120
#define WITHDRAWAL_STAGE2_START_CYCLE 121
#define WITHDRAWAL_STAGE2_END_CYCLE 180
#define WITHDRAWAL_STAGE3_START_CYCLE 181
#define WITHDRAWAL_STAGE1_START_CYCLE 121 // SKYRAT EDIT CHANGE - Original 61
#define WITHDRAWAL_STAGE1_END_CYCLE 240 // SKYRAT EDIT CHANGE - Original 120
#define WITHDRAWAL_STAGE2_START_CYCLE 241 // SKYRAT EDIT CHANGE - Original 121
#define WITHDRAWAL_STAGE2_END_CYCLE 360 // SKYRAT EDIT CHANGE - Original 180
#define WITHDRAWAL_STAGE3_START_CYCLE 361 // SKYRAT EDIT CHANGE - Original 181
///reagent tags - used to look up reagents for specific effects. Feel free to add to but comment it
/// This reagent does brute effects (BOTH damaging and healing)
+10 -1
View File
@@ -4,9 +4,18 @@
/// Prepares a text to be used for maptext. Use this so it doesn't look hideous.
#define MAPTEXT(text) {"<span class='maptext'>[##text]</span>"}
/// Prepares a text to be used for maptext, using a font that can handle larger text better.
/// Prepares a text to be used for maptext, using a variable size font.
/// Variable size font. More flexible but doesn't scale pixel perfect to BYOND icon resolutions. (May be blurry.) Can use any size in pt or px.
#define MAPTEXT_VCR_OSD_MONO(text) {"<span style='font-family: \"VCR OSD Mono\"'>[##text]</span>"}
/// Prepares a text to be used for maptext using a pixel font. Cleaner but less size choices.
/// Standard size (ie: normal runechat) Use only sizing pt, multiples of 6: 6pt 12pt 18pt 24pt etc. - Not for use with px sizing
#define MAPTEXT_GRAND9K(text) {"<span style='font-family: \"Grand9K Pixel\"'>[##text]</span>"}
/// Prepares a text to be used for maptext using a pixel font. Cleaner but less size choices.
/// Small size. (ie: whisper runechat) Use only size pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing
#define MAPTEXT_TINY_UNICODE(text) {"<span style='font-family: \"TinyUnicode\"'>[##text]</span>"}
/// Macro from Lummox used to get height from a MeasureText proc.
/// resolves the MeasureText() return value once, then resolves the height, then sets return_var to that.
#define WXH_TO_HEIGHT(measurement, return_var) \
@@ -0,0 +1,3 @@
/// The axis of the `offset_features` list in the species datum
#define INDEX_X 1
#define INDEX_Y 2
+3
View File
@@ -19,6 +19,9 @@
//Grab breakout odds
#define OVERSIZED_GRAB_RESIST_BONUS 0 // BUBBER EDIT- With this oversized are just as good at grabs as anyone else.
//Grab breakout bonus for akulas when at 10+ wet_stacks
#define AKULA_GRAB_RESIST_BONUS 10
// Damage modifiers
#define OVERSIZED_HARM_DAMAGE_BONUS 5 /// Those with the oversized trait do 5 more damage.
+1
View File
@@ -16,6 +16,7 @@
#define BODYPART_ICON_HUMAN 'modular_skyrat/modules/bodyparts/icons/human_parts_greyscale.dmi'
#define BODYPART_ICON_MAMMAL 'modular_skyrat/modules/bodyparts/icons/mammal_parts_greyscale.dmi'
#define BODYPART_ICON_AKULA 'modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi'
#define BODYPART_ICON_AQUATIC 'modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi'
#define BODYPART_ICON_GHOUL 'modular_skyrat/modules/bodyparts/icons/ghoul_bodyparts.dmi'
#define BODYPART_ICON_INSECT 'modular_skyrat/modules/bodyparts/icons/insect_parts_greyscale.dmi'
#define BODYPART_ICON_LIZARD 'modular_skyrat/modules/bodyparts/icons/lizard_parts_greyscale.dmi'
+4 -1
View File
@@ -20,7 +20,7 @@
///The gun needs to update the gun hud!
#define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud"
/// Used by /obj/item/melee/hammer
/// Used by /obj/item/melee/breaching_hammer
#define COMSIG_BREACHING "breaching_signal_woop_woop"
///The gun has jammed.
#define COMSIG_GUN_JAMMED "gun_jammed"
@@ -59,6 +59,9 @@
///from base of /obj/effect/abstract/liquid_turf/Initialize() (/obj/effect/abstract/liquid_turf/liquids)
#define COMSIG_TURF_LIQUIDS_CREATION "turf_liquids_creation"
/// listens to wet_stacks, if wetting a mob above 10 stacks it will signal the akula race trait to apply its buffs and nerfs
#define COMSIG_MOB_TRIGGER_WET_SKIN "mob_trigger_wet_skin"
//when someone casts their fishing rod
#define COMSIG_START_FISHING "start_fishing"
//when someone pulls back their fishing rod
+9
View File
@@ -33,6 +33,15 @@
/// One can breath under water, you get me?
#define TRAIT_WATER_BREATHING "water_breathing"
/// The trait which Akulas inherit, for their species mechanic revolving around wet_stacks
#define TRAIT_SLICK_SKIN "slick_skin"
/// The trait which is applied when a `slick skin` trait haver actually gets wet_stacks
#define TRAIT_SLIPPERY "slippery"
/// The minimum amount of tiles a TRAIT_SLIPPERY haver will slide on slip
#define SLIPPERY_MIN 5
/// The maximum amount of tiles a TRAIT_SLIPPERY haver will slide on slip
#define SLIPPERY_MAX 9
/// Under the effect of a numbling agent, such as morphine, for surgery.
#define TRAIT_NUMBED "numbed"
+162 -41
View File
@@ -45,11 +45,87 @@ DEFINE_BITFIELD(smoothing_junction, list(
"NORTHWEST_JUNCTION" = NORTHWEST_JUNCTION,
))
#define NO_ADJ_FOUND 0
#define ADJ_FOUND 1
#define NULLTURF_BORDER 2
GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions())
/* Attempting to mirror the below
* Each 3x3 grid is a tile, with each X representing a direction a border object could be in IN said grid
* Directions marked with A are acceptable smoothing targets, M is the example direction
* The example given here is of a northfacing border object
xxx xxx xxx
xxx AxA xxx
xxx xAx xxx
xAx xMx xAx
xxx AxA xxx
xxx xxx xxx
xxx xxx xxx
xxx xxx xxx
xxx xxx xxx
*/
/// Encodes connectivity between border objects
/// Returns a list accessable by a border object's dir, the direction between it and a target, and a target
/// Said list will return the direction the two objects connect, if any exists (if the target isn't a border object and the direction is fine, return the inverse of the direction in use)
/proc/generate_adjacent_directions()
// Have to hold all conventional dir pairs, so we size to the largest
// We don't HAVE diagonal border objects, so I'm gonna pretend they'll never exist
// You might be like, lemon, can't we use GLOB.cardinals/GLOB.alldirs here
// No, they aren't loaded yet. life is pain
var/list/cardinals = list(NORTH, SOUTH, EAST, WEST)
var/list/alldirs = cardinals + list(NORTH|EAST, SOUTH|EAST, NORTH|WEST, SOUTH|WEST)
var/largest_cardinal = max(cardinals)
var/largest_dir = max(alldirs)
var/list/direction_map = new /list(largest_cardinal)
for(var/dir in cardinals)
var/left = turn(dir, 90)
var/right = turn(dir, -90)
var/opposite = turn(dir, 180)
// Need to encode diagonals here because it's possible, even if it is always false
var/list/acceptable_adjacents = new /list(largest_dir)
// Alright, what directions are acceptable to us
for(var/connectable_dir in (cardinals + NONE))
// And what border objects INSIDE those directions are alright
var/list/smoothable_dirs = new /list(largest_cardinal + 1) // + 1 because we need to provide space for NONE to be a valid index
// None is fine, we want to smooth with things on our own turf
// We'll do the two dirs to our left and right
// They connect.. "below" us and on their side
if(connectable_dir == NONE)
smoothable_dirs[left] = opposite | left
smoothable_dirs[right] = opposite | right
// If it's to our right or left we'll include just the dir matching ours
// Left edge touches only our left side, and so on
else if (connectable_dir == left)
smoothable_dirs[dir] = left
else if (connectable_dir == right)
smoothable_dirs[dir] = right
// If it's straight on we'll include all cardinals but us, since all 3 bits would touch us
// Turf opposite gets just our dir as the connection, the other two get our dir + theirs
// Since they touch the edges
else if(connectable_dir == dir)
smoothable_dirs[opposite] = dir
smoothable_dirs[left] = dir | left
smoothable_dirs[right] = dir | right
// otherwise, go HOME, I don't want to encode anything for you
else
continue
acceptable_adjacents[connectable_dir + 1] = smoothable_dirs
direction_map[dir] = acceptable_adjacents
return direction_map
/// Are two atoms border adjacent, takes a border object, something to compare against, and the direction between A and B
/// Returns the way in which the first thing is adjacent to the second
#define CAN_DIAGONAL_SMOOTH(border_obj, target, direction) (\
(target.smoothing_flags & SMOOTH_BORDER_OBJECT) ? \
GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]?[target.dir] : \
(GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]) ? turn(direction, 180) : NONE \
)
#define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi'
#define DEFAULT_UNDERLAY_ICON_STATE "plating"
@@ -298,44 +374,82 @@ DEFINE_BITFIELD(smoothing_junction, list(
var/smooth_border = (smoothing_flags & SMOOTH_BORDER)
var/smooth_obj = (smoothing_flags & SMOOTH_OBJ)
var/border_object_smoothing = (smoothing_flags & SMOOTH_BORDER_OBJECT)
#define SET_ADJ_IN_DIR(direction, direction_flag) \
set_adj_in_dir: { \
do { \
var/turf/neighbor = get_step(src, direction); \
if(neighbor) { \
var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
if(neighbor_smoothing_groups) { \
// Did you know you can pass defines into other defines? very handy, lets take advantage of it here to allow 0 cost variation
#define SEARCH_ADJ_IN_DIR(direction, direction_flag, ADJ_FOUND, WORLD_BORDER, BORDER_CHECK) \
do { \
var/turf/neighbor = get_step(src, direction); \
if(neighbor && ##BORDER_CHECK(neighbor, direction)) { \
var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
if(neighbor_smoothing_groups) { \
for(var/target in canSmoothWith) { \
if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \
##ADJ_FOUND(neighbor, direction, direction_flag); \
} \
} \
} \
if(smooth_obj) { \
for(var/atom/movable/thing as anything in neighbor) { \
var/thing_smoothing_groups = thing.smoothing_groups; \
if(!thing.anchored || isnull(thing_smoothing_groups) || !##BORDER_CHECK(thing, direction)) { \
continue; \
}; \
for(var/target in canSmoothWith) { \
if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \
new_junction |= direction_flag; \
break set_adj_in_dir; \
}; \
}; \
}; \
if(smooth_obj) { \
for(var/atom/movable/thing as anything in neighbor) { \
var/thing_smoothing_groups = thing.smoothing_groups; \
if(!thing.anchored || isnull(thing_smoothing_groups)) { \
continue; \
}; \
for(var/target in canSmoothWith) { \
if(canSmoothWith[target] & thing_smoothing_groups[target]) { \
new_junction |= direction_flag; \
break set_adj_in_dir; \
}; \
}; \
}; \
}; \
} else if (smooth_border) { \
new_junction |= direction_flag; \
}; \
} while(FALSE) \
}
if(canSmoothWith[target] & thing_smoothing_groups[target]) { \
##ADJ_FOUND(thing, direction, direction_flag); \
} \
} \
} \
} \
} else if (smooth_border) { \
##WORLD_BORDER(null, direction, direction_flag); \
} \
} while(FALSE) \
for(var/direction in GLOB.cardinals) //Cardinal case first.
SET_ADJ_IN_DIR(direction, direction)
#define BITMASK_FOUND(target, direction, direction_flag) \
new_junction |= direction_flag; \
break set_adj_in_dir; \
/// Check that non border objects use to smooth against border objects
/// Returns true if the smooth is acceptable, FALSE otherwise
#define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, turn(direction, 180)))
#define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction)
// Border objects require an object as context, so we need a dummy. I'm sorry
#define WORLD_BORDER_FOUND(target, direction, direction_flag) \
var/static/atom/dummy; \
if(!dummy) { \
dummy = new(); \
dummy.smoothing_flags &= ~SMOOTH_BORDER_OBJECT; \
} \
BORDER_FOUND(dummy, direction, direction_flag);
// Handle handle border on border checks. no-op, we handle this check inside CAN_DIAGONAL_SMOOTH
#define BORDER_ON_BORDER_CHECK(target, direction) (TRUE)
// We're building 2 different types of smoothing searches here
// One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do)
#define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE)
// and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf)
#define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK)
// Let's go over all our cardinals
if(border_object_smoothing)
SET_BORDER_ADJ_IN_DIR(NORTH)
SET_BORDER_ADJ_IN_DIR(SOUTH)
SET_BORDER_ADJ_IN_DIR(EAST)
SET_BORDER_ADJ_IN_DIR(WEST)
// We want to check against stuff in our own turf
SET_BORDER_ADJ_IN_DIR(NONE)
// Border objects don't do diagonals, so GO HOME
set_smoothed_icon_state(new_junction)
return
SET_ADJ_IN_DIR(NORTH, NORTH)
SET_ADJ_IN_DIR(SOUTH, SOUTH)
SET_ADJ_IN_DIR(EAST, EAST)
SET_ADJ_IN_DIR(WEST, WEST)
// If there's nothing going on already
if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST)))
set_smoothed_icon_state(new_junction)
return
@@ -356,10 +470,16 @@ DEFINE_BITFIELD(smoothing_junction, list(
set_smoothed_icon_state(new_junction)
#undef SET_BORDER_ADJ_IN_DIR
#undef SET_ADJ_IN_DIR
#undef BORDER_ON_BORDER_CHECK
#undef WORLD_BORDER_FOUND
#undef BORDER_FOUND
#undef BITMASK_ON_BORDER_CHECK
#undef BITMASK_FOUND
#undef SEARCH_ADJ_IN_DIR
///Changes the icon state based on the new junction bitmask. Returns the old junction value.
///Changes the icon state based on the new junction bitmask
/atom/proc/set_smoothed_icon_state(new_junction)
. = smoothing_junction
smoothing_junction = new_junction
@@ -368,12 +488,12 @@ DEFINE_BITFIELD(smoothing_junction, list(
/turf/closed/set_smoothed_icon_state(new_junction)
// Avoid calling ..() here to avoid setting icon_state twice, which is expensive given how hot this proc is
. = smoothing_junction
var/old_junction = smoothing_junction
smoothing_junction = new_junction
if (!(smoothing_flags & SMOOTH_DIAGONAL_CORNERS))
icon_state = "[base_icon_state]-[smoothing_junction]"
return .
return
switch(new_junction)
if(
@@ -387,8 +507,8 @@ DEFINE_BITFIELD(smoothing_junction, list(
SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION,
)
icon_state = "[base_icon_state]-[smoothing_junction]-d"
if(new_junction == . || fixed_underlay) // Mutable underlays?
return .
if(new_junction == old_junction || fixed_underlay) // Mutable underlays?
return
var/junction_dir = reverse_ndir(smoothing_junction)
var/turned_adjacency = REVERSE_DIR(junction_dir)
@@ -537,3 +657,4 @@ DEFINE_BITFIELD(smoothing_junction, list(
#undef DEFAULT_UNDERLAY_ICON
#undef DEFAULT_UNDERLAY_ICON_STATE
#undef CAN_DIAGONAL_SMOOTH
+7 -1
View File
@@ -69,6 +69,10 @@
// We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/
// #define USE_BYOND_TRACY
// If defined, we will compile with FULL timer debug info, rather then a limited scope
// Be warned, this increases timer creation cost by 5x
// #define TIMER_DEBUG
// If defined, we will NOT defer asset generation till later in the game, and will instead do it all at once, during initiialize
//#define DO_NOT_DEFER_ASSETS
@@ -94,7 +98,7 @@
#endif
#ifndef PRELOAD_RSC //set to:
#define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour;
#define PRELOAD_RSC 1 // 0 to allow using external resources or on-demand behaviour;
#endif // 1 to use the default behaviour;
// 2 for preloading absolutely everything;
@@ -124,6 +128,8 @@
#define GC_FAILURE_HARD_LOOKUP
//Ensures all early assets can actually load early
#define DO_NOT_DEFER_ASSETS
//Test at full capacity, the extra cost doesn't matter
#define TIMER_DEBUG
#endif
#ifdef TGS
+1
View File
@@ -102,6 +102,7 @@ GLOBAL_LIST_INIT(space_ambience,list(
'sound/ambience/ambispace2.ogg',
'sound/ambience/ambispace3.ogg',
'sound/ambience/ambispace4.ogg',
'sound/ambience/ambispace5.ogg',
'sound/ambience/title2.ogg',
))
-62
View File
@@ -127,68 +127,6 @@ GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list(
))
//stores the ghost forms that support hair and other such things
GLOBAL_LIST_INIT(ai_core_display_screens, sort_list(list(
":thinking:",
"Alien",
"Angel",
"Banned",
"Bliss",
"Blue",
"Clown",
"Database",
"Dorf",
"Firewall",
"Fuzzy",
"Gentoo",
"Glitchman",
"Gondola",
"Goon",
"Hades",
"HAL 9000",
"Heartline",
"Helios",
"House",
"Inverted",
"Matrix",
"Monochrome",
"Murica",
"Nanotrasen",
"Not Malf",
"Portrait",
"President",
"Rainbow",
"Random",
"Red October",
"Red",
"Static",
"Syndicat Meow",
"Text",
"Too Deep",
"Triumvirate-M",
"Triumvirate",
"Weird",
)))
/// A form of resolve_ai_icon that is guaranteed to never sleep.
/// Not always accurate, but always synchronous.
/proc/resolve_ai_icon_sync(input)
SHOULD_NOT_SLEEP(TRUE)
if(!input || !(input in GLOB.ai_core_display_screens))
return "ai"
else
if(input == "Random")
input = pick(GLOB.ai_core_display_screens - "Random")
return "ai-[lowertext(input)]"
/proc/resolve_ai_icon(input)
if (input == "Portrait")
var/datum/portrait_picker/tgui = new(usr)//create the datum
tgui.ui_interact(usr)//datum has a tgui component, here we open the window
return "ai-portrait" //just take this until they decide
return resolve_ai_icon_sync(input)
GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list(
SEC_DEPT_ENGINEERING,
SEC_DEPT_MEDICAL,
+35 -23
View File
@@ -1,11 +1,13 @@
#define SUBSYSTEM_INIT_SOURCE "subsystem init"
SUBSYSTEM_DEF(atoms)
name = "Atoms"
init_order = INIT_ORDER_ATOMS
flags = SS_NO_FIRE
var/old_initialized
/// A count of how many initalize changes we've made. We want to prevent old_initialize being overriden by some other value, breaking init code
var/initialized_changed = 0
/// A stack of list(source, desired initialized state)
/// We read the source of init changes from the last entry, and assert that all changes will come with a reset
var/list/initialized_state = list()
var/base_initialized
var/list/late_loaders = list()
@@ -39,11 +41,11 @@ SUBSYSTEM_DEF(atoms)
if(initialized == INITIALIZATION_INSSATOMS)
return
set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD)
set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE)
// This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK
CreateAtoms(atoms, atoms_to_return)
clear_tracked_initalize()
clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE)
if(late_loaders.len)
for(var/I in 1 to late_loaders.len)
@@ -158,35 +160,43 @@ SUBSYSTEM_DEF(atoms)
return qdeleted || QDELING(A)
/datum/controller/subsystem/atoms/proc/map_loader_begin()
set_tracked_initalized(INITIALIZATION_INSSATOMS)
/datum/controller/subsystem/atoms/proc/map_loader_begin(source)
set_tracked_initalized(INITIALIZATION_INSSATOMS, source)
/datum/controller/subsystem/atoms/proc/map_loader_stop()
clear_tracked_initalize()
/datum/controller/subsystem/atoms/proc/map_loader_stop(source)
clear_tracked_initalize(source)
/// Use this to set initialized to prevent error states where old_initialized is overriden. It keeps happening and it's cheesing me off
/datum/controller/subsystem/atoms/proc/set_tracked_initalized(value)
if(!initialized_changed)
old_initialized = initialized
initialized = value
else
stack_trace("We started maploading while we were already maploading. You doing something odd?")
initialized_changed += 1
/// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context
/// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially
/datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source)
if(!length(initialized_state))
base_initialized = initialized
initialized_state += list(list(source, state))
initialized = state
/datum/controller/subsystem/atoms/proc/clear_tracked_initalize()
initialized_changed -= 1
if(!initialized_changed)
initialized = old_initialized
/datum/controller/subsystem/atoms/proc/clear_tracked_initalize(source)
if(!length(initialized_state))
return
for(var/i in length(initialized_state) to 1 step -1)
if(initialized_state[i][1] == source)
initialized_state.Cut(i, i+1)
break
if(!length(initialized_state))
initialized = base_initialized
base_initialized = INITIALIZATION_INNEW_REGULAR
return
initialized = initialized_state[length(initialized_state)][2]
/// Returns TRUE if anything is currently being initialized
/datum/controller/subsystem/atoms/proc/initializing_something()
return initialized_changed > 0
return length(initialized_state) > 1
/datum/controller/subsystem/atoms/Recover()
initialized = SSatoms.initialized
if(initialized == INITIALIZATION_INNEW_MAPLOAD)
InitializeAtoms()
old_initialized = SSatoms.old_initialized
initialized_state = SSatoms.initialized_state
BadInitializeCalls = SSatoms.BadInitializeCalls
/datum/controller/subsystem/atoms/proc/setupGenetics()
@@ -238,3 +248,5 @@ SUBSYSTEM_DEF(atoms)
var/initlog = InitLog()
if(initlog)
text2file(initlog, "[GLOB.log_directory]/initialize.log")
#undef SUBSYSTEM_INIT_SOURCE
+25 -4
View File
@@ -22,6 +22,9 @@ SUBSYSTEM_DEF(persistence)
var/list/obj/structure/sign/picture_frame/photo_frames
var/list/obj/item/storage/photo_album/photo_albums
var/rounds_since_engine_exploded = 0
var/delam_highscore = 0
var/tram_hits_this_round = 0
var/tram_hits_last_round = 0
/datum/controller/subsystem/persistence/Initialize()
load_poly()
@@ -33,8 +36,8 @@ SUBSYSTEM_DEF(persistence)
load_randomized_recipes()
load_custom_outfits()
load_delamination_counter()
load_tram_counter()
load_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER
load_adventures()
return SS_INIT_SUCCESS
@@ -50,6 +53,8 @@ SUBSYSTEM_DEF(persistence)
save_modular_persistence() // SKYRAT EDIT ADDITION - MODULAR_PERSISTENCE
save_custom_outfits()
save_delamination_counter()
if(SStramprocess.can_fire)
save_tram_counter()
save_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER
///Loads up Poly's speech buffer.
@@ -534,19 +539,35 @@ SUBSYSTEM_DEF(persistence)
WRITE_FILE(file, json_encode(data))
/// Location where we save the information about how many rounds it has been since the engine blew up
/// Location where we save the information about how many rounds it has been since the engine blew up/tram hits
#define DELAMINATION_COUNT_FILEPATH "data/rounds_since_delamination.txt"
#define DELAMINATION_HIGHSCORE_FILEPATH "data/delamination_highscore.txt"
#define TRAM_COUNT_FILEPATH "data/tram_hits_last_round.txt"
/datum/controller/subsystem/persistence/proc/load_delamination_counter()
if (!fexists(DELAMINATION_COUNT_FILEPATH))
return
rounds_since_engine_exploded = text2num(file2text(DELAMINATION_COUNT_FILEPATH))
for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters)
sign.update_count(rounds_since_engine_exploded)
if (fexists(DELAMINATION_HIGHSCORE_FILEPATH))
delam_highscore = text2num(file2text(DELAMINATION_HIGHSCORE_FILEPATH))
for (var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters)
sign.update_delam_count(rounds_since_engine_exploded, delam_highscore)
/datum/controller/subsystem/persistence/proc/save_delamination_counter()
rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_COUNT_FILEPATH)
if((rounds_since_engine_exploded + 1) > delam_highscore)
rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_HIGHSCORE_FILEPATH)
/datum/controller/subsystem/persistence/proc/load_tram_counter()
if(!fexists(TRAM_COUNT_FILEPATH))
return
tram_hits_last_round = text2num(file2text(TRAM_COUNT_FILEPATH))
/datum/controller/subsystem/persistence/proc/save_tram_counter()
rustg_file_write("[tram_hits_this_round]", TRAM_COUNT_FILEPATH)
#undef DELAMINATION_COUNT_FILEPATH
#undef DELAMINATION_HIGHSCORE_FILEPATH
#undef TRAM_COUNT_FILEPATH
#undef FILE_RECENT_MAPS
#undef KEEP_ROUNDS_MAP
@@ -0,0 +1,5 @@
/// The subsystem used to tick digital clocks
PROCESSING_SUBSYSTEM_DEF(digital_clock)
name = "digital_clock"
flags = SS_NO_INIT|SS_BACKGROUND|SS_KEEP_TIMING
wait = 1 SECONDS
+8 -1
View File
@@ -503,11 +503,18 @@ SUBSYSTEM_DEF(timer)
* If the timed event is tracking client time, it will be added to a special bucket.
*/
/datum/timedevent/proc/bucketJoin()
// Generate debug-friendly name for timer
#if defined(TIMER_DEBUG)
// Generate debug-friendly name for timer, more complex but also more expensive
var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP")
name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [jointext(bitfield_to_list(flags, bitfield_flags), ", ")], \
callBack: [text_ref(callBack)], callBack.object: [callBack.object][text_ref(callBack.object)]([getcallingtype()]), \
callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""]), source: [source]"
#else
// Generate a debuggable name for the timer, simpler but wayyyy cheaper, string generation is a bitch and this saves a LOT of time
name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [flags], \
callBack: [text_ref(callBack)], callBack.object: [callBack.object]([getcallingtype()]), \
callBack.delegate:[callBack.delegate], source: [source]"
#endif
if (bucket_joined)
stack_trace("Bucket already joined! [name]")
+1 -1
View File
@@ -44,7 +44,7 @@ SUBSYSTEM_DEF(tts)
return ..()
/datum/controller/subsystem/tts/stat_entry(msg)
msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages.L)]|Avg:[average_tts_messages_time]"
msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages?.L)]|Avg:[average_tts_messages_time]"
return ..()
/proc/cmp_word_length_asc(datum/tts_request/a, datum/tts_request/b)
@@ -285,6 +285,7 @@
name = "Titan's Finale"
desc = "A single-use ability that shoots a large amount of projectiles around you."
cooldown_time = 2.5 SECONDS
projectile_type = /obj/projectile/colossus
/datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final/Activate(atom/target_atom)
. = ..()
@@ -4,7 +4,7 @@
///Sometimes we need multiple layers, for like the back, middle and front of the person (EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND)
var/layers
///List of all possible layers. Used for looping through in drawing
var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND, EXTERNAL_FRONT_UNDER_CLOTHES, EXTERNAL_FRONT_OVER) // SKYRAT EDIT - Customization - ORIGINAL: var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND)
var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND, EXTERNAL_FRONT_UNDER_CLOTHES, EXTERNAL_FRONT_OVER, EXTERNAL_FRONT_ABOVE_HAIR) // SKYRAT EDIT - Customization - ORIGINAL: var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND)
///Key of the icon states of all the sprite_datums for easy caching
var/cache_key = ""
@@ -51,6 +51,8 @@
return "FRONT_UNDER"
if(-ABOVE_BODY_FRONT_HEAD_LAYER)
return "FRONT_OVER"
if(-HEAD_LAYER)
return "FRONT_OVER_HAIR"
//SKYRAT EDIT ADDITION END
///Converts a bitflag to the right layer. I'd love to make this a static index list, but byond made an attempt on my life when i did
@@ -67,6 +69,8 @@
return -BODY_FRONT_UNDER_CLOTHES
if(EXTERNAL_FRONT_OVER)
return -ABOVE_BODY_FRONT_HEAD_LAYER
if(EXTERNAL_FRONT_ABOVE_HAIR)
return -HEAD_LAYER
//SKYRAT EDIT ADDITION END
///Check whether we can draw the overlays. You generally don't want lizard snouts to draw over an EVA suit
+1 -1
View File
@@ -45,7 +45,7 @@
message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral")
playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5)
voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name)
voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name, TRUE)
/datum/brain_trauma/special/bluespace_prophet
name = "Bluespace Prophecy"
+6 -2
View File
@@ -13,7 +13,7 @@
/// Approximate height in pixels of an 'average' line, used for height decay
#define CHAT_MESSAGE_APPROX_LHEIGHT 11
/// Max width of chat message in pixels
#define CHAT_MESSAGE_WIDTH 96
#define CHAT_MESSAGE_WIDTH 112
/// The dimensions of the chat message icons
#define CHAT_MESSAGE_ICON_SIZE 9
@@ -145,6 +145,10 @@
if (!ismob(target))
extra_classes |= "small"
// Why are you yelling?
if(copytext_char(text, -2) == "!!")
extra_classes |= SPAN_YELL
var/list/prefixes
// Append radio icon if from a virtual speaker
@@ -171,7 +175,7 @@
var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color
// Approximate text height
var/complete_text = "<span class='center [extra_classes.Join(" ")]' style='color: [tgt_color]'>[owner.say_emphasis(text)]</span>"
var/complete_text = "<span style='color: [tgt_color]'><span class='center [extra_classes.Join(" ")]'>[owner.say_emphasis(text)]</span></span>"
var/mheight
WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight)
@@ -29,6 +29,15 @@
time = 2 SECONDS
category = CAT_ATMOSPHERIC
/datum/crafting_recipe/air_sensor
name = "Monitored Air Sensor"
result = /obj/item/air_sensor
reqs = list(
/obj/item/analyzer = 1,
/obj/item/stack/sheet/iron = 1,
)
blacklist = list(/obj/item/analyzer/ranged)
/datum/crafting_recipe/pipe/on_craft_completion(mob/user, atom/result)
var/obj/item/pipe/crafted_pipe = result
crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart
+7 -11
View File
@@ -122,23 +122,19 @@
if(isstack(item))
var/obj/item/stack/stack = item
.["other"][item.type] += stack.amount
else if(item.tool_behaviour)
.["tool_behaviour"] += item.tool_behaviour
.["other"][item.type] += 1
else
if(is_reagent_container(item))
var/obj/item/reagent_containers/container = item
if(container.is_drainable())
for(var/datum/reagent/reagent in container.reagents.reagent_list)
.["other"][reagent.type] += reagent.volume
else if(is_reagent_container(item) && item.is_drainable() && length(item.reagents.reagent_list)) //some container that has some reagents inside it that can be drained
var/obj/item/reagent_containers/container = item
for(var/datum/reagent/reagent as anything in container.reagents.reagent_list)
.["other"][reagent.type] += reagent.volume
else //a reagent container that is empty can also be used as a tool. e.g. glass bottle can be used as a rolling pin
if(item.tool_behaviour)
.["tool_behaviour"] += item.tool_behaviour
.["other"][item.type] += 1
else if (ismachinery(object))
LAZYADDASSOCLIST(.["machinery"], object.type, object)
else if (isstructure(object))
LAZYADDASSOCLIST(.["structures"], object.type, object)
/// Returns a boolean on whether the tool requirements of the input recipe are satisfied by the input source and surroundings.
/datum/component/personal_crafting/proc/check_tools(atom/source, datum/crafting_recipe/recipe, list/surroundings)
if(!length(recipe.tool_behaviors) && !length(recipe.tool_paths))
+28 -1
View File
@@ -18,9 +18,11 @@
/datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100)
RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(try_inserting_item))
RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(try_inserting_item))
RegisterSignal(parent, COMSIG_CLICK_CTRL, PROC_REF(try_removing_item))
RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage))
RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item))
var/atom/food = parent
initial_volume = food.reagents.total_volume
@@ -29,6 +31,8 @@
bad_chance_of_discovery = _bad_chance
good_chance_of_discovery = _good_chance
food.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
/datum/component/food_storage/Destroy(force, silent)
if(stored_item)
stored_item.forceMove(stored_item.drop_location())
@@ -199,3 +203,26 @@
//if there's nothing else in the food, or we found nothing valid
stored_item = null
return FALSE
/**
* Adds context sensitivy directly to the processable file for screentips
* Arguments:
* * source - refers to item that will display its screentip
* * context - refers to, in this case, an item that can be inserted into another item
* * held_item - refers to item in user's hand, typically the one that will be inserted into the food item
* * user - refers to user who will see the screentip when the proper context and tool are there
*/
/datum/component/food_storage/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user)
SIGNAL_HANDLER
. = NONE
if(isnull(held_item) || held_item == source)
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Remove embedded item (if any)"
. = CONTEXTUAL_SCREENTIP_SET
if(istype(held_item) && held_item.w_class <= WEIGHT_CLASS_SMALL && held_item != source && !IS_EDIBLE(held_item))
context[SCREENTIP_CONTEXT_RMB] = "Embed item"
. = CONTEXTUAL_SCREENTIP_SET
return .
+2 -4
View File
@@ -62,10 +62,8 @@
if(autofire_stat == AUTOFIRE_STAT_FIRING)
stop_autofiring() //Let's stop shooting to avoid issues.
return
if(iscarbon(user))
var/mob/living/carbon/arizona_ranger = user
if(arizona_ranger.is_holding(parent))
autofire_on(arizona_ranger.client)
if(user.is_holding(parent))
autofire_on(user.client)
// There is a gun and there is a user wielding it. The component now waits for the mouse click.
/datum/component/automatic_fire/proc/autofire_on(client/usercli)
+69 -9
View File
@@ -139,28 +139,58 @@
//don't attack the machine
if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode)
return
//can't allow abstract, hologram items
if((held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1))
return
//untouchable
if(held_item.resistance_flags & INDESTRUCTIBLE)
return
//user defined conditions
if(precondition && !precondition.Invoke(user))
return
//loop through all contents inside this atom and salvage their material as well but in reverse so we don't delete parents before processing their children
//get all contents of this item reccursively
var/list/contents = held_item.get_all_contents_type(/obj/item)
//anything that isn't a stack cannot be split so find out if we have enough space, we don't want to consume half the contents of an object & leave it in a broken state
if(!isstack(held_item))
var/total_amount = 0
for(var/obj/item/weapon in contents)
total_amount += get_item_material_amount(weapon, breakdown_flags)
if(!has_space(total_amount))
to_chat(user, span_warning("[parent] doesn't have enough space for [held_item] [contents.len > 1 ? "And it's contents" : ""]!"))
return
/**
* to reduce chat spams we group all messages and print them after everything is over
* usefull when we are trying to insert all stock parts of an RPED into the autolathe for example
*/
var/list/inserts = list()
var/list/errors = list()
//loop through all contents inside this atom and salvage their material as well but in reverse so we don't delete parents before processing their children
for(var/i = length(contents); i >= 1 ; i--)
var/obj/item/target = contents[i]
//not a solid sub type
if(target.item_flags & ABSTRACT)
//not a solid subtype or an hologram
if((target.item_flags & ABSTRACT) || (target.flags_1 & HOLOGRAM_1))
if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it
user.put_in_active_hand(target)
continue
//item is either not real, not allowed for redemption, not in the allowed types
if((target.flags_1 & HOLOGRAM_1) || (target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache)))
//item is either not allowed for redemption, not in the allowed types
if((target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache)))
if(!(mat_container_flags & MATCONTAINER_SILENT))
to_chat(user, span_warning("[parent] won't accept [target]!"))
if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it
user.put_in_active_hand(target)
continue
//untouchable, move it out the way, code copied from recycler
if(target.resistance_flags & INDESTRUCTIBLE)
if(!isturf(target.loc) && !isliving(target.loc))
target.forceMove(get_turf(parent))
continue
//if stack, check if we want to read precise amount of sheets to insert
var/obj/item/stack/item_stack = null
if(isstack(target) && precise_insertion)
@@ -187,9 +217,11 @@
return
//insert the item
var/item_name = target.name
var/inserted = insert_item(target, breakdown_flags = mat_container_flags)
if(inserted > 0)
. += inserted
var/message = null
//stack was either split by the container(!QDELETED(target) means the container only consumed a part of it) or by the player, put whats left back of the original stack back in players hand
if((!QDELETED(target) || was_stack_split))
@@ -203,16 +235,27 @@
//was this the original item in the players hand? put what's left back in the player's hand
if(!isnull(original_item))
user.put_in_active_hand(original_item)
message = "Only [inserted] amount of [item_name] was consumed by [parent]."
to_chat(user, span_notice("You insert a material total of [inserted] into [parent]."))
//collect all messages to print later
if(!message)
message = "[item_name] worth [inserted] material was consumed by [parent]."
if(inserts[message])
inserts[message] += 1
else
inserts[message] = 1
else
//decode the error & print it
var/error_msg
if(inserted == -2)
error_msg = "[parent] has insufficient space to accept the [target]"
error_msg = "[parent] has insufficient space to accept [target]"
else
error_msg = "[target] has insufficient materials to be accepted by [parent]"
to_chat(user, span_warning(error_msg))
//collect all messages to print later
if(errors[error_msg])
errors[error_msg] += 1
else
errors[error_msg] = 1
//player split the stack by the requested amount but even that split amount could not be salvaged. merge it back with the original
if(!isnull(item_stack) && was_stack_split)
@@ -224,6 +267,18 @@
if(!isnull(original_item))
user.put_in_active_hand(original_item)
//print successfull inserts
for(var/success_msg in inserts)
var/count = inserts[success_msg]
for(var/i in 1 to count)
to_chat(user, span_notice(success_msg))
//print errors last
for(var/error_msg in errors)
var/count = errors[error_msg]
for(var/i in 1 to count)
to_chat(user, span_warning(error_msg))
/**
* Splits a stack. we don't use /obj/item/stack/proc/split_stack because Byond complains that should only be called asynchronously.
* This proc is also more faster because it doesn't deal with mobs, copying evidences or refreshing atom storages
@@ -521,6 +576,11 @@
mat = GET_MATERIAL_REF(mat)
return materials[mat]
/datum/component/material_container/ui_static_data(mob/user)
var/list/data = list()
data["SHEET_MATERIAL_AMOUNT"] = SHEET_MATERIAL_AMOUNT
return data
/// List format is list(material_name = list(amount = ..., ref = ..., etc.))
/datum/component/material_container/ui_data(mob/user)
var/list/data = list()
+1 -1
View File
@@ -268,7 +268,7 @@
var/datum/component/mind_linker/linker = target
var/mob/living/linker_parent = linker.parent
var/message = sanitize(tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy"))
var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy")
if(!message || QDELETED(src) || QDELETED(owner) || owner.stat == DEAD)
return
+7
View File
@@ -48,6 +48,7 @@
has_progression = FALSE,
datum/uplink_handler/uplink_handler_override,
)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
@@ -119,6 +120,7 @@
/// Sets the telecrystals of the uplink. It is bad practice to use this outside of the component itself.
/datum/component/uplink/proc/set_telecrystals(new_telecrystal_amount)
uplink_handler.telecrystals = new_telecrystal_amount
uplink_handler.on_update()
/datum/component/uplink/InheritComponent(datum/component/uplink/uplink)
lockable |= uplink.lockable
@@ -145,6 +147,11 @@
if(istype(item, /obj/item/stack/telecrystal))
load_tc(user, item)
if(!istype(item))
return
SEND_SIGNAL(item, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, user, src)
/datum/component/uplink/proc/on_examine(datum/source, mob/user, list/examine_list)
SIGNAL_HANDLER
+152 -81
View File
@@ -9,106 +9,177 @@
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
spreading_modifier = 0.75
desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of brain damage, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. \
Subjects affected show the signs of brain damage, yelling obscure sentences or total gibberish. \
On late stages subjects sometime express the feelings of inner power, and cite \
'the ability to control the forces of cosmos themselves!' \
A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition. \
A form of magical grounding can help, too, but will not cure it on its own."
severity = DISEASE_SEVERITY_HARMFUL
required_organs = list(/obj/item/bodypart/head)
/*
BIRUZ BENNAR
SCYAR NILA - teleport
NEC CANTIO - dis techno
EI NATH - shocking grasp
AULIE OXIN FIERA - knock
TARCOL MINTI ZHERI - forcewall
STI KALY - blind
*/
/// List of random non-targeted spells to pick from to cast
var/list/datum/action/cooldown/spell/random_spells = list()
/// List of random targeted spells to pick from to cast
var/list/datum/action/cooldown/spell/random_targeted_spells = list()
/// The hat type to give the infected
var/hat_type
/// The robe type to give the infected
var/robe_type
/datum/disease/wizarditis/after_add()
switch(pick("blue", "red", "yellow"))
if("blue")
hat_type = /obj/item/clothing/head/wizard
robe_type = /obj/item/clothing/suit/wizrobe
if("red")
hat_type = /obj/item/clothing/head/wizard/red
robe_type = /obj/item/clothing/suit/wizrobe/red
if("yellow")
hat_type = /obj/item/clothing/head/wizard/yellow
robe_type = /obj/item/clothing/suit/wizrobe/yellow
init_spells()
/datum/disease/wizarditis/Destroy()
QDEL_LIST(random_spells)
QDEL_LIST(random_targeted_spells)
return ..()
/datum/disease/wizarditis/stage_act(seconds_per_tick, times_fired)
. = ..()
if(!.)
return
if(affected_mob.can_block_magic(charge_cost = 0))
update_stage(1)
return
if(stage >= 3 && SPT_PROB(0.15 * stage, seconds_per_tick))
var/datum/action/cooldown/spell/picked = pick(random_spells)
if(!picked.try_invoke(affected_mob, feedback = FALSE))
to_chat(affected_mob, span_danger("You feel something building up inside... but the feeling passes."))
return
picked.spell_feedback(affected_mob)
return
if(stage <= 3 && SPT_PROB(0.33 * stage, seconds_per_tick))
affected_mob.manual_emote("sniffles.")
switch(stage)
if(2)
if(SPT_PROB(0.25, seconds_per_tick))
affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"), forced = "wizarditis")
if(SPT_PROB(0.25, seconds_per_tick))
if(SPT_PROB(1, seconds_per_tick))
to_chat(affected_mob, span_danger("You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")]."))
if(3)
if(SPT_PROB(0.25, seconds_per_tick))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"), forced = "wizarditis")
if(SPT_PROB(0.25, seconds_per_tick))
to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")]."))
if(4)
if(SPT_PROB(0.5, seconds_per_tick))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"), forced = "wizarditis")
return
if(SPT_PROB(0.25, seconds_per_tick))
to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]."))
spawn_wizard_clothes(50)
if(SPT_PROB(0.005, seconds_per_tick))
teleport()
if(3)
if(SPT_PROB(1, seconds_per_tick))
to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins", "that this location gives you a +1 to INT", "an urge to summon familiar")]."))
spawn_wizard_clothes(10)
if(4)
if(SPT_PROB(1, seconds_per_tick))
to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside", "that this location gives you a +2 to INT and +1 to WIS", "an urge to teleport")]."))
spawn_wizard_clothes(50)
if(SPT_PROB(0.2, seconds_per_tick))
if(prob(15))
var/list/targets = list()
var/datum/action/cooldown/spell/target_picked = pick(random_targeted_spells)
for(var/mob/living/potential_target in view(affected_mob))
if(potential_target == affected_mob)
continue
targets += potential_target
if(length(targets))
target_picked.Activate(pick(targets))
affected_mob.emote("cough")
return
var/datum/action/cooldown/spell/picked = pick(random_spells)
picked.Activate(affected_mob)
affected_mob.emote("sneeze")
return
/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
if(prob(chance))
if(!istype(H.head, /obj/item/clothing/head/wizard))
if(!H.dropItemToGround(H.head))
qdel(H.head)
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), ITEM_SLOT_HEAD)
return
if(prob(chance))
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
if(!H.dropItemToGround(H.wear_suit))
qdel(H.wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), ITEM_SLOT_OCLOTHING)
return
if(prob(chance))
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic))
if(!H.dropItemToGround(H.shoes))
qdel(H.shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), ITEM_SLOT_FEET)
return
else
var/mob/living/carbon/H = affected_mob
if(prob(chance))
var/obj/item/staff/S = new(H)
if(!H.put_in_hands(S))
qdel(S)
if(prob(chance) && affected_mob.usable_hands >= 1)
var/obj/item/staff/funny_staff = new(affected_mob)
if(!affected_mob.put_in_hands(funny_staff))
qdel(funny_staff)
/datum/disease/wizarditis/proc/teleport()
var/list/theareas = get_areas_in_range(80, affected_mob)
for(var/area/space/S in theareas)
theareas -= S
if(!theareas || !theareas.len)
if(!ishuman(affected_mob))
return
var/area/thearea = pick(theareas)
var/list/L = list()
var/turf/mob_turf = get_turf(affected_mob)
for(var/turf/T in get_area_turfs(thearea.type))
if(!is_valid_z_level(T, mob_turf))
continue
if(T.name == "space")
continue
if(!T.density)
var/clear = 1
for(var/obj/O in T)
if(O.density)
clear = 0
break
if(clear)
L+=T
var/mob/living/carbon/human/human_mob = affected_mob
if(prob(chance) && !(human_mob.head?.item_flags & CASTING_CLOTHES))
if(human_mob.dropItemToGround(human_mob.head))
human_mob.equip_to_slot_or_del(new hat_type(human_mob), ITEM_SLOT_HEAD)
if(!L)
return
if(prob(chance) && !(human_mob.wear_suit?.item_flags & CASTING_CLOTHES))
if(human_mob.dropItemToGround(human_mob.wear_suit))
human_mob.equip_to_slot_or_del(new robe_type(human_mob), ITEM_SLOT_OCLOTHING)
affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!", forced = "wizarditis teleport")
affected_mob.forceMove(pick(L))
if(prob(chance) && !istype(human_mob.shoes, /obj/item/clothing/shoes/sandal/magic))
if(human_mob.dropItemToGround(human_mob.shoes))
human_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(human_mob), ITEM_SLOT_FEET)
return
/datum/disease/wizarditis/proc/init_spells()
// Some self cast spells
var/datum/action/cooldown/spell/teleport/area_teleport/wizard/sneeze_teleport = new(src)
sneeze_teleport.randomise_selection = TRUE
random_spells += sneeze_teleport
var/datum/action/cooldown/spell/emp/disable_tech/sneeze_emp = new(src)
sneeze_emp.emp_heavy = 1
sneeze_emp.emp_light = 2
random_spells += sneeze_emp
var/datum/action/cooldown/spell/apply_mutations/mutate/sneeze_mutate = new(src)
sneeze_mutate.mutation_duration = 3 SECONDS
random_spells += sneeze_mutate
var/datum/action/cooldown/spell/aoe/knock/sneeze_knock = new(src)
random_spells += sneeze_knock
var/datum/action/cooldown/spell/forcewall/sneeze_forcewall = new(src)
random_spells += sneeze_forcewall
var/datum/action/cooldown/spell/teleport/radius_turf/blink/sneeze_blink = new(src)
sneeze_blink.inner_tele_radius = 1
sneeze_blink.outer_tele_radius = 3
random_spells += sneeze_blink
var/datum/action/cooldown/spell/smoke/sneeze_smoke = new(src)
sneeze_smoke.smoke_amt = 2
random_spells += sneeze_smoke
var/datum/action/cooldown/spell/spacetime_dist/sneeze_spacetime = new(src)
sneeze_spacetime.scramble_radius = 2
sneeze_spacetime.duration = 5 SECONDS
random_spells += sneeze_spacetime
var/datum/action/cooldown/spell/timestop/sneeze_timestop = new(src)
sneeze_timestop.timestop_range = 1 // heh
sneeze_timestop.timestop_duration = 5 SECONDS
random_spells += sneeze_timestop
var/datum/action/cooldown/spell/aoe/repulse/sneeze_repulse = new(src)
sneeze_repulse.aoe_radius = 2
sneeze_repulse.max_throw = 3
random_spells += sneeze_repulse
// Some targeted spells
var/datum/action/cooldown/spell/pointed/blind/cough_blind = new(src)
cough_blind.eye_blind_duration = 2 SECONDS
cough_blind.eye_blur_duration = 10 SECONDS
random_targeted_spells += cough_blind
var/datum/action/cooldown/spell/pointed/projectile/lightningbolt/cough_zap = new(src)
cough_zap.bolt_range /= 3
cough_zap.bolt_power /= 3
random_targeted_spells += cough_zap
var/datum/action/cooldown/spell/pointed/swap/cough_swap = new(src)
random_targeted_spells += cough_swap
+2 -2
View File
@@ -397,10 +397,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len))
if(DNA_MUSHROOM_CAPS_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len))
*/
//SKYRAT EDIT REMOVAL END
if(DNA_POD_HAIR_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len))
*/
//SKYRAT EDIT REMOVAL END
//Please use add_mutation or activate_mutation instead
/datum/dna/proc/force_give(datum/mutation/human/HM)
+3
View File
@@ -68,6 +68,9 @@
/datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/cutter_user, params)
SIGNAL_HANDLER
if(!istype(target)) //we aren't the kind of mob that can even have cuffs, so we skip.
return
if(!target.handcuffed)
return
+8 -7
View File
@@ -34,12 +34,13 @@
/datum/element/relay_attackers/proc/after_attackby(atom/target, obj/item/weapon, mob/attacker)
SIGNAL_HANDLER
if(weapon.force)
relay_attacker(target, attacker)
relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE)
/datum/element/relay_attackers/proc/on_attack_generic(atom/target, mob/living/attacker, list/modifiers)
SIGNAL_HANDLER
if(attacker.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK))
relay_attacker(target, attacker)
var/shoving = LAZYACCESS(modifiers, RIGHT_CLICK) ? ATTACKER_SHOVING : NONE
if(attacker.combat_mode || shoving)
relay_attacker(target, attacker, shoving)
/datum/element/relay_attackers/proc/on_attack_npc(atom/target, mob/living/attacker)
SIGNAL_HANDLER
@@ -52,7 +53,7 @@
return
if(!ismob(hit_projectile.firer))
return
relay_attacker(target, hit_projectile.firer)
relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE)
/datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
SIGNAL_HANDLER
@@ -64,7 +65,7 @@
var/mob/thrown_by = hit_item.thrownby?.resolve()
if(!ismob(thrown_by))
return
relay_attacker(target, thrown_by)
relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE)
/datum/element/relay_attackers/proc/on_attack_hulk(atom/target, mob/attacker)
SIGNAL_HANDLER
@@ -75,5 +76,5 @@
relay_attacker(target, mecha_attacker)
/// Send out a signal identifying whoever just attacked us (usually a mob but sometimes a mech or turret)
/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker)
SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker)
/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker, attack_flags)
SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker, attack_flags)
+49
View File
@@ -0,0 +1,49 @@
/**
* Uplinik Reimburse element.
* When element is applied onto items, it allows them to be reimbursed if an user pokes an item with a uplink component with them.
*
* Element is only compatible with items.
*/
/datum/element/uplink_reimburse
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 1
/// TC to refund!
var/refundable_tc = 1
/datum/element/uplink_reimburse/Attach(datum/target, refundable_tc = 1)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
src.refundable_tc = refundable_tc
RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(target, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, PROC_REF(reimburse))
/datum/element/uplink_reimburse/Detach(datum/target)
UnregisterSignal(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE))
return ..()
///signal called on parent being examined
/datum/element/uplink_reimburse/proc/on_examine(datum/target, mob/user, list/examine_list)
SIGNAL_HANDLER
if(!IS_TRAITOR(user) && !IS_NUKE_OP(user))
examine_list += span_warning("There's a label on the side, but it's written in indecipherable gibberish. You have no idea what it means!")
return
examine_list += span_notice("There's a label written in codespeak on the side, saying that this item can be refunded for [refundable_tc] by applying it onto an uplink.")
/datum/element/uplink_reimburse/proc/reimburse(obj/item/refund_item, mob/user, datum/component/uplink/uplink_comp)
SIGNAL_HANDLER
if(!uplink_comp)
CRASH("No uplink component in arguments detected")
to_chat(user, span_notice("You tap [uplink_comp.uplink_handler] with [refund_item], and a moment after [refund_item] disappears in a puff of red smoke!"))
do_sparks(2, source = uplink_comp.uplink_handler)
uplink_comp.add_telecrystals(refundable_tc)
qdel(refund_item)
@@ -370,23 +370,6 @@
mood_change = -1
timeout = 30 SECONDS
//SKYRAT EDIT START: Mainly surgery for now.
/datum/mood_event/mild_surgery
description = "<span class='warning'>Even if I couldn't feel most of it, it feels wrong being awake while somebody works on your body. Ugh!</span>\n"
mood_change = -1
timeout = 5 MINUTES
/datum/mood_event/severe_surgery
description = "<span class='boldwarning'>Wait, THEY CUT ME OPEN - AND I FELT EVERY SECOND OF IT!</span>\n"
mood_change = -4
timeout = 15 MINUTES
/datum/mood_event/robot_surgery
description = "<span class='warning'>Having my robotic parts messed with while I was conscious felt wrong... if only I had a sleep mode!</span>\n"
mood_change = -4
timeout = 10 MINUTES
//SKYRAT EDIT END
/datum/mood_event/gamer_withdrawal
description = "I wish I was gaming right now..."
mood_change = -5
+35 -4
View File
@@ -1,10 +1,12 @@
// SKYRAT EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS)
// Defines for the ballmer peak.
#define BALLMER_PEAK_LOW_END 12.9
#define BALLMER_PEAK_HIGH_END 13.8
#define BALLMER_PEAK_WINDOWS_ME 26
#define BALLMER_PEAK_LOW_END 25.8 // Original 12.9
#define BALLMER_PEAK_HIGH_END 27.6 // Original 13.8
#define BALLMER_PEAK_WINDOWS_ME 37 // Original 26
/// The threshld which determine if someone is tipsy vs drunk
#define TIPSY_THRESHOLD 6
#define TIPSY_THRESHOLD 21 // Original 6
// SKYRAT EDIT CHANGE END (#21546 DRUNK EFFECTS)
/**
* The drunk status effect.
@@ -144,6 +146,8 @@
if(drunk_value > BALLMER_PEAK_WINDOWS_ME) // by this point you're into windows ME territory
owner.say(pick_list_replacements(VISTA_FILE, "ballmer_windows_me_msg"), forced = "ballmer")
// SKYRAT EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS)
/* ORIGINAL
// Drunk slurring scales in intensity based on how drunk we are -at 16 you will likely not even notice it,
// but when we start to scale up you definitely will
if(drunk_value >= 16)
@@ -171,6 +175,33 @@
// Over 71, we will constantly have blurry eyes
if(drunk_value >= 71)
owner.set_eye_blur_if_lower((drunk_value * 2 SECONDS) - 140 SECONDS)
*/
// And drunk people will always lose jitteriness
owner.adjust_jitter(-6 SECONDS)
// Over 41, we have a 10% chance to gain confusion and occasionally slur words, scaling with drunk_value
if(drunk_value >= 41)
if(prob(clamp(drunk_value - 8, 0, 100)))
owner.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/drunk, max_duration = 20 SECONDS)
if(prob(10))
owner.adjust_confusion(4 SECONDS)
// Over 61, we start to get blurred vision
if(drunk_value >= 61)
owner.set_dizzy_if_lower(45 SECONDS)
if(prob(15))
owner.adjust_eye_blur_up_to(4 SECONDS, 20 SECONDS)
// Over 71, we will constantly have blurry eyes, we might vomit
if(drunk_value >= 71)
owner.set_eye_blur_if_lower(20 SECONDS)
if(prob(3))
owner.adjust_confusion(15 SECONDS)
if(iscarbon(owner))
var/mob/living/carbon/carbon_owner = owner
carbon_owner.vomit() // Vomiting clears toxloss - consider this a blessing
// SKYRAT EDIT CHANGE END (#21546 DRUNK EFFECTS)
// Over 81, we will gain constant toxloss
if(drunk_value >= 81)
+2 -2
View File
@@ -26,13 +26,13 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands())
* The first matching command (from a list of static datums) the listeners must obey,
* and the return value of this proc the cooldown variable of the command dictates. (only relevant for things with cooldowns i guess)
*/
/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, forced = null)
/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, forced = null, ignore_spam = FALSE)
var/log_message = uppertext(message)
var/is_cultie = IS_CULTIST(user)
if(LAZYLEN(span_list) && is_cultie)
span_list = list("narsiesmall")
if(!user.say(message, spans = span_list, sanitize = FALSE))
if(!user.say(message, spans = span_list, sanitize = FALSE, ignore_spam = ignore_spam, forced = forced))
return
message = lowertext(message)
+7 -5
View File
@@ -1170,6 +1170,8 @@
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
dir = newdir
SEND_SIGNAL(src, COMSIG_ATOM_POST_DIR_CHANGE, dir, newdir)
if(smoothing_flags & SMOOTH_BORDER_OBJECT)
QUEUE_SMOOTH_NEIGHBORS(src)
/**
* Called when the atom log's in or out
@@ -2062,7 +2064,7 @@
active_hud.screentip_text.maptext = ""
return
active_hud.screentip_text.maptext_y = 0
active_hud.screentip_text.maptext_y = 16 // 16px lines us up with the action buttons top left corner
var/lmb_rmb_line = ""
var/ctrl_lmb_ctrl_rmb_line = ""
var/alt_lmb_alt_rmb_line = ""
@@ -2129,15 +2131,15 @@
extra_lines++
if(extra_lines)
extra_context = "<br><span style='font-size: 7px'>[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]</span>"
//first extra line pushes atom name line up 10px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place
active_hud.screentip_text.maptext_y = -10 + (extra_lines - 1) * -9
extra_context = "<br><span class='small'>[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]</span>"
//first extra line pushes atom name line up 11px, subsequent lines push it up 8px, this offsets that and keeps the first line in the same place
active_hud.screentip_text.maptext_y = 5 + (extra_lines - 1) * -8
if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "")
active_hud.screentip_text.maptext = ""
else
//We inline a MAPTEXT() here, because there's no good way to statically add to a string like this
active_hud.screentip_text.maptext = "<span class='maptext' style='text-align: center; font-size: 32px; color: [active_hud.screentip_color]'>[name][extra_context]</span>"
active_hud.screentip_text.maptext = "<span class='maptext' style='text-align: center; font-size: 6pt; color: [active_hud.screentip_color]'>[name][extra_context]</span>"
/// Gets a merger datum representing the connected blob of objects in the allowed_types argument
/atom/proc/GetMergeGroup(id, list/allowed_types)
+1 -1
View File
@@ -341,7 +341,7 @@
. = ..()
var/mat_capacity = 0
for(var/datum/stock_part/matter_bin/new_matter_bin in component_parts)
mat_capacity += new_matter_bin.tier * 75000
mat_capacity += new_matter_bin.tier * (37.5*SHEET_MATERIAL_AMOUNT)
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.max_amount = mat_capacity
@@ -32,13 +32,14 @@
#define ATMOS_GAS_MONITOR_WASTE "waste"
#define ATMOS_GAS_MONITOR_ENGINE "engine"
///maps a chamber id to its air sensor
#define CHAMBER_SENSOR_FROM_ID(chamber_id) ((chamber_id) + "_sensor")
///maps an air sensor's chamber id to its input valve[ i.e. outlet_injector] id
#define CHAMBER_INPUT_FROM_ID(chamber_id) ((chamber_id) + "_in")
///maps an air sensor's chamber id to its output valve[i.e. vent pump] id
#define CHAMBER_OUTPUT_FROM_ID(chamber_id) ((chamber_id) + "_out")
///list of all air sensor's created round start
GLOBAL_LIST_EMPTY(map_loaded_sensors)
// Human-readble names of these funny tags.
GLOBAL_LIST_INIT(station_gas_chambers, list(
ATMOS_GAS_MONITOR_O2 = "Oxygen Supply",
@@ -5,14 +5,26 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "gsensor1"
resistance_flags = FIRE_PROOF
power_channel = AREA_USAGE_ENVIRON
active_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5
var/on = TRUE
/// The unique string that represents which atmos chamber to associate with.
var/chamber_id
/// The inlet[injector] controlled by this sensor
var/inlet_id
/// The outlet[vent pump] controlled by this sensor
var/outlet_id
/obj/machinery/air_sensor/Initialize(mapload)
id_tag = CHAMBER_SENSOR_FROM_ID(chamber_id)
id_tag = assign_random_name()
//this global list of air sensors is available to all station monitering consoles round start and to new consoles made during the round
if(mapload)
GLOB.map_loaded_sensors[chamber_id] = id_tag
inlet_id = CHAMBER_INPUT_FROM_ID(chamber_id)
outlet_id = CHAMBER_OUTPUT_FROM_ID(chamber_id)
var/static/list/multitool_tips = list(
TOOL_MULTITOOL = list(
SCREENTIP_CONTEXT_LMB = "Link logged injectors/vents",
@@ -27,21 +39,45 @@
reset()
return ..()
/obj/machinery/air_sensor/return_air()
if(!on)
return
. = ..()
use_power(active_power_usage) //use power for analyzing gases
/obj/machinery/air_sensor/process()
//update appearance according to power state
if(machine_stat & NOPOWER)
if(on)
on = FALSE
update_appearance()
else if(!on)
on = TRUE
update_appearance()
/obj/machinery/air_sensor/examine(mob/user)
. = ..()
. += span_notice("Use multitool to link it to an injector/vent or reset it's ports")
. += span_notice("Click with hand to turn it off.")
/obj/machinery/air_sensor/attack_hand(mob/living/user, list/modifiers)
. = ..()
//switched off version of this air sensor but still anchored to the ground
var/obj/item/air_sensor/sensor = new(drop_location(), inlet_id, outlet_id)
sensor.set_anchored(TRUE)
sensor.balloon_alert(user, "sensor turned off")
//delete self
qdel(src)
/obj/machinery/air_sensor/update_icon_state()
icon_state = "gsensor[on]"
return ..()
/obj/machinery/air_sensor/proc/reset()
var/input_id = CHAMBER_INPUT_FROM_ID(chamber_id)
if(GLOB.objects_by_id_tag[input_id] != null)
var/obj/machinery/atmospherics/components/unary/outlet_injector/injector = GLOB.objects_by_id_tag[input_id]
injector.disconnect_chamber()
var/output_id = CHAMBER_OUTPUT_FROM_ID(chamber_id)
if(GLOB.objects_by_id_tag[output_id] != null)
var/obj/machinery/atmospherics/components/unary/vent_pump/pump = GLOB.objects_by_id_tag[output_id]
pump.disconnect_chamber()
inlet_id = null
outlet_id = null
///right click with multi tool to disconnect everything
/obj/machinery/air_sensor/multitool_act_secondary(mob/living/user, obj/item/tool)
@@ -50,16 +86,14 @@
return TRUE
/obj/machinery/air_sensor/multitool_act(mob/living/user, obj/item/multitool/multi_tool)
.= ..()
if (!istype(multi_tool))
return .
. = ..()
if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/outlet_injector))
var/obj/machinery/atmospherics/components/unary/outlet_injector/input = multi_tool.buffer
input.chamber_id = chamber_id
GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber_id)] = input
inlet_id = input.id_tag
multi_tool.buffer = null
balloon_alert(user, "connected to input")
else if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/vent_pump))
var/obj/machinery/atmospherics/components/unary/vent_pump/output = multi_tool.buffer
//so its no longer controlled by air alarm
@@ -69,11 +103,127 @@
output.pressure_checks = ATMOS_INTERNAL_BOUND
output.internal_pressure_bound = 4000
output.external_pressure_bound = 0
output.chamber_id = chamber_id
GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber_id)] = output
//finally assign it to this sensor
outlet_id = output.id_tag
multi_tool.buffer = null
balloon_alert(user, "connected to output")
else
multi_tool.buffer = src
balloon_alert(user, "added to multitool buffer")
return TRUE
/**
* A portable version of the /obj/machinery/air_sensor
* Wrenching it & turning it on will convert it back to /obj/machinery/air_sensor
* Unwelding /obj/machinery/air_sensor will turn it back to /obj/item/air_sensor
* The logic is same as meters
*/
/obj/item/air_sensor
name = "Air Sensor"
desc = "A device designed to detect gases and their concentration in an area."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "gsensor0"
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT)
/// The injector linked with this sensor
var/input_id
/// The vent pump linked with this sensor
var/output_id
/obj/item/air_sensor/Initialize(mapload, inlet, outlet)
. = ..()
register_context()
input_id = inlet
output_id = outlet
/obj/item/air_sensor/add_context(atom/source, list/context, obj/item/held_item, mob/user)
if(isnull(held_item))
return NONE
if(held_item.tool_behaviour == TOOL_WRENCH)
context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unwrench" : "Wrench"
return CONTEXTUAL_SCREENTIP_SET
if(held_item.tool_behaviour == TOOL_WELDER && !anchored)
context[SCREENTIP_CONTEXT_LMB] = "Dismantle"
return CONTEXTUAL_SCREENTIP_SET
return NONE
/obj/item/air_sensor/examine(mob/user)
. = ..()
if(anchored)
. += span_notice("It's [EXAMINE_HINT("wrenched")] in place")
else
. += span_notice("It should be [EXAMINE_HINT("wrenched")] in place to turn it on.")
. += span_notice("It could be [EXAMINE_HINT("welded")] apart.")
. += span_notice("Click with hand to turn it on.")
/obj/item/air_sensor/attack_hand(mob/user, list/modifiers)
. = ..()
if(!anchored)
return
//List of air sensor's by name
var/list/available_sensors = list()
for(var/chamber_id in GLOB.station_gas_chambers)
//don't let it conflict with existing distro & waste moniter meter's
if(chamber_id == ATMOS_GAS_MONITOR_DISTRO)
continue
if(chamber_id == ATMOS_GAS_MONITOR_WASTE)
continue
available_sensors += GLOB.station_gas_chambers[chamber_id]
//make the choice
var/chamber_name = tgui_input_list(user, "Select Sensor Purpose", "Select Sensor ID", available_sensors)
if(isnull(chamber_name))
return
//map chamber name back to id
var/target_chamber
for(var/chamber_id in GLOB.station_gas_chambers)
if(GLOB.station_gas_chambers[chamber_id] != chamber_name)
continue
target_chamber = chamber_id
break
//build the sensor from the subtypes of sensor's available
var/static/list/chamber_subtypes = null
if(isnull(chamber_subtypes))
chamber_subtypes = subtypesof(/obj/machinery/air_sensor)
for(var/obj/machinery/air_sensor/sensor as anything in chamber_subtypes)
if(initial(sensor.chamber_id) != target_chamber)
continue
//make real air sensor in it's place
var/obj/machinery/air_sensor/new_sensor = new sensor(get_turf(src))
new_sensor.inlet_id = input_id
new_sensor.outlet_id = output_id
new_sensor.balloon_alert(user, "sensor turned on")
qdel(src)
break
/obj/item/air_sensor/wrench_act(mob/living/user, obj/item/tool)
if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN)
return TOOL_ACT_TOOLTYPE_SUCCESS
return
/obj/item/air_sensor/welder_act(mob/living/user, obj/item/tool)
if(!tool.tool_start_check(user, amount = 1))
return
loc.balloon_alert(user, "dismantling sensor")
if(!tool.use_tool(src, user, 2 SECONDS, volume = 30, amount = 1))
return
loc.balloon_alert(user, "sensor dismanteled")
deconstruct(TRUE)
return TOOL_ACT_TOOLTYPE_SUCCESS
/obj/item/air_sensor/deconstruct(disassembled)
if(!(flags_1 & NODECONSTRUCT_1))
new /obj/item/analyzer(loc)
new /obj/item/stack/sheet/iron(loc, 1)
return ..()
@@ -7,7 +7,7 @@
circuit = /obj/item/circuitboard/computer/atmos_control
light_color = LIGHT_COLOR_CYAN
/// Which sensors/input/outlets do we want to listen to.
/// Which sensors do we want to listen to.
/// Assoc of list[chamber_id] = readable_chamber_name
var/list/atmos_chambers
@@ -19,12 +19,33 @@
/// Whether we are allowed to reconnect.
var/reconnecting = TRUE
/// Was this computer multitooled before. If so copy the list connected_sensors as it now mantain's it's own sensors independent of the map loaded one's
var/was_multi_tooled = FALSE
/// list of all sensors[key is chamber id, value is id of air sensor linked to this chamber] monitered by this computer
var/list/connected_sensors
/obj/machinery/computer/atmos_control/Initialize(mapload, obj/item/circuitboard/C)
. = ..()
var/static/list/multitool_tips = list(
TOOL_MULTITOOL = list(
SCREENTIP_CONTEXT_LMB = "Link Sensor",
)
)
AddElement(/datum/element/contextual_screentip_tools, multitool_tips)
//all newly constructed/round start computers by default have access to this list
connected_sensors = GLOB.map_loaded_sensors
//special case for the station monitering console. We dont want to loose these chambers during reconnecting
if(!control && !isnull(atmos_chambers))
always_displayed_chambers = atmos_chambers.Copy()
/obj/machinery/computer/atmos_control/examine(mob/user)
. = ..()
. += span_notice("Use a multitool to link a air sensor to this computer")
/// Reconnect only works for station based chambers.
/obj/machinery/computer/atmos_control/proc/reconnect(mob/user)
if(!reconnecting)
@@ -33,16 +54,25 @@
// We only prompt the user with the sensors that are actually available.
var/available_devices = list()
for (var/chamber_identifier in GLOB.station_gas_chambers)
if (!(CHAMBER_INPUT_FROM_ID(chamber_identifier) in GLOB.objects_by_id_tag) && !(CHAMBER_OUTPUT_FROM_ID(chamber_identifier) in GLOB.objects_by_id_tag))
for (var/chamber_identifier in connected_sensors)
//this sensor was destroyed at the time of reconnecting
var/obj/machinery/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber_identifier]]
if(QDELETED(sensor))
continue
//non master computers don't have access to these station moniters. Only done to give master computer's special access to these chambers and make them feel special or something
if(chamber_identifier == ATMOS_GAS_MONITOR_DISTRO)
continue
if(chamber_identifier == ATMOS_GAS_MONITOR_WASTE)
continue
available_devices[GLOB.station_gas_chambers[chamber_identifier]] = chamber_identifier
// As long as we dont put any funny chars in the strings it should match.
var/new_name = tgui_input_list(user, "Select the device set", "Reconnect", available_devices)
if(isnull(new_name))
return FALSE
var/new_id = available_devices[new_name]
if(isnull(new_id))
return FALSE
@@ -57,6 +87,22 @@
return TRUE
/obj/machinery/computer/atmos_control/multitool_act(mob/living/user, obj/item/multitool/multi_tool)
. = ..()
if(istype(multi_tool.buffer, /obj/machinery/air_sensor))
var/obj/machinery/air_sensor/sensor = multi_tool.buffer
//computers reference a global map loaded list of sensor's but as soon a user attempt's to edit it, make a copy of that list so other computers aren't affected
if(!was_multi_tooled)
connected_sensors = connected_sensors.Copy()
was_multi_tooled = TRUE
//register the sensor's unique ID with it's assositated chamber
connected_sensors[sensor.chamber_id] = sensor.id_tag
user.balloon_alert(user, "sensor connected to [src]")
return TOOL_ACT_TOOLTYPE_SUCCESS
return
/obj/machinery/computer/atmos_control/ui_interact(mob/user, datum/tgui/ui)
. = ..()
ui = SStgui.try_update_ui(user, src, ui)
@@ -82,23 +128,26 @@
chamber_info["id"] = chamber_id
chamber_info["name"] = atmos_chambers[chamber_id]
var/obj/machinery/sensor = GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(chamber_id)]
if (!isnull(sensor))
var/obj/machinery/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber_id]]
if(!QDELETED(sensor))
chamber_info["gasmix"] = gas_mixture_parser(sensor.return_air())
var/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber_id)]
if (!isnull(input))
chamber_info["input_info"] = list(
"active" = input.on,
"amount" = input.volume_rate,
)
if(istype(sensor, /obj/machinery/air_sensor)) //distro & waste loop are not air sensors and don't have these functions
var/obj/machinery/air_sensor/air_sensor = sensor
var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber_id)]
if (!isnull(output))
chamber_info["output_info"] = list(
"active" = output.on,
"amount" = output.internal_pressure_bound,
)
var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[air_sensor.inlet_id || ""]
if (!QDELETED(input))
chamber_info["input_info"] = list(
"active" = input.on,
"amount" = input.volume_rate,
)
var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[air_sensor.outlet_id || ""]
if (!QDELETED(output))
chamber_info["output_info"] = list(
"active" = output.on,
"amount" = output.internal_pressure_bound,
)
data["chambers"] += list(chamber_info)
return data
@@ -115,37 +164,66 @@
if (!(chamber in atmos_chambers))
return TRUE
var/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber)]
input?.on = !input.on
var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]]
if(QDELETED(sensor))
return TRUE
var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[sensor.inlet_id || ""]
if(QDELETED(input))
return TRUE
input.on = !input.on
input.update_appearance(UPDATE_ICON)
if("toggle_output")
if (!(chamber in atmos_chambers))
return TRUE
var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber)]
output?.on = !output.on
var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]]
if(QDELETED(sensor))
return TRUE
var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[sensor.outlet_id || ""]
if(QDELETED(output))
return TRUE
output.on = !output.on
output.update_appearance(UPDATE_ICON)
if("adjust_input")
if (!(chamber in atmos_chambers))
return TRUE
var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]]
if(QDELETED(sensor))
return TRUE
var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[sensor.inlet_id || ""]
if(QDELETED(input))
return TRUE
var/target = text2num(params["rate"])
if(isnull(target))
return TRUE
target = clamp(target, 0, MAX_TRANSFER_RATE)
var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber)]
input?.volume_rate = clamp(target, 0, min(input.airs[1].volume, MAX_TRANSFER_RATE))
input.volume_rate = clamp(target, 0, min(input.airs[1].volume, MAX_TRANSFER_RATE))
if("adjust_output")
if (!(chamber in atmos_chambers))
return TRUE
var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]]
if(QDELETED(sensor))
return TRUE
var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[sensor.outlet_id || ""]
if(QDELETED(output))
return TRUE
var/target = text2num(params["rate"])
if(isnull(target))
return TRUE
target = clamp(target, 0, ATMOS_PUMP_MAX_PRESSURE)
var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber)]
output?.internal_pressure_bound = clamp(target, 0, ATMOS_PUMP_MAX_PRESSURE)
output.internal_pressure_bound = target
if("reconnect")
reconnect(usr)
@@ -1,6 +1,8 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/monitored
on = TRUE
volume_rate = MAX_TRANSFER_RATE
/// The air sensor type this injector is linked to
var/chamber_id
/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/Initialize(mapload)
id_tag = CHAMBER_INPUT_FROM_ID(chamber_id)
@@ -3,7 +3,9 @@
var/chamber_id
/obj/machinery/meter/monitored/Initialize(mapload, new_piping_layer)
id_tag = CHAMBER_SENSOR_FROM_ID(chamber_id)
id_tag = assign_random_name()
if(mapload)
GLOB.map_loaded_sensors[chamber_id] = id_tag
. = ..()
/obj/machinery/meter/monitored/layer2
+158
View File
@@ -0,0 +1,158 @@
/obj/machinery/digital_clock
name = "digital clock"
desc = "An ultra-futuristic, sleek, advanced, next-gen normal digital clock that tells the time. Powered by bluespace. Despite supposedly being better in every way to classic clocks, it just doesn't feel the same. They just don't make them the way they used to..."
icon_state = "digital_clock_base"
icon = 'icons/obj/digital_clock.dmi'
verb_say = "beeps"
verb_ask = "bloops"
verb_exclaim = "blares"
density = FALSE
layer = ABOVE_WINDOW_LAYER
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4)
/obj/item/wallframe/digital_clock
name = "digital clock frame"
desc = "Used to build digital clocks, just secure to the wall."
icon_state = "digital_clock_base"
icon = 'icons/obj/digital_clock.dmi'
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4)
result_path = /obj/machinery/digital_clock
pixel_shift = 28
/obj/machinery/digital_clock/wrench_act_secondary(mob/living/user, obj/item/tool)
. = ..()
balloon_alert(user, "[anchored ? "un" : ""]securing...")
tool.play_tool_sound(src)
if(tool.use_tool(src, user, 6 SECONDS))
playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE)
balloon_alert(user, "[anchored ? "un" : ""]secured")
deconstruct()
return TRUE
/obj/machinery/digital_clock/welder_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
return
if(atom_integrity >= max_integrity)
balloon_alert(user, "it doesn't need repairs!")
return TRUE
balloon_alert(user, "repairing display...")
if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50))
return TRUE
balloon_alert(user, "repaired")
atom_integrity = max_integrity
set_machine_stat(machine_stat & ~BROKEN)
update_appearance()
return TRUE
/obj/machinery/digital_clock/multitool_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
return
if(!(obj_flags & EMAGGED))
return
balloon_alert(user, "resetting...")
tool.play_tool_sound(src)
if(tool.use_tool(src, user, 6 SECONDS))
playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE)
balloon_alert(user, "reset")
obj_flags &= ~EMAGGED
return TRUE
/obj/machinery/digital_clock/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
do_sparks(3, cardinal_only = FALSE, source = src)
obj_flags |= EMAGGED
/obj/machinery/digital_clock/emp_act(severity)
. = ..()
emag_act()
/obj/machinery/digital_clock/deconstruct(disassembled = TRUE)
if(flags_1 & NODECONSTRUCT_1)
return
if(disassembled)
new /obj/item/wallframe/digital_clock(drop_location())
else
new /obj/item/stack/sheet/iron(drop_location(), 2)
new /obj/item/shard(drop_location())
new /obj/item/shard(drop_location())
qdel(src)
/obj/machinery/digital_clock/Initialize(mapload)
. = ..()
START_PROCESSING(SSdigital_clock, src)
/obj/machinery/digital_clock/Destroy()
STOP_PROCESSING(SSdigital_clock, src)
return ..()
/obj/machinery/digital_clock/process(seconds_per_tick)
if(machine_stat & NOPOWER)
return
update_appearance()
/obj/machinery/digital_clock/update_appearance(updates=ALL)
. = ..()
if(machine_stat & (NOPOWER|BROKEN))
set_light(0)
return
set_light(l_range = 1.5, l_power = 0.7, l_color = LIGHT_COLOR_BLUE) // blue light
/obj/machinery/digital_clock/update_overlays()
. = ..()
if(machine_stat & (NOPOWER|BROKEN))
return
. += update_time()
return .
/obj/machinery/digital_clock/proc/update_time()
var/station_minutes
if(obj_flags & EMAGGED)
station_minutes = rand(0, 99)
else
station_minutes = text2num(station_time_timestamp(format = "mm"))
// tenth / the '3' in '31' / 31 -> 3.1 -> 3
var/station_minute_tenth = station_minutes >= 10 ? round(station_minutes * 0.1) : 0
// one / the '1' in '31' / 31 -> 31 - (3 * 10) -> 31 - 30 -> 1
var/station_minute_one = station_minutes - (station_minute_tenth * 10)
var/station_hours
if(obj_flags & EMAGGED)
station_hours = rand(0, 99)
else
station_hours = text2num(station_time_timestamp(format = "hh"))
// one / the '1' in '12' / 12 -> 1.2 -> 1
var/station_hours_tenth = station_minutes >= 10 ? round(station_hours * 0.1) : 0
// tenth / the '2' in '12' / 12 -> 12 - (1 * 10) -> 12 - 10 -> 2
var/station_hours_one = station_hours - (station_hours_tenth * 10)
var/return_overlays = list()
var/mutable_appearance/minute_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_one]")
minute_one_overlay.pixel_w = 0
return_overlays += minute_one_overlay
var/mutable_appearance/minute_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_tenth]")
minute_tenth_overlay.pixel_w = -4
return_overlays += minute_tenth_overlay
var/mutable_appearance/separator = mutable_appearance('icons/obj/digital_clock.dmi', "+separator")
return_overlays += separator
var/mutable_appearance/hour_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_one]")
hour_one_overlay.pixel_w = -10
return_overlays += hour_one_overlay
var/mutable_appearance/hour_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_tenth]")
hour_tenth_overlay.pixel_w = -14
return_overlays += hour_tenth_overlay
return return_overlays
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/digital_clock, 28)
+6 -9
View File
@@ -156,11 +156,6 @@
/obj/machinery/door/airlock/Initialize(mapload)
. = ..()
//SKYRAT EDIT ADDITION BEGIN - Door aesthetic overhaul
if(multi_tile)
SetBounds()
update_overlays()
//SKYRAT EDIT END
wires = set_wires()
if(glass)
airlock_material = "glass"
@@ -1212,10 +1207,12 @@
var/dangerous_close = !safe || force_crush
if(!dangerous_close)
for(var/atom/movable/M in get_turf(src))
if(M.density && M != src) //something is blocking the door
autoclose_in(DOOR_CLOSE_WAIT)
return FALSE
for(var/turf/checked_turf in get_turfs()) // SKYRAT EDIT ADD
//for(var/atom/movable/M in get_turf(src)) // Original
for(var/atom/movable/M in checked_turf) // SKYRAT EDIT CHANGE
if(M.density && M != src) //something is blocking the door
autoclose_in(DOOR_CLOSE_WAIT)
return FALSE
if(!try_to_force_door_shut(forced))
return FALSE
+374
View File
@@ -0,0 +1,374 @@
GLOBAL_LIST_EMPTY(map_delamination_counters)
/// Display days since last delam on incident sign
#define DISPLAY_DELAM (1<<0)
/// Display current number of tram hits on incident sign
#define DISPLAY_TRAM (1<<1)
DEFINE_BITFIELD(sign_features, list(
"DISPLAY_DELAM" = DISPLAY_DELAM,
"DISPLAY_TRAM" = DISPLAY_TRAM,
))
#define TREND_RISING "rising"
#define TREND_FALLING "falling"
#define NAME_DUAL "safety incident display"
#define NAME_DELAM "delamination incident display"
#define NAME_TRAM "tram incident display"
#define DESC_DUAL "A display that provides information on the station's safety record. Features an advert for SAFETY MOTH."
#define DESC_DELAM "A signs describe how long it's been since the last delamination incident. Features an advert for SAFETY MOTH."
#define DESC_TRAM "A display that provides the number of tram related safety incidents this shift. Features an advert for SAFETY MOTH."
/**
* List of safety statistic signs on the map that have delam counting enabled.
* Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion.
*/
/obj/machinery/incident_display
name = NAME_DELAM
desc = DESC_DELAM
icon = 'icons/obj/machines/incident_display.dmi'
icon_preview = "stat_display_delam"
icon_state = "stat_display_delam"
verb_say = "beeps"
verb_ask = "bloops"
verb_exclaim = "blares"
idle_power_usage = 450
max_integrity = 150
integrity_failure = 0.75
custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/alloy/titaniumglass = SHEET_MATERIAL_AMOUNT * 4)
/// What statistics we want the sign to display
var/sign_features = DISPLAY_DELAM
/// Tram hits before hazard warning
var/hit_threshold = 0
/// Tram hits
var/hit_count = 0
/// Shifts without delam
var/last_delam = 0
/// Delam record high-score
var/delam_record = 0
/obj/machinery/incident_display/dual
name = NAME_DUAL
desc = DESC_DUAL
icon_preview = "stat_display_dual"
icon_state = "stat_display_dual"
sign_features = DISPLAY_DELAM | DISPLAY_TRAM
/obj/machinery/incident_display/delam
name = NAME_DELAM
desc = DESC_DELAM
icon_preview = "stat_display_delam"
icon_state = "stat_display_delam"
sign_features = DISPLAY_DELAM
/obj/machinery/incident_display/tram
name = NAME_TRAM
desc = DESC_TRAM
icon_preview = "stat_display_tram"
icon_state = "stat_display_tram"
sign_features = DISPLAY_TRAM
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display, 32)
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/delam, 32)
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/dual, 32)
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32)
/obj/machinery/incident_display/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/machinery/incident_display/LateInitialize()
. = ..()
GLOB.map_delamination_counters += src
update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore)
for(var/obj/structure/industrial_lift/tram/tram as anything in GLOB.lifts)
RegisterSignal(tram, COMSIG_TRAM_COLLISION, PROC_REF(update_tram_count))
update_appearance()
/obj/machinery/incident_display/Destroy()
GLOB.map_delamination_counters -= src
return ..()
/obj/machinery/incident_display/welder_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
return FALSE
if(atom_integrity >= max_integrity && !(machine_stat & BROKEN))
balloon_alert(user, "it doesn't need repairs!")
return TRUE
balloon_alert(user, "repairing display...")
if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50))
return TRUE
balloon_alert(user, "repaired")
atom_integrity = max_integrity
set_machine_stat(machine_stat & ~BROKEN)
update_appearance()
return TRUE
// Switch modes with multitool
/obj/machinery/incident_display/multitool_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
return FALSE
if(sign_features == DISPLAY_TRAM)
tool.play_tool_sound(src)
balloon_alert(user, "set to dual")
name = NAME_DUAL
desc = DESC_DUAL
icon_state = "stat_display_dual"
sign_features = DISPLAY_DELAM | DISPLAY_TRAM
update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore)
update_tram_count(src, SSpersistence.tram_hits_this_round)
update_appearance()
return TRUE
else if(sign_features == DISPLAY_DELAM)
tool.play_tool_sound(src)
balloon_alert(user, "set to tram")
name = NAME_TRAM
desc = DESC_TRAM
icon_state = "stat_display_tram"
sign_features = DISPLAY_TRAM
update_tram_count(src, SSpersistence.tram_hits_this_round)
update_appearance()
return TRUE
else if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM))
tool.play_tool_sound(src)
balloon_alert(user, "set to delam")
name = NAME_DELAM
desc = DESC_DELAM
icon_state = "stat_display_delam"
sign_features = DISPLAY_DELAM
update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore)
update_appearance()
return TRUE
// EMP causes the display to display random numbers or outright break.
/obj/machinery/incident_display/emp_act(severity)
. = ..()
if(prob(50))
set_machine_stat(machine_stat | BROKEN)
update_appearance()
return
name = NAME_DUAL
desc = DESC_DUAL
icon_state = "stat_display_dual"
sign_features = DISPLAY_DELAM | DISPLAY_TRAM
hit_threshold = rand(1,99)
hit_count = rand(1,99)
last_delam = rand(1,99)
delam_record = rand(1,99)
update_appearance()
/obj/machinery/incident_display/deconstruct()
if(flags_1 & NODECONSTRUCT_1)
return
new /obj/item/stack/sheet/mineral/titanium(drop_location(), 2)
new /obj/item/shard(drop_location())
new /obj/item/shard(drop_location())
qdel(src)
/obj/machinery/incident_display/proc/update_delam_count(new_count, record)
delam_record = record
last_delam = min(new_count, 199)
update_appearance()
/obj/machinery/incident_display/proc/update_tram_count(source, tram_collisions)
SIGNAL_HANDLER
hit_count = min(tram_collisions, 199)
update_appearance()
/obj/machinery/incident_display/update_appearance(updates=ALL)
. = ..()
if(machine_stat & NOPOWER)
icon_state = "stat_display_blank"
set_light(0)
return
if(machine_stat & BROKEN)
icon_state = "stat_display_broken"
set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_DARK_BLUE)
return
if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM))
icon_state = "stat_display_dual"
else if(sign_features == DISPLAY_DELAM)
icon_state = "stat_display_delam"
else if(sign_features == DISPLAY_TRAM)
icon_state = "stat_display_tram"
set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_FAINT_BLUE)
/obj/machinery/incident_display/update_overlays()
. = ..()
if(machine_stat & (NOPOWER|BROKEN))
return
var/mutable_appearance/moff_base_emissive = emissive_appearance(icon, "moff_base_emissive", src, alpha = src.alpha)
. += moff_base_emissive
if(sign_features & DISPLAY_DELAM)
var/mutable_appearance/delam_base_emissive = emissive_appearance(icon, "delam_base_emissive", src, alpha = src.alpha)
var/delam_display_color
. += delam_base_emissive
if(!last_delam)
delam_display_color = LIGHT_COLOR_INTENSE_RED
else
delam_display_color = LIGHT_COLOR_HOLY_MAGIC
var/delam_pos1 = last_delam % 10
var/mutable_appearance/delam_pos1_overlay = mutable_appearance(icon, "num_[delam_pos1]")
var/mutable_appearance/delam_pos1_emissive = emissive_appearance(icon, "num_[delam_pos1]_e", src, alpha = src.alpha)
delam_pos1_overlay.color = delam_display_color
delam_pos1_overlay.pixel_w = 9
delam_pos1_emissive.pixel_w = 9
delam_pos1_overlay.pixel_z = 4
delam_pos1_emissive.pixel_z = 4
. += delam_pos1_overlay
. += delam_pos1_emissive
var/delam_pos2 = (last_delam / 10) % 10
var/mutable_appearance/delam_pos2_overlay = mutable_appearance(icon, "num_[delam_pos2]")
var/mutable_appearance/delam_pos2_emissive = emissive_appearance(icon, "num_[delam_pos2]_e", src, alpha = src.alpha)
delam_pos2_overlay.color = delam_display_color
delam_pos2_overlay.pixel_w = 4
delam_pos2_emissive.pixel_w = 4
delam_pos2_overlay.pixel_z = 4
delam_pos2_emissive.pixel_z = 4
. += delam_pos2_overlay
. += delam_pos2_emissive
if(last_delam >= 100)
var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_red")
var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_red", src, alpha = src.alpha)
. += there_i_fixed_it_overlay
. += there_i_fixed_it_emissive
if(last_delam == delam_record)
var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_RISING)
var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha)
delam_trend_overlay.color = LIGHT_COLOR_VIVID_GREEN
delam_trend_overlay.pixel_w = 1
delam_trend_emissive.pixel_w = 1
delam_trend_overlay.pixel_z = 6
delam_trend_emissive.pixel_z = 6
. += delam_trend_overlay
. += delam_trend_emissive
else
var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_FALLING)
var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha)
delam_trend_overlay.color = LIGHT_COLOR_INTENSE_RED
delam_trend_overlay.pixel_w = 1
delam_trend_emissive.pixel_w = 1
delam_trend_overlay.pixel_z = 6
delam_trend_emissive.pixel_z = 6
. += delam_trend_overlay
. += delam_trend_emissive
if(sign_features & DISPLAY_TRAM)
var/mutable_appearance/tram_base_emissive = emissive_appearance(icon, "tram_base_emissive", src, alpha = src.alpha)
var/tram_display_color = LIGHT_COLOR_BABY_BLUE
var/tram_pos1 = hit_count % 10
var/mutable_appearance/tram_pos1_overlay = mutable_appearance(icon, "num_[tram_pos1]")
var/mutable_appearance/tram_pos1_emissive = emissive_appearance(icon, "num_[tram_pos1]_e", src, alpha = src.alpha)
. += tram_base_emissive
tram_pos1_overlay.color = tram_display_color
tram_pos1_overlay.pixel_w = 9
tram_pos1_emissive.pixel_w = 9
tram_pos1_overlay.pixel_z = -6
tram_pos1_emissive.pixel_z = -6
. += tram_pos1_overlay
. += tram_pos1_emissive
var/tram_pos2 = (hit_count / 10) % 10
var/mutable_appearance/tram_pos2_overlay = mutable_appearance(icon, "num_[tram_pos2]")
var/mutable_appearance/tram_pos2_emissive = emissive_appearance(icon, "num_[tram_pos2]_e", src, alpha = src.alpha)
tram_pos2_overlay.color = tram_display_color
tram_pos2_overlay.pixel_w = 4
tram_pos2_emissive.pixel_w = 4
tram_pos2_overlay.pixel_z = -6
tram_pos2_emissive.pixel_z = -6
. += tram_pos2_overlay
. += tram_pos2_emissive
if(hit_count >= 100)
var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_blue")
var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_blue", src, alpha = src.alpha)
. += there_i_fixed_it_overlay
. += there_i_fixed_it_emissive
if(hit_count > SSpersistence.tram_hits_last_round)
var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_RISING)
var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha)
tram_trend_overlay.color = LIGHT_COLOR_INTENSE_RED
tram_trend_overlay.pixel_w = 1
tram_trend_emissive.pixel_w = 1
tram_trend_overlay.pixel_z = -4
tram_trend_emissive.pixel_z = -4
. += tram_trend_overlay
. += tram_trend_emissive
else
var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_FALLING)
var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha)
tram_trend_overlay.color = LIGHT_COLOR_VIVID_GREEN
tram_trend_overlay.pixel_w = 1
tram_trend_emissive.pixel_w = 1
tram_trend_overlay.pixel_z = -4
tram_trend_emissive.pixel_z = -4
. += tram_trend_overlay
. += tram_trend_emissive
/obj/machinery/incident_display/examine(mob/user)
. = ..()
if(sign_features & DISPLAY_DELAM)
. += span_info("It has been [last_delam] shift\s since the last delamination event at this Nanotrasen facility.")
switch (last_delam)
if(0)
. += span_info("In case you didn't notice.<br/>")
if(1)
. += span_info("Let's do better today.<br/>")
if(2 to 5)
. += span_info("There's room for improvement.<br/>")
if(6 to 10)
. += span_info("Good work!<br/>")
if(69)
. += span_info("Nice.<br/>")
else
. += span_info("Incredible!<br/>")
if(sign_features & DISPLAY_TRAM)
. += span_info("The station has had [hit_count] tram incident\s this shift.")
switch (hit_count)
if(0)
. += span_info("Fantastic! Champions of safety.<br/>")
if(1)
. += span_info("Let's do better tomorrow.<br/>")
if(2 to 5)
. += span_info("There's room for improvement.<br/>")
if(6 to 10)
. += span_info("Good work! Nanotrasen's finest!<br/>")
if(69)
. += span_info("Nice.<br/>")
else
. += span_info("Incredible! You're probably reading this from medbay.<br/>")
#undef DISPLAY_DELAM
#undef DISPLAY_TRAM
#undef NAME_DUAL
#undef NAME_DELAM
#undef NAME_TRAM
#undef DESC_DUAL
#undef DESC_DELAM
#undef DESC_TRAM
+4 -1
View File
@@ -185,7 +185,10 @@
use_power(power)
flick("limbgrower_fill", src)
icon_state = "limbgrower_idleon"
selected_category = params["active_tab"]
var/temp_category = params["active_tab"]
if( ! (temp_category in categories) )
return FALSE //seriously come on
selected_category = temp_category
addtimer(CALLBACK(src, PROC_REF(build_item), consumed_reagents_list), production_speed * production_coefficient)
return TRUE
+41 -85
View File
@@ -1,11 +1,15 @@
// Status display
// (formerly Countdown timer display)
#define MAX_STATIC_WIDTH 25
#define FONT_STYLE "5pt 'Small Fonts'"
#define MAX_STATIC_WIDTH 22
#define FONT_STYLE "12pt 'TinyUnicode'"
#define SCROLL_RATE (0.04 SECONDS) // time per pixel
#define LINE1_Y -7 // SKYRAT EDIT CHANGE - AESTHETICS - originally -8
#define LINE2_Y -14 // SKYRAT EDIT CHANGE - AESTHETICS - originally -15
#define SCROLL_PADDING 2 // how many pixels we chop to make a smooth loop
#define LINE1_X 1
#define LINE1_Y -4
#define LINE2_X 1
#define LINE2_Y -11
#define STATUS_DISPLAY_FONT_DATUM /datum/font/tiny_unicode/size_12pt
/// Status display which can show images and scrolling text.
/obj/machinery/status_display
name = "status display"
@@ -124,14 +128,14 @@
* * message - the new message text.
* Returns new /obj/effect/overlay/status_display_text or null if unchanged.
*/
/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset)
/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset, line_pair)
if(overlay && message == overlay.message)
return null
if(overlay)
qdel(overlay)
var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset)
var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset, line_pair)
// Draw our object visually "in front" of this display, taking advantage of sidemap
new_status_display_text.pixel_y = -32
new_status_display_text.pixel_z = 32
@@ -149,7 +153,7 @@
return
set_light(1.5, 0.7, LIGHT_COLOR_BLUE) // blue light
/obj/machinery/status_display/update_overlays()
/obj/machinery/status_display/update_overlays(updates)
. = ..()
if(machine_stat & (NOPOWER|BROKEN))
@@ -167,10 +171,18 @@
if(current_picture == AI_DISPLAY_DONT_GLOW) // If the thing's off, don't display the emissive yeah?
return .
else
var/overlay = update_message(message1_overlay, LINE1_Y, message1)
var/line1_metric
var/line2_metric
var/line_pair
var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM()
line1_metric = display_font.get_metrics(message1)
line2_metric = display_font.get_metrics(message2)
line_pair = (line1_metric > line2_metric ? line1_metric : line2_metric)
var/overlay = update_message(message1_overlay, LINE1_Y, message1, LINE1_X, line_pair)
if(overlay)
message1_overlay = overlay
overlay = update_message(message2_overlay, LINE2_Y, message2)
overlay = update_message(message2_overlay, LINE2_Y, message2, LINE2_X, line_pair)
if(overlay)
message2_overlay = overlay
@@ -178,7 +190,7 @@
if(message1 == "" && message2 == "")
return
. += emissive_appearance(icon, "outline", src, alpha = src.alpha)
. += emissive_appearance('modular_skyrat/modules/aesthetics/status_display/icons/status_display.dmi', "outline", src, alpha = src.alpha) // SKYRAT EDIT CHANGE - AESTHETICS
// Timed process - performs nothing in the base class
/obj/machinery/status_display/process()
@@ -245,39 +257,23 @@
// If the line is short enough to not marquee, and it matches this, it's a header.
var/static/regex/header_regex = regex("^-.*-$")
/// Width of each character, including kerning gap afterwards.
/// We don't use rich text or anything fancy, so we can bake these values.
var/static/list/char_widths = list(
// ! " # $ % & ' ( ) * + , - . /
1, 2, 3, 5, 4, 5, 5, 2, 3, 3, 3, 4, 2, 3, 2, 3,
// 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3,
// @ A B C D E F G H I J K L M N O
7, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5,
// P Q R S T U V W X Y Z [ \ ] ^ _
5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 3, 3, 4, 4,
// ` a b c d e f g h i j k l m n o
3, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5,
// p q r s t u v w x y z { | } ~
5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 2, 3, 4,
)
/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0)
/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0, line_pair)
. = ..()
maptext_y = yoffset
message = line
var/line_width = measure_width(line)
var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM()
var/line_width = display_font.get_metrics(line)
if(line_width > MAX_STATIC_WIDTH)
// Marquee text
var/marquee_message = "[line] - [line] - [line]"
var/marquee_message = "[line] [line] [line]"
// Width of full content. Must of these is never revealed unless the user inputted a single character.
var/full_marquee_width = measure_width(marquee_message)
var/full_marquee_width = display_font.get_metrics("[marquee_message] ")
// We loop after only this much has passed.
var/looping_marquee_width = measure_width("[line] - ")
var/looping_marquee_width = (display_font.get_metrics("[line] ]") - SCROLL_PADDING)
maptext = generate_text(marquee_message, center = FALSE, text_color = text_color)
maptext_width = full_marquee_width
@@ -287,45 +283,24 @@
add_filter("mask", 1, alpha_mask_filter(icon = icon(icon, "outline")))
// Scroll.
var/time = looping_marquee_width * SCROLL_RATE
animate(src, maptext_x = -looping_marquee_width, time = time, loop = -1)
animate(maptext_x = 0, time = 0)
var/time = line_pair * SCROLL_RATE
animate(src, maptext_x = (-looping_marquee_width) + MAX_STATIC_WIDTH, time = time, loop = -1)
animate(maptext_x = MAX_STATIC_WIDTH, time = 0)
else
// Centered text
var/color = header_regex.Find(line) ? header_text_color : text_color
maptext = generate_text(line, center = TRUE, text_color = color)
maptext_x = xoffset //Defaults to 0, this would be centered unless overided
/**
* A hyper-streamlined version of MeasureText that doesn't support different fonts, rich formatting, or multiline.
* But it also doesn't require a client.
*
* Returns the width in pixels
*
* Arguments:
* * text - the text to measure
*/
/obj/effect/overlay/status_display_text/proc/measure_width(text)
var/width = 0
for(var/text_idx in 1 to length(text))
var/ascii = text2ascii(text, text_idx)
if(!(ascii in 0x20 to 0x7E))
// So we can't possibly runtime, even though the input should be in range already.
width += 3
continue
width += char_widths[ascii - 0x1F]
return width
/**
* Generate the actual maptext.
* Arguments:
* * text - the text to display
* * center - center the text if TRUE, otherwise left-align
* * center - center the text if TRUE, otherwise right-align (the direction the text is coming from)
* * text_color - the text color
*/
/obj/effect/overlay/status_display_text/proc/generate_text(text, center, text_color)
return {"<div style="color:[text_color];font:[FONT_STYLE][center ? ";text-align:center" : ""]" valign="top">[text]</div>"}
return {"<div style="color:[text_color];font:[FONT_STYLE][center ? ";text-align:center" : "text-align:right"]" valign="top">[text]</div>"}
/// Evac display which shows shuttle timer or message set by Command.
/obj/machinery/status_display/evac
@@ -463,29 +438,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32)
name = "\improper AI display"
desc = "A small screen which the AI can use to present itself."
current_mode = SD_PICTURE
var/emotion = AI_EMOTION_BLANK
/// A mapping between AI_EMOTION_* string constants, which also double as user readable descriptions, and the name of the iconfile.
var/static/list/emotion_map = list(
AI_EMOTION_BLANK = AI_DISPLAY_DONT_GLOW,
AI_EMOTION_VERY_HAPPY = "ai_veryhappy",
AI_EMOTION_HAPPY = "ai_happy",
AI_EMOTION_NEUTRAL = "ai_neutral",
AI_EMOTION_UNSURE = "ai_unsure",
AI_EMOTION_CONFUSED = "ai_confused",
AI_EMOTION_SAD = "ai_sad",
AI_EMOTION_BSOD = "ai_bsod",
AI_EMOTION_PROBLEMS = "ai_trollface",
AI_EMOTION_AWESOME = "ai_awesome",
AI_EMOTION_DORFY = "ai_urist",
AI_EMOTION_THINKING = "ai_thinking",
AI_EMOTION_FACEPALM = "ai_facepalm",
AI_EMOTION_FRIEND_COMPUTER = "ai_friend",
AI_EMOTION_BLUE_GLOW = "ai_sal",
AI_EMOTION_RED_GLOW = "ai_hal",
)
var/emotion = AI_DISPLAY_DONT_GLOW
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32)
@@ -501,8 +454,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32)
if(!isAI(user))
return
var/list/choices = list()
for(var/emotion_const in emotion_map)
var/icon_state = emotion_map[emotion_const]
for(var/emotion_const in GLOB.ai_status_display_emotes)
var/icon_state = GLOB.ai_status_display_emotes[emotion_const]
choices[emotion_const] = image(icon = 'icons/obj/status_display.dmi', icon_state = icon_state)
var/emotion_result = show_radial_menu(user, src, choices, tooltips = TRUE)
@@ -517,7 +470,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32)
update_appearance()
return PROCESS_KILL
set_picture(emotion_map[emotion])
set_picture(GLOB.ai_status_display_emotes[emotion])
return PROCESS_KILL
/obj/item/circuit_component/status_display
@@ -598,5 +551,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32)
#undef MAX_STATIC_WIDTH
#undef FONT_STYLE
#undef SCROLL_RATE
#undef LINE1_X
#undef LINE1_Y
#undef LINE2_X
#undef LINE2_Y
#undef STATUS_DISPLAY_FONT_DATUM
@@ -51,7 +51,7 @@
/obj/effect/decal/cleanable/xenoblood/xgibs/proc/spread_movement_effects(datum/move_loop/has_target/source)
SIGNAL_HANDLER
if(isclosedturf(loc) || (isgroundlessturf(loc) && !SSmapping.get_turf_below(loc)))
if(NeverShouldHaveComeHere(loc))
return
new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc)
@@ -73,9 +73,11 @@
layer = ABOVE_WINDOW_LAYER
plane = GAME_PLANE
vis_flags = VIS_INHERIT_PLANE
turf_loc_check = FALSE
alpha = 180
/obj/effect/decal/cleanable/blood/splatter/over_window/NeverShouldHaveComeHere(turf/here_turf)
return isgroundlessturf(here_turf)
/obj/effect/decal/cleanable/blood/tracks
icon_state = "tracks"
desc = "They look like tracks left by wheels."
@@ -103,7 +105,6 @@
plane = GAME_PLANE
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
mergeable_decal = FALSE
turf_loc_check = FALSE
dryname = "rotting gibs"
drydesc = "They look bloody and gruesome while some terrible smell fills the air."
@@ -169,7 +170,7 @@
/obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source)
SIGNAL_HANDLER
if(isclosedturf(loc) || (isgroundlessturf(loc) && !SSmapping.get_turf_below(loc)))
if(NeverShouldHaveComeHere(loc))
return
new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases)
@@ -20,9 +20,8 @@
pixel_x = base_pixel_x + rand(-5, 5)
pixel_y = base_pixel_y + rand(-5, 5)
/obj/effect/decal/cleanable/ash/crematorium
//crematoriums need their own ash cause default ash deletes itself if created in an obj
turf_loc_check = FALSE
/obj/effect/decal/cleanable/ash/NeverShouldHaveComeHere(turf/here_turf)
return !istype(here_turf, /obj/structure/bodycontainer/crematorium) && ..()
/obj/effect/decal/cleanable/ash/large
name = "large pile of ashes"
@@ -36,7 +36,7 @@
/obj/effect/decal/cleanable/robot_debris/proc/spread_movement_effects(datum/move_loop/has_target/source)
SIGNAL_HANDLER
if(isclosedturf(loc) || (isgroundlessturf(loc) && !SSmapping.get_turf_below(loc)))
if(NeverShouldHaveComeHere(loc))
return
if (prob(40))
new /obj/effect/decal/cleanable/oil/streak(loc)
+2 -2
View File
@@ -31,8 +31,8 @@
add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY)
RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted))
/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T)
return isgroundlessturf(T)
/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/here_turf)
return isgroundlessturf(here_turf)
/obj/effect/decal/cleanable/crayon/proc/on_painted(datum/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color)
SIGNAL_HANDLER
+7 -7
View File
@@ -8,12 +8,11 @@
/obj/effect/decal/Initialize(mapload)
. = ..()
if(turf_loc_check && NeverShouldHaveComeHere(loc))
#ifdef UNIT_TESTS
stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. Please remove it or set turf_loc_check to FALSE on the decal if intended.")
#else
if(NeverShouldHaveComeHere(loc))
if(mapload)
stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. \
Please remove it or allow it to pass NeverShouldHaveComeHere if it's intended.")
return INITIALIZE_HINT_QDEL
#endif
var/static/list/loc_connections = list(
COMSIG_TURF_CHANGE = PROC_REF(on_decal_move),
)
@@ -23,8 +22,9 @@
if(B && B.loc == loc)
qdel(src)
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T)
return isclosedturf(T) || (isgroundlessturf(T) && !SSmapping.get_turf_below(T))
///Checks if we are allowed to be in `here_turf`, and returns that result. Subtypes should override this when necessary.
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/here_turf)
return isclosedturf(here_turf) || (isgroundlessturf(here_turf) && !SSmapping.get_turf_below(here_turf))
/obj/effect/decal/ex_act(severity, target)
qdel(src)
+6 -1
View File
@@ -14,6 +14,9 @@
desc = "They look like human remains. They have a strange aura about them."
icon_state = "remains"
/obj/effect/decal/remains/human/NeverShouldHaveComeHere(turf/here_turf)
return !istype(here_turf, /obj/structure/closet/crate/grave/filled) && ..()
/obj/effect/decal/remains/human/smokey
desc = "They look like human remains. They have a strange, smokey aura about them..."
///Our proximity monitor, for detecting nearby looters.
@@ -48,7 +51,9 @@
/obj/effect/decal/remains/plasma
icon_state = "remainsplasma"
turf_loc_check = FALSE
/obj/effect/decal/remains/plasma/NeverShouldHaveComeHere(turf/here_turf)
return isclosedturf(here_turf)
/obj/effect/decal/remains/xeno
desc = "They look like the remains of something... alien. They have a strange aura about them."
@@ -17,7 +17,7 @@
if(randomdir)
setDir(pick(GLOB.cardinals))
timerid = QDEL_IN(src, duration)
timerid = QDEL_IN_STOPPABLE(src, duration)
/obj/effect/temp_visual/Destroy()
. = ..()
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/gps//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
/obj/item/gps //SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
name = "global positioning system"
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
@@ -34,7 +34,7 @@
living_mob.Knockdown(max(200/max(1, distance), 60))
//Bang
if(!distance || loc == living_mob || loc == living_mob.loc) //Stop allahu akbarring rooms with this.
if(!distance || loc == living_mob || loc == living_mob.loc)
living_mob.Paralyze(20)
living_mob.Knockdown(200)
living_mob.soundbang_act(1, 200, 10, 15)
@@ -1,15 +1,33 @@
/**
* Note that we can stack explosive implants and thus increase the payload's devastation radius. (https://github.com/tgstation/tgstation/pull/50674)
* That's why the three devastation values for the microbomb implant are balanced around in such a way
* that buying one macrobomb equals to buying 10 microbombs and stacking them.
*/
#define MICROBOMB_DELAY 0.7 SECONDS
#define MICROBOMB_EXPLOSION_LIGHT 2
#define MICROBOMB_EXPLOSION_HEAVY 0.8
#define MICROBOMB_EXPLOSION_DEVASTATE 0.4
/obj/item/implant/explosive
name = "microbomb implant"
desc = "And boom goes the weasel."
icon_state = "explosive"
actions_types = list(/datum/action/item_action/explosive_implant)
// Explosive implant action is always available.
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
var/delay = 7
var/popup = FALSE // is the DOUWANNABLOWUP window open?
actions_types = list(/datum/action/item_action/explosive_implant) //Explosive implant action is always available.
///Whether the implant's explosion sequence has been activated or not
var/active = FALSE
///The final countdown (delay before we explode)
var/delay = MICROBOMB_DELAY
///Radius of weak devastation explosive impact
var/explosion_light = MICROBOMB_EXPLOSION_LIGHT
///Radius of medium devastation explosive impact
var/explosion_heavy = MICROBOMB_EXPLOSION_HEAVY
///Radius of heavy devastation explosive impact
var/explosion_devastate = MICROBOMB_EXPLOSION_DEVASTATE
///Whether the confirmation UI popup is active or not
var/popup = FALSE
/obj/item/implant/explosive/proc/on_death(datum/source, gibbed)
SIGNAL_HANDLER
@@ -46,16 +64,16 @@
return FALSE
if(cause == "death" && HAS_TRAIT(imp_in, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION))
return FALSE
heavy = round(heavy)
medium = round(medium)
weak = round(weak)
explosion_devastate = round(explosion_devastate)
explosion_heavy = round(explosion_heavy)
explosion_light = round(explosion_light)
to_chat(imp_in, span_notice("You activate your [name]."))
active = TRUE
var/turf/boomturf = get_turf(imp_in)
message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].")
//If the delay is short, just blow up already jeez
if(delay <= 7)
explosion(src, devastation_range = heavy, heavy_impact_range = medium, light_impact_range = weak, flame_range = weak, flash_range = weak, explosion_cause = src)
//If the delay is shorter or equal to the default delay, just blow up already jeez
if(delay <= MICROBOMB_DELAY)
explosion(src, devastation_range = explosion_devastate, heavy_impact_range = explosion_heavy, light_impact_range = explosion_light, flame_range = explosion_light, flash_range = explosion_light, explosion_cause = src)
if(imp_in)
imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS)
imp_in.gib(TRUE)
@@ -64,13 +82,14 @@
timed_explosion()
/obj/item/implant/explosive/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
for(var/X in target.implants)
if(istype(X, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs
var/obj/item/implant/explosive/imp_e = X
imp_e.heavy += heavy
imp_e.medium += medium
imp_e.weak += weak
imp_e.delay += delay
for(var/target_implant in target.implants)
if(istype(target_implant, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs
//We merge the two implants into a single bigger, badder one by adding the injected implant's values into the already present implant
var/obj/item/implant/explosive/implant_to_upgrade = target_implant
implant_to_upgrade.explosion_devastate += explosion_devastate
implant_to_upgrade.explosion_heavy += explosion_heavy
implant_to_upgrade.explosion_light += explosion_light
implant_to_upgrade.delay += delay
qdel(src)
return TRUE
@@ -83,6 +102,10 @@
if(.)
UnregisterSignal(target, COMSIG_LIVING_DEATH)
/**
* Explosive activation sequence for implants with a delay longer than 0.7 seconds.
* Make the implantee beep a few times, keel over and explode. Usually to a devastating effect.
*/
/obj/item/implant/explosive/proc/timed_explosion()
imp_in.visible_message(span_warning("[imp_in] starts beeping ominously!"))
@@ -97,30 +120,34 @@
)
playsound(loc, 'sound/items/timer.ogg', 30, FALSE)
sleep(delay*0.25)
sleep(delay * 0.25)
if(imp_in && !imp_in.stat)
imp_in.visible_message(span_warning("[imp_in] doubles over in pain!"))
imp_in.Paralyze(140)
playsound(loc, 'sound/items/timer.ogg', 30, FALSE)
sleep(delay*0.25)
playsound(loc, 'sound/items/timer.ogg', 30, FALSE)
sleep(delay*0.25)
playsound(loc, 'sound/items/timer.ogg', 30, FALSE)
sleep(delay*0.25)
explosion(src, devastation_range = heavy, heavy_impact_range = medium, light_impact_range = weak, flame_range = weak, flash_range = weak, explosion_cause = src)
imp_in.Paralyze(14 SECONDS)
//total of 4 bomb beeps, and we've already beeped once
var/bomb_beeps_until_boom = 3
while(bomb_beeps_until_boom > 0)
//for extra spice
var/beep_volume = 35
playsound(loc, 'sound/items/timer.ogg', beep_volume, FALSE)
sleep(delay * 0.25)
bomb_beeps_until_boom--
beep_volume += 5
explosion(src, devastation_range = explosion_devastate, heavy_impact_range = explosion_heavy, light_impact_range = explosion_light, flame_range = explosion_light, flash_range = explosion_light, explosion_cause = src)
if(imp_in)
imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS)
imp_in.gib(TRUE)
qdel(src)
//Macrobomb has the strength and delay of 10 microbombs
/obj/item/implant/explosive/macro
name = "macrobomb implant"
desc = "And boom goes the weasel. And everything else nearby."
icon_state = "explosive"
weak = 20 //the strength and delay of 10 microbombs
medium = 8
heavy = 4
delay = 70
delay = 10 * MICROBOMB_DELAY
explosion_light = 10 * MICROBOMB_EXPLOSION_LIGHT
explosion_heavy = 10 * MICROBOMB_EXPLOSION_HEAVY
explosion_devastate = 10 * MICROBOMB_EXPLOSION_DEVASTATE
/obj/item/implanter/explosive
name = "implanter (microbomb)"
@@ -138,3 +165,8 @@
/datum/action/item_action/explosive_implant
check_flags = NONE
name = "Activate Explosive Implant"
#undef MICROBOMB_DELAY
#undef MICROBOMB_EXPLOSION_LIGHT
#undef MICROBOMB_EXPLOSION_HEAVY
#undef MICROBOMB_EXPLOSION_DEVASTATE
@@ -18,7 +18,7 @@
/obj/item/implant/tracking/c38/implant(mob/living/target, mob/user, silent, force)
. = ..()
timerid = QDEL_IN(src, lifespan)
timerid = QDEL_IN_STOPPABLE(src, lifespan)
/obj/item/implant/tracking/c38/removed(mob/living/source, silent, special)
. = ..()
+1 -71
View File
@@ -43,34 +43,6 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, FALSE),
new /datum/pipe_info/pipe("Junction", /obj/machinery/atmospherics/pipe/heat_exchanging/junction, FALSE),
new /datum/pipe_info/pipe("Heat Exchanger", /obj/machinery/atmospherics/components/unary/heat_exchanger, FALSE),
),
"Air Sensors" = list(
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/plasma_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/oxygen_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrogen_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/mix_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrous_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/air_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/carbon_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/bz_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/freon_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/halon_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/healium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/hydrogen_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/hypernoblium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/miasma_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/pluoxium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/proto_nitrate_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/tritium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/water_vapor_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/zauker_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/helium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/antinoblium_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/incinerator_tank),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/ordnance_burn_chamber),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/ordnance_freezer_chamber),
new /datum/pipe_info/sensor(/obj/machinery/air_sensor/engine_chamber),
)
))
@@ -112,9 +84,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
var/dirtype = PIPE_BENDABLE
var/all_layers
/datum/pipe_info/proc/Params()
return ""
/datum/pipe_info/proc/get_preview(selected_dir, selected = FALSE)
var/list/dirs
switch(dirtype)
@@ -154,14 +123,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
return rows
/datum/pipe_info/sensor
dirtype = PIPE_ONEDIR
/datum/pipe_info/sensor/New(obj/machinery/air_sensor/sensor)
id = sensor
name = capitalize(replacetext(initial(sensor.name), "gas sensor", ""))
icon_state = "gsensor1"
/datum/pipe_info/pipe/New(label, obj/machinery/atmospherics/path, use_five_layers)
name = label
id = path
@@ -170,9 +131,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
var/obj/item/pipe/c = initial(path.construction_type)
dirtype = initial(c.RPD_type)
/datum/pipe_info/pipe/Params()
return "makepipe=[id]&type=[dirtype]"
/datum/pipe_info/meter
icon_state = "meter"
dirtype = PIPE_ONEDIR
@@ -180,9 +138,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
/datum/pipe_info/meter/New(label)
name = label
/datum/pipe_info/meter/Params()
return "makemeter=[id]&type=[dirtype]"
/datum/pipe_info/disposal/New(label, obj/path, dt=PIPE_UNARY)
name = label
id = path
@@ -193,9 +148,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
dirtype = dt
/datum/pipe_info/disposal/Params()
return "dmake=[id]&type=[dirtype]"
/datum/pipe_info/transit/New(label, obj/path, dt=PIPE_UNARY)
name = label
id = path
@@ -309,12 +261,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
ui_interact(user)
/obj/item/pipe_dispenser/pre_attack_secondary(obj/machinery/atmospherics/target, mob/user, params)
if(istype(target, /obj/machinery/air_sensor))
if(!do_after(user, destroy_speed, target))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
qdel(target)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
if(!istype(target, /obj/machinery/atmospherics))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
if(target.pipe_color && target.piping_layer)
@@ -377,13 +323,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
for(var/i in 1 to cat.len)
var/datum/pipe_info/info = cat[i]
//skip sensors which are already in the world so we dont create duplicate ones
if(info.type == /datum/pipe_info/sensor)
var/datum/pipe_info/sensor/sensor_info = info
var/obj/machinery/air_sensor/sensor = sensor_info.id
if(GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(initial(sensor.chamber_id))] != null)
continue
r += list(list(
"pipe_name" = info.name,
"pipe_index" = i,
@@ -391,8 +330,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
))
if(info == recipe)
data["selected_category"] = c
if(r.len == 0) //when all air sensors are installed this list will become empty
continue
data["categories"] += list(list("cat_name" = c, "recipes" = r))
var/list/init_directions = list("north" = FALSE, "south" = FALSE, "east" = FALSE, "west" = FALSE)
@@ -587,14 +525,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
PM.setAttachLayer(piping_layer)
if(mode & WRENCH_MODE)
PM.wrench_act(user, src)
else if(recipe.type == /datum/pipe_info/sensor)
if(do_after(user, atmos_build_speed, target = attack_target))
activate()
var/datum/pipe_info/sensor/sensor_recipe = recipe
var/obj/machinery/air_sensor/sensor_blueprint = sensor_recipe.id
new sensor_blueprint(get_turf(attack_target))
//change the recipe as the current one becomes unavailable
recipe = first_atmos
else
if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5))
balloon_alert(user, "cant build on this layer!")
@@ -267,9 +267,9 @@
/obj/item/borg/upgrade/lavaproof
name = "mining cyborg lavaproof chassis"
desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock."
desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock and liquid plasma."
icon_state = "ash_plating"
resistance_flags = LAVA_PROOF | FIRE_PROOF
resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF
require_model = TRUE
model_type = list(/obj/item/robot_model/miner)
model_flags = BORG_MODEL_MINER
@@ -277,12 +277,12 @@
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
ADD_TRAIT(R, TRAIT_LAVA_IMMUNE, type)
R.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), type)
/obj/item/borg/upgrade/lavaproof/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
REMOVE_TRAIT(R, TRAIT_LAVA_IMMUNE, type)
R.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), type)
/obj/item/borg/upgrade/selfrepair
name = "self-repair module"
+2 -2
View File
@@ -1,5 +1,5 @@
//Bluespace crystals, used in telescience and when crushed it will blink you to a random turf.
/obj/item/stack/ore/bluespace_crystal//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
/obj/item/stack/ore/bluespace_crystal
name = "bluespace crystal"
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
icon = 'icons/obj/telescience.dmi'
@@ -62,7 +62,7 @@
merge_type = /obj/item/stack/ore/bluespace_crystal/artificial
//Polycrystals, aka stacks
/obj/item/stack/sheet/bluespace_crystal//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
/obj/item/stack/sheet/bluespace_crystal
name = "bluespace polycrystal"
icon = 'icons/obj/telescience.dmi'
icon_state = "polycrystal"
@@ -177,6 +177,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1, check_density = FALSE, category = CAT_CONTAINERS), \
new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2, check_density = FALSE, category = CAT_ENTERTAINMENT), \
new/datum/stack_recipe("basketball", /obj/item/toy/basketball, 20, check_density = FALSE, category = CAT_ENTERTAINMENT), \
new/datum/stack_recipe("baseball", /obj/item/toy/beach_ball/baseball, 3, check_density = FALSE, category = CAT_ENTERTAINMENT), \
new/datum/stack_recipe("saddle", /obj/item/saddle, 5, check_density = FALSE, category = CAT_EQUIPMENT), \
new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2, check_density = FALSE, category = CAT_CLOTHING), \
new/datum/stack_recipe("cowboy boots", /obj/item/clothing/shoes/cowboy, 2, check_density = FALSE, category = CAT_CLOTHING), \
@@ -622,7 +622,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cardboard
novariants = TRUE
grind_results = list(/datum/reagent/cellulose = 10)
material_type = /datum/material/cardboard
+2 -1
View File
@@ -566,7 +566,8 @@
* - [inhand][boolean]: Whether or not the stack to check should act like it's in a mob's hand.
*/
/obj/item/stack/proc/can_merge(obj/item/stack/check, inhand = FALSE)
if(!istype(check, merge_type))
// We don't only use istype here, since that will match subtypes, and stack things that shouldn't stack
if(!istype(check, merge_type) || check.merge_type != merge_type)
return FALSE
if(mats_per_unit ~! check.mats_per_unit) // ~! in case of lists this operator checks only keys, but not values
return FALSE
@@ -1,4 +1,4 @@
/obj/item/stack/telecrystal//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
/obj/item/stack/telecrystal
name = "telecrystal"
desc = "It seems to be pulsing with suspiciously enticing energies."
singular_name = "telecrystal"
@@ -5,7 +5,7 @@
icon_state = "tile"
inhand_icon_state = "tile"
force = 6
mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5)
mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*0.25)
throwforce = 10
flags_1 = CONDUCT_1
turf_type = /turf/open/floor/iron
+17
View File
@@ -1631,3 +1631,20 @@ GLOBAL_LIST_EMPTY(intento_players)
#undef TIME_TO_BEGIN
#undef TIME_PER_DEMO_STEP
#undef TIME_TO_RESET_ICON
/*
* Runic Scepter
*/
/obj/item/toy/foam_runic_scepter
name = "foam scepter"
desc = "A foam replica of the scepters Wizards us on Vendormancy Soccer."
icon_state = "vendor_staff"
inhand_icon_state = "vendor_staff"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
icon = 'icons/obj/weapons/guns/magic.dmi'
slot_flags = ITEM_SLOT_BACK
attack_verb_continuous = list("smacks", "clubs", "wacks", "vendors")
attack_verb_simple = list("smack", "club", "wacks", "vendor")
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
@@ -13,7 +13,7 @@
new /obj/item/circuitboard/machine/techfab/department/cargo(src)
new /obj/item/storage/photo_album/qm(src)
new /obj/item/circuitboard/machine/ore_silo(src)
new /obj/item/gun/ballistic/rifle/boltaction/quartermaster(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in!
new /obj/item/gun/ballistic/rifle/boltaction/sporterized(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in!
new /obj/item/cargo_teleporter(src) // SKYRAT EDIT - Adds a cargo teleporter to QM locker, so they can intice others to research it
new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) //SKYRAT EDIT - GUN CARGO
new /obj/item/storage/bag/garment/quartermaster(src)
@@ -261,7 +261,7 @@
door.setDir(dir)
//SKYRAT EDIT ADDITION BEGIN - LARGE_DOORS
if(door.multi_tile)
door.SetBounds()
door.set_bounds()
//SKYRAT EDIT END
door.unres_sides = electronics.unres_sides
//door.req_access = req_access
+2 -2
View File
@@ -236,7 +236,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
if(!length(compiled)) // No mobs?
icon_state = "morgue3"
return ..()
if(!(obj_flags & EMAGGED))
for(var/mob/living/occupant as anything in compiled)
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
@@ -341,7 +341,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
qdel(O)
if(!locate(/obj/effect/decal/cleanable/ash) in get_step(src, dir))//prevent pile-up
new/obj/effect/decal/cleanable/ash/crematorium(src)
new/obj/effect/decal/cleanable/ash(src)
sleep(3 SECONDS)
@@ -1,5 +1,3 @@
#define COLLISION_HAZARD_THRESHOLD 11
/obj/structure/sign/clock
name = "wall clock"
desc = "It's your run-of-the-mill wall clock showing both the local Coalition Standard Time and the galactic Treaty Coordinated Time. Perfect for staring at instead of working."
@@ -26,141 +24,3 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/calendar, 32)
. += span_info("Events:")
for(var/holidayname in GLOB.holidays)
. += span_info("[holidayname]")
/**
* List of delamination counter signs on the map.
* Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion.
*/
GLOBAL_LIST_EMPTY(map_delamination_counters)
/obj/structure/sign/delamination_counter
name = "delamination counter"
sign_change_name = "Flip Sign- Supermatter Delamination"
desc = "A pair of flip signs describe how long it's been since the last delamination incident."
icon_state = "days_since_explosion"
is_editable = TRUE
var/since_last = 0
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/delamination_counter, 32)
/obj/structure/sign/delamination_counter/Initialize(mapload)
. = ..()
GLOB.map_delamination_counters += src
if (!mapload)
update_count(SSpersistence.rounds_since_engine_exploded)
/obj/structure/sign/delamination_counter/Destroy()
GLOB.map_delamination_counters -= src
return ..()
/obj/structure/sign/delamination_counter/proc/update_count(new_count)
since_last = min(new_count, 99)
update_appearance()
/obj/structure/sign/delamination_counter/update_overlays()
. = ..()
var/ones = since_last % 10
var/mutable_appearance/ones_overlay = mutable_appearance('icons/obj/signs.dmi', "days_[ones]")
ones_overlay.pixel_w = 4
. += ones_overlay
var/tens = (since_last / 10) % 10
var/mutable_appearance/tens_overlay = mutable_appearance('icons/obj/signs.dmi', "days_[tens]")
tens_overlay.pixel_w = -5
. += tens_overlay
/obj/structure/sign/delamination_counter/examine(mob/user)
. = ..()
. += span_info("It has been [since_last] day\s since the last delamination event at a Nanotrasen facility.")
switch (since_last)
if (0)
. += span_info("In case you didn't notice.")
if(1)
. += span_info("Let's do better today.")
if(2 to 5)
. += span_info("There's room for improvement.")
if(6 to 10)
. += span_info("Good work!")
if(11 to INFINITY)
. += span_info("Incredible!")
/obj/structure/sign/collision_counter
name = "incident counter"
sign_change_name = "Indicator board- Tram incidents"
desc = "A display that indicates how many tram related incidents have occured today."
icon_state = "tram_hits"
is_editable = TRUE
var/hit_count = 0
var/tram_id = TRAM_LIFT_ID
/// Has the tram hit enough people it now flashes hazard lights?
var/hazard_flash = FALSE
/obj/structure/sign/collision_counter/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/structure/sign/collision_counter/LateInitialize()
. = ..()
for(var/obj/structure/industrial_lift/tram/tram as anything in GLOB.lifts)
if(tram.lift_id != tram_id)
continue
RegisterSignal(tram, COMSIG_TRAM_COLLISION, PROC_REF(new_hit))
update_appearance()
/obj/structure/sign/collision_counter/Destroy()
return ..()
/obj/structure/sign/collision_counter/proc/new_hit(lift_master, collided_type)
SIGNAL_HANDLER
if(!ismob(collided_type))
return
var/mob/victim = collided_type // Real players only, no gaming high score
if(!victim.client)
return
hit_count++
if(hazard_flash)
update_appearance()
return
if(hit_count == COLLISION_HAZARD_THRESHOLD) // When we hit the threshold, enable flashing the lights
hazard_flash = TRUE
icon_state = "tram_hits_alert"
update_appearance()
return
update_appearance()
/obj/structure/sign/collision_counter/update_overlays()
. = ..()
var/ones = hit_count % 10
var/mutable_appearance/ones_overlay = mutable_appearance('icons/obj/signs.dmi', "hits_[ones]")
ones_overlay.pixel_w = 4
. += ones_overlay
var/tens = (hit_count / 10) % 10
var/mutable_appearance/tens_overlay = mutable_appearance('icons/obj/signs.dmi', "hits_[tens]")
tens_overlay.pixel_w = -5
. += tens_overlay
/obj/structure/sign/collision_counter/examine(mob/user)
. = ..()
. += span_info("The station has had [hit_count] incident\s this shift.")
switch (hit_count)
if(0)
. += span_info("Fantastic! Champions of safety.")
if(1)
. += span_info("Let's do better tomorrow.")
if(2 to 5)
. += span_info("There's room for improvement.")
if(6 to 10)
. += span_info("Good work! Nanotrasen's finest!")
if(11 to INFINITY)
. += span_info("Incredible! You're probably reading this from medbay.")
#undef COLLISION_HAZARD_THRESHOLD
+8
View File
@@ -279,6 +279,14 @@
// Stops sliding
slide_distance = 0
// SKYRAT EDIT START - Akula species
if(HAS_TRAIT(slipper, TRAIT_SLIPPERY))
if(!(lube & SLIDE_ICE))
lube |= SLIDE
slide_distance = rand(SLIPPERY_MIN, SLIPPERY_MAX)
// SKYRAT EDIT END
var/obj/buckled_obj
if(slipper.buckled)
if(!(lube & GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube.
+3
View File
@@ -201,6 +201,9 @@
message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!"))
usr.log_message("non-admin attempted to execute a SDQL query!", LOG_ADMIN)
return FALSE
var/prompt = tgui_alert(usr, "Run SDQL2 Query?", "SDQL2", list("Yes", "Cancel"))
if (prompt != "Yes")
return
var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[key_name(usr)]")
if(length(results) == 3)
for(var/I in 1 to 3)
@@ -264,8 +264,7 @@
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE)
qdel(src)
else
to_chat(user, span_warning("You can't seem to work up the nerve to shatter the bottle! Perhaps you should try again later."))
to_chat(user, span_warning("The bottle's contents usually pop and boil constantly, but right now they're eerily still and calm. Perhaps you should try again later."))
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
var/mob/living/simple_animal/hostile/imp/slaughter/S = new demon_type(T)
@@ -78,7 +78,7 @@
/obj/item/melee/touch_attack/mansus_fist/proc/after_clear_rune(obj/effect/target, mob/living/user)
new /obj/effect/temp_visual/drawing_heretic_rune/fail(target.loc, target.greyscale_colors)
var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = spell_which_made_us?.resolve()
grasp?.spell_feedback()
grasp?.spell_feedback(user)
remove_hand_with_no_refund(user)
@@ -85,7 +85,7 @@
/obj/item/melee/touch_attack/star_touch/proc/after_clear_rune(obj/effect/target, mob/living/user)
new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(target))
var/datum/action/cooldown/spell/touch/star_touch/star_touch_spell = spell_which_made_us?.resolve()
star_touch_spell?.spell_feedback()
star_touch_spell?.spell_feedback(user)
remove_hand_with_no_refund(user)
/obj/item/melee/touch_attack/star_touch/ignition_effect(atom/to_light, mob/user)
@@ -390,3 +390,126 @@
whistle.whistler = null
whistle = null
return ..()
/////////////////////////////////////////Scepter of Vendormancy///////////////////
#define RUNIC_SCEPTER_MAX_CHARGES 3
#define RUNIC_SCEPTER_MAX_RANGE 7
/obj/item/runic_vendor_scepter
name = "scepter of runic vendormancy"
desc = "This scepter allows you to conjure, force push and detonate Runic Vendors. It can hold up to 3 charges that can be recovered with a simple magical channeling. A modern spin on the old Geomancy spells."
icon_state = "vendor_staff"
inhand_icon_state = "vendor_staff"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
icon = 'icons/obj/weapons/guns/magic.dmi'
slot_flags = ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_NORMAL
force = 10
damtype = BRUTE
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
attack_verb_continuous = list("smacks", "clubs", "wacks")
attack_verb_simple = list("smack", "club", "wacks")
/// Range cap on where you can summon vendors.
var/max_summon_range = RUNIC_SCEPTER_MAX_RANGE
/// Channeling time to summon a vendor.
var/summoning_time = 1 SECONDS
/// Checks if the scepter is channeling a vendor already.
var/scepter_is_busy_summoning = FALSE
/// Checks if the scepter is busy channeling recharges
var/scepter_is_busy_recharging = FALSE
///Number of summoning charges left.
var/summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES
/obj/item/runic_vendor_scepter/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, PROC_REF(on_magic_charge))
var/static/list/loc_connections = list(
COMSIG_ITEM_MAGICALLY_CHARGED = PROC_REF(on_magic_charge),
)
/obj/item/runic_vendor_scepter/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(scepter_is_busy_recharging)
user.balloon_alert(user, "busy!")
return
if(!check_allowed_items(target, not_inside = TRUE))
return
. |= AFTERATTACK_PROCESSED_ITEM
var/turf/afterattack_turf = get_turf(target)
if(istype(target, /obj/machinery/vending/runic_vendor))
var/obj/machinery/vending/runic_vendor/runic_explosion_target = target
runic_explosion_target.runic_explosion()
return
var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_turf
if(vendor_on_turf)
vendor_on_turf.runic_explosion()
return
if(!summon_vendor_charges)
user.balloon_alert(user, "no charges!")
return
if(get_dist(afterattack_turf,src) > max_summon_range)
user.balloon_alert(user, "too far!")
return
if(get_turf(src) == afterattack_turf)
user.balloon_alert(user, "too close!")
return
if(scepter_is_busy_summoning)
user.balloon_alert(user, "already summoning!")
return
if(afterattack_turf.is_blocked_turf(TRUE))
user.balloon_alert(user, "blocked!")
return
if(summoning_time)
scepter_is_busy_summoning = TRUE
user.balloon_alert(user, "summoning...")
if(!do_after(user, summoning_time, target = target))
scepter_is_busy_summoning = FALSE
return
scepter_is_busy_summoning = FALSE
if(summon_vendor_charges)
playsound(src,'sound/weapons/resonator_fire.ogg',50,TRUE)
user.visible_message(span_warning("[user] summons a runic vendor!"))
new /obj/machinery/vending/runic_vendor(afterattack_turf)
summon_vendor_charges--
user.changeNext_move(CLICK_CD_MELEE)
return
return ..()
/obj/item/runic_vendor_scepter/attack_self(mob/user, modifiers)
. = ..()
user.balloon_alert(user, "recharging...")
scepter_is_busy_recharging = TRUE
if(!do_after(user, 5 SECONDS))
scepter_is_busy_recharging = FALSE
return
user.balloon_alert(user, "fully charged")
scepter_is_busy_recharging = FALSE
summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES
/obj/item/runic_vendor_scepter/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters)
var/turf/afterattack_secondary_turf = get_turf(target)
var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_secondary_turf
if(istype(target, /obj/machinery/vending/runic_vendor))
var/obj/machinery/vending/runic_vendor/vendor_being_throw = target
vendor_being_throw.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
if(vendor_on_turf)
vendor_on_turf.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/runic_vendor_scepter/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/charge/spell, mob/living/caster)
SIGNAL_HANDLER
if(!ismovable(loc))
return
. = COMPONENT_ITEM_CHARGED
summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES
return .
#undef RUNIC_SCEPTER_MAX_CHARGES
#undef RUNIC_SCEPTER_MAX_RANGE
@@ -97,3 +97,12 @@
limit = 3
category = "Assistance"
refundable = TRUE
/datum/spellbook_entry/item/vendormancer
name = "Scepter of Vendormancy"
desc = "A scepter containing the power of Runic Vendormancy.\
It can summon up to 3 Runic Vendors that decay over time, but can be \
throw around to squash oponents or be directly detonated. When out of \
charges a long channel will restore the charges."
item_path = /obj/item/runic_vendor_scepter
category = "Assistance"
-1
View File
@@ -4,4 +4,3 @@
/datum/asset/spritesheet/pipes/create_spritesheets()
for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi'))
InsertAll("", each, GLOB.alldirs)
Insert(sprite_name = "gsensor1", I = 'icons/obj/stationobjs.dmi', icon_state = "gsensor1")
@@ -654,7 +654,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
///Used for air alarm link helper, which connects air alarm to a sensor with corresponding chamber_id
/obj/machinery/airalarm/proc/setup_chamber_link()
var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(air_sensor_chamber_id)]
var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[GLOB.map_loaded_sensors[air_sensor_chamber_id]]
if(isnull(sensor))
log_mapping("[src] at [AREACOORD(src)] tried to connect to a sensor, but no sensor with chamber_id:[air_sensor_chamber_id] found!")
return
@@ -17,11 +17,11 @@
///Rate of operation of the device
var/volume_rate = 50
///id of air sensor its connected to
var/chamber_id
/obj/machinery/atmospherics/components/unary/outlet_injector/Initialize(mapload)
if(isnull(id_tag))
id_tag = assign_random_name()
. = ..()
var/static/list/tool_screentips = list(
TOOL_MULTITOOL = list(
SCREENTIP_CONTEXT_LMB = "Log to link later with air sensor",
@@ -42,27 +42,17 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/multitool_act(mob/living/user, obj/item/multitool/multi_tool)
. = ..()
if (!istype(multi_tool))
return .
if(istype(multi_tool.buffer, /obj/machinery/air_sensor))
var/obj/machinery/air_sensor/sensor = multi_tool.buffer
sensor.inlet_id = id_tag
multi_tool.buffer = null
balloon_alert(user, "input linked to sensor")
return TOOL_ACT_TOOLTYPE_SUCCESS
balloon_alert(user, "saved in buffer")
multi_tool.buffer = src
return TRUE
/obj/machinery/atmospherics/components/unary/outlet_injector/wrench_act(mob/living/user, obj/item/I)
. = ..()
if(.)
disconnect_chamber()
///called when its either unwrenched or destroyed
/obj/machinery/atmospherics/components/unary/outlet_injector/proc/disconnect_chamber()
if(chamber_id != null)
GLOB.objects_by_id_tag -= CHAMBER_INPUT_FROM_ID(chamber_id)
chamber_id = null
/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy()
disconnect_chamber()
return ..()
return TOOL_ACT_TOOLTYPE_SUCCESS
/obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user)
if(can_interact(user))

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