diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm new file mode 100644 index 0000000000..4fa7da9947 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm @@ -0,0 +1,200 @@ +/mob/living/simple_mob/vore/demonAI + name = "Rift Walker" + desc = "A large bipedal creature, body a mix of dark fur and scales. Marks on the creatures body pulse slowly with red light" + + icon_state = "boxfox" + icon_living = "boxfox" + icon_dead = "dead" + icon_rest = "boxfox_rest" + icon = 'icons/mob/demon_ch.dmi' + vis_height = 47 + ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run + var/cloaked_alpha = 60 // Lower = Harder to see. + var/cloaked_bonus_damage = 30 // This is added on top of the normal melee damage. + var/cloaked_weaken_amount = 3 // How long to stun for. + var/cloak_cooldown = 10 SECONDS // Amount of time needed to re-cloak after losing it. + var/last_uncloak = 0 // world.time + + faction = "demon" + maxHealth = 200 + health = 200 + movement_cooldown = 0 + + see_in_dark = 10 + has_hands = TRUE + seedarkness = FALSE + attack_sound = 'sound/misc/demonattack.ogg' + has_langs = list(LANGUAGE_GALCOM,LANGUAGE_SHADEKIN,LANGUAGE_CULT) + + melee_damage_lower = 10 + melee_damage_upper = 5 + var/poison_chance = 50 + var/poison_type = "mindbreaker" + var/poison_per_bite = 3 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 96669 + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + + attacktext = list("mauled","slashed","clawed") + friendly = list("pokes", "scratches", "rurrs softly at", "sniffs on") + + vore_active = 1 + swallowTime = 2 SECOND + vore_pounce_chance = 15 + vore_icons = SA_ICON_LIVING + vore_escape_chance = 25 + + var/shifted_out = FALSE + var/shift_state = AB_SHIFT_NONE + var/last_shift = 0 + var/blood_spawn = 0 + var/is_shifting = FALSE + +/mob/living/simple_mob/vore/demonAI/init_vore() + ..() + var/obj/belly/B = vore_selected + B.name = "Stomach" + B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." + +/mob/living/simple_mob/vore/demonAI/UnarmedAttack() + if(shifted_out) + return FALSE + + . = ..() + +/mob/living/simple_mob/vore/demonAI/can_fall() + if(shifted_out) + return FALSE + + return ..() + +/mob/living/simple_mob/vore/demonAI/zMove(direction) + if(shifted_out) + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) + if(destination) + forceMove(destination) + return TRUE + + return ..() + +/mob/living/simple_mob/vore/demonAI/Life() + . = ..() + if(shifted_out) + density = FALSE + +/mob/living/simple_mob/vore/demonAI/handle_atmos() + if(shifted_out) + return + else + return .=..() + +/mob/living/simple_mob/vore/demonAI/update_canmove() + if(is_shifting) + canmove = FALSE + return canmove + else + return ..() + +/mob/living/simple_mob/vore/demonAI/cloak() + if(cloaked) + return + animate(src, alpha = cloaked_alpha, time = 1 SECOND) + cloaked = TRUE + + +/mob/living/simple_mob/vore/demonAI/uncloak() + last_uncloak = world.time // This is assigned even if it isn't cloaked already, to 'reset' the timer if the spider is continously getting attacked. + if(!cloaked) + return + animate(src, alpha = initial(alpha), time = 1 SECOND) + cloaked = FALSE + +// Check if cloaking if possible. +/mob/living/simple_mob/vore/demonAI/proc/can_cloak() + if(stat) + return FALSE + if(last_uncloak + cloak_cooldown > world.time) + return FALSE + + return TRUE + +// Called by things that break cloaks, like Technomancer wards. +/mob/living/simple_mob/vore/demonAI/break_cloak() + uncloak() + + +/mob/living/simple_mob/vore/demonAI/is_cloaked() + return cloaked + + +// Cloaks the spider automatically, if possible. +/mob/living/simple_mob/vore/demonAI/handle_special() + if(!cloaked && can_cloak()) + cloak() + + +// Applies bonus base damage if cloaked. +/mob/living/simple_mob/vore/demonAI/apply_bonus_melee_damage(atom/A, damage_amount) + var/turf/T = get_turf(src) + if(cloaked) + new /obj/effect/gibspawner/generic(T) + playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1) + uncloak() + return damage_amount + cloaked_bonus_damage + return ..() + + +// Force uncloaking if attacked. +/mob/living/simple_mob/vore/demonAI/bullet_act(obj/item/projectile/P) + . = ..() + break_cloak() + +/mob/living/simple_mob/vore/demonAI/hit_with_weapon(obj/item/O, mob/living/user, effective_force, hit_zone) + . = ..() + break_cloak() + +/mob/living/simple_mob/vore/demonAI/apply_melee_effects(var/atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.reagents) + var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) + if(L.can_inject(src, null, target_zone)) + inject_poison(L, target_zone) + +/mob/living/simple_mob/vore/demonAI/proc/inject_poison(mob/living/L, target_zone) + if(prob(poison_chance)) + to_chat(L, "You feel a tiny prick.") + L.reagents.add_reagent(poison_type, poison_per_bite) + + +/mob/living/simple_mob/vore/demonAI/death() + playsound(src, 'sound/misc/demondeath.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demonAI/bullet_act() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demonAI/attack_hand() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demonAI/hitby() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demonAI/attackby() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes_ch.dm new file mode 100644 index 0000000000..1247a04ca7 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_subtypes_ch.dm @@ -0,0 +1,89 @@ +/mob/living/simple_mob/vore/demonAI/wendigo + name = "Wendigo" + + icon_state = "wendigo" + icon_living = "wendigo" + icon_dead = "wendigo_dead" + icon_rest = "wendigo_rest" + + vore_icons = SA_ICON_LIVING + +/mob/living/simple_mob/vore/demonAI/engorge + name = "Engorge" + + icon_state = "engorge" + icon_living = "engorge" + icon_dead = "dead" + icon_rest = "engorge_rest" + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/zellic + name = "Zellic" + + icon_state = "zellic" + icon_living = "zellic" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/avarn + name = "Avarn" + + icon_state = "avarn" + icon_living = "avarn" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/covern + name = "Covern" + + icon_state = "covern" + icon_living = "covern" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/ira + name = "Ira" + + icon_state = "ira" + icon_living = "ira" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/ire + name = "Ire" + + icon_state = "ire" + icon_living = "ire" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/laxel + name = "Laxel" + + icon_state = "laxel" + icon_living = "laxel" + icon_dead = "dead" + icon_rest = null + + vore_icons = null + +/mob/living/simple_mob/vore/demonAI/lutra + name = "Lutra" + + icon_state = "lutra" + icon_living = "lutra" + icon_dead = "dead" + icon_rest = null + + vore_icons = null \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm index e4aa543d41..63595cb684 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm @@ -17,11 +17,14 @@ see_in_dark = 10 has_hands = TRUE seedarkness = FALSE - attack_sound = 'sound/weapons/bladeslice.ogg' + attack_sound = 'sound/misc/demonattack.ogg' has_langs = list(LANGUAGE_GALCOM,LANGUAGE_SHADEKIN,LANGUAGE_CULT) melee_damage_lower = 20 melee_damage_upper = 15 + var/poison_chance = 50 + var/poison_type = "mindbreaker" + var/poison_per_bite = 3 min_oxy = 0 max_oxy = 0 @@ -96,4 +99,37 @@ canmove = FALSE return canmove else - return ..() \ No newline at end of file + return ..() + +/mob/living/simple_mob/vore/demon/apply_melee_effects(var/atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.reagents) + var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) + if(L.can_inject(src, null, target_zone)) + inject_poison(L, target_zone) + +/mob/living/simple_mob/vore/demon/proc/inject_poison(mob/living/L, target_zone) + if(prob(poison_chance)) + to_chat(L, "You feel a tiny prick.") + L.reagents.add_reagent(poison_type, poison_per_bite) + +/mob/living/simple_mob/vore/demon/death() + playsound(src, 'sound/misc/demondeath.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demon/bullet_act() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demon/attack_hand() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demon/hitby() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() + +/mob/living/simple_mob/vore/demon/attackby() + playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) + ..() \ No newline at end of file diff --git a/sound/misc/demonattack.ogg b/sound/misc/demonattack.ogg new file mode 100644 index 0000000000..024ff846c0 Binary files /dev/null and b/sound/misc/demonattack.ogg differ diff --git a/sound/misc/demondeath.ogg b/sound/misc/demondeath.ogg new file mode 100644 index 0000000000..766d1f09da Binary files /dev/null and b/sound/misc/demondeath.ogg differ diff --git a/sound/misc/demonlaugh.ogg b/sound/misc/demonlaugh.ogg new file mode 100644 index 0000000000..3abd19087a Binary files /dev/null and b/sound/misc/demonlaugh.ogg differ diff --git a/vorestation.dme b/vorestation.dme index 00c4434fcc..b656f7a252 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2940,6 +2940,8 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demonAI_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demonAI_subtypes_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm"