mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-06-20 13:43:44 +01:00
@@ -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
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
+1180
-1050
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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]: ()
|
||||
|
||||
@@ -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,
|
||||
))
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
))
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 .
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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)
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user