Merge branch 'master' into donoritemmodularization
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user