mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 06:29:23 +01:00
Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync
This commit is contained in:
@@ -2,22 +2,39 @@ Any time you make a change to the schema files, remember to increment the databa
|
||||
|
||||
Make sure to also update `DB_MAJOR_VERSION` and `DB_MINOR_VERSION`, which can be found in `code/__DEFINES/subsystem.dm`.
|
||||
|
||||
The latest database version is 5.34 (for bubberstation) (5.32 for /tg/); The query to update the schema revision table is:
|
||||
The latest database version is 5.35 (for bubberstation) (5.33 for /tg/); The query to update the schema revision table is:
|
||||
|
||||
```sql
|
||||
INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 34);
|
||||
INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 35);
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```sql
|
||||
INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 34);
|
||||
INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 35);
|
||||
```
|
||||
|
||||
In any query remember to add a prefix to the table names if you use one.
|
||||
|
||||
---
|
||||
|
||||
Version 5.33, 28 September 2025, by Atlanta-Ned
|
||||
Modifies manifest ckey column to be consistent with other ckey columns
|
||||
|
||||
```sql
|
||||
ALTER TABLE manifest
|
||||
MODIFY ckey VARCHAR(32) NOT NULL;
|
||||
```
|
||||
|
||||
The prefixed connection log SQL schema also specified a `varchar(45)` ckey column. This SQL will modify that:
|
||||
|
||||
```sql
|
||||
ALTER TABLE connection_log
|
||||
MODIFY ckey VARCHAR(32) NOT NULL;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Version 5.32, 31 May 2025, by TealSeer
|
||||
Change column name of `manifest` table because `character` is a reserved word.
|
||||
|
||||
|
||||
@@ -141,7 +141,7 @@ CREATE TABLE `connection_log` (
|
||||
`server_ip` int(10) unsigned NOT NULL,
|
||||
`server_port` smallint(5) unsigned NOT NULL,
|
||||
`round_id` int(11) unsigned NULL,
|
||||
`ckey` varchar(45) DEFAULT NULL,
|
||||
`ckey` varchar(32) DEFAULT NULL,
|
||||
`ip` int(10) unsigned NOT NULL,
|
||||
`computerid` varchar(45) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
@@ -311,7 +311,7 @@ CREATE TABLE `manifest` (
|
||||
`server_ip` int(10) unsigned NOT NULL,
|
||||
`server_port` smallint(5) NOT NULL,
|
||||
`round_id` int(11) NOT NULL,
|
||||
`ckey` text NOT NULL,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`character_name` text NOT NULL,
|
||||
`job` text NOT NULL,
|
||||
`special` text DEFAULT NULL,
|
||||
|
||||
@@ -140,7 +140,7 @@ CREATE TABLE `SS13_connection_log` (
|
||||
`server_ip` int(10) unsigned NOT NULL,
|
||||
`server_port` smallint(5) unsigned NOT NULL,
|
||||
`round_id` int(11) unsigned NOT NULL,
|
||||
`ckey` varchar(45) DEFAULT NULL,
|
||||
`ckey` varchar(32) DEFAULT NULL,
|
||||
`ip` int(10) unsigned NOT NULL,
|
||||
`computerid` varchar(45) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
@@ -309,7 +309,7 @@ CREATE TABLE `SS13_manifest` (
|
||||
`server_ip` int(10) unsigned NOT NULL,
|
||||
`server_port` smallint(5) NOT NULL,
|
||||
`round_id` int(11) NOT NULL,
|
||||
`ckey` text NOT NULL,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`character_name` text NOT NULL,
|
||||
`job` text NOT NULL,
|
||||
`special` text DEFAULT NULL,
|
||||
|
||||
@@ -879,7 +879,6 @@
|
||||
},
|
||||
/obj/item/coin/gold,
|
||||
/obj/item/vending_refill/donksnackvendor,
|
||||
/obj/item/circuitboard/machine/vending/donksnackvendor,
|
||||
/turf/open/floor/catwalk_floor/iron_dark,
|
||||
/area/ruin/space/has_grav/hauntedtradingpost/public)
|
||||
"hL" = (
|
||||
@@ -4345,10 +4344,6 @@
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/space/has_grav/hauntedtradingpost/public/corridor)
|
||||
"LI" = (
|
||||
/obj/item/circuitboard/machine/vending/donksofttoyvendor{
|
||||
pixel_y = -2;
|
||||
pixel_x = -6
|
||||
},
|
||||
/obj/effect/decal/cleanable/glass,
|
||||
/turf/open/floor/carpet/donk,
|
||||
/area/ruin/space/has_grav/hauntedtradingpost/employees)
|
||||
|
||||
@@ -139,9 +139,9 @@
|
||||
/area/awaymission/cabin)
|
||||
"aE" = (
|
||||
/obj/effect/decal/cleanable/cobweb/cobweb2,
|
||||
/obj/effect/baseturf_helper/asteroid/snow,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/mapping_helpers/burnt_floor,
|
||||
/obj/machinery/power/turbine/inlet_compressor,
|
||||
/turf/open/floor/plating,
|
||||
/area/awaymission/cabin)
|
||||
"aF" = (
|
||||
@@ -198,17 +198,10 @@
|
||||
/turf/open/floor/carpet,
|
||||
/area/awaymission/cabin)
|
||||
"aQ" = (
|
||||
/obj/structure{
|
||||
anchored = 1;
|
||||
density = 1;
|
||||
desc = "Generates power from lava!";
|
||||
dir = 1;
|
||||
icon = 'icons/obj/pipes_n_cables/simple.dmi';
|
||||
icon_state = "compressor";
|
||||
name = "geothermal generator"
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/mapping_helpers/burnt_floor,
|
||||
/obj/machinery/power/turbine/core_rotor,
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/plating,
|
||||
/area/awaymission/cabin)
|
||||
"aR" = (
|
||||
@@ -701,17 +694,9 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/awaymission/cabin)
|
||||
"dv" = (
|
||||
/obj/structure{
|
||||
anchored = 1;
|
||||
density = 1;
|
||||
desc = "Generates power from lava!";
|
||||
icon = 'icons/obj/pipes_n_cables/simple.dmi';
|
||||
icon_state = "turbine";
|
||||
name = "geothermal generator"
|
||||
},
|
||||
/obj/structure/cable,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/mapping_helpers/burnt_floor,
|
||||
/obj/machinery/power/turbine/turbine_outlet,
|
||||
/turf/open/floor/plating,
|
||||
/area/awaymission/cabin)
|
||||
"dC" = (
|
||||
@@ -5109,6 +5094,11 @@
|
||||
/obj/effect/decal/cleanable/molten_object/large,
|
||||
/turf/open/misc/asteroid/snow/snow_cabin,
|
||||
/area/awaymission/cabin/caves)
|
||||
"SW" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/baseturf_helper/asteroid/snow,
|
||||
/turf/open/floor/plating,
|
||||
/area/awaymission/cabin)
|
||||
"To" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/item/hatchet/wooden,
|
||||
@@ -36321,7 +36311,7 @@ vh
|
||||
xt
|
||||
an
|
||||
aw
|
||||
ed
|
||||
SW
|
||||
ed
|
||||
hv
|
||||
an
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7090,7 +7090,7 @@
|
||||
/turf/open/floor/wood,
|
||||
/area/station/service/theater)
|
||||
"bKo" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/firealarm/directional/south,
|
||||
@@ -8774,7 +8774,7 @@
|
||||
/area/station/ai_monitored/turret_protected/ai_upload)
|
||||
"cfx" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -13292,13 +13292,6 @@
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/maintenance/department/eva/abandoned)
|
||||
"dnd" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/secondary/entry)
|
||||
"dnj" = (
|
||||
/obj/effect/turf_decal/trimline/blue/filled/line,
|
||||
/turf/open/floor/iron/white,
|
||||
@@ -16686,7 +16679,6 @@
|
||||
/area/station/command/gateway)
|
||||
"eeX" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/obj/structure/chair/stool/directional/east,
|
||||
/obj/effect/landmark/start/hangover,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
@@ -17744,7 +17736,6 @@
|
||||
"eua" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
@@ -21240,11 +21231,6 @@
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/maintenance/starboard/fore)
|
||||
"fmI" = (
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central/aft)
|
||||
"fmN" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
@@ -29632,12 +29618,10 @@
|
||||
"hmS" = (
|
||||
/obj/structure/cable,
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/crowbar,
|
||||
/obj/item/restraints/handcuffs,
|
||||
/obj/machinery/recharger,
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/storage/fancy/donut_box,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/arrivals)
|
||||
"hmU" = (
|
||||
@@ -33338,7 +33322,6 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/supermatter/room)
|
||||
"ilH" = (
|
||||
/obj/machinery/atmospherics/components/unary/bluespace_sender,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 10
|
||||
},
|
||||
@@ -38755,7 +38738,7 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/fore)
|
||||
"jAY" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/bot/left,
|
||||
@@ -45734,7 +45717,7 @@
|
||||
},
|
||||
/obj/machinery/light/directional/south,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron/dark/textured_large,
|
||||
@@ -55242,7 +55225,6 @@
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
},
|
||||
@@ -57161,7 +57143,7 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/detectives_office)
|
||||
"oiO" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -61485,16 +61467,6 @@
|
||||
dir = 1
|
||||
},
|
||||
/area/station/hallway/secondary/exit/departure_lounge)
|
||||
"pmC" = (
|
||||
/obj/machinery/duct,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron/dark/corner{
|
||||
dir = 1
|
||||
},
|
||||
/area/station/hallway/secondary/exit/departure_lounge)
|
||||
"pmE" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/turf/open/floor/iron,
|
||||
@@ -69795,15 +69767,6 @@
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/science/circuits)
|
||||
"rnm" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central/fore)
|
||||
"rnn" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -70092,7 +70055,6 @@
|
||||
/obj/machinery/firealarm/directional/north{
|
||||
pixel_x = 4
|
||||
},
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/effect/turf_decal/tile/red/anticorner/contrasted{
|
||||
dir = 1
|
||||
},
|
||||
@@ -70100,6 +70062,10 @@
|
||||
pixel_y = 27;
|
||||
pixel_x = -6
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/recharger,
|
||||
/obj/item/restraints/handcuffs,
|
||||
/obj/item/crowbar,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/arrivals)
|
||||
"rsa" = (
|
||||
@@ -72162,16 +72128,6 @@
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/science/research)
|
||||
"rRr" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/port)
|
||||
"rRu" = (
|
||||
/obj/effect/turf_decal/siding/wideplating/dark{
|
||||
dir = 1
|
||||
@@ -88967,16 +88923,6 @@
|
||||
/obj/effect/turf_decal/siding/wood,
|
||||
/turf/open/floor/iron/sepia,
|
||||
/area/station/service/library/artgallery)
|
||||
"vVS" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/starboard)
|
||||
"vVW" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
@@ -89747,7 +89693,7 @@
|
||||
/area/station/commons/dorms)
|
||||
"wgF" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/status_display/ai/directional/south,
|
||||
@@ -90704,7 +90650,6 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/secondary/entry)
|
||||
"wru" = (
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/item/radio/intercom/directional/east,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -92017,7 +91962,6 @@
|
||||
"wIz" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
@@ -95899,15 +95843,6 @@
|
||||
},
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/medical/medbay)
|
||||
"xHO" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central/aft)
|
||||
"xHW" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/status_display/ai/directional/east,
|
||||
@@ -96437,14 +96372,6 @@
|
||||
/obj/effect/spawner/random/structure/tank_holder,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/maintenance/department/medical/morgue)
|
||||
"xOw" = (
|
||||
/obj/item/kirbyplants/random,
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/effect/turf_decal/tile/yellow/opposingcorners,
|
||||
/obj/machinery/light/directional/east,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/secondary/entry)
|
||||
"xOC" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -128903,7 +128830,7 @@ iNR
|
||||
bCj
|
||||
tjp
|
||||
dGS
|
||||
rRr
|
||||
iCO
|
||||
uED
|
||||
nXK
|
||||
vcB
|
||||
@@ -133297,7 +133224,7 @@ puJ
|
||||
kpj
|
||||
bYG
|
||||
mlE
|
||||
xHO
|
||||
nXY
|
||||
whK
|
||||
rcW
|
||||
dJa
|
||||
@@ -136081,7 +136008,7 @@ vJd
|
||||
qAV
|
||||
fOP
|
||||
qAV
|
||||
rnm
|
||||
iDP
|
||||
nPa
|
||||
dOZ
|
||||
xms
|
||||
@@ -136563,7 +136490,7 @@ kBz
|
||||
rjZ
|
||||
urY
|
||||
prJ
|
||||
dnd
|
||||
bsb
|
||||
kVP
|
||||
kVP
|
||||
kVP
|
||||
@@ -139364,7 +139291,7 @@ abi
|
||||
abi
|
||||
abi
|
||||
abi
|
||||
xOw
|
||||
oHj
|
||||
wiY
|
||||
kAc
|
||||
kJH
|
||||
@@ -140534,7 +140461,7 @@ dGu
|
||||
lvZ
|
||||
pkg
|
||||
lvZ
|
||||
pmC
|
||||
tOv
|
||||
knH
|
||||
qob
|
||||
kjG
|
||||
@@ -142542,7 +142469,7 @@ exS
|
||||
iVq
|
||||
juZ
|
||||
crR
|
||||
fmI
|
||||
ers
|
||||
hgJ
|
||||
hgJ
|
||||
cbq
|
||||
@@ -146893,7 +146820,7 @@ kKg
|
||||
nuK
|
||||
xEJ
|
||||
dCk
|
||||
vVS
|
||||
rTO
|
||||
ljd
|
||||
uvR
|
||||
tGt
|
||||
|
||||
@@ -2696,10 +2696,6 @@
|
||||
/obj/machinery/shower/directional/south,
|
||||
/turf/open/floor/iron/showroomfloor,
|
||||
/area/station/security/prison/toilet)
|
||||
"aLV" = (
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/port)
|
||||
"aLX" = (
|
||||
/obj/machinery/door/airlock/maintenance,
|
||||
/obj/structure/cable,
|
||||
@@ -5769,13 +5765,6 @@
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/atmos/storage)
|
||||
"bzI" = (
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/fore)
|
||||
"bzQ" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -7489,7 +7478,6 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted,
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/turf/open/floor/iron/dark/textured_edge{
|
||||
dir = 1
|
||||
},
|
||||
@@ -12230,7 +12218,6 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/maintenance/port/aft)
|
||||
"dnT" = (
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/machinery/power/apc/auto_name/directional/south,
|
||||
/obj/structure/cable,
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted,
|
||||
@@ -12335,7 +12322,6 @@
|
||||
/obj/machinery/light/directional/south,
|
||||
/obj/effect/spawner/random/vending/colavend,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/hallway/secondary/entry)
|
||||
"dpq" = (
|
||||
@@ -13334,8 +13320,8 @@
|
||||
/obj/structure/cable,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
|
||||
cycle_id = "brigoutpost"
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
|
||||
/obj/machinery/scanner_gate/preset_guns,
|
||||
@@ -14819,10 +14805,6 @@
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/iron/dark/textured,
|
||||
/area/station/science/research)
|
||||
"eaT" = (
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/starboard)
|
||||
"ebb" = (
|
||||
/obj/structure/extinguisher_cabinet/directional/north,
|
||||
/turf/open/floor/iron,
|
||||
@@ -27186,7 +27168,7 @@
|
||||
/turf/open/floor/iron/cafeteria,
|
||||
/area/station/security/prison/work)
|
||||
"hFJ" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/obj/machinery/computer/security/telescreen/engine/directional/north,
|
||||
/turf/open/floor/iron/dark,
|
||||
@@ -29188,9 +29170,7 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
|
||||
cycle_id = "brigoutpost"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
|
||||
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
|
||||
/turf/open/floor/iron/dark/textured_edge{
|
||||
dir = 4
|
||||
@@ -29847,6 +29827,10 @@
|
||||
/obj/structure/table,
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted,
|
||||
/obj/structure/cable,
|
||||
/obj/item/crowbar{
|
||||
pixel_y = 3;
|
||||
pixel_x = 15
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/customs/auxiliary)
|
||||
"isC" = (
|
||||
@@ -34657,7 +34641,6 @@
|
||||
c_tag = "Central Hallway West"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue,
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central)
|
||||
"jOz" = (
|
||||
@@ -40166,7 +40149,7 @@
|
||||
/area/station/service/chapel)
|
||||
"lqz" = (
|
||||
/obj/structure/cable,
|
||||
/turf/closed/wall,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/station/ai_monitored/turret_protected/ai)
|
||||
"lqA" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
@@ -41170,11 +41153,11 @@
|
||||
/turf/open/floor/carpet/blue,
|
||||
/area/station/security/prison/work)
|
||||
"lEg" = (
|
||||
/obj/machinery/door/window/left/directional/north{
|
||||
name = "AI Core Door";
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/door/window/brigdoor/right/directional/north{
|
||||
name = "Primary AI Core Access";
|
||||
req_access = list("ai_upload")
|
||||
},
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/circuit,
|
||||
/area/station/ai_monitored/turret_protected/ai)
|
||||
"lEj" = (
|
||||
@@ -45086,7 +45069,6 @@
|
||||
/obj/structure/disposalpipe/trunk{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/science/breakroom)
|
||||
"mOf" = (
|
||||
@@ -48109,7 +48091,6 @@
|
||||
},
|
||||
/area/station/security/brig)
|
||||
"nEV" = (
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/structure/cable,
|
||||
/obj/effect/turf_decal/tile/red/opposingcorners,
|
||||
/obj/machinery/light/directional/north,
|
||||
@@ -48570,6 +48551,7 @@
|
||||
/obj/machinery/firealarm/directional/south{
|
||||
pixel_x = 4
|
||||
},
|
||||
/obj/structure/filingcabinet/chestdrawer,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/customs/auxiliary)
|
||||
"nLE" = (
|
||||
@@ -49923,7 +49905,6 @@
|
||||
/obj/effect/turf_decal/tile/purple/half/contrasted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/starboard)
|
||||
"ofl" = (
|
||||
@@ -50752,11 +50733,11 @@
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/station/science/ordnance/burnchamber)
|
||||
"opS" = (
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/radio/intercom/directional/north,
|
||||
/obj/machinery/photocopier/prebuilt,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/customs/auxiliary)
|
||||
"opU" = (
|
||||
@@ -54224,7 +54205,6 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/science/ordnance)
|
||||
"pkQ" = (
|
||||
/obj/machinery/atmospherics/components/unary/bluespace_sender,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 9
|
||||
},
|
||||
@@ -57185,8 +57165,8 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
|
||||
cycle_id = "brigoutpost"
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
|
||||
/obj/machinery/scanner_gate/preset_guns,
|
||||
@@ -59088,13 +59068,20 @@
|
||||
/area/station/service/chapel/office)
|
||||
"qEK" = (
|
||||
/obj/item/paper_bin{
|
||||
pixel_x = -5;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/pen{
|
||||
pixel_x = -3;
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/item/pen,
|
||||
/obj/structure/table,
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted,
|
||||
/obj/structure/cable,
|
||||
/obj/item/radio/off{
|
||||
pixel_y = 4;
|
||||
pixel_x = 8
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/customs/auxiliary)
|
||||
"qEM" = (
|
||||
@@ -59156,7 +59143,7 @@
|
||||
/area/station/science/explab)
|
||||
"qFu" = (
|
||||
/obj/machinery/airalarm/directional/west,
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
@@ -60549,7 +60536,7 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/lobby)
|
||||
"qXF" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/tile/yellow/half/contrasted,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/command/bridge)
|
||||
@@ -61836,17 +61823,15 @@
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/medical/medbay/aft)
|
||||
"rqi" = (
|
||||
/obj/item/crowbar{
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/assembly/flash/handheld{
|
||||
pixel_x = -19;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
|
||||
/obj/item/radio/off{
|
||||
pixel_y = 6
|
||||
/obj/machinery/fax{
|
||||
fax_name = "Custom's Fax Machine";
|
||||
name = "Custom's Fax Machine"
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/customs/auxiliary)
|
||||
@@ -65632,7 +65617,6 @@
|
||||
},
|
||||
/obj/machinery/newscaster/directional/west,
|
||||
/obj/machinery/light/directional/west,
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted{
|
||||
dir = 8
|
||||
},
|
||||
@@ -70800,7 +70784,6 @@
|
||||
"tSb" = (
|
||||
/obj/effect/spawner/random/vending/colavend,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/hallway/primary/central)
|
||||
"tSi" = (
|
||||
@@ -70996,11 +70979,9 @@
|
||||
/obj/structure/cable,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
|
||||
cycle_id = "brigoutpost"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
|
||||
/obj/structure/sign/departments/security/directional/east,
|
||||
/obj/effect/mapping_helpers/airlock/access/all/security/entrance,
|
||||
/turf/open/floor/iron/dark/textured_edge{
|
||||
dir = 8
|
||||
},
|
||||
@@ -72214,7 +72195,7 @@
|
||||
/turf/open/floor/iron/showroomfloor,
|
||||
/area/station/security/processing)
|
||||
"unG" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
@@ -73104,9 +73085,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/area/station/service/hydroponics)
|
||||
"uBi" = (
|
||||
/turf/closed/wall,
|
||||
/area/station/ai_monitored/turret_protected/ai)
|
||||
"uBs" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -74326,7 +74304,6 @@
|
||||
"uUM" = (
|
||||
/obj/machinery/light_switch/directional/south,
|
||||
/obj/effect/turf_decal/tile/neutral/half/contrasted,
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/commons/dorms)
|
||||
"uUT" = (
|
||||
@@ -75506,7 +75483,7 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/service/chapel)
|
||||
"vnt" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/button/door/directional/south{
|
||||
@@ -78904,11 +78881,6 @@
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/port)
|
||||
"wpQ" = (
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/commons/locker)
|
||||
"wpY" = (
|
||||
/obj/effect/mapping_helpers/airlock/abandoned,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -80191,7 +80163,7 @@
|
||||
normaldoorcontrol = 1;
|
||||
pixel_x = 6;
|
||||
pixel_y = 9;
|
||||
req_access = list("secuirty")
|
||||
req_access = list("security")
|
||||
},
|
||||
/obj/machinery/button/door{
|
||||
id = "outerbrig";
|
||||
@@ -80199,7 +80171,7 @@
|
||||
normaldoorcontrol = 1;
|
||||
pixel_x = 6;
|
||||
pixel_y = -1;
|
||||
req_access = list("secuirty")
|
||||
req_access = list("security")
|
||||
},
|
||||
/obj/machinery/button/door/directional/north{
|
||||
id = "briggate";
|
||||
@@ -233863,7 +233835,7 @@ ddQ
|
||||
gAB
|
||||
ykG
|
||||
ykG
|
||||
wpQ
|
||||
ykG
|
||||
tOw
|
||||
sVn
|
||||
wlt
|
||||
@@ -239511,7 +239483,7 @@ iFj
|
||||
hDU
|
||||
abL
|
||||
ons
|
||||
aLV
|
||||
gpp
|
||||
bXm
|
||||
bXm
|
||||
bXm
|
||||
@@ -245415,7 +245387,7 @@ vVY
|
||||
uog
|
||||
uog
|
||||
nfU
|
||||
bzI
|
||||
uog
|
||||
uog
|
||||
yaF
|
||||
mny
|
||||
@@ -255046,8 +255018,8 @@ ujs
|
||||
mYh
|
||||
ogF
|
||||
hfy
|
||||
uBi
|
||||
uBi
|
||||
iHp
|
||||
iHp
|
||||
lqz
|
||||
dBQ
|
||||
eAx
|
||||
@@ -255304,7 +255276,7 @@ lNC
|
||||
mlp
|
||||
lEg
|
||||
cvh
|
||||
uBi
|
||||
iHp
|
||||
eYH
|
||||
jIZ
|
||||
oFx
|
||||
@@ -255560,9 +255532,9 @@ ujs
|
||||
mYh
|
||||
ruZ
|
||||
kfP
|
||||
uBi
|
||||
uBi
|
||||
uBi
|
||||
iHp
|
||||
iHp
|
||||
iHp
|
||||
deg
|
||||
mYh
|
||||
iHp
|
||||
@@ -260081,7 +260053,7 @@ nVr
|
||||
wFO
|
||||
bzA
|
||||
hUD
|
||||
eaT
|
||||
lso
|
||||
byK
|
||||
sDd
|
||||
bRd
|
||||
|
||||
@@ -2423,7 +2423,7 @@
|
||||
"aSQ" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/book/manual/wiki/security_space_law{
|
||||
pixel_x = -3;
|
||||
pixel_x = -7;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/machinery/light_switch/directional/north,
|
||||
@@ -2431,6 +2431,10 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/light/small/directional/west,
|
||||
/obj/machinery/recharger{
|
||||
pixel_y = 6;
|
||||
pixel_x = 6
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/customs)
|
||||
"aST" = (
|
||||
@@ -2986,7 +2990,6 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/station/maintenance/starboard/greater)
|
||||
"bcq" = (
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/neutral/half/contrasted{
|
||||
dir = 1
|
||||
},
|
||||
@@ -6367,15 +6370,6 @@
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/station/science/ordnance/bomb)
|
||||
"cod" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/port)
|
||||
"coe" = (
|
||||
/obj/effect/turf_decal/stripes/white/line{
|
||||
dir = 1
|
||||
@@ -11906,7 +11900,6 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 6
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/bluespace_sender,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/atmos)
|
||||
"egR" = (
|
||||
@@ -13371,11 +13364,6 @@
|
||||
/obj/machinery/light/small/directional/east,
|
||||
/turf/open/floor/engine,
|
||||
/area/station/engineering/supermatter)
|
||||
"eFC" = (
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/commons/locker)
|
||||
"eFG" = (
|
||||
/obj/item/storage/medkit/regular{
|
||||
pixel_x = 3;
|
||||
@@ -14146,7 +14134,7 @@
|
||||
/turf/open/floor/engine,
|
||||
/area/station/science/xenobiology)
|
||||
"eSy" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable,
|
||||
@@ -19486,7 +19474,7 @@
|
||||
/obj/machinery/camera/directional/north{
|
||||
c_tag = "Engineering - Power Monitoring"
|
||||
},
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/engineering/main)
|
||||
@@ -22732,16 +22720,6 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/atmos)
|
||||
"hTE" = (
|
||||
/obj/structure/chair{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/secondary/exit/departure_lounge)
|
||||
"hTG" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/power/terminal,
|
||||
@@ -26055,13 +26033,6 @@
|
||||
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/maintenance/central)
|
||||
"iYc" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/effect/turf_decal/tile/red,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/fore)
|
||||
"iYp" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4,
|
||||
@@ -28197,7 +28168,7 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/port)
|
||||
"jGN" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/light/directional/south,
|
||||
@@ -32658,17 +32629,6 @@
|
||||
/obj/effect/turf_decal/tile/red/opposingcorners,
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/security/prison/mess)
|
||||
"liO" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/duct,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/commons/fitness/recreation)
|
||||
"liU" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -37302,7 +37262,6 @@
|
||||
/area/station/service/lawoffice)
|
||||
"mQq" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/obj/machinery/photobooth,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/secondary/command)
|
||||
@@ -37679,7 +37638,7 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/ai_monitored/command/storage/eva)
|
||||
"mXj" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/tile/brown/half/contrasted{
|
||||
dir = 1
|
||||
},
|
||||
@@ -39288,14 +39247,6 @@
|
||||
/obj/effect/mapping_helpers/mail_sorting/service/chapel,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/maintenance/aft/greater)
|
||||
"nwU" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/commons/dorms)
|
||||
"nwV" = (
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/door/airlock/grunge{
|
||||
@@ -40822,6 +40773,9 @@
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/radio,
|
||||
/obj/item/crowbar,
|
||||
/obj/item/assembly/flash,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/customs)
|
||||
"oay" = (
|
||||
@@ -45689,7 +45643,7 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/warden)
|
||||
"pMH" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/plaque/static_plaque/atmos{
|
||||
@@ -48384,7 +48338,7 @@
|
||||
/area/station/security/detectives_office)
|
||||
"qJd" = (
|
||||
/obj/machinery/status_display/ai/directional/north,
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/command/heads_quarters/ce)
|
||||
@@ -58048,17 +58002,6 @@
|
||||
/obj/machinery/light/no_nightlight/directional/east,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/engineering/atmospherics_engine)
|
||||
"tWe" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/port)
|
||||
"tWq" = (
|
||||
/obj/effect/spawner/random/trash/janitor_supplies,
|
||||
/obj/effect/mapping_helpers/broken_floor,
|
||||
@@ -62363,10 +62306,8 @@
|
||||
"vrP" = (
|
||||
/obj/structure/cable,
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/recharger{
|
||||
pixel_y = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red/half/contrasted,
|
||||
/obj/item/storage/fancy/donut_box,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/customs)
|
||||
"vsG" = (
|
||||
@@ -62435,7 +62376,6 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/medical/morgue)
|
||||
"vtn" = (
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
|
||||
/obj/effect/mapping_helpers/requests_console/supplies,
|
||||
/obj/effect/mapping_helpers/requests_console/assistance,
|
||||
@@ -62443,6 +62383,7 @@
|
||||
department = "Security";
|
||||
name = "Security Requests Console"
|
||||
},
|
||||
/obj/machinery/photocopier/prebuilt,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/customs)
|
||||
"vtp" = (
|
||||
@@ -63985,13 +63926,16 @@
|
||||
/area/station/command/bridge)
|
||||
"vSs" = (
|
||||
/obj/machinery/airalarm/directional/west,
|
||||
/obj/structure/closet,
|
||||
/obj/item/crowbar,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/radio,
|
||||
/obj/effect/turf_decal/tile/red/anticorner/contrasted{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/toy/figure/ian{
|
||||
pixel_x = -4;
|
||||
pixel_y = 13
|
||||
},
|
||||
/obj/structure/filingcabinet/chestdrawer{
|
||||
pixel_y = 2
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/checkpoint/customs)
|
||||
"vSu" = (
|
||||
@@ -68226,13 +68170,6 @@
|
||||
/obj/effect/landmark/generic_maintenance_landmark,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/maintenance/aft/lesser)
|
||||
"xpH" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central)
|
||||
"xpL" = (
|
||||
/obj/structure/closet/secure_closet/chief_medical,
|
||||
/obj/effect/turf_decal/trimline/blue/filled/line{
|
||||
@@ -87102,7 +87039,7 @@ dHc
|
||||
htE
|
||||
dHc
|
||||
dHc
|
||||
tWe
|
||||
xXi
|
||||
tsb
|
||||
yfq
|
||||
jzp
|
||||
@@ -88894,7 +88831,7 @@ vKn
|
||||
fNz
|
||||
vQs
|
||||
vQs
|
||||
cod
|
||||
hyW
|
||||
rEO
|
||||
xbd
|
||||
pOa
|
||||
@@ -96159,7 +96096,7 @@ jay
|
||||
mRy
|
||||
wBW
|
||||
eje
|
||||
hTE
|
||||
eje
|
||||
qTJ
|
||||
eAe
|
||||
mGy
|
||||
@@ -99408,7 +99345,7 @@ dGW
|
||||
hhp
|
||||
bJq
|
||||
gFi
|
||||
iYc
|
||||
gGo
|
||||
olw
|
||||
fLI
|
||||
alE
|
||||
@@ -103025,7 +102962,7 @@ qBC
|
||||
sqM
|
||||
kwQ
|
||||
jZR
|
||||
xpH
|
||||
sqM
|
||||
cOP
|
||||
nOj
|
||||
wGa
|
||||
@@ -104044,7 +103981,7 @@ nFn
|
||||
uJB
|
||||
qsK
|
||||
pJE
|
||||
eFC
|
||||
uUl
|
||||
qXB
|
||||
xNv
|
||||
mqK
|
||||
@@ -106069,7 +106006,7 @@ bSr
|
||||
cfy
|
||||
oAa
|
||||
peF
|
||||
liO
|
||||
peF
|
||||
sSs
|
||||
gkM
|
||||
plL
|
||||
@@ -106087,7 +106024,7 @@ xpo
|
||||
lnc
|
||||
kMX
|
||||
ntS
|
||||
nwU
|
||||
wcr
|
||||
kvd
|
||||
mMx
|
||||
lUK
|
||||
|
||||
+341
-341
File diff suppressed because it is too large
Load Diff
@@ -19178,7 +19178,6 @@
|
||||
"cRX" = (
|
||||
/obj/machinery/light/directional/north,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/structure/closet/crate,
|
||||
/turf/open/floor/iron/dark/textured_large,
|
||||
/area/station/engineering/atmos)
|
||||
@@ -22803,7 +22802,7 @@
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/science/lower)
|
||||
"dsQ" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -27435,7 +27434,6 @@
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
@@ -29897,11 +29895,6 @@
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/security/checkpoint/engineering)
|
||||
"evk" = (
|
||||
/obj/machinery/atmospherics/components/unary/bluespace_sender,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/turf/open/floor/iron/dark/textured_large,
|
||||
/area/station/engineering/atmos)
|
||||
"evu" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/turf_decal/siding/purple{
|
||||
@@ -41973,17 +41966,6 @@
|
||||
/obj/effect/landmark/start/atmospheric_technician,
|
||||
/turf/open/floor/iron/dark/textured,
|
||||
/area/station/engineering/atmos/storage/gas)
|
||||
"gjm" = (
|
||||
/obj/effect/turf_decal/trimline/yellow/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/aft)
|
||||
"gjq" = (
|
||||
/obj/effect/turf_decal/trimline/red/line{
|
||||
dir = 8
|
||||
@@ -49330,7 +49312,6 @@
|
||||
/obj/effect/turf_decal/trimline/yellow/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/item/storage/medkit/fire,
|
||||
/obj/item/storage/belt/utility,
|
||||
/obj/item/lightreplacer{
|
||||
@@ -53156,8 +53137,9 @@
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/science/lobby)
|
||||
"hRb" = (
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/effect/turf_decal/box/red,
|
||||
/obj/vehicle/ridden/secway,
|
||||
/obj/item/key/security,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/customs)
|
||||
"hRc" = (
|
||||
@@ -54314,7 +54296,7 @@
|
||||
/area/station/security/prison)
|
||||
"hZu" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/iron/dark/textured_large,
|
||||
@@ -59784,7 +59766,7 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/station/maintenance/port/fore)
|
||||
"iPp" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow/half/contrasted{
|
||||
@@ -59948,7 +59930,6 @@
|
||||
/obj/machinery/light/directional/north,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/machinery/portable_atmospherics/canister,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron/dark/textured_large,
|
||||
/area/station/engineering/atmos)
|
||||
"iQC" = (
|
||||
@@ -76978,7 +76959,7 @@
|
||||
/turf/open/floor/iron/dark/herringbone,
|
||||
/area/station/commons/dorms)
|
||||
"lrn" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -82454,7 +82435,7 @@
|
||||
/turf/open/floor/iron/dark/textured,
|
||||
/area/station/command)
|
||||
"mkJ" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/machinery/button/door/directional/north{
|
||||
pixel_x = 6;
|
||||
id = "atmoslock";
|
||||
@@ -92518,7 +92499,7 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/service/hydroponics)
|
||||
"nNh" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/siding/thinplating_new/dark{
|
||||
dir = 5
|
||||
},
|
||||
@@ -96746,7 +96727,7 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/maintenance/starboard/central)
|
||||
"ork" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/bot{
|
||||
@@ -96996,9 +96977,10 @@
|
||||
/obj/effect/turf_decal/siding/thinplating_new/dark{
|
||||
dir = 6
|
||||
},
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe,
|
||||
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
|
||||
/obj/structure/cable,
|
||||
/obj/item/key/security,
|
||||
/obj/vehicle/ridden/secway,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/checkpoint/escape)
|
||||
"otz" = (
|
||||
@@ -100489,7 +100471,7 @@
|
||||
/turf/open/floor/iron/dark/textured,
|
||||
/area/station/service/library/lounge)
|
||||
"oSD" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/sign/poster/official/random/directional/south,
|
||||
@@ -106797,7 +106779,6 @@
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron/dark/textured,
|
||||
/area/station/engineering/engine_smes)
|
||||
"pMB" = (
|
||||
@@ -114526,7 +114507,7 @@
|
||||
/obj/effect/turf_decal/trimline/dark/corner{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/turf/open/floor/iron/dark/textured_corner{
|
||||
dir = 8
|
||||
},
|
||||
@@ -127467,19 +127448,6 @@
|
||||
/obj/structure/flora/bush/lavendergrass/style_random,
|
||||
/turf/open/misc/asteroid/airless,
|
||||
/area/space/nearstation)
|
||||
"sTz" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/trimline/purple/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/fore)
|
||||
"sTA" = (
|
||||
/obj/effect/turf_decal/siding/dark/corner{
|
||||
dir = 8
|
||||
@@ -142762,7 +142730,7 @@
|
||||
/area/station/science/ordnance/storage)
|
||||
"vgI" = (
|
||||
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/bot,
|
||||
@@ -145593,7 +145561,6 @@
|
||||
},
|
||||
/obj/item/radio/intercom/directional/east,
|
||||
/obj/structure/closet/crate/trashcart/laundry,
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/machinery/light/small/directional/east,
|
||||
/obj/effect/turf_decal/siding/dark_blue{
|
||||
dir = 8
|
||||
@@ -159391,7 +159358,6 @@
|
||||
"xJr" = (
|
||||
/obj/structure/rack,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/item/wallframe/digital_clock{
|
||||
pixel_y = 8
|
||||
},
|
||||
@@ -199186,7 +199152,7 @@ xBV
|
||||
qZz
|
||||
nzm
|
||||
iek
|
||||
evk
|
||||
bGE
|
||||
pbP
|
||||
qTF
|
||||
hVS
|
||||
@@ -261868,7 +261834,7 @@ fys
|
||||
ddf
|
||||
qkZ
|
||||
xAh
|
||||
gjm
|
||||
dIr
|
||||
oLT
|
||||
dIr
|
||||
jEG
|
||||
@@ -262346,7 +262312,7 @@ xiD
|
||||
wAV
|
||||
jmZ
|
||||
piW
|
||||
sTz
|
||||
jmZ
|
||||
prp
|
||||
vvZ
|
||||
qpN
|
||||
|
||||
@@ -30,11 +30,6 @@
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/station/maintenance/department/security)
|
||||
"n" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/station/maintenance/department/security)
|
||||
"o" = (
|
||||
/obj/effect/spawner/random/engineering/atmospherics_portable,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
@@ -144,7 +139,7 @@ p
|
||||
p
|
||||
p
|
||||
p
|
||||
n
|
||||
p
|
||||
v
|
||||
e
|
||||
"}
|
||||
|
||||
@@ -33,11 +33,6 @@
|
||||
/obj/structure/girder,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/station/maintenance/port/central)
|
||||
"T" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/station/maintenance/port/central)
|
||||
"U" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/rack,
|
||||
@@ -74,7 +69,7 @@ C
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
T
|
||||
Z
|
||||
Z
|
||||
Z
|
||||
Z
|
||||
|
||||
+1191
-1190
File diff suppressed because it is too large
Load Diff
@@ -2195,6 +2195,7 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/command/heads_quarters/hop)
|
||||
"aKi" = (
|
||||
@@ -2206,7 +2207,7 @@
|
||||
/turf/open/floor/catwalk_floor/iron_dark,
|
||||
/area/station/ai_monitored/turret_protected/aisat/uppersouth)
|
||||
"aKj" = (
|
||||
/obj/machinery/computer/station_alert/station_only{
|
||||
/obj/machinery/computer/station_alert{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/trimline/yellow/filled/line,
|
||||
@@ -10732,7 +10733,6 @@
|
||||
/obj/effect/turf_decal/tile/neutral/half{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 8
|
||||
},
|
||||
@@ -20275,14 +20275,6 @@
|
||||
/obj/effect/turf_decal/caution/stand_clear,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/mechbay)
|
||||
"haQ" = (
|
||||
/obj/machinery/duct,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/commons/locker)
|
||||
"hbb" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 5
|
||||
@@ -24649,6 +24641,7 @@
|
||||
/area/station/maintenance/department/cargo)
|
||||
"iCM" = (
|
||||
/obj/effect/spawner/random/engineering/tracking_beacon,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/lobby)
|
||||
"iCT" = (
|
||||
@@ -25445,13 +25438,6 @@
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/engineering/main)
|
||||
"iQS" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central)
|
||||
"iQZ" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
@@ -26024,7 +26010,6 @@
|
||||
/obj/structure/chair/sofa/bench/left{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/bluespace_vendor/directional/west,
|
||||
/turf/open/floor/iron/textured_large,
|
||||
/area/station/hallway/primary/central)
|
||||
"jcW" = (
|
||||
@@ -32935,6 +32920,7 @@
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/carpet/purple,
|
||||
/area/station/service/library)
|
||||
"lpF" = (
|
||||
@@ -34120,6 +34106,14 @@
|
||||
},
|
||||
/turf/open/floor/plating/elevatorshaft,
|
||||
/area/station/ai_monitored/turret_protected/aisat_interior)
|
||||
"lKN" = (
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/obj/effect/turf_decal/stripes/white/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/science/ordnance/testlab)
|
||||
"lKY" = (
|
||||
/turf/open/floor/iron/white/textured_large,
|
||||
/area/station/science/xenobiology)
|
||||
@@ -35250,6 +35244,10 @@
|
||||
},
|
||||
/turf/open/space/basic,
|
||||
/area/space)
|
||||
"mgz" = (
|
||||
/obj/machinery/holopad,
|
||||
/turf/closed/mineral/random/stationside/asteroid/porus,
|
||||
/area/station/asteroid)
|
||||
"mgH" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable,
|
||||
@@ -35351,7 +35349,7 @@
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/station/security/warden)
|
||||
"mio" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/atmos/upper)
|
||||
"mit" = (
|
||||
@@ -35548,6 +35546,7 @@
|
||||
"mld" = (
|
||||
/obj/effect/turf_decal/tile/red/opposingcorners,
|
||||
/obj/effect/landmark/event_spawn,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/brig/entrance)
|
||||
"mlf" = (
|
||||
@@ -38192,6 +38191,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron/white/textured_half{
|
||||
dir = 1
|
||||
},
|
||||
@@ -41188,6 +41188,7 @@
|
||||
/area/station/maintenance/department/bridge)
|
||||
"olR" = (
|
||||
/obj/effect/mapping_helpers/broken_floor,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/wood,
|
||||
/area/station/service/library)
|
||||
"olW" = (
|
||||
@@ -46230,7 +46231,7 @@
|
||||
/turf/open/misc/asteroid,
|
||||
/area/station/hallway/primary/starboard)
|
||||
"pVC" = (
|
||||
/obj/machinery/computer/station_alert/station_only,
|
||||
/obj/machinery/computer/station_alert,
|
||||
/obj/effect/turf_decal/tile/yellow/half/contrasted,
|
||||
/obj/machinery/light/directional/north,
|
||||
/turf/open/floor/iron/dark,
|
||||
@@ -49136,13 +49137,6 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/turf/open/floor/plating,
|
||||
/area/station/commons/vacant_room/commissary)
|
||||
"qXf" = (
|
||||
/obj/machinery/bluespace_vendor/directional/north,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/station/hallway/primary/central)
|
||||
"qXj" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
@@ -52272,6 +52266,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/command/heads_quarters/ce)
|
||||
"rWZ" = (
|
||||
@@ -52559,6 +52554,7 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/station/command/heads_quarters/hos)
|
||||
"sas" = (
|
||||
@@ -56534,6 +56530,7 @@
|
||||
/area/station/maintenance/department/cargo)
|
||||
"trz" = (
|
||||
/obj/effect/turf_decal/box/corners,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/atmos)
|
||||
"trK" = (
|
||||
@@ -59518,6 +59515,7 @@
|
||||
/area/station/engineering/main)
|
||||
"urh" = (
|
||||
/obj/effect/landmark/event_spawn,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron/white,
|
||||
/area/station/science/lab)
|
||||
"url" = (
|
||||
@@ -64393,10 +64391,6 @@
|
||||
/turf/open/floor/iron/large,
|
||||
/area/station/engineering/atmos/project)
|
||||
"wfN" = (
|
||||
/obj/machinery/atmospherics/components/unary/bluespace_sender{
|
||||
dir = 4;
|
||||
initialize_directions = 4
|
||||
},
|
||||
/turf/open/floor/iron/textured,
|
||||
/area/station/engineering/atmos)
|
||||
"wfW" = (
|
||||
@@ -66013,7 +66007,6 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/engineering/lobby)
|
||||
"wHj" = (
|
||||
/obj/machinery/bluespace_vendor/directional/south,
|
||||
/obj/structure/closet,
|
||||
/turf/open/floor/iron/textured,
|
||||
/area/station/hallway/primary/central)
|
||||
@@ -66440,6 +66433,7 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron,
|
||||
/area/station/security/office)
|
||||
"wPP" = (
|
||||
@@ -68239,6 +68233,7 @@
|
||||
"xvU" = (
|
||||
/obj/effect/landmark/event_spawn,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/iron/white/smooth_half,
|
||||
/area/station/medical/pharmacy)
|
||||
"xvZ" = (
|
||||
@@ -70481,6 +70476,7 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/station/cargo/storage)
|
||||
"ylj" = (
|
||||
/obj/machinery/holopad,
|
||||
/turf/open/floor/circuit,
|
||||
/area/station/science/robotics/lab)
|
||||
"ylm" = (
|
||||
@@ -93079,7 +93075,7 @@ iNT
|
||||
maY
|
||||
pgd
|
||||
rjX
|
||||
iQS
|
||||
kmu
|
||||
tHF
|
||||
tCE
|
||||
pXp
|
||||
@@ -93623,7 +93619,7 @@ cxD
|
||||
sWn
|
||||
kAg
|
||||
veW
|
||||
qXf
|
||||
kmu
|
||||
tOm
|
||||
tCE
|
||||
tCE
|
||||
@@ -101827,7 +101823,7 @@ xQH
|
||||
xQH
|
||||
cWD
|
||||
uzH
|
||||
haQ
|
||||
bIJ
|
||||
ahE
|
||||
ahE
|
||||
laL
|
||||
@@ -115177,7 +115173,7 @@ tLh
|
||||
dlE
|
||||
soW
|
||||
wqB
|
||||
rxn
|
||||
lKN
|
||||
rRO
|
||||
mIa
|
||||
moe
|
||||
@@ -174013,7 +174009,7 @@ hhX
|
||||
hhX
|
||||
hhX
|
||||
fYe
|
||||
mNZ
|
||||
mgz
|
||||
vfJ
|
||||
riv
|
||||
vpK
|
||||
|
||||
@@ -105,10 +105,8 @@
|
||||
dir = 4;
|
||||
id = "gimmemoney"
|
||||
},
|
||||
/turf/closed/indestructible/opsglass{
|
||||
desc = "A durable looking window made of an alloy of of plasma and titanium.";
|
||||
name = "plastitanium window"
|
||||
},
|
||||
/obj/effect/spawner/structure/window/reinforced/shuttle/indestructible,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape/luxury)
|
||||
"gL" = (
|
||||
/obj/effect/decal/cleanable/generic,
|
||||
@@ -905,7 +903,7 @@
|
||||
dir = 4;
|
||||
id = "gimmemoney"
|
||||
},
|
||||
/turf/closed/indestructible/syndicate,
|
||||
/turf/closed/indestructible/riveted/plastinum/nodiagonal,
|
||||
/area/shuttle/escape/luxury)
|
||||
"Ky" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
@@ -965,10 +963,8 @@
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/escape)
|
||||
"Mn" = (
|
||||
/turf/closed/indestructible/opsglass{
|
||||
desc = "A durable looking window made of an alloy of of plasma and titanium.";
|
||||
name = "plastitanium window"
|
||||
},
|
||||
/obj/effect/spawner/structure/window/reinforced/shuttle/indestructible,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape/luxury)
|
||||
"MX" = (
|
||||
/obj/structure/closet/crate/freezer,
|
||||
@@ -1191,17 +1187,13 @@
|
||||
/turf/open/floor/carpet/red,
|
||||
/area/shuttle/escape/luxury)
|
||||
"Xz" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape/luxury)
|
||||
/turf/closed/wall/mineral/plastitanium,
|
||||
/area/shuttle/escape)
|
||||
"Yb" = (
|
||||
/obj/effect/decal/cleanable/generic,
|
||||
/obj/item/shard,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/escape)
|
||||
"Yj" = (
|
||||
/turf/closed/indestructible/syndicate,
|
||||
/area/shuttle/escape/luxury)
|
||||
"Yo" = (
|
||||
/obj/machinery/light/directional/north,
|
||||
/turf/open/floor/carpet/blue,
|
||||
@@ -1266,7 +1258,7 @@ WO
|
||||
fH
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
JV
|
||||
Xz
|
||||
WO
|
||||
sC
|
||||
sC
|
||||
@@ -1285,10 +1277,10 @@ sC
|
||||
sC
|
||||
sC
|
||||
WO
|
||||
JV
|
||||
Xz
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
CQ
|
||||
JV
|
||||
sH
|
||||
KA
|
||||
PN
|
||||
@@ -1307,10 +1299,10 @@ JV
|
||||
OK
|
||||
MX
|
||||
OC
|
||||
CQ
|
||||
JV
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
CQ
|
||||
JV
|
||||
Tz
|
||||
Cf
|
||||
Bt
|
||||
@@ -1329,10 +1321,10 @@ oH
|
||||
kc
|
||||
JO
|
||||
et
|
||||
CQ
|
||||
JV
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
CQ
|
||||
JV
|
||||
KS
|
||||
rN
|
||||
Za
|
||||
@@ -1351,10 +1343,10 @@ JV
|
||||
Sy
|
||||
EL
|
||||
Fq
|
||||
CQ
|
||||
JV
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
CQ
|
||||
JV
|
||||
KS
|
||||
dM
|
||||
rN
|
||||
@@ -1373,7 +1365,7 @@ JV
|
||||
kG
|
||||
dN
|
||||
dN
|
||||
CQ
|
||||
JV
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
JV
|
||||
@@ -1395,7 +1387,7 @@ Wp
|
||||
Br
|
||||
eb
|
||||
vj
|
||||
CQ
|
||||
JV
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
JV
|
||||
@@ -1417,7 +1409,7 @@ yk
|
||||
kJ
|
||||
iS
|
||||
ur
|
||||
CQ
|
||||
JV
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
jy
|
||||
@@ -1451,17 +1443,17 @@ Ex
|
||||
Ex
|
||||
Ex
|
||||
Ex
|
||||
Yj
|
||||
Ex
|
||||
gG
|
||||
gG
|
||||
gG
|
||||
gG
|
||||
Yj
|
||||
Ex
|
||||
gG
|
||||
gG
|
||||
gG
|
||||
Kw
|
||||
Yj
|
||||
Ex
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
DE
|
||||
@@ -1696,8 +1688,8 @@ SN
|
||||
oP
|
||||
Ex
|
||||
kM
|
||||
Xz
|
||||
Xz
|
||||
Mn
|
||||
Mn
|
||||
kM
|
||||
Ex
|
||||
Ex
|
||||
@@ -1729,13 +1721,13 @@ Ex
|
||||
"}
|
||||
(23,1,1) = {"
|
||||
Ex
|
||||
Xz
|
||||
Mn
|
||||
KJ
|
||||
KJ
|
||||
Xz
|
||||
Mn
|
||||
Ex
|
||||
qm
|
||||
Xz
|
||||
Mn
|
||||
qm
|
||||
Ex
|
||||
Ex
|
||||
|
||||
@@ -6007,7 +6007,6 @@
|
||||
/area/virtual_domain)
|
||||
"YB" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/machinery/bluespace_vendor/directional/east,
|
||||
/obj/structure/frame/machine/secured,
|
||||
/turf/open/floor/iron,
|
||||
/area/virtual_domain)
|
||||
|
||||
@@ -239,12 +239,14 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN
|
||||
#define ZAP_SUPERMATTER_FLAGS ZAP_GENERATES_POWER
|
||||
|
||||
///EMP will protect itself.
|
||||
///Object will protect itself.
|
||||
#define EMP_PROTECT_SELF (1<<0)
|
||||
///EMP will protect the contents from also being EMPed.
|
||||
///Object will protect its contents from being EMPed.
|
||||
#define EMP_PROTECT_CONTENTS (1<<1)
|
||||
///EMP will protect the wires.
|
||||
///Object will protect its wiring from being EMPed.
|
||||
#define EMP_PROTECT_WIRES (1<<2)
|
||||
///Don't indicate EMP protection in object examine text.
|
||||
#define EMP_NO_EXAMINE (1<<3)
|
||||
|
||||
///Protects against all EMP types.
|
||||
#define EMP_PROTECT_ALL (EMP_PROTECT_SELF | EMP_PROTECT_CONTENTS | EMP_PROTECT_WIRES)
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#define IMMUNE_TO_GETTING_WET (1<<5)
|
||||
/// Disables the function of attacking random body zones
|
||||
#define PRECISE_ATTACK_ZONES (1<<6)
|
||||
/// People would be sad to see this mob die
|
||||
#define SENDS_DEATH_MOODLETS (1<<7)
|
||||
|
||||
/// Temporary trait applied when an attack forecast animation has completed
|
||||
#define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast"
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
#define MATCONTAINER_BLOCK_INSERT (1<<1)
|
||||
/// Called from datum/component/material_container/proc/insert_item() : (item, primary_mat, mats_consumed, material_amount, context)
|
||||
#define COMSIG_MATCONTAINER_ITEM_CONSUMED "matcontainer_item_consumed"
|
||||
/// Called from datum/component/material_container/proc/retrieve_sheets() : (new_sheets, context)
|
||||
#define COMSIG_MATCONTAINER_SHEETS_RETRIEVED "matcontainer_sheets_retrieved"
|
||||
/// Called from datum/component/material_container/proc/retrieve_stack() : (new_stack, context)
|
||||
#define COMSIG_MATCONTAINER_STACK_RETRIEVED "matcontainer_stack_retrieved"
|
||||
|
||||
//mat container signals but from the ore silo's perspective
|
||||
/// Called from /obj/machinery/ore_silo/on_item_consumed() : (container, item_inserted, last_inserted_id, mats_consumed, amount_inserted)
|
||||
|
||||
@@ -355,3 +355,8 @@
|
||||
|
||||
/// From /mob/living/update_offsets(animate) : (new_x, new_y, new_w, new_z, animate)
|
||||
#define COMSIG_LIVING_UPDATE_OFFSETS "living_update_offsets"
|
||||
|
||||
/// From /datum/element/death_drops/on_death(mob/living/target, gibbed) : (list/loot, gibbed)
|
||||
#define COMSIG_LIVING_DROP_LOOT "living_drop_loot"
|
||||
/// Prevent loot from being dropped
|
||||
#define COMPONENT_NO_LOOT_DROP (1<<0)
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
|
||||
///signal sent when a mob has their holy role set. Sent to the mob having their role changed.
|
||||
#define COMSIG_MOB_MIND_SET_HOLY_ROLE "mob_mind_set_holy_role"
|
||||
///signal sent when a mob has their job role set. Sent to the mob having their role changed.
|
||||
#define COMSIG_MOB_MIND_SET_ROLE "mob_mind_set_role"
|
||||
|
||||
///from base of obj/allowed(mob/M): (/obj) returns ACCESS_ALLOWED if mob has id access to the obj
|
||||
#define COMSIG_MOB_TRIED_ACCESS "tried_access"
|
||||
|
||||
@@ -32,10 +32,14 @@
|
||||
#define MOD_ABORT_USE (1<<0)
|
||||
/// Called when a module activates, after all checks have passed and cooldown started.
|
||||
#define COMSIG_MODULE_ACTIVATED "mod_module_activated"
|
||||
/// Called when a module successfully activates on the MODsuit itself
|
||||
#define COMSIG_MOD_MODULE_ACTIVATED "mod_core_module_activated"
|
||||
/// Called when a module starts a cooldown until its next activation. Passed the cooldown time.
|
||||
#define COMSIG_MODULE_COOLDOWN_STARTED "mod_module_cooldown_started"
|
||||
/// Called when a module deactivates, after all checks have passed.
|
||||
#define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated"
|
||||
/// Called when a module successfully deactivates on the mod itself
|
||||
#define COMSIG_MOD_MODULE_DEACTIVATED "mod_core_module_deactivated"
|
||||
/// Called when a module is used, after all checks have passed and cooldown started.
|
||||
#define COMSIG_MODULE_USED "mod_module_used"
|
||||
/// Called when the MODsuit wearer is set.
|
||||
|
||||
@@ -136,17 +136,6 @@ GLOBAL_LIST_INIT(food_quality_description, list(
|
||||
FOOD_QUALITY_TOP = "godlike",
|
||||
))
|
||||
|
||||
/// Mood events for food quality
|
||||
GLOBAL_LIST_INIT(food_quality_events, list(
|
||||
FOOD_QUALITY_NORMAL = /datum/mood_event/food,
|
||||
FOOD_QUALITY_NICE = /datum/mood_event/food/nice,
|
||||
FOOD_QUALITY_GOOD = /datum/mood_event/food/good,
|
||||
FOOD_QUALITY_VERYGOOD = /datum/mood_event/food/verygood,
|
||||
FOOD_QUALITY_FANTASTIC = /datum/mood_event/food/fantastic,
|
||||
FOOD_QUALITY_AMAZING = /datum/mood_event/food/amazing,
|
||||
FOOD_QUALITY_TOP = /datum/mood_event/food/top,
|
||||
))
|
||||
|
||||
/// Weighted lists of crafted food buffs randomly given according to crafting_complexity unless the food has a specific buff
|
||||
GLOBAL_LIST_INIT(food_buffs, list(
|
||||
FOOD_COMPLEXITY_1 = list(
|
||||
|
||||
@@ -271,7 +271,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
|
||||
|
||||
#define ispickedupmob(A) (istype(A, /obj/item/mob_holder)) // Checks if clothing item is actually a held mob
|
||||
|
||||
#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash) || istype(A, /obj/item/holochip))
|
||||
#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash) || istype(A, /obj/item/holochip) || istype(A, /obj/item/poker_chip))
|
||||
|
||||
#define isbodypart(A) (istype(A, /obj/item/bodypart))
|
||||
|
||||
|
||||
@@ -323,3 +323,5 @@ DEFINE_BITFIELD(job_flags, list(
|
||||
|
||||
/// Mind traits that should be shared by every head of staff. has to be this way cause byond lists lol
|
||||
#define HEAD_OF_STAFF_MIND_TRAITS TRAIT_FAST_TYING, TRAIT_HIGH_VALUE_RANSOM
|
||||
#define MEDICAL_MIND_TRAITS TRAIT_DESENSITIZED
|
||||
#define SECURITY_MIND_TRAITS TRAIT_DESENSITIZED
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#define COMSIG_KB_CLIENT_SCREENSHOT_DOWN "keybinding_client_screenshot_down"
|
||||
#define COMSIG_KB_CLIENT_FULLSCREEN_DOWN "keybinding_client_fullscreen_down"
|
||||
#define COMSIG_KB_CLIENT_MINIMALHUD_DOWN "keybinding_client_minimalhud_down"
|
||||
#define COMSIG_KB_CLIENT_CLOSEUI_DOWN "keybinding_client_closeui_down"
|
||||
|
||||
//Communication
|
||||
|
||||
|
||||
@@ -157,3 +157,17 @@
|
||||
#define SD_PICTURE 3
|
||||
/// Shows whoever or whatever is on the green screen in the captain's office
|
||||
#define SD_GREENSCREEN 4
|
||||
|
||||
// Status display priority levels (higher number = higher priority)
|
||||
/// Logo display - lowest priority, just the default NT logo
|
||||
#define DISPLAY_PRIORITY_LOGO 0
|
||||
/// Manual message from bridge communications console
|
||||
#define DISPLAY_PRIORITY_MESSAGE 10
|
||||
/// Security alert level (shows for 30 seconds then goes back to normal)
|
||||
#define DISPLAY_PRIORITY_ALERT_TEMP 20
|
||||
/// Emergency stuff like radiation storms, lockdowns, biohazard alerts
|
||||
#define DISPLAY_PRIORITY_EMERGENCY 30
|
||||
/// Shuttle countdown - highest priority because people need to know when to evacuate
|
||||
#define DISPLAY_PRIORITY_SHUTTLE 40
|
||||
/// Emergency alerts that temporarily interrupt even shuttle displays (30 seconds then revert)
|
||||
#define DISPLAY_PRIORITY_EMERGENCY_TEMP 50
|
||||
|
||||
@@ -90,6 +90,8 @@ DEFINE_BITFIELD(spell_requirements, list(
|
||||
/// Holy magic resistance that blocks unholy magic (revenant, vampire, voice of god)
|
||||
#define MAGIC_RESISTANCE_HOLY (1<<2)
|
||||
|
||||
#define ALL_MAGIC_RESISTANCE (MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND|MAGIC_RESISTANCE_HOLY)
|
||||
|
||||
DEFINE_BITFIELD(antimagic_flags, list(
|
||||
"MAGIC_RESISTANCE" = MAGIC_RESISTANCE,
|
||||
"MAGIC_RESISTANCE_HOLY" = MAGIC_RESISTANCE_HOLY,
|
||||
|
||||
@@ -75,3 +75,26 @@
|
||||
#define PANIC_ATTACK_TERROR_AMOUNT 50
|
||||
/// How much terror being hugged reduces, or increases if its done by a nightmare or someone you're afraid of
|
||||
#define HUG_TERROR_AMOUNT 90
|
||||
|
||||
/// Relates to fear or resisting fear
|
||||
#define MOOD_EVENT_FEAR (1<<0)
|
||||
/// Relates to art
|
||||
#define MOOD_EVENT_ART (1<<1)
|
||||
/// Relates to being a generally silly guy
|
||||
#define MOOD_EVENT_WHIMSY (1<<2)
|
||||
/// Playing games and goofing off
|
||||
#define MOOD_EVENT_GAMING (1<<3)
|
||||
/// Relates to food
|
||||
#define MOOD_EVENT_FOOD (1<<4)
|
||||
/// Relates to being in pain
|
||||
#define MOOD_EVENT_PAIN (1<<5)
|
||||
/// Relates to spirituality
|
||||
#define MOOD_EVENT_SPIRITUAL (1<<6)
|
||||
|
||||
/// Checks if the mob has the given personality typepath
|
||||
#define HAS_PERSONALITY(mob, personality) (LAZYACCESS(mob.personalities, personality))
|
||||
|
||||
/// Return from /be_replaced or /be_refreshed to actually go prevent the new mood event from being added
|
||||
#define BLOCK_NEW_MOOD FALSE
|
||||
/// Return from /be_replaced or /be_refreshed to actually go through and allow the new mood event to be added
|
||||
#define ALLOW_NEW_MOOD TRUE
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
//Special properties
|
||||
///If the holder is a sealed container - Used if you don't want reagent contents boiling out (plasma, specifically, in which case it only bursts out when at ignition temperatures)
|
||||
#define SEALED_CONTAINER (1<<10)
|
||||
/// Prevents spilling and splashing but does prevent pouring and drinking reagents like the badly named spillable var.
|
||||
#define SMART_CAP (1<<11)
|
||||
/// Prevents splashing for open reagent containers
|
||||
#define NO_SPLASH (1<<11)
|
||||
// Is an open container for all intents and purposes.
|
||||
#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
|
||||
|
||||
|
||||
@@ -250,6 +250,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define TRAIT_EASILY_WOUNDED "easy_limb_wound"
|
||||
#define TRAIT_HARDLY_WOUNDED "hard_limb_wound"
|
||||
#define TRAIT_NEVER_WOUNDED "never_wounded"
|
||||
/// Mobs with this trait do not apply a damage cap to their potential considered wounding damage, resulting in extremely high wounding effects.
|
||||
#define TRAIT_BLOODY_MESS "bloody_mess"
|
||||
/// Species with this trait have 50% extra chance of bleeding from piercing and slashing wounds
|
||||
#define TRAIT_EASYBLEED "easybleed"
|
||||
/// Mob recovers from addictions at an accelerated rate
|
||||
@@ -431,7 +433,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define TRAIT_UNSTABLE "unstable"
|
||||
#define TRAIT_OIL_FRIED "oil_fried"
|
||||
#define TRAIT_MEDICAL_HUD "med_hud"
|
||||
#define TRAIT_MEDICAL_HUD_SENSOR_ONLY "med_hud_lesser"
|
||||
#define TRAIT_SECURITY_HUD "sec_hud"
|
||||
#define TRAIT_SECURITY_HUD_ID_ONLY "sec_hud_lesser"
|
||||
#define TRAIT_ABDUCTOR_HUD "abductor_hud"
|
||||
/// Stop the user from seeing the sechud. Only works for trait handled sechuds.
|
||||
#define TRAIT_BLOCK_SECHUD "block_sechud"
|
||||
/// for something granting you a diagnostic hud
|
||||
#define TRAIT_DIAGNOSTIC_HUD "diag_hud"
|
||||
#define TRAIT_BOT_PATH_HUD "bot_path_hud"
|
||||
@@ -510,7 +517,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
/// Prevents a mob from being unbuckled, currently only used to prevent people from falling over on the tram
|
||||
#define TRAIT_CANNOT_BE_UNBUCKLED "cannot_be_unbuckled"
|
||||
/// from heparin and nitrous oxide, makes open bleeding wounds rapidly spill more blood
|
||||
#define TRAIT_BLOODY_MESS "bloody_mess"
|
||||
#define TRAIT_BLOOD_FOUNTAIN "bloody_fountain"
|
||||
/// from coagulant reagents, this doesn't affect the bleeding itself but does affect the bleed warning messages
|
||||
#define TRAIT_COAGULATING "coagulating"
|
||||
/// From anti-convulsant medication against seizures.
|
||||
@@ -1176,8 +1183,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
///generic atom traits
|
||||
/// Trait from [/datum/element/rust]. Its rusty and should be applying a special overlay to denote this.
|
||||
#define TRAIT_RUSTY "rust_trait"
|
||||
/// Stops someone from splashing their reagent_container on an object with this trait
|
||||
#define TRAIT_DO_NOT_SPLASH "do_not_splash"
|
||||
/// Marks an atom when the cleaning of it is first started, so that the cleaning overlay doesn't get removed prematurely
|
||||
#define TRAIT_CURRENTLY_CLEANING "currently_cleaning"
|
||||
/// Objects with this trait are deleted if they fall into chasms, rather than entering abstract storage
|
||||
@@ -1477,8 +1482,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
///Trait given to atoms currently affected by projectile dampeners
|
||||
#define TRAIT_GOT_DAMPENED "got_dampened"
|
||||
|
||||
/// humans with this trait will have their health visible to AIs without suit
|
||||
#define HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT "hmsensorsvisiblewithoutsuit"
|
||||
/// Having this trait allows the basic health hud to show up for this mob
|
||||
#define TRAIT_BASIC_HEALTH_HUD_VISIBLE "basic_health_hud_visible"
|
||||
/// Apply to movables to say "hey, this movable is technically flat on the floor, so it'd be mopped up by a mop"
|
||||
#define TRAIT_MOPABLE "mopable"
|
||||
|
||||
@@ -1565,6 +1570,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
/// Trait that allows an item to perform holy rites akin to a nullrod
|
||||
#define TRAIT_NULLROD_ITEM "nullrod_item"
|
||||
|
||||
/// Mob gets far less severe negative moodlets from seeing death / blood
|
||||
#define TRAIT_DESENSITIZED "desensitized"
|
||||
|
||||
/// Trait specifying that an AI has a remote connection to an integrated circuit
|
||||
#define TRAIT_CONNECTED_TO_CIRCUIT "connected_to_circuit"
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#define JOB_TRAIT "job"
|
||||
/// Any traits granted by quirks.
|
||||
#define QUIRK_TRAIT "quirk_trait"
|
||||
/// Trait source for personality traits
|
||||
#define PERSONALITY_TRAIT "personality_trait"
|
||||
/// (B)admins only.
|
||||
#define ADMIN_TRAIT "admin"
|
||||
/// Any traits given through a smite.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
// ~wound damage/rolling defines
|
||||
/// the cornerstone of the wound threshold system, your base wound roll for any attack is rand(1, damage^this), after armor reduces said damage. See [/obj/item/bodypart/proc/check_wounding]
|
||||
#define WOUND_DAMAGE_EXPONENT 1.4
|
||||
/// any damage dealt over this is ignored for damage rolls unless the target has the frail quirk (25^1.4=91, for reference)
|
||||
/// any damage dealt over this is ignored for damage rolls unless the target has the frail quirk (25^1.4=91, for reference). Does not apply if the mob has TRAIT_BLOODY_MESS.
|
||||
/// This is further affected by TRAIT_EASILY_WOUNDED increasing the max considered damage (before applying the exponent) by 50%, and TRAIT_HARDLY_WOUNDED reducing it by 50%.
|
||||
#define WOUND_MAX_CONSIDERED_DAMAGE 25
|
||||
/// an attack must do this much damage after armor in order to roll for being a wound (so pressure damage/being on fire doesn't proc it)
|
||||
#define WOUND_MINIMUM_DAMAGE 5
|
||||
@@ -256,7 +257,7 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list(
|
||||
* severity_max to the highest wound you're willing to tolerate, and severity_pick_mode to WOUND_PICK_LOWEST_SEVERITY.
|
||||
*
|
||||
* Args:
|
||||
* * list/wounding_types: A list of wounding_types. Only wounds that accept these wound types will be considered.
|
||||
* * wounding_type: Wounding type wounds of which we should be searching for
|
||||
* * obj/item/bodypart/part: The limb we are considering. Extremely important for biostates.
|
||||
* * severity_min: The minimum wound severity we will search for.
|
||||
* * severity_max = severity_min: The maximum wound severity we will search for.
|
||||
@@ -268,12 +269,10 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list(
|
||||
* Returns:
|
||||
* A randomly picked wound typepath meeting all the above criteria and being applicable to the part's biotype - or null if there were none.
|
||||
*/
|
||||
/proc/get_corresponding_wound_type(list/wounding_types, obj/item/bodypart/part, severity_min, severity_max = severity_min, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, random_roll = TRUE, duplicates_allowed = FALSE, care_about_existing_wounds = TRUE)
|
||||
/proc/get_corresponding_wound_type(wounding_type, obj/item/bodypart/part, severity_min, severity_max = severity_min, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, random_roll = TRUE, duplicates_allowed = FALSE, care_about_existing_wounds = TRUE)
|
||||
RETURN_TYPE(/datum/wound) // note that just because its set to return this doesnt mean its non-nullable
|
||||
|
||||
var/list/wounding_type_list = list()
|
||||
for (var/wounding_type in wounding_types)
|
||||
wounding_type_list += GLOB.wounding_types_to_series[wounding_type]
|
||||
var/list/wounding_type_list = GLOB.wounding_types_to_series[wounding_type]
|
||||
if (!length(wounding_type_list))
|
||||
return null
|
||||
|
||||
@@ -298,7 +297,7 @@ GLOBAL_LIST_INIT(wounding_types_to_series, list(
|
||||
|
||||
for (var/datum/wound/iterated_path as anything in wound_typepaths)
|
||||
var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_path]
|
||||
if (pregen_data.can_be_applied_to(part, wounding_types, random_roll = random_roll, duplicates_allowed = duplicates_allowed, care_about_existing_wounds = care_about_existing_wounds))
|
||||
if (pregen_data.can_be_applied_to(part, wounding_type, random_roll = random_roll, duplicates_allowed = duplicates_allowed, care_about_existing_wounds = care_about_existing_wounds))
|
||||
paths_to_pick_from[iterated_path] = wound_typepaths[iterated_path]
|
||||
|
||||
return pick_weight(paths_to_pick_from) // we found our winners!
|
||||
|
||||
@@ -8,7 +8,7 @@ GLOBAL_LIST_INIT(master_filter_info, list(
|
||||
"y" = 0,
|
||||
"icon" = ICON_NOT_SET,
|
||||
"render_source" = "",
|
||||
"flags" = 0
|
||||
"flags" = NONE
|
||||
),
|
||||
"flags" = list(
|
||||
"MASK_INVERSE" = MASK_INVERSE,
|
||||
@@ -30,14 +30,20 @@ GLOBAL_LIST_INIT(master_filter_info, list(
|
||||
"alpha" = 255
|
||||
)
|
||||
),
|
||||
// Not implemented, but if this isn't uncommented some windows will just error
|
||||
// Not fully implemented, but if this isn't uncommented some windows will just error
|
||||
// Needs either a proper matrix editor, or just a hook to our existing one
|
||||
// Issue is filterrific assumes variables will have the same value type if they share the same name, which this violates
|
||||
// Gotta refactor this sometime
|
||||
"color" = list(
|
||||
"defaults" = list(
|
||||
"color" = matrix(),
|
||||
"space" = FILTER_COLOR_RGB
|
||||
),
|
||||
"options" = list(
|
||||
"space" = list(
|
||||
"FILTER_COLOR_RGB" = FILTER_COLOR_RGB,
|
||||
"FILTER_COLOR_HSV" = FILTER_COLOR_HSV,
|
||||
"FILTER_COLOR_HSL" = FILTER_COLOR_HSL,
|
||||
"FILTER_COLOR_HCY" = FILTER_COLOR_HCY
|
||||
)
|
||||
)
|
||||
),
|
||||
"displace" = list(
|
||||
@@ -46,7 +52,11 @@ GLOBAL_LIST_INIT(master_filter_info, list(
|
||||
"y" = 0,
|
||||
"size" = null,
|
||||
"icon" = ICON_NOT_SET,
|
||||
"render_source" = ""
|
||||
"render_source" = "",
|
||||
"flags" = NONE
|
||||
),
|
||||
"flags" = list(
|
||||
"FILTER_OVERLAY" = FILTER_OVERLAY
|
||||
)
|
||||
),
|
||||
"drop_shadow" = list(
|
||||
@@ -70,10 +80,24 @@ GLOBAL_LIST_INIT(master_filter_info, list(
|
||||
"icon" = ICON_NOT_SET,
|
||||
"render_source" = "",
|
||||
"flags" = FILTER_OVERLAY,
|
||||
"color" = "",
|
||||
"color" = COLOR_WHITE,
|
||||
"transform" = null,
|
||||
"blend_mode" = BLEND_DEFAULT
|
||||
),
|
||||
"flags" = list(
|
||||
"FILTER_OVERLAY" = FILTER_OVERLAY,
|
||||
),
|
||||
"options" = list(
|
||||
"blend_mode" = list(
|
||||
"BLEND_DEFAULT" = BLEND_DEFAULT,
|
||||
"BLEND_OVERLAY" = BLEND_OVERLAY,
|
||||
"BLEND_ADD" = BLEND_ADD,
|
||||
"BLEND_SUBTRACT" = BLEND_SUBTRACT,
|
||||
"BLEND_MULTIPLY" = BLEND_MULTIPLY,
|
||||
"BLEND_INSET_OVERLAY" = BLEND_INSET_OVERLAY
|
||||
)
|
||||
)
|
||||
|
||||
),
|
||||
"motion_blur" = list(
|
||||
"defaults" = list(
|
||||
|
||||
@@ -173,7 +173,6 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list(
|
||||
/obj/item/radio/intercom,
|
||||
/obj/structure/secure_safe,
|
||||
/obj/machinery/airalarm,
|
||||
/obj/machinery/bluespace_vendor,
|
||||
/obj/machinery/button,
|
||||
/obj/machinery/computer/security/telescreen,
|
||||
/obj/machinery/computer/security/telescreen/entertainment,
|
||||
|
||||
@@ -1370,3 +1370,26 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects)
|
||||
copy.underlays = underlays_to_keep
|
||||
|
||||
return copy
|
||||
|
||||
/// Returns the (isolated) security HUD icon for the given job.
|
||||
/proc/get_job_hud_icon(datum/job/job) as /icon
|
||||
var/static/alist/icon_cache = alist()
|
||||
if(isnull(job))
|
||||
return
|
||||
|
||||
if(!is_job(job))
|
||||
if(ispath(job, /datum/job))
|
||||
job = SSjob.get_job_type(job)
|
||||
else if(istext(job))
|
||||
job = SSjob.get_job(job)
|
||||
if(isnull(job))
|
||||
return null
|
||||
|
||||
//add it to the cache if it isn't already
|
||||
var/job_type = job.type
|
||||
if(!icon_cache[job_type])
|
||||
var/icon/sechud_icon = job.get_lobby_icon()
|
||||
sechud_icon.Crop(1, 17, 8, 24)
|
||||
icon_cache[job_type] = sechud_icon
|
||||
|
||||
return icon(icon_cache[job_type])
|
||||
|
||||
@@ -900,3 +900,20 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
else
|
||||
. = invoked_callback.Invoke()
|
||||
usr = temp
|
||||
|
||||
/**
|
||||
* Iterates over all mobs that can see the passed movable and adds specific mood events to them based on their personalities.
|
||||
*
|
||||
* * source: String source for the mood event
|
||||
* * personality_to_mood: A list mapping personality types to mood event types. Example: list(/datum/personality/chill = /datum/mood_event/chill_guy)
|
||||
* * range: The range in which to check for viewers. Default is view range.
|
||||
* * additional args may be supplied to pass into the mood event constructor.
|
||||
*/
|
||||
/proc/add_personality_mood_to_viewers(atom/movable/source, mood_key, list/personality_to_mood, range, ...)
|
||||
for(var/mob/living/nearby in viewers(range, source))
|
||||
if(nearby.stat >= UNCONSCIOUS || nearby.is_blind())
|
||||
continue
|
||||
for(var/personality in personality_to_mood)
|
||||
if(HAS_PERSONALITY(nearby, personality))
|
||||
nearby.add_mood_event(arglist( list("[mood_key]_[personality]", personality_to_mood[personality]) + args.Copy(4) ))
|
||||
break
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#define UPDATE_TRANSFORM_ANIMATION_TIME (0.2 SECONDS)
|
||||
|
||||
///Animates source spinning around itself. For docmentation on the args, check atom/proc/SpinAnimation()
|
||||
/atom/proc/do_spin_animation(speed = 1 SECONDS, loops = -1, segments = 3, angle = 120, parallel = TRUE)
|
||||
/atom/proc/do_spin_animation(speed = 1 SECONDS, loops = -1, segments = 3, angle = 120, parallel = TRUE, tag = null)
|
||||
var/list/matrices = list()
|
||||
for(var/i in 1 to segments-1)
|
||||
var/matrix/segment_matrix = matrix(transform)
|
||||
@@ -44,7 +44,7 @@
|
||||
speed /= segments
|
||||
|
||||
if(parallel)
|
||||
animate(src, transform = matrices[1], time = speed, loop = loops, flags = ANIMATION_PARALLEL)
|
||||
animate(src, transform = matrices[1], time = speed, loop = loops, flags = ANIMATION_PARALLEL, tag = tag)
|
||||
else
|
||||
animate(src, transform = matrices[1], time = speed, loop = loops)
|
||||
for(var/i in 2 to segments) //2 because 1 is covered above
|
||||
@@ -78,15 +78,16 @@
|
||||
* * clockwise: whether the atom ought to spin clockwise or counter-clockwise
|
||||
* * segments: in how many animate calls the rotation is split. Probably unnecessary, but you shouldn't set it lower than 3 anyway.
|
||||
* * parallel: whether the animation calls have the ANIMATION_PARALLEL flag, necessary for it to run alongside concurrent animations.
|
||||
* * tag: animation tag to use, for parralel animations only
|
||||
*/
|
||||
/atom/proc/SpinAnimation(speed = 1 SECONDS, loops = -1, clockwise = TRUE, segments = 3, parallel = TRUE)
|
||||
/atom/proc/SpinAnimation(speed = 1 SECONDS, loops = -1, clockwise = TRUE, segments = 3, parallel = TRUE, tag = null)
|
||||
if(!segments)
|
||||
return
|
||||
var/segment = 360/segments
|
||||
if(!clockwise)
|
||||
segment = -segment
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_SPIN_ANIMATION, speed, loops, segments, segment)
|
||||
do_spin_animation(speed, loops, segments, segment, parallel)
|
||||
do_spin_animation(speed, loops, segments, segment, parallel, tag)
|
||||
|
||||
/// Makes this atom look like a "hologram"
|
||||
/// So transparent, blue, with a scanline and an emissive glow
|
||||
|
||||
@@ -112,7 +112,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items
|
||||
/obj/item/stack/sheet/iron/twenty = 1,
|
||||
/obj/item/stack/sheet/mineral/plasma = 1,
|
||||
/obj/item/stock_parts/power_store/cell = 1,
|
||||
|
||||
/obj/effect/spawner/random/engineering/vending_restock = 1,
|
||||
//assemblies
|
||||
/obj/item/assembly/health = 1,
|
||||
/obj/item/assembly/igniter = 1,
|
||||
|
||||
@@ -7,25 +7,24 @@
|
||||
|
||||
GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
/atom = list(
|
||||
"TRAIT_AI_PAUSED" = TRAIT_AI_PAUSED,
|
||||
"TRAIT_AI_MOVEMENT_HALTED" = TRAIT_AI_MOVEMENT_HALTED,
|
||||
"TRAIT_AI_PAUSED" = TRAIT_AI_PAUSED,
|
||||
"TRAIT_BANNED_FROM_CARGO_SHUTTLE" = TRAIT_BANNED_FROM_CARGO_SHUTTLE,
|
||||
"TRAIT_BEAUTY_APPLIED" = TRAIT_BEAUTY_APPLIED,
|
||||
"TRAIT_BEING_SHOCKED" = TRAIT_BEING_SHOCKED,
|
||||
"TRAIT_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE,
|
||||
"TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED,
|
||||
"TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE,
|
||||
"TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED,
|
||||
"TRAIT_CURRENTLY_CLEANING" = TRAIT_CURRENTLY_CLEANING,
|
||||
"TRAIT_DO_NOT_SPLASH" = TRAIT_DO_NOT_SPLASH,
|
||||
"TRAIT_DRIED" = TRAIT_DRIED,
|
||||
"TRAIT_DRYABLE" = TRAIT_DRYABLE,
|
||||
"TRAIT_ELEVATING_OBJECT" = TRAIT_ELEVATING_OBJECT,
|
||||
"TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT,
|
||||
"TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE,
|
||||
"TRAIT_FOOD_FRIED" = TRAIT_FOOD_FRIED,
|
||||
"TRAIT_FOOD_SILVER" = TRAIT_FOOD_SILVER,
|
||||
"TRAIT_GOT_DAMPENED" = TRAIT_GOT_DAMPENED,
|
||||
"TRAIT_INGREDIENTS_HOLDER" = TRAIT_INGREDIENTS_HOLDER,
|
||||
"TRAIT_FOOD_SILVER" = TRAIT_FOOD_SILVER,
|
||||
"TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER,
|
||||
"TRAIT_LIGHTING_DEBUGGED" = TRAIT_LIGHTING_DEBUGGED,
|
||||
"TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION" = TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION,
|
||||
@@ -158,6 +157,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED,
|
||||
),
|
||||
/mob = list(
|
||||
"TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD,
|
||||
"TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING,
|
||||
"TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING,
|
||||
"TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST,
|
||||
@@ -193,19 +193,21 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY,
|
||||
"TRAIT_BLOCKING_PROJECTILES" = TRAIT_BLOCKING_PROJECTILES,
|
||||
"TRAIT_BLOCK_FORMALDEHYDE_METABOLISM" = TRAIT_BLOCK_FORMALDEHYDE_METABOLISM,
|
||||
"TRAIT_BLOCK_SECHUD" = TRAIT_BLOCK_SECHUD,
|
||||
"TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT,
|
||||
"TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES,
|
||||
"TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS,
|
||||
"TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS,
|
||||
"TRAIT_BLOOD_FOUNTAIN" = TRAIT_BLOOD_FOUNTAIN,
|
||||
"TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE,
|
||||
"TRAIT_BONSAI" = TRAIT_BONSAI,
|
||||
"TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER,
|
||||
"TRAIT_BORN_MONKEY" = TRAIT_BORN_MONKEY,
|
||||
"TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD,
|
||||
"TRAIT_BOXING_READY" = TRAIT_BOXING_READY,
|
||||
"TRAIT_BUGKILLER_DEATH" = TRAIT_BUGKILLER_DEATH,
|
||||
"TRAIT_BRAINWASHING" = TRAIT_BRAINWASHING,
|
||||
"TRAIT_BRAWLING_KNOCKDOWN_BLOCKED" = TRAIT_BRAWLING_KNOCKDOWN_BLOCKED,
|
||||
"TRAIT_BUGKILLER_DEATH" = TRAIT_BUGKILLER_DEATH,
|
||||
"TRAIT_BYPASS_EARLY_IRRADIATED_CHECK" = TRAIT_BYPASS_EARLY_IRRADIATED_CHECK,
|
||||
"TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES,
|
||||
"TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED,
|
||||
@@ -243,18 +245,19 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_DEAF" = TRAIT_DEAF,
|
||||
"TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA,
|
||||
"TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED,
|
||||
"TRAIT_DESENSITIZED" = TRAIT_DESENSITIZED,
|
||||
"TRAIT_DESIGNATED_TARGET" = TRAIT_DESIGNATED_TARGET,
|
||||
"TRAIT_DETECTIVES_TASTE" = TRAIT_DETECTIVES_TASTE,
|
||||
"TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM,
|
||||
"TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD,
|
||||
"TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER,
|
||||
"TRAIT_DISEASELIKE_SEVERITY_MEDIUM" = TRAIT_DISEASELIKE_SEVERITY_MEDIUM,
|
||||
"TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER,
|
||||
"TRAIT_DISEASELIKE_SEVERITY_HIGH" = TRAIT_DISEASELIKE_SEVERITY_HIGH,
|
||||
"TRAIT_DISEASELIKE_SEVERITY_MEDIUM" = TRAIT_DISEASELIKE_SEVERITY_MEDIUM,
|
||||
"TRAIT_DISFIGURED" = TRAIT_DISFIGURED,
|
||||
"TRAIT_DISGUISED" = TRAIT_DISGUISED,
|
||||
"TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY,
|
||||
"TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER,
|
||||
"TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER,
|
||||
"TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY,
|
||||
"TRAIT_DISSECTED" = TRAIT_DISSECTED,
|
||||
"TRAIT_DONT_WRITE_MEMORY" = TRAIT_DONT_WRITE_MEMORY,
|
||||
"TRAIT_DOUBLE_TAP" = TRAIT_DOUBLE_TAP,
|
||||
@@ -382,6 +385,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_MANSUS_TOUCHED" = TRAIT_MANSUS_TOUCHED,
|
||||
"TRAIT_MASQUERADE_FOOD" = TRAIT_MASQUERADE_FOOD, // BUBBER EDIT
|
||||
"TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD,
|
||||
"TRAIT_MEDICAL_HUD_SENSOR_ONLY" = TRAIT_MEDICAL_HUD_SENSOR_ONLY,
|
||||
"TRAIT_MESON_VISION" = TRAIT_MESON_VISION,
|
||||
"TRAIT_MIME_FAN" = TRAIT_MIME_FAN,
|
||||
"TRAIT_MIMING" = TRAIT_MIMING,
|
||||
@@ -522,6 +526,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER,
|
||||
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
|
||||
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
|
||||
"TRAIT_SECURITY_HUD_ID_ONLY" = TRAIT_SECURITY_HUD_ID_ONLY,
|
||||
"TRAIT_SEE_WORN_COLOURS" = TRAIT_SEE_WORN_COLOURS,
|
||||
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
|
||||
"TRAIT_SELF_SURGERY" = TRAIT_SELF_SURGERY,
|
||||
@@ -640,7 +645,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA,
|
||||
"TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR,
|
||||
"TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR,
|
||||
"HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT" = HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT,
|
||||
"TRAIT_BASIC_HEALTH_HUD_VISIBLE" = TRAIT_BASIC_HEALTH_HUD_VISIBLE,
|
||||
"TRAIT_PREVENT_BLINKING" = TRAIT_PREVENT_BLINKING,
|
||||
"TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS,
|
||||
"TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS,
|
||||
|
||||
@@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_SPEED_POTIONED" = TRAIT_SPEED_POTIONED,
|
||||
),
|
||||
/mob = list(
|
||||
"TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD,
|
||||
"TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING,
|
||||
"TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING,
|
||||
"TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST,
|
||||
@@ -55,22 +56,23 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_BEAST_EMPATHY" = TRAIT_BEAST_EMPATHY,
|
||||
"TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY,
|
||||
"TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT,
|
||||
"TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS,
|
||||
"TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES,
|
||||
"TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS,
|
||||
"TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE,
|
||||
"TRAIT_BONSAI" = TRAIT_BONSAI,
|
||||
"TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER,
|
||||
"TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD,
|
||||
"TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES,
|
||||
"TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED,
|
||||
"TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS,
|
||||
"TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS,
|
||||
"TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP,
|
||||
"TRAIT_CAN_THROW_ITEMS" = TRAIT_CAN_THROW_ITEMS,
|
||||
"TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE,
|
||||
"TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED,
|
||||
"TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS,
|
||||
"TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE,
|
||||
"TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED,
|
||||
"TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON,
|
||||
"TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS,
|
||||
"TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON,
|
||||
"TRAIT_CLEANBOT_WHISPERER" = TRAIT_CLEANBOT_WHISPERER,
|
||||
"TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER,
|
||||
"TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER,
|
||||
@@ -84,9 +86,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_DEAF" = TRAIT_DEAF,
|
||||
"TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA,
|
||||
"TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED,
|
||||
"TRAIT_DESENSITIZED" = TRAIT_DESENSITIZED,
|
||||
"TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM,
|
||||
"TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD,
|
||||
"TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD,
|
||||
"TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER,
|
||||
"TRAIT_DISFIGURED" = TRAIT_DISFIGURED,
|
||||
"TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER,
|
||||
@@ -99,12 +101,12 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE,
|
||||
"TRAIT_EMPATH" = TRAIT_EMPATH,
|
||||
"TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER,
|
||||
"TRAIT_EVIL" = TRAIT_EVIL,
|
||||
"TRAIT_EXAMINE_FISHING_SPOT" = TRAIT_EXAMINE_FISHING_SPOT,
|
||||
"TRAIT_EXAMINE_FITNESS" = TRAIT_EXAMINE_FITNESS,
|
||||
"TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV,
|
||||
"TRAIT_EXPERT_FISHER" = TRAIT_EXPERT_FISHER,
|
||||
"TRAIT_EXTROVERT" = TRAIT_EXTROVERT,
|
||||
"TRAIT_EVIL" = TRAIT_EVIL,
|
||||
"TRAIT_FACE_COVERED" = TRAIT_FACE_COVERED,
|
||||
"TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH,
|
||||
"TRAIT_FASTMED" = TRAIT_FASTMED,
|
||||
@@ -173,6 +175,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE,
|
||||
"TRAIT_MASQUERADE_FOOD" = TRAIT_MASQUERADE_FOOD, //BUBBER EDIT
|
||||
"TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD,
|
||||
"TRAIT_MEDICAL_HUD_SENSOR_ONLY" = TRAIT_MEDICAL_HUD_SENSOR_ONLY,
|
||||
"TRAIT_MIME_FAN" = TRAIT_MIME_FAN,
|
||||
"TRAIT_MIMING" = TRAIT_MIMING,
|
||||
"TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD,
|
||||
@@ -268,6 +271,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER,
|
||||
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
|
||||
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
|
||||
"TRAIT_SECURITY_HUD_ID_ONLY" = TRAIT_SECURITY_HUD_ID_ONLY,
|
||||
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
|
||||
"TRAIT_SETTLER" = TRAIT_SETTLER,
|
||||
"TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES,
|
||||
|
||||
@@ -73,7 +73,8 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
|
||||
var/list/always_visible_inventory = list()
|
||||
var/list/inv_slots[SLOTS_AMT] // /atom/movable/screen/inventory objects, ordered by their slot ID.
|
||||
var/list/hand_slots // /atom/movable/screen/inventory/hand objects, assoc list of "[held_index]" = object
|
||||
|
||||
/// storages (and its content) currently open by mob
|
||||
var/list/open_containers = list()
|
||||
/// Assoc list of key => "plane master groups"
|
||||
/// This is normally just the main window, but it'll occasionally contain things like spyglasses windows
|
||||
var/list/datum/plane_master_group/master_groups = list()
|
||||
@@ -269,6 +270,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
|
||||
throw_icon = null
|
||||
resist_icon = null
|
||||
QDEL_LIST(infodisplay)
|
||||
open_containers = null
|
||||
|
||||
healths = null
|
||||
stamina = null
|
||||
@@ -378,7 +380,8 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
|
||||
screenmob.client.screen += infodisplay
|
||||
if(always_visible_inventory.len)
|
||||
screenmob.client.screen += always_visible_inventory
|
||||
|
||||
if(open_containers.len)
|
||||
screenmob.client.screen += open_containers
|
||||
screenmob.client.screen += toggle_palette
|
||||
|
||||
if(action_intent)
|
||||
|
||||
@@ -688,30 +688,58 @@
|
||||
|
||||
///Boolean on whether or not we should have our static overlay, so we 'turn' the TV off when collapsing.
|
||||
var/show_static = TRUE
|
||||
///Static mutable appearance of a job icon we're displaying on the TV for overflow job.
|
||||
var/static/mutable_appearance/job_overlay
|
||||
|
||||
/atom/movable/screen/lobby/new_player_info/Initialize(mapload, datum/hud/hud_owner)
|
||||
. = ..()
|
||||
START_PROCESSING(SSnewplayer_info, src)
|
||||
update_text()
|
||||
|
||||
//only go if the station trait is selected, otherwise it'll show "Assistant" every round.
|
||||
var/datum/station_trait/overflow_job_bureaucracy/overflow_job = locate() in SSstation.station_traits
|
||||
if(overflow_job && isnull(job_overlay))
|
||||
var/icon/job_icon = get_job_hud_icon(SSjob.overflow_role)
|
||||
if(isnull(job_icon))
|
||||
stack_trace("[SSjob.overflow_role::title] was selected as the Job Overflow but has no icon!")
|
||||
else
|
||||
job_icon.Scale(ICON_SIZE_X / 2, ICON_SIZE_X / 2)
|
||||
job_overlay = mutable_appearance(job_icon, offset_spokesman = src, alpha = 120, layer = src.layer+0.02)
|
||||
var/matrix/job_matrix = matrix()
|
||||
job_matrix.Translate(6, 14) //this is completely arbitruary just what I thought looked good.
|
||||
job_overlay.transform = job_matrix
|
||||
|
||||
update_appearance(UPDATE_ICON)
|
||||
|
||||
/atom/movable/screen/lobby/new_player_info/Destroy()
|
||||
STOP_PROCESSING(SSnewplayer_info, src)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/lobby/new_player_info/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
if(QDELETED(src) || isnull(job_overlay))
|
||||
return
|
||||
openToolTip(usr, src, params, title = "[SSjob.overflow_role::title] overflow", content = "The overflow for the round has been set as [SSjob.overflow_role::title].")
|
||||
|
||||
/atom/movable/screen/lobby/new_player_info/MouseExited()
|
||||
closeToolTip(usr)
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/lobby/new_player_info/update_icon_state()
|
||||
. = ..()
|
||||
icon_state = base_icon_state
|
||||
|
||||
/atom/movable/screen/lobby/new_player_info/update_overlays()
|
||||
. = ..()
|
||||
. += mutable_appearance(icon, "[base_icon_state]_overlay", layer = src.layer+0.03)
|
||||
. += mutable_appearance(icon, "[base_icon_state]_overlay", layer = src.layer+0.01)
|
||||
if(!show_static)
|
||||
return .
|
||||
. += mutable_appearance(icon, "static_base", alpha = 20, layer = src.layer+0.01)
|
||||
if(job_overlay)
|
||||
. += job_overlay
|
||||
. += mutable_appearance(icon, "static_base", alpha = 20, layer = src.layer+0.03)
|
||||
//we have this in a separate file because `generate_icon_alpha_mask` puts lighting even on non-existent pixels,
|
||||
//giving the icon a weird background color.
|
||||
var/mutable_appearance/scanline = mutable_appearance(generate_icon_alpha_mask('icons/hud/lobby/newplayer_scanline.dmi', "scanline"), alpha = 20, layer = src.layer+0.02)
|
||||
var/mutable_appearance/scanline = mutable_appearance(generate_icon_alpha_mask('icons/hud/lobby/newplayer_scanline.dmi', "scanline"), alpha = 20, layer = src.layer+0.04)
|
||||
scanline.pixel_y = OVERLAY_X_DIFF
|
||||
scanline.pixel_x = OVERLAY_Y_DIFF
|
||||
. += scanline
|
||||
@@ -751,9 +779,6 @@
|
||||
new_maptext = "<span style='text-align: center; vertical-align: middle'>[SSmapping.current_map.map_name]<br /> \
|
||||
[LAZYLEN(GLOB.clients)] player\s online<br /> \
|
||||
[ROUND_TIME()] in<br />"
|
||||
var/datum/station_trait/overflow_job_bureaucracy/overflow = locate() in SSstation.station_traits
|
||||
if(overflow)
|
||||
new_maptext += "[overflow.chosen_job_name] overflow"
|
||||
new_maptext += "</span>"
|
||||
else
|
||||
var/time_remaining = SSticker.GetTimeLeft()
|
||||
|
||||
@@ -235,7 +235,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
E.pixel_x = px
|
||||
|
||||
if(anim_flag & BUTTON_FADE_IN)
|
||||
animate(E, alpha = 255, time = 0.15 SECONDS, easing = EASE_OUT)
|
||||
animate(E, alpha = 255, time = 0.15 SECONDS, easing = CUBIC_EASING|EASE_OUT)
|
||||
else
|
||||
E.alpha = 255
|
||||
|
||||
|
||||
@@ -485,6 +485,15 @@
|
||||
default = 6
|
||||
min_val = -1
|
||||
|
||||
/// Freebie quirk points. Can't go negative because we have no way of enforcing a person has a quirk before they join.
|
||||
/datum/config_entry/number/default_quirk_points
|
||||
default = 2
|
||||
min_val = 0
|
||||
|
||||
/// Max personalities you can have at once
|
||||
/datum/config_entry/number/max_personalities
|
||||
default = 5
|
||||
|
||||
/**
|
||||
* A config that skews with the random spawners weights
|
||||
* If the value is lower than 1, it'll tend to even out the odds
|
||||
|
||||
@@ -77,6 +77,8 @@
|
||||
var/minimum_required_age = 0
|
||||
/// Templates necessary for this ruleset to be executed
|
||||
VAR_PROTECTED/list/ruleset_lazy_templates
|
||||
/// Extra logging information can be set here, to be output into any admin messaging and dynamic logs.
|
||||
VAR_FINAL/log_data
|
||||
|
||||
/datum/dynamic_ruleset/New(list/dynamic_config)
|
||||
for(var/new_var in dynamic_config?[config_tag])
|
||||
@@ -220,6 +222,7 @@
|
||||
|
||||
// This is (mostly) redundant, buuuut the (potential) sleep above makes it iffy, so let's just be safe
|
||||
if(!can_be_selected())
|
||||
log_data = "Reason: Ruleset cannot be selected."
|
||||
return FALSE
|
||||
|
||||
var/max_candidates = get_antag_cap(population_size, max_antag_cap || min_antag_cap)
|
||||
@@ -227,6 +230,7 @@
|
||||
|
||||
var/list/selected_candidates = select_candidates(antag_candidates, max_candidates)
|
||||
if(length(selected_candidates) < min_candidates)
|
||||
log_data = "Reason: Not enough eligible candidates. Have: [length(selected_candidates)], Need: [min_candidates]"
|
||||
return FALSE
|
||||
|
||||
for(var/mob/candidate as anything in selected_candidates)
|
||||
|
||||
@@ -149,7 +149,7 @@ SUBSYSTEM_DEF(dynamic)
|
||||
for(var/datum/dynamic_ruleset/roundstart/ruleset in queued_rulesets)
|
||||
// NOTE: !! THIS CAN SLEEP !!
|
||||
if(!ruleset.prepare_execution( num_real_players, antag_candidates ))
|
||||
log_dynamic("Roundstart: Selected ruleset [ruleset.config_tag], but preparation failed!")
|
||||
log_dynamic("Roundstart: Selected ruleset [ruleset.config_tag], but preparation failed! [ruleset.log_data]")
|
||||
queued_rulesets -= ruleset
|
||||
qdel(ruleset)
|
||||
continue
|
||||
@@ -368,7 +368,7 @@ SUBSYSTEM_DEF(dynamic)
|
||||
|
||||
// NOTE: !! THIS CAN SLEEP !!
|
||||
if(!picked_ruleset.prepare_execution(player_count, picked_ruleset.collect_candidates()))
|
||||
log_dynamic("Midround ([range]): Selected ruleset [picked_ruleset.config_tag], but preparation failed!")
|
||||
log_dynamic("Midround ([range]): Selected ruleset [picked_ruleset.config_tag], but preparation failed! [picked_ruleset.log_data]")
|
||||
QDEL_LIST(rulesets_weighted)
|
||||
return FALSE
|
||||
// Run the thing
|
||||
@@ -430,8 +430,8 @@ SUBSYSTEM_DEF(dynamic)
|
||||
// NOTE: !! THIS CAN SLEEP !!
|
||||
if(!running.prepare_execution(get_active_player_count(afk_check = TRUE), running.collect_candidates()))
|
||||
if(alert_admins_on_fail)
|
||||
message_admins("Midround (forced): Forced ruleset [running.config_tag], but preparation failed!")
|
||||
log_dynamic("Midround (forced): Forced ruleset [running.config_tag], but preparation failed!")
|
||||
message_admins("Midround (forced): Forced ruleset [running.config_tag], but preparation failed! [running.log_data]")
|
||||
log_dynamic("Midround (forced): Forced ruleset [running.config_tag], but preparation failed! [running.log_data]")
|
||||
qdel(running)
|
||||
return FALSE
|
||||
|
||||
@@ -493,7 +493,7 @@ SUBSYSTEM_DEF(dynamic)
|
||||
return FALSE
|
||||
// NOTE: !! THIS CAN SLEEP !!
|
||||
if(!picked_ruleset.prepare_execution(player_count, list(latejoiner)))
|
||||
log_dynamic("Latejoin: Selected ruleset [picked_ruleset.name] for [key_name(latejoiner)], but preparation failed! Latejoin chance has increased.")
|
||||
log_dynamic("Latejoin: Selected ruleset [picked_ruleset.name] for [key_name(latejoiner)], but preparation failed! Latejoin chance has increased. [picked_ruleset.log_data]")
|
||||
QDEL_LIST(rulesets_weighted)
|
||||
failed_latejoins++
|
||||
return FALSE
|
||||
|
||||
@@ -407,6 +407,9 @@
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/blob/false_alarm()
|
||||
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5)
|
||||
|
||||
// Set status displays to biohazard alert even for false alarm
|
||||
send_status_display_biohazard_alert()
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/xenomorph
|
||||
name = "Alien Infestation"
|
||||
config_tag = "Xenomorph"
|
||||
|
||||
@@ -463,8 +463,9 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec
|
||||
throwingturf[1] = max_range - dist
|
||||
throwingturf[2] = epicenter
|
||||
throwingturf[3] = max_range
|
||||
throwingturf[4] = severity
|
||||
else
|
||||
explode.explosion_throw_details = list(max_range - dist, epicenter, max_range)
|
||||
explode.explosion_throw_details = list(max_range - dist, epicenter, max_range, severity)
|
||||
held_throwturf += explode
|
||||
|
||||
|
||||
@@ -756,19 +757,28 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec
|
||||
var/turf/explode = thing
|
||||
var/list/details = explode.explosion_throw_details
|
||||
explode.explosion_throw_details = null
|
||||
if (length(details) != 3)
|
||||
if (length(details) != 4)
|
||||
continue
|
||||
var/throw_range = details[1]
|
||||
var/turf/center = details[2]
|
||||
var/max_range = details[3]
|
||||
for(var/atom/movable/A in explode)
|
||||
if(QDELETED(A))
|
||||
var/severity = details[4]
|
||||
var/required_resist = 0
|
||||
switch(severity)
|
||||
if(EXPLODE_DEVASTATE) // The jump from "very strong" to "overpowering" is intentional, more stuff should be thrown by point-blank explosions
|
||||
required_resist = MOVE_FORCE_OVERPOWERING
|
||||
if(EXPLODE_HEAVY)
|
||||
required_resist = MOVE_FORCE_VERY_STRONG
|
||||
if(EXPLODE_LIGHT)
|
||||
required_resist = MOVE_FORCE_STRONG
|
||||
for(var/atom/movable/movable as anything in explode)
|
||||
if(QDELETED(movable))
|
||||
continue
|
||||
if(!A.anchored && A.move_resist != INFINITY)
|
||||
if(!movable.anchored && movable.move_resist < required_resist)
|
||||
// We want to have our distance matter, but we do want to bias to a lot of throw, for the vibe
|
||||
var/atom_throw_range = rand(throw_range, max_range) + max_range * 0.3
|
||||
var/turf/throw_at = get_ranged_target_turf_direct(A, center, atom_throw_range, 180) // Throw 180 degrees away from the explosion source
|
||||
A.throw_at(throw_at, atom_throw_range, EXPLOSION_THROW_SPEED, quickstart = FALSE)
|
||||
var/turf/throw_at = get_ranged_target_turf_direct(movable, center, atom_throw_range, 180) // Throw 180 degrees away from the explosion source
|
||||
movable.throw_at(throw_at, atom_throw_range, EXPLOSION_THROW_SPEED, quickstart = FALSE)
|
||||
cost_throwturf = MC_AVERAGE(cost_throwturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
|
||||
|
||||
currentpart = SSEXPLOSIONS_TURFS
|
||||
|
||||
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(job)
|
||||
var/list/prioritized_jobs = list()
|
||||
var/list/latejoin_trackers = list()
|
||||
|
||||
var/overflow_role = /datum/job/assistant
|
||||
var/datum/job/overflow_role = /datum/job/assistant
|
||||
|
||||
var/list/level_order = list(JP_HIGH, JP_MEDIUM, JP_LOW)
|
||||
|
||||
@@ -747,7 +747,12 @@ SUBSYSTEM_DEF(job)
|
||||
|
||||
/atom/proc/JoinPlayerHere(mob/joining_mob, buckle)
|
||||
// By default, just place the mob on the same turf as the marker or whatever.
|
||||
joining_mob.forceMove(get_turf(src))
|
||||
// Set joining_mob as the new mob so subtypes can use it as a proper mob.
|
||||
if(ispath(joining_mob))
|
||||
joining_mob = new joining_mob(get_turf(src))
|
||||
else
|
||||
joining_mob.forceMove(get_turf(src))
|
||||
return joining_mob
|
||||
|
||||
/obj/structure/chair/JoinPlayerHere(mob/joining_mob, buckle)
|
||||
. = ..()
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
PROCESSING_SUBSYSTEM_DEF(personalities)
|
||||
name = "Personalities"
|
||||
runlevels = RUNLEVEL_GAME
|
||||
flags = SS_BACKGROUND|SS_POST_FIRE_TIMING
|
||||
wait = 3 SECONDS
|
||||
|
||||
/// All personality singletons indexed by their type
|
||||
VAR_FINAL/list/datum/personality/personalities_by_type
|
||||
/// All personality singletons indexed by their savefile key
|
||||
VAR_FINAL/list/datum/personality/personalities_by_key
|
||||
/// Assoc list of personality group to list of personality typepaths in that group
|
||||
VAR_FINAL/list/incompatibilities_by_group
|
||||
/// For personalities which process, this tracks all mobs we need to process for
|
||||
VAR_FINAL/list/processing_personalities
|
||||
|
||||
/datum/controller/subsystem/processing/personalities/Initialize()
|
||||
init_personalities()
|
||||
return SS_INIT_SUCCESS
|
||||
|
||||
/// Initialized personality singletons
|
||||
/datum/controller/subsystem/processing/personalities/proc/init_personalities()
|
||||
personalities_by_type = list()
|
||||
personalities_by_key = list()
|
||||
incompatibilities_by_group = list()
|
||||
processing_personalities = list()
|
||||
for(var/datum/personality/personality_type as anything in subtypesof(/datum/personality))
|
||||
var/personality_key = personality_type::savefile_key
|
||||
if(isnull(personality_key))
|
||||
// Abstract personality, ignore
|
||||
continue
|
||||
if(personalities_by_key[personality_key])
|
||||
stack_trace("Personality save key collision! \
|
||||
key: [personality_key] - \
|
||||
new: [personality_type::name] - \
|
||||
old: [personalities_by_key[personality_key].name]")
|
||||
continue
|
||||
|
||||
var/datum/personality/personality = new personality_type()
|
||||
personalities_by_type[personality_type] = personality
|
||||
personalities_by_key[personality.savefile_key] = personality
|
||||
for(var/group in personality.groups)
|
||||
incompatibilities_by_group[group] ||= list()
|
||||
incompatibilities_by_group[group] += personality_type
|
||||
|
||||
/// Helper to check if the new personality type is incompatible with the passed list of personality types
|
||||
/datum/controller/subsystem/processing/personalities/proc/is_incompatible(list/personality_types, new_personality_type)
|
||||
if(!length(incompatibilities_by_group))
|
||||
stack_trace("Checking personality incompatibilities before the incompatibility list was initialized?")
|
||||
return FALSE
|
||||
if(length(personality_types))
|
||||
// No incompatibilities possible with no personalities
|
||||
return FALSE
|
||||
var/datum/personality/new_personality = personalities_by_type[new_personality_type]
|
||||
if(!length(new_personality.groups))
|
||||
// No groups, so no incompatibilities
|
||||
return FALSE
|
||||
|
||||
// Filters all incompatibily groups against the new personality's groups
|
||||
for(var/group, incompatibility_list in incompatibilities_by_group & new_personality.groups)
|
||||
// Then checks if any personality type in the list is also in the group
|
||||
if(length(incompatibility_list & personality_types))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/// Helper to select a random list of personalities, respecting incompatibilities. REturns a list of typepaths
|
||||
/datum/controller/subsystem/processing/personalities/proc/select_random_personalities(lower_end = 1, upper_end = CONFIG_GET(number/max_personalities))
|
||||
var/list/personality_pool = personalities_by_type.Copy()
|
||||
var/list/selected_personalities = list()
|
||||
var/num = rand(lower_end, upper_end)
|
||||
var/i = 1
|
||||
while(i <= num)
|
||||
if(!length(personality_pool))
|
||||
break
|
||||
var/picked_type = pick(personality_pool)
|
||||
if(is_incompatible(selected_personalities, picked_type))
|
||||
continue
|
||||
selected_personalities += picked_type
|
||||
personality_pool -= picked_type
|
||||
i += 1
|
||||
return selected_personalities
|
||||
@@ -8,13 +8,11 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list(
|
||||
list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/scarred_eye),
|
||||
list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/fluoride_stare),
|
||||
list(/datum/quirk/item_quirk/blindness, /datum/quirk/touchy),
|
||||
list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive),
|
||||
list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/hypersensitive),
|
||||
list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes, /datum/quirk/gamer),
|
||||
list(/datum/quirk/pineapple_liker, /datum/quirk/pineapple_hater, /datum/quirk/gamer),
|
||||
list(/datum/quirk/alcohol_tolerance, /datum/quirk/light_drinker),
|
||||
list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan),
|
||||
list(/datum/quirk/bad_touch, /datum/quirk/friendly),
|
||||
list(/datum/quirk/extrovert, /datum/quirk/introvert),
|
||||
list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/body_purist),
|
||||
list(/datum/quirk/transhumanist, /datum/quirk/body_purist),
|
||||
list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist),
|
||||
@@ -140,7 +138,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
*Randomises the quirks for a specified mob
|
||||
*/
|
||||
/datum/controller/subsystem/processing/quirks/proc/randomise_quirks(mob/living/user)
|
||||
var/bonus_quirks = max((length(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS)
|
||||
var/bonus_quirks = max((LAZYLEN(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS)
|
||||
var/added_quirk_count = 0 //How many we've added
|
||||
var/list/quirks_to_add = list() //Quirks we're adding
|
||||
var/good_count = 0
|
||||
@@ -214,7 +212,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
var/list/positive_quirks = list()
|
||||
var/points_enabled = !CONFIG_GET(flag/disable_quirk_points)
|
||||
var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks)
|
||||
var/balance = 0
|
||||
var/balance = -CONFIG_GET(number/default_quirk_points)
|
||||
|
||||
var/list/all_quirks = get_quirks()
|
||||
|
||||
|
||||
@@ -589,10 +589,15 @@ SUBSYSTEM_DEF(ticker)
|
||||
var/acting_captain = !is_captain_job(player_assigned_role)
|
||||
SSjob.promote_to_captain(new_player_living, acting_captain)
|
||||
OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), player_assigned_role.get_captaincy_announcement(new_player_living)))
|
||||
if((player_assigned_role.job_flags & JOB_ASSIGN_QUIRKS) && ishuman(new_player_living) && CONFIG_GET(flag/roundstart_traits))
|
||||
if(new_player_mob.client?.prefs?.should_be_random_hardcore(player_assigned_role, new_player_living.mind))
|
||||
new_player_mob.client.prefs.hardcore_random_setup(new_player_living)
|
||||
SSquirks.AssignQuirks(new_player_living, new_player_mob.client)
|
||||
if(ishuman(new_player_living))
|
||||
if(player_assigned_role.job_flags & JOB_ASSIGN_QUIRKS)
|
||||
if(CONFIG_GET(flag/roundstart_traits))
|
||||
if(new_player_mob.client?.prefs?.should_be_random_hardcore(player_assigned_role, new_player_living.mind))
|
||||
new_player_mob.client.prefs.hardcore_random_setup(new_player_living)
|
||||
SSquirks.AssignQuirks(new_player_living, new_player_mob.client)
|
||||
else // clear any personalities the prefs added since our job clearly does not want them
|
||||
new_player_living.clear_personalities()
|
||||
|
||||
if(ishuman(new_player_living))
|
||||
SEND_SIGNAL(new_player_living, COMSIG_HUMAN_CHARACTER_SETUP_FINISHED)
|
||||
CHECK_TICK
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
antagonist.greet()
|
||||
log_game("[key_name(antagonist)] has developed an obsession with [key_name(obsession)].")
|
||||
RegisterSignal(owner, COMSIG_CARBON_HELPED, PROC_REF(on_hug))
|
||||
ADD_TRAIT(owner, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/brain_trauma/special/obsessed/on_life(seconds_per_tick, times_fired)
|
||||
if(!obsession || obsession.stat == DEAD)
|
||||
@@ -75,6 +76,7 @@
|
||||
if(obsession)
|
||||
log_game("[key_name(owner)] is no longer obsessed with [key_name(obsession)].")
|
||||
UnregisterSignal(obsession, COMSIG_MOB_EYECONTACT)
|
||||
REMOVE_TRAIT(owner, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/brain_trauma/special/obsessed/handle_speech(datum/source, list/speech_args)
|
||||
if(!viewing)
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
var/obj/visual = image('icons/hud/screen_gen.dmi', our_tile, "arrow", FLY_LAYER)
|
||||
|
||||
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay_global), visual, group_clients(), 2.5 SECONDS)
|
||||
animate(visual, pixel_x = (tile.x - our_tile.x) * ICON_SIZE_X + pointed_atom.pixel_x, pixel_y = (tile.y - our_tile.y) * ICON_SIZE_Y + pointed_atom.pixel_y, time = 1.7, easing = EASE_OUT)
|
||||
animate(visual, pixel_x = (tile.x - our_tile.x) * ICON_SIZE_X + pointed_atom.pixel_x, pixel_y = (tile.y - our_tile.y) * ICON_SIZE_Y + pointed_atom.pixel_y, time = 1.7, easing = SINE_EASING|EASE_OUT)
|
||||
|
||||
/mob/eye/imaginary_friend/create_thinking_indicator()
|
||||
if(active_thinking_indicator || active_typing_indicator || !HAS_TRAIT(src, TRAIT_THINKING_IN_CHARACTER))
|
||||
|
||||
@@ -463,12 +463,14 @@
|
||||
owner.add_mood_event("combat_ptsd", /datum/mood_event/desentized)
|
||||
owner.mob_mood?.mood_modifier -= 1 //Basically nothing can change your mood
|
||||
owner.mob_mood?.sanity_level = SANITY_DISTURBED //Makes sanity on a unstable level unless cured
|
||||
ADD_TRAIT(owner, TRAIT_DESENSITIZED, REF(src))
|
||||
. = ..()
|
||||
|
||||
/datum/brain_trauma/special/ptsd/on_lose()
|
||||
owner.clear_mood_event("combat_ptsd")
|
||||
owner.mob_mood?.mood_modifier += 1
|
||||
owner.mob_mood?.sanity_level = SANITY_GREAT
|
||||
REMOVE_TRAIT(owner, TRAIT_DESENSITIZED, REF(src))
|
||||
return ..()
|
||||
|
||||
/datum/brain_trauma/special/primal_instincts
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
datum/callback/check_blocking,
|
||||
)
|
||||
|
||||
|
||||
var/atom/movable/movable = parent
|
||||
if(!istype(movable))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
@@ -54,6 +53,7 @@
|
||||
if(isitem(movable))
|
||||
RegisterSignal(movable, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
|
||||
RegisterSignal(movable, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
|
||||
RegisterSignal(movable, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_tags))
|
||||
RegisterSignals(movable, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM), PROC_REF(on_attack))
|
||||
compatible = TRUE
|
||||
else if(ismob(movable))
|
||||
@@ -95,6 +95,20 @@
|
||||
SIGNAL_HANDLER
|
||||
unregister_antimagic_signals(bucklee)
|
||||
|
||||
/datum/component/anti_magic/proc/get_examine_tags(atom/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(antimagic_flags == ALL_MAGIC_RESISTANCE)
|
||||
examine_list["magic-proof"] = "It is thoroughly shielded against all known forms of magic."
|
||||
return
|
||||
|
||||
if(antimagic_flags & MAGIC_RESISTANCE)
|
||||
examine_list["warded"] = "It possesses a general resistance to regular spells and magic."
|
||||
if(antimagic_flags & MAGIC_RESISTANCE_MIND)
|
||||
examine_list["telepathy-proof"] = "It appears to be insulated against telepathic or mental influence."
|
||||
if(antimagic_flags & MAGIC_RESISTANCE_HOLY)
|
||||
examine_list["blessed"] = "It is protected by a divine shield against unholy and dark forms of magic."
|
||||
|
||||
/datum/component/anti_magic/proc/on_equip(atom/movable/source, mob/equipper, slot)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
var/datum/looping_sound/our_loop
|
||||
///A list of "acceptable" z levels to be on. If you leave this, we're gonna delete ourselves
|
||||
var/list/accepted_zs
|
||||
///The timer id of our current start delay, if it exists
|
||||
var/timerid
|
||||
/// World.time when we are allowed to start another sound loop
|
||||
VAR_PRIVATE/next_loop_time
|
||||
|
||||
/datum/component/area_sound_manager/Initialize(area_loop_pairs, change_on, remove_on, acceptable_zs)
|
||||
if(!ismovable(parent))
|
||||
@@ -56,15 +56,12 @@
|
||||
change_the_track()
|
||||
|
||||
/datum/component/area_sound_manager/proc/change_the_track(skip_start = FALSE)
|
||||
var/time_remaining = 0
|
||||
var/existing_loop_id = our_loop?.timer_id
|
||||
if(existing_loop_id)
|
||||
// Time left will sometimes return negative values, just ignore them and start a new sound loop now
|
||||
next_loop_time = world.time + max(timeleft(existing_loop_id, SSsound_loops) || 0, 0)
|
||||
|
||||
if(our_loop)
|
||||
var/our_id = our_loop.timer_id || timerid
|
||||
if(our_id)
|
||||
time_remaining = timeleft(our_id, SSsound_loops) || 0
|
||||
//Time left will sometimes return negative values, just ignore them and start a new sound loop now
|
||||
time_remaining = max(time_remaining, 0)
|
||||
QDEL_NULL(our_loop)
|
||||
QDEL_NULL(our_loop)
|
||||
|
||||
var/area/our_area = get_area(parent)
|
||||
var/new_loop_type = area_to_looping_type[our_area]
|
||||
@@ -73,14 +70,12 @@
|
||||
|
||||
our_loop = new new_loop_type(parent, FALSE, TRUE, skip_start)
|
||||
|
||||
//If we're still playing, wait a bit before changing the sound so we don't double up
|
||||
if(time_remaining)
|
||||
timerid = addtimer(CALLBACK(src, PROC_REF(start_looping_sound)), time_remaining, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_NO_HASH_WAIT | TIMER_DELETE_ME, SSsound_loops)
|
||||
// We're not ready to start another loop, wait before changing the sound so we don't double up
|
||||
if(next_loop_time > world.time)
|
||||
addtimer(CALLBACK(src, PROC_REF(start_looping_sound)), next_loop_time - world.time, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_NO_HASH_WAIT | TIMER_DELETE_ME, SSsound_loops)
|
||||
return
|
||||
timerid = null
|
||||
our_loop.start()
|
||||
|
||||
start_looping_sound()
|
||||
|
||||
/datum/component/area_sound_manager/proc/start_looping_sound()
|
||||
timerid = null
|
||||
if(our_loop)
|
||||
our_loop.start()
|
||||
our_loop?.start()
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
color = colorize_string(creator.get_voice(), 2, 0.9)
|
||||
update_appearance()
|
||||
var/turf/target_loc = get_turf(target)
|
||||
animate(src, pixel_x = (target_loc.x - loc.x) * ICON_SIZE_X + target.pixel_x, pixel_y = (target_loc.y - loc.y) * ICON_SIZE_Y + target.pixel_y, time = 0.2 SECONDS, easing = EASE_OUT)
|
||||
animate(src, pixel_x = (target_loc.x - loc.x) * ICON_SIZE_X + target.pixel_x, pixel_y = (target_loc.y - loc.y) * ICON_SIZE_Y + target.pixel_y, time = 0.2 SECONDS, easing = SINE_EASING|EASE_OUT)
|
||||
|
||||
/datum/callout_option
|
||||
var/name = "ERROR"
|
||||
|
||||
@@ -1,14 +1,3 @@
|
||||
/datum/crafting_recipe/bluespace_vendor_mount
|
||||
name = "Bluespace Vendor Wall Mount"
|
||||
result = /obj/item/wallframe/bluespace_vendor_mount
|
||||
time = 6 SECONDS
|
||||
reqs = list(
|
||||
/obj/item/stack/sheet/iron = 15,
|
||||
/obj/item/stack/sheet/glass = 10,
|
||||
/obj/item/stack/cable_coil = 10,
|
||||
)
|
||||
category = CAT_ATMOSPHERIC
|
||||
|
||||
/datum/crafting_recipe/pipe
|
||||
name = "Smart pipe fitting"
|
||||
tool_behaviors = list(TOOL_WRENCH)
|
||||
|
||||
@@ -84,7 +84,19 @@
|
||||
overriden_handlers[override_type] = list()
|
||||
overriden_handlers[override_type][handler_type] = TRUE
|
||||
|
||||
/datum/component/fearful/proc/get_fear_multiplier()
|
||||
var/multiplier = 1
|
||||
var/mob/living/parent_mob = parent
|
||||
if(HAS_PERSONALITY(parent_mob, /datum/personality/cowardly))
|
||||
multiplier *= 1.25
|
||||
if(HAS_PERSONALITY(parent_mob, /datum/personality/paranoid))
|
||||
multiplier *= 1.10
|
||||
if(HAS_PERSONALITY(parent_mob, /datum/personality/brave))
|
||||
multiplier *= 0.75
|
||||
return multiplier
|
||||
|
||||
/datum/component/fearful/process(seconds_per_tick)
|
||||
var/fear_modifier = get_fear_multiplier()
|
||||
var/terror_adjustment = 0
|
||||
var/list/tick_later = list()
|
||||
for (var/datum/terror_handler/handler as anything in terror_handlers)
|
||||
@@ -94,12 +106,12 @@
|
||||
tick_later += handler
|
||||
continue
|
||||
var/adjustment = handler.tick(seconds_per_tick, terror_buildup)
|
||||
terror_buildup = clamp(terror_buildup + adjustment, 0, TERROR_BUILDUP_MAXIMUM)
|
||||
terror_buildup = clamp(terror_buildup + (adjustment * fear_modifier), 0, TERROR_BUILDUP_MAXIMUM)
|
||||
terror_adjustment += adjustment
|
||||
|
||||
for (var/datum/terror_handler/handler as anything in tick_later)
|
||||
var/adjustment = handler.tick(seconds_per_tick, terror_buildup)
|
||||
terror_buildup = clamp(terror_buildup + adjustment, 0, TERROR_BUILDUP_MAXIMUM)
|
||||
terror_buildup = clamp(terror_buildup + (adjustment * fear_modifier), 0, TERROR_BUILDUP_MAXIMUM)
|
||||
terror_adjustment += adjustment
|
||||
|
||||
// If we gained terror in any way, don't tick it down
|
||||
@@ -109,7 +121,7 @@
|
||||
|
||||
// Tick terror down while we're not being actively spooked
|
||||
if (terror_buildup > 0)
|
||||
terror_buildup = max(terror_buildup - TERROR_BUILDUP_PASSIVE_DECREASE, 0)
|
||||
terror_buildup = max(terror_buildup - (TERROR_BUILDUP_PASSIVE_DECREASE * (1 / fear_modifier)) * seconds_per_tick, 0)
|
||||
last_tick_buildup = terror_buildup
|
||||
|
||||
/datum/component/fearful/proc/on_examine(mob/living/source, mob/user, list/examine_list)
|
||||
|
||||
@@ -512,6 +512,8 @@ Behavior that's still missing from this component that original food items had t
|
||||
|
||||
checkLiked(fraction, eater)
|
||||
|
||||
check_materials(eater, fraction)
|
||||
|
||||
if(!owner.reagents.total_volume)
|
||||
On_Consume(eater, feeder)
|
||||
|
||||
@@ -527,6 +529,29 @@ Behavior that's still missing from this component that original food items had t
|
||||
|
||||
return TRUE
|
||||
|
||||
///Perform operations based on materials and/or if the parent object is a stack.
|
||||
/datum/component/edible/proc/check_materials(mob/living/carbon/eater, fraction)
|
||||
var/atom/owner = parent
|
||||
var/is_stack = isstack(owner)
|
||||
|
||||
//food may also apply golem buffs if it contains certain materials and the mob has the required trait
|
||||
if(owner.custom_materials && HAS_TRAIT(eater, TRAIT_ROCK_EATER))
|
||||
for(var/datum/material/material as anything in owner.custom_materials)
|
||||
var/effect_stack_amount = (owner.custom_materials[material] * fraction) / SHEET_MATERIAL_AMOUNT
|
||||
var/datum/golem_food_buff/effect
|
||||
effect = GLOB.golem_stack_food_directory[material.sheet_type || material.ore_type]
|
||||
if(effect?.can_consume(eater))
|
||||
effect.on_consumption(eater, owner, effect_stack_amount)
|
||||
|
||||
if(fraction >= 1) //don't bother if the item is about to be deleted anyway...
|
||||
return
|
||||
|
||||
if(is_stack) //stacks use up sheets, which recalulates the materials already.
|
||||
var/obj/item/stack/stack = owner
|
||||
stack.use(CEILING(stack.amount * fraction, 1))
|
||||
else if(owner.custom_materials)
|
||||
owner.set_custom_materials(owner.custom_materials, 1 - fraction)
|
||||
|
||||
///Checks whether or not the eater can actually consume the food
|
||||
/datum/component/edible/proc/CanConsume(mob/living/carbon/eater, mob/living/feeder)
|
||||
if(!iscarbon(eater))
|
||||
@@ -607,10 +632,7 @@ Behavior that's still missing from this component that original food items had t
|
||||
|
||||
var/atom/owner = parent
|
||||
var/timeout_mod = owner.reagents.get_average_purity(/datum/reagent/consumable) * 2 // mood event duration is 100% at average purity of 50%
|
||||
var/datum/mood_event/event = GLOB.food_quality_events[food_quality]
|
||||
event = new event.type
|
||||
event.timeout *= timeout_mod
|
||||
gourmand.add_mood_event("quality_food", event)
|
||||
gourmand.add_mood_event("quality_food", /datum/mood_event/food, food_quality, timeout_mod)
|
||||
gourmand.adjust_disgust(-5 + -2 * food_quality * fraction)
|
||||
var/quality_label = GLOB.food_quality_description[food_quality]
|
||||
to_chat(gourmand, span_notice("That's \an [quality_label] meal."))
|
||||
|
||||
@@ -673,16 +673,16 @@
|
||||
//===========================================HIGH LEVEL=======================================
|
||||
|
||||
/**
|
||||
* For spawning mineral sheets at a specific location. Used by machines to output sheets.
|
||||
* For spawning stacks (mineral sheets or ore) at a specific location. Used by machines to output sheets.
|
||||
*
|
||||
* Arguments:
|
||||
* sheet_amt: number of sheets to extract
|
||||
* stack_amt: number of sheets to extract
|
||||
* [material][datum/material]: type of sheets present in this container to extract
|
||||
* [target][atom]: drop location
|
||||
* [atom][context]: context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_SHEETS_RETRIEVED and is used mostly for silo logging
|
||||
* [atom][context]: context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_STACK_RETRIEVED and is used mostly for silo logging
|
||||
* user_data - in the form rendered by ID_DATA(user), for material logging (and if this component is connected to a silo, also for permission checking)
|
||||
*/
|
||||
/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/material, atom/target = null, atom/context = parent, alist/user_data)
|
||||
/datum/component/material_container/proc/retrieve_stack(stack_amt, datum/material/material, atom/target = null, atom/context = parent, alist/user_data)
|
||||
//do we support sheets of this material
|
||||
if(!material.sheet_type)
|
||||
return 0 //Add greyscale sheet handling here later
|
||||
@@ -690,8 +690,8 @@
|
||||
return 0
|
||||
|
||||
//requested amount greater than available amount or just an invalid value
|
||||
sheet_amt = min(round(materials[material] / SHEET_MATERIAL_AMOUNT), sheet_amt)
|
||||
if(sheet_amt <= 0)
|
||||
stack_amt = min(round(materials[material] / SHEET_MATERIAL_AMOUNT), stack_amt)
|
||||
if(stack_amt <= 0)
|
||||
return 0
|
||||
//auto drop location
|
||||
if(!target)
|
||||
@@ -702,27 +702,30 @@
|
||||
|
||||
//eject sheets based on available amount after each iteration
|
||||
var/count = 0
|
||||
while(sheet_amt > 0)
|
||||
while(stack_amt > 0)
|
||||
var/type_to_retrieve = material.sheet_type || material.ore_type
|
||||
//don't merge yet. we need to do stuff with it first
|
||||
var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, min(sheet_amt, MAX_STACK_SIZE), FALSE)
|
||||
new_sheets.manufactured = TRUE
|
||||
count += new_sheets.amount
|
||||
var/obj/item/stack/new_stack = new type_to_retrieve(target, min(stack_amt, MAX_STACK_SIZE), FALSE)
|
||||
if(istype(new_stack, /obj/item/stack/sheet))
|
||||
var/obj/item/stack/sheet/new_sheets = new_stack
|
||||
new_sheets.manufactured = TRUE
|
||||
count += new_stack.amount
|
||||
//use material & deduct work needed
|
||||
use_amount_mat(new_sheets.amount * SHEET_MATERIAL_AMOUNT, material)
|
||||
sheet_amt -= new_sheets.amount
|
||||
use_amount_mat(new_stack.amount * SHEET_MATERIAL_AMOUNT, material)
|
||||
stack_amt -= new_stack.amount
|
||||
//send signal
|
||||
SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIEVED, new_sheets, context, user_data)
|
||||
SEND_SIGNAL(src, COMSIG_MATCONTAINER_STACK_RETRIEVED, new_stack, context, user_data)
|
||||
//no point merging anything into an already full stack
|
||||
if(new_sheets.amount == new_sheets.max_amount)
|
||||
if(new_stack.amount == new_stack.max_amount)
|
||||
continue
|
||||
//now we can merge since we are done with it
|
||||
for(var/obj/item/stack/item_stack in target)
|
||||
if(item_stack == new_sheets || item_stack.type != material.sheet_type) //don't merge with self or different type
|
||||
if(item_stack == new_stack || new_stack.type != type_to_retrieve) //don't merge with self or different type
|
||||
continue
|
||||
//speed merge
|
||||
var/merge_amount = min(item_stack.amount, new_sheets.max_amount - new_sheets.get_amount())
|
||||
var/merge_amount = min(item_stack.amount, new_stack.max_amount - new_stack.get_amount())
|
||||
item_stack.use(merge_amount)
|
||||
new_sheets.add(merge_amount)
|
||||
new_stack.add(merge_amount)
|
||||
break
|
||||
return count
|
||||
|
||||
@@ -736,7 +739,7 @@
|
||||
/datum/component/material_container/proc/retrieve_all(target = null, atom/context = parent)
|
||||
var/result = 0
|
||||
for(var/MAT in materials)
|
||||
result += retrieve_sheets(amount2sheet(materials[MAT]), MAT, target, context, user_data = ID_DATA(null))
|
||||
result += retrieve_stack(amount2sheet(materials[MAT]), MAT, target, context, user_data = ID_DATA(null))
|
||||
return result
|
||||
//============================================================================================
|
||||
|
||||
|
||||
@@ -271,7 +271,7 @@ handles linking back and forth.
|
||||
if(isnull(drop_target))
|
||||
drop_target = movable_parent.drop_location()
|
||||
|
||||
return mat_container.retrieve_sheets(eject_amount, material_ref, target = drop_target, context = parent, user_data = user_data)
|
||||
return mat_container.retrieve_stack(eject_amount, material_ref, target = drop_target, context = parent, user_data = user_data)
|
||||
|
||||
/**
|
||||
* Insert an item into the mat container, helper proc to insert items with the correct context
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
if(src.luck_mod > luck_mod)
|
||||
src.luck_mod += luck_mod * 0.5
|
||||
if(src.damage_mod > damage_mod)
|
||||
src.luck_mod += luck_mod * 0.5
|
||||
src.damage_mod += damage_mod * 0.5
|
||||
// This means that if you had a strong temporary omen and it was replaced by a weaker but permanent omen, the latter is made worse.
|
||||
// Feature!
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/// Component given to mobs that can mine when moving
|
||||
/datum/component/proficient_miner
|
||||
/// Last tick when we bumpmined. Prevents diagonal bumpnining being thrice as fast as normal
|
||||
var/last_bumpmine_tick = -1
|
||||
|
||||
/datum/component/proficient_miner/Initialize()
|
||||
if (!ismovable(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
/datum/component/proficient_miner/RegisterWithParent()
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump))
|
||||
|
||||
/datum/component/proficient_miner/UnregisterFromParent()
|
||||
UnregisterSignal(parent, COMSIG_MOVABLE_BUMP)
|
||||
|
||||
/datum/component/proficient_miner/proc/on_bump(atom/movable/source, atom/target)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!ismineralturf(target) || last_bumpmine_tick == world.time)
|
||||
return
|
||||
|
||||
var/mob/living/user = null
|
||||
if(isliving(parent))
|
||||
user = parent
|
||||
if(user.stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
var/turf/closed/mineral/mineral_wall = target
|
||||
if(!istype(mineral_wall, /turf/closed/mineral/gibtonite))
|
||||
last_bumpmine_tick = world.time
|
||||
mineral_wall.gets_drilled(source)
|
||||
return
|
||||
|
||||
var/turf/closed/mineral/gibtonite/gibtonite_wall = mineral_wall
|
||||
if(gibtonite_wall.stage == GIBTONITE_UNSTRUCK)
|
||||
last_bumpmine_tick = world.time
|
||||
mineral_wall.gets_drilled(source)
|
||||
@@ -81,7 +81,7 @@
|
||||
return // No change
|
||||
var/atom/movable/speaker = parent
|
||||
var/msg = get_warning_message()
|
||||
var/obj/machinery/announcement_system/aas = get_announcement_system(/datum/aas_config_entry/weather, speaker)
|
||||
var/obj/machinery/announcement_system/aas = get_announcement_system(/datum/aas_config_entry/weather, speaker, list(RADIO_CHANNEL_SUPPLY))
|
||||
// Active AAS will override default announcement lines
|
||||
if (aas)
|
||||
msg = aas.compile_config_message(/datum/aas_config_entry/weather, list(), !is_weather_dangerous ? 4 : warning_level + 1)
|
||||
@@ -188,6 +188,14 @@
|
||||
"Safe" = "No risk expected from incoming weather front.",
|
||||
)
|
||||
|
||||
/datum/aas_config_entry/weather/act_up()
|
||||
. = ..()
|
||||
if (.)
|
||||
return
|
||||
|
||||
// 10% chance to turn off weather broadcast entirely
|
||||
if (prob(10))
|
||||
enabled = FALSE
|
||||
|
||||
#undef WEATHER_ALERT_CLEAR
|
||||
#undef WEATHER_ALERT_INCOMING
|
||||
|
||||
+13
-5
@@ -334,11 +334,13 @@
|
||||
var/list/copied_parameters = params.Copy()
|
||||
copied_parameters["name"] = name
|
||||
copied_parameters["priority"] = priority
|
||||
for (var/list/filter_info as anything in filter_data)
|
||||
if (filter_info["name"] == name)
|
||||
filter_data -= filter_info
|
||||
filter_cache -= name
|
||||
break
|
||||
for (var/index in 1 to length(filter_data))
|
||||
var/list/filter_info = filter_data[index]
|
||||
if (filter_info["name"] != name)
|
||||
continue
|
||||
filter_data -= filter_info
|
||||
filter_cache -= filter_cache[index]
|
||||
break
|
||||
|
||||
BINARY_INSERT_DEFINE(list(copied_parameters), filter_data, SORT_VAR_NO_TYPE, copied_parameters, SORT_PRIORITY_INDEX, COMPARE_KEY)
|
||||
|
||||
@@ -486,6 +488,12 @@
|
||||
var/atom/atom_cast = src // filters only work with images or atoms.
|
||||
return atom_cast.filters[name]
|
||||
|
||||
/// Returns filter data associated with the passed key
|
||||
/datum/proc/get_filter_data(name)
|
||||
for (var/list/filter_info as anything in filter_data)
|
||||
if (filter_info["name"] == name)
|
||||
return filter_info.Copy()
|
||||
|
||||
/// Removes the passed filter, or multiple filters, if supplied with a list.
|
||||
/datum/proc/remove_filter(name_or_names, update = TRUE)
|
||||
ASSERT(isatom(src) || isimage(src))
|
||||
|
||||
@@ -57,7 +57,9 @@
|
||||
var/datum/mutation/mutation = carbon.get_random_mutation_path((NEGATIVE|MINOR_NEGATIVE|POSITIVE) & ~excludemuts)
|
||||
if(!mutation)
|
||||
return
|
||||
carbon.dna.add_mutation((mutation.quality & mutadone_proof) ? MUTATION_SOURCE_GENE_SYMPTOM : MUTATION_SOURCE_ACTIVATED)
|
||||
carbon.dna.add_mutation(mutation, (mutation.quality & mutadone_proof) ? MUTATION_SOURCE_GENE_SYMPTOM : MUTATION_SOURCE_ACTIVATED)
|
||||
var/datum/mutation/given_mutation = carbon.dna.get_mutation(mutation)
|
||||
given_mutation?.scrambled = TRUE
|
||||
|
||||
/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
|
||||
. = ..()
|
||||
|
||||
@@ -21,18 +21,20 @@
|
||||
src.climb_stun = climb_stun
|
||||
|
||||
RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(attack_hand))
|
||||
RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
||||
RegisterSignal(target, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_tags))
|
||||
RegisterSignal(target, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive))
|
||||
ADD_TRAIT(target, TRAIT_CLIMBABLE, ELEMENT_TRAIT(type))
|
||||
|
||||
/datum/element/climbable/Detach(datum/target)
|
||||
UnregisterSignal(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_EXAMINE, COMSIG_MOUSEDROPPED_ONTO, COMSIG_ATOM_BUMPED))
|
||||
UnregisterSignal(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_EXAMINE_TAGS, COMSIG_MOUSEDROPPED_ONTO, COMSIG_ATOM_BUMPED))
|
||||
REMOVE_TRAIT(target, TRAIT_CLIMBABLE, ELEMENT_TRAIT(type))
|
||||
return ..()
|
||||
|
||||
/datum/element/climbable/proc/on_examine(atom/source, mob/user, list/examine_texts)
|
||||
///Someone inspected our embeddable item
|
||||
/datum/element/climbable/proc/get_examine_tags(atom/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
examine_texts += span_notice("[source] looks climbable.")
|
||||
|
||||
examine_list["climbable"] = "It looks like it can be climbed on."
|
||||
|
||||
/datum/element/climbable/proc/can_climb(atom/source, mob/user)
|
||||
if (!user.CanReach(source))
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
/obj/effect/temp_visual/curse_blast/Initialize(mapload)
|
||||
. = ..()
|
||||
animate(src, transform = matrix() * 0.2, time = 0, flags = ANIMATION_PARALLEL)
|
||||
animate(transform = matrix() * 2, time = duration, easing = EASE_IN)
|
||||
animate(transform = matrix() * 2, time = duration, easing = QUAD_EASING|EASE_IN)
|
||||
|
||||
animate(src, alpha = 255, time = 0, flags = ANIMATION_PARALLEL)
|
||||
animate(alpha = 255, time = 0.2 SECONDS)
|
||||
|
||||
@@ -8,16 +8,19 @@
|
||||
argument_hash_start_idx = 2
|
||||
/// Path of the trophy dropped (or list of trophies)
|
||||
var/trophy_type
|
||||
/// chance to drop the trophy, lowered by the mob only taking partial crusher damage instead of full
|
||||
/// for example, 25% would mean ~4 mobs need to die before you find one.
|
||||
/// but it would be more if you didn't deal full crusher damage to them.
|
||||
/// Chance to drop the trophy, lowered by the mob only taking partial crusher damage instead of full
|
||||
/// For example, 25% would mean ~4 mobs need to die before you find one.
|
||||
/// But it would be more if you didn't deal full crusher damage to them.
|
||||
var/drop_mod
|
||||
/// If true, will immediately spawn the item instead of putting it in butcher loot.
|
||||
var/drop_immediately
|
||||
/// Crusher damage percentage at which the drop is guaranteed, if any
|
||||
var/guaranteed_drop
|
||||
/// Should crusher drops replace *all* spawned loot?
|
||||
var/replace_all
|
||||
|
||||
/datum/element/crusher_loot/Attach(datum/target, trophy_type, drop_mod = 25, drop_immediately = FALSE)
|
||||
/datum/element/crusher_loot/Attach(datum/target, trophy_type, drop_mod = 25, drop_immediately = FALSE, guaranteed_drop = null, replace_all = FALSE)
|
||||
. = ..()
|
||||
|
||||
if(!isliving(target))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
|
||||
@@ -25,27 +28,54 @@
|
||||
|
||||
src.trophy_type = trophy_type
|
||||
src.drop_mod = drop_mod
|
||||
src.guaranteed_drop = guaranteed_drop
|
||||
src.drop_immediately = drop_immediately
|
||||
src.replace_all = replace_all
|
||||
if (replace_all)
|
||||
RegisterSignal(target, COMSIG_LIVING_DROP_LOOT, PROC_REF(on_loot_drop))
|
||||
|
||||
/datum/element/crusher_loot/Detach(datum/target)
|
||||
UnregisterSignal(target, COMSIG_LIVING_DEATH)
|
||||
UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_DROP_LOOT))
|
||||
return ..()
|
||||
|
||||
/datum/element/crusher_loot/proc/on_loot_drop(mob/living/target, list/spawn_loot, gibbed)
|
||||
SIGNAL_HANDLER
|
||||
// Prevent normal loot from being dropped if we have replace_all enabled
|
||||
return COMPONENT_NO_LOOT_DROP
|
||||
|
||||
/datum/element/crusher_loot/proc/on_death(mob/living/target, gibbed)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
var/datum/status_effect/crusher_damage/damage = target.has_status_effect(/datum/status_effect/crusher_damage)
|
||||
// SKYRAT EDIT START - ASHWALKER TROPHIES
|
||||
var/datum/status_effect/ashwalker_damage/ashie_damage = target.has_status_effect(/datum/status_effect/ashwalker_damage) // SKYRAT EDIT ADDITION
|
||||
var/damage_total = damage?.total_damage + ashie_damage?.total_damage // SKYRAT EDIT ADDITION
|
||||
if(damage && prob((damage_total/target.maxHealth) * drop_mod)) //on average, you'll need to kill 4 creatures before getting the item. by default.
|
||||
// SKYRAT EDIT END - ASHWALKER TROPHIES
|
||||
if(!islist(trophy_type))
|
||||
make_path(target, trophy_type)
|
||||
if (!damage)
|
||||
return
|
||||
|
||||
if (guaranteed_drop)
|
||||
if (damage.total_damage / target.maxHealth < guaranteed_drop)
|
||||
return
|
||||
else if (!prob((damage.total_damage / target.maxHealth) * drop_mod)) // On average, you'll need to kill 4 creatures before getting the item. by default.
|
||||
return
|
||||
|
||||
if (replace_all && isanimal(target))
|
||||
var/mob/living/simple_animal/expiring_code = target
|
||||
if (!islist(trophy_type))
|
||||
expiring_code.loot = list(trophy_type)
|
||||
return
|
||||
|
||||
for(var/trophypath in trophy_type)
|
||||
make_path(target, trophypath)
|
||||
var/list/trophies = trophy_type
|
||||
expiring_code.loot = trophies.Copy()
|
||||
return
|
||||
|
||||
if(!islist(trophy_type))
|
||||
make_path(target, trophy_type)
|
||||
return
|
||||
|
||||
if (replace_all)
|
||||
target.butcher_results?.Cut()
|
||||
target.guaranteed_butcher_results?.Cut()
|
||||
|
||||
for(var/trophypath in trophy_type)
|
||||
make_path(target, trophypath)
|
||||
|
||||
/datum/element/crusher_loot/proc/make_path(mob/living/target, path)
|
||||
if(drop_immediately)
|
||||
@@ -54,4 +84,5 @@
|
||||
|
||||
if (!target.guaranteed_butcher_results)
|
||||
target.guaranteed_butcher_results = list()
|
||||
|
||||
target.guaranteed_butcher_results[path] = 1
|
||||
|
||||
@@ -6,16 +6,19 @@
|
||||
/datum/element/death_drops
|
||||
element_flags = ELEMENT_BESPOKE
|
||||
argument_hash_start_idx = 2
|
||||
///what items the target drops when killed
|
||||
/// What items the target drops when killed
|
||||
var/list/loot
|
||||
/// Should the items not be dropped when gibbed?
|
||||
var/no_gib_drops
|
||||
|
||||
/datum/element/death_drops/Attach(datum/target, list/loot)
|
||||
/datum/element/death_drops/Attach(datum/target, list/loot, no_gib_drops = FALSE)
|
||||
. = ..()
|
||||
if(!isliving(target))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
if(!loot)
|
||||
stack_trace("[type] added to [target] with NO LOOT.")
|
||||
src.loot = loot
|
||||
src.no_gib_drops = no_gib_drops
|
||||
RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death))
|
||||
|
||||
/datum/element/death_drops/Detach(datum/target)
|
||||
@@ -25,10 +28,22 @@
|
||||
///signal called by the stat of the target changing
|
||||
/datum/element/death_drops/proc/on_death(mob/living/target, gibbed)
|
||||
SIGNAL_HANDLER
|
||||
if (no_gib_drops && gibbed)
|
||||
return
|
||||
|
||||
var/list/spawn_loot = null
|
||||
if (islist(loot))
|
||||
spawn_loot = loot.Copy()
|
||||
else
|
||||
spawn_loot = list(loot)
|
||||
|
||||
var/atom/loot_loc = target.drop_location()
|
||||
for(var/thing_to_spawn in loot)
|
||||
for(var/i in 1 to (loot[thing_to_spawn] || 1))
|
||||
create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = loot.len * 3)
|
||||
if (SEND_SIGNAL(target, COMSIG_LIVING_DROP_LOOT, spawn_loot, gibbed) & COMPONENT_NO_LOOT_DROP)
|
||||
return
|
||||
|
||||
for(var/thing_to_spawn in spawn_loot)
|
||||
for(var/i in 1 to (spawn_loot[thing_to_spawn] || 1))
|
||||
create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = spawn_loot.len * 3)
|
||||
|
||||
/// Handles creating the loots
|
||||
/datum/element/death_drops/proc/create_loot(typepath, atom/loot_loc, mob/living/dead, gibbed, spread_px = 4)
|
||||
|
||||
@@ -27,14 +27,14 @@
|
||||
|
||||
/datum/element/digitalcamo/proc/HideFromAIHuds(mob/living/target)
|
||||
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
|
||||
for (var/hud_type in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type]
|
||||
for (var/hud_trait in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[GLOB.trait_to_hud[hud_trait]]
|
||||
silicon_hud.hide_single_atomhud_from(AI,target)
|
||||
|
||||
/datum/element/digitalcamo/proc/UnhideFromAIHuds(mob/living/target)
|
||||
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
|
||||
for (var/hud_type in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type]
|
||||
for (var/hud_trait in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[GLOB.trait_to_hud[hud_trait]]
|
||||
silicon_hud.unhide_single_atomhud_from(AI,target)
|
||||
|
||||
/datum/element/digitalcamo/proc/on_examine(datum/source, mob/M, list/examine_list)
|
||||
|
||||
@@ -9,12 +9,35 @@
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
flags = _flags
|
||||
RegisterSignal(target, COMSIG_ATOM_PRE_EMP_ACT, PROC_REF(getEmpFlags))
|
||||
RegisterSignal(target, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_tags))
|
||||
|
||||
/datum/element/empprotection/Detach(atom/target)
|
||||
UnregisterSignal(target, COMSIG_ATOM_PRE_EMP_ACT)
|
||||
UnregisterSignal(target, list(COMSIG_ATOM_PRE_EMP_ACT, COMSIG_ATOM_EXAMINE_TAGS))
|
||||
return ..()
|
||||
|
||||
/datum/element/empprotection/proc/getEmpFlags(datum/source, severity)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
return flags
|
||||
return (flags & EMP_PROTECT_ALL)
|
||||
|
||||
/datum/element/empprotection/proc/get_examine_tags(atom/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(flags & EMP_NO_EXAMINE)
|
||||
return
|
||||
|
||||
if(flags & EMP_PROTECT_ALL == EMP_PROTECT_ALL)
|
||||
examine_list["EMP proof"] = "[source.p_They()] [source.p_are()] unaffected by electromagnetic pulses, and shields [source.p_their()] contents and wiring from them."
|
||||
return
|
||||
|
||||
if(flags & EMP_PROTECT_SELF)
|
||||
examine_list["EMP resilient"] = "[source.p_They()] [source.p_are()] unaffected by electromagnetic pulses."
|
||||
|
||||
if(flags & (EMP_PROTECT_CONTENTS|EMP_PROTECT_WIRES) == (EMP_PROTECT_CONTENTS|EMP_PROTECT_WIRES))
|
||||
examine_list["EMP blocking"] = "[source.p_They()] protects [source.p_their()] wiring and contents from electromagnetic pulses."
|
||||
|
||||
else if(flags & EMP_PROTECT_CONTENTS)
|
||||
examine_list["EMP blocking"] = "[source.p_They()] protects [source.p_their()] contents from electromagnetic pulses."
|
||||
|
||||
else if(flags & EMP_PROTECT_WIRES)
|
||||
examine_list["EMP blocking"] = "[source.p_They()] protects [source.p_their()] wiring from electromagnetic pulses."
|
||||
|
||||
@@ -25,23 +25,21 @@
|
||||
///signal called on the parent attacking an item
|
||||
/datum/element/envenomable_casing/proc/handle_interaction(obj/item/ammo_casing/casing, mob/user, atom/target, list/modifiers)
|
||||
SIGNAL_HANDLER
|
||||
if(!is_reagent_container(target))
|
||||
|
||||
if(!target.is_open_container())
|
||||
return NONE
|
||||
var/obj/item/reagent_containers/venom_container = target
|
||||
if(!casing.loaded_projectile)
|
||||
user.balloon_alert(user, "casing is already spent!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
if(!(venom_container.reagent_flags & OPENCONTAINER))
|
||||
user.balloon_alert(user, "open the container!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/datum/reagent/venom_applied = venom_container.reagents.get_master_reagent()
|
||||
|
||||
var/datum/reagent/venom_applied = target.reagents.get_master_reagent()
|
||||
if(!venom_applied)
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/amount_applied = min(venom_applied.volume, amount_allowed)
|
||||
|
||||
casing.loaded_projectile.AddElement(/datum/element/venomous, venom_applied.type, amount_applied)
|
||||
to_chat(user, span_notice("You coat [casing] in [venom_applied]."))
|
||||
venom_container.reagents.remove_reagent(venom_applied.type, amount_applied)
|
||||
target.reagents.remove_reagent(venom_applied.type, amount_applied)
|
||||
///stops further poison application
|
||||
UnregisterSignal(casing, COMSIG_ITEM_INTERACTING_WITH_ATOM)
|
||||
RegisterSignal(casing, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_after_dip), override = TRUE)
|
||||
|
||||
@@ -16,21 +16,19 @@
|
||||
. = ..()
|
||||
UnregisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM)
|
||||
|
||||
/datum/element/dunkable/proc/get_dunked(datum/source, mob/user, atom/target, params)
|
||||
/datum/element/dunkable/proc/get_dunked(obj/item/source, mob/user, atom/target, params)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
var/obj/item/reagent_containers/container = target // the container we're trying to dunk into
|
||||
if(istype(container) && (container.reagent_flags & DUNKABLE)) // container should be a valid target for dunking
|
||||
if(!container.is_drainable())
|
||||
to_chat(user, span_warning("[container] is unable to be dunked in!"))
|
||||
if(target.reagents?.flags & DUNKABLE) // container should be a valid target for dunking
|
||||
if(!target.is_drainable())
|
||||
to_chat(user, span_warning("[target] is unable to be dunked in!"))
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/obj/item/I = source // the item that has the dunkable element
|
||||
if(container.reagents.trans_to(I, dunk_amount, transferred_by = user)) //if reagents were transferred, show the message
|
||||
to_chat(user, span_notice("You dunk \the [I] into \the [container]."))
|
||||
if(target.reagents.trans_to(source, dunk_amount, transferred_by = user)) //if reagents were transferred, show the message
|
||||
to_chat(user, span_notice("You dunk \the [target] into \the [target]."))
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
if(!container.reagents.total_volume)
|
||||
to_chat(user, span_warning("[container] is empty!"))
|
||||
if(!target.reagents.total_volume)
|
||||
to_chat(user, span_warning("[target] is empty!"))
|
||||
else
|
||||
to_chat(user, span_warning("[I] is full!"))
|
||||
to_chat(user, span_warning("[source] is full!"))
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
return NONE
|
||||
|
||||
@@ -269,10 +269,12 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list(
|
||||
/// A band-aid to keep the (unique) visual overlay from scaling and rotating along with its owner. I'm sorry.
|
||||
/datum/element/immerse/proc/on_update_transform(mob/living/source, resize, new_lying_angle, is_opposite_angle)
|
||||
SIGNAL_HANDLER
|
||||
var/atom/movable/immerse_mask/effect_relay = generated_visual_overlays[source]
|
||||
if (!effect_relay)
|
||||
return
|
||||
var/matrix/new_transform = matrix()
|
||||
new_transform.Scale(1 / source.current_size)
|
||||
new_transform.Turn(-new_lying_angle)
|
||||
var/atom/movable/immerse_mask/effect_relay = generated_visual_overlays[source]
|
||||
var/mutable_appearance/relay_appearance = new(effect_relay.appearance)
|
||||
relay_appearance.transform = new_transform
|
||||
effect_relay.appearance = relay_appearance
|
||||
@@ -281,10 +283,13 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list(
|
||||
/datum/element/immerse/proc/on_spin_animation(atom/source, speed, loops, segments, segment)
|
||||
SIGNAL_HANDLER
|
||||
var/atom/movable/immerse_mask/immerse_mask = generated_visual_overlays[source]
|
||||
immerse_mask.do_spin_animation(speed, loops, segments, -segment)
|
||||
if (immerse_mask)
|
||||
immerse_mask.do_spin_animation(speed, loops, segments, -segment)
|
||||
|
||||
/datum/element/immerse/proc/on_update_offsets(mob/living/source, new_x, new_y, new_w, new_z, animate)
|
||||
SIGNAL_HANDLER
|
||||
if (!generated_visual_overlays[source])
|
||||
return
|
||||
var/old_height = ceil(max(ICON_SIZE_Y - source.pixel_z, ICON_SIZE_Y) / ICON_SIZE_Y)
|
||||
var/new_height = ceil(max(ICON_SIZE_Y - new_z, ICON_SIZE_Y) / ICON_SIZE_Y)
|
||||
if (old_height != new_height)
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/// Element that grants an achievement to all mobs who killed the owner when it dies
|
||||
/datum/element/kill_achievement
|
||||
element_flags = ELEMENT_BESPOKE
|
||||
argument_hash_start_idx = 2
|
||||
/// Achievements to grant when killed
|
||||
var/list/achievement_types = null
|
||||
/// Achievement to grant when killed with a crusher
|
||||
var/crusher_achievement_type = null
|
||||
/// A memory to grant to killers, if any
|
||||
var/kill_memory_type = null
|
||||
/// Range in which to grant the achievement
|
||||
var/achievement_range = 7
|
||||
/// Threshold for damage dealt with a crusher to count it as a crusher kill
|
||||
/// If null, then no kill counts as a crusher kill
|
||||
var/crusher_kill_threshold = 0.6
|
||||
/// Blackbox tally string to record kills into
|
||||
var/tally_string = "megafauna_kills"
|
||||
|
||||
/datum/element/kill_achievement/Attach(datum/target, list/achievement_types, crusher_achievement_type, kill_memory_type, achievement_range = 7, crusher_kill_threshold = 0.6, tally_string = "megafauna_kills")
|
||||
. = ..()
|
||||
if (!isliving(target) || !length(achievement_types))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
src.achievement_types = achievement_types
|
||||
src.crusher_achievement_type = crusher_achievement_type
|
||||
src.kill_memory_type = kill_memory_type
|
||||
src.achievement_range = achievement_range
|
||||
src.crusher_kill_threshold = crusher_kill_threshold
|
||||
src.tally_string = tally_string
|
||||
RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death))
|
||||
|
||||
/datum/element/kill_achievement/Detach(datum/target)
|
||||
. = ..()
|
||||
UnregisterSignal(target, COMSIG_LIVING_DEATH)
|
||||
|
||||
/datum/element/kill_achievement/proc/on_death(mob/living/source, gibbed)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if ((source.flags_1 & ADMIN_SPAWNED_1) || !SSachievements.achievements_enabled)
|
||||
return
|
||||
|
||||
// Check whether we killed the megafauna with primarily crusher damage or not
|
||||
var/datum/status_effect/crusher_damage/crusher_dmg = source.has_status_effect(/datum/status_effect/crusher_damage)
|
||||
var/crusher_kill = (!isnull(crusher_kill_threshold) && crusher_dmg && (crusher_dmg.total_damage >= floor(source.maxHealth * 0.6)))
|
||||
var/turf/our_loc = get_turf(source)
|
||||
if (!our_loc)
|
||||
return
|
||||
|
||||
for (var/mob/living/player in SSmobs.clients_by_zlevel[our_loc.z])
|
||||
var/turf/player_turf = get_turf(player)
|
||||
if (player.stat || get_dist(player_turf, source) > achievement_range)
|
||||
continue
|
||||
|
||||
for (var/achievement_type in achievement_types)
|
||||
player.client.give_award(achievement_type, player)
|
||||
|
||||
if (kill_memory_type)
|
||||
player.add_mob_memory(kill_memory_type, antagonist = source)
|
||||
|
||||
if(crusher_kill && crusher_achievement_type && istype(player.get_active_held_item(), /obj/item/kinetic_crusher))
|
||||
player.client.give_award(crusher_achievement_type, player)
|
||||
|
||||
SSblackbox.record_feedback("tally", "[tally_string][crusher_kill ? "_crusher" : ""]", 1, "[initial(source.name)]")
|
||||
@@ -1,28 +0,0 @@
|
||||
///element given to mobs that can mine when moving
|
||||
/datum/element/proficient_miner
|
||||
|
||||
/datum/element/proficient_miner/Attach(datum/target)
|
||||
. = ..()
|
||||
if(!ismovable(target))
|
||||
return
|
||||
RegisterSignal(target, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump))
|
||||
|
||||
/datum/element/proficient_miner/proc/on_bump(mob/living/source, atom/target)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!ismineralturf(target) || (istype(source) && source.stat != CONSCIOUS))
|
||||
return
|
||||
|
||||
var/turf/closed/mineral/mineral_wall = target
|
||||
|
||||
if(!istype(mineral_wall, /turf/closed/mineral/gibtonite))
|
||||
mineral_wall.gets_drilled(source)
|
||||
return
|
||||
|
||||
var/turf/closed/mineral/gibtonite/gibtonite_wall = mineral_wall
|
||||
if(gibtonite_wall.stage == GIBTONITE_UNSTRUCK)
|
||||
mineral_wall.gets_drilled(source)
|
||||
|
||||
/datum/element/proficient_miner/Detach(datum/source, ...)
|
||||
UnregisterSignal(source, COMSIG_MOVABLE_BUMP)
|
||||
return ..()
|
||||
@@ -384,8 +384,8 @@
|
||||
result["name"] = item.name
|
||||
result["alternate"] = item_data.get_alternate_actions(owner, user)
|
||||
var/static/list/already_cried = list()
|
||||
if(length(result["alternate"]) > 2 && !(type in already_cried))
|
||||
stack_trace("Too many alternate actions for [type]! Only two are supported at the moment! This will look bad!")
|
||||
if(length(result["alternate"]) > 3 && !(type in already_cried))
|
||||
stack_trace("Too many alternate actions for [type]! Only three are supported at the moment! This will look bad!")
|
||||
already_cried += type
|
||||
|
||||
items[strippable_key] = result
|
||||
|
||||
+14
-4
@@ -21,13 +21,23 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
DATA_HUD_PERMIT = new /datum/atom_hud/data/human/permit(), // SKYRAT EDIT ADDITION
|
||||
))
|
||||
|
||||
/// Assoc list of traits to the huds they give.
|
||||
GLOBAL_LIST_INIT(trait_to_hud, list(
|
||||
TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED,
|
||||
TRAIT_MEDICAL_HUD = DATA_HUD_MEDICAL_ADVANCED,
|
||||
TRAIT_DIAGNOSTIC_HUD = DATA_HUD_DIAGNOSTIC,
|
||||
TRAIT_ABDUCTOR_HUD = DATA_HUD_ABDUCTOR,
|
||||
TRAIT_BOT_PATH_HUD = DATA_HUD_BOT_PATH,
|
||||
TRAIT_CLOWN_ENJOYER = DATA_HUD_FAN,
|
||||
TRAIT_DIAGNOSTIC_HUD = DATA_HUD_DIAGNOSTIC,
|
||||
TRAIT_MEDICAL_HUD = DATA_HUD_MEDICAL_ADVANCED,
|
||||
TRAIT_MEDICAL_HUD_SENSOR_ONLY = DATA_HUD_MEDICAL_BASIC,
|
||||
TRAIT_MIME_FAN = DATA_HUD_FAN,
|
||||
TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED,
|
||||
TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC,
|
||||
TRAIT_PERMIT_HUD = DATA_HUD_PERMIT, // SKYRAT EDIT ADDITION
|
||||
TRAIT_BASIC_SECURITY_HUD = DATA_HUD_SECURITY_BASIC // BUBBER EDIT ADDITION
|
||||
))
|
||||
|
||||
/// Assoc list of traits that block other traits' huds to list of hud (traits) that they block
|
||||
GLOBAL_LIST_INIT(trait_blockers_to_hud, list(
|
||||
TRAIT_BLOCK_SECHUD = list(TRAIT_SECURITY_HUD, TRAIT_SECURITY_HUD_ID_ONLY),
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
|
||||
@@ -467,6 +467,8 @@
|
||||
ACCESS_HOP,
|
||||
)
|
||||
job = /datum/job/clown
|
||||
honorifics = list("the Clown")
|
||||
honorific_positions = HONORIFIC_POSITION_LAST_FULL | HONORIFIC_POSITION_NONE
|
||||
|
||||
/datum/id_trim/job/cook
|
||||
assignment = JOB_COOK
|
||||
@@ -823,6 +825,8 @@
|
||||
ACCESS_HOP,
|
||||
)
|
||||
job = /datum/job/mime
|
||||
honorifics = list("the Mime")
|
||||
honorific_positions = HONORIFIC_POSITION_LAST_FULL | HONORIFIC_POSITION_NONE
|
||||
|
||||
/datum/id_trim/job/paramedic
|
||||
assignment = JOB_PARAMEDIC
|
||||
|
||||
@@ -59,3 +59,17 @@
|
||||
return
|
||||
user.mob.button_pressed_F12()
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/client/close_every_ui
|
||||
hotkey_keys = list("Northwest") // HOME key
|
||||
name = "close_every_ui"
|
||||
full_name = "Close Open UIs"
|
||||
description = "Closes all UI windows you have open."
|
||||
keybind_signal = COMSIG_KB_CLIENT_CLOSEUI_DOWN
|
||||
|
||||
/datum/keybinding/client/close_every_ui/down(client/user, turf/target)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
SStgui.close_user_uis(user.mob)
|
||||
return TRUE
|
||||
|
||||
@@ -23,8 +23,9 @@
|
||||
fishing_gravity_mult = 1.1
|
||||
|
||||
/datum/material/iron/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
return TRUE
|
||||
|
||||
///Breaks extremely easily but is transparent.
|
||||
/datum/material/glass
|
||||
@@ -62,8 +63,9 @@
|
||||
fishing_gravity_mult = 0.9
|
||||
|
||||
/datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch
|
||||
return TRUE
|
||||
|
||||
/datum/material/glass/on_main_applied(atom/source, mat_amount, multiplier)
|
||||
. = ..()
|
||||
@@ -110,8 +112,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
fishing_gravity_mult = 1.1
|
||||
|
||||
/datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
return TRUE
|
||||
|
||||
///Slight force increase
|
||||
/datum/material/gold
|
||||
@@ -186,8 +189,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
fishing_gravity_mult = 1.1
|
||||
|
||||
/datum/material/diamond/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
|
||||
return TRUE
|
||||
|
||||
///Is slightly radioactive
|
||||
/datum/material/uranium
|
||||
@@ -444,8 +448,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
fishing_gravity_mult = 1.1
|
||||
|
||||
/datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
|
||||
return TRUE
|
||||
|
||||
/datum/material/runite
|
||||
name = "runite"
|
||||
@@ -484,8 +489,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //light-absorbing, environment-cancelling fishing rod.
|
||||
|
||||
/datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
|
||||
return TRUE
|
||||
|
||||
///Force decrease
|
||||
/datum/material/plastic
|
||||
@@ -568,7 +574,8 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
wooden.resistance_flags &= ~FLAMMABLE
|
||||
|
||||
/datum/material/wood/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
|
||||
victim.reagents.add_reagent(/datum/reagent/cellulose, rand(8, 12))
|
||||
source_item?.reagents?.add_reagent(/datum/reagent/cellulose, source_item.reagents.total_volume*(2/5))
|
||||
|
||||
@@ -613,8 +620,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //light-absorbing, environment-cancelling fishing rod.
|
||||
|
||||
/datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
|
||||
return TRUE
|
||||
|
||||
///RPG Magic.
|
||||
/datum/material/mythril
|
||||
@@ -657,8 +665,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
qdel(source.GetComponent(/datum/component/fantasy))
|
||||
|
||||
/datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
|
||||
return TRUE
|
||||
|
||||
//formed when freon react with o2, emits a lot of plasma when heated
|
||||
/datum/material/hot_ice
|
||||
@@ -728,8 +737,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
fishing_gravity_mult = 0.7
|
||||
|
||||
/datum/material/metalhydrogen/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
|
||||
return TRUE
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
|
||||
return TRUE
|
||||
|
||||
//I don't like sand. It's coarse, and rough, and irritating, and it gets everywhere.
|
||||
/datum/material/sand
|
||||
@@ -847,7 +857,8 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
|
||||
/datum/material/runedmetal/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.reagents.add_reagent(/datum/reagent/fuel/unholywater, rand(8, 12))
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
return TRUE
|
||||
|
||||
/datum/material/bronze
|
||||
@@ -1079,6 +1090,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
REMOVE_TRAIT(source, TRAIT_ROD_IGNORE_ENVIRONMENT, REF(src)) //light-absorbing, environment-cancelling fishing rod.
|
||||
|
||||
/datum/material/zaukerite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
|
||||
victim.apply_damage(30, BURN, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
|
||||
victim.apply_damage(30, BURN, BODY_ZONE_HEAD, wound_bonus = 5)
|
||||
source_item?.reagents?.add_reagent(/datum/reagent/toxin/plasma, source_item.reagents.total_volume*5)
|
||||
return TRUE
|
||||
|
||||
@@ -500,6 +500,8 @@
|
||||
CRASH("set_assigned_role called with invalid role: [isnull(new_role) ? "null" : new_role]")
|
||||
. = assigned_role
|
||||
assigned_role = new_role
|
||||
if(!isnull(current))
|
||||
SEND_SIGNAL(current, COMSIG_MOB_MIND_SET_ROLE, new_role)
|
||||
|
||||
///Sets your holy role, giving/taking away traits related to if you're gaining/losing it.
|
||||
/datum/mind/proc/set_holy_role(new_holy_role)
|
||||
@@ -538,3 +540,13 @@
|
||||
|
||||
/mob/dead/observer/sync_mind()
|
||||
return
|
||||
|
||||
/// Iterates over this mind's assigned role's departments and returns a list of their primary work areas.
|
||||
/datum/mind/proc/get_work_areas()
|
||||
var/list/work_areas = list()
|
||||
for(var/department in assigned_role.departments_list)
|
||||
var/datum/job_department/dep = SSjob.joinable_departments_by_type[department]
|
||||
if(dep.primary_work_area)
|
||||
work_areas += dep.primary_work_area
|
||||
|
||||
return work_areas
|
||||
|
||||
+50
-40
@@ -18,8 +18,18 @@
|
||||
var/sanity = SANITY_NEUTRAL
|
||||
/// the total combined value of all visible moodlets for the mob
|
||||
var/shown_mood
|
||||
/// Moodlet value modifier
|
||||
/// Multiplier to the sum total of mood the mob is experiencing
|
||||
var/mood_modifier = 1
|
||||
/// Multiplier to positive moodlet values. Stacks with mood_modifier
|
||||
var/positive_mood_modifier = 1
|
||||
/// Multiplier to negative moodlet values. Stacks with mood_modifier
|
||||
var/negative_mood_modifier = 1
|
||||
/// Multiplier to the length of positive moodlets.
|
||||
/// Please don't set this to 0
|
||||
var/positive_moodlet_length_modifier = 1
|
||||
/// Multiplier to the length of negative moodlets.
|
||||
/// Please don't set this to 0
|
||||
var/negative_moodlet_length_modifier = 1
|
||||
/// Used to track what stage of moodies they're on (1-9)
|
||||
var/mood_level = MOOD_LEVEL_NEUTRAL
|
||||
/// To track what stage of sanity they're on (1-6)
|
||||
@@ -144,48 +154,46 @@
|
||||
* * category - (text) category of the mood event - see /datum/mood_event for category explanation
|
||||
* * type - (path) any /datum/mood_event
|
||||
*/
|
||||
/datum/mood/proc/add_mood_event(category, type, ...)
|
||||
// we may be passed an instantiated mood datum with a modified timeout
|
||||
// it is to be used as a vehicle to copy data from and then cleaned up afterwards.
|
||||
// why do it this way? because the params list may contain numbers, and we may not necessarily want those to be interpreted as a timeout modifier.
|
||||
// this is only used by the food quality system currently
|
||||
var/datum/mood_event/mood_to_copy_from
|
||||
if (istype(type, /datum/mood_event))
|
||||
mood_to_copy_from = type
|
||||
type = mood_to_copy_from.type
|
||||
if (!ispath(type, /datum/mood_event))
|
||||
CRASH("A non path ([type]), was used to add a mood event. This shouldn't be happening.")
|
||||
/datum/mood/proc/add_mood_event(category, new_type, ...)
|
||||
if (!ispath(new_type, /datum/mood_event))
|
||||
CRASH("A non path ([new_type]), was used to add a mood event. This shouldn't be happening.")
|
||||
if (!istext(category))
|
||||
category = REF(category)
|
||||
|
||||
var/datum/mood_event/the_event
|
||||
if (mood_events[category])
|
||||
the_event = mood_events[category]
|
||||
if (the_event.type == type)
|
||||
if (the_event.timeout)
|
||||
if (!isnull(mood_to_copy_from))
|
||||
the_event.timeout = mood_to_copy_from.timeout
|
||||
addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE))
|
||||
qdel(mood_to_copy_from)
|
||||
return // Don't need to update the event.
|
||||
|
||||
clear_mood_event(category)
|
||||
var/list/params = args.Copy(3)
|
||||
|
||||
params.Insert(1, mob_parent)
|
||||
the_event = new type(arglist(params))
|
||||
if (QDELETED(the_event)) // the mood event has been deleted for whatever reason (requires a job, etc)
|
||||
var/datum/mood_event/new_event = new new_type(category)
|
||||
if(!new_event.can_effect_mob(arglist(list(src, mob_parent) + params)))
|
||||
qdel(new_event)
|
||||
return
|
||||
|
||||
the_event.category = category
|
||||
if (!isnull(mood_to_copy_from))
|
||||
the_event.timeout = mood_to_copy_from.timeout
|
||||
qdel(mood_to_copy_from)
|
||||
mood_events[category] = the_event
|
||||
update_mood()
|
||||
var/datum/mood_event/existing_event = mood_events[category]
|
||||
if(existing_event)
|
||||
var/continue_adding = FALSE
|
||||
if(existing_event.type == new_event.type)
|
||||
continue_adding = existing_event.be_refreshed(arglist(list(src) + params))
|
||||
else
|
||||
continue_adding = existing_event.be_replaced(arglist(list(src, new_event) + params))
|
||||
if(!continue_adding)
|
||||
update_mood()
|
||||
qdel(new_event)
|
||||
return
|
||||
clear_mood_event(category)
|
||||
|
||||
if (the_event.timeout)
|
||||
addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE))
|
||||
new_event.on_add(src, mob_parent, params)
|
||||
mood_events[category] = new_event
|
||||
update_mood()
|
||||
if(new_event.mood_change == 0 || new_event.hidden)
|
||||
return
|
||||
if(new_event.mood_change > 0)
|
||||
add_personality_mood_to_viewers(mob_parent, "other_good_moodlet", list(
|
||||
/datum/personality/empathetic = /datum/mood_event/empathetic_happy,
|
||||
/datum/personality/misanthropic = /datum/mood_event/misanthropic_sad
|
||||
), range = 4)
|
||||
else
|
||||
add_personality_mood_to_viewers(mob_parent, "other_bad_moodlet", list(
|
||||
/datum/personality/empathetic = /datum/mood_event/empathetic_sad,
|
||||
/datum/personality/misanthropic = /datum/mood_event/misanthropic_happy
|
||||
), range = 4)
|
||||
|
||||
/**
|
||||
* Removes a mood event from the mob
|
||||
@@ -218,12 +226,14 @@
|
||||
|
||||
for(var/category in mood_events)
|
||||
var/datum/mood_event/the_event = mood_events[category]
|
||||
mood += the_event.mood_change
|
||||
var/event_mood = the_event.mood_change
|
||||
event_mood *= max((event_mood > 0) ? positive_mood_modifier : negative_mood_modifier, 0)
|
||||
mood += event_mood
|
||||
if (!the_event.hidden)
|
||||
shown_mood += the_event.mood_change
|
||||
shown_mood += event_mood
|
||||
|
||||
mood *= mood_modifier
|
||||
shown_mood *= mood_modifier
|
||||
mood *= max(mood_modifier, 0)
|
||||
shown_mood *= max(mood_modifier, 0)
|
||||
|
||||
switch(mood)
|
||||
if (-INFINITY to MOOD_SAD4)
|
||||
|
||||
@@ -12,7 +12,10 @@
|
||||
* is active while another mood event (from the same category) is triggered it will remove
|
||||
* the effects of the current mood event and replace it with the new one
|
||||
*/
|
||||
var/category
|
||||
VAR_FINAL/category
|
||||
/// Flags that determine what kind of event this is
|
||||
/// For example, you might have a "EVENT_FEAR" flag that denotes this mood event relates to being afraid of something
|
||||
var/event_flags = NONE
|
||||
/// Icon state of the unique mood event icon, if applicable
|
||||
var/special_screen_obj
|
||||
/// if false, it will be an overlay instead
|
||||
@@ -22,21 +25,117 @@
|
||||
/// List of required jobs for this mood event
|
||||
var/list/required_job
|
||||
|
||||
/datum/mood_event/New(mob/living/emotional_mob, ...)
|
||||
owner = emotional_mob
|
||||
var/list/params = args.Copy(2)
|
||||
if (LAZYLEN(required_job) && !is_type_in_list(owner.mind?.assigned_role, required_job))
|
||||
qdel(src)
|
||||
return
|
||||
add_effects(arglist(params))
|
||||
/datum/mood_event/New(category)
|
||||
src.category = category
|
||||
|
||||
/datum/mood_event/Destroy()
|
||||
remove_effects()
|
||||
owner = null
|
||||
if(owner)
|
||||
remove_effects()
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/datum/mood_event/proc/add_effects(param)
|
||||
/**
|
||||
* Called when this datum is created, checks if the passed mob can experience this mood event
|
||||
*
|
||||
* * who - the mob to check
|
||||
*
|
||||
* Return TRUE if the mob can experience this mood event
|
||||
* Return FALSE if the mob should be unaffected
|
||||
*/
|
||||
/datum/mood_event/proc/can_effect_mob(datum/mood/home, mob/living/who, ...)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(LAZYLEN(required_job) && !is_type_in_list(who.mind?.assigned_role, required_job))
|
||||
return FALSE
|
||||
|
||||
if((event_flags & MOOD_EVENT_WHIMSY))
|
||||
// Whimsical people get positive whimsical moodlets
|
||||
// Non-whimsical people get negative whimsical moodlets
|
||||
var/is_whimsical = HAS_PERSONALITY(who, /datum/personality/whimsical)
|
||||
if(mood_change >= 0 && !is_whimsical)
|
||||
return FALSE
|
||||
if(mood_change < 0 && is_whimsical)
|
||||
return FALSE
|
||||
|
||||
if((event_flags & MOOD_EVENT_ART) && HAS_PERSONALITY(who, /datum/personality/unimaginative))
|
||||
return FALSE
|
||||
|
||||
if((event_flags & MOOD_EVENT_PAIN) && HAS_TRAIT(who, TRAIT_ANALGESIA))
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Wrapper for the mood event being added to a mob
|
||||
*/
|
||||
/datum/mood_event/proc/on_add(datum/mood/home, mob/living/who, list/mood_args)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
|
||||
owner = who
|
||||
|
||||
if((event_flags & MOOD_EVENT_ART) && HAS_PERSONALITY(who, /datum/personality/creative))
|
||||
mood_change *= 1.2
|
||||
|
||||
if((event_flags & MOOD_EVENT_SPIRITUAL) && !HAS_TRAIT(who, TRAIT_SPIRITUAL))
|
||||
mood_change *= 0.2
|
||||
|
||||
if(event_flags & MOOD_EVENT_FOOD)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/ascetic))
|
||||
mood_change *= 0.75
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/gourmand))
|
||||
mood_change *= 1.25
|
||||
|
||||
if(event_flags & MOOD_EVENT_FEAR)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/cowardly))
|
||||
mood_change *= 1.25
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/brave))
|
||||
mood_change *= 0.75
|
||||
|
||||
add_effects(arglist(mood_args))
|
||||
|
||||
mood_change = floor(mood_change)
|
||||
|
||||
timeout *= max((mood_change > 0) ? home.positive_moodlet_length_modifier : home.negative_moodlet_length_modifier, 0.1)
|
||||
if(timeout)
|
||||
addtimer(CALLBACK(home, TYPE_PROC_REF(/datum/mood, clear_mood_event), category), timeout, (TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT))
|
||||
|
||||
/**
|
||||
* Called when added to a mob
|
||||
*
|
||||
* * ... - Any arguments passed to add_mood_event after the typepath are passed here
|
||||
*/
|
||||
/datum/mood_event/proc/add_effects(...)
|
||||
return
|
||||
|
||||
/**
|
||||
* Called when the event is cleared from a mob
|
||||
*/
|
||||
/datum/mood_event/proc/remove_effects()
|
||||
return
|
||||
|
||||
/**
|
||||
* Called when we get added to a mood datum, but a mood of our type in our category already
|
||||
*
|
||||
* * home - the mood datum we are being added to
|
||||
* * ... - any other arguments that are passed to the mood event
|
||||
*
|
||||
* Return BLOCK_NEW_MOOD to stop the new mood event from being added
|
||||
* Return ALLOW_NEW_MOOD to allow the new mood event to be added - note this implicitly deletes [src]
|
||||
*/
|
||||
/datum/mood_event/proc/be_refreshed(datum/mood/home, ...)
|
||||
// Base behavior is refresh the timer
|
||||
if(timeout)
|
||||
addtimer(CALLBACK(home, TYPE_PROC_REF(/datum/mood, clear_mood_event), category), timeout, (TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT))
|
||||
return BLOCK_NEW_MOOD
|
||||
|
||||
/**
|
||||
* Called when we get added to a mood datum, but a mood of a different type is in our category
|
||||
*
|
||||
* * home - the mood datum we are being added to
|
||||
* * new_event - the new mood event that is being added
|
||||
* * ... - any other arguments that are passed to the mood event
|
||||
*
|
||||
* Return BLOCK_NEW_MOOD to stop the new mood event from being added
|
||||
* Return ALLOW_NEW_MOOD to allow the new mood event to be added - note this implicitly deletes [src]
|
||||
*/
|
||||
/datum/mood_event/proc/be_replaced(datum/mood/home, datum/mood_event/new_event, ...)
|
||||
return ALLOW_NEW_MOOD
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
description = "Heh heh. \"It's on the mouse\". What a play on words."
|
||||
mood_change = 1
|
||||
timeout = 2 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/gondola_serenity
|
||||
description = "There's a lot that could be on your mind right now. But this feeling of contentedness, a universal calling to simply sit back and observe is washing over you..."
|
||||
|
||||
@@ -31,12 +31,22 @@
|
||||
if(90 to INFINITY)
|
||||
mood_change = 3 // crash out
|
||||
description = "You're my BESSST frien'... You and me agains' th' world, buddy. Le's get another drink."
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/teetotal))
|
||||
mood_change *= -1.5
|
||||
description = "I don't like drinking... It makes me feel horrible."
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/bibulous))
|
||||
mood_change *= 1.5
|
||||
if(old_mood != mood_change)
|
||||
owner.mob_mood.update_mood()
|
||||
|
||||
/datum/mood_event/drunk/remove_effects()
|
||||
QDEL_NULL(blush_overlay)
|
||||
|
||||
/datum/mood_event/drunk_after
|
||||
mood_change = 2
|
||||
description = "The buzz might be gone, but I still feel good."
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/wrong_brandy
|
||||
description = "I hate that type of drink."
|
||||
mood_change = -2
|
||||
|
||||
@@ -2,55 +2,62 @@
|
||||
description = "I really enjoyed eating that."
|
||||
mood_change = 5
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
/datum/mood_event/gross_food
|
||||
description = "I really didn't like that food."
|
||||
mood_change = -2
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
/datum/mood_event/disgusting_food
|
||||
description = "That food was disgusting!"
|
||||
mood_change = -6
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
/datum/mood_event/allergic_food
|
||||
description = "My throat itches."
|
||||
mood_change = -2
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
/datum/mood_event/breakfast
|
||||
description = "Nothing like a hearty breakfast to start the shift."
|
||||
mood_change = 2
|
||||
timeout = 10 MINUTES
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
/datum/mood_event/food
|
||||
timeout = 5 MINUTES
|
||||
var/quality = FOOD_QUALITY_NORMAL
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
/datum/mood_event/food/New(mob/M, ...)
|
||||
. = ..()
|
||||
mood_change = 2 + 2 * quality
|
||||
/datum/mood_event/food/add_effects(quality = FOOD_QUALITY_NORMAL, timeout_mod = 1)
|
||||
mood_change = calculate_mood_change(quality)
|
||||
timeout *= timeout_mod
|
||||
description = "That food was [GLOB.food_quality_description[quality]]."
|
||||
|
||||
/datum/mood_event/food/nice
|
||||
quality = FOOD_QUALITY_NICE
|
||||
/datum/mood_event/food/be_refreshed(datum/mood/home, quality, timeout_mod)
|
||||
var/old_mood = mood_change
|
||||
// updates timeout (which is handled in parent call) and mood
|
||||
timeout = max(timeout, initial(timeout) * timeout_mod)
|
||||
mood_change = max(mood_change, calculate_mood_change(quality))
|
||||
// if mood_change is the same, we don't need to update the description
|
||||
if(old_mood != mood_change)
|
||||
description = "That food was [GLOB.food_quality_description[quality]]."
|
||||
return ..()
|
||||
|
||||
/datum/mood_event/food/good
|
||||
quality = FOOD_QUALITY_GOOD
|
||||
|
||||
/datum/mood_event/food/verygood
|
||||
quality = FOOD_QUALITY_VERYGOOD
|
||||
|
||||
/datum/mood_event/food/fantastic
|
||||
quality = FOOD_QUALITY_FANTASTIC
|
||||
|
||||
/datum/mood_event/food/amazing
|
||||
quality = FOOD_QUALITY_AMAZING
|
||||
|
||||
/datum/mood_event/food/top
|
||||
quality = FOOD_QUALITY_TOP
|
||||
/datum/mood_event/food/proc/calculate_mood_change(base_quality)
|
||||
var/quality = 1 + 1.5 * base_quality
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/ascetic))
|
||||
quality *= 0.5
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/gourmand))
|
||||
if(quality <= FOOD_QUALITY_GOOD)
|
||||
quality = FOOD_QUALITY_NORMAL
|
||||
return ceil(quality)
|
||||
|
||||
/datum/mood_event/pacifist_eating_fish_item
|
||||
description = "I shouldn't be eating living creatures..."
|
||||
mood_change = -1 //The disgusting food moodlet already has a pretty big negative value, this is just for context.
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FOOD
|
||||
|
||||
@@ -10,10 +10,12 @@
|
||||
/datum/mood_event/on_fire
|
||||
description = "I'M ON FIRE!!!"
|
||||
mood_change = -12
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/suffocation
|
||||
description = "CAN'T... BREATHE..."
|
||||
mood_change = -12
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/burnt_thumb
|
||||
description = "I shouldn't play with lighters..."
|
||||
@@ -32,6 +34,7 @@
|
||||
description = "I've been creamed. Tastes like pie flavor."
|
||||
mood_change = -2
|
||||
timeout = 3 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY // if whimsical, no penalty
|
||||
|
||||
/datum/mood_event/inked
|
||||
description = "I've been splashed with squid ink. Tastes like salt."
|
||||
@@ -42,6 +45,7 @@
|
||||
description = "I slipped. I should be more careful next time..."
|
||||
mood_change = -2
|
||||
timeout = 3 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY // if whimsical, no penalty
|
||||
|
||||
/datum/mood_event/eye_stab
|
||||
description = "I used to be an adventurer like you, until I took a screwdriver to the eye."
|
||||
@@ -81,12 +85,7 @@
|
||||
description = "Ouch! My limb feels like I fell asleep on it."
|
||||
mood_change = -3
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/reattachment/New(mob/M, ...)
|
||||
if(HAS_TRAIT(M, TRAIT_ANALGESIA))
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
event_flags = MOOD_EVENT_PAIN
|
||||
|
||||
/datum/mood_event/reattachment/add_effects(obj/item/bodypart/limb)
|
||||
if(limb)
|
||||
@@ -117,12 +116,7 @@
|
||||
description = "That fucking table, man that hurts..."
|
||||
mood_change = -3
|
||||
timeout = 3 MINUTES
|
||||
|
||||
/datum/mood_event/table_limbsmash/New(mob/M, ...)
|
||||
if(HAS_TRAIT(M, TRAIT_ANALGESIA))
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
event_flags = MOOD_EVENT_PAIN
|
||||
|
||||
/datum/mood_event/table_limbsmash/add_effects(obj/item/bodypart/banged_limb)
|
||||
if(banged_limb)
|
||||
@@ -147,15 +141,18 @@
|
||||
/datum/mood_event/photophobia
|
||||
description = "The lights are too bright..."
|
||||
mood_change = -3
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/nyctophobia
|
||||
description = "It sure is dark around here..."
|
||||
mood_change = -3
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/claustrophobia
|
||||
description = "Why do I feel trapped?! Let me out!!!"
|
||||
mood_change = -7
|
||||
timeout = 1 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/bright_light
|
||||
description = "I hate it in the light... I need to find a darker place..."
|
||||
@@ -177,9 +174,14 @@
|
||||
description = "I'm nervous and on edge and I can't stand still!!"
|
||||
mood_change = -2
|
||||
|
||||
/datum/mood_event/jittery/add_effects(...)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/paranoid))
|
||||
mood_change -= 1
|
||||
|
||||
/datum/mood_event/choke
|
||||
description = "I CAN'T BREATHE!!!"
|
||||
mood_change = -10
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/vomit
|
||||
description = "I just threw up. Gross."
|
||||
@@ -195,27 +197,25 @@
|
||||
description = "Medicine may be good for me but right now it stings like hell."
|
||||
mood_change = -5
|
||||
timeout = 60 SECONDS
|
||||
|
||||
/datum/mood_event/painful_medicine/New(mob/M, ...)
|
||||
if(HAS_TRAIT(M, TRAIT_ANALGESIA))
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
event_flags = MOOD_EVENT_PAIN
|
||||
|
||||
/datum/mood_event/startled
|
||||
description = "Hearing that word made me think about something scary."
|
||||
mood_change = -1
|
||||
timeout = 1 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/phobia
|
||||
description = "I saw something very frightening."
|
||||
description = "I saw something very frightening!"
|
||||
mood_change = -4
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/spooked
|
||||
description = "The rattling of those bones... It still haunts me."
|
||||
mood_change = -4
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/notcreeping
|
||||
description = "The voices are not happy, and they painfully contort my thoughts into getting back on task."
|
||||
@@ -243,12 +243,7 @@
|
||||
/datum/mood_event/back_pain
|
||||
description = "Bags never sit right on my back, this hurts like hell!"
|
||||
mood_change = -15
|
||||
|
||||
/datum/mood_event/back_pain/New(mob/M, ...)
|
||||
if(HAS_TRAIT(M, TRAIT_ANALGESIA))
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
event_flags = MOOD_EVENT_PAIN
|
||||
|
||||
/datum/mood_event/sad_empath
|
||||
description = "Someone seems upset..."
|
||||
@@ -262,11 +257,18 @@
|
||||
description = "Those darn savages!"
|
||||
mood_change = -5
|
||||
timeout = 2 MINUTES
|
||||
event_flags = MOOD_EVENT_SPIRITUAL
|
||||
|
||||
/datum/mood_event/artbad
|
||||
description = "I've produced better art than that from my ass."
|
||||
mood_change = -2
|
||||
timeout = 2 MINUTES
|
||||
event_flags = MOOD_EVENT_ART
|
||||
|
||||
/datum/mood_event/artbad/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/creative))
|
||||
mood_change = 0
|
||||
description = "Everyone has to start their art journey somewhere!"
|
||||
|
||||
/datum/mood_event/graverobbing
|
||||
description = "I just desecrated someone's grave... I can't believe I did that..."
|
||||
@@ -280,6 +282,7 @@
|
||||
/datum/mood_event/gunpoint
|
||||
description = "This guy is insane! I better be careful..."
|
||||
mood_change = -10
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/tripped
|
||||
description = "I can't believe I fell for the oldest trick in the book!"
|
||||
@@ -295,6 +298,7 @@
|
||||
description = "I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!"
|
||||
mood_change = -25
|
||||
timeout = 4 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/high_five_full_hand
|
||||
description = "Oh god, I don't even know how to high-five correctly..."
|
||||
@@ -320,6 +324,7 @@
|
||||
/datum/mood_event/surgery
|
||||
description = "THEY'RE CUTTING ME OPEN!!"
|
||||
mood_change = -8
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
var/surgery_completed = FALSE
|
||||
|
||||
/datum/mood_event/surgery/success
|
||||
@@ -423,16 +428,19 @@
|
||||
/datum/mood_event/gamer_withdrawal
|
||||
description = "I wish I was gaming right now..."
|
||||
mood_change = -5
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/gamer_lost
|
||||
description = "If I'm not good at video games, can I truly call myself a gamer?"
|
||||
mood_change = -10
|
||||
mood_change = -6
|
||||
timeout = 10 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/lost_52_card_pickup
|
||||
description = "This is really embarrassing! I'm ashamed to pick up all these cards off the floor..."
|
||||
mood_change = -3
|
||||
timeout = 3 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/russian_roulette_lose_cheater
|
||||
description = "I gambled and lost! Good thing I wasn't aiming for my head..."
|
||||
@@ -444,6 +452,12 @@
|
||||
mood_change = -20
|
||||
timeout = 10 MINUTES
|
||||
|
||||
/datum/mood_event/russian_roulette_lose/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/gambler))
|
||||
mood_change *= 0.5
|
||||
description = "I gambled my life and lost! Truth is, the game was rigged from the start..."
|
||||
return
|
||||
|
||||
/datum/mood_event/bad_touch_bear_hug
|
||||
description = "I just got squeezed way too hard."
|
||||
mood_change = -1
|
||||
@@ -473,11 +487,17 @@
|
||||
description = "THE MOON JUDGES AND FINDS ME WANTING!!!"
|
||||
mood_change = -3
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/moon_insanity/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/spiritual))
|
||||
mood_change *= 2
|
||||
|
||||
/datum/mood_event/amulet_insanity
|
||||
description = "I sEe THe LiGHt, It mUsT BE stOPPed"
|
||||
description = "I sEe THe LiGHt, It mUsT BE stOPPed!"
|
||||
mood_change = -6
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/mallet_humiliation
|
||||
description = "Getting hit by such a stupid weapon feels rather humiliating..."
|
||||
@@ -535,7 +555,183 @@
|
||||
description = "Blowing smoke in my face, really?"
|
||||
mood_change = 0
|
||||
|
||||
/datum/mood_event/see_death
|
||||
description = "I just saw someone die. How horrible..."
|
||||
mood_change = -8
|
||||
timeout = 5 MINUTES
|
||||
/// Message variant for callous people
|
||||
var/dont_care_message = "Oh, %DEAD_MOB% died. Shame, I guess."
|
||||
/// Message variant for people who care about animals
|
||||
var/pet_message = "%DEAD_MOB% just died!!"
|
||||
/// Message variant for desensitized people (security, medical, cult with halo, etc)
|
||||
var/desensitized_message = "I saw %DEAD_MOB% die."
|
||||
var/normal_message = "I just saw %DEAD_MOB% die. How horrible..."
|
||||
|
||||
/datum/mood_event/see_death/add_effects(mob/dead_mob)
|
||||
if(isnull(dead_mob))
|
||||
return
|
||||
if(HAS_TRAIT(owner, TRAIT_CULT_HALO) && !HAS_TRAIT(dead_mob, TRAIT_CULT_HALO))
|
||||
// When cultists get halos, they stop caring about death
|
||||
mood_change = 4
|
||||
description = "More souls for the Geometer!"
|
||||
return
|
||||
|
||||
var/ispet = istype(dead_mob, /mob/living/basic/pet) || ismonkey(dead_mob)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous) || (ispet && HAS_PERSONALITY(owner, /datum/personality/animal_disliker)))
|
||||
description = replacetext(dont_care_message, "%DEAD_MOB%", get_descriptor(dead_mob))
|
||||
mood_change = 0
|
||||
timeout *= 0.5
|
||||
return
|
||||
// future todo : make the hop care about ian, cmo runtime, etc.
|
||||
if(ispet)
|
||||
description = replacetext(pet_message, "%DEAD_MOB%", capitalize(dead_mob.name)) // doesn't use a descriptor, so it says "Ian died"
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/animal_friend))
|
||||
mood_change *= 1.5
|
||||
timeout *= 1.25
|
||||
else if(!HAS_PERSONALITY(owner, /datum/personality/compassionate))
|
||||
mood_change *= 0.25
|
||||
timeout *= 0.5
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/compassionate))
|
||||
mood_change *= 1.5
|
||||
timeout *= 1.5
|
||||
if(HAS_TRAIT(owner, TRAIT_DESENSITIZED))
|
||||
mood_change *= 0.5
|
||||
timeout *= 0.5
|
||||
description = replacetext(desensitized_message, "%DEAD_MOB%", get_descriptor(dead_mob))
|
||||
return
|
||||
|
||||
description = replacetext(normal_message, "%DEAD_MOB%", get_descriptor(dead_mob))
|
||||
|
||||
/datum/mood_event/see_death/be_refreshed(datum/mood/home, ...)
|
||||
// Every time we get refreshed we get worse if not desensitized
|
||||
if(!HAS_TRAIT(owner, TRAIT_DESENSITIZED))
|
||||
mood_change *= 1.5
|
||||
return ..()
|
||||
|
||||
/datum/mood_event/see_death/be_replaced(datum/mood/home, datum/mood_event/new_event, ...)
|
||||
// Only be replaced if the incoming event's base mood is worse than our base mood
|
||||
// (IE: replace normal death events with gib events, but not the other way around)
|
||||
if(initial(new_event.mood_change) > initial(mood_change))
|
||||
new_event.mood_change = max(new_event.mood_change, mood_change * 1.5)
|
||||
return ..()
|
||||
// Otherwise if it's equivalent or worse, refresh it instead
|
||||
return be_refreshed(home)
|
||||
|
||||
/// Changes "I saw Joe x" to "I saw the engineer x"
|
||||
/datum/mood_event/see_death/proc/get_descriptor(mob/dead_mob)
|
||||
if(isnull(dead_mob))
|
||||
return "something"
|
||||
if(dead_mob.name != "Unknown" && dead_mob.mind?.assigned_role?.job_flags & JOB_CREW_MEMBER)
|
||||
return "the [LOWER_TEXT(dead_mob.mind?.assigned_role.title)]"
|
||||
return "someone"
|
||||
|
||||
/datum/mood_event/see_death/gibbed
|
||||
description = "Someone just exploded in front of me!!"
|
||||
mood_change = -12
|
||||
timeout = 10 MINUTES
|
||||
dont_care_message = "Oh, %DEAD_MOB% exploded. Now I have to get the mop."
|
||||
pet_message = "%DEAD_MOB% just exploded!!"
|
||||
desensitized_message = "I saw %DEAD_MOB% explode."
|
||||
normal_message = "%DEAD_MOB% just exploded in front of me!!"
|
||||
|
||||
/datum/mood_event/see_death/dusted
|
||||
description = "Someone was just vaporized in front of me!! I don't feel so good..."
|
||||
mood_change = -12
|
||||
timeout = 10 MINUTES
|
||||
dont_care_message = "Oh, %DEAD_MOB% was vaporized. Now I have to get the dustpan."
|
||||
pet_message = "%DEAD_MOB% just vaporized!!"
|
||||
desensitized_message = "I saw %DEAD_MOB% get vaporized."
|
||||
normal_message = "%DEAD_MOB% was just vaporized in front of me!!"
|
||||
|
||||
/datum/mood_event/slots/loss
|
||||
description = "Aww dang it!"
|
||||
mood_change = -2
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/slots/loss/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/gambler))
|
||||
mood_change = 0
|
||||
description = "Aww dang it."
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent))
|
||||
mood_change *= 1.5
|
||||
|
||||
/datum/mood_event/lost_control_of_life
|
||||
description = "I've lost control of my life."
|
||||
mood_change = -5
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/empathetic_sad
|
||||
description = "Seeing sad people makes me sad."
|
||||
mood_change = -2
|
||||
timeout = 3 MINUTES
|
||||
|
||||
/datum/mood_event/misanthropic_sad
|
||||
description = "Seeing happy people makes me uneasy."
|
||||
mood_change = -2
|
||||
timeout = 3 MINUTES
|
||||
|
||||
/datum/mood_event/paranoid/one_on_one
|
||||
description = "I'm alone with someone - what if they want to kill me?"
|
||||
mood_change = -3
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/paranoid/large_group
|
||||
description = "There are so many people around - any one of them could be out to get me!"
|
||||
mood_change = -3
|
||||
event_flags = MOOD_EVENT_FEAR
|
||||
|
||||
/datum/mood_event/nt_disillusioned
|
||||
description = "I hate the company, and everything it stands for."
|
||||
mood_change = -2
|
||||
|
||||
/datum/mood_event/disillusioned_revs_lost
|
||||
description = "The revolution was defeated... greaaaat."
|
||||
mood_change = -2
|
||||
timeout = 10 MINUTES
|
||||
|
||||
/datum/mood_event/loyalist_revs_win
|
||||
description = "The revolution was a success... This will hurt quarterly profits."
|
||||
mood_change = -2
|
||||
timeout = 10 MINUTES
|
||||
|
||||
/datum/mood_event/slacking_off_diligent
|
||||
description = "I should get back to work."
|
||||
mood_change = -1
|
||||
|
||||
/datum/mood_event/unimaginative_patronage
|
||||
description = "That felt like a waste of money."
|
||||
mood_change = -2
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/unimaginative_framing
|
||||
description = "I could've hung something more useful there."
|
||||
mood_change = -2
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/unimaginative_sculpting
|
||||
description = "That felt like a waste of materials."
|
||||
mood_change = -2
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/splattered_with_blood
|
||||
description = "Eugh, I just got coated in blood!"
|
||||
mood_change = -4
|
||||
timeout = 4 MINUTES
|
||||
|
||||
/datum/mood_event/splattered_with_blood/can_effect_mob(datum/mood/home, mob/living/who, ...)
|
||||
if(isvampire(who))
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/mood_event/splattered_with_blood/add_effects(...)
|
||||
if(HAS_TRAIT(owner, TRAIT_CULT_HALO))
|
||||
mood_change = 2
|
||||
description = "Blood, blood! The Geometer will be pleased."
|
||||
return
|
||||
if(HAS_TRAIT(owner, TRAIT_MORBID) || HAS_TRAIT(owner, TRAIT_EVIL))
|
||||
mood_change = 0
|
||||
description = "I just got coated in blood. Fascinating!"
|
||||
return
|
||||
|
||||
@@ -3,17 +3,53 @@
|
||||
mood_change = 1
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/hug/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aromantic))
|
||||
mood_change = -1
|
||||
description = "A hug? Call HR!"
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aloof))
|
||||
mood_change = -1
|
||||
description = "I would prefer not to be touched."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous))
|
||||
mood_change = 0
|
||||
description = "I hate hugs."
|
||||
return
|
||||
|
||||
/datum/mood_event/bear_hug
|
||||
description = "I got squeezed very tightly, but it was quite nice."
|
||||
mood_change = 1
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/bear_hug/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aromantic) \
|
||||
|| HAS_PERSONALITY(owner, /datum/personality/aloof) \
|
||||
|| HAS_PERSONALITY(owner, /datum/personality/callous) \
|
||||
)
|
||||
mood_change = -2
|
||||
description = "They're squeezing me too tightly!"
|
||||
return
|
||||
|
||||
/datum/mood_event/betterhug
|
||||
description = "Someone was very nice to me."
|
||||
mood_change = 3
|
||||
timeout = 4 MINUTES
|
||||
|
||||
/datum/mood_event/betterhug/add_effects(mob/friend)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aromantic))
|
||||
mood_change = 1
|
||||
description = "[friend.name] is nice, but that's it."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aloof))
|
||||
mood_change = 1
|
||||
description = "[friend.name] is nice, but I wish they'd stop touching me."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous))
|
||||
mood_change = 0
|
||||
description = "[friend.name] is way too nice for this station."
|
||||
return
|
||||
|
||||
description = "[friend.name] was very nice to me."
|
||||
|
||||
/datum/mood_event/besthug
|
||||
@@ -22,6 +58,19 @@
|
||||
timeout = 4 MINUTES
|
||||
|
||||
/datum/mood_event/besthug/add_effects(mob/friend)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aromantic))
|
||||
mood_change = 2
|
||||
description = "[friend.name] is great to be around, but that's it."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aloof))
|
||||
mood_change = 2
|
||||
description = "[friend.name] is great to be around, but I wish they'd stop touching me."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous))
|
||||
mood_change = 0
|
||||
description = "[friend.name] is way too nice for this station."
|
||||
return
|
||||
|
||||
description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!"
|
||||
|
||||
/datum/mood_event/warmhug
|
||||
@@ -29,20 +78,49 @@
|
||||
mood_change = 1
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/warmhug/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aromantic))
|
||||
mood_change = 0
|
||||
description = "I don't like hugs, but the warmth is nice...."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aloof))
|
||||
mood_change = 0
|
||||
description = "I would prefer not to be touched, but the warmth is nice...."
|
||||
return
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous))
|
||||
mood_change = 0
|
||||
description = "I hate hugs. I can warm myself up."
|
||||
return
|
||||
|
||||
/datum/mood_event/tailpulled
|
||||
description = "I love getting my tail pulled!"
|
||||
mood_change = 1
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/tailpulled/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aloof) \
|
||||
|| HAS_PERSONALITY(owner, /datum/personality/aromantic) \
|
||||
|| HAS_PERSONALITY(owner, /datum/personality/callous) \
|
||||
)
|
||||
mood_change = -2
|
||||
description = "Who the hell is touching my tail?"
|
||||
|
||||
/datum/mood_event/arcade
|
||||
description = "I beat the arcade game!"
|
||||
mood_change = 3
|
||||
timeout = 8 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/arcade/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent))
|
||||
mood_change = -1
|
||||
description = "Wow, I beat the game. I could've been doing anything productive instead."
|
||||
|
||||
/datum/mood_event/blessing
|
||||
description = "I've been blessed."
|
||||
mood_change = 3
|
||||
mood_change = 1
|
||||
timeout = 8 MINUTES
|
||||
event_flags = MOOD_EVENT_SPIRITUAL
|
||||
|
||||
/datum/mood_event/maintenance_adaptation
|
||||
mood_change = 8
|
||||
@@ -55,21 +133,67 @@
|
||||
mood_change = 1
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/book_nerd/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/erudite))
|
||||
mood_change = 2
|
||||
description = "I love reading books!"
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/uneducated))
|
||||
mood_change = -1
|
||||
description = "Who cares about books?"
|
||||
|
||||
/datum/mood_event/exercise
|
||||
description = "Working out releases those endorphins!"
|
||||
mood_change = 1
|
||||
|
||||
/datum/mood_event/exercise/add_effects(fitness_level)
|
||||
mood_change = fitness_level // the more fit you are, the more you like to work out
|
||||
return ..()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/slacking/lazy))
|
||||
mood_change *= -0.5
|
||||
description = "Working out, what a chore!"
|
||||
else if(!HAS_PERSONALITY(owner, /datum/personality/athletic))
|
||||
mood_change *= 0.5
|
||||
description = "Working out is a bit of a chore, but it is pretty fulfilling."
|
||||
|
||||
/datum/mood_event/pet_animal
|
||||
description = "Animals are adorable! I can't stop petting them!"
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
/// Tracks the typepath of animal we last petted
|
||||
var/animal_type
|
||||
|
||||
/datum/mood_event/pet_animal/add_effects(mob/animal)
|
||||
description = "\The [animal.name] is adorable! I can't stop petting [animal.p_them()]!"
|
||||
animal_type = animal?.type
|
||||
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/animal_disliker))
|
||||
mood_change = -1
|
||||
description = "Ewww, [animal.name] is so dirty! I don't want to touch it!"
|
||||
return
|
||||
|
||||
var/dog_fan = HAS_PERSONALITY(owner, /datum/personality/dog_fan)
|
||||
var/isdog = istype(animal, /mob/living/basic/pet/dog)
|
||||
var/cat_fan = HAS_PERSONALITY(owner, /datum/personality/cat_fan)
|
||||
var/iscat = istype(animal, /mob/living/basic/pet/cat)
|
||||
if((dog_fan && isdog) || (cat_fan && iscat) || HAS_PERSONALITY(owner, /datum/personality/animal_friend))
|
||||
mood_change = 3
|
||||
description = "I love [animal.name] so much, [animal.p_theyre()] so adorable! I can't stop petting [animal.p_them()]!"
|
||||
return
|
||||
if(dog_fan && iscat)
|
||||
mood_change = -1
|
||||
description = "I don't like [animal.name]! I prefer dogs!"
|
||||
return
|
||||
if(cat_fan && isdog)
|
||||
mood_change = -1
|
||||
description = "I don't like [animal.name]! I prefer cats!"
|
||||
return
|
||||
|
||||
mood_change = 1
|
||||
description = "[animal.name] is adorable!"
|
||||
|
||||
// Change the moodlet if we get refreshed (we may have pet another type of animal)
|
||||
/datum/mood_event/pet_animal/be_refreshed(datum/mood/home, mob/animal)
|
||||
. = ..()
|
||||
if(animal_type == animal?.type)
|
||||
return
|
||||
add_effects(animal)
|
||||
|
||||
/datum/mood_event/honk
|
||||
description = "I've been honked!"
|
||||
@@ -77,12 +201,21 @@
|
||||
timeout = 4 MINUTES
|
||||
special_screen_obj = "honked_nose"
|
||||
special_screen_replace = FALSE
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/saved_life
|
||||
description = "It feels good to save a life."
|
||||
mood_change = 6
|
||||
timeout = 8 MINUTES
|
||||
|
||||
/datum/mood_event/saved_life/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous))
|
||||
mood_change = 0
|
||||
description = "I don't care much for saving lives."
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/misanthropic))
|
||||
mood_change = -1
|
||||
description = "Saving lives is a waste of time."
|
||||
|
||||
/datum/mood_event/oblivious
|
||||
description = "What a lovely day."
|
||||
mood_change = 3
|
||||
@@ -94,16 +227,21 @@
|
||||
|
||||
/datum/mood_event/focused
|
||||
description = "I have a goal, and I will reach it, whatever it takes!" //Used for syndies, nukeops etc so they can focus on their goals
|
||||
mood_change = 4
|
||||
mood_change = 8
|
||||
hidden = TRUE
|
||||
|
||||
/datum/mood_event/badass_antag
|
||||
description = "I'm a fucking badass and everyone around me knows it. Just look at them; they're all fucking shaking at the mere thought of having me around."
|
||||
mood_change = 7
|
||||
mood_change = 8
|
||||
hidden = TRUE
|
||||
special_screen_obj = "badass_sun"
|
||||
special_screen_replace = FALSE
|
||||
|
||||
/datum/mood_event/ling
|
||||
description = "We have a goal, and we will reach it, whatever it takes!"
|
||||
mood_change = 12
|
||||
hidden = TRUE
|
||||
|
||||
/datum/mood_event/creeping
|
||||
description = "The voices have released their hooks on my mind! I feel free again!" //creeps get it when they are around their obsession
|
||||
mood_change = 18
|
||||
@@ -117,17 +255,17 @@
|
||||
|
||||
/datum/mood_event/cult
|
||||
description = "I have seen the truth, praise the almighty one!"
|
||||
mood_change = 10 //maybe being a cultist isn't that bad after all
|
||||
mood_change = 12 //maybe being a cultist isn't that bad after all
|
||||
hidden = TRUE
|
||||
|
||||
/datum/mood_event/heretics
|
||||
description = "THE HIGHER I RISE, THE MORE I SEE."
|
||||
mood_change = 10 //maybe being a heretic isnt that bad after all
|
||||
mood_change = 12 //maybe being a heretic isnt that bad after all
|
||||
hidden = TRUE
|
||||
|
||||
/datum/mood_event/rift_fishing
|
||||
description = "THE MORE I FISH, THE HIGHER I RISE."
|
||||
mood_change = 7
|
||||
mood_change = 6
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/family_heirloom
|
||||
@@ -146,6 +284,7 @@
|
||||
description = "There is something soothing about this music."
|
||||
mood_change = 3
|
||||
timeout = 60 SECONDS
|
||||
event_flags = MOOD_EVENT_ART
|
||||
|
||||
/datum/mood_event/chemical_euphoria
|
||||
description = "Heh...hehehe...hehe..."
|
||||
@@ -165,30 +304,35 @@
|
||||
description = "I feel comforted by the presence of a holy person."
|
||||
mood_change = 3
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_SPIRITUAL
|
||||
|
||||
/datum/mood_event/clownshoes
|
||||
description = "The shoes are a clown's legacy, I never want to take them off!"
|
||||
mood_change = 5
|
||||
mood_change = 3
|
||||
|
||||
/datum/mood_event/sacrifice_good
|
||||
description = "The gods are pleased with this offering!"
|
||||
mood_change = 5
|
||||
timeout = 3 MINUTES
|
||||
event_flags = MOOD_EVENT_SPIRITUAL
|
||||
|
||||
/datum/mood_event/artok
|
||||
description = "It's nice to see people are making art around here."
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_ART
|
||||
|
||||
/datum/mood_event/artgood
|
||||
description = "What a thought-provoking piece of art. I'll remember that for a while."
|
||||
mood_change = 4
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_ART
|
||||
|
||||
/datum/mood_event/artgreat
|
||||
description = "That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this."
|
||||
mood_change = 6
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_ART
|
||||
|
||||
/datum/mood_event/bottle_flip
|
||||
description = "The bottle landing like that was satisfying."
|
||||
@@ -199,6 +343,12 @@
|
||||
description = "What a peculiar emblem. It makes me feel hopeful for my future."
|
||||
mood_change = 6
|
||||
|
||||
/datum/mood_event/hope_lavaland/add_effects(...)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/pessimistic))
|
||||
mood_change = 0
|
||||
description = "This emblem is a lie. There is no hope for me."
|
||||
return
|
||||
|
||||
/datum/mood_event/confident_mane
|
||||
description = "I'm feeling confident with a head full of hair."
|
||||
mood_change = 2
|
||||
@@ -215,27 +365,45 @@
|
||||
|
||||
/datum/mood_event/helped_up
|
||||
description = "Helping them up felt good!"
|
||||
mood_change = 2
|
||||
timeout = 45 SECONDS
|
||||
|
||||
/datum/mood_event/helped_up/can_effect_mob(datum/mood/home, mob/living/who, ...)
|
||||
if(!HAS_PERSONALITY(owner, /datum/personality/compassionate) \
|
||||
&& !HAS_PERSONALITY(owner, /datum/personality/callous) \
|
||||
&& !HAS_PERSONALITY(owner, /datum/personality/misanthropic))
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/mood_event/helped_up/add_effects(mob/other_person, helper)
|
||||
if(!other_person)
|
||||
return
|
||||
|
||||
if(helper)
|
||||
description = "Helping [other_person] up felt good!"
|
||||
else
|
||||
description = "[other_person] helped me up, how nice of [other_person.p_them()]!"
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/callous) || HAS_PERSONALITY(owner, /datum/personality/misanthropic))
|
||||
mood_change = -2
|
||||
if(helper)
|
||||
description = "They should have helped themselves."
|
||||
else
|
||||
description = "I could've gotten up myself."
|
||||
|
||||
else if(HAS_PERSONALITY(owner, /datum/personality/compassionate))
|
||||
mood_change = 2
|
||||
if(helper)
|
||||
description = "Helping [other_person] up felt good!"
|
||||
else
|
||||
description = "[other_person] helped me up, how nice of [other_person.p_them()]!"
|
||||
|
||||
/datum/mood_event/high_ten
|
||||
description = "AMAZING! A HIGH-TEN!"
|
||||
mood_change = 3
|
||||
timeout = 45 SECONDS
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/down_low
|
||||
description = "HA! What a rube, they never stood a chance..."
|
||||
mood_change = 4
|
||||
timeout = 90 SECONDS
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/aquarium_positive
|
||||
description = "Watching fish in an aquarium is calming."
|
||||
@@ -252,6 +420,10 @@
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/kiss/add_effects(mob/beau, direct)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/aromantic))
|
||||
mood_change = -2
|
||||
description = "A kiss? Call HR!"
|
||||
return
|
||||
if(!beau)
|
||||
return
|
||||
if(direct)
|
||||
@@ -277,6 +449,7 @@
|
||||
description = "Ahaha! It's always funny to see someone get sprayed by a can of soda."
|
||||
mood_change = 2
|
||||
timeout = 30 SECONDS
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/observed_soda_spill/add_effects(mob/spilled_mob, atom/soda_can)
|
||||
if(!spilled_mob)
|
||||
@@ -288,17 +461,29 @@
|
||||
description = "I'm enjoying a nice gaming session!"
|
||||
mood_change = 2
|
||||
timeout = 30 SECONDS
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/gaming/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent))
|
||||
mood_change = -1
|
||||
description = "Is now really the time to be playing games? I should be working."
|
||||
|
||||
/datum/mood_event/gamer_won
|
||||
description = "I love winning video games!"
|
||||
mood_change = 10
|
||||
mood_change = 6
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/love_reagent
|
||||
description = "This food reminds me of the good ol' days."
|
||||
mood_change = 5
|
||||
|
||||
/datum/mood_event/love_reagent/add_effects(duration)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/pessimistic))
|
||||
mood_change = 0
|
||||
description = "This food is okay, I guess."
|
||||
return
|
||||
|
||||
if(isnum(duration))
|
||||
timeout = duration
|
||||
|
||||
@@ -306,11 +491,13 @@
|
||||
description = "HA! That loser will be picking cards up for a long time!"
|
||||
mood_change = 3
|
||||
timeout = 3 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/playing_cards
|
||||
description = "I'm enjoying playing cards with other people!"
|
||||
mood_change = 2
|
||||
timeout = 3 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/playing_cards/add_effects(param)
|
||||
var/card_players = 1
|
||||
@@ -334,7 +521,8 @@
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/russian_roulette_win/add_effects(loaded_rounds)
|
||||
mood_change = 2 ** loaded_rounds
|
||||
var/base = HAS_PERSONALITY(owner, /datum/personality/gambler) ? 2 : 1.8
|
||||
mood_change = round(base ** loaded_rounds, 1)
|
||||
|
||||
/datum/mood_event/fishing
|
||||
description = "Fishing is relaxing."
|
||||
@@ -359,6 +547,7 @@
|
||||
description = "It felt nice to pet the fish."
|
||||
mood_change = 2
|
||||
timeout = 2 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/fish_petting/add_effects(obj/item/fish/fish, morbid)
|
||||
if(!morbid)
|
||||
@@ -391,11 +580,13 @@
|
||||
description = "Swish! Nothing but net."
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/basketball_dunk
|
||||
description = "Slam dunk! Boom, shakalaka!"
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY | MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/moon_smile
|
||||
description = "THE MOON SHOWS ME THE TRUTH AND ITS SMILE IS FACED TOWARDS ME!!!"
|
||||
@@ -410,3 +601,103 @@
|
||||
/datum/mood_event/prophat
|
||||
description = "This hat fills me with whimsical joy!"
|
||||
mood_change = 2
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
/datum/mood_event/slots
|
||||
description = "Let's go gambling!"
|
||||
mood_change = 1
|
||||
timeout = 1 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/slots/add_effects()
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/gambler))
|
||||
mood_change *= 2
|
||||
else if(HAS_PERSONALITY(owner, /datum/personality/industrious) || HAS_PERSONALITY(owner, /datum/personality/slacking/diligent))
|
||||
mood_change *= -1
|
||||
description = "Why am I gambling my time and money away?"
|
||||
|
||||
|
||||
/datum/mood_event/slots/win
|
||||
description = "Aw yeah I won!"
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
event_flags = MOOD_EVENT_GAMING
|
||||
|
||||
/datum/mood_event/slots/win/be_replaced(datum/mood/home, datum/mood_event/new_event, ...)
|
||||
if(new_event.mood_change < mood_change)
|
||||
return BLOCK_NEW_MOOD
|
||||
return ..()
|
||||
|
||||
/datum/mood_event/slots/win/big
|
||||
mood_change = 3
|
||||
timeout = 10 MINUTES
|
||||
|
||||
/datum/mood_event/slots/win/jackpot
|
||||
description = "JACKPOT! AW YEAH!"
|
||||
mood_change = 6
|
||||
timeout = 30 MINUTES
|
||||
|
||||
/datum/mood_event/empathetic_happy
|
||||
description = "Seeing happy people makes me happy."
|
||||
mood_change = 2
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/misanthropic_happy
|
||||
description = "Seeing sad people makes me glad."
|
||||
mood_change = 2
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/paranoid/alone
|
||||
description = "Peace and quiet, no one around to threaten me."
|
||||
mood_change = 1
|
||||
|
||||
/datum/mood_event/paranoid/small_group
|
||||
description = "I feel safer in this small group. We've got each other's backs."
|
||||
mood_change = 2
|
||||
|
||||
/datum/mood_event/nt_loyalist
|
||||
description = "I feel proud to be part of the NT™ family!"
|
||||
mood_change = 2
|
||||
|
||||
/datum/mood_event/loyalist_revs_lost
|
||||
description = "The revolution was defeated! Long live the Nanotrasen!"
|
||||
mood_change = 4
|
||||
timeout = 10 MINUTES
|
||||
|
||||
/datum/mood_event/disillusioned_revs_win
|
||||
description = "The revolution was a success! Viva la revolution!"
|
||||
mood_change = 4
|
||||
timeout = 10 MINUTES
|
||||
|
||||
/datum/mood_event/enjoying_department_area
|
||||
description = "I love my job."
|
||||
mood_change = 1
|
||||
|
||||
/datum/mood_event/slacking_off_lazy
|
||||
description = "Boss makes a dollar, I make a dime. That's why I slack on job time."
|
||||
mood_change = 1
|
||||
|
||||
/datum/mood_event/working_diligent
|
||||
description = "Working hard is its own reward."
|
||||
mood_change = 1
|
||||
|
||||
/datum/mood_event/creative_patronage
|
||||
description = "Support artists!"
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/creative_framing
|
||||
description = "Hanging up art really ties the room together."
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/creative_sculpting
|
||||
description = "Sculpting is a great creative outlet."
|
||||
mood_change = 2
|
||||
timeout = 5 MINUTES
|
||||
|
||||
/datum/mood_event/whimsical_slip
|
||||
description = "Haha! That guy fell over!"
|
||||
mood_change = 3
|
||||
timeout = 2 MINUTES
|
||||
event_flags = MOOD_EVENT_WHIMSY
|
||||
|
||||
@@ -74,6 +74,14 @@
|
||||
mood_change = -6
|
||||
timeout = 4 MINUTES
|
||||
|
||||
/datum/mood_event/disgust/dirty_food/add_effects(...)
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/ascetic))
|
||||
mood_change *= 0.25
|
||||
description = "That food was dirty, but edible."
|
||||
if(HAS_PERSONALITY(owner, /datum/personality/gourmand))
|
||||
mood_change *= 1.5
|
||||
description = "That food was filthy, was it made in a dumpster?!"
|
||||
|
||||
//Generic needs events
|
||||
/datum/mood_event/shower
|
||||
description = "I have recently had a nice shower."
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
desc = "The user's muscles slightly expand. Commonly seen in top-ranking boxers."
|
||||
quality = POSITIVE
|
||||
text_gain_indication = span_notice("You feel strong.")
|
||||
instability = POSITIVE_INSTABILITY_MINI
|
||||
instability = POSITIVE_INSTABILITY_MINOR
|
||||
difficulty = 16
|
||||
mutation_traits = list(TRAIT_STRENGTH)
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@
|
||||
text_gain_indication = span_notice("You feel pretty good, honeydoll.")
|
||||
text_lose_indication = span_notice("You feel a little less conversation would be great.")
|
||||
|
||||
/datum/mutation/chav/New(datum/mutation/copymut)
|
||||
/datum/mutation/elvis/New(datum/mutation/copymut)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/speechmod, replacements = strings("elvis_replacement.json", "elvis"))
|
||||
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
/**
|
||||
* ## Personality Singleton
|
||||
*
|
||||
* Contains information about a personaility.
|
||||
*
|
||||
* A personality is designed to be a small modifier to the way a mob reacts to moodlets or world events.
|
||||
*
|
||||
* For example, a mob with the Callous personality would not receive a positive moodlet for saving someone's life.
|
||||
*
|
||||
* They're not meant to be full blown quirks that hold state and such.
|
||||
* If you NEED state, consider making a quirk, or moving your behavior into a component the personality applies.
|
||||
*/
|
||||
/datum/personality
|
||||
/// Required: Name of the personality
|
||||
var/name
|
||||
/// Required: Description of the personality.
|
||||
/// Phrased to be "In character" - i.e. "I like to help people!"
|
||||
/// Rather than OOC 0 i.e. "When helping people, I get a positive moodlet."
|
||||
var/desc
|
||||
/// Optional: Short blurb on what positive effects this personality has on gameplay, for ui
|
||||
var/pos_gameplay_desc
|
||||
/// Optional: Short blurb on what negative effects this personality has on gameplay, for ui
|
||||
var/neg_gameplay_desc
|
||||
/// Optional: Short blurb on what neutral effects this personality has on gameplay, for ui
|
||||
var/neut_gameplay_desc
|
||||
/// Easy way to apply a trait as a part of a personality.
|
||||
var/personality_trait
|
||||
/// Required: The key to use when saving this personality to a savefile.
|
||||
/// Don't change it once it's set unless you want to write migration code
|
||||
var/savefile_key
|
||||
/// What groups does this personality belong to?
|
||||
/// Personalities in the same group are mutually exclusive.
|
||||
var/list/groups
|
||||
/// Does this personality need to process every tick?
|
||||
/// If true, you'll need to override on_tick() with logic
|
||||
var/processes = FALSE
|
||||
|
||||
/datum/personality/New()
|
||||
. = ..()
|
||||
if(processes)
|
||||
SSpersonalities.processing_personalities[src] = list()
|
||||
START_PROCESSING(SSpersonalities, src)
|
||||
|
||||
/datum/personality/Destroy(force)
|
||||
if(force)
|
||||
STOP_PROCESSING(SSpersonalities, src)
|
||||
SSpersonalities.processing_personalities -= src
|
||||
SSpersonalities.personalities_by_type -= type
|
||||
SSpersonalities.personalities_by_key -= savefile_key
|
||||
return ..()
|
||||
|
||||
stack_trace("qdel called on a personality singleton!")
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/**
|
||||
* Called when applying this personality to a mob.
|
||||
*
|
||||
* * who - The mob to apply this personality to.
|
||||
* This mob is asserted to have `mob_mood`.
|
||||
*/
|
||||
/datum/personality/proc/apply_to_mob(mob/living/who)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(personality_trait)
|
||||
ADD_TRAIT(who, personality_trait, PERSONALITY_TRAIT)
|
||||
LAZYSET(who.personalities, type, TRUE)
|
||||
if(processes)
|
||||
SSpersonalities.processing_personalities[src] += who
|
||||
|
||||
/**
|
||||
* Called when removing this personality from a mob.
|
||||
*
|
||||
* This is not called as a part of the mob being deleted.
|
||||
*
|
||||
* * who - The mob to remove this personality from.
|
||||
* This mob is asserted to have `mob_mood`.
|
||||
*/
|
||||
/datum/personality/proc/remove_from_mob(mob/living/who)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(personality_trait)
|
||||
REMOVE_TRAIT(who, personality_trait, PERSONALITY_TRAIT)
|
||||
LAZYREMOVE(who.personalities, type)
|
||||
if(processes)
|
||||
SSpersonalities.processing_personalities[src] -= who
|
||||
|
||||
/datum/personality/process(seconds_per_tick)
|
||||
for(var/mob/living/subject as anything in SSpersonalities.processing_personalities[src])
|
||||
if(subject.stat >= UNCONSCIOUS || HAS_TRAIT(subject, TRAIT_NO_TRANSFORM))
|
||||
continue
|
||||
if(on_tick(subject, seconds_per_tick) != PROCESS_KILL)
|
||||
continue
|
||||
stack_trace("Personality [type] processed but did not override on_tick().")
|
||||
SSpersonalities.processing_personalities -= src // stop tracking if we're done processing
|
||||
return PROCESS_KILL
|
||||
|
||||
return null
|
||||
|
||||
/// Called every SSpersonality tick if `processes` is TRUE.
|
||||
/// Don't call parent if you override this, that's for error checking
|
||||
/datum/personality/proc/on_tick(mob/living/subject, seconds_per_tick)
|
||||
return PROCESS_KILL
|
||||
@@ -0,0 +1,41 @@
|
||||
// These defines are for indicating incompatible personalities by group
|
||||
|
||||
/// General Modification to moodlet length
|
||||
#define PERSONALITY_GROUP_MOOD_LENGTH "reaction_to_thought"
|
||||
/// General modification to moodlet power
|
||||
#define PERSONALITY_GROUP_MOOD_POWER "general_reaction"
|
||||
|
||||
/// Changes how the person views death
|
||||
#define PERSONALITY_GROUP_DEATH "reaction_to_death"
|
||||
/// Changes how the person feels when generally afraid
|
||||
#define PERSONALITY_GROUP_GENERAL_FEAR "reaction_to_fear"
|
||||
/// Are we afraid of other people specifically
|
||||
#define PERSONALITY_GROUP_PEOPLE_FEAR "reaction_to_fear_others"
|
||||
/// Preferred department / job location
|
||||
#define PERSONALITY_GROUP_DEPARTMENT "reaction_to_department"
|
||||
/// Changes how the person views animals, specific or general
|
||||
#define PERSONALITY_GROUP_ANIMALS "reaction_to_animals"
|
||||
/// How they view Nanotrasen itself
|
||||
#define PERSONALITY_GROUP_NT "reaction_to_nt"
|
||||
/// Opinion of other crewmembers
|
||||
#define PERSONALITY_GROUP_OTHERS "reaction_to_others"
|
||||
/// What type of interactions they prefer
|
||||
#define PERSONALITY_GROUP_INTERACTION "reaction_to_interaction"
|
||||
/// How they feel about slacking off
|
||||
#define PERSONALITY_GROUP_RECREATION "reaction_to_recreation"
|
||||
/// How they feel about the opposite of slacking off
|
||||
#define PERSONALITY_GROUP_WORK "reaction_to_work"
|
||||
/// Changes how they react to imbibing alcohol
|
||||
#define PERSONALITY_GROUP_ALCOHOL "reaction_to_alcohol"
|
||||
/// Modifies moodlets from food
|
||||
#define PERSONALITY_GROUP_FOOD "reaction_to_food"
|
||||
/// How hopeful vs pessimistic they are
|
||||
#define PERSONALITY_GROUP_HOPE "reaction_to_hope"
|
||||
/// Specifically how they feel about humanity
|
||||
#define PERSONALITY_GROUP_MISANTHROPY "reaction_to_misanthropy"
|
||||
/// Whether they enjoy working out or not
|
||||
#define PERSONALITY_GROUP_ATHLETICS "reaction_to_athletics"
|
||||
/// Whether they enjoy art out or not
|
||||
#define PERSONALITY_GROUP_ART "reaction_to_art"
|
||||
/// Whether they enjoy reading out or not
|
||||
#define PERSONALITY_GROUP_READING "reaction_to_reading"
|
||||
@@ -0,0 +1,43 @@
|
||||
/datum/preference/personality
|
||||
savefile_key = "personalities"
|
||||
savefile_identifier = PREFERENCE_CHARACTER
|
||||
can_randomize = TRUE
|
||||
randomize_by_default = FALSE
|
||||
|
||||
/datum/preference/personality/apply_to_human(mob/living/carbon/human/target, value)
|
||||
if(isdummy(target) || !ishuman(target) || isnull(target.mob_mood))
|
||||
return
|
||||
if(CONFIG_GET(flag/disable_human_mood) || !CONFIG_GET(flag/roundstart_traits))
|
||||
return
|
||||
for(var/personality_key in value)
|
||||
var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key]
|
||||
personality.apply_to_mob(target)
|
||||
|
||||
/datum/preference/personality/is_valid(value)
|
||||
return islist(value) || isnull(value)
|
||||
|
||||
/datum/preference/personality/deserialize(input, datum/preferences/preferences)
|
||||
if(!LAZYLEN(input))
|
||||
return null
|
||||
|
||||
var/list/input_sanitized
|
||||
for(var/personality_key in input)
|
||||
var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key]
|
||||
if(!istype(personality))
|
||||
continue
|
||||
if(SSpersonalities.is_incompatible(input_sanitized, personality.type))
|
||||
continue
|
||||
if(LAZYLEN(input_sanitized) >= CONFIG_GET(number/max_personalities))
|
||||
break
|
||||
LAZYADD(input_sanitized, personality_key)
|
||||
|
||||
return input_sanitized
|
||||
|
||||
/datum/preference/personality/create_default_value()
|
||||
return null
|
||||
|
||||
/datum/preference/personality/create_random_value(datum/preferences/preferences)
|
||||
var/list/random_personalities
|
||||
for(var/datum/personality/personality_type as anything in SSpersonalities.select_random_personalities())
|
||||
LAZYADD(random_personalities, initial(personality_type.savefile_key))
|
||||
return random_personalities
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user