Merge branch 'master' into upstream-merge-27773
This commit is contained in:
@@ -65,12 +65,22 @@ GLOBAL_VAR(posibrain_notify_cooldown)
|
||||
/obj/item/device/mmi/posibrain/attack_ghost(mob/user)
|
||||
activate(user)
|
||||
|
||||
/obj/item/device/mmi/posibrain/proc/is_occupied()
|
||||
if(brainmob.key)
|
||||
return TRUE
|
||||
if(iscyborg(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R.mmi == src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself.
|
||||
/obj/item/device/mmi/posibrain/proc/activate(mob/user)
|
||||
if(QDELETED(brainmob))
|
||||
return
|
||||
if(brainmob.key || jobban_isbanned(user,"posibrain"))
|
||||
if(is_occupied() || jobban_isbanned(user,"posibrain"))
|
||||
return
|
||||
|
||||
var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
|
||||
if(posi_ask == "No" || QDELETED(src))
|
||||
return
|
||||
@@ -98,7 +108,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
|
||||
/obj/item/device/mmi/posibrain/proc/transfer_personality(mob/candidate)
|
||||
if(QDELETED(brainmob))
|
||||
return
|
||||
if(brainmob.key) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain.
|
||||
if(is_occupied()) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain.
|
||||
to_chat(candidate, "This brain has already been taken! Please try your possession again later!")
|
||||
return FALSE
|
||||
if(candidate.mind && !isobserver(candidate))
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#define MAX_ALIEN_LEAP_DIST 7
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)
|
||||
if(pounce_cooldown)
|
||||
if(pounce_cooldown > world.time)
|
||||
to_chat(src, "<span class='alertalien'>You are too fatigued to pounce right now!</span>")
|
||||
return
|
||||
|
||||
@@ -83,9 +83,7 @@
|
||||
Weaken(2, 1, 1)
|
||||
|
||||
toggle_leap(0)
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
spawn(pounce_cooldown_time) //3s by default
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
pounce_cooldown = world.time + pounce_cooldown_time
|
||||
else if(A.density && !A.CanPass(src))
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='alertalien'>[src] smashes into [A]!</span>")
|
||||
Weaken(2, 1, 1)
|
||||
|
||||
@@ -36,9 +36,6 @@
|
||||
//initialise organs
|
||||
create_internal_organs()
|
||||
|
||||
if(mind)
|
||||
mind.martial_art = mind.default_martial_art
|
||||
|
||||
handcrafting = new()
|
||||
|
||||
..()
|
||||
|
||||
@@ -809,13 +809,13 @@
|
||||
if(T.title == "Chief Medical Officer" || T.title == "Medical Doctor" || T.title == "Chemist" || T.title == "Virologist" || T.title == "Geneticist")
|
||||
return /area/medical
|
||||
if(T.title == "Research Director" || T.title == "Scientist" || T.title == "Roboticist")
|
||||
return /area/toxins
|
||||
return /area/science
|
||||
if(T.title == "Head of Security" || T.title == "Warden" || T.title == "Security Officer" || T.title == "Detective")
|
||||
return /area/security
|
||||
if(T.title == "Botanist")
|
||||
return /area/hydroponics
|
||||
else
|
||||
return pick(/area/hallway,/area/crew_quarters)
|
||||
return pick(/area/hallway,/area/crew_quarters/locker)
|
||||
|
||||
/mob/living/carbon/human/interactive/proc/target_filter(target)
|
||||
var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/light, /obj/structure/cable, /obj/machinery/atmospherics)
|
||||
|
||||
@@ -20,3 +20,16 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/set_drugginess(amount)
|
||||
..()
|
||||
if(!amount)
|
||||
remove_language(/datum/language/beachbum)
|
||||
|
||||
/mob/living/carbon/human/adjust_drugginess(amount)
|
||||
..()
|
||||
if(!dna.check_mutation(STONER))
|
||||
if(druggy)
|
||||
grant_language(/datum/language/beachbum)
|
||||
else
|
||||
remove_language(/datum/language/beachbum)
|
||||
|
||||
@@ -420,6 +420,9 @@
|
||||
message = null
|
||||
emote_type = EMOTE_VISIBLE
|
||||
|
||||
/datum/emote/living/custom/replace_pronoun(mob/user, message)
|
||||
return message
|
||||
|
||||
/datum/emote/living/help
|
||||
key = "help"
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click()
|
||||
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
|
||||
var/malf_cooldown = 0 //Cooldown var for malf modules
|
||||
var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown
|
||||
|
||||
var/obj/machinery/power/apc/malfhack = null
|
||||
var/explosive = 0 //does the AI explode when it dies?
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
|
||||
if(explosive)
|
||||
spawn(10)
|
||||
explosion(src.loc, 3, 6, 12, 15)
|
||||
explosion(src.loc, 3, 6, 12, 15)
|
||||
|
||||
for(var/obj/machinery/ai_status_display/O in world) //change status
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||
if(src.key)
|
||||
O.mode = 2
|
||||
if(istype(loc, /obj/item/device/aicard))
|
||||
@@ -42,4 +42,4 @@
|
||||
if(doomsday_device)
|
||||
doomsday_device.timing = FALSE
|
||||
SSshuttle.clearHostileEnvironment(doomsday_device)
|
||||
qdel(doomsday_device)
|
||||
qdel(doomsday_device)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
client.images += blood
|
||||
|
||||
if(stat != DEAD)
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.machines) //change status
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||
O.mode = 1
|
||||
O.emotion = "Neutral"
|
||||
view_core()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/silicon/ai/Logout()
|
||||
..()
|
||||
for(var/obj/machinery/ai_status_display/O in world) //change status
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||
O.mode = 0
|
||||
view_core()
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
|
||||
/mob/living/silicon/pai/Destroy()
|
||||
GLOB.pai_list -= src
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/pai/Initialize()
|
||||
var/obj/item/device/paicard/P = loc
|
||||
|
||||
@@ -195,6 +195,10 @@
|
||||
if(module.type != /obj/item/weapon/robot_module)
|
||||
return
|
||||
|
||||
if(wires.is_cut(WIRE_RESET_MODULE))
|
||||
to_chat(src,"<span class='userdanger'>ERROR: Module installer reply timeout. Please check internal connections.</span>")
|
||||
return
|
||||
|
||||
var/list/modulelist = list("Standard" = /obj/item/weapon/robot_module/standard, \
|
||||
"Engineering" = /obj/item/weapon/robot_module/engineering, \
|
||||
"Medical" = /obj/item/weapon/robot_module/medical, \
|
||||
|
||||
@@ -104,6 +104,10 @@
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/wire)
|
||||
|
||||
else if(istype(S, /obj/item/stack/marker_beacon))
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon)
|
||||
|
||||
if(S && S.source)
|
||||
S.materials = list()
|
||||
S.is_cyborg = 1
|
||||
@@ -535,7 +539,8 @@
|
||||
/obj/item/weapon/storage/bag/sheetsnatcher/borg,
|
||||
/obj/item/device/t_scanner/adv_mining_scanner,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg,
|
||||
/obj/item/device/gps/cyborg)
|
||||
/obj/item/device/gps/cyborg,
|
||||
/obj/item/stack/marker_beacon)
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/miner,
|
||||
@@ -631,3 +636,8 @@
|
||||
max_energy = 2500
|
||||
recharge_rate = 250
|
||||
name = "Medical Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/beacon
|
||||
max_energy = 30
|
||||
recharge_rate = 1
|
||||
name = "Marker Beacon Storage"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/mob/living/proc/robot_talk(message)
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_message(message, INDIVIDUAL_SAY_LOG)
|
||||
var/desig = "Default Cyborg" //ezmode for taters
|
||||
if(issilicon(src))
|
||||
var/mob/living/silicon/S = src
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user