diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index dcd0717e29..1ef76788eb 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -24665,7 +24665,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/department/medical/morgue)
"bgp" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/white,
@@ -26862,7 +26862,7 @@
dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/department/medical/morgue)
"blh" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastright{
@@ -26940,7 +26940,7 @@
dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/department/medical/morgue)
"blp" = (
/obj/machinery/power/apc{
dir = 8;
@@ -26974,7 +26974,7 @@
dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/department/medical/morgue)
"blr" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
@@ -29030,7 +29030,7 @@
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/department/medical/morgue)
"bpR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment{
@@ -60163,7 +60163,7 @@
icon_state = "2-4"
},
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/department/medical/morgue)
"cHE" = (
/obj/machinery/door/airlock/maintenance{
name = "Mech Bay Maintenance";
@@ -63862,6 +63862,167 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"cTJ" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTK" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTL" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel/black,
+/area/medical/morgue)
+"cTM" = (
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Morgue Maintenance APC";
+ areastring = "/area/maintenance/department/medical/morgue";
+ pixel_x = 26
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/open/floor/plasteel/black,
+/area/medical/morgue)
+"cTN" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTO" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTR" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTS" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTT" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTU" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"cTV" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
(1,1,1) = {"
aaa
@@ -103574,7 +103735,7 @@ bfL
bhp
biB
biB
-biB
+cTL
bkU
bmX
bpE
@@ -103831,7 +103992,7 @@ bfL
bhq
bhm
bkb
-bhm
+cTM
bla
bmZ
bpH
@@ -104346,7 +104507,7 @@ bfS
biC
bkd
bfS
-bKH
+cTO
bmZ
bpJ
brc
@@ -104860,7 +105021,7 @@ bfS
biE
bkf
bfS
-bKH
+cTP
bmZ
bpL
bre
@@ -105117,7 +105278,7 @@ bfS
biD
bke
bfS
-bKH
+cTQ
bmZ
bpK
brd
@@ -105374,7 +105535,7 @@ bfS
bfS
bfS
bfS
-bKH
+cTR
bmZ
bon
bon
@@ -105626,17 +105787,17 @@ aYV
baR
bcb
bdl
-bdO
+cTJ
cHD
bgo
-bPv
-bPv
+cTK
+cTN
blq
-bna
-bPv
+cTS
+cTT
bpQ
-bPv
-bdO
+cTU
+cTV
btm
buy
bvz
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 5809176275..efae305c74 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -91795,7 +91795,7 @@
"dwO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dwP" = (
/obj/machinery/door/firedoor,
/obj/structure/cable/white{
@@ -91815,7 +91815,7 @@
dir = 1
},
/turf/open/floor/plasteel,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dwQ" = (
/obj/structure/table/glass,
/obj/item/clipboard,
@@ -92448,7 +92448,7 @@
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dyb" = (
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
@@ -92456,12 +92456,12 @@
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dyc" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dyd" = (
/obj/structure/cable/white{
d1 = 1;
@@ -92470,7 +92470,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dye" = (
/obj/structure/table/glass,
/obj/item/folder/white,
@@ -92923,12 +92923,12 @@
"dzf" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dzg" = (
/obj/effect/decal/cleanable/blood/old,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dzh" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -92938,14 +92938,14 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dzi" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/storage/backpack/duffelbag/med,
/obj/item/device/flashlight/pen,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dzj" = (
/turf/closed/wall,
/area/crew_quarters/heads/cmo)
@@ -93674,7 +93674,7 @@
dir = 4
},
/turf/open/floor/plasteel,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dAw" = (
/obj/structure/cable/white{
d1 = 4;
@@ -93687,7 +93687,7 @@
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dAx" = (
/obj/structure/cable/white{
d1 = 4;
@@ -93699,7 +93699,7 @@
dir = 1
},
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dAy" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -93712,7 +93712,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dAz" = (
/obj/structure/cable/white{
d1 = 1;
@@ -93733,14 +93733,14 @@
dir = 4
},
/turf/open/floor/plasteel/neutral,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dAA" = (
/obj/structure/table,
/obj/item/clothing/gloves/color/latex/nitrile,
/obj/item/clothing/suit/apron/surgical,
/obj/item/clothing/mask/breath/medical,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dAB" = (
/obj/structure/closet/secure_closet/CMO,
/obj/item/clothing/under/rank/nursesuit,
@@ -94324,7 +94324,7 @@
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dBP" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -94334,13 +94334,13 @@
dir = 4
},
/turf/open/floor/plasteel/neutral,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dBQ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dBR" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -94350,7 +94350,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/neutral,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dBS" = (
/obj/structure/rack,
/obj/effect/decal/cleanable/dirt,
@@ -94359,7 +94359,7 @@
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dBT" = (
/obj/machinery/light{
dir = 8
@@ -95032,15 +95032,15 @@
/obj/structure/closet/secure_closet/medical3,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dDe" = (
/obj/structure/closet/wardrobe/white/medical,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dDf" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dDg" = (
/obj/structure/cable/white{
d1 = 1;
@@ -95048,10 +95048,15 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dDh" = (
/obj/machinery/suit_storage_unit/cmo,
/obj/effect/turf_decal/stripes/line{
@@ -95603,7 +95608,7 @@
dir = 1
},
/turf/open/floor/plasteel,
-/area/medical/morgue)
+/area/maintenance/department/medical/morgue)
"dEn" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
@@ -113090,6 +113095,50 @@
/obj/structure/ore_box,
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
+"esz" = (
+/turf/closed/wall/r_wall,
+/area/maintenance/department/medical/morgue)
+"esA" = (
+/turf/closed/wall/r_wall,
+/area/maintenance/department/medical/morgue)
+"esB" = (
+/turf/closed/wall,
+/area/maintenance/department/medical/morgue)
+"esC" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/maintenance/department/medical/morgue)
+"esD" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/department/medical/morgue)
+"esE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/apc{
+ dir = 2;
+ name = "Morgue Maintenance APC";
+ areastring = "/area/maintenance/department/medical/morgue";
+ pixel_y = -26
+ },
+/obj/structure/cable/white{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/maintenance/department/medical/morgue)
+"esF" = (
+/turf/closed/wall,
+/area/maintenance/department/medical/morgue)
+"esG" = (
+/turf/closed/wall,
+/area/maintenance/department/medical/morgue)
+"esH" = (
+/turf/closed/wall,
+/area/maintenance/department/medical/morgue)
(1,1,1) = {"
aaa
@@ -155932,13 +155981,13 @@ drr
dsR
dur
dvw
-dwN
+esz
dya
-dyY
+esD
dAw
dBO
dDd
-dwK
+esF
dFd
dGE
dHP
@@ -156189,13 +156238,13 @@ drs
dsS
drs
dvx
-dwN
+esA
dyb
dzf
dAx
dBP
dDe
-dwK
+esG
dFe
dGF
dHP
@@ -156960,13 +157009,13 @@ drv
dlO
dus
dvA
-dwK
-dxS
+esB
+esC
dzi
dAA
dBS
-dxS
-dwK
+esE
+esH
dEY
dGA
dHP
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 6d7c9568a9..819abd032f 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -70,6 +70,8 @@
#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250)
+#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow.
+
#define LIGHTING_PLANE_ALPHA_VISIBLE 255
#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192
#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell.
diff --git a/code/controllers/configuration/entries/config.dm b/code/controllers/configuration/entries/config.dm
index 62919afd06..ec96e88553 100644
--- a/code/controllers/configuration/entries/config.dm
+++ b/code/controllers/configuration/entries/config.dm
@@ -8,10 +8,8 @@ CONFIG_DEF(string/autoadmin_rank) // the rank for autoadmins
protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(string/servername) // server name (the name of the game window)
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(string/serversqlname) // short form server name used for the DB
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(string/stationname) // station name (the name of the station in-game)
@@ -24,52 +22,38 @@ CONFIG_DEF(number/round_end_countdown) // Post round murder death kill countdown
min_val = 0
CONFIG_DEF(flag/hub) // if the game appears on the hub or not
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_ooc) // log OOC channel
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_access) // log login/logout
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_say) // log client say
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_admin) // log admin actions
protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_prayer) // log prayers
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_law) // log lawchanges
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_game) // log game events
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_vote) // log voting
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_whisper) // log client whisper
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_attack) // log attack messages
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_emote) // log emotes
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_adminchat) // log admin chat messages
protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_pda) // log pda messages
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_twitter) // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/log_world_topic) // log all world.Topic() calls
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/allow_admin_ooccolor) // Allows admins with relevant permissions to have their own ooc colour
protection = CONFIG_ENTRY_LOCKED
@@ -85,14 +69,12 @@ CONFIG_DEF(number/vote_delay) // minimum time between voting sessions (decisecon
CONFIG_DEF(number/vote_period) // length of voting period (deciseconds, default 1 minute)
value = 600
min_val = 0
-
+
CONFIG_DEF(flag/default_no_vote) // vote does not default to nochange/norestart
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/no_dead_vote) // dead people can't vote
CONFIG_DEF(flag/allow_metadata) // Metadata is supported.
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/popup_admin_pm) // adminPMs to non-admins show in a pop-up 'reply' window when set
@@ -140,14 +122,12 @@ CONFIG_DEF(flag/admin_legacy_system) //Defines whether the server uses the legac
protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(string/hostedby)
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/norespawn)
CONFIG_DEF(flag/guest_jobban)
CONFIG_DEF(flag/usewhitelist)
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(flag/ban_legacy_system) //Defines whether the server uses the legacy banning system with the files in /data or the SQL system.
protection = CONFIG_ENTRY_LOCKED
@@ -171,29 +151,22 @@ CONFIG_DEF(flag/use_exp_restrictions_other)
CONFIG_DEF(flag/use_exp_restrictions_admin_bypass)
CONFIG_DEF(string/server)
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(string/banappeals)
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(string/wikiurl)
- protection = CONFIG_ENTRY_LOCKED
value = "http://www.tgstation13.org/wiki"
CONFIG_DEF(string/forumurl)
- protection = CONFIG_ENTRY_LOCKED
value = "http://tgstation13.org/phpBB/index.php"
CONFIG_DEF(string/rulesurl)
- protection = CONFIG_ENTRY_LOCKED
value = "http://www.tgstation13.org/wiki/Rules"
CONFIG_DEF(string/githuburl)
- protection = CONFIG_ENTRY_LOCKED
value = "https://www.github.com/tgstation/-tg-station"
CONFIG_DEF(number/githubrepoid)
- protection = CONFIG_ENTRY_LOCKED
value = null
min_val = 0
@@ -233,7 +206,6 @@ CONFIG_DEF(flag/useircbot) //tgs2 support
CONFIG_DEF(flag/automute_on) //enables automuting/spam prevention
CONFIG_DEF(string/panic_server_name)
- protection = CONFIG_ENTRY_LOCKED
/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val)
return str_val != "\[Put the name here\]" && ..()
@@ -290,7 +262,6 @@ CONFIG_DEF(string/extreme_popcap_message)
value = "The server is currently serving a high number of users, find alternative servers."
CONFIG_DEF(flag/panic_bunker) // prevents people the server hasn't seen before from connecting
- protection = CONFIG_ENTRY_LOCKED
CONFIG_DEF(number/notify_new_player_age) // how long do we notify admins of a new player
min_val = -1
@@ -303,7 +274,6 @@ CONFIG_DEF(flag/irc_first_connection_alert) // do we notify the irc channel when
CONFIG_DEF(flag/check_randomizer)
CONFIG_DEF(string/ipintel_email)
- protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val)
return str_val != "ch@nge.me" && ..()
@@ -315,17 +285,14 @@ CONFIG_DEF(number/ipintel_rating_bad)
max_val = 1
CONFIG_DEF(number/ipintel_save_good)
- protection = CONFIG_ENTRY_LOCKED
value = 12
min_val = 0
CONFIG_DEF(number/ipintel_save_bad)
- protection = CONFIG_ENTRY_LOCKED
value = 1
min_val = 0
CONFIG_DEF(string/ipintel_domain)
- protection = CONFIG_ENTRY_LOCKED
value = "check.getipintel.net"
CONFIG_DEF(flag/aggressive_changelog)
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index c790dcc1aa..d4b75e3892 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -17,6 +17,7 @@
var/show_on_examine
var/list/allowed_typecache
var/last_inserted_type
+ var/last_inserted_id
var/last_amount_inserted
var/last_insert_success
var/datum/callback/precondition
@@ -116,7 +117,7 @@
if(!amt)
return 0
- insert_materials(S,amt)
+ last_inserted_id = insert_materials(S,amt)
last_inserted_type = S.type
S.use(amt)
last_amount_inserted = amt
@@ -133,17 +134,22 @@
if(!material_amount || !has_space(material_amount))
return 0
- insert_materials(I, multiplier)
+ last_inserted_id = insert_materials(I, multiplier)
last_inserted_type = I.type
last_amount_inserted = material_amount
return material_amount
/datum/component/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only
var/datum/material/M
+ var/primary_mat
+ var/max_mat_value = 0
for(var/MAT in materials)
M = materials[MAT]
M.amount += I.materials[MAT] * multiplier
total_amount += I.materials[MAT] * multiplier
+ if(I.materials[MAT] > max_mat_value)
+ primary_mat = MAT
+ return primary_mat
//For consuming material
//mats is a list of types of material to use and the corresponding amounts, example: list(MAT_METAL=100, MAT_GLASS=200)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a3bfa7d497..093e828452 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -63,6 +63,7 @@
var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems)
var/datum/language_holder/language_holder
+ var/unconvertable = FALSE
/datum/mind/New(var/key)
src.key = key
diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm
index 4846cc2bc2..c4b5c5caae 100644
--- a/code/game/area/Space_Station_13_areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -151,7 +151,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/maintenance/department/medical
name = "Medbay Maintenance"
- icon_state = "asmaint"
+ icon_state = "medbay_maint"
+
+/area/maintenance/department/medical/morgue
+ name = "Morgue Maintenance"
+ icon_state = "morgue_maint"
/area/maintenance/department/science
name = "Science Maintenance"
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 0e72fe93aa..7d6f9bcdd1 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -53,6 +53,8 @@ Credit where due:
return FALSE
if(M.mind.enslaved_to && !is_servant_of_ratvar(M.mind.enslaved_to))
return FALSE
+ if(M.mind.unconvertable)
+ return FALSE
else
return FALSE
if(iscultist(M) || isconstruct(M) || M.isloyal() || ispAI(M))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 868e02589b..01773f1ea6 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -21,6 +21,8 @@
return FALSE
if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to))
return FALSE
+ if(M.mind.unconvertable)
+ return FALSE
else
return FALSE
if(M.isloyal() || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M))
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index add016dd8f..c1b6d13456 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -253,12 +253,14 @@
/datum/game_mode/proc/add_revolutionary(datum/mind/rev_mind)
if(rev_mind.assigned_role in GLOB.command_positions)
- return 0
+ return FALSE
var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted
if(H.isloyal())
- return 0
+ return FALSE
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
- return 0
+ return FALSE
+ if(rev_mind.unconvertable)
+ return FALSE
revolutionaries += rev_mind
if(iscarbon(rev_mind.current))
var/mob/living/carbon/carbon_mob = rev_mind.current
@@ -271,7 +273,7 @@
update_rev_icons_added(rev_mind)
if(jobban_isbanned(rev_mind.current, ROLE_REV))
INVOKE_ASYNC(src, .proc/replace_jobbaned_player, rev_mind.current, ROLE_REV, ROLE_REV)
- return 1
+ return TRUE
//////////////////////////////////////////////////////////////////////////////
//Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph.
//////////////////////////////////////////////////////////////////////////////
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 9fa53765ed..4894952a69 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -134,12 +134,11 @@
if(ispath(lit, /obj/item/ore/bluespace_crystal))
use_power(max(500,M.last_amount_inserted/10))
else
- var/obj/item/stack/S = lit
- var/list/initmats = initial(S.materials)
- if (initmats[MAT_METAL])
- flick("autolathe_o",src)//plays metal insertion animation
- if (initmats[MAT_GLASS])
- flick("autolathe_r",src)//plays glass insertion animation
+ switch(M.last_inserted_id)
+ if (MAT_METAL)
+ flick("autolathe_o",src)//plays metal insertion animation
+ if (MAT_GLASS)
+ flick("autolathe_r",src)//plays glass insertion animation
use_power(M.last_amount_inserted*100)
updateUsrDialog()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 8efc14d966..747647b1a5 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -420,13 +420,7 @@
var/datum/component/material_container/M = C
if(!M.last_insert_success)
return
- var/lit = M.last_inserted_type
- var/stack_name
- if(ispath(lit, /obj/item/ore/bluespace_crystal))
- stack_name = "bluespace"
- else
- var/obj/item/stack/S = lit
- stack_name = material2name(initial(S.materials)[1])
+ var/stack_name = material2name(M.last_inserted_id)
add_overlay("fab-load-[stack_name]")
addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10)
updateUsrDialog()
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 8b2d95f373..dfc5fb94d5 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -213,7 +213,7 @@
/obj/effect/temp_visual/fire
icon = 'icons/effects/fire.dmi'
icon_state = "3"
- light_range = 3
+ light_range = LIGHT_RANGE_FIRE
light_color = LIGHT_COLOR_FIRE
duration = 10
diff --git a/code/game/objects/items/implants/implant_loyality.dm b/code/game/objects/items/implants/implant_loyality.dm
index a1e9a0e4d5..ffaebf5a63 100644
--- a/code/game/objects/items/implants/implant_loyality.dm
+++ b/code/game/objects/items/implants/implant_loyality.dm
@@ -19,12 +19,12 @@
/obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = 0)
if(..())
- if((target.mind in (SSticker.mode.head_revolutionaries)))
+ if((target.mind in (SSticker.mode.head_revolutionaries)) || target.mind.unconvertable)
if(!silent)
target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!")
removed(target, 1)
qdel(src)
- return 0
+ return FALSE
if(target.mind in SSticker.mode.revolutionaries)
SSticker.mode.remove_revolutionary(target.mind, FALSE, user)
if(!silent)
@@ -32,8 +32,8 @@
to_chat(target, "You feel something interfering with your mental conditioning, but you resist it!")
else
to_chat(target, "You feel a sense of peace and security. You are now protected from brainwashing.")
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/item/implant/mindshield/removed(mob/target, silent = 0, special = 0)
if(..())
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index a39a9059f3..93862f16b4 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -49,7 +49,7 @@
icon = 'icons/effects/fire.dmi'
icon_state = "1"
layer = ABOVE_OPEN_TURF_LAYER
- light_range = 3
+ light_range = LIGHT_RANGE_FIRE
light_color = LIGHT_COLOR_FIRE
var/volume = 125
@@ -175,3 +175,15 @@
..()
if(isliving(L))
L.fire_act(temperature, volume)
+
+/obj/effect/dummy/fire
+ name = "fire"
+ desc = "OWWWWWW. IT BURNS. Tell a coder if you're seeing this."
+ icon_state = "nothing"
+ light_color = LIGHT_COLOR_FIRE
+ light_range = LIGHT_RANGE_FIRE
+
+/obj/effect/dummy/fire/Initialize()
+ . = ..()
+ if(!isliving(loc))
+ qdel(src)
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index 7c8db01bcc..11426a4e04 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -185,7 +185,9 @@
/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand()
visible_message("[src] expands!")
- new /mob/living/carbon/monkey(get_turf(src))
+ var/mob/spammer = get_mob_by_key(src.fingerprintslast)
+ var/mob/living/carbon/monkey/bananas = new(get_turf(src))
+ bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG)
qdel(src)
/obj/item/reagent_containers/food/snacks/enchiladas
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index de66a03c11..aa15e28e66 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -18,12 +18,12 @@
vital = FALSE
decoy_override = TRUE
-/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0)
+/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE)
..()
name = "brain"
- if(C.mind && C.mind.changeling) //congrats, you're trapped in a body you don't control
+ if(C.mind && C.mind.changeling && !no_id_transfer) //congrats, you're trapped in a body you don't control
if(brainmob && !(C.stat == DEAD || (C.status_flags & FAKEDEATH)))
to_chat(brainmob, "You can't feel your body! You're still just a brain!")
loc = C
@@ -44,17 +44,9 @@
//Update the body's icon so it doesnt appear debrained anymore
C.update_hair()
-<<<<<<< HEAD
-/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0)
-=======
/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE)
->>>>>>> 085632f... Nightmare organs (#31034)
..()
- if(!special)
- if(C.has_brain_worms())
- var/mob/living/simple_animal/borer/B = C.has_brain_worms()
- B.leave_victim() //Should remove borer if the brain is removed - RR
- if(!gc_destroyed || (owner && !owner.gc_destroyed))
+ if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer)
transfer_identity(C)
C.update_hair()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 74ccdab19c..0ca0bed9fc 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -277,9 +277,11 @@
if(!appears_dead)
if(stat == UNCONSCIOUS)
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n"
- else if(getBrainLoss() >= 60)
- msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
-
+ else
+ if(getBrainLoss() >= 60)
+ msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
+ if(InCritical())
+ msg += "[t_He] is barely concious.\n"
if(getorgan(/obj/item/organ/brain))
if(istype(src, /mob/living/carbon/human/interactive))
var/mob/living/carbon/human/interactive/auto = src
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d66e6f808a..70a5f5225c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -21,41 +21,12 @@
set_species(dna.species.type)
//initialise organs
- create_internal_organs()
+ create_internal_organs() //most of it is done in set_species now, this is only for parent call
handcrafting = new()
. = ..()
-/mob/living/carbon/human/create_internal_organs()
- if(!(NOHUNGER in dna.species.species_traits))
- internal_organs += new /obj/item/organ/appendix
- if(!(NOBREATH in dna.species.species_traits))
- if(dna.species.mutantlungs)
- internal_organs += new dna.species.mutantlungs()
- else
- internal_organs += new /obj/item/organ/lungs()
- if(!(NOBLOOD in dna.species.species_traits))
- internal_organs += new /obj/item/organ/heart
-
- if(!(NOLIVER in dna.species.species_traits))
- if(dna.species.mutantliver)
- internal_organs += new dna.species.mutantliver()
- else
- internal_organs += new /obj/item/organ/liver()
-
- if(!(NOSTOMACH in dna.species.species_traits))
- if(dna.species.mutantstomach)
- internal_organs += new dna.species.mutantstomach()
- else
- internal_organs += new /obj/item/organ/stomach()
-
- internal_organs += new dna.species.mutanteyes
- internal_organs += new dna.species.mutantears
- internal_organs += new dna.species.mutanttongue
- internal_organs += new /obj/item/organ/brain
- ..()
-
/mob/living/carbon/human/OpenCraftingMenu()
handcrafting.ui_interact(src)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 9da5572f0e..34d4ae8e51 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -68,11 +68,8 @@
//Flight and floating
var/override_float = 0
-<<<<<<< HEAD
-
-=======
+
var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain
->>>>>>> 085632f... Nightmare organs (#31034)
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
var/obj/item/mutanthands
@@ -127,6 +124,113 @@
return 0
return 1
+//Will regenerate missing organs
+/datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE)
+ var/obj/item/organ/brain/brain = C.getorganslot("brain")
+ var/obj/item/organ/heart/heart = C.getorganslot("heart")
+ var/obj/item/organ/lungs/lungs = C.getorganslot("lungs")
+ var/obj/item/organ/appendix/appendix = C.getorganslot("appendix")
+ var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
+ var/obj/item/organ/ears/ears = C.getorganslot("ears")
+ var/obj/item/organ/tongue/tongue = C.getorganslot("tongue")
+ var/obj/item/organ/liver/liver = C.getorganslot("liver")
+ var/obj/item/organ/stomach/stomach = C.getorganslot("stomach")
+
+ var/should_have_brain = TRUE
+ var/should_have_heart = !(NOBLOOD in species_traits)
+ var/should_have_lungs = !(NOBREATH in species_traits)
+ var/should_have_appendix = !(NOHUNGER in species_traits)
+ var/should_have_eyes = TRUE
+ var/should_have_ears = TRUE
+ var/should_have_tongue = TRUE
+ var/should_have_liver = !(NOLIVER in species_traits)
+ var/should_have_stomach = !(NOSTOMACH in species_traits)
+
+ if(brain && (replace_current || !should_have_brain))
+ if(!brain.decoy_override)//Just keep it if it's fake
+ brain.Remove(C,TRUE,TRUE)
+ QDEL_NULL(brain)
+ if(should_have_brain && !brain)
+ brain = new mutant_brain()
+ brain.Insert(C, TRUE, TRUE)
+
+ if(heart && (!should_have_heart || replace_current))
+ heart.Remove(C,1)
+ QDEL_NULL(heart)
+ if(should_have_heart && !heart)
+ heart = new()
+ heart.Insert(C)
+
+ if(lungs && (replace_current || !should_have_lungs))
+ lungs.Remove(C,1)
+ QDEL_NULL(lungs)
+ if(should_have_lungs && !lungs)
+ if(mutantlungs)
+ lungs = new mutantlungs()
+ else
+ lungs = new()
+ lungs.Insert(C)
+
+ if(liver && (!should_have_liver || replace_current))
+ liver.Remove(C,1)
+ QDEL_NULL(liver)
+ if(should_have_liver && !liver)
+ if(mutantliver)
+ liver = new mutantliver()
+ else
+ liver = new()
+ liver.Insert(C)
+
+ if(stomach && (!should_have_stomach || replace_current))
+ stomach.Remove(C,1)
+ QDEL_NULL(stomach)
+ if(should_have_stomach && !stomach)
+ if(mutantstomach)
+ stomach = new mutantstomach()
+ else
+ stomach = new()
+ stomach.Insert(C)
+
+ if(appendix && (!should_have_appendix || replace_current))
+ appendix.Remove(C,1)
+ QDEL_NULL(appendix)
+ if(should_have_appendix && !appendix)
+ appendix = new()
+ appendix.Insert(C)
+
+ if(C.get_bodypart("head"))
+ if(eyes && (replace_current || !should_have_eyes))
+ eyes.Remove(C,1)
+ QDEL_NULL(eyes)
+ if(should_have_eyes && !eyes)
+ eyes = new mutanteyes
+ eyes.Insert(C)
+
+ if(ears && (replace_current || !should_have_ears))
+ ears.Remove(C,1)
+ QDEL_NULL(ears)
+ if(should_have_ears && !ears)
+ ears = new mutantears
+ ears.Insert(C)
+
+ if(tongue && (replace_current || !should_have_tongue))
+ tongue.Remove(C,1)
+ QDEL_NULL(tongue)
+ if(should_have_tongue && !tongue)
+ tongue = new mutanttongue
+ tongue.Insert(C)
+
+ if(old_species)
+ for(var/mutantorgan in old_species.mutant_organs)
+ var/obj/item/organ/I = C.getorgan(mutantorgan)
+ if(I)
+ I.Remove(C)
+ QDEL_NULL(I)
+
+ for(var/path in mutant_organs)
+ var/obj/item/organ/I = new path()
+ I.Insert(C)
+
/datum/species/proc/on_species_gain(mob/living/carbon/C, datum/species/old_species)
// Drop the items the new species can't wear
for(var/slot_id in no_equip)
@@ -142,79 +246,7 @@
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
- var/obj/item/organ/heart/heart = C.getorganslot("heart")
- var/obj/item/organ/lungs/lungs = C.getorganslot("lungs")
- var/obj/item/organ/appendix/appendix = C.getorganslot("appendix")
- var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
- var/obj/item/organ/ears/ears = C.getorganslot("ears")
- var/obj/item/organ/tongue/tongue = C.getorganslot("tongue")
-
- var/obj/item/organ/liver/liver = C.getorganslot("liver")
- var/obj/item/organ/stomach/stomach = C.getorganslot("stomach")
-
-
-
- if((NOBLOOD in species_traits) && heart)
- heart.Remove(C)
- qdel(heart)
- else if((!(NOBLOOD in species_traits)) && (!heart))
- heart = new()
- heart.Insert(C)
-
- if(lungs)
- qdel(lungs)
- lungs = null
-
- QDEL_NULL(liver)
-
- QDEL_NULL(stomach)
-
- if(C.get_bodypart("head"))
- if(eyes)
- qdel(eyes)
- eyes = new mutanteyes
- eyes.Insert(C)
-
- if(ears)
- qdel(ears)
- ears = new mutantears
- ears.Insert(C)
-
- if(tongue)
- qdel(tongue)
- tongue = new mutanttongue
- tongue.Insert(C)
-
- if((!(NOBREATH in species_traits)) && !lungs)
- if(mutantlungs)
- lungs = new mutantlungs()
- else
- lungs = new()
- lungs.Insert(C)
-
- if((!(NOLIVER in species_traits)) && (!liver))
- if(mutantliver)
- liver = new mutantliver()
- else
- liver = new()
- liver.Insert(C)
-
- if((!(NOSTOMACH in species_traits)) && (!stomach))
- if(mutantstomach)
- stomach = new mutantstomach()
- else
- stomach = new()
- stomach.Insert(C)
-
- if((NOHUNGER in species_traits) && appendix)
- qdel(appendix)
- else if((!(NOHUNGER in species_traits)) && (!appendix))
- appendix = new()
- appendix.Insert(C)
-
- for(var/path in mutant_organs)
- var/obj/item/organ/I = new path()
- I.Insert(C)
+ regenerate_organs(C,old_species)
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 4302c43ff8..be03e591aa 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -1,13 +1,13 @@
-/datum/species/skeleton
- // 2spooky
- name = "Spooky Scary Skeleton"
- id = "skeleton"
- say_mod = "rattles"
- blacklisted = 1
- sexes = 0
- meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
- species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
- mutant_organs = list(/obj/item/organ/tongue/bone)
- damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
- disliked_food = NONE
- liked_food = NONE
+/datum/species/skeleton
+ // 2spooky
+ name = "Spooky Scary Skeleton"
+ id = "skeleton"
+ say_mod = "rattles"
+ blacklisted = 1
+ sexes = 0
+ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
+ species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
+ mutanttongue = /obj/item/organ/tongue/bone
+ damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
+ disliked_food = NONE
+ liked_food = NONE
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 04123102c0..4ce8570c2b 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -9,7 +9,7 @@
blacklisted = 1
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING)
- mutant_organs = list(/obj/item/organ/tongue/zombie)
+ mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
disliked_food = NONE
liked_food = NONE
@@ -64,6 +64,6 @@
limbs_id = "zombie" //They look like zombies
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
- mutant_organs = list(/obj/item/organ/tongue/zombie)
+ mutanttongue = /obj/item/organ/tongue/zombie
#undef REGENERATION_DELAY
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index e1d854c0c8..f4e85e40fb 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -884,7 +884,7 @@
on_fire = 1
src.visible_message("[src] catches fire!", \
"You're set on fire!")
- src.set_light(3)
+ new/obj/effect/dummy/fire(src)
throw_alert("fire", /obj/screen/alert/fire)
update_fire()
return TRUE
@@ -894,7 +894,8 @@
if(on_fire)
on_fire = 0
fire_stacks = 0
- src.set_light(0)
+ for(var/obj/effect/dummy/fire/F in src)
+ qdel(F)
clear_alert("fire")
update_fire()
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 144f7081e0..592679d35b 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -180,10 +180,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
new /obj/effect/temp_visual/guardian/phase(loc)
/mob/living/simple_animal/hostile/guardian/canSuicide()
- return 0
+ return FALSE
+
+/mob/living/simple_animal/hostile/guardian/proc/is_deployed()
+ return loc != summoner
/mob/living/simple_animal/hostile/guardian/AttackingTarget()
- if(loc == summoner)
+ if(!is_deployed())
to_chat(src, "You must be manifested to attack!")
return FALSE
else
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index db1581d8cb..a8a31ad89c 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -28,7 +28,7 @@
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
. = ..()
- if(. && toggle && iscarbon(target))
+ if(is_deployed() && toggle && iscarbon(target))
var/mob/living/carbon/C = target
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index f2d29d3660..9f7a7d1bbf 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -105,22 +105,22 @@
/mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target)
. = ..()
if(!.)
- return 0
+ return FALSE
if(isliving(the_target))
var/mob/living/H = the_target
return !H.bee_friendly()
/mob/living/simple_animal/hostile/poison/bees/Found(atom/A)
+ if(isliving(A))
+ var/mob/living/H = A
+ return !H.bee_friendly()
if(istype(A, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/Hydro = A
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit)
wanted_objects |= typecacheof(/obj/machinery/hydroponics) //so we only hunt them while they're alive/seeded/not visisted
- return 1
- if(isliving(A))
- var/mob/living/H = A
- return !H.bee_friendly()
- return 0
+ return TRUE
+ return FALSE
/mob/living/simple_animal/hostile/poison/bees/AttackingTarget()
@@ -187,7 +187,7 @@
if(loc == beehome)
idle = min(100, ++idle)
if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM))
- forceMove(get_turf(beehome))
+ forceMove(beehome.drop_location())
else
idle = max(0, --idle)
if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME))
@@ -200,6 +200,7 @@
continue
BB.bees |= src
beehome = BB
+ break // End loop after the first compatible find.
/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize()
. = ..()
@@ -215,7 +216,7 @@
//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself
/mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A)
- return 0
+ return FALSE
//leave pollination for the peasent bees
@@ -234,10 +235,10 @@
/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B)
if(!B)
- return 0
+ return FALSE
if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent)
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/item/queen_bee
@@ -255,7 +256,7 @@
if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped
if(S.reagents.has_reagent("royal_bee_jelly",5))
S.reagents.remove_reagent("royal_bee_jelly", 5)
- var/obj/item/queen_bee/qb = new(get_turf(user))
+ var/obj/item/queen_bee/qb = new(user.drop_location())
qb.queen = new(qb)
if(queen && queen.beegent)
qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents.
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 2b29283c28..d4c9632a03 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -115,7 +115,11 @@
if(can_see(targets_from, HM, vision_range))
. += HM
else
- . = oview(vision_range, targets_from)
+ . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line, particularly when bees are involved
+ for (var/obj/A in oview(vision_range, targets_from))
+ . += A
+ for (var/mob/A in oview(vision_range, targets_from))
+ . += A
/mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about
. = list()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index f5a00d24cb..4fdda7a7bc 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -10,6 +10,8 @@
var/slot
// DO NOT add slots with matching names to different zones - it will break internal_organs_slot list!
var/vital = 0
+ //Was this organ implanted/inserted/etc, if true will not be removed during species change.
+ var/external = FALSE
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
diff --git a/html/changelogs/AutoChangeLog-pr-3096.yml b/html/changelogs/AutoChangeLog-pr-3096.yml
new file mode 100644
index 0000000000..4031580453
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3096.yml
@@ -0,0 +1,4 @@
+author: "Kor"
+delete-after: True
+changes:
+ - bugfix: "You can now tell when someone is in soft crit by examining them."
diff --git a/html/changelogs/AutoChangeLog-pr-3102.yml b/html/changelogs/AutoChangeLog-pr-3102.yml
new file mode 100644
index 0000000000..bc737b6a13
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3102.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - bugfix: "Bees now come with reduced amounts of free lag"
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index ae61dc2852..cb5499487d 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ