Offmap Tweaks

This commit is contained in:
Casey
2021-12-02 19:56:25 -05:00
committed by Chompstation Bot
parent 5043070c9d
commit fe8c4753eb
65 changed files with 27730 additions and 118 deletions
+1
View File
@@ -70,6 +70,7 @@
if(stat == DEAD)
return 0
SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed)
if(src.loc && istype(loc,/obj/belly) || istype(loc,/obj/item/device/dogborg/sleeper)) deathmessage = "no message" //VOREStation Add - Prevents death messages from inside mobs
facing_dir = null
+3 -2
View File
@@ -19,8 +19,9 @@
selected_image = image(icon = buildmode_hud, loc = src, icon_state = "ai_sel")
/mob/living/Destroy()
dsoverlay.loc = null //I'll take my coat with me
dsoverlay = null
if(dsoverlay)
dsoverlay.loc = null //I'll take my coat with me
dsoverlay = null
if(nest) //Ew.
if(istype(nest, /obj/structure/prop/nest))
var/obj/structure/prop/nest/N = nest
@@ -0,0 +1,112 @@
//So this is a bit weird, but I tried to make this as adaptable as I could
//There are two working parts of an overmap mob, but I made it look like there is only one as far as the players are concerned.
//The /obj/effect/overmap/visitable/simplemob is the part people will actually see. It follows the mob around and changes dir to look as mob-ish as it can.
//The /mob/living/simple_mob/vore/overmap is NOT VISIBLE normally, and is the part that actually does the work most of the time.
//Being a simplemob, the mob can wander around and affect the overmap in whatever way you might desire.
//Whatever it does, the /visitable/simplemob will follow it, and does all the functional parts relating to the OM
//including scanning, and housing Z levels people might land on.
//The MOB being invisible presents some problems though, which I am not entirely sure how to resolve
//Such as, being unable to be attacked by other mobs, and possibly unable to be attacked by players.
//This does not at all prevent the mob from attacking other things though
//so in general, please ensure that you never spawn these where players can ordinarily access them.
//The mob was made invisible though, because the sensors can't detect invisible objects, so when the /visitable/simplemob was made invisible
//it refused to show up on sensors, and a few simple changes to the sensors didn't rectify this. So, rather than adding in more spaghetti to make
//simplemobs scannable (WHICH I DID, AND IT WORKED SOMEHOW), Aronai and I found that this was the better solution for making all the parts function like I'd like.
//Since I also want it to be possible to land on the overmap object.
/////OM LANDMARK/////
/obj/effect/overmap/visitable/simplemob
name = "unknown ship"
icon = 'icons/obj/overmap.dmi'
icon_state = "ship"
scannable = TRUE
known = FALSE
in_space = FALSE //Just cuz we don't want people getting here via map edge transitions normally.
unknown_name = "unknown ship"
unknown_state = "ship"
var/mob/living/simple_mob/vore/overmap/parent_mob_type
var/mob/living/simple_mob/vore/overmap/parent
/obj/effect/overmap/visitable/simplemob/New(newloc, new_parent)
if(new_parent)
parent = new_parent
return ..()
/obj/effect/overmap/visitable/simplemob/Initialize()
. = ..()
if(!parent_mob_type && !parent)
log_and_message_admins("An improperly configured OM mob event tried to spawn, and was deleted.")
return INITIALIZE_HINT_QDEL
if(!parent)
var/mob/living/simple_mob/vore/overmap/P = new parent_mob_type(loc, src)
parent = P
om_mob_event_setup()
/obj/effect/overmap/visitable/simplemob/proc/om_mob_event_setup()
scanner_desc = parent.scanner_desc
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_parent_moved)
skybox_pixel_x = rand(-100,100)
if(known)
name = initial(parent.name)
icon = initial(parent.icon)
icon_state = initial(parent.icon_state)
color = initial(parent.color)
desc = initial(parent.desc)
/obj/effect/overmap/visitable/simplemob/Destroy()
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
qdel_null(parent)
return ..()
/obj/effect/overmap/visitable/simplemob/get_scan_data(mob/user)
if(!known)
known = TRUE
name = initial(parent.name)
icon = initial(parent.icon)
icon_state = initial(parent.icon_state)
color = initial(parent.color)
desc = initial(parent.desc)
var/dat = {"\[b\]Scan conducted at\[/b\]: [stationtime2text()] [stationdate2text()]\n\[b\]Grid coordinates\[/b\]: [x],[y]\n\n[scanner_desc]"}
return dat
/obj/effect/overmap/visitable/simplemob/proc/on_parent_moved(atom/movable/source, OldLoc, Dir, Forced)
forceMove(parent.loc)
set_dir(parent.dir)
/////OM MOB///// DO NOT SPAWN THESE ANYWHERE IN THE WORLD, THAT'S SCARY /////
/mob/living/simple_mob/vore/overmap
invisibility = INVISIBILITY_ABSTRACT //We're making an overmap icon pretend to be a mob
name = "DONT SPAWN ME"
desc = "I'm a bad person I'm sorry"
faction = "overmap"
low_priority = FALSE
devourable = FALSE
digestable = FALSE
var/scanner_desc
var/obj/effect/overmap/visitable/simplemob/child_om_marker
var/om_child_type
/mob/living/simple_mob/vore/overmap/New(mapload, new_child)
if(new_child)
child_om_marker = new_child
return ..()
/mob/living/simple_mob/vore/overmap/Initialize()
. = ..()
if(!om_child_type && !om_child_type)
log_and_message_admins("An improperly configured OM mob tried to spawn, and was deleted.")
return INITIALIZE_HINT_QDEL
if(!child_om_marker)
var/obj/effect/overmap/visitable/simplemob/C = new om_child_type(loc, src)
child_om_marker = C
/mob/living/simple_mob/vore/overmap/Destroy()
qdel_null(child_om_marker)
return ..()
@@ -0,0 +1,94 @@
/datum/category_item/catalogue/fauna/skeleton
name = "Alien Wildlife - Space Skeleton"
desc = "A creature consisting primarily of what appears to be bones with no apparent connective tissue, muscle, or organs.\
It is not clear at all how this creature even operates."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/vore/alienanimals/skeleton
name = "skeleton"
desc = "An arrangement of what appears to be bones, given life and mobility. It looks REALLY spooky."
catalogue_data = list(/datum/category_item/catalogue/fauna/skeleton)
icon = 'icons/mob/alienanimals_x32.dmi'
icon_state = "skeleton"
icon_living = "skeleton"
icon_dead = "skeleton_dead"
faction = "space skeleton"
maxHealth = 100
health = 100
movement_cooldown = 1
movement_sound = 'sound/effects/skeleton_walk.ogg' //VERY IMPORTANT
see_in_dark = 10
response_help = "rattles"
response_disarm = "shoves aside"
response_harm = "smashes"
melee_damage_lower = 1
melee_damage_upper = 10
attack_sharp = FALSE
attacktext = list("spooked", "startled", "jumpscared", "rattled at")
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/skeleton
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 900
loot_list = list(
/obj/item/weapon/bone = 25,
/obj/item/weapon/bone/skull = 25,
/obj/item/weapon/bone/ribs = 25,
/obj/item/weapon/bone/arm = 25,
/obj/item/weapon/bone/leg = 25
)
speak_emote = list("rattles")
say_list_type = /datum/say_list/skeleton
vore_active = 1
vore_capacity = 1
vore_bump_chance = 5
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN
vore_icons = SA_ICON_LIVING
vore_stomach_name = "stomach"
vore_default_contamination_flavor = "Wet"
vore_default_contamination_color = "grey"
vore_default_item_mode = IM_DIGEST
/datum/say_list/skeleton
speak = list("Nyeh heh heeeh","NYAAAAHHHH", "Books are the real treasures of the world!", "Why are skeletons so calm? Because nothing gets under their skin.","When does a skeleton laugh? When someone tickels their funny bone!","What is a skeletons favorite mode of transport? A scare-plane.", "What did the skeleton say to the vampire? 'You suck.'","What is a skeletons favorite thing to do with their cell phone? Take skelfies.", "How did the skeleton know the other skeleton was lying? He could see right through him.","Whats a skeletons least favorite room in the house? The living room.", "How much does an elephant skeleton weigh? Skele-tons.", "Why do skeletons drink so much milk? Its good for the bones!", "Where do bad jokes about skeletons belong? In the skelebin.","What does a skeleton use to cut through objects? A shoulder blade.", "What kind of jokes do skeletons tell? Humerus ones.")
emote_see = list("spins its head around", "shuffles","shambles","practices on the xylophone","drinks some milk","looks at you. Its hollow, bottomless sockets gaze into you greedily.")
emote_hear = list("rattles","makes a spooky sound","cackles madly","plinks","clacks")
/mob/living/simple_mob/vore/alienanimals/skeleton/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You're not sure quite how, but you've found your way inside of the skeleton's stomach! It's cramped and cold and sounds heavily of xylophones!"
B.mode_flags = 40
B.digest_brute = 0.5
B.digest_burn = 0.5
B.digestchance = 10
B.absorbchance = 0
B.escapechance = 25
/mob/living/simple_mob/vore/alienanimals/skeleton/death(gibbed, deathmessage = "falls down and stops moving...")
. = ..()
/datum/ai_holder/simple_mob/melee/evasive/skeleton
hostile = TRUE
retaliate = TRUE
destructive = TRUE
violent_breakthrough = TRUE
@@ -0,0 +1,92 @@
/datum/category_item/catalogue/fauna/dustjumper
name = "Alien Wildlife - Dust Jumper"
desc = "A small, quick creature, the dust jumper is a rare space creature.\
They have striking similarities to the common mouse, but these creatures are actually most commonly found in space.\
They are known to make their homes in asteroids, and leap from one to another when food is scarce.\
Dust jumpers are omnivorous, eating what scraps of organic material they can get their little paws on.\
They hybernate during long floats through space."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/vore/alienanimals/dustjumper
name = "dust jumper"
desc = "A small, unassuming mammal. It looks quite soft and fluffy, and has bright blue eyes."
catalogue_data = list(/datum/category_item/catalogue/fauna/dustjumper)
icon = 'icons/mob/alienanimals_x32.dmi'
icon_state = "space_mouse"
icon_living = "space_mouse"
icon_dead = "space_mouse_dead"
faction = "space mouse"
maxHealth = 20
health = 20
movement_cooldown = 1
see_in_dark = 10
response_help = "pets"
response_disarm = "pushes"
response_harm = "punches"
melee_damage_lower = 1
melee_damage_upper = 2
attack_sharp = FALSE
attacktext = list("nipped", "squeaked at", "hopped on", "kicked")
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/dustjumper
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 900
speak_emote = list("squeaks")
say_list_type = /datum/say_list/mouse
vore_active = 1
vore_capacity = 1
vore_bump_chance = 0
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN
vore_icons = SA_ICON_LIVING
vore_stomach_name = "stomach"
vore_default_contamination_flavor = "Wet"
vore_default_contamination_color = "grey"
vore_default_item_mode = IM_DIGEST
/mob/living/simple_mob/vore/alienanimals/dustjumper/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You've been packed into the impossibly tight stomach of the dust jumper!!! The broiling heat seeps into you while the walls churn in powerfully, forcing you to curl up in the darkness."
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
B.digest_brute = 0.5
B.digest_burn = 0.5
B.digestchance = 10
B.absorbchance = 0
B.escapechance = 25
/mob/living/simple_mob/vore/alienanimals/dustjumper/Life()
. = ..()
if(!.)
return
if(vore_fullness == 0 && movement_cooldown == 50)
movement_cooldown = initial(movement_cooldown)
/mob/living/simple_mob/vore/alienanimals/dustjumper/perform_the_nom(mob/living/user, mob/living/prey, mob/living/pred, obj/belly/belly, delay)
. = ..()
movement_cooldown = 50
/datum/ai_holder/simple_mob/melee/evasive/dustjumper
hostile = FALSE
retaliate = TRUE
destructive = FALSE
violent_breakthrough = FALSE
can_flee = TRUE
flee_when_dying = TRUE
@@ -0,0 +1,201 @@
/datum/category_item/catalogue/fauna/spacewhale
name = "Alien Wildlife - Space Whale"
desc = "A massive space creature! These are typically peaceful to anything smaller than themselves, with exception given to space carp, which it eats.\
It is known to ravage and devour other large space dwelling species.\
It occasionally gets restless and moves around erratically, which may affect the local space weather.\
This creature shows no real interest in or aversion to spacecraft."
value = CATALOGUER_REWARD_SUPERHARD
/mob/living/simple_mob/vore/overmap/spacewhale
name = "space whale"
desc = "It's a space whale. I don't know what more you expected."
scanner_desc = "It's a space whale! Woah!"
catalogue_data = list(/datum/category_item/catalogue/fauna/spacewhale)
icon = 'icons/mob/alienanimals_x32.dmi'
icon_state = "space_whale"
icon_living = "space_whale"
icon_dead = "space_ghost_dead"
om_child_type = /obj/effect/overmap/visitable/simplemob/spacewhale
maxHealth = 100000
health = 100000
movement_cooldown = 50
see_in_dark = 10
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
harm_intent_damage = 1
melee_damage_lower = 50
melee_damage_upper = 100
attack_sharp = FALSE
attacktext = list("chomped", "bashed", "monched", "bumped")
ai_holder_type = /datum/ai_holder/simple_mob/melee/spacewhale
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 900
loot_list = list(/obj/random/underdark/uncertain)
armor = list(
"melee" = 1000,
"bullet" = 1000,
"laser" = 1000,
"energy" = 1000,
"bomb" = 1000,
"bio" = 1000,
"rad" = 1000)
armor_soak = list(
"melee" = 1000,
"bullet" = 1000,
"laser" = 1000,
"energy" = 1000,
"bomb" = 1000,
"bio" = 1000,
"rad" = 1000
)
speak_emote = list("rumbles")
say_list_type = /datum/say_list/spacewhale
var/hazard_pickup_chance = 35
var/hazard_drop_chance = 35
var/held_hazard
var/restless = FALSE
vore_active = 1
vore_capacity = 99
vore_bump_chance = 99
vore_pounce_chance = 99
vore_ignores_undigestable = 0
vore_default_mode = DM_DIGEST
vore_icons = SA_ICON_LIVING
vore_stomach_name = "stomach"
vore_default_contamination_flavor = "Wet"
vore_default_contamination_color = "grey"
vore_default_item_mode = IM_DIGEST
/datum/say_list/spacewhale
emote_see = list("ripples and flows", "flashes rhythmically","glows faintly","investigates something")
/mob/living/simple_mob/vore/overmap/spacewhale/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "It's warm and wet, makes sense, considering it's inside of a space whale. You should take a moment to reflect upon how you got here, and how you might avoid situations like this in the future, while this whale attempts to mercilessly destroy you through various gastric processes."
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
B.digest_brute = 50
B.digest_burn = 50
B.escapechance = 0
/mob/living/simple_mob/vore/overmap/spacewhale/Initialize()
. = ..()
handle_restless()
/mob/living/simple_mob/vore/overmap/spacewhale/Moved()
. = ..()
if(restless && prob(5))
handle_restless()
for(var/obj/effect/decal/cleanable/C in loc)
qdel(C)
for(var/obj/item/organ/O in loc)
qdel(O)
var/detected = FALSE
for(var/obj/effect/overmap/event/E in loc)
detected = TRUE
if(istype(E, /obj/effect/overmap/event/carp))
qdel(E)
continue
else if(!held_hazard && prob(hazard_pickup_chance))
held_hazard = E.type
qdel(E)
return
if(held_hazard && !detected && prob(hazard_drop_chance))
if(!(locate(/obj/effect/overmap/visitable/sector) in loc))
new held_hazard(loc)
held_hazard = null
/mob/living/simple_mob/vore/overmap/spacewhale/Life()
. = ..()
if(!restless && prob(0.5))
handle_restless()
/mob/living/simple_mob/vore/overmap/spacewhale/proc/handle_restless()
if(restless)
restless = FALSE
hazard_pickup_chance = initial(hazard_pickup_chance)
hazard_drop_chance = initial(hazard_drop_chance)
movement_cooldown = initial(movement_cooldown)
ai_holder.base_wander_delay = initial(ai_holder.base_wander_delay)
if(child_om_marker.known == TRUE)
child_om_marker.icon_state = "space_whale"
visible_message("<span class='notice'>\The [child_om_marker.name] settles down.</span>")
else
restless = TRUE
hazard_pickup_chance *= 1.5
hazard_drop_chance *= 1.5
movement_cooldown = 1
ai_holder.base_wander_delay = 2
ai_holder.wander_delay = 2
if(child_om_marker.known == TRUE)
child_om_marker.icon_state = "space_whale_restless"
visible_message("<span class='notice'>\The [child_om_marker.name] ripples excitedly.</span>")
/datum/ai_holder/simple_mob/melee/spacewhale
hostile = TRUE
retaliate = TRUE
destructive = TRUE
violent_breakthrough = TRUE
unconscious_vore = TRUE
handle_corpse = TRUE
mauling = TRUE
base_wander_delay = 50
/datum/ai_holder/simple_mob/melee/spacewhale/set_stance(var/new_stance)
. = ..()
var/mob/living/simple_mob/vore/overmap/spacewhale/W = holder
if(stance == STANCE_FIGHT)
W.movement_cooldown = 0
W.child_om_marker.glide_size = 0
if(stance == STANCE_IDLE)
W.hazard_pickup_chance = initial(W.hazard_pickup_chance)
W.hazard_drop_chance = initial(W.hazard_drop_chance)
W.movement_cooldown = 50
base_wander_delay = 50
W.restless = FALSE
W.handle_restless()
W.movement_cooldown = initial(W.movement_cooldown)
W.child_om_marker.glide_size = 0.384
/mob/living/simple_mob/vore/overmap/spacewhale/apply_melee_effects(var/atom/A)
. = ..()
if(istype(A, /mob/living))
var/mob/living/L = A
if(L.stat == DEAD && !L.allowmobvore)
L.gib()
else
return ..()
/obj/effect/overmap/visitable/simplemob/spacewhale
skybox_icon = 'icons/skybox/anomaly.dmi'
skybox_icon_state = "space_whale"
skybox_pixel_x = 0
skybox_pixel_y = 0
glide_size = 0.384
parent_mob_type = /mob/living/simple_mob/vore/overmap/spacewhale
@@ -0,0 +1,219 @@
/datum/category_item/catalogue/fauna/space_ghost
name = "Alien Wildlife - Space Ghost"
desc = "A mysterious and unknown creature made of radical energy.\
This creature's energy interferes the nervous system in many kinds of creatures, which may result in hallucinations.\
This creature's lack of a physical form leaves it quite resistant to physical damage.\
Smaller variants of this creature seem to be vulnerable to bright light.\
While both variants are quite vulnerable to laser and energy weapons."
value = CATALOGUER_REWARD_EASY
/mob/living/simple_mob/vore/alienanimals/space_ghost
name = "space ghost"
desc = "A pulsing mass of darkness that seems to have gained sentience."
tt_desc = "?????"
catalogue_data = list(/datum/category_item/catalogue/fauna/space_ghost)
icon = 'icons/mob/alienanimals_x32.dmi'
icon_state = "space_ghost"
icon_living = "space_ghost"
icon_dead = "space_ghost_dead"
has_eye_glow = TRUE
hovering = TRUE
pass_flags = PASSTABLE
faction = "space ghost"
maxHealth = 50
health = 50
movement_cooldown = 3.25
see_in_dark = 10
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
harm_intent_damage = 0
melee_damage_lower = 1
melee_damage_upper = 1
attack_sharp = FALSE
attacktext = list("spooked", "startled", "jumpscared", "screamed at")
ai_holder_type = /datum/ai_holder/simple_mob/melee/space_ghost
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 999999
armor = list(
"melee" = 100,
"bullet" = 100,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 100)
armor_soak = list(
"melee" = 100,
"bullet" = 100,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 100
)
loot_list = list(/obj/item/weapon/ore/diamond = 100)
speak_emote = list("rumbles")
vore_active = 0
projectiletype = /mob/living/simple_mob/vore/alienanimals/spooky_ghost
projectilesound = null
projectile_accuracy = 0
projectile_dispersion = 0
needs_reload = TRUE
reload_max = 1
reload_count = 0
reload_time = 7 SECONDS
/datum/ai_holder/simple_mob/ranged/kiting/space_ghost
hostile = TRUE
retaliate = TRUE
destructive = TRUE
violent_breakthrough = TRUE
speak_chance = 0
/mob/living/simple_mob/vore/alienanimals/space_ghost/apply_melee_effects(var/atom/A)
var/mob/living/L = A
L.hallucination += 50
/mob/living/simple_mob/vore/alienanimals/space_ghost/shoot(atom/A) //We're shooting ghosts at people and need them to have the same faction as their parent, okay?
if(!projectiletype)
return
if(A == get_turf(src))
return
face_atom(A)
if(reload_count >= reload_max)
return
var/mob/living/simple_mob/P = new projectiletype(loc, src)
if(!P)
return
if(needs_reload)
reload_count++
P.faction = faction
playsound(src, projectilesound, 80, 1)
/mob/living/simple_mob/vore/alienanimals/space_ghost/death(gibbed, deathmessage = "fades away!")
. = ..()
qdel(src)
/mob/living/simple_mob/vore/alienanimals/spooky_ghost
name = "space ghost"
desc = "A pulsing mass of darkness that seems to have gained sentience."
tt_desc = "?????"
catalogue_data = list(/datum/category_item/catalogue/fauna/space_ghost)
icon = 'icons/mob/alienanimals_x32.dmi'
icon_state = "spookyghost-1"
icon_living = "spookyghost-1"
icon_dead = "space_ghost_dead"
hovering = TRUE
pass_flags = PASSTABLE
faction = "space ghost"
maxHealth = 5
health = 5
movement_cooldown = 1
see_in_dark = 10
alpha = 128
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
harm_intent_damage = 0
melee_damage_lower = 1
melee_damage_upper = 1
attack_sharp = FALSE
attacktext = list("spooked", "startled", "jumpscared", "screamed at")
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 999999
armor = list(
"melee" = 100,
"bullet" = 100,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 100)
armor_soak = list(
"melee" = 100,
"bullet" = 100,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 100
)
speak_emote = list("rumbles")
vore_active = 0
ai_holder_type = /datum/ai_holder/simple_mob/melee/space_ghost
/mob/living/simple_mob/vore/alienanimals/spooky_ghost/Initialize()
. = ..()
icon_living = "spookyghost-[rand(1,2)]"
icon_state = icon_living
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
update_icon()
/datum/ai_holder/simple_mob/melee/space_ghost
hostile = TRUE
retaliate = TRUE
destructive = TRUE
violent_breakthrough = TRUE
speak_chance = 0
/mob/living/simple_mob/vore/alienanimals/spooky_ghost/death(gibbed, deathmessage = "fades away!")
. = ..()
qdel(src)
/mob/living/simple_mob/vore/alienanimals/spooky_ghost/apply_melee_effects(var/atom/A)
var/mob/living/L = A
L.hallucination += rand(1,50)
/mob/living/simple_mob/vore/alienanimals/spooky_ghost/Life()
. = ..()
var/turf/T = get_turf(src)
if(!T)
return
if(T.get_lumcount() >= 0.5)
adjustBruteLoss(1)
@@ -0,0 +1,177 @@
/datum/category_item/catalogue/fauna/startreader
name = "Alien Wildlife - Star Treader"
desc = "A hard shelled creature that lives on asteroids.\
It is quite durable and very opportunistic in its feeding habits.\
It is vulnerable to extreme vibrations, and from the bottom."
value = CATALOGUER_REWARD_EASY
/mob/living/simple_mob/vore/alienanimals/startreader
name = "asteroid star treader"
desc = "A slow, hard shelled creature that stalks asteroids."
tt_desc = "Testudines Stellarus"
catalogue_data = list(/datum/category_item/catalogue/fauna/startreader)
icon = 'icons/mob/alienanimals_x32.dmi'
icon_state = "startreader"
icon_living = "startreader"
icon_dead = "startreader_dead"
faction = "space turtle"
maxHealth = 1000
health = 1000
movement_cooldown = 20
see_in_dark = 10
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "punches"
harm_intent_damage = 1
melee_damage_lower = 1
melee_damage_upper = 10
attack_sharp = FALSE
attacktext = list("chomped", "bashed", "monched", "bumped")
ai_holder_type = /datum/ai_holder/simple_mob/melee/startreader
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 900
loot_list = list(/obj/random/underdark/uncertain = 25)
armor = list(
"melee" = 100,
"bullet" = 100,
"laser" = 100,
"energy" = 100,
"bomb" = 0,
"bio" = 100,
"rad" = 100)
armor_soak = list(
"melee" = 30,
"bullet" = 30,
"laser" = 10,
"energy" = 10,
"bomb" = 0,
"bio" = 100,
"rad" = 100
)
speak_emote = list("rumbles")
say_list_type = /datum/say_list/startreader
vore_active = 1
vore_capacity = 2
vore_bump_chance = 25
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN
vore_icons = SA_ICON_LIVING
vore_stomach_name = "gastric sac"
vore_default_contamination_flavor = "Wet"
vore_default_contamination_color = "grey"
vore_default_item_mode = IM_DIGEST
var/flipped = FALSE
var/flip_cooldown = 0
/datum/say_list/startreader
emote_see = list("bobs", "digs around","gnashes at something","yawns","snaps at something")
emote_hear = list("thrumms","clicks","rattles","groans","burbles")
/mob/living/simple_mob/vore/alienanimals/startreader/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "gastric sac"
B.desc = "It's cramped and hot! You're forced into a small ball as your shape is squeezed into the slick, wet chamber. Despite being swallowed into the creature, you find that you actually stretch out of the top a ways, and can JUST BARELY wiggle around..."
B.mode_flags = 40
B.digest_brute = 0.5
B.digest_burn = 0.5
B.digestchance = 10
B.absorbchance = 0
B.escapechance = 15
/datum/ai_holder/simple_mob/melee/startreader
hostile = TRUE
retaliate = TRUE
destructive = TRUE
violent_breakthrough = TRUE
/mob/living/simple_mob/vore/alienanimals/startreader/apply_melee_effects(var/atom/A)
if(weakened) //Don't stun people while they're already stunned! That's SILLY!
return
if(prob(15))
var/mob/living/L = A
if(isliving(A))
visible_message("<span class='danger'>\The [src] trips \the [L]!</span>!")
L.weakened += rand(1,10)
/mob/living/simple_mob/vore/alienanimals/startreader/Life()
. = ..()
if(flip_cooldown == 1)
flip_cooldown = 0
flipped = FALSE
handle_flip()
visible_message("<span class='notice'>\The [src] rights itself!!!</span>")
return
if(flip_cooldown)
flip_cooldown --
SetStunned(2)
/mob/living/simple_mob/vore/alienanimals/startreader/proc/handle_flip()
if(flipped)
armor = list(
"melee" = 0,
"bullet" = 0,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 0)
armor_soak = list(
"melee" = 0,
"bullet" = 0,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 0
)
icon_living = "startreader_flipped"
AdjustStunned(flip_cooldown)
else
armor = list(
"melee" = 100,
"bullet" = 100,
"laser" = 100,
"energy" = 100,
"bomb" = 0,
"bio" = 100,
"rad" = 100)
armor_soak = list(
"melee" = 30,
"bullet" = 30,
"laser" = 10,
"energy" = 10,
"bomb" = 0,
"bio" = 100,
"rad" = 100
)
icon_living = "startreader"
SetStunned(0)
update_icon()
@@ -76,6 +76,8 @@
var/obj/screen/energyhud //Holder to update this icon
var/list/shadekin_abilities
var/check_for_observer = FALSE
var/check_timer = 0
/mob/living/simple_mob/shadekin/Initialize()
//You spawned the prototype, and want a totally random one.
@@ -86,6 +88,7 @@
/mob/living/simple_mob/shadekin/red = 20, //Actively seek people out to nom, so fairly common to see (relatively speaking),
/mob/living/simple_mob/shadekin/blue = 15, //Explorers that like to interact with people, so still fairly common,
/mob/living/simple_mob/shadekin/purple = 15, //Also explorers that may or may not homf people,
/mob/living/simple_mob/shadekin/green = 5,
/mob/living/simple_mob/shadekin/yellow = 1 //Very rare, usually never leaves their home
)
var/new_type = pickweight(sk_types)
@@ -198,7 +201,18 @@
if(. && nutrition > initial(nutrition) && energy < 100)
nutrition = max(0, nutrition-5)
energy = min(100,energy+1)
if(!client && check_for_observer && check_timer++ > 5)
check_timer = 0
var/non_kin_count = 0
for(var/mob/living/M in view(6,src))
if(!istype(M, /mob/living/simple_mob/shadekin))
non_kin_count ++
// Technically can be combined with ||, they call the same function, but readability is poor
if(!non_kin_count && (ability_flags & AB_PHASE_SHIFTED))
phase_shift() // shifting back in, nobody present
else if (non_kin_count && !(ability_flags & AB_PHASE_SHIFTED))
phase_shift() // shifting out, scaredy
/mob/living/simple_mob/shadekin/update_icon()
. = ..()
@@ -28,6 +28,9 @@
a brawl, but you barely generate any of your own energy. You can stand in a dark spot to gather scraps \
of energy in a pinch, but otherwise need to take it, by force if necessary."
/mob/living/simple_mob/shadekin/red
ai_holder_type = /datum/ai_holder/simple_mob/melee
/mob/living/simple_mob/shadekin/red/white
icon_state = "white"
/mob/living/simple_mob/shadekin/red/dark
@@ -35,16 +38,6 @@
/mob/living/simple_mob/shadekin/red/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/red/ai
ai_holder_type = /datum/ai_holder/simple_mob/melee
/mob/living/simple_mob/shadekin/red/ai/white
icon_state = "white"
/mob/living/simple_mob/shadekin/red/ai/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/red/ai/brown
icon_state = "brown"
/////////////////////////////////////////////////////////////////
/mob/living/simple_mob/shadekin/blue
name = "blue-eyed shadekin"
@@ -85,6 +78,9 @@
without doing so, albeit slowly. Dark and light are irrelevant to you, they are just different places to explore and \
discover new things and new people."
/mob/living/simple_mob/shadekin/blue/
ai_holder_type = /datum/ai_holder/simple_mob/passive
/mob/living/simple_mob/shadekin/blue/white
icon_state = "white"
/mob/living/simple_mob/shadekin/blue/dark
@@ -92,16 +88,6 @@
/mob/living/simple_mob/shadekin/blue/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/blue/ai
ai_holder_type = /datum/ai_holder/simple_mob/passive
/mob/living/simple_mob/shadekin/blue/ai/white
icon_state = "white"
/mob/living/simple_mob/shadekin/blue/ai/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/blue/ai/brown
icon_state = "brown"
/////////////////////////////////////////////////////////////////
/mob/living/simple_mob/shadekin/purple
name = "purple-eyed shadekin"
@@ -137,6 +123,9 @@
areas is taxing on your energy. You can harvest energy from others in a fight, but since you don't need to, you may \
just choose to simply not fight."
/mob/living/simple_mob/shadekin/purple
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
/mob/living/simple_mob/shadekin/purple/white
icon_state = "white"
/mob/living/simple_mob/shadekin/purple/dark
@@ -144,16 +133,6 @@
/mob/living/simple_mob/shadekin/purple/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/purple/ai
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
/mob/living/simple_mob/shadekin/purple/ai/white
icon_state = "white"
/mob/living/simple_mob/shadekin/purple/ai/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/purple/ai/brown
icon_state = "brown"
/////////////////////////////////////////////////////////////////
/mob/living/simple_mob/shadekin/yellow
name = "yellow-eyed shadekin"
@@ -177,6 +156,7 @@
eye_desc = "yellow eyes"
stalker = FALSE
check_for_observer = TRUE
vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, slippery gullet \
of the creature. It's warm, and the air is thick. You can hear its body squelch and shift around you \
as you settle into its stomach! The doughy walls within cling to you heavily, churning down on you, wearing \
@@ -187,6 +167,9 @@
area is very taxing on you, but you gain energy extremely fast in any very dark area. You're weaker than other \
shadekin, but your fast energy generation in the dark allows you to phase shift more often."
/mob/living/simple_mob/shadekin/yellow
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
/mob/living/simple_mob/shadekin/yellow/white
icon_state = "white"
/mob/living/simple_mob/shadekin/yellow/dark
@@ -194,24 +177,14 @@
/mob/living/simple_mob/shadekin/yellow/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/yellow/ai
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
/mob/living/simple_mob/shadekin/yellow/ai/white
icon_state = "white"
/mob/living/simple_mob/shadekin/yellow/ai/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/yellow/ai/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/yellow/ai/retaliate
/mob/living/simple_mob/shadekin/yellow/retaliate
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
/mob/living/simple_mob/shadekin/yellow/ai/retaliate/white
/mob/living/simple_mob/shadekin/yellow/retaliate/white
icon_state = "white"
/mob/living/simple_mob/shadekin/yellow/ai/retaliate/dark
/mob/living/simple_mob/shadekin/yellow/retaliate/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/yellow/ai/retaliate/brown
/mob/living/simple_mob/shadekin/yellow/retaliate/brown
icon_state = "brown"
/////////////////////////////////////////////////////////////////
@@ -237,6 +210,7 @@
eye_desc = "green eyes"
stalker = TRUE
check_for_observer = TRUE
vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, slippery gullet \
of the creature. It's warm, and the air is thick. You can hear its body squelch and shift around you \
as you settle into its stomach! The doughy walls within cling to you heavily, churning down on you, wearing \
@@ -247,6 +221,9 @@
have more experience than your yellow-eyed cousins. You gain energy decently fast in any very dark area. You're weaker than other \
shadekin, but your slight energy generation constnatly, and especially in the dark allows for a good mix of uses."
/mob/living/simple_mob/shadekin/green
ai_holder_type = /datum/ai_holder/simple_mob/passive
/mob/living/simple_mob/shadekin/green/white
icon_state = "white"
/mob/living/simple_mob/shadekin/green/dark
@@ -254,16 +231,6 @@
/mob/living/simple_mob/shadekin/green/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/green/ai
ai_holder_type = /datum/ai_holder/simple_mob/passive
/mob/living/simple_mob/shadekin/green/ai/white
icon_state = "white"
/mob/living/simple_mob/shadekin/green/ai/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/green/ai/brown
icon_state = "brown"
/////////////////////////////////////////////////////////////////
/mob/living/simple_mob/shadekin/orange
name = "orange-eyed shadekin"
@@ -294,6 +261,9 @@
You're stronger than most shadekin, faster, and more capable in a brawl, but you don't generate much of your own energy. \
You can stand in a dark spot to gather some energy, but otherwise need to take it, by force if necessary."
/mob/living/simple_mob/shadekin/orange
ai_holder_type = /datum/ai_holder/simple_mob/melee
/mob/living/simple_mob/shadekin/orange/white
icon_state = "white"
/mob/living/simple_mob/shadekin/orange/dark
@@ -301,22 +271,13 @@
/mob/living/simple_mob/shadekin/orange/brown
icon_state = "brown"
/mob/living/simple_mob/shadekin/orange/ai
ai_holder_type = /datum/ai_holder/simple_mob/melee
/mob/living/simple_mob/shadekin/orange/ai/white
icon_state = "white"
/mob/living/simple_mob/shadekin/orange/ai/dark
icon_state = "dark"
/mob/living/simple_mob/shadekin/orange/ai/brown
icon_state = "brown"
/////////////////////////////////////////////////////////////////
//Fluffy specific fluffer
/mob/living/simple_mob/shadekin/blue/rivyr
name = "Rivyr"
desc = "She appears to be a fluffer of some sort. Deep blue eyes and curious attitude."
icon_state = "rivyr"
ai_holder_type = /datum/ai_holder/simple_mob/passive
eye_desc = ""
vore_stomach_flavor = "Blue flesh gleams in the fading light as you slip down the little mar's gullet! \
Gooey flesh and heat surrounds your form as you're tucked away into the darkness of her stomach! Thick slimes cling \