mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-07-15 02:03:48 +01:00
Merge pull request #3211 from CHOMPStation2/upstream-merge-11928
[MIRROR] Offmap Tweaks
This commit is contained in:
@@ -34,7 +34,7 @@
|
||||
if(!Ts)
|
||||
return //Didn't find shadekin spawn turf
|
||||
|
||||
var/mob/living/simple_mob/shadekin/red/ai/shadekin = new(Ts)
|
||||
var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts)
|
||||
//Abuse of shadekin
|
||||
shadekin.real_name = shadekin.name
|
||||
shadekin.init_vore()
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
var/hostile = FALSE // Do we try to hurt others?
|
||||
var/retaliate = FALSE // Attacks whatever struck it first. Mobs will still attack back if this is false but hostile is true.
|
||||
var/mauling = FALSE // Attacks unconscious mobs
|
||||
var/handle_corpse = FALSE // Allows AI to acknowledge corpses (e.g. nurse spiders)
|
||||
var/unconscious_vore = TRUE //VOREStation Add - allows a mob to go for unconcious targets IF their vore prefs align
|
||||
var/handle_corpse = FALSE // Allows AI to acknowledge corpses (e.g. nurse spiders)
|
||||
|
||||
var/atom/movable/target = null // The thing (mob or object) we're trying to kill.
|
||||
var/atom/movable/preferred_target = null// If set, and if given the chance, we will always prefer to target this over other options.
|
||||
@@ -128,6 +129,14 @@
|
||||
if(L.stat == UNCONSCIOUS) // Do we have mauling? Yes? Then maul people who are sleeping but not SSD
|
||||
if(mauling)
|
||||
return TRUE
|
||||
//VOREStation Add Start
|
||||
else if(unconscious_vore && L.allowmobvore)
|
||||
var/mob/living/simple_mob/vore/eater = holder
|
||||
if(eater.will_eat(L))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
//VOREStation Add End
|
||||
else
|
||||
return FALSE
|
||||
if(holder.IIsAlly(L))
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
S["directory_erptag"] >> pref.directory_erptag
|
||||
S["directory_ad"] >> pref.directory_ad
|
||||
S["sensorpref"] >> pref.sensorpref
|
||||
S["capture_crystal"] >> pref.capture_crystal
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
|
||||
S["show_in_directory"] << pref.show_in_directory
|
||||
@@ -15,17 +16,21 @@
|
||||
S["directory_erptag"] << pref.directory_erptag
|
||||
S["directory_ad"] << pref.directory_ad
|
||||
S["sensorpref"] << pref.sensorpref
|
||||
S["capture_crystal"] << pref.capture_crystal
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
if(pref.sensorpref > 5 || pref.sensorpref < 1)
|
||||
pref.sensorpref = 5
|
||||
character.sensorpref = pref.sensorpref
|
||||
character.capture_crystal = pref.capture_crystal
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/sanitize_character()
|
||||
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
|
||||
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
|
||||
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
|
||||
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref))
|
||||
pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal))
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
|
||||
. += "<br>"
|
||||
@@ -34,6 +39,7 @@
|
||||
. += "<b>Character Directory ERP Tag:</b> <a href='?src=\ref[src];directory_erptag=1'><b>[pref.directory_erptag]</b></a><br>"
|
||||
. += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>"
|
||||
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>"
|
||||
. += "<b>Capture Crystal Preference</b> <a [pref.capture_crystal ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_capture_crystal=1'><b>[pref.capture_crystal ? "Yes" : "No"]</b></a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
|
||||
if(href_list["toggle_show_in_directory"])
|
||||
@@ -60,4 +66,8 @@
|
||||
if (!isnull(new_sensorpref) && CanUseTopic(user))
|
||||
pref.sensorpref = sensorpreflist.Find(new_sensorpref)
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["toggle_capture_crystal"])
|
||||
pref.capture_crystal = pref.capture_crystal ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
|
||||
return ..();
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
var/directory_erptag = "Unset" //ditto, but for non-vore scenes
|
||||
var/directory_ad = "" //Advertisement stuff to show in character directory.
|
||||
var/sensorpref = 5 //Set character's suit sensor level
|
||||
var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals
|
||||
|
||||
var/job_talon_high = 0
|
||||
var/job_talon_med = 0
|
||||
var/job_talon_low = 0
|
||||
@@ -71,7 +73,7 @@
|
||||
feedback_add_details("admin_verb","TEmoteNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_ghost_quiets()
|
||||
set name = "Toggle Whisper/Subtle Vis"
|
||||
set name = "Toggle Ghost Privacy"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle ghosts viewing your subtles/whispers."
|
||||
|
||||
@@ -84,3 +86,22 @@
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
feedback_add_details("admin_verb","TWhisubtleVis") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_capture_crystal()
|
||||
set name = "Toggle Catchable"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle being catchable with capture crystals."
|
||||
|
||||
var/mob/living/L = mob
|
||||
|
||||
if(prefs.capture_crystal)
|
||||
to_chat(src, "You are no longer catchable.")
|
||||
prefs.capture_crystal = 0
|
||||
else
|
||||
to_chat(src, "You are now catchable.")
|
||||
prefs.capture_crystal = 1
|
||||
if(L)
|
||||
L.capture_crystal = prefs.capture_crystal
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
feedback_add_details("admin_verb","TCaptureCrystal") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -71,6 +71,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
|
||||
|
||||
|
||||
@@ -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,171 @@
|
||||
GLOBAL_VAR_CONST(max_jellyfish, 50)
|
||||
GLOBAL_VAR_INIT(jellyfish_count, 0)
|
||||
|
||||
|
||||
/datum/category_item/catalogue/fauna/space_jellyfish
|
||||
name = "Alien Wildlife - Space Jellyfish"
|
||||
desc = "A hostile space predator. \
|
||||
This space jellyfish uses hypnotic patterns to lure in prey, which it then wraps in tentacles to leech energy from.\
|
||||
It is somewhat weak, but uses unknown means to stun prey. It uses the energy of its prey to replicate itself. \
|
||||
These creatures can quickly grow out of control if left to feed and reproduce unchecked. \
|
||||
Notable weakness to rapid cooling from ice based weaponry.\
|
||||
The flesh is typically non-toxic and quite delicious. Their cores are considered a delicacy in many regions."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish
|
||||
name = "space jellyfish"
|
||||
desc = "A semi-translucent space creature, possessing of tentacles and a hypnotizing, flashing bio-luminescent display."
|
||||
tt_desc = "Semaeostomeae Stellarus"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/space_jellyfish)
|
||||
|
||||
icon = 'icons/mob/alienanimals_x32.dmi'
|
||||
icon_state = "space_jellyfish"
|
||||
icon_living = "space_jellyfish"
|
||||
icon_dead = "space_jellyfish_dead"
|
||||
has_eye_glow = TRUE
|
||||
hovering = TRUE
|
||||
|
||||
|
||||
faction = "jellyfish"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
nutrition = 150
|
||||
pass_flags = PASSTABLE
|
||||
movement_cooldown = 3.25
|
||||
|
||||
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 = 2
|
||||
attack_sharp = FALSE
|
||||
attack_sound = 'sound/weapons/tap.ogg'
|
||||
attacktext = list("drained", "bludgeoned", "wraped", "tentacle whipped")
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/jellyfish
|
||||
|
||||
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("thrumms")
|
||||
|
||||
meat_amount = 0
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/jellyfishcore
|
||||
|
||||
say_list_type = /datum/say_list/jellyfish
|
||||
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_bump_chance = 25
|
||||
vore_ignores_undigestable = 0
|
||||
vore_default_mode = DM_DRAIN
|
||||
vore_icons = SA_ICON_LIVING
|
||||
vore_stomach_name = "internal chamber"
|
||||
vore_default_contamination_flavor = "Wet"
|
||||
vore_default_contamination_color = "grey"
|
||||
vore_default_item_mode = IM_DIGEST
|
||||
|
||||
var/reproduction_cooldown = 0
|
||||
|
||||
/datum/say_list/jellyfish
|
||||
emote_see = list("flickers", "flashes", "looms","pulses","sways","shimmers hypnotically")
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/init_vore()
|
||||
..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "internal chamber"
|
||||
B.desc = "It's smooth and translucent. You can see the world around you distort and wobble with the movement of the space jellyfish. It floats casually, while the delicate flesh seems to form to you. It's surprisingly cool, and flickers with its own light. You're on display for all to see, trapped within the confines of this strange space alien!"
|
||||
B.mode_flags = 40
|
||||
B.digest_brute = 0.5
|
||||
B.digest_burn = 0.5
|
||||
B.digestchance = 0
|
||||
B.absorbchance = 0
|
||||
B.escapechance = 15
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
var/leech = rand(1,100)
|
||||
if(L.nutrition)
|
||||
L.adjust_nutrition(-leech)
|
||||
adjust_nutrition(leech)
|
||||
if(prob(25))
|
||||
L.adjustHalLoss(leech)
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/New(newloc, jellyfish)
|
||||
GLOB.jellyfish_count ++
|
||||
var/mob/living/simple_mob/vore/alienanimals/space_jellyfish/parent = jellyfish
|
||||
if(parent)
|
||||
parent.faction = faction
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/death()
|
||||
. = ..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/jellyfishcore(loc, nutrition)
|
||||
GLOB.jellyfish_count --
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/Life()
|
||||
. = ..()
|
||||
if(client)
|
||||
return
|
||||
reproduce()
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/proc/reproduce()
|
||||
if(reproduction_cooldown > 0)
|
||||
reproduction_cooldown --
|
||||
return
|
||||
if(GLOB.jellyfish_count >= GLOB.max_jellyfish)
|
||||
return
|
||||
if(nutrition < 500)
|
||||
return
|
||||
if(prob(10))
|
||||
new /mob/living/simple_mob/vore/alienanimals/space_jellyfish(loc, src)
|
||||
adjust_nutrition(-400)
|
||||
reproduction_cooldown = 60
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/datum/ai_holder/simple_mob/melee/evasive/jellyfish
|
||||
hostile = TRUE
|
||||
cooperative = FALSE
|
||||
retaliate = TRUE
|
||||
speak_chance = 2
|
||||
wander = TRUE
|
||||
unconscious_vore = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/jellyfishcore
|
||||
name = "jellyfish core"
|
||||
icon = 'icons/obj/food_vr.dmi'
|
||||
icon_state = "jellyfish_core"
|
||||
desc = "The pulsing core of a space jellyfish! ... It smells delicious."
|
||||
nutriment_amt = 50
|
||||
bitesize = 1000
|
||||
nutriment_desc = list("heavenly space meat" = 100)
|
||||
|
||||
var/inherited_nutriment = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/jellyfishcore/New(newloc, inherit)
|
||||
inherited_nutriment = inherit
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/jellyfishcore/Initialize()
|
||||
nutriment_amt += inherited_nutriment
|
||||
. = ..()
|
||||
reagents.add_reagent("nutriment", nutriment_amt, nutriment_desc)
|
||||
@@ -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 skeleton’s favorite mode of transport? A scare-plane.", "What did the skeleton say to the vampire? 'You suck.'","What is a skeleton’s 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.","What’s a skeleton’s 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? It’s 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
|
||||
@@ -71,6 +71,8 @@
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
loot_list = list(/obj/item/weapon/ore/diamond = 100)
|
||||
|
||||
speak_emote = list("rumbles")
|
||||
|
||||
vore_active = 0
|
||||
@@ -117,7 +119,6 @@
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/space_ghost/death(gibbed, deathmessage = "fades away!")
|
||||
. = ..()
|
||||
new /obj/item/weapon/ore/diamond(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/vore/alienanimals/spooky_ghost
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 900
|
||||
|
||||
loot_list = list(/obj/random/underdark/uncertain)
|
||||
loot_list = list(/obj/random/underdark/uncertain = 25)
|
||||
|
||||
armor = list(
|
||||
"melee" = 100,
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/// For showing to the pilot of the ship, so they see the 'real' appearance, despite others seeing the unknown ones
|
||||
var/image/real_appearance
|
||||
|
||||
light_system = MOVABLE_LIGHT
|
||||
//light_system = MOVABLE_LIGHT
|
||||
light_on = FALSE
|
||||
|
||||
/obj/effect/overmap/Initialize()
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
else
|
||||
data["status"] = "OK"
|
||||
var/list/contacts = list()
|
||||
for(var/obj/effect/overmap/O in view(7,linked))
|
||||
for(var/obj/effect/overmap/O in range(7,linked))
|
||||
if(linked == O)
|
||||
continue
|
||||
if(!O.scannable)
|
||||
@@ -125,10 +125,9 @@
|
||||
return
|
||||
if(sensors && sensors.use_power && sensors.powered())
|
||||
var/sensor_range = round(sensors.range*1.5) + 1
|
||||
linked.set_light_range(sensor_range + 0.5)
|
||||
linked.set_light_on(TRUE)
|
||||
linked.set_light(sensor_range + 0.5)
|
||||
else
|
||||
linked.set_light_on(FALSE)
|
||||
linked.set_light(0)
|
||||
|
||||
/obj/machinery/shipsensors
|
||||
name = "sensors suite"
|
||||
|
||||
@@ -457,6 +457,14 @@
|
||||
var/obj/effect/overlay/aiholo/holo = loc
|
||||
holo.drop_prey() //Easiest way
|
||||
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(holo.master)] (AI HOLO) ([holo ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[holo.x];Y=[holo.y];Z=[holo.z]'>JMP</a>" : "null"])")
|
||||
|
||||
//You're in a capture crystal! ((It's not vore but close enough!))
|
||||
else if(iscapturecrystal(loc))
|
||||
var/obj/item/capture_crystal/crystal = loc
|
||||
crystal.unleash()
|
||||
crystal.bound_mob = null
|
||||
crystal.bound_mob = capture_crystal = 0
|
||||
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [crystal] owned by [crystal.owner]. [ADMIN_FLW(src)]")
|
||||
|
||||
//Don't appear to be in a vore situation
|
||||
else
|
||||
@@ -670,7 +678,11 @@
|
||||
if(S.holding)
|
||||
to_chat(src, "<span class='warning'>There's something inside!</span>")
|
||||
return
|
||||
|
||||
if(iscapturecrystal(I))
|
||||
var/obj/item/capture_crystal/C = I
|
||||
if(!C.bound_mob.devourable)
|
||||
to_chat(src, "<span class='warning'>That doesn't seem like a good idea. (\The [C.bound_mob]'s prefs don't allow it.)</span>")
|
||||
return
|
||||
drop_item()
|
||||
I.forceMove(vore_selected)
|
||||
updateVRPanel()
|
||||
@@ -724,15 +736,23 @@
|
||||
else if (istype(I,/obj/item/clothing/accessory/collar))
|
||||
visible_message("<span class='warning'>[src] demonstrates their voracious capabilities by swallowing [I] whole!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the submissiveness in the wearer of [I]!</span>")
|
||||
//kcin2000 1/29/21 - lets you eat the news digitally and adds a text for the paper news
|
||||
else if(iscapturecrystal(I))
|
||||
var/obj/item/capture_crystal/C = I
|
||||
if(C.bound_mob && (C.bound_mob in C.contents))
|
||||
if(isbelly(C.loc))
|
||||
var/obj/belly/B = C.loc
|
||||
to_chat(C.bound_mob, "<span class= 'notice'>Outside of your crystal, you can see; <B>[B.desc]</B></span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the the power of command.</span>")
|
||||
// CHOMPedit begin
|
||||
else if(istype(I,/obj/item/device/starcaster_news))
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of digital garbage, oh wait its just the news.</span>")
|
||||
else if(istype(I,/obj/item/weapon/newspaper))
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of garbage, oh wait its just the news.</span>")
|
||||
//kcin2001 1/29/21 - Adding some special synth trash eat
|
||||
else if (istype(I,/obj/item/weapon/cell))
|
||||
visible_message("<span class='warning'>[src] sates their electric appeite with a [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the spicy flavor of electrolytes, yum.</span>")
|
||||
//CHOMPedit end
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of garbage. Delicious.</span>")
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user