diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 4497f170a2d87..287a49a0b2e87 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -11,12 +11,6 @@
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
if(proximity && istype(G) && G.Touch(A, 1))
return
-
- if(HULK in mutations)
- if(proximity) //no telekinetic hulk attack
- if(A.attack_hulk(src))
- return
-
if(buckled && isstructure(buckled))
var/obj/structure/S = buckled
if(S.prevents_buckled_mobs_attacking())
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 1ff66c1bf0fef..232f160abce9a 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -200,13 +200,6 @@
/atom/proc/mech_melee_attack(obj/mecha/M)
return
-/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
- if(does_attack_animation)
- user.changeNext_move(CLICK_CD_MELEE)
- add_attack_logs(user, src, "Punched with hulk powers")
- user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
-
/atom/proc/CheckParts(list/parts_list)
for(var/A in parts_list)
if(istype(A, /datum/reagent))
diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm
index d893c64565cab..a23b358c1c50c 100644
--- a/code/game/dna/genes/powers.dm
+++ b/code/game/dna/genes/powers.dm
@@ -136,14 +136,13 @@
..()
block = GLOB.hulkblock
-/datum/dna/gene/basic/hulk/activate(mob/M, connected, flags)
+/datum/dna/gene/basic/hulk/activate(mob/M)
..()
- var/status = CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH
- M.status_flags &= ~status
+ M.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_transform)
-/datum/dna/gene/basic/hulk/deactivate(mob/M, connected, flags)
+/datum/dna/gene/basic/hulk/deactivate(mob/M)
..()
- M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH
+ M.RemoveSpell(/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_transform)
/datum/dna/gene/basic/hulk/OnDrawUnderlays(mob/M, g)
if(HULK in M.mutations)
@@ -159,7 +158,6 @@
genemutcheck(M, GLOB.hulkblock,null,MUTCHK_FORCED)
M.update_mutations() //update our mutation overlays
M.update_body()
- M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved.
to_chat(M, "You suddenly feel very weak.")
/datum/dna/gene/basic/xray
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index afe8e3fabe721..990f5c06822f7 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -147,9 +147,6 @@
..()
take_damage(power / 400, BURN, "energy")
-/obj/structure/blob/hulk_damage()
- return 15
-
/obj/structure/blob/attack_animal(mob/living/simple_animal/M)
if(ROLE_BLOB in M.faction) //sorry, but you can't kill the blob as a blobbernaut
return
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 551f58594bb6c..3759d09ce6903 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -31,13 +31,6 @@
patient = null
return ..()
-/obj/machinery/optable/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- ..(user, TRUE)
- visible_message("[user] destroys the operating table!")
- qdel(src)
- return TRUE
-
/obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0)
if(height == 0)
return TRUE
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index d670c42e5a863..94150a9fda171 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -714,6 +714,11 @@ About the new airlock wires panel:
if(isElectrified())
shock(user, 100)
+/obj/machinery/door/airlock/attack_animal(mob/user)
+ if(istype(user, /mob/living/simple_animal/hulk))
+ var/mob/living/simple_animal/hulk/H = user
+ H.attack_hulk(src)
+
/obj/machinery/door/airlock/attack_hand(mob/user)
if(shock_user(user, 100))
return
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index b19888ba90716..4261cba745f7b 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -178,6 +178,11 @@
if(user.can_advanced_admin_interact())
forcetoggle(TRUE)
+/obj/machinery/door/firedoor/attack_animal(mob/user)
+ if(istype(user, /mob/living/simple_animal/hulk))
+ var/mob/living/simple_animal/hulk/H = user
+ H.attack_hulk(src)
+
/obj/machinery/door/firedoor/attack_alien(mob/user)
add_fingerprint(user)
if(welded)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 64e490b85a6e3..ab13a8de34296 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -569,15 +569,6 @@
attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect)
return TRUE
-/obj/mecha/hulk_damage()
- return 15
-
-/obj/mecha/attack_hulk(mob/living/carbon/human/user)
- . = ..()
- if(.)
- log_message("Attack by hulk. Attacker - [user].", 1)
- add_attack_logs(user, OCCUPANT_LOGGING, "Hulk punched mech [src]")
-
/obj/mecha/blob_act(obj/structure/blob/B)
log_message("Attack by blob. Attacker - [B].")
take_damage(30, BRUTE, "melee", 0, get_dir(src, B))
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index 625d2ad8fd9d3..a403615df9d90 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -12,9 +12,6 @@
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
return
-/obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- return FALSE
-
/obj/effect/singularity_act()
qdel(src)
return FALSE
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 5052874f5cc2e..50293709322a4 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -620,9 +620,6 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
/obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
return
-/obj/item/attack_hulk(mob/living/carbon/human/user)
- return FALSE
-
/obj/item/attack_animal(mob/living/simple_animal/M)
if(can_be_hit)
return ..()
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index cfaea9f32f9d9..fd3ea10fdb369 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -78,13 +78,6 @@
return
if(!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
- return
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if((HULK in H.mutations) || (NOGUNS in H.dna.species.species_traits))
- user << "Your fingers can't press the button!"
- return
-
add_fingerprint(user)
//nothing happens if the battery is drained
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 96509d658b3f0..0ddf8c1633af0 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -297,10 +297,6 @@
..()
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/user)
- if(HULK in user.mutations)
- to_chat(user, "You grip the blade too hard and accidentally close it!")
- unwield()
- return
..()
if((CLUMSY in user.mutations) && (wielded) && prob(40))
to_chat(user, "You twirl around a bit before losing your balance and impaling yourself on the [src].")
@@ -321,11 +317,6 @@
return ..()
return FALSE
-/obj/item/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
- if(wielded)
- to_chat(user, "You can't pick up such a dangerous item with your meaty hands without losing fingers, better not to!")
- return TRUE
-
/obj/item/twohanded/dualsaber/green
blade_color = "green"
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index e41d2173c238e..bd391012b0f7b 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -71,21 +71,6 @@
take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration)
///Called to get the damage that hulks will deal to the obj.
-/obj/proc/hulk_damage()
- return 150 //the damage hulks do on punches to this object, is affected by melee armor
-
-/obj/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- ..(user, TRUE)
- visible_message("[user] smashes [src]!")
- if(density)
- playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- else
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- take_damage(hulk_damage(), BRUTE, "melee", 0, get_dir(src, user))
- return TRUE
- return FALSE
/obj/blob_act(obj/structure/blob/B)
if(isturf(loc))
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index b1e0f40b8d9ef..ef9dcbbae3e30 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -73,15 +73,6 @@
if(. && !QDELETED(src) && !shock(user, 70))
take_damage(rand(5,10), BRUTE, "melee", 1)
-/obj/structure/grille/hulk_damage()
- return 60
-
-/obj/structure/grille/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- if(!shock(user, 70))
- ..(user, TRUE)
- return TRUE
-
/obj/structure/grille/attack_hand(mob/living/user)
. = ..()
if(.)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 65c212af72330..b7367d0a258c8 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -175,11 +175,6 @@ GLOBAL_LIST_INIT(wcCommon, pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e",
add_fingerprint(user)
playsound(src, 'sound/effects/glassknock.ogg', 50, 1)
-/obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
- if(!can_be_reached(user))
- return 1
- . = ..()
-
/obj/structure/window/attack_hand(mob/user)
if(!can_be_reached(user))
return
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 80325022e05ce..5b6aa30bce7d6 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -103,6 +103,13 @@
if(TURF_WET_PERMAFROST) // Permafrost
M.slip("the frosted floor", 0, 5, tilesSlipped = 1, walkSafely = 0, slipAny = 1)
+ var/mob/living/simple_animal/hulk/Hulk = A
+ if(istype(A, /mob/living/simple_animal/hulk))
+ if(!Hulk.lying)
+ playsound(src,'sound/effects/hulk_step.ogg', CHANNEL_BUZZ)
+ if (istype(A, /mob/living/simple_animal/hulk/clown_hulk))
+ if(!Hulk.lying)
+ playsound(src, pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg'), CHANNEL_BUZZ)
/turf/simulated/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
. = ..()
diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm
index 4f551fb485a08..5a2874acd9bc9 100644
--- a/code/game/turfs/simulated/floor/indestructible.dm
+++ b/code/game/turfs/simulated/floor/indestructible.dm
@@ -27,9 +27,6 @@
/turf/simulated/floor/indestructible/attack_hand(mob/user)
return
-/turf/simulated/floor/indestructible/attack_hulk(mob/user, does_attack_animation = FALSE)
- return
-
/turf/simulated/floor/indestructible/attack_animal(mob/living/simple_animal/M)
return
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 23d0c9789bd8e..3a0255c795c8e 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -271,19 +271,6 @@
to_chat(M, "You push the wall but nothing happens!")
return
-/turf/simulated/wall/attack_hulk(mob/user, does_attack_animation = FALSE)
- ..(user, TRUE)
-
- if(prob(hardness) || rotting)
- playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- dismantle_wall(TRUE)
- else
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- add_dent(WALL_DENT_HIT)
- to_chat(user, text("You punch the wall."))
- return TRUE
-
/turf/simulated/wall/attack_hand(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
if(rotting)
diff --git a/code/game/turfs/simulated/walls_indestructible.dm b/code/game/turfs/simulated/walls_indestructible.dm
index 6bb3cb9c22a98..e1a31a99a1605 100644
--- a/code/game/turfs/simulated/walls_indestructible.dm
+++ b/code/game/turfs/simulated/walls_indestructible.dm
@@ -36,9 +36,6 @@
/turf/simulated/wall/indestructible/attack_hand(mob/user)
return
-/turf/simulated/wall/indestructible/attack_hulk(mob/user, does_attack_animation = FALSE)
- return
-
/turf/simulated/wall/indestructible/attack_animal(mob/living/simple_animal/M)
return
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 56908a7ecae9f..54ce2d6178a92 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -115,13 +115,6 @@
for(var/i in 1 to 3)
new/obj/item/clockwork/alloy_shards/small(src)
-/turf/simulated/wall/clockwork/attack_hulk(mob/living/user, does_attack_animation = 0)
- ..()
- if(heated)
- to_chat(user, "The wall is searing hot to the touch!")
- user.adjustFireLoss(5)
- playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 50, TRUE)
-
/turf/simulated/wall/clockwork/mech_melee_attack(obj/mecha/M)
..()
if(heated)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 3174879caacf0..af04be5629d7d 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -1,21 +1,3 @@
-/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to hurt [src]!")
- return FALSE
- ..(user, TRUE)
- adjustBruteLoss(15)
- var/hitverb = "punched"
- if(mob_size < MOB_SIZE_LARGE)
- Paralyse(1)
- spawn(0)
- step_away(src, user, 15)
- sleep(1)
- step_away(src, user, 15)
- hitverb = "slammed"
- playsound(loc, "punch", 25, 1, -1)
- visible_message("[user] has [hitverb] [src]!", "[user] has [hitverb] [src]!")
- return TRUE
/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M)
if(..())
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index d13dab884b226..9a3d3eb8ee120 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -16,21 +16,6 @@
visible_message("[M] has attempted to kick [src]!", \
"[M] has attempted to kick [src]!")
-
-/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to hurt [src]!")
- return FALSE
- ..(user, TRUE)
- adjustBruteLoss(5 + rand(1, 9))
- spawn(0)
- Paralyse(1)
- step_away(src, user, 15)
- sleep(3)
- step_away(src, user, 15)
- return TRUE
-
/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
if(!no_effect && !visual_effect_icon)
visual_effect_icon = ATTACK_EFFECT_BITE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 0533af57057c0..73ea07dd31aac 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1776,9 +1776,6 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. = ..()
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
- if(HULK in mutations)
- to_chat(src, "Your meaty finger is much too large for the trigger guard!")
- return FALSE
if(NOGUNS in dna.species.species_traits)
to_chat(src, "Your fingers don't fit in the trigger guard!")
return FALSE
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 87d7165b8d3dd..9fca5102612f7 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -24,7 +24,7 @@ emp_act
var/list/safe_list = list(/obj/item/projectile/beam/lasertag, /obj/item/projectile/beam/practice)
if(is_type_in_list(P, safe_list)) //And it's safe
visible_message("The [P.name] gets reflected by [src]!", \
- "The [P.name] gets reflected by [src]!")
+ "The [P.name] gets reflected by [src]!")
P.reflect_back(src)
return -1 // complete projectile permutation
@@ -543,21 +543,6 @@ emp_act
w_uniform.add_mob_blood(source)
update_inv_w_uniform()
-/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to hurt [src]!")
- return FALSE
- var/hulk_verb = pick("smash", "pummel")
- if(check_shields(user, 15, "the [hulk_verb]ing"))
- return
- ..(user, TRUE)
- playsound(loc, user.dna.species.unarmed.attack_sound, 25, 1, -1)
- var/message = "[user] has [hulk_verb]ed [src]!"
- visible_message("[message]", "[message]")
- adjustBruteLoss(15)
- return TRUE
-
/mob/living/carbon/human/attack_hand(mob/user)
if(..()) //to allow surgery to return properly.
return
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index 36d11b0f2a2b7..db31cb9ff461c 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -41,18 +41,6 @@
if(L.a_intent == INTENT_HELP)
visible_message("[L.name] rubs its head against [src].")
-/mob/living/silicon/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to hurt [src]!")
- return FALSE
- ..(user, TRUE)
- adjustBruteLoss(rand(10, 15))
- playsound(loc, "punch", 25, 1, -1)
- visible_message("[user] has punched [src]!", "[user] has punched [src]!")
- return TRUE
- return FALSE
-
/mob/living/silicon/attack_hand(mob/living/carbon/human/M)
switch(M.a_intent)
if(INTENT_HELP)
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 28fff50a124c9..2320134177f99 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -29,17 +29,6 @@
updatehealth()
return TRUE
-/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- if(user.a_intent == INTENT_HARM)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to hurt [src]!")
- return FALSE
- ..(user, TRUE)
- playsound(loc, "punch", 25, 1, -1)
- visible_message("[user] has punched [src]!", "[user] has punched [src]!")
- adjustBruteLoss(15)
- return TRUE
-
/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M)
if(..()) //if harm or disarm intent.
if(M.a_intent == INTENT_DISARM)
diff --git a/code/modules/mob/living/simple_animal/hulk.dm b/code/modules/mob/living/simple_animal/hulk.dm
new file mode 100644
index 0000000000000..8512708592edd
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hulk.dm
@@ -0,0 +1,207 @@
+//Human hulk
+/mob/living/simple_animal/hulk
+ name = "Hulk"
+ real_name = "Hulk"
+ desc = "Big b♂y"
+ icon = 'icons/mob/Hulk.dmi'
+ icon_state = "Hulk"
+ icon_living = "Hulk"
+ maxHealth = 400
+ health = 400
+ speed = 1.25
+ harm_intent_damage = 20
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+
+ speak_emote = list("roars")
+ emote_hear = list("roars")
+ response_help = "thinks better of touching"
+ response_disarm = "flails at"
+ response_harm = "punches"
+ environment_smash = 2
+
+ a_intent = INTENT_HARM
+ stop_automated_movement = 1
+ status_flags = CANPUSH
+ universal_speak = 1
+ universal_understand = 1
+ attack_sound = list('sound/weapons/punch1.ogg')
+ minbodytemp = 0
+ var/hulk_powers = list()
+ var/mob/living/original_body
+ var/health_regen = 1.5
+
+/mob/living/simple_animal/hulk/human
+ hulk_powers = list(/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_jump,
+ /obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_dash)
+
+//Clown Hulk
+
+/mob/living/simple_animal/hulk/clown_hulk
+ name = "Champion of Honk"
+ real_name = "Champion of Honk"
+ icon = 'icons/mob/Hulk.dmi'
+ icon_state = "Champion of Honk"
+ icon_living = "Champion of Honk"
+ maxHealth = 250
+ health = 250
+ speed = 1
+ harm_intent_damage = 5
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+
+ speak_emote = list("honks")
+ emote_hear = list("honks")
+ attack_sound = list('sound/items/bikehorn.ogg')
+ health_regen = 6
+
+ hulk_powers = list(/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_honk,
+ /obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_joke)
+
+//Godzilla
+
+/mob/living/simple_animal/hulk/zilla
+ name = "Zilla"
+ real_name = " Zilla"
+ icon = 'icons/mob/zilla.dmi'
+ icon_state = "zilla"
+ icon_living = "zilla"
+ maxHealth = 450
+ health = 450
+ speed = 1.5
+ harm_intent_damage = 30
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+
+ speak_emote = list("gnaw")
+ emote_hear = list("gnaw")
+ attack_sound = list('sound/weapons/bite.ogg')
+ health_regen = 1.5
+
+ hulk_powers = list(/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_mill,
+ /obj/effect/proc_holder/spell/targeted/click/hulk/hulk_spit,
+ /obj/effect/proc_holder/spell/targeted/click/hulk/hulk_lazor)
+
+/mob/living/simple_animal/hulk/Life()
+ if(health < 1)
+ death()
+ return
+
+ var/matrix/Mx = matrix()
+ if(health < maxHealth * 0.2)
+ Mx.Scale(0.75)
+ Mx.Translate(0,-5)
+ else if(health < maxHealth * 0.4)
+ Mx.Scale(0.8)
+ Mx.Translate(0,-4)
+ else if(health < maxHealth * 0.6)
+ Mx.Scale(0.85)
+ Mx.Translate(0,-3)
+ else if(health < maxHealth * 0.8)
+ Mx.Scale(0.9)
+ Mx.Translate(0,-2)
+ else
+ Mx.Scale(1)
+ Mx.Translate(0,0)
+ transform = Mx
+
+ var/datum/gas_mixture/environment = loc.return_air()
+ if(environment)
+ var/pressure = environment.return_pressure()
+ if(pressure > 110)
+ health -= 7
+ else if(pressure <= 5)
+ health -= 12
+ else if(pressure <= 25)
+ health -= 8
+ else if(pressure <= 45)
+ health -= 5
+ else if(pressure <= 55)
+ health -= 3
+
+ if(pressure <= 75)
+ if(prob(15))
+ emote("me",1,"gasps!")
+
+ weakened = 0
+ if(health > 0)
+ health = min(health + health_regen, maxHealth)
+ adjustBruteLoss(-health_regen)
+ adjustToxLoss(-health_regen)
+ adjustOxyLoss(-health_regen)
+ adjustFireLoss(-health_regen)
+ ..()
+
+/mob/living/simple_animal/hulk/death()
+ unmutate()
+
+/mob/living/simple_animal/hulk/proc/unmutate()
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(10, 0, src.loc)
+ smoke.start()
+ playsound(src, 'sound/effects/bamf.ogg', CHANNEL_BUZZ)
+
+ var/obj/effect/decal/remains/human/RH = new /obj/effect/decal/remains/human(src.loc)
+ var/matrix/Mx = matrix()
+ Mx.Scale(1.5)
+ RH.transform = Mx
+
+ for(var/mob/M in contents)
+ M.loc = src.loc
+ if(istype(M, /mob/living))
+ var/mob/living/L = M
+ L.Paralyse(15)
+ L.update_canmove()
+
+ if(mind && original_body)
+ mind.transfer_to(original_body)
+ original_body.mutations.Remove(HULK)
+ original_body.dna.SetSEState(GLOB.hulkblock,0)
+ genemutcheck(original_body, GLOB.hulkblock,null,MUTCHK_FORCED)
+ to_chat(original_body, "You suddenly feel very weak.")
+ original_body.update_mutations() //update our mutation overlays
+ qdel(src)
+
+/mob/living/proc/hulk_scream(obj/target, chance)
+ if(prob(chance))
+ visible_message("[src] has punched \the [target]!",\
+ "You punch the [target]!",\
+ "You feel some weird vibration!")
+ playsound(target, 'sound/effects/hulk_hit_airlock.ogg', CHANNEL_BUZZ, 75)
+ return 0
+ else
+ say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ))
+ visible_message("[src] has destroyed some mechanic in the [target]!",\
+ "You destroy some mechanic in the [target] door, which holds it in place!",\
+ "You feel some weird vibration!")
+ playsound(target, pick('sound/effects/explosion1.ogg', 'sound/effects/explosion2.ogg'), CHANNEL_BUZZ)
+ return 1
+
+/mob/living/simple_animal/hulk/proc/attack_hulk(obj/machinery/door/D)
+ do_attack_animation(D)
+ changeNext_move(CLICK_CD_MELEE)
+ if(istype(D,/obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/A = D
+ if(A.welded || A.locked)
+ if(hulk_scream(A, 75))
+ A.deconstruct(src)
+ return
+ if(istype(D,/obj/machinery/door/firedoor))
+ var/obj/machinery/door/firedoor/F = D
+ if(FD_CLOSED)
+ if(hulk_scream(F))
+ qdel(F)
+ return
+ if(D.density)
+ to_chat(src, "You force your fingers between \
+ the doors and begin to pry them open...")
+ playsound(D, 'sound/machines/airlockforced.ogg', CHANNEL_BUZZ, 30, null, -4)
+ D.open(1)
+
+/mob/living/simple_animal/hulk/New()
+ ..()
+ name = text("[initial(name)] ([rand(1, 1000)])")
+ real_name = name
+ status_flags ^= CANPUSH
+ for(var/spell in hulk_powers)
+ src.AddSpell(new spell)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hulk_power.dm b/code/modules/mob/living/simple_animal/hulk_power.dm
new file mode 100644
index 0000000000000..cd4b084bef748
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hulk_power.dm
@@ -0,0 +1,499 @@
+//Transform spell
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_transform
+ name = "Transform"
+ desc = ""
+ panel = "Hulk"
+ action_icon_state = "transformarion_hulk"
+ action_background_icon_state = "bg_hulk"
+ charge_max = 100
+ clothes_req = 0
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_transform/cast(list/targets, mob/user = usr)
+ if(HAS_TRAIT(usr, TRAIT_PACIFISM))
+ to_chat(usr, "Not enough angry power")
+ return
+ if(istype(usr,/mob/living/simple_animal/hulk))
+ to_chat(usr, "You are already hulk")
+ return
+ to_chat(usr, "You can feel real POWER.")
+ if(istype(usr.loc, /obj/machinery/dna_scannernew))
+ var/obj/machinery/dna_scannernew/DSN = loc
+ DSN.occupant = null
+ DSN.icon_state = "scanner_0"
+ var/mob/living/simple_animal/hulk/Monster
+ if(CLUMSY in usr.mutations)
+ Monster = new /mob/living/simple_animal/hulk/clown_hulk(get_turf(usr))
+ else if(isunathi(usr))
+ Monster = new /mob/living/simple_animal/hulk/zilla(get_turf(usr))
+ else
+ Monster = new /mob/living/simple_animal/hulk/human(get_turf(usr))
+
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(10, 0, usr.loc)
+ smoke.start()
+ playsound(usr, 'sound/effects/bamf.ogg', CHANNEL_BUZZ)
+ Monster.original_body = usr
+ usr.forceMove(Monster)
+ usr.mind.transfer_to(Monster)
+ Monster.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ))
+ return
+
+//HUMAN HULK
+
+//Dash
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_dash
+ name = "Dash"
+ desc = ""
+ panel = "Hulk"
+ action_icon_state = "charge_hulk"
+ action_background_icon_state = "bg_hulk"
+ charge_max = 130
+ clothes_req = 0
+ range = 5
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_dash/cast(list/targets, mob/user = usr)
+ var/turf/T = get_turf(get_step(usr,usr.dir))
+ for(var/mob/living/M in T.contents)
+ to_chat(usr, "Something right in front of you!")
+ return
+ T = get_turf(get_step(T,usr.dir))
+ for(var/mob/living/M in T.contents)
+ to_chat(usr, "Something right in front of you!")
+ return
+
+ var/failure = 0
+ if (istype(usr.loc,/mob) || usr.lying || usr.stunned || usr.buckled || usr.stat)
+ to_chat(usr, "You can't dash right now!")
+ return
+
+ if (istype(usr.loc,/turf) && !(istype(usr.loc,/turf/space)))
+ for(var/mob/M in range(usr, 1))
+ if(M.pulling == usr)
+ M.stop_pulling()
+
+
+ usr.visible_message("[usr.name] dashes forward!")
+ playsound(usr, 'sound/weapons/thudswoosh.ogg', CHANNEL_BUZZ)
+ if(failure)
+ usr.Weaken(5)
+ usr.Stun(5)
+ usr.visible_message(" \the [usr] attempts to dash away but was interrupted!",
+ "You attempt to dash but suddenly interrupted!",
+ "You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.")
+ return 0
+
+ usr.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ))
+ var/prevLayer = usr.layer
+ usr.layer = 9
+ var/cur_dir = usr.dir
+ var/turf/simulated/floor/tile = usr.loc
+ if(tile && istype(tile))
+ tile.break_tile()
+ var/speed = 3
+ for(var/i=0, i<30, i++)
+ var/hit = 0
+ T = get_turf(get_step(usr,usr.dir))
+ if(i < 7)
+ if(istype(T,/turf/simulated/wall))
+ hit = 1
+ else if(istype(T,/turf/simulated/floor))
+ for(var/obj/structure/S in T.contents)
+ if(istype(S,/obj/structure/window))
+ hit = 1
+ if(istype(S,/obj/structure/grille))
+ hit = 1
+ else if(i > 6)
+ if(istype(T,/turf/simulated/floor))
+ for(var/obj/structure/S in T.contents)
+ if(istype(S,/obj/structure/window))
+ S.ex_act(2)
+ if(istype(S,/obj/structure/grille))
+ qdel(S)
+ if(istype(T,/turf/simulated/wall))
+ var/turf/simulated/wall/W = T
+ var/mob/living/carbon/human/H = usr
+ if(istype(T,/turf/simulated/wall/r_wall))
+ playsound(H, 'sound/weapons/tablehit1.ogg', CHANNEL_BUZZ)
+ hit = 1
+ H.Weaken(10)
+ H.take_overall_damage(25, used_weapon = "reinforced wall")
+ else
+ playsound(H, 'sound/weapons/tablehit1.ogg', CHANNEL_BUZZ)
+ if(i > 20)
+ if(prob(65))
+ hit = 1
+ W.dismantle_wall(1)
+ else
+ hit = 1
+ W.take_damage(50)
+ H.Weaken(5)
+ else
+ hit = 1
+ W.take_damage(25)
+ H.Weaken(5)
+ if(i > 20)
+ usr.canmove = 0
+ usr.density = 0
+ for(var/mob/living/M in T.contents)
+ if(!M.lying)
+ var/turf/target = get_turf(get_step(usr,cur_dir))
+ hit = 1
+ playsound(M, 'sound/weapons/tablehit1.ogg', CHANNEL_BUZZ)
+ for(var/o=0, o<10, o++)
+ target = get_turf(get_step(target,cur_dir))
+ var/mob/living/carbon/human/H = M
+ if(istype(H,/mob/living/carbon/human))
+ var/bodypart_name = pick(BODY_ZONE_CHEST,BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG,BODY_ZONE_HEAD,BODY_ZONE_TAIL)
+ var/obj/item/organ/external/BP = H.bodyparts_by_name[bodypart_name]
+ H.apply_damage(20,BRUTE,BP)
+ BP.fracture()
+ M.Weaken(5)
+ M.Stun(5)
+ else
+ M.Weaken(5)
+ M.Stun(5)
+ M.take_overall_damage(40, used_weapon = "Hulk Foot")
+ M.throw_at(target, 200, 100)
+ break
+ else if(i > 6)
+ for(var/mob/living/M in T.contents)
+ playsound(M, 'sound/misc/slip.ogg', CHANNEL_BUZZ)
+ M.Weaken(5)
+ if(usr.lying)
+ break
+ if(hit)
+ break
+ if(i < 7)
+ speed++
+ if(speed > 3)
+ speed = 0
+ step(usr, cur_dir)
+ else if(i < 14)
+ speed++
+ if(speed > 2)
+ speed = 0
+ step(usr, cur_dir)
+ else if(i < 21)
+ speed++
+ if(speed > 1)
+ speed = 0
+ step(usr, cur_dir)
+ else if(i < 30)
+ step(usr, cur_dir)
+ sleep(1)
+ usr.density = 1
+ usr.canmove = 1
+ usr.layer = prevLayer
+ else
+ to_chat(usr, "You need a ground to do this!")
+ return
+
+ if (istype(usr.loc,/obj))
+ var/obj/container = usr.loc
+ to_chat(usr, "You dash and slam your head against the inside of [container]! Ouch!")
+ usr.paralysis += 3
+ usr.weakened += 5
+ container.visible_message("[usr.loc] emits a loud thump and rattles a bit.")
+ playsound(usr, 'sound/effects/bang.ogg', CHANNEL_BUZZ)
+ var/wiggle = 6
+ while(wiggle > 0)
+ wiggle--
+ container.pixel_x = rand(-3,3)
+ container.pixel_y = rand(-3,3)
+ sleep(1)
+ container.pixel_x = 0
+ container.pixel_y = 0
+
+ return
+
+//Jump
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_jump
+ name = "Leap"
+ desc = ""
+ panel = "Hulk"
+ action_icon_state = "jump_hulk"
+ action_background_icon_state = "bg_hulk"
+ charge_max = 130
+ clothes_req = 0
+ range = 5
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_jump/cast(list/targets , mob/user = usr)
+ //for(var/turf/T in targets)
+ var/failure = 0
+ if (istype(usr.loc,/mob) || usr.lying || usr.stunned || usr.buckled || usr.stat)
+ to_chat(usr, "You can't jump right now!")
+ return
+
+ if (istype(usr.loc,/turf) && !(istype(usr.loc,/turf/space)))
+
+ for(var/mob/M in range(usr, 1))
+ if(M.pulling == usr)
+ M.stop_pulling()
+
+ usr.visible_message("[usr.name] takes a huge leap!")
+ playsound(usr, 'sound/weapons/thudswoosh.ogg', CHANNEL_BUZZ)
+ if(failure)
+ usr.Weaken(5)
+ usr.Stun(5)
+ usr.visible_message(" \the [usr] attempts to leap away but is slammed back down to the ground!",
+ "You attempt to leap away but are suddenly slammed back down to the ground!",
+ "You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.")
+ return 0
+
+ usr.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ))
+ var/prevLayer = usr.layer
+ usr.layer = 9
+ var/cur_dir = usr.dir
+ var/turf/simulated/floor/tile = usr.loc
+ if(tile)
+ tile.break_tile()
+ var/o=3
+ for(var/i=0, i<14, i++)
+ usr.density = 0
+ usr.canmove = 0
+ o++
+ if(o == 4)
+ o = 0
+ step(usr, cur_dir)
+ if(i < 7) usr.pixel_y += 8
+ else usr.pixel_y -= 8
+ sleep(1)
+ playsound(usr, 'sound/effects/explosionfar.ogg', CHANNEL_BUZZ)
+ for(tile in range(1, usr))
+ if(prob(50))
+ tile.break_tile()
+ for(var/mob/living/M in usr.loc.contents)
+ if(M != usr)
+ var/mob/living/carbon/human/H = M
+ if(istype(H,/mob/living/carbon/human))
+ playsound(H, 'sound/weapons/tablehit1.ogg', CHANNEL_BUZZ)
+ var/bodypart_name = pick(BODY_ZONE_CHEST,BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG,BODY_ZONE_HEAD,BODY_ZONE_TAIL)
+ var/obj/item/organ/external/BP = H.bodyparts_by_name[bodypart_name]
+ H.apply_damage(20,BRUTE,BP)
+ BP.fracture()
+ H.Stun(5)
+ H.Weaken(5)
+ else
+ playsound(M, 'sound/weapons/tablehit1.ogg', CHANNEL_BUZZ)
+ M.Stun(5)
+ M.Weaken(5)
+ M.take_overall_damage(35, used_weapon = "Hulk Foot")
+ var/snd = 1
+ for(var/direction in GLOB.alldirs)
+ var/turf/T = get_step(usr,direction)
+ for(var/mob/living/M in T.contents)
+ if( (M != usr) && !(M.stat))
+ if(snd)
+ snd = 0
+ playsound(M, 'sound/misc/slip.ogg', CHANNEL_BUZZ)
+ M.Weaken(2)
+ for(var/i=0, i<6, i++)
+ spawn(i)
+ if(i < 3) M.pixel_y += 8
+ else M.pixel_y -= 8
+ usr.density = 1
+ usr.canmove = 1
+ usr.layer = prevLayer
+ else
+ to_chat(usr, "You need a ground to do this!")
+ return
+
+ if (istype(usr.loc,/obj))
+ var/obj/container = usr.loc
+ to_chat(usr, "You leap and slam your head against the inside of [container]! Ouch!")
+ usr.paralysis += 3
+ usr.weakened += 5
+ container.visible_message("[usr.loc] emits a loud thump and rattles a bit.")
+ playsound(usr, 'sound/effects/bang.ogg', CHANNEL_BUZZ)
+ var/wiggle = 6
+ while(wiggle > 0)
+ wiggle--
+ container.pixel_x = rand(-3,3)
+ container.pixel_y = rand(-3,3)
+ sleep(1)
+ container.pixel_x = 0
+ container.pixel_y = 0
+
+ return
+//Clown-Hulk
+
+//Hulk Honk
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_honk
+ name = "HulkHONK"
+ desc = ""
+ panel = "Hulk"
+ action_icon_state = "honk_hulk"
+ action_background_icon_state = "bg_hulk"
+ charge_max = 250
+ clothes_req = 0
+ range = 2
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_honk/cast(list/target,mob/user = usr)
+ if (usr.incapacitated())
+ to_chat(usr, "You can't right now!")
+ return
+ playsound(usr, 'sound/items/airhorn.ogg', CHANNEL_BUZZ)
+ for(var/mob/living/carbon/M in ohearers(2))
+ if(CLUMSY in M.mutations)
+ M.adjustBruteLoss(-10)
+ M.adjustToxLoss(-10)
+ M.adjustOxyLoss(-10)
+ M.AdjustWeakened(-1)
+ M.AdjustStunned(-1)
+ else
+ if(istype(M))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
+ continue
+ M.stuttering += 2
+ M.AdjustEarDamage(rand(0, 2))
+ M.Weaken(2)
+ var /turf/simulated/victim_loc = M.loc
+ victim_loc.MakeSlippery(TURF_WET_LUBE, 5 SECONDS)
+
+//Hulk Joke
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_joke
+ name = "Joke"
+ desc = ""
+ panel = "Hulk"
+ action_icon_state = "joke_hulk"
+ action_background_icon_state = "bg_hulk"
+ charge_max = 350
+ clothes_req = 0
+ range = 2
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_joke/cast(list/targets,mob/user = usr)
+ if (usr.incapacitated())
+ to_chat(usr, "You can't right now!")
+ return
+
+ var/mob/living/simple_animal/hulk/clown_hulk = usr
+ clown_hulk.adjustBruteLoss(-50)
+ clown_hulk.adjustToxLoss(-10)
+ clown_hulk.adjustOxyLoss(-10)
+ clown_hulk.AdjustWeakened(-1)
+ clown_hulk.AdjustStunned(-1)
+
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(10,0, usr.loc)
+ smoke.start()
+ playsound(usr,pick('sound/spookoween/scary_clown_appear.ogg','sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg','sound/spookoween/scary_horn3.ogg'),CHANNEL_BUZZ, 100)
+
+
+//Zilla
+
+//Hulk Mill
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_mill
+ name = "Windmill"
+ desc = ""
+ panel = "Hulk"
+ action_icon_state = "mill_hulk"
+ action_background_icon_state = "bg_hulk"
+ charge_max = 200
+ clothes_req = 0
+ range = 2
+
+/obj/effect/proc_holder/spell/aoe_turf/hulk/hulk_mill/cast(list/targets,mob/user = usr)
+ if (usr.lying || usr.incapacitated())
+ to_chat(usr, "You can't do that right now!")
+ return
+ for(var/i in 1 to 45)
+ if(usr.dir == 1)
+ usr.setDir(2)
+ else if(usr.dir == 2)
+ usr.setDir(4)
+ else if(usr.dir == 4)
+ usr.setDir(8)
+ else if(usr.dir == 8)
+ usr.setDir(1)
+
+ for(var/mob/living/M in view(2, usr) - usr - usr.contents)
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/bodypart_name = pick(BODY_ZONE_CHEST,BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG,BODY_ZONE_HEAD,BODY_ZONE_TAIL)
+ var/obj/item/organ/external/BP = H.bodyparts_by_name[bodypart_name]
+ H.apply_damage(2,BRUTE,BP)
+ else
+ M.apply_damage(2, used_weapon = "Tail")
+ playsound(M, 'sound/weapons/tablehit1.ogg', CHANNEL_BUZZ)
+ if(prob(3))
+ M.Weaken(2)
+ sleep(1)
+
+//Harchok
+/obj/item/projectile/energy/hulkspit
+ name = "spit"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "neurotoxin"
+ damage = 15
+ damage_type = TOX
+
+/obj/item/projectile/energy/hulkspit/on_hit(atom/target, def_zone = BODY_ZONE_CHEST, blocked = 0)
+ if(istype(target, /mob/living/carbon))
+ var/mob/living/carbon/M = target
+ M.Weaken(2)
+ M.adjust_fire_stacks(20)
+ M.IgniteMob()
+
+/obj/effect/proc_holder/spell/targeted/click/hulk/hulk_spit
+ name = "Fire Spit"
+ desc = ""
+ panel = "Hulk"
+ invocation_type = "shout"
+ action_icon_state = "harchok_hulk"
+ action_background_icon_state = "bg_hulk"
+ allowed_type = /atom
+ charge_max = 250
+ clothes_req = 0
+ range = 20
+
+/obj/effect/proc_holder/spell/targeted/click/hulk/hulk_spit/cast(list/targets,mob/user = usr)
+ var/target = targets[1]
+ if (usr.lying || usr.incapacitated())
+ to_chat(usr, "You can't do that right now!")
+ return
+
+ var/turf/T = usr.loc
+ var/turf/U = get_step(usr,usr.dir) // Get the tile infront of the move, based on their direction
+ if(!isturf(U) || !isturf(T))
+ return
+
+ var/obj/item/projectile/energy/hulkspit/HS = new /obj/item/projectile/energy/hulkspit(usr.loc)
+ HS.current = get_turf(user)
+ HS.preparePixelProjectile(target, get_turf(target), user)
+ HS.fire()
+ user.newtonian_move(get_dir(U, T))
+ playsound(usr, 'sound/magic/fireball.ogg', CHANNEL_BUZZ)
+
+//Laser
+
+/obj/effect/proc_holder/spell/targeted/click/hulk/hulk_lazor
+ name = "LazorZ"
+ desc = ""
+ panel = "Hulk"
+ invocation_type = "shout"
+ action_icon_state = "lazer_hulk"
+ action_background_icon_state = "bg_hulk"
+ allowed_type = /atom
+ charge_max = 70
+ clothes_req = 0
+ range = 20
+
+/obj/effect/proc_holder/spell/targeted/click/hulk/hulk_lazor/cast(list/targets,mob/user = usr)
+ var/target = targets[1]
+ if (usr.lying || usr.incapacitated())
+ to_chat(usr, "You can't right now!")
+ return
+
+ var/turf/T = usr.loc
+ var/turf/U = get_step(usr, usr.dir) // Get the tile infront of the move, based on their direction
+ if(!isturf(U) || !isturf(T))
+ return
+
+ var/obj/item/projectile/beam/B = new /obj/item/projectile/beam(usr.loc)
+ playsound(usr, 'sound/weapons/laser.ogg', CHANNEL_BUZZ)
+ B.current = get_turf(user)
+ B.preparePixelProjectile(target, get_turf(target), user)
+ B.fire()
+ user.newtonian_move(get_dir(U, T))
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 1b67b53119a3e..62be2e1a45606 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -297,14 +297,6 @@
if(..()) //successful larva bite.
attacked += 10
-/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user)
- if(user.a_intent == INTENT_HARM)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "You don't want to hurt [src]!")
- return FALSE
- discipline_slime(user)
- return ..()
-
/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M)
if(buckled)
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
diff --git a/icons/mob/Hulk.dmi b/icons/mob/Hulk.dmi
new file mode 100644
index 0000000000000..76da67f762460
Binary files /dev/null and b/icons/mob/Hulk.dmi differ
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index a8f226c2f0109..bc52d0a73876c 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/actions/hulk_spell.dmi.tmp b/icons/mob/actions/hulk_spell.dmi.tmp
new file mode 100644
index 0000000000000..18c32bf7bac5d
Binary files /dev/null and b/icons/mob/actions/hulk_spell.dmi.tmp differ
diff --git a/icons/mob/zilla.dmi b/icons/mob/zilla.dmi
new file mode 100644
index 0000000000000..2818c8267f761
Binary files /dev/null and b/icons/mob/zilla.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 3d0be4b44aed9..d45746a278d5f 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1969,6 +1969,8 @@
#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\damage_procs.dm"
+#include "code\modules\mob\living\simple_animal\hulk.dm"
+#include "code\modules\mob\living\simple_animal\hulk_power.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\posessed_object.dm"
#include "code\modules\mob\living\simple_animal\powers.dm"
diff --git a/sound/effects/hulk_hit_airlock.ogg b/sound/effects/hulk_hit_airlock.ogg
new file mode 100644
index 0000000000000..dd55065e4bd41
Binary files /dev/null and b/sound/effects/hulk_hit_airlock.ogg differ
diff --git a/sound/effects/hulk_step.ogg b/sound/effects/hulk_step.ogg
new file mode 100644
index 0000000000000..f54c544f73517
Binary files /dev/null and b/sound/effects/hulk_step.ogg differ