Merge branch 'virgoMaster' into virgoPull

This commit is contained in:
Reddeyfish
2018-06-10 12:33:29 -07:00
469 changed files with 336333 additions and 21084 deletions
+1 -1
View File
@@ -800,7 +800,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
if(usr.client.prefs.be_special & BE_PAI)
for(var/obj/item/device/paicard/p in world)
for(var/obj/item/device/paicard/p in all_pai_cards)
var/obj/item/device/paicard/PP = p
if(PP.pai == null)
PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit
+1 -1
View File
@@ -302,7 +302,7 @@
else adverb = " a very lengthy message"
message = "<B>[speaker]</B> [verb][adverb]."
src.show_message(message)
show_message(message, type = 1) // Type 1 is visual message
/mob/proc/hear_sleep(var/message)
var/heard = ""
+2 -2
View File
@@ -55,12 +55,12 @@
/datum/language/terminus
name = LANGUAGE_TERMINUS
desc = "A soft language spoken by the people of the sparsely populated, socially-conscious Precursors' Crypt region."
desc = "A group of languages spoken by the Zorren with a certain degree of mutual intelligibility under each other. Evidence shows it was a single lingua franca which has diverged into many sub languages due to isolation." // VOREstation edit. Original : A soft language spoken by the people of the sparsely populated, socially-conscious Precursors' Crypt region.
speech_verb = "mentions"
exclaim_verb = "insinuates"
colour = "terminus"
key = "4"
flags = WHITELISTED
// flags = WHITELISTED (VOREstation edit)
syllables = list (".a", "spa", "pan", "blaif", "stra", "!u", "!ei", "!am", "by", ".y", "gry", "zbly", "!y", "fl",
"sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu",
"uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat")
+13 -1
View File
@@ -129,4 +129,16 @@
flags = RESTRICTED
syllables = list("rus","zem","ave","groz","ski","ska","ven","konst","pol","lin","svy",
"danya","da","mied","zan","das","krem","myka","cyka","blyat","to","st","no","na","ni",
"ko","ne","en","po","ra","li","on","byl","cto","eni","ost","ol","ego","ver","stv","pro")
"ko","ne","en","po","ra","li","on","byl","cto","eni","ost","ol","ego","ver","stv","pro")
//For your event purposes.
/datum/language/occursus
name = LANGUAGE_EVENT1
desc = "The Powers That Be have seen it fit to grace you with a special language that sounds like... something. This description should be overridden by the time you see this."
speech_verb = "says"
ask_verb = "asks"
exclaim_verb = "shouts"
colour = "warning"
key = "]"
flags = RESTRICTED
syllables = list("chan","ange","thi","se")
+3
View File
@@ -383,3 +383,6 @@
else return !D.check_access(ID) // it's a real, air blocking door
return 0
/mob/living/bot/isSynthetic() //Robots are synthetic, no?
return 1
+4
View File
@@ -267,6 +267,10 @@
/mob/living/carbon/proc/eyecheck()
return 0
/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(eyecheck() < intensity || override_blindness_check)
return ..()
// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching.
// Stop! ... Hammertime! ~Carn
@@ -128,7 +128,7 @@
var/tie_msg
if(istype(w_uniform,/obj/item/clothing/under) && !(skip_gear & EXAMINE_SKIPTIE))
var/obj/item/clothing/under/U = w_uniform
if(U.accessories.len)
if(LAZYLEN(U.accessories))
var/list/accessories_visible = list() //please let this fix the stupid fucking runtimes
if(skip_gear & EXAMINE_SKIPHOLSTER)
for(var/obj/item/clothing/accessory/A in U.accessories)
@@ -145,7 +145,7 @@
if(w_uniform.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]</span><br>"
else
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].<br>"
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform].[tie_msg]<br>"
//head
if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine)
@@ -159,7 +159,7 @@
var/tie_msg
if(istype(wear_suit,/obj/item/clothing/suit))
var/obj/item/clothing/suit/U = wear_suit
if(U.accessories.len)
if(LAZYLEN(U.accessories))
tie_msg += " Attached to it is [english_list(U.accessories)]."
if(wear_suit.blood_DNA)
+15 -8
View File
@@ -242,7 +242,7 @@
if(legcuffed)
dat += "<BR><A href='?src=\ref[src];item=[slot_legcuffed]'>Legcuffed</A>"
if(suit && suit.accessories.len)
if(suit && LAZYLEN(suit.accessories))
dat += "<BR><A href='?src=\ref[src];item=tie'>Remove accessory</A>"
dat += "<BR><A href='?src=\ref[src];item=splints'>Remove splints</A>"
dat += "<BR><A href='?src=\ref[src];item=pockets'>Empty pockets</A>"
@@ -667,14 +667,21 @@
I = internal_organs_by_name[O_EYES]
if(I.is_broken())
return FLASH_PROTECTION_MAJOR
else // They can't be flashed if they don't have eyes.
else if(!species.dispersed_eyes) // They can't be flashed if they don't have eyes, or widespread sensing surfaces.
return FLASH_PROTECTION_MAJOR
var/number = get_equipment_flash_protection()
number = I.get_total_protection(number)
I.additional_flash_effects(number)
if(I)
number = I.get_total_protection(number)
I.additional_flash_effects(number)
return number
/mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(internal_organs_by_name[O_EYES]) // Eyes are fucked, not a 'weak point'.
var/obj/item/organ/internal/eyes/I = internal_organs_by_name[O_EYES]
I.additional_flash_effects(intensity)
return ..()
#define add_clothing_protection(A) \
var/obj/item/clothing/C = A; \
flash_protection += C.flash_protection; \
@@ -853,7 +860,7 @@
src.verbs -= /mob/living/carbon/human/proc/remotesay
return
var/list/creatures = list()
for(var/mob/living/carbon/h in world)
for(var/mob/living/carbon/h in mob_list)
creatures += h
var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures
if (isnull(target))
@@ -866,7 +873,7 @@
target.show_message("<font color='blue'> You hear a voice that seems to echo around the room: [say]</font>")
usr.show_message("<font color='blue'> You project your mind into [target.real_name]: [say]</font>")
log_say("(TPATH to [key_name(target)]) [say]",src)
for(var/mob/observer/dead/G in world)
for(var/mob/observer/dead/G in mob_list)
G.show_message("<i>Telepathic message from <b>[src]</b> to <b>[target]</b>: [say]</i>")
/mob/living/carbon/human/proc/remoteobserve()
@@ -891,7 +898,7 @@
var/list/mob/creatures = list()
for(var/mob/living/carbon/h in world)
for(var/mob/living/carbon/h in mob_list)
var/turf/temp_turf = get_turf(h)
if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead
continue
@@ -930,7 +937,7 @@
restore_all_organs() // Reapply robotics/amputated status from preferences.
if(!client || !key) //Don't boot out anyone already in the mob.
for (var/obj/item/organ/internal/brain/H in world)
for (var/obj/item/organ/internal/brain/H in all_brain_organs)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -152,7 +152,7 @@ emp_act
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & def_zone.body_part)
protection += gear.armor[type]
if(gear.accessories.len)
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & def_zone.body_part)
protection += bling.armor[type]
@@ -165,7 +165,7 @@ emp_act
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & def_zone.body_part)
soaked += gear.armorsoak[type]
if(gear.accessories.len)
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & def_zone.body_part)
soaked += bling.armorsoak[type]
@@ -115,6 +115,11 @@
tally += item_tally
if(CE_SLOWDOWN in chem_effects)
if (tally >= 0 )
tally = (tally + tally/4) //Add a quarter of penalties on top.
tally += 1
if(CE_SPEEDBOOST in chem_effects)
if (tally >= 0) // cut any penalties in half
tally = tally/2
@@ -51,3 +51,6 @@
/mob/living/carbon/human/stok/New(var/new_loc)
..(new_loc, SPECIES_MONKEY_UNATHI)
/mob/living/carbon/human/event1/New(var/new_loc)
..(new_loc, SPECIES_EVENT1)
@@ -340,6 +340,11 @@ This saves us from having to call add_fingerprint() any time something is put in
if(W.action_button_name)
update_action_buttons()
if(W.zoom)
W.zoom()
W.in_inactive_hand(src)
return 1
//Checks if a given slot can be accessed at this time, either to equip or unequip I
@@ -0,0 +1,221 @@
/*
This species is meant to be used both as a base for Event species and possible future per-round RNG'd species, hence the proc var-ization in some places.
IF YOU ARE USING THIS SPECIES:
Variables you may want to make use of are:
icobase and deform Set both to the same thing, unless you have special deformed sprites.
mobtemplate The blank bounding box used by your species.
mob_size The size class of the species. 20 is human.
show_ssd What is shown when they're SSD?
virus_immune Immune to viruses? 1/0
short_sighted Permanent weldervision. 1/0
blood_volume Initial blood volume.
bloodloss_rate Multiplier for how fast a species bleeds out. Higher = Faster
hunger_factor Multiplier for hunger.
active_regen_mult Multiplier for 'Regenerate' power speed, in human_powers.dm
scream_verb The text descriptor of the scream. Default screams.
male_scream_sound Sound played when a male *scream s.
female_scream_sound Sound played when a female *scream s.
male_cough_sounds List of cough sounds for males.
female_cough_sounds List of cough sounds for females.
male_sneeze_sound Sound played when a male *sneeze s..
female_sneeze_sound Sound played when a female *sneeze s.
speech_sounds A list of sounds used randomly when the species talks.
speech_chance Percentile chance to do the above.
total_health How much damage can they take before entering crit? Default 100.
brute_mod Physical damage multiplier.
burn_mod Burn damage multiplier.
oxy_mod Oxyloss modifier
toxins_mod Toxloss modifier
radiation_mod Radiation modifier
flash_mod Stun from blindness modifier.
sound_mod Stun from sounds, I.E. flashbangs.
chemOD_mod Damage modifier for overdose
siemens_coefficient The lower, the thicker the skin and better the insulation.
darksight Native darksight distance.
meat_type The food given when they are turned into meat.
remains_type The effect left behind when they are ashed.
death_sound The sound played when they die.
death_message The deathgasp.
knockout_message The message when someone gets a lucky shot on the head.
cloning_modifier The modifier given when they are by chance cloned.
Any 'heat' or 'pressure' vars. Environmental survivability.
speech_bubble_appearance Part of icon_state to use for speech bubbles when talking. See talk.dmi for available icons.
slowdown Passive movement speed malus (or boost, if negative)
move_trail What effect marks are left when walking
has_floating_eyes Whether the eyes can be shown above other icons
has_glowing_eyes Whether the eyes are shown above all lighting
water_movement How much faster or slower the species is in water
snow_movement How much faster or slower the species is on snow
item_slowdown_mod How affected by item slowdown the species is. Multiplier.
*/
/datum/species/event1 //Essentially, by default a 'better' human.
name = SPECIES_EVENT1
name_plural = SPECIES_EVENT1
primitive_form = SPECIES_MONKEY
unarmed_types = list(/datum/unarmed_attack/stomp/event1, /datum/unarmed_attack/kick/event1, /datum/unarmed_attack/punch/event1, /datum/unarmed_attack/bite/event1)
blurb = "We're not quite sure where these things came from. Are you?"
num_alternate_languages = 3
species_language = LANGUAGE_GALCOM
secondary_langs = list()
name_language = null // Use the first-name last-name generator rather than a language scrambler
min_age = 0
max_age = 999
health_hud_intensity = 1.5
flags = NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT
vision_flags = SEE_SELF
darksight = 7
brute_mod = 0.9
burn_mod = 0.9
oxy_mod = 0.9
toxins_mod = 0.9
radiation_mod = 0.9
flash_mod = 0.9
sound_mod = 0.9
chemOD_mod = 0.9
siemens_coefficient = 0.9
spawn_flags = SPECIES_IS_RESTRICTED
appearance_flags = HAS_SKIN_TONE | HAS_EYE_COLOR
//Far more organs, due to the issues with adding them and their respective verbs mid round, I'll include them here.
//Colormatch organs will change to match the blood color of the species.
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/grey/colormatch,
O_LUNGS = /obj/item/organ/internal/lungs/grey/colormatch,
O_LIVER = /obj/item/organ/internal/liver/grey/colormatch,
O_KIDNEYS = /obj/item/organ/internal/kidneys/grey/colormatch,
O_BRAIN = /obj/item/organ/internal/brain/grey/colormatch,
O_EYES = /obj/item/organ/internal/eyes/grey/colormatch,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/grey/colormatch,
O_ACID = /obj/item/organ/internal/xenos/acidgland/grey/colormatch,
O_HIVE = /obj/item/organ/internal/xenos/hivenode/grey/colormatch,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner/grey/colormatch
)
var/use_bodyshape = SPECIES_HUMAN
var/waterbreathing = 0
var/overcome_gravity = 0
var/hover = 0
/datum/species/event1/proc/set_limbset(var/setnum = 1) //Will require existing ones to be respawned for changes to take effect.
switch(setnum)
if(1) //Normal.
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
if(2) //No broken bones.
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable),
BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable),
BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable),
BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable),
BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable),
BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable)
)
if(3) //No removing from the body.
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest/unseverable),
BP_GROIN = list("path" = /obj/item/organ/external/groin/unseverable),
BP_HEAD = list("path" = /obj/item/organ/external/head/unseverable),
BP_L_ARM = list("path" = /obj/item/organ/external/arm/unseverable),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unseverable),
BP_L_LEG = list("path" = /obj/item/organ/external/leg/unseverable),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unseverable),
BP_L_HAND = list("path" = /obj/item/organ/external/hand/unseverable),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unseverable),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unseverable),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unseverable)
)
if(4) //No breaking, OR removing from the body. For things that are more monsterous.
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest/indestructible),
BP_GROIN = list("path" = /obj/item/organ/external/groin/indestructible),
BP_HEAD = list("path" = /obj/item/organ/external/head/indestructible),
BP_L_ARM = list("path" = /obj/item/organ/external/arm/indestructible),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/indestructible),
BP_L_LEG = list("path" = /obj/item/organ/external/leg/indestructible),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/indestructible),
BP_L_HAND = list("path" = /obj/item/organ/external/hand/indestructible),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/indestructible),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/indestructible),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/indestructible)
)
return
/datum/species/event1/proc/choose_limbset()
var/list/limb_sets = list("Normal" = 1, "Unbreakable" = 2, "Unseverable" = 3, "Indestructible" = 4)
var/choice = input("Choose limb set to use for future spawns.", "Limb types.") as null|anything in limb_sets
set_limbset(limb_sets[choice])
return limb_sets[choice]
/datum/species/event1/proc/toggle_thermal()
vision_flags ^= SEE_MOBS
/datum/species/event1/proc/toggle_meson()
vision_flags ^= SEE_TURFS
/datum/species/event1/proc/toggle_material()
vision_flags ^= SEE_OBJS
/datum/species/event1/proc/toggle_infection()
flags ^= NO_INFECT
/datum/species/event1/proc/toggle_noslip()
flags ^= NO_SLIP
/datum/species/event1/proc/toggle_cloning()
flags ^= NO_SCAN
/datum/species/event1/proc/toggle_pain()
flags ^= NO_PAIN
/datum/species/event1/proc/toggle_embedding()
flags ^= NO_EMBED
/datum/species/event1/proc/toggle_plant() //Maybe it's a distant cousin of the Venus Fly Trap.
flags ^= IS_PLANT
/datum/species/event1/get_bodytype(var/mob/living/carbon/human/H) //Default to human sprites, if they're based on another species, var edit use_bodyshape to the correct thing in _defines/mobs.dm of the species you want to use.
return use_bodyshape
/datum/species/event1/can_breathe_water()
return waterbreathing
/datum/species/event1/can_overcome_gravity(var/mob/living/carbon/human/H)
return overcome_gravity
/datum/species/event1/can_fall(var/mob/living/carbon/human/H)
return hover
@@ -54,8 +54,8 @@
var/language = LANGUAGE_GALCOM // Default racial language, if any.
var/species_language = LANGUAGE_GALCOM // Used on the Character Setup screen
var/list/secondary_langs = list() // The names of secondary languages that are available to this species.
var/list/speech_sounds // A list of sounds to potentially play when speaking.
var/list/speech_chance // The likelihood of a speech sound playing.
var/list/speech_sounds = list() // A list of sounds to potentially play when speaking.
var/list/speech_chance = list() // The likelihood of a speech sound playing.
var/num_alternate_languages = 0 // How many secondary languages are available to select at character creation
var/name_language = LANGUAGE_GALCOM // The language to use when determining names for this species, or null to use the first name/last name generator
@@ -75,13 +75,14 @@
/datum/unarmed_attack/bite
)
var/list/unarmed_attacks = null // For empty hand harm-intent attack
var/brute_mod = 1 // Physical damage multiplier.
var/burn_mod = 1 // Burn damage multiplier.
var/oxy_mod = 1 // Oxyloss modifier
var/toxins_mod = 1 // Toxloss modifier
var/radiation_mod = 1 // Radiation modifier
var/flash_mod = 1 // Stun from blindness modifier.
var/chemOD_mod = 1 // Damage modifier for overdose
var/brute_mod = 1 // Physical damage multiplier.
var/burn_mod = 1 // Burn damage multiplier.
var/oxy_mod = 1 // Oxyloss modifier
var/toxins_mod = 1 // Toxloss modifier
var/radiation_mod = 1 // Radiation modifier
var/flash_mod = 1 // Stun from blindness modifier.
var/sound_mod = 1 // Stun from sounds, I.E. flashbangs.
var/chemOD_mod = 1 // Damage modifier for overdose
var/vision_flags = SEE_SELF // Same flags as glasses.
// Death vars.
@@ -152,7 +153,7 @@
var/health_hud_intensity = 1 // This modifies how intensely the health hud is colored.
// Body/form vars.
var/list/inherent_verbs // Species-specific verbs.
var/list/inherent_verbs = list() // Species-specific verbs.
var/has_fine_manipulation = 1 // Can use small items.
var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation.
var/darksight = 2 // Native darksight distance.
@@ -189,6 +190,7 @@
O_EYES = /obj/item/organ/internal/eyes
)
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas.
var/list/has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
@@ -5,7 +5,11 @@ var/datum/species/shapeshifter/promethean/prometheans
name = SPECIES_PROMETHEAN
name_plural = "Prometheans"
blurb = "What has Science done?"
blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \
chiefly characterized by their primarily liquid bodies and ability to change their bodily shape and color in order to \
mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
What has Science done?"
show_ssd = "totally quiescent"
death_message = "rapidly loses cohesion, splattering across the ground..."
knockout_message = "collapses inwards, forming a disordered puddle of goo."
@@ -46,6 +50,8 @@ var/datum/species/shapeshifter/promethean/prometheans
brute_mod = 0.75
burn_mod = 2
oxy_mod = 0
flash_mod = 0.5 //No centralized, lensed eyes.
item_slowdown_mod = 1.33
cloning_modifier = /datum/modifier/cloning_sickness/promethean
@@ -66,6 +72,9 @@ var/datum/species/shapeshifter/promethean/prometheans
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime) // Slime core.
dispersed_eyes = TRUE
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/slime),
BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable/slime),
@@ -147,25 +156,41 @@ var/datum/species/shapeshifter/promethean/prometheans
var/turf/T = H.loc
if(istype(T))
var/obj/effect/decal/cleanable/C = locate() in T
if(C)
if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
return
if(C && !(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))))
qdel(C)
if (istype(T, /turf/simulated))
var/turf/simulated/S = T
S.dirt = 0
H.nutrition += rand(15, 45)
H.nutrition = min(500, max(0, H.nutrition + rand(15, 30)))
VOREStation Removal End */
// Heal remaining damage.
if(H.fire_stacks >= 0)
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
/* else //VOREStation Edit Start.
H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
*/ //VOREStation Edit End
var/nutrition_cost = 0
var/nutrition_debt = H.getBruteLoss()
var/starve_mod = 1
if(H.nutrition <= 25)
starve_mod = 0.75
H.adjustBruteLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getBruteLoss()
nutrition_debt = H.getFireLoss()
H.adjustFireLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getFireLoss()
nutrition_debt = H.getOxyLoss()
H.adjustOxyLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getOxyLoss()
nutrition_debt = H.getToxLoss()
H.adjustToxLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getToxLoss()
H.nutrition -= (2 * nutrition_cost) //Costs Nutrition when damage is being repaired, corresponding to the amount of damage being repaired.
H.nutrition = max(0, H.nutrition) //Ensure it's not below 0.
//else//VOREStation Removal
//H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
/datum/species/shapeshifter/promethean/get_blood_colour(var/mob/living/carbon/human/H)
return (H ? rgb(H.r_skin, H.g_skin, H.b_skin) : ..())
@@ -8,19 +8,19 @@
"Flatland Zorren", "Vulpkanin", "Vasilissan",
"Rapala", "Neaera", "Stok", "Farwa", "Sobaka",
"Wolpin", "Saru", "Sparra")
heal_rate = 0.2 //As of writing, original was 0.5 - Slows regen speed (bad)
hunger_factor = 0.1 //As of writing, original was 0.2 - Slows hunger rate (good)
siemens_coefficient = 1 //As of writing, original was 0.4 (bad)
active_regen_mult = 0.66 //As of writing, original was 1 (good)
color_mult = 1
mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping (good)
num_alternate_languages = 1 //Might be outdated: They currently have 3 in the other file
trashcan = 1 //They have goopy bodies. They can just dissolve things within them.
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
inherent_verbs = list(
/mob/living/carbon/human/proc/shapeshifter_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
@@ -35,8 +35,3 @@
/mob/living/carbon/human/proc/slime_feed,
/mob/living/proc/eat_trash
)
death_message = "goes limp, their body becoming softer..."
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
return //This nullifies them gibbing.
@@ -156,8 +156,8 @@
icobase_tail = 1
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_SIIK)
name_language = LANGUAGE_SIIK
secondary_langs = list(LANGUAGE_TERMINUS)
name_language = LANGUAGE_TERMINUS
min_age = 18
max_age = 80
@@ -176,6 +176,7 @@
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "#AFA59E"
base_color = "#333333"
blood_color = "#240bc4"
color_mult = 1
heat_discomfort_strings = list(
@@ -194,8 +195,8 @@
icobase_tail = 1
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_SIIK)
name_language = LANGUAGE_SIIK
secondary_langs = list(LANGUAGE_TERMINUS)
name_language = LANGUAGE_TERMINUS
min_age = 18
max_age = 80
@@ -214,6 +215,7 @@
flesh_color = "#AFA59E"
base_color = "#333333"
blood_color = "#240bc4"
color_mult = 1
inherent_verbs = list(/mob/living/proc/shred_limb)
@@ -113,16 +113,12 @@
cost = -2
var_changes = list("lightweight" = 1)
/datum/trait/colorblind
/datum/trait/colorblind/mono
name = "Colorblindness (Monochromancy)"
desc = "You simply can't see colors at all, period. You are 100% colorblind."
cost = -1
/datum/modifier/colorblindness_mono
name = "Colorblindness (Monochromancy)"
desc = "You simply can't see colors at all, period. You are 100% colorblind."
/datum/trait/colorblind/apply(var/datum/species/S,var/mob/living/carbon/human/H)
/datum/trait/colorblind/mono/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.add_modifier(/datum/modifier/trait/colorblind_mono)
@@ -33,7 +33,7 @@
return
if("tie")
var/obj/item/clothing/under/suit = w_uniform
if(!istype(suit) || !suit.accessories.len)
if(!istype(suit) || !LAZYLEN(suit.accessories))
return
var/obj/item/clothing/accessory/A = suit.accessories[1]
if(!istype(A))
@@ -113,6 +113,8 @@ var/global/list/sparring_attack_cache = list()
sharp = 0
edge = 0
/datum/unarmed_attack/bite/event1
/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.is_muzzled())
@@ -128,6 +130,8 @@ var/global/list/sparring_attack_cache = list()
eye_attack_text_victim = "digits"
damage = 0
/datum/unarmed_attack/punch/event1
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
var/organ = affecting.name
@@ -179,6 +183,8 @@ var/global/list/sparring_attack_cache = list()
attack_sound = "swing_hit"
damage = 0
/datum/unarmed_attack/kick/event1
/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.legcuffed)
return 0
@@ -220,6 +226,8 @@ var/global/list/sparring_attack_cache = list()
attack_sound = "swing_hit"
damage = 0
/datum/unarmed_attack/stomp/event1
/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.legcuffed)
@@ -730,7 +730,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!wear_suit)
return //No point, no suit.
overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = INV_SUIT_DEF_ICON, default_layer = SUIT_LAYER)
// Part of splitting the suit sprites up
var/iconFile = INV_SUIT_DEF_ICON
if(istype(wear_suit, /obj/item/clothing/suit))
var/obj/item/clothing/suit/S = wear_suit
if(S.update_icon_define)
iconFile = S.update_icon_define
overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER)
apply_layer(SUIT_LAYER)
+21
View File
@@ -911,6 +911,15 @@ default behaviour is:
to_chat(src, "<span class='notice'>You are now [resting ? "resting" : "getting up"]</span>")
update_canmove()
//called when the mob receives a bright flash
/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(override_blindness_check || !(disabilities & BLIND))
overlay_fullscreen("flash", type)
spawn(25)
if(src)
clear_fullscreen("flash", 25)
return 1
/mob/living/proc/cannot_use_vents()
if(mob_size > MOB_SMALL)
return "You can't fit into that vent."
@@ -1072,6 +1081,7 @@ default behaviour is:
unbuckle_mob(L)
L.Stun(5)
//VOREStation Add End
return canmove
// Adds overlays for specific modifiers.
@@ -1163,6 +1173,13 @@ default behaviour is:
else
hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
hud_used.r_hand_hud_object.icon_state = "r_hand_active"
// We just swapped hands, so the thing in our inactive hand will notice it's not the focus
var/obj/item/I = get_inactive_hand()
if(I)
if(I.zoom)
I.zoom()
I.in_inactive_hand(src) //This'll do specific things, determined by the item
return
/mob/living/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
@@ -1257,3 +1274,7 @@ default behaviour is:
/mob/living/proc/make_hud_overlays()
return
/mob/living/proc/has_vision()
return !(eye_blind || (disabilities & BLIND) || stat || blinded)
+17 -9
View File
@@ -265,14 +265,14 @@ proc/get_radio_key_from_channel(var/channel)
//Handle nonverbal and sign languages here
if (speaking)
if (speaking.flags & NONVERBAL)
if (prob(30))
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
if (speaking.flags & SIGNLANG)
log_say("(SIGN) [message]", src)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
if (speaking.flags & NONVERBAL)
if (prob(30))
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
//These will contain the main receivers of the message
var/list/listening = list()
var/list/listening_obj = list()
@@ -374,11 +374,19 @@ proc/get_radio_key_from_channel(var/channel)
return 1
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
var/list/potentials = get_mobs_and_objs_in_view_fast(src, world.view)
var/list/mobs = potentials["mobs"]
for(var/hearer in mobs)
var/mob/M = hearer
M.hear_signlang(message, verb, language, src)
var/turf/T = get_turf(src)
//We're in something, gesture to people inside the same thing
if(loc != T)
for(var/mob/M in loc)
M.hear_signlang(message, verb, language, src)
//We're on a turf, gesture to visible as if we were a normal language
else
var/list/potentials = get_mobs_and_objs_in_view_fast(T, world.view)
var/list/mobs = potentials["mobs"]
for(var/hearer in mobs)
var/mob/M = hearer
M.hear_signlang(message, verb, language, src)
return 1
/obj/effect/speech_bubble
+12 -1
View File
@@ -1,7 +1,6 @@
#define AI_CHECK_WIRELESS 1
#define AI_CHECK_RADIO 2
var/list/ai_list = list()
var/list/ai_verbs_default = list(
// /mob/living/silicon/ai/proc/ai_recall_shuttle,
/mob/living/silicon/ai/proc/ai_emergency_message,
@@ -802,5 +801,17 @@ var/list/ai_verbs_default = list(
// If that is ever fixed please update this proc.
return TRUE
//Special subtype kept around for global announcements
/mob/living/silicon/ai/announcer/initialize()
. = ..()
mob_list -= src
living_mob_list -= src
dead_mob_list -= src
ai_list -= src
silicon_mob_list -= src
/mob/living/silicon/ai/announcer/Life()
return
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
+1 -1
View File
@@ -8,7 +8,7 @@
remove_ai_verbs(src)
for(var/obj/machinery/ai_status_display/O in world)
for(var/obj/machinery/ai_status_display/O in machines)
spawn( 0 )
O.mode = 2
if (istype(loc, /obj/item/device/aicard))
+1 -1
View File
@@ -1,6 +1,6 @@
/mob/living/silicon/ai/Logout()
..()
for(var/obj/machinery/ai_status_display/O in world) //change status
for(var/obj/machinery/ai_status_display/O in machines) //change status
O.mode = 0
if(!isturf(loc))
if (client)
@@ -3,6 +3,6 @@
icon_state = "ai-crash"
spawn(10)
explosion(loc, 3, 6, 12, 15)
for(var/obj/machinery/ai_status_display/O in world) //change status
for(var/obj/machinery/ai_status_display/O in machines) //change status
O.mode = 2
return ..(gibbed)
@@ -87,7 +87,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if("submit")
if(candidate)
candidate.ready = 1
for(var/obj/item/device/paicard/p in world)
for(var/obj/item/device/paicard/p in all_pai_cards)
if(p.looking_for_personality == 1)
p.alertUpdate()
usr << browse(null, "window=paiRecruit")
@@ -25,7 +25,7 @@
/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
if(R.emagged || R.emag_items)
emagged = !emagged
if(emagged)
name = "combat jaws"
@@ -140,7 +140,7 @@
combat = 1
attack_verb = list("batted", "pawed", "bopped", "whapped")
chargecost = 500
/obj/item/weapon/shockpaddles/robot/hound/jumper
name = "paws of life"
icon = 'icons/mob/dogborg_vr.dmi'
@@ -159,6 +159,7 @@
icon_state = "synthtongue"
hitsound = 'sound/effects/attackblob.ogg'
var/emagged = 0
var/datum/matter_synth/water = null
/obj/item/device/dogborg/tongue/New()
..()
@@ -166,7 +167,7 @@
/obj/item/device/dogborg/tongue/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
if(R.emagged || R.emag_items)
emagged = !emagged
if(emagged)
name = "hacked tongue of doom"
@@ -187,14 +188,15 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(user.client && (target in user.client.screen))
to_chat(user, "<span class='warning'>You need to take \the [target.name] off before cleaning it!</span>")
else if(istype(target,/obj/effect/decal/cleanable))
else if(istype(target,/obj/effect/decal/cleanable) && water.energy >= 5)
user.visible_message("[user] begins to lick off \the [target.name].", "<span class='notice'>You begin to lick off \the [target.name]...</span>")
if(do_after (user, 50))
to_chat(user, "<span class='notice'>You finish licking off \the [target.name].</span>")
water.use_charge(5)
qdel(target)
var/mob/living/silicon/robot.R = user
R.cell.charge += 50
else if(istype(target,/obj/item))
else if(istype(target,/obj/item) && water.energy >= 5)
if(istype(target,/obj/item/trash))
user.visible_message("[user] nibbles away at \the [target.name].", "<span class='notice'>You begin to nibble away at \the [target.name]...</span>")
if(do_after (user, 50))
@@ -203,6 +205,7 @@
qdel(target)
var/mob/living/silicon/robot.R = user
R.cell.charge += 250
water.use_charge(5)
return
if(istype(target,/obj/item/weapon/cell))
user.visible_message("[user] begins cramming \the [target.name] down its throat.", "<span class='notice'>You begin cramming \the [target.name] down your throat...</span>")
@@ -212,11 +215,13 @@
var/mob/living/silicon/robot.R = user
var/obj/item/weapon/cell.C = target
R.cell.charge += C.maxcharge / 3
water.use_charge(5)
qdel(target)
return
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after (user, 50))
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
water.use_charge(5)
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
@@ -226,35 +231,66 @@
var/mob/living/L = target
if(R.cell.charge <= 666)
return
L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
L.Weaken(4)
L.apply_effect(STUTTER, 4)
L.Stun(1)
L.Weaken(1)
L.apply_effect(STUTTER, 1)
L.visible_message("<span class='danger'>[user] has shocked [L] with its tongue!</span>", \
"<span class='userdanger'>[user] has shocked you with its tongue! You can feel the betrayal.</span>")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
R.cell.charge -= 666
else
else if(water.energy >= 5)
user.visible_message("<span class='notice'>\the [user] affectionally licks all over \the [target]'s face!</span>", "<span class='notice'>You affectionally lick all over \the [target]'s face!</span>")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
water.use_charge(5)
var/mob/living/carbon/human/H = target
if(H.species.lightweight == 1)
H.Weaken(3)
return
else if(istype(target, /obj/structure/window))
else if(istype(target, /obj/structure/window) && water.energy >= 1)
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after (user, 50))
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
water.use_charge(5)
target.color = initial(target.color)
//target.SetOpacity(initial(target.opacity)) //Apparantly this doesn't work?
else
else if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/toilet)) //Dog vibes.
user.visible_message("[user] begins to lap up water from [target.name].", "<span class='notice'>You begin to lap up water from [target.name].</span>")
if(do_after (user, 50))
water.add_charge(100)
else if(water.energy >= 5)
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after (user, 50))
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
water.use_charge(5)
if(istype(target, /turf/simulated))
var/turf/simulated/T = target
T.dirt = 0
return
/obj/item/pupscrubber
name = "floor scrubber"
desc = "Toggles floor scrubbing."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "scrub0"
var/enabled = FALSE
/obj/item/pupscrubber/New()
..()
flags |= NOBLUDGEON
/obj/item/pupscrubber/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(!enabled)
R.scrubbing = TRUE
enabled = TRUE
icon_state = "scrub1"
else
R.scrubbing = FALSE
enabled = FALSE
icon_state = "scrub0"
/obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works.
name = "disabler"
desc = "A small and nonlethal gun produced by NT.."
@@ -284,25 +320,23 @@
name = "light replacer"
desc = "A device to automatically replace lights. This version is capable to produce a few replacements using your internal matter reserves."
max_uses = 16
uses = 10
var/cooldown = 0
var/datum/matter_synth/glass = null
/obj/item/device/lightreplacer/dogborg/proc/AddUses(var/amount = 1)
uses = min(max(uses + amount, 0), max_uses)
/obj/item/device/lightreplacer/dogborg/attack_self(mob/user)//Boo recharger fill is slow as shit and removes all the extra cyberfat gains you worked so hard for!
/obj/item/device/lightreplacer/dogborg/attack_self(mob/user)//Recharger refill is so last season. Now we recycle without magic!
if(uses >= max_uses)
to_chat(user, "<span class='warning'>[src.name] is full.</span>")
return
if(uses < max_uses && cooldown == 0)
var/mob/living/silicon/robot.R = user
if(R.cell.charge <= 1000)
to_chat(user, "<span class='warning'>Insufficient power reserves. Please recharge.</span>")
if(glass.energy < 125)
to_chat(user, "<span class='warning'>Insufficient material reserves.</span>")
return
to_chat(user, "It has [uses] lights remaining. Attempting to fabricate a replacement. Please stand still.")
cooldown = 1
if(do_after(user, 50))
R.cell.charge -= 800
AddUses(1)
glass.use_charge(125)
add_uses(1)
cooldown = 0
else
cooldown = 0
@@ -324,7 +358,7 @@
flags |= NOBLUDGEON
/obj/item/weapon/dogborg/pounce/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
var/mob/living/silicon/robot/R = user
R.leap()
/mob/living/silicon/robot/proc/leap()
@@ -385,5 +419,5 @@
var/armor_block = run_armor_check(T, "melee")
var/armor_soak = get_armor_soak(T, "melee")
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
if(prob(25))
if(prob(33))
T.apply_effect(3, WEAKEN, armor_block)
@@ -18,11 +18,17 @@
var/UI_open = FALSE
var/compactor = FALSE
var/analyzer = FALSE
var/decompiler = FALSE
var/datum/research/techonly/files //Analyzerbelly var.
var/synced = FALSE
var/startdrain = 500
var/max_item_count = 1
var/gulpsound = 'sound/vore/gulp.ogg'
var/datum/matter_synth/metal = null
var/datum/matter_synth/glass = null
var/datum/matter_synth/wood = null
var/datum/matter_synth/plastic = null
var/datum/matter_synth/water = null
var/digest_brute = 2
var/digest_burn = 3
@@ -518,6 +524,7 @@
//Pick a random item to deal with (if there are any)
var/atom/target = pick(touchable_items)
var/volume = 0
//Handle the target being a mob
if(isliving(target))
@@ -559,6 +566,13 @@
items_preserved += brain
else
T.drop_from_inventory(I, src)
if(ishuman(T))
var/mob/living/carbon/human/Prey = T
volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier
water.add_charge(volume)
if(T.reagents)
volume = T.reagents.total_volume
water.add_charge(volume)
qdel(T)
update_patient()
if(UI_open == TRUE)
@@ -568,26 +582,45 @@
else
var/obj/item/T = target
if(istype(T))
if(analyzer == TRUE)
var/obj/item/tech_item = T
for(var/tech in tech_item.origin_tech)
files.UpdateTech(tech, tech_item.origin_tech[tech])
synced = FALSE
if(T.reagents)
volume = T.reagents.total_volume
var/digested = T.digest_act(item_storage = src)
if(!digested)
items_preserved |= T
else
drain(-50 * digested)
if(analyzer && digested)
var/obj/item/tech_item = T
for(var/tech in tech_item.origin_tech)
files.UpdateTech(tech, tech_item.origin_tech[tech])
synced = FALSE
drain(-50 * digested)
if(volume)
water.add_charge(volume)
if(!analyzer && compactor && T.matter)
for(var/material in T.matter)
var/total_material = T.matter[material]
if(istype(T,/obj/item/stack))
var/obj/item/stack/stack = T
total_material *= stack.get_amount()
if(material == DEFAULT_WALL_MATERIAL)
metal.add_charge(total_material)
if(material == "glass")
glass.add_charge(total_material)
if(decompiler)
if(material == "plastic")
plastic.add_charge(total_material)
if(material == "wood")
wood.add_charge(total_material)
else
drain(-50 * digested)
else if(istype(target,/obj/effect/decal/remains))
qdel(target)
drain(-100)
else
items_preserved |= target
if(UI_open == TRUE)
update_patient()
sleeperUI(hound)
return
/obj/item/device/dogborg/sleeper/process()
@@ -632,3 +665,10 @@
max_item_count = 1
startdrain = 100
analyzer = TRUE
/obj/item/device/dogborg/sleeper/compactor/decompiler
name = "Matter Decompiler"
desc = "A mounted matter decompiling unit with fuel processor."
icon_state = "decompiler"
max_item_count = 10
decompiler = TRUE
@@ -186,9 +186,8 @@ var/list/mob_hat_cache = list()
user.visible_message("<span class='danger'>\The [user] swipes [TU.his] ID card through \the [src], attempting to reboot it.</span>", "<span class='danger'>>You swipe your ID card through \the [src], attempting to reboot it.</span>")
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
drones++
for(var/mob/living/silicon/robot/drone/D in player_list)
drones++
if(drones < config.max_maint_drones)
request_player()
return
@@ -26,7 +26,7 @@
var/dat
dat += "<B>Maintenance Units</B><BR>"
for(var/mob/living/silicon/robot/drone/D in world)
for(var/mob/living/silicon/robot/drone/D in mob_list)
if(D.z != src.z)
continue
dat += "<BR>[D.real_name] ([D.stat == 2 ? "<font color='red'>INACTIVE</FONT>" : "<font color='green'>ACTIVE</FONT>"])"
@@ -68,8 +68,8 @@
else if (href_list["ping"])
usr << "<span class='notice'>You issue a maintenance request for all active drones, highlighting [drone_call_area].</span>"
for(var/mob/living/silicon/robot/drone/D in world)
if(D.client && D.stat == 0)
for(var/mob/living/silicon/robot/drone/D in player_list)
if(D.stat == 0)
D << "-- Maintenance drone presence requested in: [drone_call_area]."
else if (href_list["resync"])
@@ -1,8 +1,7 @@
/proc/count_drones()
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
drones++
for(var/mob/living/silicon/robot/drone/D in player_list)
drones++
return drones
/obj/machinery/drone_fabricator
@@ -135,7 +134,7 @@
return
var/list/all_fabricators = list()
for(var/obj/machinery/drone_fabricator/DF in world)
for(var/obj/machinery/drone_fabricator/DF in machines)
if(DF.stat & NOPOWER || !DF.produce_drones)
continue
if(DF.drone_progress >= 100)
@@ -436,6 +436,8 @@ var/global/list/robot_modules = list(
synths += metal
synths += glass
synths += plasteel
synths += wood
synths += plastic
synths += wire
var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src)
@@ -42,6 +42,7 @@
robot_modules["ERT"] = /obj/item/weapon/robot_module/robot/ert
robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/scrubpup
robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/science
robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog
return 1
//Just add a new proc with the robot_module type if you wish to run some other vore code
@@ -139,21 +140,36 @@
src.modules += new /obj/item/weapon/dogborg/jaws/big(src) //In case there's some kind of hostile mob.
src.modules += new /obj/item/weapon/melee/baton/robot(src) //Since the pounce module refused to work, they get a stunbaton instead.
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop people on the nose.
src.modules += new /obj/item/device/dogborg/tongue(src) //This is so they can clean up bloody evidence after it's examined, and so they can lick crew.
src.modules += new /obj/item/taperoll/police(src) //Block out crime scenes.
src.modules += new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig.
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) //They /are/ a security borg, after all.
src.modules += new /obj/item/weapon/dogborg/pounce(src) //Pounce
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) //Emag. Not a big problem.
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig.
B.water = water
src.modules += B
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
//R.icon_state = "k9"
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
@@ -190,9 +206,7 @@
/obj/item/weapon/robot_module/robot/medihound/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src) //In case a patient is being attacked by carp.
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop the crew.
src.modules += new /obj/item/device/dogborg/tongue(src) //Clean up bloody items by licking them, and eat rubbish for minor energy.
src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially.
src.modules += new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)//So medi-hounds aren't nearly useless
src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice!
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the chemicals when the chemist is nice
@@ -200,37 +214,55 @@
src.modules += new /obj/item/weapon/gripper/medical(src)//Now you can set up cyro or make peri.
src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) //Paws of life
src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
var/obj/item/device/dogborg/sleeper/B = new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them
B.water = water
src.modules += B
//CHOMPStation Edit Begin
//Adds tools for medihound to treat patients without sleeper. Traumakits, Advance Ointment, and Splints.
var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000)
synths += medicine
var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src)
var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src)
var/obj/item/stack/medical/advanced/bruise_pack/bruise_pack = new /obj/item/stack/medical/advanced/bruise_pack(src)
var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src)
O.uses_charge = 1
O.charge_costs = list(1000)
O.synths = list(medicine)
B.uses_charge = 1
B.charge_costs = list(1000)
B.synths = list(medicine)
bruise_pack.uses_charge = 1
bruise_pack.charge_costs = list(1000)
bruise_pack.synths = list(medicine)
S.uses_charge = 1
S.charge_costs = list(1000)
S.synths = list(medicine)
src.modules += O
src.modules += B
src.modules += bruise_pack
src.modules += S
//R.icon_state = "medihound"
//CHOMPStation Edit End
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/ert
@@ -246,12 +278,27 @@
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/dogborg/jaws/big(src)
src.modules += new /obj/item/weapon/melee/baton/robot(src)
src.modules += new /obj/item/device/dogborg/tongue(src)
src.modules += new /obj/item/taperoll/police(src)
src.modules += new /obj/item/device/dogborg/sleeper/K9(src)
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun(src)
src.modules += new /obj/item/weapon/dogborg/swordtail(src)
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src)
B.water = water
src.modules += B
R.icon = 'icons/mob/64x64robot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
@@ -260,6 +307,7 @@
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/scrubpup
@@ -271,27 +319,76 @@
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/scrubpup/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/device/lightreplacer/dogborg(src)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/device/dogborg/tongue(src)
src.modules += new /obj/item/device/dogborg/sleeper/compactor(src)
src.modules += new /obj/item/pupscrubber(src)
src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
//Starts empty. Can only recharge with recycled material.
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
metal.name = "Steel reserves"
metal.recharge_rate = 0
metal.max_energy = 100000
metal.energy = 0
var/datum/matter_synth/glass = new /datum/matter_synth/glass()
glass.name = "Glass reserves"
glass.recharge_rate = 0
glass.max_energy = 100000
glass.energy = 0
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += metal
synths += glass
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
var/obj/item/device/lightreplacer/dogborg/LR = new /obj/item/device/lightreplacer/dogborg(src)
LR.glass = glass
src.modules += LR
var/obj/item/device/dogborg/sleeper/compactor/C = new /obj/item/device/dogborg/sleeper/compactor(src)
C.metal = metal
C.glass = glass
C.water = water
src.modules += C
//Sheet refiners can only produce raw sheets.
var/obj/item/stack/material/cyborg/steel/M = new (src)
M.name = "steel recycler"
M.desc = "A device that refines recycled steel into sheets."
M.synths = list(metal)
M.recipes = list()
M.recipes += new/datum/stack_recipe("steel sheet", /obj/item/stack/material/steel, 1, 1, 20)
src.modules += M
var/obj/item/stack/material/cyborg/glass/G = new (src)
G.name = "glass recycler"
G.desc = "A device that refines recycled glass into sheets."
G.material = get_material_by_name("placeholder") //Hacky shit but we want sheets, not windows.
G.synths = list(glass)
G.recipes = list()
G.recipes += new/datum/stack_recipe("glass sheet", /obj/item/stack/material/glass, 1, 1, 20)
src.modules += G
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
//R.icon_state = "scrubpup"
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/scrubpup/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
LR.Charge(R, amount)
/obj/item/weapon/robot_module/robot/science
name = "Research Hound Module"
sprites = list(
@@ -303,24 +400,161 @@
/obj/item/weapon/robot_module/robot/science/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/device/dogborg/tongue(src)
src.modules += new /obj/item/device/dogborg/sleeper/compactor/analyzer(src)
//src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) //Belly works now.
src.modules += new /obj/item/weapon/gripper/research(src)
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/storage/part_replacer(src)
src.emag = new /obj/item/weapon/hand_tele(src)
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
var/obj/item/device/dogborg/sleeper/compactor/analyzer/B = new /obj/item/device/dogborg/sleeper/compactor/analyzer(src)
B.water = water
src.modules += B
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
//R.icon_state = "science"
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/engiedog
name = "Construction Hound module"
sprites = list(
"Pupdozer" = "pupdozer",
)
channels = list("Engineering" = 1)
networks = list(NETWORK_ENGINEERING)
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/engiedog/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/wrench/cyborg(src)
src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src)
src.modules += new /obj/item/device/geiger(src)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.emag = new /obj/item/weapon/dogborg/pounce(src)
//Painfully slow charger regen but high capacity. Also starts with low amount.
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
metal.name = "Steel reserves"
metal.recharge_rate = 50
metal.max_energy = 100000
metal.energy = 5000
var/datum/matter_synth/glass = new /datum/matter_synth/glass()
glass.name = "Glass reserves"
glass.recharge_rate = 50
glass.max_energy = 100000
glass.energy = 5000
var/datum/matter_synth/wood = new /datum/matter_synth/wood()
wood.name = "Wood reserves"
wood.recharge_rate = 50
wood.max_energy = 100000
wood.energy = 5000
var/datum/matter_synth/plastic = new /datum/matter_synth/plastic()
plastic.name = "Plastic reserves"
plastic.recharge_rate = 50
plastic.max_energy = 100000
plastic.energy = 5000
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0
water.max_energy = 1000
water.energy = 0
R.water_res = water
var/datum/matter_synth/wire = new /datum/matter_synth/wire()
synths += metal
synths += glass
synths += wood
synths += plastic
synths += wire
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
var/obj/item/device/lightreplacer/dogborg/LR = new /obj/item/device/lightreplacer/dogborg(src)
LR.glass = glass
src.modules += LR
var/obj/item/device/dogborg/sleeper/compactor/decompiler/MD = new /obj/item/device/dogborg/sleeper/compactor/decompiler(src)
MD.metal = metal
MD.glass = glass
MD.wood = wood
MD.plastic = plastic
src.modules += MD
var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
var/obj/item/stack/material/cyborg/glass/G = new (src)
G.synths = list(glass)
src.modules += G
var/obj/item/stack/rods/cyborg/RD = new /obj/item/stack/rods/cyborg(src)
RD.synths = list(metal)
src.modules += RD
var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src)
C.synths = list(wire)
src.modules += C
var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src)
S.synths = list(metal)
src.modules += S
var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src)
WT.synths = list(wood)
src.modules += WT
var/obj/item/stack/material/cyborg/wood/W = new (src)
W.synths = list(wood)
src.modules += W
var/obj/item/stack/material/cyborg/plastic/PL = new (src)
PL.synths = list(plastic)
src.modules += PL
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R)
@@ -331,4 +565,6 @@
R.wideborg = FALSE
R.ui_style_vr = FALSE
R.default_pixel_x = initial(pixel_x)
R.scrubbing = FALSE
R.verbs -= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
@@ -7,6 +7,8 @@
var/leap_at
var/dogborg = FALSE //Dogborg special features (overlays etc.)
var/wideborg = FALSE //When the borg simply doesn't use standard 32p size.
var/scrubbing = FALSE //Floor cleaning enabled
var/datum/matter_synth/water_res = null
var/notransform
var/original_icon = 'icons/mob/robots.dmi'
var/ui_style_vr = FALSE //Do we use our hud icons?
@@ -64,13 +66,13 @@
add_overlay("wreck-overlay")
/mob/living/silicon/robot/Move(a, b, flag)
. = ..()
if(module)
if(module.type == /obj/item/weapon/robot_module/robot/scrubpup)//no water reserve mechanics yet.
if(scrubbing)
var/datum/matter_synth/water = water_res
if(water && water.energy >= 1)
var/turf/tile = loc
if(isturf(tile))
water.use_charge(1)
tile.clean_blood()
if(istype(tile, /turf/simulated))
var/turf/simulated/T = tile
@@ -95,7 +97,6 @@
cleaned_human.update_inv_shoes(0)
cleaned_human.clean_blood(1)
cleaned_human << "<span class='warning'>[src] cleans your face!</span>"
return
return
/mob/living/silicon/robot/proc/vr_sprite_check()
@@ -109,3 +110,19 @@
icon = 'icons/mob/widerobot_vr.dmi'
else if(!(icon_state in vr_icons))
icon = original_icon
/mob/living/silicon/robot/proc/ex_reserve_refill()
set name = "Refill Extinguisher"
set category = "Object"
var/datum/matter_synth/water = water_res
for(var/obj/item/weapon/extinguisher/E in module.modules)
if(E.reagents.total_volume < E.max_water)
if(water && water.energy > 0)
var/amount = E.max_water - E.reagents.total_volume
if(water.energy < amount)
amount = water.energy
water.use_charge(amount)
E.reagents.add_reagent("water", amount)
to_chat(src, "You refill the extinguisher using your water reserves.")
else
to_chat(src, "Insufficient water reserves.")
@@ -419,3 +419,6 @@
ghostize(0)
qdel(src)
/mob/living/silicon/has_vision()
return 0 //NOT REAL EYES
@@ -27,6 +27,7 @@
destroy_surroundings = 0
hovering = TRUE
armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 100) // Some level of armor plating makes sense
//Drones aren't affected by atmos.
min_oxy = 0
max_oxy = 0
@@ -0,0 +1,431 @@
// A mob which only moves when it isn't being watched by living beings.
//Weeping angels/SCP-173 hype
//Horrible shitcoding and stolen code adaptations below. You have been warned.
/mob/living/simple_animal/hostile/statue
name = "statue" // matches the name of the statue with the flesh-to-stone spell
desc = "An incredibly lifelike marble carving. Its eyes seems to follow you..." // same as an ordinary statue with the added "eye following you" description
icon = 'icons/obj/statue.dmi'
tt_desc = "angelum weepicus"
icon_state = "human_male"
icon_living = "human_male"
icon_dead = "human_male"
intelligence_level = SA_HUMANOID
stop_automated_movement = 1
var/annoyance = 30 //stop staring you creep
var/respond = 1
var/banishable = 0
faction = "statue"
mob_size = MOB_HUGE
response_help = "touches"
response_disarm = "pushes"
environment_smash = 2
can_be_antagged = 1
speed = -1
maxHealth = 50000
health = 50000
status_flags = CANPUSH
// investigates = 1
a_intent = I_HURT
density = 1
mob_bump_flag = HEAVY
mob_push_flags = ~HEAVY
mob_swap_flags = ~HEAVY
harm_intent_damage = 60
melee_damage_lower = 50
melee_damage_upper = 70
attacktext = "clawed"
attack_sound = 'sound/hallucinations/growl1.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
maxbodytemp = 9000
run_at_them = 0
move_to_delay = 0 // Very fast
animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue.
see_in_dark = 13
view_range = 35 //So it can run at the victim when out of the view
melee_miss_chance = 0
see_invisible = SEE_INVISIBLE_NOLIGHTING
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
var/last_hit = 0
var/cannot_be_seen = 1
var/mob/living/creator = null
// No movement while seen code.
/mob/living/simple_animal/hostile/statue/New(loc)
..()
// Give spells
add_spell(new/spell/aoe_turf/flicker_lights)
add_spell(new/spell/aoe_turf/blindness)
add_spell(new/spell/aoe_turf/shatter)
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
return 0
return ..()
/mob/living/simple_animal/hostile/statue/attackby(var/obj/item/O as obj, var/mob/user as mob) //banishing the statue is a risky job
if(istype(O, /obj/item/weapon/nullrod))
visible_message("<span class='warning'>[user] tries to banish [src] with [O]!</span>")
if(do_after(user, 15, src))
if(banishable)
visible_message("<span class='warning'>[src] crumbles into dust!</span>")
gib()
else
visible_message("<span class='warning'>[src] is too strong to be banished!</span>")
Paralyse(rand(8,15))
/mob/living/simple_animal/hostile/statue/death()
new /obj/item/stack/material/marble(loc)
/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc)
if(can_be_seen(NewLoc))
if(client)
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
return 0
return ..()
/mob/living/simple_animal/hostile/statue/Life()
..()
handle_target()
handleAnnoyance()
if(target_mob) //if there's a victim, statue will use its powers
if((annoyance + 4) < 800)
annoyance += 4
else if ((annoyance - 2) > 0)
annoyance -= 2
/mob/living/simple_animal/hostile/statue/proc/handle_target()
if(target_mob) // If we have a target and we're AI controlled
var/mob/watching = can_be_seen()
// If they're not our target
if(watching && (watching != target_mob))
// This one is closer.
if(get_dist(watching, src) > get_dist(target_mob, src))
LoseTarget()
target_mob = watching
/mob/living/simple_animal/hostile/statue/proc/handleAnnoyance()
if(respond) //so it won't blind people 24/7
respond = 0
if (annoyance > 30)
AI_blind()
annoyance -= 30
if (prob(30) && annoyance > 30)
var/turf/T = get_turf(loc)
if(T.get_lumcount() * 10 > 1.5)
AI_flash()
annoyance -= 30
spawn(20)
respond = 1
/mob/living/simple_animal/hostile/statue/proc/AI_blind()
for(var/mob/living/L in oviewers(12, src)) //the range is so big, because it tries to keep out of sight and can't reengage if you get too far
if (prob(70))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if (H.species == "Diona" || H.species == "Promethean" || H == creator)// can't blink and organic
return
to_chat(L, pick("<span class='notice'>Your eyes feel very heavy.</span>", "<span class='notice'>You blink suddenly!</span>", "<span class='notice'>Your eyes close involuntarily!</span>"))
L.Blind(2)
return
/mob/living/simple_animal/hostile/statue/proc/AI_flash()
if (prob(60))
visible_message("The statue slowly points at the light.")
for(var/obj/machinery/light/L in oview(12, src))
L.flicker()
return
/mob/living/simple_animal/hostile/statue/proc/AI_mirrorshmash()
for(var/obj/structure/mirror/M in oview(4, src))
if ((!M.shattered )||(!M.glass))
visible_message("The statue slowly points at the mirror!")
sleep(5)
M.shatter()
return
/mob/living/simple_animal/hostile/statue/AttackTarget()
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
return
else
spawn(3) //a small delay
..()
/mob/living/simple_animal/hostile/statue/DoPunch(var/atom/A) //had to redo that, since it's supposed to target only head and upper body
if(!Adjacent(A)) // They could've moved in the meantime.
return FALSE
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
for(var/datum/modifier/M in modifiers)
if(!isnull(M.outgoing_melee_damage_percent))
damage_to_do *= M.outgoing_melee_damage_percent
// SA attacks can be blocked with shields.
if(ishuman(A))
var/mob/living/carbon/human/H = A
H.adjustBruteLossByPart(damage_to_do*0.9, pick(BP_HEAD, BP_TORSO))
playsound(src, attack_sound, 75, 1)
else if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound)
playsound(src, attack_sound, 75, 1)
return TRUE
/mob/living/simple_animal/hostile/statue/face_atom()
if(!can_be_seen(get_turf(loc)))
..()
/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination)
if(!cannot_be_seen)
return null
var/turf/T = get_turf(loc)
/* if(T && destination && T.lighting_overlay)
if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right?
return null
if(T == destination)
destination = null*/
// loop for viewers.
var/list/check_list = list(src)
if(destination)
check_list += destination
//&& (M.see_in_dark > 5)
// This loop will, at most, loop twice.
for(var/atom/check in check_list)
for(var/mob/living/M in viewers(world.view + 1, check) - src)
if(M != creator)
if(!(M.sdisabilities & BLIND) || !(M.blinded)) //if not blinded
if(M.has_vision() && !M.isSynthetic()) //is able to see the statue
if(T && destination && T.lighting_overlay) // Check for darkness
if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right? WRONG! Damn cats.
if(M.see_in_dark > 5)
return M
return null
return M
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
if(M.occupant && M.occupant.client && M.occupant != creator)
if(M.occupant.has_vision() && !M.occupant.isSynthetic())
return M.occupant
for(var/obj/structure/mirror/M in view(3, check)) //Weeping angels hate mirrors. Probably because they're ugly af
if ((!M.shattered )||(!M.glass))
annoyance += 3
if (prob(5) && (ai_inactive == 0))
AI_mirrorshmash()
annoyance -= 50
return src //if it sees the mirror, it sees itself, right?
return null
// Cannot talk
/mob/living/simple_animal/hostile/statue/say()
return 0
// Turn to dust when gibbed
/mob/living/simple_animal/hostile/statue/gib()
dust()
// Stop attacking clientless mobs
/mob/living/simple_animal/hostile/statue/proc/CanAttack(atom/the_target) //ignore clientless mobs
if(isliving(the_target))
var/mob/living/L = the_target
if(!L.client && !L.ckey)
return 0
return ..()
// Statue powers
// Flicker lights
/spell/aoe_turf/flicker_lights
name = "Flicker Lights"
desc = "You will trigger a large amount of lights around you to flicker."
spell_flags = 0
charge_max = 400
range = 10
/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/light/L in T)
L.flicker()
return
//Blind AOE
/spell/aoe_turf/blindness
name = "Blindness"
desc = "Your prey will be momentarily blind for you to advance on them."
message = "<span class='notice'>You glare your eyes.</span>"
charge_max = 250
spell_flags = 0
range = 10
/spell/aoe_turf/blindness/cast(list/targets, mob/living/simple_animal/hostile/statue/user = usr)
for(var/mob/living/L in targets)
if(L == user || L == user.creator)
continue
var/turf/T = get_turf(L.loc)
if(T && T in targets)
L.Blind(4)
return
/spell/aoe_turf/shatter
name = "Shatter mirrors!"
desc = "That handsome devil has to wait. You have people to make into corpses."
message = "<span class='notice'>You glare your eyes.</span>"
charge_max = 300
spell_flags = 0
range = 8
/spell/aoe_turf/shatter/cast(list/targets, mob/user = usr)
spawn(50)
for(var/obj/structure/mirror/M in view(5, src))
if ((!M.shattered )||(!M.glass))
M.shatter()
return
/mob/living/simple_animal/hostile/statue/verb/toggle_darkness()
set name = "Toggle Darkness"
set desc = "You ARE the darkness."
set category = "Abilities"
seedarkness = !seedarkness
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness)
to_chat(src,"You [seedarkness ? "now" : "no longer"] see darkness.")
/mob/living/simple_animal/hostile/statue/restrained()
. = ..()
if(can_be_seen(loc))
return 1
/mob/living/simple_animal/hostile/statue/ListTargets(dist = view_range)
var/list/L = mobs_in_xray_view(dist, src)
for(var/obj/mecha/M in mechas_list)
if ((M.z == src.z) && (get_dist(src, M) <= dist) && (isInSight(src,M)))
L += M
if(creator)
L -= creator
return L
/obj/item/cursed_marble //slime cube copypaste
name = "marble slab"
desc = "A peculiar slab of marble, radiating with dark energy."
icon = 'icons/obj/stacks.dmi'
icon_state = "sheet-marble"
description_info = "Summons the Statue - a mysterious powerful creature, that can move only when unsurveyed by living eyes."
var/searching = 0
/obj/item/cursed_marble/attack_self(mob/user as mob)
if(!searching)
to_chat(user, "<span class='warning'>You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!</span>")
icon_state = "sheet-snowbrick"
searching = 1
request_player()
spawn(60 SECONDS)
reset_search()
/obj/item/cursed_marble/proc/request_player()
for(var/mob/observer/dead/O in player_list)
if(!O.MayRespawn())
continue
if(O.client)
if(O.client.prefs.be_special & BE_ALIEN)
question(O.client)
/obj/item/cursed_marble/proc/question(var/client/C)
spawn(0)
if(!C)
return
var/response = alert(C, "Someone is requesting a soul for the statue. Would you like to play as one?", "Statue request", "Yes", "No", "Never for this round")
if(response == "Yes")
response = alert(C, "Are you sure you want to play as the statue?", "Statue request", "Yes", "No")
if(!C || 2 == searching)
return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if(response == "Never for this round")
C.prefs.be_special ^= BE_ALIEN
/obj/item/cursed_marble/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
icon_state = "sheet-marble"
if(searching == 1)
searching = 0
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
M.show_message("<span class='warning'>[src] fades. Maybe it will spark another time.</span>")
/obj/item/cursed_marble/proc/transfer_personality(var/mob/candidate)
announce_ghost_joinleave(candidate, 0, "They are a statue now.")
src.searching = 2
var/mob/living/simple_animal/hostile/statue/S = new(get_turf(src))
S.client = candidate.client
to_chat(S, "<b>You are \a [S], brought into existence on [station_name()] by [usr]! Obey all their orders.</b>")
S.mind.assigned_role = "The Statue"
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
qdel(src)
/obj/item/cursed_marble/verb/crush() //if there's no ghosts to respond to your request/you want to use the statue for malicious stuff
set name = "Crush the marble slab"
set category = "Object"
set src in usr
summonmob(usr)
/obj/item/cursed_marble/proc/summonmob(mob/user as mob)
if(searching == 0)
var/choice = alert(user, "Are you sure you want to crush the marble? (this will spawn a clientless version of the statue, hostile to everyone, but you)", "Crush it?", "Yes", "No")
if(choice)
if(choice == "Yes")
var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue(get_turf(user))
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
S.creator = user
qdel(src)
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/scarybat
name = "space bats"
desc = "A swarm of cute little blood sucking bats that looks pretty upset."
tt_desc = "Desmodus rotundus" //Common vampire bat
tt_desc = "N Bestia gregaria" //Nispean swarm bats, because of course Nisp has swarm bats
icon = 'icons/mob/bats.dmi'
icon_state = "bat"
icon_living = "bat"
@@ -1,8 +1,8 @@
//Space bears!
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "RawrRawr!!"
tt_desc = "Ursinae aetherius" //...bearspace? Maybe.
desc = "A product of Space Russia?"
tt_desc = "U Ursinae aetherius" //...bearspace? Maybe.
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
tt_desc = "Cyprinus aetherius" //carpspace? maybe
tt_desc = "U Cyprinus aetherius" //carpspace? maybe
icon_state = "carp"
icon_living = "carp"
icon_dead = "carp_dead"
@@ -2,7 +2,7 @@
/mob/living/simple_animal/cat
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
tt_desc = "Felis catus"
tt_desc = "E Felis silvestris catus"
intelligence_level = SA_ANIMAL
icon_state = "cat2"
item_state = "cat2"
@@ -156,7 +156,7 @@
/mob/living/simple_animal/cat/fluff/Runtime
name = "Runtime"
desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
tt_desc = "Felis medicalis"
tt_desc = "E Felis silvestris medicalis" //a hypoallergenic breed produced by NT for... medical purposes? Sure.
gender = FEMALE
icon_state = "cat"
item_state = "cat"
@@ -3,7 +3,7 @@
name = "corgi"
real_name = "corgi"
desc = "It's a corgi."
tt_desc = "Canis familiaris"
tt_desc = "E Canis lupus familiaris"
intelligence_level = SA_ANIMAL
icon_state = "corgi"
icon_living = "corgi"
@@ -38,7 +38,6 @@
real_name = "Ian" //Intended to hold the name without altering it.
gender = MALE
desc = "It's a corgi."
tt_desc = "Canis commandus"
var/turns_since_scan = 0
var/obj/movement_target
response_help = "pets"
@@ -2,7 +2,7 @@
/mob/living/simple_animal/crab
name = "crab"
desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time."
tt_desc = "Ranina ranina"
tt_desc = "E Cancer bellianus"
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
@@ -52,6 +52,7 @@
/mob/living/simple_animal/giant_crab
name = "giant crab"
desc = "A large, hard-shelled crustacean. This one is mostly grey."
tt_desc = "S Cancer holligus"
icon_state = "sif_crab"
icon_living = "sif_crab"
icon_dead = "sif_crab_dead"
@@ -2,7 +2,7 @@
/mob/living/simple_animal/retaliate/goat
name = "goat"
desc = "Not known for their pleasant disposition."
tt_desc = "Oreamnos americanus"
tt_desc = "E Oreamnos americanus"
icon_state = "goat"
icon_living = "goat"
icon_dead = "goat_dead"
@@ -86,7 +86,7 @@
/mob/living/simple_animal/cow
name = "cow"
desc = "Known for their milk, just don't tip them over."
tt_desc = "Bos taurus"
tt_desc = "E Bos taurus"
icon_state = "cow"
icon_living = "cow"
icon_dead = "cow_dead"
@@ -155,7 +155,7 @@
/mob/living/simple_animal/chick
name = "\improper chick"
desc = "Adorable! They make such a racket though."
tt_desc = "Gallus domesticus"
tt_desc = "E Gallus gallus"
icon_state = "chick"
icon_living = "chick"
icon_dead = "chick_dead"
@@ -206,7 +206,7 @@ var/global/chicken_count = 0
/mob/living/simple_animal/chicken
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
tt_desc = "Gallus domesticus"
tt_desc = "E Gallus gallus"
icon_state = "chicken"
icon_living = "chicken"
icon_dead = "chicken_dead"
@@ -39,36 +39,42 @@
/mob/living/simple_animal/fish/bass
name = "bass"
tt_desc = "E Micropterus notius"
icon_state = "bass-swim"
icon_living = "bass-swim"
icon_dead = "bass-dead"
/mob/living/simple_animal/fish/trout
name = "trout"
tt_desc = "E Salmo trutta"
icon_state = "trout-swim"
icon_living = "trout-swim"
icon_dead = "trout-dead"
/mob/living/simple_animal/fish/salmon
name = "salmon"
tt_desc = "E Oncorhynchus nerka"
icon_state = "salmon-swim"
icon_living = "salmon-swim"
icon_dead = "salmon-dead"
/mob/living/simple_animal/fish/perch
name = "perch"
tt_desc = "E Perca flavescens"
icon_state = "perch-swim"
icon_living = "perch-swim"
icon_dead = "perch-dead"
/mob/living/simple_animal/fish/pike
name = "pike"
tt_desc = "E Esox aquitanicus"
icon_state = "pike-swim"
icon_living = "pike-swim"
icon_dead = "pike-dead"
/mob/living/simple_animal/fish/koi
name = "koi"
tt_desc = "E Cyprinus rubrofuscus"
icon_state = "koi-swim"
icon_living = "koi-swim"
icon_dead = "koi-dead"
@@ -8,7 +8,7 @@
/mob/living/simple_animal/hostile/giant_spider
name = "giant spider"
desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes."
tt_desc = "Atrax robustus gigantus"
tt_desc = "X Brachypelma phorus"
icon_state = "guard"
icon_living = "guard"
icon_dead = "guard_dead"
@@ -68,6 +68,7 @@ Nurse Family
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
tt_desc = "X Brachypelma phorus laetus"
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
@@ -102,6 +103,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/nurse/queen
desc = "Absolutely gigantic, this creature is horror itself."
tt_desc = "X Brachypelma phorus tyrannus"
icon = 'icons/mob/64x64.dmi'
icon_state = "spider_queen"
icon_living = "spider_queen"
@@ -124,6 +126,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/webslinger
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
tt_desc = "X Brachypelma phorus balisticus"
icon_state = "webslinger"
icon_living = "webslinger"
icon_dead = "webslinger_dead"
@@ -164,6 +167,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/carrier
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
tt_desc = "X Brachypelma phorus gerulus"
icon_state = "carrier"
icon_living = "carrier"
icon_dead = "carrier_dead"
@@ -223,6 +227,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
tt_desc = "X Brachypelma phorus venandi"
icon_state = "hunter"
icon_living = "hunter"
icon_dead = "hunter_dead"
@@ -235,6 +240,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/lurker
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
tt_desc = "X Brachypelma phorus insidator"
icon_state = "lurker"
icon_living = "lurker"
icon_dead = "lurker_dead"
@@ -258,6 +264,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/tunneler
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
tt_desc = "X Brachypelma phorus cannalis"
icon_state = "tunneler"
icon_living = "tunneler"
icon_dead = "tunneler_dead"
@@ -288,6 +295,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/pepper
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
tt_desc = "X Brachypelma phorus ignis"
icon_state = "pepper"
icon_living = "pepper"
icon_dead = "pepper_dead"
@@ -308,6 +316,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/thermic
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
tt_desc = "X Brachypelma phorus incaendium"
icon_state = "pit"
icon_living = "pit"
icon_dead = "pit_dead"
@@ -324,6 +333,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/electric
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
tt_desc = "X Brachypelma phorus aromatitis"
icon_state = "spark"
icon_living = "spark"
icon_dead = "spark_dead"
@@ -347,6 +357,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/phorogenic
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
tt_desc = "X Brachypelma phorus phorus"
icon_state = "phoron"
icon_living = "phoron"
icon_dead = "phoron_dead"
@@ -380,6 +391,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/frost
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
tt_desc = "X Brachypelma phorus pruinae"
icon_state = "frost"
icon_living = "frost"
icon_dead = "frost_dead"
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/goose
name = "space goose"
desc = "That's no duck. That's a space goose. You have a bad feeling about this."
tt_desc = "Anser aetherius" //Goose space?!
/mob/living/simple_animal/hostile/goose //hey are these even in the game
name = "goose"
desc = "It looks pretty angry!"
tt_desc = "E Branta canadensis" //that iconstate is just a regular goose
icon_state = "goose"
icon_living = "goose"
icon_dead = "goose_dead"
@@ -1,7 +1,7 @@
/mob/living/simple_animal/lizard
name = "Lizard"
desc = "A cute tiny lizard."
tt_desc = "Gekko gecko"
tt_desc = "E Anolis cuvieri"
icon = 'icons/mob/critter.dmi'
icon_state = "lizard"
icon_living = "lizard"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/yithian
name = "yithian"
desc = "A friendly creature vaguely resembling an oversized snail without a shell."
tt_desc = "J Escargot escargot" // a product of Jade, which is a planet that totally exists
icon_state = "yithian"
icon_living = "yithian"
icon_dead = "yithian_dead"
@@ -11,6 +12,7 @@
/mob/living/simple_animal/tindalos
name = "tindalos"
desc = "It looks like a large, flightless grasshopper."
tt_desc = "J Locusta bruchus"
icon_state = "tindalos"
icon_living = "tindalos"
icon_dead = "tindalos_dead"
@@ -2,7 +2,7 @@
name = "mouse"
real_name = "mouse"
desc = "It's a small rodent."
tt_desc = "Mus musculus"
tt_desc = "E Mus musculus"
icon_state = "mouse_gray"
item_state = "mouse_gray"
icon_living = "mouse_gray"
@@ -31,7 +31,7 @@
/mob/living/simple_animal/parrot
name = "parrot"
desc = "The parrot squawks, \"It's a parrot! BAWWK!\""
tt_desc = "Poicephalus robustus"
tt_desc = "E Ara macao"
icon = 'icons/mob/animal.dmi'
icon_state = "parrot_fly"
icon_living = "parrot_fly"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/retaliate/diyaab
name = "diyaab"
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
tt_desc = "S Choeros hirtus" //diyaab and shantak are technically reletives!
faction = "diyaab"
icon_state = "diyaab"
icon_living = "diyaab"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/savik
name = "savik"
desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
tt_desc = "S Pistris tellus" //landshark
faction = "savik"
icon_state = "savik"
icon_living = "savik"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/shantak
name = "shantak"
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
tt_desc = "S Choeros shantak"
faction = "shantak"
icon_state = "shantak"
icon_living = "shantak"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/tomato
name = "tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
tt_desc = "X Solanum abominable"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/tree
name = "pine tree"
desc = "A pissed off tree-like alien. It seems annoyed with the festivities..."
tt_desc = "X Festivus tyrannus"
icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "pine_1"
icon_living = "pine_1"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/clown
name = "clown"
desc = "A denizen of clown planet"
tt_desc = "E Homo sapiens corydon" //this is an actual clown, as opposed to someone dressed up as one
icon_state = "clown"
icon_living = "clown"
icon_dead = "clown_dead"
@@ -31,6 +31,8 @@
attacktext = list("slashed")
attack_sound = 'sound/weapons/bladeslice.ogg'
armor = list(melee = 40, bullet = 40, laser = 50, energy = 45, bomb = 20, bio = 100, rad = 100) // As close to the actual Dark Gygax as possible
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -43,7 +45,7 @@
ranged = 1
rapid = 1
projectiletype = /obj/item/projectile/beam
projectiletype = /obj/item/projectile/beam/midlaser
projectilesound = 'sound/weapons/laser.ogg'
speak_chance = 1
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
tt_desc = "E Homo sapiens"
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/russian
name = "russian"
desc = "For the Motherland!"
tt_desc = "E Homo sapiens"
icon_state = "russianmelee"
icon_living = "russianmelee"
icon_dead = "russianmelee_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/syndicate
name = "mercenary"
desc = "Death to the Company."
tt_desc = "E Homo sapiens"
icon_state = "syndicate"
icon_living = "syndicate"
icon_dead = "syndicate_dead"
@@ -28,10 +29,14 @@
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 10
melee_damage_lower = 15 //Tac Knife damage
melee_damage_upper = 15
environment_smash = 1
attacktext = list("punched")
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities
min_oxy = 5
max_oxy = 0
@@ -61,9 +66,13 @@
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
/mob/living/simple_animal/hostile/syndicate/death()
..()
if(corpse)
..()
new corpse (src.loc)
else
..(0,"explodes!")
new /obj/effect/gibspawner/human(src.loc)
explosion(get_turf(src), -1, 0, 1, 3)
qdel(src)
return
@@ -114,6 +123,8 @@
speed = 0
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -141,6 +152,24 @@
loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100)
/mob/living/simple_animal/hostile/syndicate/ranged/laser
icon_state = "syndicateranged_laser"
icon_living = "syndicateranged_laser"
rapid = 0
projectiletype = /obj/item/projectile/beam/midlaser
projectilesound = 'sound/weapons/Laser.ogg'
loot_list = list(/obj/item/weapon/gun/energy/laser = 100)
/mob/living/simple_animal/hostile/syndicate/ranged/ionrifle
icon_state = "syndicateranged_ionrifle"
icon_living = "syndicateranged_ionrifle"
rapid = 0
projectiletype = /obj/item/projectile/ion
projectilesound = 'sound/weapons/Laser.ogg'
loot_list = list(/obj/item/weapon/gun/energy/ionrifle = 100)
/mob/living/simple_animal/hostile/syndicate/ranged/space
name = "space mercenary" //VOREStation Edit
icon_state = "syndicaterangedpsace"
@@ -164,6 +193,42 @@
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0)
return
///////////////////////////////////////////////
// POI Mobs
// Don't leave corpses, to help balance loot.
///////////////////////////////////////////////
/mob/living/simple_animal/hostile/syndicate/poi
loot_list = list()
corpse = null
/mob/living/simple_animal/hostile/syndicate/melee/poi
loot_list = list()
corpse = null
/mob/living/simple_animal/hostile/syndicate/melee/space/poi
loot_list = list()
corpse = null
/mob/living/simple_animal/hostile/syndicate/ranged/poi
loot_list = list()
corpse = null
/mob/living/simple_animal/hostile/syndicate/ranged/laser/poi
loot_list = list()
corpse = null
/mob/living/simple_animal/hostile/syndicate/ranged/ionrifle/poi
loot_list = list()
corpse = null
/mob/living/simple_animal/hostile/syndicate/ranged/space/poi
loot_list = list()
corpse = null
//Viscerators
/mob/living/simple_animal/hostile/viscerator
name = "viscerator"
desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations."
@@ -1227,7 +1227,7 @@
if(astarpathing) ForgetPath()
ai_log("GoHome()",1)
var/close_enough = 2
var/look_in = 250
var/look_in = 50
if(GetPath(home_turf,close_enough,look_in))
stop_automated_movement = 1
spawn(1)
@@ -1,6 +1,7 @@
/mob/living/simple_animal/slime
name = "slime"
desc = "The most basic of slimes. The grey slime has no remarkable qualities, however it remains one of the most useful colors for scientists."
tt_desc = "A Macrolimbus vulgaris"
icon = 'icons/mob/slime2.dmi'
icon_state = "grey baby slime"
intelligence_level = SA_ANIMAL
@@ -0,0 +1,28 @@
/mob/living/simple_animal/retaliate/fennix
name = "Fennix"
desc = "A feral fennix, Warm to the touch"
tt_desc = "Incaendium Faeles Vulpes"
icon = 'icons/mob/vore.dmi'
icon_state = "fennix"
icon_living = "fennix"
icon_dead = "fennix_dead"
faction = "fennec" // Will protec other fenfens
maxHealth = 60
health = 60
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
harm_intent_damage = 20
melee_damage_lower = 1
melee_damage_upper = 3
attacktext = list("Bites")
speak_chance = 1
speak = list("SQUEL!",
"SQEL?",
"Skree.")
emote_hear = list("Screeeeecheeeeessss!","Chirrup.")
emote_see = list("earflicks","pats at the ground")
@@ -41,6 +41,119 @@
vore_pounce_chance = 45
vore_icons = SA_ICON_LIVING | SA_ICON_REST
var/life_since_foodscan = 0
/mob/living/simple_animal/hostile/rat/passive
name = "curious giant rat"
desc = "In what passes for a hierarchy among verminous rodents, this one is king. It seems to be more interested on scavenging."
follow_dist = 1
var/mob/living/carbon/human/food
var/hunger = 0
/mob/living/simple_animal/hostile/rat/passive/Life()
. = ..()
if(!. || ai_inactive)
return
if(hunger > 0 && life_since_foodscan++ > 5) //Only look for floor food when hungry.
life_since_foodscan = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/S in oview(src,3)) //Accept thrown offerings and scavenge surroundings.
if(get_dist(src,S) <=1)
visible_emote("hungrily devours \the [S].")
playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
qdel(S)
hunger = 0
food = null
else
WanderTowards(S.loc)
break
if(!food)
return
var/food_dist = get_dist(src,food)
if(food_dist > world.view) //Lose interest on this person.
food = null
hunger = Clamp(hunger+5, 0, 25)
if(food_dist > 1)
if(stance == STANCE_IDLE)
if(set_follow(food,10 SECONDS))
handle_stance(STANCE_FOLLOW)
if(resting)
lay_down()
if(food_dist <= 1)
if(hunger < 15)
if(prob(25))
visible_emote(pick("sniffs curiously at [food].",
"stares at [food], seeming to want something.",
"sniffs at [food]'s hands.",
"sniffs curiously at [food]'s pockets.",
"sits down for a moment, reaching towards [food] with its paws."))
hunger += 5
else if(hunger < 30)
if(prob(25))
visible_emote(pick("sniffs intently against [food], especially their pockets and gear.",
"stands up to beg [food] for snacks.",
"attempts to burrow into [food]'s pockets.",
"leans against [food], licking its chops.",
"hungrily nibbles onto [food]."))
hunger += 5
else if(hunger < 45)
if(prob(25))
visible_emote(pick("growls at [food], sounding rather hangry!",
"aggressively bumps and nudges against [food], trying to make something fall out.",
"salivates at [food] in an unsettling manner.",
"pushes hard against [food], licking its chops.",
"almost sinks its teeth into [food], just stopping to give them another chance."))
hunger += 5
else if(hunger < 50)
visible_emote("appears to have had enough and prepares to strike!")
else
food.Weaken(5)
food.visible_message("<span class='danger'>\the [src] pounces on \the [food]!</span>!")
target_mob = food
EatTarget()
hunger = 0
food = null
/mob/living/simple_animal/hostile/rat/passive/attackby(var/obj/item/O, var/mob/user) // Feed the rat your food to satisfy it.
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks))
qdel(O)
playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
hunger = 0
food = null
return
. = ..()
/mob/living/simple_animal/hostile/rat/passive/Found(var/atom/found_atom)
if(!SA_attackable(found_atom))
return null
else if(ishuman(found_atom) && will_eat(found_atom))
var/mob/living/carbon/human/H = found_atom
for(var/obj/item/weapon/reagent_containers/food/snacks/S in H)
if(!food)
visible_emote("sniffs around the air intently, seeming to have caught a whiff of food!")
if(resting)
lay_down()
food = H
return found_atom
break
return null
/mob/living/simple_animal/hostile/rat/passive/FindTarget()
var/atom/T = null
for(var/atom/A in ListTargets(view_range))
if(A == src)
continue
var/atom/F = Found(A)
if(F)
T = F
break
return T
/mob/living/simple_animal/hostile/rat/death()
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1)
..()
+9 -9
View File
@@ -347,20 +347,20 @@
set category = "OOC"
if (!( config.abandon_allowed ))
usr << "<span class='notice'>Respawn is disabled.</span>"
to_chat(usr, "<span class='notice'>Respawn is disabled.</span>")
return
if ((stat != 2 || !( ticker )))
usr << "<span class='notice'><B>You must be dead to use this!</B></span>"
to_chat(usr, "<span class='notice'><B>You must be dead to use this!</B></span>")
return
if (ticker.mode && ticker.mode.deny_respawn) //BS12 EDIT
usr << "<span class='notice'>Respawn is disabled for this roundtype.</span>"
to_chat(usr, "<span class='notice'>Respawn is disabled for this roundtype.</span>")
return
else
var/deathtime = world.time - src.timeofdeath
if(istype(src,/mob/observer/dead))
var/mob/observer/dead/G = src
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
usr << "<font color='blue'><B>Upon using the antagHUD you forfeighted the ability to join the round.</B></font>"
to_chat(usr, "<font color='blue'><B>By using the antagHUD you forfeit the ability to join the round.</B></font>")
return
var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute"
@@ -371,17 +371,17 @@
else if(deathtimeminutes > 1)
pluralcheck = " [deathtimeminutes] minutes and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
if (deathtime < (600)) //VOREStation Edit
usr << "You must wait 60 seconds to respawn!" //VOREStation Edit
if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME))
to_chat(usr, "You must wait 5 minutes to respawn!")
return
else
usr << "You can respawn now, enjoy your new life!"
to_chat(usr, "You can respawn now, enjoy your new life!")
log_game("[usr.name]/[usr.key] used abandon mob.")
usr << "<font color='blue'><B>Make sure to play a different character, and please roleplay correctly!</B></font>"
to_chat(usr, "<font color='blue'><B>Make sure to play a different character, and please roleplay correctly!</B></font>")
if(!client)
log_game("[usr.key] AM failed due to disconnect.")
+1 -2
View File
@@ -28,7 +28,7 @@
/mob/new_player/proc/new_player_panel_proc()
var/output = "<div align='center'>"
output +="<hr>"
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A></p>"
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Character Setup</A></p>"
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
if(ready)
@@ -358,7 +358,6 @@
var/mob/living/character = create_character(T) //creates the human and transfers vars and mind
character = job_master.EquipRank(character, rank, 1) //equips the human
UpdateFactionList(character)
log_game("JOINED [key_name(character)] as \"[rank]\"")
// AIs don't need a spawnpoint, they must spawn at an empty core
if(character.mind.assigned_role == "AI")
@@ -964,3 +964,9 @@
icon_state = "panels"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
heterochromia
name = "Heterochromia"
icon_state = "heterochromia"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the default hairstyles.