diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index d738e5aa1f63..93ceb912480b 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -462,6 +462,10 @@
#define COMPONENT_BLOCK_DEFIB (1<<0)
/// If returned, don't even show the "failed" message, defer to the signal handler to do that.
#define COMPONENT_DEFIB_OVERRIDE (1<<1)
+ /// If returned, allow to revive through false death.
+ #define COMPONENT_DEFIB_FAKEDEATH_ACCEPTED (1<<2)
+ /// If returned, make the fake death look like a unresponsive ghost.
+ #define COMPONENT_DEFIB_FAKEDEATH_DENIED (1<<3)
///send from defibs on ressurection: (defibber, defib_item, ghost)
#define COMSIG_LIVING_DEFIBBED "living_defibbed"
///from base of mob/living/revive() (full_heal, admin_revive)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 174ecddda53c..f4efafba1488 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -79,7 +79,10 @@
var/datum/gear/G = geartype
var/use_category = initial(G.sort_category)
-
+ // SS220 EDIT - START
+ if(G.removed_from_loadout)
+ continue
+ // SS220 EDIT - END
if(G == initial(G.main_typepath))
continue
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 76c4c5e978f9..b27f15a7ce77 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -870,3 +870,58 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
if(!istype(usr))
return
living_owner.do_succumb(TRUE)
+
+/atom/movable/screen/alert/changeling_defib_revive
+ name = "Your heart is being defibrillated."
+ desc = "Click this status to be revived from fake death."
+ icon_state = "template"
+ timeout = 10 SECONDS
+ var/do_we_revive = FALSE
+ var/image/toggle_overlay
+
+/atom/movable/screen/alert/changeling_defib_revive/Initialize(mapload, parent_unit)
+ . = ..()
+ var/image/defib_appearance = image(parent_unit)
+ defib_appearance.layer = FLOAT_LAYER
+ defib_appearance.plane = FLOAT_PLANE
+ overlays += defib_appearance
+
+/atom/movable/screen/alert/changeling_defib_revive/attach_owner(mob/new_owner)
+ . = ..()
+ RegisterSignal(owner, COMSIG_LIVING_DEFIBBED, PROC_REF(on_defib_revive))
+
+/atom/movable/screen/alert/changeling_defib_revive/Destroy()
+ if(owner)
+ UnregisterSignal(owner, COMSIG_LIVING_DEFIBBED)
+ if(toggle_overlay)
+ overlays -= toggle_overlay
+ qdel(toggle_overlay)
+ return ..()
+
+/atom/movable/screen/alert/changeling_defib_revive/Click()
+ if(!..())
+ return
+ do_we_revive = !do_we_revive
+ if(!toggle_overlay)
+ toggle_overlay = image('icons/mob/screen_gen.dmi', icon_state = "selector")
+ toggle_overlay.layer = FLOAT_LAYER
+ toggle_overlay.plane = FLOAT_PLANE + 2
+ if(do_we_revive)
+ overlays |= toggle_overlay
+ else
+ overlays -= toggle_overlay
+
+/atom/movable/screen/alert/changeling_defib_revive/proc/on_defib_revive()
+ . = COMPONENT_DEFIB_FAKEDEATH_DENIED
+ if(do_we_revive)
+ var/datum/antagonist/changeling/cling = owner.mind.has_antag_datum(/datum/antagonist/changeling)
+ cling.remove_specific_power(/datum/action/changeling/revive)
+ cling.regenerating = FALSE
+ var/heart_name = "heart"
+ if(iscarbon(owner))
+ var/mob/living/carbon/C = owner
+ var/datum/organ/heart/heart = C.get_int_organ_datum(ORGAN_DATUM_HEART)
+ heart_name = heart.linked_organ.name
+ to_chat(owner, "Electricity flows through our [heart_name]! We have been brought back to life and have stopped our regeneration.")
+ . = COMPONENT_DEFIB_FAKEDEATH_ACCEPTED
+ owner.clear_alert("cling_defib")
diff --git a/code/datums/components/defibrillator.dm b/code/datums/components/defibrillator.dm
index ff1020e5eca5..fd51de84560c 100644
--- a/code/datums/components/defibrillator.dm
+++ b/code/datums/components/defibrillator.dm
@@ -173,6 +173,11 @@
to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
SEND_SOUND(ghost, sound('sound/effects/genetics.ogg'))
+ else if(HAS_TRAIT_FROM(target, TRAIT_FAKEDEATH, CHANGELING_TRAIT))
+ to_chat(target, "Your heart is being defibrillated. Click the defibrillator status to be revived!")
+ window_flash(target.client)
+ SEND_SOUND(target, sound('sound/effects/genetics.ogg'))
+ target.throw_alert("cling_defib", /atom/movable/screen/alert/changeling_defib_revive, alert_args = list(parent, target))
if(!do_after(user, 3 SECONDS * speed_multiplier, target = target)) // Beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
busy = FALSE
@@ -238,37 +243,39 @@
playsound(get_turf(defib_ref), 'sound/machines/defib_zap.ogg', 50, 1, -1)
ghost = target.get_ghost(TRUE) // We have to double check whether the dead guy has entered their body during the above
- var/defib_success = TRUE
-
// Run through some quick failure states after shocking.
var/time_dead = world.time - target.timeofdeath
+ var/failure_message
if(!target.is_revivable())
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.")
- defib_success = FALSE
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation."
else if(target.getBruteLoss() >= 180 || target.getFireLoss() >= 180)
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - Severe tissue damage detected.")
- defib_success = FALSE
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - Severe tissue damage detected."
else if(HAS_TRAIT(target, TRAIT_HUSK))
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - Subject is husked.")
- defib_success = FALSE
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - Subject is husked."
else if(target.blood_volume < BLOOD_VOLUME_SURVIVE)
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - Patient blood volume critically low.")
- defib_success = FALSE
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - Patient blood volume critically low."
else if(!target.get_organ_slot("brain")) // So things like headless clings don't get outed
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - No brain detected within patient.")
- defib_success = FALSE
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - No brain detected within patient."
else if(ghost)
if(!ghost.can_reenter_corpse || target.suiciding) // DNR or AntagHUD
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - No electrical brain activity detected.")
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - No electrical brain activity detected."
+ else
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - Patient's brain is unresponsive. Further attempts may succeed."
+ else if(HAS_TRAIT(target, TRAIT_FAKEDEATH))
+ if(signal_result & COMPONENT_DEFIB_FAKEDEATH_DENIED)
+ failure_message = "[defib_ref] buzzes: Resuscitation failed - Patient's brain is unresponsive. Further attempts may succeed."
+ else if(signal_result & COMPONENT_DEFIB_FAKEDEATH_ACCEPTED)
+ // as much as I hate that this is here, it has to come after the `Patient is not in a valid state. Operation aborted.` check.
+ REMOVE_TRAIT(target, TRAIT_FAKEDEATH, CHANGELING_TRAIT)
else
- user.visible_message("[defib_ref] buzzes: Resuscitation failed - Patient's brain is unresponsive. Further attempts may succeed.")
- defib_success = FALSE
- else if((signal_result & COMPONENT_BLOCK_DEFIB) || HAS_TRAIT(target, TRAIT_FAKEDEATH) || HAS_TRAIT(target, TRAIT_BADDNA) || target.suiciding) // these are a bit more arbitrary
- user.visible_message("[defib_ref] buzzes: Resuscitation failed.")
- defib_success = FALSE
+ failure_message = "[defib_ref] buzzes: Resuscitation failed." // has a fakedeath like capulettium
+
+ else if((signal_result & COMPONENT_BLOCK_DEFIB) || HAS_TRAIT(target, TRAIT_BADDNA) || target.suiciding) // these are a bit more arbitrary
+ failure_message = "[defib_ref] buzzes: Resuscitation failed."
- if(!defib_success)
+ if(failure_message)
+ user.visible_message(failure_message)
playsound(get_turf(defib_ref), 'sound/machines/defib_failed.ogg', 50, 0)
else
// Heal each basic damage type by as much as we're under -100 health
@@ -313,7 +320,7 @@
target.med_hud_set_status()
add_attack_logs(user, target, "Revived with [defib_ref]")
SSblackbox.record_feedback("tally", "players_revived", 1, "defibrillator")
- SEND_SIGNAL(parent, COMSIG_DEFIB_SHOCK_APPLIED, user, target, should_cause_harm, defib_success)
+ SEND_SIGNAL(parent, COMSIG_DEFIB_SHOCK_APPLIED, user, target, should_cause_harm, isnull(failure_message))
set_cooldown(cooldown)
busy = FALSE
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index d0497157ea7b..441278e98b98 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -178,6 +178,8 @@
SSticker.mode.remove_revolutionary(brain.brainmob.mind, 1)
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain)
+ // Stop holding onto the laws so we don't qdel them and make the AI randomly lose its laws when GC gives up and hard deletes them.
+ laws = null
if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
A.rename_self("ИИ", 1)
SSblackbox.record_feedback("amount", "ais_created", 1)
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index 5c7c1254b8d6..c744bca02c36 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -23,7 +23,6 @@
/obj/effect/particle_effect/sparks/New()
..()
- flick("sparks", src) // replay the animation
playsound(src, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
var/turf/T = loc
if(isturf(T))
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index 786aaa072a21..239833432627 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -501,23 +501,16 @@
Anti-Plague Sequence Beta
- 1 unit of blood containing zombie plague cured by Anti-Plague Sequence Alpha
- - 2 random chemicals from the list below, 1 unit of each (Unknown Random Recipe)
+
- 3 random chemicals from the list below, 1 unit of each (Unknown Random Recipe)
- - Yellow Vomit
- - Jenkem
- - Charcoal
- - Egg
- Saline-Glucose Solution
- Toxin
- Atropine
- Lye
- - Sulphuric acid
- - Fluorosulfuric Acid
- Soda Water
- - Surge
- - Ultra-Lube
- Happiness
- Morphine
+ - Teporone
@@ -527,17 +520,33 @@
1 unit of blood containing zombie plague cured by Anti-Plague Sequence Beta
1 unit of blood containing an advanced virus with the "Necrotizing Fasciitis" symptom
3 random chemicals from the list below, 1 unit of each (Unknown Random Recipe)
+
+ - Yellow Vomit
+ - Jenkem
+ - Charcoal
+ - Egg
+ - Sulphuric acid
+ - Fluorosulfuric Acid
+ - Surge
+ - Ultra-Lube
+ - Mitocholide
+
+
+
+
+ Anti-Plague Sequence Omega
+
+ - 1 unit of blood containing zombie plague cured by Anti-Plague Sequence Gamma
+ - 1 unit of blood containing an advanced virus with the "Anti-Bodies Metabolism" symptom
+ - 2 of the chemicals from the list below, 1 unit of each (Unknown Random Recipe)
- Colorful Reagent
- Bacchus' Blessing
- Pentetic Acid
- - Teporone
- Glyphosate
- Lazarus Reagent
- Omnizine
- Sarin
- - Mitocholide
- - Fliptonium
- Ants
- Chlorine Trifluoride
- Sorium
@@ -547,24 +556,6 @@
- Anti-Plague Sequence Omega
-
- - 1 unit of blood containing zombie plague cured by Anti-Plague Sequence Gamma
- - 1 unit of blood containing an advanced virus with the "Anti-Bodies Metabolism" symptom
- - 2 of the chemicals from the list below, 1 unit of each (Unknown Random Recipe)
-
- - Entropic Polypnium
- - Tinea Luxor
- - earthsblood
- - Bath Salts
- - Rezadone
- - Rotatium
- - Krokodil
- - Fliptonium
-
-
-
-
Anti-Plague Sequence Duplication
- 1 unit of any Anti-Plague Sequence
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 8bdaae79ec5b..88037967d20e 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -257,7 +257,6 @@
icon = 'icons/turf/floors/catwalk_floor.dmi'
icon_state = "catwalk"
base_icon_state = "catwalk"
- baseturf = /turf/simulated/floor/plating
floor_tile = /obj/item/stack/tile/catwalk
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CATWALK, SMOOTH_GROUP_SIMULATED_TURFS)
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index b5d08685e4e3..15fba006b055 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -24,7 +24,7 @@
var/req_stat = CONSCIOUS
/// If this power is active or not. Used for toggleable abilities.
var/active = FALSE
- /// If this power can be used while the changeling has the `TRAIT_FAKE_DEATH` trait.
+ /// If this power can be used while the changeling has the `TRAIT_FAKEDEATH` trait.
var/bypass_fake_death = FALSE
/*
diff --git a/code/modules/antagonists/changeling/datum_changeling.dm b/code/modules/antagonists/changeling/datum_changeling.dm
index 7bf0ba0da107..8d3870249113 100644
--- a/code/modules/antagonists/changeling/datum_changeling.dm
+++ b/code/modules/antagonists/changeling/datum_changeling.dm
@@ -277,6 +277,22 @@ RESTRICT_TYPE(/datum/antagonist/changeling)
acquired_powers += power
power.on_purchase(changeling || owner.current, src)
+/**
+ * Removes all `power_type` abilities that the changeling has. Refunds the cost of the power from our genetic points.
+ *
+ * Arugments:
+ * * datum/action/changeling/power - the typepath power to remove from the changeling.
+ * * refund_cost - if we should refund genetic points when giving the power
+ */
+/datum/antagonist/changeling/proc/remove_specific_power(datum/action/changeling/power_type, refund_cost = TRUE)
+ for(var/datum/action/changeling/power in acquired_powers)
+ if(!istype(power, power_type))
+ continue
+ if(refund_cost)
+ genetic_points -= power.dna_cost
+ acquired_powers -= power
+ qdel(power)
+
/**
* Store the languages from the `new_languages` list into the `absorbed_languages` list. Teaches the changeling the new languages.
*
diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm
index d826b4712e77..2ffddd180ad5 100644
--- a/code/modules/antagonists/changeling/powers/fakedeath.dm
+++ b/code/modules/antagonists/changeling/powers/fakedeath.dm
@@ -18,11 +18,14 @@
user.updatehealth("fakedeath sting")
cling.regenerating = TRUE
+ cling.remove_specific_power(/datum/action/changeling/revive)
addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), user), CHANGELING_FAKEDEATH_TIME)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]"))
return TRUE
/datum/action/changeling/fakedeath/proc/ready_to_regenerate(mob/user)
+ if(!HAS_TRAIT_FROM(user, TRAIT_FAKEDEATH, CHANGELING_TRAIT))
+ return
if(!QDELETED(user) && user.mind && cling?.acquired_powers)
to_chat(user, "We are ready to regenerate.")
cling.give_power(new /datum/action/changeling/revive)
diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm
index 20e4c7933302..2ed3b19acfc5 100644
--- a/code/modules/antagonists/changeling/powers/revive.dm
+++ b/code/modules/antagonists/changeling/powers/revive.dm
@@ -11,6 +11,10 @@
if(HAS_TRAIT(user, TRAIT_UNREVIVABLE))
to_chat(user, "Something is preventing us from regenerating, we will need to revive at another point.")
return FALSE
+ if(!HAS_TRAIT_FROM(user, TRAIT_FAKEDEATH, CHANGELING_TRAIT))
+ cling.acquired_powers -= src
+ Remove(user)
+ return
REMOVE_TRAIT(user, TRAIT_FAKEDEATH, CHANGELING_TRAIT)
for(var/obj/item/grab/G in user.grabbed_by)
var/mob/living/carbon/M = G.assailant
diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm
index 864887d2e95f..7bcd626a0434 100644
--- a/code/modules/client/preference/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference/loadout/loadout_accessories.dm
@@ -175,6 +175,14 @@
display_name = "Corset, blue"
path = /obj/item/clothing/accessory/corset/blue
+/datum/gear/accessory/nt_pin
+ display_name = "Nanotrasen pin"
+ path = /obj/item/clothing/accessory/pin
+
+/datum/gear/accessory/pride_pin
+ display_name = "Pride pin"
+ path = /obj/item/clothing/accessory/pin/pride
+
/datum/gear/accessory/armband_red
display_name = "Armband"
path = /obj/item/clothing/accessory/armband
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 89f0e6176831..4f206609ee82 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -833,6 +833,56 @@
item_state = "corset_blue"
item_color = "corset_blue"
+//Pins
+/obj/item/clothing/accessory/pin
+ name = "nanotrasen pin"
+ desc = "It's a standard pin to wear so you can show your loyalty to Nanotrasen!"
+ icon_state = "nt_pin"
+ item_state = "nt_pin"
+ item_color = "nt_pin"
+
+/obj/item/clothing/accessory/pin/pride
+ name = "pride pin"
+ desc = "It's a standard pin, wear it with pride. You can change which flag is used from a button on the back."
+ icon_state = "pride_pin"
+ item_state = "pride_pin"
+ item_color = "pride_pin"
+
+ ///List of all pride flags to icon state
+ var/static/list/flag_types = list(
+ "Pride" = "pride_pin",
+ "Bisexual Pride" = "bi_pin",
+ "Pansexual Pride" = "pan_pin",
+ "Asexual Pride" = "ace_pin",
+ "Non-binary Pride" = "enby_pin",
+ "Transgender Pride" = "trans_pin")
+
+ ///List of all pride flags to icon image, for the radial
+ var/static/list/flag_icons = list()
+
+/obj/item/clothing/accessory/pin/pride/Initialize(mapload)
+ . = ..()
+ if(length(flag_icons)) //Only generate it once
+ return
+
+ for(var/current_pin in flag_types) //generate the flag icons
+ var/image/pin_icon = image(icon, icon_state = flag_types[current_pin])
+ flag_icons[current_pin] = pin_icon
+
+/obj/item/clothing/accessory/pin/pride/attack_self(mob/user)
+ . = ..()
+ var/chosen_pin = show_radial_menu(user, src, flag_icons, require_near = TRUE)
+ if(!chosen_pin)
+ to_chat(user, "You decide not to change [src].")
+ return
+ var/pin_icon_state = flag_types[chosen_pin]
+ to_chat(user, "You change [src] to show [chosen_pin].")
+
+ icon_state = pin_icon_state
+ item_state = pin_icon_state
+ item_color = pin_icon_state
+ inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[item_color? "[item_color]" : "[icon_state]"]")
+
/proc/english_accessory_list(obj/item/clothing/under/U)
if(!istype(U) || !length(U.accessories))
return
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 8b6d4f1cad34..a04d70958469 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -306,10 +306,11 @@
holder.obj_integrity = holder.max_integrity
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
+ . = expected_damage
+ if(!I)
+ return
if(!I.sharp)
- . = expected_damage * 0.5
- else
- . = expected_damage
+ return expected_damage * 0.5
/datum/spacevine_mutation/flowering
name = "flowering"
diff --git a/code/modules/hydroponics/grown/misc_seeds.dm b/code/modules/hydroponics/grown/misc_seeds.dm
index 459a81d3a2e5..99ed6c86ef7a 100644
--- a/code/modules/hydroponics/grown/misc_seeds.dm
+++ b/code/modules/hydroponics/grown/misc_seeds.dm
@@ -139,7 +139,7 @@
// Gatfruit
/obj/item/seeds/gatfruit
name = "pack of gatfruit seeds"
- desc = "These seeds grow into .357 revolvers."
+ desc = "These seeds grow into pea-shooting guns."
icon_state = "seed-gatfruit"
species = "gatfruit"
plantname = "Gatfruit Tree"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 099d24c5e85e..077b6e1037be 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -12,7 +12,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/populate_contents()
- var/loot = rand(1, 23)
+ var/loot = rand(1, 24)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 7a29e37406a3..9aaae3f32957 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -143,7 +143,7 @@ Difficulty: Medium
return ..()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc)
- if(dashing || (newloc && newloc.z == z && (islava(newloc) || ischasm(newloc)))) //we're not stupid!
+ if(dashing) //we're not stupid!
return FALSE
return ..()
diff --git a/code/modules/mob/mob_misc_procs.dm b/code/modules/mob/mob_misc_procs.dm
index 208c389d4dee..02ce69b9215d 100644
--- a/code/modules/mob/mob_misc_procs.dm
+++ b/code/modules/mob/mob_misc_procs.dm
@@ -593,7 +593,7 @@
name = newname
if(mind)
mind.name = newname
- if(mind?.initial_account?.account_name == oldname)
+ if(!isnull(oldname) && mind?.initial_account?.account_name == oldname)
mind.initial_account.account_name = newname
if(dna)
dna.real_name = real_name
diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
index d17931f95775..341453b7ca1e 100644
--- a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
@@ -29,7 +29,10 @@
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
-
+ // SS220 EDIT - START
+ if(D.removed_from_loadout)
+ continue
+ // SS220 EDIT - END
if(D.name)
if(D.fluff)
full_list[D.name] = D
@@ -433,6 +436,31 @@
/datum/sprite_accessory/undershirt/brightblue_striped
name = "Striped Bright Blue Shirt"
icon_state = "shirt_brightbluestripe"
+
+/datum/sprite_accessory/undershirt/shirt_trans
+ name = "Transgender Shirt"
+ icon_state = "shirt_trans"
+
+/datum/sprite_accessory/undershirt/shirt_nonbinary
+ name = "Nonbinary Shirt"
+ icon_state = "shirt_nonbinary"
+
+/datum/sprite_accessory/undershirt/shirt_bisexual
+ name = "Bisexual Shirt"
+ icon_state = "shirt_bisexual"
+
+/datum/sprite_accessory/undershirt/shirt_pansexual
+ name = "Pansexual Shirt"
+ icon_state = "shirt_pansexual"
+
+/datum/sprite_accessory/undershirt/shirt_asexual
+ name = "Asexual Shirt"
+ icon_state = "shirt_asexual"
+
+/datum/sprite_accessory/undershirt/shirt_rainbow
+ name = "Rainbow Shirt"
+ icon_state = "shirt_rainbow"
+
//end graphic shirts
//short sleeved
diff --git a/icons/_nanomaps/CereStation_nanomap_z1.png b/icons/_nanomaps/CereStation_nanomap_z1.png
index b658416659d9..0ada918c4b77 100644
Binary files a/icons/_nanomaps/CereStation_nanomap_z1.png and b/icons/_nanomaps/CereStation_nanomap_z1.png differ
diff --git a/icons/_nanomaps/MetaStation_nanomap_z1.png b/icons/_nanomaps/MetaStation_nanomap_z1.png
index 64537561c013..0781b77ec475 100644
Binary files a/icons/_nanomaps/MetaStation_nanomap_z1.png and b/icons/_nanomaps/MetaStation_nanomap_z1.png differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 3bfa99bbd58e..fdd1ef381216 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/clothing/species/grey/underwear.dmi b/icons/mob/clothing/species/grey/underwear.dmi
index c3c1b5816519..3817eb074483 100644
Binary files a/icons/mob/clothing/species/grey/underwear.dmi and b/icons/mob/clothing/species/grey/underwear.dmi differ
diff --git a/icons/mob/clothing/species/kidan/underwear.dmi b/icons/mob/clothing/species/kidan/underwear.dmi
index fef359356846..2f36a4930a54 100644
Binary files a/icons/mob/clothing/species/kidan/underwear.dmi and b/icons/mob/clothing/species/kidan/underwear.dmi differ
diff --git a/icons/mob/clothing/species/vox/underwear.dmi b/icons/mob/clothing/species/vox/underwear.dmi
index b4f741194e14..16a6fa77f72c 100644
Binary files a/icons/mob/clothing/species/vox/underwear.dmi and b/icons/mob/clothing/species/vox/underwear.dmi differ
diff --git a/icons/mob/clothing/underwear.dmi b/icons/mob/clothing/underwear.dmi
index d92444ed99ff..db642a94bfa8 100644
Binary files a/icons/mob/clothing/underwear.dmi and b/icons/mob/clothing/underwear.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index 091dbe3d1384..b7ebb3c83be6 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index bfa8ecb6cf81..749cd04f7edc 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi
index 0351b908a2f3..d233ebc4643a 100644
Binary files a/icons/obj/clothing/ties_overlay.dmi and b/icons/obj/clothing/ties_overlay.dmi differ
diff --git a/modular_ss220/loadout/_loadout.dme b/modular_ss220/loadout/_loadout.dme
index 0f4bc51cc5c2..30d0a57f7cba 100644
--- a/modular_ss220/loadout/_loadout.dme
+++ b/modular_ss220/loadout/_loadout.dme
@@ -1,6 +1,7 @@
#include "_loadout.dm"
#include "code/donor.dm"
+#include "code/donor_items.dm"
+#include "code/removal.dm"
#include "code/shoes.dm"
#include "code/suit.dm"
-#include "code/donor_items.dm"
diff --git a/modular_ss220/loadout/code/removal.dm b/modular_ss220/loadout/code/removal.dm
new file mode 100644
index 000000000000..342a9012f2b7
--- /dev/null
+++ b/modular_ss220/loadout/code/removal.dm
@@ -0,0 +1,32 @@
+/* Loadout items */
+/datum/gear
+ /// If true, then modulary removes item from lodaout
+ var/removed_from_loadout = FALSE
+
+// Accessories
+/datum/gear/accessory/pride_pin
+ removed_from_loadout = TRUE
+
+/* On-mob accessories */
+/datum/sprite_accessory
+ /// If true, then modulary removes item from lodaout
+ var/removed_from_loadout = FALSE
+
+// Undershirts
+/datum/sprite_accessory/undershirt/shirt_trans
+ removed_from_loadout = TRUE
+
+/datum/sprite_accessory/undershirt/shirt_nonbinary
+ removed_from_loadout = TRUE
+
+/datum/sprite_accessory/undershirt/shirt_bisexual
+ removed_from_loadout = TRUE
+
+/datum/sprite_accessory/undershirt/shirt_pansexual
+ removed_from_loadout = TRUE
+
+/datum/sprite_accessory/undershirt/shirt_asexual
+ removed_from_loadout = TRUE
+
+/datum/sprite_accessory/undershirt/shirt_rainbow
+ removed_from_loadout = TRUE