mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-30 23:49:21 +01:00
Merge pull request #4707 from Sebbe9123/upstream-merge-5735
The real mapping mob fix.
This commit is contained in:
@@ -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)
|
||||
..()
|
||||
@@ -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)
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
Reference in New Issue
Block a user