diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 1df5e34238..8862fc9fcc 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -24657,6 +24657,12 @@
},
/turf/open/space,
/area/solars/starboard)
+"beW" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"beY" = (
/obj/machinery/camera{
c_tag = "Arrivals Central";
@@ -40367,15 +40373,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/binary/pump{
+/obj/machinery/atmospherics/components/binary/pump/on{
dir = 8;
- name = "Mix to Ports"
- },
-/turf/open/floor/plasteel,
-/area/engineering/atmos)
-"bNk" = (
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
+ name = "Unfiltered to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -40384,8 +40384,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Unfiltered & Air to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -40821,23 +40822,19 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
-"bOo" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel,
-/area/engineering/atmos)
"bOp" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bOq" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Pure to Mix"
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -41101,13 +41098,6 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
-"bPa" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engineering/atmos)
"bPd" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 8
@@ -41420,7 +41410,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bPW" = (
@@ -41798,14 +41787,16 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bQK" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bQL" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bQM" = (
@@ -41813,9 +41804,8 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Unfiltered to Mix"
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -42122,8 +42112,7 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bRw" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bRx" = (
@@ -53854,6 +53843,12 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"eEd" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"eEp" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -55224,6 +55219,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"hEi" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"hEX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -56765,6 +56769,12 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
/area/engineering/main)
+"kWG" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"kWQ" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable/yellow{
@@ -57469,6 +57479,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/department/engine)
+"mAR" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"mCe" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -58889,6 +58908,10 @@
},
/turf/open/floor/wood,
/area/service/lawoffice)
+"pEM" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible,
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"pFe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/red{
@@ -59411,6 +59434,13 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
+"qQu" = (
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"qRl" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -60162,6 +60192,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"sGJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"sIK" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -61092,6 +61129,12 @@
},
/turf/open/floor/engine,
/area/engineering/main)
+"uST" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Mix to Ports"
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"uUQ" = (
/obj/machinery/door/airlock/maintenance{
name = "Engineering Maintenance";
@@ -99723,7 +99766,7 @@ bJN
bKS
bMe
bNh
-bOo
+pEM
bOX
bMf
bMf
@@ -100237,9 +100280,9 @@ bHw
bKU
bOr
bPU
+kWG
bRw
-bPa
-bMf
+beW
bMf
bMf
bMf
@@ -100493,13 +100536,13 @@ bIF
bHw
bKV
bOX
-bUv
+eEd
bQL
-bPa
-bMf
-bMf
-bMf
+uST
+pEM
bMf
+qQu
+qQu
bSU
bTT
bUv
@@ -100753,10 +100796,10 @@ bMg
bNj
bOp
bPV
-bPV
-bPV
-bPV
-bPV
+hEi
+sGJ
+bUw
+bUw
bUw
bUw
bUw
@@ -101007,8 +101050,8 @@ bIH
bHw
cqG
bOX
-bNk
bOq
+mAR
bPd
bPW
bPW
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index ded183ba0b..3807b66b06 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -165,6 +165,7 @@
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
#define TRAIT_PUGILIST "pugilist" //This guy punches people for a living
+#define TRAIT_NOPUGILIST "nopugilist" // for preventing ((((((((((extreme)))))))))) punch stacking
#define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage
#define TRAIT_MAULER "mauler" // this guy punches the shit out of people to hurt them, not to drain their stamina
#define TRAIT_PASSTABLE "passtable"
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 5881c76827..9b9ea3c86e 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -165,6 +165,7 @@
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
+ ADD_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT) // cqc doesn't get this as it's intended to be able to stack with northstar gloves
H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it
H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant
H.physiology.stamina_mod *= 0.4 //You take less stamina damage overall, but you do not reduce the damage from stun batons as much
@@ -181,6 +182,7 @@
REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT)
H.physiology.brute_mod = initial(H.physiology.brute_mod)
H.physiology.burn_mod = initial(H.physiology.burn_mod)
H.physiology.stamina_mod = initial(H.physiology.stamina_mod)
diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm
index 9032a80d91..7d13af1e3e 100644
--- a/code/game/objects/structures/spawner.dm
+++ b/code/game/objects/structures/spawner.dm
@@ -73,3 +73,15 @@
name = "wumborian fugu den"
desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?"
mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu)
+
+/obj/structure/spawner/clown
+ name = "Laughing Larry"
+ desc = "A laughing, jovial figure. Something seems stuck in his throat."
+ icon_state = "clownbeacon"
+ icon = 'icons/obj/device.dmi'
+ max_integrity = 200
+ max_mobs = 15
+ spawn_time = 150
+ mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob)
+ spawn_text = "climbs out of"
+ faction = list("clown")
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 5b6a7648c8..b7aeb23e6f 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -680,6 +680,11 @@
glove_type = /obj/item/clothing/gloves/fingerless/pugilist/cling // just punch his head off dude
glove_name_simple = "bone gauntlets"
+/obj/effect/proc_holder/changeling/gloves/gauntlets/sting_action(mob/living/user)
+ if(HAS_TRAIT(user, TRAIT_NOPUGILIST))
+ to_chat(user, "We would gain nothing by forming our fists into brute-force weapons when we are trained in precision martial arts!")
+ return
+
/obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands
name = "hewn bone gauntlets"
icon_state = "ling_gauntlets"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 732cd7e540..2a6b9f245a 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -37,14 +37,19 @@
/obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot)
. = ..()
if(slot == SLOT_GLOVES)
- use_buffs(user, TRUE)
wornonce = TRUE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ to_chat(user, "What purpose is there to don the weapons of pugilism if you're already well-practiced in martial arts? Mixing arts is blasphemous!")
+ return
+ use_buffs(user, TRUE)
/obj/item/clothing/gloves/fingerless/pugilist/dropped(mob/user)
. = ..()
if(wornonce)
- use_buffs(user, FALSE)
wornonce = FALSE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ return
+ use_buffs(user, FALSE)
/obj/item/clothing/gloves/fingerless/pugilist/proc/use_buffs(mob/user, buff)
if(buff) // tarukaja
@@ -247,14 +252,18 @@
/obj/item/clothing/gloves/fingerless/pugilist/mauler/equipped(mob/user, slot)
. = ..()
if(slot == SLOT_GLOVES)
- use_mauls(user, TRUE)
wornonce = TRUE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ return
+ use_mauls(user, TRUE)
/obj/item/clothing/gloves/fingerless/pugilist/mauler/dropped(mob/user)
. = ..()
if(wornonce)
- use_mauls(user, FALSE)
wornonce = FALSE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ return
+ use_mauls(user, FALSE)
/obj/item/clothing/gloves/fingerless/pugilist/mauler/proc/use_mauls(mob/user, maul)
if(maul)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index cc14424980..6858de59df 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -535,3 +535,9 @@
to_chat(user, "You insert [I] into [src].")
B.use(10)
icon_state = initial(icon_state)
+
+/obj/item/clothing/shoes/swagshoes
+ name = "swag shoes"
+ desc = "They got me for my foams!"
+ icon_state = "SwagShoes"
+ item_state = "SwagShoes"
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index f8292738ee..60d82292ef 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -355,3 +355,10 @@
name = "Sakura Kimono'"
icon_state = "sakura_kimono"
item_state = "sakura_kimono"
+
+/obj/item/clothing/under/costume/swagoutfit
+ name = "Swag outfit"
+ desc = "Why don't you go secure some bitches?"
+ icon_state = "SwagOutfit"
+ item_state = "SwagOutfit"
+ can_adjust = FALSE
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 7d4ea66d30..b9480a646c 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -61,7 +61,7 @@
originMachine.visible_message("[originMachine] beeps and seems lifeless.")
kill()
return
- vendingMachines = listclearnulls(vendingMachines)
+ listclearnulls(vendingMachines)
if(!vendingMachines.len) //if every machine is infected
for(var/obj/machinery/vending/upriser in infectedMachines)
if(prob(70) && !QDELETED(upriser))
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index fedaeff98c..da3c740a1b 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -212,6 +212,8 @@
/obj/item/clothing/suit/jacket/leather/overcoat = 4,
/obj/item/clothing/under/pants/mustangjeans = 3,
/obj/item/clothing/neck/necklace/dope = 5,
+ /obj/item/clothing/under/costume/swagoutfit = 5,
+ /obj/item/clothing/shoes/swagshoes = 5,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 5,
/obj/item/clothing/under/misc/corporateuniform = 5,
/obj/item/clothing/suit/hooded/wintercoat/polychromic = 5,
diff --git a/html/changelogs/AutoChangeLog-pr-14750.yml b/html/changelogs/AutoChangeLog-pr-14750.yml
new file mode 100644
index 0000000000..f43fbe8c44
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14750.yml
@@ -0,0 +1,6 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - rscadd: "swag outfit available in clothesmate"
+ - rscadd: "swag shoes availble in clothesmate
+resprite: changed swag shoes icon to the one twaticus made."
diff --git a/html/changelogs/AutoChangeLog-pr-14751.yml b/html/changelogs/AutoChangeLog-pr-14751.yml
new file mode 100644
index 0000000000..91a2ff6234
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14751.yml
@@ -0,0 +1,4 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - rscadd: "Adds the clown mob spawner for admins"
diff --git a/html/changelogs/AutoChangeLog-pr-14755.yml b/html/changelogs/AutoChangeLog-pr-14755.yml
new file mode 100644
index 0000000000..8b231db995
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14755.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "brand intelligence event works again"
diff --git a/html/changelogs/AutoChangeLog-pr-14756.yml b/html/changelogs/AutoChangeLog-pr-14756.yml
new file mode 100644
index 0000000000..265a808d04
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14756.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - balance: "puglism damage can no longer stack with scarp"
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index d93543805b..de50a0d9dc 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi
index 43244e99b9..1cc1e801c7 100644
Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index f2611b3ab7..6c29fdfa75 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi
index 98ec436b86..a957b60a9b 100644
Binary files a/icons/mob/clothing/uniform_digi.dmi and b/icons/mob/clothing/uniform_digi.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index aee67da199..cb2391b5ba 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 6171e032dd..22464b3def 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ