diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/thermic.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/thermic.dm
index 7abb7156d5..d51f6422fe 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/thermic.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/thermic.dm
@@ -28,6 +28,7 @@
melee_damage_lower = 10
melee_damage_upper = 25
+ attack_armor_pen = 15
heat_resist = 0.75
cold_resist = -0.50
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm
index 8d09b18fea..848fb7fafa 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm
@@ -1,252 +1,253 @@
-// Parrots can talk, and may repeat things it hears.
-/mob/living/simple_mob/animal/passive/bird/parrot
- name = "parrot"
- description_info = "You can give it a headset by clicking on it with a headset. \
- To remove it, click the bird while on grab intent."
- has_langs = list("Galactic Common", "Bird")
-
- ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot
-
- // A headset, so that talking parrots can yell at the crew over comms.
- // If set to a type, on initialize it will be instantiated into that type.
- var/obj/item/device/radio/headset/my_headset = null
-
-// Say list
-/datum/say_list/bird/poly
- speak = list(
- "Poly wanna cracker!",
- "Check the singulo, you chucklefucks!",
- "Wire the solars, you lazy bums!",
- "WHO TOOK THE DAMN HARDSUITS?",
- "OH GOD ITS FREE CALL THE SHUTTLE",
- "Danger! Crystal hyperstructure instability!",
- "CRYSTAL DELAMINATION IMMINENT.",
- "Tweet tweet, I'm a Teshari.",
- "Chitters.",
- "Meteors have been detected on a collision course with the station!"
- )
-
-// Lets the AI use headsets.
-// Player-controlled parrots will need to do it manually.
-/mob/living/simple_mob/animal/passive/bird/parrot/ISay(message)
- if(my_headset && prob(50))
- var/list/keys = list()
- for(var/channel in my_headset.channels)
- var/key = get_radio_key_from_channel(channel)
- if(key)
- keys += key
- if(keys.len)
- var/key_used = pick(keys)
- return say("[key_used] [message]")
- return say(message)
-
-// Ugly saycode so parrots can use their headsets.
-/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios)
- ..()
- if(message_mode)
- if(my_headset && istype(my_headset, /obj/item/device/radio))
- my_headset.talk_into(src, message, message_mode, verb, speaking)
- used_radios += my_headset
-
-// Clicked on while holding an object.
-/mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/device/radio/headset))
- give_headset(I, user)
- return
- return ..()
-
-// Clicked on by empty hand.
-/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L)
- if(L.a_intent == I_GRAB && my_headset)
- remove_headset(L)
- else
- ..()
-
-
-/mob/living/simple_mob/animal/passive/bird/parrot/proc/give_headset(obj/item/device/radio/headset/new_headset, mob/living/user)
- if(!istype(new_headset))
- to_chat(user, span("warning", "\The [new_headset] isn't a headset."))
- return
- if(my_headset)
- to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset]."))
- return
- else
- user.drop_item(new_headset)
- my_headset = new_headset
- new_headset.forceMove(src)
- to_chat(user, span("warning", "You place \a [new_headset] on \the [src]. You monster."))
- to_chat(src, span("notice", "\The [user] gives you \a [new_headset]. You should put it to good use immediately."))
- return
-
-/mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user)
- if(!my_headset)
- to_chat(user, "\The [src] doesn't have a headset to remove, thankfully.")
- else
- ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
- my_headset.forceMove(get_turf(src))
- user.put_in_hands(my_headset)
- to_chat(user, span("notice", "You take away \the [src]'s [my_headset.name]. Finally."))
- to_chat(src, span("warning", "\The [user] takes your [my_headset.name] away! How cruel!"))
- my_headset = null
-
-/mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user)
- . = ..()
- if(my_headset)
- . += "It is wearing \a [my_headset]."
-
-/mob/living/simple_mob/animal/passive/bird/parrot/Initialize()
- if(my_headset)
- my_headset = new my_headset(src)
- return ..()
-
-// Subtypes.
-
-// Best Bird
-/mob/living/simple_mob/animal/passive/bird/parrot/poly
- name = "Poly"
- desc = "It's a parrot. An expert on quantum cracker theory."
- icon_state = "poly"
- icon_rest = "poly-held"
- icon_dead = "poly-dead"
- tt_desc = "E Ara macao"
- //my_headset = /obj/item/device/radio/headset/headset_eng //VOREStation Removal
- say_list_type = /datum/say_list/bird/poly
-
-// Best Bird with best headset.
-/mob/living/simple_mob/animal/passive/bird/parrot/poly/ultimate
- my_headset = /obj/item/device/radio/headset/omni
-
-/mob/living/simple_mob/animal/passive/bird/parrot/kea
- name = "kea"
- desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \
- They are known to be intelligent and curious, which has made some consider them a pest."
- icon_state = "kea"
- icon_rest = "kea-held"
- icon_dead = "kea-dead"
- tt_desc = "E Nestor notabilis"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/eclectus
- name = "eclectus"
- desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \
- A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage."
- icon_state = "eclectus"
- icon_rest = "eclectus-held"
- icon_dead = "eclectus-dead"
- tt_desc = "E Eclectus roratus"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
- gender = pick(MALE, FEMALE)
- if(gender == FEMALE)
- icon_state = "eclectusf"
- icon_rest = "eclectusf-held"
- icon_dead = "eclectusf-dead"
- return ..()
-
-/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
- name = "grey parrot"
- desc = "A species of parrot. This one is predominantly grey, but has red tail feathers."
- icon_state = "agrey"
- icon_rest = "agrey-held"
- icon_dead = "agrey-dead"
- tt_desc = "E Psittacus erithacus"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
- name = "black-headed caique"
- desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques."
- icon_state = "bcaique"
- icon_rest = "bcaique-held"
- icon_dead = "bcaique-dead"
- tt_desc = "E Pionites melanocephalus"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/white_caique
- name = "white-bellied caique"
- desc = "A species of parrot, they are also known as the Green-Thighed Parrot."
- icon_state = "wcaique"
- icon_rest = "wcaique-held"
- icon_dead = "wcaique-dead"
- tt_desc = "E Pionites leucogaster"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
- name = "budgerigar"
- desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
- This one is has its natural colors of green and yellow."
- icon_state = "gbudge"
- icon_rest = "gbudge-held"
- icon_dead = "gbudge-dead"
- tt_desc = "E Melopsittacus undulatus"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
- icon_state = "bbudge"
- icon_rest = "bbudge-held"
- icon_dead = "bbudge-dead"
- desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
- This one has a mutation which altered its color to be blue instead of green and yellow."
-
-/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen
- icon_state = "bgbudge"
- icon_rest = "bgbudge-held"
- icon_dead = "bgbudge-dead"
- desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
- This one has a mutation which altered its color to be a mix of blue and green."
-
-/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel
- name = "cockatiel"
- desc = "A species of parrot. This one has a highly visible crest."
- icon_state = "tiel"
- icon_rest = "tiel-held"
- icon_dead = "tiel-dead"
- tt_desc = "E Nymphicus hollandicus"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
- icon_state = "wtiel"
- icon_rest = "wtiel-held"
- icon_dead = "wtiel-dead"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
- icon_state = "luttiel"
- icon_rest = "luttiel-held"
- icon_dead = "luttiel-dead"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey
- icon_state = "blutiel" // idk why this is blu.
- icon_rest = "blutiel-held"
- icon_dead = "blutiel-dead"
-
-// This actually might be the yellow-crested cockatoo but idk.
-/mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo
- name = "sulphur-crested cockatoo"
- desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow."
- icon_state = "too"
- icon_rest = "too-held"
- icon_dead = "too-dead"
- tt_desc = "E Cacatua galerita"
-
-// This was originally called 'hooded_too', which might not mean the unbrella cockatoo but idk.
-/mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo
- name = "white cockatoo"
- desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest."
- icon_state = "utoo"
- icon_rest = "utoo-held"
- icon_dead = "utoo-dead"
- tt_desc = "E Cacatua alba"
-
-/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
- name = "pink cockatoo"
- desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \
- in honor of a human surveyor and explorer who existed before humans fully explored their home planet."
- icon_state = "mtoo"
- icon_rest = "mtoo-held"
- icon_dead = "mtoo-dead"
- tt_desc = "E Lophochroa leadbeateri"
-
-
-// AI
-/datum/ai_holder/simple_mob/passive/parrot
- speak_chance = 2
- base_wander_delay = 8
-
-/datum/ai_holder/simple_mob/passive/parrot/on_hear_say(mob/living/speaker, message)
- if(holder.stat || !holder.say_list || !message || speaker == holder)
- return
- var/datum/say_list/S = holder.say_list
- S.speak |= message
\ No newline at end of file
+// Parrots can talk, and may repeat things it hears.
+/mob/living/simple_mob/animal/passive/bird/parrot
+ name = "parrot"
+ description_info = "You can give it a headset by clicking on it with a headset. \
+ To remove it, click the bird while on grab intent."
+ has_langs = list("Galactic Common", "Bird")
+
+ ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot
+
+ // A headset, so that talking parrots can yell at the crew over comms.
+ // If set to a type, on initialize it will be instantiated into that type.
+ var/obj/item/device/radio/headset/my_headset = null
+
+// Say list
+/datum/say_list/bird/poly
+ speak = list(
+ "Poly wanna cracker!",
+ "Check the singulo, you chucklefucks!",
+ "Wire the solars, you lazy bums!",
+ "WHO TOOK THE DAMN HARDSUITS?",
+ "OH GOD ITS FREE CALL THE SHUTTLE",
+ "Danger! Crystal hyperstructure instability!",
+ "CRYSTAL DELAMINATION IMMINENT.",
+ "Tweet tweet, I'm a Teshari.",
+ "Chitters.",
+ "Meteors have been detected on a collision course with the station!"
+ )
+
+// Lets the AI use headsets.
+// Player-controlled parrots will need to do it manually.
+/mob/living/simple_mob/animal/passive/bird/parrot/ISay(message)
+ if(my_headset && prob(50))
+ var/list/keys = list()
+ for(var/channel in my_headset.channels)
+ var/key = get_radio_key_from_channel(channel)
+ if(key)
+ keys += key
+ if(keys.len)
+ var/key_used = pick(keys)
+ return say("[key_used] [message]")
+ return say(message)
+
+// Ugly saycode so parrots can use their headsets.
+/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios)
+ ..()
+ if(message_mode)
+ if(my_headset && istype(my_headset, /obj/item/device/radio))
+ my_headset.talk_into(src, message, message_mode, verb, speaking)
+ used_radios += my_headset
+
+// Clicked on while holding an object.
+/mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/device/radio/headset))
+ give_headset(I, user)
+ return
+ return ..()
+
+// Clicked on by empty hand.
+/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L)
+ if(L.a_intent == I_GRAB && my_headset)
+ remove_headset(L)
+ else
+ ..()
+
+
+/mob/living/simple_mob/animal/passive/bird/parrot/proc/give_headset(obj/item/device/radio/headset/new_headset, mob/living/user)
+ if(!istype(new_headset))
+ to_chat(user, span("warning", "\The [new_headset] isn't a headset."))
+ return
+ if(my_headset)
+ to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset]."))
+ return
+ else
+ user.drop_item(new_headset)
+ my_headset = new_headset
+ new_headset.forceMove(src)
+ to_chat(user, span("warning", "You place \a [new_headset] on \the [src]. You monster."))
+ to_chat(src, span("notice", "\The [user] gives you \a [new_headset]. You should put it to good use immediately."))
+ return
+
+/mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user)
+ if(!my_headset)
+ to_chat(user, "\The [src] doesn't have a headset to remove, thankfully.")
+ else
+ ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
+ my_headset.forceMove(get_turf(src))
+ user.put_in_hands(my_headset)
+ to_chat(user, span("notice", "You take away \the [src]'s [my_headset.name]. Finally."))
+ to_chat(src, span("warning", "\The [user] takes your [my_headset.name] away! How cruel!"))
+ my_headset = null
+
+/mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user)
+ . = ..()
+ if(my_headset)
+ . += "It is wearing \a [my_headset]."
+
+/mob/living/simple_mob/animal/passive/bird/parrot/Initialize()
+ if(my_headset)
+ my_headset = new my_headset(src)
+ return ..()
+
+// Subtypes.
+
+// Best Bird
+/mob/living/simple_mob/animal/passive/bird/parrot/poly
+ name = "Poly"
+ desc = "It's a parrot. An expert on quantum cracker theory."
+ icon_state = "poly"
+ icon_rest = "poly-held"
+ icon_dead = "poly-dead"
+ tt_desc = "E Ara macao"
+ attack_armor_pen = 20 //HE HAS THE B E A K
+ my_headset = /obj/item/device/radio/headset/headset_eng
+ say_list_type = /datum/say_list/bird/poly
+
+// Best Bird with best headset.
+/mob/living/simple_mob/animal/passive/bird/parrot/poly/ultimate
+ my_headset = /obj/item/device/radio/headset/omni
+
+/mob/living/simple_mob/animal/passive/bird/parrot/kea
+ name = "kea"
+ desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \
+ They are known to be intelligent and curious, which has made some consider them a pest."
+ icon_state = "kea"
+ icon_rest = "kea-held"
+ icon_dead = "kea-dead"
+ tt_desc = "E Nestor notabilis"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/eclectus
+ name = "eclectus"
+ desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \
+ A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage."
+ icon_state = "eclectus"
+ icon_rest = "eclectus-held"
+ icon_dead = "eclectus-dead"
+ tt_desc = "E Eclectus roratus"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
+ gender = pick(MALE, FEMALE)
+ if(gender == FEMALE)
+ icon_state = "eclectusf"
+ icon_rest = "eclectusf-held"
+ icon_dead = "eclectusf-dead"
+ return ..()
+
+/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
+ name = "grey parrot"
+ desc = "A species of parrot. This one is predominantly grey, but has red tail feathers."
+ icon_state = "agrey"
+ icon_rest = "agrey-held"
+ icon_dead = "agrey-dead"
+ tt_desc = "E Psittacus erithacus"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
+ name = "black-headed caique"
+ desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques."
+ icon_state = "bcaique"
+ icon_rest = "bcaique-held"
+ icon_dead = "bcaique-dead"
+ tt_desc = "E Pionites melanocephalus"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/white_caique
+ name = "white-bellied caique"
+ desc = "A species of parrot, they are also known as the Green-Thighed Parrot."
+ icon_state = "wcaique"
+ icon_rest = "wcaique-held"
+ icon_dead = "wcaique-dead"
+ tt_desc = "E Pionites leucogaster"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
+ name = "budgerigar"
+ desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
+ This one is has its natural colors of green and yellow."
+ icon_state = "gbudge"
+ icon_rest = "gbudge-held"
+ icon_dead = "gbudge-dead"
+ tt_desc = "E Melopsittacus undulatus"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
+ icon_state = "bbudge"
+ icon_rest = "bbudge-held"
+ icon_dead = "bbudge-dead"
+ desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
+ This one has a mutation which altered its color to be blue instead of green and yellow."
+
+/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen
+ icon_state = "bgbudge"
+ icon_rest = "bgbudge-held"
+ icon_dead = "bgbudge-dead"
+ desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
+ This one has a mutation which altered its color to be a mix of blue and green."
+
+/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel
+ name = "cockatiel"
+ desc = "A species of parrot. This one has a highly visible crest."
+ icon_state = "tiel"
+ icon_rest = "tiel-held"
+ icon_dead = "tiel-dead"
+ tt_desc = "E Nymphicus hollandicus"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
+ icon_state = "wtiel"
+ icon_rest = "wtiel-held"
+ icon_dead = "wtiel-dead"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
+ icon_state = "luttiel"
+ icon_rest = "luttiel-held"
+ icon_dead = "luttiel-dead"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey
+ icon_state = "blutiel" // idk why this is blu.
+ icon_rest = "blutiel-held"
+ icon_dead = "blutiel-dead"
+
+// This actually might be the yellow-crested cockatoo but idk.
+/mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo
+ name = "sulphur-crested cockatoo"
+ desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow."
+ icon_state = "too"
+ icon_rest = "too-held"
+ icon_dead = "too-dead"
+ tt_desc = "E Cacatua galerita"
+
+// This was originally called 'hooded_too', which might not mean the unbrella cockatoo but idk.
+/mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo
+ name = "white cockatoo"
+ desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest."
+ icon_state = "utoo"
+ icon_rest = "utoo-held"
+ icon_dead = "utoo-dead"
+ tt_desc = "E Cacatua alba"
+
+/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
+ name = "pink cockatoo"
+ desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \
+ in honor of a human surveyor and explorer who existed before humans fully explored their home planet."
+ icon_state = "mtoo"
+ icon_rest = "mtoo-held"
+ icon_dead = "mtoo-dead"
+ tt_desc = "E Lophochroa leadbeateri"
+
+
+// AI
+/datum/ai_holder/simple_mob/passive/parrot
+ speak_chance = 2
+ base_wander_delay = 8
+
+/datum/ai_holder/simple_mob/passive/parrot/on_hear_say(mob/living/speaker, message)
+ if(holder.stat || !holder.say_list || !message || speaker == holder)
+ return
+ var/datum/say_list/S = holder.say_list
+ S.speak |= message
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm
index 9502940343..7c371e078d 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm
@@ -22,6 +22,7 @@
harm_intent_damage = 5
melee_damage_lower = 25
melee_damage_upper = 25
+ attack_armor_pen = 15 //It's a freaking alien.
attack_sharp = TRUE
attack_edge = TRUE
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
index c24d932a72..60532385ad 100644
--- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
@@ -24,6 +24,7 @@
harm_intent_damage = 5
melee_damage_lower = 15 //Tac Knife damage
melee_damage_upper = 15
+ attack_armor_pen = 20
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm
index cc16cebedc..3927b1dcf1 100644
--- a/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/pirates.dm
@@ -15,7 +15,7 @@
harm_intent_damage = 5
melee_damage_lower = 30
melee_damage_upper = 30
- attack_armor_pen = 50
+ attack_armor_pen = 30
attack_sharp = 1
attack_edge = 1
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm
index ce679f90de..121e112a7a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/russian.dm
@@ -14,6 +14,7 @@
response_harm = "hits"
harm_intent_damage = 5
+ attack_armor_pen = 15
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = list("punched")
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm
index 808e5c6c38..5071f10b34 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm
@@ -1,152 +1,153 @@
-// The GOLEM is a spell-flinging synthetic.
-
-/mob/living/simple_mob/mechanical/technomancer_golem
- name = "unknown synthetic"
- desc = "A rather unusual looking synthetic."
- icon = 'icons/mob/mob.dmi'
- icon_state = "golem"
- health = 300
- maxHealth = 300
-
- faction = "golem"
-
- response_help = "pets"
- response_disarm = "pushes away"
- response_harm = "punches"
- harm_intent_damage = 3
- friendly = "hugs"
-
- melee_damage_lower = 30 // It has a built in esword.
- melee_damage_upper = 30
- attack_sound = 'sound/weapons/blade1.ogg'
- attacktext = list("slashed")
- melee_attack_delay = 0.5 SECONDS // Even has custom attack animations.
- ranged_attack_delay = 0.5 SECONDS
- special_attack_delay = 1 SECOND
-
- special_attack_min_range = 0
- special_attack_max_range = 7
-
- ai_holder_type = /datum/ai_holder/simple_mob/melee
-
- var/obj/item/weapon/technomancer_core/golem/core = null
- var/obj/item/weapon/spell/active_spell = null // Shield and ranged spells
- var/mob/living/master = null
- var/casting = FALSE // Used to ensure the correct animation is played. Testing if a spell exists won't always work as some spells delete themselves upon use.
-
- var/list/known_spells = list(
- "beam" = /obj/item/weapon/spell/projectile/beam,
- "chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning,
- "force missile" = /obj/item/weapon/spell/projectile/force_missile,
- "ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt,
- "lightning" = /obj/item/weapon/spell/projectile/lightning,
- "blink" = /obj/item/weapon/spell/blink,
- "dispel" = /obj/item/weapon/spell/dispel,
- "oxygenate" = /obj/item/weapon/spell/oxygenate,
- "mend life" = /obj/item/weapon/spell/modifier/mend_life,
- "mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
- "mend organs" = /obj/item/weapon/spell/mend_organs,
- "purify" = /obj/item/weapon/spell/modifier/purify,
- "resurrect" = /obj/item/weapon/spell/resurrect,
- "passwall" = /obj/item/weapon/spell/passwall,
- "repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
- "corona" = /obj/item/weapon/spell/modifier/corona,
- "haste" = /obj/item/weapon/spell/modifier/haste
- )
-
-/mob/living/simple_mob/mechanical/technomancer_golem/Initialize()
- core = new(src)
- return ..()
-
-/mob/living/simple_mob/mechanical/technomancer_golem/Destroy()
- qdel(core)
- return ..()
-
-/mob/living/simple_mob/mechanical/technomancer_golem/unref_spell()
- active_spell = null
- return ..()
-
-/mob/living/simple_mob/mechanical/technomancer_golem/death()
- ..()
- visible_message("\The [src] disintegrates!")
- new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- qdel(src)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/place_spell_in_hand(var/path)
- if(!path || !ispath(path))
- return FALSE
- if(active_spell)
- qdel(active_spell)
-
- active_spell = new path(src)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/verb/test_giving_spells()
- var/choice = input(usr, "What spell?", "Give spell") as null|anything in known_spells
- if(choice)
- place_spell_in_hand(known_spells[choice])
- else
- qdel(active_spell)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/get_technomancer_core()
- return core
-
-/mob/living/simple_mob/mechanical/technomancer_golem/can_special_attack(atom/A)
- if(active_spell) // Don't bother checking everything else if no spell is ready.
- return ..()
- return FALSE
-
-/mob/living/simple_mob/mechanical/technomancer_golem/should_special_attack(atom/A)
- return instability < 50 // Don't kill ourselves by casting everything.
-
-
-/mob/living/simple_mob/mechanical/technomancer_golem/do_special_attack(atom/A)
- var/proximity = Adjacent(A)
- if(active_spell)
- if(proximity && active_spell.cast_methods & CAST_MELEE) // Use melee method if available and close enough.
- return active_spell.on_melee_cast(A, src)
- else if(active_spell.cast_methods & CAST_RANGED) // Otherwise use ranged if possible. Will also work for point-blank range.
- return active_spell.on_ranged_cast(A, src)
- return ..()
-
-/mob/living/simple_mob/mechanical/technomancer_golem/melee_pre_animation(atom/A)
- if(active_spell && active_spell.cast_methods & CAST_MELEE|CAST_RANGED) // If they're trying to melee-cast a spell, use the special animation instead.
- special_pre_animation(A)
- return
-
- flick("golem_pre_melee", src) // To force the animation to restart.
- icon_living = "golem_pre_melee" // The animation will hold after this point until melee_post_animation() gets called.
- icon_state = "golem_pre_melee"
- setClickCooldown(2)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/melee_post_animation(atom/A)
- if(casting) // Some spells delete themselves when used, so we use a different variable set earlier instead.
- special_post_animation(A)
- return
-
- flick("golem_post_melee", src)
- icon_living = "golem"
- icon_state = "golem"
- setClickCooldown(6)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/ranged_pre_animation(atom/A)
- flick("golem_pre_ranged", src)
- icon_living = "golem_pre_ranged"
- icon_state = "golem_pre_ranged"
- setClickCooldown(5)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/ranged_post_animation(atom/A)
- flick("golem_post_ranged", src)
- icon_living = "golem"
- icon_state = "golem"
- setClickCooldown(5)
-
-/mob/living/simple_mob/mechanical/technomancer_golem/special_pre_animation(atom/A)
- casting = TRUE
- ranged_pre_animation(A) // Both have the same animation.
-
-/mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A)
- casting = FALSE
- ranged_post_animation(A)
+// The GOLEM is a spell-flinging synthetic.
+
+/mob/living/simple_mob/mechanical/technomancer_golem
+ name = "unknown synthetic"
+ desc = "A rather unusual looking synthetic."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "golem"
+ health = 300
+ maxHealth = 300
+
+ faction = "golem"
+
+ response_help = "pets"
+ response_disarm = "pushes away"
+ response_harm = "punches"
+ harm_intent_damage = 3
+ friendly = "hugs"
+
+ melee_damage_lower = 30 // It has a built in esword.
+ melee_damage_upper = 30
+ attack_armor_pen = 20
+ attack_sound = 'sound/weapons/blade1.ogg'
+ attacktext = list("slashed")
+ melee_attack_delay = 0.5 SECONDS // Even has custom attack animations.
+ ranged_attack_delay = 0.5 SECONDS
+ special_attack_delay = 1 SECOND
+
+ special_attack_min_range = 0
+ special_attack_max_range = 7
+
+ ai_holder_type = /datum/ai_holder/simple_mob/melee
+
+ var/obj/item/weapon/technomancer_core/golem/core = null
+ var/obj/item/weapon/spell/active_spell = null // Shield and ranged spells
+ var/mob/living/master = null
+ var/casting = FALSE // Used to ensure the correct animation is played. Testing if a spell exists won't always work as some spells delete themselves upon use.
+
+ var/list/known_spells = list(
+ "beam" = /obj/item/weapon/spell/projectile/beam,
+ "chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning,
+ "force missile" = /obj/item/weapon/spell/projectile/force_missile,
+ "ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt,
+ "lightning" = /obj/item/weapon/spell/projectile/lightning,
+ "blink" = /obj/item/weapon/spell/blink,
+ "dispel" = /obj/item/weapon/spell/dispel,
+ "oxygenate" = /obj/item/weapon/spell/oxygenate,
+ "mend life" = /obj/item/weapon/spell/modifier/mend_life,
+ "mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
+ "mend organs" = /obj/item/weapon/spell/mend_organs,
+ "purify" = /obj/item/weapon/spell/modifier/purify,
+ "resurrect" = /obj/item/weapon/spell/resurrect,
+ "passwall" = /obj/item/weapon/spell/passwall,
+ "repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
+ "corona" = /obj/item/weapon/spell/modifier/corona,
+ "haste" = /obj/item/weapon/spell/modifier/haste
+ )
+
+/mob/living/simple_mob/mechanical/technomancer_golem/Initialize()
+ core = new(src)
+ return ..()
+
+/mob/living/simple_mob/mechanical/technomancer_golem/Destroy()
+ qdel(core)
+ return ..()
+
+/mob/living/simple_mob/mechanical/technomancer_golem/unref_spell()
+ active_spell = null
+ return ..()
+
+/mob/living/simple_mob/mechanical/technomancer_golem/death()
+ ..()
+ visible_message("\The [src] disintegrates!")
+ new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ qdel(src)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/place_spell_in_hand(var/path)
+ if(!path || !ispath(path))
+ return FALSE
+ if(active_spell)
+ qdel(active_spell)
+
+ active_spell = new path(src)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/verb/test_giving_spells()
+ var/choice = input(usr, "What spell?", "Give spell") as null|anything in known_spells
+ if(choice)
+ place_spell_in_hand(known_spells[choice])
+ else
+ qdel(active_spell)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/get_technomancer_core()
+ return core
+
+/mob/living/simple_mob/mechanical/technomancer_golem/can_special_attack(atom/A)
+ if(active_spell) // Don't bother checking everything else if no spell is ready.
+ return ..()
+ return FALSE
+
+/mob/living/simple_mob/mechanical/technomancer_golem/should_special_attack(atom/A)
+ return instability < 50 // Don't kill ourselves by casting everything.
+
+
+/mob/living/simple_mob/mechanical/technomancer_golem/do_special_attack(atom/A)
+ var/proximity = Adjacent(A)
+ if(active_spell)
+ if(proximity && active_spell.cast_methods & CAST_MELEE) // Use melee method if available and close enough.
+ return active_spell.on_melee_cast(A, src)
+ else if(active_spell.cast_methods & CAST_RANGED) // Otherwise use ranged if possible. Will also work for point-blank range.
+ return active_spell.on_ranged_cast(A, src)
+ return ..()
+
+/mob/living/simple_mob/mechanical/technomancer_golem/melee_pre_animation(atom/A)
+ if(active_spell && active_spell.cast_methods & CAST_MELEE|CAST_RANGED) // If they're trying to melee-cast a spell, use the special animation instead.
+ special_pre_animation(A)
+ return
+
+ flick("golem_pre_melee", src) // To force the animation to restart.
+ icon_living = "golem_pre_melee" // The animation will hold after this point until melee_post_animation() gets called.
+ icon_state = "golem_pre_melee"
+ setClickCooldown(2)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/melee_post_animation(atom/A)
+ if(casting) // Some spells delete themselves when used, so we use a different variable set earlier instead.
+ special_post_animation(A)
+ return
+
+ flick("golem_post_melee", src)
+ icon_living = "golem"
+ icon_state = "golem"
+ setClickCooldown(6)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/ranged_pre_animation(atom/A)
+ flick("golem_pre_ranged", src)
+ icon_living = "golem_pre_ranged"
+ icon_state = "golem_pre_ranged"
+ setClickCooldown(5)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/ranged_post_animation(atom/A)
+ flick("golem_post_ranged", src)
+ icon_living = "golem"
+ icon_state = "golem"
+ setClickCooldown(5)
+
+/mob/living/simple_mob/mechanical/technomancer_golem/special_pre_animation(atom/A)
+ casting = TRUE
+ ranged_pre_animation(A) // Both have the same animation.
+
+/mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A)
+ casting = FALSE
+ ranged_post_animation(A)
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm
index c90d0413be..667c514f0b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm
@@ -46,6 +46,7 @@
health = 1 LASERS_TO_KILL
melee_damage_lower = 8
melee_damage_upper = 8
+ attack_armor_pen = 5
/datum/ai_holder/simple_mob/hivebot
pointblank = TRUE
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm
index 89281bf4fc..3b39c4121e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm
@@ -87,3 +87,9 @@
if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards
return TRUE
return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3
+
+// Variant that has high armor pen. Slightly slower attack speed and movement. Meant to be dispersed in groups with other ones
+/mob/living/simple_mob/mechanical/viscerator/piercing.
+ attack_armor_pen = 20
+ base_attack_cooldown = 10 // One attack a second or so.
+ movement_cooldown = 0.5