diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index d4d6faf02..0b862f3e0 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -58,6 +58,8 @@
var/next_seek
+ var/prevent_goto_target = FALSE // If true, prevent any kinds of movement.
+
cmode = 1
setparrytime = 30
dodgetime = 30
@@ -305,6 +307,8 @@
AttackingTarget()
/mob/living/simple_animal/hostile/proc/MoveToTarget(list/possible_targets)//Step 5, handle movement between us and our target
+ if(prevent_goto_target)
+ return FALSE
stop_automated_movement = 1
if(!target || !CanAttack(target))
LoseTarget()
@@ -361,6 +365,8 @@
// return 0
/mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance)
+ if(prevent_goto_target)
+ return FALSE
if(target == src.target)
approaching_target = TRUE
else
@@ -477,6 +483,8 @@
/mob/living/simple_animal/hostile/Move(atom/newloc, dir , step_x , step_y)
+ if(prevent_goto_target)
+ return FALSE
if(dodging && approaching_target && prob(dodge_prob) && moving_diagonally == 0 && isturf(loc) && isturf(newloc) && !incapacitated())
return dodge(newloc,dir)
else
diff --git a/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm b/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm
index e77353f77..7cbc245f7 100644
--- a/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm
+++ b/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm
@@ -103,7 +103,7 @@
return TRUE
return FALSE
-/mob/living/simple_animal/hostile/retaliate/rogue/proc/eat_bodies()
+/mob/living/simple_animal/hostile/retaliate/rogue/proc/rend_bodies()
var/mob/living/L
// var/list/around = view(aggro_vision_range, src)
var/list/around = hearers(1, src)
@@ -111,7 +111,7 @@
if(stat)
return
for(var/mob/living/eattarg in around)
- if(eattarg.stat != CONSCIOUS)
+ if(eattarg.stat == CONSCIOUS)
foundfood += eattarg
L = eattarg
if(src.Adjacent(L))
@@ -121,7 +121,7 @@
playsound(src, pick(attack_sound), 100, TRUE, -1)
face_atom(C)
src.visible_message(span_danger("[src] starts to rip apart [C]!"))
- if(do_after(src,100, target = L))
+ if(do_mob(src,100, target = L))
var/obj/item/bodypart/limb
var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
for(var/zone in limb_list)
@@ -136,14 +136,14 @@
limb = C.get_bodypart(BODY_ZONE_CHEST)
if(limb)
if(!limb.dismember())
- C.gib()
+ C.death()
return TRUE
else
if(attack_sound)
playsound(src, pick(attack_sound), 100, TRUE, -1)
src.visible_message(span_danger("[src] starts to rip apart [L]!"))
if(do_after(src,100, target = L))
- L.gib()
+ L.death()
return TRUE
for(var/mob/living/eattarg in foundfood)
var/turf/T = get_turf(eattarg)
diff --git a/code/modules/spells/roguetown/acolyte/malum.dm b/code/modules/spells/roguetown/acolyte/malum.dm
index 2c37f8ac1..40c5d9fd9 100644
--- a/code/modules/spells/roguetown/acolyte/malum.dm
+++ b/code/modules/spells/roguetown/acolyte/malum.dm
@@ -95,19 +95,19 @@
var/list/nosmeltore = list(/obj/item/rogueore/coal)
var/datum/effect_system/spark_spread/sparks = new()
var/target = targets[1]
- if (!target || target in nosmeltore)
+ if (!target || (target in nosmeltore))
return
if (istype(target, /obj/item))
handle_item_smelting(target, user, sparks, nosmeltore)
else if (iscarbon(target))
handle_living_entity(target, user, nosmeltore)
-proc/show_visible_message(mob/user, text, selftext)
+/obj/effect/proc_holder/spell/invoked/proc/show_visible_message(mob/user, text, selftext)
var/text_to_send = addtext("", text, "")
var/selftext_to_send = addtext("", selftext, "")
user.visible_message(text_to_send, selftext_to_send)
-proc/handle_item_smelting(obj/item/target, mob/user, datum/effect_system/spark_spread/sparks, list/nosmeltore)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/handle_item_smelting(obj/item/target, mob/user, datum/effect_system/spark_spread/sparks, list/nosmeltore)
if (!target.smeltresult) return
var/obj/item/itemtospawn = target.smeltresult
show_visible_message(user, "After [user]'s incantation, [target] glows brightly and melts into an ingot.", null)
@@ -116,7 +116,7 @@ proc/handle_item_smelting(obj/item/target, mob/user, datum/effect_system/spark_s
sparks.start()
qdel(target)
-proc/handle_living_entity(mob/target, mob/user, list/nosmeltore)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/handle_living_entity(mob/target, mob/user, list/nosmeltore)
var/obj/item/targeteditem = get_targeted_item(user, target)
if (!targeteditem || targeteditem.smeltresult == /obj/item/ash || target.anti_magic_check(TRUE,TRUE))
show_visible_message(user, "After their incantation, [user] points at [target] but it seems to have no effect.", "After your incantation, you point at [target] but it seems to have no effect.")
@@ -128,14 +128,14 @@ proc/handle_living_entity(mob/target, mob/user, list/nosmeltore)
else
handle_heating_equipped(target, targeteditem, user)
-/proc/get_targeted_item(mob/user, mob/target)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/get_targeted_item(mob/user, mob/target)
var/target_item
switch(user.zone_selected)
if (BODY_ZONE_PRECISE_R_HAND)
target_item = target.held_items[2]
if (BODY_ZONE_PRECISE_L_HAND)
target_item = target.held_items[1]
- if (BODY_ZONE_HEAD || BODY_ZONE_PRECISE_EARS)
+ if (BODY_ZONE_HEAD, BODY_ZONE_PRECISE_EARS)
target_item = target.get_item_by_slot(SLOT_HEAD)
if (BODY_ZONE_CHEST)
if(target.get_item_by_slot(SLOT_ARMOR))
@@ -144,19 +144,19 @@ proc/handle_living_entity(mob/target, mob/user, list/nosmeltore)
target_item = target.get_item_by_slot(SLOT_SHIRT)
if (BODY_ZONE_PRECISE_NECK)
target_item = target.get_item_by_slot(SLOT_NECK)
- if (BODY_ZONE_PRECISE_R_EYE || BODY_ZONE_PRECISE_L_EYE || BODY_ZONE_PRECISE_NOSE)
+ if (BODY_ZONE_PRECISE_R_EYE, BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_NOSE)
target_item = target.get_item_by_slot(ITEM_SLOT_MASK)
if (BODY_ZONE_PRECISE_MOUTH)
target_item = target.get_item_by_slot(ITEM_SLOT_MOUTH)
- if (BODY_ZONE_L_ARM || BODY_ZONE_R_ARM)
+ if (BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
target_item = target.get_item_by_slot(ITEM_SLOT_WRISTS)
- if (BODY_ZONE_L_LEG || BODY_ZONE_R_LEG || BODY_ZONE_PRECISE_GROIN)
+ if (BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_GROIN)
target_item = target.get_item_by_slot(ITEM_SLOT_PANTS)
- if (BODY_ZONE_PRECISE_R_FOOT || BODY_ZONE_PRECISE_L_FOOT)
+ if (BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
target_item = target.get_item_by_slot(ITEM_SLOT_SHOES)
return target_item
-proc/handle_tongs(obj/item/rogueweapon/tongs/T, mob/user) //Stole the code from smithing.
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/handle_tongs(obj/item/rogueweapon/tongs/T, mob/user) //Stole the code from smithing.
if (!T.hingot) return
var/tyme = world.time
T.hott = tyme
@@ -164,7 +164,7 @@ proc/handle_tongs(obj/item/rogueweapon/tongs/T, mob/user) //Stole the code from
T.update_icon()
show_visible_message(user, "After [user]'s incantation, the ingot inside [T] starts glowing.", "After your incantation, the ingot inside [T] starts glowing.")
-proc/handle_heating_in_hand(mob/living/carbon/target, obj/item/targeteditem, mob/user)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/handle_heating_in_hand(mob/living/carbon/target, obj/item/targeteditem, mob/user)
var/datum/effect_system/spark_spread/sparks = new()
apply_damage_to_hands(target, user)
target.dropItemToGround(targeteditem)
@@ -174,10 +174,10 @@ proc/handle_heating_in_hand(mob/living/carbon/target, obj/item/targeteditem, mob
sparks.set_up(1, 1, target.loc)
sparks.start()
-proc/should_heat_in_hand(mob/user, mob/target, obj/item/targeteditem, list/nosmeltore)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/should_heat_in_hand(mob/user, mob/target, obj/item/targeteditem, list/nosmeltore)
return ((user.zone_selected == BODY_ZONE_PRECISE_L_HAND && target.held_items[1]) || (user.zone_selected == BODY_ZONE_PRECISE_R_HAND && target.held_items[2])) && !(targeteditem in nosmeltore) && targeteditem.smeltresult
-proc/apply_damage_to_hands(mob/living/carbon/target, mob/user)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/apply_damage_to_hands(mob/living/carbon/target, mob/user)
var/obj/item/bodypart/affecting
var/const/adth_damage_to_apply = 10 //How much damage should burning your hand before dropping the item do.
if (user.zone_selected == BODY_ZONE_PRECISE_R_HAND)
@@ -186,7 +186,7 @@ proc/apply_damage_to_hands(mob/living/carbon/target, mob/user)
affecting = target.get_bodypart(BODY_ZONE_L_ARM)
affecting.receive_damage(0, adth_damage_to_apply)
-proc/handle_heating_equipped(mob/living/carbon/target, obj/item/clothing/targeteditem, mob/user)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/handle_heating_equipped(mob/living/carbon/target, obj/item/clothing/targeteditem, mob/user)
var/obj/item/armor = target.get_item_by_slot(SLOT_ARMOR)
var/obj/item/shirt = target.get_item_by_slot(SLOT_SHIRT)
var/armor_can_heat = armor && armor.smeltresult && armor.smeltresult != /obj/item/ash
@@ -206,7 +206,7 @@ proc/handle_heating_equipped(mob/living/carbon/target, obj/item/clothing/targete
show_visible_message(target, "[target]'s [targeteditem.name] glows brightly, searing their flesh.", "My [targeteditem.name] glows brightly, It burns!")
playsound(target.loc, 'sound/misc/frying.ogg', 100, FALSE, -1)
-proc/apply_damage_if_covered(mob/living/carbon/target, list/body_zones, obj/item/clothing/targeteditem, mask, damage)
+/obj/effect/proc_holder/spell/invoked/heatmetal/proc/apply_damage_if_covered(mob/living/carbon/target, list/body_zones, obj/item/clothing/targeteditem, mask, damage)
var/datum/effect_system/spark_spread/sparks = new()
var/obj/item/bodypart/affecting = null
for (var/zone in body_zones)
@@ -244,7 +244,7 @@ proc/apply_damage_if_covered(mob/living/carbon/target, list/body_zones, obj/item
if (istype(targets[1], /turf/closed))
return
if (!istype(targets[1], /turf/open))
- altar = targets[1].loc
+ altar = targets[1]
else
altar = targets[1]
for (var/obj/item/sacrifice in altar.contents)
@@ -285,7 +285,7 @@ proc/apply_damage_if_covered(mob/living/carbon/target, list/body_zones, obj/item
show_visible_message(usr, "A wave of heat washes over the pile as [user] speaks Malum's name. The pile of valuables crumble into dust, only for the dust to reform into an item as if reborn from the flames. Malum has accepted the offering.", "A wave of heat washes over the pile as you speak Malum's name. The pile of valuables crumble into dust, only for the dust to reform into an item as if reborn from the flames. Malum has accepted the offering.")
var/global/list/anvil_recipe_prices[][]
-proc/add_recipe_to_global(var/datum/anvil_recipe/recipe)
+/obj/effect/proc_holder/spell/invoked/craftercovenant/proc/add_recipe_to_global(var/datum/anvil_recipe/recipe)
var/total_sellprice = 0
var/obj/item/ingot/bar = recipe.req_bar
var/obj/item/itemtosend = null
@@ -304,7 +304,7 @@ proc/add_recipe_to_global(var/datum/anvil_recipe/recipe)
if (total_sellprice > 0)
global.anvil_recipe_prices += list(list(itemtosend, total_sellprice))
-proc/initialize_anvil_recipe_prices()
+/obj/effect/proc_holder/spell/invoked/craftercovenant/proc/initialize_anvil_recipe_prices()
for (var/datum/anvil_recipe/armor/recipe)
{
add_recipe_to_global(recipe)
@@ -327,7 +327,7 @@ proc/initialize_anvil_recipe_prices()
global.anvil_recipe_prices += list(list(new /obj/item/dmusicbox, 500))
// Add any other recipe types if needed
-world/New()
+/obj/effect/proc_holder/spell/invoked/craftercovenant/world/New()
..()
initialize_anvil_recipe_prices() // Precompute recipe prices on startup
@@ -345,7 +345,7 @@ world/New()
show_visible_message(usr, "[usr] raises their arm, conjuring a hammer wreathed in molten fire. As they hurl it toward the ground, the earth trembles under its impact, shaking its very foundations!", "You raise your arm, conjuring a hammer wreathed in molten fire. As you hurl it toward the ground, the earth trembles under its impact, shaking its very foundations!")
fallzone = targets[1]
else
- fallzone = targets[1].loc
+ fallzone = targets[1]
for (var/turf/open/visual in view(radius, fallzone))
var/obj/effect/temp_visual/lavastaff/Lava = new /obj/effect/temp_visual/lavastaff(visual)
animate(Lava, alpha = 255, time = 5)
@@ -389,7 +389,7 @@ world/New()
miracle = TRUE
devotion_cost = 15
-obj/effect/proc_holder/spell/invoked/malum_flame_rogue/cast(list/targets, mob/user = usr)
+/obj/effect/proc_holder/spell/invoked/malum_flame_rogue/cast(list/targets, mob/user = usr)
. = ..()
if(isliving(targets[1]))
var/mob/living/L = targets[1]
diff --git a/modular_causticcove/code/__DEFINES/status_effects.dm b/modular_causticcove/code/__DEFINES/status_effects.dm
index 28093be34..b0a8233db 100644
--- a/modular_causticcove/code/__DEFINES/status_effects.dm
+++ b/modular_causticcove/code/__DEFINES/status_effects.dm
@@ -3,14 +3,20 @@
/*************************************************************
*********************** POTIONS ****************************
*************************************************************/
-#define STATUS_EFFECT_FORTITUDE /datum/status_effect/fortitude //Grants people 1 CON and 2 END for the duration.
+#define STATUS_EFFECT_FORTITUDE /datum/status_effect/buff/fortitude //Grants people 1 CON and 2 END for the duration.
-#define STATUS_EFFECT_SWIFTNESS /datum/status_effect/swiftness //Grants people 1 END and 3 SPD for the duration.
+#define STATUS_EFFECT_SWIFTNESS /datum/status_effect/buff/swiftness //Grants people 1 END and 3 SPD for the duration.
-#define STATUS_EFFECT_INTELLECT /datum/status_effect/intellect //Grants people 3 INT and 3 PER for the duration.
+#define STATUS_EFFECT_INTELLECT /datum/status_effect/buff/intellect //Grants people 3 INT and 3 PER for the duration.
-#define STATUS_EFFECT_VIRILITY /datum/status_effect/virility //\SHOULD\ grant people the ability to have infinite orgasms for the duration.
+#define STATUS_EFFECT_VIRILITY /datum/status_effect/buff/virility //\SHOULD\ grant people the ability to have infinite orgasms for the duration.
-#define STATUS_EFFECT_RAVOX_BREW /datum/status_effect/ravoxbrew // Gives a buff at cost of poison to self
+#define STATUS_EFFECT_RAVOX_BREW /datum/status_effect/buff/ravoxbrew // Gives a buff at cost of poison to self
-#define STATUS_EFFECT_ABYSSORS_BREW /datum/status_effect/abyssorbrew // Free water movement at cost of speed, and strength, and untouched stam drain over water
+#define STATUS_EFFECT_ABYSSORS_BREW /datum/status_effect/buff/abyssorbrew // Free water movement at cost of speed, and strength, and untouched stam drain over water
+
+/*************************************************************
+*********************** MOBS *******************************
+*************************************************************/
+
+#define STATUS_EFFECT_INDUCED_INSANITY /datum/status_effect/buff/induced_insanity //Momentarily experiencing maniac levels of insanity.
diff --git a/modular_causticcove/code/datums/status_effects/rogue/causticdebuff.dm b/modular_causticcove/code/datums/status_effects/rogue/causticdebuff.dm
new file mode 100644
index 000000000..1e3808cff
--- /dev/null
+++ b/modular_causticcove/code/datums/status_effects/rogue/causticdebuff.dm
@@ -0,0 +1,29 @@
+////////////////
+//EFFECT BUFFS//
+////////////////
+
+
+/datum/status_effect/buff/induced_insanity //What is... happening!?
+ id = "inducedinsanity"
+ alert_type = /atom/movable/screen/alert/status_effect/buff/induced_insanity
+ effectedstats = list("strength" = -2, "perception" = -2, "constitution" = -1, "endurance" = -1, "speed" = -6, "fortune" = -6)
+ duration = 1 MINUTES
+
+/atom/movable/screen/alert/status_effect/buff/induced_insanity
+ name = "##^%$*%!!?"
+ desc = "WWHAAAT IS HAAAPENNIINGG!? AAHAHHAHAAA!!!"
+ icon_state = "status"
+
+/datum/status_effect/buff/induced_insanity/process()
+ . = ..()
+ var/mob/living/carbon/human/C = owner
+ var/atom/movable/screen/fullscreen/maniac/hallucinations
+ //Check if it's null to prevent runtiming.
+ if(C == null)
+ return
+ hallucinations = owner.overlay_fullscreen("maniac", /atom/movable/screen/fullscreen/maniac)
+ if(istype(C, /mob/living/carbon/human))
+ handle_maniac_visions(C, hallucinations)
+ handle_maniac_hallucinations(C)
+ handle_maniac_floors(C)
+ handle_maniac_walls(C)
diff --git a/modular_causticcove/code/modules/mob/living/simple_animal/rogue/eldritch/beast_mother.dm b/modular_causticcove/code/modules/mob/living/simple_animal/rogue/eldritch/beast_mother.dm
new file mode 100644
index 000000000..68d5d4e6c
--- /dev/null
+++ b/modular_causticcove/code/modules/mob/living/simple_animal/rogue/eldritch/beast_mother.dm
@@ -0,0 +1,167 @@
+/mob/living/simple_animal/hostile/retaliate/rogue/beast_mother
+ icon = 'modular_causticcove/icons/monsters/lavaland_elites_64.dmi'
+ name = "broodmother beast"
+ icon_state = "broodmother"
+ icon_living = "broodmother"
+ icon_dead = "egg_sac"
+ gender = FEMALE
+ emote_hear = null
+ emote_see = null
+ speak_chance = 1
+ turns_per_move = 3
+ see_in_dark = 1
+ move_to_delay = 6
+ pixel_x = -16
+ base_intents = list(/datum/intent/simple/headbutt)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 4,
+ /obj/item/natural/hide = 4,
+ /obj/item/natural/fur = 1)
+ faction = list("eldritch")
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_EPIC
+ melee_damage_lower = 15
+ melee_damage_upper = 30
+ vision_range = 5
+ aggro_vision_range = 6
+ environment_smash = ENVIRONMENT_SMASH_NONE
+ retreat_distance = 0
+ minimum_distance = 0
+ milkies = FALSE
+ food_type = list(/obj/item/reagent_containers/food/snacks/rogue/meat, /obj/item/bodypart, /obj/item/organ)
+ footstep_type = FOOTSTEP_MOB_HEAVY
+ pooptype = null
+ //Protect the babies!
+ health = 300
+ maxHealth = 300
+ STACON = 16
+ STAEND = 16
+ STASTR = 10
+ STASPD = 6
+ deaggroprob = 33
+ simple_detect_bonus = 20
+ defprob = 0
+ defdrain = 25
+ del_on_deaggro = 120 SECONDS
+ retreat_health = 0.2
+ food = 0
+ attack_sound = list('modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_1.ogg', 'modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_2.ogg', 'modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_3.ogg')
+ dodgetime = 66
+ aggressive = 1
+// stat_attack = UNCONSCIOUS
+
+/mob/living/simple_animal/hostile/retaliate/rogue/beast_mother_bab
+//Wee little babs. The ideal form of killing them is to be on swift intent to take them out. Brute force will be punishing.
+ name = "Beastie"
+ health = 30
+ maxHealth = 30
+ STACON = 3
+ STAEND = 3
+ STASTR = 2
+ STASPD = 12
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+ icon = 'modular_causticcove/icons/monsters/lavaland_monsters.dmi'
+ icon_state = "goliath_baby"
+ icon_living = "goliath_baby"
+ icon_dead = "goliath_baby_dead"
+ var/icon_crying = "goliath_baby_cry"
+ var/icon_enraged = "goliath_baby_enraged"
+ gender = FEMALE
+ emote_hear = null
+ emote_see = null
+ speak_chance = 1
+ turns_per_move = 2
+ see_in_dark = 1
+ move_to_delay = 4
+ base_intents = list(/datum/intent/simple/headbutt)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 1,
+ /obj/item/natural/hide = 1)
+ faction = list("eldritch")
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
+ vision_range = 5
+ aggro_vision_range = 6
+ environment_smash = ENVIRONMENT_SMASH_NONE
+ retreat_distance = 0
+ minimum_distance = 0
+ milkies = FALSE
+ food_type = list(/obj/item/reagent_containers/food/snacks/rogue/meat, /obj/item/bodypart, /obj/item/organ)
+ footstep_type = FOOTSTEP_MOB_CLAW
+ pooptype = null
+ deaggroprob = 33
+ simple_detect_bonus = 20
+ defprob = 66
+ defdrain = 5
+ del_on_deaggro = 120 SECONDS
+ retreat_health = 0.5
+ food = 0
+ attack_sound = list('modular_causticcove/sound/mobs/eldritch/beast_bab_attack_1.ogg', 'modular_causticcove/sound/mobs/eldritch/beast_bab_attack_2.ogg', 'modular_causticcove/sound/mobs/eldritch/beast_bab_attack_3.ogg' )
+ dodgetime = 20
+ aggressive = 1
+// stat_attack = UNCONSCIOUS
+
+/obj/effect/temp_visual/beastie_spawn_location
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "mini_leaper"
+ duration = 10
+
+
+//Make sure we aren't doing the same as the mother and gib upon death immediately.
+/mob/living/simple_animal/hostile/retaliate/rogue/beast_mother_bab/death(gibbed)
+ . = ..()
+ gib()
+
+/mob/living/simple_animal/hostile/retaliate/rogue/beast_mother_bab/Initialize()
+ for(var/mob/living/simple_animal/D in range(2, get_turf(src)))
+ if(istype(D, /mob/living/simple_animal/hostile/retaliate/rogue/beast_mother))
+ if(D.stat == DEAD)
+ cry_sequence()
+ . = ..()
+
+//Cry if we see mother is dead
+/mob/living/simple_animal/hostile/retaliate/rogue/beast_mother_bab/proc/cry_sequence()
+ if(prob(66))
+ toggle_ai(AI_OFF)
+ icon_state = icon_crying
+ emote("cry")
+ spawn(25)
+ if(stat == CONSCIOUS)
+ toggle_ai(AI_ON)
+ icon_state = icon_living
+ emote("growl")
+ visible_message("Angry chirps can be heard!")
+ //Momma's dead?! I'M GONNA FUCKING KILL YOU!!! (+5 damage bonus)
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+ name = "Upset Beastie"
+ if(prob(2))
+ //Main character syndrome. Huge damage, be afraid. Sans undertale.
+ visible_message(span_warningbig("A GUTTERAL CRY CAN BE HEARD!!!"))
+ playsound(src, 'modular_causticcove/sound/mobs/eldritch/enraged_notifier.ogg', 100, FALSE)
+ melee_damage_lower = 30
+ melee_damage_upper = 40
+ health = 75
+ maxHealth = 75
+ defprob = 80
+ dodgetime = 10
+ icon_state = icon_enraged
+ name = "Enraged Beastie"
+ desc = "It's a beautiful day outside. Birds are screeching, flowers are wilting... on days like these, adventurers like you... Should be burning in hell."
+ else
+
+//Spawn the beasties around the mother, make sure it's not in a wall
+/mob/living/simple_animal/hostile/retaliate/rogue/beast_mother/death(gibbed)
+ var/list/turfs = list()
+ var/spawn_location
+ for(var/turf/T in dview(1, get_turf(src)))
+ if(isfloorturf(T))
+ turfs += T
+ for(var/i in 1 to rand(3,7))
+ spawn(rand(0, 60))
+ spawn_location = pick(turfs)
+ new /obj/effect/temp_visual/beastie_spawn_location(pick(spawn_location))
+ playsound(spawn_location, 'modular_causticcove/sound/mobs/eldritch/egghatching.ogg', 100, FALSE)
+ spawn(10)
+ new /mob/living/simple_animal/hostile/retaliate/rogue/beast_mother_bab(pick(spawn_location))
+ . = ..()
+ playsound(src, 'modular_causticcove/sound/mobs/eldritch/beast_mother_death_shedding.ogg', 100, FALSE)
+
+
diff --git a/modular_causticcove/code/modules/mob/living/simple_animal/rogue/monster/brain_gusher_beast.dm b/modular_causticcove/code/modules/mob/living/simple_animal/rogue/monster/brain_gusher_beast.dm
new file mode 100644
index 000000000..b3708195f
--- /dev/null
+++ b/modular_causticcove/code/modules/mob/living/simple_animal/rogue/monster/brain_gusher_beast.dm
@@ -0,0 +1,87 @@
+/mob/living/simple_animal/hostile/retaliate/rogue/brain_gusher_beast
+ icon = 'modular_causticcove/icons/monsters/lavaland_monsters.dmi'
+ name = "DREAM bEastR"
+ icon_state = "curseblob"
+ icon_living = "curseblob"
+ icon_dead = null
+ gender = NEUTER
+ emote_hear = null
+ emote_see = null
+ speak_chance = 1
+ turns_per_move = 1
+ see_in_dark = 12
+ move_to_delay = 1
+ base_intents = list(/datum/intent/unarmed/claw)
+ butcher_results = list(/obj/item/reagent_containers/powder/moondust = 1)
+ faction = list("hallucination")
+ mob_biotypes = MOB_BEAST
+ melee_damage_lower = 1
+ melee_damage_upper = 5
+ vision_range = 12
+ aggro_vision_range = 12
+ environment_smash = ENVIRONMENT_SMASH_NONE
+ retreat_distance = 0
+ minimum_distance = 0
+ milkies = FALSE
+ food_type = list(/obj/item/reagent_containers/food/snacks/rogue/meat, /obj/item/bodypart, /obj/item/organ)
+ footstep_type = FOOTSTEP_MOB_BAREFOOT
+ pooptype = null
+ health = 20
+ maxHealth = 20
+ STACON = 7
+ STAEND = 7
+ STASTR = 5
+ STASPD = 15
+ deaggroprob = 0
+ simple_detect_bonus = 20
+ //Garunteed dodge on the first attack
+ defprob = 200
+ defdrain = 0
+ del_on_deaggro = 120 SECONDS
+ retreat_health = 0
+ food = 0
+ attack_sound = list('sound/misc/vcraft.ogg')
+ dodgetime = 9999
+ aggressive = 1
+// stat_attack = UNCONSCIOUS
+ var/summoned = FALSE
+ alpha = 88
+
+//The summoned form that comes from the original brain gusher to prevent infinite mob spawning
+/mob/living/simple_animal/hostile/retaliate/rogue/brain_gusher_beast/summoned
+ summoned = TRUE
+
+/mob/living/simple_animal/hostile/retaliate/rogue/brain_gusher_beast/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_BLOODLOSS_IMMUNE, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_BASHDOORS, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOSTINK, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_CRITICAL_RESISTANCE, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOBREATH, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOPAIN, TRAIT_GENERIC)
+
+//We make people a little crazy...
+/mob/living/simple_animal/hostile/retaliate/rogue/brain_gusher_beast/AttackingTarget()
+ . = ..()
+ if(isliving(target))
+ var/mob/living/carbon/L = target
+ //Jumpscare, then slow down, and become visible
+ move_to_delay = 3
+ turns_per_move = 3
+ alpha = 255
+ if(!L.has_status_effect(/datum/status_effect/buff/induced_insanity))
+ L.emote("laugh")
+ L.apply_status_effect(/datum/status_effect/buff/induced_insanity)
+ //How many are there?!! A total trickster beast
+ if(prob(50) && !summoned)
+ new /mob/living/simple_animal/hostile/retaliate/rogue/brain_gusher_beast/summoned(L.loc)
+ playsound(src, 'sound/misc/zizo.ogg', 100, FALSE)
+ summoned = TRUE
+
+/mob/living/simple_animal/hostile/retaliate/rogue/brain_gusher_beast/death(gibbed)
+ . = ..()
+ playsound(src, 'sound/misc/zizo.ogg', 75, TRUE)
+ qdel(src)
diff --git a/modular_causticcove/code/modules/mob/living/simple_animal/rogue/monster/wendigo_beast.dm b/modular_causticcove/code/modules/mob/living/simple_animal/rogue/monster/wendigo_beast.dm
new file mode 100644
index 000000000..a3322c5f1
--- /dev/null
+++ b/modular_causticcove/code/modules/mob/living/simple_animal/rogue/monster/wendigo_beast.dm
@@ -0,0 +1,162 @@
+/mob/living/simple_animal/hostile/retaliate/rogue/wendigo_beast
+ icon = 'modular_causticcove/icons/monsters/64x64monsters.dmi'
+ name = "wendigo beast"
+ icon_state = "wendigo_noblood"
+ var/icon_half_hp = "wendigo"
+ icon_living = "broodmother"
+ icon_dead = "wendigo_dead"
+ gender = MALE
+ emote_hear = null
+ emote_see = null
+ speak_chance = 1
+ turns_per_move = 2
+ see_in_dark = 12
+ move_to_delay = 3
+ pixel_x = -16
+ base_intents = list(/datum/intent/simple/claw/wendigo)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/rogue/meat/steak = 4,
+ /obj/item/natural/hide = 4,
+ /obj/item/natural/fur = 4,
+ /obj/item/natural/bone = 4,
+ /obj/item/natural/alchemy/antler = 2)
+ faction = list("wendigo")
+ //Undead trait due to supernatural so miracles can burn them.
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_EPIC|MOB_UNDEAD
+
+ //We have strong hits, yet we deal lower damage during our ability.
+ melee_damage_lower = 30
+ melee_damage_upper = 45
+ vision_range = 9
+ aggro_vision_range = 12
+ environment_smash = ENVIRONMENT_SMASH_NONE
+ retreat_distance = 0
+ minimum_distance = 0
+ milkies = FALSE
+ food_type = list(/obj/item/reagent_containers/food/snacks/rogue/meat, /obj/item/bodypart, /obj/item/organ)
+ footstep_type = FOOTSTEP_MOB_BAREFOOT
+ pooptype = null
+ health = 750
+ maxHealth = 750
+ STACON = 13
+ STAEND = 13
+ STASTR = 18
+ STASPD = 6
+ deaggroprob = 0
+ simple_detect_bonus = 20
+ defprob = 10
+ defdrain = 30
+ //We are a major threat.
+ del_on_deaggro = 9999 SECONDS
+ retreat_health = 0
+ food = 0
+ attack_sound = list('modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_1.ogg', 'modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_2.ogg', 'modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_3.ogg')
+ dodgetime = 66
+ aggressive = 1
+// stat_attack = UNCONSCIOUS
+ var/stagetwo = 0
+ var/allow_ability = 0
+ var/ability_cd = 0
+
+//Armor Penetration buff to really ruin someones day.
+/datum/intent/simple/claw/wendigo
+ name = "claw"
+ icon_state = "instrike"
+ attack_verb = list("claws", "slashes")
+ animname = "blank22"
+ blade_class = BCLASS_CUT
+ hitsound = "smallslash"
+ chargetime = 0
+ penfactor = 25
+ swingdelay = 3
+ candodge = TRUE
+ canparry = TRUE
+ miss_text = "claws the air!"
+ item_d_type = "slash"
+
+/mob/living/simple_animal/hostile/retaliate/rogue/wendigo_beast/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_BLOODLOSS_IMMUNE, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_BASHDOORS, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_ORGAN_EATER, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NASTY_EATER, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOSTINK, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_CRITICAL_RESISTANCE, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC)
+ ADD_TRAIT(src, TRAIT_NOBREATH, TRAIT_GENERIC)
+
+/mob/living/simple_animal/hostile/retaliate/rogue/wendigo_beast/proc/enter_stage_two()
+ src.move_to_delay = 2
+ src.turns_per_move = 1
+ //We heal to full now! Effective total HP roughly 1500. Fire damage is permanent however and is the ideal way of killing.
+ src.adjustBruteLoss(-maxHealth)
+ playsound(src, 'modular_causticcove/sound/mobs/gut_mucher_stage_two.ogg', 100, TRUE)
+ src.allow_ability = TRUE
+
+/mob/living/simple_animal/hostile/retaliate/rogue/wendigo_beast/proc/rend_ability()
+ ability_cd = 20
+ var/list/mob/living/chosen_target = list()
+ for(var/mob/living/targets in oview(1, src))
+ if(isliving(targets))
+ chosen_target += targets
+ if(LAZYLEN(chosen_target))
+ var/mob/living/T = pick(chosen_target)
+ prevent_goto_target = TRUE
+ visible_message(span_warningbig("\The [src] pins [T] into the ground!"))
+ face_atom(T)
+ T.Stun(90)
+ src.melee_damage_lower = 10
+ src.melee_damage_upper = 25
+ T.emote("scream")
+ new /obj/effect/gibspawner/generic(T.loc)
+ //Attack the mob 12 times over the duration.
+ for(var/i in 1 to 12)
+ if(do_after_mob(src, T, 3, TRUE))
+ T.attack_animal(src)
+ src.adjustBruteLoss(-5)
+ src.blood_volume += 20
+ //Sever limbs from the mob we attack. If we do, stop attacking.
+ if(prob(3))
+ var/obj/item/bodypart/limb
+ var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ for(var/zone in limb_list)
+ limb = T.get_bodypart(zone)
+ if(limb)
+ limb.dismember()
+ visible_message(span_warningbig("\The [src] tears off [T]'s \ [limb.name]!!!"))
+ i = 11
+ return
+
+ if(prob(50))
+ T.emote("painscream")
+ //Reset damage back to defaults
+ spawn(100)
+ src.melee_damage_lower = 30
+ src.melee_damage_upper = 45
+ prevent_goto_target = FALSE
+ turns_per_move = 1
+
+/mob/living/simple_animal/hostile/retaliate/rogue/wendigo_beast/Life()
+ . = ..()
+ //Enter stage two, allow access to the ability.
+ if(health <= (maxHealth/2) && !stagetwo)
+ src.stagetwo++
+ src.icon_state = icon_half_hp
+ enter_stage_two()
+ ability_cd--
+ //Fuck bleed, this thing is FULLY immune to bleed.
+ if(src.blood_volume < BLOOD_VOLUME_NORMAL)
+ src.blood_volume += 100
+ src.bleed_rate = 0
+
+/mob/living/simple_animal/hostile/retaliate/rogue/wendigo_beast/AttackingTarget()
+ . = ..()
+ //Heal on every attack. Occasionally heal double.
+ if(prob(50))
+ src.adjustBruteLoss(-10)
+ src.adjustBruteLoss(-10)
+ src.blood_volume += 10
+ //Always use it when off CD. Tear people UP! Also here to avoid runtimes.
+ if(src.ability_cd <= 0 && src.allow_ability)
+ rend_ability()
diff --git a/modular_causticcove/code/modules/vore/eating/vorepanel.dm b/modular_causticcove/code/modules/vore/eating/vorepanel.dm
index fa5de9ac7..276141e8d 100644
--- a/modular_causticcove/code/modules/vore/eating/vorepanel.dm
+++ b/modular_causticcove/code/modules/vore/eating/vorepanel.dm
@@ -51,6 +51,7 @@
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
/datum/vore_look/Destroy()
+ . = ..()
loop = null
selected = null
return QDEL_HINT_HARDDEL
diff --git a/modular_causticcove/icons/monsters/64x64Monsters.dmi b/modular_causticcove/icons/monsters/64x64Monsters.dmi
new file mode 100644
index 000000000..24f1eddad
Binary files /dev/null and b/modular_causticcove/icons/monsters/64x64Monsters.dmi differ
diff --git a/modular_causticcove/icons/monsters/Wendigo.dmi b/modular_causticcove/icons/monsters/Wendigo.dmi
new file mode 100644
index 000000000..eab84ba5a
Binary files /dev/null and b/modular_causticcove/icons/monsters/Wendigo.dmi differ
diff --git a/modular_causticcove/icons/monsters/lavaland_elites_64.dmi b/modular_causticcove/icons/monsters/lavaland_elites_64.dmi
new file mode 100644
index 000000000..fe22440cf
Binary files /dev/null and b/modular_causticcove/icons/monsters/lavaland_elites_64.dmi differ
diff --git a/modular_causticcove/icons/monsters/lavaland_monsters.dmi b/modular_causticcove/icons/monsters/lavaland_monsters.dmi
new file mode 100644
index 000000000..de44a8aa5
Binary files /dev/null and b/modular_causticcove/icons/monsters/lavaland_monsters.dmi differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_1.ogg b/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_1.ogg
new file mode 100644
index 000000000..d8a6eec47
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_1.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_2.ogg b/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_2.ogg
new file mode 100644
index 000000000..702040ba5
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_2.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_3.ogg b/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_3.ogg
new file mode 100644
index 000000000..84d0021b5
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_bab_attack_3.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_mother_death_shedding.ogg b/modular_causticcove/sound/mobs/eldritch/beast_mother_death_shedding.ogg
new file mode 100644
index 000000000..e839a8747
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_mother_death_shedding.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_1.ogg b/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_1.ogg
new file mode 100644
index 000000000..14025c836
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_1.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_2.ogg b/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_2.ogg
new file mode 100644
index 000000000..59bf9fed7
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_2.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_3.ogg b/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_3.ogg
new file mode 100644
index 000000000..6ac55182d
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/beast_mother_headbutt_3.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/egghatching.ogg b/modular_causticcove/sound/mobs/eldritch/egghatching.ogg
new file mode 100644
index 000000000..4cf16ba78
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/egghatching.ogg differ
diff --git a/modular_causticcove/sound/mobs/eldritch/enraged_notifier.ogg b/modular_causticcove/sound/mobs/eldritch/enraged_notifier.ogg
new file mode 100644
index 000000000..df1f9f559
Binary files /dev/null and b/modular_causticcove/sound/mobs/eldritch/enraged_notifier.ogg differ
diff --git a/modular_causticcove/sound/mobs/gut_mucher_stage_two.ogg b/modular_causticcove/sound/mobs/gut_mucher_stage_two.ogg
new file mode 100644
index 000000000..eb13db173
Binary files /dev/null and b/modular_causticcove/sound/mobs/gut_mucher_stage_two.ogg differ
diff --git a/roguetown.dme b/roguetown.dme
index c97028b16..cb83f94d6 100644
--- a/roguetown.dme
+++ b/roguetown.dme
@@ -3654,6 +3654,16 @@
#include "modular_hearthstone\code\modules\mob\living\simple_animal\rogue\rogue_corpse.dm"
#include "modular_hearthstone\code\modules\reagents\reagent_containers\lux.dm"
#include "modular_hearthstone\code\modules\spells\roguetown\wizard.dm"
+#include "modular_causticcove\code\__DEFINES\status_effects.dm"
+#include "modular_causticcove\code\datums\status_effects\rogue\causticbuff.dm"
+#include "modular_causticcove\code\modules\roguetown\roguejobs\alchemist\reagent.dm"
+#include "modular_causticcove\code\modules\roguetown\roguecrafting\alchemy.dm"
+#include "modular_causticcove\code\modules\roguetown\roguejobs\alchemist\containers.dm"
+#include "modular_causticcove\code\game\area\objects\items\rogueitems\natural\animals.dm"
+#include "modular_causticcove\code\modules\mob\living\simple_animal\rogue\eldritch\beast_mother.dm"
+#include "modular_causticcove\code\modules\mob\living\simple_animal\rogue\monster\wendigo_beast.dm"
+#include "modular_causticcove\code\modules\mob\living\simple_animal\rogue\monster\brain_gusher_beast.dm"
+#include "modular_causticcove\code\datums\status_effects\rogue\causticdebuff.dm"
#include "modular_hearthstone\code\modules\spells\roguetown\spells5e\cantrips5e.dm"
#include "modular_hearthstone\code\modules\spells\roguetown\spells5e\spellscrolls.dm"
// END_INCLUDE