Merge branch 'master' into upstream-merge-32277

This commit is contained in:
LetterJay
2017-10-31 03:09:38 -04:00
committed by GitHub
60 changed files with 464 additions and 201 deletions
+18
View File
@@ -130,6 +130,10 @@
var/backpack_contents = -1
var/suit_store = -1
var/hair_style
var/facial_hair_style
var/skin_tone
/obj/effect/mob_spawn/human/Initialize()
if(ispath(outfit))
outfit = new outfit()
@@ -147,6 +151,20 @@
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
if(hair_style)
H.hair_style = hair_style
else
H.hair_style = random_hair_style(gender)
if(facial_hair_style)
H.facial_hair_style = facial_hair_style
else
H.facial_hair_style = random_facial_hair_style(gender)
if(skin_tone)
H.skin_tone = skin_tone
else
H.skin_tone = random_skin_tone()
H.update_hair()
H.update_body()
if(outfit)
var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store")
for(var/slot in slots)
+12 -2
View File
@@ -259,9 +259,19 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR)
set category = "OOC"
set desc ="Ignore a player's messages on the OOC channel"
var/selection = input("Please, select a player!", "Ignore", null, null) as null|anything in sortKey(GLOB.clients)
if(!selection)
var/see_ghost_names = isobserver(mob)
var/list/choices = list()
for(var/client/C in GLOB.clients)
if(isobserver(C.mob) && see_ghost_names)
choices["[C.mob]([C])"] = C
else
choices[C] = C
choices = sortList(choices)
var/selection = input("Please, select a player!", "Ignore", null, null) as null|anything in choices
if(!selection || !(selection in choices))
return
selection = choices[selection]
if(selection == src)
to_chat(src, "You can't ignore yourself.")
return
+8 -5
View File
@@ -4,8 +4,9 @@
name = "Meteor Wave: Normal"
typepath = /datum/round_event/meteor_wave
weight = 4
min_players = 5
min_players = 15
max_occurrences = 3
earliest_start = 25 MINUTES
/datum/round_event/meteor_wave
startWhen = 6
@@ -54,9 +55,10 @@
/datum/round_event_control/meteor_wave/threatening
name = "Meteor Wave: Threatening"
typepath = /datum/round_event/meteor_wave/threatening
weight = 2
min_players = 5
weight = 5
min_players = 20
max_occurrences = 3
earliest_start = 35 MINUTES
/datum/round_event/meteor_wave/threatening
wave_name = "threatening"
@@ -64,9 +66,10 @@
/datum/round_event_control/meteor_wave/catastrophic
name = "Meteor Wave: Catastrophic"
typepath = /datum/round_event/meteor_wave/catastrophic
weight = 1
min_players = 5
weight = 7
min_players = 25
max_occurrences = 3
earliest_start = 45 MINUTES
/datum/round_event/meteor_wave/catastrophic
wave_name = "catastrophic"
@@ -194,6 +194,7 @@
break
if(O.name == params["name"])
O.forceMove(drop_location())
adjust_item_drop_location(O)
desired--
return TRUE
return FALSE
+34 -38
View File
@@ -75,24 +75,54 @@
/datum/emote/living/carbon/human/wag/run_emote(mob/user, params)
. = ..()
var/mob/living/carbon/human/H = user
if(.)
if(!H.is_wagging_tail())
H.startTailWag()
else
H.endTailWag()
/mob/living/carbon/human/proc/is_wagging_tail()
return (dna && dna.species && ("waggingtail_lizard" in dna.species.mutant_bodyparts || "waggingtail_human" in dna.species.mutant_bodyparts))
/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check = TRUE)
if(!..())
return FALSE
var/mob/living/carbon/human/H = user
if(H.dna && H.dna.species && ((H.dna.features["tail_lizard"] != "None") || (H.dna.features["tail_human"] != "None") || ("mam_tail" in H.dna.species.mutant_bodyparts)))
if(H.dna && H.dna.species && (("tail_lizard" in H.dna.species.mutant_bodyparts) || ("waggingtail_lizard" in H.dna.species.mutant_bodyparts) || (H.dna.features["tail_human"] != "None")))
return TRUE
/datum/emote/living/carbon/human/wag/select_message_type(mob/user)
. = ..()
var/mob/living/carbon/human/H = user
if(("waggingtail_lizard" in H.dna.species.mutant_bodyparts) || ("waggingtail_human" in H.dna.species.mutant_bodyparts) || ("mam_waggingtail" in H.dna.species.mutant_bodyparts))
if(("waggingtail_lizard" in H.dna.species.mutant_bodyparts) || ("waggingtail_human" in H.dna.species.mutant_bodyparts))
. = null
//Don't know where else to put this, it's basically an emote
/mob/living/carbon/human/proc/startTailWag()
if(!dna || !dna.species)
return
if("tail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_lizard"
dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail_lizard"
dna.species.mutant_bodyparts |= "waggingspines"
if("tail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_human"
dna.species.mutant_bodyparts |= "waggingtail_human"
update_body()
/mob/living/carbon/human/proc/endTailWag()
if(!dna || !dna.species)
return
if("waggingtail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_lizard"
dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail_lizard"
dna.species.mutant_bodyparts |= "spines"
if("waggingtail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_human"
dna.species.mutant_bodyparts |= "tail_human"
update_body()
/datum/emote/living/carbon/human/wing
key = "wing"
key_third_person = "wings"
@@ -121,41 +151,7 @@
var/mob/living/carbon/human/H = user
if(H.dna && H.dna.species && (H.dna.features["wings"] != "None"))
return TRUE
//Don't know where else to put this, it's basically an emote
/mob/living/carbon/human/proc/startTailWag()
if(!dna || !dna.species)
return
if("tail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_lizard"
dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail_lizard"
dna.species.mutant_bodyparts |= "waggingspines"
if("tail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail_human"
dna.species.mutant_bodyparts |= "waggingtail_human"
if("mam_tail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "mam_tail"
dna.species.mutant_bodyparts |= "mam_waggingtail"
update_body()
/mob/living/carbon/human/proc/endTailWag()
if(!dna || !dna.species)
return
if("waggingtail_lizard" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_lizard"
dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail_lizard"
dna.species.mutant_bodyparts |= "spines"
if("waggingtail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_human"
dna.species.mutant_bodyparts |= "tail_human"
if("mam_waggingtail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "mam_waggingtail"
dna.species.mutant_bodyparts |= "mam_tail"
update_body()
/mob/living/carbon/human/proc/OpenWings()
if(!dna || !dna.species)
return
@@ -22,6 +22,7 @@
limbs_id = "golem"
fixed_mut_color = "aaa"
var/info_text = "As an <span class='danger'>Iron Golem</span>, you don't have any special traits."
var/random_eligible = TRUE //If false, the golem subtype can't be made through golem mutation toxin
var/prefix = "Iron"
var/list/special_names
@@ -44,6 +45,7 @@
name = "Random Golem"
blacklisted = FALSE
dangerous_existence = FALSE
var/static/list/random_golem_types
/datum/species/golem/random/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
@@ -601,7 +603,7 @@
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>clockwork golem</span><span class='bold alloy'>, you are faster than \
other types of golem (being a machine), and are immune to electric shocks.</span>"
species_traits = list(NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, VIRUSIMMUNE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE)
armor = 40 //Reinforced, but also slim to allow for fast movement
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
sexes = FALSE
@@ -643,7 +645,8 @@
has_corpse = TRUE
blacklisted = TRUE
dangerous_existence = TRUE
random_eligible = FALSE
/datum/species/golem/cloth
name = "Cloth Golem"
id = "cloth golem"
@@ -12,6 +12,8 @@
name = "Syndicate Operative"
id_job = "Operative"
id_access_list = list(ACCESS_SYNDICATE)
hair_style = "Bald"
facial_hair_style = "Shaved"
outfit = /datum/outfit/syndicatesoldiercorpse
/datum/outfit/syndicatesoldiercorpse
@@ -31,6 +33,8 @@
name = "Syndicate Commando"
id_job = "Operative"
id_access_list = list(ACCESS_SYNDICATE)
hair_style = "Bald"
facial_hair_style = "Shaved"
outfit = /datum/outfit/syndicatecommandocorpse
/datum/outfit/syndicatecommandocorpse
@@ -50,6 +54,8 @@
name = "Syndicate Stormtrooper"
id_job = "Operative"
id_access_list = list(ACCESS_SYNDICATE)
hair_style = "Bald"
facial_hair_style = "Shaved"
outfit = /datum/outfit/syndicatestormtroopercorpse
/datum/outfit/syndicatestormtroopercorpse
@@ -67,11 +73,16 @@
/obj/effect/mob_spawn/human/clown/corpse
roundstart = FALSE
instant = TRUE
skin_tone = "caucasian1"
hair_style = "Bald"
facial_hair_style = "Shaved"
/obj/effect/mob_spawn/human/corpse/pirate
name = "Pirate"
skin_tone = "Caucasian1" //all pirates are white because it's easier that way
outfit = /datum/outfit/piratecorpse
hair_style = "Bald"
facial_hair_style = "Shaved"
/datum/outfit/piratecorpse
name = "Pirate Corpse"
@@ -94,12 +105,17 @@
/obj/effect/mob_spawn/human/corpse/russian
name = "Russian"
outfit = /datum/outfit/russiancorpse
hair_style = "Bald"
facial_hair_style = "Shaved"
/datum/outfit/russiancorpse
name = "Russian Corpse"
uniform = /obj/item/clothing/under/soviet
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/bearpelt
gloves = /obj/item/clothing/gloves/color/black
mask = /obj/item/clothing/mask/gas
/obj/effect/mob_spawn/human/corpse/russian/ranged
@@ -109,6 +125,7 @@
name = "Ranged Russian Corpse"
head = /obj/item/clothing/head/ushanka
/obj/effect/mob_spawn/human/corpse/russian/ranged/trooper
outfit = /datum/outfit/russiancorpse/ranged/trooper
@@ -119,8 +136,8 @@
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/balaclava
head = /obj/item/clothing/head/helmet/alt
mask = /obj/item/clothing/mask/balaclava
/obj/effect/mob_spawn/human/corpse/russian/ranged/officer
@@ -131,7 +148,7 @@
name = "Russian Officer Corpse"
uniform = /obj/item/clothing/under/rank/security/navyblue/russian
suit = /obj/item/clothing/suit/security/officer/russian
shoes = /obj/item/clothing/shoes/laceup
shoes = /obj/item/clothing/shoes/combat
ears = /obj/item/device/radio/headset
head = /obj/item/clothing/head/ushanka
@@ -139,6 +156,9 @@
/obj/effect/mob_spawn/human/corpse/wizard
name = "Space Wizard Corpse"
outfit = /datum/outfit/wizardcorpse
hair_style = "Bald"
facial_hair_style = "Long Beard"
skin_tone = "Caucasian1"
/datum/outfit/wizardcorpse
name = "Space Wizard Corpse"
@@ -153,6 +173,8 @@
id_job = "Private Security Force"
id_access = "Security Officer"
outfit = /datum/outfit/nanotrasensoldiercorpse2
hair_style = "Bald"
facial_hair_style = "Shaved"
/datum/outfit/nanotrasensoldiercorpse2
name = "NT Private Security Officer Corpse"
@@ -23,7 +23,7 @@
environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 0
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file
name = "Nanotrasen Private Security Officer"
desc = "An officer part of Nanotrasen's private security force."
icon = 'icons/mob/simple_human.dmi'
@@ -45,8 +45,6 @@
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
anchored = TRUE
gold_core_spawnable = 1
var/cannot_be_seen = 1
var/mob/living/creator = null
@@ -62,11 +62,13 @@
/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
if(beaker)
beaker.loc = src.loc
beaker.forceMove(drop_location())
adjust_item_drop_location(beaker)
beaker = null
reagents.clear_reagents()
if(bottle)
bottle.loc = src.loc
bottle.forceMove(drop_location())
adjust_item_drop_location(bottle)
bottle = null
return
@@ -153,7 +155,8 @@
switch(action)
if("eject")
if(beaker)
beaker.loc = src.loc
beaker.forceMove(drop_location())
adjust_item_drop_location(beaker)
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
@@ -161,7 +164,8 @@
if("ejectp")
if(bottle)
bottle.loc = src.loc
bottle.forceMove(drop_location())
adjust_item_drop_location(bottle)
bottle = null
. = TRUE
@@ -214,16 +218,15 @@
if(bottle && bottle.contents.len < bottle.storage_slots)
P = new/obj/item/reagent_containers/pill(bottle)
else
P = new/obj/item/reagent_containers/pill(src.loc)
P = new/obj/item/reagent_containers/pill(drop_location())
P.name = trim("[name] pill")
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
adjust_item_drop_location(P)
reagents.trans_to(P,vol_each)
else
var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
return
var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(src.loc)
var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location())
P.originalname = name
P.name = trim("[name] pack")
@@ -248,10 +251,9 @@
var/obj/item/reagent_containers/pill/P
for(var/i = 0; i < amount; i++)
P = new/obj/item/reagent_containers/pill/patch(src.loc)
P = new/obj/item/reagent_containers/pill/patch(drop_location())
P.name = trim("[name] patch")
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
adjust_item_drop_location(P)
reagents.trans_to(P,vol_each)
. = TRUE
@@ -264,7 +266,7 @@
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
return
var/obj/item/reagent_containers/food/condiment/P = new(src.loc)
var/obj/item/reagent_containers/food/condiment/P = new(drop_location())
P.originalname = name
P.name = trim("[name] bottle")
reagents.trans_to(P, P.volume)
@@ -280,15 +282,15 @@
var/obj/item/reagent_containers/glass/bottle/P
for(var/i = 0; i < amount_full; i++)
P = new/obj/item/reagent_containers/glass/bottle(src.loc)
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
P = new/obj/item/reagent_containers/glass/bottle(drop_location())
P.name = trim("[name] bottle")
adjust_item_drop_location(P)
reagents.trans_to(P, 30)
if(vol_part)
P = new/obj/item/reagent_containers/glass/bottle(src.loc)
P = new/obj/item/reagent_containers/glass/bottle(drop_location())
P.name = trim("[name] bottle")
adjust_item_drop_location(P)
reagents.trans_to(P, vol_part)
. = TRUE
@@ -328,6 +330,29 @@
return 0
/obj/machinery/chem_master/adjust_item_drop_location(atom/movable/AM) // Special version for chemmasters and condimasters
if (AM == beaker)
AM.pixel_x = -8
AM.pixel_y = 8
return null
else if (AM == bottle)
if (length(bottle.contents))
AM.pixel_x = -13
else
AM.pixel_x = -7
AM.pixel_y = -8
return null
else
var/md5 = md5(AM.name)
#if DM_VERSION > 511
#warn Refactor the loop in /obj/machinery/chem_master/adjust_item_drop_location() to make use of 512's list-like access to characters in a string
#endif
for (var/i in 1 to 32)
. += hex2num(copytext(md5,i,i+1))
. = . % 9
AM.pixel_x = ((.%3)*6)
AM.pixel_y = -8 + (round( . / 3)*8)
/obj/machinery/chem_master/condimaster
name = "CondiMaster 3000"
desc = "Used to create condiments and other cooking supplies."
@@ -66,7 +66,7 @@
/obj/machinery/smoke_machine/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
if(istype(I, /obj/item/reagent_containers))
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
var/obj/item/reagent_containers/RC = I
var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this)
if(units)
+15 -17
View File
@@ -124,39 +124,37 @@
cut_overlays()
. = ..()
if(dropped) //certain overlays only appear when the limb is being detached from its owner.
var/datum/sprite_accessory/S
if(status != BODYPART_ROBOTIC) //having a robotic head hides certain features.
//facial hair
if(facial_hair_style)
S = GLOB.facial_hair_styles_list[facial_hair_style]
var/datum/sprite_accessory/S = GLOB.facial_hair_styles_list[facial_hair_style]
if(S)
var/image/facial_overlay = image(S.icon, "[S.icon_state]", -HAIR_LAYER, SOUTH)
facial_overlay.color = "#" + facial_hair_color
facial_overlay.alpha = hair_alpha
. += facial_overlay
var/image/hair_overlay = image(layer = -HAIR_LAYER, dir = SOUTH)
. += hair_overlay
//Applies the debrained overlay if there is no brain
if(!brain)
var/image/debrain_overlay = image(layer = -HAIR_LAYER, dir = SOUTH)
if(animal_origin == ALIEN_BODYPART)
hair_overlay.icon = 'icons/mob/animal_parts.dmi'
hair_overlay.icon_state = "debrained_alien"
debrain_overlay.icon = 'icons/mob/animal_parts.dmi'
debrain_overlay.icon_state = "debrained_alien"
else if(animal_origin == LARVA_BODYPART)
hair_overlay.icon = 'icons/mob/animal_parts.dmi'
hair_overlay.icon_state = "debrained_larva"
debrain_overlay.icon = 'icons/mob/animal_parts.dmi'
debrain_overlay.icon_state = "debrained_larva"
else if(!(NOBLOOD in species_flags_list))
hair_overlay.icon = 'icons/mob/human_face.dmi'
hair_overlay.icon_state = "debrained"
debrain_overlay.icon = 'icons/mob/human_face.dmi'
debrain_overlay.icon_state = "debrained"
. += debrain_overlay
else
if(hair_style)
S = GLOB.hair_styles_list[hair_style]
if(S)
hair_overlay.icon = icon
hair_overlay.icon_state = "[S.icon_state]"
hair_overlay.color = "#" + hair_color
hair_overlay.alpha = hair_alpha
var/datum/sprite_accessory/S2 = GLOB.hair_styles_list[hair_style]
if(S2)
var/image/hair_overlay = image(S2.icon, "[S2.icon_state]", -HAIR_LAYER, SOUTH)
hair_overlay.color = "#" + hair_color
hair_overlay.alpha = hair_alpha
. += hair_overlay
// lipstick