Merge branch 'master' into spike-loot-differentces

This commit is contained in:
Trilbyspaceclone
2020-08-27 03:41:14 -04:00
committed by GitHub
560 changed files with 13682 additions and 5938 deletions
+2 -2
View File
@@ -87,7 +87,7 @@
if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM))
for(var/datum/surgery/S in surgeries)
if(S.next_step(user,user.a_intent))
return 1
return STOP_ATTACK_PROC_CHAIN
if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src))
return ..()
@@ -95,7 +95,7 @@
for(var/i in shuffle(all_wounds))
var/datum/wound/W = i
if(W.try_treating(I, user))
return 1
return STOP_ATTACK_PROC_CHAIN
return ..()
@@ -21,7 +21,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
/mob/living/carbon/human/dummy/proc/wipe_state()
delete_equipment()
icon_render_key = null
cut_overlays(TRUE)
cut_overlays()
//Inefficient pooling/caching way.
GLOBAL_LIST_EMPTY(human_dummy_list)
@@ -7,6 +7,11 @@
message = "cries."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/human/cry/run_emote(mob/user, params)
. = ..()
if(. && isipcperson(user))
do_fake_sparks(5,FALSE,user)
/datum/emote/living/carbon/human/dap
key = "dap"
key_third_person = "daps"
@@ -299,10 +299,10 @@
/mob/living/carbon/human/ex_act(severity, target, origin)
if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
if(TRAIT_BOMBIMMUNE in dna.species.species_traits)
return
..()
if (!severity)
if (!severity || QDELETED(src))
return
var/brute_loss = 0
var/burn_loss = 0
@@ -1,31 +1,17 @@
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning)
return dna.species.can_equip(I, slot, disable_warning, src, bypass_equip_delay_self, clothing_check, return_warning)
/**
* Used to return a list of equipped items on a human mob; does not include held items (use get_all_gear)
*
* Argument(s):
* * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list
*/
/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE)
var/list/items = ..()
if(belt)
items += belt
if(ears)
items += ears
if(glasses)
items += glasses
if(gloves)
items += gloves
if(shoes)
items += shoes
if(wear_id)
items += wear_id
if(wear_suit)
items += wear_suit
if(w_uniform)
items += w_uniform
if(include_pockets)
if(l_store)
items += l_store
if(r_store)
items += r_store
if(s_store)
items += s_store
if(!include_pockets)
items -= list(l_store, r_store, s_store)
return items
// Return the item currently in the slot ID
+28 -177
View File
@@ -124,6 +124,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
limbs_id = id
..()
//update our mutant bodyparts to include unlocked ones
mutant_bodyparts += GLOB.unlocked_mutant_parts
/proc/generate_selectable_species(clear = FALSE)
if(clear)
GLOB.roundstart_races = list()
@@ -639,106 +642,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(!mutant_bodyparts)
return
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None"
if(mutant_bodyparts["tail_lizard"])
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
bodyparts_to_add -= "tail_lizard"
if(mutant_bodyparts["waggingtail_lizard"])
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
bodyparts_to_add -= "waggingtail_lizard"
else if (mutant_bodyparts["tail_lizard"])
bodyparts_to_add -= "waggingtail_lizard"
if(mutant_bodyparts["tail_human"])
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
bodyparts_to_add -= "tail_human"
if(mutant_bodyparts["waggingtail_human"])
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
bodyparts_to_add -= "waggingtail_human"
else if (mutant_bodyparts["tail_human"])
bodyparts_to_add -= "waggingtail_human"
if(mutant_bodyparts["spines"])
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
bodyparts_to_add -= "spines"
if(mutant_bodyparts["waggingspines"])
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
bodyparts_to_add -= "waggingspines"
else if (mutant_bodyparts["tail"])
bodyparts_to_add -= "waggingspines"
if(mutant_bodyparts["snout"]) //Take a closer look at that snout!
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "snout"
if(mutant_bodyparts["frills"])
if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "frills"
if(mutant_bodyparts["horns"])
if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "horns"
if(mutant_bodyparts["ears"])
if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "ears"
if(mutant_bodyparts["wings"])
if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
bodyparts_to_add -= "wings"
if(mutant_bodyparts["wings_open"])
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))
bodyparts_to_add -= "wings_open"
else if (mutant_bodyparts["wings"])
bodyparts_to_add -= "wings_open"
if(mutant_bodyparts["insect_fluff"])
if(!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "insect_fluff"
//CITADEL EDIT
//Race specific bodyparts:
//Xenos
if(mutant_bodyparts["xenodorsal"])
if(!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
bodyparts_to_add -= "xenodorsal"
if(mutant_bodyparts["xenohead"])//This is an overlay for different castes using different head crests
if(!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "xenohead"
if(mutant_bodyparts["xenotail"])
if(!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "xenotail"
//Other Races
if(mutant_bodyparts["mam_tail"])
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
bodyparts_to_add -= "mam_tail"
if(mutant_bodyparts["mam_waggingtail"])
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
bodyparts_to_add -= "mam_waggingtail"
else if (mutant_bodyparts["mam_tail"])
bodyparts_to_add -= "mam_waggingtail"
if(mutant_bodyparts["mam_ears"])
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "mam_ears"
if(mutant_bodyparts["mam_snouts"]) //Take a closer look at that snout!
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "mam_snouts"
if(mutant_bodyparts["taur"])
if(!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
bodyparts_to_add -= "taur"
//END EDIT
for(var/mutant_part in mutant_bodyparts)
var/reference_list = GLOB.mutant_reference_list[mutant_part]
if(reference_list)
var/datum/sprite_accessory/S
var/transformed_part = GLOB.mutant_transform_list[mutant_part]
if(transformed_part)
S = reference_list[H.dna.features[transformed_part]]
else
S = reference_list[H.dna.features[mutant_part]]
if(!S || S.is_not_visible(H, tauric))
bodyparts_to_add -= mutant_part
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
var/update_needed = FALSE
@@ -775,76 +691,22 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/list/dna_feature_as_text_string = list()
for(var/bodypart in bodyparts_to_add)
var/datum/sprite_accessory/S
switch(bodypart)
if("tail_lizard")
S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]]
if("waggingtail_lizard")
S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]]
if("tail_human")
S = GLOB.tails_list_human[H.dna.features["tail_human"]]
if("waggingtail_human")
S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]]
if("spines")
S = GLOB.spines_list[H.dna.features["spines"]]
if("waggingspines")
S = GLOB.animated_spines_list[H.dna.features["spines"]]
if("snout")
S = GLOB.snouts_list[H.dna.features["snout"]]
if("frills")
S = GLOB.frills_list[H.dna.features["frills"]]
if("horns")
S = GLOB.horns_list[H.dna.features["horns"]]
if("ears")
S = GLOB.ears_list[H.dna.features["ears"]]
if("body_markings")
S = GLOB.body_markings_list[H.dna.features["body_markings"]]
if("wings")
S = GLOB.wings_list[H.dna.features["wings"]]
if("wingsopen")
S = GLOB.wings_open_list[H.dna.features["wings"]]
if("deco_wings")
S = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
if("legs")
S = GLOB.legs_list[H.dna.features["legs"]]
if("insect_wings")
S = GLOB.insect_wings_list[H.dna.features["insect_wings"]]
if("insect_fluff")
S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]]
if("insect_markings")
S = GLOB.insect_markings_list[H.dna.features["insect_markings"]]
if("caps")
S = GLOB.caps_list[H.dna.features["caps"]]
if("ipc_screen")
S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]]
if("ipc_antenna")
S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]]
if("mam_tail")
S = GLOB.mam_tails_list[H.dna.features["mam_tail"]]
if("mam_waggingtail")
S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]]
if("mam_body_markings")
S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if("mam_ears")
S = GLOB.mam_ears_list[H.dna.features["mam_ears"]]
if("mam_snouts")
S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
if("taur")
S = GLOB.taur_list[H.dna.features["taur"]]
if("xenodorsal")
S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]]
if("xenohead")
S = GLOB.xeno_head_list[H.dna.features["xenohead"]]
if("xenotail")
S = GLOB.xeno_tail_list[H.dna.features["xenotail"]]
var/reference_list = GLOB.mutant_reference_list[bodypart]
if(reference_list)
var/datum/sprite_accessory/S
var/transformed_part = GLOB.mutant_transform_list[bodypart]
if(transformed_part)
S = reference_list[H.dna.features[transformed_part]]
else
S = reference_list[H.dna.features[bodypart]]
if(!S || S.icon_state == "none")
continue
if(!S || S.icon_state == "none")
continue
for(var/L in S.relevant_layers)
LAZYADD(relevant_layers["[L]"], S)
if(!S.mutant_part_string)
dna_feature_as_text_string[S] = bodypart
for(var/L in S.relevant_layers)
LAZYADD(relevant_layers["[L]"], S)
if(!S.mutant_part_string)
dna_feature_as_text_string[S] = bodypart
var/static/list/layer_text = list(
"[BODY_BEHIND_LAYER]" = "BEHIND",
@@ -2043,17 +1905,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return
/**
* The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds
*/
/datum/species/proc/get_biological_state(mob/living/carbon/human/H)
. = BIO_INORGANIC
if(HAS_FLESH in species_traits)
@@ -2069,7 +1922,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(HAS_TRAIT(H, TRAIT_NOBREATH))
return TRUE
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)
if(!environment)
return
@@ -2261,7 +2113,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = stunmod * H.physiology.stun_mod * amount
//////////////
@@ -14,7 +14,7 @@
brutemod = 1.25 //They're weak to punches
attack_type = BURN //burn bish
damage_overlay_type = "" //We are too cool for regular damage overlays
species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
species_traits = list(MUTCOLORS, HAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
species_language_holder = /datum/language_holder/ethereal
inherent_traits = list(TRAIT_NOHUNGER)
sexes = FALSE
@@ -27,7 +27,7 @@
// Cold temperatures hurt faster as it is harder to move with out the heat energy
bodytemp_cold_damage_limit = (T20C - 10) // about 10c
*/
hair_color = "fixedmutcolor"
hair_color = "mutcolor"
hair_alpha = 140
var/current_color
var/EMPeffect = FALSE
@@ -504,7 +504,7 @@
else if (select_alteration == "Ears")
var/list/snowflake_ears_list = list("Normal" = null)
for(var/path in GLOB.mam_ears_list)
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
@@ -518,7 +518,7 @@
else if (select_alteration == "Snout")
var/list/snowflake_snouts_list = list("Normal" = null)
for(var/path in GLOB.mam_snouts_list)
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
@@ -549,7 +549,7 @@
else if (select_alteration == "Tail")
var/list/snowflake_tails_list = list("Normal" = null)
for(var/path in GLOB.mam_tails_list)
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
@@ -5,13 +5,12 @@
say_mod = "hisses"
default_color = "00FF00"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings")
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
mutanttongue = /obj/item/organ/tongue/lizard
mutanttail = /obj/item/organ/tail/lizard
coldmod = 1.5
heatmod = 0.67
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round",
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round",
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
attack_verb = "slash"
@@ -52,6 +51,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE)
inherent_traits = list(TRAIT_CHUNKYFINGERS)
mutantlungs = /obj/item/organ/lungs/ashwalker
mutanteyes = /obj/item/organ/eyes/night_vision
burnmod = 0.9
brutemod = 0.9
species_language_holder = /datum/language_holder/lizard/ash
@@ -57,89 +57,10 @@
..()
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
var/current_job = J?.title
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
switch(current_job)
if("Chaplain")
O = new /datum/outfit/plasmaman/chaplain
if("Curator")
O = new /datum/outfit/plasmaman/curator
if("Janitor")
O = new /datum/outfit/plasmaman/janitor
if("Botanist")
O = new /datum/outfit/plasmaman/botany
if("Bartender", "Lawyer")
O = new /datum/outfit/plasmaman/bar
if("Cook")
O = new /datum/outfit/plasmaman/chef
if("Security Officer")
O = new /datum/outfit/plasmaman/security
if("Detective")
O = new /datum/outfit/plasmaman/detective
if("Warden")
O = new /datum/outfit/plasmaman/warden
if("Cargo Technician", "Quartermaster")
O = new /datum/outfit/plasmaman/cargo
if("Shaft Miner")
O = new /datum/outfit/plasmaman/mining
if("Medical Doctor")
O = new /datum/outfit/plasmaman/medical
if("Chemist")
O = new /datum/outfit/plasmaman/chemist
if("Geneticist")
O = new /datum/outfit/plasmaman/genetics
if("Roboticist")
O = new /datum/outfit/plasmaman/robotics
if("Virologist")
O = new /datum/outfit/plasmaman/viro
if("Scientist")
O = new /datum/outfit/plasmaman/science
if("Station Engineer")
O = new /datum/outfit/plasmaman/engineering
if("Atmospheric Technician")
O = new /datum/outfit/plasmaman/atmospherics
if("Captain")
O = new /datum/outfit/plasmaman/captain
if("Head of Personnel")
O = new /datum/outfit/plasmaman/hop
if("Head of Security")
O = new /datum/outfit/plasmaman/hos
if("Chief Engineer")
O = new /datum/outfit/plasmaman/ce
if("Chief Medical Officer")
O = new /datum/outfit/plasmaman/cmo
if("Research Director")
O = new /datum/outfit/plasmaman/rd
if("Mime")
O = new /datum/outfit/plasmaman/mime
if("Clown")
O = new /datum/outfit/plasmaman/clown
if(J)
if(J.plasma_outfit)
O = new J.plasma_outfit
H.equipOutfit(O, visualsOnly)
H.internal = H.get_item_for_held_index(2)
@@ -82,13 +82,11 @@
M.AddSpell(SW)
shadowwalk = SW
/obj/item/organ/brain/nightmare/Remove(special = FALSE)
if(shadowwalk && owner)
owner.RemoveSpell(shadowwalk)
return ..()
/obj/item/organ/heart/nightmare
name = "heart of darkness"
desc = "An alien organ that twists and writhes when exposed to light."
@@ -5,8 +5,8 @@
blacklisted = 0
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL,HAS_BONE)
inherent_traits = list(TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL,HAS_BONE,NOTRANSSTING)
inherent_traits = list(TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_CALCIUM_HEALER)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/bone
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
@@ -19,12 +19,12 @@
/datum/species/skeleton/New()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) //skeletons are stronger during the spooky season!
inherent_traits |= list(TRAIT_RESISTHEAT,TRAIT_RESISTCOLD)
inherent_traits |= list(TRAIT_RESISTHEAT, TRAIT_NOBREATH, TRAIT_PIERCEIMMUNE, TRAIT_FAKEDEATH, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE)
brutemod = 1
burnmod = 1
..()
/datum/species/skeleton/greater/check_roundstart_eligible()
/datum/species/skeleton/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
return ..()
@@ -22,4 +22,4 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_type = "robotic"
species_type = "robotic"
@@ -100,14 +100,12 @@
else
return ..()
/datum/species/synth/handle_body(mob/living/carbon/human/H)
if(fake_species)
fake_species.handle_body(H)
else
return ..()
/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
if(fake_species)
fake_species.handle_body(H,forced_colour)
@@ -117,18 +117,6 @@
if(!QDELETED(src))
update_inv_legcuffed()
/mob/living/carbon/get_equipped_items(include_pockets = FALSE)
var/list/items = list()
if(back)
items += back
if(head)
items += head
if(wear_mask)
items += wear_mask
if(wear_neck)
items += wear_neck
return items
//handle stuff to update when a mob equips/unequips a mask.
/mob/living/proc/wear_mask_update(obj/item/clothing/C, toggle_off = 1)
update_inv_wear_mask()
+1 -4
View File
@@ -8,8 +8,6 @@
spill_organs(no_brain, no_organs, no_bodyparts)
release_vore_contents(silent = TRUE) // return of the bomb safe internals.
if(!no_bodyparts)
spread_bodyparts(no_brain, no_organs)
@@ -46,7 +44,6 @@
buckled.unbuckle_mob(src, force = TRUE)
dust_animation()
release_vore_contents(silent = TRUE) //technically grief protection, I guess? if they're SM'd it doesn't matter seconds after anyway.
spawn_dust(just_ash)
QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes.
@@ -103,5 +100,5 @@
for(var/s in sharedSoullinks)
var/datum/soullink/S = s
S.sharerDies(gibbed)
release_vore_contents(silent = TRUE)
return TRUE
+5
View File
@@ -9,6 +9,11 @@
key_third_person = "blushes"
message = "blushes."
/datum/emote/living/blush/run_emote(mob/user, params)
. = ..()
if(. && isipcperson(user))
do_fake_sparks(5,FALSE,user)
/datum/emote/living/bow
key = "bow"
key_third_person = "bows"
+1 -1
View File
@@ -57,7 +57,7 @@
/mob/living/Bump(atom/A)
if(..()) //we are thrown onto something
return
if (buckled || now_pushing)
if(buckled || now_pushing)
return
if(ismob(A))
var/mob/M = A
@@ -13,7 +13,7 @@
DelayNextAction(data.block_end_click_cd_add)
return TRUE
/mob/living/proc/ACTIVE_BLOCK_START(obj/item/I)
/mob/living/proc/active_block_start(obj/item/I)
if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))
return FALSE
if(!(I in held_items))
@@ -109,7 +109,7 @@
animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW)
return
combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING)
ACTIVE_BLOCK_START(I)
active_block_start(I)
/**
* Gets the first item we can that can block, but if that fails, default to active held item.COMSIG_ENABLE_COMBAT_MODE
@@ -180,6 +180,12 @@
/// Apply the stamina damage to our user, notice how damage argument is stamina_amount.
/obj/item/proc/active_block_do_stamina_damage(mob/living/owner, atom/object, stamina_amount, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
if(istype(object, /obj/item/projectile))
var/obj/item/projectile/P = object
if(P.stamina)
var/blocked = active_block_calculate_final_damage(owner, object, P.stamina, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return)
var/stam = active_block_stamina_cost(owner, object, blocked, attack_text, ATTACK_TYPE_PROJECTILE, armour_penetration, attacker, def_zone, final_block_chance, block_return)
stamina_amount += stam
var/datum/block_parry_data/data = get_block_parry_data()
if(iscarbon(owner))
var/mob/living/carbon/C = owner
+41 -34
View File
@@ -289,50 +289,57 @@
return FALSE
return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range)
/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user)
if (!getBruteLoss())
to_chat(user, "<span class='warning'>[src] is already in good condition!</span>")
return
if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
return
user.DelayNextAction(CLICK_CD_MELEE)
if(src == user)
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
if(!W.use_tool(src, user, 50))
return
adjustBruteLoss(-10)
else
to_chat(user, "<span class='notice'>You start fixing [src]...</span>")
if(!do_after(user, 30, target = src))
return
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
visible_message("<span class='notice'>[user] has fixed some of the dents on [src].</span>")
/mob/living/silicon/robot/proc/attempt_cable_repair(obj/item/stack/cable_coil/W, mob/user)
if (getFireLoss() > 0 || getToxLoss() > 0)
user.DelayNextAction(CLICK_CD_MELEE)
if (!getBruteLoss())
to_chat(user, "<span class='warning'>[src] is already in good condition!</span>")
return
if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
return
if(src == user)
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
if(!W.use_tool(src, user, 50))
if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustBruteLoss(-10)
adjustFireLoss(-10)
adjustToxLoss(-10)
else
to_chat(user, "<span class='notice'>You start fixing [src]...</span>")
if(!do_after(user, 30, target = src))
if(!W.use_tool(src, user, 30, 1))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
visible_message("<span class='notice'>[user] has fixed some of the dents on [src].</span>")
adjustFireLoss(-30)
adjustToxLoss(-30)
updatehealth()
user.visible_message("[user] has fixed some of the burnt wires on [src].", "<span class='notice'>You fix some of the burnt wires on [src].</span>")
else
to_chat(user, "The wires seem fine, there's no need to fix them.")
/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user)
return
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
user.DelayNextAction(CLICK_CD_MELEE)
if (getFireLoss() > 0 || getToxLoss() > 0)
if(src == user)
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustFireLoss(-10)
adjustToxLoss(-10)
else
to_chat(user, "<span class='notice'>You start fixing [src]...</span>")
if(!W.use_tool(src, user, 30, 1))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustFireLoss(-30)
adjustToxLoss(-30)
updatehealth()
user.visible_message("[user] has fixed some of the burnt wires on [src].", "<span class='notice'>You fix some of the burnt wires on [src].</span>")
else
to_chat(user, "The wires seem fine, there's no need to fix them.")
INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user)
return
else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover
if(opened)
@@ -361,7 +361,8 @@
"Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmed"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamed"),
"Eyebot" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "eyebotmed"),
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed")
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed"),
"Drake" = image(icon = 'icons/mob/cyborg/drakemech.dmi', icon_state = "drakemedbox")
)
var/list/L = list("Medihound" = "medihound", "Medihound Dark" = "medihounddark", "Vale" = "valemed")
for(var/a in L)
@@ -422,6 +423,13 @@
moduleselect_icon = "medihound"
moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
dogborg = TRUE
if("Drake")
cyborg_base_icon = "drakemed"
cyborg_icon_override = 'icons/mob/cyborg/drakemech.dmi'
sleeper_overlay = "drakemedsleeper"
moduleselect_icon = "medihound"
moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
dogborg = TRUE
else
return FALSE
return ..()
@@ -478,7 +486,8 @@
"Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "caneng"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinaeng"),
"Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidereng"),
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng")
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng"),
"Drake" = image(icon = 'icons/mob/cyborg/drakemech.dmi', icon_state = "drakeengbox")
)
var/list/L = list("Pup Dozer" = "pupdozer", "Vale" = "valeeng")
for(var/a in L)
@@ -536,6 +545,11 @@
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
sleeper_overlay = "alinasleeper"
dogborg = TRUE
if("Drake")
cyborg_base_icon = "drakeeng"
cyborg_icon_override = 'icons/mob/cyborg/drakemech.dmi'
sleeper_overlay = "drakesecsleeper"
dogborg = TRUE
else
return FALSE
return ..()
@@ -574,7 +588,8 @@
"Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "cansec"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinasec"),
"Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidersec"),
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec")
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec"),
"Drake" = image(icon = 'icons/mob/cyborg/drakemech.dmi', icon_state = "drakesecbox")
)
var/list/L = list("K9" = "k9", "Vale" = "valesec", "K9 Dark" = "k9dark")
for(var/a in L)
@@ -630,6 +645,11 @@
sleeper_overlay = "valesecsleeper"
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
dogborg = TRUE
if("Drake")
cyborg_base_icon = "drakesec"
cyborg_icon_override = 'icons/mob/cyborg/drakemech.dmi'
sleeper_overlay = "drakesecsleeper"
dogborg = TRUE
else
return FALSE
return ..()
@@ -673,7 +693,8 @@
var/static/list/peace_icons = sortList(list(
"Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "peace"),
"Borgi" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "borgi"),
"Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "whitespider")
"Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "whitespider"),
"Drake" = image(icon = 'icons/mob/cyborg/drakemech.dmi', icon_state = "drakepeacebox")
))
var/peace_borg_icon = show_radial_menu(R, R , peace_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
switch(peace_borg_icon)
@@ -689,6 +710,11 @@
hat_offset = INFINITY
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
has_snowflake_deadsprite = TRUE
if("Drake")
cyborg_base_icon = "drakepeace"
cyborg_icon_override = 'icons/mob/cyborg/drakemech.dmi'
sleeper_overlay = "drakepeacesleeper"
dogborg = TRUE
else
return FALSE
return ..()
@@ -827,7 +853,8 @@
"(Janitor) Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinajan"),
"(Janitor) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekjan"),
"(Janitor) Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canjan"),
"(Janitor) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyjan")
"(Janitor) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyjan"),
"(Janitor) Drake" = image(icon = 'icons/mob/cyborg/drakemech.dmi', icon_state = "drakejanitbox")
)
var/list/L = list("(Service) DarkK9" = "k50", "(Service) Vale" = "valeserv", "(Service) ValeDark" = "valeservdark",
"(Janitor) Scrubpuppy" = "scrubpup")
@@ -899,6 +926,11 @@
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
sleeper_overlay = "jsleeper"
dogborg = TRUE
if("(Janitor) Drake")
cyborg_base_icon = "drakejanit"
cyborg_icon_override = 'icons/mob/cyborg/drakemech.dmi'
sleeper_overlay = "drakesecsleeper"
dogborg = TRUE
else
return FALSE
return ..()
@@ -944,7 +976,8 @@
"Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmin"),
"Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamin"),
"Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canmin"),
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin")
"Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin"),
"Drake" = image(icon = 'icons/mob/cyborg/drakemech.dmi', icon_state = "drakeminebox")
)
var/list/L = list("Blade" = "blade", "Vale" = "valemine")
for(var/a in L)
@@ -988,6 +1021,11 @@
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
sleeper_overlay = "valeminesleeper"
dogborg = TRUE
if("Drake")
cyborg_base_icon = "drakemine"
cyborg_icon_override = 'icons/mob/cyborg/drakemech.dmi'
sleeper_overlay = "drakeminesleeper"
dogborg = TRUE
else
return FALSE
return ..()
@@ -430,3 +430,6 @@
/mob/living/silicon/handle_high_gravity(gravity)
return
/mob/living/silicon/rust_heretic_act()
adjustBruteLoss(500)
@@ -1058,3 +1058,6 @@ Pass a positive integer as an argument to override a bot's default speed.
if(I)
I.icon_state = null
path.Cut(1, 2)
/mob/living/silicon/rust_heretic_act()
adjustBruteLoss(500)
@@ -313,7 +313,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/insectguts,
/obj/effect/decal/cleanable/semen,
/obj/effect/decal/cleanable/femcum,
/obj/effect/decal/cleanable/semen/femcum,
/obj/effect/decal/cleanable/generic,
/obj/effect/decal/cleanable/glass,,
/obj/effect/decal/cleanable/cobweb,
@@ -11,7 +11,6 @@
response_disarm_simple = "flail at"
response_harm_continuous = "punches"
response_harm_simple = "punch"
threat = 1
speak_chance = 1
icon = 'icons/mob/mob.dmi'
speed = 0
@@ -122,7 +121,6 @@
desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire."
icon_state = "behemoth"
icon_living = "behemoth"
threat = 3
maxHealth = 150
health = 150
response_harm_continuous = "harmlessly punches"
@@ -187,7 +185,6 @@
desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines."
icon_state = "floating"
icon_living = "floating"
threat = 3
maxHealth = 65
health = 65
melee_damage_lower = 20
@@ -0,0 +1,386 @@
/mob/living/simple_animal/hostile/eldritch
name = "Demon"
real_name = "Demon"
desc = ""
gender = NEUTER
mob_biotypes = NONE
speak_emote = list("screams")
response_help_continuous = "thinks better of touching"
response_help_simple = "think better of touching"
response_disarm_continuous = "flails at"
response_disarm_simple = "flail at"
response_harm_continuous = "reaps"
response_harm_simple = "tears"
speak_chance = 1
icon = 'icons/mob/eldritch_mobs.dmi'
speed = 0
a_intent = INTENT_HARM
stop_automated_movement = 1
AIStatus = AI_OFF
attack_sound = 'sound/weapons/punch1.ogg'
see_in_dark = 7
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
healable = 0
movement_type = GROUND
pressure_resistance = 100
del_on_death = TRUE
deathmessage = "implodes into itself"
faction = list("heretics")
simple_mob_flags = SILENCE_RANGED_MESSAGE
///Innate spells that are supposed to be added when a beast is created
var/list/spells_to_add
/mob/living/simple_animal/hostile/eldritch/Initialize()
. = ..()
add_spells()
/**
* Add_spells
*
* Goes through spells_to_add and adds each spell to the mind.
*/
/mob/living/simple_animal/hostile/eldritch/proc/add_spells()
for(var/spell in spells_to_add)
AddSpell(new spell())
/mob/living/simple_animal/hostile/eldritch/raw_prophet
name = "Raw Prophet"
real_name = "Raw Prophet"
desc = "Abomination made from severed limbs."
icon_state = "raw_prophet"
status_flags = CANPUSH
icon_living = "raw_prophet"
melee_damage_lower = 5
melee_damage_upper = 10
maxHealth = 50
health = 50
sight = SEE_MOBS|SEE_OBJS|SEE_TURFS
spells_to_add = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash/long,/obj/effect/proc_holder/spell/pointed/manse_link,/obj/effect/proc_holder/spell/targeted/telepathy/eldritch,/obj/effect/proc_holder/spell/pointed/trigger/blind/eldritch)
var/list/linked_mobs = list()
/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize()
. = ..()
link_mob(src)
/mob/living/simple_animal/hostile/eldritch/raw_prophet/Login()
. = ..()
client.change_view(10)
/mob/living/simple_animal/hostile/eldritch/raw_prophet/proc/link_mob(mob/living/mob_linked)
if(QDELETED(mob_linked) || mob_linked.stat == DEAD)
return FALSE
if(HAS_TRAIT(mob_linked, TRAIT_MINDSHIELD)) //mindshield implant, no dice
return FALSE
if(mob_linked.anti_magic_check(FALSE, FALSE, TRUE, 0))
return FALSE
if(linked_mobs[mob_linked])
return FALSE
to_chat(mob_linked, "<span class='notice'>You feel something new enter your sphere of mind, you hear whispers of people far away, screeches of horror and a humming of welcome to [src]'s Mansus Link.</span>")
var/datum/action/innate/mansus_speech/action = new(src)
linked_mobs[mob_linked] = action
action.Grant(mob_linked)
RegisterSignal(mob_linked, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING) , .proc/unlink_mob)
return TRUE
/mob/living/simple_animal/hostile/eldritch/raw_prophet/proc/unlink_mob(mob/living/mob_linked)
if(!linked_mobs[mob_linked])
return
UnregisterSignal(mob_linked, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING))
var/datum/action/innate/mansus_speech/action = linked_mobs[mob_linked]
action.Remove(mob_linked)
qdel(action)
to_chat(mob_linked, "<span class='notice'>Your mind shatters as the [src]'s Mansus Link leaves your mind.</span>")
mob_linked.emote("Scream")
//micro stun
mob_linked.AdjustParalyzed(0.5 SECONDS)
linked_mobs -= mob_linked
/mob/living/simple_animal/hostile/eldritch/raw_prophet/death(gibbed)
for(var/linked_mob in linked_mobs)
unlink_mob(linked_mob)
return ..()
/mob/living/simple_animal/hostile/eldritch/armsy
name = "Terror of the Night"
real_name = "Armsy"
desc = "Abomination made from severed limbs."
icon_state = "armsy_start"
icon_living = "armsy_start"
maxHealth = 200
health = 200
obj_damage = 80
melee_damage_lower = 10
melee_damage_upper = 15
move_resist = MOVE_FORCE_OVERPOWERING+1
movement_type = GROUND
environment_smash = ENVIRONMENT_SMASH_RWALLS
sight = SEE_MOBS
spells_to_add = list(/obj/effect/proc_holder/spell/targeted/worm_contract)
ranged = TRUE
///Previous segment in the chain
var/mob/living/simple_animal/hostile/eldritch/armsy/back
///Next segment in the chain
var/mob/living/simple_animal/hostile/eldritch/armsy/front
///Your old location
var/oldloc
///Allow / disallow pulling
var/allow_pulling = FALSE
///How many arms do we have to eat to expand?
var/stacks_to_grow = 2
///Currently eaten arms
var/current_stacks = 0
//I tried Initalize but it didnt work, like at all. This proc just wouldnt fire if it was Initalize instead of New
/mob/living/simple_animal/hostile/eldritch/armsy/Initialize(mapload,spawn_more = TRUE,len = 6)
. = ..()
if(len < 3)
stack_trace("Eldritch Armsy created with invalid len ([len]). Reverting to 3.")
len = 3 //code breaks below 3, let's just not allow it.
oldloc = loc
RegisterSignal(src,COMSIG_MOVABLE_MOVED,.proc/update_chain_links)
if(!spawn_more)
return
allow_pulling = TRUE
///next link
var/mob/living/simple_animal/hostile/eldritch/armsy/next
///previous link
var/mob/living/simple_animal/hostile/eldritch/armsy/prev
///current link
var/mob/living/simple_animal/hostile/eldritch/armsy/current
for(var/i in 0 to len)
prev = current
//i tried using switch, but byond is really fucky and it didnt work as intended. Im sorry
if(i == 0)
current = new type(drop_location(),FALSE)
current.icon_state = "armsy_mid"
current.icon_living = "armsy_mid"
current.front = src
current.AIStatus = AI_OFF
back = current
else if(i < len)
current = new type(drop_location(),FALSE)
prev.back = current
prev.icon_state = "armsy_mid"
prev.icon_living = "armsy_mid"
prev.front = next
prev.AIStatus = AI_OFF
else
prev.icon_state = "armsy_end"
prev.icon_living = "armsy_end"
prev.front = next
prev.AIStatus = AI_OFF
next = prev
//we are literally a vessel of otherworldly destruction, we bring our own gravity unto this plane
/mob/living/simple_animal/hostile/eldritch/armsy/has_gravity(turf/T)
return TRUE
/mob/living/simple_animal/hostile/eldritch/armsy/can_be_pulled()
return FALSE
///Updates chain links to force move onto a single tile
/mob/living/simple_animal/hostile/eldritch/armsy/proc/contract_next_chain_into_single_tile()
if(back)
back.forceMove(loc)
back.contract_next_chain_into_single_tile()
return
///Updates the next mob in the chain to move to our last location, fixed the worm if somehow broken.
/mob/living/simple_animal/hostile/eldritch/armsy/proc/update_chain_links()
gib_trail()
if(back && back.loc != oldloc)
back.Move(oldloc)
// self fixing properties if somehow broken
if(front && loc != front.oldloc)
forceMove(front.oldloc)
oldloc = loc
/mob/living/simple_animal/hostile/eldritch/armsy/proc/gib_trail()
if(front) // head makes gibs
return
var/chosen_decal = pick(typesof(/obj/effect/decal/cleanable/blood/tracks))
var/obj/effect/decal/cleanable/blood/gibs/decal = new chosen_decal(drop_location())
decal.setDir(dir)
/mob/living/simple_animal/hostile/eldritch/armsy/Destroy()
if(front)
front.icon_state = "armsy_end"
front.icon_living = "armsy_end"
front.back = null
if(back)
QDEL_NULL(back) // chain destruction baby
return ..()
/mob/living/simple_animal/hostile/eldritch/armsy/BiologicalLife(seconds, times_fired)
adjustBruteLoss(-2)
/mob/living/simple_animal/hostile/eldritch/armsy/proc/heal()
if(health == maxHealth)
if(back)
back.heal()
return
else
current_stacks++
if(current_stacks >= stacks_to_grow)
var/mob/living/simple_animal/hostile/eldritch/armsy/prev = new type(drop_location(),spawn_more = FALSE)
icon_state = "armsy_mid"
icon_living = "armsy_mid"
back = prev
prev.icon_state = "armsy_end"
prev.icon_living = "armsy_end"
prev.front = src
prev.AIStatus = AI_OFF
current_stacks = 0
adjustBruteLoss(-maxHealth * 0.5, FALSE)
adjustFireLoss(-maxHealth * 0.5 ,FALSE)
/mob/living/simple_animal/hostile/eldritch/armsy/Shoot(atom/targeted_atom)
target = targeted_atom
AttackingTarget()
/mob/living/simple_animal/hostile/eldritch/armsy/AttackingTarget()
if(istype(target,/obj/item/bodypart/r_arm) || istype(target,/obj/item/bodypart/l_arm))
qdel(target)
heal()
return
if(target == back || target == front)
return
if(back)
back.target = target
back.AttackingTarget()
if(!Adjacent(target))
return
do_attack_animation(target)
//have fun
//if(istype(target,/turf/closed/wall))
//var/turf/closed/wall = target
//wall.ScrapeAway()
if(iscarbon(target))
var/mob/living/carbon/C = target
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
return
var/list/parts = list()
for(var/X in C.bodyparts)
var/obj/item/bodypart/bodypart = X
if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)
if(bodypart.dismemberable)
parts += bodypart
if(length(parts) && prob(10))
var/obj/item/bodypart/bodypart = pick(parts)
bodypart.dismember()
return ..()
/mob/living/simple_animal/hostile/eldritch/armsy/prime
name = "Lord of the Night"
real_name = "Master of Decay"
maxHealth = 400
health = 400
melee_damage_lower = 20
melee_damage_upper = 25
/mob/living/simple_animal/hostile/eldritch/armsy/prime/Initialize(mapload,spawn_more = TRUE,len = 9)
. = ..()
var/matrix/matrix_transformation = matrix()
matrix_transformation.Scale(1.4,1.4)
transform = matrix_transformation
/mob/living/simple_animal/hostile/eldritch/armsy/primeproc/heal()
if(health == maxHealth)
if(back)
back.heal()
return
else
current_stacks++
if(current_stacks >= stacks_to_grow)
var/mob/living/simple_animal/hostile/eldritch/armsy/prev = new type(drop_location(),spawn_more = FALSE)
icon_state = "armsy_mid"
icon_living = "armsy_mid"
back = prev
prev.icon_state = "armsy_end"
prev.icon_living = "armsy_end"
prev.front = src
prev.AIStatus = AI_OFF
current_stacks = 0
var/matrix/matrix_transformation = matrix()
matrix_transformation.Scale(1.4,1.4)
transform = matrix_transformation
adjustBruteLoss(-maxHealth * 0.5, FALSE)
adjustFireLoss(-maxHealth * 0.5 ,FALSE)
/mob/living/simple_animal/hostile/eldritch/rust_spirit
name = "Rust Walker"
real_name = "Rusty"
desc = "Incomprehensible abomination actively seeping life out of it's surrounding."
icon_state = "rust_walker_s"
status_flags = CANPUSH
icon_living = "rust_walker_s"
maxHealth = 75
health = 75
melee_damage_lower = 15
melee_damage_upper = 20
sight = SEE_TURFS
spells_to_add = list(/obj/effect/proc_holder/spell/aoe_turf/rust_conversion/small,/obj/effect/proc_holder/spell/aimed/rust_wave/short)
/mob/living/simple_animal/hostile/eldritch/rust_spirit/setDir(newdir, ismousemovement)
. = ..()
if(newdir == NORTH)
icon_state = "rust_walker_n"
else if(newdir == SOUTH)
icon_state = "rust_walker_s"
update_icon()
/mob/living/simple_animal/hostile/eldritch/rust_spirit/Moved()
. = ..()
playsound(src, 'sound/effects/footstep/rustystep1.ogg', 100, TRUE)
/mob/living/simple_animal/hostile/eldritch/rust_spirit/Life()
if(stat == DEAD)
return ..()
var/turf/T = get_turf(src)
if(istype(T,/turf/open/floor/plating/rust))
adjustBruteLoss(-3, FALSE)
adjustFireLoss(-3, FALSE)
return ..()
/mob/living/simple_animal/hostile/eldritch/ash_spirit
name = "Ash Man"
real_name = "Ashy"
desc = "Incomprehensible abomination actively seeping life out of it's surrounding."
icon_state = "ash_walker"
status_flags = CANPUSH
icon_living = "ash_walker"
maxHealth = 75
health = 75
melee_damage_lower = 15
melee_damage_upper = 20
sight = SEE_TURFS
spells_to_add = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash,/obj/effect/proc_holder/spell/pointed/cleave/long,/obj/effect/proc_holder/spell/aoe_turf/fire_cascade)
/mob/living/simple_animal/hostile/eldritch/stalker
name = "Flesh Stalker"
real_name = "Flesh Stalker"
desc = "Abomination made from severed limbs."
icon_state = "stalker"
status_flags = CANPUSH
icon_living = "stalker"
maxHealth = 150
health = 150
melee_damage_lower = 15
melee_damage_upper = 20
sight = SEE_MOBS
spells_to_add = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash,/obj/effect/proc_holder/spell/targeted/shapeshift/eldritch,/obj/effect/proc_holder/spell/targeted/emplosion/eldritch)
@@ -58,7 +58,7 @@
eyes_overlay.pixel_y = -8
moustache_overlay.pixel_y = -8
cut_overlays(TRUE)
cut_overlays()
add_overlay(body_overlay)
add_overlay(eyes_overlay)
add_overlay(moustache_overlay)
@@ -8,7 +8,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
name = "Guardian Spirit"
real_name = "Guardian Spirit"
desc = "A mysterious being that stands by its charge, ever vigilant."
threat = 5
speak_emote = list("hisses")
gender = NEUTER
mob_biotypes = NONE
@@ -7,7 +7,6 @@
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
gender = FEMALE
threat = 1
response_help_continuous = "pokes"
response_help_simple = "poke"
response_disarm_continuous = "shoves"
@@ -69,7 +68,6 @@
icon_state = "aliens"
icon_living = "aliens"
icon_dead = "aliens_dead"
threat = 3
health = 150
maxHealth = 150
melee_damage_lower = 15
@@ -87,7 +85,6 @@
icon_living = "alienq"
icon_dead = "alienq_dead"
pixel_x = -16
threat = 8
health = 250
maxHealth = 250
melee_damage_lower = 15
@@ -167,7 +164,6 @@
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
threat = -1
a_intent = INTENT_HELP
friendly_verb_continuous = "caresses"
friendly_verb_simple = "caress"
@@ -2,7 +2,6 @@
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "You don't need to be faster than a space bear, you just need to outrun your crewmates."
threat = 1
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
@@ -16,7 +16,6 @@
icon_state = ""
icon_living = ""
icon = 'icons/mob/bees.dmi'
threat = 0.3
gender = FEMALE
speak_emote = list("buzzes")
emote_hear = list("buzzes")
@@ -1,7 +1,6 @@
/mob/living/simple_animal/hostile/boss
name = "A Perfectly Generic Boss Placeholder"
desc = ""
threat = 10
robust_searching = TRUE
stat_attack = UNCONSCIOUS
status_flags = NONE
@@ -7,7 +7,6 @@
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
threat = 0.1
mob_biotypes = MOB_ORGANIC|MOB_BEAST
speak_chance = 0
turns_per_move = 5
@@ -74,7 +73,6 @@
icon_living = "megacarp"
icon_dead = "megacarp_dead"
icon_gib = "megacarp_gib"
threat = 3
regen_amount = 6
maxHealth = 30
@@ -98,7 +96,6 @@
name = "Cayenne"
desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot."
gender = FEMALE
threat = 5
regen_amount = 8
speak_emote = list("squeaks")
@@ -1,7 +1,6 @@
/mob/living/simple_animal/hostile/dark_wizard
name = "Dark Wizard"
desc = "Killing amateurs since the dawn of times."
threat = 3
icon = 'icons/mob/simple_human.dmi'
icon_state = "dark_wizard"
icon_living = "dark_wizard"
@@ -4,7 +4,6 @@
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
threat = 1
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
gender = MALE
speak_chance = 0
@@ -17,7 +17,6 @@
//basic spider mob, these generally guard nests
/mob/living/simple_animal/hostile/poison/giant_spider
threat = 1
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
@@ -9,7 +9,6 @@
icon_state = "crawling"
icon_living = "crawling"
icon_dead = "dead"
threat = 0.5
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 80
maxHealth = 220
@@ -6,7 +6,6 @@
icon_state = "headcrab"
icon_living = "headcrab"
icon_dead = "headcrab_dead"
threat = 1
gender = NEUTER
health = 50
maxHealth = 50
@@ -3,7 +3,6 @@
stop_automated_movement_when_pulled = 0
obj_damage = 40
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls
var/threat = 0 // for dynamic
var/atom/target
var/ranged = FALSE
var/rapid = 0 //How many shots per volley.
@@ -600,6 +599,3 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega
. += M
else if (M.loc.type in hostile_machines)
. += M.loc
/mob/living/simple_animal/hostile/proc/threat()
return threat
@@ -11,7 +11,6 @@
icon_living = "leaper"
icon_dead = "leaper_dead"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
threat = 2
maxHealth = 300
health = 300
ranged = TRUE
@@ -8,7 +8,6 @@
icon_living = "arachnid"
icon_dead = "arachnid_dead"
mob_biotypes = MOB_ORGANIC|MOB_BUG
threat = 2
melee_damage_lower = 30
melee_damage_upper = 30
maxHealth = 300
@@ -14,7 +14,6 @@
icon_living = "mook"
icon_dead = "mook_dead"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
threat = 0.5
pixel_x = -16
maxHealth = 45
health = 45
@@ -13,7 +13,6 @@
icon_state = "seedling"
icon_living = "seedling"
icon_dead = "seedling_dead"
threat = 0.5
maxHealth = 100
health = 100
melee_damage_lower = 30
@@ -5,7 +5,6 @@
icon_living = "tomato"
icon_dead = "tomato_dead"
gender = NEUTER
threat = 0.3
speak_chance = 0
turns_per_move = 5
maxHealth = 30
@@ -23,7 +23,6 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner
name = "blood-drunk miner"
desc = "A miner destined to wander forever, engaged in an endless hunt."
threat = 15
health = 900
maxHealth = 900
icon_state = "miner"
@@ -26,7 +26,6 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum
name = "bubblegum"
desc = "In what passes for a hierarchy among slaughter demons, this one is king."
threat = 35
health = 2500
maxHealth = 2500
attack_verb_continuous = "rends"
@@ -24,7 +24,6 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/megafauna/colossus
name = "colossus"
desc = "A monstrous creature protected by heavy shielding."
threat = 40
health = 2500
maxHealth = 2500
attack_verb_continuous = "judges"
@@ -603,7 +602,6 @@ Difficulty: Very Hard
icon_state = "lightgeist"
icon_living = "lightgeist"
icon_dead = "butterfly_dead"
threat = -0.7
turns_per_move = 1
response_help_continuous = "waves away"
response_help_simple = "wave away"
@@ -38,7 +38,6 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon
name = "ash drake"
desc = "Guardians of the necropolis."
threat = 30
health = 2500
maxHealth = 2500
spacewalk = TRUE
@@ -37,7 +37,6 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant
name = "hierophant"
desc = "A massive metal club that hangs in the air as though waiting. It'll make you dance to its beat."
threat = 30
health = 2500
maxHealth = 2500
attack_verb_continuous = "clubs"
@@ -662,7 +661,7 @@ Difficulty: Normal
continue
to_chat(M.occupant, "<span class='userdanger'>Your [M.name] is struck by a [name]!</span>")
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
M.take_damage(damage, BURN, 0, 0)
M.take_damage(damage, BURN, 0, 0, null, 50)
/obj/effect/hierophant
name = "hierophant beacon"
@@ -18,7 +18,6 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/legion
name = "Legion"
threat = 30
health = 800
maxHealth = 800
spacewalk = TRUE
@@ -8,7 +8,6 @@
icon_aggro = "Basilisk_alert"
icon_dead = "Basilisk_dead"
icon_gib = "syndicate_gib"
threat = 4
mob_biotypes = MOB_ORGANIC|MOB_BEAST
move_to_delay = 20
projectiletype = /obj/item/projectile/temp/basilisk
@@ -10,7 +10,6 @@
move_to_delay = 5
vision_range = 20
aggro_vision_range = 20
threat = 1
maxHealth = 40 //easy to kill, but oh, will you be seeing a lot of them.
health = 40
melee_damage_lower = 10
@@ -11,7 +11,6 @@
robust_searching = TRUE
ranged_ignores_vision = TRUE
ranged = TRUE
threat = 5
obj_damage = 5
vision_range = 6
aggro_vision_range = 18
@@ -25,7 +25,6 @@
icon_aggro = "broodmother"
icon_dead = "egg_sac"
icon_gib = "syndicate_gib"
threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 30
@@ -24,7 +24,6 @@
icon_aggro = "herald"
icon_dead = "herald_dying"
icon_gib = "syndicate_gib"
threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 20
@@ -24,7 +24,6 @@
icon_aggro = "legionnaire"
icon_dead = "legionnaire_dead"
icon_gib = "syndicate_gib"
threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 30
@@ -24,7 +24,6 @@
icon_aggro = "pandora"
icon_dead = "pandora_dead"
icon_gib = "syndicate_gib"
threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 15
@@ -8,7 +8,6 @@
icon_aggro = "Goldgrub_alert"
icon_dead = "Goldgrub_dead"
icon_gib = "syndicate_gib"
threat = 0.2
mob_biotypes = MOB_ORGANIC|MOB_BEAST
vision_range = 2
aggro_vision_range = 9
@@ -10,7 +10,6 @@
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_OPAQUE
threat = 2
move_to_delay = 10
ranged = 1
ranged_cooldown_time = 60
@@ -201,6 +200,8 @@
L.Stun(75)
L.adjustBruteLoss(rand(15,20)) // Less stun more harm
latched = TRUE
for(var/obj/mecha/M in loc)
M.take_damage(20, BRUTE, null, null, null, 25)
if(!latched)
retract()
else
@@ -9,7 +9,6 @@
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC
mouse_opacity = MOUSE_OPACITY_OPAQUE
threat = 4
move_to_delay = 14
ranged = 1
vision_range = 4
@@ -241,7 +240,6 @@
icon_state = "legion"
icon_living = "legion"
icon_dead = "legion"
threat = 5
health = 450
maxHealth = 450
melee_damage_lower = 20
@@ -10,7 +10,6 @@
obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 50
threat = 2
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
@@ -10,7 +10,6 @@
turns_per_move = 5
response_help_continuous = "pushes"
response_help_simple = "push"
threat = 3
speed = 0
maxHealth = 115
health = 115
@@ -10,7 +10,6 @@
speak_chance = 0
turns_per_move = 5
speed = 0
threat = 1
maxHealth = 100
health = 100
harm_intent_damage = 5
@@ -19,7 +19,6 @@
response_harm_continuous = "kicks"
response_harm_simple = "kick"
speed = 0
threat = 1
maxHealth = 75
health = 75
harm_intent_damage = 18
@@ -11,7 +11,6 @@
speak_emote = list("rattles")
emote_see = list("rattles")
a_intent = INTENT_HARM
threat = 0.5
maxHealth = 40
blood_volume = 0
health = 40
@@ -64,7 +63,6 @@
icon_state = "templar"
icon_living = "templar"
icon_dead = "templar_dead"
threat = 1.5
maxHealth = 150
health = 150
weather_immunities = list("snow")
@@ -98,7 +96,6 @@
icon_state = "plasma_miner"
icon_living = "plasma_miner"
icon_dead = "plasma_miner"
threat = 2
maxHealth = 150
health = 150
harm_intent_damage = 10
@@ -116,7 +113,6 @@
icon_state = "plasma_miner_tool"
icon_living = "plasma_miner_tool"
icon_dead = "plasma_miner_tool"
threat = 3
maxHealth = 185
health = 185
harm_intent_damage = 15
@@ -10,7 +10,6 @@
gender = NEUTER
a_intent = INTENT_HARM
mob_biotypes = MOB_HUMANOID
threat = 3
response_help_continuous = "touches"
response_help_simple = "touch"
response_disarm_continuous = "pushes"
@@ -5,7 +5,6 @@
icon_living = "stickman"
icon_dead = "stickman_dead"
icon_gib = "syndicate_gib"
threat = 0.5
mob_biotypes = MOB_HUMANOID
gender = MALE
speak_chance = 0
@@ -25,7 +25,6 @@
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
turns_per_move = 5
threat = 1
speed = 0
stat_attack = UNCONSCIOUS
robust_searching = 1
@@ -7,7 +7,6 @@
icon_dead = "pine_1"
icon_gib = "pine_1"
gender = NEUTER
threat = 1
speak_chance = 0
turns_per_move = 5
response_help_continuous = "brushes"
@@ -8,7 +8,6 @@
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
turns_per_move = 3
threat = 3
speed = 0
maxHealth = 100
health = 100
@@ -11,7 +11,6 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 5
threat = 1
friendly_verb_continuous = "floats near"
friendly_verb_simple = "float near"
speak_emote = list("puffs")
@@ -7,7 +7,6 @@
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
stat_attack = UNCONSCIOUS //braains
threat = 1
maxHealth = 100
health = 100
harm_intent_damage = 5
@@ -146,6 +146,8 @@
var/bare_wound_bonus = 0
//If the attacks from this are sharp
var/sharpness = SHARP_NONE
//Generic flags
var/simple_mob_flags = NONE
/mob/living/simple_animal/Initialize()
. = ..()
+5 -2
View File
@@ -19,8 +19,11 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
to_chat(src, "You can't vent crawl while you're restrained!")
return
if(has_buckled_mobs())
to_chat(src, "You can't vent crawl with other creatures on you!")
return
// attempt once
unbuckle_all_mobs()
if(has_buckled_mobs())
to_chat(src, "You can't vent crawl with other creatures on you!")
return
if(buckled)
to_chat(src, "You can't vent crawl while buckled!")
return