Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9e50981
notbananacannotpry (#12448)
cuberound Jun 21, 2026
a23eb58
Automatic changelog for PR #12448 [ci skip]
cmss13-ci[bot] Jun 21, 2026
b4baaa2
Optimize flamer fire spread (#11992)
noelle-lavenza Jun 21, 2026
3dc7108
Automatic changelog for PR #11992 [ci skip]
cmss13-ci[bot] Jun 21, 2026
39c44a5
Stops almayer crash breaking unbreakable APCs. (#12455)
realforest2001 Jun 22, 2026
1a8adc6
Automatic changelog for PR #12455 [ci skip]
cmss13-ci[bot] Jun 22, 2026
f37dede
Queen and hive backend (#12442)
realforest2001 Jun 22, 2026
58874a4
[TM v.1.3] Warrior "Bulwark" Strain. (Feedback link in description) (…
Venuska1117 Jun 22, 2026
8828cd5
Fix: Sunglasses dupe in loudout menu (#12478)
TheManWithNoHands Jun 22, 2026
d39cae5
twitch links migrate to cmdb (#12458)
hry-gh Jun 22, 2026
2fd2177
Fix: Corrected hazmat joe disturbances sound file (#12420)
BlitzArde Jun 22, 2026
da48692
Automatic changelog for PR #12442 [ci skip]
cmss13-ci[bot] Jun 22, 2026
42ec92e
Abomination prey items and cleaning of nulls. (#12441)
realforest2001 Jun 22, 2026
89de74f
Automatic changelog for PR #12441 [ci skip]
cmss13-ci[bot] Jun 22, 2026
9b66319
Automatic changelog for PR #10541 [ci skip]
cmss13-ci[bot] Jun 22, 2026
dc469e2
Fix custom smoke spawning runtime (#12472)
Drulikar Jun 22, 2026
dfd372f
Automatic changelog for PR #12472 [ci skip]
cmss13-ci[bot] Jun 22, 2026
dad0a25
Automatic changelog for PR #12478 [ci skip]
cmss13-ci[bot] Jun 22, 2026
3af90e5
Fixes a typo in the Tyrargo Rift announcements (#12471)
virtualgirlie Jun 22, 2026
13677ce
Automatic changelog for PR #12471 [ci skip]
cmss13-ci[bot] Jun 22, 2026
79d17fe
Automatic changelog for PR #12458 [ci skip]
cmss13-ci[bot] Jun 22, 2026
369b3bb
Automatic changelog compile [ci skip]
cmss13-ci[bot] Jun 22, 2026
f2473b6
FIX: Lets maintenance jacks open unpowered doors without Synth/Yautja…
Ammoniacres Jun 22, 2026
7ecc758
Automatic changelog for PR #12420 [ci skip]
cmss13-ci[bot] Jun 22, 2026
1638a7a
Automatic changelog for PR #12373 [ci skip]
cmss13-ci[bot] Jun 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions code/__DEFINES/conflict.dm
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
#define PROJECTILE_SHRAPNEL (1<<0)
/// Apply additional effects upon hitting clicked target
#define PROJECTILE_BULLSEYE (1<<1)
/// Reflected projectiles
#define PROJECTILE_REFLECTED (1<<2)

//Gun defines for gun related thing. More in the projectile folder.

Expand Down
9 changes: 9 additions & 0 deletions code/__DEFINES/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@
#define TRAIT_VALKYRIE_ARMORED "trait_valkyrie_armored"
/// Prevents mob from riding mobs when buckled onto something
#define TRAIT_CANT_RIDE "cant_ride"
/// Makes mob immune to dir lock slowdown.
#define TRAIT_NO_DIR_LOCK_SLOWDOWN "no_dir_lock_slowdown"

// SPECIES TRAITS
/// Knowledge of Yautja technology
Expand Down Expand Up @@ -265,6 +267,11 @@
#define TRAIT_ABILITY_BURROWED "t_ability_burrowed"
/// Xenos with this trait can toggle long sight while resting.
#define TRAIT_ABILITY_SIGHT_IGNORE_REST "t_ability_sight_ignore_rest"
/// Used by shielder to check stance.
#define TRAIT_ABILITY_ENCLOSED_PLATES "t_ability_enclosed_plates"
/// Used by shielder for reflective plates.
#define TRAIT_ABILITY_REFLECTIVE_PLATES "t_ability_reflective_plates"


//-- item traits --
// TOOL TRAITS
Expand Down Expand Up @@ -344,6 +351,8 @@ GLOBAL_LIST_INIT(mob_traits, list(
TRAIT_DEXTROUS,
TRAIT_REAGENT_SCANNER,
TRAIT_ABILITY_BURROWED,
TRAIT_ABILITY_ENCLOSED_PLATES,
TRAIT_ABILITY_REFLECTIVE_PLATES,
TRAIT_VULTURE_USER,
TRAIT_IN_TUTORIAL,
TRAIT_SPEC_KIT,
Expand Down
6 changes: 0 additions & 6 deletions code/__DEFINES/typecheck/items.dm
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
#define iswelder(O) (istype(O, /obj/item/tool/weldingtool))
#define iscoil(O) (istype(O, /obj/item/stack/cable_coil))
#define iswire(O) (istype(O, /obj/item/stack/cable_coil))
#define isweapon(O) (O && is_type_in_list(O, GLOB.weapons))
#define isgun(O) (istype(O, /obj/item/weapon/gun))
#define isbanana(O) (istype(O, /obj/item/reagent_container/food/snacks/grown/banana))
#define istool(O) (O && is_type_in_list(O, GLOB.common_tools))
#define ispowerclamp(O) (istype(O, /obj/item/powerloader_clamp))
#define isstorage(O) (istype(O, /obj/item/storage))
Expand All @@ -27,7 +25,3 @@ GLOBAL_LIST_INIT(common_tools, list(
/obj/item/device/multitool,
/obj/item/tool/crowbar
))

/obj/item/proc/can_pry()
if(pry_capable > IS_PRY_CAPABLE_SIMPLE || HAS_TRAIT(src, TRAIT_TOOL_CROWBAR))
return TRUE
6 changes: 6 additions & 0 deletions code/__DEFINES/xeno.dm
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,9 @@
// Lurker strain flags
#define LURKER_VAMPIRE "Vampire"

// Warrior strain flags
#define WARRIOR_BULWARK "Bulwark"

// Ravager strain flags
#define RAVAGER_HEDGEHOG "Hedgehog"
#define RAVAGER_BERSERKER "Berserker"
Expand Down Expand Up @@ -449,6 +452,7 @@

// Damage - this is applied as a flat nerf/buff to the xeno's average damage
#define XENO_DAMAGE_MOD_VERY_SMALL 5
#define XENO_DAMAGE_MOD_BULWARK 8
#define XENO_DAMAGE_MOD_SMALL 10
#define XENO_DAMAGE_MOD_MED 15
#define XENO_DAMAGE_MOD_LARGE 20
Expand Down Expand Up @@ -747,6 +751,8 @@
// dancer defines
#define DANCER_DODGE_TIME 7 SECONDS

// bulwark defines
#define BULWARK_REFLECTIVE_TIME 6 SECONDS

// drone fruits

Expand Down
4 changes: 2 additions & 2 deletions code/_onclick/adjacent.dm
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ Quick adjacency (to turf):
var/list/cur_dense_blockers = list()
for(var/atom/blocker in blockers["fd1"])
if(blocker.flags_barrier & HANDLE_BARRIER_CHANCE)
if(blocker.handle_barrier_chance())
if(blocker.handle_barrier_chance(attacker))
return blocker
else
guaranteed_hit = 1
Expand All @@ -282,7 +282,7 @@ Quick adjacency (to turf):

for(var/atom/blocker in blockers["fd2"])
if(blocker.flags_barrier & HANDLE_BARRIER_CHANCE)
if(blocker.handle_barrier_chance())
if(blocker.handle_barrier_chance(attacker))
return blocker
else
guaranteed_hit++
Expand Down
4 changes: 4 additions & 0 deletions code/_onclick/item_attack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@
if(isxeno(M))
var/mob/living/carbon/xenomorph/X = M
power = armor_damage_reduction(GLOB.xeno_melee, power, X.armor_deflection + X.armor_deflection_buff - X.armor_deflection_debuff, 20, 0, 0, X.armor_integrity)

if(X.melee_vulnerability_mult != 0)
power *= X.melee_vulnerability_mult

var/armor_punch = armor_break_calculation(GLOB.xeno_melee, power, X.armor_deflection + X.armor_deflection_buff - X.armor_deflection_debuff, 20, 0, 0, X.armor_integrity)
X.apply_armorbreak(armor_punch)
if(hitsound)
Expand Down
48 changes: 36 additions & 12 deletions code/controllers/subsystem/cmtv.dm
Original file line number Diff line number Diff line change
Expand Up @@ -484,27 +484,44 @@ SUBSYSTEM_DEF(cmtv)
camera_operator.view = "32x24"

/datum/controller/subsystem/cmtv/proc/is_subscriber(client/potential_subscriber)
if(!CONFIG_GET(string/cmtv_api) || !CONFIG_GET(string/cmtv_api_key))
return FALSE
var/static/lookup_cache = list()

var/cmtv_subscriber_api = CONFIG_GET(string/cmtv_subscriber_api)
var/cmtv_subscriber_api_key = CONFIG_GET(string/cmtv_subscriber_api_key)

WAIT_DB_READY
if(!CONFIG_GET(string/cmtv_api) || !CONFIG_GET(string/cmtv_api_key) || !cmtv_subscriber_api || !cmtv_subscriber_api_key)
return FALSE

UNTIL(initialized)

if(!potential_subscriber)
return FALSE

var/list/datum/view_record/twitch_link/links = DB_VIEW(/datum/view_record/twitch_link, DB_AND(
DB_COMP("ckey", DB_EQUALS, potential_subscriber.ckey),
DB_COMP("twitch_id", DB_ISNOT)
))
var/twitch_id = lookup_cache[potential_subscriber.ckey]
if(!twitch_id)
var/datum/http_request/request = new
request.prepare(RUSTG_HTTP_METHOD_GET, "[cmtv_subscriber_api]?ckey=[potential_subscriber.ckey]", null, list("Authorization" = "Bearer [cmtv_subscriber_api_key]"))
request.begin_async()

if(!length(links))
return FALSE
UNTIL(request.is_complete())

var/datum/http_response/response = request.into_response()

var/decoded
try
decoded = json_decode(response.body)
catch
log_debug("cmtv_subscriber_api returned an invalid response.")
return FALSE

twitch_id = decoded["twitch_id"]
if(!twitch_id)
return FALSE

for(var/datum/view_record/twitch_link/link as anything in links)
if(link.twitch_id in subscribers)
return TRUE
lookup_cache[potential_subscriber.ckey] = twitch_id

if(twitch_id in subscribers)
return TRUE

return FALSE

Expand Down Expand Up @@ -657,6 +674,13 @@ SUBSYSTEM_DEF(cmtv)
/datum/config_entry/string/cmtv_api_key
protection = CONFIG_ENTRY_HIDDEN | CONFIG_ENTRY_LOCKED

/datum/config_entry/string/cmtv_subscriber_api
protection = CONFIG_ENTRY_LOCKED

/datum/config_entry/string/cmtv_subscriber_api_key
protection = CONFIG_ENTRY_HIDDEN | CONFIG_ENTRY_LOCKED


/atom/movable/screen/cmtv
plane = ESCAPE_MENU_PLANE
clear_with_screen = FALSE
Expand Down
2 changes: 1 addition & 1 deletion code/controllers/subsystem/hijack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,7 @@ SUBSYSTEM_DEF(hijack)
var/cause_data = create_cause_data("ship explosion")
for(var/obj/structure/machinery/power/apc/apc as anything in apcs)
var/turf/apc_turf = get_turf(apc)
if(apc_turf && prob(chance))
if(apc_turf && apc.crash_break_probability && prob(chance))
cell_explosion(apc_turf, 30, 5, explosion_cause_data=cause_data, enviro=TRUE)
CHECK_TICK

Expand Down
7 changes: 7 additions & 0 deletions code/datums/ammo/bullet/shotgun.dm
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@
/datum/ammo/bullet/shotgun/buckshot/on_hit_mob(mob/M,obj/projectile/P)
knockback(M,P)

/datum/ammo/bullet/shotgun/buckshot/turret
flags_ammo_behavior = AMMO_NO_DEFLECT //New Exclusive ammo for shotgun turrets.
bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread/turret

//buckshot variant only used by the masterkey shotgun attachment.
/datum/ammo/bullet/shotgun/buckshot/masterkey
bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread/masterkey
Expand Down Expand Up @@ -238,6 +242,9 @@
/datum/ammo/bullet/shotgun/spread/masterkey
damage = 20

/datum/ammo/bullet/shotgun/spread/turret
flags_ammo_behavior = AMMO_NO_DEFLECT //New Exclusive buckshot pellets for shotgun turrets.

/*
8 GAUGE SHOTGUN AMMO
*/
Expand Down
2 changes: 1 addition & 1 deletion code/datums/ammo/bullet/special_ammo.dm
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@
/datum/ammo/bullet/turret
name = "autocannon bullet"
icon_state = "redbullet" //Red bullets to indicate friendly fire restriction
flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_COVER
flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_COVER|AMMO_NO_DEFLECT

accurate_range = 22
accuracy_var_low = PROJECTILE_VARIANCE_TIER_8
Expand Down
2 changes: 1 addition & 1 deletion code/datums/ammo/misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
landingsmoke = null

/datum/ammo/flamethrower/sentry_flamer
flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME
flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME|AMMO_NO_DEFLECT
flamer_reagent_id = "napalmx"

accuracy = HIT_ACCURACY_TIER_8
Expand Down
73 changes: 0 additions & 73 deletions code/datums/entities/twitch_link.dm

This file was deleted.

3 changes: 3 additions & 0 deletions code/game/atoms_movable.dm
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,9 @@
* Called from [/atom/movable/proc/keyLoop], this exists to be overwritten by living mobs with a check to see if we're actually alive enough to change directions
*/
/atom/movable/proc/keybind_face_direction(direction)
if(HAS_TRAIT(src, TRAIT_ABILITY_REFLECTIVE_PLATES))
if(!do_after(src, 3 DECISECONDS, INTERRUPT_INCAPACITATED, BUSY_ICON_GENERIC))
setDir(direction)
setDir(direction)

/atom/movable/proc/onTransitZ(old_z,new_z)
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/colonialmarines/colonialmarines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "Almayer, this is the Tyrargo Museum civilian evacuation site. We are under assault by a XX-121 cluster, but we are holding our own.\n\nWe have heavy XX-121 waves inbound from the north-east and are under heavy suppression, our evacuation craft are pinned by long range boiler strikes and the western city exits are too dangerous to move towards with ground based evacuation vehicles, we’re requesting you secure the western approach so you can suppress the enemy forces to allow civilian evacuation, over.", "Tyrargo Civilian Evac, 1st Air Cav Headquarters", 'sound/AI/commandreport.ogg'), 15 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(xeno_announcement), "Be on guard my children. I have sensed that the petrid sewers of this so called city could be flooded by the hosts at a moments notice if the hosts restore power to the area. The button to release this putrid water is found in the metal structure the hosts call the sewer treatement plant.", "everything", QUEEN_MOTHER_ANNOUNCE), 15 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "Attention: Analysis of city layout plans have identified a possible tactical advantage. A release valve can be triggered within the City Sewer Treatment Plant, this valve will flood the lower sewer tunnels with water, expunging a significant amount of xenobiological growth.\n\nHowever, this valve must be powered by repairing a special APC located within the underground power-substation, located east of the underground sewer treatment plant.", "ARES 3.2 Strategic Notice", 'sound/AI/commandreport.ogg'), 20 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "Almayer. We’re seeing increased XX-121 activity at the Tyrargo evac site. Additional strains are inbound from the north.\n\nEnemy Boiler’s have moved close enough to suppress our air support, we’re re-orienting the Longstreet tanks to cover our flanks. Requesting immediate suppression of enemy forces near our location via the western city entrance, over. ", "Tyrargo Civilian Evac, 1st Air Cav Headquarters", 'sound/AI/commandreport.ogg'), 35 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "Almayer. We’re seeing increased XX-121 activity at the Tyrargo evac site. Additional strains are inbound from the north.\n\nEnemy Boilers have moved close enough to suppress our air support, we’re re-orienting the Longstreet tanks to cover our flanks. Requesting immediate suppression of enemy forces near our location via the western city entrance, over. ", "Tyrargo Civilian Evac, 1st Air Cav Headquarters", 'sound/AI/commandreport.ogg'), 35 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "All elements, more XX-121 clusters are encroaching from our east. We’re under heavy attack from all quarters and have lost half of our Longstreet tank support to Crushers.\n\nWe’ve exhausted our HEAP munitions and have had to switch to soft-point munitions. We can’t take this for much longer, requesting urgent support from Almayer forces, over.", "Tyrargo Civilian Evac, 1st Air Cav Headquarters", 'sound/AI/commandreport.ogg'), 60 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "This is Tyrargo. The xenos have begun to encroach from our southern flank. We only have a single tank left. We’re withdrawing to the middle corridor and have relocated the civilians to the inner perimeter.\n\nSituation is dire, we’re getting wasted. We need that support, over.", "Tyrargo Civilian Evac, 1st Air Cav Headquarters", 'sound/AI/commandreport.ogg'), 80 MINUTES)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(marine_announcement), "All elements! This is the Tyrargo evac site, our situation is critical. The bugs have us surrounded on all fronts, our armoured support is destroyed and we’re now being pinned by enemy Ravagers.\n\nWe need urgent fire support, we can’t take it much longer.", "Tyrargo Civilian Evac, 1st Air Cav Headquarters", 'sound/AI/commandreport.ogg'), 100 MINUTES)
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/air_alarm.dm
Original file line number Diff line number Diff line change
Expand Up @@ -984,7 +984,7 @@ table tr:first-child th:first-child { border: none;}
return

if(1)
if(iscoil(W))
if(iswire(W))
var/obj/item/stack/cable_coil/C = W
if(C.use(5))
to_chat(user, SPAN_NOTICE("You wire \the [src]."))
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/colony_floodlights.dm
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ GLOBAL_LIST_INIT(all_breaker_switches, list())
to_chat(user, SPAN_WARNING("You need more welding fuel to complete this task."))
return TRUE

else if(iscoil(I))
else if(iswire(I))
var/obj/item/stack/cable_coil/coil = I
if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED))
to_chat(user, SPAN_WARNING("You have no clue how to repair [src]."))
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/constructable_frame.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
return
switch(state)
if(CONSTRUCTION_STATE_BEGIN)
if(iscoil(P))
if(iswire(P))
if(!skillcheck(user, SKILL_CONSTRUCTION, required_skill))
to_chat(user, SPAN_WARNING("You are not trained to build machines..."))
return
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/effects/effect_system/smoke.dm
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
src.time_to_live += rand(-1,1)

var/area/my_area = get_area(src)
if(my_area.flags_area & AREA_HEAVILY_VENTILATED)
if(my_area?.flags_area & AREA_HEAVILY_VENTILATED)
var/new_amount = rand(1,3)
src.time_to_live = min(new_amount, src.time_to_live)

Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/frames/camera.dm
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@

if(2)
// State 2
if(iscoil(W))
if(iswire(W))
var/obj/item/stack/cable_coil/C = W
if(C.use(2))
to_chat(user, SPAN_NOTICE("You add wires to the assembly."))
Expand Down
14 changes: 6 additions & 8 deletions code/game/objects/items/tools/maintenance_tools.dm
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,12 @@
if(attacked_door.locked) //Bolted
to_chat(user, SPAN_DANGER("You can't pry open [attacked_door] while it is bolted shut."))
return

if(!attacked_door.density && !attacked_door.arePowerSystemsOn()) //If its open and unpowered
attacked_door.close(TRUE)
return
if(attacked_door.density && !attacked_door.arePowerSystemsOn()) // if its closed and unpowered
attacked_door.open(TRUE)
return
if(requires_superstrength_pry)
if(!HAS_TRAIT(user, TRAIT_SUPER_STRONG)) //basically IS_PRY_CAPABLE_CROWBAR
return
Expand All @@ -600,15 +605,8 @@
return
if(user.action_busy)
return
if(!attacked_door.density && !attacked_door.arePowerSystemsOn()) //If its open and unpowered
attacked_door.close(TRUE)
return
if(attacked_door.density && !attacked_door.arePowerSystemsOn()) // if its closed and unpowered
attacked_door.open(TRUE)
return
if(!attacked_door.density) //If its open
return

user.visible_message(SPAN_DANGER("[user] jams [src] into [attacked_door] and starts to pry it open."),
SPAN_DANGER("You jam [src] into [attacked_door] and start to pry it open."))
playsound(src, "pry", 15, TRUE)
Expand Down
Loading
Loading