diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 5db5c979e8..13dccc74fe 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -34,6 +34,7 @@
#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250)
#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175)
+#define LIGHT_COLOR_PALEBLUE "#7DAFE1" //A pale blue-ish color. rgb(125, 175, 225)
#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225)
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255)
#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 620c592d93..2f69b63ae9 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1239,6 +1239,20 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
pixel_x = initialpixelx
pixel_y = initialpixely
+/atom/proc/do_jiggle(targetangle = 45)
+ var/matrix/OM = matrix(transform)
+ var/matrix/M = matrix(transform)
+ M.Turn(pick(-targetangle, targetangle))
+ animate(src, transform = M, time = 10, easing = ELASTIC_EASING)
+ animate(src, transform = OM, time = 10, easing = ELASTIC_EASING)
+
+/atom/proc/do_squish(squishx = 1.2, squishy = 0.6)
+ var/matrix/OM = matrix(transform)
+ var/matrix/M = matrix(transform)
+ M.Scale(squishx, squishy)
+ animate(src, transform = M, time = 10, easing = BOUNCE_EASING)
+ animate(src, transform = OM, time = 10, easing = BOUNCE_EASING)
+
/proc/weightclass2text(var/w_class)
switch(w_class)
if(WEIGHT_CLASS_TINY)
@@ -1530,4 +1544,4 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
. = list()
for(var/i in L)
if(condition.Invoke(i))
- . |= i
\ No newline at end of file
+ . |= i
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 53f03ebfff..595e1d9ca0 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -7,6 +7,9 @@
/datum/config_entry/string/servername // server name (the name of the game window)
+/datum/config_entry/string/servertagline
+ config_entry_value = "We forgot to set the server's tagline in config.txt"
+
/datum/config_entry/string/serversqlname // short form server name used for the DB
/datum/config_entry/string/stationname // station name (the name of the station in-game)
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 55af26b6b2..bb3c584cb9 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -169,10 +169,12 @@
if(locked)
to_chat(M, "[parent] seems to be locked!")
return FALSE
+ var/atom/A = parent
var/obj/item/I = O
if(collection_mode == COLLECT_ONE)
if(can_be_inserted(I, null, M))
handle_item_insertion(I, null, M)
+ A.do_squish()
return
if(!isturf(I.loc))
return
@@ -189,6 +191,7 @@
stoplag(1)
qdel(progress)
to_chat(M, "You put everything you could [insert_preposition] [parent].")
+ A.do_squish(1.4, 0.4)
/datum/component/storage/proc/handle_mass_item_insertion(list/things, datum/component/storage/src_object, mob/user, datum/progressbar/progress)
var/atom/source_real_location = src_object.real_location()
@@ -246,6 +249,7 @@
while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress)))
stoplag(1)
qdel(progress)
+ A.do_squish(0.8, 1.2)
/datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found = TRUE)
var/atom/real_location = real_location()
@@ -455,6 +459,7 @@
return FALSE
if(dump_destination.storage_contents_dump_act(src, M))
playsound(A, "rustle", 50, 1, -5)
+ A.do_squish(0.8, 1.2)
return TRUE
return FALSE
@@ -473,6 +478,8 @@
return TRUE
return FALSE
handle_item_insertion(I, FALSE, M)
+ var/atom/A = parent
+ A.do_squish()
/datum/component/storage/proc/return_inv(recursive)
var/list/ret = list()
@@ -514,6 +521,7 @@
if(A.loc != M)
return
playsound(A, "rustle", 50, 1, -5)
+ A.do_jiggle()
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
M.putItemFromInventoryInHandIfPossible(A, H.held_index)
@@ -539,6 +547,8 @@
if(!L.incapacitated() && I == L.get_active_held_item())
if(!SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE) && can_be_inserted(I, FALSE)) //If it has storage it should be trying to dump, not insert.
handle_item_insertion(I, FALSE, L)
+ var/atom/A = parent
+ A.do_squish()
//This proc return 1 if the item can be picked up and 0 if it can't.
//Set the stop_messages to stop it from printing messages
@@ -712,6 +722,7 @@
to_chat(user, "[parent] seems to be locked!")
else
show_to(user)
+ A.do_jiggle()
/datum/component/storage/proc/signal_on_pickup(datum/source, mob/user)
var/atom/A = parent
@@ -732,16 +743,30 @@
return hide_from(target)
/datum/component/storage/proc/on_alt_click(datum/source, mob/user)
- if(!isliving(user) || user.incapacitated() || !quickdraw || locked || !user.CanReach(parent))
+ if(!isliving(user) || !user.CanReach(parent))
return
- var/obj/item/I = locate() in real_location()
- if(!I)
+ if(locked)
+ to_chat(user, "[parent] seems to be locked!")
return
- remove_from_storage(I, get_turf(user))
- if(!user.put_in_hands(I))
- to_chat(user, "You fumble for [I] and it falls on the floor.")
+
+ var/atom/A = parent
+ if(!quickdraw)
+ A.add_fingerprint(user)
+ user_show_to_mob(user)
+ playsound(A, "rustle", 50, 1, -5)
+ return
+
+ if(!user.incapacitated())
+ var/obj/item/I = locate() in real_location()
+ if(!I)
+ return
+ A.add_fingerprint(user)
+ remove_from_storage(I, get_turf(user))
+ if(!user.put_in_hands(I))
+ to_chat(user, "You fumble for [I] and it falls on the floor.")
+ return
+ user.visible_message("[user] draws [I] from [parent]!", "You draw [I] from [parent].")
return
- user.visible_message("[user] draws [I] from [parent]!", "You draw [I] from [parent].")
/datum/component/storage/proc/action_trigger(datum/signal_source, datum/action/source)
gather_mode_switch(source.owner)
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 2187d61215..fad1c8e615 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -267,13 +267,13 @@
/datum/quirk/phobia
name = "Phobia"
- desc = "You've had a traumatic past, that has scared you for life while dealing with your greatest fear."
+ desc = "You've had a traumatic past, one that has scarred you for life, and cripples you when dealing with your greatest fears."
value = -2 // It can hardstun you. You can be a job that your phobia targets...
- gain_text = "You feel your fears manifest themselfs."
- lose_text = "You feel your fears fade away."
- medical_record_text = "Patient has an extreme or irrational fear of or aversion to something."
+ gain_text = "You begin to tremble as an immeasurable fear grips your mind."
+ lose_text = "Your confidence wipes away the fear that had been plaguing you."
+ medical_record_text = "Patient has an extreme or irrational fear and aversion to an undefined stimuli."
var/datum/brain_trauma/mild/phobia/phobia
-
+
/datum/quirk/phobia/add()
var/mob/living/carbon/human/H = quirk_holder
phobia = new
@@ -281,11 +281,11 @@
/datum/quirk/mute
name = "Mute"
- desc = "Do to some accident caused you or by choice you have no voice to be heard!"
+ desc = "Due to some accident, medical condition, or simply by choice, you are completely unable to speak."
value = -2 //HALP MAINTS
- gain_text = "I rather not say..."
- lose_text = "I can speak once more."
- medical_record_text = "Patient has an been unable to talk or use there voice."
+ gain_text = "You find yourself unable to speak!"
+ lose_text = "You feel a growing strength in your vocal chords."
+ medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity."
var/datum/brain_trauma/severe/mute
/datum/quirk/mute/add()
@@ -294,5 +294,5 @@
/datum/quirk/mute/on_process()
if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums))
- to_chat(quirk_holder, "Your antagonistic nature has caused your voice to be heard.")
+ to_chat(quirk_holder, "Your antagonistic nature has caused your voice to return.")
qdel(src)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index ba840d0771..e56f6d366c 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -622,8 +622,12 @@
else if(direction & WEST)
pixel_x_diff = -8
- animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(src, pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
+ var/matrix/OM = matrix(transform)
+ var/matrix/M = matrix(transform)
+ M.Turn(pixel_x_diff ? pixel_x_diff*2 : pick(-16, 16))
+
+ animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform = M, time = 2)
+ animate(src, pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform = OM, time = 2)
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
var/image/I
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 82315b8f35..795871d3b5 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -36,6 +36,7 @@ RLD
var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow."
var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays
var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states
+ var/custom_range = 7
/obj/item/construction/Initialize()
. = ..()
@@ -119,7 +120,7 @@ RLD
return .
/obj/item/construction/proc/range_check(atom/A, mob/user)
- if(!(A in view(7, get_turf(user))))
+ if(!(A in range(custom_range, get_turf(user))))
to_chat(user, "The \'Out of Range\' light on [src] blinks red.")
return FALSE
else
@@ -519,8 +520,9 @@ RLD
icon_state = "rld-5"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
- matter = 200
- max_matter = 200
+ matter = 500
+ max_matter = 500
+ sheetmultiplier = 16
var/mode = LIGHT_MODE
actions_types = list(/datum/action/item_action/pick_color)
@@ -531,7 +533,7 @@ RLD
var/walldelay = 10
var/floordelay = 10
- var/decondelay = 15
+ var/decondelay = 10
var/color_choice = null
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index d22ef23291..cbbd7a387a 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -35,6 +35,7 @@
/obj/item/flashlight/attack_self(mob/user)
on = !on
update_brightness(user)
+ playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index bf50e7546e..11d6f264b8 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -179,7 +179,7 @@
/obj/item/kitchen/knife/scimitar
name = "Scimitar knife"
- desc = "A knife used to cleanly butcher, its been modifed to be able to cut more meat then a normale knife. Do to the years of use its blade isnt as strong as it once was!"
+ desc = "A knife used to cleanly butcher. Its razor-sharp edge has been honed for butchering, but has been poorly maintained over the years."
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
/obj/item/kitchen/knife/scimiar/Initialize()
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 84351cdb95..b7e4e4131e 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -200,5 +200,9 @@
'sound/vore/prey/death_04.ogg','sound/vore/prey/death_05.ogg','sound/vore/prey/death_06.ogg',
'sound/vore/prey/death_07.ogg','sound/vore/prey/death_08.ogg','sound/vore/prey/death_09.ogg',
'sound/vore/prey/death_10.ogg')
+ if("clang")
+ soundin = pick('sound/effects/clang1.ogg', 'sound/effects/clang2.ogg')
+ if("clangsmall")
+ soundin = pick('sound/effects/clangsmall1.ogg', 'sound/effects/clangsmall2.ogg')
//END OF CIT CHANGES
return soundin
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index bcffd728c6..6297cadc63 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -84,6 +84,7 @@
icon = 'icons/turf/walls/riveted.dmi'
icon_state = "riveted"
smooth = SMOOTH_TRUE
+ explosion_block = INFINITY
/turf/closed/indestructible/riveted/uranium
icon = 'icons/turf/walls/uranium_wall.dmi'
diff --git a/code/game/world.dm b/code/game/world.dm
index e83a01e7f2..d8576206dd 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -263,7 +263,7 @@ GLOBAL_VAR(restart_counter)
s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link
s += ""
s += ")\]" //CIT CHANGE - encloses the server title in brackets to make the hub entry fancier
- s += "
That furry /TG/code server your mother warned you about.
" //CIT CHANGE - adds a tagline!
+ s += "
[CONFIG_GET(string/servertagline)]
" //CIT CHANGE - adds a tagline!
var/n = 0
for (var/mob/M in GLOB.player_list)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index bcb3752cbf..0a7b76cc79 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -650,7 +650,7 @@
if(0)
add_overlay(AALARM_OVERLAY_GREEN)
overlay_state = AALARM_OVERLAY_GREEN
- light_color = LIGHT_COLOR_BLUEGREEN
+ light_color = LIGHT_COLOR_PALEBLUE
set_light(brightness_on)
if(1)
add_overlay(AALARM_OVERLAY_WARN)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 587ba0c110..a23c57eab7 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1537,6 +1537,18 @@
crate_name = "janitor backpack crate"
crate_type = /obj/structure/closet/crate/secure
+/datum/supply_pack/service/advlighting
+ name = "Advanced Lighting crate"
+ desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!"
+ cost = 2500 //Fair
+ contains = list(/obj/item/construction/rld,
+ /obj/item/flashlight/lamp,
+ /obj/item/flashlight/lamp,
+ /obj/item/flashlight/lamp/green,
+ /obj/item/storage/box/lights/mixed)
+ crate_name = "advanced lighting crate"
+ crate_type = /obj/structure/closet/crate/secure
+
/datum/supply_pack/service/mule
name = "MULEbot Crate"
desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!"
@@ -1788,18 +1800,6 @@
crate_name = "hydroponics backpack crate"
crate_type = /obj/structure/closet/crate/secure
-/datum/supply_pack/organic/advlighting
- name = "Advanced Lighting crate"
- desc = "Thanks to advanced lighting tech we here at the Lamp Factor have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!"
- cost = 2500 //Fair
- contains = list(/obj/item/construction/rld,
- /obj/item/flashlight/lamp,
- /obj/item/flashlight/lamp,
- /obj/item/flashlight/lamp/green,
- /obj/item/storage/box/lights/mixed)
- crate_name = "advanced lighting crate"
- crate_type = /obj/structure/closet/crate/secure
-
/datum/supply_pack/organic/pizza
name = "Pizza Crate"
desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!"
diff --git a/code/modules/clothing/under/vg_under.dm b/code/modules/clothing/under/vg_under.dm
index 64bf75d5ac..f416f2ecc5 100644
--- a/code/modules/clothing/under/vg_under.dm
+++ b/code/modules/clothing/under/vg_under.dm
@@ -1,3 +1,6 @@
+// Fixed to work with Citadel code. Apparently none of them had NO_MUTANTRACE flags.
+// I was pissy when I realised how to fix this because it's so fucking easy and nobody apparently had done it.
+
/obj/item/clothing/under/stripper_pink
name = "pink stripper outfit"
icon_state = "stripper_p"
@@ -6,7 +9,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/stripper_green
name = "green stripper outfit"
@@ -16,8 +19,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/wedding/bride_orange
name = "orange wedding dress"
@@ -28,7 +30,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/wedding/bride_purple
name = "purple wedding dress"
@@ -39,7 +41,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/wedding/bride_blue
name = "blue wedding dress"
@@ -50,7 +52,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/wedding/bride_red
name = "red wedding dress"
@@ -61,7 +63,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/wedding/bride_white
name = "white wedding dress"
@@ -72,7 +74,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/mankini
name = "pink mankini"
@@ -82,6 +84,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/*
/obj/item/clothing/under/psysuit
@@ -126,7 +129,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/russobluecamooutfit
name = "russian blue camo"
@@ -137,7 +140,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/stilsuit
name = "stillsuit"
@@ -148,7 +151,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/aviatoruniform
name = "aviator uniform"
@@ -159,7 +162,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/bikersuit
name = "biker's outfit"
@@ -169,7 +172,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/jacketsuit
name = "richard's outfit"
@@ -180,7 +183,7 @@
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
obj/item/clothing/under/mega
name = "\improper DRN-001 suit"
@@ -191,7 +194,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/proto
name = "The Prototype Suit"
@@ -202,7 +205,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/megax
name = "\improper Maverick Hunter regalia"
@@ -213,7 +216,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/joe
name = "The Sniper Suit"
@@ -224,7 +227,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/roll
name = "\improper DRN-002 Dress"
@@ -235,7 +238,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/gokugidown
name = "turtle hermit undershirt"
@@ -246,7 +249,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/gokugi
name = "turtle hermit outfit"
@@ -257,7 +260,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/doomguy
name = "\improper Doomguy's pants"
@@ -268,7 +271,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/vault13
name = "vault 13 Jumpsuit"
@@ -279,7 +282,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/vault
name = "vault jumpsuit"
@@ -290,7 +293,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/clownpiece
name = "Clownpiece's Pierrot suit"
@@ -301,7 +304,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/cia
name = "casual IAA outfit"
@@ -312,7 +315,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/greaser
name = "greaser outfit"
@@ -322,7 +325,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/greaser/New()
var/greaser_colour = "default"
@@ -341,6 +344,8 @@ obj/item/clothing/under/mega
item_color = "greaser_[greaser_colour]"
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
/obj/item/clothing/under/wintercasualwear
name = "winter casualwear"
@@ -351,8 +356,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/casualwear
name = "spring casualwear"
@@ -363,7 +367,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/keyholesweater
name = "keyhole sweater"
@@ -374,7 +378,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/casualhoodie
name = "casual hoodie"
@@ -385,8 +389,7 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/casualhoodie/skirt
icon_state = "hoodieskirt"
@@ -394,6 +397,8 @@ obj/item/clothing/under/mega
item_color = "hoodieskirt"
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
/*
/obj/item/clothing/under/mummy_rags
name = "mummy rags"
@@ -427,3 +432,5 @@ obj/item/clothing/under/mega
can_adjust = 0
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index e33cfbd25d..a838b62e0d 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -18,7 +18,14 @@
"Your money can buy happiness!", \
"Engage direct marketing!", \
"Advertising is legalized lying! But don't let that put you off our great deals!", \
- "You don't want to buy anything? Yeah, well, I didn't want to buy your mom either.")
+ "You don't want to buy anything? Yeah, well, I didn't want to buy your mom either.",
+ "Gamers, rise up!",
+ "Ok, now, this is epic.",
+ "HUMAN FUNNY.",
+ "But I'm already tracer!",
+ "How do I vore people?",
+ "ERP?",
+ "Not epic bros...")
/datum/round_event/brand_intelligence/announce(fake)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index e3ca576944..1ea0068a1a 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -24,10 +24,7 @@
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
volume = 100
-
-/obj/item/reagent_containers/spray/weedspray/Initialize()
- . = ..()
- reagents.add_reagent("weedkiller", 100)
+ list_reagents = list("weedkiller" = 100)
/obj/item/reagent_containers/spray/weedspray/suicide_act(mob/user)
user.visible_message("[user] is huffing [src]! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -42,10 +39,7 @@
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
volume = 100
-
-/obj/item/reagent_containers/spray/pestspray/Initialize()
- . = ..()
- reagents.add_reagent("pestkiller", 100)
+ list_reagents = list("pestkiller" = 100)
/obj/item/reagent_containers/spray/pestspray/suicide_act(mob/user)
user.visible_message("[user] is huffing [src]! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -157,71 +151,45 @@
/obj/item/reagent_containers/glass/bottle/nutrient
name = "bottle of nutrient"
- icon = 'icons/obj/chemical.dmi'
volume = 50
- w_class = WEIGHT_CLASS_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
/obj/item/reagent_containers/glass/bottle/nutrient/Initialize()
. = ..()
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
/obj/item/reagent_containers/glass/bottle/nutrient/ez
name = "bottle of E-Z-Nutrient"
desc = "Contains a fertilizer that causes mild mutations with each harvest."
- icon = 'icons/obj/chemical.dmi'
-
-/obj/item/reagent_containers/glass/bottle/nutrient/ez/Initialize()
- . = ..()
- reagents.add_reagent("eznutriment", 50)
+ list_reagents = list("eznutriment" = 50)
/obj/item/reagent_containers/glass/bottle/nutrient/l4z
name = "bottle of Left 4 Zed"
desc = "Contains a fertilizer that limits plant yields to no more than one and causes significant mutations in plants."
- icon = 'icons/obj/chemical.dmi'
-
-/obj/item/reagent_containers/glass/bottle/nutrient/l4z/Initialize()
- . = ..()
- reagents.add_reagent("left4zednutriment", 50)
+ list_reagents = list("left4zednutriment" = 50)
/obj/item/reagent_containers/glass/bottle/nutrient/rh
name = "bottle of Robust Harvest"
desc = "Contains a fertilizer that increases the yield of a plant by 30% while causing no mutations."
- icon = 'icons/obj/chemical.dmi'
-
-/obj/item/reagent_containers/glass/bottle/nutrient/rh/Initialize()
- . = ..()
- reagents.add_reagent("robustharvestnutriment", 50)
+ list_reagents = list("robustharvestnutriment" = 50)
/obj/item/reagent_containers/glass/bottle/nutrient/empty
name = "bottle"
- icon = 'icons/obj/chemical.dmi'
/obj/item/reagent_containers/glass/bottle/killer
- name = "bottle"
- icon = 'icons/obj/chemical.dmi'
volume = 50
- w_class = WEIGHT_CLASS_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
/obj/item/reagent_containers/glass/bottle/killer/weedkiller
name = "bottle of weed killer"
desc = "Contains a herbicide."
- icon = 'icons/obj/chemical.dmi'
-
-/obj/item/reagent_containers/glass/bottle/killer/weedkiller/Initialize()
- . = ..()
- reagents.add_reagent("weedkiller", 50)
+ list_reagents = list("weedkiller" = 50)
/obj/item/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
- icon = 'icons/obj/chemical.dmi'
-
-/obj/item/reagent_containers/glass/bottle/killer/pestkiller/Initialize()
- . = ..()
- reagents.add_reagent("pestkiller", 50)
+ list_reagents = list("pestkiller" = 50)
\ No newline at end of file
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index e8a15d70ae..76b416772e 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -15,7 +15,6 @@
OB.brainmob = src
forceMove(OB)
-
/mob/living/brain/proc/create_dna()
stored_dna = new /datum/dna/stored(src)
if(!stored_dna.species)
@@ -28,6 +27,7 @@
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
if(mind) //You aren't allowed to return to brains that don't exist
mind.current = null
+ mind.active = FALSE //No one's using it anymore.
ghostize() //Ghostize checks for key so nothing else is necessary.
container = null
return ..()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 7bc0e281c5..ea13255dfe 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -188,6 +188,8 @@
if(thrown_thing)
visible_message("[src] has thrown [thrown_thing].")
src.log_message("has thrown [thrown_thing]", LOG_ATTACK)
+ do_attack_animation(target, no_effect = 1)
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1)
newtonian_move(get_dir(target, src))
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index f3f960c0ee..8e121dc809 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -65,7 +65,7 @@
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
- var/efficiency = 0.65
+ var/efficiency = 0.45
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 39cf924169..d57edf154d 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -115,7 +115,7 @@
/obj/item/ammo_casing/shotgun/dart/noreact
name = "cryostasis shotgun dart"
- desc = "A dart for use in shotguns, using similar technology as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical."
+ desc = "A dart for use in shotguns. Uses technology similar to cryostasis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical."
icon_state = "cnrshell"
reagent_amount = 10
reagent_react = FALSE
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 671e62a9e6..4e278d2ede 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -546,19 +546,14 @@
overdose_threshold = 45
addiction_threshold = 30
-/datum/reagent/medicine/ephedrine/on_mob_add(mob/living/L)
- ..()
- L.add_trait(TRAIT_GOTTAGOFAST, id)
-
-/datum/reagent/medicine/ephedrine/on_mob_delete(mob/living/L)
- L.remove_trait(TRAIT_GOTTAGOFAST, id)
- ..()
-
/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M)
M.AdjustStun(-20, 0)
M.AdjustKnockdown(-20, 0)
M.AdjustUnconscious(-20, 0)
- M.adjustStaminaLoss(-1*REM, 0)
+ M.adjustStaminaLoss(-4.5*REM, 0)
+ M.Jitter(10)
+ if(prob(50))
+ M.confused = max(M.confused, 1)
..()
return TRUE
diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm
index 6c269e44be..aed2310a7f 100644
--- a/code/modules/recycling/disposal/pipe.dm
+++ b/code/modules/recycling/disposal/pipe.dm
@@ -1,5 +1,7 @@
// Disposal pipes
+#define IFFY 2
+
/obj/structure/disposalpipe
name = "disposal pipe"
desc = "An underfloor disposal pipe."
@@ -16,6 +18,7 @@
var/dpdir = NONE // bitmask of pipe directions
var/initialize_dirs = NONE // bitflags of pipe directions added on init, see \code\_DEFINES\pipe_construction.dm
var/flip_type // If set, the pipe is flippable and becomes this type when flipped
+ var/canclank = FALSE // Determines if the pipe will cause a clank sound when holders pass by it. use the IFFY define for weird-ass edge cases like the segment subtype
var/obj/structure/disposalconstruct/stored
@@ -75,6 +78,8 @@
H.merge(H2)
H.forceMove(P)
+ if(P.canclank == TRUE || (P.canclank == IFFY && P.dpdir != 3 && P.dpdir != 12))
+ playsound(P, H.hasmob ? "clang" : "clangsmall", H.hasmob ? 50 : 25, 1)
return P
else // if wasn't a pipe, then they're now in our turf
H.forceMove(get_turf(src))
@@ -184,6 +189,7 @@
/obj/structure/disposalpipe/segment
icon_state = "pipe"
initialize_dirs = DISP_DIR_FLIP
+ canclank = IFFY
// A three-way junction with dir being the dominant direction
@@ -191,6 +197,7 @@
icon_state = "pipe-j1"
initialize_dirs = DISP_DIR_RIGHT | DISP_DIR_FLIP
flip_type = /obj/structure/disposalpipe/junction/flip
+ canclank = TRUE
// next direction to move
// if coming in from secondary dirs, then next is primary dir
@@ -229,6 +236,7 @@
//a trunk joining to a disposal bin or outlet on the same turf
/obj/structure/disposalpipe/trunk
icon_state = "pipe-t"
+ canclank = TRUE
var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet
/obj/structure/disposalpipe/trunk/Initialize()
@@ -299,3 +307,5 @@
/obj/structure/disposalpipe/broken/deconstruct()
qdel(src)
+
+#undef IFFY
diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm
index 5e26e9b767..d85c4bca78 100644
--- a/code/modules/recycling/disposal/pipe_sorting.dm
+++ b/code/modules/recycling/disposal/pipe_sorting.dm
@@ -5,6 +5,7 @@
desc = "An underfloor disposal pipe with a sorting mechanism."
icon_state = "pipe-j1s"
initialize_dirs = DISP_DIR_RIGHT | DISP_DIR_FLIP
+ canclank = TRUE
/obj/structure/disposalpipe/sorting/nextdir(obj/structure/disposalholder/H)
var/sortdir = dpdir & ~(dir | turn(dir, 180))
diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm
index e9db641811..552976824d 100644
--- a/code/modules/research/designs/electronics_designs.dm
+++ b/code/modules/research/designs/electronics_designs.dm
@@ -118,3 +118,16 @@
build_path = /obj/item/disk/integrated_circuit/upgrade/clone
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+//CIT ADDITIONS
+/datum/design/drone_shell
+ name = "Drone Shell"
+ desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs."
+ id = "drone_shell"
+ build_type = MECHFAB | PROTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 350)
+ construction_time = 150
+ build_path = /obj/item/drone_shell
+ category = list("Misc")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index fec2752a22..43b21771c5 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -265,7 +265,7 @@
display_name = "Basic Robotics Research"
description = "Programmable machines that make our lives lazier."
prereq_ids = list("base")
- design_ids = list("paicard")
+ design_ids = list("paicard", "drone_shell")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
export_price = 5000
diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm
index 0e64e0a367..9358d1652f 100644
--- a/code/modules/vending/engivend.dm
+++ b/code/modules/vending/engivend.dm
@@ -4,21 +4,28 @@
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access = list(ACCESS_ENGINE_EQUIP)
- products = list(/obj/item/clothing/glasses/meson/engine = 2,
- /obj/item/clothing/glasses/welding = 3,
- /obj/item/multitool = 4,
+ products = list(/obj/item/clothing/glasses/meson/engine = 5,
+ /obj/item/clothing/glasses/welding = 5,
+ /obj/item/multitool = 5,
/obj/item/construction/rcd/loaded = 3,
/obj/item/grenade/chem_grenade/smart_metal_foam = 10,
- /obj/item/geiger_counter = 5,
+ /obj/item/geiger_counter = 6,
/obj/item/stock_parts/cell/high = 10,
- /obj/item/electronics/airlock = 10,
+ /obj/item/electronics/airlock = 10,
/obj/item/electronics/apc = 10,
/obj/item/electronics/airalarm = 10,
/obj/item/electronics/firealarm = 10,
- /obj/item/electronics/firelock = 10
+ /obj/item/electronics/firelock = 10,
+ /obj/item/rcd_ammo = 3
)
- contraband = list(/obj/item/stock_parts/cell/potato = 3)
+ contraband = list(/obj/item/stock_parts/cell/potato = 3,
+ /obj/item/rcd_ammo = 2,
+ /obj/item/circuitboard/computer/slot_machine = 1,
+ /obj/item/tank/internals/emergency_oxygen/double = 3
+ )
premium = list(/obj/item/storage/belt/utility = 3,
- /obj/item/storage/box/smart_metal_foam = 1)
+ /obj/item/storage/box/smart_metal_foam = 3,
+ /obj/item/rcd_ammo/large = 5
+ )
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
diff --git a/config/config.txt b/config/config.txt
index 33bff862d9..3bc9f873a9 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -16,6 +16,9 @@ $include antag_rep.txt
## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice.
# SERVERNAME tgstation
+## Server tagline: This will appear right below the server's title.
+# SERVERTAGLINE A generic TG-based server
+
## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters.
# SERVERSQLNAME tgstation
diff --git a/html/changelogs/AutoChangeLog-pr-7912.yml b/html/changelogs/AutoChangeLog-pr-7912.yml
new file mode 100644
index 0000000000..834ad80091
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7912.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - server: "The server's tagline is now a config option. People can now stop confusing us with BR cit"
diff --git a/html/changelogs/AutoChangeLog-pr-7914.yml b/html/changelogs/AutoChangeLog-pr-7914.yml
new file mode 100644
index 0000000000..aac983d7ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7914.yml
@@ -0,0 +1,4 @@
+author: "Ghom"
+delete-after: True
+changes:
+ - code_imp: "minor clean up on hydroponics reagent containers."
diff --git a/html/changelogs/AutoChangeLog-pr-7916.yml b/html/changelogs/AutoChangeLog-pr-7916.yml
new file mode 100644
index 0000000000..888f327f72
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7916.yml
@@ -0,0 +1,4 @@
+author: "Skoglol"
+delete-after: True
+changes:
+ - rscadd: "You can now alt click storage (bags, boxes, etc) to open it."
diff --git a/html/changelogs/AutoChangeLog-pr-7918.yml b/html/changelogs/AutoChangeLog-pr-7918.yml
new file mode 100644
index 0000000000..b2340c2f67
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7918.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Attack animations will now rotate your character slightly, similar to Goon."
diff --git a/html/changelogs/AutoChangeLog-pr-7919.yml b/html/changelogs/AutoChangeLog-pr-7919.yml
new file mode 100644
index 0000000000..a62cc838c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7919.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Throwing items will now perform the attack animation and play a sound"
diff --git a/html/changelogs/AutoChangeLog-pr-7920.yml b/html/changelogs/AutoChangeLog-pr-7920.yml
new file mode 100644
index 0000000000..08b0ec1f13
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7920.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "flashlights will now make sounds when toggled on/off"
diff --git a/html/changelogs/AutoChangeLog-pr-7921.yml b/html/changelogs/AutoChangeLog-pr-7921.yml
new file mode 100644
index 0000000000..66a245257f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7921.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Things in disposals will now emit sounds every single time they hit corners. This increases immersion."
diff --git a/html/changelogs/AutoChangeLog-pr-7922.yml b/html/changelogs/AutoChangeLog-pr-7922.yml
new file mode 100644
index 0000000000..08f06d7053
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7922.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Air alarms now actually emit the proper light color when their status is okay."
diff --git a/html/changelogs/AutoChangeLog-pr-7923.yml b/html/changelogs/AutoChangeLog-pr-7923.yml
new file mode 100644
index 0000000000..5cf6527dad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7923.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Backpacks and other storage items will now jiggle and squish when you interact with them, similar to the animations seen on Goon."
diff --git a/html/changelogs/AutoChangeLog-pr-7930.yml b/html/changelogs/AutoChangeLog-pr-7930.yml
new file mode 100644
index 0000000000..221a2af942
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7930.yml
@@ -0,0 +1,4 @@
+author: "nicc"
+delete-after: True
+changes:
+ - balance: "teg less gay maybe"
diff --git a/modular_citadel/code/datums/components/souldeath.dm b/modular_citadel/code/datums/components/souldeath.dm
new file mode 100644
index 0000000000..5beddf3529
--- /dev/null
+++ b/modular_citadel/code/datums/components/souldeath.dm
@@ -0,0 +1,35 @@
+/datum/component/souldeath
+ var/mob/living/wearer
+ var/equip_slot
+ var/signal = FALSE
+
+/datum/component/souldeath/Initialize()
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/equip)
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/unequip)
+
+/datum/component/souldeath/proc/equip(datum/source, mob/living/equipper, slot)
+ if(!slot || equip_slot == slot)
+ wearer = equipper
+ RegisterSignal(wearer, COMSIG_MOB_DEATH, .proc/die, TRUE)
+ signal = TRUE
+ else
+ if(signal)
+ UnregisterSignal(wearer, COMSIG_MOB_DEATH)
+ signal = FALSE
+ return
+
+/datum/component/souldeath/proc/unequip()
+ UnregisterSignal(wearer, COMSIG_MOB_DEATH)
+ wearer = null
+ signal = FALSE
+
+/datum/component/souldeath/proc/die()
+ if(!wearer)
+ return //idfk
+ new/obj/effect/temp_visual/souldeath(wearer.loc, wearer)
+ playsound(wearer, 'modular_citadel/sound/misc/souldeath.ogg', 100, FALSE)
+
+/datum/component/souldeath/neck
+ equip_slot = SLOT_NECK
diff --git a/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm b/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm
new file mode 100644
index 0000000000..1ebf6fb2a6
--- /dev/null
+++ b/modular_citadel/code/game/objects/effects/temporary_visuals/souldeath.dm
@@ -0,0 +1,5 @@
+/obj/effect/temp_visual/souldeath
+ name = "soul death"
+ icon = 'modular_citadel/icons/effects/souldeath.dmi'
+ icon_state = "souldeath"
+ duration = 30
\ No newline at end of file
diff --git a/modular_citadel/code/modules/arousal/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm
index 587702762c..4b0a7ad919 100644
--- a/modular_citadel/code/modules/arousal/toys/dildos.dm
+++ b/modular_citadel/code/modules/arousal/toys/dildos.dm
@@ -1,7 +1,7 @@
//////////
//DILDOS//
//////////
-obj/item/dildo
+/obj/item/dildo
name = "dildo"
desc = "Floppy!"
icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
@@ -18,9 +18,10 @@ obj/item/dildo
var/random_color = TRUE
var/random_size = FALSE
var/random_shape = FALSE
+ var/is_knotted = FALSE
//Lists moved to _cit_helpers.dm as globals so they're not instanced individually
-obj/item/dildo/proc/update_appearance()
+/obj/item/dildo/proc/update_appearance()
icon_state = "[dildo_type]_[dildo_shape]_[dildo_size]"
var/sizeword = ""
switch(dildo_size)
@@ -35,7 +36,7 @@ obj/item/dildo/proc/update_appearance()
name = "[sizeword][dildo_shape] [can_customize ? "custom " : ""][dildo_type]"
-obj/item/dildo/AltClick(mob/living/user)
+/obj/item/dildo/AltClick(mob/living/user)
if(QDELETED(src))
return
if(!isliving(user))
@@ -46,7 +47,7 @@ obj/item/dildo/AltClick(mob/living/user)
return
customize(user)
-obj/item/dildo/proc/customize(mob/living/user)
+/obj/item/dildo/proc/customize(mob/living/user)
if(!can_customize)
return FALSE
if(src && !user.incapacitated() && in_range(user,src))
@@ -75,7 +76,7 @@ obj/item/dildo/proc/customize(mob/living/user)
update_appearance()
return TRUE
-obj/item/dildo/Initialize()
+/obj/item/dildo/Initialize()
. = ..()
if(random_color == TRUE)
var/randcolor = pick(GLOB.dildo_colors)
@@ -91,38 +92,41 @@ obj/item/dildo/Initialize()
pixel_y = rand(-7,7)
pixel_x = rand(-7,7)
-obj/item/dildo/examine(mob/user)
+/obj/item/dildo/examine(mob/user)
..()
if(can_customize)
user << "Alt-Click \the [src.name] to customize it."
-obj/item/dildo/random//totally random
+/obj/item/dildo/random//totally random
name = "random dildo"//this name will show up in vendors and shit so you know what you're vending(or don't, i guess :^))
random_color = TRUE
random_shape = TRUE
random_size = TRUE
-
-obj/item/dildo/knotted
+/obj/item/dildo/knotted
dildo_shape = "knotted"
name = "knotted dildo"
+ attack_verb = list("penetrated", "knotted", "slapped", "inseminated")
obj/item/dildo/human
dildo_shape = "human"
name = "human dildo"
+ attack_verb = list("penetrated", "slapped", "inseminated")
obj/item/dildo/plain
dildo_shape = "plain"
name = "plain dildo"
+ attack_verb = list("penetrated", "slapped", "inseminated")
obj/item/dildo/flared
dildo_shape = "flared"
name = "flared dildo"
+ attack_verb = list("penetrated", "slapped", "neighed", "gaped", "prolapsed", "inseminated")
obj/item/dildo/flared/huge
- name = "literal horse cock"
- desc = "THIS THING IS HUGE!"
- dildo_size = 4
+ name = "literal horse cock"
+ desc = "THIS THING IS HUGE!"
+ dildo_size = 4
obj/item/dildo/custom
name = "customizable dildo"
@@ -131,3 +135,30 @@ obj/item/dildo/custom
random_color = TRUE
random_shape = TRUE
random_size = TRUE
+
+// Suicide acts, by request
+
+/obj/item/dildo/proc/manual_suicide(mob/living/user)
+ user.visible_message("[user] finally finishes deepthroating the [src], and their life.")
+ user.adjustOxyLoss(200)
+ user.death(0)
+
+/obj/item/dildo/suicide_act(mob/living/user)
+// is_knotted = ((src.dildo_shape == "knotted")?"They swallowed the knot":"Their face is turning blue")
+ if(do_after(user,17,target=src))
+ user.visible_message("[user] tears-up and gags as they shove [src] down their throat! It looks like [user.p_theyre()] trying to commit suicide!")
+ playsound(loc, 'sound/weapons/gagging.ogg', 50, 1, -1)
+ user.Stun(150)
+ user.adjust_blurriness(8)
+ user.adjust_eye_damage(10)
+ return MANUAL_SUICIDE
+
+/obj/item/dildo/flared/huge/suicide_act(mob/living/user)
+ if(do_after(user,35,target=src))
+ user.visible_message("[user] tears-up and gags as they try to deepthroat the [src]! WHY WOULD THEY DO THAT? It looks like [user.p_theyre()] trying to commit suicide!!")
+ playsound(loc, 'sound/weapons/gagging.ogg', 50, 2, -1)
+ user.Stun(300)
+ user.adjust_blurriness(8)
+ user.adjust_eye_damage(15)
+ return MANUAL_SUICIDE
+
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index fac53fee5b..a3df7d9f8e 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -361,4 +361,10 @@ datum/gear/darksabresheath
name = "Mime's Overalls"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/under/mimeoveralls
- ckeywhitelist = list("pireamaineach")
\ No newline at end of file
+ ckeywhitelist = list("pireamaineach")
+
+/datum/gear/soulneck
+ name = "Soul Necklace"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/clothing/neck/undertale
+ ckeywhitelist = list("twilightic")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
index e5f58d4082..49eb089afa 100644
--- a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
+++ b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
@@ -1,8 +1,6 @@
/obj/item/clothing/glasses/phantomthief
name = "suspicious paper mask"
- desc = "A cheap, Syndicate-branded paper face mask with vision correction lens and flash proof! They'll never see it coming. This mask goes over your eyes."
- flash_protect = 1
- vision_correction = 1
+ desc = "A cheap, Syndicate-branded paper face mask. They'll never see it coming."
alternate_worn_icon = 'icons/mob/mask.dmi'
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "s-ninja"
@@ -14,7 +12,7 @@
/obj/item/clothing/glasses/phantomthief/syndicate
name = "suspicious plastic mask"
- desc = "A cheap, bulky, Syndicate-branded plastic face mask with vision correction lens and flash proof. You have to break in to break out. This mask goes over your eyes."
+ desc = "A cheap, bulky, Syndicate-branded plastic face mask. You have to break in to break out."
var/nextadrenalinepop
var/datum/component/redirect/combattoggle_redir
diff --git a/modular_citadel/code/modules/clothing/neck.dm b/modular_citadel/code/modules/clothing/neck.dm
new file mode 100644
index 0000000000..8d7d4747b7
--- /dev/null
+++ b/modular_citadel/code/modules/clothing/neck.dm
@@ -0,0 +1,23 @@
+/datum/action/item_action/zanderlocket
+ name = "Activate the locket"
+
+/obj/item/clothing/neck/undertale
+ name = "Sylphaen Heart Locket"
+ desc = "A heart shaped locket...The name: 'Zander Sylphaen is inscribed on the front. Something about this necklace fills you with determination."
+ icon = 'modular_citadel/icons/obj/clothing/cit_neck.dmi'
+ item_state = "undertale"
+ icon_state = "undertale"
+ alternate_worn_icon = 'modular_citadel/icons/mob/clothing/necks.dmi'
+ resistance_flags = FIRE_PROOF
+ actions_types = list(/datum/action/item_action/zanderlocket)
+ var/toggled = FALSE
+ var/obj/effect/heart/heart
+
+/datum/action/item_action/zanderlocket/Trigger()
+ new/obj/effect/temp_visual/souldeath(owner.loc, owner)
+ playsound(owner, 'modular_citadel/sound/misc/souldeath.ogg', 100, FALSE)
+
+
+/obj/item/clothing/neck/undertale/Initialize()
+ ..()
+ AddComponent(/datum/component/souldeath/neck)
diff --git a/modular_citadel/icons/effects/souldeath.dmi b/modular_citadel/icons/effects/souldeath.dmi
new file mode 100644
index 0000000000..f225bd5321
Binary files /dev/null and b/modular_citadel/icons/effects/souldeath.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/necks.dmi b/modular_citadel/icons/mob/clothing/necks.dmi
new file mode 100644
index 0000000000..65198bc64c
Binary files /dev/null and b/modular_citadel/icons/mob/clothing/necks.dmi differ
diff --git a/modular_citadel/icons/obj/clothing/cit_neck.dmi b/modular_citadel/icons/obj/clothing/cit_neck.dmi
index ce115c2aa7..abccd4a115 100644
Binary files a/modular_citadel/icons/obj/clothing/cit_neck.dmi and b/modular_citadel/icons/obj/clothing/cit_neck.dmi differ
diff --git a/modular_citadel/sound/misc/souldeath.ogg b/modular_citadel/sound/misc/souldeath.ogg
new file mode 100644
index 0000000000..98a19c0765
Binary files /dev/null and b/modular_citadel/sound/misc/souldeath.ogg differ
diff --git a/sound/effects/clang1.ogg b/sound/effects/clang1.ogg
new file mode 100644
index 0000000000..eef118e4d4
Binary files /dev/null and b/sound/effects/clang1.ogg differ
diff --git a/sound/effects/clang2.ogg b/sound/effects/clang2.ogg
new file mode 100644
index 0000000000..175fe98fd1
Binary files /dev/null and b/sound/effects/clang2.ogg differ
diff --git a/sound/effects/clangsmall1.ogg b/sound/effects/clangsmall1.ogg
new file mode 100644
index 0000000000..7824db66cf
Binary files /dev/null and b/sound/effects/clangsmall1.ogg differ
diff --git a/sound/effects/clangsmall2.ogg b/sound/effects/clangsmall2.ogg
new file mode 100644
index 0000000000..3211e66b75
Binary files /dev/null and b/sound/effects/clangsmall2.ogg differ
diff --git a/sound/weapons/gagging.ogg b/sound/weapons/gagging.ogg
new file mode 100644
index 0000000000..0b0a3783f4
Binary files /dev/null and b/sound/weapons/gagging.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index b17ba9363f..268d4f1ff9 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2772,6 +2772,7 @@
#include "modular_citadel\code\datums\uplink_items_cit.dm"
#include "modular_citadel\code\datums\components\material_container.dm"
#include "modular_citadel\code\datums\components\phantomthief.dm"
+#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm"
#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm"
#include "modular_citadel\code\datums\mood_events\moodular.dm"
@@ -2798,6 +2799,7 @@
#include "modular_citadel\code\game\objects\items.dm"
#include "modular_citadel\code\game\objects\tools.dm"
#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
@@ -2870,6 +2872,7 @@
#include "modular_citadel\code\modules\client\loadout\uniform.dm"
#include "modular_citadel\code\modules\client\verbs\who.dm"
#include "modular_citadel\code\modules\clothing\clothing.dm"
+#include "modular_citadel\code\modules\clothing\neck.dm"
#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm"
#include "modular_citadel\code\modules\clothing\head\head.dm"
#include "modular_citadel\code\modules\clothing\spacesuits\cydonian_armor.dm"