Merge branch 'master' into upstream-merge-27773

This commit is contained in:
LetterJay
2017-06-06 09:05:26 -05:00
committed by GitHub
359 changed files with 404750 additions and 231336 deletions
+79 -31
View File
@@ -10,45 +10,58 @@
/obj/effect/mob_spawn/human/corpse/syndicatesoldier
name = "Syndicate Operative"
id_job = "Operative"
id_access_list = list(GLOB.access_syndicate)
outfit = /datum/outfit/syndicatesoldiercorpse
/datum/outfit/syndicatesoldiercorpse
name = "Syndicate Operative Corpse"
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/armor/vest
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
radio = /obj/item/device/radio/headset
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/gas
helmet = /obj/item/clothing/head/helmet/swat
head = /obj/item/clothing/head/helmet/swat
back = /obj/item/weapon/storage/backpack
has_id = 1
id_job = "Operative"
id_access_list = list(GLOB.access_syndicate)
id = /obj/item/weapon/card/id
/obj/effect/mob_spawn/human/corpse/syndicatecommando
name = "Syndicate Commando"
id_job = "Operative"
id_access_list = list(GLOB.access_syndicate)
outfit = /datum/outfit/syndicatecommandocorpse
/datum/outfit/syndicatecommandocorpse
name = "Syndicate Commando Corpse"
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
radio = /obj/item/device/radio/headset
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/gas/syndicate
back = /obj/item/weapon/tank/jetpack/oxygen
pocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
has_id = 1
id_job = "Operative"
id_access_list = list(GLOB.access_syndicate)
r_pocket = /obj/item/weapon/tank/internals/emergency_oxygen
id = /obj/item/weapon/card/id
/obj/effect/mob_spawn/human/corpse/syndicatestormtrooper
name = "Syndicate Stormtrooper"
id_job = "Operative"
id_access_list = list(GLOB.access_syndicate)
outfit = /datum/outfit/syndicatestormtroopercorpse
/datum/outfit/syndicatestormtroopercorpse
name = "Syndicate Stormtrooper Corpse"
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
radio = /obj/item/device/radio/headset
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/gas/syndicate
back = /obj/item/weapon/tank/jetpack/oxygen/harness
has_id = 1
id_job = "Operative"
id_access_list = list(GLOB.access_syndicate)
id = /obj/item/weapon/card/id
/obj/effect/mob_spawn/human/clown/corpse
@@ -58,62 +71,97 @@
/obj/effect/mob_spawn/human/corpse/pirate
name = "Pirate"
outfit = /datum/outfit/piratecorpse
/datum/outfit/piratecorpse
name = "Pirate Corpse"
uniform = /obj/item/clothing/under/pirate
shoes = /obj/item/clothing/shoes/jackboots
glasses = /obj/item/clothing/glasses/eyepatch
helmet = /obj/item/clothing/head/bandana
head = /obj/item/clothing/head/bandana
/obj/effect/mob_spawn/human/corpse/pirate/ranged
name = "Pirate Gunner"
outfit = /datum/outfit/piratecorpse/ranged
/datum/outfit/piratecorpse/ranged
name = "Pirate Gunner Corpse"
suit = /obj/item/clothing/suit/pirate
helmet = /obj/item/clothing/head/pirate
head = /obj/item/clothing/head/pirate
/obj/effect/mob_spawn/human/corpse/russian
name = "Russian"
outfit = /datum/outfit/russiancorpse
/datum/outfit/russiancorpse
name = "Russian Corpse"
uniform = /obj/item/clothing/under/soviet
shoes = /obj/item/clothing/shoes/jackboots
helmet = /obj/item/clothing/head/bearpelt
head = /obj/item/clothing/head/bearpelt
/obj/effect/mob_spawn/human/corpse/russian/ranged
helmet = /obj/item/clothing/head/ushanka
outfit = /datum/outfit/russiancorpse/ranged
/datum/outfit/russiancorpse/ranged
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
/datum/outfit/russiancorpse/ranged/trooper
name = "Ranged Russian Trooper Corpse"
uniform = /obj/item/clothing/under/syndicate/camo
suit = /obj/item/clothing/suit/armor/bulletproof
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
radio = /obj/item/device/radio/headset
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/balaclava
helmet = /obj/item/clothing/head/helmet/alt
head = /obj/item/clothing/head/helmet/alt
/obj/effect/mob_spawn/human/corpse/russian/ranged/officer
name = "Russian Officer"
outfit = /datum/outfit/russiancorpse/officer
/datum/outfit/russiancorpse/officer
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
radio = /obj/item/device/radio/headset
helmet = /obj/item/clothing/head/ushanka
ears = /obj/item/device/radio/headset
head = /obj/item/clothing/head/ushanka
/obj/effect/mob_spawn/human/corpse/wizard
name = "Space Wizard"
name = "Space Wizard Corpse"
outfit = /datum/outfit/wizardcorpse
/datum/outfit/wizardcorpse
name = "Space Wizard Corpse"
uniform = /obj/item/clothing/under/color/lightpurple
suit = /obj/item/clothing/suit/wizrobe
shoes = /obj/item/clothing/shoes/sandal/magic
helmet = /obj/item/clothing/head/wizard
head = /obj/item/clothing/head/wizard
/obj/effect/mob_spawn/human/corpse/nanotrasensoldier
name = "Nanotrasen Private Security Officer"
id_job = "Private Security Force"
id_access = "Security Officer"
outfit = /datum/outfit/nanotrasensoldiercorpse2
/datum/outfit/nanotrasensoldiercorpse2
name = "NT Private Security Officer Corpse"
uniform = /obj/item/clothing/under/rank/security
suit = /obj/item/clothing/suit/armor/vest
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
radio = /obj/item/device/radio/headset
ears = /obj/item/device/radio/headset
mask = /obj/item/clothing/mask/gas/sechailer/swat
helmet = /obj/item/clothing/head/helmet/swat/nanotrasen
head = /obj/item/clothing/head/helmet/swat/nanotrasen
back = /obj/item/weapon/storage/backpack/security
has_id = 1
id_job = "Private Security Force"
id_access = "Security Officer"
id = /obj/item/weapon/card/id
@@ -45,6 +45,7 @@
gold_core_spawnable = 2
/mob/living/simple_animal/pet/dog/Initialize()
. = ..()
var/dog_area = get_area(src)
for(var/obj/structure/bed/dogbed/D in dog_area)
if(!D.owner)
@@ -21,7 +21,7 @@
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
. = ..()
if(. && ishuman(target) && target != summoner)
new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
new /obj/effect/hallucination/delusion(target.loc,target,"custom",200,0, icon_state,icon)
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
..()
@@ -1,89 +0,0 @@
//Will probably eventually be expanded to fit multiple types of Flan because I am a nerd.
/mob/living/simple_animal/hostile/flan
name = "Flan"
desc = "Definitely not a dessert."
var/casting = 0
icon_state = "flan" //Required for the inheritance of casting animations.
icon_living = "flan"
icon_dead = "flan_dead"
turns_per_move = 5
environment_smash = ENVIRONMENT_SMASH_NONE
speed = -2
maxHealth = 50
health = 50
harm_intent_damage = 5
damage_coeff = list(BRUTE = 0.75, BURN = 1.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
melee_damage_lower = 5
melee_damage_upper = 10
attacktext = "headbutts"
attack_sound = 'sound/weapons/punch1.ogg'
a_intent = INTENT_HARM
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)
unsuitable_atmos_damage = 0
ranged = 1
retreat_distance = 2
minimum_distance = 4
AIStatus = AI_IDLE
ranged_message = "begins to cast something"
ranged_cooldown_time = 15
var/spellname = "a generic spell!"
var/spellsound = 'sound/effects/spray3.ogg'
var/spellanimation = ATTACK_EFFECT_SMASH //More in defines/misc.dm
var/spelldamagetype = BRUTE
var/spelldamage = 15
var/spellcasttime = 15 //if you varedit this also varedit ranged_cooldown_time else the mob will attack again before the spell hits, looking weird but still working
/mob/living/simple_animal/hostile/flan/Initialize() //Required for the inheritance of casting animations.
..()
casting = 0
icon_state = "[initial(icon_state)][casting]"
/mob/living/simple_animal/hostile/flan/proc/spellaftereffects(mob/living/A) //Inherit and override. Allows for spells that stun and do basically anything you'd want.
return
/mob/living/simple_animal/hostile/flan/OpenFire(mob/living/A) //Spellcasting!
if(isliving(A)) //A is originally an atom, this is here to prevent that from fucking this up.
visible_message("<span class='danger'><b>[src]</b> [ranged_message] at [A]!</span>")
casting = 1
icon_state = "[initial(icon_state)][casting]"
if(do_after_mob(src, A, spellcasttime, uninterruptible = 1, progress = 0)) //Break LOS to dodge.
if(QDELETED(src))
return
if((A in view(src)))
A.do_attack_animation(A, spellanimation)
playsound(A, spellsound, 20, 1)
A.apply_damage(damage = spelldamage,damagetype = spelldamagetype, def_zone = null, blocked = 0)
visible_message("<span class='danger'><b>[A]</b> has been hit by [spellname]</span>")
spellaftereffects(A,src)
ranged_cooldown = world.time + ranged_cooldown_time
casting = 0
icon_state = "[initial(icon_state)][casting]"
/mob/living/simple_animal/hostile/flan/fire
name = "Flame Flan"
desc = "You'd think they'd be spicy, but nobody has ever tried."
icon_state = "fireflan"
icon_living = "fireflan"
icon_dead = "fireflan_dead"
damage_coeff = list(BRUTE = 1.5, BURN = 0.75, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
spellname = "a Fire spell!"
spellsound = 'sound/effects/fuse.ogg'
spelldamagetype = BURN
spellcasttime = 20
/mob/living/simple_animal/hostile/flan/fire/spellaftereffects(mob/living/A)
A.adjust_fire_stacks(2)
A.IgniteMob()
/mob/living/simple_animal/hostile/flan/water
name = "Water Flan"
desc = "Is pretty likely to dampen your spirits."
icon_state = "flan"
icon_living = "flan"
icon_dead = "flan_dead"
spellname = "a Water spell!"
spelldamage = 10 //Basic flan, learn the dance with em.
/mob/living/simple_animal/hostile/flan/water/spellaftereffects(mob/living/A)
A.ExtinguishMob()
@@ -44,6 +44,7 @@ Difficulty: Hard
ranged = 1
pixel_x = -32
del_on_death = 1
crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME
var/charging = FALSE
@@ -46,7 +46,8 @@ Difficulty: Very Hard
del_on_death = 1
medal_type = MEDAL_PREFIX
score_type = COLOSSUS_SCORE
loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus)
crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
loot = list(/obj/structure/closet/crate/necropolis/colossus)
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
deathmessage = "disintegrates, leaving a glowing core in its wake."
death_sound = 'sound/magic/demon_dies.ogg'
@@ -444,13 +445,6 @@ Difficulty: Very Hard
/obj/machinery/anomalous_crystal/ex_act()
ActivationReaction(null, ACTIVATE_BOMB)
/obj/effect/spawner/lootdrop/anomalous_crystal
name = "anomalous crystal spawner"
/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize()
loot = subtypesof(/obj/machinery/anomalous_crystal)
. = ..()
/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
observer_desc = "This crystal strips and equips its targets as clowns."
possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH)
@@ -51,6 +51,7 @@ Difficulty: Medium
move_to_delay = 10
ranged = 1
pixel_x = -16
crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
loot = list(/obj/structure/closet/crate/necropolis/dragon)
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
var/swooping = NONE
@@ -78,6 +78,9 @@ Difficulty: Hard
internal = new/obj/item/device/gps/internal/hierophant(src)
spawned_beacon = new(loc)
/mob/living/simple_animal/hostile/megafauna/hierophant/spawn_crusher_loot()
new /obj/item/crusher_trophy/vortex_talisman(get_turf(spawned_beacon))
/mob/living/simple_animal/hostile/megafauna/hierophant/Life()
. = ..()
if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client)
@@ -461,6 +464,12 @@ Difficulty: Hard
return ..()
/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
if(mover == caster.pulledby)
return TRUE
if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(P.firer == caster)
return TRUE
if(mover == caster)
return TRUE
return FALSE
@@ -589,6 +598,8 @@ Difficulty: Hard
do_damage(get_turf(src))
/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T)
if(!damage)
return
for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
hit_things += L
if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD)
@@ -34,6 +34,7 @@
/obj/structure/barricade,
/obj/machinery/field,
/obj/machinery/power/emitter)
var/list/crusher_loot
var/medal_type = MEDAL_PREFIX
var/score_type = BOSS_SCORE
var/elimination = 0
@@ -44,6 +45,10 @@
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
/mob/living/simple_animal/hostile/megafauna/Initialize(mapload)
. = ..()
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
/mob/living/simple_animal/hostile/megafauna/Destroy()
QDEL_NULL(internal)
. = ..()
@@ -52,12 +57,19 @@
if(health > 0)
return
else
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
if(C && crusher_loot)
if(C.total_damage >= maxHealth * 0.60) //if you do at least 60% of its health with the crusher, you'll get the item
spawn_crusher_loot()
if(!admin_spawned)
SSblackbox.set_details("megafauna_kills","[initial(name)]")
if(!elimination) //used so the achievment only occurs for the last legion to die.
grant_achievement(medal_type,score_type)
..()
/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
loot = crusher_loot
/mob/living/simple_animal/hostile/megafauna/gib()
if(health > 0)
return
@@ -23,3 +23,51 @@
environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 0
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace
name = "Nanotrasen Private Security Officer"
desc = "An officer part of Nanotrasen's private security force."
icon = 'icons/mob/simple_human.dmi'
icon_state = "nanotrasen"
icon_living = "nanotrasen"
icon_dead = null
icon_gib = "syndicate_gib"
turns_per_move = 5
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
speed = 0
stat_attack = 1
robust_searching = 1
vision_range = 3
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 10
melee_damage_upper = 15
attacktext = "punches"
attack_sound = 'sound/weapons/punch1.ogg'
faction = list("nanotrasenprivate")
a_intent = INTENT_HARM
loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
status_flags = CANPUSH
search_objects = 1
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro()
..()
summon_backup(15)
say("411 in progress, requesting backup!")
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged
icon_state = "nanotrasenrangedsmg"
icon_living = "nanotrasenrangedsmg"
vision_range = 9
rapid = 1
ranged = 1
retreat_distance = 3
minimum_distance = 5
casingtype = /obj/item/ammo_casing/c46x30mm
projectilesound = 'sound/weapons/Gunshot_smg.ogg'
loot = list(/obj/item/weapon/gun/ballistic/automatic/wt550,
/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
@@ -309,11 +309,11 @@
if(Target)
--target_patience
if (target_patience <= 0 || SStun || Discipline || attacked || docile) // Tired of chasing or something draws out attention
if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention
target_patience = 0
Target = null
if(AIproc && SStun)
if(AIproc && SStun > world.time)
return
var/hungry = 0 // determines if the slime is hungry
@@ -394,11 +394,7 @@
if(buckled)
Feedstop(silent=1) //we unbuckle the slime from the mob it latched onto.
spawn(0)
SStun = 1
sleep(rand(20,60))
SStun = 0
SStun = world.time + rand(20,60)
spawn(0)
canmove = 0
if(user)