mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-09-05 02:18:19 +01:00
Merge branch 'master' into lets_go_rebind_things
This commit is contained in:
@@ -95,11 +95,12 @@
|
||||
if(client.prefs.toggles & PREFTOGGLE_CHAT_GHOSTEARS && (speaker in view(src)))
|
||||
message = "<b>[message]</b>"
|
||||
|
||||
// Check if the language used is innate
|
||||
for(var/datum/multilingual_say_piece/SP in message_pieces)
|
||||
if(SP.speaking && SP.speaking.flags & INNATE)
|
||||
custom_emote(EMOTE_AUDIBLE, message_clean, TRUE)
|
||||
return
|
||||
// Ensure only the speaker is forced to emote, and that the spoken language is inname
|
||||
if(speaker == src)
|
||||
for(var/datum/multilingual_say_piece/SP in message_pieces)
|
||||
if(SP.speaking && SP.speaking.flags & INNATE)
|
||||
custom_emote(EMOTE_AUDIBLE, message_clean, TRUE)
|
||||
return
|
||||
|
||||
if(!can_hear())
|
||||
// INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
if(istype(M))
|
||||
for(var/atom/A in M.contents)
|
||||
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/holder))
|
||||
if(istype(A, /obj/item/holder))
|
||||
return
|
||||
M.status_flags &= ~PASSEMOTES
|
||||
|
||||
|
||||
@@ -568,30 +568,6 @@
|
||||
/datum/language/abductor/golem/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
|
||||
return TRUE
|
||||
|
||||
/datum/language/corticalborer
|
||||
name = "Cortical Link"
|
||||
desc = "Cortical borers possess a strange link between their tiny minds."
|
||||
speech_verb = "sings"
|
||||
ask_verb = "sings"
|
||||
exclaim_verbs = list("sings")
|
||||
colour = "alien"
|
||||
key = "bo"
|
||||
flags = RESTRICTED | HIVEMIND | NOBABEL
|
||||
follow = TRUE
|
||||
|
||||
/datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
var/mob/living/simple_animal/borer/B
|
||||
|
||||
if(iscarbon(speaker))
|
||||
var/mob/living/carbon/M = speaker
|
||||
B = M.has_brain_worms()
|
||||
else if(istype(speaker,/mob/living/simple_animal/borer))
|
||||
B = speaker
|
||||
|
||||
if(B)
|
||||
speaker_mask = B.truename
|
||||
..(speaker,message,speaker_mask)
|
||||
|
||||
/datum/language/binary
|
||||
name = "Robot Talk"
|
||||
desc = "Most human stations support free-use communications protocols and routing hubs for synthetic use."
|
||||
|
||||
@@ -30,9 +30,6 @@
|
||||
continue
|
||||
no_queen = 0
|
||||
|
||||
if(src.has_brain_worms())
|
||||
to_chat(src, "<span class='warning'>We cannot perform this ability at the present time!</span>")
|
||||
return
|
||||
if(no_queen)
|
||||
adjustPlasma(-500)
|
||||
to_chat(src, "<span class='noticealien'>You begin to evolve!</span>")
|
||||
|
||||
@@ -61,10 +61,6 @@
|
||||
|
||||
var/obj/item/organ/internal/brain/B = src
|
||||
if(!special)
|
||||
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
|
||||
if(borer)
|
||||
borer.leave_host() //Should remove borer if the brain is removed - RR
|
||||
|
||||
if(owner.mind && !non_primary)//don't transfer if the owner does not have a mind.
|
||||
B.transfer_identity(user)
|
||||
|
||||
|
||||
@@ -14,10 +14,6 @@
|
||||
QDEL_LIST(internal_organs)
|
||||
QDEL_LIST(stomach_contents)
|
||||
QDEL_LIST(processing_patches)
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(B)
|
||||
B.leave_host()
|
||||
qdel(B)
|
||||
GLOB.carbon_list -= src
|
||||
return ..()
|
||||
|
||||
@@ -518,10 +514,10 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
to_chat(src, "<span class='warning'>This ventilation duct is not connected to anything!</span>")
|
||||
|
||||
|
||||
/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/starting_machine)
|
||||
if(!istype(starting_machine) || !starting_machine.returnPipenet() || !starting_machine.can_see_pipes())
|
||||
/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/starting_machine, obj/machinery/atmospherics/target_move)
|
||||
if(!istype(starting_machine) || !starting_machine.returnPipenet(target_move) || !starting_machine.can_see_pipes())
|
||||
return
|
||||
var/datum/pipeline/pipeline = starting_machine.returnPipenet()
|
||||
var/datum/pipeline/pipeline = starting_machine.returnPipenet(target_move)
|
||||
var/list/totalMembers = list()
|
||||
totalMembers |= pipeline.members
|
||||
totalMembers |= pipeline.other_atmosmch
|
||||
@@ -543,13 +539,15 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
/atom/proc/update_pipe_vision()
|
||||
return
|
||||
|
||||
/mob/living/update_pipe_vision()
|
||||
if(pipes_shown.len)
|
||||
/mob/living/update_pipe_vision(obj/machinery/atmospherics/target_move)
|
||||
if(pipes_shown.len && !(target_move))
|
||||
if(!is_ventcrawling(src))
|
||||
remove_ventcrawl()
|
||||
else
|
||||
if(is_ventcrawling(src))
|
||||
add_ventcrawl(loc)
|
||||
if(target_move)
|
||||
remove_ventcrawl()
|
||||
add_ventcrawl(loc, target_move)
|
||||
|
||||
|
||||
//Throwing stuff
|
||||
@@ -979,6 +977,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
else
|
||||
REMOVE_TRAIT(src, TRAIT_RESTRAINED, "handcuffed")
|
||||
clear_alert("handcuffed")
|
||||
changeNext_move(CLICK_CD_RAPID) //reset click cooldown from handcuffs
|
||||
update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed.
|
||||
update_inv_handcuffed()
|
||||
update_hud_handcuffed()
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
var/obj/item/head = null
|
||||
var/obj/item/clothing/suit/wear_suit = null //TODO: necessary? Are they even used? ~Carn
|
||||
|
||||
var/mob/living/simple_animal/borer/borer = null
|
||||
|
||||
//Active emote/pose
|
||||
var/pose = null
|
||||
|
||||
|
||||
@@ -203,9 +203,6 @@
|
||||
stat("Distribution Pressure", internal.distribute_pressure)
|
||||
|
||||
// I REALLY need to split up status panel things into datums
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(B && B.controlling)
|
||||
stat("Chemicals", B.chemicals)
|
||||
|
||||
if(mind)
|
||||
var/datum/antagonist/changeling/cling = mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
|
||||
@@ -489,7 +489,7 @@ emp_act
|
||||
if(prob(I.force))
|
||||
visible_message("<span class='combat danger'>[src] has been knocked down!</span>", \
|
||||
"<span class='combat userdanger'>[src] has been knocked down!</span>")
|
||||
apply_effect(10 SECONDS, WEAKEN, armor)
|
||||
KnockDown(10 SECONDS)
|
||||
AdjustConfused(30 SECONDS)
|
||||
if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE)
|
||||
SSticker.mode.remove_revolutionary(mind)
|
||||
@@ -510,7 +510,7 @@ emp_act
|
||||
if(stat == CONSCIOUS && I.force && prob(I.force + 10))
|
||||
visible_message("<span class='combat danger'>[src] has been knocked down!</span>", \
|
||||
"<span class='combat userdanger'>[src] has been knocked down!</span>")
|
||||
apply_effect(10 SECONDS, WEAKEN, armor)
|
||||
KnockDown(8 SECONDS)
|
||||
|
||||
if(bloody)
|
||||
if(wear_suit)
|
||||
|
||||
@@ -39,9 +39,6 @@
|
||||
winset(client, "input", "text=[null]")
|
||||
|
||||
/mob/living/carbon/human/say_understands(mob/other, datum/language/speaking = null)
|
||||
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
|
||||
return 1
|
||||
|
||||
if(dna.species.can_understand(other))
|
||||
return 1
|
||||
|
||||
@@ -100,6 +97,8 @@
|
||||
// how do species that don't breathe talk? magic, that's what.
|
||||
var/breathes = (!HAS_TRAIT(src, TRAIT_NOBREATH))
|
||||
var/obj/item/organ/internal/L = get_organ_slot("lungs")
|
||||
if(HAS_TRAIT(src, TRAIT_MUTE))
|
||||
return FALSE
|
||||
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
|
||||
return FALSE
|
||||
if(getOxyLoss() > 10 || AmountLoseBreath() >= 8 SECONDS)
|
||||
|
||||
@@ -504,9 +504,9 @@
|
||||
target.visible_message("<span class='danger'>[user] [pick(attack.attack_verb)]ed [target]!</span>")
|
||||
target.apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
|
||||
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
|
||||
target.visible_message("<span class='danger'>[user] has weakened [target]!</span>", \
|
||||
"<span class='userdanger'>[user] has weakened [target]!</span>")
|
||||
target.apply_effect(8 SECONDS, WEAKEN, armor_block)
|
||||
target.visible_message("<span class='danger'>[user] has knocked down [target]!</span>", \
|
||||
"<span class='userdanger'>[user] has knocked down [target]!</span>")
|
||||
target.KnockDown(4 SECONDS)
|
||||
target.forcesay(GLOB.hit_appends)
|
||||
else if(IS_HORIZONTAL(target))
|
||||
target.forcesay(GLOB.hit_appends)
|
||||
|
||||
@@ -772,7 +772,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
|
||||
else
|
||||
standing = mutable_appearance('icons/mob/clothing/feet.dmi', "[shoes.icon_state]", layer = -SHOES_LAYER)
|
||||
|
||||
|
||||
if(shoes.blood_DNA)
|
||||
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
|
||||
bloodsies.color = shoes.blood_color
|
||||
@@ -979,13 +978,16 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
|
||||
remove_overlay(BACK_LAYER)
|
||||
if(back)
|
||||
//determine the icon to use
|
||||
var/t_state = back.item_state
|
||||
if(!t_state)
|
||||
t_state = back.icon_state
|
||||
var/mutable_appearance/standing
|
||||
if(back.icon_override)
|
||||
standing = mutable_appearance(back.icon_override, "[back.icon_state]", layer = -BACK_LAYER)
|
||||
standing = mutable_appearance(back.icon_override, "[t_state]", layer = -BACK_LAYER)
|
||||
else if(back.sprite_sheets && back.sprite_sheets[dna.species.name])
|
||||
standing = mutable_appearance(back.sprite_sheets[dna.species.name], "[back.icon_state]", layer = -BACK_LAYER)
|
||||
standing = mutable_appearance(back.sprite_sheets[dna.species.name], "[t_state]", layer = -BACK_LAYER)
|
||||
else
|
||||
standing = mutable_appearance('icons/mob/clothing/back.dmi', "[back.icon_state]", layer = -BACK_LAYER)
|
||||
standing = mutable_appearance('icons/mob/clothing/back.dmi', "[t_state]", layer = -BACK_LAYER)
|
||||
|
||||
//create the image
|
||||
standing.alpha = back.alpha
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
mob_type_allowed_typecache = /mob/living
|
||||
mob_type_blacklist_typecache = list(
|
||||
/mob/living/carbon/brain, // nice try
|
||||
/mob/living/captive_brain,
|
||||
/mob/living/silicon,
|
||||
/mob/living/simple_animal/bot
|
||||
)
|
||||
@@ -83,7 +82,6 @@
|
||||
|
||||
mob_type_blacklist_typecache = list(
|
||||
/mob/living/carbon/brain,
|
||||
/mob/living/captive_brain
|
||||
)
|
||||
|
||||
/datum/emote/living/deathgasp/get_sound(mob/living/user)
|
||||
@@ -346,7 +344,6 @@
|
||||
|
||||
mob_type_blacklist_typecache = list(
|
||||
/mob/living/carbon/brain,
|
||||
/mob/living/captive_brain
|
||||
)
|
||||
|
||||
/datum/emote/living/tilt
|
||||
@@ -389,7 +386,6 @@
|
||||
message = null
|
||||
mob_type_blacklist_typecache = list(
|
||||
/mob/living/carbon/brain, // nice try
|
||||
/mob/living/captive_brain
|
||||
)
|
||||
|
||||
// Custom emotes should be able to be forced out regardless of context.
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
maxHealth = 150
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/neurotox
|
||||
@@ -95,7 +95,7 @@
|
||||
maxHealth = 250
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
move_to_delay = 4
|
||||
|
||||
@@ -63,6 +63,6 @@
|
||||
melee_damage_upper = 30
|
||||
a_intent = INTENT_HARM
|
||||
pass_flags = PASSTABLE
|
||||
universal_speak = 1
|
||||
universal_understand = 1
|
||||
universal_speak = TRUE
|
||||
universal_understand = TRUE
|
||||
gold_core_spawnable = NO_SPAWN //badmin only
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "hits"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
stop_automated_movement_when_pulled = FALSE
|
||||
maxHealth = 60
|
||||
health = 60
|
||||
obj_damage = 60
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
icon_living = "holocarp"
|
||||
maxbodytemp = INFINITY
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
random_color = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/megacarp
|
||||
|
||||
@@ -90,10 +90,10 @@
|
||||
if(AIStatus == AI_IDLE)
|
||||
//1% chance to skitter madly away
|
||||
if(!busy && prob(1))
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
Goto(pick(urange(20, src, 1)), move_to_delay)
|
||||
spawn(50)
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
walk(src,0)
|
||||
return 1
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
if(cocoon_target == C && get_dist(src,cocoon_target) > 1)
|
||||
cocoon_target = null
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/handle_automated_movement() //Hacky and ugly.
|
||||
if(..())
|
||||
@@ -135,7 +135,7 @@
|
||||
if(isitem(O) || isstructure(O) || ismachinery(O))
|
||||
cocoon_target = O
|
||||
busy = MOVING_TO_TARGET
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
Goto(O, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(O)
|
||||
@@ -146,7 +146,7 @@
|
||||
|
||||
else
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/verb/Web()
|
||||
set name = "Lay Web"
|
||||
@@ -158,12 +158,12 @@
|
||||
if(busy != SPINNING_WEB)
|
||||
busy = SPINNING_WEB
|
||||
src.visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance.</span>")
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
spawn(40)
|
||||
if(busy == SPINNING_WEB && src.loc == T)
|
||||
new /obj/structure/spider/stickyweb(T)
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/Wrap()
|
||||
@@ -198,7 +198,7 @@
|
||||
if(cocoon_target && busy != SPINNING_COCOON)
|
||||
busy = SPINNING_COCOON
|
||||
src.visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance around \the [cocoon_target].</span>")
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
walk(src,0)
|
||||
spawn(50)
|
||||
if(busy == SPINNING_COCOON)
|
||||
@@ -234,7 +234,7 @@
|
||||
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
|
||||
cocoon_target = null
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/LayEggs()
|
||||
set name = "Lay Eggs"
|
||||
@@ -249,7 +249,7 @@
|
||||
else if(busy != LAYING_EGGS)
|
||||
busy = LAYING_EGGS
|
||||
src.visible_message("<span class='notice'>\the [src] begins to lay a cluster of eggs.</span>")
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
spawn(50)
|
||||
if(busy == LAYING_EGGS)
|
||||
E = locate() in get_turf(src)
|
||||
@@ -259,10 +259,10 @@
|
||||
C.master_commander = master_commander
|
||||
C.xenobiology_spawned = xenobiology_spawned
|
||||
if(ckey)
|
||||
C.player_spiders = 1
|
||||
C.player_spiders = TRUE
|
||||
fed--
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
#undef SPINNING_WEB
|
||||
#undef LAYING_EGGS
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
attacktext = "chomps"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
faction = list("creature")
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
stat_attack = DEAD
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
|
||||
@@ -20,14 +20,14 @@
|
||||
maxHealth = 250 // same as sgt araneus
|
||||
health = 250
|
||||
obj_damage = 50
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
stat_attack = UNCONSCIOUS
|
||||
attacktext = "savages"
|
||||
attack_sound = 'sound/effects/bite.ogg'
|
||||
speak_emote = list("growls")
|
||||
see_in_dark = 9
|
||||
universal_understand = 1
|
||||
wander = 0
|
||||
universal_understand = TRUE
|
||||
wander = FALSE
|
||||
var/life_regen_cycles = 0
|
||||
var/life_regen_cycle_trigger = 10 // heal once for every X number of cycles spent resting
|
||||
var/life_regen_amount = -10 // negative, because negative = healing
|
||||
@@ -109,7 +109,7 @@
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
force_threshold = 5 // no punching
|
||||
universal_speak = 1
|
||||
universal_speak = TRUE
|
||||
smoke_freq = 200
|
||||
life_regen_cycle_trigger = 5
|
||||
melee_damage_lower = 20
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
projectilesound = 'sound/weapons/gunshots/gunshot.ogg'
|
||||
projectiletype = /obj/item/projectile/hivebotbullet
|
||||
faction = list("hivebot")
|
||||
check_friendly_fire = 1
|
||||
check_friendly_fire = TRUE
|
||||
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)
|
||||
minbodytemp = 0
|
||||
speak_emote = list("states")
|
||||
@@ -27,18 +27,18 @@
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
|
||||
deathmessage = "blows apart!"
|
||||
bubble_icon = "machine"
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/range
|
||||
name = "Hivebot"
|
||||
desc = "A smallish robot, this one is armed!"
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/rapid
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
rapid = 3
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
@@ -48,7 +48,7 @@
|
||||
desc = "A robot, this one is armed and looks tough!"
|
||||
health = 80
|
||||
maxHealth = 80
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
|
||||
// Only execute the below if we successfully died
|
||||
@@ -66,8 +66,8 @@
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
status_flags = 0
|
||||
anchored = 1
|
||||
stop_automated_movement = 1
|
||||
anchored = TRUE
|
||||
stop_automated_movement = TRUE
|
||||
var/bot_type = "norm"
|
||||
var/bot_amt = 10
|
||||
var/spawn_delay = 600
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/simple_animal/hostile
|
||||
faction = list("hostile")
|
||||
stop_automated_movement_when_pulled = 0
|
||||
stop_automated_movement_when_pulled = FALSE
|
||||
obj_damage = 40
|
||||
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls
|
||||
var/atom/target
|
||||
@@ -29,13 +29,13 @@
|
||||
var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time
|
||||
var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is
|
||||
var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash
|
||||
var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
|
||||
var/check_friendly_fire = FALSE // Should the ranged mob check for friendlies when shooting
|
||||
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
|
||||
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
|
||||
|
||||
|
||||
//These vars are related to how mobs locate and target
|
||||
var/robust_searching = 0 //By default, mobs have a simple searching method, set this to 1 for the more scrutinous searching (stat_attack, stat_exclusive, etc), should be disabled on most mobs
|
||||
var/robust_searching = FALSE //By default, mobs have a simple searching method, set this to TRUE for the more scrutinous searching (stat_attack, stat_exclusive, etc), should be disabled on most mobs
|
||||
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
|
||||
var/aggro_vision_range = 9 //If a mob is aggro, we search in this radius. Defaults to 9 to keep in line with original simple mob aggro radius
|
||||
var/search_objects = 0 //If we want to consider objects when searching around, set this to 1. If you want to search for objects while also ignoring mobs until hurt, set it to 2. To completely ignore mobs, even when attacked, set it to 3
|
||||
@@ -44,7 +44,7 @@
|
||||
var/list/wanted_objects = list() //A typecache of objects types that will be checked against to attack, should we have search_objects enabled
|
||||
var/stat_attack = CONSCIOUS //Mobs with stat_attack to UNCONSCIOUS will attempt to attack things that are unconscious, Mobs with stat_attack set to DEAD will attempt to attack the dead.
|
||||
var/stat_exclusive = FALSE //Mobs with this set to TRUE will exclusively attack things defined by stat_attack, stat_attack DEAD means they will only attack corpses
|
||||
var/attack_same = 0 //Set us to 1 to allow us to attack our own faction
|
||||
var/attack_same = FALSE //Set to TRUE to allow us to attack our own faction
|
||||
var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
|
||||
var/attack_all_objects = FALSE //if true, equivalent to having a wanted_objects list containing ALL objects.
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
AttackingTarget()
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/MoveToTarget(list/possible_targets)//Step 5, handle movement between us and our target
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
if(!target || !CanAttack(target))
|
||||
LoseTarget()
|
||||
return 0
|
||||
@@ -334,7 +334,7 @@
|
||||
taunt_chance = max(taunt_chance-7,2)
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/LoseAggro()
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
vision_range = initial(vision_range)
|
||||
taunt_chance = initial(taunt_chance)
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/mob/living/parent_mob
|
||||
var/multiply_chance = 0 //if we multiply on hit
|
||||
deathmessage = "vanishes into thin air! It was a fake!"
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/Life()
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
stop_automated_movement_when_pulled = FALSE
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
pixel_x = -16
|
||||
|
||||
@@ -463,7 +463,7 @@ Difficulty: Medium
|
||||
icon = 'icons/effects/fire.dmi'
|
||||
icon_state = "1"
|
||||
anchored = TRUE
|
||||
opacity = 0
|
||||
opacity = FALSE
|
||||
density = TRUE
|
||||
duration = 82
|
||||
color = COLOR_DARK_ORANGE
|
||||
|
||||
@@ -30,15 +30,15 @@ Difficulty: Medium
|
||||
armour_penetration = 50
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
wander = 0
|
||||
wander = FALSE
|
||||
speed = 2
|
||||
ranged = 1
|
||||
del_on_death = 1
|
||||
ranged = TRUE
|
||||
del_on_death = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
ranged_cooldown_time = 20
|
||||
var/size = 5
|
||||
var/charging = 0
|
||||
var/charging = FALSE
|
||||
internal_type = /obj/item/gps/internal/legion
|
||||
medal_type = BOSS_MEDAL_LEGION
|
||||
score_type = LEGION_SCORE
|
||||
@@ -46,7 +46,7 @@ Difficulty: Medium
|
||||
pixel_x = -75
|
||||
loot = list(/obj/item/stack/sheet/bone = 3)
|
||||
vision_range = 13
|
||||
elimination = 1
|
||||
elimination = TRUE
|
||||
appearance_flags = 0
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
stat_attack = UNCONSCIOUS // Overriden from /tg/ - otherwise Legion starts chasing its minions
|
||||
@@ -70,20 +70,20 @@ Difficulty: Medium
|
||||
else
|
||||
visible_message("<span class='warning'><b>[src] charges!</b></span>")
|
||||
SpinAnimation(speed = 20, loops = 5, parallel = FALSE)
|
||||
ranged = 0
|
||||
ranged = FALSE
|
||||
retreat_distance = 0
|
||||
minimum_distance = 0
|
||||
speed = 0
|
||||
charging = 1
|
||||
charging = TRUE
|
||||
spawn(50)
|
||||
reset_charge()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/proc/reset_charge()
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
speed = 2
|
||||
charging = 0
|
||||
charging = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/can_die()
|
||||
return ..() && health <= 0
|
||||
@@ -126,7 +126,7 @@ Difficulty: Medium
|
||||
break
|
||||
if(last_legion)
|
||||
loot = list(/obj/item/staff/storm)
|
||||
elimination = 0
|
||||
elimination = FALSE
|
||||
else if(prob(5))
|
||||
loot = list(/obj/structure/closet/crate/necropolis/tendril)
|
||||
if(!true_spawn)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/list/crusher_loot
|
||||
var/medal_type
|
||||
var/score_type = BOSS_SCORE
|
||||
var/elimination = 0
|
||||
var/elimination = FALSE
|
||||
var/anger_modifier = 0
|
||||
var/obj/item/gps/internal_gps
|
||||
var/internal_type
|
||||
|
||||
@@ -106,7 +106,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
|
||||
//AI versions of the swarmer mini-antag
|
||||
//This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets
|
||||
/mob/living/simple_animal/hostile/swarmer/ai
|
||||
wander = 1
|
||||
wander = TRUE
|
||||
faction = list("swarmer", "mining")
|
||||
weather_immunities = list("ash") //wouldn't be fun otherwise
|
||||
AIStatus = AI_ON
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
var/is_electronic = 0
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/emp_act(severity)
|
||||
if(is_electronic)
|
||||
@@ -45,9 +45,9 @@
|
||||
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
|
||||
/mob/living/simple_animal/hostile/mimic/crate
|
||||
attacktext = "bites"
|
||||
stop_automated_movement = 1
|
||||
wander = 0
|
||||
var/attempt_open = 0
|
||||
stop_automated_movement = TRUE
|
||||
wander = FALSE
|
||||
var/attempt_open = FALSE
|
||||
|
||||
// Pickup loot
|
||||
/mob/living/simple_animal/hostile/mimic/crate/Initialize(mapload)
|
||||
@@ -84,7 +84,7 @@
|
||||
/mob/living/simple_animal/hostile/mimic/crate/proc/trigger()
|
||||
if(!attempt_open)
|
||||
visible_message("<b>[src]</b> starts to move!")
|
||||
attempt_open = 1
|
||||
attempt_open = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(amount, updating_health = TRUE)
|
||||
trigger()
|
||||
@@ -221,7 +221,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
emote_see = list("aims menacingly")
|
||||
obj_damage = 0
|
||||
environment_smash = 0 //needed? seems weird for them to do so
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 1 //just enough to shoot
|
||||
minimum_distance = 6
|
||||
var/obj/item/gun/G = O
|
||||
@@ -277,7 +277,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
Pewgun.chambered.loc = Pewgun
|
||||
visible_message("<span class='danger'>The <b>[src]</b> cocks itself!</span>")
|
||||
else
|
||||
ranged = 0 //BANZAIIII
|
||||
ranged = FALSE //BANZAIIII
|
||||
retreat_distance = 0
|
||||
minimum_distance = 1
|
||||
return
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
move_to_delay = 20
|
||||
projectiletype = /obj/item/projectile/temp/basilisk
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
ranged_message = "stares"
|
||||
ranged_cooldown_time = 30
|
||||
throw_message = "does nothing against the hard shell of"
|
||||
@@ -77,7 +77,7 @@
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
stat_attack = UNCONSCIOUS
|
||||
flying = TRUE
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
crusher_loot = /obj/item/crusher_trophy/watcher_wing
|
||||
loot = list()
|
||||
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
mob_biotypes = MOB_ORGANIC
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
move_to_delay = 14
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
vision_range = 5
|
||||
aggro_vision_range = 9
|
||||
speed = 3
|
||||
@@ -86,7 +86,7 @@
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
density = FALSE
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -173,9 +173,9 @@
|
||||
crusher_loot = /obj/item/crusher_trophy/legion_skull
|
||||
loot = list(/obj/item/organ/internal/regenerative_core/legion)
|
||||
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
var/dwarf_mob = FALSE
|
||||
var/mob/living/carbon/human/stored_mob
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
throw_message = "is shrugged off by"
|
||||
del_on_death = TRUE
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
var/can_infest_dead = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life(seconds, times_fired)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 1
|
||||
attack_same = 2
|
||||
attack_same = 2 // this is usually a bool, but mushrooms are a special case
|
||||
attacktext = "chomps"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
faction = list("mushroom")
|
||||
@@ -26,7 +26,7 @@
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
speed = 1
|
||||
ventcrawler = 2
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
speak_emote = list("squeaks")
|
||||
deathmessage = "fainted"
|
||||
var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
speak_emote = list("yarrs")
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
|
||||
/obj/item/melee/energy/sword/pirate)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
faction = list("pirate")
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
@@ -38,7 +38,7 @@
|
||||
icon_living = "pirateranged"
|
||||
icon_dead = "piratemelee_dead" // Does not actually exist. del_on_death.
|
||||
projectilesound = 'sound/weapons/laser.ogg'
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
rapid = 2
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
icon_living = "drone3"
|
||||
icon_dead = "drone_dead"
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
rapid = 3
|
||||
retreat_distance = 3
|
||||
minimum_distance = 3
|
||||
@@ -29,7 +29,7 @@
|
||||
minbodytemp = 0
|
||||
faction = list("malf_drone")
|
||||
deathmessage = "suddenly breaks apart."
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
var/passive_mode = TRUE // if true, don't target anything.
|
||||
|
||||
/mob/living/simple_animal/hostile/malf_drone/Initialize(mapload)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
speak_emote = list("gnashes")
|
||||
faction = list("carp")
|
||||
flying = 1
|
||||
flying = TRUE
|
||||
|
||||
var/carp_color = "carp" //holder for icon set
|
||||
var/static/list/carp_colors = list(\
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
icon_living = "ghost2"
|
||||
icon_dead = "ghost"
|
||||
mob_biotypes = MOB_SPIRIT
|
||||
density = 0 // ghost
|
||||
density = FALSE // ghost
|
||||
invisibility = 60 // no seriously ghost
|
||||
speak_chance = 0 // fyi, ghost
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
gold_core_spawnable = NO_SPAWN //too spooky for science
|
||||
faction = list("undead") // did I mention ghost
|
||||
loot = list(/obj/item/reagent_containers/food/snacks/ectoplasm)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(check_drift = 0)
|
||||
return 1
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
faction = list("undead")
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/zombie
|
||||
@@ -121,4 +121,4 @@
|
||||
|
||||
faction = list("undead")
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
@@ -26,14 +26,14 @@
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/russian,
|
||||
/obj/item/kitchen/knife)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged
|
||||
icon_state = "russianranged"
|
||||
icon_living = "russianranged"
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectilesound = 'sound/weapons/gunshots/gunshot.ogg'
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
attack_sound = 'sound/hallucinations/growl1.ogg'
|
||||
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 = 10
|
||||
robust_searching = 1
|
||||
robust_searching = TRUE
|
||||
stat_attack = UNCONSCIOUS
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
faction = list("skeleton")
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
animate_movement = SYNC_STEPS
|
||||
|
||||
minbodytemp = 0
|
||||
@@ -73,7 +73,7 @@
|
||||
animate_movement = SLIDE_STEPS
|
||||
|
||||
AIStatus = AI_ON//The head is conscious
|
||||
stop_automated_movement = 0 //Ditto ^
|
||||
stop_automated_movement = FALSE //Ditto ^
|
||||
|
||||
faction = list("spaceworms") //head and body both have this faction JIC
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
speed = -1
|
||||
maxHealth = 50000
|
||||
health = 50000
|
||||
healable = 0
|
||||
healable = FALSE
|
||||
|
||||
harm_intent_damage = 35
|
||||
obj_damage = 100
|
||||
@@ -47,7 +47,7 @@
|
||||
pull_force = MOVE_FORCE_EXTREMELY_STRONG
|
||||
status_flags = GODMODE // Cannot push also
|
||||
|
||||
var/cannot_be_seen = 1
|
||||
var/cannot_be_seen = TRUE
|
||||
var/mob/living/creator = null
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
desc = "You will trigger a large amount of lights around you to flicker."
|
||||
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
clothes_req = FALSE
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/create_new_targeting()
|
||||
var/datum/spell_targeting/aoe/turf/T = new()
|
||||
@@ -181,7 +181,7 @@
|
||||
|
||||
message = "<span class='notice'>You glare your eyes.</span>"
|
||||
charge_max = 600
|
||||
clothes_req = 0
|
||||
clothes_req = FALSE
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/blindness/create_new_targeting()
|
||||
var/datum/spell_targeting/aoe/turf/T = new()
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
a_intent = INTENT_HARM
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("syndicate")
|
||||
check_friendly_fire = 1
|
||||
check_friendly_fire = TRUE
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
@@ -82,14 +82,14 @@
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot
|
||||
name = "Syndicate Operative"
|
||||
force_threshold = 6 // Prevents people using punches to bypass eshield
|
||||
robust_searching = 1 // Together with stat_attack, ensures dionae/etc that regen are killed properly
|
||||
robust_searching = TRUE // Together with stat_attack, ensures dionae/etc that regen are killed properly
|
||||
stat_attack = UNCONSCIOUS
|
||||
universal_speak = 1
|
||||
universal_speak = TRUE
|
||||
icon_state = "syndicate_swordonly"
|
||||
icon_living = "syndicate_swordonly"
|
||||
melee_block_chance = 0
|
||||
ranged_block_chance = 0
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/raised_alert = FALSE
|
||||
var/alert_on_death = FALSE
|
||||
@@ -236,7 +236,7 @@
|
||||
melee_damage_upper = 10
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
rapid = 3
|
||||
retreat_distance = 3
|
||||
minimum_distance = 3
|
||||
@@ -266,7 +266,7 @@
|
||||
melee_damage_upper = 10
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 3
|
||||
minimum_distance = 3
|
||||
melee_block_chance = 0
|
||||
@@ -295,7 +295,7 @@
|
||||
icon_state = "syndicate_space_sword"
|
||||
icon_living = "syndicate_space_sword"
|
||||
speed = 1
|
||||
wander = 0
|
||||
wander = FALSE
|
||||
alert_on_spacing = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0)
|
||||
@@ -317,7 +317,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
rapid = 2
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
@@ -365,7 +365,7 @@
|
||||
flying = TRUE
|
||||
bubble_icon = "syndibot"
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
deathmessage = "is smashed into pieces!"
|
||||
|
||||
/mob/living/simple_animal/hostile/viscerator/Initialize(mapload)
|
||||
|
||||
@@ -159,8 +159,8 @@
|
||||
name = "terror web"
|
||||
desc = "it's stringy and sticky"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
anchored = 1 // prevents people dragging it
|
||||
density = 0 // prevents it blocking all movement
|
||||
anchored = TRUE // prevents people dragging it
|
||||
density = FALSE // prevents it blocking all movement
|
||||
max_integrity = 20 // two welders, or one laser shot (15 for the normal spider webs)
|
||||
icon_state = "stickyweb1"
|
||||
var/creator_ckey = null
|
||||
@@ -252,7 +252,7 @@
|
||||
return
|
||||
busy = SPINNING_COCOON
|
||||
visible_message("<span class='notice'>[src] begins to secrete a sticky substance around [cocoon_target].</span>")
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
walk(src,0)
|
||||
if(do_after(src, 40, target = cocoon_target.loc))
|
||||
if(busy == SPINNING_COCOON)
|
||||
@@ -291,7 +291,7 @@
|
||||
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
|
||||
cocoon_target = null
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoVentSmash()
|
||||
var/valid_target = FALSE
|
||||
@@ -308,7 +308,7 @@
|
||||
if(do_after(src, 40, target = loc))
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/P in range(1, get_turf(src)))
|
||||
if(P.welded)
|
||||
P.welded = 0
|
||||
P.welded = FALSE
|
||||
P.update_icon()
|
||||
P.update_pipe_image()
|
||||
forceMove(P.loc)
|
||||
@@ -316,7 +316,7 @@
|
||||
return
|
||||
for(var/obj/machinery/atmospherics/unary/vent_scrubber/C in range(1, get_turf(src)))
|
||||
if(C.welded)
|
||||
C.welded = 0
|
||||
C.welded = FALSE
|
||||
C.update_icon()
|
||||
C.update_pipe_image()
|
||||
forceMove(C.loc)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
spider_opens_doors = 2 // Breach specialist.
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS // Breaks anything.
|
||||
spider_tier = TS_TIER_2
|
||||
ai_ventbreaker = 1
|
||||
ai_ventbreaker = TRUE
|
||||
freq_ventcrawl_combat = 600 // Ventcrawls very frequently, breaking open vents as it goes.
|
||||
freq_ventcrawl_idle = 1800
|
||||
web_type = null
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_special_action()
|
||||
if(prob(prob_ai_massweb))
|
||||
for(var/turf/simulated/T in oview(2,get_turf(src)))
|
||||
if(T.density == 0)
|
||||
if(!T.density)
|
||||
var/obj/structure/spider/terrorweb/W = locate() in T
|
||||
if(!W)
|
||||
new web_type(T)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
spider_tier = TS_TIER_3
|
||||
|
||||
// Unlike queens, no ranged attack.
|
||||
ranged = 0
|
||||
ranged = FALSE
|
||||
retreat_distance = 0
|
||||
minimum_distance = 0
|
||||
projectilesound = null
|
||||
|
||||
@@ -111,5 +111,5 @@
|
||||
/obj/structure/spider/terrorweb/purple
|
||||
name = "thick web"
|
||||
desc = "This web is so thick, most cannot see beyond it."
|
||||
opacity = 1
|
||||
opacity = TRUE
|
||||
max_integrity = 40
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
ai_ventcrawls = FALSE
|
||||
idle_ventcrawl_chance = 0
|
||||
force_threshold = 18 // outright immune to anything of force under 18, this means welders can't hurt it, only guns can
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
@@ -172,7 +172,7 @@
|
||||
else if(entry_vent)
|
||||
if(!path_to_vent)
|
||||
visible_message("<span class='danger'>\The [src] looks around warily - then seeks a better nesting ground.</span>")
|
||||
path_to_vent = 1
|
||||
path_to_vent = TRUE
|
||||
else
|
||||
neststep = -1
|
||||
message_admins("Warning: [key_name_admin(src)] was spawned in an area without a vent! This is likely a mapping/spawn mistake. This mob's AI has been permanently deactivated.")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
name = "spiderling"
|
||||
desc = "A fast-moving tiny spider, prone to making aggressive hissing sounds. Hope it doesn't grow up."
|
||||
icon_state = "spiderling"
|
||||
anchored = 0
|
||||
anchored = FALSE
|
||||
layer = 2.75
|
||||
max_integrity = 3
|
||||
var/stillborn = FALSE
|
||||
@@ -101,7 +101,7 @@
|
||||
return
|
||||
if(travelling_in_vent)
|
||||
if(isturf(loc))
|
||||
travelling_in_vent = 0
|
||||
travelling_in_vent = FALSE
|
||||
entry_vent = null
|
||||
else if(entry_vent)
|
||||
if(get_dist(src, entry_vent) <= 1)
|
||||
@@ -179,7 +179,7 @@
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoLayTerrorEggs(lay_type, lay_number)
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
var/obj/structure/spider/eggcluster/terror_eggcluster/C = new /obj/structure/spider/eggcluster/terror_eggcluster(get_turf(src), lay_type)
|
||||
C.spiderling_number = lay_number
|
||||
C.spider_myqueen = spider_myqueen
|
||||
@@ -189,7 +189,7 @@
|
||||
C.amount_grown = 250
|
||||
C.spider_growinstantly = TRUE
|
||||
spawn(10)
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/obj/structure/spider/eggcluster/terror_eggcluster
|
||||
name = "terror egg cluster"
|
||||
|
||||
@@ -108,17 +108,17 @@
|
||||
if(path_to_vent)
|
||||
if(entry_vent)
|
||||
if(spider_steps_taken > spider_max_steps)
|
||||
path_to_vent = 0
|
||||
stop_automated_movement = 0
|
||||
path_to_vent = FALSE
|
||||
stop_automated_movement = FALSE
|
||||
spider_steps_taken = 0
|
||||
path_to_vent = 0
|
||||
path_to_vent = FALSE
|
||||
entry_vent = null
|
||||
else if(get_dist(src, entry_vent) <= 1)
|
||||
path_to_vent = 0
|
||||
stop_automated_movement = 1
|
||||
path_to_vent = FALSE
|
||||
stop_automated_movement = TRUE
|
||||
spider_steps_taken = 0
|
||||
spawn(50)
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
TSVentCrawlRandom(entry_vent)
|
||||
else
|
||||
spider_steps_taken++
|
||||
@@ -127,13 +127,13 @@
|
||||
if(spider_debug)
|
||||
visible_message("<span class='notice'>[src] moves towards the vent [entry_vent].</span>")
|
||||
else
|
||||
path_to_vent = 0
|
||||
path_to_vent = FALSE
|
||||
else if(ai_break_lights && world.time > (last_break_light + freq_break_light))
|
||||
last_break_light = world.time
|
||||
for(var/obj/machinery/light/L in range(1, src))
|
||||
if(!L.status)
|
||||
step_to(src,L)
|
||||
L.on = 1
|
||||
L.on = TRUE
|
||||
L.break_light_tube()
|
||||
do_attack_animation(L)
|
||||
visible_message("<span class='danger'>[src] smashes the [L.name].</span>")
|
||||
@@ -154,7 +154,7 @@
|
||||
entry_vent = v
|
||||
vdistance = get_dist(src,v)
|
||||
if(entry_vent)
|
||||
path_to_vent = 1
|
||||
path_to_vent = TRUE
|
||||
else
|
||||
// If none of the general actions apply, check for class-specific actions.
|
||||
spider_special_action()
|
||||
@@ -206,7 +206,7 @@
|
||||
spider_steps_taken = 0
|
||||
cocoon_target = null
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
else
|
||||
spider_steps_taken++
|
||||
CreatePath(cocoon_target)
|
||||
@@ -228,7 +228,7 @@
|
||||
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
|
||||
if(!istype(O, /obj/item/paper))
|
||||
cocoon_target = O
|
||||
stop_automated_movement = 1
|
||||
stop_automated_movement = TRUE
|
||||
spider_steps_taken = 0
|
||||
return
|
||||
|
||||
@@ -250,7 +250,7 @@
|
||||
spawn(0)
|
||||
try_open_airlock(A)
|
||||
for(var/obj/machinery/door/firedoor/F in view(1, src))
|
||||
if(tgt_dir == get_dir(src,F) && F.density && !F.welded)
|
||||
if(tgt_dir == get_dir(src, F) && F.density && !F.welded)
|
||||
visible_message("<span class='danger'>[src] pries open the firedoor!</span>")
|
||||
F.open()
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
if(entry_vent)
|
||||
if(get_dist(src, entry_vent) <= 2)
|
||||
if(ai_ventbreaker && entry_vent.welded)
|
||||
entry_vent.welded = 0
|
||||
entry_vent.welded = FALSE
|
||||
entry_vent.update_icon()
|
||||
entry_vent.visible_message("<span class='danger'>[src] smashes the welded cover off [entry_vent]!</span>")
|
||||
var/list/vents = list()
|
||||
@@ -297,7 +297,7 @@
|
||||
entry_vent = null
|
||||
return
|
||||
if(ai_ventbreaker && exit_vent.welded)
|
||||
exit_vent.welded = 0
|
||||
exit_vent.welded = FALSE
|
||||
exit_vent.update_icon()
|
||||
exit_vent.update_pipe_image()
|
||||
exit_vent.visible_message("<span class='danger'>[src] smashes the welded cover off [exit_vent]!</span>")
|
||||
@@ -315,7 +315,7 @@
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListValidTurfs()
|
||||
var/list/potentials = list()
|
||||
for(var/turf/simulated/T in oview(3,get_turf(src)))
|
||||
if(T.density == 0 && get_dist(get_turf(src),T) == 3)
|
||||
if(!T.density && get_dist(get_turf(src), T) == 3)
|
||||
var/obj/structure/spider/terrorweb/W = locate() in T
|
||||
if(!W)
|
||||
var/obj/structure/grille/G = locate() in T
|
||||
@@ -328,7 +328,7 @@
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListWebbedTurfs()
|
||||
var/list/webbed = list()
|
||||
for(var/turf/simulated/T in oview(3,get_turf(src)))
|
||||
if(T.density == 0 && get_dist(get_turf(src),T) == 3)
|
||||
if(!T.density && get_dist(get_turf(src), T) == 3)
|
||||
var/obj/structure/spider/terrorweb/W = locate() in T
|
||||
if(W)
|
||||
webbed += T
|
||||
@@ -337,7 +337,7 @@
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListVisibleTurfs()
|
||||
var/list/vturfs = list()
|
||||
for(var/turf/simulated/T in oview(7,get_turf(src)))
|
||||
if(T.density == 0)
|
||||
if(!T.density)
|
||||
vturfs += T
|
||||
return vturfs
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list)
|
||||
var/freq_ventcrawl_combat = 1800 // 3 minutes
|
||||
var/freq_ventcrawl_idle = 9000 // 15 minutes
|
||||
var/last_ventcrawl_time = -9000 // Last time the spider crawled. Used to prevent excessive crawling. Setting to freq*-1 ensures they can crawl once on spawn.
|
||||
var/ai_ventbreaker = 0
|
||||
var/ai_ventbreaker = FALSE
|
||||
|
||||
// AI movement tracking
|
||||
var/spider_steps_taken = 0 // leave at 0, its a counter for ai steps taken.
|
||||
@@ -119,11 +119,11 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list)
|
||||
|
||||
var/spider_opens_doors = 1 // all spiders can open firedoors (they have no security). 1 = can open depowered doors. 2 = can open powered doors
|
||||
faction = list("terrorspiders")
|
||||
var/spider_awaymission = 0 // if 1, limits certain behavior in away missions
|
||||
var/spider_uo71 = 0 // if 1, spider is in the UO71 away mission
|
||||
var/spider_awaymission = FALSE // if TRUE, limits certain behavior in away missions
|
||||
var/spider_uo71 = FALSE // if TRUE, spider is in the UO71 away mission
|
||||
var/spider_unlock_id_tag = "" // if defined, unlock awaymission blast doors with this tag on death
|
||||
var/spider_role_summary = "UNDEFINED"
|
||||
var/spider_placed = 0
|
||||
var/spider_placed = FALSE
|
||||
|
||||
// AI variables designed for use in procs
|
||||
var/atom/movable/cocoon_target // for queen and nurse
|
||||
@@ -131,15 +131,15 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list)
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent // remote vent they intend to come out of
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens
|
||||
var/fed = 0
|
||||
var/travelling_in_vent = 0
|
||||
var/travelling_in_vent = FALSE
|
||||
var/list/enemies = list()
|
||||
var/path_to_vent = 0
|
||||
var/path_to_vent = FALSE
|
||||
var/killcount = 0
|
||||
var/busy = 0 // leave this alone!
|
||||
var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen
|
||||
/// Does this terror speak loudly on the terror hivemind?
|
||||
var/loudspeaker = FALSE
|
||||
var/hasdied = 0
|
||||
var/hasdied = FALSE
|
||||
var/list/spider_special_drops = list()
|
||||
var/attackstep = 0
|
||||
var/attackcycles = 0
|
||||
@@ -282,16 +282,16 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list)
|
||||
real_name = name
|
||||
msg_terrorspiders("[src] has grown in [get_area(src)].")
|
||||
if(is_away_level(z))
|
||||
spider_awaymission = 1
|
||||
spider_awaymission = TRUE
|
||||
GLOB.ts_count_alive_awaymission++
|
||||
if(spider_tier >= 3)
|
||||
ai_ventcrawls = FALSE // means that pre-spawned bosses on away maps won't ventcrawl. Necessary to keep prince/mother in one place.
|
||||
if(istype(get_area(src), /area/awaymission/UO71)) // if we are playing the away mission with our special spiders...
|
||||
spider_uo71 = 1
|
||||
spider_uo71 = TRUE
|
||||
if(world.time < 600)
|
||||
// these are static spiders, specifically for the UO71 away mission, make them stay in place
|
||||
ai_ventcrawls = FALSE
|
||||
spider_placed = 1
|
||||
spider_placed = TRUE
|
||||
else
|
||||
GLOB.ts_count_alive_station++
|
||||
// after 3 seconds, assuming nobody took control of it yet, offer it to ghosts.
|
||||
@@ -344,7 +344,7 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/proc/handle_dying()
|
||||
if(!hasdied)
|
||||
hasdied = 1
|
||||
hasdied = TRUE
|
||||
GLOB.ts_count_dead++
|
||||
GLOB.ts_death_last = world.time
|
||||
if(spider_awaymission)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/white/LoseTarget()
|
||||
stop_automated_movement = 0
|
||||
stop_automated_movement = FALSE
|
||||
attackstep = 0
|
||||
attackcycles = 0
|
||||
..()
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
loot = list(/obj/item/stack/sheet/wood)
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
deathmessage = "is hacked into pieces!"
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/AttackingTarget()
|
||||
. = ..()
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
layer = MOB_LAYER + 0.9
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 25
|
||||
@@ -69,7 +69,7 @@
|
||||
var/grasp_chance = 20
|
||||
var/grasp_pull_chance = 85
|
||||
var/grasp_range = 4
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
|
||||
if(..())
|
||||
|
||||
@@ -42,13 +42,13 @@
|
||||
if(prob(20)) //chance to become a stationary snowman structure instead of a corpse
|
||||
loot.Add(/obj/structure/snowman)
|
||||
deathmessage = "shimmers as its animating magic fades away!"
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/winter/snowman/ranged
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/snowball
|
||||
@@ -105,7 +105,7 @@
|
||||
death_message = "<span class='danger'>YOU'VE BEEN VERY NAUGHTY! PREPARE TO DIE!</span>"
|
||||
maxHealth = 200 //DID YOU REALLY BELIEVE IT WOULD BE THIS EASY!??!!
|
||||
health = 200
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
projectiletype = /obj/item/projectile/ornament
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
@@ -116,7 +116,7 @@
|
||||
death_message = "<span class='danger'>FACE MY FINAL FORM AND KNOW DESPAIR!</span>"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
rapid = 3
|
||||
speed = 0 //he's lost some weight from the fighting
|
||||
projectiletype = /obj/item/projectile/ornament
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
health = clamp(health, 0, maxHealth)
|
||||
med_hud_set_health()
|
||||
|
||||
/mob/living/simple_animal/lay_down()
|
||||
/mob/living/simple_animal/on_lying_down(new_lying_angle)
|
||||
..()
|
||||
if(icon_resting && stat != DEAD)
|
||||
icon_state = icon_resting
|
||||
@@ -173,7 +173,7 @@
|
||||
regenerate_icons()
|
||||
ADD_TRAIT(src, TRAIT_IMMOBILIZED, LYING_DOWN_TRAIT) //simple mobs cannot crawl
|
||||
|
||||
/mob/living/simple_animal/stand_up()
|
||||
/mob/living/simple_animal/on_standing_up()
|
||||
..()
|
||||
if(icon_resting && stat != DEAD)
|
||||
icon_state = icon_living
|
||||
|
||||
@@ -923,7 +923,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
if(L.mob_size <= MOB_SIZE_SMALL)
|
||||
return // Stops pAI drones and small mobs (borers, parrots, crabs) from stripping people. --DZD
|
||||
return // Stops pAI drones and small mobs (parrots, crabs) from stripping people. --DZD
|
||||
if(!M.can_strip)
|
||||
return
|
||||
if(usr == src)
|
||||
|
||||
@@ -85,3 +85,7 @@
|
||||
name = "Raine"
|
||||
icon_state = "raine"
|
||||
gender = FEMALE
|
||||
|
||||
/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jeremy
|
||||
name = "Jeremy"
|
||||
icon_state = "jeremy"
|
||||
|
||||
Reference in New Issue
Block a user