Merge branch 'master' into upstream-merge-31737

This commit is contained in:
LetterJay
2017-10-28 02:20:25 -04:00
committed by GitHub
291 changed files with 204450 additions and 223168 deletions
@@ -480,6 +480,8 @@
client.prefs.copy_to(H)
H.dna.update_dna_identity()
if(mind)
if(transfer_after)
mind.late_joiner = TRUE
mind.active = 0 //we wish to transfer the key manually
mind.transfer_to(H) //won't transfer key since the mind is not active
@@ -59,7 +59,7 @@
if(previewJob && !nude)
mannequin.job = previewJob.title
previewJob.equip(mannequin, TRUE)
mannequin.compile_overlays()
COMPILE_OVERLAYS(mannequin)
CHECK_TICK
preview_icon = icon('icons/effects/effects.dmi', "nothing")
preview_icon.Scale(48+32, 16+32)
File diff suppressed because it is too large Load Diff
@@ -39,7 +39,7 @@
name = "Bear"
icon_state = "bear"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/bear
name = "Bear"
icon_state = "bear"
@@ -65,7 +65,7 @@
icon_state = "cow"
icon = 'icons/mob/mam_bodyparts.dmi'
gender_specific = 1
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -175,21 +175,24 @@
name = "Otusian"
icon_state = "otie"
hasinner= 1
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/human/otie
name = "Otusian"
icon_state = "otie"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
hasinner= 1
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
@@ -201,10 +204,11 @@
icon_state = "rabbit"
color_src = 0
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/ears/human/skunk
name = "skunk"
icon_state = "skunk"
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
@@ -248,6 +252,7 @@
name = "Wolf"
icon_state = "wolf"
hasinner = 1
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
@@ -341,7 +346,7 @@
/datum/sprite_accessory/mam_ears/bear
name = "Bear"
icon_state = "bear"
/datum/sprite_accessory/mam_tails/bear
name = "Bear"
icon_state = "bear"
@@ -352,9 +357,9 @@
/datum/sprite_accessory/mam_ears/catbig
name = "Cat, Big"
icon_state = "cat"
icon_state = "catbig"
hasinner = 1
/datum/sprite_accessory/mam_tails/catbig
name = "Cat, Big"
icon_state = "catbig"
@@ -367,7 +372,7 @@
name = "Cow"
icon_state = "cow"
gender_specific = 1
/datum/sprite_accessory/mam_tail/cow
name = "Cow"
icon_state = "cow"
@@ -522,7 +527,7 @@
name = "Rabbit"
icon_state = "rabbit"
hasinner= 1
/datum/sprite_accessory/mam_tails/rabbit
name = "Rabbit"
icon_state = "rabbit"
@@ -305,15 +305,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/is_active()
return 0
/mob/dead/observer/Stat()
..()
if(statpanel("Status"))
if(SSticker.HasRoundStarted())
if(istype(SSticker.mode, /datum/game_mode/blob))
var/datum/game_mode/blob/B = SSticker.mode
if(B.message_sent)
stat(null, "Blobs to Blob Win: [GLOB.blobs_legit.len]/[B.blobwincount]")
/mob/dead/observer/verb/reenter_corpse()
set category = "Ghost"
set name = "Re-enter Corpse"
@@ -45,6 +45,6 @@
var/datum/personal_crafting/handcrafting
can_buckle = TRUE
buckle_lying = FALSE
can_ride_typecache = list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)
var/creamed = FALSE //to use with creampie overlays
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
@@ -45,14 +45,15 @@
return
else
//No oldFP or it's a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state]-BLOOD_LOSS_PER_STEP)
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
FP.blood_state = S.blood_state
FP.entered_dirs |= dir
FP.bloodiness = S.bloody_shoes[S.blood_state]
if(S.blood_DNA && S.blood_DNA.len)
FP.transfer_blood_dna(S.blood_DNA)
FP.update_icon()
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD)
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
FP.blood_state = S.blood_state
FP.entered_dirs |= dir
FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
if(S.blood_DNA && S.blood_DNA.len)
FP.transfer_blood_dna(S.blood_DNA)
FP.update_icon()
update_inv_shoes()
//End bloody footprints
@@ -419,6 +419,7 @@
if(ishuman(C))
unstable_teleport = new
unstable_teleport.Grant(C)
last_teleport = world.time
/datum/species/golem/bluespace/on_species_loss(mob/living/carbon/C)
if(unstable_teleport)
@@ -479,6 +480,11 @@
var/banana_cooldown = 100
var/active = null
/datum/species/golem/bananium/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
last_banana = world.time
last_honk = world.time
/datum/species/golem/bananium/random_name(gender,unique,lastname)
var/clown_name = pick(GLOB.clown_names)
var/golem_name = "[uppertext(clown_name)]"
@@ -553,10 +559,13 @@
. = ..()
C.faction |= "cult"
phase_shift = new
phase_shift.charge_counter = 0
C.AddSpell(phase_shift)
abyssal_gaze = new
abyssal_gaze.charge_counter = 0
C.AddSpell(abyssal_gaze)
dominate = new
dominate.charge_counter = 0
C.AddSpell(dominate)
/datum/species/golem/runic/on_species_loss(mob/living/carbon/C)
@@ -1,4 +1,5 @@
#define HEART_RESPAWN_THRESHHOLD 40
#define HEART_SPECIAL_SHADOWIFY 2
/datum/species/shadow
// Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light.
@@ -111,14 +112,15 @@
/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0)
..()
blade = new/obj/item/light_eater
M.put_in_hands(blade)
if(special != HEART_SPECIAL_SHADOWIFY)
blade = new/obj/item/light_eater
M.put_in_hands(blade)
START_PROCESSING(SSobj, src)
/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0)
STOP_PROCESSING(SSobj, src)
respawn_progress = 0
if(blade)
if(blade && special != HEART_SPECIAL_SHADOWIFY)
QDEL_NULL(blade)
M.visible_message("<span class='warning'>\The [blade] disintegrates!</span>")
..()
@@ -141,6 +143,13 @@
playsound(owner,'sound/effects/singlebeat.ogg',40,1)
if(respawn_progress >= HEART_RESPAWN_THRESHHOLD)
owner.revive(full_heal = TRUE)
if(!(owner.dna.species.id == "shadow" || owner.dna.species.id == "nightmare"))
var/mob/living/carbon/old_owner = owner
Remove(owner, HEART_SPECIAL_SHADOWIFY)
old_owner.set_species(/datum/species/shadow)
Insert(old_owner, HEART_SPECIAL_SHADOWIFY)
to_chat(owner, "<span class='userdanger'>You feel the shadows invade your skin, leaping into the center of your chest! You're alive!</span>")
SEND_SOUND(owner, sound('sound/effects/ghost.ogg'))
owner.visible_message("<span class='warning'>[owner] staggers to their feet!</span>")
playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, 1)
respawn_progress = 0
@@ -193,4 +202,5 @@
O.burn()
playsound(src, 'sound/items/welder.ogg', 50, 1)
#undef HEART_SPECIAL_SHADOWIFY
#undef HEART_RESPAWN_THRESHHOLD
+10
View File
@@ -203,6 +203,16 @@
hallucination += 20
else if(bz_partialpressure > 0.01)
hallucination += 5//Removed at 2 per tick so this will slowly build up
//TRITIUM
if(breath_gases[/datum/gas/tritium])
var/tritium_partialpressure = (breath_gases[/datum/gas/tritium][MOLES]/breath.total_moles())*breath_pressure
radiation += tritium_partialpressure/10
//Brown Gas
if (breath_gases[/datum/gas/brown_gas])
var/browns_partialpressure = (breath_gases[/datum/gas/brown_gas][MOLES]/breath.total_moles())*breath_pressure
adjustFireLoss(browns_partialpressure/4)
breath.garbage_collect()
+1 -11
View File
@@ -196,7 +196,7 @@
M.pass_flags &= ~PASSMOB
now_pushing = 0
if(!move_failed)
return 1
@@ -780,16 +780,6 @@
/mob/living/proc/get_standard_pixel_y_offset(lying = 0)
return initial(pixel_y)
/mob/living/Stat()
..()
if(statpanel("Status"))
if(SSticker && SSticker.mode)
if(istype(SSticker.mode, /datum/game_mode/blob))
var/datum/game_mode/blob/B = SSticker.mode
if(B.message_sent)
stat(null, "Blobs to Blob Win: [GLOB.blobs_legit.len]/[B.blobwincount]")
/mob/living/cancel_camera()
..()
cameraFollow = null
+4 -11
View File
@@ -338,18 +338,11 @@
/mob/living/ratvar_act()
if(status_flags & GODMODE)
return
if(stat != DEAD && !is_servant_of_ratvar(src))
for(var/obj/item/implant/mindshield/M in implants)
qdel(M)
if(!add_servant_of_ratvar(src))
to_chat(src, "<span class='userdanger'>A blinding light boils you alive! <i>Run!</i></span>")
adjustFireLoss(35)
if(src)
adjust_fire_stacks(1)
IgniteMob()
return FALSE
return TRUE
to_chat(src, "<span class='userdanger'>A blinding light boils you alive! <i>Run!</i></span>")
adjust_fire_stacks(20)
IgniteMob()
return FALSE
//called when the mob receives a bright flash
@@ -95,7 +95,7 @@
can_buckle = TRUE
buckle_lying = FALSE
can_ride_typecache = list(/mob/living/carbon/human)
var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human)
/mob/living/silicon/robot/get_cell()
return cell
@@ -352,10 +352,9 @@
/obj/item/soap/tongue,
/obj/item/device/analyzer/nose,
/obj/item/device/dogborg/sleeper/K9,
/obj/item/pinpointer/crew)
emag_modules = list(/obj/item/gun/energy/laser/cyborg,
/obj/item/gun/energy/disabler/cyborg,
/obj/item/pinpointer/nuke)
/obj/item/pinpointer/crew)
emag_modules = list(/obj/item/gun/energy/laser/cyborg)
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
/obj/item/clockwork/weapon/ratvarian_spear)
cyborg_base_icon = "k9"
@@ -408,7 +407,6 @@
/obj/item/robot_module/scrubpup
name = "Janitor"
basic_modules = list(
/obj/item/device/assembly/flash/cyborg,
/obj/item/dogborg/jaws/small,
/obj/item/device/analyzer/nose,
/obj/item/soap/tongue/scrubpup,
@@ -422,6 +420,7 @@
moduleselect_icon = "scrubpup"
feedback_key = "cyborg_scrubpup"
hat_offset = INFINITY
clean_on_move = TRUE
/obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
@@ -47,6 +47,10 @@
diag_hud_set_status()
diag_hud_set_health()
/mob/living/silicon/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, TRUE)
/mob/living/silicon/med_hud_set_health()
return //we use a different hud
@@ -5,7 +5,7 @@
icon = 'icons/mob/aibots.dmi'
layer = MOB_LAYER
gender = NEUTER
luminosity = 3
light_range = 3
stop_automated_movement = 1
wander = 0
healable = 0
@@ -124,6 +124,9 @@
if(!target) //Search for decals then.
target = scan(/obj/effect/decal/cleanable)
if(!target) //Checks for remains
target = scan(/obj/effect/decal/remains)
if(!target && trash) //Then for trash.
target = scan(/obj/item/trash)
@@ -178,7 +181,8 @@
/obj/effect/decal/cleanable/ash,
/obj/effect/decal/cleanable/greenglow,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/deadcockroach
/obj/effect/decal/cleanable/deadcockroach,
/obj/effect/decal/remains
)
if(blood)
@@ -213,9 +217,9 @@
target = null
mode = BOT_IDLE
icon_state = "cleanbot[on]"
else if(istype(A, /obj/item))
else if(istype(A, /obj/item) || istype(A, /obj/effect/decal/remains))
visible_message("<span class='danger'>[src] sprays hydrofluoric acid at [A]!</span>")
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6)
A.acid_act(75, 10)
else if(istype(A, /mob/living/simple_animal/cockroach) || istype(A, /mob/living/simple_animal/mouse))
var/mob/living/simple_animal/M = target
@@ -41,7 +41,7 @@
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize()
. = ..()
wanted_objects = typecacheof(/obj/mecha/combat, ignore_root_path=TRUE)
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
name = "Nanotrasen Mecha Pilot"
@@ -101,7 +101,7 @@
targets_from = src
//Find a new mecha
wanted_objects = typecacheof(/obj/mecha/combat, ignore_root_path=TRUE)
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
var/search_aggressiveness = 2
for(var/obj/mecha/combat/C in range(vision_range,src))
if(is_valid_mecha(C))
@@ -159,18 +159,18 @@ Difficulty: Medium
Shoot(target)
changeNext_move(CLICK_CD_RANGE)
//I'm still of the belief that this entire proc needs to be wiped from existence.
// do not take my touching of it to be endorsement of it. ~mso
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/quick_attack_loop()
if(next_move <= world.time)
stoplag(1)
.() //retry
return
sleep((next_move - world.time) * 1.5)
while(!QDELETED(target) && next_move <= world.time) //this is done this way because next_move can change to be sooner while we sleep.
stoplag(1)
sleep((next_move - world.time) * 1.5) //but don't ask me what the fuck this is about
if(QDELETED(target))
return
if(dashing || next_move > world.time || !Adjacent(target))
if(dashing && next_move <= world.time)
next_move = world.time + 1
.() //recurse
INVOKE_ASYNC(src, .proc/quick_attack_loop) //lets try that again.
return
AttackingTarget()
@@ -616,7 +616,7 @@ Difficulty: Very Hard
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
gold_core_spawnable = 0
gold_core_spawnable = TRUE
verb_say = "warps"
verb_ask = "floats inquisitively"
verb_exclaim = "zaps"
@@ -634,7 +634,6 @@ Difficulty: Very Hard
environment_smash = ENVIRONMENT_SMASH_NONE
AIStatus = AI_OFF
stop_automated_movement = 1
gold_core_spawnable = TRUE
var/heal_power = 5
/mob/living/simple_animal/hostile/lightgeist/Initialize()
@@ -663,12 +662,7 @@ Difficulty: Very Hard
activation_method = ACTIVATE_TOUCH
cooldown_add = 50
activation_sound = 'sound/magic/timeparadox2.ogg'
var/list/banned_items_typecache = list(/obj/item/storage, /obj/item/implant, /obj/item/implanter, /obj/item/disk/nuclear, /obj/item/projectile, /obj/item/spellbook)
/obj/machinery/anomalous_crystal/refresher/Initialize()
. = ..()
banned_items_typecache = typecacheof(banned_items_typecache)
var/static/list/banned_items_typecache = typecacheof(list(/obj/item/storage, /obj/item/implant, /obj/item/implanter, /obj/item/disk/nuclear, /obj/item/projectile, /obj/item/spellbook))
/obj/machinery/anomalous_crystal/refresher/ActivationReaction(mob/user, method)
if(..())
@@ -172,16 +172,9 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
search_objects = 1
attack_all_objects = TRUE //attempt to nibble everything
lose_patience_timeout = 150
var/static/list/sharedWanted = list(/turf/closed/mineral, /turf/closed/wall) //eat rocks and walls
var/static/list/sharedWanted = typecacheof(list(/turf/closed/mineral, /turf/closed/wall)) //eat rocks and walls
var/static/list/sharedIgnore = list()
/mob/living/simple_animal/hostile/swarmer/ai/resource/Initialize()
. = ..()
sharedWanted = typecacheof(sharedWanted)
sharedIgnore = typecacheof(sharedIgnore)
//This handles viable things to eat/attack
//Place specific cases of AI derpiness here
//Most can be left to the automatic Gain/LosePatience() system
@@ -239,18 +232,15 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
//So swarmers can learn what is and isn't food
/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_wanted(typepath)
LAZYINITLIST(sharedWanted)
if(!sharedWanted[typepath])// this and += is faster than |=
sharedWanted += typecacheof(typepath)
/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_ignore(typepath)
LAZYINITLIST(sharedIgnore)
if(!sharedIgnore[typepath])
sharedIgnore += typecacheof(typepath)
//RANGED SWARMER
/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat
icon_state = "swarmer_ranged"
+2 -3
View File
@@ -26,13 +26,12 @@
else
GLOB.living_mob_list += src
prepare_huds()
can_ride_typecache = typecacheof(can_ride_typecache)
hook_vr("mob_new",list(src))
for(var/v in GLOB.active_alternate_appearances)
if(!v)
continue
var/datum/atom_hud/alternate_appearance/AA = v
AA.onNewMob(src)
hook_vr("mob_new",list(src))
. = ..()
/atom/proc/prepare_huds()
@@ -391,7 +390,7 @@
pulling = null
grab_state = 0
update_pull_hud_icon()
if(isliving(ex_pulled))
var/mob/living/L = ex_pulled
L.update_canmove()// mob gets up if it was lyng down in a chokehold
+3 -3
View File
@@ -27,8 +27,9 @@
var/damageoverlaytemp = 0
var/computer_id = null
var/lastattacker = null
var/lastattacked = null
var/list/logging = list(INDIVIDUAL_ATTACK_LOG, INDIVIDUAL_SAY_LOG, INDIVIDUAL_EMOTE_LOG, INDIVIDUAL_OOC_LOG, INDIVIDUAL_LOOC_LOG)
var/lastattackerckey = null
var/list/logging = list(INDIVIDUAL_ATTACK_LOG, INDIVIDUAL_SAY_LOG, INDIVIDUAL_EMOTE_LOG, INDIVIDUAL_OOC_LOG)
var/obj/machinery/machine = null
var/other_mobs = null
var/disabilities = 0 //Carbon
@@ -140,7 +141,6 @@
var/list/observers = null //The list of people observing this mob.
var/list/progressbars = null //for stacking do_after bars
var/list/can_ride_typecache = list()
var/list/mousemove_intercept_objects
+10 -8
View File
@@ -335,9 +335,9 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/proc/is_special_character(mob/M) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this.
if(!SSticker.HasRoundStarted())
return 0
return FALSE
if(!istype(M))
return 0
return FALSE
if(issilicon(M))
if(iscyborg(M)) //For cyborgs, returns 1 if the cyborg has a law 0 and special_role. Returns 0 if the borg is merely slaved to an AI traitor.
var/mob/living/silicon/robot/R = M
@@ -346,13 +346,13 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(R.connected_ai)
if(is_special_character(R.connected_ai) && R.connected_ai.laws && (R.connected_ai.laws.zeroth_borg == R.laws.zeroth || R.connected_ai.laws.zeroth == R.laws.zeroth))
return 0 //AI is the real traitor here, so the borg itself is not a traitor
return 1 //Slaved but also a traitor
return 1 //Unslaved, traitor
return TRUE//Slaved but also a traitor
return TRUE //Unslaved, traitor
else if(isAI(M))
var/mob/living/silicon/ai/A = M
if(A.laws && A.laws.zeroth && A.mind && A.mind.special_role)
return 1
return 0
return TRUE
return FALSE
if(M.mind && M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
switch(SSticker.mode.config_tag)
if("revolution")
@@ -379,8 +379,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if("abductor")
if(M.mind in SSticker.mode.abductors)
return 2
return 1
return 0
return TRUE
if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum!
return TRUE
return FALSE
/mob/proc/reagent_check(datum/reagent/R) // utilized in the species code
return 1
+3 -8
View File
@@ -376,8 +376,6 @@
if(!transfer_after)
mind.active = FALSE
mind.transfer_to(R)
if(mind.special_role)
R.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
else if(transfer_after)
R.key = key
@@ -462,12 +460,9 @@
. = new_slime
qdel(src)
/mob/proc/become_overmind(mode_made, starting_points = 60)
var/mob/camera/blob/B = new /mob/camera/blob(loc, 0, mode_made, starting_points)
if(mind)
mind.transfer_to(B)
else
B.key = key
/mob/proc/become_overmind(starting_points = 60)
var/mob/camera/blob/B = new /mob/camera/blob(loc, starting_points)
B.key = key
. = B
qdel(src)