Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync

This commit is contained in:
xPokee
2025-10-03 07:05:54 -04:00
517 changed files with 24339 additions and 21253 deletions
+20 -3
View File
@@ -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.
+2 -2
View File
@@ -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,
+2 -2
View File
@@ -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)
+10 -20
View File
@@ -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
+19 -92
View File
@@ -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
+45 -73
View File
@@ -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
+31 -94
View File
@@ -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
File diff suppressed because it is too large Load Diff
+17 -51
View File
@@ -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
File diff suppressed because it is too large Load Diff
+33 -37
View File
@@ -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
+27 -35
View File
@@ -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
-1
View File
@@ -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)
+5 -3
View File
@@ -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)
+2
View File
@@ -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.
-11
View File
@@ -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(
+1 -1
View File
@@ -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))
+2
View File
@@ -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
+1
View File
@@ -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
+14
View File
@@ -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
+2
View File
@@ -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,
+23
View File
@@ -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
+2 -2
View File
@@ -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)
+13 -5
View File
@@ -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"
+2
View File
@@ -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.
+6 -7
View File
@@ -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!
+30 -6
View File
@@ -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(
-1
View File
@@ -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,
+23
View File
@@ -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])
+17
View File
@@ -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
+5 -4
View File
@@ -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
+1 -1
View File
@@ -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,
+14 -9
View File
@@ -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,
+10 -6
View File
@@ -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,
+5 -2
View File
@@ -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)
+31 -6
View File
@@ -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()
+1 -1
View File
@@ -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"
+17 -7
View File
@@ -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
+7 -2
View File
@@ -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()
+9 -4
View File
@@ -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)
+1 -1
View File
@@ -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))
+2
View File
@@ -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
+15 -1
View File
@@ -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
+13 -18
View File
@@ -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()
+1 -1
View File
@@ -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)
+15 -3
View File
@@ -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)
+26 -4
View File
@@ -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
+1 -1
View File
@@ -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)
+9 -1
View File
@@ -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
View File
@@ -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)
. = ..()
+6 -4
View File
@@ -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))
+1 -1
View File
@@ -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)
+46 -15
View File
@@ -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
+20 -5
View File
@@ -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)
+4 -4
View File
@@ -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)
+25 -2
View File
@@ -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."
+5 -7
View File
@@ -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)
+9 -11
View File
@@ -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
+7 -2
View File
@@ -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)
+62
View File
@@ -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)]")
-28
View File
@@ -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 ..()
+2 -2
View File
@@ -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
View File
@@ -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
+4
View File
@@ -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
+14
View File
@@ -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
+33 -21
View File
@@ -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
+12
View File
@@ -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
View File
@@ -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)
+110 -11
View File
@@ -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..."
+10
View File
@@ -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
+27 -20
View File
@@ -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
+8
View File
@@ -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."
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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"))
+100
View File
@@ -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