Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into modular_cit_cleaning

This commit is contained in:
Poojawa
2018-09-28 22:09:19 -05:00
1673 changed files with 373816 additions and 89962 deletions
@@ -426,6 +426,7 @@
/datum/sprite_accessory/mam_tails
icon = 'modular_citadel/icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/mam_tails/none
name = "None"
@@ -1430,3 +1431,224 @@ datum/sprite_accessory/mam_tails/tentacle
extra = FALSE
extra2 = FALSE
ckeys_allowed = list("poojawa")
//Lunasune
/datum/sprite_accessory/mam_ears/lunasune
name = "lunasune"
icon_state = "lunasune"
hasinner = 1
extra = TRUE
extra_color_src = MUTCOLORS2
ckeys_allowed = list("invader4352")
/datum/sprite_accessory/mam_tails/lunasune
name = "lunasune"
icon_state = "lunasune"
extra = TRUE
ckeys_allowed = list("invader4352")
/datum/sprite_accessory/mam_tails_animated/lunasune
name = "lunasune"
icon_state = "lunasune"
extra = TRUE
/*************** VIRGO PORTED HAIRS ****************************/
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = "Virgo - " + #_name
//VIRGO PORTED HAIRS
VHAIR(Short Hair Rosa, hair_rosa_s)
VHAIR(Short Hair 80s, hair_80s_s)
VHAIR(Long Bedhead, hair_long_bedhead_s)
VHAIR(Dave, hair_dave_s)
VHAIR(Country, hair_country_s)
VHAIR(Shy, hair_shy_s)
VHAIR(Unshaven Mohawk, hair_unshaven_mohawk_s)
VHAIR(Manbun, hair_manbun_s)
VHAIR(Longer Bedhead, hair_longer_bedhead_s)
VHAIR(Ponytail, hair_ponytail_s)
VHAIR(Ziegler, hair_ziegler_s)
VHAIR(Emo Fringe, hair_emofringe_s)
VHAIR(Very Short Over Eye Alt, hair_veryshortovereyealternate_s)
VHAIR(Shorthime, hair_shorthime_s)
VHAIR(High Tight, hair_hightight_s)
VHAIR(Thinning Front, hair_thinningfront_s)
VHAIR(Big Afro, hair_bigafro_s)
VHAIR(Afro, hair_afro_s)
VHAIR(High Braid, hair_hbraid_s)
VHAIR(Braid, hair_braid_s)
VHAIR(Sargeant, hair_sargeant_s)
VHAIR(Gelled, hair_gelled_s)
VHAIR(Kagami, hair_kagami_s)
VHAIR(ShortTail, hair_stail_s)
VHAIR(Gentle, hair_gentle_s)
VHAIR(Grande, hair_grande_s)
VHAIR(Bobcurl, hair_bobcurl_s)
VHAIR(Pompadeur, hair_pompadour_s)
VHAIR(Plait, hair_plait_s)
VHAIR(Long, hair_long_s)
VHAIR(Rattail, hair_rattail_s)
VHAIR(Tajspiky, hair_tajspiky_s)
VHAIR(Messy, hair_messy_s)
VHAIR(Bangs, hair_bangs_s)
VHAIR(TBraid, hair_tbraid_s)
VHAIR(Toriyama2, hair_toriyama2_s)
VHAIR(CIA, hair_cia_s)
VHAIR(Mulder, hair_mulder_s)
VHAIR(Scully, hair_scully_s)
VHAIR(Nitori, hair_nitori_s)
VHAIR(Joestar, hair_joestar_s)
VHAIR(Ponytail4, hair_ponytail4_s)
VHAIR(Ponytail5, hair_ponytail5_s)
VHAIR(Beehive2, hair_beehive2_s)
VHAIR(Short Braid, hair_shortbraid_s)
VHAIR(Reverse Mohawk, hair_reversemohawk_s)
VHAIR(SHort Bangs, hair_shortbangs_s)
VHAIR(Half Shaved, hair_halfshaved_s)
VHAIR(Longer Alt 2, hair_longeralt2_s)
VHAIR(Bun, hair_bun_s)
VHAIR(Curly, hair_curly_s)
VHAIR(Victory, hair_victory_s)
VHAIR(Ponytail6, hair_ponytail6_s)
VHAIR(Undercut3, hair_undercut3_s)
VHAIR(Bobcut Alt, hair_bobcultalt_s)
VHAIR(Fingerwave, hair_fingerwave_s)
VHAIR(Oxton, hair_oxton_s)
VHAIR(Poofy2, hair_poofy2_s)
VHAIR(Fringe Tail, hair_fringetail_s)
VHAIR(Bun3, hair_bun3_s)
VHAIR(Wisp, hair_wisp_s)
VHAIR(Undercut2, hair_undercut2_s)
VHAIR(TBob, hair_tbob_s)
VHAIR(Spiky Ponytail, hair_spikyponytail_s)
VHAIR(Rowbun, hair_rowbun_s)
VHAIR(Rowdualtail, hair_rowdualtail_s)
VHAIR(Rowbraid, hair_rowbraid_s)
VHAIR(Shaved Mohawk, hair_shavedmohawk_s)
VHAIR(Topknot, hair_topknot_s)
VHAIR(Ronin, hair_ronin_s)
VHAIR(Bowlcut2, hair_bowlcut2_s)
VHAIR(Thinning Rear, hair_thinningrear_s)
VHAIR(Thinning, hair_thinning_s)
VHAIR(Jade, hair_jade_s)
VHAIR(Bedhead, hair_bedhead_s)
VHAIR(Dreadlocks, hair_dreads_s)
VHAIR(Very Long, hair_vlong_s)
VHAIR(Jensen, hair_jensen_s)
VHAIR(Halfbang, hair_halfbang_s)
VHAIR(Kusangi, hair_kusangi_s)
VHAIR(Ponytail, hair_ponytail_s)
VHAIR(Ponytail3, hair_ponytail3_s)
VHAIR(Halfbang Alt, hair_halfbang_alt_s)
VHAIR(Bedhead V2, hair_bedheadv2_s)
VHAIR(Long Fringe, hair_longfringe_s)
VHAIR(Flair, hair_flair_s)
VHAIR(Bedhead V3, hair_bedheadv3_s)
VHAIR(Himecut, hair_himecut_s)
VHAIR(Curls, hair_curls_s)
VHAIR(Very Long Fringe, hair_vlongfringe_s)
VHAIR(Longest, hair_longest_s)
VHAIR(Father, hair_father_s)
VHAIR(Emo Long, hair_emolong_s)
VHAIR(Short Hair 3, hair_shorthair3_s)
VHAIR(Double Bun, hair_doublebun_s)
VHAIR(Sleeze, hair_sleeze_s)
VHAIR(Twintail, hair_twintail_s)
VHAIR(Emo 2, hair_emo2_s)
VHAIR(Low Fade, hair_lowfade_s)
VHAIR(Med Fade, hair_medfade_s)
VHAIR(High Fade, hair_highfade_s)
VHAIR(Bald Fade, hair_baldfade_s)
VHAIR(No Fade, hair_nofade_s)
VHAIR(Trim Flat, hair_trimflat_s)
VHAIR(Shaved, hair_shaved_s)
VHAIR(Trimmed, hair_trimmed_s)
VHAIR(Tight Bun, hair_tightbun_s)
VHAIR(Short Hair 4, hair_d_s)
VHAIR(Short Hair 5, hair_e_s)
VHAIR(Short Hair 6, hair_f_s)
VHAIR(Skinhead, hair_skinhead_s)
VHAIR(Afro2, hair_afro2_s)
VHAIR(Bobcut, hair_bobcut_s)
VHAIR(Emo, hair_emo_s)
VHAIR(Long Over Eye, hair_longovereye_s)
VHAIR(Feather, hair_feather_s)
VHAIR(Hitop, hair_hitop_s)
VHAIR(Short Over Eye, hair_shortoverye_s)
VHAIR(Straight, hair_straight_s)
VHAIR(Buzzcut, hair_buzzcut_s)
VHAIR(Combover, hair_combover_s)
VHAIR(Crewcut, hair_crewcut_s)
VHAIR(Devillock, hair_devilock_s)
VHAIR(Clean, hair_clean_s)
VHAIR(Shaggy, hair_shaggy_s)
VHAIR(Updo, hair_updo_s)
VHAIR(Mohawk, hair_mohawk_s)
VHAIR(Odango, hair_odango_s)
VHAIR(Ombre, hair_ombre_s)
VHAIR(Parted, hair_parted_s)
VHAIR(Quiff, hair_quiff_s)
VHAIR(Volaju, hair_volaju_s)
VHAIR(Bun2, hair_bun2_s)
VHAIR(Rows1, hair_rows1_s)
VHAIR(Rows2, hair_rows2_s)
VHAIR(Dandy Pompadour, hair_dandypompadour_s)
VHAIR(Poofy, hair_poofy_s)
VHAIR(Toriyama, hair_toriyama_s)
VHAIR(Drillruru, hair_drillruru_s)
VHAIR(Bowlcut, hair_bowlcut_s)
VHAIR(Coffee House, hair_coffeehouse_s)
VHAIR(Family Man, hair_thefamilyman_s)
VHAIR(Shaved Part, hair_shavedpart_s)
VHAIR(Modern, hair_modern_s)
VHAIR(One Shoulder, hair_oneshoulder_s)
VHAIR(Very Short Over Eye, hair_veryshortovereye_s)
VHAIR(Unkept, hair_unkept_s)
VHAIR(Wife, hair_wife_s)
VHAIR(Nia, hair_nia_s)
VHAIR(Undercut, hair_undercut_s)
VHAIR(Bobcut Alt, hair_bobcutalt_s)
VHAIR(Short Hair 4 alt, hair_shorthair4_s)
VHAIR(Tressshoulder, hair_tressshoulder_s)
//END
#undef VHAIR
#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name="Virgo" + #_name
VFACE(Watson, facial_watson_s)
VFACE(Chaplin, facial_chaplin_s)
VFACE(Fullbeard, facial_fullbeard_s)
VFACE(Vandyke, facial_vandyke_s)
VFACE(Elvis, facial_elvis_s)
VFACE(Abe, facial_abe_s)
VFACE(Chin, facial_chin_s)
VFACE(GT, facial_gt_s)
VFACE(Hip, facial_hip_s)
VFACE(Hogan, facial_hogan_s)
VFACE(Selleck, facial_selleck_s)
VFACE(Neckbeard, facial_neckbeard_s)
VFACE(Longbeard, facial_longbeard_s)
VFACE(Dwarf, facial_dwarf_s)
VFACE(Sideburn, facial_sideburn_s)
VFACE(Mutton, facial_mutton_s)
VFACE(Moustache, facial_moustache_s)
VFACE(Pencilstache, facial_pencilstache_s)
VFACE(Goatee, facial_goatee_s)
VFACE(Smallstache, facial_smallstache_s)
VFACE(Volaju, facial_volaju_s)
VFACE(3 O\'clock, facial_3oclock_s)
VFACE(5 O\'clock, facial_5oclock_s)
VFACE(7 O\'clock, facial_7oclock_s)
VFACE(5 O\'clock Moustache, facial_5oclockmoustache_s)
VFACE(7 O\'clock, facial_7oclockmoustache_s)
VFACE(Walrus, facial_walrus_s)
VFACE(Muttonmus, facial_muttonmus_s)
VFACE(Wise, facial_wise_s)
VFACE(Martial Artist, facial_martialartist_s)
VFACE(Dorsalfnil, facial_dorsalfnil_s)
VFACE(Hornadorns, facial_hornadorns_s)
VFACE(Spike, facial_spike_s)
VFACE(Chinhorns, facial_chinhorns_s)
VFACE(Cropped Fullbeard, facial_croppedfullbeard_s)
VFACE(Chinless Beard, facial_chinlessbeard_s)
VFACE(Moonshiner, facial_moonshiner_s)
VFACE(Tribearder, facial_tribearder_s)
#undef VFACE
@@ -0,0 +1,42 @@
/mob/living/carbon/human/species/mammal
race = /datum/species/mammal
/mob/living/carbon/human/species/avian
race = /datum/species/avian
/mob/living/carbon/human/species/aquatic
race = /datum/species/aquatic
/mob/living/carbon/human/species/insect
race = /datum/species/insect
/mob/living/carbon/human/species/xeno
race = /datum/species/xeno
/mob/living/carbon/human/resist()
. = ..()
if(wear_suit && wear_suit.breakouttime)//added in human cuff breakout proc
return
if(.)
if(canmove && !on_fire)
for(var/obj/item/bodypart/L in bodyparts)
if(istype(L) && L.embedded_objects.len)
for(var/obj/item/I in L.embedded_objects)
if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
return FALSE //Hands are occupied
return
/mob/living/carbon/human/proc/remove_embedded_unsafe(obj/item/bodypart/L, obj/item/I, mob/user, painmul = 1)
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more
I.forceMove(get_turf(src))
user.put_in_hands(I)
user.emote("scream")
user.visible_message("[user] rips [I] out of [user.p_their()] [L.name]!","<span class='notice'>You remove [I] from your [L.name].</span>")
if(!has_embedded_objects())
clear_alert("embeddedobject")
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "embedded")
return
@@ -9,7 +9,7 @@
if(M.mind)
attacker_style = M.mind.martial_art
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
add_logs(M, H, "attempted to touch")
log_combat(M, H, "attempted to touch")
H.visible_message("<span class='warning'>[M] attempted to touch [H]!</span>")
return TRUE
switch(M.a_intent)
@@ -49,7 +49,7 @@
"<span class='userdanger'>[user] has pushed [target]!</span>", null, COMBAT_MESSAGE_RANGE)
target.apply_effect(40, EFFECT_KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
target.forcesay(GLOB.hit_appends)
add_logs(user, target, "disarmed", " pushing them to the ground")
log_combat(user, target, "disarmed", " pushing them to the ground")
return
playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -5,7 +5,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "body_markings" = "husky", "mam_tail" = "husky", "mam_ears" = "husky", "mam_body_markings" = "husky", "taur" = "None")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "snout" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -13,9 +13,34 @@
liked_food = MEAT | FRIED
disliked_food = TOXIC
//Curiosity killed the cat's wagging tail.
/datum/species/mammal/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
stop_wagging_tail(H)
/datum/species/mammal/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/mammal/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/mammal/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/mammal/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/mammal/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/mammal/qualifies_for_rank(rank, list/features)
return TRUE
@@ -27,6 +52,7 @@
/datum/species/mammal/on_species_loss(mob/living/carbon/human/C)
C.draw_citadel_parts(TRUE)
. = ..()
//AVIAN//
/datum/species/avian
name = "Avian"
@@ -36,7 +62,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
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")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "snout" = "Beak", "wings" = "None", "taur" = "None", "mam_body_markings" = "Hawk", "mam_tail" = "Hawk")
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -45,7 +71,30 @@
/datum/species/avian/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
stop_wagging_tail(H)
/datum/species/avian/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/avian/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/avian/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/avian/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/avian/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/avian/qualifies_for_rank(rank, list/features)
return TRUE
@@ -66,7 +115,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
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")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "Shark", "mam_body_markings" = "Shark", "mam_ears" = "None", "snout" = "Round")
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -76,7 +125,30 @@
/datum/species/aquatic/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
stop_wagging_tail(H)
/datum/species/aquatic/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/aquatic/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/aquatic/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/aquatic/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/aquatic/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/aquatic/qualifies_for_rank(rank, list/features)
return TRUE
@@ -97,7 +169,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur", "moth_wings")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "None")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "Moth", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "Plain", "snout" = "None")
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -106,7 +178,30 @@
/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
H.endTailWag()
stop_wagging_tail(H)
/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/insect/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/insect/qualifies_for_rank(rank, list/features)
return TRUE
@@ -122,14 +217,14 @@
//Alien//
/datum/species/xeno
// A cloning mistake, crossing human and xenomorph DNA
name = "xeno"
name = "Xeno Hybrid"
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "legs", "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")
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur", "mam_body_markings")
default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "Xeno")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -139,12 +234,20 @@
damage_overlay_type = "xeno"
liked_food = MEAT
/datum/species/xeno/on_species_gain(mob/living/carbon/human/C)
/datum/species/xeno/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
C.draw_citadel_parts()
if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
species_traits += DIGITIGRADE
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
. = ..()
/datum/species/xeno/on_species_loss(mob/living/carbon/human/C)
/datum/species/xeno/on_species_loss(mob/living/carbon/human/C, datum/species/new_species)
C.draw_citadel_parts(TRUE)
if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Normal Legs")
species_traits -= DIGITIGRADE
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
. = ..()
//Praise the Omnissiah, A challange worthy of my skills - HS
@@ -157,4 +260,4 @@
no_vore = TRUE
/mob/living/carbon/human/vore
devourable = TRUE
devourable = TRUE
@@ -94,7 +94,7 @@
organ.forceMove(get_turf(H))
qdel(organ)
H.update_body()
else if (select_alteration == "Ears")
var/list/snowflake_ears_list = list("Normal" = null)
for(var/path in GLOB.mam_ears_list)
@@ -108,7 +108,7 @@
if(new_ears)
H.dna.features["mam_ears"] = new_ears
H.update_body()
else if (select_alteration == "Tail")
var/list/snowflake_tails_list = list("Normal" = null)
for(var/path in GLOB.mam_tails_list)
@@ -124,7 +124,7 @@
if(new_tail != "None")
H.dna.features["taur"] = "None"
H.update_body()
else if (select_alteration == "Taur body")
var/list/snowflake_taur_list = list("Normal" = null)
for(var/path in GLOB.taur_list)
@@ -34,8 +34,6 @@
/mob/living/Move(atom/newloc, direct)
. = ..()
if(.)
if(makesfootstepsounds)
CitFootstep(newloc)
pseudo_z_axis = newloc.get_fake_z()
pixel_z = pseudo_z_axis
@@ -32,6 +32,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
..()
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
log_combat(user, A, "bit")
/obj/item/dogborg/jaws/small/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
@@ -74,8 +75,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
C.update_inv_handcuffed(0)
to_chat(user,"<span class='notice'>You handcuff [C].</span>")
playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
add_logs(user, C, "handcuffed")
playsound(loc, pick('sound/voice/beepsky/criminal.ogg', 'sound/voice/beepsky/justice.ogg', 'sound/voice/beepsky/freeze.ogg'), 50, FALSE)
log_combat(user, C, "handcuffed")
else
to_chat(user,"<span class='warning'>You fail to handcuff [C]!</span>")
@@ -90,7 +91,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
flags_1 = CONDUCT_1
force = 0
throwforce = 0
attack_verb = list("nuzzled", "nosed", "booped")
attack_verb = list("nuzzles", "pushes", "boops")
w_class = 1
/obj/item/analyzer/nose/attack_self(mob/user)
@@ -151,8 +152,12 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens
. = ..()
//Delivery
/obj/item/analyzer/nose/afterattack(atom/target, mob/user)
. = ..()
do_attack_animation(target, null, src)
user.visible_message("<span class='notice'>[user] [pick(attack_verb)] \the [target.name] with their nose!</span>")
//Delivery
/obj/item/storage/bag/borgdelivery
name = "fetching storage"
desc = "Fetch the thing!"
@@ -176,6 +181,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
icon_state = "synthtongue"
hitsound = 'sound/effects/attackblob.ogg'
cleanspeed = 80
var/status = 0
/obj/item/soap/tongue/scrubpup
cleanspeed = 25 //slightly faster than a mop.
@@ -192,18 +198,22 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/soap/tongue/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
name = "hacked tongue of doom"
desc = "Your tongue has been upgraded successfully. Congratulations."
icon = 'icons/mob/dogborg.dmi'
icon_state = "syndietongue"
cleanspeed = 10 //(nerf'd)tator soap stat
else
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon = 'icons/mob/dogborg.dmi'
icon_state = "synthtongue"
cleanspeed = initial(cleanspeed)
if(R.cell && R.cell.charge > 100)
if(R.emagged && status == 0)
status = !status
name = "energized tongue"
desc = "Your tongue is energized for dangerously maximum efficency."
icon_state = "syndietongue"
to_chat(user, "<span class='notice'>Your tongue is now [status ? "Energized" : "Normal"].</span>")
cleanspeed = 10 //(nerf'd)tator soap stat
else
status = 0
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon_state = "synthtongue"
cleanspeed = initial(cleanspeed)
if(R.emagged)
to_chat(user, "<span class='notice'>Your tongue is now [status ? "Energized" : "Normal"].</span>")
update_icon()
/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
@@ -223,77 +233,74 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
else if(isobj(target)) //hoo boy. danger zone man
if(istype(target,/obj/item/trash))
R.visible_message("[R] nibbles away at \the [target.name].", "<span class='warning'>You begin to nibble away at \the [target.name]...</span>")
if(do_after(R, src.cleanspeed, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
qdel(target)
R.cell.give(250)
if(!do_after(R, src.cleanspeed, target = target))
return //If they moved away, you can't eat them.
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
qdel(target)
R.cell.give(250)
return
if(istype(target,/obj/item/stock_parts/cell))
R.visible_message("[R] begins cramming \the [target.name] down its throat.", "<span class='warning'>You begin cramming \the [target.name] down your throat...</span>")
if(do_after(R, 50, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
var/obj/item/stock_parts/cell.C = target
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
qdel(target)
if(!do_after(R, 50, target = target))
return //If they moved away, you can't eat them.
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
var/obj/item/stock_parts/cell.C = target
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
qdel(target)
return
var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT
if(!I.anchored && R.emagged)
R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "<span class='warning'>You begin chewing up \the [target.name]...</span>")
if(do_after(R, 100, target = I)) //Nerf dat time yo
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
return //If they moved away, you can't eat them.
visible_message("<span class='warning'>[R] chews up \the [target.name] and cleans off the debris!</span>")
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
qdel(I)
R.cell.give(500)
if(!do_after(R, 100, target = I)) //Nerf dat time yo
return //If they moved away, you can't eat them.
visible_message("<span class='warning'>[R] chews up \the [target.name] and cleans off the debris!</span>")
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
qdel(I)
R.cell.give(500)
return
R.visible_message("[R] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after(R, src.cleanspeed, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't clean them.
to_chat(R,"<span class='notice'>You clean \the [target.name].</span>")
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
else if(ishuman(target))
if(R.emagged)
var/mob/living/L = target
if(R.cell.charge <= 666)
var/mob/living/L = target
if(status == 0 && check_zone(R.zone_selected) == "head")
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [L]'s face!</span>", "<span class='notice'>You affectionally lick \the [L]'s face!</span>")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
if(istype(L) && L.fire_stacks > 0)
L.adjust_fire_stacks(-10)
return
else if(status == 0)
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [L]!</span>", "<span class='notice'>You affectionally lick \the [L]!</span>")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
if(istype(L) && L.fire_stacks > 0)
L.adjust_fire_stacks(-10)
return
else
if(R.cell.charge <= 800)
to_chat(R, "Insufficent Power!")
return
L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
L.Knockdown(80)
L.apply_effect(EFFECT_STUTTER, 4)
L.visible_message("<span class='danger'>[R] has shocked [L] with its tongue!</span>", \
"<span class='userdanger'>[R] has shocked you with its tongue! You can feel the betrayal.</span>")
"<span class='userdanger'>[R] has shocked you with its tongue!</span>")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
R.cell.use(666)
else
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [target]'s face!</span>", "<span class='notice'>You affectionally lick \the [target]'s face!</span>")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
var/mob/living/L = target
if(istype(L) && L.fire_stacks > 0)
L.adjust_fire_stacks(-10)
return
log_combat(R, L, "tongue stunned")
else if(istype(target, /obj/structure/window))
R.visible_message("[R] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after(R, src.cleanspeed, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't clean them.
to_chat(R, "<span class='notice'>You clean \the [target.name].</span>")
target.color = initial(target.color)
if(do_after(user, src.cleanspeed, target = target))
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
target.set_opacity(initial(target.opacity))
else
R.visible_message("[R] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after(R, src.cleanspeed, target = target))
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't clean them.
to_chat(R, "<span class='notice'>You clean \the [target.name].</span>")
if(do_after(user, src.cleanspeed, target = target))
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
target.wash_cream()
return
@@ -385,6 +392,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
log_combat(src, L, "borg pounced")
else
Knockdown(45, 1, 1)
@@ -88,7 +88,7 @@
cyborg_pixel_offset = -16
/obj/item/robot_module/scrubpup
name = "Janitor"
name = "Scrub Pup"
basic_modules = list(
/obj/item/dogborg/jaws/small,
/obj/item/analyzer/nose,