diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 805e72cfcb..b2caf614b3 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -71,6 +71,7 @@
#define TRAIT_MUSICIAN "musician"
#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
#define TRAIT_NYMPHO "nymphomania"
+#define TRAIT_MASO "masochism"
// common trait sources
#define TRAIT_GENERIC "generic"
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index d3c256308d..d61c95c8f2 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -21,6 +21,8 @@
/datum/ert/amber
code = "Amber"
+ leader_role = /datum/antagonist/ert/commander/red
+ roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red)
/datum/ert/red
leader_role = /datum/antagonist/ert/commander/red
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 94f5e63afb..cb3cbf2aa6 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -80,9 +80,21 @@
/obj/machinery/computer/atmos_alert/update_icon()
..()
+ cut_overlays()
+ SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
+ var/overlay_state = icon_screen
if(stat & (NOPOWER|BROKEN))
+ add_overlay("[icon_keyboard]_off")
return
+ add_overlay(icon_keyboard)
if(priority_alarms.len)
+ overlay_state = "alert:2"
add_overlay("alert:2")
else if(minor_alarms.len)
+ overlay_state = "alert:1"
add_overlay("alert:1")
+ else
+ overlay_state = "alert:0"
+ add_overlay("alert:0")
+ SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir)
+ SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128)
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 6769244335..36ba4b0c94 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -76,12 +76,23 @@
/obj/machinery/computer/station_alert/update_icon()
..()
+ cut_overlays()
+ SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
+ var/overlay_state = icon_screen
if(stat & (NOPOWER|BROKEN))
+ add_overlay("[icon_keyboard]_off")
return
+ add_overlay(icon_keyboard)
var/active_alarms = FALSE
for(var/cat in alarms)
var/list/L = alarms[cat]
if(L.len)
active_alarms = TRUE
if(active_alarms)
+ overlay_state = "alert:2"
add_overlay("alert:2")
+ else
+ overlay_state = "alert:0"
+ add_overlay("alert:0")
+ SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir)
+ SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir, alpha=128)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9ff1b5cf01..9314faab27 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -449,7 +449,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return 0
/obj/item/proc/eyestab(mob/living/carbon/M, mob/living/carbon/user)
-
+ if(user.has_trait(TRAIT_PACIFISM))
+ to_chat(user, "You don't want to harm [M]!")
+ return
+ if(user.has_trait(TRAIT_CLUMSY) && prob(50))
+ M = user
var/is_human_victim = 0
var/obj/item/bodypart/affecting = M.get_bodypart(BODY_ZONE_HEAD)
if(ishuman(M))
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 11d6f264b8..ef2aa825e7 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -49,8 +49,6 @@
forkload = null
else if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
- if(user.has_trait(TRAIT_CLUMSY) && prob(50))
- M = user
return eyestab(M,user)
else
return ..()
@@ -79,8 +77,6 @@
/obj/item/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user)
if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
- if(user.has_trait(TRAIT_CLUMSY) && prob(50))
- M = user
return eyestab(M,user)
else
return ..()
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 3a35f4d8ef..8ed0f273e6 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -283,7 +283,7 @@
else
var/turf/T = get_turf(src)
if(!isspaceturf(T))
- consume_turf(T)
+ shard.consume_turf(T)
/obj/item/melee/supermatter_sword/afterattack(target, mob/user, proximity_flag)
. = ..()
@@ -330,18 +330,7 @@
else if(!isturf(target))
shard.Bumped(target)
else
- consume_turf(target)
-
-/obj/item/melee/supermatter_sword/proc/consume_turf(turf/T)
- var/oldtype = T.type
- var/turf/newT = T.ScrapeAway()
- if(newT.type == oldtype)
- return
- playsound(T, 'sound/effects/supermatter.ogg', 50, 1)
- T.visible_message("[T] smacks into [src] and rapidly flashes to ash.",\
- "You hear a loud crack as you are washed with a wave of heat.")
- shard.Consume()
- T.CalculateAdjacentTurfs()
+ shard.consume_turf(target)
/obj/item/melee/supermatter_sword/add_blood_DNA(list/blood_dna)
return FALSE
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 703de902b6..28a744fbb1 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -635,6 +635,13 @@
attack_verb = list("lit", "flickered", "flashed")
squeak_override = list('sound/weapons/magout.ogg' = 1)
+/obj/item/toy/plush/box
+ name = "cardboard plushie"
+ desc = "A toy box plushie, it holds cotten. Only a baddie would place a bomb through the postal system..."
+ icon_state = "box"
+ item_state = "box"
+ attack_verb = list("open", "closed", "packed", "hidden", "rigged", "bombed", "sent", "gave")
+
/obj/item/toy/plush/borgplushie
name = "robot plushie"
desc = "An adorable stuffed toy of a robot."
@@ -659,6 +666,12 @@
icon_state = "neeb"
item_state = "neeb"
+/obj/item/toy/plush/borgplushie/bhijn
+ desc = "An adorable stuffed toy of a IPC."
+ icon_state = "bhijn"
+ item_state = "bhijn"
+ attack_verb = list("closed", "reworked", "merged")
+
/obj/item/toy/plush/bird
name = "bird plushie"
desc = "An adorable stuffed plushie that resembles an avian."
@@ -743,6 +756,7 @@
/obj/item/toy/plush/mammal/edgar
icon_state = "edgar"
item_state = "edgar"
+ attack_verb = list("collared", "tricked", "headpatted")
/obj/item/toy/plush/mammal/frank
icon_state = "frank"
@@ -777,6 +791,16 @@
icon_state = "zed"
item_state = "zed"
+/obj/item/toy/plush/mammal/justin
+ icon_state = "justin"
+ item_state = "justin"
+ attack_verb = list("buttslapped", "fixed")
+
+/obj/item/toy/plush/mammal/reece
+ icon_state = "reece"
+ item_state = "reece"
+ attack_verb = list("healed", "cured", "demoted")
+
/obj/item/toy/plush/mammal/dog
desc = "An adorable stuffed toy that resembles a canine."
icon_state = "katlin"
@@ -840,6 +864,12 @@
icon_state = "drew"
item_state = "drew"
+/obj/item/toy/plush/catgirl/trilby
+ desc = "A masked stuffed toy that resembles a feline scientist."
+ icon_state = "trilby"
+ item_state = "trilby"
+ attack_verb = list("pred", "coded", "remembered")
+
/obj/item/toy/plush/catgirl/fermis
name = "medcat plushie"
desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people."
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index 1171bd7bf7..30c7115346 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -153,3 +153,16 @@
slot_flags = null
to_chat(user, "[src] can now be concealed.")
add_fingerprint(user)
+
+/obj/item/shield/makeshift
+ name = "metal shield"
+ desc = "A large shield made of wired and welded sheets of metal. The handle is made of cloth and leather making it unwieldy."
+ armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80)
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
+ item_state = "makeshift_shield"
+ materials = list(MAT_METAL = 18000)
+ slot_flags = null
+ block_chance = 25
+ force = 5
+ throwforce = 7
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 2e8cb569a6..217b53c928 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -75,11 +75,6 @@
return ..()
if(user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_HEAD)
return ..()
- if(user.has_trait(TRAIT_PACIFISM))
- to_chat(user, "You don't want to harm [M]!")
- return
- if(user.has_trait(TRAIT_CLUMSY) && prob(50))
- M = user
return eyestab(M,user)
/obj/item/screwdriver/brass
@@ -103,7 +98,7 @@
/obj/item/screwdriver/abductor/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_nuke")
-
+
/obj/item/screwdriver/power
name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a screw bit."
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index c6d657b271..b4310a7f42 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -46,7 +46,8 @@
/datum/outfit/ert/commander/alert
name = "ERT Commander - High Alert"
-
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
glasses = /obj/item/clothing/glasses/thermal/eyepatch
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
@@ -80,7 +81,8 @@
/datum/outfit/ert/security/alert
name = "ERT Security - High Alert"
-
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/storage/box/handcuffs=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
@@ -117,6 +119,7 @@
/datum/outfit/ert/medic/alert
name = "ERT Medic - High Alert"
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
@@ -153,6 +156,7 @@
/datum/outfit/ert/engineer/alert
name = "ERT Engineer - High Alert"
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
diff --git a/code/modules/clothing/shoes/taeclowndo.dm b/code/modules/clothing/shoes/taeclowndo.dm
new file mode 100644
index 0000000000..20d9fa6b70
--- /dev/null
+++ b/code/modules/clothing/shoes/taeclowndo.dm
@@ -0,0 +1,36 @@
+/obj/item/clothing/shoes/clown_shoes/taeclowndo
+ var/list/spelltypes = list (
+ /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pie,
+ /obj/effect/proc_holder/spell/aimed/banana_peel,
+ /obj/effect/proc_holder/spell/targeted/touch/megahonk,
+ /obj/effect/proc_holder/spell/targeted/touch/bspie,
+ )
+ var/list/spells = list()
+
+
+/obj/item/clothing/shoes/clown_shoes/taeclowndo/equipped(mob/user, slot)
+ . = ..()
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(!(H.has_trait(TRAIT_CLUMSY)) && !(H.mind && H.mind.assigned_role == "Clown"))
+ return
+ if(slot == SLOT_SHOES)
+ spells = new
+ for(var/spell in spelltypes)
+ var/obj/effect/proc_holder/spell/S = new spell
+ spells += S
+ S.charge_counter = 0
+ S.start_recharge()
+ H.mind.AddSpell(S)
+
+/obj/item/clothing/shoes/clown_shoes/taeclowndo/dropped(mob/user)
+ . = ..()
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(H.get_item_by_slot(SLOT_SHOES) == src)
+ for(var/spell in spells)
+ var/obj/effect/proc_holder/spell/S = spell
+ H.mind.spell_list.Remove(S)
+ qdel(S)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 652c0048c2..6d7c1036be 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -8,7 +8,8 @@ Contains:
- NASA Voidsuit
- Father Christmas' magical clothes
- Pirate's spacesuit
- - ERT hardsuit: command, sec, engi, med
+ - ERT hardsuit: Command, Sec, Engi, Med
+ - ERT High Alarm - Command, Sec, Engi, Med
- EVA spacesuit
- Freedom's spacesuit (freedom from vacuum's oppression)
- Carp hardsuit
@@ -185,6 +186,7 @@ Contains:
slowdown = 0
strip_delay = 130
resistance_flags = ACID_PROOF
+ tauric = TRUE //Citadel Add for tauric hardsuits
//ERT Security
/obj/item/clothing/head/helmet/space/hardsuit/ert/sec
@@ -198,7 +200,6 @@ Contains:
icon_state = "ert_security"
item_state = "ert_security"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/sec
- tauric = TRUE //Citadel Add for tauric hardsuits
//ERT Engineering
/obj/item/clothing/head/helmet/space/hardsuit/ert/engi
@@ -212,7 +213,6 @@ Contains:
icon_state = "ert_engineer"
item_state = "ert_engineer"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/engi
- tauric = TRUE //Citadel Add for tauric hardsuits
//ERT Medical
/obj/item/clothing/head/helmet/space/hardsuit/ert/med
@@ -227,8 +227,73 @@ Contains:
item_state = "ert_medical"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/med
species_exception = list(/datum/species/angel)
+
+ //Red alert ERT
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/alert
+ name = "emergency response unit helmet"
+ desc = "Red alert command helmet for the ERT. This one is more armored than its standard version."
+ icon_state = "hardsuit0-ert_commander-alert"
+ item_state = "hardsuit0-ert_commander-alert"
+ item_color = "ert_commander-alert"
+ armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ strip_delay = 130
+ item_flags = NODROP
+ brightness_on = 8
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/clothing/suit/space/hardsuit/ert/alert
+ name = "emergency response team suit"
+ desc = "Red alert command suit for the ERT. This one is more armored than its standard version."
+ icon_state = "ert_command-alert"
+ item_state = "ert_command-alert"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert
+ allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
+ armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ strip_delay = 130
+ resistance_flags = FIRE_PROOF | ACID_PROOF
tauric = TRUE //Citadel Add for tauric hardsuits
+ //ERT Security
+/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec
+ desc = "Red alert security helmet for the ERT. This one is more armored than its standard version."
+ icon_state = "hardsuit0-ert_security-alert"
+ item_state = "hardsuit0-ert_security-alert"
+ item_color = "ert_security-alert"
+
+/obj/item/clothing/suit/space/hardsuit/ert/alert/sec
+ desc = "Red alert security suit for the ERT. This one is more armored than its standard version."
+ icon_state = "ert_security-alert"
+ item_state = "ert_security-alert"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec
+
+ //ERT Engineering
+/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/engi
+ desc = "Red alert engineer helmet for the ERT. This one is more armored than its standard version."
+ icon_state = "hardsuit0-ert_engineer-alert"
+ item_state = "hardsuit0-ert_engineer-alert"
+ item_color = "ert_engineer-alert"
+
+/obj/item/clothing/suit/space/hardsuit/ert/alert/engi
+ desc = "Red alert engineer suit for the ERT. This one is more armored than its standard version."
+ icon_state = "ert_engineer-alert"
+ item_state = "ert_engineer-alert"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert/engi
+
+ //ERT Medical
+/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/med
+ desc = "Red alert medical helmet for the ERT. This one is more armored than its standard version."
+ icon_state = "hardsuit0-ert_medical-alert"
+ item_state = "hardsuit0-ert_medical-alert"
+ item_color = "ert_medical-alert"
+
+/obj/item/clothing/suit/space/hardsuit/ert/alert/med
+ desc = "Red alert medical suit for the ERT. This one is more armored than its standard version."
+ icon_state = "ert_medical-alert"
+ item_state = "ert_medical-alert"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert/med
+ species_exception = list(/datum/species/angel)
+
/obj/item/clothing/suit/space/eva
name = "EVA suit"
icon_state = "space"
@@ -280,7 +345,6 @@ Contains:
item_flags = NODROP
mutantrace_variation = NO_MUTANTRACE_VARIATION
-
/obj/item/clothing/suit/space/hardsuit/carp
name = "carp space suit"
desc = "A slimming piece of dubious space carp technology, you suspect it won't stand up to hand-to-hand blows."
@@ -291,7 +355,6 @@ Contains:
allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/automatic/speargun) //I'm giving you a hint here
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/carp
-
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
name = "paranormal response unit helmet"
desc = "A helmet worn by those who deal with paranormal threats for a living."
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 481fbade71..5d534e00a7 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -24,11 +24,11 @@
ToggleHood()
/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user)
- if(slot == SLOT_WEAR_SUIT)
+ if(slot == SLOT_WEAR_SUIT || slot == SLOT_NECK)
return 1
/obj/item/clothing/suit/hooded/equipped(mob/user, slot)
- if(slot != SLOT_WEAR_SUIT)
+ if(slot != SLOT_WEAR_SUIT && slot != SLOT_NECK)
RemoveHood()
..()
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index c3858da6ad..ca10d5092f 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -54,6 +54,18 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
+/datum/crafting_recipe/makeshiftshield
+ name = "Makeshift Metal Shield"
+ result = /obj/item/shield/makeshift
+ reqs = list(/obj/item/stack/cable_coil = 30,
+ /obj/item/stack/sheet/metal = 10,
+ /obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/leather = 3)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ time = 100
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
/datum/crafting_recipe/molotov
name = "Molotov"
result = /obj/item/reagent_containers/food/drinks/bottle/molotov
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index f2b195c32d..2b37065709 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -108,9 +108,9 @@ All foods are distributed among various categories. Use common sense.
else if(fullness > 150 && fullness < 500)
user.visible_message("[user] takes a [eatverb] from \the [src].", "You take a [eatverb] from \the [src].")
else if(fullness > 500 && fullness < 600)
- user.visible_message("[user] unwillingly takes a [eatverb] of a bit of \the [src].", "You unwillingly take a [eatverb] of a bit of \the [src].")
+ user.visible_message("[user] unwillingly takes a [eatverb] of a bit of \the [src].", "You unwillingly take a [eatverb] of a bit of \the [src].")
else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
- user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!")
+ user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!")
return 0
if(M.has_trait(TRAIT_VORACIOUS))
M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 04177783e6..8264b4153e 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -62,6 +62,28 @@
/obj/item/reagent_containers/food/snacks/pie/cream/nostun
stunning = FALSE
+/obj/item/reagent_containers/food/snacks/pie/cream/body
+
+/obj/item/reagent_containers/food/snacks/pie/cream/body/Destroy()
+ var/turf/T = get_turf(src)
+ for(var/atom/movable/A in contents)
+ A.forceMove(T)
+ A.throw_at(T, 1, 1)
+ . = ..()
+
+/obj/item/reagent_containers/food/snacks/pie/cream/body/On_Consume(mob/living/carbon/M)
+ if(!reagents.total_volume) //so that it happens on the last bite
+ if(iscarbon(M) && contents.len)
+ var/turf/T = get_turf(src)
+ for(var/atom/movable/A in contents)
+ A.forceMove(T)
+ A.throw_at(T, 1, 1)
+ M.visible_message("[src] bursts out of [M]!")
+ M.emote("scream")
+ M.Knockdown(40)
+ M.adjustBruteLoss(60)
+ return ..()
+
/obj/item/reagent_containers/food/snacks/pie/berryclafoutis
name = "berry clafoutis"
desc = "No black birds, this is a good sign."
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
index f9259359a3..7bccbfafcd 100644
--- a/code/modules/integrated_electronics/subtypes/weaponized.dm
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -215,7 +215,7 @@
The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
must also be a gun if you wish to launch something while the assembly is in hand."
- complexity = 75
+ complexity = 50
w_class = WEIGHT_CLASS_SMALL
size = 4
cooldown_per_use = 30
@@ -306,7 +306,7 @@
desc = "Used to stun a target holding the device via electricity."
icon_state = "power_relay"
extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70."
- complexity = 60
+ complexity = 30
size = 4
inputs = list("strength" = IC_PINTYPE_NUMBER)
activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
@@ -340,4 +340,4 @@
var/mob/living/carbon/human/H = L
H.forcesay(GLOB.hit_appends)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3930d19168..9a0a978d7a 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1494,7 +1494,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
)
if (target.canbearoused)
target.adjustArousalLoss(5)
- if (target.getArousalLoss() >= 100 && ishuman(target) && target.has_trait(TRAIT_NYMPHO) && target.has_dna())
+ if (target.getArousalLoss() >= 100 && ishuman(target) && target.has_trait(TRAIT_MASO) && target.has_dna())
target.mob_climax(forced_climax=TRUE)
if (!target.has_trait(TRAIT_NYMPHO))
stop_wagging_tail(target)
@@ -1727,6 +1727,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(BP)
if(damage > 0 ? BP.receive_damage(damage * hit_percent * brutemod * H.physiology.brute_mod, 0) : BP.heal_damage(abs(damage * hit_percent * brutemod * H.physiology.brute_mod), 0))
H.update_damage_overlays()
+ if(H.has_trait(TRAIT_MASO))
+ H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod)
+ if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna())
+ H.mob_climax(forced_climax=TRUE)
+
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod)
if(BURN)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index ae662c7628..b6717f2932 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -103,21 +103,23 @@
//CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks without a short delay
if(resting && !L.resting)
- if(attemptingcrawl)
- return TRUE
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
- to_chat(src, "You're too exhausted to crawl under [L].")
- return TRUE
- attemptingcrawl = TRUE
var/origtargetloc = L.loc
- visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].")
- if(do_after(src, CRAWLUNDER_DELAY, target = src))
- if(resting)
- var/src_passmob = (pass_flags & PASSMOB)
- pass_flags |= PASSMOB
- Move(origtargetloc)
- if(!src_passmob)
- pass_flags &= ~PASSMOB
+ if(!pulledby)
+ if(attemptingcrawl)
+ return TRUE
+ if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ to_chat(src, "You're too exhausted to crawl under [L].")
+ return TRUE
+ attemptingcrawl = TRUE
+ visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].")
+ if(!do_after(src, CRAWLUNDER_DELAY, target = src) || !resting)
+ attemptingcrawl = FALSE
+ return TRUE
+ var/src_passmob = (pass_flags & PASSMOB)
+ pass_flags |= PASSMOB
+ Move(origtargetloc)
+ if(!src_passmob)
+ pass_flags &= ~PASSMOB
attemptingcrawl = FALSE
return TRUE
//END OF CIT CHANGES
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index ad94d577ea..99b4a3f27e 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -295,6 +295,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
E.energy = power
qdel(src)
+/obj/machinery/power/supermatter_crystal/proc/consume_turf(turf/T)
+ var/oldtype = T.type
+ var/turf/newT = T.ScrapeAway()
+ if(newT.type == oldtype)
+ return
+ playsound(T, 'sound/effects/supermatter.ogg', 50, 1)
+ T.visible_message("[T] smacks into [src] and rapidly flashes to ash.",\
+ "You hear a loud crack as you are washed with a wave of heat.")
+ T.CalculateAdjacentTurfs()
+
/obj/machinery/power/supermatter_crystal/process_atmos()
var/turf/T = loc
@@ -303,6 +313,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(!istype(T)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now.
return //Yeah just stop.
+ if(istype(T, /turf/closed))
+ consume_turf(T)
if(power)
soundloop.volume = min(40, (round(power/100)/50)+1) // 5 +1 volume per 20 power. 2500 power is max
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 5071150e24..a65a1f4adb 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -319,7 +319,7 @@
victim.blind_eyes(2)
victim.confused = max(M.confused, 3)
victim.damageoverlaytemp = 60
- victim.Knockdown(60)
+ victim.Knockdown(60, override_stamdmg = min(reac_volume * 3, 15))
return
else if ( eyes_covered ) // Eye cover is better than mouth cover
victim.blur_eyes(3)
@@ -332,7 +332,7 @@
victim.blind_eyes(3)
victim.confused = max(M.confused, 6)
victim.damageoverlaytemp = 75
- victim.Knockdown(100)
+ victim.Knockdown(100, override_stamdmg = min(reac_volume * 5, 25))
victim.update_damage_hud()
/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index a51134f84d..afb985120e 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -18,6 +18,7 @@
var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
+ var/spray_delay = 3 //The amount of sleep() delay between each chempuff step.
var/can_fill_from_container = TRUE
amount_per_transfer_from_this = 5
volume = 250
@@ -64,7 +65,7 @@
/obj/item/reagent_containers/spray/proc/spray(atom/A)
- var/range = max(min(current_range, get_dist(src, A)), 1)
+ var/range = CLAMP(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this)
var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
@@ -74,7 +75,7 @@
else
reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
D.color = mix_color_from_reagents(D.reagents.reagent_list)
- var/wait_step = max(round(2+3/range), 2)
+ var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2)
do_spray(A, wait_step, D, range, puff_reagent_left)
/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left)
@@ -166,7 +167,7 @@
user.visible_message("[user] decided life was worth living.")
return
-//Drying Agent
+//Drying Agent
/obj/item/reagent_containers/spray/drying_agent
name = "drying agent spray"
desc = "A spray bottle for drying agent."
@@ -194,6 +195,7 @@
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
volume = 40
stream_range = 4
+ spray_delay = 1
amount_per_transfer_from_this = 5
list_reagents = list("condensedcapsaicin" = 40)
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index 3d48dd51ec..05e4c667f6 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -59,6 +59,14 @@
build_path = /obj/item/reagent_containers/food/snacks/monkeycube
category = list("initial", "Food")
+/datum/design/smeat
+ name = "Biomass Meat Slab"
+ id = "smeat"
+ build_type = BIOGENERATOR
+ materials = list(MAT_BIOMASS = 175)
+ build_path = /obj/item/reagent_containers/food/snacks/meat/slab/synthmeat
+ category = list("initial", "Food")
+
/datum/design/ez_nut
name = "E-Z Nutrient"
id = "ez_nut"
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 35f9a8f50a..73a428af71 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -74,6 +74,8 @@
/obj/effect/proc_holder/spell/aimed/proc/fire_projectile(mob/living/user, atom/target)
current_amount--
+ if(!projectile_type)
+ return
for(var/i in 1 to projectiles_per_fire)
var/obj/item/projectile/P = new projectile_type(user.loc)
P.firer = user
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 919d87b4c7..06d1fc3dc5 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -94,3 +94,87 @@
M.Stun(40)
M.petrify()
return ..()
+
+
+/obj/item/melee/touch_attack/megahonk
+ name = "\improper honkmother's blessing"
+ desc = "You've got a feeling they won't be laughing after this one. Honk honk."
+ catchphrase = "HONKDOOOOUKEN!"
+ on_use_sound = 'sound/items/airhorn.ogg'
+ icon = 'icons/mecha/mecha_equipment.dmi'
+ icon_state = "mecha_honker"
+
+/obj/item/melee/touch_attack/megahonk/afterattack(atom/target, mob/living/carbon/user, proximity)
+ if(!proximity || !iscarbon(target) || !iscarbon(user) || user.handcuffed)
+ return
+ user.say(catchphrase, forced = "spell")
+ playsound(get_turf(target), on_use_sound,100,1)
+ for(var/mob/living/carbon/M in (hearers(1, target) - user)) //3x3 around the target, not affecting the user
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
+ continue
+ var/mul = (M==target ? 1 : 0.5)
+ to_chat(M, "HONK")
+ M.SetSleeping(0)
+ M.stuttering += 20*mul
+ M.adjustEarDamage(0, 30*mul)
+ M.Knockdown(60*mul)
+ if(prob(40))
+ M.Knockdown(200*mul)
+ else
+ M.Jitter(500*mul)
+
+ charges--
+ if(charges <= 0)
+ qdel(src)
+
+/obj/item/melee/touch_attack/megahonk/attack_self(mob/user)
+ . = ..()
+ to_chat(user, "\The [src] disappears, to honk another day.")
+ qdel(src)
+
+/obj/item/melee/touch_attack/bspie
+ name = "\improper bluespace pie"
+ desc = "A thing you can barely comprehend as you hold it in your hand. You're fairly sure you could fit an entire body inside."
+ on_use_sound = 'sound/magic/demon_consume.ogg'
+ icon = 'icons/obj/food/piecake.dmi'
+ icon_state = "frostypie"
+ color = "#000077"
+
+/obj/item/melee/touch_attack/bspie/attack_self(mob/user)
+ . = ..()
+ to_chat(user, "You smear \the [src] on your chest! ")
+ qdel(src)
+
+/obj/item/melee/touch_attack/bspie/afterattack(atom/target, mob/living/carbon/user, proximity)
+ if(!proximity || !iscarbon(target) || !iscarbon(user) || user.handcuffed)
+ return
+ if(target == user)
+ to_chat(user, "You smear \the [src] on your chest!")
+ qdel(src)
+ return
+ var/mob/living/carbon/M = target
+
+ user.visible_message("[user] is trying to stuff [M]\s body into \the [src]!")
+ if(do_mob(user, M, 250))
+ var/name = M.real_name
+ var/obj/item/reagent_containers/food/snacks/pie/cream/body/pie = new(get_turf(M))
+ pie.name = "\improper [name] [pie.name]"
+
+ playsound(get_turf(target), on_use_sound, 50, 1)
+
+ /*
+ var/obj/item/bodypart/head = M.get_bodypart("head")
+ if(head)
+ head.drop_limb()
+ head.throw_at(get_turf(head), 1, 1)
+ qdel(M)
+ */
+ M.forceMove(pie)
+
+
+ charges--
+
+ if(charges <= 0)
+ qdel(src)
diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm
new file mode 100644
index 0000000000..d2b0782b07
--- /dev/null
+++ b/code/modules/spells/spell_types/taeclowndo.dm
@@ -0,0 +1,86 @@
+/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pie
+ name = "Summon Creampie"
+ desc = "A clown's weapon of choice. Use this to summon a fresh pie, just waiting to acquaintain itself with someone's face."
+ invocation_type = "none"
+ include_user = 1
+ range = -1
+ clothes_req = 0
+ item_type = /obj/item/reagent_containers/food/snacks/pie/cream
+
+ charge_max = 30
+ cooldown_min = 30
+ action_icon = 'icons/obj/food/piecake.dmi'
+ action_icon_state = "pie"
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/effect/proc_holder/spell/aimed/banana_peel
+ name = "Conjure Banana Peel"
+ desc = "Make a banana peel appear out of thin air right under someone's feet!"
+ charge_type = "recharge"
+ charge_max = 100
+ cooldown_min = 100
+ clothes_req = 0
+ invocation_type = "none"
+ range = 7
+ selection_type = "view"
+ projectile_type = null
+
+ active_msg = "You focus, your mind reaching to the clown dimension, ready to make a peel matrialize wherever you want!"
+ deactive_msg = "You relax, the peel remaining right in the \"thin air\" it would appear out of."
+ action_icon = 'icons/obj/hydroponics/harvest.dmi'
+ base_icon_state = "banana_peel"
+ action_icon_state = "banana"
+
+
+/obj/effect/proc_holder/spell/aimed/banana_peel/cast(list/targets, mob/user = usr)
+ var/target = get_turf(targets[1])
+
+ if(get_dist(user,target)>range)
+ to_chat(user, "\The [target] is too far away!")
+ return
+
+ . = ..()
+ new /obj/item/grown/bananapeel(target)
+
+/obj/effect/proc_holder/spell/aimed/banana_peel/update_icon()
+ if(!action)
+ return
+ if(active)
+ action.button_icon_state = base_icon_state
+ else
+ action.button_icon_state = action_icon_state
+
+ action.UpdateButtonIcon()
+ return
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/effect/proc_holder/spell/targeted/touch/megahonk
+ name = "Mega HoNk"
+ desc = "This spell channels your inner clown powers, concentrating them into one massive HONK."
+ hand_path = /obj/item/melee/touch_attack/megahonk
+
+ charge_max = 100
+ clothes_req = 0
+ cooldown_min = 100
+
+ action_icon = 'icons/mecha/mecha_equipment.dmi'
+ action_icon_state = "mecha_honker"
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/effect/proc_holder/spell/targeted/touch/bspie
+ name = "Bluespace Banana Pie"
+ desc = "An entire body would fit in there!"
+ hand_path = /obj/item/melee/touch_attack/bspie
+
+ charge_max = 450
+ clothes_req = 0
+ cooldown_min = 450
+
+ action_icon = 'icons/obj/food/piecake.dmi'
+ action_icon_state = "frostypie"
+
+
+
+
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 503b1bd743..a5872b6741 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -388,7 +388,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
autoinjectors for rapid application on up to two targets each, a syringe, and a bottle containing \
the BVAK solution."
item = /obj/item/storage/box/syndie_kit/tuberculosisgrenade
- cost = 12
+ cost = 8
surplus = 35
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
restricted = TRUE
@@ -768,7 +768,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
The concussive effect from the explosion will knock the recipient out for a short period, and deafen \
them for longer. Beware, it has a chance to detonate your PDA."
item = /obj/item/cartridge/virus/syndicate
- cost = 6
+ cost = 5
restricted = TRUE
/datum/uplink_item/stealthy_weapons/suppressor
@@ -837,6 +837,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 0
include_modes = list(/datum/game_mode/nuclear/clown_ops)
+datum/uplink_item/stealthy_tools/taeclowndo_shoes
+ name = "Tae-clown-do Shoes"
+ desc = "A pair of shoes for the most elite agents of the honkmotherland. They grant the mastery of taeclowndo with some honk-fu moves as long as they're worn."
+ cost = 12
+ item = /obj/item/clothing/shoes/clown_shoes/taeclowndo
+ include_modes = list(/datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/stealthy_tools/frame
name = "F.R.A.M.E. PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \
@@ -894,7 +901,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Screwed up and have security on your tail? This handy syringe will give you a completely new identity \
and appearance."
item = /obj/item/reagent_containers/syringe/mulligan
- cost = 4
+ cost = 3
surplus = 30
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -1208,7 +1215,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Syndicate Sentience Potion"
item = /obj/item/slimepotion/slime/sentience/nuclear
desc = "A potion recovered at great risk by undercover syndicate operatives and then subsequently modified with syndicate technology. Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
- cost = 4
+ cost = 2
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
restricted = TRUE
@@ -1382,6 +1389,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/dnainjector/clumsymut
restricted_roles = list("Clown")
+/datum/uplink_item/role_restricted/taeclowndo_shoes
+ name = "Tae-clown-do Shoes"
+ desc = "A pair of shoes for the most elite agents of the honkmotherland. They grant the mastery of taeclowndo with some honk-fu moves as long as they're worn."
+ cost = 14
+ item = /obj/item/clothing/shoes/clown_shoes/taeclowndo
+ restricted_roles = list("Clown")
+
/datum/uplink_item/role_restricted/mimery
name = "Guide to Advanced Mimery Series"
desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
@@ -1448,7 +1462,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Gold Toolbox"
desc = "A gold planted plastitanium toolbox loaded with tools. Comes with a set of AI detection multi-tool and a pare of combat gloves."
item = /obj/item/storage/toolbox/gold_real
- cost = 5 // Has synda tools + gloves + a robust weapon
+ cost = 3 // Has synda tools + gloves + a robust weapon
restricted_roles = list("Assistant", "Curator") //Curator do to being made of gold - It fits the theme
/datum/uplink_item/role_restricted/brainwash_disk
@@ -1457,7 +1471,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Insert into an Operating Console to enable the procedure."
item = /obj/item/disk/surgery/brainwashing
restricted_roles = list("Medical Doctor")
- cost = 5
+ cost = 3
/datum/uplink_item/role_restricted/haunted_magic_eightball
name = "Haunted Magic Eightball"
diff --git a/html/changelogs/AutoChangeLog-pr-8434.yml b/html/changelogs/AutoChangeLog-pr-8434.yml
new file mode 100644
index 0000000000..d01858d2b4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8434.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Stops pulls of resting mobs breaking off whenever you swap turfs with someone else because of crawling delays."
diff --git a/html/changelogs/AutoChangeLog-pr-8436.yml b/html/changelogs/AutoChangeLog-pr-8436.yml
new file mode 100644
index 0000000000..6d626bf357
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8436.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "bio mass meat"
diff --git a/html/changelogs/AutoChangeLog-pr-8449.yml b/html/changelogs/AutoChangeLog-pr-8449.yml
new file mode 100644
index 0000000000..c2c397cdd0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8449.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "5->6"
diff --git a/html/changelogs/AutoChangeLog-pr-8452.yml b/html/changelogs/AutoChangeLog-pr-8452.yml
new file mode 100644
index 0000000000..2b4e430757
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8452.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "mulligan costs 4 - > 3"
diff --git a/html/changelogs/AutoChangeLog-pr-8453.yml b/html/changelogs/AutoChangeLog-pr-8453.yml
new file mode 100644
index 0000000000..cda1843779
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8453.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "Tuberculosis 12tc - > 8tc"
diff --git a/html/changelogs/AutoChangeLog-pr-8459.yml b/html/changelogs/AutoChangeLog-pr-8459.yml
new file mode 100644
index 0000000000..ebce2f0db1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8459.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "2 < - 4"
diff --git a/html/changelogs/AutoChangeLog-pr-8463.yml b/html/changelogs/AutoChangeLog-pr-8463.yml
new file mode 100644
index 0000000000..a6c8d05522
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8463.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "shield + crafting"
diff --git a/html/changelogs/AutoChangeLog-pr-8466.yml b/html/changelogs/AutoChangeLog-pr-8466.yml
new file mode 100644
index 0000000000..a3cffc8f59
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8466.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - bugfix: "Atmos and Station alerts should be more alerting."
diff --git a/html/changelogs/AutoChangeLog-pr-8470.yml b/html/changelogs/AutoChangeLog-pr-8470.yml
new file mode 100644
index 0000000000..39399c0724
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8470.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Buffs condensed capsaicin, a yet another feature previously dunked by stam combat."
+ - balance: "speeds up pepper spray puffs."
diff --git a/html/changelogs/AutoChangeLog-pr-8473.yml b/html/changelogs/AutoChangeLog-pr-8473.yml
new file mode 100644
index 0000000000..a4743c9a39
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8473.yml
@@ -0,0 +1,10 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - rscadd: "Taeclowndo shoes which grant the four following abilities:
+- Conjuring a cream pie right into their hand. Every three seconds.
+- Making a banana peel appear out of thin air at the tile of the clown's choice. Every ten seconds.
+- Mega HoNk. A touch-ranged, very small AOE ability, with effect equal to being honked by a Honkerblast on a clown mech, with the effects halved for anyone who isn't its direct target. Every ten seconds.
+- Bluespace Banana Pie. You don't throw this one... not right away at least. This baby can fit an entire body inside. Good for disposal of evidence. 25 second-long action, 45 second cooldown. Also produces a \"[victim's name] cream pie\". The body drops out of the pie if you splat it somewhere or destroy the pie. If you eat it, it will chestburst out of you a'la monkey cube.
+
+It's a 14 TC item for traitor clowns and a 12 TC item for clown-ops."
diff --git a/html/changelogs/AutoChangeLog-pr-8477.yml b/html/changelogs/AutoChangeLog-pr-8477.yml
new file mode 100644
index 0000000000..f5478ed178
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8477.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Ported the zulie cloak and blackredgold coat donor items from RP."
diff --git a/html/changelogs/AutoChangeLog-pr-8482.yml b/html/changelogs/AutoChangeLog-pr-8482.yml
new file mode 100644
index 0000000000..095f93a7a3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8482.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixes eyestabbing people with cutlery while being a pacifist."
diff --git a/html/changelogs/AutoChangeLog-pr-8485.yml b/html/changelogs/AutoChangeLog-pr-8485.yml
new file mode 100644
index 0000000000..abc79f1f30
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8485.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "More plushies"
+ - tweak: "attack verbs and descs"
diff --git a/html/changelogs/AutoChangeLog-pr-8495.yml b/html/changelogs/AutoChangeLog-pr-8495.yml
new file mode 100644
index 0000000000..92777ef8b0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8495.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - tweak: "\"Unwillingly\" eating food now sends a warning message instead of a notice. Unable to stuff food down your throat sends a danger message instead of a warning message."
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index 0c872625dd..dcb36e7b47 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 3da5fc08e2..09d6fe5374 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index b518157bb5..0f3438dfc4 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index d905979c9c..8256c1fc07 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 8e0359e6b3..2cb473fb00 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index 9a7d460e14..9faaf8f81a 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 543d57ff56..655d37d4a6 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index 7ca7b068b0..68c51bb4c8 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm
index 264dbfef0a..05aeb27361 100644
--- a/modular_citadel/code/datums/traits/neutral.dm
+++ b/modular_citadel/code/datums/traits/neutral.dm
@@ -4,6 +4,7 @@
name = "Nymphomania"
desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual."
value = 0
+ mob_trait = TRAIT_NYMPHO
gain_text = "You are feeling extra wild."
lose_text = "You don't feel that burning sensation anymore."
@@ -22,3 +23,11 @@
if(M.canbearoused == FALSE)
to_chat(quirk_holder, "Having high libido is useless when you can't feel arousal at all!")
qdel(src)
+
+/datum/quirk/maso
+ name = "Masochism"
+ desc = "You are aroused by pain."
+ value = 0
+ mob_trait = TRAIT_MASO
+ gain_text = "You desire to be hurt."
+ lose_text = "Pain has become less exciting for you."
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index c0a4df2243..70f58b3159 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -373,4 +373,16 @@ datum/gear/darksabresheath
name = "French Beret"
category = SLOT_HEAD
path = /obj/item/clothing/head/frenchberet
- ckeywhitelist = list("notazoltan")
\ No newline at end of file
+ ckeywhitelist = list("notazoltan")
+
+/datum/gear/zuliecloak
+ name = "Project: Zul-E"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/hooded/cloak/zuliecloak
+ ckeywhitelist = list("asky")
+
+/datum/gear/blackredgold
+ name = "Black, Red, and Gold Coat"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/blackredgold
+ ckeywhitelist = list("ttbnc")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index b7f7aea0e8..e1b1110cf8 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -454,3 +454,34 @@
icon_state = "moveralls"
mutantrace_variation = NO_MUTANTRACE_VARIATION
+/obj/item/clothing/suit/hooded/cloak/zuliecloak
+ name = "Project: Zul-E"
+ desc = "A standard version of a prototype cloak given out by Nanotrasen higher ups. It's surprisingly thick and heavy for a cloak despite having most of it's tech stripped. It also comes with a bluespace trinket which calls it's accompanying hat onto the user. A worn inscription on the inside of the cloak reads 'Fleuret' ...the rest is faded away."
+ icon_state = "zuliecloak"
+ item_state = "zuliecloak"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ hoodtype = /obj/item/clothing/head/hooded/cloakhood/zuliecloak
+ body_parts_covered = CHEST|GROIN|ARMS
+ slot_flags = SLOT_WEAR_SUIT | ITEM_SLOT_NECK //it's a cloak. it's cosmetic. so why the hell not? what could possibly go wrong?
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/head/hooded/cloakhood/zuliecloak
+ name = "NT Special Issue"
+ desc = "This hat is unquestionably the best one, bluespaced to and from CentComm. It smells of Fish and Tea with a hint of antagonism"
+ icon_state = "zuliecap"
+ item_state = "zuliecap"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ flags_inv = HIDEEARS|HIDEHAIR
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/suit/blackredgold
+ name = "Multicolor Coat"
+ desc = "An oddly special looking coat with black, red, and gold"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ icon_state = "redgoldjacket"
+ item_state = "redgoldjacket"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
\ No newline at end of file
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi
index e1284679b3..a96f18c3ce 100644
Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
index c19fb01161..1f1f506d9f 100644
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ
diff --git a/modular_citadel/icons/mob/taur_naga.dmi b/modular_citadel/icons/mob/taur_naga.dmi
index f4d6a6139f..1ca4509db7 100644
Binary files a/modular_citadel/icons/mob/taur_naga.dmi and b/modular_citadel/icons/mob/taur_naga.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index fe53839289..cbbec7f02d 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1496,6 +1496,7 @@
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
+#include "code\modules\clothing\shoes\taeclowndo.dm"
#include "code\modules\clothing\shoes\vg_shoes.dm"
#include "code\modules\clothing\spacesuits\_spacesuits.dm"
#include "code\modules\clothing\spacesuits\chronosuit.dm"
@@ -2663,6 +2664,7 @@
#include "code\modules\spells\spell_types\shapeshift.dm"
#include "code\modules\spells\spell_types\spacetime_distortion.dm"
#include "code\modules\spells\spell_types\summonitem.dm"
+#include "code\modules\spells\spell_types\taeclowndo.dm"
#include "code\modules\spells\spell_types\the_traps.dm"
#include "code\modules\spells\spell_types\touch_attacks.dm"
#include "code\modules\spells\spell_types\trigger.dm"