Merge branch 'master' into donoritemmodularization

This commit is contained in:
deathride58
2017-12-04 20:17:02 -05:00
569 changed files with 8426 additions and 5523 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
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/list/datahuds = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED) //list of data HUDs shown to ghosts.
var/ghost_orbit = GHOST_ORBIT_CIRCLE
//These variables store hair data if the ghost originates from a species with head and/or facial hair.
+1 -1
View File
@@ -160,7 +160,7 @@
return
if(!B)
return
src.loc = B.loc
forceMove(B.loc)
src.client.eye = src
src.visible_message("<span class='warning'><B>[src] rises out of the pool of blood!</B></span>")
exit_blood_effect(B)
+1 -1
View File
@@ -71,7 +71,7 @@
name = "Man-Machine Interface: [brainmob.real_name]"
update_icon()
SSblackbox.inc("cyborg_mmis_filled",1)
SSblackbox.record_feedback("amount", "mmis_filled", 1)
else if(brainmob)
O.attack(brainmob, user) //Oh noooeeeee
+1 -1
View File
@@ -21,7 +21,7 @@
return ITALICS | REDUCE_RANGE
/mob/living/brain/lingcheck()
return 0
return LINGHIVE_NONE
/mob/living/brain/treat_message(message)
message = capitalize(message)
@@ -12,7 +12,7 @@
else
icon_state = "alien[caste]_dead"
else if((stat == UNCONSCIOUS && !asleep) || IsKnockdown())
else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsKnockdown())
icon_state = "alien[caste]_unconscious"
else if(leap_on_click)
icon_state = "alien[caste]_pounce"
@@ -49,3 +49,10 @@
var/icon_render_key = ""
var/static/list/limb_icon_cache = list()
//halucination vars
var/image/halimage
var/image/halbody
var/obj/halitem
var/hal_screwyhud = SCREWYHUD_NONE
var/next_hallucination = 0
@@ -188,24 +188,30 @@
msg += "[t_He] [p_do()]n't seem all there.\n"
if(temp)
if(temp < 30)
if(temp < 25)
msg += "[t_He] [t_has] minor bruising.\n"
else if(temp < 50)
msg += "[t_He] [t_has] <b>moderate</b> bruising!\n"
else
msg += "<B>[t_He] [t_has] severe bruising!</B>\n"
temp = getFireLoss()
if(temp)
if(temp < 30)
if(temp < 25)
msg += "[t_He] [t_has] minor burns.\n"
else if (temp < 50)
msg += "[t_He] [t_has] <b>moderate</b> burns!\n"
else
msg += "<B>[t_He] [t_has] severe burns!</B>\n"
temp = getCloneLoss()
if(temp)
if(temp < 30)
if(temp < 25)
msg += "[t_He] [t_has] minor cellular damage.\n"
else if(temp < 50)
msg += "[t_He] [t_has] <b>moderate</b> cellular damage!\n"
else
msg += "<B>[t_He] [t_has] severe cellular damage.</B>\n"
msg += "<b>[t_He] [t_has] severe cellular damage!</b>\n"
if(fire_stacks > 0)
@@ -890,8 +890,11 @@
if(!is_type_in_typecache(M, can_ride_typecache))
M.visible_message("<span class='warning'>[M] really can't seem to mount [src]...</span>")
return
if(!riding_datum)
riding_datum = new /datum/riding/human(src)
var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human)
riding_datum.ride_check_rider_incapacitated = TRUE
riding_datum.ride_check_ridden_incapacitated = TRUE
riding_datum.ride_check_rider_restrained = TRUE
riding_datum.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4)))
if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS))
return
visible_message("<span class='notice'>[M] starts to climb onto [src]...</span>")
@@ -908,13 +911,6 @@
else
visible_message("<span class='warning'>[M] fails to climb onto [src]!</span>")
/mob/living/carbon/human/unbuckle_mob(mob/living/M, force=FALSE)
if(iscarbon(M))
if(riding_datum)
riding_datum.unequip_buckle_inhands(M)
riding_datum.restore_position(M)
. = ..(M, force)
/mob/living/carbon/human/species
var/race = null
@@ -162,8 +162,8 @@
affecting = get_bodypart(ran_zone(user.zone_selected))
var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target
SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]")
SSblackbox.add_details("zone_targeted","[target_area]")
SSblackbox.record_feedback("nested tally", "item_used_for_combat", 1, list("[I.force]", "[I.type]"))
SSblackbox.record_feedback("tally", "zone_targeted", 1, target_area)
// the attacked_by code varies among species
return dna.species.spec_attacked_by(I, user, affecting, a_intent, src)
@@ -188,12 +188,8 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.a_intent == INTENT_DISARM)
if(H.buckled_mobs && (src in H.buckled_mobs) && H.riding_datum)
H.riding_datum.force_dismount(src)
dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
@@ -361,10 +357,11 @@
/mob/living/carbon/human/ex_act(severity, target, origin)
if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
return
..()
if (!severity)
return
var/b_loss = 0
var/f_loss = 0
var/bomb_armor = getarmor(null, "bomb")
@@ -58,11 +58,6 @@
//End bloody footprints
S.step_action()
/mob/living/carbon/human/Moved()
. = ..()
if(buckled_mobs && buckled_mobs.len && riding_datum)
riding_datum.on_vehicle_move()
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee.
if(..())
return 1
@@ -103,6 +103,7 @@
update_tint()
if(G.vision_correction)
clear_fullscreen("nearsighted")
clear_fullscreen("eye_damage")
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
update_sight()
update_inv_glasses()
@@ -188,6 +189,7 @@
if(G.vision_correction)
if(disabilities & NEARSIGHT)
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
adjust_eye_damage(0)
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
update_sight()
if(!QDELETED(src))
@@ -453,9 +453,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
if(!(H.disabilities & HUSK))
if(HD && !(H.disabilities & HUSK))
// lipstick
if(H.lip_style && (LIPS in species_traits) && HD)
if(H.lip_style && (LIPS in species_traits))
var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER)
lip_overlay.color = H.lip_color
if(OFFSET_FACE in H.dna.species.offset_features)
@@ -464,13 +464,18 @@ GLOBAL_LIST_EMPTY(roundstart_races)
standing += lip_overlay
// eyes
if((EYECOLOR in species_traits) && HD)
var/mutable_appearance/eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
var/mutable_appearance/eye_overlay
if(!has_eyes)
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
else
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
if((EYECOLOR in species_traits) && has_eyes)
eye_overlay.color = "#" + H.eye_color
if(OFFSET_FACE in H.dna.species.offset_features)
eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
standing += eye_overlay
if(OFFSET_FACE in H.dna.species.offset_features)
eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
standing += eye_overlay
//Underwear, Undershirts & Socks
if(!(NO_UNDERWEAR in species_traits))
@@ -3,7 +3,7 @@
id = "abductor"
say_mod = "gibbers"
sexes = FALSE
species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER)
species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER)
mutanttongue = /obj/item/organ/tongue/abductor
var/scientist = FALSE // vars to not pollute spieces list with castes
@@ -2,7 +2,7 @@
name = "Android"
id = "android"
say_mod = "states"
species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT)
species_traits = list(SPECIES_ROBOTIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT)
meat = null
damage_overlay_type = "synth"
mutanttongue = /obj/item/organ/tongue/robot
@@ -2,7 +2,7 @@
name = "Angel"
id = "angel"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "Angel")
use_skintones = 1
@@ -15,5 +15,5 @@
attack_sound = 'sound/weapons/resonator_blast.ogg'
blacklisted = 1
use_skintones = 0
species_traits = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
sexes = 0
species_traits = list(SPECIES_ORGANIC,RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
sexes = 0
@@ -2,7 +2,7 @@
name = "dullahan"
id = "dullahan"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER)
species_traits = list(SPECIES_ORGANIC,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
@@ -2,6 +2,7 @@
name = "Flyperson"
id = "fly"
say_mod = "buzzes"
species_traits = list(SPECIES_ORGANIC)
mutanttongue = /obj/item/organ/tongue/fly
mutantliver = /obj/item/organ/liver/fly
mutantstomach = /obj/item/organ/stomach/fly
@@ -2,7 +2,7 @@
name = "Mammal"
id = "mammal"
default_color = "4B4B4B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "body_markings" = "None", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "None", "taur" = "None")
attack_verb = "claw"
@@ -24,7 +24,7 @@
id = "avian"
say_mod = "chirps"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
mutant_bodyparts = list("snout", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
default_features = list("snout" = "Sharp", "wings" = "None", "taur" = "None", "mam_body_markings" = "Hawk")
attack_verb = "peck"
@@ -45,7 +45,7 @@
name = "Aquatic"
id = "aquatic"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
mutant_bodyparts = list("mam_tail", "mam_body_markings", "mam_ears", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF","mam_tail" = "shark", "mam_body_markings" = "None", "mam_ears" = "None")
attack_verb = "bite"
@@ -66,7 +66,7 @@
name = "Insect"
id = "insect"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None")
attack_verb = "flutter" //wat?
@@ -90,7 +90,7 @@
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE,PIERCEIMMUNE)
species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE,PIERCEIMMUNE,SPECIES_ORGANIC)
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings")
default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno")
heatmod = 1.3
@@ -220,7 +220,7 @@
name = "DataShark"
id = "datashark"
default_color = "BCAC9B"
species_traits = list(MUTCOLORS_PARTSONLY,EYECOLOR,LIPS,HAIR)
species_traits = list(MUTCOLORS_PARTSONLY,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
mutant_bodyparts = list("mam_tail", "mam_body_markings")
default_features = list("mam_tail" = "datashark", "mam_body_markings" = "None")
attack_verb = "bite"
@@ -234,7 +234,7 @@
name = "Guilmon"
id = "guilmon"
default_color = "4B4B4B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings")
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF", "mcolor3" = "FFF", "mam_tail" = "guilmon", "mam_ears" = "guilmon", "mam_body_markings" = "guilmon")
attack_verb = "claw"
@@ -2,7 +2,7 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "iron golem"
species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
mutant_organs = list(/obj/item/organ/adamantine_resonator)
speedmod = 2
armor = 55
@@ -76,7 +76,7 @@
fixed_mut_color = "a3d"
meat = /obj/item/ore/plasma
//Can burn and takes damage from heat
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
info_text = "As a <span class='danger'>Plasma Golem</span>, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
heatmod = 0 //fine until they blow up
prefix = "Plasma"
@@ -242,7 +242,7 @@
fixed_mut_color = "49311c"
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
species_traits = list(SPECIES_ORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
armor = 30
burnmod = 1.25
heatmod = 1.5
@@ -549,7 +549,7 @@
limbs_id = "cultgolem"
sexes = FALSE
info_text = "As a <span class='danger'>Runic Golem</span>, you possess eldritch powers granted by the Elder God Nar'Sie."
species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors
species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors
prefix = "Runic"
var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift
@@ -602,7 +602,7 @@
limbs_id = "clockgolem"
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)
species_traits = list(SPECIES_INORGANIC,NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE)
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
@@ -653,7 +653,7 @@
limbs_id = "clothgolem"
sexes = FALSE
info_text = "As a <span class='danger'>Cloth Golem</span>, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable."
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn
species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
speedmod = 1 // not as heavy as stone
@@ -710,7 +710,7 @@
to_chat(cloth_golem, "<span class='notice'>You start gathering your life energy, preparing to rise again...</span>")
addtimer(CALLBACK(src, .proc/revive), revive_time)
else
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/structure/cloth_pile/Destroy()
if(cloth_golem)
@@ -2,9 +2,9 @@
name = "Human"
id = "human"
default_color = "FFFFFF"
species_traits = list(MUTCOLORS_PARTSONLY,EYECOLOR,HAIR,FACEHAIR,LIPS)
mutant_bodyparts = list("tail_human", "ears", "taur")
default_features = list("tail_human" = "None", "ears" = "None", "taur" = "none")
species_traits = list(MUTCOLORS_PARTSONLY,SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
mutant_bodyparts = list("tail_human", "ears", "wings", "taur")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "none")
use_skintones = 1
skinned_type = /obj/item/stack/sheet/animalhide/human
disliked_food = GROSS | RAW
@@ -4,7 +4,7 @@
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,TOXINLOVER)
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,TOXINLOVER)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
exotic_blood = "slimejelly"
damage_overlay_type = ""
@@ -101,7 +101,7 @@
name = "Slimeperson"
id = "slime"
default_color = "00FFFF"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,VIRUSIMMUNE, TOXINLOVER)
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,VIRUSIMMUNE, TOXINLOVER)
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 150
@@ -4,7 +4,7 @@
id = "lizard"
say_mod = "hisses"
default_color = "00FF00"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,FACEHAIR)
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,LIPS, HAIR, FACEHAIR)
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur")
mutanttongue = /obj/item/organ/tongue/lizard
mutanttail = /obj/item/organ/tail/lizard
@@ -4,7 +4,7 @@
say_mod = "rattles"
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,VIRUSIMMUNE,NOHUNGER)
species_traits = list(SPECIES_INORGANIC,NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,NOHUNGER)
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
mutantliver = /obj/item/organ/liver/plasmaman
@@ -3,7 +3,7 @@
name = "Podperson"
id = "pod"
default_color = "59CE00"
species_traits = list(MUTCOLORS,EYECOLOR)
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR)
attack_verb = "slash"
attack_sound = 'sound/weapons/slice.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -9,7 +9,7 @@
blacklisted = 1
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
species_traits = list(NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE)
species_traits = list(SPECIES_ORGANIC,NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE)
dangerous_existence = 1
mutanteyes = /obj/item/organ/eyes/night_vision
@@ -6,7 +6,7 @@
blacklisted = 1
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutanttongue = /obj/item/organ/tongue/bone
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
disliked_food = NONE
@@ -3,13 +3,13 @@
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
species_traits = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species
species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species
dangerous_existence = 1
blacklisted = 1
meat = null
damage_overlay_type = "synth"
limbs_id = "synth"
var/list/initial_species_traits = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise()
var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise()
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
@@ -41,7 +41,8 @@
say_mod = S.say_mod
sexes = S.sexes
species_traits = initial_species_traits.Copy()
species_traits.Add(S.species_traits)
species_traits |= S.species_traits
species_traits -= list(SPECIES_ORGANIC, SPECIES_INORGANIC, SPECIES_UNDEAD)
attack_verb = S.attack_verb
attack_sound = S.attack_sound
miss_sound = S.miss_sound
@@ -2,7 +2,7 @@
name = "vampire"
id = "vampire"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD)
species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
exotic_bloodtype = "U"
@@ -8,7 +8,7 @@
sexes = 0
blacklisted = 1
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING)
species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING)
mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
disliked_food = NONE
@@ -73,6 +73,7 @@
id = "goofzombies"
limbs_id = "zombie" //They look like zombies
sexes = 0
species_traits = list(SPECIES_ORGANIC)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
mutanttongue = /obj/item/organ/tongue/zombie
+1 -1
View File
@@ -248,7 +248,7 @@
if(prob(D.infectivity))
D.spread()
if(stat != DEAD)
if(stat != DEAD && !D.process_dead)
D.stage_act()
//todo generalize this and move hud out
+6 -6
View File
@@ -491,14 +491,14 @@
. = ..()
if(.)
user.spin(20, 1)
if(iscyborg(user))
if(iscyborg(user) && user.has_buckled_mobs())
var/mob/living/silicon/robot/R = user
if(R.buckled_mobs)
GET_COMPONENT_FROM(riding_datum, /datum/component/riding, R)
if(riding_datum)
for(var/mob/M in R.buckled_mobs)
if(R.riding_datum)
R.riding_datum.force_dismount(M)
else
R.unbuckle_all_mobs()
riding_datum.force_dismount(M)
else
R.unbuckle_all_mobs()
/datum/emote/living/circle
+4 -2
View File
@@ -13,9 +13,11 @@
if(!loc)
if(client)
for(var/obj/effect/landmark/error/E in GLOB.landmarks_list)
loc = E.loc
forceMove(E.loc)
break
message_admins("[key_name_admin(src)] was found to have no .loc with an attached client, if the cause is unknown it would be wise to ask how this was accomplished.")
var/msg = "[key_name_admin(src)] was found to have no .loc with an attached client, if the cause is unknown it would be wise to ask how this was accomplished."
message_admins(msg)
send2irc_adminless_only("Mob", msg, R_ADMIN)
log_game("[key_name(src)] was found to have no .loc with an attached client.")
else
return
+11 -6
View File
@@ -39,7 +39,6 @@
ranged_ability.remove_ranged_ability(src)
if(buckled)
buckled.unbuckle_mob(src,force=1)
QDEL_NULL(riding_datum)
for(var/mob/living/simple_animal/drone/D in GLOB.player_list)
for(var/image/I in staticOverlays)
@@ -955,11 +954,6 @@
"[C] leaps out of [src]'s way!")]</span>")
C.Knockdown(40)
/mob/living/post_buckle_mob(mob/living/M)
if(riding_datum)
riding_datum.handle_vehicle_offsets()
riding_datum.handle_vehicle_layer()
/mob/living/ConveyorMove()
if((movement_type & FLYING) && !stat)
return
@@ -1023,3 +1017,14 @@
/mob/living/proc/add_abilities_to_panel()
for(var/obj/effect/proc_holder/A in abilities)
statpanel("[A.panel]",A.get_panel_text(),A)
/mob/living/lingcheck()
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
if(changeling.changeling_speak)
return LINGHIVE_LING
return LINGHIVE_OUTSIDER
if(mind && mind.linglink)
return LINGHIVE_LINK
return LINGHIVE_NONE
+1 -1
View File
@@ -78,4 +78,4 @@
var/last_words //used for database logging
var/list/obj/effect/proc_holder/abilities = list()
var/list/obj/effect/proc_holder/abilities = list()
+12 -70
View File
@@ -72,6 +72,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/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)
var/key = get_key(message)
var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE)
@@ -134,8 +135,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// AIs use inherent channels for the holopad. Most inherent channels
// ignore the language argument however.
if(handle_inherent_channels(message, message_mode, language)) //Hiveminds, binary chat & holopad.
return
var/datum/saymode/SM = SSradio.saymodes[key]
if(key && SM)
if(!SM.handle_message(src, message, language))
return
if(!can_speak_vocal(message))
to_chat(src, "<span class='warning'>You find yourself unable to speak!</span>")
@@ -264,7 +268,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30)
/mob/proc/binarycheck()
return 0
return FALSE
/mob/living/can_speak(message) //For use outside of Say()
if(can_speak_basic(message) && can_speak_vocal(message))
@@ -307,6 +311,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/key_symbol = lowertext(copytext(message, 2, 3))
return GLOB.department_radio_keys[key_symbol]
/mob/living/proc/get_key(message)
var/key = copytext(message, 1, 2)
if(key in GLOB.department_radio_prefixes)
return lowertext(copytext(message, 2, 3))
/mob/living/proc/get_message_language(message)
if(copytext(message, 1, 2) == ",")
var/key = copytext(message, 2, 3)
@@ -316,60 +325,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return LD
return null
/mob/living/proc/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_CHANGELING)
switch(lingcheck())
if(3)
var/msg = "<i><font color=#800040><b>[src.mind]:</b> [message]</font></i>"
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, src)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(3)
to_chat(M, msg)
if(2)
to_chat(M, msg)
if(1)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense an outsider trying to communicate through the hivemind...</font></i>")
if(2)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
var/msg = "<i><font color=#800080><b>[changeling.changelingID]:</b> [message]</font></i>"
log_talk(src,"[changeling.changelingID]/[key] : [message]",LOGSAY)
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, src)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(3)
to_chat(M, msg)
if(2)
to_chat(M, msg)
if(1)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense another of our kind trying to communicate through the hivemind...</font></i>")
if(1)
to_chat(src, "<i><font color=#800080>Our senses have not evolved enough to be able to communicate this way...</font></i>")
return TRUE
if(message_mode == MODE_ALIEN)
if(hivecheck())
alien_talk(message)
return TRUE
if(message_mode == MODE_VOCALCORDS)
if(iscarbon(src))
var/mob/living/carbon/C = src
var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
if(V && V.can_speak_with())
V.handle_speech(message) //message
V.speak_with(message) //action
return TRUE
return FALSE
/mob/living/proc/treat_message(message)
if(getBrainLoss() >= 60)
message = derpspeech(message, stuttering)
@@ -408,22 +363,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return ITALICS | REDUCE_RANGE
if(MODE_BINARY)
if(binarycheck())
robot_talk(message)
return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs.
return 0
/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind.
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
if(changeling.changeling_speak)
return 2
return 1
if(mind && mind.linglink)
return 3
return 0
/mob/living/say_mod(input, message_mode)
if(message_mode == MODE_WHISPER)
. = verb_whisper
+2 -2
View File
@@ -25,6 +25,7 @@
see_in_dark = 8
med_hud = DATA_HUD_MEDICAL_BASIC
sec_hud = DATA_HUD_SECURITY_BASIC
d_hud = DATA_HUD_DIAGNOSTIC_ADVANCED
mob_size = MOB_SIZE_LARGE
var/list/network = list("SS13")
var/obj/machinery/camera/current = null
@@ -88,8 +89,7 @@
. = ..()
if(!target_ai) //If there is no player/brain inside.
new/obj/structure/AIcore/deactivated(loc) //New empty terminal.
qdel(src)//Delete AI.
return
return INITIALIZE_HINT_QDEL //Delete AI.
if(L && istype(L, /datum/ai_laws))
laws = L
@@ -31,15 +31,6 @@
else
return ..()
/mob/living/silicon/ai/handle_inherent_channels(message, message_mode, language)
. = ..()
if(.)
return .
if(message_mode == MODE_HOLOPAD)
holopad_talk(message, language)
return 1
//For holopads only. Usable by AI.
/mob/living/silicon/ai/proc/holopad_talk(message, language)
@@ -79,6 +79,12 @@
. = ..()
. += slowdown
/mob/living/silicon/pai/can_unbuckle()
return FALSE
/mob/living/silicon/pai/can_buckle()
return FALSE
/mob/living/silicon/pai/Destroy()
GLOB.pai_list -= src
return ..()
@@ -1151,8 +1151,7 @@
if(!is_type_in_typecache(M, can_ride_typecache))
M.visible_message("<span class='warning'>[M] really can't seem to mount [src]...</span>")
return
if(!riding_datum)
riding_datum = new /datum/riding/cyborg(src)
var/datum/component/riding/riding_datum = LoadComponent(/datum/component/riding/cyborg)
if(buckled_mobs)
if(buckled_mobs.len >= max_buckled_mobs)
return
@@ -1175,7 +1174,8 @@
/mob/living/silicon/robot/unbuckle_mob(mob/user)
if(iscarbon(user))
if(riding_datum)
GET_COMPONENT(riding_datum, /datum/component/riding)
if(istype(riding_datum))
riding_datum.unequip_buckle_inhands(user)
riding_datum.restore_position(user)
. = ..(user)
@@ -25,7 +25,6 @@
var/clean_on_move = FALSE
var/did_feedback = FALSE
var/feedback_key
var/hat_offset = -3
@@ -227,8 +226,7 @@
R.notify_ai(NEW_MODULE)
if(R.hud_used)
R.hud_used.update_robot_modules_display()
if(feedback_key && !did_feedback)
SSblackbox.inc(feedback_key, 1)
SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.module)
/obj/item/robot_module/standard
name = "Standard"
@@ -254,7 +252,6 @@
/obj/item/clockwork/weapon/ratvarian_spear,
/obj/item/clockwork/replica_fabricator/cyborg)
moduleselect_icon = "standard"
feedback_key = "cyborg_standard"
hat_offset = -3
/obj/item/robot_module/medical
@@ -285,7 +282,6 @@
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "medical"
moduleselect_icon = "medical"
feedback_key = "cyborg_medical"
can_be_pushed = FALSE
hat_offset = 3
@@ -321,7 +317,6 @@
/obj/item/clockwork/replica_fabricator/cyborg)
cyborg_base_icon = "engineer"
moduleselect_icon = "engineer"
feedback_key = "cyborg_engineering"
magpulsing = TRUE
hat_offset = INFINITY // No hats
@@ -338,7 +333,6 @@
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "sec"
moduleselect_icon = "security"
feedback_key = "cyborg_security"
can_be_pushed = FALSE
hat_offset = 3
@@ -359,7 +353,6 @@
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "k9"
moduleselect_icon = "k9"
feedback_key = "cyborg_k9"
can_be_pushed = FALSE
hat_offset = INFINITY
@@ -395,7 +388,6 @@
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "medihound"
moduleselect_icon = "medihound"
feedback_key = "cyborg_medihound"
can_be_pushed = FALSE
hat_offset = INFINITY
@@ -418,7 +410,6 @@
/obj/item/clockwork/replica_fabricator/cyborg)
cyborg_base_icon = "scrubpup"
moduleselect_icon = "scrubpup"
feedback_key = "cyborg_scrubpup"
hat_offset = INFINITY
clean_on_move = TRUE
@@ -467,7 +458,6 @@
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "peace"
moduleselect_icon = "standard"
feedback_key = "cyborg_peacekeeper"
can_be_pushed = FALSE
hat_offset = -2
@@ -496,7 +486,6 @@
/obj/item/clockwork/replica_fabricator/cyborg)
cyborg_base_icon = "janitor"
moduleselect_icon = "janitor"
feedback_key = "cyborg_janitor"
hat_offset = -5
clean_on_move = TRUE
@@ -548,7 +537,6 @@
/obj/item/borg/sight/xray/truesight_lens)
moduleselect_icon = "service"
special_light_key = "service"
feedback_key = "cyborg_service"
hat_offset = 0
/obj/item/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
@@ -601,7 +589,6 @@
/obj/item/borg/sight/xray/truesight_lens)
cyborg_base_icon = "miner"
moduleselect_icon = "miner"
feedback_key = "cyborg_miner"
hat_offset = 0
/obj/item/robot_module/syndicate
@@ -19,8 +19,3 @@
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
if(!magpulse)
return ..()
/mob/living/silicon/robot/Moved()
. = ..()
if(riding_datum)
riding_datum.on_vehicle_move()
-11
View File
@@ -57,14 +57,3 @@
return MODE_ROBOT
else
return .
/mob/living/silicon/handle_inherent_channels(message, message_mode)
. = ..()
if(.)
return .
if(message_mode == MODE_BINARY)
if(binarycheck())
robot_talk(message)
return 1
return 0
+3 -3
View File
@@ -33,7 +33,7 @@
var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use
var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use
var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud
var/d_hud = DATA_HUD_DIAGNOSTIC_BASIC //Determines the diag hud to use
var/law_change_counter = 0
var/obj/machinery/camera/builtInCamera = null
@@ -42,8 +42,8 @@
/mob/living/silicon/Initialize()
. = ..()
GLOB.silicon_mobs += src
var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
diag_hud_set_status()
diag_hud_set_health()
+143 -69
View File
@@ -1,5 +1,3 @@
//Defines for bots are now found in code\__DEFINES\bots.dm
// AI (i.e. game AI, not the AI player) controlled bots
/mob/living/simple_animal/bot
icon = 'icons/mob/aibots.dmi'
@@ -50,7 +48,7 @@
var/frustration = 0 //Used by some bots for tracking failures to reach their target.
var/base_speed = 2 //The speed at which the bot moves, or the number of times it moves per process() tick.
var/turf/ai_waypoint //The end point of a bot's path, or the target location.
var/list/path = list() //List of turfs through which a bot 'steps' to reach the waypoint.
var/list/path = list() //List of turfs through which a bot 'steps' to reach the waypoint, associated with the path image, if there is one.
var/pathset = 0
var/list/ignore_list = list() //List of unreachable targets for an ignore-list enabled bot to ignore.
var/mode = BOT_IDLE //Standardizes the vars that indicate the bot is busy with its function.
@@ -77,15 +75,21 @@
var/beacon_freq = 1445 // navigation beacon frequency
var/model = "" //The type of bot it is.
var/bot_type = 0 //The type of bot it is, for radio control.
var/data_hud_type = DATA_HUD_DIAGNOSTIC //The type of data HUD the bot uses. Diagnostic by default.
var/data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC //The type of data HUD the bot uses. Diagnostic by default.
//This holds text for what the bot is mode doing, reported on the remote bot control interface.
var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \
"Beginning Patrol", "Patrolling", "Summoned by PDA", \
"Cleaning", "Repairing", "Proceeding to work site", "Healing", \
"Proceeding to AI waypoint", "Navigating to Delivery Location", "Navigating to Home", \
"Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination")
//This holds text for what the bot is mode doing, reported on the remote bot control interface.
var/datum/atom_hud/data/bot_path/path_hud = new /datum/atom_hud/data/bot_path()
var/path_image_icon = 'icons/mob/aibots.dmi'
var/path_image_icon_state = "path_indicator"
var/path_image_color = "#FFFFFF"
var/reset_access_timer_id
var/ignorelistcleanuptimer = 1 // This ticks up every automated action, at 300 we clean the ignore list
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD) //Diagnostic HUD views
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) //Diagnostic HUD views
/mob/living/simple_animal/bot/proc/get_mode()
if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player.
@@ -102,12 +106,12 @@
/mob/living/simple_animal/bot/proc/turn_on()
if(stat)
return 0
return FALSE
on = TRUE
set_light(initial(light_range))
update_icon()
diag_hud_set_botstat()
return 1
return TRUE
/mob/living/simple_animal/bot/proc/turn_off()
on = FALSE
@@ -117,6 +121,7 @@
/mob/living/simple_animal/bot/Initialize()
. = ..()
GLOB.bots_list += src
access_card = new /obj/item/card/id(src)
//This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first.
access_card.access += ACCESS_ROBOTICS
@@ -132,15 +137,19 @@
//Adds bot to the diagnostic HUD system
prepare_huds()
var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
diag_hud_set_bothealth()
diag_hud_set_botstat()
diag_hud_set_botmode()
//Gives a HUD view to player bots that use a HUD.
activate_data_hud()
//If a bot has its own HUD (for player bots), provide it.
if(data_hud_type)
var/datum/atom_hud/datahud = GLOB.huds[data_hud_type]
datahud.add_hud_to(src)
if(path_hud)
path_hud.add_to_hud(src)
path_hud.add_hud_to(src)
/mob/living/simple_animal/bot/update_canmove()
. = ..()
@@ -149,6 +158,10 @@
canmove = .
/mob/living/simple_animal/bot/Destroy()
if(path_hud)
QDEL_NULL(path_hud)
path_hud = null
GLOB.bots_list -= src
if(paicard)
ejectpai()
qdel(Radio)
@@ -157,7 +170,7 @@
return ..()
/mob/living/simple_animal/bot/bee_friendly()
return 1
return TRUE
/mob/living/simple_animal/bot/death(gibbed)
explode()
@@ -213,6 +226,15 @@
set background = BACKGROUND_ENABLED
diag_hud_set_botmode()
if (ignorelistcleanuptimer % 300 == 0) // Every 300 actions, clean up the ignore list from old junk
for(var/ref in ignore_list)
var/atom/referredatom = locate(ref)
if (!referredatom || !istype(referredatom) || QDELETED(referredatom))
ignore_list -= ref
ignorelistcleanuptimer = 1
else
ignorelistcleanuptimer++
if(!on || client)
return
@@ -223,7 +245,7 @@
if(BOT_SUMMON) //Called by PDA
bot_summon()
return
return 1 //Successful completion. Used to prevent child process() continuing if this one is ended early.
return TRUE //Successful completion. Used to prevent child process() continuing if this one is ended early.
/mob/living/simple_animal/bot/attack_hand(mob/living/carbon/human/H)
@@ -330,7 +352,7 @@
/mob/living/simple_animal/bot/radio(message, message_mode, list/spans, language)
. = ..()
if(. != 0)
return .
return
switch(message_mode)
if(MODE_HEADSET)
@@ -344,7 +366,6 @@
if(message_mode in GLOB.radiochannels)
Radio.talk_into(src, message, message_mode, spans, language)
return REDUCE_RANGE
return 0
//Generalized behavior code, override where needed!
@@ -386,15 +407,15 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
/mob/living/simple_animal/bot/proc/checkscan(scan, scan_type, old_target)
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
return 0 //If not, keep searching!
if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
return 0
return FALSE //If not, keep searching!
if( (REF(scan) in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
return FALSE
var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
if(scan_result)
return scan_result
else
return 0 //The current element failed assessment, move on to the next.
return FALSE //The current element failed assessment, move on to the next.
return
/mob/living/simple_animal/bot/proc/check_bot(targ)
@@ -402,7 +423,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
if(T)
for(var/C in T.contents)
if(istype(C,type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother.
return 1 //Let's abort if we find a bot so we dont have to keep rechecking
return TRUE //Let's abort if we find a bot so we dont have to keep rechecking
//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default.
/mob/living/simple_animal/bot/proc/process_scan(scan_target)
@@ -411,27 +432,26 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
/mob/living/simple_animal/bot/proc/add_to_ignore(subject)
if(ignore_list.len < 50) //This will help keep track of them, so the bot is always trying to reach a blocked spot.
ignore_list |= subject
else if(ignore_list.len >= subject) //If the list is full, insert newest, delete oldest.
ignore_list -= ignore_list[1]
ignore_list |= subject
ignore_list += REF(subject)
else //If the list is full, insert newest, delete oldest.
ignore_list.Cut(1,2)
ignore_list += REF(subject)
/*
Movement proc for stepping a bot through a path generated through A-star.
Pass a positive integer as an argument to override a bot's default speed.
*/
/mob/living/simple_animal/bot/proc/bot_move(dest, move_speed)
if(!dest || !path || path.len == 0) //A-star failed or a path/destination was not set.
path = list()
return 0
set_path(null)
return FALSE
dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else.
var/turf/last_node = get_turf(path[path.len]) //This is the turf at the end of the path, it should be equal to dest.
if(get_turf(src) == dest) //We have arrived, no need to move again.
return 1
return TRUE
else if(dest != last_node) //The path should lead us to our given destination. If this is not true, we must stop.
path = list()
return 0
set_path(null)
return FALSE
var/step_count = move_speed ? move_speed : base_speed //If a value is passed into move_speed, use that instead of the default speed var.
if(step_count >= 1 && tries < BOT_STEP_MAX_RETRIES)
@@ -439,25 +459,25 @@ Pass a positive integer as an argument to override a bot's default speed.
spawn(BOT_STEP_DELAY*step_number)
bot_step(dest)
else
return 0
return 1
return FALSE
return TRUE
/mob/living/simple_animal/bot/proc/bot_step(dest) //Step,increase tries if failed
if(!path)
return 0
return FALSE
if(path.len > 1)
step_towards(src, path[1])
if(get_turf(src) == path[1]) //Successful move
path -= path[1]
increment_path()
tries = 0
else
tries++
return 0
return FALSE
else if(path.len == 1)
step_to(src, dest)
path = list()
return 1
set_path(null)
return TRUE
/mob/living/simple_animal/bot/proc/check_bot_access()
@@ -468,15 +488,12 @@ Pass a positive integer as an argument to override a bot's default speed.
bot_reset() //Reset a bot before setting it to call mode.
var/area/end_area = get_area(waypoint)
if(client) //Player bots instead get a location command from the AI
to_chat(src, "<span class='noticebig'>Priority waypoint set by [icon2html(caller, src)] <b>[caller]</b>. Proceed to <b>[end_area.name]<\b>.")
//For giving the bot temporary all-access.
var/obj/item/card/id/all_access = new /obj/item/card/id
var/datum/job/captain/All = new/datum/job/captain
all_access.access = All.get_access()
path = get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access)
set_path(get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access))
calling_ai = caller //Link the AI to the bot!
ai_waypoint = waypoint
@@ -484,6 +501,9 @@ Pass a positive integer as an argument to override a bot's default speed.
if(!on)
turn_on() //Saves the AI the hassle of having to activate a bot manually.
access_card = all_access //Give the bot all-access while under the AI's command.
if(client)
reset_access_timer_id = addtimer(CALLBACK (src, .proc/bot_reset), 600, TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time
to_chat(src, "<span class='notice'><span class='big'>Priority waypoint set by [icon2html(calling_ai, src)] <b>[caller]</b>. Proceed to <b>[end_area.name]</b>.</span><br>[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.</span>")
if(message)
to_chat(calling_ai, "<span class='notice'>[icon2html(src, calling_ai)] [name] called to [end_area.name]. [path.len-1] meters to destination.</span>")
pathset = 1
@@ -493,7 +513,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(message)
to_chat(calling_ai, "<span class='danger'>Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.</span>")
calling_ai = null
path = list()
set_path(null)
/mob/living/simple_animal/bot/proc/call_mode() //Handles preparing a bot for a call, as well as calling the move proc.
//Handles the bot's movement during a call.
@@ -508,7 +528,10 @@ Pass a positive integer as an argument to override a bot's default speed.
if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot.
to_chat(calling_ai, "<span class='danger'>Call command to a bot has been reset.</span>")
calling_ai = null
path = list()
if(reset_access_timer_id)
deltimer(reset_access_timer_id)
reset_access_timer_id = null
set_path(null)
summon_target = null
pathset = 0
access_card.access = prev_access
@@ -571,9 +594,8 @@ Pass a positive integer as an argument to override a bot's default speed.
return
else if(path.len > 0 && patrol_target) // valid path
var/turf/next = path[1]
if(next == loc)
path -= next
if(path[1] == loc)
increment_path()
return
@@ -608,7 +630,7 @@ Pass a positive integer as an argument to override a bot's default speed.
destination = new_destination //We now know the name of where we want to go.
patrol_target = NB.loc //Get its location and set it as the target.
next_destination = NB.codes["next_patrol"] //Also get the name of the next beacon in line.
return 1
return TRUE
/mob/living/simple_animal/bot/proc/find_nearest_beacon()
for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[z]"])
@@ -630,7 +652,7 @@ Pass a positive integer as an argument to override a bot's default speed.
//PDA control. Some bots, especially MULEs, may have more parameters.
/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, turf/user_turf, list/user_access = list())
if(!on || emagged == 2 || remote_disabled) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands.
return 1 //ACCESS DENIED
return TRUE //ACCESS DENIED
if(client)
bot_control_message(command,user,user_turf,user_access)
// process control input
@@ -685,12 +707,12 @@ Pass a positive integer as an argument to override a bot's default speed.
// given an optional turf to avoid
/mob/living/simple_animal/bot/proc/calc_path(turf/avoid)
check_bot_access()
path = get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid)
set_path(get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid))
/mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid)
check_bot_access()
spawn()
path = get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid)
set_path(get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid))
if(!path.len) //Cannot reach target. Give up and announce the issue.
speak("Summon command failed, destination unreachable.",radio_channel)
bot_reset()
@@ -705,9 +727,8 @@ Pass a positive integer as an argument to override a bot's default speed.
return
else if(path.len > 0 && summon_target) //Proper path acquired!
var/turf/next = path[1]
if(next == loc)
path -= next
if(path[1] == loc)
increment_path()
return
var/moved = bot_move(summon_target, 3) // Move attempt
@@ -749,11 +770,11 @@ Pass a positive integer as an argument to override a bot's default speed.
if(href_list["close"])// HUE HUE
if(usr in users)
users.Remove(usr)
return 1
return TRUE
if(topic_denied(usr))
to_chat(usr, "<span class='warning'>[src]'s interface is not responding!</span>")
return 1
return TRUE
add_fingerprint(usr)
if((href_list["power"]) && (bot_core.allowed(usr) || !locked))
@@ -800,18 +821,18 @@ Pass a positive integer as an argument to override a bot's default speed.
. = ..()
owner = loc
if(!istype(owner))
qdel(src)
return INITIALIZE_HINT_QDEL
/mob/living/simple_animal/bot/proc/topic_denied(mob/user) //Access check proc for bot topics! Remember to place in a bot's individual Topic if desired.
if(!user.canUseTopic(src))
return 1
return TRUE
// 0 for access, 1 for denied.
if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it.
if(!hacked) //Manually emagged by a human - access denied to all.
return 1
return TRUE
else if(!issilicon(user) && !IsAdminGhost(user)) //Bot is hacked, so only silicons and admins are allowed access.
return 1
return 0
return TRUE
return FALSE
/mob/living/simple_animal/bot/proc/hack(mob/user)
var/hack
@@ -857,7 +878,7 @@ Pass a positive integer as an argument to override a bot's default speed.
faction = user.faction.Copy()
language_holder = paicard.pai.language_holder.copy(src)
add_logs(user, paicard.pai, "uploaded to [bot_name],")
return 1
return TRUE
else
to_chat(user, "<span class='warning'>[card] is inactive.</span>")
else
@@ -894,7 +915,6 @@ Pass a positive integer as an argument to override a bot's default speed.
. = ..()
access_card.access += player_access
diag_hud_set_botmode()
activate_data_hud()
/mob/living/simple_animal/bot/Logout()
. = ..()
@@ -914,9 +934,63 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/sentience_act()
faction -= "silicon"
/mob/living/simple_animal/bot/proc/activate_data_hud()
//If a bot has its own HUD (for player bots), provide it.
if(!data_hud_type)
/mob/living/simple_animal/bot/proc/set_path(list/newpath)
path = newpath ? newpath : list()
if(!path_hud)
return
var/datum/atom_hud/datahud = GLOB.huds[data_hud_type]
datahud.add_hud_to(src)
var/list/path_huds_watching_me = list(GLOB.huds[DATA_HUD_DIAGNOSTIC_ADVANCED])
if(path_hud)
path_huds_watching_me += path_hud
for(var/V in path_huds_watching_me)
var/datum/atom_hud/H = V
H.remove_from_hud(src)
var/list/path_images = hud_list[DIAG_PATH_HUD]
QDEL_LIST(path_images)
if(newpath)
for(var/i in 1 to newpath.len)
var/turf/T = newpath[i]
var/direction = NORTH
if(i > 1)
var/turf/prevT = path[i - 1]
var/image/prevI = path[prevT]
direction = get_dir(prevT, T)
if(i > 2)
var/turf/prevprevT = path[i - 2]
var/prevDir = get_dir(prevprevT, prevT)
var/mixDir = direction|prevDir
if(mixDir in GLOB.diagonals)
prevI.dir = mixDir
if(prevDir & (NORTH|SOUTH))
var/matrix/ntransform = matrix()
ntransform.Turn(90)
if((mixDir == NORTHWEST) || (mixDir == SOUTHEAST))
ntransform.Scale(-1, 1)
else
ntransform.Scale(1, -1)
prevI.transform = ntransform
var/mutable_appearance/MA = new /mutable_appearance()
MA.icon = path_image_icon
MA.icon_state = path_image_icon_state
MA.layer = ABOVE_OPEN_TURF_LAYER
MA.plane = 0
MA.appearance_flags = RESET_COLOR|RESET_TRANSFORM
MA.color = path_image_color
MA.dir = direction
var/image/I = image(loc = T)
I.appearance = MA
path[T] = I
path_images += I
for(var/V in path_huds_watching_me)
var/datum/atom_hud/H = V
H.add_to_hud(src)
/mob/living/simple_animal/bot/proc/increment_path()
if(!path || !path.len)
return
var/image/I = path[path[1]]
if(I)
I.icon = null
path.Cut(1, 2)
@@ -16,6 +16,7 @@
window_id = "autoclean"
window_name = "Automatic Station Cleaner v1.2"
pass_flags = PASSMOB
path_image_color = "#993299"
var/blood = 1
var/trash = 0
@@ -257,7 +258,7 @@
/mob/living/simple_animal/bot/cleanbot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/reagent_containers/glass/bucket(Tsec)
@@ -21,6 +21,7 @@
window_name = "Automatic Security Unit v2.6"
allow_pai = 0
data_hud_type = DATA_HUD_SECURITY_ADVANCED
path_image_color = "#FF0000"
var/lastfired = 0
var/shot_delay = 15
@@ -371,24 +372,24 @@ Auto Patrol[]"},
/mob/living/simple_animal/bot/ed209/explode()
walk_to(src,0)
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
var/obj/item/ed209_assembly/Sa = new /obj/item/ed209_assembly(Tsec)
var/obj/item/ed209_assembly/Sa = new (Tsec)
Sa.build_step = 1
Sa.add_overlay("hs_hole")
Sa.created_name = name
new /obj/item/device/assembly/prox_sensor(Tsec)
if(!lasercolor)
var/obj/item/gun/energy/e_gun/advtaser/G = new /obj/item/gun/energy/e_gun/advtaser(Tsec)
var/obj/item/gun/energy/e_gun/advtaser/G = new (Tsec)
G.cell.charge = 0
G.update_icon()
else if(lasercolor == "b")
var/obj/item/gun/energy/laser/bluetag/G = new /obj/item/gun/energy/laser/bluetag(Tsec)
var/obj/item/gun/energy/laser/bluetag/G = new (Tsec)
G.cell.charge = 0
G.update_icon()
else if(lasercolor == "r")
var/obj/item/gun/energy/laser/redtag/G = new /obj/item/gun/energy/laser/redtag(Tsec)
var/obj/item/gun/energy/laser/redtag/G = new (Tsec)
G.cell.charge = 0
G.update_icon()
@@ -17,6 +17,7 @@
bot_core = /obj/machinery/bot_core/floorbot
window_id = "autofloor"
window_name = "Automatic Station Floor Repairer v1.1"
path_image_color = "#FFA500"
var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details.
var/targetdirection
@@ -162,7 +163,7 @@
update_controls()
/mob/living/simple_animal/bot/floorbot/proc/empty_tiles()
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
while(specialtiles > initial(tiletype.max_amount))
new tiletype(Tsec,initial(tiletype.max_amount))
@@ -363,9 +364,9 @@
/mob/living/simple_animal/bot/floorbot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
var/obj/item/storage/toolbox/mechanical/N = new /obj/item/storage/toolbox/mechanical(Tsec)
var/obj/item/storage/toolbox/mechanical/N = new (Tsec)
N.contents = list()
new /obj/item/device/assembly/prox_sensor(Tsec)
@@ -18,6 +18,7 @@
window_id = "autohonk"
window_name = "Honkomatic Bike Horn Unit v1.0.7"
data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs
path_image_color = "#FF69B4"
var/honksound = 'sound/items/bikehorn.ogg' //customizable sound
var/spam_flag = FALSE
@@ -327,14 +328,14 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
walk_to(src,0)
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
//doesn't drop cardboard nor its assembly, since its a very frail material.
if(prob(50))
new /obj/item/bodypart/l_arm/robot/(Tsec)
new /obj/item/bodypart/l_arm/robot(Tsec)
new /obj/item/bikehorn(Tsec)
new /obj/item/device/assembly/prox_sensor(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
var/datum/effect_system/spark_spread/s = new
s.set_up(3, 1, src)
s.start()
@@ -25,6 +25,7 @@
window_id = "automed"
window_name = "Automatic Medical Unit v1.1"
data_hud_type = DATA_HUD_MEDICAL_ADVANCED
path_image_color = "#DDDDFF"
var/obj/item/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
@@ -194,7 +195,7 @@
use_beaker = !use_beaker
else if(href_list["eject"] && (!isnull(reagent_glass)))
reagent_glass.loc = get_turf(src)
reagent_glass.forceMove(drop_location())
reagent_glass = null
else if(href_list["togglevoice"])
@@ -342,7 +343,7 @@
//Time to see if they need medical help!
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
return FALSE //welp too late for them!
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
return FALSE
@@ -516,7 +517,7 @@
/mob/living/simple_animal/bot/medbot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/storage/firstaid(Tsec)
@@ -525,7 +526,7 @@
new /obj/item/device/healthanalyzer(Tsec)
if(reagent_glass)
reagent_glass.loc = Tsec
reagent_glass.forceMove(Tsec)
reagent_glass = null
if(prob(50))
@@ -31,6 +31,8 @@
suffix = ""
path_image_color = "#7F5200"
var/atom/movable/load = null
var/mob/living/passenger = null
var/turf/target // this is turf to navigate to (location of beacon)
@@ -377,12 +379,11 @@
return FALSE
/mob/living/simple_animal/bot/mulebot/post_buckle_mob(mob/living/M)
if(M in buckled_mobs) //post buckling
M.pixel_y = initial(M.pixel_y) + 9
if(M.layer < layer)
M.layer = layer + 0.01
M.pixel_y = initial(M.pixel_y) + 9
if(M.layer < layer)
M.layer = layer + 0.01
else //post unbuckling
/mob/living/simple_animal/bot/mulebot/post_unbuckle_mob(mob/living/M)
load = null
M.layer = initial(M.layer)
M.pixel_y = initial(M.pixel_y)
@@ -697,14 +698,14 @@
/mob/living/simple_animal/bot/mulebot/explode()
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/device/assembly/prox_sensor(Tsec)
new /obj/item/stack/rods(Tsec)
new /obj/item/stack/rods(Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
if(cell)
cell.loc = Tsec
cell.forceMove(Tsec)
cell.update_icon()
cell = null
@@ -20,6 +20,7 @@
window_name = "Automatic Security Unit v1.6"
allow_pai = 0
data_hud_type = DATA_HUD_SECURITY_ADVANCED
path_image_color = "#FF0000"
var/mob/living/carbon/target
var/oldtarget_name
@@ -50,11 +51,11 @@
/mob/living/simple_animal/bot/secbot/beepsky/explode()
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/stock_parts/cell/potato(Tsec)
var/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/S = new(Tsec)
S.reagents.add_reagent("whiskey", 15)
S.on_reagent_change()
S.on_reagent_change(ADD_REAGENT)
..()
/mob/living/simple_animal/bot/secbot/pingsky
@@ -399,9 +400,9 @@ Auto Patrol: []"},
walk_to(src,0)
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec)
var/obj/item/secbot_assembly/Sa = new (Tsec)
Sa.build_step = 1
Sa.add_overlay("hs_hole")
Sa.created_name = name
@@ -18,7 +18,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
verb_say = "flutters"
verb_ask = "flutters inquisitively"
verb_exclaim = "flutters intensely"
@@ -28,7 +28,7 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
devourable = TRUE
no_vore = FALSE
@@ -81,7 +81,7 @@
icon_living = "cat"
icon_dead = "cat_dead"
gender = FEMALE
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
var/list/family = list()//var restored from savefile, has count of each child type
var/list/children = list()//Actual mob instances of children
var/cats_deployed = 0
@@ -154,7 +154,7 @@
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
gender = MALE
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/pet/cat/Life()
if(!stat && !buckled && !client)
@@ -282,4 +282,4 @@
..()
if(L.a_intent == INTENT_HARM && L.reagents && !stat)
L.reagents.add_reagent("nutriment", 0.4)
L.reagents.add_reagent("vitamin", 0.4)
L.reagents.add_reagent("vitamin", 0.4)
@@ -18,7 +18,7 @@
speak_emote = list("chitters")
density = FALSE
ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
verb_say = "chitters"
verb_ask = "chitters inquisitively"
verb_exclaim = "chitters loudly"
@@ -19,7 +19,7 @@
ventcrawler = VENTCRAWLER_ALWAYS
var/obj/item/inventory_head
var/obj/item/inventory_mask
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
devourable = TRUE
/mob/living/simple_animal/crab/Life()
@@ -44,7 +44,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
gold_core_spawnable = FALSE
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/crab/evil
name = "Evil Crab"
@@ -56,7 +56,7 @@
response_help = "pokes"
response_disarm = "shoves"
response_harm = "stomps"
gold_core_spawnable = TRUE
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/crab/kreb
name = "Kreb"
@@ -68,7 +68,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
gold_core_spawnable = FALSE
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/crab/evil/kreb
name = "Evil Kreb"
@@ -31,7 +31,7 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/nofur = 0 //Corgis that have risen past the material plane of existence.
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/pet/dog/pug
name = "\improper pug"
@@ -42,7 +42,7 @@
icon_living = "pug"
icon_dead = "pug_dead"
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3)
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/pet/dog/Initialize()
. = ..()
@@ -290,7 +290,7 @@
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
var/age = 0
var/record_age = 1
var/memory_saved = FALSE
@@ -310,7 +310,7 @@
P.gender = MALE
P.desc = "It's the HoP's beloved corgi puppy."
Write_Memory(FALSE)
qdel(src)
return INITIALIZE_HINT_QDEL
else if(age == record_age)
icon_state = "old_corgi"
icon_living = "old_corgi"
@@ -438,7 +438,7 @@
icon_living = "narsian"
icon_dead = "narsian_dead"
faction = list("dog", "cult")
gold_core_spawnable = FALSE
gold_core_spawnable = NO_SPAWN
nofur = TRUE
/mob/living/simple_animal/pet/dog/corgi/narsie/Life()
@@ -560,7 +560,7 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/puppies = 0
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list)
@@ -102,8 +102,8 @@
else
verbs -= /mob/living/simple_animal/drone/verb/toggle_statics
var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
/mob/living/simple_animal/drone/med_hud_set_health()
@@ -34,7 +34,8 @@
/mob/living/simple_animal/drone/syndrone/Initialize()
. = ..()
internal_storage.hidden_uplink.telecrystals = 10
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
hidden_uplink.telecrystals = 10
/mob/living/simple_animal/drone/syndrone/Login()
..()
@@ -47,7 +48,8 @@
/mob/living/simple_animal/drone/syndrone/badass/Initialize()
. = ..()
internal_storage.hidden_uplink.telecrystals = 30
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
hidden_uplink.telecrystals = 30
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(src)
W.implant(src)
@@ -3,14 +3,6 @@
/////////////
//Drone speach
/mob/living/simple_animal/drone/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_BINARY)
drone_chat(message)
return 1
else
..()
/mob/living/simple_animal/drone/get_spans()
return ..() | SPAN_ROBOT
@@ -117,7 +117,7 @@
health = 50
maxHealth = 50
var/obj/item/udder/udder = null
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
blood_volume = BLOOD_VOLUME_NORMAL
devourable = TRUE
no_vore = FALSE
@@ -195,7 +195,7 @@
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
devourable = TRUE
/mob/living/simple_animal/chick/Initialize()
@@ -250,7 +250,7 @@
var/list/feedMessages = list("It clucks happily.","It clucks happily.")
var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
var/list/validColors = list("brown","black","white")
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
var/static/chicken_count = 0
devourable = TRUE
no_vore = FALSE
@@ -17,7 +17,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
devourable = TRUE
var/mob/living/simple_animal/mouse/movement_target
var/turns_since_scan = 0
@@ -65,4 +65,4 @@
name = "Renault"
desc = "Renault, the Captain's trustworthy fox."
gender = FEMALE
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
@@ -18,7 +18,7 @@
density = FALSE
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
devourable = TRUE
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
@@ -22,7 +22,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
var/body_color //brown, gray and white, leave blank for random
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
var/chew_probability = 1
devourable = TRUE
@@ -99,7 +99,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/obj/item/reagent_containers/food/snacks/deadmouse
name = "dead mouse"
@@ -23,7 +23,7 @@
icon_living = "penguin"
icon_dead = "penguin_dead"
butcher_results = list()
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/pet/penguin/emperor/shamebrero
name = "Shamebrero penguin"
@@ -14,20 +14,20 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
melee_damage_lower = 18
melee_damage_upper = 18
health = 50
maxHealth = 50
speed = 2
speed = 10
glide_size = 2
devourable = TRUE
//Cargo Sloth
/mob/living/simple_animal/sloth/paperwork
name = "Paperwork"
desc = "Cargo's pet sloth. About as useful as the rest of the techs."
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
//Cargo Sloth 2
@@ -39,4 +39,4 @@
icon_dead = "cool_sloth_dead"
gender = FEMALE
butcher_results = list(/obj/item/toy/spinningtoy = 1)
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
@@ -117,3 +117,9 @@
var/list/guardians = spawner.summoner.hasparasites()
for(var/para in guardians)
to_chat(para, "<span class='danger'><B>[AM] has crossed surveillance snare, [name].</span></B>")
/obj/effect/snare/singularity_act()
return
/obj/effect/snare/singularity_pull()
return
@@ -32,7 +32,7 @@
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
unique_name = 1
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
death_sound = 'sound/voice/hiss6.ogg'
deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
devourable = TRUE
@@ -139,7 +139,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 10,
/obj/item/stack/sheet/animalhide/xeno = 2)
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/obj/item/projectile/neurotox
name = "neurotoxin"
@@ -161,7 +161,7 @@
friendly = "caresses"
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
@@ -36,7 +36,7 @@
maxbodytemp = 1500
faction = list("russian")
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
devourable = TRUE
no_vore = FALSE
@@ -37,7 +37,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
movement_type = FLYING
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
search_objects = 1 //have to find those plant trays!
//Spaceborn beings don't get hurt by space
@@ -35,7 +35,7 @@
faction = list("carp")
movement_type = FLYING
pressure_resistance = 200
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. = ..()
@@ -47,7 +47,7 @@
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
del_on_death = 1
/mob/living/simple_animal/hostile/carp/megacarp
@@ -92,7 +92,7 @@
desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot."
gender = FEMALE
speak_emote = list("squeaks")
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
faction = list("syndicate")
AIStatus = AI_OFF
@@ -13,6 +13,6 @@
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
speak_emote = list("screams")
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
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
@@ -31,7 +31,7 @@
minbodytemp = 0
faction = list("faithless")
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
. = ..()
@@ -44,7 +44,7 @@
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
unique_name = 1
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
see_in_dark = 4
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
var/playable_spider = FALSE
@@ -152,7 +152,7 @@
move_to_delay = 4
poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe?
speed = 1
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
//tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so.
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula
@@ -170,7 +170,7 @@
speed = 7
status_flags = NONE
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay()
var/turf/T = get_turf(src)
@@ -190,7 +190,7 @@
maxHealth = 40
health = 40
var/datum/action/innate/spider/comm/letmetalkpls
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize()
. = ..()
@@ -208,7 +208,7 @@
maxbodytemp = 1500
poison_type = "frost_oil"
color = rgb(114,228,250)
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice
name = "giant ice spider"
@@ -217,7 +217,7 @@
maxbodytemp = 1500
poison_type = "frost_oil"
color = rgb(114,228,250)
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/poison/giant_spider/hunter/ice
name = "giant ice spider"
@@ -226,7 +226,7 @@
maxbodytemp = 1500
poison_type = "frost_oil"
color = rgb(114,228,250)
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/poison/giant_spider/handle_automated_action()
if(!..()) //AIStatus is off
@@ -67,7 +67,7 @@
var/mob/living/L = target
if(prob(80))
var/atom/throw_target = get_edge_target_turf(L, dir)
L.throw_at(throw_target, rand(1,2), 7, src)
L.throw_at(throw_target, rand(1,2), 7, src)
else
L.Knockdown(20)
visible_message("<span class='danger'>[src] knocks [L] down!</span>")
@@ -76,9 +76,11 @@
var/list/parts = target_bodyparts(target)
return ..() && !istype(the_target, /mob/living/carbon/monkey) && (!parts || parts.len > 3)
/mob/living/simple_animal/hostile/gorilla/CanSmashTurfs(turf/T)
return iswallturf(T)
/mob/living/simple_animal/hostile/gorilla/gib(no_brain)
if(!no_brain)
var/mob/living/brain/B = new(drop_location())
@@ -22,7 +22,7 @@
ventcrawler = VENTCRAWLER_ALWAYS
var/datum/mind/origin
var/egg_lain = 0
// gold_core_spawnable = 1 //are you sure about this??
// gold_core_spawnable = HOSTILE_SPAWN //are you sure about this??
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
@@ -24,7 +24,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
speak_emote = list("states")
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
loot = list(/obj/effect/decal/cleanable/robot_debris)
@@ -14,7 +14,7 @@
var/list/emote_taunt = list()
var/taunt_chance = 0
//typecache of things this mob will attack in DestroySurroundings() if it has environment_smash
//typecache of things this mob will attack in DestroyPathToTarget() if it has environment_smash
var/list/environment_target_typecache = list(
/obj/machinery/door/window,
/obj/structure/window,
@@ -84,7 +84,8 @@
EscapeConfinement()
if(AICanContinue(possible_targets))
DestroySurroundings()
if(!QDELETED(target) && !targets_from.Adjacent(target))
DestroyPathToTarget()
if(!MoveToTarget(possible_targets)) //if we lose our target
if(AIShouldSleep(possible_targets)) // we try to acquire a new one
toggle_ai(AI_IDLE) // otherwise we go idle
@@ -371,24 +372,45 @@
P.preparePixelProjectile(targeted_atom, src)
P.fire()
return P
/mob/living/simple_animal/hostile/proc/CanSmashTurfs(turf/T)
return iswallturf(T) || ismineralturf(T)
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
/mob/living/simple_animal/hostile/proc/DestroyObjectsInDirection(direction)
var/turf/T = get_step(targets_from, direction)
if(T.Adjacent(targets_from))
if(CanSmashTurfs(T))
T.attack_animal(src)
for(var/a in T)
var/atom/A = a
if(is_type_in_typecache(A, environment_target_typecache) && !A.IsObscured())
A.attack_animal(src)
return
/mob/living/simple_animal/hostile/proc/DestroyPathToTarget()
if(environment_smash)
EscapeConfinement()
var/dir_to_target = get_dir(targets_from, target)
var/dir_list = list()
if(dir_to_target in GLOB.diagonals) //it's diagonal, so we need two directions to hit
for(var/direction in GLOB.cardinals)
if(direction & dir_to_target)
dir_list += direction
else
dir_list += dir_to_target
for(var/direction in dir_list) //now we hit all of the directions we got in this fashion, since it's the only directions we should actually need
DestroyObjectsInDirection(direction)
mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with megafauna destroying everything around them
if(environment_smash)
EscapeConfinement()
for(var/dir in GLOB.cardinals)
var/turf/T = get_step(targets_from, dir)
if(CanSmashTurfs(T))
if(T.Adjacent(targets_from))
T.attack_animal(src)
for(var/a in T)
var/atom/A = a
if(!A.Adjacent(targets_from))
continue
if(is_type_in_typecache(A, environment_target_typecache) && !A.IsObscured())
A.attack_animal(src)
DestroyObjectsInDirection(dir)
/mob/living/simple_animal/hostile/proc/EscapeConfinement()
@@ -24,4 +24,4 @@
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 150
maxbodytemp = 500
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
@@ -612,7 +612,7 @@ Difficulty: Very Hard
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
gold_core_spawnable = TRUE
gold_core_spawnable = HOSTILE_SPAWN
verb_say = "warps"
verb_ask = "floats inquisitively"
verb_exclaim = "zaps"
@@ -63,7 +63,7 @@
if(C.total_damage >= maxHealth * 0.6) //if you do at least 60% of its health with the crusher, you'll get the item
spawn_crusher_loot()
if(!admin_spawned)
SSblackbox.set_details("megafauna_kills","[initial(name)]")
SSblackbox.record_feedback("tally", "megafauna_kills", 1, "[initial(name)]")
if(!elimination) //used so the achievment only occurs for the last legion to die.
grant_achievement(medal_type,score_type)
..()
@@ -27,7 +27,7 @@
faction = list("mimic")
move_to_delay = 9
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
@@ -45,7 +45,7 @@
for(var/obj/item/I in loc)
I.loc = src
/mob/living/simple_animal/hostile/mimic/crate/DestroySurroundings()
/mob/living/simple_animal/hostile/mimic/crate/DestroyPathToTarget()
..()
if(prob(90))
icon_state = "[initial(icon_state)]open"
@@ -101,7 +101,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
var/destroy_objects = 0
var/knockdown_people = 0
var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes")
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0)
. = ..()
@@ -33,7 +33,7 @@
aggro_vision_range = 9
idle_vision_range = 2
turns_per_move = 5
gold_core_spawnable = TRUE
gold_core_spawnable = HOSTILE_SPAWN
loot = list(/obj/item/ore/diamond{layer = ABOVE_MOB_LAYER},
/obj/item/ore/diamond{layer = ABOVE_MOB_LAYER})
@@ -23,7 +23,7 @@
friendly = "pinches"
a_intent = INTENT_HELP
ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
stat_attack = UNCONSCIOUS
gender = NEUTER
stop_automated_movement = FALSE
@@ -56,7 +56,7 @@
..()
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
SSblackbox.add_details("mobs_killed_mining","[src.type]")
SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 20 creatures before getting the item
spawn_crusher_loot()
@@ -23,7 +23,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 1)
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/retaliate/frog/Initialize()
. = ..()
@@ -29,7 +29,7 @@
maxbodytemp = 1500
movement_type = FLYING
pressure_resistance = 300
gold_core_spawnable = 0 //too spooky for science
gold_core_spawnable = NO_SPAWN //too spooky for science
var/ghost_hair_style
var/ghost_hair_color
var/mutable_appearance/ghost_hair
@@ -25,7 +25,7 @@
unsuitable_atmos_damage = 10
robust_searching = 1
stat_attack = UNCONSCIOUS
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
faction = list("skeleton")
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
@@ -41,7 +41,7 @@
icon_dead = "eskimo_dead"
maxHealth = 55
health = 55
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
melee_damage_lower = 17
melee_damage_upper = 20
deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
@@ -60,7 +60,7 @@
maxHealth = 150
health = 150
speed = 2
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
speak_chance = 1
speak = list("THE GODS WILL IT!","DEUS VULT!","REMOVE KABAB!")
force_threshold = 10 //trying to simulate actually having armor
@@ -95,7 +95,7 @@
else
return ..()
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
/mob/living/simple_animal/hostile/statue/DestroyPathToTarget()
if(!can_be_seen(get_turf(loc)))
..()
@@ -153,6 +153,6 @@
limb_destroyer = 1
speak_emote = list("states")
bubble_icon = "syndibot"
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
deathmessage = "is smashed into pieces!"
@@ -36,7 +36,7 @@
faction = list("hostile")
deathmessage = "is hacked into pieces!"
loot = list(/obj/item/stack/sheet/mineral/wood)
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
/mob/living/simple_animal/hostile/tree/Life()
@@ -27,7 +27,7 @@
idle_vision_range = 5
mob_size = MOB_SIZE_SMALL
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = TRUE
gold_core_spawnable = HOSTILE_SPAWN
var/wumbo = 0
var/inflate_cooldown = 0
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
@@ -59,7 +59,7 @@
friendly = "grooms"
mob_size = MOB_SIZE_SMALL
movement_type = FLYING
gold_core_spawnable = 2
gold_core_spawnable = FRIENDLY_SPAWN
devourable = TRUE
no_vore = FALSE
@@ -871,7 +871,7 @@
name = "Poly"
desc = "Poly the Parrot. An expert on quantum cracker theory."
speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE")
gold_core_spawnable = 0
gold_core_spawnable = NO_SPAWN
speak_chance = 3
var/memory_saved = FALSE
var/rounds_survived = 0
@@ -1012,7 +1012,7 @@
emote_hear = list("squawks rustily.", "bawks metallically!")
emote_see = list("flutters its metal wings.")
faction = list("ratvar")
gold_core_spawnable = FALSE
gold_core_spawnable = NO_SPAWN
del_on_death = TRUE
death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg'
@@ -63,7 +63,7 @@
//simple_animal access
var/obj/item/card/id/access_card = null //innate access uses an internal ID card
var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against
var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood
var/gold_core_spawnable = NO_SPAWN //If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood
var/mob/living/simple_animal/hostile/spawner/nest
@@ -521,37 +521,26 @@
client.screen |= l_hand
//ANIMAL RIDING
/mob/living/simple_animal/unbuckle_mob(mob/living/buckled_mob, force = 0, check_loc = 1)
if(riding_datum)
riding_datum.restore_position(buckled_mob)
. = ..()
/mob/living/simple_animal/user_buckle_mob(mob/living/M, mob/user)
GET_COMPONENT(riding_datum, /datum/component/riding)
if(riding_datum)
if(user.incapacitated())
return
for(var/atom/movable/A in get_turf(src))
if(A != src && A != M && A.density)
return
M.loc = get_turf(src)
riding_datum.handle_vehicle_offsets()
riding_datum.ridden = src
M.forceMove(get_turf(src))
return ..()
/mob/living/simple_animal/relaymove(mob/user, direction)
GET_COMPONENT(riding_datum, /datum/component/riding)
if(tame && riding_datum)
riding_datum.handle_ride(user, direction)
/mob/living/simple_animal/Moved()
. = ..()
if(riding_datum)
riding_datum.on_vehicle_move()
/mob/living/simple_animal/buckle_mob(mob/living/buckled_mob, force = 0, check_loc = 1)
. = ..()
riding_datum = new/datum/riding/animal
LoadComponent(/datum/component/riding)
/mob/living/simple_animal/proc/toggle_ai(togglestatus)
if (AIStatus != togglestatus)
@@ -167,7 +167,7 @@
M.Friends = Friends.Copy()
babies += M
M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100)
SSblackbox.add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")
SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour)
var/mob/living/simple_animal/slime/new_slime = pick(babies)
new_slime.a_intent = INTENT_HARM
@@ -57,7 +57,7 @@
/mob/living/simple_animal/hostile/spawner/skeleton
name = "bone pit"
desc = "A pit full of bones, some still seem to be moving.."
desc = "A pit full of bones, and some still seem to be moving..."
icon_state = "hole"
icon_living = "hole"
icon = 'icons/mob/nest.dmi'
@@ -102,4 +102,4 @@
/mob/living/simple_animal/hostile/spawner/mining/wumborian
name = "wumborian fugu den"
desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?"
mob_type = /mob/living/simple_animal/hostile/asteroid/fugu
mob_type = /mob/living/simple_animal/hostile/asteroid/fugu
+16 -11
View File
@@ -42,9 +42,14 @@
/atom/proc/prepare_huds()
hud_list = list()
for(var/hud in hud_possible)
var/image/I = image('icons/mob/hud.dmi', src, "")
I.appearance_flags = RESET_COLOR|RESET_TRANSFORM
hud_list[hud] = I
var/hint = hud_possible[hud]
switch(hint)
if(HUD_LIST_LIST)
hud_list[hud] = list()
else
var/image/I = image('icons/mob/hud.dmi', src, "")
I.appearance_flags = RESET_COLOR|RESET_TRANSFORM
hud_list[hud] = I
/mob/proc/Cell()
set category = "Admin"
@@ -769,14 +774,14 @@
//Default buckling shift visual for mobs
/mob/post_buckle_mob(mob/living/M)
if(M in buckled_mobs)//post buckling
var/height = M.get_mob_buckling_height(src)
M.pixel_y = initial(M.pixel_y) + height
if(M.layer < layer)
M.layer = layer + 0.1
else //post unbuckling
M.layer = initial(M.layer)
M.pixel_y = initial(M.pixel_y)
var/height = M.get_mob_buckling_height(src)
M.pixel_y = initial(M.pixel_y) + height
if(M.layer < layer)
M.layer = layer + 0.1
/mob/post_unbuckle_mob(mob/living/M)
M.layer = initial(M.layer)
M.pixel_y = initial(M.pixel_y)
//returns the height in pixel the mob should have when buckled to another mob.
/mob/proc/get_mob_buckling_height(mob/seat)
-1
View File
@@ -33,7 +33,6 @@
var/obj/machinery/machine = null
var/other_mobs = null
var/disabilities = 0 //Carbon
var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
var/atom/movable/pulling = null
var/grab_state = 0
+3 -2
View File
@@ -186,8 +186,9 @@
if(LAZYLEN(mob.user_movement_hooks))
for(var/obj/O in mob.user_movement_hooks)
O.intercept_user_move(direct, mob, n, oldloc)
if(mob.pulling && !ismob(mob.pulling))
var/atom/movable/P = mob.pulling
if(P && !ismob(P) && P.density)
mob.dir = turn(mob.dir, 180)
/mob/Moved(oldLoc, dir, Forced = FALSE)
+3 -4
View File
@@ -19,7 +19,7 @@
/mob/proc/whisper(message, datum/language/language=null)
say(message, language) //only living mobs actually whisper, everything else just talks
/mob/verb/me_verb(message as message)
/mob/verb/me_verb(message as text)
set name = "Me"
set category = "IC"
@@ -27,8 +27,7 @@
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return
var/list/replace_chars = list("\n"=" ","\t"=" ")
message = copytext(sanitize(message, replace_chars), 1, (MAX_MESSAGE_LEN*2))
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
usr.emote("me",1,message)
@@ -80,4 +79,4 @@
return 0
/mob/proc/lingcheck()
return 0
return LINGHIVE_NONE