Merge branch 'master' into upstream-merge-32161

This commit is contained in:
LetterJay
2017-11-11 23:02:13 -06:00
committed by GitHub
625 changed files with 27981 additions and 20284 deletions
@@ -31,6 +31,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/mob/observetarget = null //The target mob that the ghost is observing. Used as a reference in logout()
var/ghost_hud_enabled = 1 //did this ghost disable the on-screen HUD?
var/data_huds_on = 0 //Are data HUDs currently enabled?
var/health_scan = FALSE //Are health scans currently enabled?
var/list/datahuds = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC) //list of data HUDs shown to ghosts.
var/ghost_orbit = GHOST_ORBIT_CIRCLE
@@ -671,6 +672,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "<span class='notice'>Data HUDs enabled.</span>")
data_huds_on = 1
/mob/dead/observer/verb/toggle_health_scan()
set name = "Toggle Health Scan"
set desc = "Toggles whether you health-scan living beings on click"
set category = "Ghost"
if(health_scan) //remove old huds
to_chat(src, "<span class='notice'>Health scan disabled.</span>")
health_scan = FALSE
else
to_chat(src, "<span class='notice'>Health scan enabled.</span>")
health_scan = TRUE
/mob/dead/observer/verb/restore_ghost_appearance()
set name = "Restore Ghost Character"
set desc = "Sets your deadchat name and ghost appearance to your \
@@ -130,10 +130,12 @@
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
for(var/thing in viruses)
var/datum/disease/D = thing
if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
M.ContactContractDisease(D)
if(can_inject(M, TRUE))
for(var/thing in viruses)
var/datum/disease/D = thing
if((D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) && prob(85))
M.ContactContractDisease(D)
for(var/thing in M.viruses)
var/datum/disease/D = thing
+34 -38
View File
@@ -75,24 +75,54 @@
/datum/emote/living/carbon/human/wag/run_emote(mob/user, params)
. = ..()
var/mob/living/carbon/human/H = user
if(.)
if(!H.is_wagging_tail())
H.startTailWag()
else
H.endTailWag()
/mob/living/carbon/human/proc/is_wagging_tail()
return (dna && dna.species && ("waggingtail_lizard" in dna.species.mutant_bodyparts || "waggingtail_human" in dna.species.mutant_bodyparts))
/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check = TRUE)
if(!..())
return FALSE
var/mob/living/carbon/human/H = user
if(H.dna && H.dna.species && ((H.dna.features["tail_lizard"] != "None") || (H.dna.features["tail_human"] != "None") || ("mam_tail" in H.dna.species.mutant_bodyparts)))
if(H.dna && H.dna.species && (("tail_lizard" in H.dna.species.mutant_bodyparts) || ("waggingtail_lizard" in H.dna.species.mutant_bodyparts) || (H.dna.features["tail_human"] != "None")))
return TRUE
/datum/emote/living/carbon/human/wag/select_message_type(mob/user)
. = ..()
var/mob/living/carbon/human/H = user
if(("waggingtail_lizard" in H.dna.species.mutant_bodyparts) || ("waggingtail_human" in H.dna.species.mutant_bodyparts) || ("mam_waggingtail" in H.dna.species.mutant_bodyparts))
if(("waggingtail_lizard" in H.dna.species.mutant_bodyparts) || ("waggingtail_human" in H.dna.species.mutant_bodyparts))
. = null
//Don't know where else to put this, it's basically an emote
/mob/living/carbon/human/proc/startTailWag()
if(!dna || !dna.species)
return
if("tail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_lizard"
dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail_lizard"
dna.species.mutant_bodyparts |= "waggingspines"
if("tail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_human"
dna.species.mutant_bodyparts |= "waggingtail_human"
update_body()
/mob/living/carbon/human/proc/endTailWag()
if(!dna || !dna.species)
return
if("waggingtail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_lizard"
dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail_lizard"
dna.species.mutant_bodyparts |= "spines"
if("waggingtail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_human"
dna.species.mutant_bodyparts |= "tail_human"
update_body()
/datum/emote/living/carbon/human/wing
key = "wing"
key_third_person = "wings"
@@ -121,41 +151,7 @@
var/mob/living/carbon/human/H = user
if(H.dna && H.dna.species && (H.dna.features["wings"] != "None"))
return TRUE
//Don't know where else to put this, it's basically an emote
/mob/living/carbon/human/proc/startTailWag()
if(!dna || !dna.species)
return
if("tail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_lizard"
dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail_lizard"
dna.species.mutant_bodyparts |= "waggingspines"
if("tail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_human"
dna.species.mutant_bodyparts |= "waggingtail_human"
if("mam_tail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "mam_tail"
dna.species.mutant_bodyparts |= "mam_waggingtail"
update_body()
/mob/living/carbon/human/proc/endTailWag()
if(!dna || !dna.species)
return
if("waggingtail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_lizard"
dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail_lizard"
dna.species.mutant_bodyparts |= "spines"
if("waggingtail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_human"
dna.species.mutant_bodyparts |= "tail_human"
if("mam_waggingtail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "mam_waggingtail"
dna.species.mutant_bodyparts |= "mam_tail"
update_body()
/mob/living/carbon/human/proc/OpenWings()
if(!dna || !dna.species)
return
@@ -0,0 +1,140 @@
/datum/species/dullahan
name = "dullahan"
id = "dullahan"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = TRUE
mutant_brain = /obj/item/organ/brain/dullahan
mutanteyes = /obj/item/organ/eyes/dullahan
mutanttongue = /obj/item/organ/tongue/dullahan
mutantears = /obj/item/organ/ears/dullahan
blacklisted = TRUE
limbs_id = "human"
skinned_type = /obj/item/stack/sheet/animalhide/human
var/obj/item/dullahan_relay/myhead
/datum/species/dullahan/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
return FALSE
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
H.flags_1 &= ~HEAR_1
var/obj/item/bodypart/head/head = H.get_bodypart("head")
if(head)
head.drop_limb()
head.flags_1 = HEAR_1
head.throwforce = 25
myhead = new /obj/item/dullahan_relay (head, H)
H.put_in_hands(head)
/datum/species/dullahan/on_species_loss(mob/living/carbon/human/H)
H.flags_1 |= ~HEAR_1
H.reset_perspective(H)
if(myhead)
var/obj/item/dullahan_relay/DR = myhead
myhead = null
DR.owner = null
qdel(DR)
H.regenerate_limb("head",FALSE)
..()
/datum/species/dullahan/spec_life(mob/living/carbon/human/H)
if(QDELETED(myhead))
myhead = null
H.gib()
var/obj/item/bodypart/head/head2 = H.get_bodypart("head")
if(head2)
myhead = null
H.gib()
/datum/species/dullahan/proc/update_vision_perspective(mob/living/carbon/human/H)
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
H.update_tint()
if(eyes.tint)
H.reset_perspective(H)
else
H.reset_perspective(myhead)
/obj/item/organ/brain/dullahan
decoy_override = TRUE
vital = FALSE
/obj/item/organ/tongue/dullahan
zone = "abstract"
/obj/item/organ/tongue/dullahan/TongueSpeech(var/message)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.dna.species.id == "dullahan")
var/datum/species/dullahan/D = H.dna.species
if(isobj(D.myhead.loc))
var/obj/O = D.myhead.loc
O.say(message)
message = ""
return message
/obj/item/organ/ears/dullahan
zone = "abstract"
/obj/item/organ/eyes/dullahan
name = "head vision"
desc = "An abstraction."
actions_types = list(/datum/action/item_action/organ_action/dullahan)
zone = "abstract"
/datum/action/item_action/organ_action/dullahan
name = "Toggle Perspective"
desc = "Switch between seeing normally from your head, or blindly from your body."
/datum/action/item_action/organ_action/dullahan/Trigger()
. = ..()
var/obj/item/organ/eyes/dullahan/DE = target
if(DE.tint)
DE.tint = 0
else
DE.tint = INFINITY
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.dna.species.id == "dullahan")
var/datum/species/dullahan/D = H.dna.species
D.update_vision_perspective(H)
/obj/item/dullahan_relay
var/mob/living/owner
flags_1 = HEAR_1
/obj/item/dullahan_relay/Initialize(mapload,new_owner)
. = ..()
owner = new_owner
START_PROCESSING(SSobj, src)
/obj/item/dullahan_relay/process()
if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner))
. = PROCESS_KILL
qdel(src)
/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
if(!QDELETED(owner))
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(owner,message)
else
qdel(src)
/obj/item/dullahan_relay/Destroy()
if(!QDELETED(owner))
var/mob/living/carbon/human/H = owner
if(H.dna.species.id == "dullahan")
var/datum/species/dullahan/D = H.dna.species
D.myhead = null
owner.gib()
owner = null
..()
@@ -22,6 +22,7 @@
limbs_id = "golem"
fixed_mut_color = "aaa"
var/info_text = "As an <span class='danger'>Iron Golem</span>, you don't have any special traits."
var/random_eligible = TRUE //If false, the golem subtype can't be made through golem mutation toxin
var/prefix = "Iron"
var/list/special_names
@@ -44,11 +45,20 @@
name = "Random Golem"
blacklisted = FALSE
dangerous_existence = FALSE
var/static/list/random_golem_types
/datum/species/golem/random/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
var/list/golem_types = typesof(/datum/species/golem) - src.type
var/datum/species/golem/golem_type = pick(golem_types)
if(!random_golem_types)
random_golem_types = subtypesof(/datum/species/golem) - type
for(var/V in random_golem_types)
var/datum/species/golem/G = V
if(!initial(G.random_eligible))
random_golem_types -= G
to_chat(world, "Excluding golem type [initial(G.id)]")
else
to_chat(world, "Allowing golem type [initial(G.id)]")
var/datum/species/golem/golem_type = pick(random_golem_types)
var/mob/living/carbon/human/H = C
H.set_species(golem_type)
to_chat(H, "[initial(golem_type.info_text)]")
@@ -241,7 +251,7 @@
heatmod = 1.5
info_text = "As a <span class='danger'>Wooden Golem</span>, you have plant-like traits: you take damage from extreme temperatures, can be set on fire, and have lower armor than a normal golem. You regenerate when in the light and wither in the darkness."
prefix = "Wooden"
special_names = list("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", "Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
special_names = list("Bark", "Willow", "Catalpa", "Woody", "Oak", "Sap", "Twig", "Branch", "Maple", "Birch", "Elm", "Basswood", "Cottonwood", "Larch", "Aspen", "Ash", "Beech", "Buckeye", "Cedar", "Chestnut", "Cypress", "Fir", "Hawthorn", "Hazel", "Hickory", "Ironwood", "Juniper", "Leaf", "Mangrove", "Palm", "Pawpaw", "Pine", "Poplar", "Redwood", "Redbud", "Sassafras", "Spruce", "Sumac", "Trunk", "Walnut", "Yew")
human_surname_chance = 0
special_name_chance = 100
@@ -596,7 +606,7 @@
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>clockwork golem</span><span class='bold alloy'>, you are faster than \
other types of golem (being a machine), and are immune to electric shocks.</span>"
species_traits = list(NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, VIRUSIMMUNE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE)
armor = 40 //Reinforced, but also slim to allow for fast movement
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
sexes = FALSE
@@ -638,7 +648,8 @@
has_corpse = TRUE
blacklisted = TRUE
dangerous_existence = TRUE
random_eligible = FALSE
/datum/species/golem/cloth
name = "Cloth Golem"
id = "cloth golem"
@@ -24,9 +24,8 @@
to_chat(C, "[info_text]")
C.skin_tone = "albino"
C.update_body(0)
if(C.mind)
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new
C.mind.AddSpell(B)
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new
C.AddSpell(B)
/datum/species/vampire/on_species_loss(mob/living/carbon/C)
. = ..()
@@ -45,7 +44,7 @@
C.adjustOxyLoss(-4)
C.adjustCloneLoss(-4)
return
C.blood_volume -= 1.5
C.blood_volume -= 0.75
if(C.blood_volume <= BLOOD_VOLUME_SURVIVE)
to_chat(C, "<span class='danger'>You ran out of blood!</span>")
C.dust()
@@ -123,8 +122,4 @@
invocation = "Squeak!"
charge_max = 50
cooldown_min = 50
shapeshift_type = /mob/living/simple_animal/hostile/retaliate/bat
current_shapes = list(/mob/living/simple_animal/hostile/retaliate/bat)
current_casters = list()
possible_shapes = list(/mob/living/simple_animal/hostile/retaliate/bat)
+4 -4
View File
@@ -207,10 +207,10 @@
if(breath_gases[/datum/gas/tritium])
var/tritium_partialpressure = (breath_gases[/datum/gas/tritium][MOLES]/breath.total_moles())*breath_pressure
radiation += tritium_partialpressure/10
//Brown Gas
if (breath_gases[/datum/gas/brown_gas])
var/browns_partialpressure = (breath_gases[/datum/gas/brown_gas][MOLES]/breath.total_moles())*breath_pressure
adjustFireLoss(browns_partialpressure/4)
//NITRYL
if (breath_gases[/datum/gas/nitryl])
var/nitryl_partialpressure = (breath_gases[/datum/gas/nitryl][MOLES]/breath.total_moles())*breath_pressure
adjustFireLoss(nitryl_partialpressure/4)
+7 -29
View File
@@ -105,7 +105,8 @@
//Called when we bump onto a mob
/mob/living/proc/MobCollide(mob/M)
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
//Also diseases
for(var/thing in viruses)
var/datum/disease/D = thing
@@ -120,29 +121,6 @@
if(now_pushing)
return TRUE
//TODO FOR LATER PRS: Make passing tables an automatic thing for flying and passable objects be determined better to prevent huge amounts of flags being set when mobs fly.
if((movement_type) ^ (M.movement_type)) //Fly past each other.
now_pushing = TRUE
var/old = pass_flags & PASSMOB
var/old_p = pulling? (pulling.pass_flags & PASSMOB) : NONE
var/atom/movable/cached = pulling
pass_flags |= PASSMOB
var/obj/item/I = cached
if(cached && (isliving(cached) || (istype(I) && (I.w_class < WEIGHT_CLASS_BULKY))))
var/mob/living/l = cached
if(l.mob_size <= mob_size)
cached.pass_flags |= PASSMOB
Move(get_turf(M))
if(!old)
pass_flags &= ~PASSMOB
if(cached && !old_p)
cached.pass_flags &= ~PASSMOB
cached = null
now_pushing = FALSE
return TRUE
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
//Should stop you pushing a restrained person out of the way
if(isliving(M))
@@ -501,21 +479,21 @@
if(isopenturf(loc) && !is_flying())
var/turf/open/T = loc
. += T.slowdown
var/static/config_run_delay
var/static/config_walk_delay
var/static/datum/config_entry/number/run_delay/config_run_delay
var/static/datum/config_entry/number/walk_delay/config_walk_delay
if(isnull(config_run_delay))
config_run_delay = CONFIG_GET(number/run_delay)
config_walk_delay = CONFIG_GET(number/walk_delay)
if(ignorewalk)
. += config_run_delay
. += config_run_delay.value_cache
else
switch(m_intent)
if(MOVE_INTENT_RUN)
if(drowsyness > 0)
. += 6
. += config_run_delay
. += config_run_delay.value_cache
if(MOVE_INTENT_WALK)
. += config_walk_delay
. += config_walk_delay.value_cache
/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction)
if(!has_gravity())
+4 -4
View File
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
"÷" = "cords"
))
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE)
var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
@@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
say_dead(original_message)
return
if(check_emote(original_message) || !can_speak_basic(original_message))
if(check_emote(original_message) || !can_speak_basic(original_message, ignore_spam))
return
if(in_critical)
@@ -270,12 +270,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(can_speak_basic(message) && can_speak_vocal(message))
return 1
/mob/living/proc/can_speak_basic(message) //Check BEFORE handling of xeno and ling channels
/mob/living/proc/can_speak_basic(message, ignore_spam = FALSE) //Check BEFORE handling of xeno and ling channels
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "<span class='danger'>You cannot speak in IC (muted).</span>")
return 0
if(client.handle_spam_prevention(message,MUTE_IC))
if(!ignore_spam && client.handle_spam_prevention(message,MUTE_IC))
return 0
return 1
@@ -634,14 +634,17 @@
/obj/item/retractor,
/obj/item/hemostat,
/obj/item/cautery,
/obj/item/surgicaldrill,
/obj/item/scalpel,
/obj/item/melee/transforming/energy/sword/cyborg/saw,
/obj/item/roller/robo,
/obj/item/card/emag,
/obj/item/crowbar/cyborg,
/obj/item/extinguisher/mini,
/obj/item/pinpointer/syndicate_cyborg,
/obj/item/stack/medical/gauze/cyborg,
/obj/item/gun/medbeam)
/obj/item/gun/medbeam,
/obj/item/organ_storage)
ratvar_modules = list(
/obj/item/clockwork/slab/cyborg/medical,
/obj/item/clockwork/weapon/ratvarian_spear)
@@ -282,11 +282,11 @@
var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
w_class = WEIGHT_CLASS_NORMAL
/obj/item/firstaid_arm_assembly/New()
..()
spawn(5)
if(skin)
add_overlay("kit_skin_[skin]")
/obj/item/firstaid_arm_assembly/New()
..()
spawn(5)
if(skin)
add_overlay("kit_skin_[skin]")
/obj/item/storage/firstaid/attackby(obj/item/bodypart/S, mob/user, params)
@@ -8,6 +8,7 @@
anchored = FALSE
health = 25
maxHealth = 25
spacewalk = TRUE
radio_key = /obj/item/device/encryptionkey/headset_eng
radio_channel = "Engineering"
@@ -45,9 +46,6 @@
access_card.access += J.get_access()
prev_access = access_card.access
/mob/living/simple_animal/bot/floorbot/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/bot/floorbot/turn_on()
. = ..()
update_icon()
@@ -343,7 +343,7 @@
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
return FALSE //welp too late for them!
if(!(loc == C.loc) || !(isturf(C.loc) && isturf(loc)))
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
return FALSE
if(C.suiciding)
@@ -10,6 +10,7 @@
speak_chance = 1
icon = 'icons/mob/mob.dmi'
speed = 0
spacewalk = TRUE
a_intent = INTENT_HARM
stop_automated_movement = 1
status_flags = CANPUSH
@@ -85,9 +86,6 @@
else if(src != M)
return ..()
/mob/living/simple_animal/hostile/construct/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/construct/narsie_act()
return
@@ -12,6 +12,8 @@
name = "Syndicate Operative"
id_job = "Operative"
id_access_list = list(ACCESS_SYNDICATE)
hair_style = "Bald"
facial_hair_style = "Shaved"
outfit = /datum/outfit/syndicatesoldiercorpse
/datum/outfit/syndicatesoldiercorpse
@@ -31,6 +33,8 @@
name = "Syndicate Commando"
id_job = "Operative"
id_access_list = list(ACCESS_SYNDICATE)
hair_style = "Bald"
facial_hair_style = "Shaved"
outfit = /datum/outfit/syndicatecommandocorpse
/datum/outfit/syndicatecommandocorpse
@@ -50,6 +54,8 @@
name = "Syndicate Stormtrooper"
id_job = "Operative"
id_access_list = list(ACCESS_SYNDICATE)
hair_style = "Bald"
facial_hair_style = "Shaved"
outfit = /datum/outfit/syndicatestormtroopercorpse
/datum/outfit/syndicatestormtroopercorpse
@@ -67,11 +73,16 @@
/obj/effect/mob_spawn/human/clown/corpse
roundstart = FALSE
instant = TRUE
skin_tone = "caucasian1"
hair_style = "Bald"
facial_hair_style = "Shaved"
/obj/effect/mob_spawn/human/corpse/pirate
name = "Pirate"
skin_tone = "Caucasian1" //all pirates are white because it's easier that way
outfit = /datum/outfit/piratecorpse
hair_style = "Bald"
facial_hair_style = "Shaved"
/datum/outfit/piratecorpse
name = "Pirate Corpse"
@@ -94,12 +105,17 @@
/obj/effect/mob_spawn/human/corpse/russian
name = "Russian"
outfit = /datum/outfit/russiancorpse
hair_style = "Bald"
facial_hair_style = "Shaved"
/datum/outfit/russiancorpse
name = "Russian Corpse"
uniform = /obj/item/clothing/under/soviet
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/bearpelt
gloves = /obj/item/clothing/gloves/color/black
mask = /obj/item/clothing/mask/gas
/obj/effect/mob_spawn/human/corpse/russian/ranged
@@ -109,6 +125,7 @@
name = "Ranged Russian Corpse"
head = /obj/item/clothing/head/ushanka
/obj/effect/mob_spawn/human/corpse/russian/ranged/trooper
outfit = /datum/outfit/russiancorpse/ranged/trooper
@@ -119,8 +136,8 @@
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/balaclava
head = /obj/item/clothing/head/helmet/alt
mask = /obj/item/clothing/mask/balaclava
/obj/effect/mob_spawn/human/corpse/russian/ranged/officer
@@ -131,7 +148,7 @@
name = "Russian Officer Corpse"
uniform = /obj/item/clothing/under/rank/security/navyblue/russian
suit = /obj/item/clothing/suit/security/officer/russian
shoes = /obj/item/clothing/shoes/laceup
shoes = /obj/item/clothing/shoes/combat
ears = /obj/item/device/radio/headset
head = /obj/item/clothing/head/ushanka
@@ -139,6 +156,9 @@
/obj/effect/mob_spawn/human/corpse/wizard
name = "Space Wizard Corpse"
outfit = /datum/outfit/wizardcorpse
hair_style = "Bald"
facial_hair_style = "Long Beard"
skin_tone = "Caucasian1"
/datum/outfit/wizardcorpse
name = "Space Wizard Corpse"
@@ -153,6 +173,8 @@
id_job = "Private Security Force"
id_access = "Security Officer"
outfit = /datum/outfit/nanotrasensoldiercorpse2
hair_style = "Bald"
facial_hair_style = "Shaved"
/datum/outfit/nanotrasensoldiercorpse2
name = "NT Private Security Officer Corpse"
@@ -320,6 +320,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
forceMove(summoner.loc)
new /obj/effect/temp_visual/guardian/phase(loc)
cooldown = world.time + 10
reset_perspective()
return TRUE
return FALSE
@@ -24,7 +24,7 @@
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
. = ..()
if(isliving(target))
src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]!!")
say("[battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry]!!", ignore_spam = TRUE)
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
@@ -20,6 +20,7 @@
response_harm = "hits"
maxHealth = 60
health = 60
spacewalk = TRUE
var/armored = FALSE
obj_damage = 60
@@ -67,9 +68,6 @@
maxHealth = 120
armored = TRUE
/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0)
return 1 //No drifting in space for space bears!
/mob/living/simple_animal/hostile/bear/update_icons()
..()
if(armored)
@@ -28,6 +28,7 @@
response_harm = "squashes"
maxHealth = 10
health = 10
spacewalk = TRUE
faction = list("hostile")
move_to_delay = 0
obj_damage = 0
@@ -52,11 +53,6 @@
var/static/beehometypecache = typecacheof(/obj/structure/beebox)
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/poison/bees/Initialize()
. = ..()
generate_bee_visuals()
@@ -18,6 +18,7 @@
speed = 0
maxHealth = 25
health = 25
spacewalk = TRUE
harm_intent_damage = 8
obj_damage = 50
@@ -36,9 +37,6 @@
pressure_resistance = 200
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. = ..()
if(. && ishuman(target))
@@ -1,44 +1,42 @@
/mob/living/simple_animal/hostile/faithless
name = "The Faithless"
desc = "The Wish Granter's faith in humanity, incarnate."
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
gender = MALE
speak_chance = 0
turns_per_move = 5
response_help = "passes through"
response_disarm = "shoves"
response_harm = "hits"
emote_taunt = list("wails")
taunt_chance = 25
speed = 0
maxHealth = 80
health = 80
stat_attack = UNCONSCIOUS
robust_searching = 1
harm_intent_damage = 10
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "grips"
attack_sound = 'sound/hallucinations/growl1.ogg'
speak_emote = list("growls")
atmos_requirements = list("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
faction = list("faithless")
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
. = ..()
if(. && prob(12) && iscarbon(target))
var/mob/living/carbon/C = target
C.Knockdown(60)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
/mob/living/simple_animal/hostile/faithless
name = "The Faithless"
desc = "The Wish Granter's faith in humanity, incarnate."
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
gender = MALE
speak_chance = 0
turns_per_move = 5
response_help = "passes through"
response_disarm = "shoves"
response_harm = "hits"
emote_taunt = list("wails")
taunt_chance = 25
speed = 0
maxHealth = 80
health = 80
spacewalk = TRUE
stat_attack = UNCONSCIOUS
robust_searching = 1
harm_intent_damage = 10
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "grips"
attack_sound = 'sound/hallucinations/growl1.ogg'
speak_emote = list("growls")
atmos_requirements = list("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
faction = list("faithless")
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
. = ..()
if(. && prob(12) && iscarbon(target))
var/mob/living/carbon/C = target
C.Knockdown(60)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
@@ -206,6 +206,7 @@
atmos_requirements = list("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 = 1500
poison_type = "frost_oil"
color = rgb(114,228,250)
gold_core_spawnable = 0
@@ -214,6 +215,7 @@
atmos_requirements = list("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 = 1500
poison_type = "frost_oil"
color = rgb(114,228,250)
gold_core_spawnable = 0
@@ -222,6 +224,7 @@
atmos_requirements = list("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 = 1500
poison_type = "frost_oil"
color = rgb(114,228,250)
gold_core_spawnable = 0
@@ -36,6 +36,7 @@ Difficulty: Medium
desc = "Guardians of the necropolis."
health = 2500
maxHealth = 2500
spacewalk = TRUE
attacktext = "chomps"
attack_sound = 'sound/magic/demon_attack1.ogg'
icon_state = "dragon"
@@ -97,9 +98,6 @@ Difficulty: Medium
if(!swooping)
..()
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
if(swooping)
return
@@ -385,6 +383,7 @@ Difficulty: Medium
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
loot = list()
crusher_loot = list()
butcher_results = list(/obj/item/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
@@ -21,6 +21,7 @@ Difficulty: Medium
name = "Legion"
health = 800
maxHealth = 800
spacewalk = TRUE
icon_state = "legion"
icon_living = "legion"
desc = "One of many."
@@ -139,9 +140,6 @@ Difficulty: Medium
loot = list(/obj/structure/closet/crate/necropolis/tendril)
..()
/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0)
return 1
/obj/item/device/gps/internal/legion
icon_state = null
gpstag = "Echoing Signal"
@@ -1,68 +1,66 @@
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
icon = 'icons/mob/simple_human.dmi'
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead"
speak_chance = 0
turns_per_move = 5
response_help = "pushes"
response_disarm = "shoves"
response_harm = "hits"
speed = 0
maxHealth = 100
health = 100
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
speak_emote = list("yarrs")
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
icon = 'icons/mob/simple_human.dmi'
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead"
speak_chance = 0
turns_per_move = 5
response_help = "pushes"
response_disarm = "shoves"
response_harm = "hits"
speed = 0
maxHealth = 100
health = 100
spacewalk = TRUE
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
speak_emote = list("yarrs")
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
/obj/item/melee/transforming/energy/sword/pirate)
del_on_death = 1
faction = list("pirate")
/mob/living/simple_animal/hostile/pirate/ranged
name = "Pirate Gunner"
icon_state = "pirateranged"
icon_living = "pirateranged"
icon_dead = "piratemelee_dead"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
/mob/living/simple_animal/hostile/pirate/space
name = "Space Pirate"
icon_state = "piratespace"
icon_living = "piratespace"
atmos_requirements = list("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
speed = 1
/mob/living/simple_animal/hostile/pirate/space/ranged
name = "Space Pirate Gunner"
icon_state = "piratespaceranged"
icon_living = "piratespaceranged"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
/mob/living/simple_animal/hostile/pirate/space/Process_Spacemove(movement_dir = 0)
return 1
del_on_death = 1
faction = list("pirate")
/mob/living/simple_animal/hostile/pirate/ranged
name = "Pirate Gunner"
icon_state = "pirateranged"
icon_living = "pirateranged"
icon_dead = "piratemelee_dead"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
/mob/living/simple_animal/hostile/pirate/space
name = "Space Pirate"
icon_state = "piratespace"
icon_living = "piratespace"
atmos_requirements = list("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
speed = 1
/mob/living/simple_animal/hostile/pirate/space/ranged
name = "Space Pirate Gunner"
icon_state = "piratespaceranged"
icon_living = "piratespaceranged"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
@@ -12,6 +12,7 @@
speak_chance = 0
maxHealth = 15
health = 15
spacewalk = TRUE
see_in_dark = 10
harm_intent_damage = 6
melee_damage_lower = 6
@@ -34,4 +35,5 @@
//Space bats need no air to fly in.
atmos_requirements = list("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
minbodytemp = 0
@@ -23,7 +23,7 @@
environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 0
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file
name = "Nanotrasen Private Security Officer"
desc = "An officer part of Nanotrasen's private security force."
icon = 'icons/mob/simple_human.dmi'
@@ -45,8 +45,6 @@
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
anchored = TRUE
gold_core_spawnable = 1
var/cannot_be_seen = 1
var/mob/living/creator = null
@@ -55,6 +55,7 @@
status_flags = 0
maxHealth = 170
health = 170
spacewalk = TRUE
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj)
if(!Proj)
@@ -75,9 +76,6 @@
loot = list(/obj/effect/gibspawner/human)
speed = 1
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper
icon_state = "syndicatemeleestormtrooper"
icon_living = "syndicatemeleestormtrooper"
@@ -106,11 +104,9 @@
atmos_requirements = list("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
speed = 1
spacewalk = TRUE
loot = list(/obj/effect/gibspawner/human)
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper
icon_state = "syndicaterangedstormtrooper"
icon_living = "syndicaterangedstormtrooper"
@@ -109,7 +109,7 @@
w_class = WEIGHT_CLASS_NORMAL
layer = MOB_LAYER
origin_tech = "biotech=6"
var/list/banned_mobs()
var/list/banned_mobs
/obj/item/asteroid/fugu_gland/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag && isanimal(target))
@@ -8,6 +8,7 @@
icon_living = "shade"
maxHealth = 50
health = 50
spacewalk = TRUE
healable = 0
speak_emote = list("hisses")
emote_hear = list("wails.","screeches.")
@@ -40,9 +41,6 @@
return 0
return ..()
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0)
return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't
/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/M)
if(isconstruct(M))
var/mob/living/simple_animal/hostile/construct/C = M
+2
View File
@@ -7,6 +7,8 @@
GLOB.living_mob_list -= src
GLOB.all_clockwork_mobs -= src
GLOB.mob_directory -= tag
for (var/alert in alerts)
clear_alert(alert, TRUE)
if(observers && observers.len)
for(var/M in observers)
var/mob/dead/observe = M
+1
View File
@@ -46,6 +46,7 @@
var/slurring = 0 //Carbon
var/cultslurring = 0 //Carbon
var/real_name = null
var/spacewalk = FALSE
var/druggy = 0 //Carbon
var/confused = 0 //Carbon
var/resting = 0 //Carbon
+1 -1
View File
@@ -297,7 +297,7 @@
///For moving in space
///return TRUE for movement 0 for none
/mob/Process_Spacemove(movement_dir = 0)
if(..())
if(spacewalk || ..())
return TRUE
var/atom/movable/backup = get_spacemove_backup()
if(backup)
+5 -1
View File
@@ -461,7 +461,11 @@
qdel(src)
/mob/proc/become_overmind(starting_points = 60)
var/mob/camera/blob/B = new /mob/camera/blob(loc, starting_points)
var/turf/T = get_turf(loc) //just to avoid messing up in lockers
var/area/A = get_area(T)
if(((A && !A.blob_allowed) || !(T.z in GLOB.station_z_levels)) && LAZYLEN(GLOB.blobstart))
T = get_turf(pick(GLOB.blobstart))
var/mob/camera/blob/B = new /mob/camera/blob(T, starting_points)
B.key = key
. = B
qdel(src)