diff --git a/code/__DEFINES/conflict.dm b/code/__DEFINES/conflict.dm
index 17fd8b32c2..3ca67934fe 100644
--- a/code/__DEFINES/conflict.dm
+++ b/code/__DEFINES/conflict.dm
@@ -249,7 +249,8 @@
#define HEALTH_WALL_XENO_REFLECTIVE 300
#define HEALTH_WALL_XENO_MEMBRANE_THICK 600
-#define HEALTH_DOOR 1200
+#define HEALTH_DOOR 2400
+#define HEALTH_ASSEMBLY 400
#define HEALTH_DOOR_XENO 600
#define HEALTH_DOOR_XENO_THICK 900
diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm
index 0eac48fb29..7acb343207 100644
--- a/code/__DEFINES/job.dm
+++ b/code/__DEFINES/job.dm
@@ -19,9 +19,9 @@
// Job name defines
#define JOB_SQUAD_MARINE "Rifleman"
-#define JOB_SQUAD_LEADER "Platoon Sergeant"
+#define JOB_SQUAD_LEADER "Section Sergeant"
#define JOB_SQUAD_ENGI "Combat Technician"
-#define JOB_SQUAD_MEDIC "Platoon Corpsman"
+#define JOB_SQUAD_MEDIC "Corpsman"
#define JOB_SQUAD_SPECIALIST "Weapons Specialist"
#define JOB_SQUAD_TEAM_LEADER "Squad Sergeant"
#define JOB_SQUAD_SMARTGUN "Smartgunner"
diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm
index 7e30291260..67e2c709aa 100644
--- a/code/__DEFINES/xeno.dm
+++ b/code/__DEFINES/xeno.dm
@@ -36,8 +36,9 @@
#define XENO_HITS_TO_DESTROY_WINDOW_FRAME 3
#define XENO_HITS_TO_DESTROY_R_WINDOW_FRAME 5
#define XENO_HITS_TO_DESTROY_BOLTED_DOOR 10
-#define XENO_HITS_TO_DESTROY_DOOR 10
-#define XENO_HITS_TO_DESTROY_WELDED_DOOR 15
+#define XENO_HITS_TO_DESTROY_DOOR 12
+#define XENO_HITS_TO_DESTROY_WELDED_DOOR 20
+#define XENO_HITS_TO_DESTROY_AIRLOCK_ASSEMBLY 2
#define XENO_HITS_TO_EXPOSE_WIRES_MIN 3
#define XENO_HITS_TO_EXPOSE_WIRES_MAX 4
#define XENO_HITS_TO_CUT_WIRES 10
diff --git a/code/game/blood.dm b/code/game/blood.dm
index 9628bfec54..27e7eaa0cc 100644
--- a/code/game/blood.dm
+++ b/code/game/blood.dm
@@ -37,6 +37,9 @@
blood_overlay.color = b_color
/mob/living/carbon/human/add_blood(b_color = "#830303", blood_flags = BLOOD_ALL)
+ if(b_color == BLOOD_COLOR_XENO || b_color == BLOOD_COLOR_XENO_ROYAL)
+ return FALSE
+
if(blood_flags & BLOOD_BODY)
if(wear_suit)
wear_suit.add_blood(b_color)
diff --git a/code/game/jobs/job/marine/squad/leader.dm b/code/game/jobs/job/marine/squad/leader.dm
index e856164f87..12078873dc 100644
--- a/code/game/jobs/job/marine/squad/leader.dm
+++ b/code/game/jobs/job/marine/squad/leader.dm
@@ -10,7 +10,7 @@
flags_startup_parameters = ROLE_ADD_TO_DEFAULT|ROLE_ADD_TO_SQUAD
gear_preset = /datum/equipment_preset/uscm/leader
gear_preset_secondary = /datum/equipment_preset/uscm/leader/lesser_rank
- entry_message_body = "You are responsible for the men and women of your entire platoon. Make sure they are on task, working together, and communicating. You are also in charge of communicating with command and letting them know about the situation first hand. Keep out of harm's way.
You remember that you've stored your personal gear and uniform are located in the dorm or locker rooms."
+ entry_message_body = "You are responsible for the men and women of your entire section. Make sure they are on task, working together, and communicating. You are also in charge of communicating with command and letting them know about the situation first hand. Keep out of harm's way.
You remember that you've stored your personal gear and uniform are located in the dorm or locker rooms."
job_options = list(GYSGT_VARIANT = "GYSGT", SSGT_VARIANT = "SSGT")
diff --git a/code/game/jobs/job/marine/squad/medic.dm b/code/game/jobs/job/marine/squad/medic.dm
index e6e8e4764b..66972b32a2 100644
--- a/code/game/jobs/job/marine/squad/medic.dm
+++ b/code/game/jobs/job/marine/squad/medic.dm
@@ -10,7 +10,7 @@
flags_startup_parameters = ROLE_ADD_TO_DEFAULT|ROLE_ADD_TO_SQUAD
gear_preset = /datum/equipment_preset/uscm/medic
gear_preset_secondary = /datum/equipment_preset/uscm/medic/lesser_rank
- entry_message_body = "You tend the wounds of your squad mates and make sure they are healthy and active. You may not be a fully-fledged doctor, but you stand between life and death when it matters.
You remember that you've stored your personal gear and uniform are located in your medical office."
+ entry_message_body = "You tend the wounds of your fellow Marines and make sure they are healthy and active. You may not be a fully-fledged doctor, but you stand between life and death when it matters.
You remember that you've stored your personal gear and uniform are located in your medical office."
job_options = list(CPL_VARIANT = "CPL", LCPL_VARIANT = "LCPL")
diff --git a/code/game/jobs/job/marine/squad/tl.dm b/code/game/jobs/job/marine/squad/tl.dm
index d074dfd182..b2934b7b3c 100644
--- a/code/game/jobs/job/marine/squad/tl.dm
+++ b/code/game/jobs/job/marine/squad/tl.dm
@@ -8,7 +8,7 @@
allow_additional = 1
flags_startup_parameters = ROLE_ADD_TO_DEFAULT|ROLE_ADD_TO_SQUAD
gear_preset = /datum/equipment_preset/uscm/tl
- entry_message_body = "You are the Squad Leader. Your task is leading the designated squad and utilize available ordnance. If the platoon leader dies, you are expected to lead in their place.
You remember that you've stored your personal gear and uniform are located in the dorm or locker rooms."
+ entry_message_body = "You are the Squad Leader. Your task is leading the designated squad and utilize available ordnance. If the section sergeant dies, you are expected to lead in their place.
You remember that you've stored your personal gear and uniform are located in the dorm or locker rooms."
job_options = list(SGT_VARIANT = "SGT")
diff --git a/code/game/jobs/job/marine/squad_info.dm b/code/game/jobs/job/marine/squad_info.dm
index e7cfcc9d25..96138709f6 100644
--- a/code/game/jobs/job/marine/squad_info.dm
+++ b/code/game/jobs/job/marine/squad_info.dm
@@ -13,7 +13,7 @@
update_all_squad_info()
if(squad_info_data["total_mar"] != count) //updates for new marines
update_free_mar()
- if(squad_leader && squad_info_data["pltsgt"]["name"] != squad_leader.real_name)
+ if(squad_leader && squad_info_data["sctsgt"]["name"] != squad_leader.real_name)
update_squad_leader()
var/list/data = squad_info_data.Copy()
data["squad"] = name
@@ -29,7 +29,7 @@
/datum/squad/proc/get_leadership(mob/user)
var/mob/living/carbon/human/H = user
if (squad_leader && H.name == squad_leader.name)
- return "pltsgt"
+ return "sctsgt"
else
for(var/fireteam in fireteams)
var/mob/living/carbon/human/ftl = fireteam_leaders[fireteam]
@@ -58,7 +58,7 @@
var/target_marine = params["target_marine"]
var/target_team = params["target_ft"]
- if (islead != "pltsgt")
+ if (islead != "sctsgt")
return
var/mob/living/carbon/human/target = get_marine_from_name(target_marine)
@@ -72,7 +72,7 @@
if ("unassign_ft")
var/target_marine = params["target_marine"]
- if (islead != "pltsgt")
+ if (islead != "sctsgt")
return
var/mob/living/carbon/human/target = get_marine_from_name(target_marine)
@@ -85,7 +85,7 @@
if ("demote_ftl")
var/target_team = params["target_ft"]
- if (islead != "pltsgt")
+ if (islead != "sctsgt")
return
unassign_ft_leader(target_team, FALSE, TRUE)
@@ -96,7 +96,7 @@
var/target_marine = params["target_marine"]
var/target_team = params["target_ft"]
- if (islead != "pltsgt")
+ if (islead != "sctsgt")
return
var/mob/living/carbon/human/target = get_marine_from_name(target_marine)
@@ -108,7 +108,7 @@
//used once on first opening
/datum/squad/proc/update_all_squad_info()
- squad_info_data["pltsgt"] = list()
+ squad_info_data["sctsgt"] = list()
update_squad_leader()
squad_info_data["fireteams"] = list()
var/i = 1
@@ -120,14 +120,14 @@
squad_info_data["mar_free"] = list()
update_free_mar()
-//pltsgt update. Should always be paired up with FT or free marines update
+//sctsgt update. Should always be paired up with FT or free marines update
/datum/squad/proc/update_squad_leader()
var/obj/item/card/id/ID = null
if(squad_leader)
ID = squad_leader.get_idcard()
- squad_info_data["pltsgt"]["name"] = squad_leader ? squad_leader.real_name : "None"
- squad_info_data["pltsgt"]["refer"] = squad_leader ? "\ref[squad_leader]" : null
- squad_info_data["pltsgt"]["paygrade"] = ID ? get_paygrades(ID.paygrade, 1) : ""
+ squad_info_data["sctsgt"]["name"] = squad_leader ? squad_leader.real_name : "None"
+ squad_info_data["sctsgt"]["refer"] = squad_leader ? "\ref[squad_leader]" : null
+ squad_info_data["sctsgt"]["paygrade"] = ID ? get_paygrades(ID.paygrade, 1) : ""
//fireteam and TL update
/datum/squad/proc/update_fireteam(team)
@@ -173,7 +173,7 @@
if(JOB_SQUAD_TEAM_LEADER)
rank = "SqSgt"
if(JOB_SQUAD_LEADER)
- rank = "PltSgt"
+ rank = "SctSgt"
if(JOB_SQUAD_RTO)
rank = "RTO"
else
@@ -252,7 +252,7 @@
if(JOB_SQUAD_TEAM_LEADER)
rank = "SqSgt"
if(JOB_SQUAD_LEADER)
- rank = "PltSgt"
+ rank = "SctSgt"
if(JOB_SQUAD_RTO)
rank = "RTO"
else
@@ -301,7 +301,7 @@
if(JOB_SQUAD_TEAM_LEADER)
rank = "SqSgt"
if(JOB_SQUAD_LEADER)
- rank = "PltSgt"
+ rank = "SctSgt"
if(JOB_SQUAD_RTO)
rank = "RTO"
else
diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm
index 230c3df1d7..ab76d72d49 100644
--- a/code/game/jobs/job/marine/squads.dm
+++ b/code/game/jobs/job/marine/squads.dm
@@ -11,8 +11,8 @@
var/sub_leader
/datum/squad_type/marine_squad
- name = "Platoon"
- lead_name = "Platoon Sergeant"
+ name = "Section"
+ lead_name = "Section Sergeant"
lead_icon = "leader"
sub_squad = "Squad"
sub_leader = "Squad Sergeant"
@@ -701,7 +701,7 @@
old_lead.comm_title = "SG"
if(JOB_SQUAD_LEADER)
if(!leader_killed)
- old_lead.comm_title = "PltSgt"
+ old_lead.comm_title = "SctSgt"
if(JOB_SQUAD_RTO)
old_lead.comm_title = "RTO"
if(JOB_MARINE_RAIDER)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 9ac9765371..72a9a81132 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -133,12 +133,14 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list(
/obj/structure/machinery/door/airlock/deconstruct(disassembled = TRUE)
if(!disassembled)
if(width == 1)
+ new /obj/structure/airlock_assembly(loc)
new /obj/item/stack/rods(loc)
new /obj/item/stack/cable_coil/cut(loc)
new /obj/effect/spawner/gibspawner/robot(loc)
new /obj/effect/decal/cleanable/blood/oil(loc)
else // big airlock, big debris
for(var/turf/DT in locs) // locs = covered by airlock bounding box
+ new /obj/structure/airlock_assembly(DT)
new /obj/item/stack/rods(DT)
new /obj/item/stack/cable_coil/cut(DT)
new /obj/effect/spawner/gibspawner/robot(DT)
diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm
index 192bca6323..afad714977 100644
--- a/code/game/machinery/doors/multi_tile.dm
+++ b/code/game/machinery/doors/multi_tile.dm
@@ -1,7 +1,7 @@
//Terribly sorry for the code doubling, but things go derpy otherwise.
/obj/structure/machinery/door/airlock/multi_tile
width = 2
- damage_cap = 650 // Bigger = more endurable
+ damage_cap = 2600 // Bigger = more endurable
assembly_type = /obj/structure/airlock_assembly/multi_tile
/obj/structure/machinery/door/airlock/multi_tile/close() //Nasty as hell O(n^2) code but unfortunately necessary
diff --git a/code/game/objects/effects/decals/cleanable/blood/blood.dm b/code/game/objects/effects/decals/cleanable/blood/blood.dm
index 9fd5e79965..bbf7725b75 100644
--- a/code/game/objects/effects/decals/cleanable/blood/blood.dm
+++ b/code/game/objects/effects/decals/cleanable/blood/blood.dm
@@ -48,7 +48,8 @@
// can make footprints
if(!amount || !ishuman(AM))
return
-
+ if(basecolor == BLOOD_COLOR_XENO || basecolor == BLOOD_COLOR_XENO_ROYAL)
+ return FALSE
if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_BLOOD_OPTIMIZATION))
return
diff --git a/code/game/objects/structures/airlock_assembly.dm b/code/game/objects/structures/airlock_assembly.dm
index 01fca4a687..819c7f4a8b 100644
--- a/code/game/objects/structures/airlock_assembly.dm
+++ b/code/game/objects/structures/airlock_assembly.dm
@@ -13,7 +13,7 @@
name = "airlock assembly"
icon = 'icons/obj/structures/doors/airlock_assembly.dmi'
icon_state = "door_as_0"
- anchored = FALSE
+ anchored = TRUE
density = TRUE
var/state = STATE_STANDARD
var/base_icon_state = ""
@@ -22,9 +22,63 @@
var/airlock_type = "generic" //the type path of the airlock once completed
var/glass = AIRLOCK_NOGLASS // see defines
var/created_name = null
+
+ var/damage = 0 //This should let marines destroy Assemblies spawned by destroyed airlocks now
+ var/damage_cap = HEALTH_ASSEMBLY // Assembly gets destroyed
/// Used for multitile assemblies
var/width = 1
+/obj/structure/airlock_assembly/proc/take_damage(dam, mob/M)
+ if(!dam || unacidable)
+ return FALSE
+
+ damage = max(0, damage + dam)
+
+ if(damage >= damage_cap)
+ if(M && istype(M))
+ SEND_SIGNAL(M, COMSIG_MOB_DESTROY_AIRLOCK, src)
+ to_chat(loc, SPAN_DANGER("[src] blows apart!"))
+ deconstruct(FALSE)
+ playsound(src, 'sound/effects/metal_crash.ogg', 25, 1)
+ return TRUE
+
+/obj/structure/airlock_assembly/ex_act(severity, explosion_direction, datum/cause_data/cause_data)
+ var/exp_damage = severity * EXPLOSION_DAMAGE_MULTIPLIER_DOOR
+ var/location = get_turf(src)
+ if(!density)
+ exp_damage *= EXPLOSION_DAMAGE_MODIFIER_DOOR_OPEN
+ if(take_damage(exp_damage)) // destroyed by explosion, shards go flying
+ create_shrapnel(location, rand(2,5), explosion_direction, , /datum/ammo/bullet/shrapnel/light, cause_data)
+
+/obj/structure/airlock_assembly/get_explosion_resistance()
+ if(density)
+ if(unacidable)
+ return 1000000
+ else
+ return (damage_cap-damage)/EXPLOSION_DAMAGE_MULTIPLIER_DOOR //this should exactly match the amount of damage needed to destroy the door
+ else
+ return FALSE
+
+/obj/structure/airlock_assembly/bullet_act(obj/projectile/P)
+ bullet_ping(P)
+ if(P.damage)
+ if(P.ammo.flags_ammo_behavior & AMMO_ROCKET)
+ take_damage(P.damage * 4, P.firer) // rockets wreck airlocks
+ return TRUE
+ else
+ take_damage(P.damage, P.firer)
+ return TRUE
+ return FALSE
+
+/obj/structure/airlock_assembly/handle_tail_stab(mob/living/carbon/xenomorph/xeno)
+
+ playsound(src, 'sound/effects/metalhit.ogg', 50, TRUE)
+ xeno.visible_message(SPAN_XENOWARNING("\The [xeno] strikes \the [src] with its tail!"), SPAN_XENOWARNING("You strike \the [src] with your tail!"))
+ xeno.emote("tail")
+ var/damage = xeno.melee_damage_upper * TAILSTAB_AIRLOCK_DAMAGE_MULTIPLIER
+ take_damage(damage, xeno)
+ return TAILSTAB_COOLDOWN_NORMAL
+
/obj/structure/airlock_assembly/Initialize(mapload, ...)
. = ..()
update_icon()
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index cc033e53a6..c950195a63 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -259,7 +259,7 @@
list("SG", "hudsquad_gun"),
list("Spc", "hudsquad_spec"),
list("SqSgt", "hudsquad_tl"),
- list("PltSgt", "hudsquad_leader"),
+ list("SctSgt", "hudsquad_leader"),
list("RTO", "hudsquad_rto"),
)
diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm
index 540685505f..b45f82f1e0 100644
--- a/code/modules/gear_presets/uscm.dm
+++ b/code/modules/gear_presets/uscm.dm
@@ -495,13 +495,13 @@
//*****************************************************************************************************/
/datum/equipment_preset/uscm/leader
- name = "USCM Platoon Sergeant"
+ name = "USCM Section Sergeant"
flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP)
assignment = JOB_SQUAD_LEADER
rank = JOB_SQUAD_LEADER
paygrades = list(PAY_SHORT_ME7 = JOB_PLAYTIME_TIER_0)
- role_comm_title = "PltSgt"
+ role_comm_title = "SctSgt"
minimum_age = 27
skills = /datum/skills/SL
@@ -605,14 +605,14 @@
//*****************************************************************************************************/
/datum/equipment_preset/uscm/leader_equipped
- name = "USCM Platoon Sergeant (Equipped)"
+ name = "USCM Section Sergeant (Equipped)"
flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP)
assignment = JOB_SQUAD_LEADER
rank = JOB_SQUAD_LEADER
paygrades = list(PAY_SHORT_ME7 = JOB_PLAYTIME_TIER_0)
- role_comm_title = "PltSgt"
+ role_comm_title = "SctSgt"
minimum_age = 27
skills = /datum/skills/SL
diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
index 6e7dea372a..a7a8402cfd 100644
--- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
+++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
@@ -692,6 +692,25 @@
SPAN_DANGER("We [M.slash_verb] \the [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
return XENO_ATTACK_ACTION
+//This SHOULD, if I did it right, have xenos target assemblies finally please god let me have done it right
+/obj/structure/airlock_assembly/attack_alien(mob/living/carbon/xenomorph/M)
+ if(unslashable || health <= 0 && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS))
+ to_chat(M, SPAN_WARNING("We stare at \the [src] cluelessly."))
+ return XENO_NO_DELAY_ACTION
+
+ M.animation_attack_on(src)
+ playsound(src, 'sound/effects/metalhit.ogg', 25, 1)
+ update_health(rand(M.melee_damage_lower, M.melee_damage_upper) * M.melee_sentry_damage_multiplier)
+ if(health <= 0)
+ M.visible_message(SPAN_DANGER("[M] slices \the [src] apart!"), \
+ SPAN_DANGER("We slice \the [src] apart!"), null, 5, CHAT_TYPE_XENO_COMBAT)
+ if(!unacidable)
+ qdel(src)
+ else
+ M.visible_message(SPAN_DANGER("[M] [M.slashes_verb] \the [src]!"), \
+ SPAN_DANGER("We [M.slash_verb] \the [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
+ return XENO_ATTACK_ACTION
+
// Destroying reagent dispensers
/obj/structure/reagent_dispensers/attack_alien(mob/living/carbon/xenomorph/M)
if(unslashable || health <= 0 && !HAS_TRAIT(usr, TRAIT_OPPOSABLE_THUMBS))
diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
index 9627ac60c0..7868049642 100644
--- a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
@@ -122,6 +122,19 @@ At bare minimum, make sure the relevant checks from parent types gets copied in
return DOOR_PENALTY
+////////////////////////////////////////
+// AIRLOCK ASSEMBLIES //
+////////////////////////////////////////
+
+/obj/structure/airlock_assembly/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target)
+ . = ..()
+ if(!.)
+ return
+
+ if(isfacehugger(X))
+ return -1 // We LOVE going under doors!
+
+ return DOOR_PENALTY
/////////////////////////////
// TABLES //
diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml
index 57eaeafb7c..4d8ca4dd5f 100644
--- a/html/changelogs/archive/2024-10.yml
+++ b/html/changelogs/archive/2024-10.yml
@@ -62,3 +62,14 @@
CN Mortar does less direct explosive damage.
- rscdel: Removed old "CN-20 Missile" reference from FS menu that shouldn't be in
the missiles menu
+2024-10-31:
+ GriffinMan4455:
+ - rscadd: Made destroyed airlocks spawn an airlock assembly on the tiles they cover,
+ this includes both Airlocks and Multitiles.
+ - balance: Airlocks have much more damage_cap, meaning it takes more rounds from
+ a marine to kill them, Xeno damage unchanged.
+ Max-023:
+ - qol: Platoon Sergeant is now called Section Sergeant
+ - qol: Squad Sergeant description now references the Section Sergeant properly
+ - spellcheck: Fixed a typo in the corpsman description that implies they are part
+ of a squad, not a section or platoon.