mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-28 22:46:22 +01:00
Merge branch 'virgoMaster' into virgoPull
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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)
|
||||
..()
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user