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