diff --git a/code/__DEFINES/_globals.dm b/code/__DEFINES/_globals.dm
index 874223a612..cc3e385f9f 100644
--- a/code/__DEFINES/_globals.dm
+++ b/code/__DEFINES/_globals.dm
@@ -41,6 +41,12 @@
//Create a list global that is initialized as an empty list
#define GLOBAL_LIST_EMPTY(X) GLOBAL_LIST_INIT(X, list())
+// Create a typed list global with an initializer expression
+#define GLOBAL_LIST_INIT_TYPED(X, Typepath, InitValue) GLOBAL_RAW(/list##Typepath/X); GLOBAL_MANAGED(X, InitValue)
+
+// Create a typed list global that is initialized as an empty list
+#define GLOBAL_LIST_EMPTY_TYPED(X, Typepath) GLOBAL_LIST_INIT_TYPED(X, Typepath, list())
+
//Create a typed global with an initializer expression
#define GLOBAL_DATUM_INIT(X, Typepath, InitValue) GLOBAL_RAW(Typepath/##X); GLOBAL_MANAGED(X, InitValue)
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index baf29240c3..41b5deb302 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -147,6 +147,20 @@
#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) )
#define CANVERTICALATMOSPASS(A, O) ( A.CanAtmosPassVertical == ATMOS_PASS_PROC ? A.CanAtmosPass(O, TRUE) : ( A.CanAtmosPassVertical == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPassVertical ) )
+//OPEN TURF ATMOS
+#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn
+#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms
+#define AIRLESS_ATMOS "TEMP=2.7" //space
+#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs
+#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program
+
+//ATMOSPHERICS DEPARTMENT GAS TANK TURFS
+#define ATMOS_TANK_N2O "n2o=6000;TEMP=293.15"
+#define ATMOS_TANK_CO2 "co2=50000;TEMP=293.15"
+#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15"
+#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15"
+#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15"
+#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15"
//LAVALAND
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300"
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index bf30b547fe..b79f1c2e59 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -121,7 +121,15 @@
#define COMPONENT_CANCEL_THROW 1
#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin)
#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z)
+#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: ()
#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+ #define HEARING_MESSAGE 1
+ #define HEARING_SPEAKER 2
+// #define HEARING_LANGUAGE 3
+ #define HEARING_RAW_MESSAGE 4
+ /* #define HEARING_RADIO_FREQ 5
+ #define HEARING_SPANS 6
+ #define HEARING_MESSAGE_MODE 7 */
#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
#define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination)
diff --git a/code/__DEFINES/donator_groupings.dm b/code/__DEFINES/donator_groupings.dm
index 4b210609f2..855b9927f5 100644
--- a/code/__DEFINES/donator_groupings.dm
+++ b/code/__DEFINES/donator_groupings.dm
@@ -1,10 +1,10 @@
-#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_1_donators
-#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_2_donators
-#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_3_donators
+#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/multi_keyed_flag/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/multi_keyed_flag/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/multi_keyed_flag/donator_group/tier_3_donators
-#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH keyed_list/donator_group/tier_1_donators
-#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH keyed_list/donator_group/tier_2_donators
-#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH keyed_list/donator_group/tier_3_donators
+#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH multi_keyed_flag/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH multi_keyed_flag/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH multi_keyed_flag/donator_group/tier_3_donators
#define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_1_CONFIG_SUBPATH)
#define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_2_CONFIG_SUBPATH)
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 632e4adef9..f5ea8d835f 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -4,9 +4,9 @@
#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device
#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets
-#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits
-#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons
-#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe
+#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits
+#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh
+#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh
//Inventory depth: limits how many nested storage items you can access directly.
//1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 1ce5b88945..db13c21c44 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -100,3 +100,8 @@
#define NUKE_OFF_UNLOCKED 1
#define NUKE_ON_TIMING 2
#define NUKE_ON_EXPLODING 3
+
+
+//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
+#define PLANT_GENE_REMOVABLE (1<<0)
+#define PLANT_GENE_EXTRACTABLE (1<<1)
\ No newline at end of file
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index ff19976cff..0f1a36d663 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -7,6 +7,8 @@
#define STATUS_EFFECT_REPLACE 2 //if it allows only one, but new instances replace
+#define STATUS_EFFECT_REFRESH 3 // if it only allows one, and new instances just instead refresh the timer
+
///////////
// BUFFS //
///////////
@@ -74,6 +76,8 @@
#define STATUS_EFFECT_ICHORIAL_STAIN /datum/status_effect/ichorial_stain //Prevents a servant from being revived by vitality matrices for one minute.
+#define STATUS_EFFECT_SPASMS /datum/status_effect/spasms //causes random muscle spasms
+
#define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk.
#define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above.
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 2382e0e444..60212385f8 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -109,6 +109,7 @@
#define TRAIT_NOHARDCRIT "nohardcrit"
#define TRAIT_NOSOFTCRIT "nosoftcrit"
#define TRAIT_MINDSHIELD "mindshield"
+#define TRAIT_SIXTHSENSE "sixthsense"
#define TRAIT_DISSECTED "dissected"
#define TRAIT_FEARLESS "fearless"
#define TRAIT_UNSTABLE "unstable"
@@ -117,6 +118,7 @@
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
+#define TRAIT_SOOTHED_THROAT "soothed-throat"
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
@@ -179,6 +181,7 @@
#define CULT_TRAIT "cult"
#define CURSED_ITEM_TRAIT "cursed-item" // The item is magically cursed
#define ABSTRACT_ITEM_TRAIT "abstract-item"
+#define STATUS_EFFECT_TRAIT "status-effect"
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
// unique trait sources, still defines
@@ -213,4 +216,4 @@
#define NINJA_SUIT_TRAIT "ninja-suit"
#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant"
#define ABDUCTOR_ANTAGONIST "abductor-antagonist"
-#define MADE_UNCLONEABLE "made-uncloneable"
+#define MADE_UNCLONEABLE "made-uncloneable"
\ No newline at end of file
diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm
index 37f36a7e0d..c0501b4e41 100644
--- a/code/__HELPERS/cmp.dm
+++ b/code/__HELPERS/cmp.dm
@@ -84,3 +84,9 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_job_display_asc(datum/job/A, datum/job/B)
return A.display_order - B.display_order
+
+/proc/cmp_numbered_displays_name_asc(datum/numbered_display/A, datum/numbered_display/B)
+ return sorttext(A.sample_object.name, B.sample_object.name)
+
+/proc/cmp_numbered_displays_name_dsc(datum/numbered_display/A, datum/numbered_display/B)
+ return sorttext(B.sample_object.name, A.sample_object.name)
\ No newline at end of file
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 8e7938a312..0d6345dae2 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -522,12 +522,14 @@ GLOBAL_LIST_EMPTY(species_list)
else
prefs = new
- var/adminoverride = 0
+ var/override = FALSE
if(M.client && M.client.holder && (prefs.chat_toggles & CHAT_DEAD))
- adminoverride = 1
- if(isnewplayer(M) && !adminoverride)
+ override = TRUE
+ if(HAS_TRAIT(M, TRAIT_SIXTHSENSE))
+ override = TRUE
+ if(isnewplayer(M) && !override)
continue
- if(M.stat != DEAD && !adminoverride)
+ if(M.stat != DEAD && !override)
continue
if(speaker_key && speaker_key in prefs.ignoring)
continue
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index a2135b93b2..0ac8a61183 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -7,15 +7,15 @@ GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/faci
GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names
GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names
//Underwear
-GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear/bottom indexed by name
+GLOBAL_LIST_EMPTY_TYPED(underwear_list, /datum/sprite_accessory/underwear/bottom) //stores bottoms indexed by name
GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name
GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name
//Undershirts
-GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/underwear/top indexed by name
+GLOBAL_LIST_EMPTY_TYPED(undershirt_list, /datum/sprite_accessory/underwear/top) //stores tops indexed by name
GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name
GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
//Socks
-GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/underwear/socks indexed by name
+GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name
//Lizard Bits (all datum lists indexed by name)
GLOBAL_LIST_EMPTY(body_markings_list)
GLOBAL_LIST_EMPTY(tails_list_lizard)
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index f0479cd8aa..6b8d91acf9 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -45,6 +45,6 @@ GLOBAL_LIST_EMPTY(vr_spawnpoints)
//used by jump-to-area etc. Updated by area/updateName()
GLOBAL_LIST_EMPTY(sortedAreas)
/// An association from typepath to area instance. Only includes areas with `unique` set.
-GLOBAL_LIST_EMPTY(areas_by_type)
+GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area)
GLOBAL_LIST_EMPTY(all_abstract_markers)
diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm
index 626bba9fc3..e30ce1d1ed 100644
--- a/code/_globalvars/lists/poll_ignore.dm
+++ b/code/_globalvars/lists/poll_ignore.dm
@@ -13,6 +13,10 @@
#define POLL_IGNORE_GOLEM "golem"
#define POLL_IGNORE_SWARMER "swarmer"
#define POLL_IGNORE_DRONE "drone"
+#define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend"
+#define POLL_IGNORE_SPLITPERSONALITY "split_personality"
+#define POLL_IGNORE_DEMON "demon"
+#define POLL_IGNORE_WIZARD "wizard"
#define POLL_IGNORE_CLONE "clone"
GLOBAL_LIST_INIT(poll_ignore_desc, list(
@@ -29,6 +33,10 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_GOLEM = "Golems",
POLL_IGNORE_SWARMER = "Swarmer shells",
POLL_IGNORE_DRONE = "Drone shells",
+ POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend",
+ POLL_IGNORE_SPLITPERSONALITY = "Split Personality",
+ POLL_IGNORE_DEMON = "Demons",
+ POLL_IGNORE_WIZARD = "Wizards",
POLL_IGNORE_CLONE = "Defective/SDGF clones"
))
GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore())
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index dab887412a..c42956bbaa 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -223,6 +223,12 @@ or something covering your eyes."
var/mob/living/L = usr
to_chat(L, "[command] ")
+/obj/screen/alert/hypnosis
+ name = "Hypnosis"
+ desc = "Something's hypnotizing you, but you're not really sure about what."
+ icon_state = "hypnosis"
+ var/phrase
+
/obj/screen/alert/drunk //Not implemented
name = "Drunk"
desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it."
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index f796f75407..5f128ff76d 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -25,7 +25,7 @@
return ..()
/obj/screen/examine(mob/user)
- return
+ return list()
/obj/screen/orbit()
return
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 12b1ca2784..ecd34b7840 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -106,9 +106,8 @@
/obj/item/tk_grab/examine(user)
if (focus)
- focus.examine(user)
- else
- ..()
+ return focus.examine(user)
+ return ..()
/obj/item/tk_grab/attack_self(mob/user)
if(!focus)
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index 4406655375..be9f7e116b 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -211,3 +211,27 @@
/datum/config_entry/keyed_list/vv_edit_var(var_name, var_value)
return var_name != "splitter" && ..()
+
+//snowflake for donator things being on one line smh
+/datum/config_entry/multi_keyed_flag
+ vv_VAS = FALSE
+ abstract_type = /datum/config_entry/multi_keyed_flag
+ config_entry_value = list()
+ var/delimiter = "|"
+
+/datum/config_entry/multi_keyed_flag/vv_edit_var(var_name, var_value)
+ if(var_name == NAMEOF(src, delimiter))
+ return FALSE
+ return ..()
+
+/datum/config_entry/multi_keyed_flag/ValidateAndSet(str_val)
+ if(!VASProcCallGuard(str_val))
+ return FALSE
+ str_val = trim(str_val)
+ var/list/keys = splittext(str_val, delimiter)
+ for(var/i in keys)
+ config_entry_value[process_key(i)] = TRUE
+ return length(keys)? TRUE : FALSE
+
+/datum/config_entry/multi_keyed_flag/proc/process_key(key)
+ return trim(key)
diff --git a/code/controllers/configuration/entries/donator.dm b/code/controllers/configuration/entries/donator.dm
index b74d5f5839..bb7b5a54c3 100644
--- a/code/controllers/configuration/entries/donator.dm
+++ b/code/controllers/configuration/entries/donator.dm
@@ -1,22 +1,23 @@
-/datum/config_entry/keyed_list/donator_group
- key_mode = KEY_MODE_TEXT
- value_mode = VALUE_MODE_FLAG
- abstract_type = /datum/config_entry/keyed_list/donator_group
+/datum/config_entry/multi_keyed_flag/donator_group
+ abstract_type = /datum/config_entry/multi_keyed_flag/donator_group
//If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations.
-/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load)
+/datum/config_entry/multi_keyed_flag/donator_group/ValidateAndSet(str_val, during_load)
. = ..()
- if(. && during_load)
+ if(. && !during_load)
regenerate_donator_grouping_list()
-/datum/config_entry/keyed_list/donator_group/OnPostload()
+/datum/config_entry/multi_keyed_flag/donator_group/process_key(key)
+ return ckey(key)
+
+/datum/config_entry/multi_keyed_flag/donator_group/OnPostload()
. = ..()
regenerate_donator_grouping_list()
//This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm
-/datum/config_entry/keyed_list/donator_group/tier_1_donators
+/datum/config_entry/multi_keyed_flag/donator_group/tier_1_donators
-/datum/config_entry/keyed_list/donator_group/tier_2_donators
+/datum/config_entry/multi_keyed_flag/donator_group/tier_2_donators
-/datum/config_entry/keyed_list/donator_group/tier_3_donators
+/datum/config_entry/multi_keyed_flag/donator_group/tier_3_donators
diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm
index df57bd5aa8..7f3e16d57e 100644
--- a/code/controllers/configuration/entries/dynamic.dm
+++ b/code/controllers/configuration/entries/dynamic.dm
@@ -81,42 +81,6 @@
/datum/config_entry/number/dynamic_assassinate_cost
config_entry_value = 2
-/datum/config_entry/number/dynamic_summon_guns_requirement
- config_entry_value = 10
- min_val = 0
-
-/datum/config_entry/number/dynamic_summon_guns_cost
- config_entry_value = 5
- min_val = 0
-
-/datum/config_entry/number/dynamic_summon_magic_requirement
- config_entry_value = 10
- min_val = 0
-
-/datum/config_entry/number/dynamic_summon_magic_cost
- config_entry_value = 5
- min_val = 0
-
-/datum/config_entry/number/dynamic_summon_events_requirement
- config_entry_value = 20
- min_val = 0
-
-/datum/config_entry/number/dynamic_summon_events_cost
- config_entry_value = 10
- min_val = 0
-
-/datum/config_entry/number/dynamic_staff_of_change_requirement
- config_entry_value = 20
- min_val = 0
-
-/datum/config_entry/number/dynamic_staff_of_change_cost
- config_entry_value = 10
- min_val = 0
-
-/datum/config_entry/number/dynamic_apprentice_cost
- config_entry_value = 10
- min_val = 0
-
/datum/config_entry/number/dynamic_warops_requirement
config_entry_value = 60
min_val = 0
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
index 6ba6a7b177..8d4de0c091 100644
--- a/code/controllers/subsystem/chat.dm
+++ b/code/controllers/subsystem/chat.dm
@@ -29,6 +29,7 @@ SUBSYSTEM_DEF(chat)
target = GLOB.clients
//Some macros remain in the string even after parsing and fuck up the eventual output
+ var/original_message = message
message = replacetext(message, "\improper", "")
message = replacetext(message, "\proper", "")
if(handle_whitespace)
@@ -45,6 +46,12 @@ SUBSYSTEM_DEF(chat)
for(var/I in target)
var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
+ if(!C)
+ return
+
+ //Send it to the old style output window.
+ SEND_TEXT(C, original_message)
+
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
continue
@@ -57,6 +64,12 @@ SUBSYSTEM_DEF(chat)
else
var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
+ if(!C)
+ return
+
+ //Send it to the old style output window.
+ SEND_TEXT(C, original_message)
+
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
return
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index ceb2fae998..29762338fb 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -444,7 +444,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
GLOB.the_gateway.wait = world.time
/datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override, border_type_override)
- UNTIL(reservation_ready["[z]"] && !clearing_reserved_turfs)
+ UNTIL((!z || reservation_ready["[z]"]) && !clearing_reserved_turfs)
var/datum/turf_reservation/reserve = new type
if(turf_type_override)
reserve.turf_type = turf_type_override
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index 1b7cade71f..c3db8552c6 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(persistence)
var/list/obj/structure/chisel_message/chisel_messages = list()
var/list/saved_messages = list()
var/list/saved_modes = list(1,2,3)
+ var/list/saved_threat_levels = list(1,1,1)
var/list/saved_maps
var/list/saved_trophies = list()
var/list/spawned_objects = list()
@@ -27,6 +28,7 @@ SUBSYSTEM_DEF(persistence)
LoadChiselMessages()
LoadTrophies()
LoadRecentModes()
+ LoadRecentThreats()
LoadRecentMaps()
LoadPhotoPersistence()
if(CONFIG_GET(flag/use_antag_rep))
@@ -166,6 +168,15 @@ SUBSYSTEM_DEF(persistence)
return
saved_modes = json["data"]
+/datum/controller/subsystem/persistence/proc/LoadRecentThreats()
+ var/json_file = file("data/RecentThreatLevels.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = json_decode(file2text(json_file))
+ if(!json)
+ return
+ saved_threat_levels = json["data"]
+
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
var/json_file = file("data/RecentMaps.json")
if(!fexists(json_file))
@@ -216,6 +227,7 @@ SUBSYSTEM_DEF(persistence)
CollectSecretSatchels()
CollectTrophies()
CollectRoundtype()
+ CollectThreatLevel()
RecordMaps()
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
if(CONFIG_GET(flag/use_antag_rep))
@@ -372,6 +384,18 @@ SUBSYSTEM_DEF(persistence)
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
+/datum/controller/subsystem/persistence/proc/CollectThreatLevel()
+ if(istype(SSticker.mode, /datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ saved_threat_levels[3] = saved_threat_levels[2]
+ saved_threat_levels[2] = saved_threat_levels [1]
+ saved_threat_levels[1] = mode.threat_level
+ var/json_file = file("data/RecentThreatLevels.json")
+ var/list/file_data = list()
+ file_data["data"] = saved_threat_levels
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
+
/datum/controller/subsystem/persistence/proc/RecordMaps()
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
var/json_file = file("data/RecentMaps.json")
diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm
index 107d65a558..0635709074 100644
--- a/code/controllers/subsystem/vis_overlays.dm
+++ b/code/controllers/subsystem/vis_overlays.dm
@@ -29,8 +29,8 @@ SUBSYSTEM_DEF(vis_overlays)
return
//the "thing" var can be anything with vis_contents which includes images
-/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha=255)
- . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]"
+/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE)
+ . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]|[add_appearance_flags]"
var/obj/effect/overlay/vis/overlay = vis_overlay_cache[.]
if(!overlay)
overlay = new
@@ -40,6 +40,7 @@ SUBSYSTEM_DEF(vis_overlays)
overlay.plane = plane
overlay.dir = dir
overlay.alpha = alpha
+ overlay.appearance_flags |= add_appearance_flags
vis_overlay_cache[.] = overlay
else
overlay.unused = 0
@@ -64,10 +65,12 @@ SUBSYSTEM_DEF(vis_overlays)
UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE)
/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir)
+ if(old_dir == new_dir)
+ return
var/rotation = dir2angle(old_dir) - dir2angle(new_dir)
var/list/overlays_to_remove = list()
for(var/i in thing.managed_vis_overlays)
var/obj/effect/overlay/vis/overlay = i
- add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation))
+ add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags)
overlays_to_remove += overlay
remove_vis_overlay(thing, overlays_to_remove)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 50be61f91d..dee10e4998 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -153,6 +153,10 @@ SUBSYSTEM_DEF(vote)
if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = "dynamic"
+ if("extended" in choices)
+ if(. == "extended")
+ GLOB.dynamic_forced_extended = TRUE // we still do the rest of the stuff
+ choices[PEACE] += choices["extended"]
var/mean = 0
var/voters = 0
for(var/client/c in GLOB.clients)
@@ -253,7 +257,11 @@ SUBSYSTEM_DEF(vote)
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
choices.Add("secret", "extended")
if("dynamic")
- choices.Add(PEACE,CHAOS)
+ var/saved_threats = SSpersistence.saved_threat_levels
+ if((saved_threats[1]+saved_threats[2]+saved_threats[3])>150)
+ choices.Add("extended",PEACE,CHAOS)
+ else
+ choices.Add(PEACE,CHAOS)
if("custom")
question = stripped_input(usr,"What is the vote for?")
if(!question)
diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm
index 56a3f3969b..1aa1341c9c 100644
--- a/code/datums/brain_damage/brain_trauma.dm
+++ b/code/datums/brain_damage/brain_trauma.dm
@@ -1,10 +1,12 @@
//Brain Traumas are the new actual brain damage. Brain damage itself acts as a way to acquire traumas: every time brain damage is dealt, there's a chance of receiving a trauma.
//This chance gets higher the higher the mob's brainloss is. Removing traumas is a separate thing from removing brain damage: you can get restored to full brain operativity,
-//but keep the quirks, until repaired by mannitol (for mild/special ones) or brain surgery (for severe ones).
+// but keep the quirks, until repaired by neurine, surgery, lobotomy or magic; depending on the resilience
+// of the trauma.
+
/datum/brain_trauma
var/name = "Brain Trauma"
var/desc = "A trauma caused by brain damage, which causes issues to the patient."
- var/scan_desc = "a generic brain trauma" //description when detected by a health scanner
+ var/scan_desc = "generic brain trauma" //description when detected by a health scanner
var/mob/living/carbon/owner //the poor bastard
var/obj/item/organ/brain/brain //the poor bastard's brain
var/gain_text = "You feel traumatized. "
@@ -12,15 +14,21 @@
var/can_gain = TRUE
var/random_gain = TRUE //can this be gained through random traumas?
var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure?
+ var/clonable = TRUE // will this transfer if the brain is cloned?
/datum/brain_trauma/Destroy()
- brain.traumas -= src
+ if(brain && brain.traumas)
+ brain.traumas -= src
if(owner)
on_lose()
brain = null
owner = null
return ..()
+/datum/brain_trauma/proc/on_clone()
+ if(clonable)
+ return new type
+
//Called on life ticks
/datum/brain_trauma/proc/on_life()
return
@@ -33,17 +41,24 @@
/datum/brain_trauma/proc/on_gain()
to_chat(owner, gain_text)
RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/handle_hearing)
//Called when removed from a mob
/datum/brain_trauma/proc/on_lose(silent)
if(!silent)
to_chat(owner, lose_text)
UnregisterSignal(owner, COMSIG_MOB_SAY)
+ UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
//Called when hearing a spoken message
-/datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq)
- return message
+/datum/brain_trauma/proc/handle_hearing(datum/source, list/hearing_args)
+ UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
//Called when speaking
/datum/brain_trauma/proc/handle_speech(datum/source, list/speech_args)
UnregisterSignal(owner, COMSIG_MOB_SAY)
+
+
+//Called when hugging. expand into generally interacting, where future coders could switch the intent?
+/datum/brain_trauma/proc/on_hug(mob/living/hugger, mob/living/hugged)
+ return
diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm
index 8909d1b85f..f937c19658 100644
--- a/code/datums/brain_damage/hypnosis.dm
+++ b/code/datums/brain_damage/hypnosis.dm
@@ -5,6 +5,7 @@
gain_text = ""
lose_text = ""
resilience = TRAUMA_RESILIENCE_SURGERY
+
var/hypnotic_phrase = ""
var/regex/target_phrase
@@ -44,18 +45,17 @@
"You feel a part of your mind repeating this over and over. You need to follow these words.",\
"Something about this sounds... right, for some reason. You feel like you should follow these words.",\
"These words keep echoing in your mind. You find yourself completely fascinated by them.")]")
- if(!HAS_TRAIT(owner, "hypnotherapy"))
- to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\
+ to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\
as long as you act like the words are your highest priority. ")
- else
- to_chat(owner, "You've been hypnotized by this sentence. You feel an incredible desire to follow these words, but are able to resist it somewhat. If it isn't a clear order, you can freely interpret how to do so,\
- however this does not take precedence over your other objectives. ")
+ var/obj/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /obj/screen/alert/hypnosis)
+ hypno_alert.desc = "\"[hypnotic_phrase]\"... your mind seems to be fixated on this concept."
..()
/datum/brain_trauma/hypnosis/on_lose()
message_admins("[ADMIN_LOOKUPFLW(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.")
log_game("[key_name(owner)] is no longer hypnotized with the phrase '[hypnotic_phrase]'.")
- to_chat(owner, "You suddenly snap out of your fixation. The phrase '[hypnotic_phrase]' no longer feels important to you. ")
+ to_chat(owner, "You suddenly snap out of your hypnosis. The phrase '[hypnotic_phrase]' no longer feels important to you. ")
+ owner.clear_alert("hypnosis")
..()
/datum/brain_trauma/hypnosis/on_life()
@@ -67,6 +67,5 @@
if(2)
new /datum/hallucination/chat(owner, TRUE, FALSE, "[hypnotic_phrase] ")
-/datum/brain_trauma/hypnosis/on_hear(message, speaker, message_language, raw_message, radio_freq)
- message = target_phrase.Replace(message, "$1 ")
- return message
+/datum/brain_trauma/hypnosis/handle_hearing(datum/source, list/hearing_args)
+ hearing_args[HEARING_MESSAGE] = target_phrase.Replace(hearing_args[HEARING_MESSAGE], "$1 ")
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 5bbc5de4a5..8337a8e4d5 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -8,6 +8,10 @@
var/friend_initialized = FALSE
/datum/brain_trauma/special/imaginary_friend/on_gain()
+ var/mob/living/M = owner
+ if(M.stat == DEAD || !M.client)
+ qdel(src)
+ return
..()
make_friend()
get_ghost()
@@ -43,7 +47,7 @@
/datum/brain_trauma/special/imaginary_friend/proc/get_ghost()
set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
C.transfer_ckey(friend, FALSE)
@@ -74,26 +78,34 @@
/mob/camera/imaginary_friend/Login()
..()
- to_chat(src, "You are the imaginary friend of [owner]! ")
- to_chat(src, "You are absolutely loyal to your friend, no matter what. ")
- to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot. ")
+ greet()
Show()
+/mob/camera/imaginary_friend/proc/greet()
+ to_chat(src, "You are the imaginary friend of [owner]! ")
+ to_chat(src, "You are absolutely loyal to your friend, no matter what. ")
+ to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot. ")
+
/mob/camera/imaginary_friend/Initialize(mapload, _trauma)
. = ..()
- var/gender = pick(MALE, FEMALE)
- real_name = random_unique_name(gender)
- name = real_name
+
trauma = _trauma
owner = trauma.owner
copy_known_languages_from(owner, TRUE)
- human_image = get_flat_human_icon(null, pick(SSjob.occupations))
+
+ setup_friend()
join = new
join.Grant(src)
hide = new
hide.Grant(src)
+/mob/camera/imaginary_friend/proc/setup_friend()
+ var/gender = pick(MALE, FEMALE)
+ real_name = random_unique_name(gender)
+ name = real_name
+ human_image = get_flat_human_icon(null, pick(SSjob.occupations))
+
/mob/camera/imaginary_friend/proc/Show()
if(!client) //nobody home
return
@@ -132,7 +144,7 @@
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot send IC messages (muted).")
return
- if (src.client.handle_spam_prevention(message,MUTE_IC))
+ if (!(ignore_spam || forced) && src.client.handle_spam_prevention(message,MUTE_IC))
return
friend_talk(message)
@@ -218,4 +230,42 @@
var/mob/camera/imaginary_friend/I = owner
I.hidden = !I.hidden
I.Show()
- update_status()
\ No newline at end of file
+ update_status()
+
+//down here is the trapped mind
+//like imaginary friend but a lot less imagination and more like mind prison//
+
+/datum/brain_trauma/special/imaginary_friend/trapped_owner
+ name = "Trapped Victim"
+ desc = "Patient appears to be targeted by an invisible entity."
+ gain_text = ""
+ lose_text = ""
+ random_gain = FALSE
+
+/datum/brain_trauma/special/imaginary_friend/trapped_owner/make_friend()
+ friend = new /mob/camera/imaginary_friend/trapped(get_turf(owner), src)
+
+/datum/brain_trauma/special/imaginary_friend/trapped_owner/reroll_friend() //no rerolling- it's just the last owner's hell
+ if(friend.client) //reconnected
+ return
+ friend_initialized = FALSE
+ QDEL_NULL(friend)
+ qdel(src)
+
+/datum/brain_trauma/special/imaginary_friend/trapped_owner/get_ghost() //no randoms
+ return
+
+/mob/camera/imaginary_friend/trapped
+ name = "figment of imagination?"
+ real_name = "figment of imagination?"
+ desc = "The previous host of this body."
+
+/mob/camera/imaginary_friend/trapped/greet()
+ to_chat(src, "You have managed to hold on as a figment of the new host's imagination! ")
+ to_chat(src, "All hope is lost for you, but at least you may interact with your host. You do not have to be loyal to them. ")
+ to_chat(src, "You cannot directly influence the world around you, but you can see what the host cannot. ")
+
+/mob/camera/imaginary_friend/trapped/setup_friend()
+ real_name = "[owner.real_name]?"
+ name = real_name
+ human_image = icon('icons/mob/lavaland/lavaland_monsters.dmi', icon_state = "curseblob")
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index c049a7db33..012f771a29 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -64,21 +64,21 @@
name = "Speech Impediment"
desc = "Patient is unable to form coherent sentences."
scan_desc = "communication disorder"
- gain_text = "" //mutation will handle the text
- lose_text = ""
+ gain_text = "You can't seem to form any coherent thoughts! "
+ lose_text = "Your mind feels more clear. "
/datum/brain_trauma/mild/speech_impediment/on_gain()
ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
- . = ..()
+ ..()
/datum/brain_trauma/mild/speech_impediment/on_lose()
REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
- . = ..()
+ ..()
/datum/brain_trauma/mild/concussion
name = "Concussion"
desc = "Patient's brain is concussed."
- scan_desc = "a concussion"
+ scan_desc = "concussion"
gain_text = "Your head hurts! "
lose_text = "The pressure inside your head starts fading. "
@@ -157,54 +157,108 @@
gain_text = "Your muscles feel oddly faint. "
lose_text = "You feel in control of your muscles again. "
-/datum/brain_trauma/mild/muscle_spasms/on_life()
- if(prob(7))
- switch(rand(1,5))
- if(1)
- if(owner.canmove && !isspaceturf(owner.loc))
- to_chat(owner, "Your leg spasms! ")
- step(owner, pick(GLOB.cardinals))
- if(2)
- if(owner.incapacitated())
- return
- var/obj/item/I = owner.get_active_held_item()
- if(I)
- to_chat(owner, "Your fingers spasm! ")
- owner.log_message("used [I] due to a Muscle Spasm", LOG_ATTACK)
- I.attack_self(owner)
- if(3)
- var/prev_intent = owner.a_intent
- owner.a_intent = INTENT_HARM
-
- var/range = 1
- if(istype(owner.get_active_held_item(), /obj/item/gun)) //get targets to shoot at
- range = 7
-
- var/list/mob/living/targets = list()
- for(var/mob/M in oview(owner, range))
- if(isliving(M))
- targets += M
- if(LAZYLEN(targets))
- to_chat(owner, "Your arm spasms! ")
- owner.log_message(" attacked someone due to a Muscle Spasm") //the following attack will log itself
- owner.ClickOn(pick(targets))
- owner.a_intent = prev_intent
- if(4)
- var/prev_intent = owner.a_intent
- owner.a_intent = INTENT_HARM
- to_chat(owner, "Your arm spasms! ")
- owner.log_message("attacked [owner.p_them()]self to a Muscle Spasm", LOG_ATTACK)
- owner.ClickOn(owner)
- owner.a_intent = prev_intent
- if(5)
- if(owner.incapacitated())
- return
- var/obj/item/I = owner.get_active_held_item()
- var/list/turf/targets = list()
- for(var/turf/T in oview(owner, 3))
- targets += T
- if(LAZYLEN(targets) && I)
- to_chat(owner, "Your arm spasms! ")
- owner.log_message("threw [I] due to a Muscle Spasm", LOG_ATTACK)
- owner.throw_item(pick(targets))
+/datum/brain_trauma/mild/muscle_spasms/on_gain()
+ owner.apply_status_effect(STATUS_EFFECT_SPASMS)
..()
+
+/datum/brain_trauma/mild/muscle_spasms/on_lose()
+ owner.remove_status_effect(STATUS_EFFECT_SPASMS)
+ ..()
+
+/datum/brain_trauma/mild/nervous_cough
+ name = "Nervous Cough"
+ desc = "Patient feels a constant need to cough."
+ scan_desc = "nervous cough"
+ gain_text = "Your throat itches incessantly... "
+ lose_text = "Your throat stops itching. "
+
+/datum/brain_trauma/mild/nervous_cough/on_life()
+ if(prob(12) && !HAS_TRAIT(owner, TRAIT_SOOTHED_THROAT))
+ if(prob(5))
+ to_chat(owner, "[pick("You have a coughing fit!", "You can't stop coughing!")] ")
+ owner.Stun(20)
+ owner.emote("cough")
+ addtimer(CALLBACK(owner, /mob/.proc/emote, "cough"), 6)
+ addtimer(CALLBACK(owner, /mob/.proc/emote, "cough"), 12)
+ owner.emote("cough")
+ ..()
+
+/datum/brain_trauma/mild/expressive_aphasia
+ name = "Expressive Aphasia"
+ desc = "Patient is affected by partial loss of speech leading to a reduced vocabulary."
+ scan_desc = "inability to form complex sentences"
+ gain_text = "You lose your grasp on complex words. "
+ lose_text = "You feel your vocabulary returning to normal again. "
+
+ var/static/list/common_words = world.file2list("strings/1000_most_common.txt")
+
+/datum/brain_trauma/mild/expressive_aphasia/handle_speech(datum/source, list/speech_args)
+ var/message = speech_args[SPEECH_MESSAGE]
+ if(message)
+ var/list/message_split = splittext(message, " ")
+ var/list/new_message = list()
+
+ for(var/word in message_split)
+ var/suffix = copytext(word,-1)
+
+ // Check if we have a suffix and break it out of the word
+ if(suffix in list("." , "," , ";" , "!" , ":" , "?"))
+ word = copytext(word,1,-1)
+ else
+ suffix = ""
+
+ word = html_decode(word)
+
+ if(lowertext(word) in common_words)
+ new_message += word + suffix
+ else
+ if(prob(30) && message_split.len > 2)
+ new_message += pick("uh","erm")
+ break
+ else
+ var/list/charlist = string2charlist(word) // Stupid shit code
+ shuffle_inplace(charlist)
+ charlist.len = round(charlist.len * 0.5,1)
+ new_message += html_encode(jointext(charlist,"")) + suffix
+
+ message = jointext(new_message, " ")
+
+ speech_args[SPEECH_MESSAGE] = trim(message)
+
+/datum/brain_trauma/mild/mind_echo
+ name = "Mind Echo"
+ desc = "Patient's language neurons do not terminate properly, causing previous speech patterns to occasionally resurface spontaneously."
+ scan_desc = "looping neural pattern"
+ gain_text = "You feel a faint echo of your thoughts... "
+ lose_text = "The faint echo fades away. "
+ var/list/hear_dejavu = list()
+ var/list/speak_dejavu = list()
+
+/datum/brain_trauma/mild/mind_echo/handle_hearing(datum/source, list/hearing_args)
+ if(owner == hearing_args[HEARING_SPEAKER])
+ return
+ if(hear_dejavu.len >= 5)
+ if(prob(25))
+ var/deja_vu = pick_n_take(hear_dejavu)
+ var/static/regex/quoted_spoken_message = regex("\".+\"", "gi")
+ hearing_args[HEARING_MESSAGE] = quoted_spoken_message.Replace(hearing_args[HEARING_MESSAGE], "\"[deja_vu]\"") //Quotes included to avoid cases where someone says part of their name
+ return
+ if(hear_dejavu.len >= 15)
+ if(prob(50))
+ popleft(hear_dejavu) //Remove the oldest
+ hear_dejavu += hearing_args[HEARING_RAW_MESSAGE]
+ else
+ hear_dejavu += hearing_args[HEARING_RAW_MESSAGE]
+
+/datum/brain_trauma/mild/mind_echo/handle_speech(datum/source, list/speech_args)
+ if(speak_dejavu.len >= 5)
+ if(prob(25))
+ var/deja_vu = pick_n_take(speak_dejavu)
+ speech_args[SPEECH_MESSAGE] = deja_vu
+ return
+ if(speak_dejavu.len >= 15)
+ if(prob(50))
+ popleft(speak_dejavu) //Remove the oldest
+ speak_dejavu += speech_args[SPEECH_MESSAGE]
+ else
+ speak_dejavu += speech_args[SPEECH_MESSAGE]
\ No newline at end of file
diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm
index f802555c7e..034f2baaaf 100644
--- a/code/datums/brain_damage/phobia.dm
+++ b/code/datums/brain_damage/phobia.dm
@@ -2,8 +2,8 @@
name = "Phobia"
desc = "Patient is unreasonably afraid of something."
scan_desc = "phobia"
- gain_text = ""
- lose_text = ""
+ gain_text = "You start finding default values very unnerving... "
+ lose_text = "You no longer feel afraid of default values. "
var/phobia_type
var/next_check = 0
var/next_scare = 0
@@ -14,8 +14,10 @@
var/list/trigger_turfs
var/list/trigger_species
-/datum/brain_trauma/mild/phobia/New(specific_type)
- phobia_type = specific_type
+/datum/brain_trauma/mild/phobia/New(new_phobia_type)
+ if(new_phobia_type)
+ phobia_type = new_phobia_type
+
if(!phobia_type)
phobia_type = pick(SStraumas.phobia_types)
@@ -29,6 +31,11 @@
trigger_species = SStraumas.phobia_species[phobia_type]
..()
+
+/datum/brain_trauma/mild/phobia/on_clone()
+ if(clonable)
+ return new type(phobia_type)
+
/datum/brain_trauma/mild/phobia/on_life()
..()
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
@@ -44,6 +51,12 @@
if(is_type_in_typecache(O, trigger_objs))
freak_out(O)
return
+ for(var/mob/living/carbon/human/HU in seen_atoms) //check equipment for trigger items
+ for(var/X in HU.get_all_slots() | HU.held_items)
+ var/obj/I = X
+ if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs))
+ freak_out(I)
+ return
if(LAZYLEN(trigger_turfs))
for(var/turf/T in seen_atoms)
@@ -51,45 +64,41 @@
freak_out(T)
return
- if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_objs))
+ seen_atoms -= owner //make sure they aren't afraid of themselves.
+ if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species))
for(var/mob/M in seen_atoms)
if(is_type_in_typecache(M, trigger_mobs))
freak_out(M)
return
- else if(ishuman(M)) //check their equipment for trigger items
+ else if(ishuman(M)) //check their species
var/mob/living/carbon/human/H = M
if(LAZYLEN(trigger_species) && H.dna && H.dna.species && is_type_in_typecache(H.dna.species, trigger_species))
freak_out(H)
+ return
- for(var/X in H.get_all_slots() | H.held_items)
- var/obj/I = X
- if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs))
- freak_out(I)
- return
-
-/datum/brain_trauma/mild/phobia/on_hear(message, speaker, message_language, raw_message, radio_freq)
+/datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args)
if(!owner.can_hear() || world.time < next_scare) //words can't trigger you if you can't hear them *taps head*
- return message
+ return
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
- return message
+ return
for(var/word in trigger_words)
- var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
+ var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
- if(findtext(raw_message, reg))
+ if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg))
addtimer(CALLBACK(src, .proc/freak_out, null, word), 10) //to react AFTER the chat message
+ hearing_args[HEARING_MESSAGE] = reg.Replace(hearing_args[HEARING_MESSAGE], "$1 ")
break
- return message
/datum/brain_trauma/mild/phobia/handle_speech(datum/source, list/speech_args)
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
return
for(var/word in trigger_words)
- var/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
+ var/regex/reg = regex("(\\b|\\A)[REGEX_QUOTE(word)]'?s*(\\b|\\Z)", "i")
if(findtext(speech_args[SPEECH_MESSAGE], reg))
- to_chat(owner, "You can't bring yourself to say the word \"[word]\"! ")
+ to_chat(owner, "You can't bring yourself to say the word \"[word] \"! ")
speech_args[SPEECH_MESSAGE] = ""
/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word)
@@ -125,6 +134,76 @@
owner.Jitter(10)
owner.stuttering += 10
+// Defined phobia types for badminry, not included in the RNG trauma pool to avoid diluting.
+
+/datum/brain_trauma/mild/phobia/spiders
+ phobia_type = "spiders"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/space
+ phobia_type = "space"
+ random_gain = FALSE
+
/datum/brain_trauma/mild/phobia/security
phobia_type = "security"
random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/clowns
+ phobia_type = "clowns"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/greytide
+ phobia_type = "greytide"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/lizards
+ phobia_type = "lizards"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/skeletons
+ phobia_type = "skeletons"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/snakes
+ phobia_type = "snakes"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/robots
+ phobia_type = "robots"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/doctors
+ phobia_type = "doctors"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/authority
+ phobia_type = "authority"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/supernatural
+ phobia_type = "the supernatural"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/aliens
+ phobia_type = "aliens"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/strangers
+ phobia_type = "strangers"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/birds
+ phobia_type = "birds"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/falling
+ phobia_type = "falling"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/anime
+ phobia_type = "anime"
+ random_gain = FALSE
+
+/datum/brain_trauma/mild/phobia/conspiracies
+ phobia_type = "conspiracies"
+ random_gain = FALSE
diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm
index 890e9cf903..0e08c4cd15 100644
--- a/code/datums/brain_damage/severe.dm
+++ b/code/datums/brain_damage/severe.dm
@@ -119,7 +119,7 @@
owner.update_disabled_bodyparts()
/datum/brain_trauma/severe/paralysis/paraplegic
- //can_gain = FALSE maybe breaks.
+ random_gain = FALSE
paralysis_type = "legs"
resilience = TRAUMA_RESILIENCE_ABSOLUTE
@@ -149,7 +149,7 @@
/datum/brain_trauma/severe/monophobia
name = "Monophobia"
desc = "Patient feels sick and distressed when not around other people, leading to potentially lethal levels of stress."
- scan_desc = "severe monophobia"
+ scan_desc = "monophobia"
gain_text = ""
lose_text = "You feel like you could be safe on your own. "
var/stress = 0
@@ -168,7 +168,7 @@
if(stress > 10 && (prob(5)))
stress_reaction()
else
- stress -= 4
+ stress = max(stress - 4, 0)
/datum/brain_trauma/severe/monophobia/proc/check_alone()
if(HAS_TRAIT(owner, TRAIT_BLIND))
diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm
index d9e6f00643..b52c7d391c 100644
--- a/code/datums/brain_damage/special.dm
+++ b/code/datums/brain_damage/special.dm
@@ -22,6 +22,14 @@
else
speak("neutral", prob(25))
+/datum/brain_trauma/special/godwoken/on_gain()
+ ADD_TRAIT(owner, TRAIT_HOLY, TRAUMA_TRAIT)
+ ..()
+
+/datum/brain_trauma/special/godwoken/on_lose()
+ REMOVE_TRAIT(owner, TRAIT_HOLY, TRAUMA_TRAIT)
+ ..()
+
/datum/brain_trauma/special/godwoken/proc/speak(type, include_owner = FALSE)
var/message
switch(type)
@@ -36,7 +44,7 @@
else
message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral")
- playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 5)
+ playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5)
voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, FALSE)
/datum/brain_trauma/special/bluespace_prophet
@@ -134,7 +142,101 @@
/datum/brain_trauma/special/psychotic_brawling/bath_salts
name = "Chemical Violent Psychosis"
- random_gain = FALSE
+ clonable = FALSE
+
+/datum/brain_trauma/special/tenacity
+ name = "Tenacity"
+ desc = "Patient is psychologically unaffected by pain and injuries, and can remain standing far longer than a normal person."
+ scan_desc = "traumatic neuropathy"
+ gain_text = "You suddenly stop feeling pain. "
+ lose_text = "You realize you can feel pain again. "
+
+/datum/brain_trauma/special/tenacity/on_gain()
+ ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAUMA_TRAIT)
+ ADD_TRAIT(owner, TRAIT_NOHARDCRIT, TRAUMA_TRAIT)
+ ..()
+
+/datum/brain_trauma/special/tenacity/on_lose()
+ REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, TRAUMA_TRAIT)
+ REMOVE_TRAIT(owner, TRAIT_NOHARDCRIT, TRAUMA_TRAIT)
+ ..()
+
+/datum/brain_trauma/special/death_whispers
+ name = "Functional Cerebral Necrosis"
+ desc = "Patient's brain is stuck in a functional near-death state, causing occasional moments of lucid hallucinations, which are often interpreted as the voices of the dead."
+ scan_desc = "chronic functional necrosis"
+ gain_text = "You feel dead inside. "
+ lose_text = "You feel alive again. "
+ var/active = FALSE
+
+/datum/brain_trauma/special/death_whispers/on_life()
+ ..()
+ if(!active && prob(2))
+ whispering()
+
+/datum/brain_trauma/special/death_whispers/on_lose()
+ if(active)
+ cease_whispering()
+ ..()
+
+/datum/brain_trauma/special/death_whispers/proc/whispering()
+ ADD_TRAIT(owner, TRAIT_SIXTHSENSE, TRAUMA_TRAIT)
+ active = TRUE
+ addtimer(CALLBACK(src, .proc/cease_whispering), rand(50, 300))
+
+/datum/brain_trauma/special/death_whispers/proc/cease_whispering()
+ REMOVE_TRAIT(owner, TRAIT_SIXTHSENSE, TRAUMA_TRAIT)
+ active = FALSE
+
+/datum/brain_trauma/special/existential_crisis
+ name = "Existential Crisis"
+ desc = "Patient's hold on reality becomes faint, causing occasional bouts of non-existence."
+ scan_desc = "existential crisis"
+ gain_text = "You feel less real. "
+ lose_text = "You feel more substantial again. "
+ var/obj/effect/abstract/sync_holder/veil/veil
+ var/next_crisis = 0
+
+/datum/brain_trauma/special/existential_crisis/on_life()
+ ..()
+ if(!veil && world.time > next_crisis && prob(3))
+ if(isturf(owner.loc))
+ fade_out()
+
+/datum/brain_trauma/special/existential_crisis/on_lose()
+ if(veil)
+ fade_in()
+ ..()
+
+/datum/brain_trauma/special/existential_crisis/proc/fade_out()
+ if(veil)
+ return
+ var/duration = rand(50, 450)
+ veil = new(owner.drop_location())
+ to_chat(owner, "[pick("You stop thinking for a moment. Therefore you are not.",\
+ "To be or not to be...",\
+ "Why exist?",\
+ "You stop keeping it real.",\
+ "Your grip on existence slips.",\
+ "Do you even exist?",\
+ "You simply fade away.")] ")
+ owner.forceMove(veil)
+ SEND_SIGNAL(owner, COMSIG_MOVABLE_SECLUDED_LOCATION)
+ for(var/thing in owner)
+ var/atom/movable/AM = thing
+ SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION)
+ next_crisis = world.time + 600
+ addtimer(CALLBACK(src, .proc/fade_in), duration)
+
+/datum/brain_trauma/special/existential_crisis/proc/fade_in()
+ QDEL_NULL(veil)
+ to_chat(owner, "You fade back into reality. ")
+ next_crisis = world.time + 600
+
+//base sync holder is in desynchronizer.dm
+/obj/effect/abstract/sync_holder/veil
+ name = "non-existence"
+ desc = "Existence is just a state of mind."
/datum/brain_trauma/special/beepsky
name = "Criminal"
@@ -142,6 +244,7 @@
scan_desc = "criminal mind"
gain_text = "Justice is coming for you. "
lose_text = "You were absolved for your crimes. "
+ clonable = FALSE
random_gain = FALSE
var/obj/effect/hallucination/simple/securitron/beepsky
@@ -201,4 +304,4 @@
/obj/effect/hallucination/simple/securitron/Destroy()
STOP_PROCESSING(SSfastprocess,src)
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm
index 1a26ea7a14..dfe63ce141 100644
--- a/code/datums/brain_damage/split_personality.dm
+++ b/code/datums/brain_damage/split_personality.dm
@@ -13,6 +13,10 @@
var/mob/living/split_personality/owner_backseat
/datum/brain_trauma/severe/split_personality/on_gain()
+ var/mob/living/M = owner
+ if(M.stat == DEAD) //No use assigning people to a corpse
+ qdel(src)
+ return
..()
make_backseats()
get_ghost()
@@ -23,7 +27,7 @@
/datum/brain_trauma/severe/split_personality/proc/get_ghost()
set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
C.transfer_ckey(stranger_backseat, FALSE)
@@ -191,13 +195,13 @@
/datum/brain_trauma/severe/split_personality/brainwashing/on_life()
return //no random switching
-/datum/brain_trauma/severe/split_personality/brainwashing/on_hear(message, speaker, message_language, raw_message, radio_freq)
- if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == speaker)
- return message
+/datum/brain_trauma/severe/split_personality/brainwashing/handle_hearing(datum/source, list/hearing_args)
+ if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == hearing_args[HEARING_SPEAKER])
+ return
+ var/message = hearing_args[HEARING_MESSAGE]
if(findtext(message, codeword))
- message = replacetext(message, codeword, "[codeword] ")
+ hearing_args[HEARING_MESSAGE] = replacetext(message, codeword, "[codeword] ")
addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10)
- return message
/datum/brain_trauma/severe/split_personality/brainwashing/handle_speech(datum/source, list/speech_args)
if(findtext(speech_args[SPEECH_MESSAGE], codeword))
diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm
index 53c8c280a9..975b52dcb9 100644
--- a/code/datums/components/armor_plate.dm
+++ b/code/datums/components/armor_plate.dm
@@ -29,21 +29,21 @@
var/obj/item/typecast = upgrade_item
upgrade_name = initial(typecast.name)
-/datum/component/armor_plate/proc/examine(datum/source, mob/user)
+/datum/component/armor_plate/proc/examine(datum/source, mob/user, list/examine_list)
//upgrade_item could also be typecast here instead
if(ismecha(parent))
if(amount)
if(amount < maxamount)
- to_chat(user, "Its armor is enhanced with [amount] [upgrade_name]. ")
+ examine_list += "Its armor is enhanced with [amount] [upgrade_name]. "
else
- to_chat(user, "It's wearing a fearsome carapace entirely composed of [upgrade_name] - its pilot must be an experienced monster hunter. ")
+ examine_list += "It's wearing a fearsome carapace entirely composed of [upgrade_name] - its pilot must be an experienced monster hunter. "
else
- to_chat(user, "It has attachment points for strapping monster hide on for added protection. ")
+ examine_list += "It has attachment points for strapping monster hide on for added protection. "
else
if(amount)
- to_chat(user, "It has been strengthened with [amount]/[maxamount] [upgrade_name]. ")
+ examine_list += "It has been strengthened with [amount]/[maxamount] [upgrade_name]. "
else
- to_chat(user, "It can be strengthened with up to [maxamount] [upgrade_name]. ")
+ examine_list += "It can be strengthened with up to [maxamount] [upgrade_name]. "
/datum/component/armor_plate/proc/applyplate(datum/source, obj/item/I, mob/user, params)
if(!istype(I,upgrade_item))
diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm
index 3b64d68486..01df44752c 100644
--- a/code/datums/components/construction.dm
+++ b/code/datums/components/construction.dm
@@ -19,9 +19,9 @@
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/action)
update_parent(index)
-/datum/component/construction/proc/examine(datum/source, mob/user)
+/datum/component/construction/proc/examine(datum/source, mob/user, list/examine_list)
if(desc)
- to_chat(user, desc)
+ examine_list += desc
/datum/component/construction/proc/on_step()
if(index > steps.len)
diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm
index bdc1d3a2f6..641dbdb1cf 100644
--- a/code/datums/components/decal.dm
+++ b/code/datums/components/decal.dm
@@ -71,5 +71,5 @@
if(strength >= cleanable)
qdel(src)
-/datum/component/decal/proc/examine(datum/source, mob/user)
- to_chat(user, description)
\ No newline at end of file
+/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list)
+ examine_list += description
\ No newline at end of file
diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm
index fb68b89ebf..c7e59e0ead 100644
--- a/code/datums/components/magnetic_catch.dm
+++ b/code/datums/components/magnetic_catch.dm
@@ -15,8 +15,8 @@
for(var/i in parent)
RegisterSignal(i, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react)
-/datum/component/magnetic_catch/proc/examine(datum/source, mob/user)
- to_chat(user, "It has been installed with inertia dampening to prevent coffee spills.")
+/datum/component/magnetic_catch/proc/examine(datum/source, mob/user, list/examine_list)
+ examine_list += "It has been installed with inertia dampening to prevent coffee spills."
/datum/component/magnetic_catch/proc/crossed_react(datum/source, atom/movable/thing)
RegisterSignal(thing, COMSIG_MOVABLE_PRE_THROW, .proc/throw_react, TRUE)
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 48fa758db1..25094518b8 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -49,13 +49,13 @@
var/mat_path = possible_mats[id]
materials[id] = new mat_path()
-/datum/component/material_container/proc/OnExamine(datum/source, mob/user)
+/datum/component/material_container/proc/OnExamine(datum/source, mob/user, list/examine_list)
if(show_on_examine)
for(var/I in materials)
var/datum/material/M = materials[I]
var/amt = amount(M.id)
if(amt)
- to_chat(user, "It has [amt] units of [lowertext(M.name)] stored. ")
+ examine_list += "It has [amt] units of [lowertext(M.name)] stored. "
/datum/component/material_container/proc/OnAttackBy(datum/source, obj/item/I, mob/living/user)
var/list/tc = allowed_typecache
diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm
index 3f7f794435..362961a24f 100644
--- a/code/datums/components/nanites.dm
+++ b/code/datums/components/nanites.dm
@@ -53,7 +53,6 @@
RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access)
RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock)
RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock)
- RegisterSignal(parent, COMSIG_MOVABLE_HEAR, .proc/on_hear)
RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype)
RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal)
@@ -191,11 +190,6 @@
var/datum/nanite_program/NP = X
NP.on_death(gibbed)
-/datum/component/nanites/proc/on_hear(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
- for(var/X in programs)
- var/datum/nanite_program/NP = X
- NP.on_hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
-
/datum/component/nanites/proc/receive_signal(datum/source, code, source = "an unidentified source")
for(var/X in programs)
var/datum/nanite_program/NP = X
diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm
index bf47793f81..9dac20d94f 100644
--- a/code/datums/components/radioactive.dm
+++ b/code/datums/components/radioactive.dm
@@ -18,7 +18,7 @@
hl3_release_date = _half_life
can_contaminate = _can_contaminate
- if(istype(parent, /atom))
+ if(istype(parent, /atom))
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine)
if(istype(parent, /obj/item))
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack)
@@ -58,7 +58,7 @@
else
strength = max(strength, arguments[1])
-/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing)
+/datum/component/radioactive/proc/rad_examine(datum/source, mob/user, list/examine_list)
var/atom/master = parent
var/list/out = list()
if(get_dist(master, user) <= 1)
@@ -72,7 +72,7 @@
out += "[out ? " and it " : "[master] "]hurts to look at."
else
out += "."
- to_chat(user, out.Join())
+ examine_list += out.Join()
/datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user)
radiation_pulse(parent, strength/20)
diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm
index a044ca301e..81ff2d517d 100644
--- a/code/datums/components/rotation.dm
+++ b/code/datums/components/rotation.dm
@@ -98,9 +98,9 @@
remove_verbs()
. = ..()
-/datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user)
+/datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list)
if(rotation_flags & ROTATION_ALTCLICK)
- to_chat(user, "Alt-click to rotate it clockwise. ")
+ examine_list += "Alt-click to rotate it clockwise. "
/datum/component/simple_rotation/proc/HandRot(datum/source, mob/user, rotation = default_rotation_direction)
if(!can_be_rotated.Invoke(user, rotation) || !can_user_rotate.Invoke(user, rotation))
diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm
index bbcb0d88a6..91928656e1 100644
--- a/code/datums/components/stationloving.dm
+++ b/code/datums/components/stationloving.dm
@@ -8,6 +8,7 @@
if(!ismovableatom(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds)
+ RegisterSignal(parent, list(COMSIG_MOVABLE_SECLUDED_LOCATION), .proc/relocate)
RegisterSignal(parent, list(COMSIG_PARENT_PREQDELETED), .proc/check_deletion)
RegisterSignal(parent, list(COMSIG_ITEM_IMBUE_SOUL), .proc/check_soul_imbue)
src.inform_admins = inform_admins
@@ -32,6 +33,7 @@
var/atom/movable/AM = parent
AM.forceMove(targetturf)
+ to_chat(get(parent, /mob), "You can't help but feel that you just lost something back there... ")
// move the disc, so ghosts remain orbiting it even if it's "destroyed"
return targetturf
@@ -40,7 +42,6 @@
return
else
var/turf/currentturf = get_turf(src)
- to_chat(get(parent, /mob), "You can't help but feel that you just lost something back there... ")
var/turf/targetturf = relocate()
log_game("[parent] has been moved out of bounds in [loc_name(currentturf)]. Moving it to [loc_name(targetturf)].")
if(inform_admins)
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index a92ae9e629..dd189137a5 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -309,6 +309,7 @@
else
var/datum/numbered_display/ND = .[I.type]
ND.number++
+ . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE)
//This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing.
/datum/component/storage/proc/orient2hud(mob/user, maxcolumns)
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index d119759efc..26a709590c 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -11,6 +11,7 @@
var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not
var/help_verb
var/no_guns = FALSE
+ var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist.
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
/datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 7399528e1c..b98bc4f951 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -1,6 +1,7 @@
/datum/martial_art/boxing
name = "Boxing"
id = MARTIALART_BOXING
+ pacifism_check = FALSE //Let's pretend pacifists can boxe the heck out of other people, it only deals stamina damage right now.
/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
to_chat(A, "Can't disarm while boxing! ")
@@ -16,14 +17,15 @@
var/atk_verb = pick("left hook","right hook","straight punch")
- var/damage = rand(5, 8) + A.dna.species.punchdamagelow
- if(!damage)
+ var/damage = rand(10, 13)
+ var/extra_damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ if(extra_damage == A.dna.species.punchdamagelow)
playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1)
D.visible_message("[A] has attempted to [atk_verb] [D]! ", \
"[A] has attempted to [atk_verb] [D]! ", null, COMBAT_MESSAGE_RANGE)
log_combat(A, D, "attempted to hit", atk_verb)
- return 0
-
+ return TRUE
+ damage += extra_damage
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
var/armor_block = D.run_armor_check(affecting, "melee")
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index c7644997ee..73173a4a9a 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -124,6 +124,8 @@
add_to_streak("G",D)
if(check_streak(A,D))
return TRUE
+ if(A == D) // no self grab.
+ return FALSE
if(A.grab_state >= GRAB_AGGRESSIVE)
D.grabbedby(A, 1)
else
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 6379d481ca..4e8dacaef9 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -19,6 +19,9 @@
owner.visible_message("[owner] assumes a neutral stance. ", "Your next attack is cleared. ")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people! ")
+ return
owner.visible_message("[owner] assumes the Neck Chop stance! ", "Your next attack will be a Neck Chop. ")
H.mind.martial_art.streak = "neck_chop"
@@ -36,6 +39,9 @@
owner.visible_message("[owner] assumes a neutral stance. ", "Your next attack is cleared. ")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people! ")
+ return
owner.visible_message("[owner] assumes the Leg Sweep stance! ", "Your next attack will be a Leg Sweep. ")
H.mind.martial_art.streak = "leg_sweep"
@@ -53,6 +59,9 @@
owner.visible_message("[owner] assumes a neutral stance. ", "Your next attack is cleared. ")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people! ")
+ return
owner.visible_message("[owner] assumes the Lung Punch stance! ", "Your next attack will be a Lung Punch. ")
H.mind.martial_art.streak = "quick_choke"//internal name for lung punch
@@ -145,8 +154,6 @@
return 1
/datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- if(check_streak(A,D))
- return 1
var/obj/item/I = null
if(prob(60))
I = D.get_active_held_item()
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 34301516dc..45d73353f9 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -1,6 +1,7 @@
/datum/martial_art/psychotic_brawling
name = "Psychotic Brawling"
id = MARTIALART_PSYCHOBRAWL
+ pacifism_check = FALSE //Quite uncontrollable and unpredictable, people will still end up harming others with it.
/datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
return psycho_attack(A,D)
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 801e8c8c7a..f89374dc2a 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -105,6 +105,8 @@
add_to_streak("G",D)
if(check_streak(A,D))
return 1
+ if(A == D) //no self grab stun
+ return FALSE
if(A.grab_state >= GRAB_AGGRESSIVE)
D.grabbedby(A, 1)
else
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 81ec0bf977..c967779d03 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -49,6 +49,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to BODY SLAM! ", "Your next attack will be a BODY SLAM. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "slam"
@@ -61,6 +64,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to THROW! ", "Your next attack will be a THROW. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "throw"
@@ -73,6 +79,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to KICK! ", "Your next attack will be a KICK. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "kick"
@@ -85,6 +94,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to STRIKE! ", "Your next attack will be a STRIKE. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "strike"
@@ -97,6 +109,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to LEG DROP! ", "Your next attack will be a LEG DROP. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "drop"
@@ -433,8 +448,8 @@
/datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(check_streak(A,D))
return 1
- if(A.pulling == D)
- return 1
+ if(A.pulling == D || A == D) // don't stun grab yoursel
+ return FALSE
A.start_pulling(D)
D.visible_message("[A] gets [D] in a cinch! ", \
"[A] gets [D] in a cinch! ")
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 8386b59d97..da379b9851 100755
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -28,16 +28,16 @@
var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns
-/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
//to be overridden for customization depending on client prefs,species etc
return
-/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
//to be overridden for toggling internals, id binding, access etc
return
-/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- pre_equip(H, visualsOnly)
+/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ pre_equip(H, visualsOnly, preference_source)
//Start with uniform,suit,backpack for additional slots
if(uniform)
@@ -103,7 +103,7 @@
var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit
HS.ToggleHelmet()
- post_equip(H, visualsOnly)
+ post_equip(H, visualsOnly, preference_source)
if(!visualsOnly)
apply_fingerprints(H)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index fb636f6911..84ed012b82 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -567,8 +567,7 @@ datum/status_effect/pacify
tick_interval = 10
examine_text = "SUBJECTPRONOUN seems slow and unfocused. "
var/stun = TRUE
- var/triggered = FALSE
- alert_type = null
+ alert_type = /obj/screen/alert/status_effect/trance
/obj/screen/alert/status_effect/trance
name = "Trance"
@@ -576,17 +575,6 @@ datum/status_effect/pacify
icon_state = "high"
/datum/status_effect/trance/tick()
- if(HAS_TRAIT(owner, "hypnotherapy"))
- if(triggered == TRUE)
- UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
- RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize)
- ADD_TRAIT(owner, TRAIT_MUTE, "trance")
- if(!owner.has_quirk(/datum/quirk/monochromatic))
- owner.add_client_colour(/datum/client_colour/monochrome)
- to_chat(owner, "[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")] ")
- triggered = FALSE
- else
- return
if(stun)
owner.Stun(60, TRUE, TRUE)
owner.dizziness = 20
@@ -594,47 +582,88 @@ datum/status_effect/pacify
/datum/status_effect/trance/on_apply()
if(!iscarbon(owner))
return FALSE
- if(HAS_TRAIT(owner, "hypnotherapy"))
- RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/listen)
- return TRUE
- alert_type = /obj/screen/alert/status_effect/trance
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/hypnotize)
ADD_TRAIT(owner, TRAIT_MUTE, "trance")
- if(!owner.has_quirk(/datum/quirk/monochromatic))
- owner.add_client_colour(/datum/client_colour/monochrome)
+ owner.add_client_colour(/datum/client_colour/monochrome/trance)
owner.visible_message("[stun ? "[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point. " : ""]", \
"[pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed...")] ")
return TRUE
-/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE, source_quirk = FALSE)//hypnoquirk makes no visible message, prevents self antag messages, and places phrase below objectives.
+/datum/status_effect/trance/on_creation(mob/living/new_owner, _duration, _stun = TRUE)
duration = _duration
stun = _stun
- if(source_quirk == FALSE && HAS_TRAIT(owner, "hypnotherapy"))
- REMOVE_TRAIT(owner, "hypnotherapy", ROUNDSTART_TRAIT)
return ..()
/datum/status_effect/trance/on_remove()
UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
REMOVE_TRAIT(owner, TRAIT_MUTE, "trance")
owner.dizziness = 0
- if(!owner.has_quirk(/datum/quirk/monochromatic))
- owner.remove_client_colour(/datum/client_colour/monochrome)
+ owner.remove_client_colour(/datum/client_colour/monochrome/trance)
to_chat(owner, "You snap out of your trance! ")
-/datum/status_effect/trance/proc/listen(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
- to_chat(owner, "[speaker] accidentally sets off your implanted trigger, sending you into a hypnotic daze! ")
- triggered = TRUE
-
-/datum/status_effect/trance/proc/hypnotize(datum/source, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args)
if(!owner.can_hear())
return
- if(speaker == owner)
+ if(hearing_args[HEARING_SPEAKER] == owner)
return
var/mob/living/carbon/C = owner
C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis
- if(HAS_TRAIT(C, "hypnotherapy"))
- addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message, TRUE), 10)
- else
- addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, raw_message), 10)
+ addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hearing_args[HEARING_RAW_MESSAGE]), 10)
addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it
qdel(src)
+
+/datum/status_effect/spasms
+ id = "spasms"
+ status_type = STATUS_EFFECT_MULTIPLE
+ alert_type = null
+
+/datum/status_effect/spasms/tick()
+ if(prob(15))
+ switch(rand(1,5))
+ if(1)
+ if((!owner.lying && !owner.buckled) && isturf(owner.loc))
+ to_chat(owner, "Your leg spasms! ")
+ step(owner, pick(GLOB.cardinals))
+ if(2)
+ if(owner.incapacitated())
+ return
+ var/obj/item/I = owner.get_active_held_item()
+ if(I)
+ to_chat(owner, "Your fingers spasm! ")
+ owner.log_message("used [I] due to a Muscle Spasm", LOG_ATTACK)
+ I.attack_self(owner)
+ if(3)
+ var/prev_intent = owner.a_intent
+ owner.a_intent = INTENT_HARM
+
+ var/range = 1
+ if(istype(owner.get_active_held_item(), /obj/item/gun)) //get targets to shoot at
+ range = 7
+
+ var/list/mob/living/targets = list()
+ for(var/mob/M in oview(owner, range))
+ if(isliving(M))
+ targets += M
+ if(LAZYLEN(targets))
+ to_chat(owner, "Your arm spasms! ")
+ owner.log_message(" attacked someone due to a Muscle Spasm", LOG_ATTACK) //the following attack will log itself
+ owner.ClickOn(pick(targets))
+ owner.a_intent = prev_intent
+ if(4)
+ var/prev_intent = owner.a_intent
+ owner.a_intent = INTENT_HARM
+ to_chat(owner, "Your arm spasms! ")
+ owner.log_message("attacked [owner.p_them()]self to a Muscle Spasm", LOG_ATTACK)
+ owner.ClickOn(owner)
+ owner.a_intent = prev_intent
+ if(5)
+ if(owner.incapacitated())
+ return
+ var/obj/item/I = owner.get_active_held_item()
+ var/list/turf/targets = list()
+ for(var/turf/T in oview(owner, 3))
+ targets += T
+ if(LAZYLEN(targets) && I)
+ to_chat(owner, "Your arm spasms! ")
+ owner.log_message("threw [I] due to a Muscle Spasm", LOG_ATTACK)
+ owner.throw_item(pick(targets))
\ No newline at end of file
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index 655863e0e0..cb2b4174b5 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -69,3 +69,17 @@
/datum/status_effect/in_love/tick()
if(date)
new /obj/effect/temp_visual/love_heart/invisible(get_turf(date.loc), owner)
+
+/datum/status_effect/throat_soothed
+ id = "throat_soothed"
+ duration = 60 SECONDS
+ status_type = STATUS_EFFECT_REFRESH
+ alert_type = null
+
+/datum/status_effect/throat_soothed/on_apply()
+ . = ..()
+ ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
+
+/datum/status_effect/throat_soothed/on_remove()
+ . = ..()
+ REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
\ No newline at end of file
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index bc1cfba112..0d84aab763 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -64,6 +64,12 @@
owner = null
qdel(src)
+/datum/status_effect/proc/refresh()
+ var/original_duration = initial(duration)
+ if(original_duration == -1)
+ return
+ duration = world.time + original_duration
+
//clickdelay/nextmove modifiers!
/datum/status_effect/proc/nextmove_modifier()
return 1
@@ -92,6 +98,9 @@
if(S.id == initial(S1.id) && S.status_type)
if(S.status_type == STATUS_EFFECT_REPLACE)
S.be_replaced()
+ else if(S.status_type == STATUS_EFFECT_REFRESH)
+ S.refresh()
+ return
else
return
var/list/arguments = args.Copy()
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e8651ba93d..6f633f7c6d 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -280,35 +280,35 @@
///Generate the full examine string of this atom (including icon for goonchat)
/atom/proc/get_examine_string(mob/user, thats = FALSE)
- . = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
+ return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
/atom/proc/examine(mob/user)
- to_chat(user, "[get_examine_string(user, TRUE)].")
+ . = list("[get_examine_string(user, TRUE)].")
if(desc)
- to_chat(user, desc)
+ . += desc
if(reagents)
if(reagents.reagents_holder_flags & TRANSPARENT)
- to_chat(user, "It contains:")
- if(reagents.reagent_list.len)
+ . += "It contains:"
+ if(length(reagents.reagent_list))
if(user.can_see_reagents()) //Show each individual reagent
for(var/datum/reagent/R in reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name]")
+ . += "[R.volume] units of [R.name]"
else //Otherwise, just show the total volume
var/total_volume = 0
for(var/datum/reagent/R in reagents.reagent_list)
total_volume += R.volume
- to_chat(user, "[total_volume] units of various reagents")
+ . += "[total_volume] units of various reagents"
else
- to_chat(user, "Nothing.")
+ . += "Nothing."
else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE)
if(reagents.total_volume)
- to_chat(user, "It has [reagents.total_volume] unit\s left. ")
+ . += "It has [reagents.total_volume] unit\s left. "
else
- to_chat(user, "It's empty. ")
+ . += "It's empty. "
- SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user)
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
/atom/proc/relaymove(mob/user)
if(buckle_message_cooldown <= world.time)
@@ -660,7 +660,7 @@
var/atom/L = loc
if(!L)
return null
- return L.AllowDrop() ? L : get_turf(L)
+ return L.AllowDrop() ? L : L.drop_location()
/atom/Entered(atom/movable/AM, atom/oldLoc)
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 76e6268977..a76e8234ba 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -339,10 +339,6 @@ Credit where due:
CLOCKCULTCHANGELOG\
\
\
- Zelus oil: A new reagent. It can be used to heal the faithful to Ratvar, or kill heretics and moreso stun blood cultists,\
- or splashed onto metal sheets to make brass. This chemical can be found in minimal quantities by grinding brass sheets.\
- Brass Flasks: Intended to store Zelus Oil in, but can also be used as fragile single use throwing weapons in a pinch! \
- These are crafted with a single sheet of brass and fit in the Clockwork Cuirass' suit storage.\
Good luck! "
/obj/item/paper/servant_primer/Initialize()
@@ -353,7 +349,7 @@ Credit where due:
changelog_contents += "[entry] "
info = replacetext(info, "CLOCKCULTCHANGELOG", changelog_contents)
-/obj/item/paper/servant_primer/examine(mob/user)
- if(!is_servant_of_ratvar(user) && !isobserver(user))
- to_chat(user, "You can't understand any of the words on [src]. ")
- ..()
+/obj/item/paper/servant_primer/oui_getcontent(mob/target)
+ if(!is_servant_of_ratvar(target) && !isobserver(target))
+ return "[name] [stars(info)] [stamps]"
+ return ..()
diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm
index 66de72bad2..49a336e16a 100644
--- a/code/game/gamemodes/clown_ops/clown_ops.dm
+++ b/code/game/gamemodes/clown_ops/clown_ops.dm
@@ -53,7 +53,7 @@
/datum/outfit/syndicate/clownop/no_crystals
tc = 0
-/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index 83a3debfdc..25edd0c68b 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -409,7 +409,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
message_admins("Drafting players for forced ruleset [rule.name].")
log_game("DYNAMIC: Drafting players for forced ruleset [rule.name].")
rule.mode = src
- rule.acceptable(GLOB.player_list.len, threat_level) // Assigns some vars in the modes, running it here for consistency
+ rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency
rule.candidates = candidates.Copy()
rule.trim_candidates()
if (rule.ready(TRUE))
@@ -421,7 +421,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
return TRUE
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules)
- if (rule.acceptable(GLOB.player_list.len, threat_level) && threat >= rule.cost) // If we got the population and threat required
+ if (rule.acceptable(roundstart_pop_ready, threat_level) && threat >= rule.cost) // If we got the population and threat required
rule.candidates = candidates.Copy()
rule.trim_candidates()
if (rule.ready() && rule.candidates.len > 0)
@@ -429,12 +429,12 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
if(!drafted_rules.len)
message_admins("Not enough threat level for roundstart antags!")
log_game("DYNAMIC: Not enough threat level for roundstart antags!")
- var/indice_pop = min(10,round(GLOB.player_list.len/pop_per_requirement)+1)
+ var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1)
extra_rulesets_amount = 0
if (GLOB.dynamic_classic_secret)
extra_rulesets_amount = 0
else
- if (GLOB.player_list.len > GLOB.dynamic_high_pop_limit)
+ if (roundstart_pop_ready > GLOB.dynamic_high_pop_limit)
message_admins("High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.")
log_game("DYNAMIC: High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.")
if (threat_level > high_pop_second_rule_req)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
index a20022cb71..4ac8cc91d3 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
@@ -143,7 +143,6 @@
repeatable_weight_decrease = 2
requirements = list(60,50,40,30,30,30,30,30,30,30)
high_population_requirement = 30
- repeatable = TRUE
/datum/dynamic_ruleset/event/meteor_wave/ready()
if(mode.threat_level > 40 && mode.threat >= 25 && prob(20))
@@ -270,7 +269,7 @@
repeatable = TRUE
/datum/dynamic_ruleset/event/processor_overload
- name = "Processer Overload"
+ name = "Processor Overload"
config_tag = "processor_overload"
typepath = /datum/round_event/processor_overload
cost = 4
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 9d4960858d..8cda402ebf 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -41,6 +41,9 @@
if (!istype(M, required_type))
trimmed_list.Remove(M)
continue
+ if (M.GetComponent(/datum/component/virtual_reality))
+ trimmed_list.Remove(M)
+ continue
if (!M.client) // Are they connected?
trimmed_list.Remove(M)
continue
@@ -107,11 +110,11 @@
candidates = pollGhostCandidates("The mode is looking for volunteers to become a [name]", antag_flag, SSticker.mode, antag_flag, poll_time = 300)
- if(!candidates || candidates.len <= 0)
- message_admins("The ruleset [name] received no applications.")
- log_game("DYNAMIC: The ruleset [name] received no applications.")
+ if(!candidates || candidates.len <= required_candidates)
+ message_admins("The ruleset [name] did not receive enough applications.")
+ log_game("DYNAMIC: The ruleset [name] did not receive enough applications.")
mode.refund_threat(cost)
- mode.log_threat("Rule [name] refunded [cost] (no applications)",verbose=TRUE)
+ mode.log_threat("Rule [name] refunded [cost] (not receive enough applications)",verbose=TRUE)
mode.executed_rules -= src
return
@@ -150,7 +153,7 @@
finish_setup(new_character, i)
assigned += applicant
- notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT, header="Something Interesting!")
+ notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT)
/datum/dynamic_ruleset/midround/from_ghosts/proc/generate_ruleset_body(mob/applicant)
var/mob/living/carbon/human/new_character = makeBody(applicant)
@@ -283,6 +286,7 @@
/datum/dynamic_ruleset/midround/from_ghosts/wizard
name = "Wizard"
config_tag = "midround_wizard"
+ persistent = TRUE
antag_datum = /datum/antagonist/wizard
antag_flag = ROLE_WIZARD
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
@@ -293,6 +297,7 @@
requirements = list(90,90,70,50,50,50,50,40,30,30)
high_population_requirement = 30
repeatable = TRUE
+ var/datum/mind/wizard
/datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE)
if (required_candidates > (dead_players.len + list_observers.len))
@@ -307,6 +312,20 @@
..()
new_character.forceMove(pick(GLOB.wizardstart))
+/datum/dynamic_ruleset/midround/from_ghosts/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great
+ if(isliving(wizard.current) && wizard.current.stat!=DEAD)
+ return FALSE
+
+ for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
+ if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard))
+ return FALSE
+
+ if(SSevents.wizardmode) //If summon events was active, turn it off
+ SSevents.toggleWizardmode()
+ SSevents.resetFrequency()
+
+ return RULESET_STOP_PROCESSING
+
//////////////////////////////////////////////
// //
// NUCLEAR OPERATIVES (MIDROUND) //
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index 9eb06884c1..56b02a1364 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -149,6 +149,7 @@
/datum/dynamic_ruleset/roundstart/wizard
name = "Wizard"
config_tag = "wizard"
+ persistent = TRUE
antag_flag = ROLE_WIZARD
antag_datum = /datum/antagonist/wizard
minimum_required_age = 14
@@ -183,8 +184,25 @@
for(var/datum/mind/M in assigned)
M.current.forceMove(pick(GLOB.wizardstart))
M.add_antag_datum(new antag_datum())
+ roundstart_wizards += M
return TRUE
+/datum/dynamic_ruleset/roundstart/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great
+ for(var/datum/mind/wizard in roundstart_wizards)
+ if(isliving(wizard.current) && wizard.current.stat!=DEAD)
+ return FALSE
+
+ for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
+ if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard))
+ return FALSE
+
+ if(SSevents.wizardmode) //If summon events was active, turn it off
+ SSevents.toggleWizardmode()
+ SSevents.resetFrequency()
+
+ return RULESET_STOP_PROCESSING
+
+
//////////////////////////////////////////////
// //
// BLOOD CULT //
@@ -263,7 +281,7 @@
requirements = list(100,90,80,70,60,50,50,50,50,50)
high_population_requirement = 50
flags = HIGHLANDER_RULESET
- antag_cap = list(2,2,2,3,3,3,4,4,5,5)
+ antag_cap = list(1,1,2,3,4,5,5,5,5,5)
var/datum/team/nuclear/nuke_team
/datum/dynamic_ruleset/roundstart/nuclear/ready(forced = FALSE)
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 58f551c648..6d681f8108 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -167,7 +167,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/examine(mob/user)
if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user))
SSmedals.UnlockMedal(MEDAL_METEOR, user.client)
- ..()
+ return ..()
/obj/effect/meteor/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_MINING)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 1767d468ec..632d59c84d 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -144,7 +144,7 @@
/datum/outfit/syndicate/no_crystals
tc = 0
-/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
var/obj/item/radio/R = H.ears
R.set_frequency(FREQ_SYNDICATE)
R.freqlock = TRUE
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 513fea4360..281f28688e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -130,8 +130,8 @@
open_machine()
/obj/machinery/sleeper/examine(mob/user)
- ..()
- to_chat(user, "Alt-click [src] to [state_open ? "close" : "open"] it. ")
+ . = ..()
+ . += "Alt-click [src] to [state_open ? "close" : "open"] it. "
/obj/machinery/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index e2dcf552c1..ff7383cd9e 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -454,20 +454,20 @@ Class Procs:
/obj/machinery/examine(mob/user)
. = ..()
if(stat & BROKEN)
- to_chat(user, "It looks broken and non-functional. ")
+ . += "It looks broken and non-functional. "
if(!(resistance_flags & INDESTRUCTIBLE))
if(resistance_flags & ON_FIRE)
- to_chat(user, "It's on fire! ")
+ . += "It's on fire! "
var/healthpercent = (obj_integrity/max_integrity) * 100
switch(healthpercent)
if(50 to 99)
- to_chat(user, "It looks slightly damaged.")
+ . += "It looks slightly damaged."
if(25 to 50)
- to_chat(user, "It appears heavily damaged.")
+ . += "It appears heavily damaged."
if(0 to 25)
- to_chat(user, "It's falling apart! ")
+ . += "It's falling apart! "
if(user.research_scanner && component_parts)
- to_chat(user, display_parts(user, TRUE))
+ . += display_parts(user, TRUE)
//called on machinery construction (i.e from frame to machinery) but not on initialization
/obj/machinery/proc/on_construction()
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index cac29404d2..1703ce57d1 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -14,8 +14,8 @@
req_access = list(ACCESS_AI_UPLOAD)
/obj/machinery/ai_slipper/examine(mob/user)
- ..()
- to_chat(user, "It has [uses] uses of foam remaining. ")
+ . = ..()
+ . += "It has [uses] uses of foam remaining. "
/obj/machinery/ai_slipper/power_change()
if(stat & BROKEN)
diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm
index 8419f5803c..b9d63e5771 100644
--- a/code/game/machinery/aug_manipulator.dm
+++ b/code/game/machinery/aug_manipulator.dm
@@ -11,9 +11,9 @@
var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi')
/obj/machinery/aug_manipulator/examine(mob/user)
- ..()
+ . = ..()
if(storedpart)
- to_chat(user, "Alt-click to eject the limb. ")
+ . += "Alt-click to eject the limb. "
/obj/machinery/aug_manipulator/Initialize()
initial_icon_state = initial(icon_state)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index fb384d55ae..1839e44e3b 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -24,10 +24,10 @@
add_overlay("ccharger-o[newlevel]")
/obj/machinery/cell_charger/examine(mob/user)
- ..()
- to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
+ . = ..()
+ . += "There's [charging ? "a" : "no"] cell in the charger."
if(charging)
- to_chat(user, "Current charge: [round(charging.percent(), 1)]%.")
+ . += "Current charge: [round(charging.percent(), 1)]%."
/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index e65da0fcff..e683d67be2 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -93,20 +93,20 @@
to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"]. ")
/obj/item/disk/data/examine(mob/user)
- ..()
- to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
+ . = ..()
+ . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]."
//Clonepod
/obj/machinery/clonepod/examine(mob/user)
- ..()
+ . = ..()
var/mob/living/mob_occupant = occupant
if(mess)
- to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...")
+ . += "It's filled with blood and viscera. You swear you can see it moving..."
if(is_operational() && mob_occupant)
if(mob_occupant.stat != DEAD)
- to_chat(user, "Current clone cycle is [round(get_completion())]% complete.")
+ . += "Current clone cycle is [round(get_completion())]% complete."
/obj/machinery/clonepod/return_air()
// We want to simulate the clone not being in contact with
diff --git a/code/game/machinery/computer/arcade/orion_trail.dm b/code/game/machinery/computer/arcade/orion_trail.dm
index 023b1048ce..c8c7bc1319 100644
--- a/code/game/machinery/computer/arcade/orion_trail.dm
+++ b/code/game/machinery/computer/arcade/orion_trail.dm
@@ -762,13 +762,13 @@
var/active = 0 //if the ship is on
/obj/item/orion_ship/examine(mob/user)
- ..()
+ . = ..()
if(!(in_range(user, src)))
return
if(!active)
- to_chat(user, "There's a little switch on the bottom. It's flipped down. ")
+ . += "There's a little switch on the bottom. It's flipped down. "
else
- to_chat(user, "There's a little switch on the bottom. It's flipped up. ")
+ . += "There's a little switch on the bottom. It's flipped up. "
/obj/item/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse
if(active)
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index c8a4d68575..056beb2e96 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -19,7 +19,7 @@
return
to_chat(user, "You start deconstructing the frame... ")
- if(P.use_tool(src, user, 20, volume=50))
+ if(P.use_tool(src, user, 20, volume=50) && state == 0)
to_chat(user, "You deconstruct the frame. ")
var/obj/item/stack/sheet/metal/M = new (drop_location(), 5)
M.add_fingerprint(user)
@@ -28,7 +28,7 @@
if(1)
if(istype(P, /obj/item/wrench))
to_chat(user, "You start to unfasten the frame... ")
- if(P.use_tool(src, user, 20, volume=50))
+ if(P.use_tool(src, user, 20, volume=50) && state == 1)
to_chat(user, "You unfasten the frame. ")
setAnchored(FALSE)
state = 0
@@ -72,9 +72,7 @@
if(!P.tool_start_check(user, amount=5))
return
to_chat(user, "You start adding cables to the frame... ")
- if(P.use_tool(src, user, 20, volume=50, amount=5))
- if(state != 2)
- return
+ if(P.use_tool(src, user, 20, 5, 50, CALLBACK(src, .proc/check_state, 2)))
to_chat(user, "You add cables to the frame. ")
state = 3
icon_state = "3"
@@ -94,9 +92,7 @@
return
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
to_chat(user, "You start to put in the glass panel... ")
- if(P.use_tool(src, user, 20, amount=2))
- if(state != 3)
- return
+ if(P.use_tool(src, user, 20, 2, 0, CALLBACK(src, .proc/check_state, 3)))
to_chat(user, "You put in the glass panel. ")
state = 4
src.icon_state = "4"
@@ -121,6 +117,11 @@
if(user.a_intent == INTENT_HARM)
return ..()
+//callback proc used on stacks use_tool to stop unnecessary amounts being wasted from spam clicking.
+/obj/structure/frame/computer/proc/check_state(target_state)
+ if(state == target_state)
+ return TRUE
+ return FALSE
/obj/structure/frame/computer/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 11935e2bfc..1bafa73aaa 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -17,13 +17,7 @@
network += lowertext(i)
/obj/machinery/computer/security/check_eye(mob/user)
- if(CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE))
- user.unset_machine()
- return
- if(!(user in watchers))
- user.unset_machine()
- return
- if(!watchers[user])
+ if(!can_interact(user) || !(user in watchers) || !watchers[user])
user.unset_machine()
return
var/obj/machinery/camera/C = watchers[user]
@@ -41,55 +35,50 @@
M.unset_machine() //to properly reset the view of the users if the console is deleted.
return ..()
-/obj/machinery/computer/security/attack_hand(mob/user)
+/obj/machinery/computer/security/can_interact(mob/user)
+ if((!issilicon(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src))
+ return FALSE
+ return ..()
+
+/obj/machinery/computer/security/interact(mob/user, special_state)
. = ..()
- if(.)
- return
- if(stat)
+ if (ismob(user) && !isliving(user)) // ghosts don't need cameras
return
if (!network)
- throw EXCEPTION("No camera network")
+ CRASH("No camera network")
user.unset_machine()
- return
+ return FALSE
if (!(islist(network)))
- throw EXCEPTION("Camera network is not a list")
+ CRASH("Camera network is not a list")
user.unset_machine()
- return
- if(..())
- user.unset_machine()
- return
+ return FALSE
var/list/camera_list = get_available_cameras()
if(!(user in watchers))
for(var/Num in camera_list)
var/obj/machinery/camera/CAM = camera_list[Num]
- if(istype(CAM))
- if(CAM.can_use())
- watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants.
- break
+ if(istype(CAM) && CAM.can_use())
+ watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants.
+ break
if(!(user in watchers))
user.unset_machine() // no usable camera on the network, we disconnect the user from the computer.
- return
+ return FALSE
playsound(src, 'sound/machines/terminal_prompt.ogg', 25, 0)
use_camera_console(user)
/obj/machinery/computer/security/proc/use_camera_console(mob/user)
var/list/camera_list = get_available_cameras()
var/t = input(user, "Which camera should you change to?") as null|anything in camera_list
- if(user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine.
+ if(!src || user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine.
return
- if(!t)
+ if(!t || t == "Cancel")
user.unset_machine()
playsound(src, 'sound/machines/terminal_off.ogg', 25, 0)
return
var/obj/machinery/camera/C = camera_list[t]
- if(t == "Cancel")
- user.unset_machine()
- playsound(src, 'sound/machines/terminal_off.ogg', 25, 0)
- return
- if(!C || !C.can_use() || CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE))
+ if(!C || !C.can_use() || !can_interact(user))
user.unset_machine()
return FALSE
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 93b71b27e2..e8e8e1cdd6 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -56,33 +56,34 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
/obj/machinery/computer/card/centcom/get_jobs()
return get_all_centcom_jobs()
-/obj/machinery/computer/card/examine(mob/user)
- . = ..()
- if(inserted_scan_id || inserted_modify_id)
- to_chat(user, "Alt-click to eject the ID card. ")
-
/obj/machinery/computer/card/Initialize()
. = ..()
change_position_cooldown = CONFIG_GET(number/id_console_jobslot_delay)
+/obj/machinery/computer/card/examine(mob/user)
+ . = ..()
+ if(inserted_scan_id || inserted_modify_id)
+ . += "Alt-click to eject the ID card. "
+
/obj/machinery/computer/card/attackby(obj/I, mob/user, params)
if(isidcard(I))
if(check_access(I) && !inserted_scan_id)
if(id_insert(user, I, inserted_scan_id))
inserted_scan_id = I
updateUsrDialog()
- else if(!inserted_modify_id)
- if(id_insert(user, I, inserted_modify_id))
- inserted_modify_id = I
- updateUsrDialog()
+ else if(id_insert(user, I, inserted_modify_id))
+ inserted_modify_id = I
+ updateUsrDialog()
else
return ..()
/obj/machinery/computer/card/Destroy()
if(inserted_scan_id)
- QDEL_NULL(inserted_scan_id)
+ qdel(inserted_scan_id)
+ inserted_scan_id = null
if(inserted_modify_id)
- QDEL_NULL(inserted_modify_id)
+ qdel(inserted_modify_id)
+ inserted_modify_id = null
return ..()
/obj/machinery/computer/card/handle_atom_del(atom/A)
@@ -106,7 +107,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
/obj/machinery/computer/card/proc/job_blacklisted(jobtitle)
return (jobtitle in blacklisted)
-
//Logic check for Topic() if you can open the job
/obj/machinery/computer/card/proc/can_open_job(datum/job/job)
if(job)
@@ -131,6 +131,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
return JOB_MAX_POSITIONS
return JOB_DENIED
+
/obj/machinery/computer/card/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target)
var/obj/item/card/id/card_to_insert = inserting_item
var/holder_item = FALSE
@@ -202,8 +203,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(job.title in blacklisted)
continue
dat += {"
[job.title]
- [job.current_positions]/[job.total_positions]
- "}
+ [job.current_positions]/[job.total_positions]
+ "}
switch(can_open_job(job))
if(JOB_ALLOWED)
if(authenticated == 2)
@@ -224,7 +225,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
dat += "Close Position "
else
dat += "Close Position"
- if(-JOB_COOLDOWN)
+ if(JOB_COOLDOWN)
var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1)
var/mins = round(time_to_wait / 60)
var/seconds = time_to_wait - (60*mins)
@@ -251,6 +252,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
dat += ""
else
var/list/header = list()
+
var/scan_name = inserted_scan_id ? html_encode(inserted_scan_id.name) : "--------"
var/target_name = inserted_modify_id ? html_encode(inserted_modify_id.name) : "--------"
var/target_owner = (inserted_modify_id && inserted_modify_id.registered_name) ? html_encode(inserted_modify_id.registered_name) : "--------"
@@ -261,7 +263,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
Target: [target_name]
Confirm Identity: [scan_name] "}
else
- header += {" "
accesses += ""
- body = "[carddesc.Join()] [jobs] [accesses.Join()] " //CHECK THIS
+ body = "[carddesc.Join()] [jobs.Join()] [accesses.Join()] " //CHECK THIS
else if (!authenticated)
- body = {"Log In
+ body = {"Log In
Access Crew Manifest "}
if(!target_dept)
- body += "Job Management "
+ body += "Job Management "
dat = list("", header.Join(), body, " ")
var/datum/browser/popup = new(user, "id_com", src.name, 900, 620)
@@ -366,7 +368,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
usr.set_machine(src)
switch(href_list["choice"])
if ("inserted_modify_id")
- if (inserted_modify_id && !usr.get_active_held_item())
+ if(inserted_modify_id && !usr.get_active_held_item())
if(id_eject(usr, inserted_modify_id))
inserted_modify_id = null
updateUsrDialog()
@@ -378,7 +380,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
inserted_modify_id = id_to_insert
updateUsrDialog()
if ("inserted_scan_id")
- if (inserted_scan_id && !usr.get_active_held_item())
+ if(inserted_scan_id && !usr.get_active_held_item())
if(id_eject(usr, inserted_scan_id))
inserted_scan_id = null
updateUsrDialog()
@@ -386,7 +388,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(usr.get_id_in_hand())
var/obj/item/held_item = usr.get_active_held_item()
var/obj/item/card/id/id_to_insert = held_item.GetID()
- if(id_insert(usr, held_item, inserted_modify_id))
+ if(id_insert(usr, held_item, inserted_scan_id))
inserted_scan_id = id_to_insert
updateUsrDialog()
if ("auth")
@@ -462,7 +464,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
updateUsrDialog()
break
if(!jobdatum)
- to_chat(usr, "No log exists for this job. ")
+ to_chat(usr, "No log exists for this job. ")
updateUsrDialog()
return
@@ -475,7 +477,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
inserted_modify_id.assignment = "Unassigned"
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
else
- to_chat(usr, "You are not authorized to demote this position. ")
+ to_chat(usr, "You are not authorized to demote this position. ")
if ("reg")
if (authenticated)
var/t2 = inserted_modify_id
@@ -485,7 +487,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
inserted_modify_id.registered_name = newName
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
else
- to_chat(usr, "Invalid name entered. ")
+ to_chat(usr, "Invalid name entered. ")
updateUsrDialog()
return
if ("mode")
@@ -498,7 +500,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if("make_job_available")
// MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
- if(authenticated && (ACCESS_CHANGE_IDS in inserted_scan_id.access) && !target_dept)
+ if(authenticated && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -515,7 +517,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if("make_job_unavailable")
// MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS
- if(authenticated && (ACCESS_CHANGE_IDS in inserted_scan_id.access) && !target_dept)
+ if(authenticated && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -533,7 +535,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if ("prioritize_job")
// TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY
- if(authenticated && (ACCESS_CHANGE_IDS in inserted_scan_id.access) && !target_dept)
+ if(authenticated && !target_dept)
var/priority_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(priority_target)
if(!j)
@@ -549,7 +551,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
return
else
SSjob.prioritized_jobs += j
- to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request. ")
+ to_chat(usr, "[j.title] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request. ")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
if ("print")
@@ -625,4 +627,4 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
#undef JOB_ALLOWED
#undef JOB_COOLDOWN
#undef JOB_MAX_POSITIONS
-#undef JOB_DENIED
\ No newline at end of file
+#undef JOB_DENIED
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index de5022d751..7a39e73ad3 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -8,9 +8,9 @@
var/state = 1
/obj/structure/frame/examine(user)
- ..()
+ . = ..()
if(circuit)
- to_chat(user, "It has \a [circuit] installed.")
+ . += "It has \a [circuit] installed."
/obj/structure/frame/deconstruct(disassembled = TRUE)
@@ -29,7 +29,7 @@
var/list/req_component_names = null // user-friendly names of components
/obj/structure/frame/machine/examine(user)
- ..()
+ . = ..()
if(state == 3 && req_components && req_component_names)
var/hasContent = 0
var/requires = "It requires"
@@ -44,9 +44,9 @@
hasContent = 1
if(hasContent)
- to_chat(user, requires + ".")
+ . += requires + "."
else
- to_chat(user, "It does not require any more components.")
+ . += "It does not require any more components."
/obj/structure/frame/machine/proc/update_namelist()
if(!req_components)
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index 4210435f33..97cc0f5748 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -24,13 +24,13 @@
. = ..()
/obj/machinery/defibrillator_mount/examine(mob/user)
- ..()
+ . = ..()
if(defib)
- to_chat(user, "There is a defib unit hooked up. Alt-click to remove it.")
+ . += "There is a defib unit hooked up. Alt-click to remove it."
if(GLOB.security_level >= SEC_LEVEL_RED)
- to_chat(user, "Due to a security situation, its locking clamps can be toggled by swiping any ID. ")
+ . += "Due to a security situation, its locking clamps can be toggled by swiping any ID. "
else
- to_chat(user, "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access. ")
+ . += "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access. "
/obj/machinery/defibrillator_mount/process()
if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge && is_operational())
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index eaf8faef12..b94dbad2de 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -149,8 +149,8 @@
var/mode = SINGLE
/obj/item/grenade/barrier/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to toggle modes. ")
+ . = ..()
+ . += "Alt-click to toggle modes. "
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index 66aa1347cb..3aad8d874c 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -27,9 +27,9 @@
RefreshParts()
/obj/machinery/dish_drive/examine(mob/user)
- ..()
+ . = ..()
if(user.Adjacent(src))
- to_chat(user, "Alt-click it to beam its contents to any nearby disposal bins. ")
+ . += "Alt-click it to beam its contents to any nearby disposal bins. "
/obj/machinery/dish_drive/attack_hand(mob/living/user)
if(!contents.len)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index f85fb3f310..52b52eb288 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -640,47 +640,47 @@
update_icon(AIRLOCK_CLOSED)
/obj/machinery/door/airlock/examine(mob/user)
- ..()
+ . = ..()
if(obj_flags & EMAGGED)
- to_chat(user, "Its access panel is smoking slightly. ")
+ . += "Its access panel is smoking slightly. "
if(charge && !panel_open && in_range(user, src))
- to_chat(user, "The maintenance panel seems haphazardly fastened. ")
+ . += "The maintenance panel seems haphazardly fastened. "
if(charge && panel_open)
- to_chat(user, "Something is wired up to the airlock's electronics! ")
+ . += "Something is wired up to the airlock's electronics! "
if(note)
if(!in_range(user, src))
- to_chat(user, "There's a [note.name] pinned to the front. You can't read it from here.")
+ . += "There's a [note.name] pinned to the front. You can't read it from here."
else
- to_chat(user, "There's a [note.name] pinned to the front...")
- note.examine(user)
+ . += "There's a [note.name] pinned to the front..."
+ . += note.examine(user)
if(panel_open)
switch(security_level)
if(AIRLOCK_SECURITY_NONE)
- to_chat(user, "Its wires are exposed!")
+ . += "Its wires are exposed!"
if(AIRLOCK_SECURITY_METAL)
- to_chat(user, "Its wires are hidden behind a welded metal cover.")
+ . += "Its wires are hidden behind a welded metal cover."
if(AIRLOCK_SECURITY_PLASTEEL_I_S)
- to_chat(user, "There is some shredded plasteel inside.")
+ . += "There is some shredded plasteel inside."
if(AIRLOCK_SECURITY_PLASTEEL_I)
- to_chat(user, "Its wires are behind an inner layer of plasteel.")
+ . += "Its wires are behind an inner layer of plasteel."
if(AIRLOCK_SECURITY_PLASTEEL_O_S)
- to_chat(user, "There is some shredded plasteel inside.")
+ . += "There is some shredded plasteel inside."
if(AIRLOCK_SECURITY_PLASTEEL_O)
- to_chat(user, "There is a welded plasteel cover hiding its wires.")
+ . += "There is a welded plasteel cover hiding its wires."
if(AIRLOCK_SECURITY_PLASTEEL)
- to_chat(user, "There is a protective grille over its panel.")
+ . += "There is a protective grille over its panel."
else if(security_level)
if(security_level == AIRLOCK_SECURITY_METAL)
- to_chat(user, "It looks a bit stronger.")
+ . += "It looks a bit stronger."
else
- to_chat(user, "It looks very robust.")
+ . += "It looks very robust."
if(issilicon(user) && (!stat & BROKEN))
- to_chat(user, "Shift-click [src] to [ density ? "open" : "close"] it. ")
- to_chat(user, "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts. ")
- to_chat(user, "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it. ")
- to_chat(user, "Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access. ")
+ . += "Shift-click [src] to [ density ? "open" : "close"] it. "
+ . += "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts. "
+ . += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it. "
+ . += "Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access. "
/obj/machinery/door/airlock/attack_ai(mob/user)
if(!src.canAIControl(user))
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index cfaa94b842..54774a8f99 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -7,8 +7,8 @@
var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access
/obj/item/electronics/airlock/examine(mob/user)
- ..()
- to_chat(user, "Has a neat selection menu for modifying airlock access levels. ")
+ . = ..()
+ . += "Has a neat selection menu for modifying airlock access levels. "
/obj/item/electronics/airlock/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 59b49d5828..50ae7dab18 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -593,14 +593,12 @@
return ..()
/obj/machinery/door/airlock/clockwork/examine(mob/user)
- ..()
- var/gear_text = "The cogwheel is flickering and twisting wildly. Report this to a coder."
+ . = ..()
switch(construction_state)
if(GEAR_SECURE)
- gear_text = "The cogwheel is solidly wrenched to the brass around it. "
+ . += "The cogwheel is solidly wrenched to the brass around it. "
if(GEAR_LOOSE)
- gear_text = "The cogwheel has been loosened , but remains connected loosely to the door! "
- to_chat(user, gear_text)
+ . += "The cogwheel has been loosened , but remains connected loosely to the door! "
/obj/machinery/door/airlock/clockwork/emp_act(severity)
if(prob(80/severity))
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 3ac386e1fb..ee8742e84f 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -37,14 +37,14 @@
var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access
/obj/machinery/door/examine(mob/user)
- ..()
+ . = ..()
if(red_alert_access)
if(GLOB.security_level >= SEC_LEVEL_RED)
- to_chat(user, "Due to a security threat, its access requirements have been lifted! ")
+ . += "Due to a security threat, its access requirements have been lifted! "
else
- to_chat(user, "In the event of a red alert, its access requirements will automatically lift. ")
+ . += "In the event of a red alert, its access requirements will automatically lift. "
if(!poddoor)
- to_chat(user, "Its maintenance panel is screwed in place. ")
+ . += "Its maintenance panel is screwed in place. "
/obj/machinery/door/check_access_list(list/access_list)
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 507769f9a3..dec41b0a59 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -34,13 +34,13 @@
/obj/machinery/door/firedoor/examine(mob/user)
..()
if(!density)
- to_chat(user, "It is open, but could be pried closed. ")
+ . += "It is open, but could be pried closed. "
else if(!welded)
- to_chat(user, "It is closed, but could be pried open. Deconstruction would require it to be welded shut. ")
+ . += "It is closed, but could be pried open. Deconstruction would require it to be welded shut. "
else if(boltslocked)
- to_chat(user, "It is welded shut. The floor bolts have been locked by screws . ")
+ . += "It is welded shut. The floor bolts have been locked by screws . "
else
- to_chat(user, "The bolt locks have been unscrewed , but the bolts themselves are still wrenched to the floor. ")
+ . += "The bolt locks have been unscrewed , but the bolts themselves are still wrenched to the floor. "
/obj/machinery/door/firedoor/proc/CalculateAffectingAreas()
remove_from_areas()
@@ -270,18 +270,18 @@
var/reinforced = 0
/obj/structure/firelock_frame/examine(mob/user)
- ..()
+ . = ..()
switch(constructionStep)
if(CONSTRUCTION_PANEL_OPEN)
- to_chat(user, "It is unbolted from the floor. A small loosely connected metal plate is covering the wires. ")
+ . += "It is unbolted from the floor. A small loosely connected metal plate is covering the wires. "
if(!reinforced)
- to_chat(user, "It could be reinforced with plasteel. ")
+ . += "It could be reinforced with plasteel. "
if(CONSTRUCTION_WIRES_EXPOSED)
- to_chat(user, "The maintenance plate has been pried away , and wires are trailing. ")
+ . += "The maintenance plate has been pried away , and wires are trailing. "
if(CONSTRUCTION_GUTTED)
- to_chat(user, "The maintenance panel is missing wires and the circuit board is loosely connected . ")
+ . += "The maintenance panel is missing wires and the circuit board is loosely connected . "
if(CONSTRUCTION_NOCIRCUIT)
- to_chat(user, "There are no firelock electronics in the frame. The frame could be cut apart. ")
+ . += "There are no firelock electronics in the frame. The frame could be cut apart. "
/obj/structure/firelock_frame/update_icon()
..()
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 7fb240c711..1c25c7b242 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -22,8 +22,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
return ..()
/obj/machinery/doppler_array/examine(mob/user)
- ..()
- to_chat(user, "Its dish is facing to the [dir2text(dir)]. ")
+ . = ..()
+ . += "Its dish is facing to the [dir2text(dir)]. "
/obj/machinery/doppler_array/process()
return PROCESS_KILL
@@ -114,13 +114,13 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
return
var/point_gain = 0
-
+
/*****The Point Calculator*****/
-
+
if(orig_light < 10)
say("Explosion not large enough for research calculations.")
return
- else if(orig_light < 4500)
+ else if(orig_light < 4500)
point_gain = (83300 * orig_light) / (orig_light + 3000)
else
point_gain = TECHWEB_BOMB_POINTCAP
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index b121057315..96ac8981c9 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -129,9 +129,9 @@
break_message = "slowly falls dark, lights stuttering."
/obj/machinery/droneDispenser/examine(mob/user)
- ..()
+ . = ..()
if((mode == DRONE_RECHARGING) && !stat && recharging_text)
- to_chat(user, "[recharging_text] ")
+ . += "[recharging_text] "
/obj/machinery/droneDispenser/power_change()
..()
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 5e20e5ee0e..def530a14d 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -196,8 +196,8 @@
var/id = null
/obj/item/wallframe/flasher/examine(mob/user)
- ..()
- to_chat(user, "Its channel ID is '[id]'. ")
+ . = ..()
+ . += "Its channel ID is '[id]'. "
/obj/item/wallframe/flasher/after_attach(var/obj/O)
..()
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index db015eb7c1..e6b8fe3b88 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -183,10 +183,10 @@
container_resist(user)
/obj/machinery/harvester/examine(mob/user)
- ..()
+ . = ..()
if(stat & BROKEN)
return
if(state_open)
- to_chat(user, "[src] must be closed before harvesting. ")
+ . += "[src] must be closed before harvesting. "
else if(!harvesting)
- to_chat(user, "Alt-click [src] to start harvesting. ")
\ No newline at end of file
+ . += "Alt-click [src] to start harvesting. "
\ No newline at end of file
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 621ca266bb..aee1cf4f69 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -221,7 +221,6 @@
. += "\tNo chemicals are attached. \n"
. += "\t[attached ? attached : "No one"] is attached. "
- to_chat(user,.)
#undef IV_TAKING
#undef IV_INJECTING
\ No newline at end of file
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index cbb9b4f253..694df02eb5 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -33,8 +33,8 @@
icon_state = "light0"
/obj/machinery/light_switch/examine(mob/user)
- ..()
- to_chat(user, "It is [on? "on" : "off"].")
+ . = ..()
+ . += "It is [on? "on" : "off"]."
/obj/machinery/light_switch/interact(mob/user)
. = ..()
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 289f075302..8c2a04bfbc 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -838,10 +838,10 @@
T.cp = src
/obj/machinery/turretid/examine(mob/user)
- ..()
+ . = ..()
if(issilicon(user) && (!stat & BROKEN))
- to_chat(user, "Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets. ")
- to_chat(user, "Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]. ")
+ . += "Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets. "
+ . += "Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]. "
/obj/machinery/turretid/attackby(obj/item/I, mob/user, params)
if(stat & BROKEN)
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index b5ef38b42c..f9fda50daf 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -30,12 +30,12 @@
return ..()
/obj/machinery/quantumpad/examine(mob/user)
- ..()
- to_chat(user, "It is [ linked_pad ? "currently" : "not"] linked to another pad. ")
+ . = ..()
+ . += "It is [ linked_pad ? "currently" : "not"] linked to another pad. "
if(!panel_open)
- to_chat(user, "The panel is screwed in, obstructing the linking device. ")
+ . += "The panel is screwed in, obstructing the linking device. "
else
- to_chat(user, "The linking device is now able to be scanned with a multitool. ")
+ . += "The linking device is now able to be scanned with a multitool. "
/obj/machinery/quantumpad/RefreshParts()
var/E = 0
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 73aadc99d0..d39de4d37d 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -40,10 +40,10 @@
butchering.bonus_modifier = amount_produced/5
/obj/machinery/recycler/examine(mob/user)
- ..()
- to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].")
- to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].")
- to_chat(user, "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"].")
+ . = ..()
+ . += "The power light is [(stat & NOPOWER) ? "off" : "on"]."
+ . += "The safety-mode light is [safety_mode ? "on" : "off"]."
+ . += "The safety-sensors status light is [obj_flags & EMAGGED ? "off" : "on"]."
/obj/machinery/recycler/power_change()
..()
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index ce325505e2..984a911d32 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -46,12 +46,12 @@
return ..()
/obj/machinery/space_heater/examine(mob/user)
- ..()
- to_chat(user, "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"].")
+ . = ..()
+ . += "\The [src] is [on ? "on" : "off"], and the hatch is [panel_open ? "open" : "closed"]."
if(cell)
- to_chat(user, "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%.")
+ . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%."
else
- to_chat(user, "There is no power cell installed.")
+ . += "There is no power cell installed."
/obj/machinery/space_heater/update_icon()
if(on)
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index ec53cc3210..af5f50f28d 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -114,12 +114,11 @@
/obj/machinery/status_display/examine(mob/user)
. = ..()
if (message1 || message2)
- var/list/msg = list("The display says:")
+ . += "The display says:"
if (message1)
- msg += " \t[html_encode(message1)] "
+ . += "\t[html_encode(message1)] "
if (message2)
- msg += " \t[html_encode(message2)] "
- to_chat(user, msg.Join())
+ . += "\t[html_encode(message2)] "
// Helper procs for child display types.
/obj/machinery/status_display/proc/display_shuttle_status(obj/docking_port/mobile/shuttle)
@@ -146,9 +145,9 @@
modestr = " \t[modestr]: [shuttle.getTimerStr()] "
else
modestr = " \t[modestr] "
- to_chat(user, "The display says: \t[shuttle.name] [modestr]")
+ return "The display says: \t[shuttle.name] [modestr]"
else
- to_chat(user, "The display says: \tShuttle missing! ")
+ return "The display says: \tShuttle missing! "
/// Evac display which shows shuttle timer or message set by Command.
@@ -195,9 +194,9 @@
/obj/machinery/status_display/evac/examine(mob/user)
. = ..()
if(mode == SD_EMERGENCY)
- examine_shuttle(user, SSshuttle.emergency)
+ . += examine_shuttle(user, SSshuttle.emergency)
else if(!message1 && !message2)
- to_chat(user, "The display is blank.")
+ . += "The display is blank."
/obj/machinery/status_display/evac/receive_signal(datum/signal/signal)
switch(signal.data["command"])
@@ -257,9 +256,9 @@
else
shuttleMsg = "[shuttle.getModeStr()]: [shuttle.getTimerStr()]"
if (shuttleMsg)
- to_chat(user, "The display says: \t[shuttleMsg] ")
+ . += "The display says: \t[shuttleMsg] "
else
- to_chat(user, "The display is blank.")
+ . += "The display is blank."
/// General-purpose shuttle status display.
@@ -278,9 +277,9 @@
/obj/machinery/status_display/shuttle/examine(mob/user)
. = ..()
if(shuttle_id)
- examine_shuttle(user, SSshuttle.getShuttle(shuttle_id))
+ . += examine_shuttle(user, SSshuttle.getShuttle(shuttle_id))
else
- to_chat(user, "The display is blank.")
+ . += "The display is blank."
/obj/machinery/status_display/shuttle/vv_edit_var(var_name, var_value)
. = ..()
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 4a97aa1775..ebc2533124 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -99,8 +99,8 @@
return ..()
/obj/machinery/syndicatebomb/examine(mob/user)
- ..()
- to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".")
+ . = ..()
+ . += "A digital display on it reads \"[seconds_remaining()]\"."
/obj/machinery/syndicatebomb/update_icon()
icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]"
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 1ebe8cb463..3ff2424d83 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -28,7 +28,7 @@
/obj/machinery/transformer/examine(mob/user)
. = ..()
if(cooldown && (issilicon(user) || isobserver(user)))
- to_chat(user, "It will be ready in [DisplayTimeText(cooldown_timer - world.time)].")
+ . += "It will be ready in [DisplayTimeText(cooldown_timer - world.time)]."
/obj/machinery/transformer/Destroy()
QDEL_NULL(countdown)
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 8be079656b..081d91e56f 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -12,8 +12,8 @@
var/max_wash_capacity = 5
/obj/machinery/washing_machine/examine(mob/user)
- ..()
- to_chat(user, "Alt-click it to start a wash cycle. ")
+ . = ..()
+ . += "Alt-click it to start a wash cycle. "
/obj/machinery/washing_machine/AltClick(mob/user)
if(!user.canUseTopic(src))
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index f198bfbd87..bc8a675085 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -9,7 +9,7 @@
/turf/open/floor/mech_bay_recharge_floor/airless
icon_state = "recharge_floor_asteroid"
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/obj/machinery/mech_bay_recharge_port
name = "mech bay power port"
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 717c94362c..fe0ec33ed6 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -270,23 +270,23 @@
////////////////////////////////////////////////////////////////////////////////
/obj/mecha/examine(mob/user)
- ..()
+ . = ..()
var/integrity = obj_integrity*100/max_integrity
switch(integrity)
if(85 to 100)
- to_chat(user, "It's fully intact.")
+ . += "It's fully intact."
if(65 to 85)
- to_chat(user, "It's slightly damaged.")
+ . += "It's slightly damaged."
if(45 to 65)
- to_chat(user, "It's badly damaged.")
+ . += "It's badly damaged."
if(25 to 45)
- to_chat(user, "It's heavily damaged.")
+ . += "It's heavily damaged."
else
- to_chat(user, "It's falling apart.")
+ . += "It's falling apart."
if(equipment && equipment.len)
- to_chat(user, "It's equipped with:")
+ . += "It's equipped with:"
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
- to_chat(user, "[icon2html(ME, user)] \A [ME].")
+ . += "[icon2html(ME, user)] \A [ME]."
//processing internal damage, temperature, air regulation, alert updates, lights power use.
/obj/mecha/process()
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 645c13292b..d6ba08e021 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -30,9 +30,9 @@
AI.remote_control = null
/obj/structure/mecha_wreckage/examine(mob/user)
- ..()
+ . = ..()
if(AI)
- to_chat(user, "The AI recovery beacon is active. ")
+ . += "The AI recovery beacon is active. "
/obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weldingtool))
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index b6a4ac2390..360ac51444 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -17,8 +17,15 @@
hud.add_hud_to(H)
/obj/mecha/medical/odysseus/go_out()
- if(ishuman(occupant))
- var/mob/living/carbon/human/H = occupant
+ if(isliving(occupant))
+ var/mob/living/carbon/human/L = occupant
var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
- hud.remove_hud_from(H)
+ hud.remove_hud_from(L)
..()
+
+/obj/mecha/medical/odysseus/mmi_moved_inside(obj/item/mmi/mmi_as_oc, mob/user)
+ . = ..()
+ if(.)
+ var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
+ var/mob/living/brain/B = mmi_as_oc.brainmob
+ hud.add_hud_to(B)
diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm
index eea6b6ba39..6017e8fc07 100644
--- a/code/game/objects/effects/countdown.dm
+++ b/code/game/objects/effects/countdown.dm
@@ -20,7 +20,7 @@
/obj/effect/countdown/examine(mob/user)
. = ..()
- to_chat(user, "This countdown is displaying: [displayed_text].")
+ . += "This countdown is displaying: [displayed_text]."
/obj/effect/countdown/proc/attach(atom/A)
attached_to = A
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 842b230b53..4eab5e826b 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -130,12 +130,10 @@
/obj/effect/decal/cleanable/blood/footprints/examine(mob/user)
. = ..()
if(shoe_types.len)
- . += "You recognise the footprints as belonging to:\n"
+ . += "You recognise the footprints as belonging to:"
for(var/shoe in shoe_types)
var/obj/item/clothing/shoes/S = shoe
- . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]\n"
-
- to_chat(user, .)
+ . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]"
/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C)
if(blood_state != C.blood_state) //We only replace footprints of the same type as us
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index c009d3ec79..9a498c9a70 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -36,7 +36,7 @@
/obj/structure/glowshroom/examine(mob/user)
. = ..()
- to_chat(user, "This is a [generation]\th generation [name]!")
+ . += "This is a [generation]\th generation [name]!"
/obj/structure/glowshroom/Destroy()
if(myseed)
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index bf6d55db0e..2949bc8766 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -315,6 +315,11 @@
randomdir = 0
duration = 6
+/obj/effect/temp_visual/desynchronizer
+ name = "desynchronizer field"
+ icon_state = "chronofield"
+ duration = 3
+
/obj/effect/temp_visual/impact_effect
icon_state = "impact_bullet"
duration = 5
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4f472c6477..1c9ea1edcb 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -183,14 +183,24 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
src.loc = T
/obj/item/examine(mob/user) //This might be spammy. Remove?
- ..()
- var/pronoun
- if(src.gender == PLURAL)
- pronoun = "They are"
+ . = ..()
+
+ . += "[gender == PLURAL ? "They are" : "It is"] a [weightclass2text(w_class)] item."
+
+ if(resistance_flags & INDESTRUCTIBLE)
+ . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!"
else
- pronoun = "It is"
- var/size = weightclass2text(src.w_class)
- to_chat(user, "[pronoun] a [size] item." )
+ if(resistance_flags & LAVA_PROOF)
+ . += "[src] is made of an extremely heat-resistant material, it'd probably be able to withstand lava!"
+ if(resistance_flags & (ACID_PROOF | UNACIDABLE))
+ . += "[src] looks pretty robust! It'd probably be able to withstand acid!"
+ if(resistance_flags & FREEZE_PROOF)
+ . += "[src] is made of cold-resistant materials."
+ if(resistance_flags & FIRE_PROOF)
+ . += "[src] is made of fire-retardant materials."
+
+
+
if(!user.research_scanner)
return
@@ -227,7 +237,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else
research_msg += "None"
research_msg += "."
- to_chat(user, research_msg.Join())
+ . += research_msg.Join()
/obj/item/interact(mob/user)
add_fingerprint(user)
diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm
index a8d0bed2aa..15881ab2a5 100644
--- a/code/game/objects/items/AI_modules.dm
+++ b/code/game/objects/items/AI_modules.dm
@@ -25,7 +25,7 @@ AI MODULES
materials = list(MAT_GOLD=50)
/obj/item/aiModule/examine(var/mob/user as mob)
- ..()
+ . = ..()
if(Adjacent(user))
show_laws(user)
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 134b921666..016bfb5e8b 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -46,8 +46,8 @@ RLD
spark_system.attach(src)
/obj/item/construction/examine(mob/user)
- ..()
- to_chat(user, "\A [src]. It currently holds [matter]/[max_matter] matter-units." )
+ . = ..()
+ . += "\A [src]. It currently holds [matter]/[max_matter] matter-units."
/obj/item/construction/Destroy()
QDEL_NULL(spark_system)
@@ -163,8 +163,6 @@ RLD
var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses.
var/delay_mod = 1
var/canRturf = FALSE //Variable for R walls to deconstruct them
- var/adjacency_check = TRUE //Wheter it checks if the tool has to be in our hands or not. Wsed for the aux base construction drone's internal RCD
-
/obj/item/construction/rcd/suicide_act(mob/user)
user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide.. ")
@@ -227,11 +225,10 @@ RLD
t1 += "Close
\n"
- var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500)
+ var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500, src)
popup.set_content(t1)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
- onclose(user, "rcd_access")
/obj/item/construction/rcd/Topic(href, href_list)
..()
@@ -275,7 +272,7 @@ RLD
/obj/item/construction/rcd/proc/check_menu(mob/living/user)
if(!istype(user))
return FALSE
- if(user.incapacitated() || (adjacency_check && !user.Adjacent(src)))
+ if(user.incapacitated() || !user.Adjacent(src))
return FALSE
return TRUE
@@ -288,7 +285,7 @@ RLD
"SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"),
"WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest")
)
- var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check, tooltips = TRUE)
+ var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
switch(computerdirs)
@@ -347,13 +344,13 @@ RLD
"External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass)
)
- var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
+ var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
if(!check_menu(user))
return
switch(airlockcat)
if("Solid")
if(advanced_airlock_setting == 1)
- var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
+ var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
if(!check_menu(user))
return
switch(airlockpaint)
@@ -398,7 +395,7 @@ RLD
if("Glass")
if(advanced_airlock_setting == 1)
- var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
+ var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
if(!check_menu(user))
return
switch(airlockpaint)
@@ -557,6 +554,7 @@ RLD
desc = "A device used to rapidly build walls and floors."
canRturf = TRUE
upgrade = TRUE
+ var/energyfactor = 72
/obj/item/construction/rcd/borg/useResource(amount, mob/user)
@@ -567,7 +565,7 @@ RLD
if(user)
to_chat(user, no_ammo_message)
return 0
- . = borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs
+ . = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs
if(!. && user)
to_chat(user, no_ammo_message)
return .
@@ -580,11 +578,16 @@ RLD
if(user)
to_chat(user, no_ammo_message)
return 0
- . = borgy.cell.charge >= (amount * 72)
+ . = borgy.cell.charge >= (amount * energyfactor)
if(!. && user)
to_chat(user, no_ammo_message)
return .
+/obj/item/construction/rcd/borg/syndicate
+ icon_state = "ircd"
+ item_state = "ircd"
+ energyfactor = 66
+
/obj/item/construction/rcd/loaded
matter = 160
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index 93293155a3..0eb97a8dee 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -79,9 +79,9 @@
..()
/obj/item/twohanded/rcl/examine(mob/user)
- ..()
+ . = ..()
if(loaded)
- to_chat(user, "It contains [loaded.amount]/[max_amount] cables. ")
+ . += "It contains [loaded.amount]/[max_amount] cables. "
/obj/item/twohanded/rcl/Destroy()
QDEL_NULL(loaded)
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index 9c343c2e06..a68f2ecff6 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -20,8 +20,8 @@ RSF
w_class = WEIGHT_CLASS_NORMAL
/obj/item/rsf/examine(mob/user)
- ..()
- to_chat(user, "It currently holds [matter]/30 fabrication-units. ")
+ . = ..()
+ . += "It currently holds [matter]/30 fabrication-units. "
/obj/item/rsf/cyborg
matter = 30
@@ -127,8 +127,8 @@ RSF
w_class = WEIGHT_CLASS_NORMAL
/obj/item/cookiesynth/examine(mob/user)
- ..()
- to_chat(user, "It currently holds [matter]/10 cookie-units. ")
+ . = ..()
+ . += "It currently holds [matter]/10 cookie-units. "
/obj/item/cookiesynth/attackby()
return
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index afb2b22076..d8a21de35a 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -91,9 +91,9 @@
/obj/item/airlock_painter/examine(mob/user)
- ..()
+ . = ..()
if(!ink)
- to_chat(user, "It doesn't have a toner cartridge installed. ")
+ . += "It doesn't have a toner cartridge installed. "
return
var/ink_level = "high"
if(ink.charges < 1)
@@ -102,7 +102,7 @@
ink_level = "low"
else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit)
ink_level = "dangerously high"
- to_chat(user, "Its ink levels look [ink_level]. ")
+ . += "Its ink levels look [ink_level]. "
/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index d0b732cf42..b591d6d64c 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -46,10 +46,10 @@
/obj/item/bodybag/bluespace/examine(mob/user)
- ..()
+ . = ..()
if(contents.len)
var/s = contents.len == 1 ? "" : "s"
- to_chat(user, "You can make out the shape[s] of [contents.len] object[s] through the fabric. ")
+ . += "You can make out the shape[s] of [contents.len] object[s] through the fabric. "
/obj/item/bodybag/bluespace/Destroy()
for(var/atom/movable/A in contents)
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index 109078f804..f3ed99b132 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -9,10 +9,10 @@
// Possible restyles for the cutout;
// add an entry in change_appearance() if you add to here
var/list/possible_appearances = list("Assistant", "Clown", "Mime",
- "Traitor", "Nuke Op", "Cultist", "Clockwork Cultist",
+ "Traitor", "Nuke Op", "Cultist", "Brass Cultist", "Clockwork Cultist",
"Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Xenomorph Maid", "Swarmer",
"Ash Walker", "Deathsquad Officer", "Ian", "Slaughter Demon",
- "Laughter Demon", "Private Security Officer")
+ "Laughter Demon", "Private Security Officer", "Securitron", "Gondola", "Monkey")
var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version
@@ -123,10 +123,14 @@
name = "Unknown"
desc = "A cardboard cutout of a cultist."
icon_state = "cutout_cultist"
+ if("Brass Cultist")
+ name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
+ desc = "A cardboard cutout of a \"servant\" of Ratvar."
+ icon_state = "cutout_servant"
if("Clockwork Cultist")
name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
desc = "A cardboard cutout of a servant of Ratvar."
- icon_state = "cutout_servant"
+ icon_state = "cutout_new_servant"
if("Revolutionary")
name = "Unknown"
desc = "A cardboard cutout of a revolutionary."
@@ -179,6 +183,18 @@
name = "Private Security Officer"
desc = "A cardboard cutout of a private security officer."
icon_state = "cutout_ntsec"
+ if("Securitron")
+ name = "[pick("Officer", "Oftiser", "Sergeant", "General")][pick(" Genesky", " Pingsky", " Beepsky", " Pipsqueak", "-at-Armsky")]"
+ desc = "A cardboard cutout of a securitron."
+ icon_state = "cutout_law"
+ if("Gondola")
+ name = "gondola"
+ desc = "A cardboard cutout of a gondola."
+ icon_state = "cutout_gondola"
+ if("Monkey")
+ name = "monkey ([rand(1, 999)])"
+ desc = "A cardboard cutout of a monkey."
+ icon_state = "cutout_monky"
return 1
/obj/item/cardboard_cutout/setDir(newdir)
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 09a119eeb4..97f5989eb4 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -113,7 +113,7 @@
/obj/item/card/emag/examine(mob/user)
. = ..()
- to_chat(user, "It has [uses ? uses : "no"] charges left. ")
+ . += "It has [uses ? uses : "no"] charges left. "
/obj/item/card/emag/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/emagrecharge))
@@ -139,9 +139,9 @@
/obj/item/emagrecharge/examine(mob/user)
. = ..()
if(uses)
- to_chat(user, "It can add up to [uses] charges to compatible devices ")
+ . += "It can add up to [uses] charges to compatible devices "
else
- to_chat(user, "It has a small, red, blinking light coming from inside of it. It's spent. ")
+ . += "It has a small, red, blinking light coming from inside of it. It's spent. "
/obj/item/card/emagfake
desc = "It's a card with a magnetic strip attached to some circuitry. Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back."
@@ -193,9 +193,9 @@
return
/obj/item/card/id/examine(mob/user)
- ..()
+ . = ..()
if(mining_points)
- to_chat(user, "There's [mining_points] mining equipment redemption point\s loaded onto this card.")
+ . += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
/obj/item/card/id/GetAccess()
return access
@@ -405,13 +405,13 @@ update_label("John Doe", "Clowny")
/obj/item/card/id/prisoner/examine(mob/user)
. = ..()
if(sentence && world.time < sentence)
- to_chat(user, "You're currently serving a sentence for [crime]. [DisplayTimeText(sentence - world.time)] left. ")
+ . += "You're currently serving a sentence for [crime]. [DisplayTimeText(sentence - world.time)] left. "
else if(goal)
- to_chat(user, "You have accumulated [points] out of the [goal] points you need for freedom. ")
+ . += "You have accumulated [points] out of the [goal] points you need for freedom. "
else if(!sentence)
- to_chat(user, "You are currently serving a permanent sentence for [crime]. ")
+ . += "You are currently serving a permanent sentence for [crime]. "
else
- to_chat(user, "Your sentence is up! You're free! ")
+ . += "Your sentence is up! You're free! "
/obj/item/card/id/prisoner/one
name = "Prisoner #13-001"
@@ -533,8 +533,8 @@ update_label("John Doe", "Clowny")
update_icon()
/obj/item/card/id/knight/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it. ")
+ . = ..()
+ . += "Alt-click to recolor it. "
/obj/item/card/id/knight/blue
id_color = "#0000FF"
diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm
index 26c13263d2..8106733ac6 100644
--- a/code/game/objects/items/circuitboards/circuitboard.dm
+++ b/code/game/objects/items/circuitboards/circuitboard.dm
@@ -56,7 +56,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
M.RefreshParts()
/obj/item/circuitboard/machine/examine(mob/user)
- ..()
+ . = ..()
if(LAZYLEN(req_components))
var/list/nice_list = list()
for(var/B in req_components)
@@ -64,4 +64,4 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
if(!ispath(A))
continue
nice_list += list("[req_components[A]] [initial(A.name)]")
- to_chat(user,"Required components: [english_list(nice_list)]. ")
+ . += "Required components: [english_list(nice_list)]. "
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index ac7879f9ec..32c879e2d2 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -69,8 +69,8 @@
return ..()
/obj/item/circuitboard/computer/card/minor/examine(user)
- ..()
- to_chat(user, "Currently set to \"[dept_list[target_dept]]\".")
+ . = ..()
+ . += "Currently set to \"[dept_list[target_dept]]\"."
//obj/item/circuitboard/computer/shield
// name = "Shield Control (Computer Board)"
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index d039aa5024..70f460c904 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -429,8 +429,8 @@
return ..()
/obj/item/circuitboard/machine/smartfridge/examine(mob/user)
- ..()
- to_chat(user, "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it. ")
+ . = ..()
+ . += "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it. "
/obj/item/circuitboard/machine/biogenerator
name = "Biogenerator (Machine Board)"
@@ -782,7 +782,7 @@
/obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user)
. = ..()
- to_chat(user, "Cloud ID is currently set to [cloud_id].")
+ . += "Cloud ID is currently set to [cloud_id]."
/obj/item/circuitboard/machine/nanite_program_hub
name = "Nanite Program Hub (Machine Board)"
@@ -943,9 +943,9 @@
needs_anchored = FALSE
/obj/item/circuitboard/machine/dish_drive/examine(mob/user)
- ..()
- to_chat(user, "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch. ")
- to_chat(user, "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch. ")
+ . = ..()
+ . += "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch. "
+ . += "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch. "
/obj/item/circuitboard/machine/dish_drive/attack_self(mob/living/user)
suction = !suction
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index d86354f195..0ff54d884f 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -112,11 +112,11 @@
throw_range = 7
attack_verb = list("HONKED")
var/moodlet = "honk" //used to define which kind of moodlet is added to the honked target
- var/honksound = 'sound/items/bikehorn.ogg'
+ var/list/honksounds = list('sound/items/bikehorn.ogg' = 1)
-/obj/item/bikehorn/Initialize()
+/obj/item/bikehorn/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/squeak, list(honksound=1), 50)
+ AddComponent(/datum/component/squeak, honksounds, 50)
/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, moodlet, /datum/mood_event/honk)
@@ -124,7 +124,7 @@
/obj/item/bikehorn/suicide_act(mob/user)
user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide! ")
- playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
+ playsound(src, pickweight(honksounds), 50, 1)
return (BRUTELOSS)
//air horn
@@ -132,7 +132,7 @@
name = "air horn"
desc = "Damn son, where'd you find this?"
icon_state = "air_horn"
- honksound = 'sound/items/airhorn2.ogg'
+ honksounds = list('sound/items/airhorn2.ogg' = 1)
//golden bikehorn
/obj/item/bikehorn/golden
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index d014f70315..2a7b5d24cd 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -665,10 +665,10 @@
/obj/item/toy/crayon/spraycan/examine(mob/user)
. = ..()
if(charges_left)
- to_chat(user, "It has [charges_left] use\s left.")
+ . += "It has [charges_left] use\s left."
else
- to_chat(user, "It is empty.")
- to_chat(user, "Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"]. ")
+ . += "It is empty."
+ . += "Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"]. "
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params)
if(!proximity)
@@ -829,7 +829,7 @@
/obj/item/toy/crayon/spraycan/gang/examine(mob/user)
. = ..()
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/gang) || isobserver(user))
- to_chat(user, "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster.")
+ . += "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster."
/obj/item/toy/crayon/spraycan/infinite
name = "infinite spraycan"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 0c9ac4bb60..37d2c77373 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -103,12 +103,11 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/examine(mob/user)
. = ..()
- var/dat = id ? "Alt-click to remove the id. " : ""
+ . += id ? "Alt-click to remove the id. " : ""
if(inserted_item && (!isturf(loc)))
- dat += "\nCtrl-click to remove [inserted_item]. "
+ . += "Ctrl-click to remove [inserted_item]. "
if(LAZYLEN(GLOB.pda_reskins))
- dat += "\nCtrl-shift-click it to reskin it. "
- to_chat(user, dat)
+ . += "Ctrl-shift-click it to reskin it. "
/obj/item/pda/Initialize()
. = ..()
@@ -162,31 +161,33 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/equipped(mob/user, slot)
. = ..()
- if(equipped)
+ if(equipped || !user.client)
return
- if(user.client)
- background_color = user.client.prefs.pda_color
- switch(user.client.prefs.pda_style)
- if(MONO)
- font_index = MODE_MONO
- font_mode = FONT_MONO
- if(SHARE)
- font_index = MODE_SHARE
- font_mode = FONT_SHARE
- if(ORBITRON)
- font_index = MODE_ORBITRON
- font_mode = FONT_ORBITRON
- if(VT)
- font_index = MODE_VT
- font_mode = FONT_VT
- else
- font_index = MODE_MONO
- font_mode = FONT_MONO
- var/pref_skin = GLOB.pda_reskins[user.client.prefs.pda_skin]
- if(icon != pref_skin)
- icon = pref_skin
- update_icon(FALSE, TRUE)
- equipped = TRUE
+ update_style(user.client)
+
+/obj/item/pda/proc/update_style(client/C)
+ background_color = C.prefs.pda_color
+ switch(C.prefs.pda_style)
+ if(MONO)
+ font_index = MODE_MONO
+ font_mode = FONT_MONO
+ if(SHARE)
+ font_index = MODE_SHARE
+ font_mode = FONT_SHARE
+ if(ORBITRON)
+ font_index = MODE_ORBITRON
+ font_mode = FONT_ORBITRON
+ if(VT)
+ font_index = MODE_VT
+ font_mode = FONT_VT
+ else
+ font_index = MODE_MONO
+ font_mode = FONT_MONO
+ var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]
+ if(icon != pref_skin)
+ icon = pref_skin
+ update_icon(FALSE, TRUE)
+ equipped = TRUE
/obj/item/pda/proc/update_label()
name = "PDA-[owner] ([ownjob])" //Name generalisation
diff --git a/code/game/objects/items/devices/compressionkit.dm b/code/game/objects/items/devices/compressionkit.dm
index a5a9377690..6e62c389c7 100644
--- a/code/game/objects/items/devices/compressionkit.dm
+++ b/code/game/objects/items/devices/compressionkit.dm
@@ -12,9 +12,9 @@
var/mode = 0
/obj/item/compressionkit/examine(mob/user)
- ..()
- to_chat(user, "It has [charges] charges left. Recharge with bluespace crystals. ")
- to_chat(user, "Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented). ")
+ . = ..()
+ . += "It has [charges] charges left. Recharge with bluespace crystals. "
+ . += "Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented). "
/obj/item/compressionkit/attack_self(mob/user)
if(mode == 0)
diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm
new file mode 100644
index 0000000000..4a6e2d5a46
--- /dev/null
+++ b/code/game/objects/items/devices/desynchronizer.dm
@@ -0,0 +1,87 @@
+/obj/item/desynchronizer
+ name = "desynchronizer"
+ desc = "An experimental device that can temporarily desynchronize the user from spacetime, effectively making them disappear while it's active."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "desynchronizer"
+ item_state = "electronic"
+ w_class = WEIGHT_CLASS_SMALL
+ item_flags = NOBLUDGEON
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ materials = list(MAT_METAL = 250, MAT_GLASS = 500)
+ var/max_duration = 3000
+ var/duration = 300
+ var/last_use = 0
+ var/next_use = 0
+ var/obj/effect/abstract/sync_holder/sync_holder
+
+/obj/item/desynchronizer/attack_self(mob/living/user)
+ if(world.time < next_use)
+ to_chat(user, "[src] is still recharging. ")
+ return
+ if(!sync_holder)
+ desync(user)
+ else
+ resync()
+
+/obj/item/desynchronizer/examine(mob/user)
+ . = ..()
+ if(world.time < next_use)
+ . += "Time left to recharge: [DisplayTimeText(next_use - world.time)] "
+ . += "Alt-click to customize the duration. Current duration: [DisplayTimeText(duration)]. "
+ . += "Can be used again to interrupt the effect early. The recharge time is the same as the time spent in desync. "
+
+/obj/item/desynchronizer/AltClick(mob/living/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ var/new_duration = input(user, "Set the duration (5-300):", "Desynchronizer", duration / 10) as null|num
+ if(new_duration)
+ new_duration = new_duration SECONDS
+ new_duration = CLAMP(new_duration, 50, max_duration)
+ duration = new_duration
+ to_chat(user, "You set the duration to [DisplayTimeText(duration)]. ")
+
+/obj/item/desynchronizer/proc/desync(mob/living/user)
+ if(sync_holder)
+ return
+ sync_holder = new(drop_location())
+ new /obj/effect/temp_visual/desynchronizer(drop_location())
+ to_chat(user, "You activate [src], desynchronizing yourself from the present. You can still see your surroundings, but you feel eerily dissociated from reality. ")
+ user.forceMove(sync_holder)
+ SEND_SIGNAL(user, COMSIG_MOVABLE_SECLUDED_LOCATION)
+ for(var/thing in user)
+ var/atom/movable/AM = thing
+ SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION)
+ last_use = world.time
+ icon_state = "desynchronizer-on"
+ addtimer(CALLBACK(src, .proc/resync), duration)
+
+/obj/item/desynchronizer/proc/resync()
+ new /obj/effect/temp_visual/desynchronizer(sync_holder.drop_location())
+ QDEL_NULL(sync_holder)
+ icon_state = initial(icon_state)
+ next_use = world.time + (world.time - last_use) // Could be 2*world.time-last_use but that would just be confusing
+
+/obj/item/desynchronizer/Destroy()
+ resync()
+ return ..()
+
+/obj/effect/abstract/sync_holder
+ name = "desyncronized pocket"
+ desc = "A pocket in spacetime, keeping the user a fraction of a second in the future."
+ icon = null
+ icon_state = null
+ alpha = 0
+ invisibility = INVISIBILITY_ABSTRACT
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ anchored = TRUE
+ resistance_flags = INDESTRUCTIBLE
+
+/obj/effect/abstract/sync_holder/Destroy()
+ for(var/I in contents)
+ var/atom/movable/AM = I
+ AM.forceMove(drop_location())
+ return ..()
+
+/obj/effect/abstract/sync_holder/AllowDrop()
+ return TRUE //no dropping spaghetti out of your spacetime pocket
\ No newline at end of file
diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
index 3c945f464e..1a3bc283d9 100644
--- a/code/game/objects/items/devices/dogborg_sleeper.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -134,7 +134,6 @@
var/voracious = hound ? TRUE : FALSE
var/list/targets = target && hound ? list(target) : contents
if(hound)
- hound.setClickCooldown(50)
if(!hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE
else
@@ -447,7 +446,7 @@
if (!target.devourable)
to_chat(user, "The target registers an error code. Unable to insert into [src].")
return
- if(target)
+ if(patient)
to_chat(user,"Your [src] is already occupied. ")
return
if(target.buckled)
@@ -524,3 +523,7 @@
update_gut()
user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside. ", "Your garbage compactor groans lightly as [trashman] slips inside. ")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
+
+/obj/item/dogborg/sleeper/K9/flavour
+ name = "Mobile Sleeper"
+ desc = "A mounted, underslung sleeper, intended for holding willing occupants for leisurely purposes."
\ No newline at end of file
diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm
index 9b009da7a4..8def1d5ca3 100644
--- a/code/game/objects/items/devices/doorCharge.dm
+++ b/code/game/objects/items/devices/doorCharge.dm
@@ -35,8 +35,8 @@
return ..()
/obj/item/doorCharge/examine(mob/user)
- ..()
+ . = ..()
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/traitor)) //No nuke ops because the device is excluded from nuclear
- to_chat(user, "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within.")
+ . += "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
else
- to_chat(user, "A small, suspicious object that feels lukewarm when held.")
+ . += "A small, suspicious object that feels lukewarm when held."
diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
index b909e7a1e8..97392ca71e 100644
--- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
+++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
@@ -16,11 +16,11 @@
maptext = "[circuits]"
/obj/item/electroadaptive_pseudocircuit/examine(mob/user)
- ..()
+ . = ..()
if(iscyborg(user))
- to_chat(user, "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material. ")
- to_chat(user, "Serves as a substitute for fire/air alarm , firelock , and APC electronics. ")
- to_chat(user, "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost. ")
+ . += "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material. "
+ . += "Serves as a substitute for fire/air alarm , firelock , and APC electronics. "
+ . += "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost. "
/obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
if(QDELETED(R) || !istype(R))
diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm
index de62869e7e..0c73d829ff 100644
--- a/code/game/objects/items/devices/forcefieldprojector.dm
+++ b/code/game/objects/items/devices/forcefieldprojector.dm
@@ -52,9 +52,9 @@
qdel(F)
/obj/item/forcefield_projector/examine(mob/user)
- ..()
+ . = ..()
var/percent_charge = round((shield_integrity/max_shield_integrity)*100)
- to_chat(user, "It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged. ")
+ . += "It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged. "
/obj/item/forcefield_projector/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 110676de1b..e6044ceadf 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -63,28 +63,28 @@
current_tick_amount = 0
/obj/item/geiger_counter/examine(mob/user)
- ..()
+ . = ..()
if(!scanning)
- return 1
- to_chat(user, "Alt-click it to clear stored radiation levels. ")
+ return
+ . += "Alt-click it to clear stored radiation levels. "
if(obj_flags & EMAGGED)
- to_chat(user, "The display seems to be incomprehensible. ")
- return 1
+ . += "The display seems to be incomprehensible. "
+ return
switch(radiation_count)
if(-INFINITY to RAD_LEVEL_NORMAL)
- to_chat(user, "Ambient radiation level count reports that all is well. ")
+ . += "Ambient radiation level count reports that all is well. "
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
- to_chat(user, "Ambient radiation levels slightly above average. ")
+ . += "Ambient radiation levels slightly above average. "
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
- to_chat(user, "Ambient radiation levels above average. ")
+ . += "Ambient radiation levels above average. "
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
- to_chat(user, "Ambient radiation levels highly above average. ")
+ . += "Ambient radiation levels highly above average. "
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
- to_chat(user, "Ambient radiation levels nearing critical level. ")
+ . += "Ambient radiation levels nearing critical level. "
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
- to_chat(user, "Ambient radiation levels above critical level! ")
+ . += "Ambient radiation levels above critical level! "
- to_chat(user, "The last radiation amount detected was [last_tick_amount] ")
+ . += "The last radiation amount detected was [last_tick_amount] "
/obj/item/geiger_counter/update_icon()
if(!scanning)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 1ba0e525fa..2368cdc4f0 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -14,10 +14,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
/obj/item/gps/examine(mob/user)
- ..()
+ . = ..()
var/turf/curr = get_turf(src)
- to_chat(user, "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])")
- to_chat(user, "Alt-click to switch it [tracking ? "off":"on"]. ")
+ . += "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])"
+ . += "Alt-click to switch it [tracking ? "off":"on"]. "
/obj/item/gps/Initialize()
. = ..()
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 1e31f14cfd..2352a34e23 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -73,8 +73,8 @@
..()
/obj/item/lightreplacer/examine(mob/user)
- ..()
- to_chat(user, status_string())
+ . = ..()
+ . += status_string()
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index cf55d4178e..f3b53ba352 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -51,11 +51,11 @@
AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/multitool/examine(mob/user)
- ..()
+ . = ..()
if(selected_io)
- to_chat(user, "Activate [src] to detach the data wire. ")
+ . += "Activate [src] to detach the data wire. "
if(buffer)
- to_chat(user, "Its buffer contains [buffer]. ")
+ . += "Its buffer contains [buffer]. "
/obj/item/multitool/suicide_act(mob/living/carbon/user)
user.visible_message("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off! ")
@@ -247,6 +247,8 @@
/obj/item/multitool/cyborg
name = "multitool"
desc = "Optimised and stripped-down version of a regular multitool."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "multitool_cyborg"
toolspeed = 0.5
/obj/item/multitool/abductor
diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm
index 567cb0c73d..2d0af2cf3c 100644
--- a/code/game/objects/items/devices/pipe_painter.dm
+++ b/code/game/objects/items/devices/pipe_painter.dm
@@ -26,5 +26,5 @@
paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors
/obj/item/pipe_painter/examine(mob/user)
- ..()
- to_chat(user, "It is set to [paint_color]. ")
+ . = ..()
+ . += "It is set to [paint_color]. "
diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm
index 37079722c0..fc9ccddaf9 100644
--- a/code/game/objects/items/devices/quantum_keycard.dm
+++ b/code/game/objects/items/devices/quantum_keycard.dm
@@ -10,12 +10,12 @@
var/obj/machinery/quantumpad/qpad
/obj/item/quantum_keycard/examine(mob/user)
- ..()
+ . = ..()
if(qpad)
- to_chat(user, "It's currently linked to a quantum pad.")
- to_chat(user, "Alt-click to unlink the keycard. ")
+ . += "It's currently linked to a quantum pad."
+ . += "Alt-click to unlink the keycard. "
else
- to_chat(user, "Insert [src] into an active quantum pad to link it. ")
+ . += "Insert [src] into an active quantum pad to link it. "
/obj/item/quantum_keycard/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 9adc0488aa..4d91fee9aa 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -21,7 +21,7 @@
for(var/i in channels)
examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]"
- to_chat(user, "It can access the following channels; [jointext(examine_text_list, ", ")]. ")
+ . += "It can access the following channels; [jointext(examine_text_list, ", ")]. "
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index cca5eb4217..9f371f1ddb 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
return TOXLOSS
/obj/item/radio/headset/examine(mob/user)
- ..()
+ . = ..()
if(item_flags & IN_INVENTORY && loc == user)
// construction of frequency description
@@ -45,12 +45,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
avail_chans += "use [MODE_TOKEN_DEPARTMENT] or [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
else
avail_chans += "use [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
- to_chat(user, "A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)].")
+ . += "A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)]."
if(command)
- to_chat(user, "Alt-click to toggle the high-volume mode. ")
+ . += "Alt-click to toggle the high-volume mode. "
else
- to_chat(user, "A small screen on the headset flashes, it's too small to read without holding or wearing the headset. ")
+ . += "A small screen on the headset flashes, it's too small to read without holding or wearing the headset. "
/obj/item/radio/headset/Initialize()
. = ..()
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index eb0271c1b9..c8118e615f 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -49,11 +49,11 @@
return ..()
/obj/item/radio/intercom/examine(mob/user)
- ..()
+ . = ..()
if(!unfastened)
- to_chat(user, "It's screwed and secured to the wall. ")
+ . += "It's screwed and secured to the wall. "
else
- to_chat(user, "It's unscrewed from the wall, and can be detached . ")
+ . += "It's unscrewed from the wall, and can be detached . "
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/screwdriver))
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 926810cfbf..55858e217a 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -319,11 +319,11 @@
/obj/item/radio/examine(mob/user)
- ..()
+ . = ..()
if (unscrewed)
- to_chat(user, "It can be attached and modified. ")
+ . += "It can be attached and modified. "
else
- to_chat(user, "It cannot be modified or attached. ")
+ . += "It cannot be modified or attached. "
/obj/item/radio/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index d6737b94e9..40052bcee5 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -382,7 +382,7 @@ SLIME SCANNER
else if (S.mutantstomach != initial(S.mutantstomach))
mutant = TRUE
- msg += "\tReported Species: [H.dna.custom_species ? H.dna.custom_species : S.name] \n"
+ msg += "\tReported Species: [H.dna.custom_species ? H.dna.custom_species : S.name] \n"
msg += "\tBase Species: [S.name] \n"
if(mutant)
msg += "\tSubject has mutations present. \n"
@@ -523,7 +523,7 @@ SLIME SCANNER
/obj/item/analyzer/examine(mob/user)
. = ..()
- to_chat(user, "Alt-click [src] to activate the barometer function. ")
+ . += "Alt-click [src] to activate the barometer function. "
/obj/item/analyzer/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead! ")
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 2df7892f61..5a9a2027a0 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -29,8 +29,8 @@
/obj/item/taperecorder/examine(mob/user)
- ..()
- to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
+ . = ..()
+ . += "The wire panel is [open_panel ? "opened" : "closed"]."
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index 9fb4206845..b69d32617f 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -106,11 +106,11 @@
return ..()
/obj/item/extinguisher/examine(mob/user)
- ..()
- to_chat(user, "The safety is [safety ? "on" : "off"].")
+ . = ..()
+ . += "The safety is [safety ? "on" : "off"]."
if(reagents.total_volume)
- to_chat(user, "You can loose its screws to empty it. ")
+ . += "You can loose its screws to empty it. "
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
if(istype(target, tanktype) && target.Adjacent(user))
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index fd51ecf26b..d9525ab931 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -145,9 +145,9 @@
update_icon()
/obj/item/flamethrower/examine(mob/user)
- ..()
+ . = ..()
if(ptank)
- to_chat(user, "\The [src] has \a [ptank] attached. Alt-click to remove it. ")
+ . += "\The [src] has \a [ptank] attached. Alt-click to remove it. "
/obj/item/flamethrower/proc/toggle_igniter(mob/user)
if(!ptank)
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 7a0c5fd8df..76d3a9fbf5 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -27,19 +27,19 @@
/obj/item/grenade/chem_grenade/examine(mob/user)
display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state
- ..()
+ . = ..()
if(user.can_see_reagents())
var/count = 0
if(beakers.len)
- to_chat(user, "You scan the grenade and detect the following reagents: ")
+ . += "You scan the grenade and detect the following reagents: "
for(var/obj/item/reagent_containers/glass/G in beakers)
var/textcount = thtotext(++count)
for(var/datum/reagent/R in G.reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name] in the [textcount] beaker. ")
+ . += "[R.volume] units of [R.name] in the [textcount] beaker. "
if(beakers.len == 1)
- to_chat(user, "You detect no second beaker in the grenade. ")
+ . += "You detect no second beaker in the grenade. "
else
- to_chat(user, "You scan the grenade, but detect nothing. ")
+ . += "You scan the grenade, but detect nothing. "
/obj/item/grenade/chem_grenade/attack_self(mob/user)
diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm
index d450764702..2d3d5e69b6 100644
--- a/code/game/objects/items/grenades/ghettobomb.dm
+++ b/code/game/objects/items/grenades/ghettobomb.dm
@@ -56,5 +56,5 @@
qdel(src)
/obj/item/grenade/iedcasing/examine(mob/user)
- ..()
- to_chat(user, "You can't tell when it will explode!")
+ . = ..()
+ . += "You can't tell when it will explode!"
diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index 28d8739369..98a1aed4c1 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -47,12 +47,12 @@
/obj/item/grenade/examine(mob/user)
- ..()
+ . = ..()
if(display_timer)
if(det_time > 1)
- to_chat(user, "The timer is set to [DisplayTimeText(det_time)].")
+ . += "The timer is set to [DisplayTimeText(det_time)]."
else
- to_chat(user, "\The [src] is set for instant detonation.")
+ . += "\The [src] is set for instant detonation."
/obj/item/grenade/attack_self(mob/user)
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index 7e7dddefb6..da572d4d61 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -52,23 +52,23 @@
return
/obj/item/his_grace/examine(mob/user)
- ..()
+ . = ..()
if(awakened)
switch(bloodthirst)
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
- to_chat(user, "[src] isn't very hungry. Not yet. ")
+ . += "[src] isn't very hungry. Not yet. "
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
- to_chat(user, "[src] would like a snack. ")
+ . += "[src] would like a snack. "
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
- to_chat(user, "[src] is quite hungry now. ")
+ . += "[src] is quite hungry now. "
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
- to_chat(user, "[src] is openly salivating at the sight of you. Be careful. ")
+ . += "[src] is openly salivating at the sight of you. Be careful. "
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
- to_chat(user, "You walk a fine line. [src] is very close to devouring you. ")
+ . += "You walk a fine line. [src] is very close to devouring you. "
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
- to_chat(user, "[src] is shaking violently and staring directly at you. ")
+ . += "[src] is shaking violently and staring directly at you. "
else
- to_chat(user, "[src] is latched closed. ")
+ . += "[src] is latched closed. "
/obj/item/his_grace/relaymove(mob/living/user) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active
if(!awakened)
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
index e7b05d7a01..40f2741a17 100644
--- a/code/game/objects/items/hot_potato.dm
+++ b/code/game/objects/items/hot_potato.dm
@@ -81,9 +81,9 @@
/obj/item/hot_potato/examine(mob/user)
. = ..()
if(active)
- to_chat(user, "[src] is flashing red-hot! You should probably get rid of it! ")
+ . += "[src] is flashing red-hot! You should probably get rid of it! "
if(show_timer)
- to_chat(user, "[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]! ")
+ . += "[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]! "
/obj/item/hot_potato/equipped(mob/user)
. = ..()
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index bbd2e67464..19dbf4fea3 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -155,13 +155,13 @@
/obj/item/inducer/examine(mob/living/M)
- ..()
+ . = ..()
if(cell)
- to_chat(M, "Its display shows: [DisplayEnergy(cell.charge)]. ")
+ . += "Its display shows: [DisplayEnergy(cell.charge)]. "
else
- to_chat(M,"Its display is dark. ")
+ . += "Its display is dark. "
if(opened)
- to_chat(M,"Its battery compartment is open. ")
+ . += "Its battery compartment is open. "
/obj/item/inducer/update_icon()
cut_overlays()
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 51fd2c50d8..561af8ded6 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -334,8 +334,8 @@
update_light()
/obj/item/melee/transforming/energy/sword/cx/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it. ")
+ . = ..()
+ . += "Alt-click to recolor it. "
/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file)
. = ..()
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 3f7fe7ee8d..5d384a9346 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -119,8 +119,8 @@
reagents.add_reagent(refill_reagent, refill_rate)
/obj/item/mop/advanced/examine(mob/user)
- ..()
- to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"] . ")
+ . = ..()
+ . += "The condenser switch is set to [refill_enabled ? "ON" : "OFF"] . "
/obj/item/mop/advanced/Destroy()
if(refill_enabled)
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 30442d7304..9d1a1ff4f9 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -43,17 +43,17 @@
..()
/obj/item/pet_carrier/examine(mob/user)
- ..()
+ . = ..()
if(occupants.len)
for(var/V in occupants)
var/mob/living/L = V
- to_chat(user, "It has [L] inside. ")
+ . += "It has [L] inside. "
else
- to_chat(user, "It has nothing inside. ")
+ . += "It has nothing inside. "
if(user.canUseTopic(src))
- to_chat(user, "Activate it in your hand to [open ? "close" : "open"] its door. ")
+ . += "Activate it in your hand to [open ? "close" : "open"] its door. "
if(!open)
- to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] its door. ")
+ . += "Alt-click to [locked ? "unlock" : "lock"] its door. "
/obj/item/pet_carrier/attack_self(mob/living/user)
if(open)
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 90e2efabc4..ffbbea84dc 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -1014,3 +1014,9 @@
icon_state = "maya"
item_state = "maya"
attack_verb = list("nuked", "arrested", "harmbatonned")
+
+/obj/item/toy/plush/catgirl/marisa
+ desc = "An adorable stuffed toy that resembles a crew member, or maybe a witch. Having it makes you feel you can win."
+ icon_state = "marisa"
+ item_state = "marisa"
+ attack_verb = list("blasted", "sparked", "dazzled")
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index bd301c36f7..72d27ae544 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -55,17 +55,15 @@
return automatic
/obj/item/pneumatic_cannon/examine(mob/user)
- ..()
- var/list/out = list()
+ . = ..()
if(!in_range(user, src))
- out += "You'll need to get closer to see any more. "
+ . += "You'll need to get closer to see any more. "
return
for(var/obj/item/I in loadedItems)
- out += "[icon2html(I, user)] It has \a [I] loaded. "
+ . += "[icon2html(I, user)] It has \a [I] loaded. "
CHECK_TICK
if(tank)
- out += "[icon2html(tank, user)] It has \a [tank] mounted onto it. "
- to_chat(user, out.Join(" "))
+ . += "[icon2html(tank, user)] It has \a [tank] mounted onto it. "
/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/user, params)
if(user.a_intent == INTENT_HARM)
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index f02e92bb3c..27ed0f82e3 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -20,12 +20,12 @@
/obj/item/melee/powerfist/examine(mob/user)
- ..()
+ . = ..()
if(!in_range(user, src))
- to_chat(user, "You'll need to get closer to see any more. ")
+ . += "You'll need to get closer to see any more. "
return
if(tank)
- to_chat(user, "[icon2html(tank, user)] It has \a [tank] mounted onto it. ")
+ . += "[icon2html(tank, user)] It has \a [tank] mounted onto it. "
/obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 7b3dcb1e00..ddc49a456c 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -16,9 +16,9 @@
var/warcry
/obj/item/banner/examine(mob/user)
- ..()
+ . = ..()
if(inspiration_available)
- to_chat(user, "Activate it in your hand to inspire nearby allies of this banner's allegiance! ")
+ . += "Activate it in your hand to inspire nearby allies of this banner's allegiance! "
/obj/item/banner/attack_self(mob/living/carbon/human/user)
if(!inspiration_available)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index d9045a7a34..a0b78d8b27 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -203,7 +203,7 @@
desc = "A trash bag of holding replacement for the janiborg's standard trash bag."
icon_state = "cyborg_upgrade3"
require_module = 1
- module_type = list(/obj/item/robot_module/janitor, /obj/item/robot_module/scrubpup)
+ module_type = list(/obj/item/robot_module/butler)
/obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R)
. = ..()
@@ -230,7 +230,7 @@
desc = "An advanced mop replacement for the janiborg's standard mop."
icon_state = "cyborg_upgrade3"
require_module = 1
- module_type = list(/obj/item/robot_module/janitor, /obj/item/robot_module/scrubpup)
+ module_type = list(/obj/item/robot_module/butler)
/obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R)
. = ..()
@@ -522,8 +522,7 @@
module_type = list(
/obj/item/robot_module/medical,
/obj/item/robot_module/syndicate_medical,
- /obj/item/robot_module/medihound,
- /obj/item/robot_module/borgi)
+ /obj/item/robot_module/medihound)
/obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -607,7 +606,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "borg_BS_RPED"
require_module = TRUE
- module_type = list(/obj/item/robot_module/engineering)
+ module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur)
/obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr)
. = ..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 0aa19b13ef..c10fb0fa2c 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -191,6 +191,12 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \
null, \
+ new/datum/stack_recipe_list("pews", list(
+ new /datum/stack_recipe("pew (middle)", /obj/structure/chair/pew, 3, one_per_turf = TRUE, on_floor = TRUE),\
+ new /datum/stack_recipe("pew (left)", /obj/structure/chair/pew/left, 3, one_per_turf = TRUE, on_floor = TRUE),\
+ new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\
+ )),
+ null, \
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 7654199cf5..965e78036a 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -76,23 +76,23 @@
. = ..()
/obj/item/stack/examine(mob/user)
- ..()
+ . = ..()
if (is_cyborg)
if(singular_name)
- to_chat(user, "There is enough energy for [get_amount()] [singular_name]\s.")
+ . += "There is enough energy for [get_amount()] [singular_name]\s."
else
- to_chat(user, "There is enough energy for [get_amount()].")
+ . += "There is enough energy for [get_amount()]."
return
if(singular_name)
if(get_amount()>1)
- to_chat(user, "There are [get_amount()] [singular_name]\s in the stack.")
+ . += "There are [get_amount()] [singular_name]\s in the stack."
else
- to_chat(user, "There is [get_amount()] [singular_name] in the stack.")
+ . += "There is [get_amount()] [singular_name] in the stack."
else if(get_amount()>1)
- to_chat(user, "There are [get_amount()] in the stack.")
+ . += "There are [get_amount()] in the stack."
else
- to_chat(user, "There is [get_amount()] in the stack.")
- to_chat(user, "Alt-click to take a custom amount. ")
+ . += "There is [get_amount()] in the stack."
+ . += "Alt-click to take a custom amount. "
/obj/item/stack/proc/get_amount()
if(is_cyborg)
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 847e1b521e..3fc9bd9535 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -73,6 +73,15 @@
turf_type = /turf/open/floor/grass
resistance_flags = FLAMMABLE
+//Fairygrass
+/obj/item/stack/tile/fairygrass
+ name = "fairygrass tile"
+ singular_name = "fairygrass floor tile"
+ desc = "A patch of odd, glowing blue grass."
+ icon_state = "tile_fairygrass"
+ item_state = "tile-fairygrass"
+ turf_type = /turf/open/floor/grass/fairy
+ resistance_flags = FLAMMABLE
//Wood
/obj/item/stack/tile/wood
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index a79eb299da..f6e169a4d5 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -60,7 +60,7 @@
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.allow_big_nesting = TRUE
- STR.max_w_class = WEIGHT_CLASS_GIGANTIC
+ STR.max_w_class = WEIGHT_CLASS_BULKY
STR.max_combined_w_class = 35
/obj/item/storage/backpack/holding/suicide_act(mob/living/user)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 713dbe4133..e6e4b31547 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -757,9 +757,9 @@
STR.can_hold = typecacheof(fitting_swords)
/obj/item/storage/belt/sabre/examine(mob/user)
- ..()
+ . = ..()
if(length(contents))
- to_chat(user, "Alt-click it to quickly draw the blade. ")
+ . += "Alt-click it to quickly draw the blade. "
/obj/item/storage/belt/sabre/AltClick(mob/user)
if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 44e122e4b9..6cc2cb6882 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -36,12 +36,12 @@
icon_state = "[icon_type]box"
/obj/item/storage/fancy/examine(mob/user)
- ..()
+ . = ..()
if(fancy_open)
if(length(contents) == 1)
- to_chat(user, "There is one [icon_type] left.")
+ . += "There is one [icon_type] left."
else
- to_chat(user, "There are [contents.len <= 0 ? "no" : "[contents.len]"] [icon_type]s left.")
+ . += "There are [contents.len <= 0 ? "no" : "[contents.len]"] [icon_type]s left."
/obj/item/storage/fancy/attack_self(mob/user)
fancy_open = !fancy_open
@@ -143,8 +143,8 @@
STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette, /obj/item/lighter))
/obj/item/storage/fancy/cigarettes/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to extract contents. ")
+ . = ..()
+ . += "Alt-click to extract contents. "
/obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index 1607b19c2f..bd234d8188 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -108,10 +108,10 @@
STR.can_hold = typecacheof(list(/obj/item/clothing/accessory/medal))
/obj/item/storage/lockbox/medal/examine(mob/user)
- ..()
+ . = ..()
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
if(!locked)
- to_chat(user, "Alt-click to [open ? "close":"open"] it. ")
+ . += "Alt-click to [open ? "close":"open"] it. "
/obj/item/storage/lockbox/medal/AltClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE))
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index 8618e4c3ae..a2bf5773d1 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -31,8 +31,8 @@
STR.max_combined_w_class = 14
/obj/item/storage/secure/examine(mob/user)
- ..()
- to_chat(user, text("The service panel is currently [open ? "unscrewed" : "screwed shut"] ."))
+ . = ..()
+ . += "The service panel is currently [open ? "unscrewed" : "screwed shut"] ."
/obj/item/storage/secure/attackby(obj/item/W, mob/user, params)
if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED))
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index ca7f7fe31a..1e37de2581 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -239,8 +239,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/storage/toolbox/gold_real
name = "golden toolbox"
desc = "A larger then normal toolbox made of gold plated plastitanium."
- item_state = "gold"
icon_state = "gold"
+ item_state = "toolbox_gold"
has_latches = FALSE
force = 16 // Less then a spear
throwforce = 14
@@ -266,7 +266,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
name = "golden toolbox"
desc = "A gold plated toolbox, fancy and harmless due to the gold plating being on cardboard!"
icon_state = "gold"
- item_state = "gold"
+ item_state = "toolbox_gold"
has_latches = FALSE
force = 0
throwforce = 0
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 84ebc28afa..223c8e9cf6 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -381,3 +381,13 @@
new /obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun(src)
new /obj/item/ammo_box/magazine/m45/kitchengun(src)
new /obj/item/ammo_box/magazine/m45/kitchengun(src)
+
+
+/obj/item/storage/box/strange_seeds_10pack
+
+/obj/item/storage/box/strange_seeds_10pack/PopulateContents()
+ for(var/i in 1 to 10)
+ new /obj/item/seeds/random(src)
+
+ if(prob(50))
+ new /obj/item/seeds/random(src) //oops, an additional packet might have slipped its way into the box
\ No newline at end of file
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 47d9af2795..484b9862ff 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -91,9 +91,9 @@
. = ..()
var/obj/item/stock_parts/cell/copper_top = get_cell()
if(copper_top)
- to_chat(user, "\The [src] is [round(copper_top.percent())]% charged. ")
+ . += "\The [src] is [round(copper_top.percent())]% charged. "
else
- to_chat(user, "\The [src] does not have a power source installed. ")
+ . += "\The [src] does not have a power source installed. "
/obj/item/melee/baton/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/cell))
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index d409e40575..f763fe87fc 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -74,15 +74,15 @@
/obj/item/tank/examine(mob/user)
var/obj/icon = src
- ..()
+ . = ..()
if (istype(src.loc, /obj/item/assembly))
icon = src.loc
if(!in_range(src, user))
if (icon == src)
- to_chat(user, "If you want any more information you'll need to get closer. ")
+ . += "If you want any more information you'll need to get closer. "
return
- to_chat(user, "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa. ")
+ . += "The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa. "
var/celsius_temperature = src.air_contents.temperature-T0C
var/descriptive
@@ -100,7 +100,7 @@
else
descriptive = "furiously hot"
- to_chat(user, "It feels [descriptive]. ")
+ . += "It feels [descriptive]. "
/obj/item/tank/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index f891a48df6..bc5bc6811e 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -63,6 +63,8 @@
/obj/item/crowbar/cyborg
name = "hydraulic crowbar"
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "crowbar_cyborg"
usesound = 'sound/items/jaws_pry.ogg'
force = 10
toolspeed = 0.5
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 6cbede78a8..91a94e05c3 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -138,10 +138,14 @@
user.put_in_active_hand(b_drill)
/obj/item/screwdriver/cyborg
- name = "powered screwdriver"
+ name = "automated screwdriver"
desc = "An electrical screwdriver, designed to be both precise and quick."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "screwdriver_cyborg"
+ hitsound = 'sound/items/drill_hit.ogg'
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
+ random_color = FALSE
/obj/item/screwdriver/advanced
name = "advanced screwdriver"
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index b04d96dc80..65b240c528 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -220,8 +220,8 @@
/obj/item/weldingtool/examine(mob/user)
- ..()
- to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
+ . = ..()
+ . += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
/obj/item/weldingtool/get_temperature()
return welding * heat
@@ -302,6 +302,8 @@
/obj/item/weldingtool/largetank/cyborg
name = "integrated welding tool"
desc = "An advanced welder designed to be used in robotic systems."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "indwelder_cyborg"
toolspeed = 0.5
/obj/item/weldingtool/largetank/flamethrower_screwdriver()
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index e40ae8bdc1..fe8b4b2d56 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -87,7 +87,10 @@
/obj/item/wirecutters/cyborg
name = "wirecutters"
desc = "This cuts wires."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "wirecutters_cyborg"
toolspeed = 0.5
+ random_color = FALSE
/obj/item/wirecutters/power
name = "jaws of life"
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 462eb22aaa..89f135ed67 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -26,6 +26,8 @@
/obj/item/wrench/cyborg
name = "automatic wrench"
desc = "An advanced robotic wrench. Can be found in construction cyborgs."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "wrench_cyborg"
toolspeed = 0.5
/obj/item/wrench/brass
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index d78338d390..c5b62f0f33 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -148,8 +148,8 @@
var/bullets = 7
/obj/item/toy/gun/examine(mob/user)
- ..()
- to_chat(user, "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left.")
+ . = ..()
+ . += "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left."
/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, params)
@@ -204,8 +204,8 @@
src.icon_state = text("357OLD-[]", src.amount_left)
/obj/item/toy/ammo/gun/examine(mob/user)
- ..()
- to_chat(user, "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left.")
+ . = ..()
+ . += "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left."
/*
* Toy swords
@@ -373,8 +373,8 @@
return ..()
/obj/item/toy/sword/cx/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it. ")
+ . = ..()
+ . += "Alt-click to recolor it. "
/*
* Foam armblade
@@ -994,8 +994,7 @@
if(cardUser.is_holding(src))
cardUser.visible_message("[cardUser] checks [cardUser.p_their()] card.", "The card reads: [cardname]. ")
else
- to_chat(cardUser, "You need to have the card in your hand to check it! ")
-
+ . += "You need to have the card in your hand to check it! "
/obj/item/toy/cards/singlecard/verb/Flip()
set name = "Flip Card"
@@ -1221,8 +1220,8 @@
to_chat(user, "The cogwheels are already turning! ")
/obj/item/toy/clockwork_watch/examine(mob/user)
- ..()
- to_chat(user, "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]")
+ . = ..()
+ . += "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]"
/*
* Toy Dagger
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index 14f924a27e..f559d2801d 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -566,9 +566,9 @@
. += blade_inhand
/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user)
- ..()
+ . = ..()
if(!hacked)
- to_chat(user, "Alt-click to recolor it. ")
+ . += "Alt-click to recolor it. "
/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process()
. = ..()
@@ -634,9 +634,9 @@
AddComponent(/datum/component/jousting)
/obj/item/twohanded/spear/examine(mob/user)
- ..()
+ . = ..()
if(explosive)
- to_chat(user, "Use in your hands to activate the attached explosive. Alt-click to set your war cry. Right-click in combat mode to wield ")
+ . += "Use in your hands to activate the attached explosive. Alt-click to set your war cry. Right-click in combat mode to wield "
/obj/item/twohanded/spear/update_icon()
if(explosive)
diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm
index 3be12abf4f..af647550ea 100755
--- a/code/game/objects/items/vending_items.dm
+++ b/code/game/objects/items/vending_items.dm
@@ -30,14 +30,14 @@
name = "\improper [machine_name] restocking unit"
/obj/item/vending_refill/examine(mob/user)
- ..()
+ . = ..()
var/num = get_part_rating()
if (num == INFINITY)
- to_chat(user, "It's sealed tight, completely full of supplies.")
+ . += "It's sealed tight, completely full of supplies."
else if (num == 0)
- to_chat(user, "It's empty!")
+ . += "It's empty!"
else
- to_chat(user, "It can restock [num] item\s.")
+ . += "It can restock [num] item\s."
/obj/item/vending_refill/get_part_rating()
if (!products || !contraband || !premium)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index fec17cfa69..fe1086eb6e 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -125,10 +125,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
qdel(src) //If this ever happens, it's because you lost an arm
/obj/item/claymore/highlander/examine(mob/user)
- ..()
- to_chat(user, "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade.")
+ . = ..()
+ . += "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade."
if(nuke_disk)
- to_chat(user, "It's holding the nuke disk! ")
+ . += "It's holding the nuke disk! "
/obj/item/claymore/highlander/attack(mob/living/target, mob/living/user)
. = ..()
@@ -216,7 +216,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 40
throwforce = 10
- w_class = WEIGHT_CLASS_HUGE
+ w_class = WEIGHT_CLASS_BULKY
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
@@ -427,7 +427,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
item_flags = ABSTRACT | DROPDEL
- w_class = WEIGHT_CLASS_HUGE
+ w_class = WEIGHT_CLASS_BULKY
force = 24
throwforce = 0
throw_range = 0
@@ -512,7 +512,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
force = 10
throwforce = 12
attack_verb = list("beat", "smacked")
- w_class = WEIGHT_CLASS_HUGE
+ w_class = WEIGHT_CLASS_BULKY
var/homerun_ready = 0
var/homerun_able = 0
total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 6dd8a43130..e6c7f987d5 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -224,11 +224,11 @@
.["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]"
/obj/examine(mob/user)
- ..()
+ . = ..()
if(obj_flags & UNIQUE_RENAME)
- to_chat(user, "Use a pen on it to rename it or change its description. ")
+ . += "Use a pen on it to rename it or change its description. "
if(unique_reskin && (!current_skin || always_reskinnable))
- to_chat(user, "Alt-click it to reskin it. ")
+ . += "Alt-click it to reskin it. "
/obj/AltClick(mob/user)
. = ..()
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 7526807eeb..cf050f62d1 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -89,15 +89,15 @@
structureclimber = null
/obj/structure/examine(mob/user)
- ..()
+ . = ..()
if(!(resistance_flags & INDESTRUCTIBLE))
if(resistance_flags & ON_FIRE)
- to_chat(user, "It's on fire! ")
+ . += "It's on fire! "
if(broken)
- to_chat(user, "It appears to be broken. ")
+ . += "It appears to be broken. "
var/examine_status = examine_status(user)
if(examine_status)
- to_chat(user, examine_status)
+ . += examine_status
/obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls.
var/healthpercent = (obj_integrity/max_integrity) * 100
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index be26567c7e..8964d1ca41 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -39,7 +39,7 @@
/obj/structure/AIcore/latejoin_inactive/examine(mob/user)
. = ..()
- to_chat(user, "Its transmitter seems to be [active? "on" : "off"].")
+ . += "Its transmitter seems to be [active? "on" : "off"]."
/obj/structure/AIcore/latejoin_inactive/proc/is_available() //If people still manage to use this feature to spawn-kill AI latejoins ahelp them.
if(!available)
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 12dcb97903..e9e09ddc91 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -23,9 +23,9 @@
var/bolts = TRUE
/obj/structure/bed/examine(mob/user)
- ..()
+ . = ..()
if(bolts)
- to_chat(user, "It's held together by a couple of bolts . ")
+ . += "It's held together by a couple of bolts . "
/obj/structure/bed/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
@@ -148,8 +148,8 @@
..()
/obj/item/roller/robo/examine(mob/user)
- ..()
- to_chat(user, "The dock is [loaded ? "loaded" : "empty"].")
+ . = ..()
+ . += "The dock is [loaded ? "loaded" : "empty"]."
/obj/item/roller/robo/deploy_roller(mob/user, atom/location)
if(loaded)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index cec97d5d8b..d19e76d238 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -15,10 +15,10 @@
layer = OBJ_LAYER
/obj/structure/chair/examine(mob/user)
- ..()
- to_chat(user, "It's held together by a couple of bolts . ")
+ . = ..()
+ . += "It's held together by a couple of bolts . "
if(!has_buckled_mobs())
- to_chat(user, "Drag your sprite to sit in it. ")
+ . += "Drag your sprite to sit in it. "
/obj/structure/chair/Initialize()
. = ..()
diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm
new file mode 100644
index 0000000000..65440fb5d8
--- /dev/null
+++ b/code/game/objects/structures/beds_chairs/pew.dm
@@ -0,0 +1,72 @@
+/obj/structure/chair/pew
+ name = "wooden pew"
+ desc = "Kneel here and pray."
+ icon = 'icons/obj/sofa.dmi'
+ icon_state = "pewmiddle"
+ resistance_flags = FLAMMABLE
+ max_integrity = 70
+ buildstacktype = /obj/item/stack/sheet/mineral/wood
+ buildstackamount = 3
+ item_chair = null
+
+/obj/structure/chair/pew/left
+ name = "left wooden pew end"
+ icon_state = "pewend_left"
+ var/mutable_appearance/leftpewarmrest
+
+/obj/structure/chair/pew/left/Initialize()
+ leftpewarmrest = GetLeftPewArmrest()
+ leftpewarmrest.layer = ABOVE_MOB_LAYER
+ return ..()
+
+/obj/structure/chair/pew/left/proc/GetLeftPewArmrest()
+ return mutable_appearance('icons/obj/sofa.dmi', "pewend_left_armrest")
+
+/obj/structure/chair/pew/left/Destroy()
+ QDEL_NULL(leftpewarmrest)
+ return ..()
+
+/obj/structure/chair/pew/left/post_buckle_mob(mob/living/M)
+ . = ..()
+ update_leftpewarmrest()
+
+/obj/structure/chair/pew/left/proc/update_leftpewarmrest()
+ if(has_buckled_mobs())
+ add_overlay(leftpewarmrest)
+ else
+ cut_overlay(leftpewarmrest)
+
+/obj/structure/chair/pew/left/post_unbuckle_mob()
+ . = ..()
+ update_leftpewarmrest()
+
+/obj/structure/chair/pew/right
+ name = "left wooden pew end"
+ icon_state = "pewend_right"
+ var/mutable_appearance/rightpewarmrest
+
+/obj/structure/chair/pew/right/Initialize()
+ rightpewarmrest = GetRightPewArmrest()
+ rightpewarmrest.layer = ABOVE_MOB_LAYER
+ return ..()
+
+/obj/structure/chair/pew/right/proc/GetRightPewArmrest()
+ return mutable_appearance('icons/obj/sofa.dmi', "pewend_right_armrest")
+
+/obj/structure/chair/pew/right/Destroy()
+ QDEL_NULL(rightpewarmrest)
+ return ..()
+
+/obj/structure/chair/pew/right/post_buckle_mob(mob/living/M)
+ . = ..()
+ update_rightpewarmrest()
+
+/obj/structure/chair/pew/right/proc/update_rightpewarmrest()
+ if(has_buckled_mobs())
+ add_overlay(rightpewarmrest)
+ else
+ cut_overlay(rightpewarmrest)
+
+/obj/structure/chair/pew/right/post_unbuckle_mob()
+ . = ..()
+ update_rightpewarmrest()
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 1e1fee0bfe..82a0c4d32f 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -294,13 +294,13 @@ LINEN BINS
var/obj/item/hidden = null
/obj/structure/bedsheetbin/examine(mob/user)
- ..()
+ . = ..()
if(amount < 1)
- to_chat(user, "There are no sheets in the bin.")
+ . += "There are no sheets in the bin."
else if(amount == 1)
- to_chat(user, "There is one sheet in the bin.")
+ . += "There is one sheet in the bin."
else
- to_chat(user, "There are [amount] sheets in the bin.")
+ . += "There are [amount] sheets in the bin."
/obj/structure/bedsheetbin/update_icon()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index b9b08802d0..0f8963012f 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -84,22 +84,22 @@
add_overlay("unlocked")
/obj/structure/closet/examine(mob/user)
- ..()
+ . = ..()
if(welded)
- to_chat(user, "It's welded shut. ")
+ . += "It's welded shut. "
if(anchored)
- to_chat(user, "It is bolted to the ground. ")
+ . += "It is bolted to the ground. "
if(opened)
- to_chat(user, "The parts are welded together. ")
+ . += "The parts are welded together. "
else if(secure && !opened)
else if(broken)
- to_chat(user, "The lock is screwed in. ")
+ . += "The lock is screwed in. "
else if(secure)
- to_chat(user, "Alt-click to [locked ? "unlock" : "lock"]. ")
+ . += "Alt-click to [locked ? "unlock" : "lock"]. "
if(isliving(user))
var/mob/living/L = user
if(HAS_TRAIT(L, TRAIT_SKITTISH))
- to_chat(user, "Ctrl-Shift-click [src] to jump inside. ")
+ . += "Ctrl-Shift-click [src] to jump inside. "
/obj/structure/closet/CanPass(atom/movable/mover, turf/target)
if(wall_mounted)
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index ad493dd6f5..0adfe77853 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -12,6 +12,9 @@
new /obj/item/clothing/under/shorts/blue(src)
new /obj/item/clothing/under/shorts/green(src)
new /obj/item/clothing/under/jabroni(src)
+ new /obj/item/clothing/under/polychromic/shortpants(src)
+ new /obj/item/clothing/under/polychromic/shortpants(src)
+ new /obj/item/clothing/under/polychromic/shortpants(src)
/obj/structure/closet/boxinggloves
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index b49d0a77d5..9deca71269 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -352,6 +352,7 @@
icon_door = "black"
/obj/structure/closet/wardrobe/curator/PopulateContents()
+ new /obj/item/clothing/accessory/pocketprotector/full(src)
new /obj/item/clothing/head/fedora/curator(src)
new /obj/item/clothing/suit/curator(src)
new /obj/item/clothing/under/rank/curator/treasure_hunter(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 18928424c0..b06073812a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -11,7 +11,7 @@
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/under/rank/cargo/skirt(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
- new /obj/item/radio/headset/headset_cargo(src)
+ new /obj/item/radio/headset/heads/qm(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/megaphone/cargo(src)
@@ -23,3 +23,4 @@
new /obj/item/circuitboard/machine/techfab/department/cargo(src)
new /obj/item/storage/photo_album/QM(src)
new /obj/item/circuitboard/machine/ore_silo(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/qm(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index f173ac0662..9abd81b787 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -34,6 +34,7 @@
new /obj/item/storage/photo_album/CE(src)
new /obj/item/storage/lockbox/medal/engineering(src)
new /obj/item/construction/rcd/loaded/upgraded(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/ce(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 0f810225b3..9c4b58cd20 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -71,7 +71,7 @@
new /obj/item/storage/belt/medical(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/assembly/flash/handheld(src)
-// new /obj/item/reagent_containers/hypospray/CMO(src) // CITADEL EDIT comments out the hypospray mk I. the MK II kit is modularized
+ new /obj/item/storage/hypospraykit/cmo(src)
new /obj/item/autosurgeon/cmo(src)
new /obj/item/door_remote/chief_medical_officer(src)
new /obj/item/clothing/neck/petcollar(src)
@@ -81,6 +81,7 @@
new /obj/item/circuitboard/machine/techfab/department/medical(src)
new /obj/item/storage/photo_album/CMO(src)
new /obj/item/storage/lockbox/medal/medical(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/cmo(src)
/obj/structure/closet/secure_closet/animal
name = "animal control"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index e44d3c9079..bb70532ecc 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -5,9 +5,9 @@
var/registered_name = null
/obj/structure/closet/secure_closet/personal/examine(mob/user)
- ..()
+ . = ..()
if(registered_name)
- to_chat(user, "The display reads, \"Owned by [registered_name]\". ")
+ . += "The display reads, \"Owned by [registered_name]\". "
/obj/structure/closet/secure_closet/personal/check_access(obj/item/card/id/I)
. = ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index efcc2aa7ca..97c0c8f3e2 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -30,3 +30,4 @@
new /obj/item/door_remote/research_director(src)
new /obj/item/circuitboard/machine/techfab/department/science(src)
new /obj/item/storage/photo_album/RD(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/rd(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 3cb8ceb22b..e87cb22f31 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -61,6 +61,7 @@
new /obj/item/door_remote/civillian(src)
new /obj/item/circuitboard/machine/techfab/department/service(src)
new /obj/item/storage/photo_album/HoP(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hop(src)
/obj/structure/closet/secure_closet/hos
name = "\proper head of security's locker"
req_access = list(ACCESS_HOS)
@@ -94,6 +95,7 @@
new /obj/item/pinpointer/nuke(src)
new /obj/item/circuitboard/machine/techfab/department/security(src)
new /obj/item/storage/photo_album/HoS(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hos(src)
/obj/structure/closet/secure_closet/warden
name = "\proper warden's locker"
req_access = list(ACCESS_ARMORY)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index d83922d708..9d554181eb 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -142,28 +142,21 @@
new /obj/item/clothing/suit/jacket(src)
if(prob(40))
new /obj/item/clothing/suit/jacket(src)
- new /obj/item/clothing/under/color/white(src)
- new /obj/item/clothing/under/skirt/color/white(src)
- new /obj/item/clothing/under/color/blue(src)
- new /obj/item/clothing/under/skirt/color/blue(src)
- new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/under/skirt/color/yellow(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/skirt/color/green(src)
- new /obj/item/clothing/under/color/orange(src)
- new /obj/item/clothing/under/skirt/color/orange(src)
- new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/under/skirt/color/pink(src)
- new /obj/item/clothing/under/color/red(src)
- new /obj/item/clothing/under/skirt/color/red(src)
- new /obj/item/clothing/under/color/darkblue(src)
- new /obj/item/clothing/under/skirt/color/darkblue(src)
- new /obj/item/clothing/under/color/teal(src)
- new /obj/item/clothing/under/skirt/color/teal(src)
- new /obj/item/clothing/under/color/lightpurple(src)
- new /obj/item/clothing/under/skirt/color/lightpurple(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/skirt/color/green(src)
+ new /obj/item/clothing/under/polychromic/jumpsuit(src)
+ new /obj/item/clothing/under/polychromic/jumpsuit(src)
+ new /obj/item/clothing/under/polychromic/jumpsuit(src)
+ new /obj/item/clothing/under/polychromic/shirt(src)
+ new /obj/item/clothing/under/polychromic/shirt(src)
+ new /obj/item/clothing/under/polychromic/shirt(src)
+ new /obj/item/clothing/under/polychromic/kilt(src)
+ new /obj/item/clothing/under/polychromic/kilt(src)
+ new /obj/item/clothing/under/polychromic/kilt(src)
+ new /obj/item/clothing/under/polychromic/skirt(src)
+ new /obj/item/clothing/under/polychromic/skirt(src)
+ new /obj/item/clothing/under/polychromic/skirt(src)
+ new /obj/item/clothing/under/polychromic/shorts(src)
+ new /obj/item/clothing/under/polychromic/shorts(src)
+ new /obj/item/clothing/under/polychromic/shorts(src)
new /obj/item/clothing/mask/bandana/red(src)
new /obj/item/clothing/mask/bandana/red(src)
new /obj/item/clothing/mask/bandana/blue(src)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index bcb025d14b..771b4bc04e 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -38,14 +38,14 @@
return ..()
/obj/structure/displaycase/examine(mob/user)
- ..()
+ . = ..()
if(alert)
- to_chat(user, "Hooked up with an anti-theft system. ")
+ . += "Hooked up with an anti-theft system. "
if(showpiece)
- to_chat(user, "There's [showpiece] inside. ")
+ . += "There's [showpiece] inside. "
if(trophy_message)
- to_chat(user, "The plaque reads:")
- to_chat(user, trophy_message)
+ . += "The plaque reads:"
+ . += trophy_message
/obj/structure/displaycase/proc/dump()
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 915d45be78..07a66505e7 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -26,28 +26,28 @@
..()
/obj/structure/door_assembly/examine(mob/user)
- ..()
+ . = ..()
var/doorname = ""
if(created_name)
doorname = ", written on it is '[created_name]'"
switch(state)
if(AIRLOCK_ASSEMBLY_NEEDS_WIRES)
if(anchored)
- to_chat(user, "The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring . ")
+ . += "The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring . "
else
- to_chat(user, "The assembly is welded together , but the anchoring bolts are unwrenched . ")
+ . += "The assembly is welded together , but the anchoring bolts are unwrenched . "
if(AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS)
- to_chat(user, "The maintenance panel is wired , but the circuit slot is empty . ")
+ . += "The maintenance panel is wired , but the circuit slot is empty . "
if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
- to_chat(user, "The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open . ")
+ . += "The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open . "
if(!mineral && !glass && !noglass)
- to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers. ")
+ . += "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers. "
else if(!mineral && glass && !noglass)
- to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers. ")
+ . += "There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers. "
else if(mineral && !glass && !noglass)
- to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows. ")
+ . += "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows. "
else
- to_chat(user, "There is a small paper placard on the assembly[doorname]. ")
+ . += "There is a small paper placard on the assembly[doorname]. "
/obj/structure/door_assembly/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/pen))
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index d4e097e450..23643ae9cd 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -22,8 +22,8 @@
stored_extinguisher = new /obj/item/extinguisher(src)
/obj/structure/extinguisher_cabinet/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to [opened ? "close":"open"] it. ")
+ . = ..()
+ . += "Alt-click to [opened ? "close":"open"] it. "
/obj/structure/extinguisher_cabinet/Destroy()
if(stored_extinguisher)
diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm
index e3002a8fae..7331285161 100644
--- a/code/game/objects/structures/femur_breaker.dm
+++ b/code/game/objects/structures/femur_breaker.dm
@@ -23,24 +23,14 @@
var/current_action = 0 // What's currently happening to the femur breaker
/obj/structure/femur_breaker/examine(mob/user)
- ..()
-
- var/msg = ""
-
- msg += "It is [anchored ? "secured to the floor." : "unsecured."] "
-
+ . = ..()
+ . += "It is [anchored ? "secured to the floor." : "unsecured."]"
if (slat_status == BREAKER_SLAT_RAISED)
- msg += "The breaker slat is in a neutral position."
+ . += "The breaker slat is in a neutral position."
else
- msg += "The breaker slat is lowered, and must be raised."
-
+ . += "The breaker slat is lowered, and must be raised."
if (LAZYLEN(buckled_mobs))
- msg += " "
- msg += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
-
- to_chat(user, msg)
-
- return msg
+ . += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
/obj/structure/femur_breaker/attack_hand(mob/user)
add_fingerprint(user)
diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm
index 19103c71ec..35891fa607 100644
--- a/code/game/objects/structures/fence.dm
+++ b/code/game/objects/structures/fence.dm
@@ -29,13 +29,12 @@
update_cut_status()
/obj/structure/fence/examine(mob/user)
- .=..()
-
+ . = ..()
switch(hole_size)
if(MEDIUM_HOLE)
- user.show_message("There is a large hole in \the [src].")
+ . += "There is a large hole in \the [src]."
if(LARGE_HOLE)
- user.show_message("\The [src] has been completely cut through.")
+ . += "\The [src] has been completely cut through."
/obj/structure/fence/end
icon_state = "end"
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 10f1f30e13..e3585b601e 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -422,7 +422,7 @@
implants = list(/obj/item/implant/weapons_auth)
id = /obj/item/card/id/syndicate
-/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H)
+/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= ROLE_SYNDICATE
/obj/effect/mob_spawn/human/syndicate/battlecruiser
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 31bf9318ce..94619e1858 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -15,16 +15,16 @@
. = ..()
switch(state)
if(GIRDER_REINF)
- to_chat(user, "The support struts are screwed in place. ")
+ . += "The support struts are screwed in place. "
if(GIRDER_REINF_STRUTS)
- to_chat(user, "The support struts are unscrewed and the inner grille is intact. ")
+ . += "The support struts are unscrewed and the inner grille is intact. "
if(GIRDER_NORMAL)
if(can_displace)
- to_chat(user, "The bolts are wrenched in place. ")
+ . += "The bolts are wrenched in place. "
if(GIRDER_DISPLACED)
- to_chat(user, "The bolts are loosened , but the screws are holding [src] together. ")
+ . += "The bolts are loosened , but the screws are holding [src] together. "
if(GIRDER_DISASSEMBLED)
- to_chat(user, "[src] is disassembled! You probably shouldn't be able to see this examine message. ")
+ . += "[src] is disassembled! You probably shouldn't be able to see this examine message. "
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 00d1690d86..c0519f2504 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -37,11 +37,11 @@
icon_state = "grille50_[rand(0,3)]"
/obj/structure/grille/examine(mob/user)
- ..()
+ . = ..()
if(anchored)
- to_chat(user, "It's secured in place with screws . The rods look like they could be cut through. ")
- if(!anchored)
- to_chat(user, "The anchoring screws are unscrewed . The rods look like they could be cut through. ")
+ . += "It's secured in place with screws . The rods look like they could be cut through. "
+ else
+ . += "The anchoring screws are unscrewed . The rods look like they could be cut through. "
/obj/structure/grille/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
switch(the_rcd.mode)
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index 8714722f4b..3b4bbea559 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -34,29 +34,22 @@
. = ..()
/obj/structure/guillotine/examine(mob/user)
- ..()
-
- var/msg = ""
-
- msg += "It is [anchored ? "wrenched to the floor." : "unsecured. A wrench should fix that."] "
+ . = ..()
+ . += "It is [anchored ? "wrenched to the floor." : "unsecured. A wrench should fix that."]"
if (blade_status == GUILLOTINE_BLADE_RAISED)
- msg += "The blade is raised, ready to fall, and"
+ var/msg = "The blade is raised, ready to fall, and"
if (blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP)
msg += " looks sharp enough to decapitate without any resistance."
else
msg += " doesn't look particularly sharp. Perhaps a whetstone can be used to sharpen it."
+ . += msg
else
- msg += "The blade is hidden inside the stocks."
+ . += "The blade is hidden inside the stocks."
if (LAZYLEN(buckled_mobs))
- msg += " "
- msg += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine."
-
- to_chat(user, msg)
-
- return msg
+ . += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine."
/obj/structure/guillotine/attack_hand(mob/user)
add_fingerprint(user)
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 609384cdda..4c6b9732d0 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -9,11 +9,13 @@
armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
var/obj/item/holosign_creator/projector
-/obj/structure/holosign/New(loc, source_projector)
+/obj/structure/holosign/Initialize(mapload, source_projector)
+ . = ..()
if(source_projector)
projector = source_projector
projector.signs += src
- ..()
+ alpha = 0
+ SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
/obj/structure/holosign/Destroy()
if(projector)
@@ -71,10 +73,8 @@
desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out."
icon_state = "holo_firelock"
density = FALSE
- layer = ABOVE_MOB_LAYER
anchored = TRUE
CanAtmosPass = ATMOS_PASS_NO
- layer = ABOVE_MOB_LAYER
alpha = 150
/obj/structure/holosign/barrier/atmos/Initialize()
@@ -100,13 +100,12 @@
desc = "A holobarrier that uses biometrics to detect human viruses. Denies passing to personnel with easily-detected, malicious viruses. Good for quarantines."
icon_state = "holo_medical"
alpha = 125 //lazy :)
- layer = ABOVE_MOB_LAYER
var/force_allaccess = FALSE
var/buzzcd = 0
/obj/structure/holosign/barrier/medical/examine(mob/user)
- ..()
- to_chat(user,"The biometric scanners are [force_allaccess ? "off" : "on"] . ")
+ . = ..()
+ . += "The biometric scanners are [force_allaccess ? "off" : "on"] . "
/obj/structure/holosign/barrier/medical/CanPass(atom/movable/mover, turf/target)
icon_state = "holo_medical"
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index a6ba6424b1..b946a06432 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -19,10 +19,10 @@
/obj/structure/lattice/examine(mob/user)
..()
- deconstruction_hints(user)
+ . += deconstruction_hints(user)
/obj/structure/lattice/proc/deconstruction_hints(mob/user)
- to_chat(user, "The rods look like they could be cut . There's space for more rods or a tile . ")
+ return "The rods look like they could be cut . There's space for more rods or a tile . "
/obj/structure/lattice/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm
index e1480b32b3..0ae0e29459 100644
--- a/code/game/objects/structures/life_candle.dm
+++ b/code/game/objects/structures/life_candle.dm
@@ -55,9 +55,9 @@
/obj/structure/life_candle/examine(mob/user)
. = ..()
if(linked_minds.len)
- to_chat(user, "[src] is active, and linked to [linked_minds.len] souls.")
+ . += "[src] is active, and linked to [linked_minds.len] souls."
else
- to_chat(user, "It is static, still, unmoving.")
+ . += "It is static, still, unmoving."
/obj/structure/life_candle/process()
if(!linked_minds.len)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index e7be30520e..1a1ff0843a 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -163,8 +163,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
..()
/obj/structure/bodycontainer/morgue/examine(mob/user)
- ..()
- to_chat(user, "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it. ")
+ . = ..()
+ . += "The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it. "
/obj/structure/bodycontainer/morgue/AltClick(mob/user)
..()
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index e3862ed924..a07e9a26d5 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -6,18 +6,22 @@
armor = list("melee" = 100, "bullet" = 80, "laser" = 80, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50)
density = FALSE
anchored = TRUE
- layer = ABOVE_MOB_LAYER
CanAtmosPass = ATMOS_PASS_NO
/obj/structure/plasticflaps/opaque
opacity = TRUE
+/obj/structure/plasticflaps/Initialize()
+ . = ..()
+ alpha = 0
+ SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
+
/obj/structure/plasticflaps/examine(mob/user)
. = ..()
if(anchored)
- to_chat(user, "[src] are screwed to the floor. ")
+ . += "[src] are screwed to the floor. "
else
- to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be cut apart. ")
+ . += "[src] are no longer screwed to the floor, and the flaps can be cut apart. "
/obj/structure/plasticflaps/screwdriver_act(mob/living/user, obj/item/W)
if(..())
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 419502e2b0..77aad5a9dd 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -34,14 +34,14 @@
can_rotate = FALSE
/obj/structure/reflector/examine(mob/user)
- ..()
+ . = ..()
if(finished)
- to_chat(user, "It is set to [rotation_angle] degrees, and the rotation is [can_rotate ? "unlocked" : "locked"].")
+ . += "It is set to [rotation_angle] degrees, and the rotation is [can_rotate ? "unlocked" : "locked"]."
if(!admin)
if(can_rotate)
- to_chat(user, "Alt-click to adjust its direction. ")
+ . += "Alt-click to adjust its direction. "
else
- to_chat(user, "Use screwdriver to unlock the rotation. ")
+ . += "Use screwdriver to unlock the rotation. "
/obj/structure/reflector/proc/setAngle(new_angle)
if(can_rotate)
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index 5de3f0fc9a..b0427274a4 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -131,12 +131,11 @@
//Feedback is given in examine because showcases can basically have any sprite assigned to them
/obj/structure/showcase/examine(mob/user)
- ..()
-
+ . = ..()
switch(deconstruction_state)
if(SHOWCASE_CONSTRUCTED)
- to_chat(user, "The showcase is fully constructed.")
+ . += "The showcase is fully constructed."
if(SHOWCASE_SCREWDRIVERED)
- to_chat(user, "The showcase has its screws loosened.")
+ . += "The showcase has its screws loosened."
else
- to_chat(user, "If you see this, something is wrong.")
+ . += "If you see this, something is wrong."
diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm
index c35d16ab73..4a9a1bdce6 100644
--- a/code/game/objects/structures/spirit_board.dm
+++ b/code/game/objects/structures/spirit_board.dm
@@ -12,7 +12,7 @@
/obj/structure/spirit_board/examine()
desc = "[initial(desc)] The planchette is sitting at \"[planchette]\"."
- ..()
+ return ..()
/obj/structure/spirit_board/attack_hand(mob/user)
. = ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index b12a26cd00..99f8875aef 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -36,11 +36,11 @@
canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced)
/obj/structure/table/examine(mob/user)
- ..()
- deconstruction_hints(user)
+ . = ..()
+ . += deconstruction_hints(user)
/obj/structure/table/proc/deconstruction_hints(mob/user)
- to_chat(user, "The top is screwed on, but the main bolts are also visible. ")
+ return "The top is screwed on, but the main bolts are also visible. "
/obj/structure/table/update_icon()
if(smooth)
@@ -452,9 +452,8 @@
/obj/structure/table/reinforced/deconstruction_hints(mob/user)
if(deconstruction_ready)
- to_chat(user, "The top cover has been welded loose and the main frame's bolts are exposed. ")
- else
- to_chat(user, "The top cover is firmly welded on. ")
+ return "The top cover has been welded loose and the main frame's bolts are exposed. "
+ return "The top cover is firmly welded on. "
/obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool))
@@ -582,8 +581,8 @@
max_integrity = 20
/obj/structure/rack/examine(mob/user)
- ..()
- to_chat(user, "It's held together by a couple of bolts . ")
+ . = ..()
+ . += "It's held together by a couple of bolts . "
/obj/structure/rack/CanPass(atom/movable/mover, turf/target)
if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!|
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 176779abd7..9c1859df08 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -38,7 +38,7 @@
if(user.mind && user.mind in immune_minds)
return
if(get_dist(user, src) <= 1)
- to_chat(user, "You reveal [src]! ")
+ . += "You reveal [src]! "
flare()
/obj/structure/trap/proc/flare()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 794776cfa5..9dee1e26cc 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -29,21 +29,21 @@
rad_flags = RAD_PROTECT_CONTENTS
/obj/structure/window/examine(mob/user)
- ..()
+ . = ..()
if(reinf)
if(anchored && state == WINDOW_SCREWED_TO_FRAME)
- to_chat(user, "The window is screwed to the frame. ")
+ . += "The window is screwed to the frame. "
else if(anchored && state == WINDOW_IN_FRAME)
- to_chat(user, "The window is unscrewed but pried into the frame. ")
+ . += "The window is unscrewed but pried into the frame. "
else if(anchored && state == WINDOW_OUT_OF_FRAME)
- to_chat(user, "The window is out of the frame, but could be pried in. It is screwed to the floor. ")
+ . += "The window is out of the frame, but could be pried in. It is screwed to the floor. "
else if(!anchored)
- to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching . ")
+ . += "The window is unscrewed from the floor, and could be deconstructed by wrenching . "
else
if(anchored)
- to_chat(user, "The window is screwed to the floor. ")
+ . += "The window is screwed to the floor. "
else
- to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching . ")
+ . += "The window is unscrewed from the floor, and could be deconstructed by wrenching . "
/obj/structure/window/Initialize(mapload, direct)
. = ..()
diff --git a/code/game/say.dm b/code/game/say.dm
index 4ce1d3c710..60189618be 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -29,7 +29,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
send_speech(message, 7, src, , spans, message_language=language)
/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
- SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args)
/atom/movable/proc/can_speak()
return 1
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index efee9cfa5a..4bdb13effc 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -111,7 +111,7 @@
icon_state = "necro[rand(2,3)]"
/turf/open/indestructible/necropolis/air
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
/turf/open/indestructible/boss //you put stone tiles on this and use it as a base
name = "necropolis floor"
@@ -121,7 +121,7 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
/turf/open/indestructible/boss/air
- initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
/turf/open/indestructible/hierophant
icon = 'icons/turf/floors/hierophant_floor.dmi'
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index ed6e279088..a8e6baf3fb 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -19,8 +19,8 @@
tiled_dirt = FALSE
/turf/open/floor/wood/examine(mob/user)
- ..()
- to_chat(user, "There's a few screws and a small crack visible. ")
+ . = ..()
+ . += "There's a few screws and a small crack visible. "
/turf/open/floor/wood/screwdriver_act(mob/living/user, obj/item/I)
if(..())
@@ -65,7 +65,7 @@
temperature = 255.37
/turf/open/floor/wood/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/grass
name = "grass patch"
@@ -96,6 +96,15 @@
if(..())
return
+/turf/open/floor/grass/fairy //like grass but fae-er
+ name = "fairygrass patch"
+ desc = "Something about this grass makes you want to frolic. Or get high."
+ icon_state = "fairygrass"
+ floor_tile = /obj/item/stack/tile/fairygrass
+ light_range = 2
+ light_power = 0.80
+ light_color = "#33CCFF"
+
/turf/open/floor/grass/snow
gender = PLURAL
name = "snow"
@@ -105,7 +114,7 @@
ore_type = /obj/item/stack/sheet/mineral/snow
planetary_atmos = TRUE
floor_tile = null
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
slowdown = 2
bullet_sizzle = TRUE
footstep = FOOTSTEP_SAND
@@ -174,8 +183,8 @@
tiled_dirt = FALSE
/turf/open/floor/carpet/examine(mob/user)
- ..()
- to_chat(user, "There's a small crack on the edge of it. ")
+ . = ..()
+ . += "There's a small crack on the edge of it. "
/turf/open/floor/carpet/Initialize()
. = ..()
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 6e896b5e56..f9376c0672 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -14,8 +14,8 @@
/turf/open/floor/light/examine(mob/user)
- ..()
- to_chat(user, "There's a small crack on the edge of it. ")
+ . = ..()
+ . += "There's a small crack on the edge of it. "
/turf/open/floor/light/Initialize()
. = ..()
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index b71fb51123..f0ac0053ce 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -84,31 +84,31 @@
broken_states = list("titanium_dam1","titanium_dam2","titanium_dam3","titanium_dam4","titanium_dam5")
/turf/open/floor/mineral/titanium/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/mineral/titanium/yellow
icon_state = "titanium_yellow"
/turf/open/floor/mineral/titanium/yellow/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/mineral/titanium/blue
icon_state = "titanium_blue"
/turf/open/floor/mineral/titanium/blue/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/mineral/titanium/white
icon_state = "titanium_white"
/turf/open/floor/mineral/titanium/white/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/mineral/titanium/purple
icon_state = "titanium_purple"
/turf/open/floor/mineral/titanium/purple/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
//PLASTITANIUM (syndieshuttle)
/turf/open/floor/mineral/plastitanium
@@ -118,13 +118,13 @@
broken_states = list("plastitanium_dam1","plastitanium_dam2","plastitanium_dam3","plastitanium_dam4","plastitanium_dam5")
/turf/open/floor/mineral/plastitanium/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/mineral/plastitanium/red
icon_state = "plastitanium_red"
/turf/open/floor/mineral/plastitanium/red/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/mineral/plastitanium/red/brig
name = "brig floor"
@@ -170,7 +170,7 @@
spam_flag = world.time + 10
/turf/open/floor/mineral/bananium/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
//DIAMOND
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 253a6ead90..f75772a230 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -45,10 +45,10 @@
on = FALSE
/turf/open/floor/circuit/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/circuit/telecomms
- initial_gas_mix = "n2=100;TEMP=80"
+ initial_gas_mix = TCOMMS_ATMOS
/turf/open/floor/circuit/telecomms/mainframe
name = "mainframe base"
@@ -72,10 +72,10 @@
floor_tile = /obj/item/stack/tile/circuit/green/anim
/turf/open/floor/circuit/green/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/circuit/green/telecomms
- initial_gas_mix = "n2=100;TEMP=80"
+ initial_gas_mix = TCOMMS_ATMOS
/turf/open/floor/circuit/green/telecomms/mainframe
name = "mainframe base"
@@ -96,10 +96,10 @@
floor_tile = /obj/item/stack/tile/circuit/red/anim
/turf/open/floor/circuit/red/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/circuit/red/telecomms
- initial_gas_mix = "n2=100;TEMP=80"
+ initial_gas_mix = TCOMMS_ATMOS
/turf/open/floor/pod
name = "pod floor"
diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm
index 884e4c6551..a3a92e7898 100644
--- a/code/game/turfs/simulated/floor/plasteel_floor.dm
+++ b/code/game/turfs/simulated/floor/plasteel_floor.dm
@@ -5,8 +5,8 @@
burnt_states = list("floorscorched1", "floorscorched2")
/turf/open/floor/plasteel/examine(mob/user)
- ..()
- to_chat(user, "There's a small crack on the edge of it. ")
+ . = ..()
+ . += "There's a small crack on the edge of it. "
/turf/open/floor/plasteel/update_icon()
if(!..())
@@ -16,17 +16,17 @@
/turf/open/floor/plasteel/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plasteel/telecomms
- initial_gas_mix = "n2=100;TEMP=80"
+ initial_gas_mix = TCOMMS_ATMOS
/turf/open/floor/plasteel/dark
icon_state = "darkfull"
/turf/open/floor/plasteel/dark/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plasteel/dark/telecomms
- initial_gas_mix = "n2=100;TEMP=80"
+ initial_gas_mix = TCOMMS_ATMOS
/turf/open/floor/plasteel/airless/dark
icon_state = "darkfull"
/turf/open/floor/plasteel/dark/side
@@ -50,7 +50,7 @@
/turf/open/floor/plasteel/airless/white/corner
icon_state = "whitecorner"
/turf/open/floor/plasteel/white/telecomms
- initial_gas_mix = "n2=100;TEMP=80"
+ initial_gas_mix = TCOMMS_ATMOS
/turf/open/floor/plasteel/yellowsiding
@@ -82,7 +82,7 @@
/turf/open/floor/plasteel/freezer
icon_state = "freezerfloor"
/turf/open/floor/plasteel/freezer/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plasteel/grimy
icon_state = "grimy"
@@ -111,7 +111,7 @@
/turf/open/floor/plasteel/cult/narsie_act()
return
/turf/open/floor/plasteel/cult/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plasteel/stairs
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 191d9b0242..ae67edf073 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -20,14 +20,14 @@
var/attachment_holes = TRUE
/turf/open/floor/plating/examine(mob/user)
- ..()
+ . = ..()
if(broken || burnt)
- to_chat(user, "It looks like the dents could be welded smooth. ")
+ . += "It looks like the dents could be welded smooth. "
return
if(attachment_holes)
- to_chat(user, "There are a few attachment holes for a new tile or reinforcement rods . ")
+ . += "There are a few attachment holes for a new tile or reinforcement rods . "
else
- to_chat(user, "You might be able to build ontop of it with some tiles ... ")
+ . += "You might be able to build ontop of it with some tiles ... "
/turf/open/floor/plating/Initialize()
if (!broken_states)
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index d9966ee55c..9f2da57312 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -103,7 +103,7 @@
/turf/open/floor/plating/asteroid/basalt/airless
baseturfs = /turf/open/floor/plating/asteroid/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plating/asteroid/basalt/Initialize()
. = ..()
@@ -131,7 +131,7 @@
/turf/open/floor/plating/asteroid/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
turf_type = /turf/open/floor/plating/asteroid/airless
@@ -307,7 +307,7 @@
baseturfs = /turf/open/floor/plating/asteroid/snow
icon_state = "snow"
icon_plating = "snow"
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
slowdown = 2
environment_type = "snow"
flags_1 = NONE
@@ -344,11 +344,11 @@
return FALSE
/turf/open/floor/plating/asteroid/snow/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plating/asteroid/snow/temperatre
initial_gas_mix = "o2=22;n2=82;TEMP=255.37"
/turf/open/floor/plating/asteroid/snow/atmosphere
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
planetary_atmos = FALSE
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm
index 15b039193d..5c58d99e1a 100644
--- a/code/game/turfs/simulated/floor/plating/misc_plating.dm
+++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm
@@ -1,7 +1,7 @@
/turf/open/floor/plating/airless
icon_state = "plating"
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/plating/abductor
name = "alien floor"
@@ -172,7 +172,7 @@
desc = "A sheet of solid ice. Looks slippery."
icon = 'icons/turf/floors/ice_turf.dmi'
icon_state = "unsmooth"
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
temperature = 180
planetary_atmos = TRUE
baseturfs = /turf/open/floor/plating/ice
@@ -215,7 +215,7 @@
desc = "A section of heated plating, helps keep the snow from stacking up too high."
icon = 'icons/turf/snow.dmi'
icon_state = "snowplating"
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
temperature = 180
attachment_holes = FALSE
planetary_atmos = TRUE
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index 1a477d5d9a..b04f89f8be 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -13,11 +13,11 @@
tiled_dirt = FALSE
/turf/open/floor/engine/examine(mob/user)
- ..()
- to_chat(user, "The reinforcement rods are wrenched firmly in place. ")
+ . = ..()
+ . += "The reinforcement rods are wrenched firmly in place. "
/turf/open/floor/engine/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/engine/break_tile()
return //unbreakable
@@ -98,28 +98,28 @@
/turf/open/floor/engine/n2o
article = "an"
name = "\improper N2O floor"
- initial_gas_mix = "n2o=6000;TEMP=293.15"
+ initial_gas_mix = ATMOS_TANK_N2O
/turf/open/floor/engine/co2
name = "\improper CO2 floor"
- initial_gas_mix = "co2=50000;TEMP=293.15"
+ initial_gas_mix = ATMOS_TANK_CO2
/turf/open/floor/engine/plasma
name = "plasma floor"
- initial_gas_mix = "plasma=70000;TEMP=293.15"
+ initial_gas_mix = ATMOS_TANK_PLASMA
/turf/open/floor/engine/o2
name = "\improper O2 floor"
- initial_gas_mix = "o2=100000;TEMP=293.15"
+ initial_gas_mix = ATMOS_TANK_O2
/turf/open/floor/engine/n2
article = "an"
name = "\improper N2 floor"
- initial_gas_mix = "n2=100000;TEMP=293.15"
+ initial_gas_mix = ATMOS_TANK_N2
/turf/open/floor/engine/air
name = "air floor"
- initial_gas_mix = "o2=2644;n2=10580;TEMP=293.15"
+ initial_gas_mix = ATMOS_TANK_AIRMIX
@@ -159,8 +159,8 @@
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
/turf/open/floor/engine/cult/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/floor/engine/vacuum
name = "vacuum floor"
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm
index e24736ecf3..362b410cbb 100644
--- a/code/game/turfs/simulated/lava.dm
+++ b/code/game/turfs/simulated/lava.dm
@@ -30,7 +30,7 @@
return
/turf/open/lava/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
/turf/open/lava/Entered(atom/movable/AM)
if(burn_stuff(AM))
@@ -158,4 +158,4 @@
baseturfs = /turf/open/lava/smooth/lava_land_surface
/turf/open/lava/smooth/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 0004a4485b..966083c71a 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -8,7 +8,7 @@
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = null
baseturfs = /turf/open/floor/plating/asteroid/airless
- initial_gas_mix = "TEMP=2.7"
+ initial_gas_mix = AIRLESS_ATMOS
opacity = 1
density = TRUE
blocks_air = 1
@@ -241,7 +241,7 @@
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
@@ -278,7 +278,7 @@
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
@@ -343,7 +343,7 @@
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
defer_change = TRUE
@@ -404,7 +404,7 @@
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
baseturfs = /turf/open/floor/plating/asteroid/snow
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
environment_type = "snow"
turf_type = /turf/open/floor/plating/asteroid/snow
defer_change = TRUE
diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm
index 0d9bff1bdf..b4e84648c2 100644
--- a/code/game/turfs/simulated/wall/reinf_walls.dm
+++ b/code/game/turfs/simulated/wall/reinf_walls.dm
@@ -17,19 +17,19 @@
/turf/closed/wall/r_wall/deconstruction_hints(mob/user)
switch(d_state)
if(INTACT)
- to_chat(user, "The outer grille is fully intact. ")
+ return "The outer grille is fully intact. "
if(SUPPORT_LINES)
- to_chat(user, "The outer grille has been cut, and the support lines are screwed securely to the outer cover. ")
+ return "The outer grille has been cut, and the support lines are screwed securely to the outer cover. "
if(COVER)
- to_chat(user, "The support lines have been unscrewed , and the metal cover is welded firmly in place. ")
+ return "The support lines have been unscrewed , and the metal cover is welded firmly in place. "
if(CUT_COVER)
- to_chat(user, "The metal cover has been sliced through , and is connected loosely to the girder. ")
+ return "The metal cover has been sliced through , and is connected loosely to the girder. "
if(ANCHOR_BOLTS)
- to_chat(user, "The outer cover has been pried away , and the bolts anchoring the support rods are wrenched in place. ")
+ return "The outer cover has been pried away , and the bolts anchoring the support rods are wrenched in place. "
if(SUPPORT_RODS)
- to_chat(user, "The bolts anchoring the support rods have been loosened , but are still welded firmly to the girder. ")
+ return "The bolts anchoring the support rods have been loosened , but are still welded firmly to the girder. "
if(SHEATH)
- to_chat(user, "The support rods have been sliced through , and the outer sheath is connected loosely to the girder. ")
+ return "The support rods have been sliced through , and the outer sheath is connected loosely to the girder. "
/turf/closed/wall/r_wall/devastate_wall()
new sheet_type(src, sheet_amount)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index b18fbb50f6..460c6a52c9 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -32,11 +32,11 @@
var/list/dent_decals
/turf/closed/wall/examine(mob/user)
- ..()
+ . = ..()
deconstruction_hints(user)
/turf/closed/wall/proc/deconstruction_hints(mob/user)
- to_chat(user, "The outer plating is welded firmly in place. ")
+ return "The outer plating is welded firmly in place. "
/turf/closed/wall/attack_tk()
return
diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm
index 028af313b0..2901659ce9 100644
--- a/code/modules/admin/sound_emitter.dm
+++ b/code/modules/admin/sound_emitter.dm
@@ -34,15 +34,15 @@
return
/obj/effect/sound_emitter/examine(mob/user)
- ..()
+ . = ..()
if(!isobserver(user))
return
- to_chat(user, "Sound File: [sound_file ? sound_file : "None chosen"]")
- to_chat(user, "Mode: [motus_operandi] ")
- to_chat(user, "Range: [emitter_range] ")
- to_chat(user, "Sound is playing at [sound_volume]% volume. ")
+ . += "Sound File: [sound_file ? sound_file : "None chosen"]"
+ . += "Mode: [motus_operandi] "
+ . += "Range: [emitter_range] "
+ . += "Sound is playing at [sound_volume]% volume. "
if(user.client.holder)
- to_chat(user, "Alt-click it to quickly activate it! ")
+ . += "Alt-click it to quickly activate it! "
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/sound_emitter/attack_ghost(mob/user)
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index c1e6ff826f..3723b99f4e 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -56,7 +56,7 @@
if(used)
to_chat(H, "You already used this contract!")
return
- var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
+ var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src, ignore_category = POLL_IGNORE_WIZARD)
if(LAZYLEN(candidates))
if(QDELETED(src))
return
@@ -182,6 +182,10 @@
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
+/obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
+ name = "syndicate saboteur teleporter"
+ borg_to_spawn = "Saboteur"
+
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/silicon/robot/R
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
@@ -191,6 +195,8 @@
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/modules/syndicate/medical(T)
+ if("Saboteur")
+ R = new /mob/living/silicon/robot/modules/syndicate/saboteur(T)
else
R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default
@@ -235,7 +241,7 @@
return
if(used)
return
- var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src)
+ var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src, ignore_category = POLL_IGNORE_DEMON)
if(LAZYLEN(candidates))
if(used || QDELETED(src))
return
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index f0104891e1..433f52306b 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -613,16 +613,16 @@
. = ..()
/obj/item/abductor/baton/examine(mob/user)
- ..()
+ . = ..()
switch(mode)
if(BATON_STUN)
- to_chat(user, "The baton is in stun mode. ")
+ . += "The baton is in stun mode. "
if(BATON_SLEEP)
- to_chat(user, "The baton is in sleep inducement mode. ")
+ . += "The baton is in sleep inducement mode. "
if(BATON_CUFF)
- to_chat(user, "The baton is in restraining mode. ")
+ . += "The baton is in restraining mode. "
if(BATON_PROBE)
- to_chat(user, "The baton is in probing mode. ")
+ . += "The baton is in probing mode. "
/obj/item/radio/headset/abductor
name = "alien headset"
diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
index 0ce41beca7..ec76f61ec6 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
@@ -24,7 +24,7 @@
for(var/obj/item/abductor/gizmo/G in B.contents)
console.AddGizmo(G)
-/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(!visualsOnly)
link_to_console(H)
@@ -49,7 +49,7 @@
/obj/item/abductor/gizmo = 1
)
-/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(!visualsOnly)
var/obj/item/implant/abductor/beamplant = new
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index 2952ff7e22..74368da5ac 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -24,7 +24,7 @@
/obj/item/organ/heart/gland/examine(mob/user)
. = ..()
if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user))
- to_chat(user, "It is \a [true_name]. ")
+ . += "It is \a [true_name]. "
/obj/item/organ/heart/gland/proc/ownerCheck()
if(ishuman(owner))
diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm
index fa7b64591f..f094fa83db 100644
--- a/code/modules/antagonists/blob/blob/overmind.dm
+++ b/code/modules/antagonists/blob/blob/overmind.dm
@@ -170,9 +170,9 @@ GLOBAL_LIST_EMPTY(blob_nodes)
add_points(0)
/mob/camera/blob/examine(mob/user)
- ..()
+ . = ..()
if(blob_reagent_datum)
- to_chat(user, "Its chemical is [blob_reagent_datum.name] .")
+ . += "Its chemical is [blob_reagent_datum.name] ."
/mob/camera/blob/update_health_hud()
if(blob_core)
diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm
index dc7aa821d6..b37c007664 100644
--- a/code/modules/antagonists/blob/blob/theblob.dm
+++ b/code/modules/antagonists/blob/blob/theblob.dm
@@ -243,18 +243,19 @@
else
return ..()
-/obj/structure/blob/proc/chemeffectreport(mob/user)
+/obj/structure/blob/proc/chemeffectreport()
+ . = list()
if(overmind)
- to_chat(user, "Material: [overmind.blob_reagent_datum.name] . ")
- to_chat(user, "Material Effects: [overmind.blob_reagent_datum.analyzerdescdamage] ")
- to_chat(user, "Material Properties: [overmind.blob_reagent_datum.analyzerdesceffect] ")
+ . += "Material: [overmind.blob_reagent_datum.name] . "
+ . += "Material Effects: [overmind.blob_reagent_datum.analyzerdescdamage] "
+ . += "Material Properties: [overmind.blob_reagent_datum.analyzerdesceffect] "
else
- to_chat(user, "No Material Detected! ")
+ . += "No Material Detected! "
-/obj/structure/blob/proc/typereport(mob/user)
- to_chat(user, "Blob Type: [uppertext(initial(name))] ")
- to_chat(user, "Health: [obj_integrity]/[max_integrity] ")
- to_chat(user, "Effects: [scannerreport()] ")
+/obj/structure/blob/proc/typereport()
+ . = list("Blob Type: [uppertext(initial(name))] ")
+ . += "Health: [obj_integrity]/[max_integrity] "
+ . += "Effects: [scannerreport()] "
/obj/structure/blob/attack_animal(mob/living/simple_animal/M)
if(ROLE_BLOB in M.faction) //sorry, but you can't kill the blob as a blobbernaut
@@ -310,20 +311,20 @@
return B
/obj/structure/blob/examine(mob/user)
- ..()
+ . = ..()
var/datum/atom_hud/hud_to_check = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
if(user.research_scanner || hud_to_check.hudusers[user])
- to_chat(user, "Your HUD displays an extensive report... ")
+ . += "Your HUD displays an extensive report... "
if(overmind)
- to_chat(user, "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]. ")
+ . += "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]. "
else
- to_chat(user, "Core neutralized. Critical mass no longer attainable. ")
- chemeffectreport(user)
- typereport(user)
+ . += "Core neutralized. Critical mass no longer attainable. "
+ . += chemeffectreport()
+ . += typereport()
else
if(isobserver(user) && overmind)
- to_chat(user, "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]. ")
- to_chat(user, "It seems to be made of [get_chem_name()].")
+ . += "Progress to Critical Mass: [overmind.blobs_legit.len]/[overmind.blobwincount]. "
+ . += "It seems to be made of [get_chem_name()]."
/obj/structure/blob/proc/scannerreport()
return "A generic blob. Looks like someone forgot to override this proc, adminhelp this."
diff --git a/code/modules/antagonists/clockcult/clock_effect.dm b/code/modules/antagonists/clockcult/clock_effect.dm
index b9de95b030..5fbfa03290 100644
--- a/code/modules/antagonists/clockcult/clock_effect.dm
+++ b/code/modules/antagonists/clockcult/clock_effect.dm
@@ -21,5 +21,5 @@
/obj/effect/clockwork/examine(mob/user)
if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
desc = clockwork_desc
- ..()
+ . = ..()
desc = initial(desc)
\ No newline at end of file
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm
index 34a986aa97..c18e46790e 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm
@@ -6,6 +6,7 @@
/obj/effect/clockwork/overlay/examine(mob/user)
if(linked)
linked.examine(user)
+ return ..()
/obj/effect/clockwork/overlay/ex_act()
return FALSE
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
index b5a218131b..0125dc7cf5 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
@@ -196,15 +196,15 @@
..()
/obj/effect/clockwork/sigil/transmission/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
var/structure_number = 0
for(var/obj/structure/destructible/clockwork/powered/P in range(SIGIL_ACCESS_RANGE, src))
structure_number++
- to_chat(user, "It is storing [DisplayPower(get_clockwork_power())] of shared power, \
- and [structure_number] clockwork structure[structure_number == 1 ? " is":"s are"] in range. ")
+ . += "It is storing [DisplayPower(get_clockwork_power())] of shared power, \
+ and [structure_number] clockwork structure[structure_number == 1 ? " is":"s are"] in range. "
if(iscyborg(user))
- to_chat(user, "You can recharge from the [sigil_name] by crossing it. ")
+ . += "You can recharge from the [sigil_name] by crossing it. "
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
if(is_servant_of_ratvar(L))
@@ -279,13 +279,13 @@
var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order
/obj/effect/clockwork/sigil/vitality/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality. ")
+ . += "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality. "
if(GLOB.ratvar_awakens)
- to_chat(user, "It can revive Servants at no cost! ")
+ . += "It can revive Servants at no cost! "
else
- to_chat(user, "It can revive Servants at a cost of [revive_cost] vitality. ")
+ . += "It can revive Servants at a cost of [revive_cost] vitality. "
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
index 5cf7ab7923..36aaa27716 100644
--- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
@@ -53,9 +53,9 @@
return TRUE
/obj/effect/clockwork/spatial_gateway/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It has [uses] use\s remaining. ")
+ . += "It has [uses] use\s remaining. "
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/clockwork/spatial_gateway/attack_ghost(mob/user)
diff --git a/code/modules/antagonists/clockcult/clock_item.dm b/code/modules/antagonists/clockcult/clock_item.dm
index f403b6f9f1..7c8e877fb3 100644
--- a/code/modules/antagonists/clockcult/clock_item.dm
+++ b/code/modules/antagonists/clockcult/clock_item.dm
@@ -20,5 +20,5 @@
/obj/item/clockwork/examine(mob/user)
if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
desc = clockwork_desc
- ..()
+ . = ..()
desc = initial(desc)
diff --git a/code/modules/antagonists/clockcult/clock_items/clock_components.dm b/code/modules/antagonists/clockcult/clock_items/clock_components.dm
index 561d49e9ac..a9307f15e1 100644
--- a/code/modules/antagonists/clockcult/clock_items/clock_components.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clock_components.dm
@@ -12,7 +12,7 @@
/obj/item/clockwork/component/examine(mob/user)
. = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "You can activate this in your hand to break it down for power. ")
+ . += "You can activate this in your hand to break it down for power. "
/obj/item/clockwork/component/attack_self(mob/living/user)
if(is_servant_of_ratvar(user))
@@ -181,9 +181,9 @@
pixel_y = rand(-sprite_shift, sprite_shift)
/obj/item/clockwork/alloy_shards/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "Can be consumed by a replica fabricator as a source of power. ")
+ . += "Can be consumed by a replica fabricator as a source of power. "
/obj/item/clockwork/alloy_shards/proc/replace_name_desc()
name = "replicant alloy shard"
diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
index 07b4366194..a7fcf0a3b0 100644
--- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
@@ -27,11 +27,11 @@
armour_penetration = initial(armour_penetration)
/obj/item/clockwork/weapon/ratvarian_spear/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "Attacks on living non-Servants will generate [bonus_burn] units of vitality. ")
+ . += "Attacks on living non-Servants will generate [bonus_burn] units of vitality. "
if(!iscyborg(user))
- to_chat(user, "Throwing the spear will do massive damage, break the spear, and knock down the target. ")
+ . += "Throwing the spear will do massive damage, break the spear, and knock down the target. "
/obj/item/clockwork/weapon/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user)
. = ..()
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index 7066109979..58835e0cd4 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -121,15 +121,15 @@
adjust_clockwork_power(0.1) //Slabs serve as very weak power generators on their own (no, not enough to justify spamming them)
/obj/item/clockwork/slab/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
if(LAZYLEN(quickbound))
for(var/i in 1 to quickbound.len)
if(!quickbound[i])
continue
var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
- to_chat(user, "Quickbind button: [initial(quickbind_slot.name)] .")
- to_chat(user, "Available power: [DisplayPower(get_clockwork_power())]. ")
+ . += "Quickbind button: [initial(quickbind_slot.name)] ."
+ . += "Available power: [DisplayPower(get_clockwork_power())]. "
//Slab actions; Hierophant, Quickbind
/obj/item/clockwork/slab/ui_action_click(mob/user, action)
diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
index f53796f02a..43c05b8556 100644
--- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
+++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm
@@ -28,7 +28,7 @@
/obj/item/clockwork/construct_chassis/examine(mob/user)
clockwork_desc = "[clockwork_desc] [construct_desc]"
- ..()
+ . = ..()
clockwork_desc = initial(clockwork_desc)
//ATTACK HAND IGNORING PARENT RETURN VALUE
diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm
index 741b251a4f..0365ae63af 100644
--- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm
+++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm
@@ -44,16 +44,16 @@
speed_multiplier = initial(speed_multiplier)
/obj/item/clockwork/replica_fabricator/examine(mob/living/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "Can be used to replace walls, floors, tables, windows, windoors, and airlocks with Clockwork variants. ")
- to_chat(user, "Can construct Clockwork Walls on Clockwork Floors and deconstruct Clockwork Walls to Clockwork Floors. ")
+ . += "Can be used to replace walls, floors, tables, windows, windoors, and airlocks with Clockwork variants. "
+ . += "Can construct Clockwork Walls on Clockwork Floors and deconstruct Clockwork Walls to Clockwork Floors. "
if(uses_power)
- to_chat(user, "It can consume floor tiles, rods, metal, and plasteel for power at rates of 2:[DisplayPower(POWER_ROD)] , 1:[DisplayPower(POWER_ROD)] , 1:[DisplayPower(POWER_METAL)] , \
- and 1:[DisplayPower(POWER_PLASTEEL)] , respectively. ")
- to_chat(user, "It can also consume brass sheets for power at a rate of 1:[DisplayPower(POWER_FLOOR)] . ")
- to_chat(user, "Use it in-hand to produce 5 brass sheets at a cost of [DisplayPower(POWER_WALL_TOTAL)] power. ")
- to_chat(user, "It has access to [DisplayPower(get_clockwork_power())] of power. ")
+ . += "It can consume floor tiles, rods, metal, and plasteel for power at rates of 2:[DisplayPower(POWER_ROD)] , 1:[DisplayPower(POWER_ROD)] , 1:[DisplayPower(POWER_METAL)] , \
+ and 1:[DisplayPower(POWER_PLASTEEL)] , respectively. "
+ . += "It can also consume brass sheets for power at a rate of 1:[DisplayPower(POWER_FLOOR)] . "
+ . += "Use it in-hand to produce 5 brass sheets at a cost of [DisplayPower(POWER_WALL_TOTAL)] power. "
+ . += "It has access to [DisplayPower(get_clockwork_power())] of power. "
/obj/item/clockwork/replica_fabricator/attack_self(mob/living/user)
if(is_servant_of_ratvar(user))
diff --git a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm
index d47bf4f316..d84338faea 100644
--- a/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm
+++ b/code/modules/antagonists/clockcult/clock_items/soul_vessel.dm
@@ -39,7 +39,7 @@
/obj/item/mmi/posibrain/soul_vessel/examine(mob/user)
if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
desc = clockwork_desc
- ..()
+ . = ..()
desc = initial(desc)
/obj/item/mmi/posibrain/soul_vessel/transfer_personality(mob/candidate)
diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm
index 6268d15d44..9bdf03cbc7 100644
--- a/code/modules/antagonists/clockcult/clock_mobs.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs.dm
@@ -57,7 +57,7 @@
msg += "[addendum]\n"
msg += "*---------* "
- to_chat(user, msg)
+ return list(msg)
/mob/living/simple_animal/hostile/clockwork/proc/examine_info() //Override this on a by-mob basis to have unique examine info
return
diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm
index 300e85e380..13da9c5a42 100644
--- a/code/modules/antagonists/clockcult/clock_structure.dm
+++ b/code/modules/antagonists/clockcult/clock_structure.dm
@@ -43,10 +43,10 @@
var/can_see_clockwork = is_servant_of_ratvar(user) || isobserver(user)
if(can_see_clockwork && clockwork_desc)
desc = clockwork_desc
- ..()
+ . = ..()
desc = initial(desc)
if(unanchored_icon)
- to_chat(user, "[src] is [anchored ? "":"not "]secured to the floor. ")
+ . += "[src] is [anchored ? "":"not "]secured to the floor. "
/obj/structure/destructible/clockwork/examine_status(mob/user)
if(is_servant_of_ratvar(user) || isobserver(user))
@@ -155,12 +155,12 @@
var/inactive_icon = null //icon_state while process() isn't being called
/obj/structure/destructible/clockwork/powered/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
if(!can_access_clockwork_power(src))
- to_chat(user, "It has no access to the power network! Create a sigil of transmission nearby. ")
+ . += "It has no access to the power network! Create a sigil of transmission nearby. "
else
- to_chat(user, "It has access to [DisplayPower(get_clockwork_power())] of power. ")
+ . += "It has access to [DisplayPower(get_clockwork_power())] of power. "
/obj/structure/destructible/clockwork/powered/Destroy()
SSfastprocess.processing -= src
diff --git a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm
index 491f1d24b3..47a37583ba 100644
--- a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm
@@ -16,16 +16,16 @@
return ..()
/obj/structure/destructible/clockwork/trap/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It's wired to:")
+ . += "It's wired to:"
if(!wired_to.len)
- to_chat(user, "Nothing.")
+ . += "Nothing."
else
for(var/V in wired_to)
var/obj/O = V
var/distance = get_dist(src, O)
- to_chat(user, "[O] ([distance == 0 ? "same tile" : "[distance] tiles [dir2text(get_dir(src, O))]"])")
+ . += "[O] ([distance == 0 ? "same tile" : "[distance] tiles [dir2text(get_dir(src, O))]"])"
/obj/structure/destructible/clockwork/trap/wrench_act(mob/living/user, obj/item/I)
if(!is_servant_of_ratvar(user))
diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
index f735d6bb29..297856f531 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
@@ -223,34 +223,34 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/examine(mob/user)
icon_state = "spatial_gateway" //cheat wildly by pretending to have an icon
- ..()
+ . = ..()
icon_state = initial(icon_state)
if(is_servant_of_ratvar(user) || isobserver(user))
if(!active)
- to_chat(user, "Time until the Ark's activation: [DisplayTimeText(get_arrival_time())] ")
+ . += "Time until the Ark's activation: [DisplayTimeText(get_arrival_time())] "
else
if(grace_period)
- to_chat(user, "Crew grace period time remaining: [DisplayTimeText(get_arrival_time())] ")
+ . += "Crew grace period time remaining: [DisplayTimeText(get_arrival_time())] "
else
- to_chat(user, "Time until Ratvar's arrival: [DisplayTimeText(get_arrival_time())] ")
+ . += "Time until Ratvar's arrival: [DisplayTimeText(get_arrival_time())] "
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
- to_chat(user, "The Ark is feeding power into the bluespace field. ")
+ . += "The Ark is feeding power into the bluespace field. "
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
- to_chat(user, "The field is ripping open a copy of itself in Ratvar's prison. ")
+ . += "The field is ripping open a copy of itself in Ratvar's prison. "
if(GATEWAY_RATVAR_COMING to INFINITY)
- to_chat(user, "With the bluespace field established, Ratvar is preparing to come through! ")
+ . += "With the bluespace field established, Ratvar is preparing to come through! "
else
if(!active)
- to_chat(user, "Whatever it is, it doesn't seem to be active. ")
+ . += "Whatever it is, it doesn't seem to be active. "
else
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
- to_chat(user, "You see a swirling bluespace anomaly steadily growing in intensity. ")
+ . += "You see a swirling bluespace anomaly steadily growing in intensity. "
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
- to_chat(user, "The anomaly is stable, and you can see flashes of something from it. ")
+ . += "The anomaly is stable, and you can see flashes of something from it. "
if(GATEWAY_RATVAR_COMING to INFINITY)
- to_chat(user, "The anomaly is stable! Something is coming through! ")
+ . += "The anomaly is stable! Something is coming through! "
/obj/structure/destructible/clockwork/massive/celestial_gateway/process()
if(seconds_until_activation == -1) //we never do anything
diff --git a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
index cb13fdd616..058bd9d24e 100644
--- a/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/clockwork_obelisk.dm
@@ -21,9 +21,9 @@
toggle(1)
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It requires [DisplayPower(hierophant_cost)] to broadcast over the Hierophant Network, and [DisplayPower(gateway_cost)] to open a Spatial Gateway. ")
+ . += "It requires [DisplayPower(hierophant_cost)] to broadcast over the Hierophant Network, and [DisplayPower(gateway_cost)] to open a Spatial Gateway. "
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user, silent)
if(active)
diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
index 3a461b7745..7d8b206f41 100644
--- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm
@@ -47,16 +47,16 @@
STOP_PROCESSING(SSprocessing, src)
/obj/structure/destructible/clockwork/heralds_beacon/examine(mob/user)
- ..()
+ . = ..()
if(isobserver(user) || is_servant_of_ratvar(user))
if(!available)
if(!GLOB.ratvar_approaches)
- to_chat(user, "It can no longer be activated. ")
+ . += "It can no longer be activated. "
else
- to_chat(user, "It has been activated! ")
+ . += "It has been activated! "
else
- to_chat(user, "There are [time_remaining] second[time_remaining != 1 ? "s" : ""] remaining to vote. ")
- to_chat(user, "There are [voters.len]/[votes_needed] votes to activate the beacon! ")
+ . += "There are [time_remaining] second[time_remaining != 1 ? "s" : ""] remaining to vote. "
+ . += "There are [voters.len]/[votes_needed] votes to activate the beacon! "
/obj/structure/destructible/clockwork/heralds_beacon/attack_hand(mob/living/user)
. = ..()
diff --git a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
index df1231442a..9b4ac8085c 100644
--- a/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/mania_motor.dm
@@ -17,9 +17,9 @@
var/mania_cost = 150
/obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
- to_chat(user, "It requires [DisplayPower(mania_cost)] to run. ")
+ . += "It requires [DisplayPower(mania_cost)] to run. "
/obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects)
if(active)
diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm
index 35c1ea7bdd..d0940ebb7a 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm
@@ -25,8 +25,8 @@
return ..()
/obj/structure/destructible/clockwork/ocular_warden/examine(mob/user)
- ..()
- to_chat(user, "[target ? "It's fixated on [target]! " : "Its gaze is wandering aimlessly."] ")
+ . = ..()
+ . += "[target ? "It's fixated on [target]! " : "Its gaze is wandering aimlessly."] "
/obj/structure/destructible/clockwork/ocular_warden/hulk_damage()
return 25
diff --git a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm
index 57f83c55aa..fbaee79959 100644
--- a/code/modules/antagonists/clockcult/clock_structures/stargazer.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/stargazer.dm
@@ -25,11 +25,11 @@
. = ..()
/obj/structure/destructible/clockwork/stargazer/examine(mob/user)
- ..()
+ . = ..()
if(is_servant_of_ratvar(user))
- to_chat(user, "Generates [DisplayPower(STARGAZER_POWER)] per second while viewing starlight within [STARGAZER_RANGE] tiles. ")
+ . += "Generates [DisplayPower(STARGAZER_POWER)] per second while viewing starlight within [STARGAZER_RANGE] tiles. "
if(star_light_star_bright)
- to_chat(user, "[is_servant_of_ratvar(user) ? "It can see starlight! " : "It's shining brilliantly!"]")
+ . += "[is_servant_of_ratvar(user) ? "It can see starlight! " : "It's shining brilliantly!"]"
/obj/structure/destructible/clockwork/stargazer/process()
star_light_star_bright = check_starlight()
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
index ebfb219c9a..2f0db73bfc 100644
--- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
@@ -113,7 +113,7 @@
"You start tenderly lifting [skewee] off of [src]... ")
if(!do_after(user, 60, target = skewee))
skewee.visible_message("[skewee] painfully slides back down [src]. ")
- skewee.emote("moan")
+ skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal")
return
skewee.visible_message("[skewee] comes free of [src] with a squelching pop! ", \
"You come free of [src]! ")
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index fc4d945d51..beea67e596 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -651,7 +651,7 @@
/obj/item/melee/blood_magic/manipulator/examine(mob/user)
. = ..()
if(iscultist(user))
- to_chat(user, "The [name] currently has [uses] blood charges left. ")
+ . += "The [name] currently has [uses] blood charges left. "
/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity)
if(proximity)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 943e76b4ee..5fe941d32f 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -119,10 +119,11 @@
AddComponent(/datum/component/butchering, 50, 80)
/obj/item/twohanded/required/cult_bastard/examine(mob/user)
+ . = ..()
if(contents.len)
- desc+="There are [contents.len] souls trapped within the sword's core. "
+ . += "There are [contents.len] souls trapped within the sword's core. "
else
- desc+=" The sword appears to be quite lifeless."
+ . += " The sword appears to be quite lifeless."
/obj/item/twohanded/required/cult_bastard/can_be_pulled(user)
return FALSE
@@ -557,11 +558,11 @@
var/uses = 4
/obj/item/cult_shift/examine(mob/user)
- ..()
+ . = ..()
if(uses)
- to_chat(user, "It has [uses] use\s remaining. ")
+ . += "It has [uses] use\s remaining. "
else
- to_chat(user, "It seems drained. ")
+ . += "It seems drained. "
/obj/item/cult_shift/proc/handle_teleport_grab(turf/T, mob/user)
var/mob/living/carbon/C = user
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index 0dd6b08c4d..f38f379abe 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -29,10 +29,10 @@
/obj/structure/destructible/cult/examine(mob/user)
- ..()
- to_chat(user, "\The [src] is [anchored ? "":"not "]secured to the floor. ")
+ . = ..()
+ . += "\The [src] is [anchored ? "":"not "]secured to the floor. "
if((iscultist(user) || isobserver(user)) && cooldowntime > world.time)
- to_chat(user, "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)]. ")
+ . += "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)]. "
/obj/structure/destructible/cult/examine_status(mob/user)
if(iscultist(user) || isobserver(user))
diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm
index b9e4da8677..ff12a835ef 100644
--- a/code/modules/antagonists/cult/ritual.dm
+++ b/code/modules/antagonists/cult/ritual.dm
@@ -15,12 +15,12 @@ This file contains the cult dagger and rune list code
GLOB.rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
/obj/item/melee/cultblade/dagger/examine(mob/user)
- ..()
+ . = ..()
if(iscultist(user) || isobserver(user))
- to_chat(user, "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar'Sie. ")
- to_chat(user, "Striking a cult structure will unanchor or reanchor it. ")
- to_chat(user, "Striking another cultist with it will purge holy water from them. ")
- to_chat(user, "Striking a noncultist, however, will tear their flesh. ")
+ . += "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar'Sie. "
+ . += "Striking a cult structure will unanchor or reanchor it. "
+ . += "Striking another cultist with it will purge holy water from them. "
+ . += "Striking a noncultist, however, will tear their flesh. "
/obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user)
if(iscultist(M))
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 1cbf267277..da002e568c 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -47,13 +47,13 @@ Runes can either be invoked by one's self or with many different cultists. Each
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cult_runes", I)
/obj/effect/rune/examine(mob/user)
- ..()
+ . = ..()
if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
- to_chat(user, "Name: [cultist_name]")
- to_chat(user, "Effects: [capitalize(cultist_desc)]")
- to_chat(user, "Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]")
+ . += "Name: [cultist_name]"
+ . += "Effects: [capitalize(cultist_desc)]"
+ . += "Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]"
if(req_keyword && keyword)
- to_chat(user, "Keyword: [keyword]")
+ . += "Keyword: [keyword]"
/obj/effect/rune/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user))
@@ -525,10 +525,10 @@ structure_check() searches for nearby cultist structures required for the invoca
var/static/revives_used = -SOULS_TO_REVIVE // Cultists get one "free" revive
/obj/effect/rune/raise_dead/examine(mob/user)
- ..()
+ . = ..()
if(iscultist(user) || user.stat == DEAD)
var/revive_number = LAZYLEN(GLOB.sacrificed) - revives_used
- to_chat(user, "Revives Remaining: [revive_number]")
+ . += "Revives Remaining: [revive_number]"
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
var/turf/T = get_turf(src)
@@ -622,11 +622,11 @@ structure_check() searches for nearby cultist structures required for the invoca
GLOB.wall_runes += src
/obj/effect/rune/wall/examine(mob/user)
- ..()
+ . = ..()
if(density && iscultist(user))
var/datum/timedevent/TMR = active_timers[1]
if(TMR)
- to_chat(user, "The air above this rune has hardened into a barrier that will last [DisplayTimeText(TMR.timeToRun - world.time)]. ")
+ . += "The air above this rune has hardened into a barrier that will last [DisplayTimeText(TMR.timeToRun - world.time)]. "
/obj/effect/rune/wall/Destroy()
GLOB.wall_runes -= src
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
index 06200073bb..fc50a0ecf5 100644
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm
@@ -64,26 +64,25 @@
/mob/living/carbon/true_devil/examine(mob/user)
- var/msg = "*---------*\nThis is [icon2html(src, user)] [src] !\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] [src] !")
//Left hand items
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
- msg += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
+ . += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
//Braindead
if(!client && stat != DEAD)
- msg += "The devil seems to be in deep contemplation.\n"
+ . += "The devil seems to be in deep contemplation."
//Damaged
if(stat == DEAD)
- msg += "The hellfire seems to have been extinguished, for now at least. \n"
+ . += "The hellfire seems to have been extinguished, for now at least. "
else if(health < (maxHealth/10))
- msg += "You can see hellfire inside its gaping wounds. \n"
+ . += "You can see hellfire inside its gaping wounds. "
else if(health < (maxHealth/2))
- msg += "You can see hellfire inside its wounds. \n"
- msg += "*---------* "
- to_chat(user, msg)
+ . += "You can see hellfire inside its wounds. "
+ . += "*---------* "
/mob/living/carbon/true_devil/IsAdvancedToolUser()
return 1
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
index 836b71b89a..6ac3f93764 100644
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -97,14 +97,14 @@ the new instance inside the host to be updated to the template's stats.
/mob/camera/disease/examine(mob/user)
- ..()
+ . = ..()
if(isobserver(user))
- to_chat(user, "[src] has [points]/[total_points] adaptation points. ")
- to_chat(user, "[src] has the following unlocked: ")
+ . += "[src] has [points]/[total_points] adaptation points. "
+ . += "[src] has the following unlocked: "
for(var/A in purchased_abilities)
var/datum/disease_ability/B = A
if(istype(B))
- to_chat(user, "[B.name] ")
+ . += "[B.name] "
/mob/camera/disease/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
return
diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm
index 12f8d22897..ad2eb4792a 100644
--- a/code/modules/antagonists/morph/morph.dm
+++ b/code/modules/antagonists/morph/morph.dm
@@ -52,12 +52,11 @@
/mob/living/simple_animal/hostile/morph/examine(mob/user)
if(morphed)
- form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it
+ . = form.examine(user)
if(get_dist(user,src)<=3)
- to_chat(user, "It doesn't look quite right... ")
+ . += "It doesn't look quite right... "
else
- ..()
- return
+ . = ..()
/mob/living/simple_animal/hostile/morph/med_hud_set_health()
if(morphed && !isliving(form))
diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm
new file mode 100644
index 0000000000..e25e0cd164
--- /dev/null
+++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm
@@ -0,0 +1,181 @@
+/obj/item/borg_chameleon
+ name = "cyborg chameleon projector"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "shield0"
+ flags_1 = CONDUCT_1
+ item_flags = NOBLUDGEON
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ w_class = WEIGHT_CLASS_SMALL
+ var/friendlyName
+ var/savedName
+ var/active = FALSE
+ var/activationCost = 300
+ var/activationUpkeep = 50
+ var/disguise = null
+ var/disguise_icon_override = null
+ var/disguise_pixel_offset = null
+ var/mob/listeningTo
+ var/static/list/signalCache = list( // list here all signals that should break the camouflage
+ COMSIG_PARENT_ATTACKBY,
+ COMSIG_ATOM_ATTACK_HAND,
+ COMSIG_MOVABLE_IMPACT_ZONE,
+ COMSIG_ATOM_BULLET_ACT,
+ COMSIG_ATOM_EX_ACT,
+ COMSIG_ATOM_FIRE_ACT,
+ COMSIG_ATOM_EMP_ACT,
+ )
+ var/mob/living/silicon/robot/user // needed for process()
+ var/animation_playing = FALSE
+
+ var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
+
+
+/obj/item/borg_chameleon/Initialize()
+ . = ..()
+ friendlyName = pick(GLOB.ai_names)
+
+/obj/item/borg_chameleon/Destroy()
+ listeningTo = null
+ return ..()
+
+/obj/item/borg_chameleon/dropped(mob/user)
+ . = ..()
+ disrupt(user)
+
+/obj/item/borg_chameleon/equipped(mob/user)
+ . = ..()
+ disrupt(user)
+
+/obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/user)
+ if (user && user.cell && user.cell.charge > activationCost)
+ if (isturf(user.loc))
+ toggle(user)
+ else
+ to_chat(user, "You can't use [src] while inside something! ")
+ else
+ to_chat(user, "You need at least [activationCost] charge in your cell to use [src]! ")
+
+/obj/item/borg_chameleon/proc/toggle(mob/living/silicon/robot/user)
+ if(active)
+ playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6)
+ to_chat(user, "You deactivate \the [src]. ")
+ deactivate(user)
+ else
+ if(animation_playing)
+ to_chat(user, "\the [src] is recharging. ")
+ return
+ var/borg_icon = input(user, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ disguise = "engineer"
+ disguise_icon_override = 'icons/mob/robots.dmi'
+ if("Default - Treads")
+ disguise = "engi-tread"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Loader")
+ disguise = "loaderborg"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Handy")
+ disguise = "handyeng"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Sleek")
+ disguise = "sleekeng"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Can")
+ disguise = "caneng"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Marina")
+ disguise = "marinaeng"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Spider")
+ disguise = "spidereng"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Heavy")
+ disguise = "heavyeng"
+ disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Pup Dozer")
+ disguise = "pupdozer"
+ disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ disguise_pixel_offset = -16
+ if("Vale")
+ disguise = "valeeng"
+ disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ disguise_pixel_offset = -16
+ animation_playing = TRUE
+ to_chat(user, "You activate \the [src]. ")
+ playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6)
+ var/start = user.filters.len
+ var/X,Y,rsq,i,f
+ for(i=1, i<=7, ++i)
+ do
+ X = 60*rand() - 30
+ Y = 60*rand() - 30
+ rsq = X*X + Y*Y
+ while(rsq<100 || rsq>900)
+ user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand())
+ for(i=1, i<=7, ++i)
+ f = user.filters[start+i]
+ animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL)
+ animate(offset=f:offset-1, time=rand()*20+10)
+ if (do_after(user, 50, target=user) && user.cell.use(activationCost))
+ playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6)
+ to_chat(user, "You are now disguised as the Nanotrasen engineering borg \"[friendlyName]\". ")
+ activate(user)
+ else
+ to_chat(user, "The chameleon field fizzles. ")
+ do_sparks(3, FALSE, user)
+ for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first
+ f = user.filters[start+i]
+ animate(f)
+ user.filters = null
+ animation_playing = FALSE
+
+/obj/item/borg_chameleon/process()
+ if (user)
+ if (!user.cell || !user.cell.use(activationUpkeep))
+ disrupt(user)
+ else
+ return PROCESS_KILL
+
+/obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/user)
+ START_PROCESSING(SSobj, src)
+ src.user = user
+ savedName = user.name
+ user.name = friendlyName
+ user.module.cyborg_base_icon = disguise
+ user.module.cyborg_icon_override = disguise_icon_override
+ user.module.cyborg_pixel_offset = disguise_pixel_offset
+ user.bubble_icon = "robot"
+ active = TRUE
+ user.update_icons()
+
+ if(listeningTo == user)
+ return
+ if(listeningTo)
+ UnregisterSignal(listeningTo, signalCache)
+ RegisterSignal(user, signalCache, .proc/disrupt)
+ listeningTo = user
+
+/obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/user)
+ STOP_PROCESSING(SSobj, src)
+ if(listeningTo)
+ UnregisterSignal(listeningTo, signalCache)
+ listeningTo = null
+ do_sparks(5, FALSE, user)
+ user.name = savedName
+ user.module.cyborg_base_icon = initial(user.module.cyborg_base_icon)
+ user.module.cyborg_icon_override = 'icons/mob/robots.dmi'
+ user.bubble_icon = "syndibot"
+ active = FALSE
+ user.update_icons()
+ user.pixel_x = 0 //this solely exists because of dogborgs. I want anyone who ever reads this code later on to know this. Don't ask me why it's here, doesn't work above update_icons()
+ src.user = user
+
+/obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/user)
+ if(active)
+ to_chat(user, "Your chameleon field deactivates. ")
+ deactivate(user)
\ No newline at end of file
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index d0e6dafbc1..8021ee5f08 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -55,9 +55,9 @@
/obj/machinery/nuclearbomb/examine(mob/user)
. = ..()
if(exploding)
- to_chat(user, "It is in the process of exploding. Perhaps reviewing your affairs is in order.")
+ . += "It is in the process of exploding. Perhaps reviewing your affairs is in order."
if(timing)
- to_chat(user, "There are [get_time_left()] seconds until detonation.")
+ . += "There are [get_time_left()] seconds until detonation."
/obj/machinery/nuclearbomb/selfdestruct
name = "station self-destruct terminal"
@@ -472,9 +472,9 @@
/obj/machinery/nuclearbomb/beer/examine(mob/user)
. = ..()
if(keg.reagents.total_volume)
- to_chat(user, "It has [keg.reagents.total_volume] unit\s left. ")
+ . += "It has [keg.reagents.total_volume] unit\s left. "
else
- to_chat(user, "It's empty. ")
+ . += "It's empty. "
/obj/machinery/nuclearbomb/beer/attackby(obj/item/W, mob/user, params)
if(W.is_refillable())
@@ -615,7 +615,7 @@ This is here to make the tiles around the station mininuke change when it's arme
var/captain = user.mind && user.mind.assigned_role == "Captain"
var/nukie = user.mind && user.mind.has_antag_datum(/datum/antagonist/nukeop)
if(ghost || captain || nukie)
- to_chat(user, "The serial numbers on [src] are incorrect. ")
+ . += "The serial numbers on [src] are incorrect. "
/obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/claymore/highlander) && !fake)
diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm
index 538feba008..db9ff4e609 100644
--- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm
+++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm
@@ -2,7 +2,7 @@
var/mode = TRACK_NUKE_DISK
/obj/item/pinpointer/nuke/examine(mob/user)
- ..()
+ . = ..()
var/msg = "Its tracking indicator reads "
switch(mode)
if(TRACK_NUKE_DISK)
@@ -13,10 +13,10 @@
msg += "\"vasvygengbefuvc\"."
else
msg = "Its tracking indicator is blank."
- to_chat(user, msg)
+ . += msg
for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines)
if(bomb.timing)
- to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()].")
+ . += "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()]."
/obj/item/pinpointer/nuke/process()
..()
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index b43024fb31..d7d88a9b6a 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -368,11 +368,11 @@
scatter()
/obj/item/ectoplasm/revenant/examine(mob/user)
- ..()
+ . = ..()
if(inert)
- to_chat(user, "It seems inert. ")
+ . += "It seems inert. "
else if(reforming)
- to_chat(user, "It is shifting and distorted. It would be wise to destroy this. ")
+ . += "It is shifting and distorted. It would be wise to destroy this. "
/obj/item/ectoplasm/revenant/proc/reform()
if(QDELETED(src) || QDELETED(revenant) || inert)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 26eea3f59e..8c0f61bb1d 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -49,6 +49,12 @@
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
+/datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args)
+ var/message = hearing_args[HEARING_MESSAGE]
+ message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1 ")
+ message = GLOB.syndicate_code_response_regex.Replace(message, "$1 ")
+ hearing_args[HEARING_MESSAGE] = message
+
SSticker.mode.traitors -= owner
if(!silent && owner.current)
to_chat(owner.current," You are no longer the [special_role]! ")
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index f14872a0a4..a0dbc4d9b1 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -383,7 +383,9 @@
if(!istype(user) || on_cooldown)
return
var/turf/T = get_turf(user)
- if(!T)
+ var/area/A = get_area(user)
+ if(!T || !A || A.noteleport)
+ to_chat(user, "You play \the [src], yet no sound comes out of it... Looks like it won't work here. ")
return
on_cooldown = TRUE
last_user = user
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index 6f4c3fca10..962c2b2da4 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -35,15 +35,15 @@
to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly. ")
/obj/item/soulstone/examine(mob/user)
- ..()
+ . = ..()
if(usability || iscultist(user) || iswizard(user) || isobserver(user))
if (old_shard)
- to_chat(user, "A soulstone, used to capture a soul, either from dead humans or from freed shades. ")
+ . += "A soulstone, used to capture a soul, either from dead humans or from freed shades. "
else
- to_chat(user, "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades. ")
- to_chat(user, "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade. ")
+ . += "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades. "
+ . += "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade. "
if(spent)
- to_chat(user, "This shard is spent; it is now just a creepy rock. ")
+ . += "This shard is spent; it is now just a creepy rock. "
/obj/item/soulstone/Destroy() //Stops the shade from being qdel'd immediately and their ghost being sent back to the arrival shuttle.
for(var/mob/living/simple_animal/shade/A in src)
@@ -102,13 +102,13 @@
desc = "A wicked machine used by those skilled in magical arts. It is inactive."
/obj/structure/constructshell/examine(mob/user)
- ..()
+ . = ..()
if(iscultist(user) || iswizard(user) || user.stat == DEAD)
- to_chat(user, "A construct shell, used to house bound souls from a soulstone. ")
- to_chat(user, "Placing a soulstone with a soul into this shell allows you to produce your choice of the following: ")
- to_chat(user, "An Artificer , which can produce more shells and soulstones , as well as fortifications. ")
- to_chat(user, "A Wraith , which does high damage and can jaunt through walls, though it is quite fragile. ")
- to_chat(user, "A Juggernaut , which is very hard to kill and can produce temporary walls, but is slow. ")
+ . += "A construct shell, used to house bound souls from a soulstone. "
+ . += "Placing a soulstone with a soul into this shell allows you to produce your choice of the following: "
+ . += "An Artificer , which can produce more shells and soulstones , as well as fortifications. "
+ . += "A Wraith , which does high damage and can jaunt through walls, though it is quite fragile. "
+ . += "A Juggernaut , which is very hard to kill and can produce temporary walls, but is slow. "
/obj/structure/constructshell/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/soulstone))
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 52d18a37d9..c5308cf0c0 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -11,12 +11,18 @@
var/buy_word = "Learn"
var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook
var/list/no_coexistance_typecache //Used so you can't have specific spells together
+ var/dynamic_cost = 0 // How much threat the spell costs to purchase for dynamic.
+ var/dynamic_requirement = 0 // How high the threat level needs to be for purchasing in dynamic.
/datum/spellbook_entry/New()
..()
no_coexistance_typecache = typecacheof(no_coexistance_typecache)
/datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied
+ if(istype(SSticker.mode,/datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ if(dynamic_requirement > 0 && mode.threat_level < dynamic_requirement)
+ return 0
return 1
/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances
@@ -25,6 +31,10 @@
for(var/spell in user.mind.spell_list)
if(is_type_in_typecache(spell, no_coexistance_typecache))
return 0
+ if(dynamic_cost>0 && istype(SSticker.mode,/datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ if(mode.threat < dynamic_cost)
+ return 0
return 1
/datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success
@@ -60,6 +70,10 @@
SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]"))
return 1
//No same spell found - just learn it
+ if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ mode.spend_threat(dynamic_cost)
+ mode.log_threat("Wizard spent [dynamic_cost] on [name].")
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
user.mind.AddSpell(S)
to_chat(user, "You have learned [S.name]. ")
@@ -83,6 +97,10 @@
if(!S)
S = new spell_type()
var/spell_levels = 0
+ if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ mode.refund_threat(dynamic_cost)
+ mode.log_threat("Wizard refunded [dynamic_cost] on [name].")
for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list)
if(initial(S.name) == initial(aspell.name))
spell_levels = aspell.spell_level
@@ -285,20 +303,8 @@
name = "Staff of Change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
item_path = /obj/item/gun/magic/staff/change
-
-/datum/spellbook_entry/item/staffchange/IsAvailible()
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < CONFIG_GET(number/dynamic_staff_of_change_requirement))
- return 0
-
-/datum/spellbook_entry/item/staffchange/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(number/dynamic_staff_of_change_cost)
- mode.spend_threat(threat_spent)
- mode.log_threat("Wizard spent [threat_spent] on staff of change.")
- return ..()
+ dynamic_requirement = 60
+ dynamic_cost = 20
/datum/spellbook_entry/item/staffanimation
name = "Staff of Animation"
@@ -383,20 +389,8 @@
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
item_path = /obj/item/antag_spawner/contract
category = "Assistance"
-
-/datum/spellbook_entry/item/contract/IsAvailible()
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < CONFIG_GET(number/dynamic_apprentice_cost))
- return 0
-
-/datum/spellbook_entry/item/contract/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(number/dynamic_apprentice_cost)
- mode.spend_threat(threat_spent)
- mode.log_threat("Wizard spent [threat_spent] on apprentice contract.")
- return ..()
+ dynamic_requirement = 50
+ dynamic_cost = 10
/datum/spellbook_entry/item/guardian
name = "Guardian Deck"
@@ -416,20 +410,11 @@
item_path = /obj/item/antag_spawner/slaughter_demon
limit = 3
category = "Assistance"
+ dynamic_requirement = 60
-/datum/spellbook_entry/item/bloodbottle/IsAvailible()
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"])
- return 0
-
-/datum/spellbook_entry/item/bloodbottle/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]
- mode.spend_threat(threat_spent)
- mode.log_threat("Wizard spent [threat_spent] on slaughter demon.")
- return ..()
+/datum/spellbook_entry/item/bloodbottle/New()
+ ..()
+ dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]
/datum/spellbook_entry/item/hugbottle
name = "Bottle of Tickles"
@@ -444,20 +429,11 @@
cost = 1 //non-destructive; it's just a jape, sibling!
limit = 3
category = "Assistance"
+ dynamic_requirement = 40
-/datum/spellbook_entry/item/hugbottle/IsAvailible()
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < round(CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]/3))
- return 0
-
-/datum/spellbook_entry/item/hugbottle/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]/3
- mode.spend_threat(threat_spent)
- mode.log_threat("Wizard spent [threat_spent] on laughter demon.")
- return ..()
+/datum/spellbook_entry/item/hugbottle/New()
+ ..()
+ dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]/3
/datum/spellbook_entry/item/mjolnir
name = "Mjolnir"
@@ -521,7 +497,7 @@
if(!SSticker.mode)
return FALSE
else
- return TRUE
+ return ..()
/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
@@ -534,15 +510,13 @@
/datum/spellbook_entry/summon/guns
name = "Summon Guns"
desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!"
+ dynamic_cost = 10
+ dynamic_requirement = 60
/datum/spellbook_entry/summon/guns/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
return 0
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < CONFIG_GET(number/dynamic_summon_guns_requirement))
- return 0
- return !CONFIG_GET(flag/no_summon_guns)
+ return (!CONFIG_GET(flag/no_summon_guns) && ..())
/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
@@ -552,7 +526,7 @@
to_chat(user, "You have cast summon guns! ")
if(istype(SSticker.mode,/datum/game_mode/dynamic))
var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(number/dynamic_summon_guns_cost)
+ var/threat_spent = dynamic_cost
mode.spend_threat(threat_spent)
mode.log_threat("Wizard spent [threat_spent] on summon guns.")
return 1
@@ -560,15 +534,13 @@
/datum/spellbook_entry/summon/magic
name = "Summon Magic"
desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time."
+ dynamic_cost = 10
+ dynamic_requirement = 60
/datum/spellbook_entry/summon/magic/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
return 0
- if(istype(SSticker.mode,/datum/game_mode/dynamic))
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < CONFIG_GET(number/dynamic_summon_magic_requirement))
- return 0
- return !CONFIG_GET(flag/no_summon_magic)
+ return (!CONFIG_GET(flag/no_summon_guns) && ..())
/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
@@ -578,7 +550,7 @@
to_chat(user, "You have cast summon magic! ")
if(istype(SSticker.mode,/datum/game_mode/dynamic))
var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(number/dynamic_summon_magic_cost)
+ var/threat_spent = dynamic_cost
mode.spend_threat(threat_spent)
mode.log_threat("Wizard spent [threat_spent] on summon magic.")
return 1
@@ -586,28 +558,26 @@
/datum/spellbook_entry/summon/events
name = "Summon Events"
desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events."
+ dynamic_cost = 20
+ dynamic_requirement = 60
var/times = 0
/datum/spellbook_entry/summon/events/IsAvailible()
if(!SSticker.mode) // In case spellbook is placed on map
return 0
- if(istype(SSticker.mode,/datum/game_mode/dynamic) && times == 0)
- var/datum/game_mode/dynamic/mode = SSticker.mode
- if(mode.threat < CONFIG_GET(number/dynamic_summon_events_requirement))
- return 0
- return !CONFIG_GET(flag/no_summon_events)
+ return (!CONFIG_GET(flag/no_summon_events) && ..())
/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
summonevents()
+ if(istype(SSticker.mode,/datum/game_mode/dynamic) && times == 0)
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ var/threat_spent = dynamic_cost
+ mode.spend_threat(threat_spent)
+ mode.log_threat("Wizard spent [threat_spent] on summon events.")
times++
playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1)
to_chat(user, "You have cast summon events. ")
- if(istype(SSticker.mode,/datum/game_mode/dynamic) && times == 0)
- var/datum/game_mode/dynamic/mode = SSticker.mode
- var/threat_spent = CONFIG_GET(number/dynamic_summon_events_cost)
- mode.spend_threat(threat_spent)
- mode.log_threat("Wizard spent [threat_spent] on summon events.")
return 1
/datum/spellbook_entry/summon/events/GetInfo()
@@ -632,11 +602,11 @@
var/list/categories = list()
/obj/item/spellbook/examine(mob/user)
- ..()
+ . = ..()
if(owner)
- to_chat(user, "There is a small signature on the front cover: \"[owner]\".")
+ . += "There is a small signature on the front cover: \"[owner]\"."
else
- to_chat(user, "It appears to have no author.")
+ . += "It appears to have no author."
/obj/item/spellbook/Initialize()
. = ..()
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 89324f0691..9b2532c71b 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -165,7 +165,7 @@
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if(APPRENTICE_BLUESPACE)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if(APPRENTICE_HEALING)
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 1e7a9b7c15..d9a61ee2f3 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -112,8 +112,8 @@
return TRUE
/obj/item/assembly/examine(mob/user)
- ..()
- to_chat(user, "\The [src] [secured? "is secured and ready to be used!" : "can be attached to other things."] ")
+ . = ..()
+ . += "\The [src] [secured? "is secured and ready to be used!" : "can be attached to other things."] "
/obj/item/assembly/attack_self(mob/user)
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index 04b4e3ed3c..1c9c1a0203 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -8,9 +8,9 @@
var/cooldown = FALSE //Door cooldowns
/obj/item/assembly/control/examine(mob/user)
- ..()
+ . = ..()
if(id)
- to_chat(user, "Its channel ID is '[id]'. ")
+ . += "Its channel ID is '[id]'. "
/obj/item/assembly/control/activate()
cooldown = TRUE
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index 782d729ce4..3fca066f86 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -11,8 +11,8 @@
var/alarm_health = HEALTH_THRESHOLD_CRIT
/obj/item/assembly/health/examine(mob/user)
- ..()
- to_chat(user, "Use a multitool to swap between \"detect death\" mode and \"detect critical state\" mode. ")
+ . = ..()
+ . += "Use a multitool to swap between \"detect death\" mode and \"detect critical state\" mode. "
/obj/item/assembly/health/activate()
if(!..())
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index caa8418fc9..707ebcbb1a 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -38,8 +38,8 @@
. = ..()
/obj/item/assembly/infra/examine(mob/user)
- ..()
- to_chat(user, "The infrared trigger is [on?"on":"off"]. ")
+ . = ..()
+ . += "The infrared trigger is [on?"on":"off"]. "
/obj/item/assembly/infra/activate()
if(!..())
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index a2a9fb0105..950c0dd109 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -9,8 +9,8 @@
/obj/item/assembly/mousetrap/examine(mob/user)
- ..()
- to_chat(user, "The pressure plate is [armed?"primed":"safe"]. ")
+ . = ..()
+ . += "The pressure plate is [armed?"primed":"safe"]. "
/obj/item/assembly/mousetrap/activate()
if(..())
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 97b4543a05..97359f07fc 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -21,8 +21,8 @@
. = ..()
/obj/item/assembly/prox_sensor/examine(mob/user)
- ..()
- to_chat(user, "The proximity sensor is [timing ? "arming" : (scanning ? "armed" : "disarmed")]. ")
+ . = ..()
+ . += "The proximity sensor is [timing ? "arming" : (scanning ? "armed" : "disarmed")]. "
/obj/item/assembly/prox_sensor/activate()
if(!..())
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 8ba703d7fa..7377ab318e 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -169,8 +169,8 @@ Code:
return TRUE
/obj/item/assembly/signaler/receiver/examine(mob/user)
- ..()
- to_chat(user, "The radio receiver is [on?"on":"off"]. ")
+ . = ..()
+ . += "The radio receiver is [on?"on":"off"]. "
/obj/item/assembly/signaler/receiver/receive_signal(datum/signal/signal)
if(!on)
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 993bf134e6..660ff39c6c 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -31,8 +31,8 @@
. = ..()
/obj/item/assembly/timer/examine(mob/user)
- ..()
- to_chat(user, "The timer is [timing ? "counting down from [time]":"set for [time] seconds"]. ")
+ . = ..()
+ . += "The timer is [timing ? "counting down from [time]":"set for [time] seconds"]. "
/obj/item/assembly/timer/activate()
if(!..())
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 32148abc21..7ad5f827e1 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -22,8 +22,8 @@
"voice sensor")
/obj/item/assembly/voice/examine(mob/user)
- ..()
- to_chat(user, "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode. ")
+ . = ..()
+ . += "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode. "
/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
. = ..()
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index d1da05e42d..c47c4a44af 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -199,7 +199,7 @@
var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE
for(var/t in location.atmos_adjacent_turfs)
var/turf/open/T = t
- if(T.active_hotspot)
+ if(!T.active_hotspot)
T.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
else
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index 9dba780b3f..cafdafb671 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -15,7 +15,7 @@
//used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...)
//string parsed by /datum/gas/proc/copy_from_turf
- var/initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ var/initial_gas_mix = OPENTURF_DEFAULT_ATMOS
//approximation of MOLES_O2STANDARD and MOLES_N2STANDARD pending byond allowing constant expressions to be embedded in constant strings
// If someone will place 0 of some gas there, SHIT WILL BREAK. Do not do that.
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 6ca25c0d80..58ab9c6183 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -222,11 +222,11 @@
. = ..()
switch(buildstage)
if(0)
- to_chat(user, "It is missing air alarm electronics. ")
+ . += "It is missing air alarm electronics. "
if(1)
- to_chat(user, "It is missing wiring. ")
+ . += "It is missing wiring. "
if(2)
- to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] the interface. ")
+ . += "Alt-click to [locked ? "unlock" : "lock"] the interface. "
/obj/machinery/airalarm/ui_status(mob/user)
if(user.has_unlimited_silicon_privilege && aidisabled)
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 702c31b55c..2e4cccf5a3 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -41,11 +41,11 @@ Pipelines + Other Objects -> Pipe network
var/on = FALSE
/obj/machinery/atmospherics/examine(mob/user)
- ..()
+ . = ..()
if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user))
var/mob/living/L = user
if(L.ventcrawler)
- to_chat(L, "Alt-click to crawl through it. ")
+ . += "Alt-click to crawl through it. "
/obj/machinery/atmospherics/New(loc, process = TRUE, setdir)
if(!isnull(setdir))
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index 1de5b93332..b95b15efbd 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -30,8 +30,8 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/pump/examine(mob/user)
. = ..()
- to_chat(user,"You can hold Ctrl and click on it to toggle it on and off. ")
- to_chat(user,"You can hold Alt and click on it to maximize its pressure. ")
+ . += "You can hold Ctrl and click on it to toggle it on and off. "
+ . += "You can hold Alt and click on it to maximize its pressure. "
/obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user)
var/area/A = get_area(src)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 3a2321c395..e9fa52fd23 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -30,8 +30,8 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/volume_pump/examine(mob/user)
. = ..()
- to_chat(user,"You can hold Ctrl and click on it to toggle it on and off. ")
- to_chat(user,"You can hold Alt and click on it to maximize its pressure. ")
+ . += "You can hold Ctrl and click on it to toggle it on and off. "
+ . += "You can hold Alt and click on it to maximize its pressure. "
/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user)
var/area/A = get_area(src)
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index ac05c94a78..6b0465d589 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -14,8 +14,8 @@
/obj/machinery/atmospherics/components/trinary/filter/examine(mob/user)
. = ..()
- to_chat(user,"You can hold Ctrl and click on it to toggle it on and off. ")
- to_chat(user,"You can hold Alt and click on it to maximize its pressure. ")
+ . += "You can hold Ctrl and click on it to toggle it on and off. "
+ . += "You can hold Alt and click on it to maximize its pressure. "
/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user)
var/area/A = get_area(src)
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index fc866c3d6a..9e4deaf3d8 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -16,8 +16,8 @@
//node 3 is the outlet, nodes 1 & 2 are intakes
/obj/machinery/atmospherics/components/trinary/mixer/examine(mob/user)
. = ..()
- to_chat(user,"You can hold Ctrl and click on it to toggle it on and off. ")
- to_chat(user,"You can hold Alt and click on it to maximize its pressure. ")
+ . += "You can hold Ctrl and click on it to toggle it on and off. "
+ . += "You can hold Alt and click on it to maximize its pressure. "
/obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user)
var/area/A = get_area(src)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index f52453e2c8..ca8b21593f 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -262,14 +262,14 @@
open_machine()
/obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user)
- ..()
+ . = ..()
if(occupant)
if(on)
- to_chat(user, "Someone's inside [src]!")
+ . += "Someone's inside [src]!"
else
- to_chat(user, "You can barely make out a form floating in [src].")
+ . += "You can barely make out a form floating in [src]."
else
- to_chat(user, "[src] seems empty.")
+ . += "[src] seems empty."
/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 5b37242c78..75f2a60f80 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -424,9 +424,9 @@
return FALSE
/obj/machinery/atmospherics/components/unary/vent_pump/examine(mob/user)
- ..()
+ . = ..()
if(welded)
- to_chat(user, "It seems welded shut.")
+ . += "It seems welded shut."
/obj/machinery/atmospherics/components/unary/vent_pump/power_change()
..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 7f40630a86..8585471ea4 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -118,7 +118,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/broadcast_status()
if(!radio_connection)
return FALSE
-
+
var/list/f_types = list()
for(var/path in GLOB.meta_gas_ids)
f_types += list(list("gas_id" = GLOB.meta_gas_ids[path], "gas_name" = GLOB.meta_gas_names[path], "enabled" = (path in filter_types)))
@@ -205,7 +205,7 @@
air_contents.merge(filtered_out)
tile.assume_air(removed)
tile.air_update_turf()
-
+
else //Just siphoning all air
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
@@ -303,11 +303,11 @@
if(. && on && is_operational())
to_chat(user, "You cannot unwrench [src], turn it off first! ")
return FALSE
-
+
/obj/machinery/atmospherics/components/unary/vent_scrubber/examine(mob/user)
- ..()
+ . = ..()
if(welded)
- to_chat(user, "It seems welded shut.")
+ . += "It seems welded shut."
/obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through()
return !welded
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index b10ff85ba0..d0c78d21b3 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -111,8 +111,8 @@
. = "The connect error light is blinking."
/obj/machinery/meter/examine(mob/user)
- ..()
- to_chat(user, status())
+ . = ..()
+ . += status()
/obj/machinery/meter/wrench_act(mob/user, obj/item/I)
to_chat(user, "You begin to unfasten \the [src]... ")
diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm
index adb17b4e94..c90d388a1d 100644
--- a/code/modules/atmospherics/machinery/other/miner.dm
+++ b/code/modules/atmospherics/machinery/other/miner.dm
@@ -33,9 +33,9 @@
set_active(active) //Force overlay update.
/obj/machinery/atmospherics/miner/examine(mob/user)
- ..()
+ . = ..()
if(broken)
- to_chat(user, "Its debug output is printing \"[broken_message]\".")
+ . += "Its debug output is printing \"[broken_message]\"."
/obj/machinery/atmospherics/miner/proc/check_operation()
if(!active)
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index b575639246..81540b0698 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -88,10 +88,10 @@
replace_tank(user, TRUE)
/obj/machinery/portable_atmospherics/examine(mob/user)
- ..()
+ . = ..()
if(holding)
- to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it. ")
- to_chat(user, "Click [src] with another gas tank to hot swap [holding]. ")
+ . += "\The [src] contains [holding]. Alt-click [src] to remove it. "
+ . += "Click [src] with another gas tank to hot swap [holding]. "
/obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank)
if(holding)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 84f08197b4..bd4e716357 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -487,7 +487,7 @@
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_hand = /obj/item/gun/ballistic/automatic/laser/ctf
-/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
+/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
var/list/no_drops = list()
@@ -529,7 +529,7 @@
r_hand = /obj/item/gun/energy/laser/instakill/blue
shoes = /obj/item/clothing/shoes/jackboots/fast
-/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H)
+/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/obj/item/radio/R = H.ears
R.set_frequency(FREQ_CTF_RED)
@@ -537,7 +537,7 @@
R.independent = TRUE
H.dna.species.stunmod = 0
-/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H)
+/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/obj/item/radio/R = H.ears
R.set_frequency(FREQ_CTF_BLUE)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index a0b917a87b..0d5fa6bc8a 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -440,7 +440,7 @@
uniform = /obj/item/clothing/under/pants/youngfolksjeans
id = /obj/item/card/id
-/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index 7cb771737e..aa1abe56b4 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -154,7 +154,7 @@
//liquid plasma!!!!!!//
/turf/open/floor/plasteel/dark/snowdin
- initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ initial_gas_mix = FROZEN_ATMOS
planetary_atmos = 1
temperature = 180
diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm
index 42b6016552..9c523c194f 100644
--- a/code/modules/cargo/export_scanner.dm
+++ b/code/modules/cargo/export_scanner.dm
@@ -12,9 +12,9 @@
var/obj/machinery/computer/cargo/cargo_console = null
/obj/item/export_scanner/examine(user)
- ..()
+ . = ..()
if(!cargo_console)
- to_chat(user, "[src] is not currently linked to a cargo console. ")
+ . += "[src] is not currently linked to a cargo console. "
/obj/item/export_scanner/afterattack(obj/O, mob/user, proximity)
. = ..()
diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm
index 3c82722f69..915d671fe8 100644
--- a/code/modules/cargo/supplypod_beacon.dm
+++ b/code/modules/cargo/supplypod_beacon.dm
@@ -45,11 +45,11 @@
update_status()
/obj/item/supplypod_beacon/examine(user)
- ..()
+ . = ..()
if(!express_console)
- to_chat(user, "[src] is not currently linked to a Express Supply console. ")
+ . += "[src] is not currently linked to a Express Supply console. "
else
- to_chat(user, "Alt-click to unlink it from the Express Supply console. ")
+ . += "Alt-click to unlink it from the Express Supply console. "
/obj/item/supplypod_beacon/Destroy()
if(express_console)
@@ -61,7 +61,7 @@
express_console.beacon = null
express_console = null
update_status(SP_UNLINK)
- update_status(SP_UNREADY)
+ update_status(SP_UNREADY)
/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user)
if (C.beacon)//if new console has a beacon, then...
@@ -91,5 +91,5 @@
if(new_beacon_name)
name += " ([tag])"
return
- else
+ else
return ..()
diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm
index f1477fb4d2..22b15ea868 100644
--- a/code/modules/client/client_colour.dm
+++ b/code/modules/client/client_colour.dm
@@ -111,3 +111,6 @@
/datum/client_colour/monochrome
colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
priority = INFINITY //we can't see colors anyway!
+
+/datum/client_colour/monochrome/trance
+ priority = 1
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 5aaf589393..e91d379ddd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -2299,10 +2299,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.shirt_color = shirt_color
character.socks_color = socks_color
-
- character.backbag = backbag
- character.jumpsuit_style = jumpsuit_style
-
var/datum/species/chosen_species
if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races))
chosen_species = pref_species.type
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 90c692c60e..2e643cc05d 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -49,7 +49,7 @@
if(!(damagetype & (BRUTELOSS | FIRELOSS | TOXLOSS | OXYLOSS) ))
adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- death(FALSE, penalize = TRUE)
+ death(FALSE)
return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 7e7f8b4285..d142699a21 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -120,9 +120,9 @@
user.vv_edit_var(variable, user_vars_to_edit[variable])
/obj/item/clothing/examine(mob/user)
- ..()
+ . = ..()
if(damaged_clothes)
- to_chat(user, "It looks damaged! ")
+ . += "It looks damaged! "
var/datum/component/storage/pockets = GetComponent(/datum/component/storage)
if(pockets)
var/list/how_cool_are_your_threads = list("")
@@ -137,7 +137,7 @@
if(pockets.silent)
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += " "
- to_chat(user, how_cool_are_your_threads.Join())
+ . += how_cool_are_your_threads.Join()
/obj/item/clothing/obj_break(damage_flag)
if(!damaged_clothes)
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index f140fb3074..608f71cf11 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -23,9 +23,9 @@
return BRUTELOSS
/obj/item/clothing/glasses/examine(mob/user)
- ..()
+ . = ..()
if(glass_colour_type && ishuman(user))
- to_chat(user, "Alt-click to toggle its colors. ")
+ . += "Alt-click to toggle its colors. "
/obj/item/clothing/glasses/visor_toggling()
..()
@@ -362,7 +362,7 @@
desc = replacetext(desc, "person", "man")
else if(user.gender == FEMALE)
desc = replacetext(desc, "person", "woman")
- ..()
+ . = ..()
desc = desk
/obj/item/clothing/glasses/thermal/eyepatch
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 6b674c8595..ac491c2bc5 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -14,7 +14,7 @@
/obj/item/clothing/gloves/ComponentInitialize()
. = ..()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/gloves/clean_blood)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
/obj/item/clothing/gloves/clean_blood(datum/source, strength)
. = ..()
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 298510564c..880303bb13 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -90,8 +90,8 @@
new /obj/item/reagent_containers/food/drinks/flask/det(src)
/obj/item/clothing/head/fedora/det_hat/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to take a candy corn. ")
+ . = ..()
+ . += "Alt-click to take a candy corn. "
/obj/item/clothing/head/fedora/det_hat/AltClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index b14b0575f9..8754c89511 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -41,8 +41,8 @@
usr.update_inv_head() //so our mob-overlays update
/obj/item/clothing/head/soft/examine(mob/user)
- ..()
- to_chat(user, "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"]. ")
+ . = ..()
+ . += "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"]. "
/obj/item/clothing/head/soft/red
name = "red cap"
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 947aa048c4..7d0c4a455e 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -30,8 +30,8 @@
adjustmask(user)
/obj/item/clothing/mask/breath/examine(mob/user)
- ..()
- to_chat(user, "Alt-click [src] to adjust it. ")
+ . = ..()
+ . += "Alt-click [src] to adjust it. "
/obj/item/clothing/mask/breath/medical
desc = "A close-fitting sterile mask that can be connected to an air supply."
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 88cc7123fd..1532f50808 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -6,7 +6,7 @@
gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/radio/headset/headset_cent/alt
-/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -35,7 +35,7 @@
/obj/item/gun/energy/e_gun=1)
l_pocket = /obj/item/switchblade
-/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -46,7 +46,7 @@
/datum/outfit/ert/commander/alert
name = "ERT Commander - Amber Alert"
-
+
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
glasses = /obj/item/clothing/glasses/thermal/eyepatch
backpack_contents = list(/obj/item/storage/box/engineer=1,\
@@ -76,7 +76,7 @@
/obj/item/gun/energy/e_gun/stun=1,\
/obj/item/melee/baton/loaded=1)
-/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -88,7 +88,7 @@
/datum/outfit/ert/security/alert
name = "ERT Security - Amber Alert"
-
+
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/storage/box/handcuffs=1,\
@@ -120,7 +120,7 @@
/obj/item/reagent_containers/hypospray/combat=1,\
/obj/item/gun/medbeam=1)
-/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -166,7 +166,7 @@
/obj/item/gun/energy/e_gun=1,\
/obj/item/construction/rcd/loaded=1)
-/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -214,7 +214,7 @@
l_hand = /obj/item/storage/toolbox/plastitanium
gloves = /obj/item/clothing/gloves/color/yellow
-/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
var/obj/item/card/id/W = H.wear_id
@@ -238,7 +238,7 @@
l_hand = /obj/item/clipboard
id = /obj/item/card/id
-/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -288,7 +288,7 @@
/obj/item/reagent_containers/hypospray/combat/heresypurge=1,
/obj/item/gun/medbeam=1)
-/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm
index 347fc5c2d7..0ca2a11c50 100644
--- a/code/modules/clothing/outfits/event.dm
+++ b/code/modules/clothing/outfits/event.dm
@@ -12,7 +12,7 @@
belt = /obj/item/tank/internals/emergency_oxygen/double
id = /obj/item/card/id/gold
-/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
H.fully_replace_character_name(H.real_name, "Santa Claus")
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 6c961dc250..29fd06dcaf 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -48,7 +48,7 @@
l_pocket = /obj/item/grenade/chem_grenade/cleaner
backpack_contents = list(/obj/item/stack/tile/plasteel=6)
-/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -97,7 +97,7 @@
/datum/outfit/pirate/space/captain
head = /obj/item/clothing/head/helmet/space/pirate
-/datum/outfit/pirate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/pirate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= "pirate"
var/obj/item/radio/R = H.ears
@@ -125,7 +125,7 @@
id = /obj/item/card/id
r_hand = /obj/item/twohanded/fireaxe
-/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -150,7 +150,7 @@
r_pocket = /obj/item/scalpel
r_hand = /obj/item/twohanded/fireaxe
-/datum/outfit/psycho/post_equip(mob/living/carbon/human/H)
+/datum/outfit/psycho/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
for(var/obj/item/I in H.held_items)
@@ -170,7 +170,7 @@
id = /obj/item/card/id/syndicate
belt = /obj/item/pda/heads
-/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
var/obj/item/clothing/under/U = H.w_uniform
U.attach_accessory(new /obj/item/clothing/accessory/waistcoat(H))
@@ -216,7 +216,7 @@
back = /obj/item/storage/backpack/satchel/leather
id = /obj/item/card/id
-/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -244,7 +244,7 @@
back = /obj/item/storage/backpack/satchel/leather
id = /obj/item/card/id
-/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -283,7 +283,7 @@
back = /obj/item/storage/backpack
backpack_contents = list(/obj/item/storage/box=1)
-/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -325,7 +325,7 @@
id = /obj/item/card/id
-/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -349,7 +349,7 @@
r_hand = /obj/item/gun/ballistic/automatic/tommygun
id = /obj/item/card/id
-/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -391,7 +391,7 @@
/obj/item/flashlight=1,\
/obj/item/grenade/plastic/x4=1)
-/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm
index cd8115ac7d..ee350e3891 100644
--- a/code/modules/clothing/outfits/vr.dm
+++ b/code/modules/clothing/outfits/vr.dm
@@ -5,10 +5,10 @@
ears = /obj/item/radio/headset
id = /obj/item/card/id
-/datum/outfit/vr/pre_equip(mob/living/carbon/human/H)
+/datum/outfit/vr/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.dna.species.before_equip_job(null, H)
-/datum/outfit/vr/post_equip(mob/living/carbon/human/H)
+/datum/outfit/vr/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
var/obj/item/card/id/id = H.wear_id
if (istype(id))
id.access |= get_all_accesses()
@@ -25,9 +25,10 @@
backpack_contents = list(/obj/item/storage/box/syndie=1,\
/obj/item/kitchen/knife/combat/survival)
-/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
. = ..()
- var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80)
+ var/key = H.key ? H.key : preference_source ? preference_source.key : null
+ var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, key, 80)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
var/obj/item/implant/weapons_auth/W = new
W.implant(H)
diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm
index 103a152ec8..0bc8c87a45 100644
--- a/code/modules/clothing/outfits/vv_outfit.dm
+++ b/code/modules/clothing/outfits/vv_outfit.dm
@@ -4,7 +4,7 @@
var/list/vv_values
var/list/stored_access
-/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly)
+/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.delete_equipment() //Applying VV to wrong objects is not reccomended.
. = ..()
@@ -120,7 +120,7 @@
GLOB.custom_outfits += O
to_chat(usr,"Outfit registered, use select equipment to equip it.")
-/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly)
+/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
. = ..()
//Apply VV
for(var/slot in vv_values)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 37ab2b2bf4..a8406e3b12 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -23,7 +23,7 @@
/obj/item/clothing/shoes/ComponentInitialize()
. = ..()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/shoes/clean_blood)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
if(rand(2)>1)
@@ -66,7 +66,7 @@
if(adjusted == NORMAL_STYLE)
. += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_DNA_to_color())
else
- . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = blood_DNA_to_color())
+ . += mutable_appearance('icons/mob/feet_digi.dmi', "shoeblood", color = blood_DNA_to_color())
/obj/item/clothing/shoes/equipped(mob/user, slot)
. = ..()
diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm
index d13e655d43..c4d06ea14c 100644
--- a/code/modules/clothing/shoes/bananashoes.dm
+++ b/code/modules/clothing/shoes/bananashoes.dm
@@ -38,8 +38,8 @@
to_chat(user, "You cannot retrieve any bananium from the prototype shoes. ")
/obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user)
- ..()
- to_chat(user, "The shoes are [on ? "enabled" : "disabled"]. ")
+ . = ..()
+ . += "The shoes are [on ? "enabled" : "disabled"]. "
/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user)
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 0f5b381326..70dde1e217 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -40,8 +40,8 @@
return clothing_flags & NOSLIP
/obj/item/clothing/shoes/magboots/examine(mob/user)
- ..()
- to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].")
+ . = ..()
+ . += "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"]."
/obj/item/clothing/shoes/magboots/advance
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index 7ead462b1e..04aacfc3f5 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -799,10 +799,10 @@
to_chat(targ, "[icon2html(src, targ)]|[message] ")
/obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user)
- ..()
- to_chat(user, "SUIT: [locked ? "LOCKED" : "UNLOCKED"] ")
- to_chat(user, "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"] ")
- to_chat(user, "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"] ")
+ . = ..()
+ . += "SUIT: [locked ? "LOCKED" : "UNLOCKED"] "
+ . += "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"] "
+ . += "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"] "
/obj/item/clothing/suit/space/hardsuit/flightsuit/Destroy()
dropped()
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index fa6b01415e..e7032ead13 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -958,14 +958,7 @@
/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file)
. = ..()
if(!isinhands)
- var/mutable_appearance/energy_overlay
- if(taurmode == SNEK_TAURIC)
- energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
- else if(taurmode == PAW_TAURIC)
- energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
- else
- energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
-
+ var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
energy_overlay.plane = ABOVE_LIGHTING_LAYER
energy_overlay.color = energy_color
. += energy_overlay
@@ -995,5 +988,5 @@
update_light()
/obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it. ")
+ . = ..()
+ . += "Alt-click to recolor it. "
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 0b07aafa5d..7c829e7570 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -15,8 +15,8 @@
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
- ..()
- to_chat(user, "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit. ")
+ . = ..()
+ . += "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit. "
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(mob/living/carbon/human/H)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index a18617ea29..53800615e9 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -519,6 +519,16 @@
/obj/item/clothing/head/hooded/winterhood/captain
icon_state = "winterhood_captain"
+/obj/item/clothing/suit/hooded/wintercoat/hop
+ name = "head of personnel's winter coat"
+ icon_state = "coathop"
+ item_state = "coathop"
+ armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hop
+
+/obj/item/clothing/head/hooded/winterhood/hop
+ icon_state = "winterhood_hop"
+
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
@@ -533,6 +543,20 @@
/obj/item/clothing/head/hooded/winterhood/security
icon_state = "winterhood_security"
+/obj/item/clothing/suit/hooded/wintercoat/hos
+ name = "head of security's winter coat"
+ icon_state = "coathos"
+ item_state = "coathos"
+ armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hos
+
+/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize()
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
+
+/obj/item/clothing/head/hooded/winterhood/hos
+ icon_state = "winterhood_hos"
+
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "coatmedical"
@@ -544,6 +568,39 @@
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "winterhood_medical"
+/obj/item/clothing/suit/hooded/wintercoat/cmo
+ name = "chief medical officer's winter coat"
+ icon_state = "coatcmo"
+ item_state = "coatcmo"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
+
+/obj/item/clothing/head/hooded/winterhood/cmo
+ icon_state = "winterhood_cmo"
+
+/obj/item/clothing/suit/hooded/wintercoat/chemistry
+ name = "chemistry winter coat"
+ icon_state = "coatchemistry"
+ item_state = "coatchemistry"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
+
+/obj/item/clothing/head/hooded/winterhood/chemistry
+ icon_state = "winterhood_chemistry"
+
+/obj/item/clothing/suit/hooded/wintercoat/viro
+ name = "virology winter coat"
+ icon_state = "coatviro"
+ item_state = "coatviro"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
+
+/obj/item/clothing/head/hooded/winterhood/viro
+ icon_state = "winterhood_viro"
+
/obj/item/clothing/suit/hooded/wintercoat/science
name = "science winter coat"
icon_state = "coatscience"
@@ -555,6 +612,49 @@
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "winterhood_science"
+/obj/item/clothing/suit/hooded/wintercoat/robotics
+ name = "robotics winter coat"
+ icon_state = "coatrobotics"
+ item_state = "coatrobotics"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics
+
+/obj/item/clothing/head/hooded/winterhood/robotics
+ icon_state = "winterhood_robotics"
+
+/obj/item/clothing/suit/hooded/wintercoat/genetics
+ name = "genetics winter coat"
+ icon_state = "coatgenetics"
+ item_state = "coatgenetics"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics
+
+/obj/item/clothing/head/hooded/winterhood/genetics
+ icon_state = "winterhood_genetics"
+
+/obj/item/clothing/suit/hooded/wintercoat/rd
+ name = "research director's winter coat"
+ icon_state = "coatrd"
+ item_state = "coatrd"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5,"energy" = 0, "bomb" = 15, "bio" = 5, "rad" = 5, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/rd
+
+/obj/item/clothing/head/hooded/winterhood/rd
+ icon_state = "winterhood_rd"
+
+/obj/item/clothing/suit/hooded/wintercoat/ce
+ name = "chief engineer's winter coat"
+ icon_state = "coatce"
+ item_state = "coatce"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/ce
+
+/obj/item/clothing/head/hooded/winterhood/ce
+ icon_state = "winterhood_ce"
+
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
icon_state = "coatengineer"
@@ -585,6 +685,26 @@
/obj/item/clothing/head/hooded/winterhood/hydro
icon_state = "winterhood_hydro"
+/obj/item/clothing/suit/hooded/wintercoat/cosmic
+ name = "cosmic winter coat"
+ icon_state = "coatcosmic"
+ item_state = "coatcosmic"
+ allowed = list(/obj/item/flashlight)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic
+
+/obj/item/clothing/head/hooded/winterhood/cosmic
+ icon_state = "winterhood_cosmic"
+
+/obj/item/clothing/suit/hooded/wintercoat/janitor
+ name = "janitors winter coat"
+ icon_state = "coatjanitor"
+ item_state = "coatjanitor"
+ allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/grenade/chem_grenade,/obj/item/lightreplacer,/obj/item/flashlight,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/spray,/obj/item/soap,/obj/item/holosign_creator,/obj/item/key/janitor,/obj/item/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor
+
+/obj/item/clothing/head/hooded/winterhood/janitor
+ icon_state = "winterhood_janitor"
+
/obj/item/clothing/suit/hooded/wintercoat/cargo
name = "cargo winter coat"
icon_state = "coatcargo"
@@ -594,6 +714,15 @@
/obj/item/clothing/head/hooded/winterhood/cargo
icon_state = "winterhood_cargo"
+/obj/item/clothing/suit/hooded/wintercoat/qm
+ name = "quartermaster's winter coat"
+ icon_state = "coatqm"
+ item_state = "coatqm"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/qm
+
+/obj/item/clothing/head/hooded/winterhood/qm
+ icon_state = "winterhood_qm"
+
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
@@ -636,7 +765,7 @@
/obj/item/clothing/suit/assu_suit
name = "DAB suit"
- desc = "A cheap replica of old SWAT armor. On its back, it is written: \"Desperate Assistance Battle-force \"."
+ desc = "A cheap replica of old SWAT armor. On its back, it is written: \"Desperate Assistance Battleforce \"."
icon_state = "assu_suit"
item_state = "assu_suit"
blood_overlay_type = "armor"
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index cc983dbb0f..f869eb5d44 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -120,8 +120,8 @@
A.UpdateButtonIcon()
/obj/item/clothing/suit/toggle/examine(mob/user)
- ..()
- to_chat(user, "Alt-click on [src] to toggle the [togglename].")
+ . = ..()
+ . += "Alt-click on [src] to toggle the [togglename]."
//Hardsuit toggle code
/obj/item/clothing/suit/space/hardsuit/Initialize()
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index eda0e31e93..bb5f909521 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -137,23 +137,23 @@
/obj/item/clothing/under/examine(mob/user)
- ..()
+ . = ..()
if(can_adjust)
if(adjusted == ALT_STYLE)
- to_chat(user, "Alt-click on [src] to wear it normally.")
+ . += "Alt-click on [src] to wear it normally."
else
- to_chat(user, "Alt-click on [src] to wear it casually.")
+ . += "Alt-click on [src] to wear it casually."
if (has_sensor == BROKEN_SENSORS)
- to_chat(user, "Its sensors appear to be shorted out.")
+ . += "Its sensors appear to be shorted out."
else if(has_sensor > NO_SENSORS)
switch(sensor_mode)
if(SENSOR_OFF)
- to_chat(user, "Its sensors appear to be disabled.")
+ . += "Its sensors appear to be disabled."
if(SENSOR_LIVING)
- to_chat(user, "Its binary life sensors appear to be enabled.")
+ . += "Its binary life sensors appear to be enabled."
if(SENSOR_VITALS)
- to_chat(user, "Its vital tracker appears to be enabled.")
+ . += "Its vital tracker appears to be enabled."
if(SENSOR_COORDS)
- to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
+ . += "Its vital tracker and tracking beacon appear to be enabled."
if(attached_accessory)
- to_chat(user, "\A [attached_accessory] is attached to it.")
\ No newline at end of file
+ . += "\A [attached_accessory] is attached to it."
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 706f7edb0a..0a0499b5f9 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -73,10 +73,10 @@
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
/obj/item/clothing/accessory/examine(mob/user)
- ..()
- to_chat(user, "\The [src] can be attached to a uniform. Alt-click to remove it once attached. ")
+ . = ..()
+ . += "\The [src] can be attached to a uniform. Alt-click to remove it once attached. "
if(initial(above_suit))
- to_chat(user, "\The [src] can be worn above or below your suit. Alt-click to toggle. ")
+ . += "\The [src] can be worn above or below your suit. Alt-click to toggle. "
/obj/item/clothing/accessory/waistcoat
name = "waistcoat"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 6f188d513f..b4ad844f4d 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -607,8 +607,9 @@
var/extinguishes_left = 5
/obj/item/clothing/under/plasmaman/examine(mob/user)
- ..()
- to_chat(user, "There are [extinguishes_left] extinguisher charges left in this suit. ")
+ . = ..()
+ . += "There are [extinguishes_left] extinguisher charges left in this suit. "
+
/obj/item/clothing/under/plasmaman/proc/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
return
diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm
index f48ee87316..4f06a44811 100644
--- a/code/modules/crafting/recipes/recipes_clothing.dm
+++ b/code/modules/crafting/recipes/recipes_clothing.dm
@@ -158,3 +158,31 @@
time = 50
always_availible = TRUE
category = CAT_CLOTHING
+
+/datum/crafting_recipe/wintercoat_cosmic
+ name = "Cosmic Winter Coat"
+ result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
+ reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/captain = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hop = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hos = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/rd = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/ce = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/cmo = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/qm = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/robotics = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/science = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/genetics = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/chemistry = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/medical = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/viro = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/janitor = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/security = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/miner = 1)
+ time = 60
+ always_availible = TRUE
+ category = CAT_CLOTHING
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index c578d5b4d4..eaa31c01bf 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -200,9 +200,9 @@
log = list()
/obj/item/detective_scanner/examine(mob/user)
- ..()
+ . = ..()
if(LAZYLEN(log) && !scanning)
- to_chat(user, "Alt-click to clear scanner logs. ")
+ . += "Alt-click to clear scanner logs. "
/obj/item/detective_scanner/proc/displayDetectiveScanResults(mob/living/user)
// No need for can-use checks since the action button should do proper checks
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index 23f06e8965..e2125964e4 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -34,6 +34,7 @@
/datum/round_event_control/wizard
wizardevent = 1
+ var/can_be_midround_wizard = TRUE
// Checks if the event can be spawned. Used by event controller and "false alarm" event.
// Admin-created events override this.
@@ -54,6 +55,13 @@
return FALSE
return TRUE
+/datum/round_event_control/wizard/canSpawnEvent(var/players_amt, var/gamemode)
+ if(istype(SSticker.mode, /datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ if (locate(/datum/dynamic_ruleset/midround/from_ghosts/wizard) in mode.executed_rules)
+ return can_be_midround_wizard && ..()
+ return ..()
+
/datum/round_event_control/proc/preRunEvent()
if(!ispath(typepath, /datum/round_event))
return EVENT_CANT_RUN
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index dec55ed8ff..0f1a7452df 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -138,6 +138,7 @@
name = "valentine - To: [recipient] From: [sender]"
/obj/item/valentine/examine(mob/user)
+ . = ..()
if(in_range(user, src) || isobserver(user))
if( !(ishuman(user) || isobserver(user) || issilicon(user)) )
user << browse("[name] [stars(message)]", "window=[name]")
@@ -146,7 +147,7 @@
user << browse("[name] [message]", "window=[name]")
onclose(user, "[name]")
else
- to_chat(user, "It is too far away. ")
+ . += "It is too far away. "
/obj/item/valentine/attack_self(mob/user)
user.examinate(src)
diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm
index d7d8f1aec8..c594d7b3c0 100644
--- a/code/modules/events/major_dust.dm
+++ b/code/modules/events/major_dust.dm
@@ -2,6 +2,7 @@
name = "Major Space Dust"
typepath = /datum/round_event/meteor_wave/major_dust
weight = 8
+ gamemode_blacklist = list("dynamic")
/datum/round_event/meteor_wave/major_dust
wave_name = "space dust"
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 31ea9dcb03..26591547c0 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -10,6 +10,7 @@
min_players = 15
max_occurrences = 3
earliest_start = 25 MINUTES
+ gamemode_blacklist = list("dynamic")
/datum/round_event/meteor_wave
startWhen = 6
diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm
index 74d9bb273e..67848bf941 100644
--- a/code/modules/events/processor_overload.dm
+++ b/code/modules/events/processor_overload.dm
@@ -3,6 +3,7 @@
typepath = /datum/round_event/processor_overload
weight = 15
min_players = 20
+ gamemode_blacklist = list("dynamic")
/datum/round_event/processor_overload
announceWhen = 1
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index cb25446e4a..77600cdefe 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -292,7 +292,7 @@
add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY)
/obj/structure/spacevine/examine(mob/user)
- ..()
+ . = ..()
var/text = "This one is a"
if(mutations.len)
for(var/A in mutations)
@@ -301,7 +301,7 @@
else
text += " normal"
text += " vine."
- to_chat(user, text)
+ . += text
/obj/structure/spacevine/Destroy()
for(var/datum/spacevine_mutation/SM in mutations)
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index 41ee4246b1..2f0b9c68f8 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/cursed_items
max_occurrences = 3
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE
//Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot
//it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any
diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm
index f37b7470fb..67e96455f0 100644
--- a/code/modules/events/wizard/departmentrevolt.dm
+++ b/code/modules/events/wizard/departmentrevolt.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/deprevolt
max_occurrences = 1
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE // not removing it completely yet
/datum/round_event/wizard/deprevolt/start()
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index 7ea875f152..2aeb200c88 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/race
max_occurrences = 5
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE
/datum/round_event/wizard/race
var/list/stored_name
diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm
index 7e37429223..3b5ea6b20a 100644
--- a/code/modules/events/wizard/shuffle.dm
+++ b/code/modules/events/wizard/shuffle.dm
@@ -7,6 +7,7 @@
typepath = /datum/round_event/wizard/shuffleloc
max_occurrences = 5
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE // not removing it completely yet
/datum/round_event/wizard/shuffleloc/start()
var/list/moblocs = list()
@@ -43,6 +44,7 @@
typepath = /datum/round_event/wizard/shufflenames
max_occurrences = 5
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE // not removing it completely yet
/datum/round_event/wizard/shufflenames/start()
var/list/mobnames = list()
@@ -77,6 +79,7 @@
typepath = /datum/round_event/wizard/shuffleminds
max_occurrences = 3
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE // not removing it completely yet
/datum/round_event/wizard/shuffleminds/start()
var/list/mobs = list()
diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm
index 544a5c7cb3..ac1160e0f5 100644
--- a/code/modules/events/wizard/summons.dm
+++ b/code/modules/events/wizard/summons.dm
@@ -4,6 +4,7 @@
typepath = /datum/round_event/wizard/summonguns
max_occurrences = 1
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE // not removing it completely yet
/datum/round_event_control/wizard/summonguns/New()
if(CONFIG_GET(flag/no_summon_guns))
@@ -19,6 +20,7 @@
typepath = /datum/round_event/wizard/summonmagic
max_occurrences = 1
earliest_start = 0 MINUTES
+ can_be_midround_wizard = FALSE // not removing it completely yet
/datum/round_event_control/wizard/summonmagic/New()
if(CONFIG_GET(flag/no_summon_magic))
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 3eeb5b9417..df5e6a87fd 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -22,7 +22,7 @@
var/customname = "custom"
/obj/item/reagent_containers/food/snacks/customizable/examine(mob/user)
- ..()
+ . = ..()
var/ingredients_listed = ""
for(var/obj/item/reagent_containers/food/snacks/ING in ingredients)
ingredients_listed += "[ING.name], "
@@ -33,7 +33,7 @@
size = "big"
if(ingredients.len>8)
size = "monster"
- to_chat(user, "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)].")
+ . += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]."
/obj/item/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params)
if(!istype(I, /obj/item/reagent_containers/food/snacks/customizable) && istype(I, /obj/item/reagent_containers/food/snacks))
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 637e0b929c..d838b31aba 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -151,15 +151,15 @@ All foods are distributed among various categories. Use common sense.
return 0
/obj/item/reagent_containers/food/snacks/examine(mob/user)
- ..()
+ . = ..()
if(bitecount == 0)
return
else if(bitecount == 1)
- to_chat(user, "[src] was bitten by someone!")
+ . += "[src] was bitten by someone!"
else if(bitecount <= 3)
- to_chat(user, "[src] was bitten [bitecount] times!")
+ . += "[src] was bitten [bitecount] times!"
else
- to_chat(user, "[src] was bitten multiple times!")
+ . += "[src] was bitten multiple times!"
/obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index b468b6b1d1..c3fc942b83 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -447,11 +447,11 @@
if (pancakeCount)
var/obj/item/reagent_containers/food/snacks/S = contents[pancakeCount]
bitecount = S.bitecount
- ..()
+ . = ..()
if (pancakeCount)
for(var/obj/item/reagent_containers/food/snacks/pancakes/ING in contents)
ingredients_listed += "[ING.name], "
- to_chat(user, "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)].")
+ . += "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)]."
bitecount = originalBites
/obj/item/reagent_containers/food/snacks/pancakes/attackby(obj/item/I, mob/living/user, params)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index dd33f696c9..3183b3b2b4 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -67,9 +67,9 @@ God bless America.
fry_speed = oil_efficiency
/obj/machinery/deepfryer/examine()
- ..()
+ . = ..()
if(frying)
- to_chat(usr, "You can make out \a [frying] in the oil.")
+ . += "You can make out \a [frying] in the oil."
/obj/machinery/deepfryer/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/reagent_containers/pill))
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 6fcc5c9cec..e67de92773 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -53,20 +53,20 @@
/obj/machinery/microwave/examine(mob/user)
. = ..()
if(!operating)
- to_chat(user, "Alt-click [src] to turn it on. ")
+ . += "Alt-click [src] to turn it on. "
if(!in_range(user, src) && !issilicon(user) && !isobserver(user))
- to_chat(user, "You're too far away to examine [src]'s contents and display! ")
+ . += "You're too far away to examine [src]'s contents and display! "
return
if(operating)
- to_chat(user, "\The [src] is operating. ")
+ . += "\The [src] is operating. "
return
if(length(ingredients))
if(issilicon(user))
- to_chat(user, "\The [src] camera shows: ")
+ . += "\The [src] camera shows: "
else
- to_chat(user, "\The [src] contains: ")
+ . += "\The [src] contains: "
var/list/items_counts = new
for(var/i in ingredients)
if(istype(i, /obj/item/stack))
@@ -76,14 +76,14 @@
var/atom/movable/AM = i
items_counts[AM.name]++
for(var/O in items_counts)
- to_chat(user, "- [items_counts[O]]x [O]. ")
+ . += "- [items_counts[O]]x [O]. "
else
- to_chat(user, "\The [src] is empty. ")
+ . += "\The [src] is empty. "
if(!(stat & (NOPOWER|BROKEN)))
- to_chat(user, "The status display reads: ")
- to_chat(user, "- Capacity: [max_n_of_items] items.")
- to_chat(user, "- Cook time reduced by [(efficiency - 1) * 25]% .")
+ . += "The status display reads: "
+ . += "- Capacity: [max_n_of_items] items."
+ . += "- Cook time reduced by [(efficiency - 1) * 25]% ."
/obj/machinery/microwave/update_icon()
if(broken)
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 057dc0d192..355660ecec 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -319,9 +319,9 @@
pizza_preferences = list()
/obj/item/pizzabox/infinite/examine(mob/user)
- ..()
+ . = ..()
if(isobserver(user))
- to_chat(user, "This pizza box is anomalous, and will produce infinite pizza. ")
+ . += "This pizza box is anomalous, and will produce infinite pizza. "
/obj/item/pizzabox/infinite/attack_self(mob/living/user)
QDEL_NULL(pizza)
diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm
index 8953753a89..fe038ce3f1 100644
--- a/code/modules/games/cas.dm
+++ b/code/modules/games/cas.dm
@@ -107,14 +107,14 @@
var/buffertext = "A funny bit of text."
/obj/item/toy/cards/singlecard/cas/examine(mob/user)
- ..()
+ . = ..()
if (flipped)
- to_chat(user, "The card is face down. ")
+ . += "The card is face down. "
else if (blank)
- to_chat(user, "The card is blank. Write on it with a pen. ")
+ . += "The card is blank. Write on it with a pen. "
else
- to_chat(user, "The card reads: [name] ")
- to_chat(user, "Alt-click to flip it. ")
+ . += "The card reads: [name] "
+ . += "Alt-click to flip it. "
/obj/item/toy/cards/singlecard/cas/Flip()
set name = "Flip Card"
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index 9d075857a7..9dd016c235 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -546,3 +546,10 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and
/datum/holiday/easter/getStationPrefix()
return pick("Fluffy","Bunny","Easter","Egg")
+
+//Random citadel thing for halloween species
+/proc/force_enable_halloween_species()
+ var/list/oldlist = SSevents.holidays
+ SSevents.holidays = list(HALLOWEEN = new /datum/holiday/halloween)
+ generate_selectable_species(FALSE)
+ SSevents.holidays = oldlist
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index a4c89b8874..3574f8a9c1 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -21,7 +21,7 @@
/turf/open/floor/holofloor/plating/burnmix
name = "burn-mix floor"
- initial_gas_mix = "o2=2500;plasma=5000;TEMP=370"
+ initial_gas_mix = BURNMIX_ATMOS
/turf/open/floor/holofloor/grass
gender = PLURAL
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index e26dab07b4..3c4ed776b7 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -123,26 +123,25 @@
/obj/structure/beebox/examine(mob/user)
- ..()
+ . = ..()
if(!queen_bee)
- to_chat(user, "There is no queen bee! There won't bee any honeycomb without a queen! ")
+ . += "There is no queen bee! There won't bee any honeycomb without a queen! "
var/half_bee = get_max_bees()*0.5
if(half_bee && (bees.len >= half_bee))
- to_chat(user, "This place is aBUZZ with activity... there are lots of bees! ")
+ . += "This place is aBUZZ with activity... there are lots of bees! "
- to_chat(user, "[bee_resources]/100 resource supply. ")
- to_chat(user, "[bee_resources]% towards a new honeycomb. ")
- to_chat(user, "[bee_resources*2]% towards a new bee. ")
+ . += "[bee_resources]/100 resource supply. "
+ . += "[bee_resources]% towards a new honeycomb. "
+ . += "[bee_resources*2]% towards a new bee. "
if(honeycombs.len)
var/plural = honeycombs.len > 1
- to_chat(user, "There [plural? "are" : "is"] [honeycombs.len] uncollected honeycomb[plural ? "s":""] in the apiary. ")
+ . += "There [plural? "are" : "is"] [honeycombs.len] uncollected honeycomb[plural ? "s":""] in the apiary. "
if(honeycombs.len >= get_max_honeycomb())
- to_chat(user, "There's no room for more honeycomb! ")
-
+ . += "There's no room for more honeycomb! "
/obj/structure/beebox/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/honey_frame))
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index 313d998685..e9001322d3 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -16,7 +16,7 @@
/obj/structure/fermenting_barrel/examine(mob/user)
. = ..()
- to_chat(user, "It is currently [open?"open, letting you pour liquids in.":"closed, letting you draw liquids from the tap."] ")
+ . += "It is currently [open?"open, letting you pour liquids in.":"closed, letting you draw liquids from the tap."] "
/obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/fruit)
if(fruit.reagents)
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 79a23014b0..3376bac1cc 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -201,9 +201,9 @@
if(!G)
continue
dat += "[G.get_name()] "
- if(can_extract)
+ if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE)
dat += "Extract "
- if(can_insert && istype(disk.gene, G.type))
+ if(can_insert && istype(disk.gene, G.type) && G.mutability_flags & PLANT_GENE_REMOVABLE)
dat += "Replace "
dat += " "
dat += ""
@@ -232,9 +232,10 @@
for(var/a in trait_genes)
var/datum/plant_gene/G = a
dat += "[G.get_name()] "
- if(can_extract)
+ if(can_extract && G.mutability_flags & PLANT_GENE_EXTRACTABLE)
dat += "Extract "
- dat += "Remove "
+ if(G.mutability_flags & PLANT_GENE_REMOVABLE)
+ dat += "Remove "
dat += " "
dat += ""
else
@@ -439,7 +440,7 @@
to_chat(user, "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"]. ")
/obj/item/disk/plantgene/examine(mob/user)
- ..()
+ . = ..()
if(gene && (istype(gene, /datum/plant_gene/core/potency)))
- to_chat(user,"Percent is relative to potency, not maximum volume of the plant. ")
- to_chat(user, "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].")
+ . += "Percent is relative to potency, not maximum volume of the plant. "
+ . += "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"]."
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 096c7b5b2b..660f1e17e4 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -56,11 +56,11 @@
return 0
/obj/item/reagent_containers/food/snacks/grown/examine(user)
- ..()
+ . = ..()
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
if(T.examine_line)
- to_chat(user, T.examine_line)
+ . += T.examine_line
/obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params)
..()
@@ -131,7 +131,7 @@
..()
/obj/item/reagent_containers/food/snacks/grown/generate_trash(atom/location)
- if(trash && ispath(trash, /obj/item/grown))
+ if(trash && (ispath(trash, /obj/item/grown) || ispath(trash, /obj/item/reagent_containers/food/snacks/grown)))
. = new trash(location, seed)
trash = null
return
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index ef019387e8..94dbc74499 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -90,7 +90,7 @@
lifespan = 30
endurance = 25
mutatelist = list()
- genes = list(/datum/plant_gene/trait/glow/berry , /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest)
+ genes = list(/datum/plant_gene/trait/glow/white, /datum/plant_gene/trait/noreact, /datum/plant_gene/trait/repeated_harvest)
reagents_add = list("uranium" = 0.25, "iodine" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1)
rarity = 20
@@ -121,8 +121,9 @@
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
icon_grow = "cherry-grow"
icon_dead = "cherry-dead"
+ icon_harvest = "cherry-harvest"
genes = list(/datum/plant_gene/trait/repeated_harvest)
- mutatelist = list(/obj/item/seeds/cherry/blue)
+ mutatelist = list(/obj/item/seeds/cherry/blue, /obj/item/seeds/cherry/bulb)
reagents_add = list("nutriment" = 0.07, "sugar" = 0.07)
/obj/item/reagent_containers/food/snacks/grown/cherries
@@ -162,6 +163,31 @@
tastes = list("blue cherry" = 1)
wine_power = 50
+//Cherry Bulbs
+/obj/item/seeds/cherry/bulb
+ name = "pack of cherry bulb pits"
+ desc = "The glowy kind of cherries."
+ icon_state = "seed-cherrybulb"
+ species = "cherrybulb"
+ plantname = "Cherry Bulb Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/cherrybulbs
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/pink)
+ mutatelist = list()
+ reagents_add = list("nutriment" = 0.07, "sugar" = 0.07)
+ rarity = 10
+
+/obj/item/reagent_containers/food/snacks/grown/cherrybulbs
+ seed = /obj/item/seeds/cherry/bulb
+ name = "cherry bulbs"
+ desc = "They're like little Space Christmas lights!"
+ icon_state = "cherry_bulb"
+ filling_color = "#FF0000"
+ bitesize_mod = 2
+ foodtype = FRUIT
+ grind_results = list("cherryjelly" = 0)
+ tastes = list("cherry" = 1)
+ wine_power = 50
+
// Grapes
/obj/item/seeds/grape
name = "pack of grape seeds"
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
index 67c5e61dcf..6ce3558bc3 100644
--- a/code/modules/hydroponics/grown/cannabis.dm
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -61,6 +61,7 @@
species = "ocannabis"
plantname = "Omega Weed"
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/green)
mutatelist = list()
reagents_add = list("space_drugs" = 0.3,
"mindbreaker" = 0.3,
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index 97b30aec06..7355aa5ab1 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -33,6 +33,26 @@
filling_color = "#00FF00"
juice_results = list("limejuice" = 0)
+// Electric Lime
+/obj/item/seeds/lime/electric
+ name = "pack of electric lime seeds"
+ desc = "Electrically sour seeds."
+ icon_state = "seed-electriclime"
+ species = "electric lime"
+ plantname = "Electric Lime Tree"
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "lime-grow"
+ icon_dead = "lime-dead"
+ icon_harvest = "lime-harvest"
+ product = /obj/item/reagent_containers/food/snacks/grown/citrus/lime/electric
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/glow/green)
+
+/obj/item/reagent_containers/food/snacks/grown/citrus/lime/electric
+ seed = /obj/item/seeds/lime/electric
+ name = "electric lime"
+ desc = "It's so sour, you'll be shocked!"
+ icon_state = "electriclime"
+
// Orange
/obj/item/seeds/orange
name = "pack of orange seeds"
@@ -49,7 +69,7 @@
icon_grow = "lime-grow"
icon_dead = "lime-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
- mutatelist = list(/obj/item/seeds/lime)
+ mutatelist = list(/obj/item/seeds/lime, /obj/item/seeds/orange_3d)
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
/obj/item/reagent_containers/food/snacks/grown/citrus/orange
@@ -61,6 +81,43 @@
juice_results = list("orangejuice" = 0)
distill_reagent = "triple_sec"
+
+//3D Orange
+/obj/item/seeds/orange_3d
+ name = "pack of extradimensional orange seeds"
+ desc = "Polygonal seeds."
+ icon_state = "seed-orange"
+ species = "orange"
+ plantname = "Extradimensional Orange Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange
+ lifespan = 60
+ endurance = 50
+ yield = 5
+ potency = 20
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "lime-grow"
+ icon_dead = "lime-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
+
+/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d
+ seed = /obj/item/seeds/orange
+ name = "extradminesional orange"
+ desc = "You can hardly wrap your head around this thing."
+ icon_state = "orang"
+ filling_color = "#FFA500"
+ juice_results = list("orangejuice" = 0)
+ distill_reagent = "triple_sec"
+ tastes = list("polygons" = 1, "oranges" = 1)
+
+/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/pickup(mob/user)
+ . = ..()
+ icon_state = "orange"
+
+/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/dropped(mob/user)
+ . = ..()
+ icon_state = "orang"
+
// Lemon
/obj/item/seeds/lemon
name = "pack of lemon seeds"
diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm
index ea1b9716bd..44373515c6 100644
--- a/code/modules/hydroponics/grown/cocoa_vanilla.dm
+++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm
@@ -15,7 +15,7 @@
icon_grow = "cocoapod-grow"
icon_dead = "cocoapod-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
- mutatelist = list(/obj/item/seeds/cocoapod/vanillapod)
+ mutatelist = list(/obj/item/seeds/cocoapod/vanillapod, /obj/item/seeds/cocoapod/bungotree)
reagents_add = list("cocoa" = 0.25, "nutriment" = 0.1)
/obj/item/reagent_containers/food/snacks/grown/cocoapod
@@ -50,3 +50,54 @@
foodtype = FRUIT
tastes = list("vanilla" = 1)
distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it.
+
+/obj/item/seeds/cocoapod/bungotree
+ name = "pack of bungo tree seeds"
+ desc = "These seeds grow into bungo trees. They appear to be heavy and almost perfectly spherical."
+ icon_state = "seed-bungotree"
+ species = "bungotree"
+ plantname = "Bungo Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/bungofruit
+ lifespan = 30
+ maturation = 4
+ yield = 3
+ production = 7
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = list()
+ reagents_add = list("enzyme" = 0.1, "nutriment" = 0.1)
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "bungotree-grow"
+ icon_dead = "bungotree-dead"
+ rarity = 15
+
+/obj/item/reagent_containers/food/snacks/grown/bungofruit
+ seed = /obj/item/seeds/cocoapod/bungotree
+ name = "bungo fruit"
+ desc = "A strange fruit, tough leathery skin protects its juicy flesh and large poisonous seed."
+ icon_state = "bungo"
+ trash = /obj/item/reagent_containers/food/snacks/grown/bungopit
+ filling_color = "#E8C22F"
+ foodtype = FRUIT
+ tastes = list("bungo" = 2, "tropical fruitiness" = 1)
+ distill_reagent = null
+
+/obj/item/reagent_containers/food/snacks/grown/bungopit
+ seed = /obj/item/seeds/cocoapod/bungotree
+ name = "bungo pit"
+ icon_state = "bungopit"
+ desc = "A large seed, it is said to be potent enough to be able to stop a mans heart."
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 7
+ foodtype = TOXIC
+ tastes = list("acrid bitterness" = 1)
+
+/obj/item/reagent_containers/food/snacks/grown/bungopit/Initialize()
+ . =..()
+ reagents.clear_reagents()
+ reagents.add_reagent("bungotoxin", seed.potency * 0.10) //More than this will kill at too low potency
+ reagents.add_reagent("nutriment", seed.potency * 0.04)
+
+
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index af5919969c..beecb258a7 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -37,7 +37,7 @@
species = "lily"
plantname = "Lily Plants"
product = /obj/item/reagent_containers/food/snacks/grown/poppy/lily
- mutatelist = list(/obj/item/seeds/bee_balm)
+ mutatelist = list(/obj/item/seeds/bee_balm, /obj/item/seeds/poppy/lily/trumpet)
/obj/item/reagent_containers/food/snacks/grown/poppy/lily
seed = /obj/item/seeds/poppy/lily
@@ -47,6 +47,43 @@
tastes = list("pelts " = 1)
filling_color = "#FFA500"
+/obj/item/seeds/poppy/lily/trumpet
+ name = "pack of spaceman's trumpet seeds"
+ desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372."
+ icon_state = "seed-trumpet"
+ species = "spacemanstrumpet"
+ plantname = "Spaceman's Trumpet Plant"
+ product = /obj/item/reagent_containers/food/snacks/grown/trumpet
+ lifespan = 80
+ production = 5
+ endurance = 10
+ maturation = 12
+ yield = 4
+ potency = 20
+ growthstages = 4
+ weed_rate = 2
+ weed_chance = 10
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
+ icon_grow = "spacemanstrumpet-grow"
+ icon_dead = "spacemanstrumpet-dead"
+ mutatelist = list()
+ genes = list(/datum/plant_gene/reagent/polypyr)
+ reagents_add = list("nutriment" = 0.05)
+ rarity = 30
+
+/obj/item/seeds/poppy/lily/trumpet/Initialize()
+ ..()
+ unset_mutability(/datum/plant_gene/reagent/polypyr, PLANT_GENE_EXTRACTABLE)
+
+/obj/item/reagent_containers/food/snacks/grown/trumpet
+ seed = /obj/item/seeds/poppy/lily/trumpet
+ name = "spaceman's trumpet"
+ desc = "A vivid flower that smells faintly of freshly cut grass. Touching the flower seems to stain the skin some time after contact, yet most other surfaces seem to be unaffected by this phenomenon."
+ icon_state = "spacemanstrumpet"
+ filling_color = "#FF6347"
+ bitesize_mod = 3
+ foodtype = VEGETABLES
+
// Geranium
/obj/item/seeds/poppy/geranium
name = "pack of geranium seeds"
@@ -145,6 +182,7 @@
icon_grow = "moonflower-grow"
icon_dead = "sunflower-dead"
product = /obj/item/reagent_containers/food/snacks/grown/moonflower
+ genes = list(/datum/plant_gene/trait/glow/purple)
mutatelist = list()
reagents_add = list("moonshine" = 0.2, "vitamin" = 0.02, "nutriment" = 0.02)
rarity = 15
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index 1a1c2ac07f..08ce71ad37 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -15,7 +15,7 @@
icon_grow = "grass-grow"
icon_dead = "grass-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
- mutatelist = list(/obj/item/seeds/grass/carpet)
+ mutatelist = list(/obj/item/seeds/grass/carpet, /obj/item/seeds/grass/fairy)
reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05)
/obj/item/reagent_containers/food/snacks/grown/grass
@@ -40,6 +40,27 @@
new stacktype(user.drop_location(), grassAmt)
qdel(src)
+//Fairygrass
+/obj/item/seeds/grass/fairy
+ name = "pack of fairygrass seeds"
+ desc = "These seeds grow into a more mystical grass."
+ icon_state = "seed-fairygrass"
+ species = "fairygrass"
+ plantname = "Fairygrass"
+ product = /obj/item/reagent_containers/food/snacks/grown/grass/fairy
+ icon_grow = "fairygrass-grow"
+ icon_dead = "fairygrass-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue)
+ reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05, "space_drugs" = 0.15)
+
+/obj/item/reagent_containers/food/snacks/grown/grass/fairy
+ seed = /obj/item/seeds/grass/fairy
+ name = "fairygrass"
+ desc = "Blue, glowing, and smells fainly of mushrooms."
+ icon_state = "fairygrassclump"
+ filling_color = "#3399ff"
+ stacktype = /obj/item/stack/tile/fairygrass
+
// Carpet
/obj/item/seeds/grass/carpet
name = "pack of carpet seeds"
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index 87db12d892..e85a36f4b6 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -44,6 +44,7 @@
species = "holymelon"
plantname = "Holy Melon Vines"
product = /obj/item/reagent_containers/food/snacks/grown/holymelon
+ genes = list(/datum/plant_gene/trait/glow/yellow)
mutatelist = list()
reagents_add = list("holywater" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1)
rarity = 20
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 0902052a11..9d91d028ba 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -15,7 +15,7 @@
grind_results = list("mustardgrind" = 1)
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
- mutatelist = list(/obj/item/seeds/harebell)
+ mutatelist = list(/obj/item/seeds/starthistle/corpse_flower, /obj/item/seeds/galaxythistle)
/obj/item/seeds/starthistle/harvest(mob/user)
var/obj/machinery/hydroponics/parent = loc
@@ -29,6 +29,76 @@
parent.update_tray()
+// Corpse flower
+/obj/item/seeds/starthistle/corpse_flower
+ name = "pack of corpse flower seeds"
+ desc = "A species of plant that emits a horrible odor. The odor stops being produced in difficult atmospheric conditions."
+ icon_state = "seed-corpse-flower"
+ species = "corpse-flower"
+ plantname = "Corpse flower"
+ production = 2
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
+ genes = list()
+ mutatelist = list()
+
+/obj/item/seeds/starthistle/corpse_flower/pre_attack(obj/machinery/hydroponics/I)
+ if(istype(I, /obj/machinery/hydroponics))
+ if(!I.myseed)
+ START_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/seeds/starthistle/corpse_flower/process()
+ var/obj/machinery/hydroponics/parent = loc
+ if(parent.age < maturation) // Start a little before it blooms
+ return
+
+ var/turf/open/T = get_turf(parent)
+ if(abs(ONE_ATMOSPHERE - T.return_air().return_pressure()) > (potency/10 + 10)) // clouds can begin showing at around 50-60 potency in standard atmos
+ return
+
+ var/datum/gas_mixture/stank = new
+ stank.gases[/datum/gas/miasma] = (yield + 6)*7*0.02 // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses
+ stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier
+ T.assume_air(stank)
+ T.air_update_turf()
+
+//Galaxy Thistle
+/obj/item/seeds/galaxythistle
+ name = "pack of galaxythistle seeds"
+ desc = "An impressive species of weed that is thought to have evolved from the simple milk thistle. Contains flavolignans that can help repair a damaged liver."
+ icon_state = "seed-galaxythistle"
+ species = "galaxythistle"
+ plantname = "Galaxythistle"
+ product = /obj/item/reagent_containers/food/snacks/grown/galaxythistle
+ lifespan = 70
+ endurance = 40
+ maturation = 3
+ production = 2
+ yield = 2
+ potency = 25
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
+ genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/invasive)
+ mutatelist = list()
+ reagents_add = list("nutriment" = 0.05, "silibinin" = 0.1)
+
+/obj/item/seeds/galaxythistle/Initialize()
+ ..()
+ unset_mutability(/datum/plant_gene/trait/invasive, PLANT_GENE_REMOVABLE)
+
+/obj/item/reagent_containers/food/snacks/grown/galaxythistle
+ seed = /obj/item/seeds/galaxythistle
+ name = "galaxythistle flower head"
+ desc = "This spiny cluster of florets reminds you of the highlands."
+ icon_state = "galaxythistle"
+ filling_color = "#1E7549"
+ bitesize_mod = 3
+ foodtype = VEGETABLES
+ wine_power = 35
+ tastes = list("thistle" = 2, "artichoke" = 1)
+
+
+
// Cabbage
/obj/item/seeds/cabbage
name = "pack of cabbage seeds"
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index fe2beb896c..c8e97c78de 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -191,6 +191,7 @@
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list("nutriment" = 0.1)
+ mutatelist = list(/obj/item/seeds/chanterelle/jupitercup)
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle
seed = /obj/item/seeds/chanter
@@ -199,6 +200,34 @@
icon_state = "chanterelle"
filling_color = "#FFA500"
+//Jupiter Cup
+/obj/item/seeds/chanterelle/jupitercup
+ name = "pack of jupiter cup mycelium"
+ desc = "This mycelium grows into jupiter cups. Zeus would be envious at the power at your fingertips."
+ icon_state = "mycelium-jupitercup"
+ species = "jupitercup"
+ plantname = "Jupiter Cups"
+ product = /obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup
+ lifespan = 40
+ production = 4
+ endurance = 8
+ yield = 4
+ growthstages = 2
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/liquidelectricity, /datum/plant_gene/trait/plant_type/carnivory)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list("nutriment" = 0.1)
+
+/obj/item/seeds/chanterelle/jupitercup/Initialize()
+ ..()
+ unset_mutability(/datum/plant_gene/reagent/liquidelectricity, PLANT_GENE_EXTRACTABLE)
+ unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
+
+/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup
+ seed = /obj/item/seeds/chanterelle/jupitercup
+ name = "jupiter cup"
+ desc = "A strange red mushroom, its surface is moist and slick. You wonder how many tiny worms have met their fate inside."
+ icon_state = "jupitercup"
+ filling_color = "#B5003D"
// Glowshroom
/obj/item/seeds/glowshroom
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index f464fccf91..f45b6bc517 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -169,8 +169,27 @@
//Pests & Weeds//////////////////////////////////////////////////////////
- else if(pestlevel >= 5)
- adjustHealth(-1 / rating)
+ if(pestlevel >= 8)
+ if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/carnivory))
+ adjustHealth(-2 / rating)
+
+ else
+ adjustHealth(2 / rating)
+ adjustPests(-1 / rating)
+
+ else if(pestlevel >= 4)
+ if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/carnivory))
+ adjustHealth(-1 / rating)
+
+ else
+ adjustHealth(1 / rating)
+ if(prob(50))
+ adjustPests(-1 / rating)
+
+ else if(pestlevel < 4 && myseed.get_gene(/datum/plant_gene/trait/plant_type/carnivory))
+ adjustHealth(-2 / rating)
+ if(prob(5))
+ adjustPests(-1 / rating)
// If it's a weed, it doesn't stunt the growth
if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
@@ -210,6 +229,12 @@
needs_update = 1
if (needs_update)
update_icon()
+
+ if(myseed && prob(5 * (11-myseed.production)))
+ for(var/g in myseed.genes)
+ if(istype(g, /datum/plant_gene/trait))
+ var/datum/plant_gene/trait/selectedtrait = g
+ selectedtrait.on_grow(src)
return
/obj/machinery/hydroponics/proc/nutrimentMutation()
@@ -294,32 +319,31 @@
/obj/machinery/hydroponics/examine(user)
- ..()
+ . = ..()
if(myseed)
- to_chat(user, "It has [myseed.plantname] planted. ")
+ . += "It has [myseed.plantname] planted. "
if (dead)
- to_chat(user, "It's dead! ")
+ . += "It's dead! "
else if (harvest)
- to_chat(user, "It's ready to harvest. ")
+ . += "It's ready to harvest. "
else if (plant_health <= (myseed.endurance / 2))
- to_chat(user, "It looks unhealthy. ")
+ . += "It looks unhealthy. "
else
- to_chat(user, "It's empty. ")
+ . += "It's empty. "
if(!self_sustaining)
- to_chat(user, "Water: [waterlevel]/[maxwater]. ")
- to_chat(user, "Nutrient: [nutrilevel]/[maxnutri]. ")
+ . += "Water: [waterlevel]/[maxwater]. "
+ . += "Nutrient: [nutrilevel]/[maxnutri]. "
if(self_sufficiency_progress > 0)
var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req)
- to_chat(user, "Treatment for self-sustenance are [percent_progress]% complete. ")
+ . += "Treatment for self-sustenance are [percent_progress]% complete. "
else
- to_chat(user, "It doesn't require any water or nutrients. ")
+ . += "It doesn't require any water or nutrients. "
if(weedlevel >= 5)
- to_chat(user, "It's filled with weeds! ")
+ . += "It's filled with weeds! "
if(pestlevel >= 5)
- to_chat(user, "It's filled with tiny worms! ")
- to_chat(user, "" )
+ . += "It's filled with tiny worms! "
/obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens.
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index db529e8ffb..74185e9b3f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -1,8 +1,18 @@
/datum/plant_gene
var/name
+ var/mutability_flags = PLANT_GENE_EXTRACTABLE | PLANT_GENE_REMOVABLE ///These flags tells the genemodder if we want the gene to be extractable, only removable or neither.
/datum/plant_gene/proc/get_name() // Used for manipulator display and gene disk name.
- return name
+ var/formatted_name
+ if(!(mutability_flags & PLANT_GENE_REMOVABLE && mutability_flags & PLANT_GENE_EXTRACTABLE))
+ if(mutability_flags & PLANT_GENE_REMOVABLE)
+ formatted_name += "Fragile "
+ else if(mutability_flags & PLANT_GENE_EXTRACTABLE)
+ formatted_name += "Essential "
+ else
+ formatted_name += "Immutable "
+ formatted_name += name
+ return formatted_name
/datum/plant_gene/proc/can_add(obj/item/seeds/S)
return !istype(S, /obj/item/seeds/sample) // Samples can't accept new genes
@@ -101,7 +111,18 @@
var/rate = 0.04
/datum/plant_gene/reagent/get_name()
- return "[name] production [rate*100]%"
+ var/formatted_name
+ if(!(mutability_flags & PLANT_GENE_REMOVABLE && mutability_flags & PLANT_GENE_EXTRACTABLE))
+ if(mutability_flags & PLANT_GENE_REMOVABLE)
+ formatted_name += "Fragile "
+ else if(mutability_flags & PLANT_GENE_EXTRACTABLE)
+ formatted_name += "Essential "
+ else
+ formatted_name += "Immutable "
+ formatted_name += "[name] production [rate*100]%"
+ return formatted_name
+
+
/datum/plant_gene/reagent/proc/set_reagent(reag_id)
reagent_id = reag_id
@@ -132,6 +153,15 @@
return FALSE
return TRUE
+/datum/plant_gene/reagent/polypyr
+ name = "Polypyrylium Oligomers"
+ reagent_id = "polypyr"
+ rate = 0.15
+
+/datum/plant_gene/reagent/liquidelectricity
+ name = "Liquid Electricity"
+ reagent_id = "liquidelectricity"
+ rate = 0.1
// Various traits affecting the product. Each must be somehow useful.
/datum/plant_gene/trait
@@ -173,6 +203,10 @@
/datum/plant_gene/trait/proc/on_throw_impact(obj/item/reagent_containers/food/snacks/grown/G, atom/target)
return
+///This proc triggers when the tray processes and a roll is sucessful, the success chance scales with production.
+/datum/plant_gene/trait/proc/on_grow(obj/machinery/hydroponics/H)
+ return
+
/datum/plant_gene/trait/squash
// Allows the plant to be squashed when thrown or slipped on, leaving a colored mess and trash type item behind.
// Also splashes everything in target turf with reagents and applies other trait effects (teleporting, etc) to the target by on_squash.
@@ -261,22 +295,44 @@
/datum/plant_gene/trait/glow/shadow
//makes plant emit slightly purple shadows
- //adds -potency*(rate*0.2) light power to products
name = "Shadow Emission"
rate = 0.04
glow_color = "#AAD84B"
-/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
- return -max(S.potency*(rate*0.2), 0.2)
+datum/plant_gene/trait/glow/white
+ name = "White Bioluminescence"
+ glow_color = "#FFFFFF"
/datum/plant_gene/trait/glow/red
- name = "Red Electrical Glow"
- glow_color = LIGHT_COLOR_RED
+ //Colored versions of bioluminescence.
+ name = "Red Bioluminescence"
+ glow_color = "#FF3333"
+
+/datum/plant_gene/trait/glow/yellow
+ //not the disgusting glowshroom yellow hopefully
+ name = "Yellow Bioluminescence"
+ glow_color = "#FFFF66"
+
+/datum/plant_gene/trait/glow/green
+ //oh no, now i'm radioactive
+ name = "Green Bioluminescence"
+ glow_color = "#99FF99"
+
+/datum/plant_gene/trait/glow/blue
+ //the best one
+ name = "Blue Bioluminescence"
+ glow_color = "#6699FF"
+
+/datum/plant_gene/trait/glow/purple
+ //did you know that notepad++ doesnt think bioluminescence is a word
+ name = "Purple Bioluminescence"
+ glow_color = "#D966FF"
+
+/datum/plant_gene/trait/glow/pink
+ //gay tide station pride
+ name = "Pink Bioluminescence"
+ glow_color = "#FFB3DA"
-/datum/plant_gene/trait/glow/berry
- name = "Strong Bioluminescence"
- rate = 0.05
- glow_color = null
/datum/plant_gene/trait/teleport
@@ -400,6 +456,30 @@
if(!(G.resistance_flags & FIRE_PROOF))
G.resistance_flags |= FIRE_PROOF
+//Invasive spreading lets the plant jump to other trays, the spreadinhg plant won't replace plants of the same type.
+/datum/plant_gene/trait/invasive
+ name = "Invasive Spreading"
+
+/datum/plant_gene/trait/invasive/on_grow(obj/machinery/hydroponics/H)
+ for(var/step_dir in GLOB.alldirs)
+ var/obj/machinery/hydroponics/HY = locate() in get_step(H, step_dir)
+ if(HY && prob(15))
+ if(HY.myseed) // check if there is something in the tray.
+ if(HY.myseed.type == H.myseed.type && HY.dead != 0)
+ continue //It should not destroy its owm kind.
+ qdel(HY.myseed)
+ HY.myseed = null
+ HY.myseed = H.myseed.Copy()
+ HY.age = 0
+ HY.dead = 0
+ HY.plant_health = HY.myseed.endurance
+ HY.lastcycle = world.time
+ HY.harvest = 0
+ HY.weedlevel = 0 // Reset
+ HY.pestlevel = 0 // Reset
+ HY.update_icon()
+ HY.visible_message("The [H.myseed.plantname] spreads! ")
+
/datum/plant_gene/trait/plant_type // Parent type
name = "you shouldn't see this"
trait_id = "plant_type"
@@ -412,3 +492,7 @@
/datum/plant_gene/trait/plant_type/alien_properties
name ="?????"
+
+/datum/plant_gene/trait/plant_type/carnivory
+ name = "Obligate Carnivory"
+
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 2a28b7b097..16863b0aa4 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -67,6 +67,7 @@
for(var/reag_id in reagents_add)
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
+ reagents_from_genes() //quality coding
/obj/item/seeds/proc/Copy()
var/obj/item/seeds/S = new type(null, 1)
@@ -94,6 +95,18 @@
for(var/datum/plant_gene/reagent/R in genes)
reagents_add[R.reagent_id] = R.rate
+///This proc adds a mutability_flag to a gene
+/obj/item/seeds/proc/set_mutability(typepath, mutability)
+ var/datum/plant_gene/g = get_gene(typepath)
+ if(g)
+ g.mutability_flags |= mutability
+
+///This proc removes a mutability_flag from a gene
+/obj/item/seeds/proc/unset_mutability(typepath, mutability)
+ var/datum/plant_gene/g = get_gene(typepath)
+ if(g)
+ g.mutability_flags &= ~mutability
+
/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0)
adjust_lifespan(rand(-lifemut,lifemut))
adjust_endurance(rand(-endmut,endmut))
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index ae134c2415..93ddedebc0 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -70,16 +70,16 @@
/obj/item/electronic_assembly/examine(mob/user)
. = ..()
if(can_anchor)
- to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place. ")
+ . += "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place. "
else
- to_chat(user, "The maintenance panel [opened ? "can be" : "is"] screwed in place. ")
+ . += "The maintenance panel [opened ? "can be" : "is"] screwed in place. "
if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || IsAdminGhost(user))
- to_chat(user, "You can scan this circuit.")
+ . += "You can scan this circuit."
for(var/I in assembly_components)
var/obj/item/integrated_circuit/IC = I
- IC.external_examine(user)
+ . += IC.external_examine(user)
if(opened)
interact(user)
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index 60b2d0486e..cec3e2348e 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -26,8 +26,8 @@
var/displayed_name = ""
var/demands_object_input = FALSE
var/can_input_object_when_closed = FALSE
-
-
+
+
/*
Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows
a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools.
@@ -35,8 +35,8 @@ a creative player the means to solve many problems. Circuits are held inside an
/obj/item/integrated_circuit/examine(mob/user)
interact(user)
- external_examine(user)
. = ..()
+ . += external_examine(user)
// Can be called via electronic_assembly/attackby()
/obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user)
@@ -62,7 +62,7 @@ a creative player the means to solve many problems. Circuits are held inside an
// This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED.
/obj/item/integrated_circuit/proc/external_examine(mob/user)
- any_examine(user)
+ return any_examine(user)
/obj/item/integrated_circuit/proc/any_examine(mob/user)
return
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index 93d800807a..34c36883d1 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -19,7 +19,7 @@
. = ..()
/obj/item/integrated_circuit/memory/examine(mob/user)
- ..()
+ . = ..()
var/i
for(i = 1, i <= outputs.len, i++)
var/datum/integrated_io/O = outputs[i]
@@ -30,7 +30,7 @@
data = "[d]"
else if(!isnull(O.data))
data = O.data
- to_chat(user, "\The [src] has [data] saved to address [i].")
+ . += "\The [src] has [data] saved to address [i]."
/obj/item/integrated_circuit/memory/do_work()
for(var/i = 1 to inputs.len)
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 3975da18b6..6005709dde 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -23,7 +23,7 @@
if(displayed_name && displayed_name != name)
shown_label = " labeled '[displayed_name]'"
- to_chat(user, "There is \a [src][shown_label], which displays [!isnull(stuff_to_display) ? "'[stuff_to_display]'" : "nothing"].")
+ return "There is \a [src][shown_label], which displays [!isnull(stuff_to_display) ? "'[stuff_to_display]'" : "nothing"]."
/obj/item/integrated_circuit/output/screen/do_work()
var/datum/integrated_io/I = inputs[1]
@@ -345,14 +345,13 @@
set_pin_data(IC_INPUT, 1, FALSE)
/obj/item/integrated_circuit/output/led/external_examine(mob/user)
- var/text_output = "There is "
+ . = "There is "
if(name == displayed_name)
- text_output += "\an [name]"
+ . += "\an [name]"
else
- text_output += "\an ["\improper[name]"] labeled '[displayed_name]'"
- text_output += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit * " : "unlit"]."
- to_chat(user, text_output)
+ . += "\an ["\improper[name]"] labeled '[displayed_name]'"
+ . += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit * " : "unlit"]."
/obj/item/integrated_circuit/output/diagnostic_hud
name = "AR interface"
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index a52b8589c3..507c8a5026 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -101,8 +101,9 @@
//Equip the rest of the gear
H.dna.species.before_equip_job(src, H, visualsOnly)
- if(outfit_override || outfit)
- H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly)
+ var/datum/outfit/job/O = outfit_override || outfit
+ if(O)
+ H.equipOutfit(O, visualsOnly, preference_source) //mob doesn't have a client yet.
H.dna.species.after_equip_job(src, H, visualsOnly)
@@ -177,8 +178,8 @@
var/pda_slot = SLOT_BELT
-/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- switch(H.backbag)
+/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ switch(preference_source?.prefs.backbag)
if(GBACKPACK)
back = /obj/item/storage/backpack //Grey backpack
if(GSATCHEL)
@@ -196,7 +197,7 @@
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
var/holder
- if(H.jumpsuit_style == PREF_SKIRT)
+ if(preference_source && preference_source.prefs.jumpsuit_style == PREF_SKIRT)
holder = "[uniform]/skirt"
if(!text2path(holder))
holder = "[uniform]"
@@ -204,7 +205,7 @@
holder = "[uniform]"
uniform = text2path(holder)
-/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -232,6 +233,8 @@
PDA.owner = H.real_name
PDA.ownjob = J.title
PDA.update_label()
+ if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences.
+ PDA.update_style(preference_source)
/datum/outfit/job/get_chameleon_disguise_info()
var/list/types = ..()
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index da8c2aa3b9..ce2dce9053 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -28,15 +28,16 @@ Assistant
name = "Assistant"
jobtype = /datum/job/assistant
-/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H)
+/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
+ var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT
if (CONFIG_GET(flag/grey_assistants))
- if(H.jumpsuit_style == PREF_SUIT)
+ if(suited)
uniform = /obj/item/clothing/under/color/grey
else
uniform = /obj/item/clothing/under/skirt/color/grey
else
- if(H.jumpsuit_style == PREF_SUIT)
+ if(suited)
uniform = /obj/item/clothing/under/color/random
else
uniform = /obj/item/clothing/under/skirt/color/random
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index d8b88ae871..922b335a39 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -16,11 +16,6 @@
display_order = JOB_DISPLAY_ORDER_CLOWN
-
-/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
- . = ..()
- H.apply_pref_name("clown", M.client)
-
/datum/outfit/job/clown
name = "Clown"
jobtype = /datum/job/clown
@@ -48,11 +43,15 @@
chameleon_extras = /obj/item/stamp/clown
-/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
- H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly.
+ var/client/C = H.client || preference_source
+ if(C)
+ H.apply_pref_name("clown", C) //rename the mob AFTER they're equipped so their ID gets updated properly.
+ else
+ H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names))
H.dna.add_mutation(CLOWNMUT)
H.dna.add_mutation(SMILE)
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index c213d4dffc..b5def54061 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -29,7 +29,7 @@
mask = /obj/item/clothing/mask/fakemoustache/italian
backpack_contents = list(/obj/item/sharpener = 1)
-/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/datum/job/cook/J = SSjob.GetJobType(jobtype)
if(J) // Fix for runtime caused by invalid job being passed
@@ -39,7 +39,7 @@
if(!visualsOnly)
J.cooks++
-/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm
index 35fa8483d5..0c762637ac 100644
--- a/code/modules/jobs/job_types/curator.dm
+++ b/code/modules/jobs/job_types/curator.dm
@@ -34,7 +34,7 @@
/obj/item/barcodescanner = 1
)
-/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 27a54fbd1f..13cb5e01e3 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -46,7 +46,7 @@
chameleon_extras = list(/obj/item/gun/ballistic/revolver/detective, /obj/item/clothing/glasses/sunglasses)
-/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/obj/item/clothing/mask/cigarette/cig = H.wear_mask
if(istype(cig)) //Some species specfic changes can mess this up (plasmamen)
diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm
index 0b8be52116..654af6a05d 100644
--- a/code/modules/jobs/job_types/lawyer.dm
+++ b/code/modules/jobs/job_types/lawyer.dm
@@ -35,7 +35,7 @@
chameleon_extras = /obj/item/stamp/law
-/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm
index 1347da7125..4e6e982fb9 100644
--- a/code/modules/jobs/job_types/mime.dm
+++ b/code/modules/jobs/job_types/mime.dm
@@ -36,7 +36,7 @@
satchel = /obj/item/storage/backpack/mime
-/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -47,3 +47,9 @@
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
H.mind.miming = 1
+ var/client/C = H.client || preference_source
+ if(C)
+ H.apply_pref_name("mime", C)
+ else
+ H.fully_replace_character_name(H.real_name, pick(GLOB.mime_names))
+
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 771fc02862..915e9d1cea 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -64,7 +64,7 @@
/obj/item/gun/energy/kinetic_accelerator=1,\
/obj/item/stack/marker_beacon/ten=1)
-/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 7dc4fd17b9..06a988d109 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -25,18 +25,18 @@
var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase
/obj/structure/bookcase/examine(mob/user)
- ..()
+ . = ..()
if(!anchored)
- to_chat(user, "The bolts on the bottom are unsecured. ")
+ . += "The bolts on the bottom are unsecured. "
if(anchored)
- to_chat(user, "It's secured in place with bolts . ")
+ . += "It's secured in place with bolts . "
switch(state)
if(0)
- to_chat(user, "There's a small crack visible on the back panel. ")
+ . += "There's a small crack visible on the back panel. "
if(1)
- to_chat(user, "There's space inside for a wooden shelf. ")
+ . += "There's space inside for a wooden shelf. "
if(2)
- to_chat(user, "There's a small crack visible on the shelf. ")
+ . += "There's a small crack visible on the shelf. "
/obj/structure/bookcase/Initialize(mapload)
. = ..()
diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm
index 88d1248a28..295fc816e2 100644
--- a/code/modules/library/soapstone.dm
+++ b/code/modules/library/soapstone.dm
@@ -16,7 +16,7 @@
/obj/item/soapstone/examine(mob/user)
. = ..()
if(remaining_uses != -1)
- to_chat(user, "It has [remaining_uses] uses left.")
+ . += "It has [remaining_uses] uses left."
/obj/item/soapstone/afterattack(atom/target, mob/user, proximity)
. = ..()
@@ -193,7 +193,7 @@
update_icon()
/obj/structure/chisel_message/examine(mob/user)
- ..()
+ . = ..()
ui_interact(user)
/obj/structure/chisel_message/Destroy()
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index d901e1eb0c..d461523744 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -25,7 +25,6 @@
max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
no_ammo_message = "Internal matter exhausted. Please add additional materials. "
delay_mod = 0.5
- adjacency_check = FALSE
upgrade = TRUE
var/obj/machinery/computer/camera_advanced/base_construction/console
@@ -207,19 +206,14 @@
to_chat(owner, "Build mode is now [buildmode].")
/datum/action/innate/aux_base/airlock_type
- name = "Change Airlock Settings"
+ name = "Select Airlock Type"
button_icon_state = "airlock_select"
/datum/action/innate/aux_base/airlock_type/Activate()
if(..())
return
- var/mode = alert("Modify Type or Access?", "Airlock Settings", "Type", "Access", "None")
- switch(mode)
- if("Type")
- B.RCD.change_airlock_setting(usr)
- if("Access")
- B.RCD.change_airlock_access(usr)
+ B.RCD.change_airlock_access(usr)
/datum/action/innate/aux_base/window_type
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 7a311c6f18..eb3e6a5b58 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -38,12 +38,12 @@
return ..()
/obj/item/twohanded/kinetic_crusher/examine(mob/living/user)
- ..()
- to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force_wielded + detonation_damage] damage. ")
- to_chat(user, "Does [force_wielded + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force_wielded + detonation_damage] . ")
+ . = ..()
+ . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force_wielded + detonation_damage] damage. "
+ . += "Does [force_wielded + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force_wielded + detonation_damage] . "
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
- to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()]. ")
+ . += "It has \a [T] attached, which causes [T.effect_desc()]. "
/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/crowbar))
@@ -201,8 +201,8 @@
var/denied_type = /obj/item/crusher_trophy
/obj/item/crusher_trophy/examine(mob/living/user)
- ..()
- to_chat(user, "Causes [effect_desc()] when attached to a kinetic crusher. ")
+ . = ..()
+ . += "Causes [effect_desc()] when attached to a kinetic crusher. "
/obj/item/crusher_trophy/proc/effect_desc()
return "errors"
diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm
index b2a2e3357d..f8b155cb9f 100644
--- a/code/modules/mining/equipment/lazarus_injector.dm
+++ b/code/modules/mining/equipment/lazarus_injector.dm
@@ -59,8 +59,8 @@
malfunctioning = 1
/obj/item/lazarus_injector/examine(mob/user)
- ..()
+ . = ..()
if(!loaded)
- to_chat(user, "[src] is empty. ")
+ . += "[src] is empty. "
if(malfunctioning)
- to_chat(user, "The display on [src] seems to be flickering. ")
+ . += "The display on [src] seems to be flickering. "
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index c735c9d637..00ce37b79a 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -36,9 +36,9 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
update_icon()
/obj/item/stack/marker_beacon/examine(mob/user)
- ..()
- to_chat(user, "Use in-hand to place a [singular_name]. ")
- to_chat(user, "Alt-click to select a color. Current color is [picked_color]. ")
+ . = ..()
+ . += "Use in-hand to place a [singular_name]. "
+ . += "Alt-click to select a color. Current color is [picked_color]. "
/obj/item/stack/marker_beacon/update_icon()
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
@@ -93,8 +93,8 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
qdel(src)
/obj/structure/marker_beacon/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to select a color. Current color is [picked_color]. ")
+ . = ..()
+ . += "Alt-click to select a color. Current color is [picked_color]. "
/obj/structure/marker_beacon/update_icon()
while(!picked_color || !GLOB.marker_beacon_colors[picked_color])
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index d6e99f7361..4429c8426f 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -59,6 +59,7 @@
to_chat(owner, "[src] breaks down as it tries to activate. ")
else
owner.revive(full_heal = 1)
+ owner.log_message("[owner] used an implanted [src] to heal themselves! Keep fighting, it's just a flesh wound!", LOG_ATTACK, color="green") //Logging for implanted legion core use
qdel(src)
/obj/item/organ/regenerative_core/on_life()
@@ -85,6 +86,21 @@
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
H.revive(full_heal = 1)
qdel(src)
+ user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another.
+
+/obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target'
+ if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal
+ var/mob/living/carbon/human/H = user //Set H to user rather than target
+ if(inert) //Inert cores are useless
+ to_chat(user, "[src] has decayed and can no longer be used to heal. ")
+ return
+ else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself!
+ to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments. ")
+ SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
+ H.revive(full_heal = 1)
+ qdel(src)
+ H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand.
+
/obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
. = ..()
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 715ecc906a..356c4913b9 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -33,8 +33,8 @@
/obj/item/survivalcapsule/examine(mob/user)
. = ..()
get_template()
- to_chat(user, "This capsule has the [template.name] stored.")
- to_chat(user, template.description)
+ . += "This capsule has the [template.name] stored."
+ . += template.description
/obj/item/survivalcapsule/attack_self()
//Can't grab when capsule is New() because templates aren't loaded then
diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm
index f97d3612a8..f46f4f785c 100644
--- a/code/modules/mining/fulton.dm
+++ b/code/modules/mining/fulton.dm
@@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
/obj/item/extraction_pack/examine()
. = ..()
- usr.show_message("It has [uses_left] use\s remaining.", 1)
+ . += "It has [uses_left] use\s remaining."
/obj/item/extraction_pack/attack_self(mob/user)
var/list/possible_beacons = list()
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index fde856c4fb..054103e8dc 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -645,10 +645,10 @@
total_mass_on = 5
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
- ..()
- to_chat(user, "It is [active ? "open, and will cleave enemies in a wide arc":"closed, and can be used for rapid consecutive attacks that cause beastly enemies to bleed"]. \
+ . = ..()
+ . += "It is [active ? "open, and will cleave enemies in a wide arc":"closed, and can be used for rapid consecutive attacks that cause beastly enemies to bleed"]. \
Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough. \
- Transforming it immediately after an attack causes the next attack to come out faster. ")
+ Transforming it immediately after an attack causes the next attack to come out faster. "
/obj/item/melee/transforming/cleaving_saw/suicide_act(mob/user)
user.visible_message("[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide! ")
@@ -1073,8 +1073,8 @@
var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets
/obj/item/hierophant_club/examine(mob/user)
- ..()
- to_chat(user, "The[beacon ? " beacon is not currently":"re is a beacon"] attached. ")
+ . = ..()
+ . += "The[beacon ? " beacon is not currently":"re is a beacon"] attached. "
/obj/item/hierophant_club/suicide_act(mob/living/user)
say("Xverwpsgexmrk...", forced = "hierophant club suicide")
diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm
index d0232fc4f0..d98f00ede7 100644
--- a/code/modules/mining/machine_silo.dm
+++ b/code/modules/mining/machine_silo.dm
@@ -181,8 +181,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
flick("silo_active", src)
/obj/machinery/ore_silo/examine(mob/user)
- ..()
- to_chat(user, "[src] can be linked to techfabs, circuit printers and protolathes with a multitool. ")
+ . = ..()
+ . += "[src] can be linked to techfabs, circuit printers and protolathes with a multitool. "
/datum/ore_silo_log
var/name // for VV
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 5a48538161..a8e867cef0 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -260,8 +260,8 @@
..()
/obj/item/card/mining_point_card/examine(mob/user)
- ..()
- to_chat(user, "There's [points] point\s on the card.")
+ . = ..()
+ . += "There's [points] point\s on the card."
///Conscript kit
/obj/item/card/mining_access_card
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 8de5f76a56..950ae7dda1 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -37,6 +37,9 @@
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //yes, even both mining locker types
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
@@ -61,6 +64,7 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/survivalcapsule(src)
new /obj/item/assault_pod/mining(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //because you know you want it
/**********************Shuttle Computer**************************/
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 997b117b25..0c8aef51a8 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -68,22 +68,22 @@
check_friendly_fire = 0
/mob/living/simple_animal/hostile/mining_drone/examine(mob/user)
- ..()
+ . = ..()
var/t_He = p_they(TRUE)
var/t_him = p_them()
var/t_s = p_s()
if(health < maxHealth)
if(health >= maxHealth * 0.5)
- to_chat(user, "[t_He] look[t_s] slightly dented. ")
+ . += "[t_He] look[t_s] slightly dented. "
else
- to_chat(user, "[t_He] look[t_s] severely dented! ")
- to_chat(user, "Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore \n\
- Field repairs can be done with a welder.")
+ . += "[t_He] look[t_s] severely dented! "
+ . += "Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore \n\
+ Field repairs can be done with a welder."
if(stored_gun && stored_gun.max_mod_capacity)
- to_chat(user, "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining.")
+ . += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining."
for(var/A in stored_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
- to_chat(user, "There is \a [M] installed, using [M.cost]% capacity. ")
+ . += "There is \a [M] installed, using [M.cost]% capacity. "
/mob/living/simple_animal/hostile/mining_drone/welder_act(mob/living/user, obj/item/I)
. = TRUE
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 69361e8685..c3a33f36f5 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -348,9 +348,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
pixel_y = rand(0,8)-8
/obj/item/coin/examine(mob/user)
- ..()
+ . = ..()
if(value)
- to_chat(user, "It's worth [value] credit\s. ")
+ . += "It's worth [value] credit\s. "
/obj/item/coin/gold
name = "gold coin"
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index b158815dac..3e9588d7dd 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -29,7 +29,7 @@
/obj/structure/ore_box/examine(mob/living/user)
if(Adjacent(user) && istype(user))
show_contents(user)
- . = ..()
+ return ..()
/obj/structure/ore_box/attack_hand(mob/user)
. = ..()
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 4d253a4693..d789fc6f5a 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -473,10 +473,7 @@
var/free_space = 0
for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions))
var/cat_color = "fff" //random default
- if(SSjob.name_occupations && SSjob.name_occupations[category[1]])
- cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
- else
- cat_color = SSjob.occupations[category[1]].selection_color
+ cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
dat += ""
dat += "[SSjob.name_occupations[category[1]].exp_type_department] "
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index b323f13362..fbbd43bbe1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -264,6 +264,7 @@ Works together with spawning an observer, noted above.
*/
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE)
+ penalize = suiciding || penalize // suicide squad.
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & COMPONENT_BLOCK_GHOSTING))
return //mob has no key, is an aghost or some component hijacked.
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
@@ -306,7 +307,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(stat == DEAD)
ghostize(1)
else
- var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
+ var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return //didn't want to ghost after-all
if(istype(loc, /obj/machinery/cryopod))
@@ -331,7 +332,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
penalty = CANT_REENTER_ROUND
- var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
+ var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return
ghostize(0, penalize = TRUE)
@@ -629,8 +630,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Possess!"
set desc= "Take over the body of a mindless creature!"
- if(reenter_round_timeout > world.realtime)
- to_chat(src, "You are unable to re-enter the round yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)]. ")
+ if(!can_reenter_round())
return FALSE
var/list/possessible = list()
@@ -862,9 +862,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
change_mob_type( /mob/living/carbon/human , null, null, TRUE) //always delmob, ghosts shouldn't be left lingering
/mob/dead/observer/examine(mob/user)
- ..()
+ . = ..()
if(!invisibility)
- to_chat(user, "It seems extremely obvious.")
+ . += "It seems extremely obvious."
/mob/dead/observer/proc/set_invisibility(value)
invisibility = value
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index d84ba0d7a1..aa3c209016 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -188,17 +188,17 @@
qdel(src)
/obj/item/mmi/examine(mob/user)
- ..()
+ . = ..()
if(brainmob)
var/mob/living/brain/B = brainmob
if(!B.key || !B.mind || B.stat == DEAD)
- to_chat(user, "The MMI indicates the brain is completely unresponsive. ")
+ . += "The MMI indicates the brain is completely unresponsive. "
else if(!B.client)
- to_chat(user, "The MMI indicates the brain is currently inactive; it might change. ")
+ . += "The MMI indicates the brain is currently inactive; it might change. "
else
- to_chat(user, "The MMI indicates the brain is active. ")
+ . += "The MMI indicates the brain is active. "
/obj/item/mmi/relaymove(mob/user)
return //so that the MMI won't get a warning about not being able to move if it tries to move
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 1b2944c1f6..37dd7b6a31 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -5,6 +5,7 @@
var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE.
stat = DEAD //we start dead by default
see_invisible = SEE_INVISIBLE_LIVING
+ possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas
speech_span = SPAN_ROBOT
/mob/living/brain/Initialize()
@@ -72,10 +73,9 @@
/mob/living/brain/ClickOn(atom/A, params)
..()
- if(istype(loc, /obj/item/mmi))
- var/obj/item/mmi/MMI = loc
- var/obj/mecha/M = MMI.mecha
- if((src == MMI.brainmob) && istype(M))
+ if(container)
+ var/obj/mecha/M = container.mecha
+ if(istype(M))
return M.click_action(A,src,params)
/mob/living/brain/forceMove(atom/destination)
@@ -90,3 +90,16 @@
doMove(destination)
else
CRASH("Brainmob without a container [src] attempted to move to [destination].")
+
+/mob/living/brain/update_mouse_pointer()
+ if (!client)
+ return
+ client.mouse_pointer_icon = initial(client.mouse_pointer_icon)
+ if(!container)
+ return
+ if (container.mecha)
+ var/obj/mecha/M = container.mecha
+ if(M.mouse_pointer)
+ client.mouse_pointer_icon = M.mouse_pointer
+ if (client && ranged_ability && ranged_ability.ranged_mousepointer)
+ client.mouse_pointer_icon = ranged_ability.ranged_mousepointer
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index decf8d24eb..48e79a9050 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -157,7 +157,7 @@
-/obj/item/organ/brain/examine(mob/user)//BUG_PROBABLE_CAUSE to_chats changed to . +=
+/obj/item/organ/brain/examine(mob/user)
. = ..()
if(user.suiciding)
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
index 4ad7793250..e2d6b095fe 100644
--- a/code/modules/mob/living/brain/posibrain.dm
+++ b/code/modules/mob/living/brain/posibrain.dm
@@ -161,7 +161,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
else
msg = "[dead_message]"
- to_chat(user, msg)
+ . += msg
/obj/item/mmi/posibrain/Initialize()
. = ..()
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index e66d70f492..1cea4a6e82 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -71,16 +71,16 @@
Leap(M)
/obj/item/clothing/mask/facehugger/examine(mob/user)
- ..()
+ . = ..()
if(!real)//So that giant red text about probisci doesn't show up.
return
switch(stat)
if(DEAD,UNCONSCIOUS)
- to_chat(user, "[src] is not moving. ")
+ . += "[src] is not moving. "
if(CONSCIOUS)
- to_chat(user, "[src] seems to be active! ")
+ . += "[src] seems to be active! "
if (sterile)
- to_chat(user, "It looks like the proboscis has been removed. ")
+ . += "It looks like the proboscis has been removed. "
/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f2b02b81fb..23ccc665b6 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -170,6 +170,7 @@
stop_pulling()
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "You gently let go of [throwable_mob]. ")
+ return
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 7d1e5320fc..a8a69be0f1 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -43,7 +43,7 @@
adjustStaminaLoss(damage_amount, forced = forced)
//citadel code
if(AROUSAL)
- adjustArousalLoss(damage_amount, forced = forced)
+ adjustArousalLoss(damage_amount)
return TRUE
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 5634d21775..eba925a659 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -6,39 +6,39 @@
var/t_has = p_have()
var/t_is = p_are()
- var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src] !\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] \a [src] !")
if (handcuffed)
- msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed! \n"
+ . += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed! "
if (head)
- msg += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head. \n"
+ . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head."
if (wear_mask)
- msg += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face.\n"
+ . += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face."
if (wear_neck)
- msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
+ . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck."
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
- msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
+ . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]."
if (back)
- msg += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back.\n"
+ . += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back."
var/appears_dead = 0
if (stat == DEAD)
appears_dead = 1
if(getorgan(/obj/item/organ/brain))
- msg += "[t_He] [t_is] limp and unresponsive, with no signs of life. \n"
+ . += "[t_He] [t_is] limp and unresponsive, with no signs of life. "
else if(get_bodypart(BODY_ZONE_HEAD))
- msg += "It appears that [t_his] brain is missing... \n"
+ . += "It appears that [t_his] brain is missing... "
var/list/missing = get_missing_limbs()
for(var/t in missing)
if(t==BODY_ZONE_HEAD)
- msg += "[t_His] [parse_zone(t)] is missing! \n"
+ . += "[t_His] [parse_zone(t)] is missing! "
continue
- msg += "[t_His] [parse_zone(t)] is missing! \n"
+ . += "[t_His] [parse_zone(t)] is missing! "
- msg += ""
+ var/list/msg = list("")
var/temp = getBruteLoss()
if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy
if(temp)
@@ -80,35 +80,37 @@
msg += " "
+ . += msg.Join("")
+
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"
+ . += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep."
else if(InCritical())
- msg += "[t_His] breathing is shallow and labored.\n"
+ . += "[t_His] breathing is shallow and labored."
if(digitalcamo)
- msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner.\n"
+ . += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner."
if(combatmode)
- msg += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]\n"
- msg += common_trait_examine()
+ . += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]"
+
+ var/trait_exam = common_trait_examine()
+ if (!isnull(trait_exam))
+ . += trait_exam
var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood)
switch(mood.shown_mood)
if(-INFINITY to MOOD_LEVEL_SAD4)
- msg += "[t_He] look[p_s()] depressed.\n"
+ . += "[t_He] look[p_s()] depressed."
if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3)
- msg += "[t_He] look[p_s()] very sad.\n"
+ . += "[t_He] look[p_s()] very sad."
if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2)
- msg += "[t_He] look[p_s()] a bit down.\n"
+ . += "[t_He] look[p_s()] a bit down."
if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3)
- msg += "[t_He] look[p_s()] quite happy.\n"
+ . += "[t_He] look[p_s()] quite happy."
if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4)
- msg += "[t_He] look[p_s()] very happy.\n"
+ . += "[t_He] look[p_s()] very happy."
if(MOOD_LEVEL_HAPPY4 to INFINITY)
- msg += "[t_He] look[p_s()] ecstatic.\n"
- msg += "*---------* "
-
- to_chat(user, msg)
- return msg
\ No newline at end of file
+ . += "[t_He] look[p_s()] ecstatic."
+ . += "*---------* "
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 7b0fb74f44..d5c2e5fc38 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -13,7 +13,7 @@
if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA))
obscure_name = TRUE
- var/msg = "*---------*\nThis is [!obscure_name ? name : "Unknown"] !\n"
+ . = list("*---------*\nThis is [!obscure_name ? name : "Unknown"] !")
var/list/obscured = check_obscured_slots()
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
@@ -22,11 +22,11 @@
var/mob/living/carbon/human/H = src
var/datum/species/pref_species = H.dna.species
if(get_visible_name() == "Unknown") // same as flavor text, but hey it works.
- msg += "You can't make out what species they are.\n"
+ . += "You can't make out what species they are."
else if(skipface)
- msg += "You can't make out what species they are.\n"
+ . += "You can't make out what species they are."
else
- msg += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!\n"
+ . += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!"
//uniform
if(w_uniform && !(SLOT_W_UNIFORM in obscured))
@@ -37,121 +37,113 @@
if(U.attached_accessory)
accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]"
- msg += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg].\n"
+ . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]."
//head
if(head)
- msg += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head.\n"
+ . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head."
//suit/armor
if(wear_suit)
- msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n"
+ . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]."
//suit/armor storage
if(s_store && !(SLOT_S_STORE in obscured))
- msg += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name].\n"
+ . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]."
//back
if(back)
- msg += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back.\n"
+ . += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back."
//Hands
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
- msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
+ . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]."
//gloves
if(gloves && !(SLOT_GLOVES in obscured))
- msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n"
+ . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands."
else if(length(blood_DNA))
var/hand_number = get_num_arms(FALSE)
if(hand_number)
- msg += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]! \n"
-
- //handcuffed?
+ . += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]! "
//handcuffed?
if(handcuffed)
if(istype(handcuffed, /obj/item/restraints/handcuffs/cable))
- msg += "[t_He] [t_is] [icon2html(handcuffed, user)] restrained with cable! \n"
+ . += "[t_He] [t_is] [icon2html(handcuffed, user)] restrained with cable! "
else
- msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed! \n"
+ . += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed! "
//belt
if(belt)
- msg += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist.\n"
+ . += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist."
//shoes
if(shoes && !(SLOT_SHOES in obscured))
- msg += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet.\n"
+ . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet."
//mask
if(wear_mask && !(SLOT_WEAR_MASK in obscured))
- msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n"
+ . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face."
if(wear_neck && !(SLOT_NECK in obscured))
- msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
+ . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck."
//eyes
if(!(SLOT_GLASSES in obscured))
if(glasses)
- msg += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes.\n"
+ . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes."
else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES))
- msg += "[t_His] eyes are glowing an unnatural red! \n"
+ . += "[t_His] eyes are glowing an unnatural red! "
//ears
if(ears && !(SLOT_EARS in obscured))
- msg += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears.\n"
+ . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears."
//ID
if(wear_id)
- msg += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)].\n"
+ . += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)]."
//Status effects
- msg += status_effect_examines()
+ var/effects_exam = status_effect_examines()
+ if(!isnull(effects_exam))
+ . += effects_exam
//CIT CHANGES START HERE - adds genital details to examine text
if(LAZYLEN(internal_organs))
for(var/obj/item/organ/genital/dicc in internal_organs)
if(istype(dicc) && dicc.is_exposed())
- msg += "[dicc.desc]\n"
+ . += "[dicc.desc]"
- msg += attempt_vr(src,"examine_bellies",args) //vore Code
+ var/cursed_stuff = attempt_vr(src,"examine_bellies",args) //vore Code
+ if(!isnull(cursed_stuff))
+ . += cursed_stuff
//END OF CIT CHANGES
//Jitters
switch(jitteriness)
if(300 to INFINITY)
- msg += "[t_He] [t_is] convulsing violently! \n"
+ . += "[t_He] [t_is] convulsing violently! "
if(200 to 300)
- msg += "[t_He] [t_is] extremely jittery. \n"
+ . += "[t_He] [t_is] extremely jittery. "
if(100 to 200)
- msg += "[t_He] [t_is] twitching ever so slightly. \n"
+ . += "[t_He] [t_is] twitching ever so slightly. "
var/appears_dead = 0
if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
appears_dead = 1
if(suiciding)
- msg += "[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery. \n"
+ . += "[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery. "
if(hellbound)
- msg += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible. \n"
- msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life"
- if(getorgan(/obj/item/organ/brain))
- if(!key)
- var/foundghost = 0
- if(mind)
- for(var/mob/dead/observer/G in GLOB.player_list)
- if(G.mind == mind)
- foundghost = 1
- if (G.can_reenter_corpse == 0)
- foundghost = 0
- break
- if(!foundghost)
- msg += " and [t_his] soul has departed"
- msg += "... \n"
+ . += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible. "
+ if(getorgan(/obj/item/organ/brain) && !key && !get_ghost(FALSE, TRUE))
+ . += "[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed... "
+ else
+ . += "[t_He] [t_is] limp and unresponsive; there are no signs of life... "
if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/brain))
- msg += "It appears that [t_his] brain is missing... \n"
+ . += "It appears that [t_his] brain is missing... "
var/temp = getBruteLoss() //no need to calculate each of these twice
- msg += "" //Everything below gets this span
+ var/list/msg = list()
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/list/disabled = list()
@@ -169,8 +161,7 @@
if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //Stamina is disabling the limb
damage_text = "limp and lifeless"
else
- var/more_brute = BP.brute_dam >= BP.burn_dam
- damage_text = more_brute ? "broken and mangled" : "burnt and blistered"
+ damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg
msg += "[capitalize(t_his)] [BP.name] is [damage_text]! \n"
//stores missing limbs
@@ -334,7 +325,13 @@
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
- msg += common_trait_examine()
+
+ if (length(msg))
+ . += "[msg.Join("")] "
+
+ var/trait_exam = common_trait_examine()
+ if (!isnull(trait_exam))
+ . += trait_exam
var/traitstring = get_trait_string()
if(ishuman(user))
@@ -345,28 +342,25 @@
if(perpname)
var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general)
if(R)
- msg += "Rank: [R.fields["rank"]] "
- msg += "\[Front photo\] "
- msg += "\[Side photo\] "
+ . += "Rank: [R.fields["rank"]]\n\[Front photo\] \[Side photo\] "
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical))
var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in internal_organs)
if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
- cyberimp_detect += "[name] is modified with a [CI.name]. "
+ cyberimp_detect += "[name] is modified with a [CI.name]."
if(cyberimp_detect)
- msg += "Detected cybernetic modifications: "
- msg += cyberimp_detect
+ . += "Detected cybernetic modifications:"
+ . += cyberimp_detect
if(R)
var/health_r = R.fields["p_stat"]
- msg += "\[[health_r]\] "
+ . += "\[[health_r]\] "
health_r = R.fields["m_stat"]
- msg += "\[[health_r]\] "
+ . += "\[[health_r]\] "
R = find_record("name", perpname, GLOB.data_core.medical)
if(R)
- msg += "\[Medical evaluation\] "
+ . += "\[Medical evaluation\] "
if(traitstring)
- msg += "Detected physiological traits: "
- msg += "[traitstring] "
+ . += "Detected physiological traits:\n[traitstring]"
@@ -379,25 +373,22 @@
if(R)
criminal = R.fields["criminal"]
- msg += "Criminal status: \[[criminal]\] \n"
- msg += "Security record: \[View\] "
- msg += "\[Add crime\] "
- msg += "\[View comment log\] "
- msg += "\[Add comment\] \n"
+ . += jointext(list("Criminal status: \[[criminal]\] ",
+ "Security record: \[View\] ",
+ "\[Add crime\] ",
+ "\[View comment log\] ",
+ "\[Add comment\] "), "")
else if(isobserver(user) && traitstring)
- msg += "Traits: [traitstring] "
+ . += "Traits: [traitstring] "
if(print_flavor_text())
if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
- msg += "...? "
+ . += "...?"
else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either.
- msg += "...? "
+ . += "...?"
else
- msg += "[print_flavor_text()]\n"
- msg += "*---------* "
-
- to_chat(user, msg)
- return msg
+ . += "[print_flavor_text()]"
+ . += "*---------* "
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
var/list/dat = list()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d460482d6f..9eab9054f5 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -32,7 +32,7 @@
if(CONFIG_GET(flag/disable_stambuffer))
togglesprint()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
/mob/living/carbon/human/ComponentInitialize()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2ab7c6d404..327ad6760c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -339,8 +339,10 @@
apply_damage(damage, BRUTE, affecting, armor_block)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
-
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings! ")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index b1f11f6463..9ffa994066 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -34,8 +34,6 @@
var/shirt_color = "FFFFFF"
var/socks = "Nude" //Which socks the player wants
var/socks_color = "FFFFFF"
- var/backbag = DBACKPACK //Which backpack type the player has chosen.
- var/jumpsuit_style = PREF_SUIT //suit/skirt
//Equipment slots
var/obj/item/wear_suit = null
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 084dbd83ef..26703977d2 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -251,7 +251,7 @@
sec_hud_set_security_status()
..()
-/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
+/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE, client/preference_source)
var/datum/outfit/O = null
if(ispath(outfit))
@@ -263,7 +263,7 @@
if(!O)
return 0
- return O.equip(src, visualsOnly)
+ return O.equip(src, visualsOnly, preference_source)
//delete all equipment without dropping anything
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 49ae178d8c..7ff4f355d5 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -118,11 +118,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
..()
-/proc/generate_selectable_species()
+/proc/generate_selectable_species(clear = FALSE)
+ if(clear)
+ GLOB.roundstart_races = list()
+ GLOB.roundstart_race_names = list()
for(var/I in subtypesof(/datum/species))
var/datum/species/S = new I
if(S.check_roundstart_eligible())
- GLOB.roundstart_races += S.id
+ GLOB.roundstart_races |= S.id
GLOB.roundstart_race_names["[S.name]"] = S.id
qdel(S)
if(!GLOB.roundstart_races.len)
@@ -1476,7 +1479,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]! ")
return FALSE
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
@@ -1678,6 +1681,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return
if(M.mind)
attacker_style = M.mind.martial_art
+ if(attacker_style?.pacifism_check && HAS_TRAIT(M, TRAIT_PACIFISM)) // most martial arts are quite harmful, alas.
+ attacker_style = null
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
log_combat(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]! ")
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index d264f11b73..02163eaaed 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -1,9 +1,8 @@
/datum/species/insect
name = "Anthromorphic Insect"
id = "insect"
- say_mod = "flutters"
default_color = "00FF00"
- species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR)
+ species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_ears", "mam_snout", "mam_tail", "taur", "insect_wings", "mam_snouts", "insect_fluff","horns")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None",
@@ -12,54 +11,36 @@
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
- liked_food = VEGETABLES | DAIRY
- disliked_food = FRUIT | GROSS
- toxic_food = MEAT | RAW
- mutanteyes = /obj/item/organ/eyes/insect
+ liked_food = MEAT | FRUIT
+ disliked_food = TOXIC
should_draw_citadel = TRUE
- exotic_bloodtype = "BUG"
-/datum/species/insect/on_species_gain(mob/living/carbon/C)
+/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
+ if(H)
+ stop_wagging_tail(H)
+
+/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount)
+ if(H)
+ stop_wagging_tail(H)
. = ..()
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(!H.dna.features["insect_wings"])
- H.dna.features["insect_wings"] = "[(H.client && H.client.prefs && LAZYLEN(H.client.prefs.features) && H.client.prefs.features["insect_wings"]) ? H.client.prefs.features["insect_wings"] : "None"]"
- handle_mutant_bodyparts(H)
-/datum/species/insect/random_name(gender,unique,lastname)
- if(unique)
- return random_unique_moth_name()
+/datum/species/insect/can_wag_tail(mob/living/carbon/human/H)
+ return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
- var/randname = moth_name()
+/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H)
+ return ("mam_waggingtail" in mutant_bodyparts)
- if(lastname)
- randname += " [lastname]"
+/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H)
+ if("mam_tail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_tail"
+ mutant_bodyparts |= "mam_waggingtail"
+ H.update_body()
- return randname
+/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H)
+ if("mam_waggingtail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_waggingtail"
+ mutant_bodyparts |= "mam_tail"
+ H.update_body()
-/datum/species/insect/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
- ..()
- if(H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
- to_chat(H, "Your precious wings burn to a crisp! ")
- if(H.dna.features["insect_wings"] != "None")
- H.dna.features["insect_wings"] = "Burnt Off"
- handle_mutant_bodyparts(H)
-
-/datum/species/insect/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
- . = ..()
- if(chem.id == "pestkiller")
- H.adjustToxLoss(3)
- H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
-
-/datum/species/insect/check_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/melee/flyswatter))
- return 9 //flyswatters deal 10x damage to insects
- return 0
-
-/datum/species/insect/space_move(mob/living/carbon/human/H)
- . = ..()
- if(H.loc && !isspaceturf(H.loc) && (H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None"))
- var/datum/gas_mixture/current = H.loc.return_air()
- if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
- return TRUE
+/datum/species/insect/qualifies_for_rank(rank, list/features)
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 90d1424eea..ae69d5dc90 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -126,7 +126,7 @@ There are several things that need to be remembered:
var/alt_worn = U.alternate_worn_icon
if(!U.force_alternate_icon && U.mutantrace_variation && U.suit_style == DIGITIGRADE_SUIT_STYLE)
- alt_worn = 'modular_citadel/icons/mob/uniform_digi.dmi'
+ alt_worn = 'icons/mob/uniform_digi.dmi'
var/mutable_appearance/uniform_overlay
@@ -306,7 +306,7 @@ There are several things that need to be remembered:
update_observer_view(shoes,1)
if(S.mutantrace_variation)
if(S.adjusted == ALT_STYLE)
- S.alternate_worn_icon = 'modular_citadel/icons/mob/digishoes.dmi'
+ S.alternate_worn_icon = 'icons/mob/feet_digi.dmi'
else
S.alternate_worn_icon = null
var/t_state = shoes.item_state
@@ -336,7 +336,7 @@ There are several things that need to be remembered:
if(!t_state)
t_state = s_store.icon_state
overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.alternate_worn_icon) ? s_store.alternate_worn_icon : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER)
- var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_LAYER]
+ var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER]
if(OFFSET_S_STORE in dna.species.offset_features)
s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2]
@@ -352,7 +352,7 @@ There are several things that need to be remembered:
var/obj/item/clothing/head/H = head
if(H.mutantrace_variation)
if(H.muzzle_var == ALT_STYLE)
- H.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_helmet.dmi'
+ H.alternate_worn_icon = 'icons/mob/head_muzzled.dmi'
else
H.alternate_worn_icon = null
@@ -412,17 +412,17 @@ There are several things that need to be remembered:
if(!item_level_support && !S.force_alternate_icon)
if(S.mutantrace_variation) //Just make sure we've got this checked too
if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then.
- S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi'
+ S.alternate_worn_icon = 'icons/mob/suit_digi.dmi'
else
S.alternate_worn_icon = null
if(S.tauric == TRUE) //Are we a suit with tauric mode possible?
if(S.taurmode == SNEK_TAURIC)
- S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_naga.dmi'
+ S.alternate_worn_icon = 'icons/mob/taur_naga.dmi'
if(S.taurmode == PAW_TAURIC)
- S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_canine.dmi'
+ S.alternate_worn_icon = 'icons/mob/taur_canine.dmi'
if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE)
- S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi'
+ S.alternate_worn_icon = 'icons/mob/suit_digi.dmi'
else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE)
S.alternate_worn_icon = null
@@ -470,7 +470,7 @@ There are several things that need to be remembered:
remove_overlay(FACEMASK_LAYER)
if(M.mutantrace_variation)
if(M.muzzle_var == ALT_STYLE)
- M.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_mask.dmi'
+ M.alternate_worn_icon = 'icons/mob/mask_muzzled.dmi'
else
M.alternate_worn_icon = null
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index ca139cace7..3c587a05dd 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -98,7 +98,7 @@
var/datum/gas_mixture/breath
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || !lungs || lungs.organ_flags & ORGAN_FAILING)
+ if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && lungs.organ_flags & ORGAN_FAILING))
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
else if(health <= crit_threshold)
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index 452c8f8b78..30c962f9a5 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -17,18 +17,4 @@
if(T)
. = T.could_speak_in_language(dt)
else
- . = initial(dt.flags) & TONGUELESS_SPEECH
-
-/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
- . = ..()
- if(!client)
- return
- for(var/T in get_traumas())
- var/datum/brain_trauma/trauma = T
- message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
-
- if (src.mind.has_antag_datum(/datum/antagonist/traitor))
- message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1 ")
- message = GLOB.syndicate_code_response_regex.Replace(message, "$1 ")
-
- return message
+ . = initial(dt.flags) & TONGUELESS_SPEECH
\ No newline at end of file
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index df711a6dca..6c1a2cfec9 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -58,9 +58,9 @@
message = "coughs!"
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE)
+/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE , intentional)
. = ..()
- if(user.reagents && (user.reagents.get_reagent("menthol") || user.reagents.get_reagent("peppermint_patty")))
+ if(HAS_TRAIT(user, TRAIT_SOOTHED_THROAT))
return FALSE
/datum/emote/living/dance
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 93e64fd4cc..722c984309 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -92,6 +92,9 @@
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings! ")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index fb345e10ba..5e40a5a7eb 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -1,26 +1,24 @@
/mob/living/silicon/ai/examine(mob/user)
- var/msg = "*---------*\nThis is [icon2html(src, user)] [src] !\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] [src] !")
if (stat == DEAD)
- msg += "It appears to be powered-down. \n"
+ . += "It appears to be powered-down. "
else
- msg += ""
+ . += ""
if (getBruteLoss())
if (getBruteLoss() < 30)
- msg += "It looks slightly dented.\n"
+ . += "It looks slightly dented."
else
- msg += "It looks severely dented! \n"
+ . += "It looks severely dented! "
if (getFireLoss())
if (getFireLoss() < 30)
- msg += "It looks slightly charred.\n"
+ . += "It looks slightly charred."
else
- msg += "Its casing is melted and heat-warped! \n"
- msg += " "
+ . += "Its casing is melted and heat-warped! "
+ . += " "
if(deployed_shell)
- msg += "The wireless networking light is blinking.\n"
+ . += "The wireless networking light is blinking."
else if (!shunted && !client)
- msg += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n"
- msg += "*---------* "
+ . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..."
+ . += "*---------* "
- to_chat(user, msg)
- ..()
- return msg
\ No newline at end of file
+ . += ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm
index c26af70d4a..37107f2d9c 100644
--- a/code/modules/mob/living/silicon/examine.dm
+++ b/code/modules/mob/living/silicon/examine.dm
@@ -1,4 +1,6 @@
/mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts
+ . = ..()
if(laws && isobserver(user))
- to_chat(user, "[src] has the following laws: ")
- laws.show_laws(user)
\ No newline at end of file
+ . += "[src] has the following laws: "
+ for(var/law in laws.get_law_list(include_zeroth = TRUE))
+ . += law
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 0f8687397d..7ec63cf415 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -58,7 +58,10 @@
var/canholo = TRUE
var/obj/item/card/id/access_card = null
var/chassis = "repairbot"
- var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE) //assoc value is whether it can be picked up.
+ var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE,
+ "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "borgi" = FALSE ,
+ "parrot" = FALSE, "bear" = FALSE , "mushroom" = FALSE, "crow" = FALSE ,
+ "fairy" = FALSE , "spiderbot" = FALSE) //assoc value is whether it can be picked up.
var/static/item_head_icon = 'icons/mob/pai_item_head.dmi'
var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi'
var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi'
@@ -266,8 +269,8 @@
return TRUE
/mob/living/silicon/pai/examine(mob/user)
- ..()
- to_chat(user, "A personal AI in holochassis mode. Its master ID string seems to be [master].")
+ . = ..()
+ . += "A personal AI in holochassis mode. Its master ID string seems to be [master]."
/mob/living/silicon/pai/Life()
if(stat == DEAD)
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index 5e56b4180d..63b275a416 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -1,55 +1,53 @@
/mob/living/silicon/robot/examine(mob/user)
- var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src] , a [src.module.name]!\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] \a [src] , a [src.module.name] unit!")
if(desc)
- msg += "[desc]\n"
+ . += "[desc]"
var/obj/act_module = get_active_held_item()
if(act_module)
- msg += "It is holding [icon2html(act_module, user)] \a [act_module].\n"
- msg += status_effect_examines()
- msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < maxHealth*0.5)
- msg += "It looks slightly dented.\n"
+ . += "It is holding [icon2html(act_module, user)] \a [act_module]."
+ var/effects_exam = status_effect_examines()
+ if(!isnull(effects_exam))
+ . += effects_exam
+ if (getBruteLoss())
+ if (getBruteLoss() < maxHealth*0.5)
+ . += "It looks slightly dented. "
else
- msg += "It looks severely dented! \n"
+ . += "It looks severely dented! "
if (getFireLoss() || getToxLoss())
var/overall_fireloss = getFireLoss() + getToxLoss()
if (overall_fireloss < maxHealth * 0.5)
- msg += "It looks slightly charred.\n"
+ . += "It looks slightly charred. "
else
- msg += "It looks severely burnt and heat-warped! \n"
- if (src.health < -maxHealth*0.5)
- msg += "It looks barely operational.\n"
- if (src.fire_stacks < 0)
- msg += "It's covered in water.\n"
- else if (src.fire_stacks > 0)
- msg += "It's coated in something flammable.\n"
- msg += " "
+ . += "It looks slightly charred. "
+ if (health < -maxHealth*0.5)
+ . += "It looks barely operational. "
+ if (fire_stacks < 0)
+ . += "It's covered in water. "
+ else if (fire_stacks > 0)
+ . += "It's coated in something flammable. "
if(opened)
- msg += "Its cover is open and the power cell is [cell ? "installed" : "missing"]. \n"
+ . += "Its cover is open and the power cell is [cell ? "installed" : "missing"]. "
else
- msg += "Its cover is closed[locked ? "" : ", and looks unlocked"].\n"
+ . += "Its cover is closed[locked ? "" : ", and looks unlocked"]."
if(cell && cell.charge <= 0)
- msg += "Its battery indicator is blinking red! \n"
+ . += "Its battery indicator is blinking red! "
if(is_servant_of_ratvar(src) && get_dist(user, src) <= 1 && !stat) //To counter pseudo-stealth by using headlamps
- msg += "Its eyes are glowing a blazing yellow! \n"
+ . += "Its eyes are glowing a blazing yellow! "
switch(stat)
if(CONSCIOUS)
if(shell)
- msg += "It appears to be an [deployed ? "active" : "empty"] AI shell.\n"
+ . += "It appears to be an [deployed ? "active" : "empty"] AI shell."
else if(!client)
- msg += "It appears to be in stand-by mode.\n" //afk
+ . += "It appears to be in stand-by mode." //afk
if(UNCONSCIOUS)
- msg += "It doesn't seem to be responding. \n"
+ . += "It doesn't seem to be responding. "
if(DEAD)
- msg += "It looks like its system is corrupted and requires a reset. \n"
- msg += "*---------* "
+ . += "It looks like its system is corrupted and requires a reset. "
+ . += "*---------* "
- to_chat(user, msg)
- ..()
- return msg
+ . += ..()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 5b670aaa42..c7aa882620 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -110,6 +110,7 @@
var/sitting = 0
var/bellyup = 0
+ var/dogborg = FALSE
/mob/living/silicon/robot/get_cell()
return cell
@@ -232,15 +233,14 @@
var/list/modulelist = list("Standard" = /obj/item/robot_module/standard, \
"Engineering" = /obj/item/robot_module/engineering, \
"Medical" = /obj/item/robot_module/medical, \
+ "Medihound" = /obj/item/robot_module/medihound, \
"Miner" = /obj/item/robot_module/miner, \
- "Janitor" = /obj/item/robot_module/janitor, \
"Service" = /obj/item/robot_module/butler)
if(!CONFIG_GET(flag/disable_peaceborg))
modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper
if(BORG_SEC_AVAILABLE)
modulelist["Security"] = /obj/item/robot_module/security
-
- modulelist += get_cit_modules() //Citadel change - adds Citadel's borg modules.
+ modulelist["Security K-9"] = /obj/item/robot_module/k9
var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in modulelist
if(!input_module || module.type != /obj/item/robot_module)
@@ -879,9 +879,6 @@
/mob/living/silicon/robot/modules/miner
set_module = /obj/item/robot_module/miner
-/mob/living/silicon/robot/modules/janitor
- set_module = /obj/item/robot_module/janitor
-
/mob/living/silicon/robot/modules/syndicate
icon_state = "synd_sec"
faction = list(ROLE_SYNDICATE)
@@ -920,6 +917,17 @@
Help the operatives secure the disk at all costs! "
set_module = /obj/item/robot_module/syndicate_medical
+/mob/living/silicon/robot/modules/syndicate/saboteur
+ icon_state = "synd_engi"
+ playstyle_string = "You are a Syndicate saboteur cyborg! \
+ You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
+ Your destination tagger will allow you to stealthily traverse the disposal network across the station \
+ Your welder will allow you to repair the operatives' exosuits, but also yourself and your fellow cyborgs \
+ Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station \
+ Be aware that almost any physical contact or incidental damage will break your camouflage \
+ Help the operatives secure the disk at all costs! "
+ set_module = /obj/item/robot_module/saboteur
+
/mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname)
if(!connected_ai)
return
@@ -1256,6 +1264,20 @@
for(var/i in connected_ai.aicamera.stored)
aicamera.stored[i] = TRUE
+/mob/living/silicon/robot/lay_down()
+ ..()
+ update_canmove()
+
+/mob/living/silicon/robot/update_canmove()
+ ..()
+ if(client && stat != DEAD && dogborg == FALSE)
+ if(resting)
+ cut_overlays()
+ icon_state = "[module.cyborg_base_icon]-rest"
+ else
+ icon_state = "[module.cyborg_base_icon]"
+ update_icons()
+
/mob/living/silicon/robot/proc/rest_style()
set name = "Switch Rest Style"
set category = "Robot Commands"
@@ -1271,4 +1293,8 @@
sitting = 1
if("Belly up")
bellyup = 1
- update_icons()
\ No newline at end of file
+ update_icons()
+
+/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
+ if(istype(cell))
+ cell.charge -= amount*5
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index abd2019fba..56011cb886 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -34,6 +34,14 @@
var/list/ride_offset_y = list("north" = 4, "south" = 4, "east" = 3, "west" = 3)
var/ride_allow_incapacitated = FALSE
var/allow_riding = TRUE
+ var/canDispose = FALSE // Whether the borg can stuff itself into disposal
+
+ var/sleeper_overlay
+ var/icon/cyborg_icon_override
+ var/has_snowflake_deadsprite
+ var/cyborg_pixel_offset
+ var/moduleselect_alternate_icon
+ var/dogborg = FALSE
/obj/item/robot_module/Initialize()
. = ..()
@@ -129,6 +137,28 @@
rebuild_modules()
return I
+//Adds flavoursome dogborg items to dogborg variants without mechanical benefits
+/obj/item/robot_module/proc/dogborg_equip()
+ if(istype(src, /obj/item/robot_module/k9) || istype(src, /obj/item/robot_module/medihound))
+ return //Bandaid fix to prevent stacking until I merge these two modules into their base types
+ var/obj/item/I = new /obj/item/analyzer/nose/flavour(src)
+ basic_modules += I
+ I = new /obj/item/soap/tongue/flavour(src)
+ basic_modules += I
+ I = new /obj/item/dogborg/sleeper/K9/flavour(src)
+ if(istype(src, /obj/item/robot_module/engineering))
+ I.icon_state = "decompiler"
+ if(istype(src, /obj/item/robot_module/security))
+ I.icon_state = "sleeperb"
+ if(istype(src, /obj/item/robot_module/medical))
+ I.icon_state = "sleeper"
+ if(istype(src, /obj/item/robot_module/butler))
+ I.icon_state = "servicer"
+ if(cyborg_base_icon == "scrubpup")
+ I.icon_state = "compactor"
+ basic_modules += I
+ rebuild_modules()
+
/obj/item/robot_module/proc/remove_module(obj/item/I, delete_after)
basic_modules -= I
modules -= I
@@ -197,6 +227,8 @@
R.update_module_innate()
RM.rebuild_modules()
INVOKE_ASYNC(RM, .proc/do_transform_animation)
+ if(RM.dogborg)
+ RM.dogborg_equip()
R.maxHealth = borghealth
R.health = min(borghealth, R.health)
qdel(src)
@@ -245,15 +277,15 @@
name = "Standard"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/reagent_containers/borghypo/epi,
/obj/item/healthanalyzer,
/obj/item/weldingtool/largetank/cyborg,
/obj/item/wrench/cyborg,
- /obj/item/crowbar/cyborg,
/obj/item/stack/sheet/metal/cyborg,
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
- /obj/item/extinguisher,
/obj/item/pickaxe,
/obj/item/t_scanner/adv_mining_scanner,
/obj/item/restraints/handcuffs/cable/zipties,
@@ -271,6 +303,8 @@
name = "Medical"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/healthanalyzer,
/obj/item/reagent_containers/borghypo,
/obj/item/reagent_containers/glass/beaker/large,
@@ -283,7 +317,6 @@
/obj/item/surgicaldrill,
/obj/item/scalpel,
/obj/item/circular_saw,
- /obj/item/extinguisher/mini,
/obj/item/roller/robo,
/obj/item/borg/cyborghug/medical,
/obj/item/stack/medical/gauze/cyborg,
@@ -299,6 +332,85 @@
can_be_pushed = FALSE
hat_offset = 3
+/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ cyborg_base_icon = "medical"
+ if("Droid")
+ cyborg_base_icon = "medical"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 4
+ if("Sleek")
+ cyborg_base_icon = "sleekmed"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Marina")
+ cyborg_base_icon = "marinamed"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Eyebot")
+ cyborg_base_icon = "eyebotmed"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Heavy")
+ cyborg_base_icon = "heavymed"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ return ..()
+
+/obj/item/robot_module/medihound
+ name = "MediHound"
+ basic_modules = list(
+ /obj/item/dogborg/jaws/small,
+ /obj/item/storage/bag/borgdelivery,
+ /obj/item/analyzer/nose,
+ /obj/item/soap/tongue,
+ /obj/item/extinguisher/mini,
+ /obj/item/healthanalyzer,
+ /obj/item/dogborg/sleeper/medihound,
+ /obj/item/roller/robo,
+ /obj/item/reagent_containers/borghypo,
+ /obj/item/twohanded/shockpaddles/cyborg/hound,
+ /obj/item/stack/medical/gauze/cyborg,
+ /obj/item/pinpointer/crew,
+ /obj/item/sensor_device)
+ emag_modules = list(/obj/item/dogborg/pounce)
+ ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical,
+ /obj/item/clockwork/weapon/ratvarian_spear)
+ cyborg_base_icon = "medihound"
+ moduleselect_icon = "medihound"
+ moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+ sleeper_overlay = "msleeper"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+
+/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/list/medhoundmodels = list("Default", "Dark", "Vale")
+ if(R.client && R.client.ckey in list("nezuli"))
+ medhoundmodels += "Alina"
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ cyborg_base_icon = "medihound"
+ if("Dark")
+ cyborg_base_icon = "medihounddark"
+ sleeper_overlay = "mdsleeper"
+ if("Vale")
+ cyborg_base_icon = "valemed"
+ sleeper_overlay = "valemedsleeper"
+ if("Alina")
+ cyborg_base_icon = "alina-med"
+ special_light_key = "alina"
+ sleeper_overlay = "alinasleeper"
+ return ..()
+
/obj/item/robot_module/engineering
name = "Engineering"
basic_modules = list(
@@ -338,10 +450,79 @@
magpulsing = TRUE
hat_offset = -4
+/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
+ if(R.client && R.client.ckey in list("nezuli"))
+ engymodels += "Alina"
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ cyborg_base_icon = "engineer"
+ if("Default - Treads")
+ cyborg_base_icon = "engi-tread"
+ special_light_key = "engineer"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Loader")
+ cyborg_base_icon = "loaderborg"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ has_snowflake_deadsprite = TRUE
+ if("Handy")
+ cyborg_base_icon = "handyeng"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Sleek")
+ cyborg_base_icon = "sleekeng"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Can")
+ cyborg_base_icon = "caneng"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Marina")
+ cyborg_base_icon = "marinaeng"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Spider")
+ cyborg_base_icon = "spidereng"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Heavy")
+ cyborg_base_icon = "heavyeng"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Pup Dozer")
+ cyborg_base_icon = "pupdozer"
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ sleeper_overlay = "dozersleeper"
+ if("Vale")
+ cyborg_base_icon = "valeeng"
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ sleeper_overlay = "valeengsleeper"
+ if("Alina")
+ cyborg_base_icon = "alina-eng"
+ special_light_key = "alina"
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ sleeper_overlay = "alinasleeper"
+ return ..()
+
/obj/item/robot_module/security
name = "Security"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/restraints/handcuffs/cable/zipties,
/obj/item/melee/baton/loaded,
/obj/item/gun/energy/disabler/cyborg,
@@ -360,6 +541,90 @@
to_chat(loc, "While you have picked the security module, you still have to follow your laws, NOT Space Law. \
For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to. ")
+/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ cyborg_base_icon = "sec"
+ if("Default - Treads")
+ cyborg_base_icon = "sec-tread"
+ special_light_key = "sec"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Sleek")
+ cyborg_base_icon = "sleeksec"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Marina")
+ cyborg_base_icon = "marinasec"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Can")
+ cyborg_base_icon = "cansec"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Spider")
+ cyborg_base_icon = "spidersec"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Heavy")
+ cyborg_base_icon = "heavysec"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ return ..()
+
+/obj/item/robot_module/k9
+ name = "Security K-9 Unit"
+ basic_modules = list(
+ /obj/item/restraints/handcuffs/cable/zipties,
+ /obj/item/storage/bag/borgdelivery,
+ /obj/item/dogborg/jaws/big,
+ /obj/item/dogborg/pounce,
+ /obj/item/clothing/mask/gas/sechailer/cyborg,
+ /obj/item/soap/tongue,
+ /obj/item/analyzer/nose,
+ /obj/item/dogborg/sleeper/K9,
+ /obj/item/gun/energy/disabler/cyborg,
+ /obj/item/pinpointer/crew)
+ emag_modules = list(/obj/item/gun/energy/laser/cyborg)
+ ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
+ /obj/item/clockwork/weapon/ratvarian_spear)
+ cyborg_base_icon = "k9"
+ moduleselect_icon = "k9"
+ moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+ sleeper_overlay = "ksleeper"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+
+/obj/item/robot_module/k9/do_transform_animation()
+ ..()
+ to_chat(loc,"While you have picked the Security K-9 module, you still have to follow your laws, NOT Space Law. \
+ For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to. ")
+
+/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/list/sechoundmodels = list("Default", "Dark", "Vale")
+ if(R.client && R.client.ckey in list("nezuli"))
+ sechoundmodels += "Alina"
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ cyborg_base_icon = "k9"
+ if("Alina")
+ cyborg_base_icon = "alina-sec"
+ special_light_key = "alina"
+ sleeper_overlay = "alinasleeper"
+ if("Dark")
+ cyborg_base_icon = "k9dark"
+ sleeper_overlay = "k9darksleeper"
+ if("Vale")
+ cyborg_base_icon = "valesec"
+ sleeper_overlay = "valesecsleeper"
+ return ..()
+
/obj/item/robot_module/security/Initialize()
. = ..()
if(!CONFIG_GET(flag/weaken_secborg))
@@ -372,12 +637,13 @@
name = "Peacekeeper"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/cookiesynth,
/obj/item/harmalarm,
/obj/item/reagent_containers/borghypo/peace,
/obj/item/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
- /obj/item/extinguisher,
/obj/item/megaphone,
/obj/item/borg/projectile_dampen)
emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
@@ -391,9 +657,31 @@
/obj/item/robot_module/peacekeeper/do_transform_animation()
..()
- to_chat(loc, "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
+ to_chat(loc, "Under ASIMOV/CREWSIMOV, you are an enforcer of the PEACE and preventer of HUMAN/CREW HARM. \
You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you. ")
+/obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider", "Borgi")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Default")
+ cyborg_base_icon = "peace"
+ if("Spider")
+ cyborg_base_icon = "whitespider"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Borgi")
+ cyborg_base_icon = "borgi"
+ moduleselect_icon = "borgi"
+ moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
+ hat_offset = INFINITY
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ has_snowflake_deadsprite = TRUE
+ return ..()
+
+//Janitor module combined with Service module
+/*
/obj/item/robot_module/janitor
name = "Janitor"
basic_modules = list(
@@ -416,6 +704,7 @@
moduleselect_icon = "janitor"
hat_offset = -5
clean_on_move = TRUE
+ */
/obj/item/reagent_containers/spray/cyborg_drying
name = "drying agent spray"
@@ -426,25 +715,12 @@
name = "lube spray"
list_reagents = list("lube" = 250)
-/obj/item/robot_module/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
- ..()
- var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules
- if(LR)
- for(var/i in 1 to coeff)
- LR.Charge(R)
-
- var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules
- if(CD)
- CD.reagents.add_reagent("drying_agent", 5 * coeff)
-
- var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules
- if(CL)
- CL.reagents.add_reagent("lube", 2 * coeff)
-
/obj/item/robot_module/clown
name = "Clown"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/toy/crayon/rainbow,
/obj/item/instrument/bikehorn,
/obj/item/stamp/clown,
@@ -459,8 +735,7 @@
/obj/item/borg/cyborghug/peacekeeper,
/obj/item/borg/lollipop/clown,
/obj/item/picket_sign/cyborg,
- /obj/item/reagent_containers/borghypo/clown,
- /obj/item/extinguisher/mini)
+ /obj/item/reagent_containers/borghypo/clown)
emag_modules = list(
/obj/item/reagent_containers/borghypo/clown/hacked,
/obj/item/reagent_containers/spray/waterflower/cyborg/hacked)
@@ -476,11 +751,12 @@
name = "Service"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/condiment/enzyme,
/obj/item/pen,
/obj/item/toy/crayon/spraycan/borg,
- /obj/item/extinguisher/mini,
/obj/item/hand_labeler/borg,
/obj/item/razor,
/obj/item/instrument/violin,
@@ -490,31 +766,123 @@
/obj/item/lighter,
/obj/item/storage/bag/tray,
/obj/item/reagent_containers/borghypo/borgshaker,
- /obj/item/borg/lollipop)
+ /obj/item/borg/lollipop,
+ /obj/item/screwdriver/cyborg,
+ /obj/item/stack/tile/plasteel/cyborg,
+ /obj/item/soap/nanotrasen,
+ /obj/item/storage/bag/trash/cyborg,
+ /obj/item/mop/cyborg,
+ /obj/item/lightreplacer/cyborg,
+ /obj/item/holosign_creator,
+ /obj/item/reagent_containers/spray/cyborg_drying)
emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked)
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/service,
/obj/item/borg/sight/xray/truesight_lens)
moduleselect_icon = "service"
- special_light_key = "service"
hat_offset = 0
+ clean_on_move = TRUE
/obj/item/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules
+ var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules
if(O)
O.reagents.add_reagent("enzyme", 2 * coeff)
+ if(LR)
+ for(var/i in 1 to coeff)
+ LR.Charge(R)
+ var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules
+ if(CD)
+ CD.reagents.add_reagent("drying_agent", 5 * coeff)
+
+ var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules
+ if(CL)
+ CL.reagents.add_reagent("lube", 2 * coeff)
+
+/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("(Service) Waitress", "(Service) Heavy", "(Service) Sleek", "(Service) Butler", "(Service) Tophat", "(Service) Can", "(Service) Bro", "(Service) DarkK9", "(Service) Vale", "(Service) ValeDark", "(Janitor) Default", "(Janitor) Sleek", "(Janitor) Marina", "(Janitor) Can", "(Janitor) Heavy", "(Janitor) Scrubpuppy")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("(Service) Waitress")
+ cyborg_base_icon = "service_f"
+ special_light_key = "service"
+ if("(Service) Butler")
+ cyborg_base_icon = "service_m"
+ special_light_key = "service"
+ if("(Service) Bro")
+ cyborg_base_icon = "brobot"
+ special_light_key = "service"
+ if("(Service) Can")
+ cyborg_base_icon = "kent"
+ special_light_key = "medical"
+ hat_offset = 3
+ if("(Service) Tophat")
+ cyborg_base_icon = "tophat"
+ special_light_key = null
+ hat_offset = INFINITY //He is already wearing a hat
+ if("(Service) Sleek")
+ cyborg_base_icon = "sleekserv"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("(Service) Heavy")
+ cyborg_base_icon = "heavyserv"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("(Service) DarkK9")
+ cyborg_base_icon = "k50"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ sleeper_overlay = "ksleeper"
+ if("(Service) Vale")
+ cyborg_base_icon = "valeserv"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ sleeper_overlay = "valeservsleeper"
+ if("(Service) ValeDark")
+ cyborg_base_icon = "valeservdark"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ sleeper_overlay = "valeservsleeper"
+ if("(Janitor) Default")
+ cyborg_base_icon = "janitor"
+ if("(Janitor) Marina")
+ cyborg_base_icon = "marinajan"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("(Janitor) Sleek")
+ cyborg_base_icon = "sleekjan"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("(Janitor) Can")
+ cyborg_base_icon = "canjan"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("(Janitor) Heavy")
+ cyborg_base_icon = "heavyres"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("(Janitor) Scrubpuppy")
+ cyborg_base_icon = "scrubpup"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ cyborg_pixel_offset = -16
+ dogborg = TRUE
+ sleeper_overlay = "jsleeper"
+ return ..()
/obj/item/robot_module/miner
name = "Miner"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/borg/sight/meson,
/obj/item/storage/bag/ore/cyborg,
/obj/item/pickaxe/drill/cyborg,
/obj/item/shovel,
- /obj/item/crowbar/cyborg,
/obj/item/weldingtool/mini,
- /obj/item/extinguisher/mini,
/obj/item/storage/bag/sheetsnatcher/borg,
/obj/item/t_scanner/adv_mining_scanner,
/obj/item/gun/energy/kinetic_accelerator/cyborg,
@@ -529,10 +897,44 @@
moduleselect_icon = "miner"
hat_offset = 0
+/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Lavaland")
+ cyborg_base_icon = "miner"
+ if("Asteroid")
+ cyborg_base_icon = "minerOLD"
+ special_light_key = "miner"
+ if("Droid")
+ cyborg_base_icon = "miner"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 4
+ if("Sleek")
+ cyborg_base_icon = "sleekmin"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Can")
+ cyborg_base_icon = "canmin"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Marina")
+ cyborg_base_icon = "marinamin"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Spider")
+ cyborg_base_icon = "spidermin"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("Heavy")
+ cyborg_base_icon = "heavymin"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ return ..()
+
/obj/item/robot_module/syndicate
name = "Syndicate Assault"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/melee/transforming/energy/sword/cyborg,
/obj/item/gun/energy/printer,
/obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
@@ -562,6 +964,8 @@
name = "Syndicate Medical"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/reagent_containers/borghypo/syndicate,
/obj/item/twohanded/shockpaddles/syndicate,
/obj/item/healthanalyzer,
@@ -574,8 +978,6 @@
/obj/item/melee/transforming/energy/sword/cyborg/saw,
/obj/item/roller/robo,
/obj/item/card/emag,
- /obj/item/crowbar/cyborg,
- /obj/item/extinguisher/mini,
/obj/item/pinpointer/syndicate_cyborg,
/obj/item/stack/medical/gauze/cyborg,
/obj/item/gun/medbeam,
@@ -588,6 +990,47 @@
can_be_pushed = FALSE
hat_offset = 3
+/obj/item/robot_module/saboteur
+ name = "Syndicate Saboteur"
+ basic_modules = list(
+ /obj/item/assembly/flash/cyborg,
+ /obj/item/borg/sight/thermal,
+ /obj/item/construction/rcd/borg/syndicate,
+ /obj/item/pipe_dispenser,
+ /obj/item/restraints/handcuffs/cable/zipties,
+ /obj/item/extinguisher,
+ /obj/item/weldingtool/largetank/cyborg,
+ /obj/item/screwdriver/nuke,
+ /obj/item/wrench/cyborg,
+ /obj/item/crowbar/cyborg,
+ /obj/item/wirecutters/cyborg,
+ /obj/item/multitool/cyborg,
+ /obj/item/storage/part_replacer/cyborg,
+ /obj/item/holosign_creator/atmos,
+ /obj/item/weapon/gripper,
+ /obj/item/lightreplacer/cyborg,
+ /obj/item/stack/sheet/metal/cyborg,
+ /obj/item/stack/sheet/glass/cyborg,
+ /obj/item/stack/sheet/rglass/cyborg,
+ /obj/item/stack/rods/cyborg,
+ /obj/item/stack/tile/plasteel/cyborg,
+ /obj/item/destTagger/borg,
+ /obj/item/stack/cable_coil/cyborg,
+ /obj/item/pinpointer/syndicate_cyborg,
+ /obj/item/borg_chameleon,
+ )
+
+ ratvar_modules = list(
+ /obj/item/clockwork/slab/cyborg/engineer,
+ /obj/item/clockwork/replica_fabricator/cyborg)
+
+ cyborg_base_icon = "synd_engi"
+ moduleselect_icon = "malf"
+ can_be_pushed = FALSE
+ magpulsing = TRUE
+ hat_offset = -4
+ canDispose = TRUE
+
/datum/robot_energy_storage
var/name = "Generic energy storage"
var/max_energy = 30000
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 13520774c5..cda4978f50 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -13,6 +13,7 @@
mob_biotypes = list(MOB_ROBOTIC)
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
speech_span = SPAN_ROBOT
+ no_vore = TRUE
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/last_lawchange_announce = 0
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index a5943aa0e6..105cdaf5b0 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -37,6 +37,7 @@
var/obj/item/paicard/paicard // Inserted pai card.
var/allow_pai = 1 // Are we even allowed to insert a pai card.
var/bot_name
+ var/oil_spill_type = /obj/effect/decal/cleanable/oil
var/list/player_access = list() //Additonal access the bots gets when player controlled
var/emagged = FALSE
@@ -206,19 +207,19 @@
return TRUE
/mob/living/simple_animal/bot/examine(mob/user)
- ..()
+ . = ..()
if(health < maxHealth)
if(health > maxHealth/3)
- to_chat(user, "[src]'s parts look loose.")
+ . += "[src]'s parts look loose."
else
- to_chat(user, "[src]'s parts look very loose!")
+ . += "[src]'s parts look very loose!"
else
- to_chat(user, "[src] is in pristine condition.")
+ . += "[src] is in pristine condition."
/mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(amount>0 && prob(10))
- new /obj/effect/decal/cleanable/oil(loc)
. = ..()
+ if(. && prob(10))
+ new oil_spill_type(loc)
/mob/living/simple_animal/bot/updatehealth()
..()
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 1c19cd82a1..724abea214 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -16,6 +16,7 @@
bot_core_type = /obj/machinery/bot_core/honkbot
window_id = "autohonk"
window_name = "Honkomatic Bike Horn Unit v1.0.7"
+ oil_spill_type = /obj/effect/decal/cleanable/oil/slippery //slip and slide fun for the whole family
data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs
path_image_color = "#FF69B4"
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 50c331940a..fed770d0b0 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -440,7 +440,7 @@
var/reagent_id = null
if(emagged == 2) //Emagged! Time to poison everybody.
- reagent_id = "toxin"
+ reagent_id = HAS_TRAIT(C, TRAIT_TOXINLOVER)? "charcoal" : "toxin"
else
if(treat_virus)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 3cc8822d02..b7067f8904 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -69,18 +69,13 @@
/mob/living/simple_animal/hostile/construct/examine(mob/user)
var/t_He = p_they(TRUE)
var/t_s = p_s()
- var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src] !\n"
- msg += "[desc]\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] \a [src] !\n[desc]")
if(health < maxHealth)
- msg += ""
if(health >= maxHealth/2)
- msg += "[t_He] look[t_s] slightly dented.\n"
+ . += "[t_He] look[t_s] slightly dented. "
else
- msg += "[t_He] look[t_s] severely dented! \n"
- msg += " "
- msg += "*---------* "
-
- to_chat(user, msg)
+ . += "[t_He] look[t_s] severely dented! "
+ . += "*---------* "
/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M)
if(isconstruct(M)) //is it a construct?
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index d7d4d1b9f2..387973b979 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -165,44 +165,43 @@
/mob/living/simple_animal/drone/examine(mob/user)
- var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src] !\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] \a [src] !")
//Hands
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
- msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
+ . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
//Internal storage
if(internal_storage && !(internal_storage.item_flags & ABSTRACT))
- msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n"
+ . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage."
//Cosmetic hat - provides no function other than looks
if(head && !(head.item_flags & ABSTRACT))
- msg += "It is wearing [head.get_examine_string(user)] on its head.\n"
+ . += "It is wearing [head.get_examine_string(user)] on its head."
//Braindead
if(!client && stat != DEAD)
- msg += "Its status LED is blinking at a steady rate.\n"
+ . += "Its status LED is blinking at a steady rate."
//Hacked
if(hacked)
- msg += "Its display is glowing red! \n"
+ . += "Its display is glowing red! "
//Damaged
if(health != maxHealth)
if(health > maxHealth * 0.33) //Between maxHealth and about a third of maxHealth, between 30 and 10 for normal drones
- msg += "Its screws are slightly loose. \n"
+ . += "Its screws are slightly loose. "
else //otherwise, below about 33%
- msg += "Its screws are very loose! \n"
+ . += "Its screws are very loose! "
//Dead
if(stat == DEAD)
if(client)
- msg += "A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\". \n"
+ . += "A message repeatedly flashes on its display: \"REBOOT -- REQUIRED\". "
else
- msg += "A message repeatedly flashes on its display: \"ERROR -- OFFLINE\". \n"
- msg += "*---------* "
- to_chat(user, msg)
+ . += "A message repeatedly flashes on its display: \"ERROR -- OFFLINE\". "
+ . += "*---------* "
/mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones.
diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm
index 52a007e24c..b4865c4337 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm
@@ -18,18 +18,16 @@
/mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user)
if(dextrous)
- var/msg = "*---------*\nThis is [icon2html(src)] \a [src] !\n"
- msg += "[desc]\n"
+ . = list("*---------*\nThis is [icon2html(src)] \a [src] !\n[desc]")
for(var/obj/item/I in held_items)
if(!(I.item_flags & ABSTRACT))
- msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
+ . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
if(internal_storage && !(internal_storage.item_flags & ABSTRACT))
- msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n"
- msg += "*---------* "
- to_chat(user, msg)
+ . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage."
+ . += "*---------* "
else
- ..()
+ return ..()
/mob/living/simple_animal/hostile/guardian/dextrous/Recall(forced)
if(!summoner || loc == summoner || (cooldown > world.time && !forced))
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index 531c513819..b1af34eb02 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -90,6 +90,6 @@
detonate(user)
/obj/guardian_bomb/examine(mob/user)
- stored_obj.examine(user)
+ . = stored_obj.examine(user)
if(get_dist(user,src)<=2)
- to_chat(user, "It glows with a strange light ! ")
+ . += "It glows with a strange light ! "
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index c7b46e6aed..89c4f70f69 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -77,11 +77,9 @@
/mob/living/simple_animal/hostile/poison/bees/examine(mob/user)
- ..()
-
+ . = ..()
if(!beehome)
- to_chat(user, "This bee is homeless! ")
-
+ . += "This bee is homeless! "
/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
cut_overlays()
@@ -295,7 +293,7 @@
forceMove(beehome.drop_location())
else
..()
-
+
/mob/living/simple_animal/hostile/poison/bees/short
desc = "These bees seem unstable and won't survive for long."
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index d31af79c19..2b5b5236ed 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -130,7 +130,7 @@
qdel(copy)
/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user)
- ..()
+ . = ..()
qdel(src) //I see through your ruse!
//fancy effects
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index f78f7f7d82..5ee2549054 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -44,9 +44,8 @@
/mob/living/simple_animal/hostile/illusion/examine(mob/user)
if(parent_mob)
- parent_mob.examine(user)
- else
- return ..()
+ return parent_mob.examine(user)
+ return ..()
/mob/living/simple_animal/hostile/illusion/AttackingTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index b9102cf220..de5732941f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -373,8 +373,8 @@ Difficulty: Very Hard
/obj/machinery/anomalous_crystal/examine(mob/user)
. = ..()
if(isobserver(user))
- to_chat(user, observer_desc)
- to_chat(user, "It is activated by [activation_method].")
+ . += observer_desc
+ . += "It is activated by [activation_method]."
/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index dbaa8ab5fa..514edf896b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -38,11 +38,11 @@
var/static/mutable_appearance/cap_dead
/mob/living/simple_animal/hostile/mushroom/examine(mob/user)
- ..()
+ . = ..()
if(health >= maxHealth)
- to_chat(user, "It looks healthy. ")
+ . += "It looks healthy. "
else
- to_chat(user, "It looks like it's been roughed up. ")
+ . += "It looks like it's been roughed up. "
/mob/living/simple_animal/hostile/mushroom/Life()
..()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 5e2798cc8e..5f9c8700bd 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -119,9 +119,9 @@
/mob/living/simple_animal/parrot/examine(mob/user)
- ..()
+ . = ..()
if(stat)
- to_chat(user, pick("This parrot is no more.", "This is a late parrot.", "This is an ex-parrot."))
+ . += pick("This parrot is no more.", "This is a late parrot.", "This is an ex-parrot.")
/mob/living/simple_animal/parrot/death(gibbed)
if(held_item)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 2001c61e12..185d717a00 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -61,7 +61,7 @@
var/mood = "" // To show its face
var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime
var/force_stasis = FALSE
-
+
do_footstep = TRUE
var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)")
@@ -408,37 +408,32 @@
return
/mob/living/simple_animal/slime/examine(mob/user)
-
- var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src] !\n"
+ . = list("*---------*\nThis is [icon2html(src, user)] \a [src] !")
if (src.stat == DEAD)
- msg += "It is limp and unresponsive. \n"
+ . += "It is limp and unresponsive. "
else
if (stat == UNCONSCIOUS) // Slime stasis
- msg += "It appears to be alive but unresponsive. \n"
- if (src.getBruteLoss())
- msg += ""
- if (src.getBruteLoss() < 40)
- msg += "It has some punctures in its flesh!"
+ . += "It appears to be alive but unresponsive. "
+ if (getBruteLoss())
+ if (getBruteLoss() < 40)
+ . += "It has some punctures in its flesh!"
else
- msg += "It has severe punctures and tears in its flesh! "
- msg += " \n"
+ . += "It has severe punctures and tears in its flesh! "
switch(powerlevel)
if(2 to 3)
- msg += "It is flickering gently with a little electrical activity.\n"
+ . += "It is flickering gently with a little electrical activity."
if(4 to 5)
- msg += "It is glowing gently with moderate levels of electrical activity.\n"
+ . += "It is glowing gently with moderate levels of electrical activity."
if(6 to 9)
- msg += "It is glowing brightly with high levels of electrical activity. \n"
+ . += "It is glowing brightly with high levels of electrical activity. "
if(10)
- msg += "It is radiating with massive levels of electrical activity! \n"
+ . += "It is radiating with massive levels of electrical activity! "
- msg += "*---------* "
- to_chat(user, msg)
- return
+ . += "*---------* "
/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
if(stat)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 215b4ec44f..e3daa8e3c1 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -319,7 +319,8 @@
return
face_atom(A)
- A.examine(src)
+ var/list/result = A.examine(src)
+ to_chat(src, result.Join("\n"))
//same as above
//note: ghosts can point, this is intended
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 550593e316..c18fc36e9a 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -522,10 +522,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
//gets ID card object from special clothes slot or null.
/mob/proc/get_idcard(hand_first = TRUE)
var/obj/item/held_item = get_active_held_item()
- . = held_item?.GetID()
+ . = held_item ? held_item.GetID() : null
if(!.) //If so, then check the inactive hand
held_item = get_inactive_held_item()
- . = held_item?.GetID()
+ . = held_item ? held_item.GetID() : null
/mob/proc/get_id_in_hand()
var/obj/item/held_item = get_active_held_item()
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index ce2c49cb32..1b3501f78b 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -202,11 +202,11 @@
return TRUE
/obj/item/modular_computer/examine(mob/user)
- ..()
+ . = ..()
if(obj_integrity <= integrity_failure)
- to_chat(user, "It is heavily damaged! ")
+ . += "It is heavily damaged! "
else if(obj_integrity < max_integrity)
- to_chat(user, "It is damaged. ")
+ . += "It is damaged. "
/obj/item/modular_computer/update_icon()
cut_overlays()
diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm
index 3106a9e510..4d4dee1b8c 100644
--- a/code/modules/modular_computers/computers/item/laptop.dm
+++ b/code/modules/modular_computers/computers/item/laptop.dm
@@ -22,9 +22,9 @@
var/slowdown_open = TRUE
/obj/item/modular_computer/laptop/examine(mob/user)
- ..()
+ . = ..()
if(screen_on)
- to_chat(user, "Alt-click to close it. ")
+ . += "Alt-click to close it. "
/obj/item/modular_computer/laptop/Initialize()
. = ..()
diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm
index 8b70fd246c..f83442b137 100644
--- a/code/modules/modular_computers/computers/machinery/console_presets.dm
+++ b/code/modules/modular_computers/computers/machinery/console_presets.dm
@@ -47,8 +47,8 @@
_has_ai = TRUE
/obj/machinery/modular_computer/console/preset/research/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to eject the intelliCard. ")
+ . = ..()
+ . += "Alt-click to eject the intelliCard. "
/obj/machinery/modular_computer/console/preset/research/install_programs()
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
@@ -67,8 +67,8 @@
_has_printer = TRUE
/obj/machinery/modular_computer/console/preset/command/examine(mob/user)
- ..()
- to_chat(user, "Alt-click [src] to eject the identification card. ")
+ . = ..()
+ . += "Alt-click [src] to eject the identification card. "
/obj/machinery/modular_computer/console/preset/command/install_programs()
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index 56efec379a..744db1572f 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -76,11 +76,11 @@
/obj/item/computer_hardware/examine(var/mob/user)
. = ..()
if(damage > damage_failure)
- to_chat(user, "It seems to be severely damaged! ")
+ . += "It seems to be severely damaged! "
else if(damage > damage_malfunction)
- to_chat(user, "It seems to be damaged! ")
+ . += "It seems to be damaged! "
else if(damage)
- to_chat(user, "It seems to be slightly damaged. ")
+ . += "It seems to be slightly damaged. "
// Component-side compatibility check.
/obj/item/computer_hardware/proc/can_install(obj/item/modular_computer/M, mob/living/user = null)
diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm
index 5dee122544..47cbbff418 100644
--- a/code/modules/modular_computers/hardware/ai_slot.dm
+++ b/code/modules/modular_computers/hardware/ai_slot.dm
@@ -11,9 +11,9 @@
/obj/item/computer_hardware/ai_slot/examine(mob/user)
- ..()
+ . = ..()
if(stored_card)
- to_chat(user, "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it.")
+ . += "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it."
/obj/item/computer_hardware/ai_slot/on_install(obj/item/modular_computer/M, mob/living/user = null)
M.add_verb(device_type)
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
index 725df2fdb8..c68e1ad119 100644
--- a/code/modules/modular_computers/hardware/card_slot.dm
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -117,6 +117,6 @@
return
/obj/item/computer_hardware/card_slot/examine(mob/user)
- ..()
+ . = ..()
if(stored_card || stored_card2)
- to_chat(user, "There appears to be something loaded in the card slots.")
+ . += "There appears to be something loaded in the card slots."
diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm
index 1e3c517351..4109b2c3f0 100644
--- a/code/modules/modular_computers/hardware/hard_drive.dm
+++ b/code/modules/modular_computers/hardware/hard_drive.dm
@@ -19,8 +19,8 @@
store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation.
/obj/item/computer_hardware/hard_drive/examine(user)
- ..()
- to_chat(user, "It has [max_capacity] GQ of storage capacity. ")
+ . = ..()
+ . += "It has [max_capacity] GQ of storage capacity. "
/obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user)
..()
@@ -121,7 +121,7 @@
return ..()
/obj/item/computer_hardware/hard_drive/Initialize()
- . = ..()
+ . = ..()
install_default_programs()
diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm
index b000c353b0..44383822cc 100644
--- a/code/modules/modular_computers/hardware/printer.dm
+++ b/code/modules/modular_computers/hardware/printer.dm
@@ -13,8 +13,8 @@
to_chat(user, "Paper level: [stored_paper]/[max_paper].")
/obj/item/computer_hardware/printer/examine(mob/user)
- ..()
- to_chat(user, "Paper level: [stored_paper]/[max_paper]. ")
+ . = ..()
+ . += "Paper level: [stored_paper]/[max_paper]. "
/obj/item/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "")
diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm
index ad63f55b90..7ee71db1f1 100644
--- a/code/modules/ninja/outfit.dm
+++ b/code/modules/ninja/outfit.dm
@@ -16,7 +16,7 @@
implants = list(/obj/item/implant/explosive)
-/datum/outfit/ninja/post_equip(mob/living/carbon/human/H)
+/datum/outfit/ninja/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(istype(H.wear_suit, suit))
var/obj/item/clothing/suit/space/space_ninja/S = H.wear_suit
if(istype(H.belt, belt))
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 276de652bc..e819fe55fd 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -78,6 +78,6 @@
candrain=!candrain
/obj/item/clothing/gloves/space_ninja/examine(mob/user)
- ..()
+ . = ..()
if(HAS_TRAIT_FROM(src, TRAIT_NODROP, NINJA_SUIT_TRAIT))
- to_chat(user, "The energy drain mechanism is [candrain?"active":"inactive"] .")
+ . += "The energy drain mechanism is [candrain?"active":"inactive"] ."
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index d89bb9edf2..03fc7a2ed2 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -149,12 +149,12 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/examine(mob/user)
- ..()
+ . = ..()
if(s_initialized && user == affecting)
- to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)] .\n\
+ . += "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)] .\n\
The CLOAK-tech device is [stealth?"active":"inactive"] .\n\
There are [s_bombs] smoke bomb\s remaining.\n\
- There are [a_boost] adrenaline booster\s remaining.")
+ There are [a_boost] adrenaline booster\s remaining."
/obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/initialize_ninja_suit))
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 1d6326a3ed..c9b7fb7b57 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -90,12 +90,12 @@
/obj/item/paper/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to fold it. ")
+ . = ..()
+ . += "Alt-click to fold it. "
if(oui_canview(user))
ui.render(user)
else
- to_chat(user, "You're too far away to read it! ")
+ . += "You're too far away to read it! "
/obj/item/paper/proc/show_content(mob/user)
user.examinate(src)
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 6d9c6373ba..7318af0e32 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -116,11 +116,11 @@
return ..()
/obj/item/paper_bin/examine(mob/user)
- ..()
+ . = ..()
if(total_paper)
- to_chat(user, "It contains " + (total_paper > 1 ? "[total_paper] papers" : " one paper")+".")
+ . += "It contains [total_paper > 1 ? "[total_paper] papers" : " one paper"]."
else
- to_chat(user, "It doesn't contain anything.")
+ . += "It doesn't contain anything."
/obj/item/paper_bin/update_icon()
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index b547089aef..ecef5a703a 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -118,8 +118,8 @@
H.emote("scream")
/obj/item/paper/examine(mob/user)
- ..()
- to_chat(user, "Alt-click [src] to fold it into a paper plane. ")
+ . = ..()
+ . += "Alt-click [src] to fold it into a paper plane. "
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK))
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 8c51fd31ea..9d01eca0cf 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -43,7 +43,7 @@
/obj/item/camera/examine(mob/user)
. = ..()
- to_chat(user, "Alt-click to change its focusing, allowing you to set how big of an area it will capture. ")
+ . += "Alt-click to change its focusing, allowing you to set how big of an area it will capture. "
/obj/item/camera/AltClick(mob/user)
if(!user.canUseTopic(src, BE_CLOSE))
@@ -81,8 +81,8 @@
..()
/obj/item/camera/examine(mob/user)
- ..()
- to_chat(user, "It has [pictures_left] photos left.")
+ . = ..()
+ . += "It has [pictures_left] photos left."
//user can be atom or mob
/obj/item/camera/proc/can_target(atom/target, mob/user, prox_flag)
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 6469a1091b..5986da1ce8 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -40,8 +40,8 @@
/obj/item/wallframe/picture/examine(mob/user)
if(user.is_holding(src) && displayed)
displayed.show(user)
- else
- ..()
+ return list()
+ return ..()
/obj/item/wallframe/picture/update_icon()
cut_overlays()
@@ -109,8 +109,8 @@
/obj/structure/sign/picture_frame/examine(mob/user)
if(in_range(src, user) && framed)
framed.show(user)
- else
- ..()
+ return list()
+ return ..()
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params)
if(can_decon && (istype(I, /obj/item/screwdriver) || istype(I, /obj/item/wrench)))
diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm
index 99e61cf3f0..5682c333c7 100644
--- a/code/modules/photography/photos/photo.dm
+++ b/code/modules/photography/photos/photo.dm
@@ -62,12 +62,11 @@
..()
/obj/item/photo/examine(mob/user)
- ..()
-
+ . = ..()
if(in_range(src, user))
show(user)
else
- to_chat(user, "You need to get closer to get a good look at this photo! ")
+ . += "You need to get closer to get a good look at this photo! "
/obj/item/photo/proc/show(mob/user)
if(!istype(picture) || !picture.picture_image)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 5fc29cb813..5e3888a8c5 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -243,33 +243,33 @@
addtimer(CALLBACK(src, .proc/update), 5)
/obj/machinery/power/apc/examine(mob/user)
- ..()
+ . = ..()
if(stat & BROKEN)
return
if(opened)
if(has_electronics && terminal)
- to_chat(user, "The cover is [opened==APC_COVER_REMOVED?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].")
+ . += "The cover is [opened==APC_COVER_REMOVED?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]."
else
- to_chat(user, "It's [ !terminal ? "not" : "" ] wired up.")
- to_chat(user, "The electronics are[!has_electronics?"n't":""] installed.")
+ . += "It's [ !terminal ? "not" : "" ] wired up."
+ . += "The electronics are[!has_electronics?"n't":""] installed."
if(user.Adjacent(src) && integration_cog)
- to_chat(user, "[src]'s innards have been replaced by strange brass machinery! ")
+ . += "[src]'s innards have been replaced by strange brass machinery! "
else
if (stat & MAINT)
- to_chat(user, "The cover is closed. Something is wrong with it. It doesn't work.")
+ . += "The cover is closed. Something is wrong with it. It doesn't work."
else if (malfhack)
- to_chat(user, "The cover is broken. It may be hard to force it open.")
+ . += "The cover is broken. It may be hard to force it open."
else
- to_chat(user, "The cover is closed.")
+ . += "The cover is closed."
if(integration_cog && is_servant_of_ratvar(user))
- to_chat(user, "There is an integration cog installed! ")
+ . += "There is an integration cog installed! "
- to_chat(user, "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface. ")
+ . += "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface. "
if(issilicon(user))
- to_chat(user, "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"]. ")
+ . += "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"]. "
// update the APC icon to show the three base states
// also add overlays for indicator lights
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index bbbf8edae5..2855e3c321 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -94,11 +94,11 @@
return power_used
/obj/item/stock_parts/cell/examine(mob/user)
- ..()
+ . = ..()
if(rigged)
- to_chat(user, "This power cell seems to be faulty! ")
+ . += "This power cell seems to be faulty! "
else
- to_chat(user, "The charge meter reads [round(src.percent() )]%.")
+ . += "The charge meter reads [round(src.percent() )]%."
/obj/item/stock_parts/cell/suicide_act(mob/user)
user.visible_message("[user] is licking the electrodes of [src]! It looks like [user.p_theyre()] trying to commit suicide! ")
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index b5ee0b2da4..cdbaa29a3b 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -66,22 +66,21 @@
return cell
/obj/structure/light_construct/examine(mob/user)
- ..()
+ . = ..()
switch(src.stage)
if(1)
- to_chat(user, "It's an empty frame.")
+ . += "It's an empty frame."
if(2)
- to_chat(user, "It's wired.")
+ . += "It's wired."
if(3)
- to_chat(user, "The casing is closed.")
+ . += "The casing is closed."
if(cell_connectors)
if(cell)
- to_chat(user, "You see [cell] inside the casing.")
+ . += "You see [cell] inside the casing."
else
- to_chat(user, "The casing has no power cell for backup power.")
+ . += "The casing has no power cell for backup power."
else
- to_chat(user, "This casing doesn't support power cells for backup power. ")
- return
+ . += "This casing doesn't support power cells for backup power. "
/obj/structure/light_construct/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
@@ -393,18 +392,18 @@
// examine verb
/obj/machinery/light/examine(mob/user)
- ..()
+ . = ..()
switch(status)
if(LIGHT_OK)
- to_chat(user, "It is turned [on? "on" : "off"].")
+ . += "It is turned [on? "on" : "off"]."
if(LIGHT_EMPTY)
- to_chat(user, "The [fitting] has been removed.")
+ . += "The [fitting] has been removed."
if(LIGHT_BURNED)
- to_chat(user, "The [fitting] is burnt out.")
+ . += "The [fitting] is burnt out."
if(LIGHT_BROKEN)
- to_chat(user, "The [fitting] has been smashed.")
+ . += "The [fitting] has been smashed."
if(cell)
- to_chat(user, "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%.")
+ . += "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%."
diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm
index a934d08997..28843e14e0 100644
--- a/code/modules/power/monitor.dm
+++ b/code/modules/power/monitor.dm
@@ -27,8 +27,8 @@
is_secret_monitor = TRUE
/obj/machinery/computer/monitor/secret/examine(mob/user)
- ..()
- to_chat(user, "It's operating system seems quite outdated... It doesn't seem like it'd be compatible with the latest remote NTOS monitoring systems. ")
+ . = ..()
+ . += "It's operating system seems quite outdated... It doesn't seem like it'd be compatible with the latest remote NTOS monitoring systems. "
/obj/machinery/computer/monitor/Initialize()
. = ..()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 7375a3e17a..a9cd97c331 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -56,8 +56,8 @@
soundloop.stop()
/obj/machinery/power/port_gen/examine(mob/user)
- ..()
- to_chat(user, "It is[!active?"n't":""] running.")
+ . = ..()
+ . += "It is[!active?"n't":""] running."
/obj/machinery/power/port_gen/pacman
name = "\improper P.A.C.M.A.N.-type portable generator"
@@ -99,10 +99,10 @@
consumption = consumption_coeff
/obj/machinery/power/port_gen/pacman/examine(mob/user)
- ..()
- to_chat(user, "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle. ")
+ . = ..()
+ . += "The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle. "
if(crit_fail)
- to_chat(user, "The generator seems to have broken down. ")
+ . += "The generator seems to have broken down. "
/obj/machinery/power/port_gen/pacman/HasFuel()
if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left)
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 974b210648..b1b0d2d718 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -171,14 +171,14 @@
. = ..()
if(active)
if(!bitcoinmining)
- to_chat(user, "[src]'s display states that it has stored [DisplayPower(stored_power)] , and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute. The plasma within it's tank is being irradiated into tritium . ")
+ . += "[src]'s display states that it has stored [DisplayPower(stored_power)] , and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute. The plasma within it's tank is being irradiated into tritium . "
else
- to_chat(user, "[src]'s display states that it's producing a total of [(last_push*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute. The tritium and oxygen within it's tank is being combusted into carbon dioxide . ")
+ . += "[src]'s display states that it's producing a total of [(last_push*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute. The tritium and oxygen within it's tank is being combusted into carbon dioxide . "
else
if(!bitcoinmining)
- to_chat(user,"[src]'s display displays the words: \"Power production mode. Please insert Plasma . Use a multitool to change production modes.\" ")
+ . += "[src]'s display displays the words: \"Power production mode. Please insert Plasma . Use a multitool to change production modes.\" "
else
- to_chat(user,"[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen . Use a multitool to change production modes.\" ")
+ . += "[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen . Use a multitool to change production modes.\" "
/obj/machinery/power/rad_collector/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 9f7c3ba05a..82d33e59ff 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -36,15 +36,14 @@
var/strength = null
/obj/structure/particle_accelerator/examine(mob/user)
- ..()
-
+ . = ..()
switch(construction_state)
if(PA_CONSTRUCTION_UNSECURED)
- to_chat(user, "Looks like it's not attached to the flooring.")
+ . += "Looks like it's not attached to the flooring."
if(PA_CONSTRUCTION_UNWIRED)
- to_chat(user, "It is missing some cables.")
+ . += "It is missing some cables."
if(PA_CONSTRUCTION_PANEL_OPEN)
- to_chat(user, "The panel is open.")
+ . += "The panel is open."
/obj/structure/particle_accelerator/Destroy()
construction_state = PA_CONSTRUCTION_UNSECURED
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 66870d73e8..685030d4e6 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -257,14 +257,14 @@
popup.open()
/obj/machinery/particle_accelerator/control_box/examine(mob/user)
- ..()
+ . = ..()
switch(construction_state)
if(PA_CONSTRUCTION_UNSECURED)
- to_chat(user, "Looks like it's not attached to the flooring.")
+ . += "Looks like it's not attached to the flooring."
if(PA_CONSTRUCTION_UNWIRED)
- to_chat(user, "It is missing some cables.")
+ . += "It is missing some cables."
if(PA_CONSTRUCTION_PANEL_OPEN)
- to_chat(user, "The panel is open.")
+ . += "The panel is open."
/obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 3637bf38f7..774f7ba14d 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -39,9 +39,9 @@
var/obj/machinery/power/terminal/terminal = null
/obj/machinery/power/smes/examine(user)
- ..()
+ . = ..()
if(!terminal)
- to_chat(user, "This SMES has no power terminal! ")
+ . += "This SMES has no power terminal! "
/obj/machinery/power/smes/Initialize()
. = ..()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 4cbb88fe6b..9184c7e4eb 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -187,17 +187,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
return ..()
/obj/machinery/power/supermatter_crystal/examine(mob/user)
- ..()
- if(!ishuman(user))
- return
-
- var/range = HALLUCINATION_RANGE(power)
- for(var/mob/living/carbon/human/H in viewers(range, src))
- if(H != user)
- continue
- if(!istype(H.glasses, /obj/item/clothing/glasses/meson))
- to_chat(H, "You get headaches just from looking at it. ")
- return
+ . = ..()
+ if (iscarbon(user))
+ var/mob/living/carbon/C = user
+ if (!istype(C.glasses, /obj/item/clothing/glasses/meson) && (get_dist(user, src) < HALLUCINATION_RANGE(power)))
+ . += "You get headaches just from looking at it. "
/obj/machinery/power/supermatter_crystal/proc/get_status()
var/turf/T = get_turf(src)
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 9a5486dfe2..f8d25c0c9c 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -71,9 +71,9 @@
energy = 0 // ensure we dont have miniballs of miniballs
/obj/singularity/energy_ball/examine(mob/user)
- ..()
+ . = ..()
if(orbiting_balls.len)
- to_chat(user, "The amount of orbiting mini-balls is [orbiting_balls.len].")
+ . += "The amount of orbiting mini-balls is [orbiting_balls.len]."
/obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 96b396243b..026f725e2f 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -86,11 +86,11 @@
qdel(src)
/obj/item/gun/examine(mob/user)
- ..()
+ . = ..()
if(pin)
- to_chat(user, "It has \a [pin] installed.")
+ . += "It has \a [pin] installed."
else
- to_chat(user, "It doesn't have a firing pin installed, and won't fire.")
+ . += "It doesn't have a firing pin installed, and won't fire."
/obj/item/gun/equipped(mob/living/user, slot)
. = ..()
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index a5262da7a3..fd40f437ca 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -139,8 +139,8 @@
/obj/item/gun/ballistic/examine(mob/user)
- ..()
- to_chat(user, "It has [get_ammo()] round\s remaining.")
+ . = ..()
+ . += "It has [get_ammo()] round\s remaining."
/obj/item/gun/ballistic/proc/get_ammo(countchambered = 1)
var/boolets = 0 //mature var names for mature people
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 5182c96671..bcb212a031 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -309,9 +309,9 @@
pin = /obj/item/firing_pin
/obj/item/gun/ballistic/automatic/l6_saw/examine(mob/user)
- ..()
+ . = ..()
if(cover_open && magazine)
- to_chat(user, "It seems like you could use an empty hand to remove the magazine. ")
+ . += "It seems like you could use an empty hand to remove the magazine. "
/obj/item/gun/ballistic/automatic/l6_saw/attack_self(mob/user)
cover_open = !cover_open
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 25a50f3e03..d1a5f12888 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -81,8 +81,8 @@
return boolets
/obj/item/gun/ballistic/revolver/examine(mob/user)
- ..()
- to_chat(user, "[get_ammo(0,0)] of those are live rounds.")
+ . = ..()
+ . += "[get_ammo(0,0)] of those are live rounds."
/obj/item/gun/ballistic/revolver/detective
name = "\improper .38 Mars Special"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 47ccb6076f..1e1b518849 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -74,9 +74,9 @@
chambered = AC
/obj/item/gun/ballistic/shotgun/examine(mob/user)
- ..()
+ . = ..()
if (chambered)
- to_chat(user, "A [chambered.BB ? "live" : "spent"] one is in the chamber.")
+ . += "A [chambered.BB ? "live" : "spent"] one is in the chamber."
/obj/item/gun/ballistic/shotgun/lethal
mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal
@@ -143,8 +143,8 @@
. = ..()
/obj/item/gun/ballistic/shotgun/boltaction/examine(mob/user)
- ..()
- to_chat(user, "The bolt is [bolt_open ? "open" : "closed"].")
+ . = ..()
+ . += "The bolt is [bolt_open ? "open" : "closed"]."
/obj/item/gun/ballistic/shotgun/boltaction/enchanted
name = "enchanted bolt action rifle"
@@ -231,8 +231,8 @@
. = ..()
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to toggle the stock. ")
+ . = ..()
+ . += "Alt-click to toggle the stock. "
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/proc/toggle_stock(mob/living/user)
stock = !stock
@@ -263,9 +263,8 @@
var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to pump it. ")
. = ..()
+ . += "Alt-click to pump it. "
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize()
. = ..()
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 646b4bd57d..b216d8d536 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -61,12 +61,12 @@
cut_overlays()
/obj/item/gun/energy/kinetic_accelerator/examine(mob/user)
- ..()
+ . = ..()
if(max_mod_capacity)
- to_chat(user, "[get_remaining_mod_capacity()]% mod capacity remaining.")
+ . += "[get_remaining_mod_capacity()]% mod capacity remaining."
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
- to_chat(user, "There is \a [M] installed, using [M.cost]% capacity. ")
+ . += "There is \a [M] installed, using [M.cost]% capacity. "
/obj/item/gun/energy/kinetic_accelerator/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
@@ -276,8 +276,8 @@
var/minebot_exclusive = FALSE
/obj/item/borg/upgrade/modkit/examine(mob/user)
- ..()
- to_chat(user, "Occupies [cost]% of mod capacity. ")
+ . = ..()
+ . += "Occupies [cost]% of mod capacity. "
/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/gun/energy/kinetic_accelerator) && !issilicon(user))
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 2bb813d793..150ee74a65 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -64,6 +64,8 @@
/obj/item/gun/energy/laser/cyborg
can_charge = FALSE
desc = "An energy-based laser gun that draws power from the cyborg's internal energy cell directly. So this is what freedom looks like?"
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "laser_cyborg"
selfcharge = EGUN_SELFCHARGE_BORG
cell_type = /obj/item/stock_parts/cell/secborg
charge_delay = 3
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 87bfd578bc..a61654142c 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -135,9 +135,9 @@
AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg')
/obj/item/gun/energy/plasmacutter/examine(mob/user)
- ..()
+ . = ..()
if(cell)
- to_chat(user, "[src] is [round(cell.percent())]% charged. ")
+ . += "[src] is [round(cell.percent())]% charged. "
/obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/sheet/mineral/plasma))
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index c5d4c36813..aa00831e97 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -26,6 +26,8 @@
/obj/item/gun/energy/e_gun/advtaser/cyborg
name = "cyborg taser"
desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The one contains a limiter to prevent the cyborg's power cell from overheating."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "taser"
can_flashlight = FALSE
can_charge = FALSE
selfcharge = EGUN_SELFCHARGE_BORG
@@ -48,6 +50,8 @@
/obj/item/gun/energy/disabler/cyborg
name = "cyborg disabler"
desc = "An integrated disabler that draws from a cyborg's power cell. This one contains a limiter to prevent the cyborg's power cell from overheating."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "taser"
can_charge = FALSE
ammo_type = list(/obj/item/ammo_casing/energy/disabler/secborg)
selfcharge = EGUN_SELFCHARGE_BORG
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index 4cdfc6d70d..95809f5044 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -18,8 +18,8 @@
return ..()
/obj/item/gun/magic/wand/examine(mob/user)
- ..()
- to_chat(user, "Has [charges] charge\s remaining.")
+ . = ..()
+ . += "Has [charges] charge\s remaining."
/obj/item/gun/magic/wand/update_icon()
icon_state = "[initial(icon_state)][charges ? "" : "-drained"]"
diff --git a/code/modules/projectiles/guns/misc/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm
index eb36438a6c..dc44a1f4ff 100644
--- a/code/modules/projectiles/guns/misc/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm
@@ -13,8 +13,8 @@
materials = list(MAT_METAL=2000)
/obj/item/gun/grenadelauncher/examine(mob/user)
- ..()
- to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.")
+ . = ..()
+ . += "[grenades.len] / [max_grenades] grenades loaded."
/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index 342ceecbc2..8a9d1c5b6b 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -30,8 +30,8 @@
recharge_newshot()
/obj/item/gun/syringe/examine(mob/user)
- ..()
- to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.")
+ . = ..()
+ . += "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining."
/obj/item/gun/syringe/attack_self(mob/living/user)
if(!syringes.len)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index ea9c96ee0c..be73e22e6d 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -69,12 +69,12 @@
/obj/item/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
- damage = 24 // Citadel change for balance from 36
+ damage = 28 // Citadel change for balance from 36
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
- speed = 0.7
+ speed = 0.6
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
tracer_type = /obj/effect/projectile/tracer/disabler
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 6f42b67750..d91c60367d 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -153,6 +153,7 @@
var/robot = pick(200;/mob/living/silicon/robot,
/mob/living/silicon/robot/modules/syndicate,
/mob/living/silicon/robot/modules/syndicate/medical,
+ /mob/living/silicon/robot/modules/syndicate/saboteur,
200;/mob/living/simple_animal/drone/polymorphed)
new_mob = new robot(M.loc)
if(issilicon(new_mob))
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index d90c9cada1..00c1db3594 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -88,20 +88,21 @@
return ..()
/obj/machinery/chem_dispenser/examine(mob/user)
- ..()
+ . = ..()
if(panel_open)
- to_chat(user, "[src]'s maintenance hatch is open! ")
+ . += "[src]'s maintenance hatch is open! "
if(in_range(user, src) || isobserver(user))
- to_chat(user, "The status display reads: Recharging [recharge_amount] power units per interval. Power efficiency increased by [(powerefficiency*1000)-100]% .")
+ . += "The status display reads: Recharging [recharge_amount] power units per interval. Power efficiency increased by [(powerefficiency*1000)-100]% ."
switch(macrotier)
if(1)
- to_chat(user, "Macro granularity at 5u .")
+ . += "Macro granularity at 5u ."
if(2)
- to_chat(user, "Macro granularity at 3u .")
+ . += "Macro granularity at 3u ."
if(3)
- to_chat(user, "Macro granularity at 2u .")
+ . += "Macro granularity at 2u ."
if(4)
- to_chat(user, "Macro granularity at 1u .")
+ . += "Macro granularity at 1u ."
+
/obj/machinery/chem_dispenser/process()
if (recharge_counter >= 4)
if(!is_operational())
@@ -382,9 +383,10 @@
/obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
- beaker.forceMove(drop_location())
+ var/obj/item/reagent_containers/B = beaker
+ B.forceMove(drop_location())
if(user && Adjacent(user) && !issiliconoradminghost(user))
- user.put_in_hands(beaker)
+ user.put_in_hands(B)
if(new_beaker)
beaker = new_beaker
else
@@ -396,7 +398,6 @@
cell = null
if(beaker)
beaker.forceMove(drop_location())
- beaker = null
return ..()
/obj/machinery/chem_dispenser/proc/get_macro_resolution()
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 1847f1f722..98cfd877b2 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -191,27 +191,27 @@
/obj/machinery/reagentgrinder/examine(mob/user)
. = ..()
if(!in_range(user, src) && !issilicon(user) && !isobserver(user))
- to_chat(user, "You're too far away to examine [src]'s contents and display! ")
+ . += "You're too far away to examine [src]'s contents and display! "
return
if(operating)
- to_chat(user, "\The [src] is operating. ")
+ . += "\The [src] is operating. "
return
if(beaker || length(holdingitems))
- to_chat(user, "\The [src] contains: ")
+ . += "\The [src] contains: "
if(beaker)
- to_chat(user, "- \A [beaker]. ")
+ . += "- \A [beaker]. "
for(var/i in holdingitems)
var/obj/item/O = i
- to_chat(user, "- \A [O.name]. ")
+ . += "- \A [O.name]. "
if(!(stat & (NOPOWER|BROKEN)))
- to_chat(user, "The status display reads: ")
- to_chat(user, "- Grinding reagents at [speed*100]% .")
+ . += "The status display reads: "
+ . += "- Grinding reagents at [speed*100]% ."
if(beaker)
for(var/datum/reagent/R in beaker.reagents.reagent_list)
- to_chat(user, "- [R.volume] units of [R.name]. ")
+ . += "- [R.volume] units of [R.name]. "
/obj/machinery/reagentgrinder/proc/eject(mob/user)
for(var/i in holdingitems)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index fdb8dde232..bd60880324 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1830,6 +1830,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
value = 2
/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M)
+ M.apply_status_effect(/datum/status_effect/throat_soothed)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
..()
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 7cecfc016d..63e3b46fed 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -786,6 +786,10 @@
glass_name = "glass of menthol"
glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
+/datum/reagent/consumable/menthol/on_mob_life(mob/living/L)
+ L.apply_status_effect(/datum/status_effect/throat_soothed)
+ ..()
+
/datum/reagent/consumable/grenadine
name = "Grenadine"
id = "grenadine"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 547f610d11..4d02706a3c 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -756,6 +756,30 @@
taste_description = "mournful honking"
pH = 9.2
+/datum/reagent/consumable/liquidelectricity
+ name = "Liquid Electricity"
+ id = "liquidelectricity"
+ description = "The blood of Ethereals, and the stuff that keeps them going. Great for them, horrid for anyone else."
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#97ee63"
+ taste_description = "pure electricity"
+
+/* //We don't have ethereals here, so I'll just comment it out.
+/datum/reagent/consumable/liquidelectricity/reaction_mob(mob/living/M, method=TOUCH, reac_volume) //can't be on life because of the way blood works.
+ if((method == INGEST || method == INJECT || method == PATCH) && iscarbon(M))
+
+ var/mob/living/carbon/C = M
+ var/obj/item/organ/stomach/ethereal/stomach = C.getorganslot(ORGAN_SLOT_STOMACH)
+ if(istype(stomach))
+ stomach.adjust_charge(reac_volume * REM)
+*/
+
+/datum/reagent/consumable/liquidelectricity/on_mob_life(mob/living/carbon/M)
+ if(prob(25)) // && !isethereal(M))
+ M.electrocute_act(rand(10,15), "Liquid Electricity in their body", 1) //lmao at the newbs who eat energy bars
+ playsound(M, "sparks", 50, TRUE)
+ return ..()
+
/datum/reagent/consumable/astrotame
name = "Astrotame"
id = "astrotame"
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index c4decc081d..6700c6c006 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1464,3 +1464,50 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
M.adjustToxLoss(1, 0)
..()
. = 1
+
+/datum/reagent/medicine/silibinin
+ name = "Silibinin"
+ id = "silibinin"
+ description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver."
+ reagent_state = SOLID
+ color = "#FFFFD0"
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented.
+ ..()
+ . = 1
+
+/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems.
+ name = "Polypyrylium Oligomers"
+ id = "polypyr"
+ description = "A�purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals."
+ reagent_state = SOLID
+ color = "#9423FF"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 50
+ taste_description = "numbing bitterness"
+
+/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I w�nted a collection of small positive effects, this is as hard to obtain as coniine after all.
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25)
+ M.adjustBruteLoss(-0.35, 0)
+ if(prob(50))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.bleed_rate = max(H.bleed_rate - 1, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/polypyr/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH || method == VAPOR)
+ if(M && ishuman(M) && reac_volume >= 0.5)
+ var/mob/living/carbon/human/H = M
+ H.hair_color = "92f"
+ H.facial_hair_color = "92f"
+ H.update_hair()
+
+/datum/reagent/medicine/polypyr/overdose_process(mob/living/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5)
+ ..()
+ . = 1
+
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 30d432ce55..e91719504e 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -515,6 +515,7 @@
///Stronger kind of lube. Applies TURF_WET_SUPERLUBE.
/datum/reagent/lube/superlube
name = "Super Duper Lube"
+ id = "superlube"
description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]."
lube_kind = TURF_WET_SUPERLUBE
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 2b50ecc0f1..e77cf5b9dc 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -967,3 +967,23 @@
else
M.gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
..()
+
+/datum/reagent/toxin/bungotoxin
+ name = "Bungotoxin"
+ id = "bungotoxin"
+ description = "A horrible cardiotoxin that protects the humble bungo pit."
+ //silent_toxin = TRUE //I guess we don't really have the entire tox system ported.
+ color = "#EBFF8E"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ toxpwr = 0
+ taste_description = "tannin"
+
+/datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 3)
+ M.confused = M.dizziness //add a tertiary effect here if this is isn't an effective poison.
+ if(current_cycle >= 12 && prob(8))
+ var/tox_message = pick("You feel your heart spasm in your chest.", "You feel faint.","You feel you need to catch your breath.","You feel a prickle of pain in your chest.")
+ to_chat(M, "[tox_message] ")
+ . = 1
+ ..()
+
diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm
index 153372101e..59394e6e4b 100644
--- a/code/modules/reagents/chemistry/recipes/special.dm
+++ b/code/modules/reagents/chemistry/recipes/special.dm
@@ -173,7 +173,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related
/obj/item/paper/secretrecipe/examine(mob/user) //Extra secret
if(isobserver(user))
- return
+ return list()
. = ..()
/obj/item/paper/secretrecipe/Initialize()
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 631e5ee281..2bd5fb2d9f 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -124,9 +124,8 @@ Borg Hypospray
return
/obj/item/reagent_containers/borghypo/examine(mob/user)
- usr = user
- ..()
- DescribeContents() //Because using the standardized reagents datum was just too cool for whatever fuckwit wrote this
+ . = ..()
+ . += DescribeContents() //Because using the standardized reagents datum was just too cool for whatever fuckwit wrote this
/obj/item/reagent_containers/borghypo/proc/DescribeContents()
var/empty = 1
@@ -134,11 +133,11 @@ Borg Hypospray
for(var/datum/reagents/RS in reagent_list)
var/datum/reagent/R = locate() in RS.reagent_list
if(R)
- to_chat(usr, "It currently has [R.volume] unit\s of [R.name] stored. ")
+ . += "It currently has [R.volume] unit\s of [R.name] stored. "
empty = 0
if(empty)
- to_chat(usr, "It is currently empty! Allow some time for the internal syntheszier to produce more. ")
+ . += "It is currently empty! Allow some time for the internal syntheszier to produce more. "
/obj/item/reagent_containers/borghypo/hacked
icon_state = "borghypo_s"
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 432b9289dd..85cb544667 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -121,11 +121,11 @@
icon_state = "[initial(icon_state)]0"
/obj/item/reagent_containers/hypospray/medipen/examine()
- ..()
+ . = ..()
if(reagents && reagents.reagent_list.len)
- to_chat(usr, "It is currently loaded. ")
+ . += "It is currently loaded. "
else
- to_chat(usr, "It is spent. ")
+ . += "It is spent. "
/obj/item/reagent_containers/hypospray/medipen/stimulants
name = "illegal stimpack medipen"
@@ -296,10 +296,10 @@
/obj/item/hypospray/mkii/examine(mob/user)
. = ..()
if(vial)
- to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.")
+ . += "[vial] has [vial.reagents.total_volume]u remaining."
else
- to_chat(user, "It has no vial loaded in.")
- to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.")
+ . += "It has no vial loaded in."
+ . += "[src] is set to [mode ? "Inject" : "Spray"] contents on application."
/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user)
if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm
index 92a4b155d8..8d44a2a406 100644
--- a/code/modules/reagents/reagent_containers/rags.dm
+++ b/code/modules/reagents/reagent_containers/rags.dm
@@ -23,7 +23,7 @@
/obj/item/reagent_containers/rag/examine(mob/user)
. = ..()
if(reagents.total_volume)
- to_chat(user, "Alt-Click to squeeze the liquids out of it. ")
+ . += "Alt-Click to squeeze the liquids out of it. "
/obj/item/reagent_containers/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity)
. = ..()
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index b3f9ef8202..ddbc6cf92b 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -230,7 +230,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "clownflower"
volume = 30
- list_reagents = list(/datum/reagent/lube/superlube = 30)
+ list_reagents = list("superlube" = 30)
/obj/item/reagent_containers/spray/waterflower/cyborg
reagent_flags = NONE
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index c44ffa4373..0964b67490 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -71,13 +71,13 @@
var/paper_cups = 25 //Paper cups left from the cooler
/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
- ..()
+ . = ..()
if (paper_cups > 1)
- to_chat(user, "There are [paper_cups] paper cups left.")
+ . += "There are [paper_cups] paper cups left."
else if (paper_cups == 1)
- to_chat(user, "There is one paper cup left.")
+ . += "There is one paper cup left."
else
- to_chat(user, "There are no paper cups left.")
+ . += "There are no paper cups left."
/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user)
. = ..()
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index 357ba065a9..88c03ee7d5 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -132,7 +132,12 @@
/obj/machinery/disposal/proc/can_stuff_mob_in(mob/living/target, mob/living/user, pushing = FALSE)
if(!pushing && !iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves.
- return FALSE
+ if (iscyborg(user))
+ var/mob/living/silicon/robot/borg = user
+ if (!borg.module || !borg.module.canDispose)
+ return
+ else
+ return FALSE
if(!isturf(user.loc)) //No magically doing it from inside closets
return FALSE
if(target.buckled || target.has_buckled_mobs())
diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm
index 726149ce24..dfc58f8c2d 100644
--- a/code/modules/recycling/disposal/holder.dm
+++ b/code/modules/recycling/disposal/holder.dm
@@ -52,6 +52,10 @@
if(istype(AM, /obj/item/smallDelivery) && !hasmob)
var/obj/item/smallDelivery/T = AM
src.destinationTag = T.sortTag
+ else if(istype(AM, /mob/living/silicon/robot))
+ var/obj/item/destTagger/borg/tagger = locate() in AM
+ if (tagger)
+ src.destinationTag = tagger.currTag
// start the movement process
diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm
index d85c4bca78..2d40ec64eb 100644
--- a/code/modules/recycling/disposal/pipe_sorting.dm
+++ b/code/modules/recycling/disposal/pipe_sorting.dm
@@ -50,13 +50,13 @@
sortTypes |= n
/obj/structure/disposalpipe/sorting/mail/examine(mob/user)
- ..()
+ . = ..()
if(sortTypes.len)
- to_chat(user, "It is tagged with the following tags:")
+ . += "It is tagged with the following tags:"
for(var/t in sortTypes)
- to_chat(user, "\t[GLOB.TAGGERLOCATIONS[t]].")
+ . += "\t[GLOB.TAGGERLOCATIONS[t]]."
else
- to_chat(user, "It has no sorting tags set.")
+ . += "It has no sorting tags set."
/obj/structure/disposalpipe/sorting/mail/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index fa2eaa22d4..f9eb1b85e5 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -147,6 +147,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "cargotagger"
var/currTag = 0 //Destinations are stored in code\globalvars\lists\flavor_misc.dm
+ var/locked_destination = FALSE //if true, users can't open the destination tag window to prevent changing the tagger's current destination
w_class = WEIGHT_CLASS_TINY
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -154,6 +155,10 @@
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
+/obj/item/destTagger/borg
+ name = "cyborg destination tagger"
+ desc = "Used to fool the disposal mail network into thinking that you're a harmless parcel. Does actually work as a regular destination tagger as well."
+
/obj/item/destTagger/suicide_act(mob/living/user)
user.visible_message("[user] begins tagging [user.p_their()] final destination! It looks like [user.p_theyre()] trying to commit suicide! ")
if (islizard(user))
@@ -179,8 +184,9 @@
onclose(user, "destTagScreen")
/obj/item/destTagger/attack_self(mob/user)
- openwindow(user)
- return
+ if(!locked_destination)
+ openwindow(user)
+ return
/obj/item/destTagger/Topic(href, href_list)
add_fingerprint(usr)
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index c9d11a5a3e..ec4309b69e 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -65,6 +65,16 @@
category = list("Bluespace Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
+/datum/design/desynchronizer
+ name = "Desynchronizer"
+ desc = "A device that can desynchronize the user from spacetime."
+ id = "desynchronizer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000)
+ build_path = /obj/item/desynchronizer
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
/datum/design/miningsatchel_holding
name = "Mining Satchel of Holding"
desc = "A mining satchel that can hold an infinite amount of ores."
diff --git a/code/modules/research/designs/machine_desings/machine_designs_service.dm b/code/modules/research/designs/machine_desings/machine_designs_service.dm
index 895ad032ba..5cbff1c66a 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_service.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_service.dm
@@ -41,6 +41,14 @@
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/board/ayyplantgenes
+ name = "Machine Design (Alien Plant DNA Manipulator Board)"
+ desc = "The circuit board for an advanced plant DNA manipulator, utilizing alien technologies."
+ id = "ayyplantgenes"
+ build_path = /obj/item/circuitboard/machine/plantgenes/vault
+ category = list ("Misc. Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/board/deepfryer
name = "Machine Design (Deep Fryer)"
desc = "The circuit board for a Deep Fryer."
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
index 5f457a3cd7..836b574f86 100644
--- a/code/modules/research/machinery/_production.dm
+++ b/code/modules/research/machinery/_production.dm
@@ -84,8 +84,9 @@
investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
message_admins("[ADMIN_LOOKUPFLW(user)] has built [amount] of [path] at a [src]([type]).")
for(var/i in 1 to amount)
- var/obj/item/I = new path(get_turf(src))
- if(efficient_with(I.type))
+ var/obj/O = new path(get_turf(src))
+ if(efficient_with(O.type) && isitem(O))
+ var/obj/item/I = O
I.materials = matlist.Copy()
SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
diff --git a/code/modules/research/nanites/nanite_hijacker.dm b/code/modules/research/nanites/nanite_hijacker.dm
index dba47a4ac2..88779df447 100644
--- a/code/modules/research/nanites/nanite_hijacker.dm
+++ b/code/modules/research/nanites/nanite_hijacker.dm
@@ -18,7 +18,7 @@
/obj/item/nanite_hijacker/examine(mob/user)
. = ..()
if(disk)
- to_chat(user, "Alt-click [src] to eject the disk. ")
+ . += "Alt-click [src] to eject the disk. "
/obj/item/nanite_hijacker/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/disk/nanite_program))
diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm
index a06311f26f..2a6563fe52 100644
--- a/code/modules/research/nanites/nanite_programs.dm
+++ b/code/modules/research/nanites/nanite_programs.dm
@@ -208,9 +208,6 @@ datum/nanite_program/proc/on_mob_remove()
/datum/nanite_program/proc/on_death()
return
-/datum/nanite_program/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
- return
-
/datum/nanite_program/proc/software_error(type)
if(!type)
type = rand(1,5)
diff --git a/code/modules/research/nanites/nanite_programs/sensor.dm b/code/modules/research/nanites/nanite_programs/sensor.dm
index d494ec8cdf..535b92c6e1 100644
--- a/code/modules/research/nanites/nanite_programs/sensor.dm
+++ b/code/modules/research/nanites/nanite_programs/sensor.dm
@@ -345,6 +345,14 @@
var/sentence = ""
var/inclusive = TRUE
+
+/datum/nanite_program/sensor/voice/on_mob_add()
+ . = ..()
+ RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
+
+/datum/nanite_program/sensor/voice/on_mob_remove()
+ UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
+
/datum/nanite_program/sensor/voice/set_extra_setting(user, setting)
if(setting == "Sent Code")
var/new_code = input(user, "Set the sent code (1-9999):", name, null) as null|num
@@ -378,15 +386,12 @@
target.sentence = sentence
target.inclusive = inclusive
-/datum/nanite_program/sensor/voice/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args)
if(!sentence)
return
- //To make it not case sensitive
- var/low_message = lowertext(raw_message)
- var/low_sentence = lowertext(sentence)
if(inclusive)
- if(findtext(low_message, low_sentence))
+ if(findtextEx(hearing_args[HEARING_RAW_MESSAGE], sentence))
send_code()
else
- if(low_message == low_sentence)
+ if(hearing_args[HEARING_RAW_MESSAGE] == sentence)
send_code()
\ No newline at end of file
diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm
index 824d033bf4..3b242d28df 100644
--- a/code/modules/research/nanites/nanite_remote.dm
+++ b/code/modules/research/nanites/nanite_remote.dm
@@ -22,7 +22,7 @@
/obj/item/nanite_remote/examine(mob/user)
. = ..()
if(locked)
- to_chat(user, "Alt-click to unlock. ")
+ . += "Alt-click to unlock. "
/obj/item/nanite_remote/AltClick(mob/user)
. = ..()
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 66654c4901..0761354939 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -322,6 +322,15 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
+/datum/techweb_node/unregulated_bluespace
+ id = "unregulated_bluespace"
+ display_name = "Unregulated Bluespace Research"
+ description = "Bluespace technology using unstable or unbalanced procedures, prone to damaging the fabric of bluespace. Outlawed by galactic conventions."
+ prereq_ids = list("bluespace_warping", "syndicate_basic")
+ design_ids = list("desynchronizer")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 2500
+
/////////////////////////plasma tech/////////////////////////
/datum/techweb_node/basic_plasma
id = "basic_plasma"
@@ -616,7 +625,7 @@
/datum/techweb_node/botany
id = "botany"
display_name = "Botanical Engineering"
- description = "Botanical tools"
+ description = "Botanical tools."
prereq_ids = list("adv_engi", "biotech")
design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
@@ -1047,14 +1056,14 @@
display_name = "Alien Biological Tools"
description = "Advanced biological tools."
prereq_ids = list("alientech", "advance_surgerytools")
- design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery")
+ design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 10000
/datum/techweb_node/alien_engi
id = "alien_engi"
display_name = "Alien Engineering"
- description = "Alien engineering tools"
+ description = "Alien engineering tools."
prereq_ids = list("alientech", "exp_tools")
design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm
index 4d39d956e7..a21fddb6cf 100644
--- a/code/modules/research/xenobiology/crossbreeding/industrial.dm
+++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm
@@ -13,8 +13,8 @@ Industrial extracts:
var/itemamount = 1 //How many items to spawn
/obj/item/slimecross/industrial/examine(mob/user)
- ..()
- to_chat(user, "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units.")
+ . = ..()
+ . += "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units."
/obj/item/slimecross/industrial/proc/do_after_spawn(obj/item/spawned)
return
diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm
index 0b27b1e26f..a86db788a6 100644
--- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm
+++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm
@@ -24,12 +24,9 @@ Self-sustaining extracts:
A.icon = icon
A.icon_state = icon_state
A.color = color
+ A.name = "self-sustaining " + colour + " extract"
return INITIALIZE_HINT_QDEL
-/obj/item/autoslime/Initialize()
- name = "self-sustaining " + extract.name
- return ..()
-
/obj/item/autoslime/attack_self(mob/user)
var/reagentselect = input(user, "Choose the reagent the extract will produce.", "Self-sustaining Reaction") as null|anything in extract.activate_reagents
var/amount = 5
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 2894ce2108..ab0db8c4a7 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -18,9 +18,9 @@
var/recurring = FALSE
/obj/item/slime_extract/examine(mob/user)
- ..()
+ . = ..()
if(Uses > 1)
- to_chat(user,"It has [Uses] uses remaining.")
+ . += "It has [Uses] uses remaining."
/obj/item/slime_extract/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/slimepotion/enhancer))
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 92a637ce43..d12195cc52 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -135,7 +135,7 @@
id = /obj/item/card/id/syndicate/anyone
implants = list(/obj/item/implant/weapons_auth)
-/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= ROLE_SYNDICATE
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm
index 747a10e769..762c376748 100644
--- a/code/modules/spells/spell_types/area_teleport.dm
+++ b/code/modules/spells/spell_types/area_teleport.dm
@@ -20,8 +20,11 @@
after_cast(targets)
/obj/effect/proc_holder/spell/targeted/area_teleport/before_cast(list/targets)
- var/A = null
-
+ var/area/U = get_area(usr)
+ if(U.noteleport && !istype(U, /area/wizard_station)) // Wizard den special check for those complaining about being unable to tele on station.
+ to_chat(usr, "Unseen forces prevent you from casting this spell in this area ")
+ return
+ var/A
if(!randomise_selection)
A = input("Area to teleport to", "Teleport", A) as null|anything in GLOB.teleportlocs
else
@@ -53,12 +56,13 @@
if(target && target.buckled)
target.buckled.unbuckle_mob(target, force=1)
+ var/forcecheck = istype(get_area(target), /area/wizard_station)
var/list/tempL = L
var/attempt = null
var/success = 0
while(tempL.len)
attempt = pick(tempL)
- do_teleport(target, attempt, channel = TELEPORT_CHANNEL_MAGIC)
+ do_teleport(target, attempt, channel = TELEPORT_CHANNEL_MAGIC, forced = forcecheck)
if(get_turf(target) == attempt)
success = 1
break
@@ -66,7 +70,7 @@
tempL.Remove(attempt)
if(!success)
- do_teleport(target, L, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC)
+ do_teleport(target, L, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = forcecheck)
playsound(get_turf(user), sound2, 50,1)
return
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 9aa89dcaf5..82790c1304 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -70,11 +70,11 @@
var/heavy_burn_msg = "peeling away"
/obj/item/bodypart/examine(mob/user)
- ..()
+ . = ..()
if(brute_dam > DAMAGE_PRECISION)
- to_chat(user, "This limb has [brute_dam > 30 ? "severe" : "minor"] bruising. ")
+ . += "This limb has [brute_dam > 30 ? "severe" : "minor"] bruising. "
if(burn_dam > DAMAGE_PRECISION)
- to_chat(user, "This limb has [burn_dam > 30 ? "severe" : "minor"] burns. ")
+ . += "This limb has [burn_dam > 30 ? "severe" : "minor"] burns. "
/obj/item/bodypart/blob_act()
take_damage(max_damage)
@@ -354,7 +354,7 @@
if("legs" in S.default_features)
if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG)
if(DIGITIGRADE in S.species_traits)
- digitigrade_type = lowertext(H.dna.features.["legs"])
+ digitigrade_type = lowertext(H.dna.features["legs"])
else
digitigrade_type = null
@@ -363,9 +363,9 @@
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if(Smark)
body_markings_icon = Smark.icon
- if(H.dna.features.["mam_body_markings"] != "None")
- body_markings = lowertext(H.dna.features.["mam_body_markings"])
- aux_marking = lowertext(H.dna.features.["mam_body_markings"])
+ if(H.dna.features["mam_body_markings"] != "None")
+ body_markings = lowertext(H.dna.features["mam_body_markings"])
+ aux_marking = lowertext(H.dna.features["mam_body_markings"])
else
body_markings = "plain"
aux_marking = "plain"
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index 3172496146..40fe90a829 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -110,4 +110,4 @@
requires_tech = TRUE
replaced_by = null
-#undef EXPDIS_FAIL_MSG
\ No newline at end of file
+#undef BASE_HUMAN_REWARD
\ No newline at end of file
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index e42fc91d47..503bf4ddd0 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -38,8 +38,8 @@
transform = matrix(-1, 0, 0, 0, 1, 0)
/obj/item/organ/cyberimp/arm/examine(mob/user)
- ..()
- to_chat(user, "[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it. ")
+ . = ..()
+ . += "[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it. "
/obj/item/organ/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/I)
. = ..()
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index a9830f36df..94512dc597 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -212,7 +212,6 @@ obj/item/organ/heart/cybernetic/upgraded/on_life()
ramount += regen_amount
/obj/item/organ/heart/cybernetic/upgraded/proc/used_dose()
- . = ..()
addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES)
ramount = 0
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 194a10f4c4..466f618cf3 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -1,6 +1,3 @@
-#define STANDARD_ORGAN_THRESHOLD 100
-#define STANDARD_ORGAN_HEALING 0.001
-
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 001ef8d0e6..f4adfd265a 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -30,7 +30,7 @@
/obj/item/retractor/advanced/examine(mob/living/user)
. = ..()
- to_chat(user, " It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]. "
/obj/item/retractor/augment
name = "retractor"
@@ -133,7 +133,7 @@
/obj/item/surgicaldrill/advanced/examine(mob/living/user)
. = ..()
- to_chat(user, "")
+ . += ""
/obj/item/surgicaldrill/augment
name = "surgical drill"
@@ -206,7 +206,7 @@
/obj/item/scalpel/advanced/examine(mob/living/user)
. = ..()
- to_chat(user, "")
+ . += ""
/obj/item/scalpel/augment
name = "scalpel"
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 8f3fb6f979..aef3b31895 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1123,6 +1123,16 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 35
restricted = TRUE
+/datum/uplink_item/support/reinforcement/saboteur_borg
+ name = "Syndicate Saboteur Cyborg"
+ desc = "A streamlined engineering cyborg, equipped with covert modules. Also incapable of leaving the welder in the shuttle. \
+ Aside from regular Engineering equipment, it comes with a special destination tagger that lets it traverse disposals networks. \
+ Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer."
+ item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
+ refundable = TRUE
+ cost = 35
+ restricted = TRUE
+
/datum/uplink_item/support/gygax
name = "Dark Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \
@@ -1794,6 +1804,21 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 4
restricted_roles = list("Cook", "Botanist", "Clown", "Mime")
+/datum/uplink_item/role_restricted/strange_seeds
+ name = "Pack of strange seeds"
+ desc = "Mysterious seeds as strange as their name implies. Spooky."
+ item = /obj/item/seeds/random
+ cost = 2
+ restricted_roles = list("Botanist")
+ illegal_tech = FALSE
+
+/datum/uplink_item/role_restricted/strange_seeds_10pack
+ name = "Pack of strange seeds x10"
+ desc = "Mysterious seeds as strange as their name implies. Spooky. These come in bulk"
+ item = /obj/item/storage/box/strange_seeds_10pack
+ cost = 20
+ restricted_roles = list("Botanist")
+
/datum/uplink_item/role_restricted/ez_clean_bundle
name = "EZ Clean Grenade Bundle"
desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \
diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm
index 54bc03bcf3..e4cb090448 100644
--- a/code/modules/vehicles/_vehicle.dm
+++ b/code/modules/vehicles/_vehicle.dm
@@ -32,17 +32,17 @@
generate_actions()
/obj/vehicle/examine(mob/user)
- ..()
+ . = ..()
if(resistance_flags & ON_FIRE)
- to_chat(user, "It's on fire! ")
+ . += "It's on fire! "
var/healthpercent = obj_integrity/max_integrity * 100
switch(healthpercent)
if(50 to 99)
- to_chat(user, "It looks slightly damaged.")
+ . += "It looks slightly damaged."
if(25 to 50)
- to_chat(user, "It appears heavily damaged.")
+ . += "It appears heavily damaged."
if(0 to 25)
- to_chat(user, "It's falling apart! ")
+ . += "It's falling apart! "
/obj/vehicle/proc/is_key(obj/item/I)
return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 53f60788fe..31d0a243e7 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -29,9 +29,9 @@
icon_state = "upgrade"
/obj/vehicle/ridden/janicart/examine(mob/user)
- ..()
+ . = ..()
if(floorbuffer)
- to_chat(user, "It has been upgraded with a floor buffer.")
+ . += "It has been upgraded with a floor buffer."
/obj/vehicle/ridden/janicart/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/storage/bag/trash))
diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm
index 8fe7322579..27da0f6cea 100644
--- a/code/modules/vehicles/ridden.dm
+++ b/code/modules/vehicles/ridden.dm
@@ -15,9 +15,9 @@
. = ..()
if(key_type)
if(!inserted_key)
- to_chat(user, "Put a key inside it by clicking it with the key. ")
+ . += "Put a key inside it by clicking it with the key. "
else
- to_chat(user, "Alt-click [src] to remove the key. ")
+ . += "Alt-click [src] to remove the key. "
/obj/vehicle/ridden/generate_action_type(actiontype)
var/datum/action/vehicle/ridden/A = ..()
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index e64435accc..adaa56fc6d 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -125,6 +125,7 @@
products = list(/obj/item/clothing/glasses/hud/diagnostic = 3,
/obj/item/clothing/under/rank/roboticist = 3,
/obj/item/clothing/under/rank/roboticist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/robotics = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
@@ -258,6 +259,7 @@
vend_reply = "Thank you for using the JaniDrobe!"
products = list(/obj/item/clothing/under/rank/janitor = 2,
/obj/item/clothing/under/rank/janitor/skirt = 2,
+ /obj/item/clothing/suit/hooded/wintercoat/janitor = 3,
/obj/item/cartridge/janitor = 3,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
@@ -340,6 +342,7 @@
vend_reply = "Thank you for using the ChemDrobe!"
products = list(/obj/item/clothing/under/rank/chemist = 3,
/obj/item/clothing/under/rank/chemist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/chemistry = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/chemist = 3,
/obj/item/storage/backpack/chemistry = 3,
@@ -359,6 +362,7 @@
vend_reply = "Thank you for using the GeneDrobe!"
products = list(/obj/item/clothing/under/rank/geneticist = 3,
/obj/item/clothing/under/rank/geneticist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/genetics = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/genetics = 3,
/obj/item/storage/backpack/genetics = 3,
@@ -376,6 +380,7 @@
vend_reply = "Thank you for using the ViroDrobe"
products = list(/obj/item/clothing/under/rank/virologist = 3,
/obj/item/clothing/under/rank/virologist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/viro = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/virologist = 3,
/obj/item/clothing/mask/surgical = 3,
diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm
index 8eea2737cf..1f1aacf98d 100644
--- a/code/modules/vore/resizing/holder_micro_vr.dm
+++ b/code/modules/vore/resizing/holder_micro_vr.dm
@@ -10,8 +10,9 @@
pixel_y = 0 // Override value from parent.
/obj/item/holder/micro/examine(var/mob/user)
+ . = list()
for(var/mob/living/M in contents)
- M.examine(user)
+ . += M.examine(user)
/obj/item/holder/MouseDrop(mob/M as mob)
..()
diff --git a/config/dynamic_config.txt b/config/dynamic_config.txt
index f9b78f046f..18c0d7827d 100644
--- a/config/dynamic_config.txt
+++ b/config/dynamic_config.txt
@@ -277,28 +277,6 @@ DYNAMIC_GLORIOUS_DEATH_COST 5
DYNAMIC_ASSASSINATE_COST 2
-## Dynamic wizard stuff
-
-## How much threat level is required to buy summon guns. Setting to 0 makes it always available.
-DYNAMIC_SUMMON_GUNS_REQUIREMENT 10
-
-## How much summon guns reduces the round's remaining threat. Setting to 0 makes it cost none.
-DYNAMIC_SUMMON_GUNS_COST 10
-
-## As above, but for summon magic
-DYNAMIC_SUMMON_MAGIC_REQUIREMENT 10
-DYNAMIC_SUMMON_MAGIC_COST 10
-
-## As above, but for summon events
-DYNAMIC_SUMMON_EVENTS_REQUIREMENT 20
-DYNAMIC_SUMMON_EVENTS_COST 10
-
-DYNAMIC_STAFF_OF_CHANGE_REQUIREMENT 20
-DYNAMIC_STAFF_OF_CHANGE_COST 10
-
-## As above, but for apprentice. Note that this is just a cost, since apprentices aren't as universally disruptive as above.
-DYNAMIC_APPRENTICE_COST 10
-
## This requirement uses threat level, rather than current threat, which is why it's higher.
DYNAMIC_WAROPS_REQUIREMENT 60
diff --git a/config/game_options.txt b/config/game_options.txt
index 1cac50fc1a..a44c68226e 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -481,17 +481,17 @@ MIDROUND_ANTAG_TIME_CHECK 60
## A ratio of living to total crew members, the lower this is, the more people will have to die in order for midround antag to be skipped
MIDROUND_ANTAG_LIFE_CHECK 0.7
-## A time, in real-time deciseconds, applied upon suicide, cryosleep or ghosting whilst alive
-## during which the player shouldn't be able to come back through
+## A "timeout", in real-time minutes, applied upon suicide, cryosleep or ghosting whilst alive,
+## during which the player shouldn't be able to come back into the round through
## midround playable roles or mob spawners.
## Set to 0 to completely disable it.
-SUICIDE_REENTER_ROUND_TIMER 18000
+SUICIDE_REENTER_ROUND_TIMER 30
-## A time, in real-time deciseconds, below which the player receives
-## a timed penalty, for purposes similar to the aforementioned one (can also stack)
-## and equal to this config difference with world.time.
+## A world time threshold, in minutes, under which the player receives
+## an extra timeout, purposely similar to the above one (and also stacks with),
+## equal to the difference between the current world.time and this threshold.
## Both configs are indipendent from each other, disabling one won't affect the other.
-ROUNDSTART_SUICIDE_TIME_LIMIT 18000
+ROUNDSTART_SUICIDE_TIME_LIMIT 30
##Limit Spell Choices##
## Uncomment to disallow wizards from using certain spells that may be too chaotic/fun for your playerbase
diff --git a/html/changelogs/AutoChangeLog-pr-9323.yml b/html/changelogs/AutoChangeLog-pr-9323.yml
new file mode 100644
index 0000000000..19e91deaf5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9323.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "you can now choose never for this round for magical antags"
diff --git a/html/changelogs/AutoChangeLog-pr-9518.yml b/html/changelogs/AutoChangeLog-pr-9518.yml
new file mode 100644
index 0000000000..67a2c25938
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9518.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by nicbn and Menshin)"
+delete-after: True
+changes:
+ - bugfix: "You can click on things that are under flaps or holo barriers."
diff --git a/html/changelogs/AutoChangeLog-pr-9530.yml b/html/changelogs/AutoChangeLog-pr-9530.yml
new file mode 100644
index 0000000000..ace41e9e97
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9530.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed the little issue of PDA skins not updating on job equip."
+ - tweak: "Anomaly Crystals of the clowning type will now rename the victim to their clown name preference when triggered, instead of giving them a random clown name."
diff --git a/html/changelogs/AutoChangeLog-pr-9681.yml b/html/changelogs/AutoChangeLog-pr-9681.yml
new file mode 100644
index 0000000000..c4c289425b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9681.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "bluespace wizard apprentice now has blink instead of targeted area teleportation"
diff --git a/html/changelogs/AutoChangeLog-pr-9703.yml b/html/changelogs/AutoChangeLog-pr-9703.yml
new file mode 100644
index 0000000000..312057c2c6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9703.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Emagged medibots now charcoal toxinlovers."
diff --git a/html/changelogs/AutoChangeLog-pr-9720.yml b/html/changelogs/AutoChangeLog-pr-9720.yml
new file mode 100644
index 0000000000..f4c4aade36
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9720.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "disablers buffed 0.7 --> 0.6 speed 24 --> 28 damage"
diff --git a/html/changelogs/AutoChangeLog-pr-9749.yml b/html/changelogs/AutoChangeLog-pr-9749.yml
new file mode 100644
index 0000000000..3113fa08c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9749.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw and base ball bat into bulky items so they may fit"
diff --git a/html/changelogs/AutoChangeLog-pr-9812.yml b/html/changelogs/AutoChangeLog-pr-9812.yml
new file mode 100644
index 0000000000..d669d20343
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9812.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed missing delivery packages sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-9814.yml b/html/changelogs/AutoChangeLog-pr-9814.yml
new file mode 100644
index 0000000000..6e806b8860
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9814.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - config: "added multi_keyed_list, delimiter defaults to |."
diff --git a/html/changelogs/AutoChangeLog-pr-9816.yml b/html/changelogs/AutoChangeLog-pr-9816.yml
new file mode 100644
index 0000000000..512d60e7eb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9816.yml
@@ -0,0 +1,7 @@
+author: "Swindly"
+delete-after: True
+changes:
+ - bugfix: "Fixed MMIs not being able to use mecha equipment"
+ - bugfix: "Fixed MMIs not getting mecha mouse pointers"
+ - bugfix: "Fixed MMIs not getting medical HUDs in Odysseuses"
+ - tweak: "Brains can now switch to harm intent"
diff --git a/html/changelogs/AutoChangeLog-pr-9818.yml b/html/changelogs/AutoChangeLog-pr-9818.yml
new file mode 100644
index 0000000000..44222d2359
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9818.yml
@@ -0,0 +1,5 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - rscadd: "Added saboteur syndicate engiborg"
+ - tweak: "changed cyborg tool icons and the secborg taser/laser icons."
diff --git a/html/changelogs/AutoChangeLog-pr-9822.yml b/html/changelogs/AutoChangeLog-pr-9822.yml
new file mode 100644
index 0000000000..425a667086
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9822.yml
@@ -0,0 +1,6 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Summon events now properly costs threat."
+ - bugfix: "Refunded spells refund threat, too."
+ - refactor: "Made wizard spells inherently have a requirement and cost."
diff --git a/html/changelogs/AutoChangeLog-pr-9823.yml b/html/changelogs/AutoChangeLog-pr-9823.yml
new file mode 100644
index 0000000000..3408f04171
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9823.yml
@@ -0,0 +1,6 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "Added nine winter coats"
+ - imageadd: "added images for the winter coats"
+ - tweak: "adds the mining winter coat to mining wardrobes and mining lockers"
diff --git a/html/changelogs/AutoChangeLog-pr-9828.yml b/html/changelogs/AutoChangeLog-pr-9828.yml
new file mode 100644
index 0000000000..53dbebba28
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9828.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "Meteor wave is no longer repeatable in dynamic."
diff --git a/html/changelogs/AutoChangeLog-pr-9831.yml b/html/changelogs/AutoChangeLog-pr-9831.yml
new file mode 100644
index 0000000000..569fd14f69
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9831.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "tweaked nuke ops"
diff --git a/html/changelogs/AutoChangeLog-pr-9835.yml b/html/changelogs/AutoChangeLog-pr-9835.yml
new file mode 100644
index 0000000000..675eedef02
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9835.yml
@@ -0,0 +1,4 @@
+author: "Ty-the-Smonk"
+delete-after: True
+changes:
+ - bugfix: "You can now interact with self sustaining crossbreeds"
diff --git a/html/changelogs/AutoChangeLog-pr-9837.yml b/html/changelogs/AutoChangeLog-pr-9837.yml
new file mode 100644
index 0000000000..a20d04effc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9837.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot would be less prone to igniting"
diff --git a/html/changelogs/AutoChangeLog-pr-9838.yml b/html/changelogs/AutoChangeLog-pr-9838.yml
new file mode 100644
index 0000000000..5a99c27abe
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9838.yml
@@ -0,0 +1,4 @@
+author: "actioninja"
+delete-after: True
+changes:
+ - bugfix: "Chat is properly sent to legacy window if goonchat fails to load again."
diff --git a/html/changelogs/AutoChangeLog-pr-9842.yml b/html/changelogs/AutoChangeLog-pr-9842.yml
new file mode 100644
index 0000000000..d816911560
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9842.yml
@@ -0,0 +1,4 @@
+author: "Anonymous"
+delete-after: True
+changes:
+ - tweak: "Renamed loadout name appropriately (ASSU -> DAB)"
diff --git a/html/changelogs/AutoChangeLog-pr-9846.yml b/html/changelogs/AutoChangeLog-pr-9846.yml
new file mode 100644
index 0000000000..d3721b6c32
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9846.yml
@@ -0,0 +1,5 @@
+author: "KathrinBailey"
+delete-after: True
+changes:
+ - rscadd: "Ports TG's pews https://github.com/tgstation/tgstation/pull/42712"
+ - rscadd: "The first step of a corporate incursion of Space IKEA into Nanotrasen."
diff --git a/html/changelogs/AutoChangeLog-pr-9850.yml b/html/changelogs/AutoChangeLog-pr-9850.yml
new file mode 100644
index 0000000000..f6aee261a4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9850.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixed a few minor issues with console frames building."
diff --git a/html/changelogs/AutoChangeLog-pr-9852.yml b/html/changelogs/AutoChangeLog-pr-9852.yml
new file mode 100644
index 0000000000..4a17480992
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9852.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Wizards can use the teleport spell from their den once again."
+ - tweak: "Wizards will now receive feedback messages when attempting to cast teleport or use the warp whistle while in a no-teleport area."
diff --git a/html/changelogs/AutoChangeLog-pr-9853.yml b/html/changelogs/AutoChangeLog-pr-9853.yml
new file mode 100644
index 0000000000..f752f6bf16
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9853.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "New clockwork cultist, gondola, monkey and securitron cardboard cutouts."
diff --git a/html/changelogs/AutoChangeLog-pr-9858.yml b/html/changelogs/AutoChangeLog-pr-9858.yml
new file mode 100644
index 0000000000..c211cd5962
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9858.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed aliens gasping randomly once in a while."
diff --git a/html/changelogs/AutoChangeLog-pr-9864.yml b/html/changelogs/AutoChangeLog-pr-9864.yml
new file mode 100644
index 0000000000..ff1f4f6508
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9864.yml
@@ -0,0 +1,5 @@
+author: "Knouli"
+delete-after: True
+changes:
+ - rscadd: "attack_self proc for the legion core which triggers a self-heal al la the previous 'afterattack' proc, as if clicking on the character's own sprite to self-heal"
+ - rscadd: "admin logging for all three use cases of legion core healing - afterattack, attack_self, and implanted ui_action_click"
diff --git a/html/changelogs/AutoChangeLog-pr-9865.yml b/html/changelogs/AutoChangeLog-pr-9865.yml
new file mode 100644
index 0000000000..6bef9d6b5b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9865.yml
@@ -0,0 +1,4 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - bugfix: "numbered storages now are sorted in a consistent way, instead of depending on ordering of their contents var"
diff --git a/html/changelogs/AutoChangeLog-pr-9866.yml b/html/changelogs/AutoChangeLog-pr-9866.yml
new file mode 100644
index 0000000000..1e6e8d0e88
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9866.yml
@@ -0,0 +1,4 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - rscadd: "strange seeds as a buyable traitor botanist item"
diff --git a/html/changelogs/AutoChangeLog-pr-9867.yml b/html/changelogs/AutoChangeLog-pr-9867.yml
new file mode 100644
index 0000000000..4333d5eb73
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9867.yml
@@ -0,0 +1,6 @@
+author: "Naksu, ShizCalev"
+delete-after: True
+changes:
+ - refactor: "Refactored examine-code"
+ - bugfix: "Examining a human with a burned prosthetic limb will no longer tell you that the limb is blistered."
+ - tweak: "Items will now inform you if they are resistant to frost, fire, acid, and lava when examined."
diff --git a/html/changelogs/AutoChangeLog-pr-9868.yml b/html/changelogs/AutoChangeLog-pr-9868.yml
new file mode 100644
index 0000000000..18c4388dcd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9868.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixed superlube waterflower, my bad."
diff --git a/html/changelogs/AutoChangeLog-pr-9869.yml b/html/changelogs/AutoChangeLog-pr-9869.yml
new file mode 100644
index 0000000000..ecb3ac6cb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9869.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - rscadd: "The seedvault/alien plant DNA manipulator can now be printed off with Alien Biotechnology."
diff --git a/html/changelogs/AutoChangeLog-pr-9871.yml b/html/changelogs/AutoChangeLog-pr-9871.yml
new file mode 100644
index 0000000000..3940d256c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9871.yml
@@ -0,0 +1,5 @@
+author: "dzahlus"
+delete-after: True
+changes:
+ - soundadd: "added a new gun sounds"
+ - sounddel: "removed an old gun sounds"
diff --git a/html/changelogs/AutoChangeLog-pr-9873.yml b/html/changelogs/AutoChangeLog-pr-9873.yml
new file mode 100644
index 0000000000..b0568bad14
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9873.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed closing the aux base construction RCD's door access settings window throwing you out of camera mode when closed."
+ - rscdel: "Removed not functional aux base RCD's door type menu. Use airlock painters, maybe."
diff --git a/html/changelogs/AutoChangeLog-pr-9874.yml b/html/changelogs/AutoChangeLog-pr-9874.yml
new file mode 100644
index 0000000000..2e932c458b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9874.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Honkbot oil spills are of the slippery kind now. Honk."
diff --git a/html/changelogs/AutoChangeLog-pr-9875.yml b/html/changelogs/AutoChangeLog-pr-9875.yml
new file mode 100644
index 0000000000..4e14a561e7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9875.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - bugfix: "From-ghosts dynamic rulesets now actually listen to \"required candidates\""
diff --git a/html/changelogs/AutoChangeLog-pr-9876.yml b/html/changelogs/AutoChangeLog-pr-9876.yml
new file mode 100644
index 0000000000..4bc0a19954
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9876.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "local code scavenger finds forgotten slighty improved apc sprites left buried in old dusty folders."
diff --git a/html/changelogs/AutoChangeLog-pr-9877.yml b/html/changelogs/AutoChangeLog-pr-9877.yml
new file mode 100644
index 0000000000..c84cb7aa92
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9877.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Seven old and otherwordly pAI holochassis icons have crawled their way out of the modular citadel catacombs."
diff --git a/html/changelogs/AutoChangeLog-pr-9880.yml b/html/changelogs/AutoChangeLog-pr-9880.yml
new file mode 100644
index 0000000000..0f9dfa58f3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9880.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - bugfix: "Every dynamic-triggered event is now blacklisted from being triggered by the random events system when dynamic can trigger them."
diff --git a/html/changelogs/AutoChangeLog-pr-9881.yml b/html/changelogs/AutoChangeLog-pr-9881.yml
new file mode 100644
index 0000000000..3ff9081e66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9881.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - rscadd: "Dynamic voting now features extended, if recent rounds have been chaotic."
diff --git a/html/changelogs/AutoChangeLog-pr-9886.yml b/html/changelogs/AutoChangeLog-pr-9886.yml
new file mode 100644
index 0000000000..64c011e37c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9886.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "chem dispenser beakers end up in your hand yet again."
+ - bugfix: "Bikehorns squeak yet again, the world is safe."
diff --git a/html/changelogs/AutoChangeLog-pr-9887.yml b/html/changelogs/AutoChangeLog-pr-9887.yml
new file mode 100644
index 0000000000..c76016575b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9887.yml
@@ -0,0 +1,7 @@
+author: "Fox McCloud, Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes being able to mech-punch other mobs, as a pacifist"
+ - bugfix: "Fixes being able to hurt people, as a pacifist, by throwing them into a wall or other mob, or by using most martial arts (save for the unpredictable psychotic brawl, and the stamina-damage-only boxing)."
+ - balance: "Buffs boxing to outdamage natural stamina regeneration. Made the chance of outright missing your opponent actually possible."
+ - tweak: "Pacifists can now engage in the (laughably not harmful) sweet sweet art of boxing now."
diff --git a/html/changelogs/AutoChangeLog-pr-9889.yml b/html/changelogs/AutoChangeLog-pr-9889.yml
new file mode 100644
index 0000000000..68094bd33d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9889.yml
@@ -0,0 +1,4 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - bugfix: "Fixes golden toolbox missing inhand sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-9891.yml b/html/changelogs/AutoChangeLog-pr-9891.yml
new file mode 100644
index 0000000000..105749ea29
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9891.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - tweak: "Roundstart rulesets now scale on population ready rather than total population."
diff --git a/html/changelogs/AutoChangeLog-pr-9896.yml b/html/changelogs/AutoChangeLog-pr-9896.yml
new file mode 100644
index 0000000000..378129d227
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9896.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Cyborgs can now actually use cameras from a distance."
diff --git a/html/changelogs/AutoChangeLog-pr-9898.yml b/html/changelogs/AutoChangeLog-pr-9898.yml
new file mode 100644
index 0000000000..002e3b544d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9898.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Suicides are yet again painful and instant and won't throw people in deep crit from full health."
diff --git a/html/changelogs/AutoChangeLog-pr-9902.yml b/html/changelogs/AutoChangeLog-pr-9902.yml
new file mode 100644
index 0000000000..9a9d7f4597
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9902.yml
@@ -0,0 +1,6 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - rscadd: "A bunch of newer tg plants"
+ - rscadd: "A bunch of newer tg plant traits"
+ - rscadd: "A couple of newer tg plant reagents"
diff --git a/html/changelogs/AutoChangeLog-pr-9907.yml b/html/changelogs/AutoChangeLog-pr-9907.yml
new file mode 100644
index 0000000000..6bd27c6e50
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9907.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - bugfix: "VR mobs can no longer be dynamic midround antags."
diff --git a/html/changelogs/AutoChangeLog-pr-9908.yml b/html/changelogs/AutoChangeLog-pr-9908.yml
new file mode 100644
index 0000000000..fb0ae06238
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9908.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixed rogue pixels on the energy gu- ahem blaster carbine... and a few apc lights states being neigh-indistinguishable."
diff --git a/html/changelogs/AutoChangeLog-pr-9909.yml b/html/changelogs/AutoChangeLog-pr-9909.yml
new file mode 100644
index 0000000000..7cfb6ce5b2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9909.yml
@@ -0,0 +1,5 @@
+author: "kiwedespars"
+delete-after: True
+changes:
+ - rscdel: "removed moth fluff coloring you like your wings"
+ - balance: "made insect not so bad."
diff --git a/html/changelogs/AutoChangeLog-pr-9922.yml b/html/changelogs/AutoChangeLog-pr-9922.yml
new file mode 100644
index 0000000000..3c293c742c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9922.yml
@@ -0,0 +1,6 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - rscadd: "Added traumas"
+ - rscadd: "Added science powergame tool"
+ - tweak: "a few hearing args"
diff --git a/html/changelogs/AutoChangeLog-pr-9942.yml b/html/changelogs/AutoChangeLog-pr-9942.yml
new file mode 100644
index 0000000000..3b6925289b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9942.yml
@@ -0,0 +1,4 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - bugfix: "the new plants now properly get their reagents and reagent genes instead of being empty with UNKNOWN reagents listed in the DNA machine"
diff --git a/icons/mob/dogborg.dmi b/icons/mob/dogborg.dmi
index ec63120ae1..856724be1f 100644
Binary files a/icons/mob/dogborg.dmi and b/icons/mob/dogborg.dmi differ
diff --git a/modular_citadel/icons/mob/digishoes.dmi b/icons/mob/feet_digi.dmi
similarity index 100%
rename from modular_citadel/icons/mob/digishoes.dmi
rename to icons/mob/feet_digi.dmi
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 69e75e7d28..e9f32c428a 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/icons/mob/head_muzzled.dmi
similarity index 100%
rename from modular_citadel/icons/mob/muzzled_helmet.dmi
rename to icons/mob/head_muzzled.dmi
diff --git a/modular_citadel/icons/mob/muzzled_mask.dmi b/icons/mob/mask_muzzled.dmi
similarity index 100%
rename from modular_citadel/icons/mob/muzzled_mask.dmi
rename to icons/mob/mask_muzzled.dmi
diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi
index 94fb2ee6e7..d8162cb5a7 100644
Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 896a87ff3a..082bfb3c3e 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 8718106f0c..c1912d74cc 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index c469773993..07467f9770 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi
new file mode 100644
index 0000000000..a5d37ba4a2
Binary files /dev/null and b/icons/mob/suit_digi.dmi differ
diff --git a/modular_citadel/icons/mob/taur_canine.dmi b/icons/mob/taur_canine.dmi
similarity index 100%
rename from modular_citadel/icons/mob/taur_canine.dmi
rename to icons/mob/taur_canine.dmi
diff --git a/modular_citadel/icons/mob/taur_hooved.dmi b/icons/mob/taur_hooved.dmi
similarity index 100%
rename from modular_citadel/icons/mob/taur_hooved.dmi
rename to icons/mob/taur_hooved.dmi
diff --git a/modular_citadel/icons/mob/taur_naga.dmi b/icons/mob/taur_naga.dmi
similarity index 100%
rename from modular_citadel/icons/mob/taur_naga.dmi
rename to icons/mob/taur_naga.dmi
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi
similarity index 100%
rename from modular_citadel/icons/mob/uniform_digi.dmi
rename to icons/mob/uniform_digi.dmi
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index 105da7d865..7d95805dc5 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/cardboard_cutout.dmi b/icons/obj/cardboard_cutout.dmi
index da5f58d7f7..f22b311c56 100644
Binary files a/icons/obj/cardboard_cutout.dmi and b/icons/obj/cardboard_cutout.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 195742c68c..695e623c66 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index f62e546ed2..42f85bb69e 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index db0e5a301a..f467da6fbf 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index b7161509f4..bba3efc951 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index e7dee2290d..45e73c9281 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi
index 245841a6b4..98d9af2ce6 100644
Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index dfcb54b7b9..6630da1478 100644
Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/hydroponics/growing_mushrooms.dmi b/icons/obj/hydroponics/growing_mushrooms.dmi
index aa24b394f2..20633cf85b 100644
Binary files a/icons/obj/hydroponics/growing_mushrooms.dmi and b/icons/obj/hydroponics/growing_mushrooms.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 63dc8b98fd..9d4eefc3bb 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 3c625cbe40..7bc9ac1fe3 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi
index cddb57303d..a4bd75f7e5 100644
Binary files a/icons/obj/items_cyborg.dmi and b/icons/obj/items_cyborg.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index f29208e71f..c6f25f1b29 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 1da5a66546..1ba953d284 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi
index 069fb1e08d..13cc43fe4e 100644
Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index fedb6c828e..3b8b67ea5c 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 3aa6912da7..90d648d0be 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index efd7974897..ee703fc70b 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 2a56a03e66..18ebd6b91e 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/modular_citadel/code/game/gamemodes/gangs/dominator.dm b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
index c590baf62e..8c1272dcbd 100644
--- a/modular_citadel/code/game/gamemodes/gangs/dominator.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
@@ -66,18 +66,18 @@
add_overlay("damage")
/obj/machinery/dominator/examine(mob/user)
- ..()
+ . = ..()
if(stat & BROKEN)
return
if(gang && gang.domination_time != NOT_DOMINATING)
if(gang.domination_time > world.time)
- to_chat(user, "Hostile Takeover in progress. Estimated [gang.domination_time_remaining()] seconds remain. ")
+ . += "Hostile Takeover in progress. Estimated [gang.domination_time_remaining()] seconds remain. "
else
- to_chat(user, "Hostile Takeover of [station_name()] successful. Have a great day. ")
+ . += "Hostile Takeover of [station_name()] successful. Have a great day. "
else
- to_chat(user, "System on standby. ")
- to_chat(user, "System Integrity: [round((obj_integrity/max_integrity)*100,1)]% ")
+ . += "System on standby. "
+ . += "System Integrity: [round((obj_integrity/max_integrity)*100,1)]% "
/obj/machinery/dominator/process()
..()
diff --git a/modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm b/modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm
deleted file mode 100644
index 1ef2285878..0000000000
--- a/modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/obj/structure/closet/athletic_mixed/PopulateContents()
- ..()
- new /obj/item/clothing/under/polychromic/shortpants(src)
- new /obj/item/clothing/under/polychromic/shortpants(src)
- new /obj/item/clothing/under/polychromic/shortpants(src)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm b/modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm
deleted file mode 100644
index 40a8224627..0000000000
--- a/modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/obj/structure/closet/secure_closet/quartermaster/PopulateContents()
- ..()
- new /obj/item/radio/headset/heads/qm(src)
-
-/obj/structure/closet/secure_closet/CMO/PopulateContents()
- ..()
- new /obj/item/storage/hypospraykit/cmo(src)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
deleted file mode 100644
index ba4fa3787b..0000000000
--- a/modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-/obj/structure/closet/wardrobe/mixed/PopulateContents()
- if(prob(40))
- new /obj/item/clothing/suit/jacket(src)
- if(prob(40))
- new /obj/item/clothing/suit/jacket(src)
- new /obj/item/clothing/under/polychromic/jumpsuit(src)
- new /obj/item/clothing/under/polychromic/jumpsuit(src)
- new /obj/item/clothing/under/polychromic/jumpsuit(src)
- new /obj/item/clothing/under/polychromic/shirt(src)
- new /obj/item/clothing/under/polychromic/shirt(src)
- new /obj/item/clothing/under/polychromic/shirt(src)
- new /obj/item/clothing/under/polychromic/kilt(src)
- new /obj/item/clothing/under/polychromic/kilt(src)
- new /obj/item/clothing/under/polychromic/kilt(src)
- new /obj/item/clothing/under/polychromic/skirt(src)
- new /obj/item/clothing/under/polychromic/skirt(src)
- new /obj/item/clothing/under/polychromic/skirt(src)
- new /obj/item/clothing/under/polychromic/shorts(src)
- new /obj/item/clothing/under/polychromic/shorts(src)
- new /obj/item/clothing/under/polychromic/shorts(src)
- new /obj/item/clothing/mask/bandana/red(src)
- new /obj/item/clothing/mask/bandana/red(src)
- new /obj/item/clothing/mask/bandana/blue(src)
- new /obj/item/clothing/mask/bandana/blue(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/shoes/sneakers/black(src)
- new /obj/item/clothing/shoes/sneakers/brown(src)
- new /obj/item/clothing/shoes/sneakers/white(src)
- if(prob(30))
- new /obj/item/clothing/suit/hooded/wintercoat(src)
- new /obj/item/clothing/shoes/winterboots(src)
- return
-
-/obj/structure/closet/wardrobe/curator/PopulateContents()
- ..()
- new /obj/item/clothing/accessory/pocketprotector/full(src)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/tools.dm b/modular_citadel/code/game/objects/tools.dm
deleted file mode 100644
index 5a6cd9bf42..0000000000
--- a/modular_citadel/code/game/objects/tools.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-// OVERRIDES FOR TOOL SPRITES GO HERE
-*/
-
-//CROWBAR
-
-/obj/item/crowbar
- icon = 'modular_citadel/icons/obj/tools.dmi'
-
-//WIRECUTTERS disabled pending better sprites
-/*
-/obj/item/wirecutters
- icon = 'modular_citadel/icons/obj/tools.dmi'
-*/
-//WRENCH
-
-/obj/item/wrench
- icon = 'modular_citadel/icons/obj/tools.dmi'
\ No newline at end of file
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 6c9da17289..ed28185bb7 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -159,7 +159,7 @@
to_chat(M, "Arousal is disabled. Feature is unavailable. ")
-/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
+/mob/living/proc/mob_climax(forced_climax = FALSE)//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
set category = "IC"
if(canbearoused && !restrained() && !stat)
diff --git a/modular_citadel/code/modules/arousal/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm
index 4b0a7ad919..24c8de1b60 100644
--- a/modular_citadel/code/modules/arousal/toys/dildos.dm
+++ b/modular_citadel/code/modules/arousal/toys/dildos.dm
@@ -93,9 +93,9 @@
pixel_x = rand(-7,7)
/obj/item/dildo/examine(mob/user)
- ..()
+ . = ..()
if(can_customize)
- user << "Alt-Click \the [src.name] to customize it. "
+ . += "Alt-Click \the [src.name] to customize it. "
/obj/item/dildo/random//totally random
name = "random dildo"//this name will show up in vendors and shit so you know what you're vending(or don't, i guess :^))
diff --git a/modular_citadel/code/modules/client/loadout/_service.dm b/modular_citadel/code/modules/client/loadout/_service.dm
index 7872ddcf99..86823f5661 100644
--- a/modular_citadel/code/modules/client/loadout/_service.dm
+++ b/modular_citadel/code/modules/client/loadout/_service.dm
@@ -5,14 +5,14 @@
restricted_roles = list("Assistant")
/datum/gear/neetsuit
- name = "ASSU suit"
+ name = "D.A.B. suit"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/assu_suit
restricted_roles = list("Assistant")
cost = 2
/datum/gear/neethelm
- name = "ASSU helmet"
+ name = "D.A.B. helmet"
category = SLOT_HEAD
path = /obj/item/clothing/head/assu_helmet
restricted_roles = list("Assistant")
diff --git a/modular_citadel/code/modules/clothing/clothing.dm b/modular_citadel/code/modules/clothing/clothing.dm
index 7f366ecf35..b23e805f92 100644
--- a/modular_citadel/code/modules/clothing/clothing.dm
+++ b/modular_citadel/code/modules/clothing/clothing.dm
@@ -80,9 +80,9 @@
user.regenerate_icons()
/obj/item/clothing/examine(mob/user)
- ..()
+ . = ..()
if(hasprimary | hassecondary | hastertiary)
- to_chat(user, "Alt-click to recolor it. ") // so people don't "OOC how do you use polychromic clothes????"
+ . += "Alt-click to recolor it. "
/obj/item/clothing/Initialize()
..()
diff --git a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
index 353b0afb14..f5a15f7900 100644
--- a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
+++ b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
@@ -19,9 +19,9 @@
. = ..()
if(user.get_item_by_slot(SLOT_GLASSES) == src)
if(world.time >= nextadrenalinepop)
- to_chat(user, "The built-in adrenaline injector is ready for use. ")
+ . += "The built-in adrenaline injector is ready for use. "
else
- to_chat(user, "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again.")
+ . += "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again."
/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate)
if(istype(user) && combatmodestate && world.time >= nextadrenalinepop)
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 11dbb4dc80..d32fd78a44 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -2,7 +2,7 @@
//For custom items.
// Unless there's a digitigrade version make sure you add mutantrace_variation = NO_MUTANTRACE_VARIATION to all clothing/under and shoes - Pooj
-// Digitigrade stuff is uniform_digi.dmi and digishoes.dmi in modular_citadel/icons/mob
+// Digitigrade stuff is uniform_digi.dmi and digishoes.dmi in icons/mob
/obj/item/custom/ceb_soap
name = "Cebutris' Soap"
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index 99ba9ad3e2..17def26f1d 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -20,7 +20,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/dogborg/jaws/examine(mob/user)
. = ..()
if(!CONFIG_GET(flag/weaken_secborg))
- to_chat(user, "Use help intent to attempt to non-lethally incapacitate the target by latching on with your maw. This is more effective against exhausted and resting targets. ")
+ . += "Use help intent to attempt to non-lethally incapacitate the target by latching on with your maw. This is more effective against exhausted and resting targets. "
/obj/item/dogborg/jaws/big
name = "combat jaws"
@@ -253,7 +253,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
if(!do_after(R, 50, target = target))
return //If they moved away, you can't eat them.
to_chat(R, "You finish off \the [target.name]. ")
- var/obj/item/stock_parts/cell.C = target
+ var/obj/item/stock_parts/cell/C = target
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
qdel(target)
return
@@ -312,6 +312,42 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
target.wash_cream()
return
+//Nerfed tongue for flavour reasons (haha geddit?). Used for aux skins for regular borgs
+/obj/item/soap/tongue/flavour
+ desc = "For giving affectionate kisses."
+
+/obj/item/soap/tongue/flavour/attack_self(mob/user)
+ return
+
+/obj/item/soap/tongue/flavour/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
+ return
+ var/mob/living/silicon/robot/R = user
+ if(ishuman(target))
+ var/mob/living/L = target
+ if(status == 0 && check_zone(R.zone_selected) == "head")
+ R.visible_message("\the [R] affectionally licks \the [L]'s face! ", "You affectionally lick \the [L]'s face! ")
+ playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ return
+ else if(status == 0)
+ R.visible_message("\the [R] affectionally licks \the [L]! ", "You affectionally lick \the [L]! ")
+ playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ return
+
+//Same as above but for noses
+/obj/item/analyzer/nose/flavour/AltClick(mob/user)
+ return
+
+/obj/item/analyzer/nose/flavour/attack_self(mob/user)
+ return
+
+/obj/item/analyzer/nose/flavour/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
+ return
+ do_attack_animation(target, null, src)
+ user.visible_message("[user] [pick(attack_verb)] \the [target.name] with their nose! ")
+
+
//Dogfood
/obj/item/trash/rkibble
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
deleted file mode 100644
index de98f9685c..0000000000
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-mob/living/silicon
- no_vore = TRUE
-
-/mob/living/silicon/robot
- var/dogborg = FALSE
-
-/mob/living/silicon/robot/lay_down()
- ..()
- update_canmove()
-
-/mob/living/silicon/robot/update_canmove()
- ..()
- if(client && stat != DEAD && dogborg == FALSE)
- if(resting)
- cut_overlays()
- icon_state = "[module.cyborg_base_icon]-rest"
- else
- icon_state = "[module.cyborg_base_icon]"
- update_icons()
-
-
-
-
-/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
- if(istype(cell))
- cell.charge -= amount*5
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
deleted file mode 100644
index feec79ee8b..0000000000
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ /dev/null
@@ -1,466 +0,0 @@
-/mob/living/silicon/robot/modules/medihound
- set_module = /obj/item/robot_module/medihound
-
-/mob/living/silicon/robot/modules/k9
- set_module = /obj/item/robot_module/k9
-
-/mob/living/silicon/robot/modules/scrubpup
- set_module = /obj/item/robot_module/scrubpup
-
-/mob/living/silicon/robot/modules/borgi
- set_module = /obj/item/robot_module/borgi
-
-/mob/living/silicon/robot/proc/get_cit_modules()
- var/list/modulelist = list()
- modulelist["MediHound"] = /obj/item/robot_module/medihound
- if(BORG_SEC_AVAILABLE)
- modulelist["Security K-9"] = /obj/item/robot_module/k9
- modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup
- modulelist["Borgi"] = /obj/item/robot_module/borgi
- return modulelist
-
-/obj/item/robot_module
- var/sleeper_overlay
- var/icon/cyborg_icon_override
- var/has_snowflake_deadsprite
- var/cyborg_pixel_offset
- var/moduleselect_alternate_icon
- var/dogborg = FALSE
-
-/obj/item/robot_module/k9
- name = "Security K-9 Unit"
- basic_modules = list(
- /obj/item/restraints/handcuffs/cable/zipties,
- /obj/item/storage/bag/borgdelivery,
- /obj/item/dogborg/jaws/big,
- /obj/item/dogborg/pounce,
- /obj/item/clothing/mask/gas/sechailer/cyborg,
- /obj/item/soap/tongue,
- /obj/item/analyzer/nose,
- /obj/item/dogborg/sleeper/K9,
- /obj/item/gun/energy/disabler/cyborg,
- /obj/item/pinpointer/crew)
- emag_modules = list(/obj/item/gun/energy/laser/cyborg)
- ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
- /obj/item/clockwork/weapon/ratvarian_spear)
- cyborg_base_icon = "k9"
- moduleselect_icon = "k9"
- moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
- can_be_pushed = FALSE
- hat_offset = INFINITY
- sleeper_overlay = "ksleeper"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- borghealth = 80
-
-/obj/item/robot_module/k9/do_transform_animation()
- ..()
- to_chat(loc,"While you have picked the Security K-9 module, you still have to follow your laws, NOT Space Law. \
- For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to. ")
-
-/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/list/sechoundmodels = list("Default", "Dark", "Vale")
- if(R.client && R.client.ckey in list("nezuli"))
- sechoundmodels += "Alina"
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "k9"
- if("Alina")
- cyborg_base_icon = "alina-sec"
- special_light_key = "alina"
- sleeper_overlay = "alinasleeper"
- if("Dark")
- cyborg_base_icon = "k9dark"
- if("Vale")
- cyborg_base_icon = "valesec"
- return ..()
-
-/obj/item/robot_module/medihound
- name = "MediHound"
- basic_modules = list(
- /obj/item/dogborg/jaws/small,
- /obj/item/storage/bag/borgdelivery,
- /obj/item/analyzer/nose,
- /obj/item/soap/tongue,
- /obj/item/extinguisher/mini,
- /obj/item/healthanalyzer,
- /obj/item/dogborg/sleeper/medihound,
- /obj/item/roller/robo,
- /obj/item/reagent_containers/borghypo,
- /obj/item/twohanded/shockpaddles/cyborg/hound,
- /obj/item/stack/medical/gauze/cyborg,
- /obj/item/pinpointer/crew,
- /obj/item/sensor_device)
- emag_modules = list(/obj/item/dogborg/pounce)
- ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical,
- /obj/item/clockwork/weapon/ratvarian_spear)
- cyborg_base_icon = "medihound"
- moduleselect_icon = "medihound"
- moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
- can_be_pushed = FALSE
- hat_offset = INFINITY
- sleeper_overlay = "msleeper"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
-
-/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/list/medhoundmodels = list("Default", "Dark", "Vale")
- if(R.client && R.client.ckey in list("nezuli"))
- medhoundmodels += "Alina"
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "medihound"
- if("Dark")
- cyborg_base_icon = "medihounddark"
- sleeper_overlay = "mdsleeper"
- if("Vale")
- cyborg_base_icon = "valemed"
- sleeper_overlay = "valemedsleeper"
- if("Alina")
- cyborg_base_icon = "alina-med"
- special_light_key = "alina"
- sleeper_overlay = "alinasleeper"
- return ..()
-
-/obj/item/robot_module/scrubpup
- name = "Scrub Pup"
- basic_modules = list(
- /obj/item/dogborg/jaws/small,
- /obj/item/analyzer/nose,
- /obj/item/soap/tongue/scrubpup,
- /obj/item/lightreplacer/cyborg,
- /obj/item/extinguisher/mini,
- /obj/item/dogborg/sleeper/compactor)
- emag_modules = list(/obj/item/dogborg/pounce)
- ratvar_modules = list(
- /obj/item/clockwork/slab/cyborg/janitor,
- /obj/item/clockwork/replica_fabricator/cyborg)
- cyborg_base_icon = "scrubpup"
- moduleselect_icon = "janitor"
- hat_offset = INFINITY
- clean_on_move = TRUE
- sleeper_overlay = "jsleeper"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- cyborg_pixel_offset = -16
- dogborg = TRUE
-
-/obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
- ..()
- var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules
- if(LR)
- for(var/i in 1 to coeff)
- LR.Charge(R)
-
-/obj/item/robot_module/scrubpup/do_transform_animation()
- ..()
- to_chat(loc,"As tempting as it might be, do not begin binging on important items. Eat your garbage responsibly. People are not included under Garbage. ")
-
-/obj/item/robot_module/borgi
- name = "Borgi"
- basic_modules = list(
- /obj/item/dogborg/jaws/small,
- /obj/item/storage/bag/borgdelivery,
- /obj/item/analyzer/nose,
- /obj/item/soap/tongue,
- /obj/item/healthanalyzer,
- /obj/item/extinguisher/mini,
- /obj/item/borg/cyborghug)
- emag_modules = list(/obj/item/dogborg/pounce)
- ratvar_modules = list(
- /obj/item/clockwork/slab/cyborg,
- /obj/item/clockwork/weapon/ratvarian_spear,
- /obj/item/clockwork/replica_fabricator/cyborg)
- cyborg_base_icon = "borgi"
- moduleselect_icon = "borgi"
- moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
- hat_offset = INFINITY
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- has_snowflake_deadsprite = TRUE
-
-/*
-/obj/item/robot_module/orepup
- name = "Ore Pup"
- basic_modules = list(
- /obj/item/storage/bag/ore/cyborg,
- /obj/item/analyzer/nose,
- /obj/item/storage/bag/borgdelivery,
- /obj/item/dogborg/sleeper/ore,
- /obj/item/pickaxe/drill/cyborg,
- /obj/item/shovel,
- /obj/item/crowbar/cyborg,
- /obj/item/weldingtool/mini,
- /obj/item/extinguisher/mini,
- /obj/item/t_scanner/adv_mining_scanner,
- /obj/item/gun/energy/kinetic_accelerator/cyborg,
- /obj/item/gps/cyborg)
- emag_modules = list(/obj/item/dogborg/pounce)
- ratvar_modules = list(
- /obj/item/clockwork/slab/cyborg/miner,
- /obj/item/clockwork/weapon/ratvarian_spear,
- /obj/item/borg/sight/xray/truesight_lens)
- cyborg_base_icon = "orepup"
- moduleselect_icon = "orepup"
- sleeper_overlay = "osleeper"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- cyborg_pixel_offset = -16
-
-/obj/item/robot_module/miner/do_transform_animation()
- var/mob/living/silicon/robot/R = loc
- R.cut_overlays()
- R.setDir(SOUTH)
- flick("orepup_transform", R)
- do_transform_delay()
- R.update_headlamp()
-*/
-
-/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "medical"
- if("Droid")
- cyborg_base_icon = "medical"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- hat_offset = 4
- if("Sleek")
- cyborg_base_icon = "sleekmed"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Marina")
- cyborg_base_icon = "marinamed"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Eyebot")
- cyborg_base_icon = "eyebotmed"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Heavy")
- cyborg_base_icon = "heavymed"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- return ..()
-
-/obj/item/robot_module/janitor/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/list/janimodels = list("Default", "Sleek", "Marina", "Can", "Heavy")
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in janimodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "janitor"
- if("Marina")
- cyborg_base_icon = "marinajan"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Sleek")
- cyborg_base_icon = "sleekjan"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Can")
- cyborg_base_icon = "canjan"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Heavy")
- cyborg_base_icon = "heavyres"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- return ..()
-
-/obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "peace"
- if("Spider")
- cyborg_base_icon = "whitespider"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- return ..()
-
-/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "sec"
- if("Default - Treads")
- cyborg_base_icon = "sec-tread"
- special_light_key = "sec"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Sleek")
- cyborg_base_icon = "sleeksec"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Marina")
- cyborg_base_icon = "marinasec"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Can")
- cyborg_base_icon = "cansec"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Spider")
- cyborg_base_icon = "spidersec"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Heavy")
- cyborg_base_icon = "heavysec"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- return ..()
-
-/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "DarkK9", "Vale", "ValeDark")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Waitress")
- cyborg_base_icon = "service_f"
- if("Butler")
- cyborg_base_icon = "service_m"
- if("Bro")
- cyborg_base_icon = "brobot"
- if("Kent")
- cyborg_base_icon = "kent"
- special_light_key = "medical"
- hat_offset = 3
- if("Tophat")
- cyborg_base_icon = "tophat"
- special_light_key = null
- hat_offset = INFINITY //He is already wearing a hat
- if("Sleek")
- cyborg_base_icon = "sleekserv"
- special_light_key = "sleekserv"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Heavy")
- cyborg_base_icon = "heavyserv"
- special_light_key = "heavyserv"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("DarkK9")
- cyborg_base_icon = "k50"
- special_light_key = "k50"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- if("Vale")
- cyborg_base_icon = "valeserv"
- special_light_key = "valeserv"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- if("ValeDark")
- cyborg_base_icon = "valeservdark"
- special_light_key = "valeservdark"
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- return ..()
-
-/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
- if(R.client && R.client.ckey in list("nezuli"))
- engymodels += "Alina"
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Default")
- cyborg_base_icon = "engineer"
- if("Default - Treads")
- cyborg_base_icon = "engi-tread"
- special_light_key = "engineer"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Loader")
- cyborg_base_icon = "loaderborg"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- has_snowflake_deadsprite = TRUE
- if("Handy")
- cyborg_base_icon = "handyeng"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Sleek")
- cyborg_base_icon = "sleekeng"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Can")
- cyborg_base_icon = "caneng"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Marina")
- cyborg_base_icon = "marinaeng"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Spider")
- cyborg_base_icon = "spidereng"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Heavy")
- cyborg_base_icon = "heavyeng"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Pup Dozer")
- cyborg_base_icon = "pupdozer"
- can_be_pushed = FALSE
- hat_offset = INFINITY
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- if("Vale")
- cyborg_base_icon = "valeeng"
- can_be_pushed = FALSE
- hat_offset = INFINITY
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- if("Alina")
- cyborg_base_icon = "alina-eng"
- special_light_key = "alina"
- can_be_pushed = FALSE
- hat_offset = INFINITY
- cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
- has_snowflake_deadsprite = TRUE
- dogborg = TRUE
- cyborg_pixel_offset = -16
- return ..()
-
-/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
- var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
- if("Lavaland")
- cyborg_base_icon = "miner"
- if("Asteroid")
- cyborg_base_icon = "minerOLD"
- special_light_key = "miner"
- if("Droid")
- cyborg_base_icon = "miner"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- hat_offset = 4
- if("Sleek")
- cyborg_base_icon = "sleekmin"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Can")
- cyborg_base_icon = "canmin"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Marina")
- cyborg_base_icon = "marinamin"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Spider")
- cyborg_base_icon = "spidermin"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- if("Heavy")
- cyborg_base_icon = "heavymin"
- cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
- return ..()
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
index 7e6a8b3389..f847d04e9e 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
@@ -178,9 +178,9 @@
/obj/item/gun/ballistic/automatic/magrifle_e/examine(mob/user)
. = ..()
if(cell)
- to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full. ")
+ . += "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full. "
else
- to_chat(user, "[src] doesn't seem to have a cell! ")
+ . += "[src] doesn't seem to have a cell! "
/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot()
if(QDELETED(cell))
@@ -241,9 +241,9 @@
/obj/item/gun/ballistic/automatic/pistol/mag_e/examine(mob/user)
. = ..()
if(cell)
- to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full. ")
+ . += "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full. "
else
- to_chat(user, "[src] doesn't seem to have a cell! ")
+ . += "[src] doesn't seem to have a cell! "
/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot()
if(QDELETED(cell))
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
index 1e0e0afc87..e40ccfe6ea 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
@@ -218,8 +218,8 @@
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it. ")
+ . = ..()
+ . += "Alt-click to recolor it. "
/obj/item/ammo_box/magazine/toy/AM4C
name = "foam force AM4-C magazine"
diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
index aef47a648e..be070ff7b5 100644
--- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
@@ -94,8 +94,8 @@
update_icon()
/obj/item/gun/energy/pumpaction/examine(mob/user) //so people don't ask HOW TO CHANGE FIRING MODE
- ..()
- to_chat(user, "Alt-click to change firing modes. ")
+ . = ..()
+ . += "Alt-click to change firing modes. "
/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file) //ammo counter for inhands
. = ..()
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 4e80f42d87..f582026bfb 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -163,9 +163,9 @@ Creating a chem with a low purity will make you permanently fall in love with so
creator = get_mob_by_key(creatorID)
/datum/reagent/fermi/enthrall/on_new(list/data)
- creatorID = data.["creatorID"]
- creatorGender = data.["creatorGender"]
- creatorName = data.["creatorName"]
+ creatorID = data["creatorID"]
+ creatorGender = data["creatorGender"]
+ creatorName = data["creatorName"]
creator = get_mob_by_key(creatorID)
/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
index bf915d5b6f..00c6338ac3 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -32,7 +32,7 @@
can_synth = TRUE
/datum/reagent/fermi/eigenstate/on_new(list/data)
- location_created = data.["location_created"]
+ location_created = data["location_created"]
//Main functions
/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry!
@@ -54,7 +54,7 @@
to_chat(M, "You feel your wavefunction split! ")
if(purity > 0.9) //Teleports you home if it's pure enough
if(!location_created && data) //Just in case
- location_created = data.["location_created"]
+ location_created = data["location_created"]
log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
do_sparks(5,FALSE,M)
do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg')
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 7fcae0eb13..5fe7d58f1c 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -131,7 +131,7 @@
var/turf/open/location = get_turf(my_atom)
if(location)
E.location_created = location
- E.data.["location_created"] = location
+ E.data["location_created"] = location
//serum
@@ -314,16 +314,16 @@
for(var/mob/M in seen)
to_chat(M, "The reaction splutters and fails to react properly. ") //Just in case
E.purity = 0
- if (B.data.["gender"] == "female")
- E.data.["creatorGender"] = "Mistress"
+ if (B.data["gender"] == "female")
+ E.data["creatorGender"] = "Mistress"
E.creatorGender = "Mistress"
else
- E.data.["creatorGender"] = "Master"
+ E.data["creatorGender"] = "Master"
E.creatorGender = "Master"
- E.data["creatorName"] = B.data.["real_name"]
- E.creatorName = B.data.["real_name"]
- E.data.["creatorID"] = B.data.["ckey"]
- E.creatorID = B.data.["ckey"]
+ E.data["creatorName"] = B.data["real_name"]
+ E.creatorName = B.data["real_name"]
+ E.data["creatorID"] = B.data["ckey"]
+ E.creatorID = B.data["ckey"]
//So slimes can play too.
/datum/chemical_reaction/fermi/enthrall/slime
@@ -337,16 +337,16 @@
for(var/mob/M in seen)
to_chat(M, "The reaction splutters and fails to react. ") //Just in case
E.purity = 0
- if (B.data.["gender"] == "female")
- E.data.["creatorGender"] = "Mistress"
+ if (B.data["gender"] == "female")
+ E.data["creatorGender"] = "Mistress"
E.creatorGender = "Mistress"
else
- E.data.["creatorGender"] = "Master"
+ E.data["creatorGender"] = "Master"
E.creatorGender = "Master"
- E.data["creatorName"] = B.data.["real_name"]
- E.creatorName = B.data.["real_name"]
- E.data.["creatorID"] = B.data.["ckey"]
- E.creatorID = B.data.["ckey"]
+ E.data["creatorName"] = B.data["real_name"]
+ E.creatorName = B.data["real_name"]
+ E.data["creatorID"] = B.data["ckey"]
+ E.creatorID = B.data["ckey"]
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
var/turf/T = get_turf(my_atom)
diff --git a/modular_citadel/icons/mob/mask.dmi b/modular_citadel/icons/mob/mask.dmi
deleted file mode 100644
index 788bfc0447..0000000000
Binary files a/modular_citadel/icons/mob/mask.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index a66895f864..8ff4a3ddb5 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/pai.dmi b/modular_citadel/icons/mob/pai.dmi
deleted file mode 100644
index d8162cb5a7..0000000000
Binary files a/modular_citadel/icons/mob/pai.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
deleted file mode 100644
index fdcedac095..0000000000
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/widerobot.dmi b/modular_citadel/icons/mob/widerobot.dmi
index 19dd8dba86..e574766d70 100644
Binary files a/modular_citadel/icons/mob/widerobot.dmi and b/modular_citadel/icons/mob/widerobot.dmi differ
diff --git a/modular_citadel/icons/obj/power.dmi b/modular_citadel/icons/obj/power.dmi
deleted file mode 100644
index d0066b96de..0000000000
Binary files a/modular_citadel/icons/obj/power.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/tools.dmi b/modular_citadel/icons/obj/tools.dmi
deleted file mode 100644
index 7b99880799..0000000000
Binary files a/modular_citadel/icons/obj/tools.dmi and /dev/null differ
diff --git a/sound/weapons/Gunshot.ogg b/sound/weapons/Gunshot.ogg
index 4fd082ce7f..46369bbb62 100644
Binary files a/sound/weapons/Gunshot.ogg and b/sound/weapons/Gunshot.ogg differ
diff --git a/sound/weapons/Gunshot2.ogg b/sound/weapons/Gunshot2.ogg
index 2dfc6fc1e9..4801989d3d 100644
Binary files a/sound/weapons/Gunshot2.ogg and b/sound/weapons/Gunshot2.ogg differ
diff --git a/sound/weapons/Gunshot3.ogg b/sound/weapons/Gunshot3.ogg
index 97799dff10..66da509083 100644
Binary files a/sound/weapons/Gunshot3.ogg and b/sound/weapons/Gunshot3.ogg differ
diff --git a/sound/weapons/Gunshot4.ogg b/sound/weapons/Gunshot4.ogg
index 2d971f7b1a..322e5c0cbd 100644
Binary files a/sound/weapons/Gunshot4.ogg and b/sound/weapons/Gunshot4.ogg differ
diff --git a/sound/weapons/Gunshot_silenced.ogg b/sound/weapons/Gunshot_silenced.ogg
index ef250d86aa..13f3702fd4 100644
Binary files a/sound/weapons/Gunshot_silenced.ogg and b/sound/weapons/Gunshot_silenced.ogg differ
diff --git a/sound/weapons/Gunshot_smg.ogg b/sound/weapons/Gunshot_smg.ogg
index 5c0000bb32..ce03376b52 100644
Binary files a/sound/weapons/Gunshot_smg.ogg and b/sound/weapons/Gunshot_smg.ogg differ
diff --git a/sound/weapons/IonRifle.ogg b/sound/weapons/IonRifle.ogg
index b808068e55..37647c081f 100644
Binary files a/sound/weapons/IonRifle.ogg and b/sound/weapons/IonRifle.ogg differ
diff --git a/sound/weapons/Laser.ogg b/sound/weapons/Laser.ogg
index 0fbb611f9c..4ff9e82ff9 100644
Binary files a/sound/weapons/Laser.ogg and b/sound/weapons/Laser.ogg differ
diff --git a/sound/weapons/LaserSlugv3.ogg b/sound/weapons/LaserSlugv3.ogg
index dbb8f4b954..0c3de3d4fd 100644
Binary files a/sound/weapons/LaserSlugv3.ogg and b/sound/weapons/LaserSlugv3.ogg differ
diff --git a/sound/weapons/Taser.ogg b/sound/weapons/Taser.ogg
index 8992b71f50..4181715240 100644
Binary files a/sound/weapons/Taser.ogg and b/sound/weapons/Taser.ogg differ
diff --git a/sound/weapons/laser3.ogg b/sound/weapons/laser3.ogg
index 134be315fc..03d4d933f2 100644
Binary files a/sound/weapons/laser3.ogg and b/sound/weapons/laser3.ogg differ
diff --git a/sound/weapons/lasercannonfire.ogg b/sound/weapons/lasercannonfire.ogg
index 612d608db8..cbbc3ce53c 100644
Binary files a/sound/weapons/lasercannonfire.ogg and b/sound/weapons/lasercannonfire.ogg differ
diff --git a/sound/weapons/magpistol.ogg b/sound/weapons/magpistol.ogg
index c130714962..4b94aa1e0a 100644
Binary files a/sound/weapons/magpistol.ogg and b/sound/weapons/magpistol.ogg differ
diff --git a/sound/weapons/magrifle.ogg b/sound/weapons/magrifle.ogg
index 2ec2e72af6..67d6500a6c 100644
Binary files a/sound/weapons/magrifle.ogg and b/sound/weapons/magrifle.ogg differ
diff --git a/sound/weapons/pulse.ogg b/sound/weapons/pulse.ogg
index 617b903231..df7f96f7cf 100644
Binary files a/sound/weapons/pulse.ogg and b/sound/weapons/pulse.ogg differ
diff --git a/sound/weapons/pulse2.ogg b/sound/weapons/pulse2.ogg
index 44c46fc715..2e93bfd17f 100644
Binary files a/sound/weapons/pulse2.ogg and b/sound/weapons/pulse2.ogg differ
diff --git a/sound/weapons/pulse3.ogg b/sound/weapons/pulse3.ogg
index b275fba2a8..0484b2cc81 100644
Binary files a/sound/weapons/pulse3.ogg and b/sound/weapons/pulse3.ogg differ
diff --git a/sound/weapons/smg_empty_alarm.ogg b/sound/weapons/smg_empty_alarm.ogg
index f031b4e1d8..325cabe9d8 100644
Binary files a/sound/weapons/smg_empty_alarm.ogg and b/sound/weapons/smg_empty_alarm.ogg differ
diff --git a/sound/weapons/taser2.ogg b/sound/weapons/taser2.ogg
index 2cdab84378..e522043e9b 100644
Binary files a/sound/weapons/taser2.ogg and b/sound/weapons/taser2.ogg differ
diff --git a/strings/clockwork_cult_changelog.txt b/strings/clockwork_cult_changelog.txt
index 3c5e5f5ef6..10e924ff00 100644
--- a/strings/clockwork_cult_changelog.txt
+++ b/strings/clockwork_cult_changelog.txt
@@ -2,3 +2,7 @@ Stargazers have been removed. Integration cogs are now the primary way of creati
Brass Skewers now deal damage to mechs.
Mech Sensors are now available. They're similar to pressure sensors, but trigger if a mech steps on them, and can be built the same way.
Power nullifiers are now available. Upon triggering, they send out a small 3x3 EMP, affecting cultists and enemies alike.
+Zelus oil: A new reagent. It can be used to heal the faithful to Ratvar, kill heretics and moreso stun blood cultists, or splashed onto metal sheets to make brass.
+This chemical can be found in minimal quantities by grinding brass sheets.
+Brass Flasks: Intended to store Zelus Oil in, but can also be used as fragile single use throwing weapons in a pinch!
+These are crafted with a single sheet of brass and fit in the Clockwork Cuirass' suit storage.
diff --git a/tgstation.dme b/tgstation.dme
index 77f325fdd8..b4bb6ec9dc 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -384,8 +384,8 @@
#include "code\datums\components\remote_materials.dm"
#include "code\datums\components\riding.dm"
#include "code\datums\components\rotation.dm"
-#include "code\datums\components\shrink.dm"
#include "code\datums\components\shrapnel.dm"
+#include "code\datums\components\shrink.dm"
#include "code\datums\components\slippery.dm"
#include "code\datums\components\spooky.dm"
#include "code\datums\components\squeak.dm"
@@ -880,6 +880,7 @@
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\compressionkit.dm"
+#include "code\game\objects\items\devices\desynchronizer.dm"
#include "code\game\objects\items\devices\dogborg_sleeper.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
@@ -1053,6 +1054,7 @@
#include "code\game\objects\structures\beds_chairs\alien_nest.dm"
#include "code\game\objects\structures\beds_chairs\bed.dm"
#include "code\game\objects\structures\beds_chairs\chair.dm"
+#include "code\game\objects\structures\beds_chairs\pew.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
@@ -1345,6 +1347,7 @@
#include "code\modules\antagonists\ninja\ninja.dm"
#include "code\modules\antagonists\nukeop\clownop.dm"
#include "code\modules\antagonists\nukeop\nukeop.dm"
+#include "code\modules\antagonists\nukeop\equipment\borgchameleon.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm"
#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm"
@@ -3024,7 +3027,6 @@
#include "modular_citadel\code\game\machinery\wishgranter.dm"
#include "modular_citadel\code\game\objects\cit_screenshake.dm"
#include "modular_citadel\code\game\objects\items.dm"
-#include "modular_citadel\code\game\objects\tools.dm"
#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
@@ -3040,9 +3042,6 @@
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm"
#include "modular_citadel\code\modules\admin\admin.dm"
#include "modular_citadel\code\modules\admin\chat_commands.dm"
#include "modular_citadel\code\modules\admin\holder2.dm"
@@ -3115,8 +3114,6 @@
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "modular_citadel\code\modules\projectiles\gun.dm"
#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm"