diff --git a/code/__DEFINES/circuitboard.dm b/code/__DEFINES/circuitboard.dm
index 2363a4c1fed..189c0d11338 100644
--- a/code/__DEFINES/circuitboard.dm
+++ b/code/__DEFINES/circuitboard.dm
@@ -5,3 +5,9 @@
#define BOARD_MACHINE "machine"
#define BOARD_COMPUTER "computer"
#define BOARD_OTHER "other"
+
+#define T_BOARD(name) "" + "circuit board " + "(" + (name) + ")"
+#define T_BOARD_HARDSUIT(name) "" + "hardsuit circuit board " + "(" + (name) + ")"
+#define T_BOARD_HARDSUIT_TARGETING(name) "" + "hardsuit control and targeting circuit board " + "(" + (name) + ")"
+#define T_BOARD_MECHA(name) "" + "exosuit module circuit board " + "(" + (name) + ")"
+#define T_BOARD_VEHICLE(name) "" + "vehicle software " + "(" + (name) + ")"
diff --git a/code/__DEFINES/color.dm b/code/__DEFINES/color.dm
index 30b6e748b4d..4f34b8125b9 100644
--- a/code/__DEFINES/color.dm
+++ b/code/__DEFINES/color.dm
@@ -106,6 +106,7 @@
#define COLOR_RAIDER "#6C7364"
#define COLOR_CARDBOARD "#7A7F8B"
#define COLOR_REDBOX "#B62B2B"
+#define COLOR_SPRING_GREEN "#00ff88"
#define COLOR_TOOLS "#eac041"
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 9de84a857f4..09f5deb5f27 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -1,35 +1,61 @@
//Some defines to generalise colours used in lighting.
//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated
-#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130)
-#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100)
-#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250)
+/// Warm but extremely diluted red. rgb(250, 130, 130)
+#define LIGHT_COLOR_RED "#FA8282"
+/// Bright but quickly dissipating neon green. rgb(100, 200, 100)
+#define LIGHT_COLOR_GREEN "#64C864"
+/// Cold, diluted blue. rgb(100, 150, 250)
+#define LIGHT_COLOR_BLUE "#6496FA"
-#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225)
-#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225)
-#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125)
-#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50)
-#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50)
-#define LIGHT_COLOR_PURPLE "#A97FAA" //Soft purple. rgb(169, 127, 170)
-#define LIGHT_COLOR_VIOLET "#B43CB8" //Deep purple. rgb(180, 60, 184)
-#define LIGHT_COLOR_SCARLET "#E85656" //Light red. rgb(232, 86, 86)
-#define LIGHT_COLOR_WHITE "#FFFFFF" //White. rgb(255, 255, 255)
-#define LIGHT_COLOR_FAINT_CYAN "#CAF0FF"
+/// Cyan. rgb(125, 225, 225)
+#define LIGHT_COLOR_CYAN "#7DE1E1"
+/// Diluted cyan. rgb(202, 240, 255)
+#define LIGHT_COLOR_FAINT_CYAN "#caf0ff"
+/// Diluted, mid-warmth pink. rgb(225, 125, 225)
+#define LIGHT_COLOR_PINK "#E17DE1"
+/// Dimmed yellow, leaning kaki. rgb(225, 225, 125)
+#define LIGHT_COLOR_YELLOW "#E1E17D"
+/// Clear brown, mostly dim. rgb(150, 100, 50)
+#define LIGHT_COLOR_BROWN "#966432"
+/// Mostly pure orange. rgb(250, 150, 50)
+#define LIGHT_COLOR_ORANGE "#FA9632"
+/// Soft purple. rgb(169, 127, 170)
+#define LIGHT_COLOR_PURPLE "#A97FAA"
+/// Deep purple. rgb(180, 60, 184)
+#define LIGHT_COLOR_VIOLET "#B43CB8"
+/// Light red. rgb(232, 86, 86)
+#define LIGHT_COLOR_SCARLET "#E85656"
+/// White. rgb(255, 255, 255)
+#define LIGHT_COLOR_WHITE "#FFFFFF"
//These ones aren't a direct colour like the ones above, because nothing would fit
-#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
-#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24)
-#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75)
-#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75)
-#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
-#define LIGHT_COLOR_HALOGEN "#C0C0CA" //Soft lighting for general-purpose light fixtures. rgb(192, 192, 202)
-#define LIGHT_COLOR_EMERGENCY "#FF3232" //Red color used by emergency lighting. rgb(255, 50, 50)
-#define LIGHT_COLOR_EMERGENCY_SOFT "#FA8282" //A softer emergency red, used for small bulbs. rgb(250, 130, 130)
-#define LIGHT_COLOUR_WHITE "#FEFEFE" // Clinical white light bulbs
-#define LIGHT_COLOUR_WARM "#FFFEE0" // Warm yellowish light bulbs
-#define LIGHT_COLOR_DECAYED "#fabd6d" // Amberish decayed light bulbs
-#define LIGHT_COLOR_DYING "#fa826d" // Reddish decayed light bulbs
+/// Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
+#define LIGHT_COLOR_FIRE "#FAA019"
+/// Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24)
+#define LIGHT_COLOR_LAVA "#C48A18"
+/// Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75)
+#define LIGHT_COLOR_FLARE "#FA644B"
+/// Weird color, between yellow and green, very slimy. rgb(175, 200, 75)
+#define LIGHT_COLOR_SLIME_LAMP "#AFC84B"
+/// Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
+#define LIGHT_COLOR_TUNGSTEN "#FAE1AF"
+/// Soft lighting for general-purpose light fixtures. rgb(192, 192, 202)
+#define LIGHT_COLOR_HALOGEN "#C0C0CA"
+/// Red color used by emergency lighting. rgb(255, 50, 50)
+#define LIGHT_COLOR_EMERGENCY "#FF3232"
+/// A softer emergency red, used for small bulbs. rgb(250, 130, 130)
+#define LIGHT_COLOR_EMERGENCY_SOFT "#FA8282"
+/// Clinical white light bulbs
+#define LIGHT_COLOUR_WHITE "#FEFEFE"
+/// Warm yellowish light bulbs
+#define LIGHT_COLOUR_WARM "#FFFEE0"
+/// Amberish decayed light bulbs
+#define LIGHT_COLOR_DECAYED "#fabd6d"
+/// Reddish decayed light bulbs
+#define LIGHT_COLOR_DYING "#fa826d"
-#define LIGHT_STANDARD_COLORS list(LIGHT_COLOUR_WHITE, LIGHT_COLOUR_WARM, LIGHT_COLOR_HALOGEN) // List of standard light colors used for randomized lighting and selectable printed lights.
+/// List of standard light colors used for randomized lighting and selectable printed lights.
+#define LIGHT_STANDARD_COLORS list(LIGHT_COLOUR_WHITE, LIGHT_COLOUR_WARM, LIGHT_COLOR_HALOGEN)
#define LIGHT_MODE_RED "red"
#define LIGHT_MODE_DELTA "delta"
@@ -45,7 +71,8 @@
// Some brightness/range defines for objects.
#define L_WALLMOUNT_POWER 0.5
#define L_WALLMOUNT_RANGE 1
-#define L_WALLMOUNT_HI_POWER 1 // For red/delta alert on fire alarms.
+#define L_WALLMOUNT_HI_POWER 1/// $4
+
#define L_WALLMOUNT_HI_RANGE 2
// This controls by how much console sprites are dimmed before being overlayed.
#define HOLOSCREEN_MULTIPLICATION_FACTOR 0.5
@@ -58,26 +85,28 @@
#define MINIMUM_USEFUL_LIGHT_RANGE 1.4
-///Object doesn't use any of the light systems. Should be changed to add a light source to the object.
+/// Object doesn't use any of the light systems. Should be changed to add a light source to the object.
#define NO_LIGHT_SUPPORT 0
-///Light made with the lighting datums, applying a matrix.
+/// Light made with the lighting datums, applying a matrix.
#define STATIC_LIGHT 1
-///Light made by masking the lighting darkness plane.
+/// Light made by masking the lighting darkness plane.
#define MOVABLE_LIGHT 2
-///A mix of the above, cheaper on moving items than dynamic, but heavier on rendering than movable
+/// A mix of the above, cheaper on moving items than dynamic, but heavier on rendering than movable.
#define HYBRID_LIGHT 3
-///Pointy light
+/// Pointy light.
#define DIRECTIONAL_LIGHT 4
#define LIGHT_ATTACHED (1<<0)
-#define LIGHTING_ICON 'icons/effects/lighting_object.dmi' // icon used for lighting shading effects
-#define LIGHTING_ICON_BIG 'icons/effects/lighting_object_big.dmi' //! icon used for lighting shading effects
+/// Icon used for lighting shading effects.
+#define LIGHTING_ICON 'icons/effects/lighting_object.dmi'
+/// Icon used for lighting shading effects.
+#define LIGHTING_ICON_BIG 'icons/effects/lighting_object_big.dmi'
#define ALPHA_TO_INTENSITY(alpha) (-(((clamp(alpha, 0, 22) - 22) / 6) ** 4) + 255)
-
-#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow.
+// How many tiles standard fires glow.
+#define LIGHT_RANGE_FIRE 3
#define LIGHTING_PLANE_ALPHA_VISIBLE 255
#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192
@@ -115,13 +144,13 @@ GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR)
/// A globaly cached version of [EM_MASK_MATRIX] for quick access.
GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX)
-/// Returns the red part of a #RRGGBB hex sequence as number
+/// Returns the red part of a #RRGGBB hex sequence as number.
#define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4))
-/// Returns the green part of a #RRGGBB hex sequence as number
+/// Returns the green part of a #RRGGBB hex sequence as number.
#define GETGREENPART(hexa) hex2num(copytext(hexa, 4, 6))
-/// Returns the blue part of a #RRGGBB hex sequence as number
+/// Returns the blue part of a #RRGGBB hex sequence as number.
#define GETBLUEPART(hexa) hex2num(copytext(hexa, 6, 8))
/// Parse the hexadecimal color into lumcounts of each perspective.
@@ -145,15 +174,19 @@ do { \
#define MOVABLE_MAX_RANGE 7
-#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square
-#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources
-#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
-#define LIGHTING_ROUND_VALUE (1 / 64) //Value used to round lumcounts, values smaller than 1/129 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY.
+/// Type of falloff to use for lighting; 1 for circular, 2 for square.
+#define LIGHTING_FALLOFF 1
+/// Use lambertian shading for light sources.
+#define LIGHTING_LAMBERTIAN 0
+/// Height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone.
+#define LIGHTING_HEIGHT 1
+/// Value used to round lumcounts, values smaller than 1/129 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY.
+#define LIGHTING_ROUND_VALUE (1 / 64)
/// If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting objects. Set to zero to disable soft lighting. Luminosity changes then work if it's lit at all.
#define LIGHTING_SOFT_THRESHOLD 0
-// If I were you I'd leave this alone.
+/// If I were you I'd leave this alone.
#define LIGHTING_BASE_MATRIX \
list \
( \
diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm
index 1123336d208..213e2c13fe3 100644
--- a/code/datums/langchat/langchat.dm
+++ b/code/datums/langchat/langchat.dm
@@ -190,9 +190,6 @@
langchat_listeners_untranslated += listener
langchat_listeners -= listener
- if(length(langchat_listeners_untranslated))
- langchat_make_image_untranslated(override_color)
-
if(length(message) > LANGCHAT_LONGEST_TEXT)
truncated_message = copytext_char(message, 1, LANGCHAT_LONGEST_TEXT - 5) + "..."
text_left = "..." + copytext_char(message, LANGCHAT_LONGEST_TEXT - 5)
@@ -244,6 +241,7 @@
if(language)
message = language.scramble(message, languages)
+ text_to_display = message
if(length(text_to_display) > LANGCHAT_LONGEST_TEXT)
text_to_display = copytext_char(text_to_display, 1, LANGCHAT_LONGEST_TEXT + 1) + "..."
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 3bb652e0087..fe60115184d 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -9,7 +9,8 @@
active_power_usage = 300
clicksound = /singleton/sound_category/keyboard_sound
- var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled.
+ /// The path to the circuit board type. If circuit==null, the computer can't be disassembled.
+ var/circuit = null
var/processing = 0
var/icon_screen = "computer_generic"
@@ -25,7 +26,7 @@
var/has_off_keyboards = FALSE
var/can_pass_under = TRUE
- // The zlevel that this computer is spawned on.
+ /// The zlevel that this computer is spawned on.
var/starting_z_level = null
/obj/machinery/computer/Initialize()
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 714edb30d24..2cfa9c543d4 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -1,3 +1,7 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
/*
* Cryogenic refrigeration unit. Basically a despawner.
* Stealing a lot of concepts/code from sleepers due to massive laziness.
@@ -6,7 +10,6 @@
* ~ Zuhayr
*/
-
//Main cryopod console.
/obj/machinery/computer/cryopod
@@ -148,17 +151,17 @@
return
/obj/item/circuitboard/cryopodcontrol
- name = "Circuit board (Cryogenic Oversight Console)"
+ name = T_BOARD("cryogenic oversight console")
build_path = /obj/machinery/computer/cryopod
origin_tech = list(TECH_DATA = 3)
/obj/item/circuitboard/robotstoragecontrol
- name = "Circuit board (Robotic Storage Console)"
+ name = T_BOARD("robotic storage console")
build_path = /obj/machinery/computer/cryopod/robot
origin_tech = list(TECH_DATA = 3)
/obj/item/circuitboard/living_quarters_cryo
- name = "Circuit board (Living Quarters Console)"
+ name = T_BOARD("living quarters oversight console")
build_path = /obj/machinery/computer/cryopod/living_quarters
origin_tech = list(TECH_DATA = 3)
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 2b5a4a42ce0..efad3d289cd 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -80,7 +80,7 @@
Auxiliary Pressure Regulator
High Power Gas Pump
Scrubber
- Meter
+ Gas Meter
Omni Gas Mixer
Omni Gas Filter
Heat exchange:
diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm
index 43e6b22e15b..13eb4130760 100644
--- a/code/game/machinery/vending/_vending.dm
+++ b/code/game/machinery/vending/_vending.dm
@@ -997,8 +997,8 @@
var/vend_id = "generic"
var/charges = 0
-/obj/item/device/vending_refill/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
- . = ..()
+/obj/item/device/vending_refill/feedback_hints(mob/user, distance, is_adjacent)
+ . += ..()
if(charges > 0)
. += "It can restock [charges] item(s)."
else
diff --git a/code/game/objects/effects/projectile/projectile_impact.dm b/code/game/objects/effects/projectile/projectile_impact.dm
index b82f33cfdfe..cd25e9da176 100644
--- a/code/game/objects/effects/projectile/projectile_impact.dm
+++ b/code/game/objects/effects/projectile/projectile_impact.dm
@@ -68,7 +68,7 @@
/obj/effect/projectile/impact/emitter
icon_state = "impact_emitter"
- light_color = LIGHT_COLOR_GREEN
+ light_color = COLOR_SPRING_GREEN
/obj/effect/projectile/impact/tachyon
name = "xray impact"
diff --git a/code/game/objects/effects/projectile/projectile_muzzle.dm b/code/game/objects/effects/projectile/projectile_muzzle.dm
index 767b53bc58e..ddb85e2086c 100644
--- a/code/game/objects/effects/projectile/projectile_muzzle.dm
+++ b/code/game/objects/effects/projectile/projectile_muzzle.dm
@@ -60,7 +60,7 @@
/obj/effect/projectile/muzzle/emitter
icon_state = "muzzle_emitter"
- light_color = LIGHT_COLOR_GREEN
+ light_color = COLOR_SPRING_GREEN
/obj/effect/projectile/muzzle/bullet
icon_state = "muzzle_bullet"
diff --git a/code/game/objects/effects/projectile/projectile_tracer.dm b/code/game/objects/effects/projectile/projectile_tracer.dm
index e722f186b15..e61a2eb16f1 100644
--- a/code/game/objects/effects/projectile/projectile_tracer.dm
+++ b/code/game/objects/effects/projectile/projectile_tracer.dm
@@ -4,7 +4,9 @@
var/datum/point/midpoint = point_midpoint_points(starting, ending)
var/obj/effect/projectile/tracer/PB = new beam_type
if(isnull(light_color_override))
- light_color_override = color
+ if(isnull(PB.light_color))
+ light_color_override = color
+ else light_color_override = PB.light_color
PB.apply_vars(angle_between_points(starting, ending), midpoint.return_px(), midpoint.return_py(), color, pixel_length_between_points(starting, ending) / world.icon_size, midpoint.return_turf(), 0)
. = PB
if(light_range > 0 && light_intensity > 0)
@@ -90,7 +92,7 @@
/obj/effect/projectile/tracer/emitter
icon_state = "emitter"
- light_color = LIGHT_COLOR_GREEN
+ light_color = COLOR_SPRING_GREEN
/obj/effect/projectile/tracer/tachyon
name = "particle beam"
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 89020928783..79a6a18fe7d 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -452,5 +452,6 @@
icon_state = "mac_trash_fiery"
/obj/item/trash/algaechips
- name = "It looks like someone left some strands of algae in it."
+ name = "empty algae chips bag"
+ desc = "It looks like someone left some strands of algae in it."
icon_state = "algaechips"
diff --git a/code/game/objects/items/weapons/RFD.dm b/code/game/objects/items/weapons/RFD.dm
index 15e3a0e71f2..4a3907436af 100644
--- a/code/game/objects/items/weapons/RFD.dm
+++ b/code/game/objects/items/weapons/RFD.dm
@@ -778,7 +778,9 @@ ABSTRACT_TYPE(/obj/item/rfd)
"Pressure Regulator" = PIPE_PASSIVE_GATE,
"High Power Gas Pump" = PIPE_VOLUME_PUMP,
"Gas Filter" = PIPE_GAS_FILTER_M,
- "Omni Gas Filter" = PIPE_OMNI_FILTER
+ "Omni Gas Filter" = PIPE_OMNI_FILTER,
+ "Omni Gas Mixer" = PIPE_OMNI_MIXER,
+ "Gas Meter" = "gasmeter"
)
/obj/item/rfd/piping/mechanics_hints(mob/user, distance, is_adjacent)
@@ -797,13 +799,13 @@ ABSTRACT_TYPE(/obj/item/rfd)
if(istype(get_area(A), /area/shuttle) || istype(get_area(A), /turf/space))
to_chat(user, SPAN_WARNING("You can't materialize a pipe here!"))
return FALSE
- var/turf/T = get_turf(A)
- if(!is_station_level(T.z))
+ var/turf/target_turf = get_turf(A)
+ if(!is_station_level(target_turf.z))
to_chat(user, SPAN_WARNING("You can't materialize a pipe on this level!"))
return FALSE
- return do_pipe(T, user)
+ return do_pipe(target_turf, user)
-/obj/item/rfd/piping/proc/do_pipe(var/turf/T, var/mob/user)
+/obj/item/rfd/piping/proc/do_pipe(var/turf/target_turf, var/mob/user)
if(working)
return FALSE
@@ -816,21 +818,26 @@ ABSTRACT_TYPE(/obj/item/rfd)
playsound(get_turf(src), 'sound/items/rfd_start.ogg', 50, FALSE)
working = TRUE
- user.visible_message(SPAN_NOTICE("[user] holds \the [src] towards \the [T]."), SPAN_NOTICE("You start laying down a pipe..."))
+ user.visible_message(SPAN_NOTICE("[user] holds \the [src] towards \the [target_turf]."), SPAN_NOTICE("You start laying down a pipe..."))
if((build_delay && !do_after(user, build_delay)) || (!useResource(build_cost, user)))
playsound(get_turf(src), 'sound/items/rfd_interrupt.ogg', 50, FALSE)
working = FALSE
return FALSE
- if(build_delay && !can_use(user, T))
+ if(build_delay && !can_use(user, target_turf))
return FALSE
- // Special case handling for bent pipes. They require a non-cardinal direction
- var/pipe_dir = NORTH
- if(selected_pipe in list(PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_FUEL_BENT, PIPE_AUX_BENT))
- pipe_dir = NORTHEAST
- new /obj/item/pipe(T, selected_pipe, pipe_dir)
+ // Special case for meters- technically it's not a pipe, we can't create a new /obj/item/pipe. Duh.
+ if(selected_pipe == "gasmeter")
+ new /obj/item/pipe_meter(target_turf)
+
+ else
+ // Special case handling for bent pipes. They require a non-cardinal direction
+ var/pipe_dir = NORTH
+ if(selected_pipe in list(PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_FUEL_BENT, PIPE_AUX_BENT))
+ pipe_dir = NORTHEAST
+ new /obj/item/pipe(target_turf, selected_pipe, pipe_dir)
playsound(get_turf(src), 'sound/items/rfd_end.ogg', 50, FALSE)
working = FALSE
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
index 21291c2d01c..28d5c671d7b 100644
--- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm
+++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
@@ -1,9 +1,3 @@
-//Define a macro that we can use to assemble all the circuit board names
-#ifdef T_BOARD
-#error T_BOARD already defined elsewhere, we can't use it.
-#endif
-#define T_BOARD(name) "" + "circuit board " + "(" + (name) + ")"
-
/obj/item/circuitboard
name = "circuit board"
desc = "A circuitboard, an electronic device which forms the backbone of most modern machinery."
@@ -18,12 +12,6 @@
throw_speed = 3
throw_range = 15
var/build_path
-
- /**
- * The type of board
- *
- * One of the BOARD_* defines, see `code\game\objects\items\weapons\circuitboards\_defines.dm`
- */
var/board_type = BOARD_COMPUTER
var/list/req_components
var/contain_parts = 1
diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm
index da11d858ffc..78e9836ca23 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/air_management
name = T_BOARD("atmosphere monitoring console")
build_path = /obj/machinery/computer/general_air_control
diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
index 560ea27eb13..7a1585bbc10 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/security
name = T_BOARD("security camera monitor")
build_path = /obj/machinery/computer/security
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
index 29f60af7aa2..c7b565f1711 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/message_monitor
name = T_BOARD("message monitor console")
build_path = /obj/machinery/computer/message_monitor
diff --git a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm b/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm
index 55d751ea9dd..3204a1aa71f 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/holodeckcontrol
name = T_BOARD("holodeck control console")
build_path = /obj/machinery/computer/holodeck_control
diff --git a/code/game/objects/items/weapons/circuitboards/computer/research.dm b/code/game/objects/items/weapons/circuitboards/computer/research.dm
index 7d14ccdd474..1f9c5893c31 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/research.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/rdconsole
name = T_BOARD("R&D control console")
build_path = /obj/machinery/computer/rdconsole/core
diff --git a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
index 92fabccedf4..0c7d4126614 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/comm_monitor
name = T_BOARD("telecommunications monitor console")
build_path = /obj/machinery/computer/telecomms/monitor
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
index 21161987eac..b20c337b39b 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/biogenerator
name = T_BOARD("biogenerator")
build_path = /obj/machinery/biogenerator
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/chem_heater.dm b/code/game/objects/items/weapons/circuitboards/machinery/chem_heater.dm
index a17d3134569..106529f9149 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/chem_heater.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/chem_heater.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/chem_heater
name = T_BOARD("chem heater")
build_path = /obj/machinery/chem_heater
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
index 605d1de0d6c..39f1a119a0d 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/clonepod
name = T_BOARD("clone pod")
build_path = /obj/machinery/clonepod
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
index 4a877060bd1..6c87cb63933 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/bluespacerelay
name = T_BOARD("bluespacerelay")
build_path = /obj/machinery/bluespacerelay
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
index 5be97077b5e..15b210f104c 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/mech_recharger
name = T_BOARD("mech recharger")
build_path = /obj/machinery/mech_recharger
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
index 9cc8b40cc56..fb76c7e8708 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/miningdrill
name = T_BOARD("mining drill head")
build_path = /obj/machinery/mining/drill
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm
index 1cdce8e6a7f..1f416204dc8 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
//Stuff that doesn't fit into any category goes here
/obj/item/circuitboard/aicore
@@ -196,7 +192,7 @@
"/obj/item/stock_parts/manipulator" = 1,
"/obj/item/stock_parts/scanning_module" = 1)
/obj/item/circuitboard/oxyregenerator
- name = "circuit board (oxygen regenerator)"
+ name = T_BOARD("oxygen regenerator")
build_path = /obj/machinery/atmospherics/binary/oxyregenerator
board_type = BOARD_MACHINE
origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/portgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/portgen.dm
index a9007efa412..468669207ad 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/portgen.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/portgen.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/portgen
name = T_BOARD("portable generator")
build_path = /obj/machinery/power/portgen/basic
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm
index 497af43ab32..2221b0b6993 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/smes
name = T_BOARD("superconductive magnetic energy storage")
build_path = /obj/machinery/power/smes/buildable
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
index 7de67b38f41..f9daaa1502a 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/recharge_station
name = T_BOARD("cyborg recharging station")
build_path = /obj/machinery/recharge_station
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
index b9e311b8a08..8611f82d897 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/rdserver
name = T_BOARD("R&D server")
build_path = /obj/machinery/r_n_d/server
@@ -63,7 +59,7 @@
"/obj/item/reagent_containers/glass/beaker" = 2)
/obj/item/circuitboard/mechfab
- name = "Circuit board (Exosuit Fabricator)"
+ name = T_BOARD("mechatronic fabricator")
build_path = /obj/machinery/mecha_part_fabricator
board_type = BOARD_MACHINE
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
@@ -85,7 +81,7 @@
"/obj/item/stock_parts/console_screen" = 1)
/obj/item/circuitboard/ntnet_relay
- name = "Circuit board (NTNet Quantum Relay)"
+ name = T_BOARD("NTNet Quantum Relay")
build_path = /obj/machinery/ntnet_relay
board_type = BOARD_MACHINE
origin_tech = list(TECH_DATA = 4)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
index aad50fc3ce5..6925eb67a66 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/shield_gen_ex
name = T_BOARD("hull shield generator")
board_type = BOARD_MACHINE
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
index 855a90e6d32..a5e7b71018c 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/telecomms
board_type = BOARD_MACHINE
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/trashcompactor.dm b/code/game/objects/items/weapons/circuitboards/machinery/trashcompactor.dm
index 45f732310ba..f9b36365b14 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/trashcompactor.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/trashcompactor.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/crusher
name = T_BOARD("crusher")
build_path = /obj/machinery/crusher_base
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/trolley.dm b/code/game/objects/items/weapons/circuitboards/machinery/trolley.dm
index f86f87c3891..0a502423bf5 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/trolley.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/trolley.dm
@@ -1,9 +1,5 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/cargo_trolley
- name = T_BOARD("cargo trolley")
+ name = T_BOARD("cargo trolley controller")
build_path = /obj/vehicle/train/cargo/trolley
board_type = BOARD_MACHINE
origin_tech = list(TECH_ENGINEERING = 2)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
index 97fe1583d84..ca03676494b 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
@@ -1,7 +1,3 @@
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/unary_atmos
board_type = BOARD_MACHINE
var/machine_dir = SOUTH
diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm
index c67a8ef3fe3..34db01ae850 100644
--- a/code/game/objects/items/weapons/circuitboards/mecha.dm
+++ b/code/game/objects/items/weapons/circuitboards/mecha.dm
@@ -1,8 +1,3 @@
-#ifdef T_BOARD_MECHA
-#error T_BOARD_MECHA already defined elsewhere, we can't use it.
-#endif
-#define T_BOARD_MECHA(name) "" + "exosuit module circuit board " + "(" + (name) + ")"
-
/obj/item/circuitboard/mecha
name = "exosuit circuit board"
icon = 'icons/obj/module.dmi'
diff --git a/code/game/objects/items/weapons/circuitboards/rig.dm b/code/game/objects/items/weapons/circuitboards/rig.dm
index 4d7917b37d0..4fd883096d4 100644
--- a/code/game/objects/items/weapons/circuitboards/rig.dm
+++ b/code/game/objects/items/weapons/circuitboards/rig.dm
@@ -13,23 +13,23 @@
origin_tech = list(TECH_DATA = 4)
/obj/item/circuitboard/rig_assembly/civilian/industrial
- name = "industrial suit central circuit board"
+ name = T_BOARD_HARDSUIT("industrial")
/obj/item/circuitboard/rig_assembly/civilian/eva
- name = "EVA suit central circuit board"
+ name = T_BOARD_HARDSUIT("EVA")
/obj/item/circuitboard/rig_assembly/civilian/eva/pilot
- name = "pilot suit central circuit board"
+ name = T_BOARD_HARDSUIT("pilot")
/obj/item/circuitboard/rig_assembly/civilian/ce
- name = "advanced void suit central circuit board"
+ name = T_BOARD_HARDSUIT("advanced void")
origin_tech = list(TECH_DATA = 5)
/obj/item/circuitboard/rig_assembly/civilian/hazmat
- name = "AMI suit central circuit board"
+ name = T_BOARD_HARDSUIT("AMI")
/obj/item/circuitboard/rig_assembly/civilian/medical
- name = "rescue suit central circuit board"
+ name = T_BOARD_HARDSUIT("rescue")
/////////////////////
////COMBAT BOARDS////
@@ -42,27 +42,27 @@
origin_tech = list(TECH_DATA = 5, TECH_COMBAT = 4)
/obj/item/circuitboard/rig_assembly/combat/hazard
- name = "hazard hardsuit central circuit board"
+ name = T_BOARD_HARDSUIT("hazard")
origin_tech = list(TECH_DATA = 4)
/obj/item/circuitboard/rig_assembly/combat/targeting/hazard
- name = "hazard hardsuit control and targeting board"
+ name = T_BOARD_HARDSUIT_TARGETING("hazard")
origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4)
/obj/item/circuitboard/rig_assembly/combat/combat
- name = "combat hardsuit central circuit board"
+ name = T_BOARD_HARDSUIT("combat")
origin_tech = list(TECH_DATA = 7)
/obj/item/circuitboard/rig_assembly/combat/targeting/combat
- name = "combat hardsuit control and targeting board"
+ name = T_BOARD_HARDSUIT_TARGETING("combat")
origin_tech = list(TECH_DATA = 7, TECH_COMBAT = 6)
/obj/item/circuitboard/rig_assembly/combat/falcata
- name = "falcata exoskeleton central circuit board"
+ name = T_BOARD_HARDSUIT("falcata exoskeleton")
origin_tech = list(TECH_COMBAT = 1)
/obj/item/circuitboard/rig_assembly/combat/targeting/falcata
- name = "falcata exoskeleton control and targeting board"
+ name = T_BOARD_HARDSUIT_TARGETING("falcata exoskeleton")
origin_tech = list(TECH_COMBAT = 1)
//////////////////////
@@ -76,16 +76,16 @@
origin_tech = list(TECH_DATA = 7, TECH_COMBAT = 4, TECH_ILLEGAL = 4)
/obj/item/circuitboard/rig_assembly/illegal/hacker
- name = "cybersuit hardsuit central circuit board"
+ name = T_BOARD_HARDSUIT("cybersuit")
/obj/item/circuitboard/rig_assembly/illegal/targeting/hacker
- name = "cybersuit hardsuit control and targeting board"
+ name = T_BOARD_HARDSUIT_TARGETING("cybersuit")
/obj/item/circuitboard/rig_assembly/illegal/stealth
- name = "stealth hardsuit central circuit board"
+ name = T_BOARD_HARDSUIT("stealth")
origin_tech = list(TECH_DATA = 7, TECH_ILLEGAL = 6)
/obj/item/circuitboard/rig_assembly/illegal/targeting/stealth
- name = "stealth hardsuit control and targeting board"
+ name = T_BOARD_HARDSUIT_TARGETING("stealth")
origin_tech = list(TECH_DATA = 7, TECH_COMBAT = 6, TECH_ILLEGAL = 6)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 40bd5a425d8..87adbae457c 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -149,7 +149,7 @@
var/damage = proj_damage
//cap the amount of damage, so that things like emitters can't destroy walls in one hit.
- if(hitting_projectile.anti_materiel_potential > 1)
+ if(hitting_projectile.anti_materiel_potential <= 1)
damage = min(proj_damage, 100)
take_damage(damage)
diff --git a/code/modules/cargo/items/engineering.dm b/code/modules/cargo/items/engineering.dm
index a506f5395db..45682465b39 100644
--- a/code/modules/cargo/items/engineering.dm
+++ b/code/modules/cargo/items/engineering.dm
@@ -138,7 +138,7 @@
/singleton/cargo_item/circuitboard_bubbleshield
category = "engineering"
- name = "circuit board (bubble shield generator)"
+ name = T_BOARD("bubble shield generator")
supplier = "hephaestus"
description = "Looks like a circuit. Probably is."
price = 250
@@ -152,7 +152,7 @@
/singleton/cargo_item/circuitboard_hullshield
category = "engineering"
- name = "circuit board (hull shield generator)"
+ name = T_BOARD("hull shield generator")
supplier = "hephaestus"
description = "Looks like a circuit. Probably is."
price = 250
@@ -166,7 +166,7 @@
/singleton/cargo_item/circuitboard_shieldcapacitor
category = "engineering"
- name = "circuit board (shield capacitor)"
+ name = T_BOARD("shield capacitor")
supplier = "hephaestus"
description = "Looks like a circuit. Probably is."
price = 250
@@ -180,7 +180,7 @@
/singleton/cargo_item/circuitboard_solarcontrol
category = "engineering"
- name = "circuit board (solar control console)"
+ name = T_BOARD("solar control console")
supplier = "hephaestus"
description = "Looks like a circuit. Probably is."
price = 250
diff --git a/code/modules/clothing/spacesuits/rig/rig_construction.dm b/code/modules/clothing/spacesuits/rig/rig_construction.dm
index a5cdaa34d10..0329ef3d937 100644
--- a/code/modules/clothing/spacesuits/rig/rig_construction.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_construction.dm
@@ -5,13 +5,13 @@
var/icon_base = null
w_class = WEIGHT_CLASS_BULKY
- ///The type of board, a path of `/obj/item/circuitboard`
+ /// The type of board, a path of `/obj/item/circuitboard`
var/board_type = null
- ///The type of target board, a path of `/obj/item/circuitboard`
+ /// The type of target board, a path of `/obj/item/circuitboard`
var/target_board_type = null
- ///The type of rig, a path of `/obj/item/rig`
+ /// The type of rig, a path of `/obj/item/rig`
var/rig_type = /obj/item/rig
obj_flags = OBJ_FLAG_CONDUCTABLE
diff --git a/code/modules/cooking/machinery/gibber.dm b/code/modules/cooking/machinery/gibber.dm
index a5a1e713114..116125b7ee6 100644
--- a/code/modules/cooking/machinery/gibber.dm
+++ b/code/modules/cooking/machinery/gibber.dm
@@ -1,27 +1,40 @@
/obj/machinery/gibber
- name = "gibber"
- desc = "The name isn't descriptive enough?"
- desc_extended = "WARNING : Insurance no longer covers entertaining intrusive thoughts. Keep your limbs to yourself."
+ name = "autobutcher"
+ desc = "Also known as the gibber, affectionately."
+ desc_extended = "WARNING: Insurance no longer covers entertaining intrusive thoughts. Keep your limbs to yourself."
icon = 'icons/obj/machinery/cooking_machines.dmi'
icon_state = "grinder"
- density = 1
+ density = TRUE
anchored = TRUE
req_access = list(ACCESS_GALLEY,ACCESS_MORGUE)
- var/operating = 0 //Is it on?
- var/dirty = 0 // Does it need cleaning?
- var/mob/living/occupant // Mob who has been put inside
- var/gib_time = 40 // Time from starting until meat appears
- var/gib_throw_dir = WEST // Direction to spit meat and gibs in.
+ /// Is it on?
+ var/operating = FALSE
+ /// Does it need cleaning?
+ var/dirty = FALSE
+ /// Mob who has been put inside
+ var/mob/living/occupant
+ /// Time from starting until meat appears
+ var/gib_time = 4 SECONDS
+ /// Direction to spit meat and gibs in.
+ var/gib_throw_dir = WEST
idle_power_usage = 2
active_power_usage = 500
-//auto-gibs anything that bumps into it
+/// Auto-gibs anything that moves onto its input plate. This is a fun variant, someone map it in somewhere!
/obj/machinery/gibber/autogibber
var/turf/input_plate
+/obj/machinery/gibber/feedback_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ . += "The safety guard is [emagged ? SPAN_DANGER("disabled") : "enabled"]."
+
+/obj/machinery/gibber/antagonist_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ . += "This can be emagged to let you feed people into it; it also removes the ID access requirements."
+
/obj/machinery/gibber/autogibber/Initialize()
. = ..()
for(var/i in GLOB.cardinals)
@@ -39,16 +52,44 @@
/obj/machinery/gibber/autogibber/CollidedWith(atom/bumped_atom)
. = ..()
-
+ if(stat & (NOPOWER|BROKEN))
+ return FALSE
if(!input_plate)
- return
+ return FALSE
if(!ismob(bumped_atom))
- return
- var/mob/M = bumped_atom
- if(M.loc == input_plate)
- M.forceMove(src)
- M.gib()
+ return FALSE
+ var/mob/victim_mob = bumped_atom
+ var/mob/living/carbon/human/victim_human
+ // A lot of reused code here but it's needed to prevent CollidedWith from running DoMob, which makes SpaceDMM sad because of SHOULD_NOT_SLEEP and etc etc etc.
+ if(ishuman(victim_mob))
+ victim_human = victim_mob
+ if(occupant)
+ if(victim_human.client)
+ to_chat(victim_human, SPAN_DANGER("[src] is full, you can't fit!"))
+ return FALSE
+
+ if(operating)
+ if(victim_human.client)
+ to_chat(victim_human, SPAN_DANGER("[src] is locked and running, it won't let you in!"))
+ return FALSE
+
+ if(ishuman(victim_human) && !emagged)
+ if(victim_human.client)
+ to_chat(victim_human, SPAN_DANGER("\The [src]'s safety guard is engaged!"))
+ return FALSE
+
+ if(istype(victim_mob, /mob) && victim_mob.loc == input_plate)
+ visible_message(SPAN_DANGER("[victim_mob] gets automatically fed into \the [src]!"))
+ else
+ return FALSE
+ if(victim_human.client)
+ victim_human.client.perspective = EYE_PERSPECTIVE
+ victim_human.client.eye = src
+ victim_mob.forceMove(src)
+ occupant = victim_mob
+ startgibbing(victim_mob)
+ update_icon()
/obj/machinery/gibber/Initialize()
. = ..()
@@ -56,11 +97,11 @@
/obj/machinery/gibber/update_icon()
ClearOverlays()
- if (dirty)
+ if(dirty)
AddOverlays("grbloody")
if(stat & (NOPOWER|BROKEN))
return
- if (!occupant)
+ if(!occupant)
AddOverlays("grjam")
else if (operating)
AddOverlays("gruse")
@@ -81,10 +122,6 @@
return
startgibbing(user)
-/obj/machinery/gibber/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
- . = ..()
- . += "The safety guard is [emagged ? SPAN_DANGER("disabled") : "enabled"]."
-
/obj/machinery/gibber/emag_act(var/remaining_charges, var/mob/user)
emagged = !emagged
to_chat(user, SPAN_DANGER("You [emagged ? "disable" : "enable"] [src]'s safety guard."))
@@ -112,34 +149,39 @@
return
move_into_gibber(user, dropped)
-/obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim)
-
+/**
+ * Moves the victim into the gibber. This can be triggered by a user trying to place the victim inside, or by
+ * being sucked in via the input plate.
+ */
+/obj/machinery/gibber/proc/move_into_gibber(var/mob/user, var/mob/victim, var/automatic = FALSE)
+ // All of these check for a user because if the machine is working autonomously, there's no one to send messages to in most cases we'd want to.
if(occupant)
to_chat(user, SPAN_DANGER("[src] is full, empty it first!"))
- return
+ return FALSE
if(operating)
to_chat(user, SPAN_DANGER("[src] is locked and running, wait for it to finish."))
- return
+ return FALSE
if(!(iscarbon(victim) || isanimal(victim)))
to_chat(user, SPAN_DANGER("This is not suitable for [src]!"))
- return
+ return FALSE
if(ishuman(victim) && !emagged && !victim.isMonkey())
to_chat(user, SPAN_DANGER("[src]'s safety guard is engaged!"))
- return
-
+ return FALSE
if(victim.abiotic(1))
to_chat(user, SPAN_DANGER("[victim] may not have abiotic items on."))
- return
+ return FALSE
user.visible_message(SPAN_DANGER("[user] starts to put [victim] into [src]!"))
add_fingerprint(user)
if(!do_mob(user, victim, 30 SECONDS) || occupant || !victim.Adjacent(src) || !user.Adjacent(src) || !victim.Adjacent(user))
return
+
user.visible_message(SPAN_DANGER("[user] stuffs [victim] into [src]!"))
+
if(victim.client)
victim.client.perspective = EYE_PERSPECTIVE
victim.client.eye = src
@@ -171,7 +213,6 @@
update_icon()
return
-
/obj/machinery/gibber/proc/startgibbing(mob/user as mob)
if(operating)
return
@@ -219,12 +260,11 @@
spawn(gib_time)
- operating = 0
+ operating = FALSE
occupant.gib()
occupant = null
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
- operating = 0
for (var/obj/thing in contents)
// Todo: unify limbs and internal organs
// There's a chance that the gibber will fail to destroy some evidence.
diff --git a/code/modules/heavy_vehicle/components/software.dm b/code/modules/heavy_vehicle/components/software.dm
index 9e86531e15f..c2cb7a37987 100644
--- a/code/modules/heavy_vehicle/components/software.dm
+++ b/code/modules/heavy_vehicle/components/software.dm
@@ -1,5 +1,3 @@
-#define T_BOARD_MECHA(name) "" + "vehicle software " + "(" + (name) + ")"
-
/obj/item/circuitboard/exosystem
name = "vehicle software template"
icon = 'icons/obj/module.dmi'
@@ -9,26 +7,24 @@
var/list/contains_software = list()
/obj/item/circuitboard/exosystem/engineering
- name = T_BOARD_MECHA("engineering systems")
+ name = T_BOARD_VEHICLE("engineering systems")
contains_software = list(MECH_SOFTWARE_ENGINEERING)
origin_tech = list(TECH_DATA = 1)
/obj/item/circuitboard/exosystem/utility
- name = T_BOARD_MECHA("utility systems")
+ name = T_BOARD_VEHICLE("utility systems")
contains_software = list(MECH_SOFTWARE_UTILITY)
icon_state = "mcontroller"
origin_tech = list(TECH_DATA = 1)
/obj/item/circuitboard/exosystem/medical
- name = T_BOARD_MECHA("medical systems")
+ name = T_BOARD_VEHICLE("medical systems")
contains_software = list(MECH_SOFTWARE_MEDICAL)
icon_state = "mcontroller"
origin_tech = list(TECH_DATA = 3,TECH_BIO = 2)
/obj/item/circuitboard/exosystem/weapons
- name = T_BOARD_MECHA("ballistic weapon systems")
+ name = T_BOARD_VEHICLE("ballistic weapon systems")
contains_software = list(MECH_SOFTWARE_WEAPONS)
icon_state = "mainboard"
origin_tech = list(TECH_DATA = 3, TECH_COMBAT = 3)
-
-#undef T_BOARD_MECHA
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index 66c1f7953aa..a4888531514 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -131,6 +131,11 @@
/obj/machinery/botany/extractor
name = "lysis-isolation centrifuge"
icon_state = "centrifuge"
+ component_types = list(
+ /obj/item/circuitboard/botany_extractor,
+ /obj/item/stock_parts/manipulator = 3,
+ /obj/item/stock_parts/scanning_module = 1
+ )
var/datum/seed/genetics // Currently scanned seed genetic structure.
var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point.
@@ -263,6 +268,11 @@
name = "bioballistic delivery system"
icon_state = "traitgun"
disk_needs_genes = 1
+ component_types = list(
+ /obj/item/circuitboard/botany_editor,
+ /obj/item/stock_parts/manipulator = 3,
+ /obj/item/stock_parts/scanning_module = 1
+ )
/obj/machinery/botany/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
@@ -330,3 +340,14 @@
usr.set_machine(src)
src.add_fingerprint(usr)
+
+/obj/item/circuitboard/botany_extractor
+ name = T_BOARD("lysis-isolation centrifuge")
+ build_path = /obj/machinery/botany/extractor
+ origin_tech = list(TECH_DATA = 3)
+
+
+/obj/item/circuitboard/botany_editor
+ name = T_BOARD("bioballistic delivery system")
+ build_path = /obj/machinery/botany/editor
+ origin_tech = list(TECH_DATA = 3)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 976271a8df6..30a642cc256 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(minevendor_list, list(
shuttle = set_shuttle
/obj/item/circuitboard/machine/mining_equipment_vendor
- name = "circuit board (Mining Equipment Vendor)"
+ name = T_BOARD("Mining Equipment Vendor")
build_path = /obj/machinery/mineral/equipment_vendor
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
req_components = list( /obj/item/stock_parts/console_screen = 1,
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 1e5e96ded9d..f7e6e1108d2 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -1,33 +1,46 @@
// At minimum every mob has a hear_say proc.
+/**
+ * hear_say's return value determines whether or not the mob in question also receives a langchat image.
+ */
/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol, var/font_size = null)
if(!istype(src, /mob/living/test) && cant_hear())
- return
+ return FALSE
if(speaker && !istype(speaker, /mob/living/test) && (!speaker.client && istype(src,/mob/abstract/ghost/observer) && client.prefs.toggles & CHAT_GHOSTEARS && !(speaker in view(src))))
//Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE')
//Or someone snoring. So we make it where they won't hear it.
- return
-
- if((language && (language.flags & KNOWONLYHEAR)) && !say_understands(speaker, language))
- return
+ return FALSE
//make sure the air can transmit speech - hearer's side
var/turf/T = get_turf(src)
var/vacuum_proof = ((language && (language.flags & PRESSUREPROOF)) || isghost(src))
+ var/speaker_name
+
+ if(ishuman(speaker))
+ var/mob/living/carbon/human/H = speaker
+ speaker_name = H.GetVoice()
+
if(T && !vacuum_proof) //Ghosts can hear even in vacuum.
var/datum/gas_mixture/environment = T.return_air()
var/pressure = (environment)? environment.return_pressure() : 0
- if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
- return
+ var/distance_to_speaker = get_dist(speaker, src)
+ if(pressure < SOUND_MINIMUM_PRESSURE && distance_to_speaker > 1)
+ // Yeah, this isn't quite realistic to be able to see if someone is talking through, say, an opaque mask, but for gameplay purposes it should help indicate that you're not bugged.
+ if(distance_to_speaker <= 4 && !italics)
+ to_chat(src, SPAN_NOTICE("[speaker_name] talks, but you're in a vacuum. Maybe if you were close enough for the sound to transmit through touch..."))
+ return FALSE
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
+ if((language && (language.flags & KNOWONLYHEAR)) && !say_understands(speaker, language))
+ return TRUE
+
if(!vr_mob && (sleeping || stat == UNCONSCIOUS))
hear_sleep(message)
- return
+ return FALSE
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
@@ -38,10 +51,6 @@
message = language ? language.scramble(message, languages) : stars(message)
var/accent_icon = speaker.get_accent_icon(language, src)
- var/speaker_name = speaker.name
- if(ishuman(speaker))
- var/mob/living/carbon/human/H = speaker
- speaker_name = H.GetVoice()
if(italics)
message = "[message]"
@@ -58,8 +67,10 @@
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
to_chat(src, SPAN_WARNING("You cannot hear yourself speak!"))
+ return FALSE
else
to_chat(src, "[speaker_name][alt_name] talks but you cannot hear them.")
+ return FALSE
else
if(language)
if(font_size)
diff --git a/code/modules/mob/living/carbon/slime/slime_extractor.dm b/code/modules/mob/living/carbon/slime/slime_extractor.dm
index 86f20263730..165f75f668c 100644
--- a/code/modules/mob/living/carbon/slime/slime_extractor.dm
+++ b/code/modules/mob/living/carbon/slime/slime_extractor.dm
@@ -106,10 +106,6 @@
qdel(extracted_slime)
update_icon()
-#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
-#endif
-
/obj/item/circuitboard/slime_extractor
name = T_BOARD("slime extractor")
build_path = "/obj/machinery/slime_extractor"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b12029e4c97..92720d1f7f1 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -248,6 +248,13 @@ var/list/channel_to_radio_key = new
if(!verb)
verb = say_quote(message, speaking, is_singing, whisper)
+ var/is_shouting = FALSE
+ if(speaking)
+ for(var/verb_to_check in speaking.shout_verb)
+ if(verb_to_check == verb)
+ is_shouting = TRUE
+ continue
+
if(is_muzzled())
to_chat(src, SPAN_DANGER("You're muzzled and cannot speak!"))
return
@@ -357,8 +364,10 @@ var/list/channel_to_radio_key = new
var/list/langchat_styles = list()
if(istype(speaking, /datum/language/noise))
langchat_styles = list("emote", "langchat_small")
- if(istype(speaking, /datum/language/noise))
- langchat_styles = list("emote", "langchat_small")
+ if(whisper)
+ langchat_styles = list("langchat_italic")
+ if(is_shouting)
+ langchat_styles = list("langchat_yell")
langchat_speech(message, get_hearers_in_view(message_range, src), speaking, additional_styles = langchat_styles)
diff --git a/code/modules/multiz/_stubs.dm b/code/modules/multiz/_stubs.dm
index 2b8fe09e0dd..05b71f9f4d3 100644
--- a/code/modules/multiz/_stubs.dm
+++ b/code/modules/multiz/_stubs.dm
@@ -3,5 +3,7 @@
desc = "An unknown location."
invisibility = 101
- var/height = 1 ///< The number of Z-Levels in the map.
- var/turf/edge_type ///< What the map edge should be formed with. (null = world.turf)
+ /// The number of Z-Levels in the map.
+ var/height = 1
+ /// What the map edge should be formed with. (null = world.turf)
+ var/turf/edge_type
diff --git a/code/modules/multiz/basic.dm b/code/modules/multiz/basic.dm
index a8f94303452..dcc986f6002 100644
--- a/code/modules/multiz/basic.dm
+++ b/code/modules/multiz/basic.dm
@@ -1,6 +1,6 @@
GLOBAL_LIST_EMPTY(connected_z_cache)
-// If the height is more than 1, we mark all contained levels as connected.
+/// If the height is more than 1, we mark all contained levels as connected.
/obj/effect/landmark/map_data/New(turf/loc, _height)
..()
if(!istype(loc)) // Using loc.z is safer when using the maploader and New.
diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm
index f64c69dac75..79dfe05e4f0 100644
--- a/code/modules/multiz/hoist.dm
+++ b/code/modules/multiz/hoist.dm
@@ -17,7 +17,7 @@
/obj/effect/hoist_hook
name = "hoist clamp"
- desc = "A clamp used to lift people or things."
+ desc = "A clamp used to safely lift (or lower) people or things."
icon = 'icons/obj/hoists.dmi'
icon_state = "hoist_hook"
var/obj/structure/hoist/source_hoist
@@ -26,8 +26,9 @@
/obj/effect/hoist_hook/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
- . += "To use the hook, click drag the object you want to it to attach it."
- . += "To remove an object from the hook, click drag the hook to a nearby turf."
+ . += "Use this on yourself to deploy the hoist in the direction you're facing."
+ . += "To load something onto the hook, click-drag the object you want to it to attach it."
+ . += "To remove something from the hook, click-drag the hook to a nearby turf."
/obj/effect/hoist_hook/attack_hand(mob/living/user)
if (use_check_and_message(user, USE_DISALLOW_SILICONS))
@@ -89,7 +90,7 @@
user.visible_message(SPAN_NOTICE("[user] detaches \the [source_hoist.hoistee] from the hoist clamp."), SPAN_NOTICE("You detach \the [source_hoist.hoistee] from the hoist clamp."), SPAN_NOTICE("You hear something unclamp."))
source_hoist.release_hoistee()
-// This will handle mobs unbuckling themselves.
+/// This will handle mobs unbuckling themselves.
/obj/effect/hoist_hook/unbuckle()
. = ..()
if (. && !QDELETED(source_hoist))
@@ -111,8 +112,14 @@
/obj/structure/hoist/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
- . += "To use the hook, click drag the object you want to it to attach it."
- . += "To remove an object from the hook, click drag the hook to a nearby turf."
+ . += "To load something onto the hook, click-drag the object you want to it to attach it."
+ . += "Use an empty hand on the hoist to start the pulley lifting or lowering."
+ . += "To remove something from the hook, click-drag the hook to a nearby turf."
+
+/obj/structure/hoist/feedback_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ if(broken)
+ . += "It looks broken, and the clamp has retracted back into the hoist. Seems like you'd have to re-deploy it to get it to work again."
/obj/structure/hoist/Initialize(mapload, ndir)
. = ..()
@@ -131,6 +138,7 @@
source_hoist = null
return ..()
+/// Checks that the hoistee and the hook its supposed to be attached to are on the same z-level. If not, release the hoistee.
/obj/structure/hoist/proc/check_consistency()
if(hoistee && (hoistee.z != source_hook.z))
release_hoistee()
@@ -146,7 +154,6 @@
if(broken)
return
broken = TRUE
- desc += " It looks broken, and the clamp has retracted back into the hoist. Seems like you'd have to re-deploy it to get it to work again."
if(hoistee)
release_hoistee()
QDEL_NULL(source_hook)
diff --git a/code/modules/multiz/mobile_ladders.dm b/code/modules/multiz/mobile_ladders.dm
index f8df32adb30..c8ec7852ac3 100644
--- a/code/modules/multiz/mobile_ladders.dm
+++ b/code/modules/multiz/mobile_ladders.dm
@@ -1,15 +1,20 @@
/obj/item/ladder_mobile
name = "mobile ladder"
- desc = "A lightweight deployable ladder, which you can use to move up or down. Or alternatively, you can bash some faces in."
+ desc = "A lightweight deployable ladder, which you can use to move up or down. Alternatively, you can bash some faces in; it'll hurt, a lot."
icon_state = "mobile_ladder"
item_state = "mobile_ladder"
icon = 'icons/obj/multiz_items.dmi'
contained_sprite = TRUE
throw_range = 3
- force = 15
+ force = 18
w_class = WEIGHT_CLASS_BULKY
slot_flags = SLOT_BACK
+/obj/item/ladder_mobile/mechanics_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ . += "Use this on a solid floor (with open space above it) to place the ladder going up."
+ . += "Use this on an open space turf (with solid floor beneath it) to place the ladder going down."
+
/obj/item/ladder_mobile/proc/place_ladder(atom/A, mob/user)
if (isopenturf(A)) //Place into open space
diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm
index 10f393dc76e..863a7132037 100644
--- a/code/modules/multiz/pipes.dm
+++ b/code/modules/multiz/pipes.dm
@@ -4,7 +4,8 @@
/obj/machinery/atmospherics/pipe/zpipe
icon = 'icons/atmos/pipes.dmi'
icon_state = "up"
- var/ptype // What direction of pipe this is. Used for icons.
+ /// What direction of pipe this is. Used for icons.
+ var/ptype
name = "upwards pipe"
desc = "A pipe segment to connect upwards."
@@ -15,7 +16,8 @@
initialize_directions = SOUTH
var/minimum_temperature_difference = 300
- var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No
+ // WALL_HEAT_TRANSFER_COEFFICIENT
+ var/thermal_conductivity = 0
var/maximum_pressure = ATMOS_DEFAULT_MAX_PRESSURE
var/fatigue_pressure = ATMOS_DEFAULT_FATIGUE_PRESSURE
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index fa2d15c1c30..b2dfaa7c918 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -14,7 +14,7 @@
req_access = list(ACCESS_ENGINE_EQUIP)
obj_flags = OBJ_FLAG_ROTATABLE | OBJ_FLAG_SIGNALER
var/id
- /// uses powernet power, not APC power
+ /// Uses powernet power, not APC power.
use_power = POWER_USE_OFF
/// 30 kW laser. I guess that means 30 kJ per shot.
active_power_usage = 30000
@@ -30,7 +30,7 @@
var/shot_counter = 0
var/state = EMITTER_LOOSE
var/locked = FALSE
- /// special emitters notify admins if something happens to them, to prevent grief
+ /// Special emitters notify admins if something happens to them, to prevent grief.
var/special_emitter = FALSE
var/_wifi_id
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index d22d3b8abf1..6f1d2253e54 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -7,33 +7,44 @@
icon = 'icons/obj/projectiles.dmi'
icon_state = "bullet"
density = FALSE
- anchored = TRUE //There's a reason this is here, Mport. God fucking damn it -Agouri. Find&Fix by Pete. The reason this is here is to stop the curving of emitter shots.
+ anchored = TRUE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
movement_type = FLYING
blocks_emissive = EMISSIVE_BLOCK_GENERIC
layer = MOB_LAYER
var/hitsound_wall = ""
- unacidable = TRUE //should be `resistance_flags` but we don't have it yet
- var/def_zone = "" //Aiming at
- var/atom/movable/firer = null//Who shot it
- var/datum/fired_from = null // the thing that the projectile was fired from (gun, turret, spell)
- var/suppressed = FALSE //Attack message
+ /// Should be `resistance_flags` but we don't have it yet.
+ unacidable = TRUE
+ /// What body part/area we're aiming at.
+ var/def_zone = ""
+ /// Who shot it.
+ var/atom/movable/firer = null
+ /// The thing that the projectile was fired from (gun, turret, spell).
+ var/datum/fired_from = null
+ /// Attack message.
+ var/suppressed = FALSE
var/yo = null
var/xo = null
- var/atom/original // the original target clicked
- var/turf/starting // the projectile's starting turf
+ /// The original target clicked.
+ var/atom/original
+ /// The projectile's starting turf.
+ var/turf/starting
var/p_x = 16
- var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center
+ /// The pixel location of the tile that the player clicked. Default is the center.
+ var/p_y = 16
//Fired processing vars
- var/fired = FALSE //Have we been fired yet
- var/paused = FALSE //for suspending the projectile midair
+ /// Have we been fired yet
+ var/fired = FALSE
+ /// For suspending the projectile midair
+ var/paused = FALSE
var/last_projectile_move = 0
var/last_process = 0
var/time_offset = 0
var/datum/point/vector/trajectory
- var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location!
+ /// Instructs forceMove to NOT reset our trajectory to the new location!
+ var/trajectory_ignore_forcemove = FALSE
/// We already impacted these things, do not impact them again. Used to make sure we can pierce things we want to pierce. Lazylist, typecache style (object = TRUE) for performance.
var/list/impacted = list()
/// If TRUE, we can hit our firer.
@@ -55,16 +66,16 @@
*/
/// The "usual" flags of pass_flags is used in that can_hit_target ignores these unless they're specifically targeted/clicked on. This behavior entirely bypasses process_hit if triggered, rather than phasing which uses prehit_pierce() to check.
pass_flags = PASSTABLE|PASSRAILING
- /// If FALSE, allow us to hit something directly targeted/clicked/whatnot even if we're able to phase through it
+ /// If FALSE, allow us to hit something directly targeted/clicked/whatnot even if we're able to phase through it.
var/phasing_ignore_direct_target = FALSE
/// Bitflag for things the projectile should just phase through entirely - No hitting unless direct target and [phasing_ignore_direct_target] is FALSE. Uses pass_flags flags.
var/projectile_phasing = NONE
/// Bitflag for things the projectile should hit, but pierce through without deleting itself. Defers to projectile_phasing. Uses pass_flags flags.
var/projectile_piercing = NONE
- /// number of times we've pierced something. Incremented BEFORE bullet_act and on_hit proc!
+ /// Number of times we've pierced something. Incremented BEFORE bullet_act and on_hit proc!
var/pierces = 0
- /// If objects are below this layer, we pass through them
+ /// If objects are below this layer, we pass through them.
var/hit_threshhold = PROJECTILE_HIT_THRESHHOLD_LAYER
/// During each fire of SSprojectiles, the number of deciseconds since the last fire of SSprojectiles
@@ -82,38 +93,45 @@
/// The current angle of the projectile. Initially null, so if the arg is missing from [/fire()], we can calculate it from firer and target as fallback.
var/Angle
- var/original_angle = 0 //Angle at firing
- var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle
- var/spread = 0 //amount (in degrees) of projectile spread
- animate_movement = NO_STEPS //Use SLIDE_STEPS in conjunction with legacy
- /// how many times we've ricochet'd so far (instance variable, not a stat)
+ /// Angle at firing.
+ var/original_angle = 0
+ /// Set TRUE to prevent projectiles from having their sprites rotated based on firing angle.
+ var/nondirectional_sprite = FALSE
+ /// Amount (in degrees) of projectile spread.
+ var/spread = 0
+ /// Use SLIDE_STEPS in conjunction with legacy.
+ animate_movement = NO_STEPS
+ /// How many times we've ricochet'd so far (instance variable, not a stat).
var/ricochets = 0
- /// how many times we can ricochet max
+ /// How many times we can ricochet max.
var/ricochets_max = 0
- /// how many times we have to ricochet min (unless we hit an atom we can ricochet off)
+ /// How many times we have to ricochet min (unless we hit an atom we can ricochet off).
var/min_ricochets = 0
- /// 0-100 (or more, I guess), the base chance of ricocheting, before being modified by the atom we shoot and our chance decay
+ /// 0-100 (or more, I guess), the base chance of ricocheting, before being modified by the atom we shoot and our chance decay.
var/ricochet_chance = 0
- /// 0-1 (or more, I guess) multiplier, the ricochet_chance is modified by multiplying this after each ricochet
+ /// 0-1 (or more, I guess) multiplier, the ricochet_chance is modified by multiplying this after each ricochet.
var/ricochet_decay_chance = 0.7
- /// 0-1 (or more, I guess) multiplier, the projectile's damage is modified by multiplying this after each ricochet
+ /// 0-1 (or more, I guess) multiplier, the projectile's damage is modified by multiplying this after each ricochet.
var/ricochet_decay_damage = 0.7
- /// On ricochet, if nonzero, we consider all mobs within this range of our projectile at the time of ricochet to home in on like Revolver Ocelot, as governed by ricochet_auto_aim_angle
+ /// On ricochet, if nonzero, we consider all mobs within this range of our projectile at the time of ricochet to home in on like Revolver Ocelot, as governed by ricochet_auto_aim_angle.
var/ricochet_auto_aim_range = 0
- /// On ricochet, if ricochet_auto_aim_range is nonzero, we'll consider any mobs within this range of the normal angle of incidence to home in on, higher = more auto aim
+ /// On ricochet, if ricochet_auto_aim_range is nonzero, we'll consider any mobs within this range of the normal angle of incidence to home in on, higher = more auto aim.
var/ricochet_auto_aim_angle = 30
- /// the angle of impact must be within this many degrees of the struck surface, set to 0 to allow any angle
+ /// The angle of impact must be within this many degrees of the struck surface, set to 0 to allow any angle.
var/ricochet_incidence_leeway = 40
/// Can our ricochet autoaim hit our firer?
var/ricochet_shoots_firer = TRUE
//Hitscan
- var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored.
- var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation.
+ /// Whether this is hitscan. If it is, speed is basically ignored.
+ var/hitscan = FALSE
+ /// Assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation.
+ var/list/beam_segments
/// Last turf an angle was changed in for hitscan projectiles.
var/turf/last_angle_set_hitscan_store
var/datum/point/beam_index
- var/turf/hitscan_last //last turf touched during hitscanning.
+ /// Last turf touched during hitscanning.
+ var/turf/hitscan_last
var/tracer_type
var/muzzle_type
var/impact_type
@@ -132,38 +150,47 @@
//Homing
var/homing = FALSE
var/atom/homing_target
- var/homing_turn_speed = 10 //Angle per tick.
- var/homing_inaccuracy_min = 0 //in pixels for these. offsets are set once when setting target.
+ /// Angle per tick.
+ var/homing_turn_speed = 10
+ /// In pixels for these. offsets are set once when setting target.
+ var/homing_inaccuracy_min = 0
var/homing_inaccuracy_max = 0
var/homing_offset_x = 0
var/homing_offset_y = 0
var/damage = 10
- var/damage_type = DAMAGE_BRUTE //DAMAGE_BRUTE, DAMAGE_BURN, DAMAGE_TOXIN, DAMAGE_OXY, DAMAGE_CLONE, DAMAGE_PAIN are the only things that should be in here
+ /// DAMAGE_BRUTE, DAMAGE_BURN, DAMAGE_TOXIN, DAMAGE_OXY, DAMAGE_CLONE, DAMAGE_PAIN are the only things that should be in here.
+ var/damage_type = DAMAGE_BRUTE
- var/range = 50 //This will de-increment every step. When 0, it will deletze the projectile.
- var/decayedRange //stores original range
- var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever
+ /// This will de-increment every step. When 0, it will deletze the projectile.
+ var/range = 50
+ /// Stores original range.
+ var/decayedRange
+ /// Amount of original range that falls off when reflecting, so it doesn't go forever.
+ var/reflect_range_decrease = 5
- var/impact_effect_type //what type of impact effect to show when hitting something
- var/log_override = FALSE //is this type spammed enough to not log? (KAs)
+ /// What type of impact effect to show when hitting something.
+ var/impact_effect_type
+ /// Is this type spammed enough to not log? (KAs).
+ var/log_override = FALSE
/// If true, the projectile won't cause any logging. Used for hallucinations and shit.
var/do_not_log = FALSE
- var/shrapnel_type //type of shrapnel the projectile leaves in its target.
+ /// Type of shrapnel the projectile leaves in its target.
+ var/shrapnel_type
- ///If TRUE, hit mobs, even if they are lying on the floor and are not our target within MAX_RANGE_HIT_PRONE_TARGETS tiles
+ /// If TRUE, hit mobs, even if they are lying on the floor and are not our target within MAX_RANGE_HIT_PRONE_TARGETS tiles.
var/hit_prone_targets = FALSE
- ///if TRUE, ignores the range of MAX_RANGE_HIT_PRONE_TARGETS tiles of hit_prone_targets
+ /// If TRUE, ignores the range of MAX_RANGE_HIT_PRONE_TARGETS tiles of hit_prone_targets.
var/ignore_range_hit_prone_targets = FALSE
- ///How much we want to drop damage per tile as it travels through the air
+ /// How much we want to drop damage per tile as it travels through the air.
var/damage_falloff_tile
- ///How much accuracy is lost for each tile travelled
+ /// How much accuracy is lost for each tile travelled.
var/accuracy_falloff = 7
- ///How much accuracy before falloff starts to matter. Formula is range - falloff * tiles travelled
+ /// How much accuracy before falloff starts to matter. Formula is range - falloff * tiles travelled.
var/accurate_range = 100
var/static/list/projectile_connections = list(COMSIG_ATOM_ENTERED = PROC_REF(on_entered))
- /// If true directly targeted turfs can be hit
+ /// If TRUE, directly targeted turfs can be hit.
var/can_hit_turfs = FALSE
@@ -171,18 +198,21 @@
START AURORA SNOWFLAKE VARS SECTION
#########################################*/
- var/ping_effect = "ping_b" //Effect displayed when a bullet hits a barricade. See atom/proc/bullet_ping.
+ /// Effect displayed when a bullet hits a barricade. See atom/proc/bullet_ping.
+ var/ping_effect = "ping_b"
- ///How accurate a bullet is *if it's hitting a mob* at getting the zone aimed at
+ /// How accurate a bullet is *if it's hitting a mob* at getting the zone aimed at.
var/accuracy = 0
- //used for shooting at blank range, you shouldn't be able to miss
+ /// Used for shooting at blank range, you shouldn't be able to miss.
var/point_blank = FALSE
- //Effects
+ /// Effects (bio and rad are also valid)
var/damage_flags = DAMAGE_FLAG_BULLET
- var/check_armor = BULLET //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid
- var/list/impact_sounds //for different categories, IMPACT_MEAT etc
+ /// Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
+ var/check_armor = BULLET
+ /// For different categories, IMPACT_MEAT etc
+ var/list/impact_sounds
var/stun = 0
var/weaken = 0
@@ -194,20 +224,24 @@
var/agony = 0
var/incinerate = 0
- var/embed = 0 // whether or not the projectile can embed itself in the mob
- var/embed_chance = 0 // a flat bonus to the % chance to embed
+ /// Whether or not the projectile can embed itself in the mob
+ var/embed = 0
+ /// A flat bonus to the % chance to embed
+ var/embed_chance = 0
- //For Maim / Maiming.
- var/maim_rate = 0 //Factor that the recipiant will be maimed by the projectile (NOT OUT OF 100%.)
+ /// For maiming. Factor that the recipiant will be maimed by the projectile (NOT OUT OF 100%.)
+ var/maim_rate = 0
var/reflected = FALSE
- var/penetrating = 0 //If greater than zero, the projectile will pass through dense objects as specified by on_penetrate()
+ /// If greater than zero, the projectile will pass through dense objects as specified by on_penetrate()
+ var/penetrating = 0
+ /// For KAs, really.
+ var/aoe = 0
- var/aoe = 0 //For KAs, really
-
- var/anti_materiel_potential = 1 //how much the damage of this bullet is increased against mechs
+ /// How much the damage of this bullet is increased against mechs.
+ var/anti_materiel_potential = 1
/*########################################
END AURORA SNOWFLAKE VARS SECTION
@@ -339,7 +373,6 @@
return
Impact(A)
-
/**
* Called when the projectile hits something
* This can either be from it bumping something,
@@ -488,9 +521,10 @@
// 6. nothing
// (returns null)
-
-//Returns true if the target atom is on our current turf and above the right layer
-//If direct target is true it's the originally clicked target.
+/**
+ * Returns true if the target atom is on our current turf and above the right layer
+ * If direct target is true it's the originally clicked target.
+ */
/obj/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE, cross_failed = FALSE)
if(QDELETED(target) || impacted[target.weak_reference])
return FALSE
@@ -971,19 +1005,19 @@
if(!user.client)
CRASH("Can't make trajectory calculations without a target or click modifiers and a client.")
- //Split screen-loc up into X+Pixel_X and Y+Pixel_Y
+ /// Split screen-loc up into X+Pixel_X and Y+Pixel_Y
var/list/screen_loc_params = splittext(LAZYACCESS(modifiers, SCREEN_LOC), ",")
- //Split X+Pixel_X up into list(X, Pixel_X)
+ /// Split X+Pixel_X up into list(X, Pixel_X)
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
- //Split Y+Pixel_Y up into list(Y, Pixel_Y)
+ /// Split Y+Pixel_Y up into list(Y, Pixel_Y)
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
var/tx = (text2num(screen_loc_X[1]) - 1) * world.icon_size + text2num(screen_loc_X[2])
- // We are here trying to lower our target location by the firing source's visual offset
- // So visually things make a nice straight line while properly accounting for actual physical position
+ /// We are here trying to lower our target location by the firing source's visual offset
+ /// So visually things make a nice straight line while properly accounting for actual physical position
var/ty = (text2num(screen_loc_Y[1]) - 1) * world.icon_size + text2num(screen_loc_Y[2]) - source.pixel_z
- //Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
+ /// Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
var/list/screenview = view_to_pixels(user.client.view)
var/ox = round(screenview[1] / 2) - user.client.pixel_x //"origin" x
@@ -1100,7 +1134,7 @@
AURORA SNOWFLAKE SECTION
##############################*/
-//Checks if the projectile is eligible for embedding. Not that it necessarily will.
+/// Checks if the projectile is eligible for embedding. Not that it necessarily will.
/obj/projectile/proc/can_embed()
//embed must be enabled and damage type must be brute
if(!embed || damage_type != DAMAGE_BRUTE)
@@ -1118,8 +1152,7 @@
return damage * anti_materiel_potential
return FALSE
-//Because I don't want to rewrite half the world to use embed_data just yet,
-//this is left as is, praise be the omnissiah
+/// Because I don't want to rewrite half the world to use embed_data just yet, this is left as is, praise be the omnissiah
/obj/projectile/proc/do_embed(var/obj/item/organ/external/organ)
var/obj/item/SP = new shrapnel_type(organ)
SP.edge = TRUE
@@ -1137,7 +1170,8 @@
original = target
setAngle(get_projectile_angle(source, target))
-/obj/projectile/proc/setAngle(new_angle) //wrapper for overrides.
+/// wrapper for overrides.
+/obj/projectile/proc/setAngle(new_angle)
Angle = new_angle
if(!nondirectional_sprite)
var/matrix/M = new
@@ -1161,7 +1195,7 @@
. += "Shrapnel Type: [shrapnel.name]
"
. += "Armor Penetration: [initial(armor_penetration)]%
"
-//This is where the bullet bounces off.
+/// This is where the bullet bounces off.
/atom/proc/bullet_ping(obj/projectile/P, var/pixel_x_offset, var/pixel_y_offset)
if(!P || !P.ping_effect)
return
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 49b1ed15242..5a04964690f 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -13,7 +13,7 @@
var/frequency = 1
hitscan = 1
invisibility = 101 //beam projectiles are invisible as they are rendered by the effect engine
- color = COLOR_RED
+ // color = COLOR_RED
muzzle_type = /obj/effect/projectile/muzzle/laser
tracer_type = /obj/effect/projectile/tracer/laser
@@ -151,6 +151,7 @@
name = "emitter beam"
icon_state = "emitter"
damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm
+ color = COLOR_SPRING_GREEN
muzzle_type = /obj/effect/projectile/muzzle/emitter
tracer_type = /obj/effect/projectile/tracer/emitter
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 9e25eef3fe8..34d927607cb 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -39,16 +39,16 @@
icon_state = "pellets"
damage = 20
- ///Number of pellets that will be ejected from this bullet
+ /// Number of pellets that will be ejected from this bullet
var/pellets = 4
- ///The projectile will lose a pellet each time it travels this distance. Can be a non-integer.
+ /// The projectile will lose a pellet each time it travels this distance. Can be a non-integer.
var/range_step = 2
- ///Lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone
+ /// Lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone
var/base_spread = 90
- ///Higher means the pellets spread more across body parts with distance
+ /// Higher means the pellets spread more across body parts with distance
var/spread_step = 10
/obj/projectile/bullet/pellet/proc/get_pellets(var/distance)
@@ -69,7 +69,7 @@
var/total_pellets = get_pellets(distance)
var/spread = max(base_spread - (spread_step*distance), 0)
- //shrapnel explosions miss prone mobs with a chance that increases with distance
+ // Shrapnel explosions miss prone mobs with a chance that increases with distance
var/prone_chance = 0
if(!base_spread)
prone_chance = max(spread_step*(distance - 2), 0)
@@ -125,7 +125,7 @@
agony = 50
embed = FALSE
var/balls = 4
- ///projectile will lose a fragment each time it travels this distance. Can be a non-integer.
+ /// Projectile will lose a fragment each time it travels this distance. Can be a non-integer.
var/range_step = 3
var/base_spread = 90
var/spread_step = 10
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index c4590f8c093..d7cabd9f73d 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -5,7 +5,7 @@
damage_type = DAMAGE_BURN
check_armor = ENERGY
-//releases a burst of light on impact or after travelling a distance
+/// Releases a burst of light on impact or after travelling a distance.
/obj/projectile/energy/flash
name = "chemical shell"
icon_state = "bullet"
@@ -36,7 +36,7 @@
single_spark(T)
new /obj/effect/smoke/illumination(T, brightness=max(flash_range*2, brightness), lifetime=light_duration)
-//blinds people like the flash round, but can also be used for temporary illumination
+/// blinds people like the flash round, but can also be used for temporary illumination
/obj/projectile/energy/flash/flare
damage = 10
flash_range = 1
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 188c2d2d13c..724aed8f1d6 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -3,19 +3,25 @@
var/description = "A non-descript chemical."
var/taste_description = "old rotten bandaids"
var/list/species_taste_description
- var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable
+ /// How this taste compares to others. Higher values means it is more noticable.
+ var/taste_mult = 1
var/reagent_state = SOLID
- var/metabolism = REM // This would be 0.2 normally
+ /// Default value is 0.2.
+ var/metabolism = REM
var/ingest_met = 0
var/touch_met = 0
var/breathe_met = 0
var/ingest_mul = 0.5
var/touch_mul = 0
var/breathe_mul = 0.75
- var/overdose = 0 // Volume of a chemical required in the blood to meet overdose criteria.
- var/od_minimum_dose = 5 // Metabolised dose of a chemical required to meet overdose criteria.
- var/scannable = 0 // Shows up on health analyzers.
- var/spectro_hidden = FALSE // doesn't show up on basic mass spectrometers, only shows on the advanced variant
+ /// Volume of a chemical required in the blood to meet overdose criteria.
+ var/overdose = 0
+ /// Metabolised dose of a chemical required to meet overdose criteria.
+ var/od_minimum_dose = 5
+ /// Shows up on health analyzers.
+ var/scannable = 0
+ /// Doesn't show up on basic mass spectrometers, only shows on the advanced variant
+ var/spectro_hidden = FALSE
var/affects_dead = 0
var/glass_icon_state = null
var/glass_name = null
@@ -28,22 +34,31 @@
var/condiment_center_of_mass = null
var/color = "#000000"
var/color_weight = 1
- var/unaffected_species = IS_DIONA | IS_MACHINE // Species that aren't affected by this reagent. Does not prevent affect_touch.
- var/metabolism_min = 0.01 //How much for the medicine to be present in the system to actually have an effect.
- var/conflicting_reagent //Reagents that conflict with this medicine, and cause adverse effects when in the blood.
+ /// Species that aren't affected by this reagent. Does not prevent affect_touch.
+ var/unaffected_species = IS_DIONA | IS_MACHINE
+ /// How much for the medicine to be present in the system to actually have an effect.
+ var/metabolism_min = 0.01
+ /// Reagents that conflict with this medicine, and cause adverse effects when in the blood.
+ var/conflicting_reagent
- var/default_temperature = T0C + 20 //This is its default spawning temperature, if none is provided.
- var/specific_heat = -1 //The higher, the more difficult it is to change its temperature. 0 or lower values indicate that the specific heat has yet to be assigned.
- var/fallback_specific_heat = -1 //Setting this value above 0 will set the specific heat to this value only if the system could not find an appropriate specific heat to assign using the recipe system.
- //Never ever ever ever change this value for singleton/reagent. This should only be used for massive, yet specific things like drinks or food where it is infeasible to assign a specific heat value.
+ /// This is its default spawning temperature, if none is provided.
+ var/default_temperature = T0C + 20
+ /// The higher, the more difficult it is to change its temperature. 0 or lower values indicate that the specific heat has yet to be assigned.
+ var/specific_heat = -1
+ /// Setting this value above 0 will set the specific heat to this value only if the system could not find an appropriate specific heat to assign using the recipe system.
+ /// Never ever ever ever change this value for singleton/reagent. This should only be used for massive, yet specific things like drinks or food where it is infeasible to assign a specific heat value.
+ var/fallback_specific_heat = -1
- var/germ_adjust = 0 // for makeshift bandages/disinfectant
- var/carbonated = FALSE // if it's carbonated or not
+ /// For makeshift bandages/disinfectant
+ var/germ_adjust = 0
+ /// If it's carbonated or not.
+ var/carbonated = FALSE
/// Adds to the value of whatever container's holding it, value * units of reagents
var/value = 1
-/singleton/reagent/proc/initialize_data(var/newdata, var/datum/reagents/holder) // Called when the reagent is created.
+/// Called when the reagent is created.
+/singleton/reagent/proc/initialize_data(var/newdata, var/datum/reagents/holder)
if(!isnull(newdata))
return newdata
@@ -57,7 +72,7 @@
else
H.vessel.reagent_data[/singleton/reagent/blood]["trace_chem"][type] = amount
-// This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing.
+/// This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing.
/singleton/reagent/proc/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder)
return
@@ -78,7 +93,8 @@
var/OD_min = get_od_min_dose(M, location, holder)
return OD && (REAGENT_VOLUME(holder, type) > OD) && (LAZYACCESS(M.chem_doses, type) > OD_min) && (!location || (location != CHEM_TOUCH)) //OD based on volume in blood, but waits for a small amount of the drug to metabolise before kicking in.
-/singleton/reagent/proc/on_mob_life(var/mob/living/carbon/M, var/alien, var/location, var/datum/reagents/holder) // Currently, on_mob_life is called on carbons. Any interaction with non-carbon mobs (lube) will need to be done in touch_mob.
+/// Currently, on_mob_life is called on carbons. Any interaction with non-carbon mobs (lube) will need to be done in touch_mob.
+/singleton/reagent/proc/on_mob_life(var/mob/living/carbon/M, var/alien, var/location, var/datum/reagents/holder)
if(!istype(M))
return
if(!affects_dead && M.stat == DEAD)
@@ -96,8 +112,9 @@
removed = M.get_metabolism(removed)
+ // ctual overdose threshold now = overdose + od_minimum_dose. ie. Synaptizine; 5u OD threshold + 1 unit min. metab'd dose = 6u actual OD threshold.
if(is_overdosing(M, location, holder))
- overdose(M, alien, removed, LAZYACCESS(M.chem_doses, type)/get_overdose(M, location, holder), holder) //Actual overdose threshold now = overdose + od_minimum_dose. ie. Synaptizine; 5u OD threshold + 1 unit min. metab'd dose = 6u actual OD threshold.
+ overdose(M, alien, removed, LAZYACCESS(M.chem_doses, type)/get_overdose(M, location, holder), holder)
if(LAZYACCESS(M.chem_doses, type) <= 0)
initial_effect(M,alien, holder)
@@ -127,22 +144,22 @@
remove_self(removed, holder)
-// Called when a beaker is thrown or something is hit with it, AND the beaker doesn't break.
+/// Called when a beaker is thrown or something is hit with it, AND the beaker doesn't break.
/singleton/reagent/proc/apply_force(var/force, var/datum/reagents/holder)
return force
-//Initial effect is called once when the reagent first starts affecting a mob.
+/// Initial effect is called once when the reagent first starts affecting a mob.
/singleton/reagent/proc/initial_effect(var/mob/living/carbon/M, var/alien, var/datum/reagents/holder)
return
-//Final effect is called once when the reagent finishes affecting a mob.
+/// Final effect is called once when the reagent finishes affecting a mob.
/singleton/reagent/proc/final_effect(var/mob/living/carbon/M, var/datum/reagents/holder)
return
/singleton/reagent/proc/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder)
return
-// if your chem directly affects other chems, use this to make sure all the chem_effects are applied before the standard chem affect_thing is run
+/// If your chem directly affects other chems, use this to make sure all the chem_effects are applied before the standard chem affect_thing is run
/singleton/reagent/proc/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder)
if(!istype(M))
return FALSE
@@ -167,13 +184,15 @@
if(breathe_mul)
affect_blood(M, alien, removed * breathe_mul, holder)
-/singleton/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed = 0, var/scale = 1, var/datum/reagents/holder) // Overdose effect. Doesn't happen instantly.
+/// Overdose effect. Doesn't happen instantly.
+/singleton/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed = 0, var/scale = 1, var/datum/reagents/holder)
M.adjustToxLoss(REM)
-/singleton/reagent/proc/mix_data(var/newdata, var/newamount, var/datum/reagents/holder) // You have a reagent with data, and new reagent with its own data get added, how do you deal with that?
+/// You have a reagent with data, and new reagent with its own data get added, how do you deal with that?
+/singleton/reagent/proc/mix_data(var/newdata, var/newamount, var/datum/reagents/holder)
return REAGENT_DATA(holder, type)
-//Check to use when seeing if the person has the minimum dose of the reagent. Useful for stopping minimum transfer rate IV drips from applying chem effects
+/// Check to use when seeing if the person has the minimum dose of the reagent. Useful for stopping minimum transfer rate IV drips from applying chem effects
/singleton/reagent/proc/check_min_dose(var/mob/living/carbon/M, var/min_dose = 1)
var/dose = REAGENT_VOLUME(M.reagents, type) >= min_dose
var/obj/item/organ/internal/stomach/S = M.internal_organs_by_name[BP_STOMACH]
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index 6d6e7e1cfec..b2eb62b5753 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -12,7 +12,7 @@
/singleton/reagent/acetone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder)
M.adjustToxLoss(removed * 3)
-/singleton/reagent/acetone/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) //I copied this wholesale from ethanol and could likely be converted into a shared proc. ~Techhead
+/singleton/reagent/acetone/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder)
if(istype(O, /obj/item/paper))
var/obj/item/paper/paperaffected = O
paperaffected.clearpaper()
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm
index b2871ca53d2..4f19a997a97 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm
@@ -783,6 +783,7 @@
/singleton/reagent/drugs/dionae_stimulant/diet
name = "diet Diesel"
description = "Diesel produced straight from the Narrows that has been made \"diet\" or decontaminated of radiation, making it safe for distribution around the Orion Spur."
+ fallback_specific_heat = 1
/singleton/reagent/drugs/dionae_stimulant/diet/initial_effect(mob/living/carbon/M, alien, datum/reagents/holder)
return
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/food_drink_species_vaurca.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/food_drink_species_vaurca.dm
index b56afb42c0b..ceee88233f9 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/food_drink_species_vaurca.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/food_drink_species_vaurca.dm
@@ -86,6 +86,7 @@
taste_description = "sharp tangy cheese"
reagent_state = SOLID
taste_mult = 3
+ fallback_specific_heat = 1
/singleton/reagent/nakarka/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder)
..()
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_food.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_food.dm
index b0cc932339c..e821dc5004e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_food.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_food.dm
@@ -5,12 +5,15 @@
taste_mult = 4
reagent_state = SOLID
metabolism = REM * 2
- var/nutriment_factor = 8 // Per removed in digest.
- var/hydration_factor = 0 // Per removed in digest.
+ /// Per removed in digest.
+ var/nutriment_factor = 8
+ /// Per removed in digest.
+ var/hydration_factor = 0
var/blood_factor = 2
var/regen_factor = 0.8
var/injectable = 0
- var/attrition_factor = -(REM * 4)/BASE_MAX_NUTRITION // Decreases attrition rate.
+ /// Decreases attrition rate.
+ var/attrition_factor = -(REM * 4)/BASE_MAX_NUTRITION
color = "#664330"
unaffected_species = IS_MACHINE
taste_description = "food"
@@ -59,6 +62,10 @@
M.add_chemical_effect(CE_BLOODRESTORE, blood_factor * removed)
M.intoxication -= min(M.intoxication,nutriment_factor*removed*0.05) //Nutrients can absorb alcohol.
+/// Parent singleton. Provides fallback specific heat value to condiments unused in recipes.
+/singleton/reagent/condiment
+ fallback_specific_heat = 1
+
//
//Lipozine?
//
@@ -193,18 +200,19 @@
if(amount >= 3)
T.wet_floor(WET_TYPE_LUBE,amount)
-//Calculates a scaling factor for scalding damage, based on the temperature of the oil and creature's heat resistance
+/// Calculates a scaling factor for scalding damage, based on the temperature of the oil and creature's heat resistance
/singleton/reagent/nutriment/triglyceride/oil/proc/heatdamage(var/mob/living/carbon/M, var/datum/reagents/holder)
- var/threshold = 360//Human heatdamage threshold
+ /// Human heatdamage threshold.
+ var/threshold = 360
var/datum/species/S = M.get_species(1)
if (S && istype(S))
threshold = S.heat_level_1
- //If temperature is too low to burn, return a factor of 0. no damage
+ // If temperature is too low to burn, return a factor of 0. no damage.
if (holder.get_temperature() < threshold)
return 0
- //Step = degrees above heat level 1 for 1.0 multiplier
+ /// Step = degrees above heat level 1 for 1.0 multiplier.
var/step = 60
if (S && istype(S))
step = (S.heat_level_2 - S.heat_level_1)*1.5
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_ingredients.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_ingredients.dm
index 77382349996..e5a0f4cecde 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_ingredients.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drink/generic_ingredients.dm
@@ -1,9 +1,9 @@
-/*
- Coatings are used in cooking. Dipping food items in a reagent container with a coating in it
- allows it to be covered in that, which will add a masked overlay to the sprite.
-
- Coatings have both a raw and a cooked image. Raw coating is generally unhealthy
- Generally coatings are intended for deep frying foods
+/**
+ * Coatings are used in cooking. Dipping food items in a reagent container with a coating in it
+ * allows it to be covered in that, which will add a masked overlay to the sprite.
+ *
+ * Coatings have both a raw and a cooked image. Raw coating is generally unhealthy
+ * Generally coatings are intended for deep frying foodsGenerally coatings are intended for deep frying foods
*/
/singleton/reagent/nutriment/coating
nutriment_factor = 4 //Less dense than the food itself, but coatings still add extra calories
@@ -29,13 +29,13 @@
H.delayed_vomit()
. = ..()
-/singleton/reagent/nutriment/coating/initialize_data(var/list/newdata, var/datum/reagents/holder) // Called when the reagent is created.
+/// Called when the reagent is created.
+/singleton/reagent/nutriment/coating/initialize_data(var/list/newdata, var/datum/reagents/holder)
var/list/data = ..()
LAZYSET(data, "cooked", istype(holder?.my_atom,/obj/item/reagent_containers/food/snacks))
if(data["cooked"])
name = cooked_name
return data
-
//Batter which is part of objects at compiletime spawns in a cooked state
/singleton/reagent/nutriment/coating/mix_data(var/list/newdata, var/newamount, var/datum/reagents/holder)
@@ -270,8 +270,8 @@
condiment_name = "hotsauce"
condiment_desc = "Hot sauce. It's in the name."
condiment_icon_state = "hotsauce"
-
- var/agony_dose = 15 // Capsaicin required to proc agony. (3 to 5 chilis.)
+ /// Capsaicin required to proc agony. (3 to 5 chilis.)
+ var/agony_dose = 15
var/agony_amount = 1
var/discomfort_message = SPAN_DANGER("Your insides feel uncomfortably hot.")
var/slime_temp_adj = 10
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index 9ce96597cd3..f04193c8ade 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -2031,6 +2031,7 @@
metabolism = REM*0.0001
scannable = TRUE
taste_description = "pure death"
+ fallback_specific_heat = 1
/singleton/reagent/antibodies/affect_blood(mob/living/carbon/M, alien, removed, datum/reagents/holder)
. = ..()
@@ -2042,7 +2043,8 @@
Z.curing = TRUE
to_chat(M, SPAN_WARNING("Your [E.name] tightens, pulses, and squirms as \the [Z] fights back against the antibodies!"))
-/singleton/reagent/caffeine // Copied from Hyperzine
+/// Copied from Hyperzine
+/singleton/reagent/caffeine
name = "Caffeine"
description = "Caffeine is a central nervous system stimulant found naturally in many plants. It's used as a mild cognitive enhancer to increase alertness, attentional performance, and improve cardiovascular health."
reagent_state = SOLID
@@ -2053,6 +2055,7 @@
taste_description = "bitter"
metabolism_min = REM * 0.025
breathe_met = REM * 0.15 * 0.5
+ fallback_specific_heat = 1
/singleton/reagent/caffeine/initial_effect(mob/living/carbon/M, alien, datum/reagents/holder)
. = ..()
diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm
index 26101c3353e..0f6b2c0b1ff 100644
--- a/code/modules/security levels/keycard authentication.dm
+++ b/code/modules/security levels/keycard authentication.dm
@@ -4,19 +4,22 @@
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED
- var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made.
+ /// This gets set to TRUE on all devices except the one where the initial request was made.
+ var/active = FALSE
var/event = ""
var/screen = 1
- var/confirmed = 0 //This variable is set by the device that confirms the request.
- var/confirm_delay = 20 //(2 seconds)
- var/busy = 0 //Busy when waiting for authentication or an event request has been sent from this device.
+ /// This variable is set by the device that confirms the request.
+ var/confirmed = FALSE
+ var/confirm_delay = 2 SECONDS
+ /// Busy when waiting for authentication, or an event request has been sent from this device.
+ var/busy = FALSE
var/obj/machinery/keycard_auth/event_source
var/mob/event_triggered_by
var/mob/event_confirmed_by
var/recorded_message = ""
//1 = select event
//2 = authenticate
- anchored = 1.0
+ anchored = TRUE
idle_power_usage = 2
active_power_usage = 6
power_channel = AREA_USAGE_ENVIRON
@@ -40,7 +43,7 @@
/obj/machinery/keycard_auth/attackby(obj/item/attacking_item, mob/user)
if(stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
- return
+ return FALSE
if(istype(attacking_item, /obj/item/card/id))
var/obj/item/card/id/ID = attacking_item
if(ACCESS_KEYCARD_AUTH in ID.access)
@@ -63,10 +66,10 @@
to_chat(user, "This device is not powered.")
return
if(!user.IsAdvancedToolUser())
- return 0
+ return FALSE
if(busy)
to_chat(user, "This device is busy.")
- return
+ return FALSE
user.set_machine(src)
@@ -111,10 +114,10 @@
return
/obj/machinery/keycard_auth/proc/reset()
- active = 0
+ active = FALSE
event = ""
screen = 1
- confirmed = 0
+ confirmed = FALSE
event_source = null
icon_state = "auth_off"
event_triggered_by = null
@@ -147,7 +150,7 @@
sleep(confirm_delay)
if(confirmed)
- confirmed = 0
+ confirmed = FALSE
trigger_event(event, recorded_message, user)
log_game("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]")
message_admins("[key_name_admin(event_triggered_by)] triggered and [key_name_admin(event_confirmed_by)] confirmed event [event]", 1)
@@ -157,16 +160,16 @@
if(stat & (BROKEN|NOPOWER))
return
event_source = source
- busy = 1
- active = 1
+ busy = TRUE
+ active = TRUE
icon_state = "auth_on"
sleep(confirm_delay)
event_source = null
icon_state = "auth_off"
- active = 0
- busy = 0
+ active = FALSE
+ busy = FALSE
/obj/machinery/keycard_auth/proc/trigger_event(var/event, var/distress_message, var/mob/user)
switch(event)
@@ -196,12 +199,12 @@
/obj/machinery/keycard_auth/proc/is_ert_blocked()
if(GLOB.config.ert_admin_call_only)
- return 1
+ return TRUE
if(SSticker.mode.ert_disabled)
SSticker.mode.announce_ert_disabled()
- return 1
+ return TRUE
else
- return 0
+ return FALSE
GLOBAL_VAR_INIT(maint_all_access, FALSE)
@@ -215,7 +218,7 @@ GLOBAL_VAR_INIT(maint_all_access, FALSE)
/obj/machinery/door/airlock/allowed(mob/M)
if(locked)
- return 0
+ return FALSE
var/obj/item/I = M.GetIdCard()
if(!I)
@@ -224,7 +227,7 @@ GLOBAL_VAR_INIT(maint_all_access, FALSE)
var/maint_sec_access = ((GLOB.security_level > SEC_LEVEL_GREEN) && has_access(ACCESS_SECURITY, accesses = A))
var/exceptional_circumstances = GLOB.maint_all_access || maint_sec_access
if(exceptional_circumstances && src.check_access_list(list(ACCESS_MAINT_TUNNELS)))
- return 1
+ return TRUE
if(access_by_level || req_one_access_by_level)
var/sec_level = get_security_level()
if(sec_level in (req_one_access_by_level ? req_one_access_by_level : access_by_level))
diff --git a/html/changelogs/Bat-Bugfixes.yml b/html/changelogs/Bat-Bugfixes.yml
new file mode 100644
index 00000000000..a3e70badd23
--- /dev/null
+++ b/html/changelogs/Bat-Bugfixes.yml
@@ -0,0 +1,21 @@
+author: Batrachophrenoboocosmomachia
+
+delete-after: True
+
+changes:
+ - spellcheck: "Renames 'gibber' to 'autobutcher'."
+ - code_imp: "Cleans up a lot of old autobutcher code."
+ - code_imp: "Simplifies and unifies a lot of circuit board naming code."
+ - code_imp: "Updates various code comments to DMDocs format."
+ - balance: "Slightly increased damage of beating someone with a ladder."
+ - bugfix: "Fixes foreign speech displaying the translated versions in langchat for non-fluent listeners."
+ - bugfix: "Fixes whispered speech langchat; whispers are now correctly italicized."
+ - bugfix: "Fixes shouted speech langchat; shouts are now correctly biggified."
+ - bugfix: "Adds missing Omni Gas Mixer, Gas Meter options from RFD-P."
+ - bugfix: "Adds missing circuit boards for bioballistic delivery system, lysis-isolation centrifuge, and autobutcher to allow for construction and deconstruction."
+ - bugfix: "Fixes empty algae chips bag having description set for its name."
+ - bugfix: "Adds fallback_specific_heat values to several reagents that were missing them."
+ - bugfix: "Fixes antimateriel projectiles being erroneously damage-capped when hitting walls."
+ - bugfix: "Fixes laser beam effects not using the base colors of their beam VFX."
+ - qol: "Added helpful feedback hint to move closer when someone speaks aloud within 4 tiles while you're in vacuum (as features go, this one felt more like a bug to experience)."
+ - qol: "Updated various examine hints."