From 335f002ba95915ffe6d05c11b32fb124b3109fbe Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 16 May 2016 21:39:24 -0400 Subject: [PATCH 1/2] Issue #30 - Added icons and code for vore animals. Also tweaked to be more in line with current codebase. --- .../living/simple_animal/friendly/fox_vr.dm | 308 ++++++++++++++++++ .../living/simple_animal/friendly/snake_vr.dm | 55 ++++ .../living/simple_animal/hostile/hostile.dm | 2 +- .../simple_animal/hostile/vore/alien.dm | 95 ++++++ .../living/simple_animal/hostile/vore/bear.dm | 170 ++++++++++ .../living/simple_animal/hostile/vore/carp.dm | 86 +++++ .../simple_animal/hostile/vore/creature.dm | 19 ++ .../simple_animal/hostile/vore/mimic.dm | 197 +++++++++++ .../living/simple_animal/hostile/vore/vore.dm | 148 +++++++++ .../living/simple_animal/simple_animal_vr.dm | 3 + icons/mob/fox_vr.dmi | Bin 0 -> 904 bytes icons/mob/snake_vr.dmi | Bin 0 -> 1234 bytes icons/mob/vore.dmi | Bin 0 -> 36302 bytes icons/mob/vore64x64.dmi | Bin 0 -> 12660 bytes vorestation.dme | 9 + 15 files changed, 1091 insertions(+), 1 deletion(-) create mode 100644 code/modules/mob/living/simple_animal/friendly/fox_vr.dm create mode 100644 code/modules/mob/living/simple_animal/friendly/snake_vr.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/vore/alien.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/vore/bear.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/vore/carp.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/vore/creature.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/vore/mimic.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/vore/vore.dm create mode 100644 code/modules/mob/living/simple_animal/simple_animal_vr.dm create mode 100644 icons/mob/fox_vr.dmi create mode 100644 icons/mob/snake_vr.dmi create mode 100644 icons/mob/vore.dmi create mode 100644 icons/mob/vore64x64.dmi diff --git a/code/modules/mob/living/simple_animal/friendly/fox_vr.dm b/code/modules/mob/living/simple_animal/friendly/fox_vr.dm new file mode 100644 index 00000000000..a6c0065a287 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/fox_vr.dm @@ -0,0 +1,308 @@ +/mob/living/simple_animal/fox + name = "Fox" + desc = "It's a fox. I wonder what it says?" + icon = 'icons/mob/fox_vr.dmi' + icon_state = "fox" + icon_living = "fox" + icon_dead = "fox_dead" + speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Awoo","Tchoff") + speak_emote = list("geckers", "barks") + emote_hear = list("howls","barks") + emote_see = list("shakes its head", "shivers", "geckers") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/fox + response_help = "scritches" + response_disarm = "gently pushes aside" + response_harm = "kicks" + var/turns_since_scan = 0 + var/mob/living/simple_animal/mouse/movement_target + var/mob/flee_target + min_oxy = 16 //Require atleast 16kPA oxygen + minbodytemp = 223 //Below -50 Degrees Celcius + maxbodytemp = 323 //Above 50 Degrees Celcius + mob_size = MOB_TINY + +/mob/living/simple_animal/fox/New() + if(!vore_organs.len) + var/datum/belly/B = new /datum/belly(src) + B.immutable = 1 + B.name = "Stomach" + B.inside_flavor = "Slick foxguts. Cute on the outside, slimy on the inside!" + B.human_prey_swallow_time = swallowTime + B.nonhuman_prey_swallow_time = swallowTime + vore_organs[B.name] = B + vore_selected = B.name + + B.emote_lists[DM_HOLD] = list( + "The foxguts knead and churn around you harmlessly.", + "With a loud glorp, some air shifts inside the belly.", + "A thick drop of warm bellyslime drips onto you from above.", + "The fox turns suddenly, causing you to shift a little.", + "During a moment of relative silence, you can hear the fox breathing.", + "The slimey stomach walls squeeze you lightly, then relax.") + + B.emote_lists[DM_DIGEST] = list( + "The guts knead at you, trying to work you into thick soup.", + "You're ground on by the slimey walls, treated like a mouse.", + "The acrid air is hard to breathe, and stings at your lungs.", + "You can feel the acids coating you, ground in by the slick walls.", + "The fox's stomach churns hungrily over your form, trying to take you.", + "With a loud glorp, the stomach spills more acids onto you.") + ..() + +// All them complicated fox procedures. +/mob/living/simple_animal/fox/Life() + //MICE! + if((loc) && isturf(loc)) + if(!stat && !resting && !buckled) + for(var/mob/living/simple_animal/mouse/M in loc) + if(isPredator) //If the fox is a predator, + movement_target = null + custom_emote(1, "greedily stuffs [M] into their gaping maw!") + if(M in oview(1, src)) + animal_nom(M) + else + M << "You just manage to slip away from [src]'s jaws before you can be sent to a fleshy prison!" + break + else + if(!M.stat) + M.splat() + visible_emote(pick("bites \the [M]!","toys with \the [M].","chomps on \the [M]!")) + movement_target = null + stop_automated_movement = 0 + break + ..() + + for(var/mob/living/simple_animal/mouse/snack in oview(src,5)) + if(snack.stat < DEAD && prob(15)) + audible_emote(pick("hunkers down!","acts stealthy!","eyes [snack] hungrily.")) + break + + if(!stat && !resting && !buckled) //SEE A MICRO AND ARE A PREDATOR, EAT IT! + for(var/mob/living/carbon/human/food in oview(src, 5)) + + if(food.size_multiplier <= RESIZE_A_SMALLTINY) + if(prob(10)) + custom_emote(1, pick("eyes [food] hungrily!","licks their lips and turns towards [food] a little!","pants as they imagine [food] being in their belly.")) + break + else + if(prob(5)) + movement_target = food + break + + for(var/mob/living/carbon/human/bellyfiller in oview(1, src)) + if(bellyfiller in src.prey_excludes) + continue + + if(bellyfiller.size_multiplier <= RESIZE_A_SMALLTINY && isPredator) + movement_target = null + custom_emote(1, pick("slurps [bellyfiller] with their slimey tongue.","looms over [bellyfiller] with their maw agape.","sniffs at [bellyfiller], their belly grumbling hungrily.")) + sleep(10) + custom_emote(1, "starts to scoop [bellyfiller] into their maw!") + if(bellyfiller in oview(1, src)) + animal_nom(bellyfiller) + else + bellyfiller << "You just manage to slip away from [src]'s jaws before you can be sent to a fleshy prison!" + break + + if(!stat && !resting && !buckled) + turns_since_scan++ + if (turns_since_scan > 5) + walk_to(src,0) + turns_since_scan = 0 + + if (flee_target) //fleeing takes precendence + handle_flee_target() + else + handle_movement_target() + +/mob/living/simple_animal/fox/proc/handle_movement_target() + //if our target is neither inside a turf or inside a human(???), stop + if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) + movement_target = null + stop_automated_movement = 0 + //if we have no target or our current one is out of sight/too far away + if( !movement_target || !(movement_target.loc in oview(src, 4)) ) + movement_target = null + stop_automated_movement = 0 + for(var/mob/living/simple_animal/mouse/snack in oview(src)) //search for a new target + if(isturf(snack.loc) && !snack.stat) + movement_target = snack + break + + if(movement_target) + stop_automated_movement = 1 + walk_to(src,movement_target,0,10) + +/mob/living/simple_animal/fox/proc/handle_flee_target() + //see if we should stop fleeing + if (flee_target && !(flee_target.loc in view(src))) + flee_target = null + stop_automated_movement = 0 + + if (flee_target) + if(prob(25)) say("GRRRRR!") + stop_automated_movement = 1 + walk_away(src, flee_target, 7, 2) + +/mob/living/simple_animal/fox/proc/set_flee_target(atom/A) + if(A) + flee_target = A + turns_since_scan = 5 + +/mob/living/simple_animal/fox/attackby(var/obj/item/O, var/mob/user) + . = ..() + if(O.force) + set_flee_target(user? user : src.loc) + + +/mob/living/simple_animal/fox/attack_hand(mob/living/carbon/human/M as mob) + . = ..() + if(M.a_intent == "hurt") + set_flee_target(M) + +/mob/living/simple_animal/fox/ex_act() + . = ..() + set_flee_target(src.loc) + +/mob/living/simple_animal/fox/bullet_act(var/obj/item/projectile/proj) + . = ..() + set_flee_target(proj.firer? proj.firer : src.loc) + +/mob/living/simple_animal/fox/hitby(atom/movable/AM) + . = ..() + set_flee_target(AM.thrower? AM.thrower : src.loc) + +/mob/living/simple_animal/fox/MouseDrop(atom/over_object) + + var/mob/living/carbon/H = over_object + if(!istype(H) || !Adjacent(H)) return ..() + + if(H.a_intent == "help") + get_scooped(H) + return + else + return ..() + +/mob/living/simple_animal/fox/get_scooped(var/mob/living/carbon/grabber) + if (stat >= DEAD) + return //since the holder icon looks like a living cat + ..() + +//Basic friend AI +/mob/living/simple_animal/fox/fluff + var/mob/living/carbon/human/friend + var/befriend_job = null + +/mob/living/simple_animal/fox/fluff/handle_movement_target() + if (friend) + var/follow_dist = 5 + if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) //danger + follow_dist = 1 + else if (friend.stat || friend.health <= 50) //danger or just sleeping + follow_dist = 2 + var/near_dist = max(follow_dist - 2, 1) + var/current_dist = get_dist(src, friend) + + if (movement_target != friend) + if (current_dist > follow_dist && !istype(movement_target, /mob/living/simple_animal/mouse) && (friend in oview(src))) + //stop existing movement + walk_to(src,0) + turns_since_scan = 0 + + //walk to friend + stop_automated_movement = 1 + movement_target = friend + walk_to(src, movement_target, near_dist, 4) + + //already following and close enough, stop + else if (current_dist <= near_dist) + walk_to(src,0) + movement_target = null + stop_automated_movement = 0 + if (prob(10)) + say("Yap!") + + if (!friend || movement_target != friend) + ..() + +/mob/living/simple_animal/fox/fluff/Life() + ..() + if (stat || !friend) + return + if (get_dist(src, friend) <= 1) + if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) + if (prob((friend.stat < DEAD)? 50 : 15)) + var/verb = pick("huffs", "whines", "yowls") + audible_emote(pick("[verb] in distress.", "[verb] anxiously.")) + else + if (prob(5)) + visible_emote(pick("nips [friend] affectionately.", + "yaps at [friend].", + "looks at [friend], wagging.", + "wags happily.")) + else if (friend.health <= 50) + if (prob(10)) + var/verb = pick("huffs", "whines", "yowls") + audible_emote("[verb] anxiously.") + +/mob/living/simple_animal/fox/fluff/verb/friend() + set name = "Become Friends" + set category = "IC" + set src in view(1) + + if(friend && usr == friend) + set_dir(get_dir(src, friend)) + say("Yap!") + return + + if (!(ishuman(usr) && befriend_job && usr.job == befriend_job)) + usr << "[src] ignores you." + return + + friend = usr + + set_dir(get_dir(src, friend)) + say("Yap!") + +/obj/item/weapon/reagent_containers/food/snacks/meat/fox + name = "Fox meat" + desc = "The fox doesn't say a god damn thing, now." + +//Captain fox +/mob/living/simple_animal/fox/fluff/Renault + name = "Renault" + desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" + isPredator = 1 + befriend_job = "Captain" + +/mob/living/simple_animal/fox/fluff/Renault/New() + if(!vore_organs.len) + var/datum/belly/B = new /datum/belly(src) + B.immutable = 1 + B.name = "Stomach" + B.inside_flavor = "Slick foxguts. They seem somehow more regal than perhaps other foxes!" + B.human_prey_swallow_time = swallowTime + B.nonhuman_prey_swallow_time = swallowTime + vore_organs[B.name] = B + vore_selected = B.name + + B.emote_lists[DM_HOLD] = list( + "Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.", + "There's a sudden squeezing as Renault presses a forepaw against his gut over you, squeezng you against the slick walls.", + "The 'head fox' has a stomach that seems to think you belong to it. It might be hard to argue, as it kneads at your form.", + "If being in the captain's fox is a promotion, it might not feel like one. The belly just coats you with more thick foxslime.", + "It doesn't seem like Renault wants to let you out. The stomach and owner possessively squeeze around you.", + "Renault's stomach walls squeeze closer, as he belches quietly, before swallowing more air. Does he do that on purpose?") + + B.emote_lists[DM_DIGEST] = list( + "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", + "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", + "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", + "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", + "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", + "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") + + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/snake_vr.dm b/code/modules/mob/living/simple_animal/friendly/snake_vr.dm new file mode 100644 index 00000000000..f53c8f46483 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/snake_vr.dm @@ -0,0 +1,55 @@ +/mob/living/simple_animal/snake + name = "Snake" + desc = "A big thick snake." + icon = 'icons/mob/snake_vr.dmi' + icon_state = "snake" + icon_living = "snake" + icon_dead = "snake_dead" + speak_emote = list("hisses") + health = 20 + maxHealth = 20 + attacktext = "bites" + melee_damage_lower = 3 + melee_damage_upper = 5 + response_help = "pets" + response_disarm = "shoos" + response_harm = "kicks" + turns_per_move = 8 // SLOW-ASS MUTHAFUCKA + +//NOODLE IS HERE! SQUEEEEEEEE~ +/mob/living/simple_animal/snake/Noodle + name = "Noodle" + desc = "This snake is particularly chubby and demands nothing but the finest of treats." + isPredator = 1 + +//Special snek-snax for Noodle! +obj/item/weapon/reagent_containers/food/snacks/snakesnack + name = "Sugar mouse" + desc = "A little mouse treat made of coloured sugar. Noodle loves these!" + var/snack_colour + icon = 'icons/mob/snake_vr.dmi' + icon_state = "snack_yellow" + +obj/item/weapon/reagent_containers/food/snacks/snakesnack/New() + ..() + if(!snack_colour) + snack_colour = pick( list("yellow","green","pink","blue") ) + icon_state = "snack_[snack_colour]" + desc = "A little mouse treat made of coloured sugar. Noodle loves these! This one is [snack_colour]." + +obj/item/weapon/storage/box/fluff/snakesnackbox + name = "Box of Snake Snax" + desc = "A box containing Noodle's special sugermouse treats." + icon = 'icons/mob/snake_vr.dmi' + icon_state = "sneksnakbox" + storage_slots = 7 + New() + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) + ..() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 33fb8acd248..10908e074bc 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -106,7 +106,7 @@ /mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7) - var/list/L = hearers(src, dist) + var/list/L = view(src, dist) //hearers(src, dist) <- This shit was broken and bad and caused a lot of lag because mobs would chase targets they can't see. -Spades for (var/obj/mecha/M in mechas_list) if (M.z == src.z && get_dist(src, M) <= dist) diff --git a/code/modules/mob/living/simple_animal/hostile/vore/alien.dm b/code/modules/mob/living/simple_animal/hostile/vore/alien.dm new file mode 100644 index 00000000000..391fbc65805 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/vore/alien.dm @@ -0,0 +1,95 @@ +/mob/living/simple_animal/hostile/vore/alien + name = "alien hunter" + desc = "Hiss!" + icon = 'icons/mob/alien.dmi' + icon_state = "xenohunter" + icon_living = "xenohunter" + icon_dead = "xenohunter-dead" + icon_gib = "gibbed-a" + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + speed = -1 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat + maxHealth = 100 + health = 100 + harm_intent_damage = 5 + melee_damage_lower = 25 + melee_damage_upper = 25 + attacktext = "slashed" + a_intent = "harm" + attack_sound = 'sound/weapons/bladeslice.ogg' + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + unsuitable_atoms_damage = 15 + faction = "alien" + environment_smash = 1 + status_flags = CANPUSH + minbodytemp = 0 + heat_damage_per_tick = 20 + capacity = 1 + + +/mob/living/simple_animal/hostile/vore/alien/drone + name = "alien drone" + icon_state = "xenodrone" + icon_living = "xenodrone" + icon_dead = "xenodrone-dead" + health = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + +/mob/living/simple_animal/hostile/vore/alien/sentinel + name = "alien sentinel" + icon_state = "xenosentinel" + icon_living = "xenosentinel" + icon_dead = "xenosentinel-dead" + health = 120 + melee_damage_lower = 15 + melee_damage_upper = 15 + ranged = 1 + projectiletype = /obj/item/projectile/neurotox + projectilesound = 'sound/weapons/pierce.ogg' + + +/mob/living/simple_animal/hostile/vore/alien/queen + name = "alien queen" + icon_state = "xenoqueen" + icon_living = "xenoqueen" + icon_dead = "xenoqueen-dead" + maxHealth = 250 + melee_damage_lower = 15 + melee_damage_upper = 15 + ranged = 1 + move_to_delay = 3 + projectiletype = /obj/item/projectile/neurotox + projectilesound = 'sound/weapons/pierce.ogg' + rapid = 1 + status_flags = 0 + + /mob/living/simple_animal/hostile/vore/alien/queen/large + name = "alien empress" + icon = 'icons/mob/alienqueen.dmi' + icon_state = "queen_s" + icon_living = "queen_s" + icon_dead = "queen_dead" + move_to_delay = 4 + maxHealth = 400 + health = 400 + pixel_x = -16 + capacity = 3 + +/obj/item/projectile/neurotox + damage = 30 + icon_state = "toxin" + +/mob/living/simple_animal/hostile/vore/alien/death() + ..() + visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") + playsound(src, 'sound/voice/hiss6.ogg', 100, 1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/vore/bear.dm b/code/modules/mob/living/simple_animal/hostile/vore/bear.dm new file mode 100644 index 00000000000..d843351d69c --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/vore/bear.dm @@ -0,0 +1,170 @@ +//Space bears! +/mob/living/simple_animal/hostile/vore/bear + name = "space bear" + desc = "RawrRawr!!" + icon_state = "spacebear" + icon_living = "spacebear" + icon_dead = "spacebear-dead" + icon_gib = "bear-gib" + speak = list("RAWR!","Rawr!","GRR!","Growl!") + speak_emote = list("growls", "roars") + emote_hear = list("rawrs","grumbles","grawls") + emote_see = list("stares ferociously", "stomps") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "pokes" + stop_automated_movement_when_pulled = 0 + maxHealth = 60 + health = 60 + melee_damage_lower = 20 + melee_damage_upper = 30 + + //Space bears aren't affected by atmos. + 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 + var/stance_step = 0 + + faction = "russian" + +/mob/living/simple_animal/hostile/vore/bear/brown + name = "space bear" + desc = "RawrRawr!!" + icon_state = "brownbear" + icon_living = "brownbear" + icon_dead = "brownbear-dead" + icon_gib = "bear-gib" + +//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! +/mob/living/simple_animal/hostile/vore/bear/Hudson + name = "Hudson" + desc = "" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "pokes" + +/mob/living/simple_animal/hostile/vore/bear/Life() + . =..() + if(!.) + return +/* + if(loc && istype(loc,/turf/space)) + icon_state = "bear" + else + icon_state = "bearfloor" +*/ + switch(stance) + + if(HOSTILE_STANCE_TIRED) + stop_automated_movement = 1 + stance_step++ + if(stance_step >= 10) //rests for 10 ticks + if(target_mob && target_mob in ListTargets(10)) + stance = HOSTILE_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. + else + stance = HOSTILE_STANCE_IDLE + + if(HOSTILE_STANCE_ALERT) + stop_automated_movement = 1 + var/found_mob = 0 + if(target_mob && target_mob in ListTargets(10)) + if(!(SA_attackable(target_mob))) + stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. + stance_step++ + found_mob = 1 + src.set_dir(get_dir(src,target_mob)) //Keep staring at the mob + + if(stance_step in list(1,4,7)) //every 3 ticks + var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) ) + if(action) + custom_emote(1,action) + if(!found_mob) + stance_step-- + + if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode + stance = HOSTILE_STANCE_IDLE + if(stance_step >= 7) //If we have been staring at a mob for 7 ticks, + stance = HOSTILE_STANCE_ATTACK + + if(HOSTILE_STANCE_ATTACKING) + if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest + custom_emote(1, "is worn out and needs to rest." ) + stance = HOSTILE_STANCE_TIRED + stance_step = 0 + walk(src, 0) //This stops the bear's walking + return + + + +/mob/living/simple_animal/hostile/vore/bear/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(stance != HOSTILE_STANCE_ATTACK && stance != HOSTILE_STANCE_ATTACKING) + stance = HOSTILE_STANCE_ALERT + stance_step = 6 + target_mob = user + ..() + +/mob/living/simple_animal/hostile/vore/bear/attack_hand(mob/living/carbon/human/M as mob) + if(stance != HOSTILE_STANCE_ATTACK && stance != HOSTILE_STANCE_ATTACKING) + stance = HOSTILE_STANCE_ALERT + stance_step = 6 + target_mob = M + ..() +/* +/mob/living/simple_animal/hostile/vore/bear/Process_Spacemove(var/check_drift = 0) + return //No drifting in space for space bears! +*/ +/mob/living/simple_animal/hostile/vore/bear/FindTarget() // TODO: Make it so if the target is laying down, the bear actually won't bother them. + . = ..() + if(.) + custom_emote(1,"stares alertly at [.]") + stance = HOSTILE_STANCE_ALERT + +/mob/living/simple_animal/hostile/vore/bear/LoseTarget() + ..(5) + +/mob/living/simple_animal/hostile/vore/bear/AttackingTarget() + + // Need to snowflake the vode in the bear code here because of the snowflakey way bears work. + if(isliving(target_mob.loc)) //They're inside a mob, maybe us, ignore! + return + + if(!isliving(target_mob)) //Can't eat 'em if they ain't alive. Prevents eating borgs/bots. + ..() + return + + if(picky && target_mob.digestable && target_mob.lying && target_mob.size_multiplier >= min_size && target_mob.size_multiplier <= max_size && !(target_mob in prey_exclusions)) + if(capacity) + var/check_size = target_mob.size_multiplier + fullness + if(check_size <= capacity) + animal_nom(target_mob) + else + animal_nom(target_mob) + return + + // Original bear attack code. + if(!Adjacent(target_mob)) + return + custom_emote(1, pick( list("slashes at [target_mob]", "bites [target_mob]") ) ) + + var/damage = rand(20,30) + + if(ishuman(target_mob)) + var/mob/living/carbon/human/H = target_mob + var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG) + var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1) + return H + else if(isliving(target_mob)) + var/mob/living/L = target_mob + L.adjustBruteLoss(damage) + return L \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/vore/carp.dm b/code/modules/mob/living/simple_animal/hostile/vore/carp.dm new file mode 100644 index 00000000000..f40938c5185 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/vore/carp.dm @@ -0,0 +1,86 @@ +/mob/living/simple_animal/hostile/vore/carp + name = "space carp" + desc = "A voracious, fang-bearing creature that resembles a fish." + icon = 'icons/mob/animal.dmi' + icon_state = "carp" + icon_living = "carp" + icon_dead = "carp_dead" + icon_gib = "carp_gib" + speak_chance = 0 + turns_per_move = 5 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "hits the" + speed = 4 + maxHealth = 25 + health = 25 + + harm_intent_damage = 8 + melee_damage_lower = 15 + melee_damage_upper = 15 + attacktext = "bitten" + attack_sound = 'sound/weapons/bite.ogg' + + capacity = 1 + max_size = 0.5 + + //Space carp aren't affected by atmos. + 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 + + break_stuff_probability = 15 + + faction = "carp" + +/mob/living/simple_animal/hostile/vore/carp/Process_Spacemove(var/check_drift = 0) + return 1 //No drifting in space for space carp! //original comments do not steal + +/mob/living/simple_animal/hostile/vore/carp/FindTarget() + . = ..() + if(.) + custom_emote(1,"nashes at [.]") + +/mob/living/simple_animal/hostile/vore/carp/AttackingTarget() + . =..() + var/mob/living/L = . + if(istype(L)) + if(prob(15)) + L.Weaken(3) + L.visible_message("\the [src] knocks down \the [L]!") + + +// ---------- Great White Carp ---------- // +/mob/living/simple_animal/hostile/vore/large/carp + name = "great white carp" + desc = "You're going to need a bigger ship." + icon_dead = "megacarp-dead" + icon_living = "megacarp" + icon_state = "megacarp" + pixel_y = -16 // Center this completely since it's in space. + maxHealth = 600 // Boss + health = 600 + speed = 3 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat + meat_amount = 10 + faction = "carp" + capacity = 2 + max_size = 2 + //Space carp aren't affected by atmos. + 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 + break_stuff_probability = 15 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/vore/creature.dm b/code/modules/mob/living/simple_animal/hostile/vore/creature.dm new file mode 100644 index 00000000000..59f52cd5ed0 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/vore/creature.dm @@ -0,0 +1,19 @@ +/mob/living/simple_animal/hostile/vore/creature + name = "creature" + desc = "A sanity-destroying otherthing." + icon = 'icons/mob/critter.dmi' + speak_emote = list("gibbers") + icon_state = "otherthing" + icon_living = "otherthing" + icon_dead = "otherthing-dead" + health = 80 + maxHealth = 80 + melee_damage_lower = 25 + melee_damage_upper = 50 + attacktext = "chomped" + attack_sound = 'sound/weapons/bite.ogg' + faction = "creature" + speed = 4 + capacity = 0 + max_size = 2 // Max: 2 + min_size = 0.25 // Min: 0.25 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/vore/mimic.dm b/code/modules/mob/living/simple_animal/hostile/vore/mimic.dm new file mode 100644 index 00000000000..1a765b49d14 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/vore/mimic.dm @@ -0,0 +1,197 @@ +// +// Abstract Class +// +/mob/living/simple_animal/hostile/vore/mimic + name = "crate" + desc = "A rectangular steel crate." + icon = 'icons/obj/storage.dmi' + icon_state = "crate" + icon_living = "crate" + + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + speed = 4 + maxHealth = 250 + health = 250 + + harm_intent_damage = 5 + melee_damage_lower = 8 + melee_damage_upper = 12 + attacktext = "attacked" + attack_sound = 'sound/weapons/bite.ogg' + + 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 + + capacity = 0 + + faction = "mimic" + move_to_delay = 8 + +/mob/living/simple_animal/hostile/vore/mimic/FindTarget() + . = ..() + if(.) + audible_emote("growls at [.]") + +/mob/living/simple_animal/hostile/vore/mimic/death() + ..() + del(src) + +// +// Crate Mimic +// + + +// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies. +/mob/living/simple_animal/hostile/vore/mimic/crate + + attacktext = "bitten" + + stop_automated_movement = 1 + wander = 0 + var/attempt_open = 0 + +// Pickup loot +/mob/living/simple_animal/hostile/vore/mimic/crate/New() + ..() + for(var/obj/item/I in loc) + I.loc = src + +/mob/living/simple_animal/hostile/vore/mimic/crate/DestroySurroundings() + ..() + if(prob(90)) + icon_state = "[initial(icon_state)]open" + else + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/vore/mimic/crate/ListTargets() + if(attempt_open) + return ..() + return view(src, 1) + +/mob/living/simple_animal/hostile/vore/mimic/crate/FindTarget() + . = ..() + if(.) + trigger() + +/mob/living/simple_animal/hostile/vore/mimic/crate/AttackingTarget() + . = ..() + if(.) + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/vore/mimic/crate/proc/trigger() + if(!attempt_open) + visible_message("[src] starts to move!") + attempt_open = 1 + +/mob/living/simple_animal/hostile/vore/mimic/crate/adjustBruteLoss(var/damage) + trigger() + ..(damage) + +/mob/living/simple_animal/hostile/vore/mimic/crate/LoseTarget() + ..() + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/vore/mimic/crate/LostTarget() + ..() + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/vore/mimic/crate/death() + + var/obj/structure/closet/crate/C = new(get_turf(src)) + // Put loot in crate + for(var/obj/O in src) + O.loc = C + ..() + +/mob/living/simple_animal/hostile/vore/mimic/crate/AttackingTarget() + . =..() + var/mob/living/L = . + if(istype(L)) + if(prob(15)) + L.Weaken(2) + L.visible_message("\the [src] knocks down \the [L]!") + +// +// Copy Mimic +// + +// var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/item/projectile/animate) +// List now defined in projectile/animate.dm + +/mob/living/simple_animal/hostile/vore/mimic/copy + + health = 100 + maxHealth = 100 + var/mob/living/creator = null // the creator + var/destroy_objects = 0 + var/knockdown_people = 0 + +/mob/living/simple_animal/hostile/vore/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator) + ..(loc) + CopyObject(copy, creator) + +/mob/living/simple_animal/hostile/vore/mimic/copy/death() + + for(var/atom/movable/M in src) + M.loc = get_turf(src) + ..() + +/mob/living/simple_animal/hostile/vore/mimic/copy/ListTargets() + // Return a list of targets that isn't the creator + . = ..() + return . - creator + +/mob/living/simple_animal/hostile/vore/mimic/copy/proc/CopyObject(var/obj/O, var/mob/living/creator) + + if((istype(O, /obj/item) || istype(O, /obj/structure)) && !is_type_in_list(O, protected_objects)) + + O.loc = src + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + icon_living = icon_state + + if(istype(O, /obj/structure)) + health = (anchored * 50) + 50 + destroy_objects = 1 + if(O.density && O.anchored) + knockdown_people = 1 + melee_damage_lower *= 2 + melee_damage_upper *= 2 + else if(istype(O, /obj/item)) + var/obj/item/I = O + health = 15 * I.w_class + melee_damage_lower = 2 + I.force + melee_damage_upper = 2 + I.force + move_to_delay = 2 * I.w_class + + maxHealth = health + if(creator) + src.creator = creator + faction = "\ref[creator]" // very unique + return 1 + return + +/mob/living/simple_animal/hostile/vore/mimic/copy/DestroySurroundings() + if(destroy_objects) + ..() + +/mob/living/simple_animal/hostile/vore/mimic/copy/AttackingTarget() + . =..() + if(knockdown_people) + var/mob/living/L = . + if(istype(L)) + if(prob(15)) + L.Weaken(1) + L.visible_message("\the [src] knocks down \the [L]!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/vore/vore.dm b/code/modules/mob/living/simple_animal/hostile/vore/vore.dm new file mode 100644 index 00000000000..650f621c604 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/vore/vore.dm @@ -0,0 +1,148 @@ +/* +-------------- +NOTES FOR DEVS +-------------- + +If your predator has a limited capacity, it should have sprites for every interval of its size, rounded to the nearest whole number. +Example: If I have a snake predator who has a capacity of 3, I need sprites for snake-1, snake-2, and snake-3. + +Capacity should always be a whole number. + +Also max_size and min_size should never exceed capacity or the icon will break. + +Don't use ranged mobs for vore mobs. +*/ + + +/mob/living/simple_animal/hostile/vore + name = "voracious lizard" + desc = "These gluttonous little bastards used to be regular lizards that were mutated by long-term exposure to phoron!" + icon_dead = "dino-dead" + icon_living = "dino" + icon_state = "dino" + icon = 'icons/mob/vore.dmi' + var/capacity = 1 // Zero is infinite. Do not set higher than you have icons to update. + var/max_size = 1 // Max: 2 + var/min_size = 0.25 // Min: 0.25 + var/picky = 1 // Won't eat undigestable prey by default + var/fullness = 0 + swallowTime = 10 // Hungry little bastards. + + // By default, this is what most vore mobs are capable of. + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "hits" + speed = 4 + harm_intent_damage = 5 + melee_damage_lower = 10 + melee_damage_upper = 25 + attacktext = "bitten" + attack_sound = 'sound/weapons/bite.ogg' + min_oxy = 5 + max_oxy = 0 + min_tox = 0 + max_tox = 1 + min_co2 = 0 + max_co2 = 5 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 270 + maxbodytemp = 370 + heat_damage_per_tick = 15 + cold_damage_per_tick = 10 + unsuitable_atoms_damage = 10 + +/mob/living/simple_animal/hostile/vore/update_icons() + if(stat == DEAD) + return + + if(capacity) + fullness = 0 + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + for(var/mob/living/M in B.internal_contents) + fullness += M.size_multiplier + fullness = round(fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry. + if(fullness) + if (fullness > capacity) // Player controlled. + icon_state = "[initial(icon_state)]-[capacity]" + else + icon_state = "[initial(icon_state)]-[fullness]" + else + icon_state = initial(icon_state) + ..() + +/mob/living/simple_animal/hostile/vore/New() + + if(!vore_organs.len) + var/datum/belly/B = new /datum/belly(src) + B.immutable = 1 + B.name = "Stomach" + B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [name]." + if (faction == "neutral") + B.digest_mode = "Hold" // Friendly slime-spawned mobs are neutral faction. + else + B.digest_mode = "Digest" // Though this usually doesn't happen. + vore_organs[B.name] = B + vore_selected = "Stomach" + B.vore_verb = "swallow" + B.emote_lists[DM_HOLD] = list( + "The insides knead at you gently for a moment.", + "The guts glorp wetly around you as some air shifts.", + "Your predator takes a deep breath and sighs, shifting you somewhat.", + "The stomach squeezes you tight for a moment, then relaxes.", + "During a moment of quiet, breathing becomes the most audible thing.", + "The warm slickness surrounds and kneads on you.") + + B.emote_lists[DM_DIGEST] = list( + "The caustic acids eat away at your form.", + "The acrid air burns at your lungs.", + "Without a thought for you, the stomach grinds inwards painfully.", + "The guts treat you like food, squeezing to press more acids against you.", + "The onslaught against your body doesn't seem to be letting up; you're food now.", + "The insides work on you like they would any other food.") + ..() + +/mob/living/simple_animal/hostile/vore/AttackingTarget() + if(isliving(target_mob.loc)) //They're inside a mob, maybe us, ignore! + return + + if(!isliving(target_mob)) //Can't eat 'em if they ain't alive. Prevents eating borgs/bots. + ..() + return + + if(picky && !target_mob.digestable) //Don't eat people with nogurgle prefs + ..() + return + + if(target_mob.lying && target_mob.size_multiplier >= min_size && target_mob.size_multiplier <= max_size && !(target_mob in prey_exclusions)) + if(capacity) + var/check_size = target_mob.size_multiplier + fullness + if(check_size <= capacity) + animal_nom(target_mob) + target_mob = null + else + animal_nom(target_mob) + target_mob = null + + ..() + +/mob/living/simple_animal/hostile/vore/death() + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + B.release_all_contents() // When your stomach is empty + ..() // then you have my permission to die. + + +// ------- Big Preds ------- // + +/mob/living/simple_animal/hostile/vore/large + name = "giant snake" + desc = "Snakes. Why did it have to be snakes?" + icon = 'icons/mob/vore64x64.dmi' + icon_dead = "snake-dead" + icon_living = "snake" + icon_state = "snake" + pixel_x = -16 + maxHealth = 200 + health = 200 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm new file mode 100644 index 00000000000..ec0d15bcd7e --- /dev/null +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -0,0 +1,3 @@ +/mob/living/simple_animal + // List of targets excluded (for now) from being eaten by this mob. + var/list/prey_exclusions = list() diff --git a/icons/mob/fox_vr.dmi b/icons/mob/fox_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..79d1671408e6ababc45537df19c9571f704d10a8 GIT binary patch literal 904 zcmV;319$w1P)gwj^@A7&iz`($q{T-A5 z0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DJ{Q3iHkEOv#1!Pg^M$- zC^0t`#5P1x6Q7crn1WDfh@wzg!PU4sN}hzKh?{p2Rx<@U`D|C3SdHjvKUAwqe@k-N91b6R{hpcbjoHx1_@0E zARR9Pj4qt8&N{=7{UIRfqjzlP4Di-k-vL~iA`tx~AHrFQ3BIkL`iiy6v*~60fd^YO zOkCFpbJcHP64Z@;5dZ`mvLyU(mKOjbsm7wd57&N;^AvN z0YpD$fN)5bpqTy@;CcWQ0GaO>}$seQhzVB84l;>I@s%nYJ*App7c zUJq^SB&}x+irIk(X_nR{TB~uZUh1y`Dnk^7HONW_k8^lol8Q;@Io812!~}!7wnXo3 z{z{n0Dnh#d>$A!5-#lE3Kp!B-p&^r10XqBSEx>vfEISE+PxB8H+xjcuc@})(Yf(Ke epQqX9`u_koeju0$m0000G#$5 z)t9BOps%^p==GPcm!P?z)AiHY?fbC7%zyv@+56eB%&>%!nS_~ydxwvEk9&?(M2=ZI zz`($~dtU#gvAmB}|G%I2)$RB9)vuSRxuCN3)9bIVm$|v1_4U*H+40P<#QXc%%*?Qv zgp-+>gpYfPkB@t$O+lquJF2PrzW@LL0d!JMQvg8b*k%9#0G@hOSad{Xb7OL8aCB*J zZU6vyoQ=@23c@e|1kgG8iqP(2)zw8>q=Ws1lA5y#iHRi9>fhVwAP9wQckphxk{z03 z+p+r8(g%D{&ayq*t=5!GN<=xA?S>KwHOlxcA@Ybh7Qu3jf)b&8NFz!vo?nr2^{09P zE`GFHqR@#C?wMivS@(mvBa@CEu$lIztj?q_7~`fTT(YLCKj*#yZQy7;!bi z3R@X(^uIAsKGq(#GT!K)Ogq>JFxbj?vwsqE-bMiT7Aqe{#vA>|guyNcxNW=-Z}N}E zC>#t(2f^>=J_)<2jO}@&|BV5ZZ-_{Qf+6fCmNE%s0`$Dee~cDj5G0VUiBw{DGl4`- z0u~_NQK025{Bwm+r>s~Kp=4QcC%lrvK+I+nZ}LAFOuHQ;9M^H!?JrYV026QWKNutg zYX$RF5WsE&n4ipinllN@bK{P@bK_>u9yipa{T!SM;0JH|NO`T z(lni?bGZ12)R_Rq-_{w6&O-AKt^}yg2WITy7b#qeg+l?#{vDS9W1|LmyI2B#zM|^i zu?QADun5!wDAh-j@`MCY7!hUvKFk2SbTdFtPPGc?*}2H~N2#j*y-UIcd+Bo^Iz7pB z3ZnC~e9ZIspnxQb{+%ZwtAkW3fV-rCN%Z1n_G%nrn}7W#f4j>MN2#j*eQO`!ukl96 z9MX4LmQh+{OF;qW-{*NwX_+ra3WlRpRsU}OC7?Y11xP3g7{-Y}dHhR|P?j+4Cc@?@ z)uPE)f<|ltE(%m2$#mdx0xnBbAn;^_y~DE*852+xSCO30nSiqVAm{%cQBg#YW{UX0 zmnHJf;zNY%YZ&RZlE1k@{>GUA4-XFy4-XFy508HYf7IU}GXCwIzQ4bJaH}A?yREeS z{lk6jK*4tZ{_#`wS=Zlx`C5NFxCGw6f3K>F(xzGp3ON6xu4_u$dg(?1#(x9}O#{O? z5h#!U1QOa7hQlWU^zS$Uj}0o2_xCsfPc15NQwg+U0-ENhqQ9@1fVTbRtiNv>?B5mf wfp1&noyCU;s}+oNrR3LZIU>4e-l2zdTCPM*si-07*qoM6N<$fn+a literal 0 HcmV?d00001 diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fd2050b7a30755a353ef8c48fa11488145676f78 GIT binary patch literal 36302 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%0A#p2-bqSc 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 X{T04tFi-oh1Kl-4bA!+Nu95!(9c+i_ literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index d73ba8b1632..e6e6af78e7d 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1499,6 +1499,7 @@ #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" #include "code\modules\mob\living\simple_animal\worm.dm" #include "code\modules\mob\living\simple_animal\borer\borer.dm" #include "code\modules\mob\living\simple_animal\borer\borer_captive.dm" @@ -1511,10 +1512,12 @@ #include "code\modules\mob\living\simple_animal\friendly\corgi_vr.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\fox_vr.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" #include "code\modules\mob\living\simple_animal\friendly\slime.dm" +#include "code\modules\mob\living\simple_animal\friendly\snake_vr.dm" #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" @@ -1534,6 +1537,12 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\hostile\vore\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\vore\bear.dm" +#include "code\modules\mob\living\simple_animal\hostile\vore\carp.dm" +#include "code\modules\mob\living\simple_animal\hostile\vore\creature.dm" +#include "code\modules\mob\living\simple_animal\hostile\vore\mimic.dm" +#include "code\modules\mob\living\simple_animal\hostile\vore\vore.dm" #include "code\modules\mob\living\voice\voice.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" From 95666ddac1113a93b326120e138a19bf72590501 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 17 May 2016 19:38:35 -0400 Subject: [PATCH 2/2] Fix to leading space in alien.dm --- code/modules/mob/living/simple_animal/hostile/vore/alien.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/vore/alien.dm b/code/modules/mob/living/simple_animal/hostile/vore/alien.dm index 391fbc65805..ccb27f5b6e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/vore/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/vore/alien.dm @@ -73,7 +73,7 @@ rapid = 1 status_flags = 0 - /mob/living/simple_animal/hostile/vore/alien/queen/large +/mob/living/simple_animal/hostile/vore/alien/queen/large name = "alien empress" icon = 'icons/mob/alienqueen.dmi' icon_state = "queen_s"