Merge pull request #4707 from Sebbe9123/upstream-merge-5735

The real mapping mob fix.
This commit is contained in:
Spades
2019-01-21 11:20:45 -05:00
committed by GitHub
13 changed files with 860 additions and 16 deletions
@@ -0,0 +1,60 @@
/mob/living/simple_mob/animal/passive/fish/koi/poisonous
desc = "A genetic marvel, combining the docility and aesthetics of the koi with some of the resiliency and cunning of the noble space carp."
health = 50
maxHealth = 50
/mob/living/simple_mob/animal/passive/fish/koi/poisonous/New()
..()
create_reagents(60)
reagents.add_reagent("toxin", 45)
reagents.add_reagent("impedrezene", 15)
/mob/living/simple_mob/animal/passive/fish/koi/poisonous/Life()
..()
if(isbelly(loc) && prob(10))
var/obj/belly/B = loc
sting(B.owner)
/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/living/L)
..()
if(isliving(L) && Adjacent(L))
var/mob/living/M = L
visible_message("<span class='warning'>\The [src][is_dead()?"'s corpse":""] flails at [M]!</span>")
SpinAnimation(7,1)
if(prob(75))
if(sting(M))
to_chat(M, "<span class='warning'>You feel a tiny prick.</span>")
if(is_dead())
return
for(var/i = 1 to 3)
var/turf/T = get_step_away(src, M)
if(T && is_type_in_list(T, suitable_turf_types))
Move(T)
else
break
sleep(3)
/*
/mob/living/simple_mob/animal/passive/fish/koi/poisonous/react_to_attack(var/atom/A)
if(isliving(A) && Adjacent(A))
var/mob/living/M = A
visible_message("<span class='warning'>\The [src][is_dead()?"'s corpse":""] flails at [M]!</span>")
SpinAnimation(7,1)
if(prob(75))
if(sting(M))
to_chat(M, "<span class='warning'>You feel a tiny prick.</span>")
if(is_dead())
return
for(var/i = 1 to 3)
var/turf/T = get_step_away(src, M)
if(T && is_type_in_list(T, suitable_turf_types))
Move(T)
else
break
sleep(3)
*/
/mob/living/simple_mob/animal/passive/fish/koi/poisonous/proc/sting(var/mob/living/M)
if(!M.reagents)
return 0
M.reagents.add_reagent("toxin", 2)
M.reagents.add_reagent("impedrezene", 1)
return 1
@@ -0,0 +1,250 @@
/mob/living/simple_mob/animal/fox_vr
name = "fox"
desc = "It's a fox. I wonder what it says?"
tt_desc = "Vulpes vulpes"
icon_state = "fox2"
icon_living = "fox2"
icon_dead = "fox2_dead"
icon_rest = "fox2_rest"
icon = 'icons/mob/fox_vr.dmi'
movement_cooldown = 0.5
see_in_dark = 6
mob_size = MOB_SMALL //Foxes are not smaller than cats so bumping them up to small
faction = "fox_vr"
response_help = "scritches"
response_disarm = "gently pushes aside"
response_harm = "kicks"
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
meat_amount = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/fox
say_list_type = /datum/say_list/fox_vr
ai_holder_type = /datum/ai_holder/simple_mob/fox_vr
var/turns_since_scan = 0
var/mob/flee_target
/datum/say_list/fox_vr
speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Awoo","Tchoff")
emote_hear = list("howls","barks","geckers",)
emote_see = list("shakes its head", "shivers", "geckers")
say_maybe_target = list("Yip?","Yap?")
say_got_target = list("YAP!","YIP!")
/datum/ai_holder/simple_mob/fox_vr
hostile = FALSE
cooperative = TRUE
returns_home = FALSE
retaliate = TRUE
can_flee = TRUE
speak_chance = 1 // If the mob's saylist is empty, nothing will happen.
wander = TRUE
base_wander_delay = 4
/mob/living/simple_mob/animal/fox_vr/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!"
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.")
/mob/living/simple_mob/animal/fox_vr/apply_melee_effects(var/atom/A)
if(ismouse(A))
var/mob/living/simple_mob/animal/passive/mouse/mouse = A
if(mouse.getMaxHealth() < 20) // In case a badmin makes giant mice or something.
mouse.splat()
visible_emote(pick("bites \the [mouse]!", "toys with \the [mouse].", "chomps on \the [mouse]!"))
else
..()
/mob/living/simple_mob/animal/fox_vr/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_mob/animal/fox_vr/get_scooped(var/mob/living/carbon/grabber)
if (stat >= DEAD)
return //since the holder icon looks like a living cat
..()
/mob/living/simple_mob/animal/fox_vr/Renault/IIsAlly(mob/living/L)
if(L == friend) // Always be pals with our special friend.
return TRUE
. = ..()
if(.) // We're pals, but they might be a dirty mouse...
if(ismouse(L))
return FALSE // Cats and mice can never get along.
/mob/living/simple_mob/animal/fox_vr/Renault/verb/become_friends()
set name = "Become Friends"
set category = "IC"
set src in view(1)
var/mob/living/L = usr
if(!istype(L))
return // Fuck off ghosts.
if(friend)
if(friend == usr)
to_chat(L, span("notice", "\The [src] is already your friend!"))
return
else
to_chat(L, span("warning", "\The [src] ignores you."))
return
friend = L
face_atom(L)
to_chat(L, span("notice", "\The [src] is now your friend!"))
visible_emote(pick("nips [friend].", "brushes against [friend].", "tugs on [friend].", "chrrrrs."))
if(has_AI())
var/datum/ai_holder/AI = ai_holder
AI.set_follow(friend)
/* Old fox friend AI, I'm not sure how to add the fancy "friend is dead" stuff so I'm commenting it out for someone else to figure it out, this is just baseline stuff.
//Basic friend AI
/mob/living/simple_mob/animal/fox_vr/fluff
var/mob/living/carbon/human/friend
var/befriend_job = null
/mob/living/simple_mob/animal/fox_vr/fluff/Life()
. = ..()
if(!. || !friend) return
var/friend_dist = get_dist(src,friend)
if (friend_dist <= 4)
if(stance == STANCE_IDLE)
if(set_follow(friend))
handle_stance(STANCE_FOLLOW)
if (friend_dist <= 1)
if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit)
if (prob((friend.stat < DEAD)? 50 : 15))
var/verb = pick("yaps", "howls", "whines")
audible_emote(pick("[verb] in distress.", "[verb] anxiously."))
else
if (prob(5))
visible_emote(pick("nips [friend].",
"brushes against [friend].",
"tugs on [friend].",
"chrrrrs."))
else if (friend.health <= 50)
if (prob(10))
var/verb = pick("yaps", "howls", "whines")
audible_emote("[verb] anxiously.")
/mob/living/simple_mob/animal/fox_vr/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 << "<span class='notice'>[src] ignores you.</span>"
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 goddamn thing, now."
//Captain fox
/mob/living/simple_mob/animal/fox_vr/Renault
name = "Renault"
desc = "Renault, the Colony Director's trustworthy fox. I wonder what it says?"
tt_desc = "Vulpes nobilis"
//befriend_job = "Colony Director" Sebbe edit: couldn't make this work, commenting out for now.
var/mob/living/friend = null // Our best pal, who we'll follow. awoo.
ai_holder_type = /datum/ai_holder/simple_mob/passive
/datum/ai_holder/simple_mob/passive
hostile = FALSE
can_flee = TRUE
violent_breakthrough = FALSE
base_wander_delay = 11
wander = TRUE
/mob/living/simple_mob/animal/fox_vr/Renault/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!"
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, squeezing 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.")
/mob/living/simple_mob/animal/fox_vr/syndicate
name = "syndi-fox"
desc = "It's a DASTARDLY fox! The horror! Call the shuttle!"
tt_desc = "Vulpes malus"
icon = 'icons/mob/fox_vr.dmi'
icon_state = "syndifox"
icon_living = "syndifox"
icon_dead = "syndifox_dead"
icon_rest = "syndifox_rest"
// this fox wears a hardsuit
maxHealth = 100
health = 100
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
@@ -0,0 +1,36 @@
/mob/living/simple_mob/animal/sif/fluffy
name = "Fluffy"
desc = "It's a pink Diyaab! It seems to be very tame and quiet."
tt_desc = "S Choeros hirtus"
icon_state = "fluffy"
icon_living = "fluffy"
icon_dead = "fluffy_dead"
icon_rest = "fluffy_sleep"
icon = 'icons/mob/animal_vr.dmi'
maxHealth = 20 //don't want Fluff to die on a missclick
health = 20
movement_cooldown = 5
see_in_dark = 5
mob_size = MOB_TINY
response_help = "scritches"
response_disarm = "bops"
response_harm = "kicks"
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
meat_amount = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
say_list_type = /datum/say_list/fluffy_vr
/datum/say_list/fluffy_vr
speak = list("Squee","Arf arf","Awoo","Squeak")
emote_hear = list("howls","squeals","squeaks", "barks")
emote_see = list("puffs its fur out", "shakes its fur", "stares directly at you")
@@ -0,0 +1,81 @@
/*
LORE:
Gaslamps are a phoron-based life form endemic to the world of Virgo-3B. They are
a sort of fungal organism with physical ties to Diona and Vox, deriving energy
for movement from a gentle combustion-like reaction in their bodies using
atmospheric phoron, carefully filtered trace oxygen, and captured meat products.
Over-exposure to oxygen causes their insides to burn too hot and eventually
kills them.
TODO: Make them light up and heat the air when exposed to oxygen.
*/
/mob/living/simple_mob/animal/space/gaslamp
name = "gaslamp"
desc = "Some sort of floaty alien with a warm glow. This creature is endemic to Virgo-3B."
tt_desc = "Semaeostomeae virginus"
icon_state = "gaslamp"
icon_living = "gaslamp"
icon_dead = "gaslamp-dead"
icon = 'icons/mob/vore32x64.dmi'
faction = "virgo3b"
maxHealth = 100
health = 100
movement_cooldown = 12
say_list_type = /datum/say_list/gaslamp
ai_holder_type = /datum/ai_holder/simple_mob/gaslamp
//speed = 2 not sure what this is, guessing animation, but it conflicts with new system.
melee_damage_lower = 30 // Because fuck anyone who hurts this sweet, innocent creature.
melee_damage_upper = 30
attacktext = list("thrashed")
friendly = "caressed"
response_help = "brushes" // If clicked on help intent
response_disarm = "pushes" // If clicked on disarm intent
response_harm = "swats" // If clicked on harm intent
minbodytemp = 0
maxbodytemp = 350
min_oxy = 0
max_oxy = 5 // Does not like oxygen very much.
min_tox = 1 // Needs phoron to survive.
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
/datum/say_list/gaslamp
emote_see = list("looms", "sways gently")
/datum/ai_holder/simple_mob/gaslamp
hostile = FALSE // The majority of simplemobs are hostile, gaslamps are nice.
cooperative = FALSE
retaliate = TRUE //so the monster can attack back
returns_home = FALSE
can_flee = FALSE
speak_chance = 1
wander = TRUE
base_wander_delay = 9
// Activate Noms!
/mob/living/simple_mob/animal/space/gaslamp
vore_active = 1
vore_capacity = 2
vore_bump_chance = 90 //they're frickin' jellyfish anenome filterfeeders, get tentacled
vore_bump_emote = "lazily wraps its tentacles around"
vore_standing_too = 1 // Defaults to trying to give you that big tentacle hug.
vore_ignores_undigestable = 0 // they absorb rather than digest, you're going in either way
vore_default_mode = DM_HOLD
vore_digest_chance = 0 // Chance to switch to digest mode if resisted
vore_absorb_chance = 20 // BECOME A PART OF ME.
vore_pounce_chance = 5 // Small chance to punish people who abuse their nomming behaviour to try and kite them forever with repeated melee attacks.
vore_stomach_name = "internal chamber"
vore_stomach_flavor = "You are squeezed into the tight embrace of the alien creature's warm and cozy insides."
vore_icons = SA_ICON_LIVING
@@ -0,0 +1,244 @@
//
// Abstract Class
//
/mob/living/simple_mob/animal/space/mimic
name = "crate"
desc = "A rectangular steel crate."
icon_state = "crate"
icon_living = "crate"
icon = 'icons/obj/storage.dmi'
faction = "mimic"
maxHealth = 250
health = 250
//speed = 4 no idea what this is, conflicts with new AI update.
movement_cooldown = 10 //slow crate.
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 8
melee_damage_upper = 12
attacktext = list("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
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
say_list_type = /datum/say_list/mimic
ai_holder_type = /datum/ai_holder/mimic
var/knockdown_chance = 15 //Stubbing your toe on furniture hurts.
showvoreprefs = 0 //VOREStation Edit - Hides mechanical vore prefs for mimics. You can't see their gaping maws when they're just sitting idle.
/datum/say_list/mimic
say_got_target = list("growls")
/datum/ai_holder/mimic
wander = FALSE
hostile = TRUE
threaten = TRUE
threaten_timeout = 5 SECONDS
threaten_delay = 1 SECONDS //not a threat, more of a delay.
/mob/living/simple_mob/animal/space/carp/apply_melee_effects(var/atom/A)
if(isliving(A))
var/mob/living/L = A
if(prob(knockdown_chance))
L.Weaken(3)
L.visible_message(span("danger", "\The [src] knocks down \the [L]!"))
/* should be covered by my "growls" say thing, but keeping it just in case.
/mob/living/simple_mob/animal/space/mimic/set_target()
. = ..()
if(.)
audible_emote("growls at [.]")
*/
/mob/living/simple_mob/animal/space/mimic/death()
..()
qdel(src)
/mob/living/simple_mob/animal/space/mimic/will_show_tooltip()
return FALSE
/mob/living/simple_mob/animal/space/mimic/death()
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
for(var/obj/O in src)
if(isbelly(O)) //VOREStation edit
continue
O.forceMove(C)
..()
/mob/living/simple_mob/animal/space/mimic/initialize()
. = ..()
for(var/obj/item/I in loc)
I.forceMove(src)
/* I honestly have no idea what's happening down there so I'm just taking the essentials and yeeting.
//
// Crate Mimic
//
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
/mob/living/simple_mob/animal/space/mimic/crate
attacktext = list("bitten")
// stop_automated_movement = 1 we don't need these
// wander = 0
var/attempt_open = 0
// Pickup loot
/mob/living/simple_mob/animal/space/mimic/crate/initialize()
. = ..()
for(var/obj/item/I in loc)
I.forceMove(src)
/* I can't find an equivilant to this, don't know why we really have it even so...
/mob/living/simple_mob/animal/space/mimic/crate/DestroySurroundings()
..()
if(prob(90))
icon_state = "[initial(icon_state)]open"
else
icon_state = initial(icon_state)
*/
/mob/living/simple_mob/animal/space/mimic/crate/ListTargets()
if(attempt_open)
return ..()
else
return ..(1)
/mob/living/simple_mob/animal/space/mimic/crate/set_target()
. = ..()
if(.)
trigger()
/mob/living/simple_mob/animal/space/mimic/crate/PunchTarget()
. = ..()
if(.)
icon_state = initial(icon_state)
/mob/living/simple_mob/animal/space/mimic/crate/proc/trigger()
if(!attempt_open)
visible_message("<b>[src]</b> starts to move!")
attempt_open = 1
/mob/living/simple_mob/animal/space/mimic/crate/adjustBruteLoss(var/damage)
trigger()
..(damage)
/mob/living/simple_mob/animal/space/mimic/crate/LoseTarget()
..()
icon_state = initial(icon_state)
/mob/living/simple_mob/animal/space/mimic/crate/LostTarget()
..()
icon_state = initial(icon_state)
/mob/living/simple_mob/animal/space/mimic/crate/death()
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
for(var/obj/O in src)
if(isbelly(O)) //VOREStation edit
continue
O.forceMove(C)
..()
/mob/living/simple_mob/animal/space/mimic/crate/PunchTarget()
. =..()
var/mob/living/L = .
if(istype(L))
if(prob(15))
L.Weaken(2)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
//
// Copy Mimic
//
var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/item/projectile/animate)
/mob/living/simple_mob/animal/space/mimic/copy
health = 100
maxHealth = 100
var/mob/living/creator = null // the creator
var/destroy_objects = 0
var/knockdown_people = 0
/mob/living/simple_mob/animal/space/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator)
..(loc)
CopyObject(copy, creator)
/mob/living/simple_mob/animal/space/mimic/copy/death()
for(var/atom/movable/M in src)
if(isbelly(M)) //VOREStation edit
continue
M.forceMove(get_turf(src))
..()
/mob/living/simple_mob/animal/space/mimic/copy/ListTargets()
// Return a list of targets that isn't the creator
. = ..()
return . - creator
/mob/living/simple_mob/animal/space/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.forceMove(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_mob/animal/space/mimic/copy/DestroySurroundings()
if(destroy_objects)
..()
/mob/living/simple_mob/animal/space/mimic/copy/PunchTarget()
. =..()
if(knockdown_people)
var/mob/living/L = .
if(istype(L))
if(prob(15))
L.Weaken(1)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
*/
@@ -0,0 +1,173 @@
/mob/living/simple_mob/animal/space/snake
name = "snake"
desc = "A big thick snake."
icon_state = "snake"
icon_living = "snake"
icon_dead = "snake_dead"
icon = 'icons/mob/snake_vr.dmi'
maxHealth = 20
health = 20
movement_cooldown = 8 // SLOW-ASS MUTHAFUCKA, I hope.
response_help = "pets"
response_disarm = "shoos"
response_harm = "kicks"
melee_damage_lower = 3
melee_damage_upper = 5
attacktext = list("bitten")
say_list_type = /datum/say_list/snake
ai_holder_type = /datum/ai_holder/simple_mob/melee
/datum/say_list/snake
emote_hear = list("hisses")
//NOODLE IS HERE! SQUEEEEEEEE~
/mob/living/simple_mob/animal/space/snake/noodle
name = "Noodle"
desc = "This snake is particularly chubby and demands nothing but the finest of treats."
ai_holder_type = /datum/ai_holder/simple_mob/passive
var/turns_since_scan = 0
var/obj/movement_target
/datum/ai_holder/simple_mob/passive
base_wander_delay = 11 //Them pets better be slow to not push us around
/datum/ai_holder/simple_mob/passive
hostile = FALSE
can_flee = TRUE
violent_breakthrough = FALSE
/mob/living/simple_mob/animal/space/snake/noodle/Life()
..()
//Not replacing with SA FollowTarget mechanics because Ian behaves... very... specifically.
//Feeding, chasing food, FOOOOODDDD
if(!stat && !resting && !buckled)
turns_since_scan++
if(turns_since_scan > 5)
turns_since_scan = 0
if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
movement_target = null
if( !movement_target || !(movement_target.loc in oview(src, 3)) )
movement_target = null
for(var/obj/item/weapon/reagent_containers/food/snacks/snakesnack/S in oview(src,3))
if(isturf(S.loc) || ishuman(S.loc))
movement_target = S
visible_emote("turns towards \the [movement_target] and slithers towards it.")
break
if(movement_target)
step_to(src,movement_target,1)
sleep(3)
step_to(src,movement_target,1)
sleep(3)
step_to(src,movement_target,1)
if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds
if (movement_target.loc.x < src.x)
set_dir(WEST)
else if (movement_target.loc.x > src.x)
set_dir(EAST)
else if (movement_target.loc.y < src.y)
set_dir(SOUTH)
else if (movement_target.loc.y > src.y)
set_dir(NORTH)
else
set_dir(SOUTH)
if(isturf(movement_target.loc) )
UnarmedAttack(movement_target)
else if(ishuman(movement_target.loc) && prob(20))
visible_emote("stares at the [movement_target] that [movement_target.loc] has with an unknowable reptilian gaze.")
/* old eating code, couldn't figure out how to make the "swallows food" thing so I'm keeping this here incase someone wants legacy"
/mob/living/simple_mob/animal/space/snake/noodle/Life() //stolen from Ian in corgi.dm
if(!..())
return 0
if(!stat && !resting && !buckled && !ai_inactive)
turns_since_scan++
if(turns_since_scan > 5)
turns_since_scan = 0
if(movement_target && !(isturf(movement_target.loc) || ishuman(movement_target.loc)))
movement_target = null
stop_automated_movement = 0
if(!movement_target || !(movement_target.loc in oview(src, 5)) )
movement_target = null
stop_automated_movement = 0
walk(src,0)
for(var/obj/item/weapon/reagent_containers/food/snacks/snakesnack/S in oview(src,3))
if(isturf(S.loc))
movement_target = S
visible_emote("turns towards \the [movement_target] and slithers towards it.")
break
if(movement_target)
stop_automated_movement = 1
walk_to(src, movement_target, 0, 5)
spawn(10)
if(Adjacent(movement_target))
visible_message("<span class='notice'>[src] swallows the [movement_target] whole!</span>")
qdel(movement_target)
walk(src,0)
else if(ishuman(movement_target.loc) && prob(20))
visible_emote("stares at the [movement_target] that [movement_target.loc] has with an unknowable reptilian gaze.")
*/
/mob/living/simple_mob/animal/space/snake/noodle/apply_melee_effects(var/atom/A)
if(ismouse(A))
var/mob/living/simple_mob/animal/passive/mouse/mouse = A
if(mouse.getMaxHealth() < 20) // In case a badmin makes giant mice or something.
mouse.splat()
visible_emote(pick("swallows \the [mouse] whole!"))
else
..()
/mob/living/simple_mob/animal/space/snake/noodle/attackby(var/obj/item/O, var/mob/user)
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/snakesnack))
visible_message("<span class='notice'>[user] feeds \the [O] to [src].</span>")
qdel(O)
else
return ..()
//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"
nutriment_amt = 1
nutriment_desc = list("sugar" = 1)
/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]."
reagents.add_reagent("sugar", 2)
/obj/item/weapon/storage/box/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
/obj/item/weapon/storage/box/snakesnackbox/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)
..()
+3 -3
View File
@@ -5263,7 +5263,7 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/north_stairs_one)
"amu" = (
/mob/living/simple_animal/fish/koi/poisonous,
/mob/living/simple_mob/animal/passive/fish/koi/poisonous,
/turf/simulated/floor/water/pool,
/area/tether/surfacebase/atrium_one)
"amv" = (
@@ -13346,7 +13346,7 @@
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/research)
"aFv" = (
/mob/living/simple_animal/retaliate/gaslamp,
/mob/living/simple_mob/animal/space/gaslamp,
/turf/simulated/floor/outdoors/grass/sif/virgo3b,
/area/tether/surfacebase/outside/outside1)
"aFw" = (
@@ -13773,7 +13773,7 @@
"aGx" = (
/obj/structure/table/glass,
/obj/item/weapon/storage/toolbox/emergency,
/obj/item/device/radio/emergency,
/obj/item/device/radio/emergency
/obj/machinery/recharger,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/first_aid_west)
+1 -1
View File
@@ -18136,7 +18136,7 @@
/obj/effect/floor_decal/corner_techfloor_grid{
dir = 10
},
/mob/living/simple_animal/lizard,
/mob/living/simple_mob/animal/passive/lizard,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/bar)
"Xd" = (
+1 -1
View File
@@ -19917,7 +19917,7 @@
/turf/simulated/floor/tiled,
/area/rnd/rdoffice)
"Ik" = (
/mob/living/simple_animal/slime/rainbow/kendrick,
/mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
/turf/simulated/floor/tiled,
/area/rnd/rdoffice)
"Il" = (
+5 -5
View File
@@ -884,7 +884,7 @@
dir = 4
},
/obj/structure/railing,
/mob/living/simple_animal/fish/koi/poisonous,
/mob/living/simple_mob/animal/passive/fish/koi/poisonous,
/turf/simulated/floor/water/pool,
/area/hallway/station/atrium)
"acg" = (
@@ -1446,7 +1446,7 @@
/obj/structure/railing{
dir = 1
},
/mob/living/simple_animal/fish/koi/poisonous,
/mob/living/simple_mob/animal/passive/fish/koi/poisonous,
/turf/simulated/floor/water/pool,
/area/hallway/station/atrium)
"adA" = (
@@ -8666,7 +8666,7 @@
/turf/simulated/floor/tiled,
/area/bridge_hallway)
"azy" = (
/mob/living/simple_animal/corgi/Ian,
/mob/living/simple_mob/animal/passive/dog/corgi/Ian,
/turf/simulated/floor/carpet,
/area/crew_quarters/heads/hop)
"azz" = (
@@ -10732,7 +10732,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/mob/living/simple_animal/fox/fluff/Renault,
/mob/living/simple_mob/animal/fox_vr/Renault,
/turf/simulated/floor/wood,
/area/crew_quarters/captain)
"aEu" = (
@@ -15893,7 +15893,7 @@
/area/hallway/station/atrium)
"bfT" = (
/obj/structure/disposalpipe/segment,
/mob/living/simple_animal/snake/Noodle,
/mob/living/simple_mob/animal/space/snake/noodle,
/turf/simulated/floor/carpet/oracarpet,
/area/crew_quarters/heads/chief)
"bfW" = (
+2 -2
View File
@@ -17576,7 +17576,7 @@
dir = 9;
pixel_y = 0
},
/mob/living/simple_animal/fluffy,
/mob/living/simple_mob/animal/sif/fluffy,
/turf/simulated/floor/tiled,
/area/quartermaster/qm)
"CG" = (
@@ -24324,7 +24324,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/mob/living/simple_animal/cat/fluff/Runtime,
/mob/living/simple_mob/animal/passive/cat/runtime,
/turf/simulated/floor/tiled/white,
/area/crew_quarters/heads/cmo)
"NB" = (
+1 -1
View File
@@ -428,7 +428,7 @@
/turf/simulated/floor/tiled/steel_dirty/virgo3b,
/area/outpost/mining_main/passage)
"cu" = (
/mob/living/simple_animal/retaliate/gaslamp,
/mob/living/simple_mob/animal/space/gaslamp,
/turf/simulated/floor/outdoors/grass/sif/virgo3b,
/area/mine/explored)
"cv" = (
+3 -3
View File
@@ -202,7 +202,7 @@
/turf/simulated/floor/virgo3b_indoors,
/area/tether/outpost/solars_shed)
"aw" = (
/mob/living/simple_animal/retaliate/gaslamp,
/mob/living/simple_mob/animal/space/gaslamp,
/turf/simulated/floor/outdoors/grass/sif/virgo3b,
/area/tether/outpost/solars_outside)
"ax" = (
@@ -800,7 +800,7 @@
/turf/simulated/mineral/virgo3b,
/area/tether/outpost/solars_outside)
"bH" = (
/mob/living/simple_animal/retaliate/gaslamp,
/mob/living/simple_mob/animal/space/gaslamp,
/turf/simulated/floor/tiled/steel_dirty/virgo3b,
/area/tether/outpost/solars_outside)
"bI" = (
@@ -817,7 +817,7 @@
/turf/simulated/floor/virgo3b,
/area/tether/outpost/solars_outside)
"bJ" = (
/mob/living/simple_animal/retaliate/gaslamp,
/mob/living/simple_mob/animal/space/gaslamp,
/turf/simulated/floor/outdoors/dirt/virgo3b,
/area/tether/outpost/solars_outside)
"bK" = (