mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-24 13:47:33 +01:00
Anomalous Valley Of Tyr (#9039)
Co-authored-by: Kashargul <KashL@t-online.de> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
co-authored by
Kashargul
Kashargul
parent
ee20b5cb1b
commit
9200a2ee9b
@@ -0,0 +1,326 @@
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants
|
||||
name = "metal ant"
|
||||
desc = "A large ant."
|
||||
icon_state = "normal_ant"
|
||||
icon_dead = "dead_ant"
|
||||
maxHealth = 25 //two hits with agate sword, three with spear, one with hammer, four with bow
|
||||
health = 25
|
||||
pass_flags = PASSTABLE
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
see_in_dark = 12
|
||||
melee_damage_lower = 8 //12.5 hits unarmored. 15.625 with the tribal armor
|
||||
melee_damage_upper = 8 //Rng numbers are wierd
|
||||
attack_sharp = TRUE
|
||||
attack_edge = 1
|
||||
|
||||
meat_amount = 3
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/ant
|
||||
|
||||
tame_items = list(/obj/item/reagent_containers/food/snacks/crabmeat = 20)
|
||||
|
||||
faction = FACTION_TYR_ANT
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/steel = 6\
|
||||
)
|
||||
|
||||
//I know very little of this
|
||||
swallowTime = 3 SECONDS
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_bump_chance = 10
|
||||
vore_stomach_name = "Stomach"
|
||||
vore_default_item_mode = IM_DIGEST
|
||||
vore_pounce_chance = 50
|
||||
vore_pounce_cooldown = 10
|
||||
vore_pounce_successrate = 75
|
||||
vore_pounce_falloff = 0
|
||||
vore_pounce_maxhealth = 100
|
||||
vore_standing_too = TRUE
|
||||
unacidable = TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/init_vore()
|
||||
if(!voremob_loaded) //CHOMPAdd
|
||||
return //CHOMPAdd
|
||||
.=..() //CHOMPEdit
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "stomach"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
|
||||
B.digest_brute = 0
|
||||
B.digest_burn = 3
|
||||
B.digestchance = 0
|
||||
B.absorbchance = 0
|
||||
B.escapechance = 25
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/bronze
|
||||
icon_state = "bronze_ant"
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/bronze = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/copper
|
||||
icon_state = "copper_ant"
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/copper = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/agate
|
||||
icon_state = "agate_ant"
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/weathered_agate = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/quartz
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/quartz = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/painite
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/painite = 6\
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/concrete = 6\
|
||||
)
|
||||
nutrition = 150
|
||||
var/build_type = /obj/random/ant_building
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder/handle_special()
|
||||
set waitfor = FALSE
|
||||
if(get_AI_stance() == STANCE_IDLE && !is_AI_busy() && isturf(loc))
|
||||
build_tile(loc)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder/proc/build_tile(turf/T)
|
||||
if(nutrition < 75)
|
||||
return FALSE
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
var/obj/effect/ant_structure/W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Already got webs here.
|
||||
|
||||
visible_message(span_notice("\The [src] begins to secrete a sticky substance."))
|
||||
// Get our AI to stay still.
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
if(!do_mob(src, T, 5 SECONDS))
|
||||
set_AI_busy(FALSE)
|
||||
to_chat(src, span_warning("You need to stay still to spin a web on \the [T]."))
|
||||
return FALSE
|
||||
|
||||
W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Spamclick protection.
|
||||
|
||||
adjust_nutrition(-30)
|
||||
set_AI_busy(FALSE)
|
||||
new build_type(T)
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/queen //There will only be two queens on the map, and the source of further ants. Farming dies if they die.
|
||||
name = "queen ant"
|
||||
icon_state = "queen_ant"
|
||||
maxHealth = 60 //four hits with agate sword, five with spear, two with hammer, eight with bow
|
||||
health = 60
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/valhollide = 4\
|
||||
)
|
||||
nutrition = 480
|
||||
var/build_type = /obj/effect/spider/spiderling/antling
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/queen/handle_special()
|
||||
set waitfor = FALSE
|
||||
if(get_AI_stance() == STANCE_IDLE && !is_AI_busy() && isturf(loc))
|
||||
build_tile(loc)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/queen/proc/build_tile(turf/T)
|
||||
if(nutrition < 30)
|
||||
return FALSE
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
var/obj/effect/ant_structure/W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Already got webs here.
|
||||
|
||||
visible_message(span_notice("\The [src] begins to secrete a sticky substance."))
|
||||
// Get our AI to stay still.
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
if(!do_mob(src, T, 5 SECONDS))
|
||||
set_AI_busy(FALSE)
|
||||
to_chat(src, span_warning("You need to stay still to spin a web on \the [T]."))
|
||||
return FALSE
|
||||
|
||||
W = locate() in T
|
||||
if(W)
|
||||
return FALSE // Spamclick protection.
|
||||
|
||||
adjust_nutrition(-75)
|
||||
set_AI_busy(FALSE)
|
||||
new build_type(T)
|
||||
return TRUE
|
||||
|
||||
/*
|
||||
ANT STRUCTURES
|
||||
*/
|
||||
|
||||
/obj/structure/mob_spawner/ant_hill
|
||||
name = "ant hole"
|
||||
desc = "An entrance to the nest of metallic ants."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "hole"
|
||||
anchored = TRUE
|
||||
|
||||
spawn_delay = 10 MINUTES
|
||||
|
||||
spawn_types = list(
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/bronze = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/copper = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/agate = 3,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/quartz = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/painite = 1,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder = 1
|
||||
)
|
||||
|
||||
simultaneous_spawns = 5
|
||||
|
||||
destructible = 1
|
||||
health = 50 //Unsure why you would want to break it but you can
|
||||
|
||||
|
||||
/obj/effect/ant_structure
|
||||
name = "organic structure"
|
||||
desc = "A creation of metal ants."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "hole"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
var/health = 15 //1 thwack with sword, 2 with spear
|
||||
|
||||
/obj/effect/ant_structure/attackby(var/obj/item/W, var/mob/user)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
|
||||
if(LAZYLEN(W.attack_verb))
|
||||
visible_message(span_warning("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]"))
|
||||
else
|
||||
visible_message(span_warning("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]"))
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
if(W.has_tool_quality(TOOL_WELDER))
|
||||
var/obj/item/weldingtool/WT = W.get_welder()
|
||||
|
||||
if(WT.remove_fuel(0, user))
|
||||
damage = 15
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/effect/ant_structure/bullet_act(var/obj/item/projectile/Proj)
|
||||
..()
|
||||
health -= Proj.get_structure_damage()
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/ant_structure/proc/die()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/ant_structure/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
die()
|
||||
/obj/effect/ant_structure/trap
|
||||
name = "spore trap"
|
||||
var/modifiertype = /datum/modifier/berserk
|
||||
|
||||
/obj/effect/ant_structure/trap/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(anchored && isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L == /mob/living/simple_mob/animal/tyr/mineral_ants)
|
||||
return
|
||||
else if(L.m_intent == "run")
|
||||
L.visible_message(
|
||||
span_danger("[L] steps in \the [src]."),
|
||||
span_danger("You step in \the [src]!"),
|
||||
"<b>You hear a strange rustling!</b>"
|
||||
)
|
||||
attack_mob(L)
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
/obj/effect/ant_structure/trap/proc/attack_mob(mob/living/L)
|
||||
L.add_modifier(modifiertype, 5 SECONDS)
|
||||
|
||||
/obj/effect/ant_structure/trap/knockdown
|
||||
icon_state = "knock_trap"
|
||||
modifiertype = /datum/modifier/poisoned
|
||||
|
||||
/obj/effect/ant_structure/trap/burn
|
||||
icon_state = "burn_trap"
|
||||
modifiertype = /datum/modifier/fire/weak
|
||||
|
||||
/obj/effect/ant_structure/trap/slowdown
|
||||
icon_state = "slow_trap"
|
||||
modifiertype = /datum/modifier/chilled
|
||||
|
||||
/obj/effect/ant_structure/wall
|
||||
name = "Metant wall"
|
||||
icon_state = "wall"
|
||||
density = TRUE
|
||||
health = 25 //two hits with sword.
|
||||
|
||||
/obj/random/ant_building
|
||||
name = "ant stucture"
|
||||
desc = "This is a metant build"
|
||||
icon_state = "tool"
|
||||
|
||||
/obj/random/ant_building/item_to_spawn()
|
||||
return pick(/obj/effect/ant_structure/wall,
|
||||
/obj/effect/ant_structure/trap/burn,
|
||||
/obj/effect/ant_structure/trap/knockdown,
|
||||
/obj/effect/ant_structure/trap/slowdown)
|
||||
|
||||
|
||||
/obj/effect/spider/spiderling/antling
|
||||
name = "antling"
|
||||
desc = "A tiny ant."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "antling"
|
||||
anchored = FALSE
|
||||
layer = HIDING_LAYER
|
||||
health = 3
|
||||
grow_as = list(/mob/living/simple_mob/animal/tyr/mineral_ants,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/bronze,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/copper,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/agate,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/quartz,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/painite,
|
||||
/mob/living/simple_mob/animal/tyr/mineral_ants/builder)
|
||||
faction = FACTION_TYR
|
||||
|
||||
/obj/effect/ant_structure/webbarrier
|
||||
name = "weblike barrier"
|
||||
icon_state = "web"
|
||||
|
||||
/obj/effect/ant_structure/webbarrier/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /mob/living/simple_mob/animal/giant_spider))
|
||||
return TRUE
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(80))
|
||||
to_chat(mover, span_warning("You get stuck in \the [src] for a moment."))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
return TRUE
|
||||
@@ -0,0 +1,182 @@
|
||||
/mob/living/simple_mob/animal/tyr/rainbow_fly
|
||||
name = "chromatic fly"
|
||||
desc = "A strange insect."
|
||||
icon_state = "firefly"
|
||||
icon_dead = "firefly_dead"
|
||||
maxHealth = 10 //Not sure why you're fighting this, but any agate weapon one shots it. Except bow.
|
||||
health = 10
|
||||
pass_flags = PASSTABLE
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive
|
||||
|
||||
glow_color = "#FF3300"
|
||||
light_color = "#FF3300"
|
||||
glow_range = 4
|
||||
glow_intensity = 4
|
||||
|
||||
melee_damage_lower = 5 //I guess it could theortically kill you dirrectly
|
||||
melee_damage_upper = 5
|
||||
|
||||
hovering = TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/rainbow_fly/handle_special()
|
||||
if(stat != DEAD)
|
||||
painbow_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/rainbow_fly/proc/painbow_aura()
|
||||
for(var/mob/living/L in view(src, 4))
|
||||
L.druggy = max(L.druggy, 10)
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/groundpitcher
|
||||
name = "underground pitcher"
|
||||
desc = "A large insect."
|
||||
icon_state = "groundpitcher"
|
||||
icon_dead = "groundpitcher"
|
||||
maxHealth = 20 //two hits with sword and spear..
|
||||
health = 20
|
||||
pass_flags = PASSTABLE //This was from me copy and pasting but...it's an unmoving plant. Kind of want to keep it here.
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher
|
||||
|
||||
melee_damage_lower = 0 //This cannot kill you unless you fall into it
|
||||
melee_damage_upper = 0
|
||||
|
||||
meat_type = /obj/item/stack/material/fiber
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/cloth = 1\
|
||||
)
|
||||
|
||||
vore_bump_chance = 100
|
||||
vore_bump_emote = "slurps up" //Not really a good way to make the grammar work with a passive vore plant.
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_pounce_chance = 0 //Plants only eat people who stumble into them.
|
||||
swallowTime = 3 //3 deciseconds. This is intended to be nearly instant, e.g. victim trips and falls in.
|
||||
vore_ignores_undigestable = 0
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
//This is legit pitcher plant bellies with slightly altered bits.
|
||||
/mob/living/simple_mob/animal/tyr/groundpitcher/init_vore()
|
||||
if(!voremob_loaded)
|
||||
return
|
||||
.=..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.desc = "You leaned a little too close to the pitcher plant, stumbling over the lip and splashing into a puddle of liquid filling the bottom of the cramped pitcher. You squirm madly, righting yourself and scrabbling at the walls in vain as the slick surface offers no purchase. The dim light grows dark as the pitcher's cap lowers, silently sealing the exit. With a sinking feeling you realize you won't be able to push the exit open even if you could somehow climb that high, leaving you helplessly trapped in the slick, tingling fluid."
|
||||
B.digest_burn = 0.5
|
||||
B.digest_brute = 0
|
||||
B.vore_verb = "trip"
|
||||
B.name = "pitcher"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY
|
||||
B.wet_loop = 0 //As nice as the fancy internal sounds are this is a plant.
|
||||
B.digestchance = 20
|
||||
B.escapechance = 20
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Squish2"
|
||||
B.release_sound = "Pred Escape"
|
||||
B.contamination_color = "purple"
|
||||
B.contamination_flavor = "Wet"
|
||||
//Why is it we have all these customizeable belly options which nobody ever alters for mobs?
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Slick fluid trickles over you, carrying threads of sweetness.",
|
||||
"Everything is still, dark, and quiet. Your breaths echo quietly.",
|
||||
"The surrounding air feels thick and humid.")
|
||||
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"The slimy puddle stings faintly. It seems the plant has no need to quickly break down victims.",
|
||||
"The humid air settles in your lungs, keeping each breath more labored than the last.",
|
||||
"Fluid drips onto you, burning faintly as your body heat warms it."
|
||||
)
|
||||
|
||||
B.emote_lists[DM_DRAIN] = list(
|
||||
"Each bead of slick fluid running down your body leaves you feeling weaker.",
|
||||
"It's cramped and dark, the air thick and heavy. Your limbs feel like lead.",
|
||||
"Strength drains from your frame. The cramped chamber feels easier to settle into with each passing moment.")
|
||||
|
||||
//Preadtory Things
|
||||
/obj/structure/mob_spawner/beetle_hill
|
||||
name = "beetle tunnel"
|
||||
desc = "An entrance to the nest of metallic ants."
|
||||
icon = 'modular_chomp/icons/obj/tribal_gear.dmi'
|
||||
icon_state = "hole"
|
||||
anchored = TRUE
|
||||
|
||||
spawn_delay = 10 MINUTES
|
||||
|
||||
spawn_types = list(
|
||||
/mob/living/simple_mob/animal/tyr/electronic_beetle = 1,
|
||||
/mob/living/simple_mob/animal/tyr/explode_beetle = 1,
|
||||
)
|
||||
|
||||
simultaneous_spawns = 2
|
||||
|
||||
destructible = 1
|
||||
health = 50
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/electronic_beetle
|
||||
name = "charged beetle"
|
||||
desc = "A large insect."
|
||||
icon_state = "lighting_beetle"
|
||||
icon_dead = "beetle_dead"
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
pass_flags = PASSTABLE //flying bug
|
||||
movement_cooldown = 1
|
||||
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/meat/grubmeat
|
||||
meat_amount = 2
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/chitin = 1\
|
||||
)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
see_in_dark = 3
|
||||
melee_damage_lower = 12 //Kills you 8ish if unarmored, or 10ish if wearing the tribal armor
|
||||
melee_damage_upper = 12 //Rng numbers are wierd
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/electronic_beetle/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
A.emp_act(4) //The weakest strength of EMP
|
||||
playsound(src, 'sound/weapons/Egloves.ogg', 75, 1)
|
||||
L.Weaken(4)
|
||||
L.Stun(4)
|
||||
L.stuttering = max(L.stuttering, 4)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, L)
|
||||
s.start()
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/explode_beetle
|
||||
name = "fiery beetle"
|
||||
desc = "A large insect."
|
||||
icon_state = "fire_beetle"
|
||||
icon_dead = "beetle_dead"
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
pass_flags = PASSTABLE //flying bug
|
||||
movement_cooldown = 1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/carpmeat
|
||||
meat_amount = 2
|
||||
|
||||
butchery_loot = list(\
|
||||
/obj/item/stack/material/chitin = 1\
|
||||
)
|
||||
|
||||
see_in_dark = 3
|
||||
melee_damage_lower = 6 //Kills you 8ish if unarmored, or 10ish if wearing the tribal armor
|
||||
melee_damage_upper = 6 //Rng numbers are wierd
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/explode_beetle/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/fire, 3 SECONDS)
|
||||
@@ -0,0 +1,42 @@
|
||||
/mob/living/simple_mob/animal/tyr
|
||||
minbodytemp = 175
|
||||
maxbodytemp = 500
|
||||
cold_resist = -0.5
|
||||
heat_resist = 0.75
|
||||
|
||||
see_in_dark = 3 //stealth time?
|
||||
|
||||
icon = 'modular_chomp/icons/mob/tyr.dmi'
|
||||
|
||||
faction = FACTION_TYR
|
||||
|
||||
can_be_drop_prey = FALSE
|
||||
can_be_drop_pred = TRUE
|
||||
|
||||
//I know very little of this and yes, I copy and pasted from ants
|
||||
swallowTime = 3 SECONDS
|
||||
vore_active = 1
|
||||
vore_capacity = 1
|
||||
vore_bump_chance = 10
|
||||
vore_stomach_name = "Stomach"
|
||||
vore_default_item_mode = IM_DIGEST
|
||||
vore_pounce_chance = 50
|
||||
vore_pounce_cooldown = 10
|
||||
vore_pounce_successrate = 75
|
||||
vore_pounce_falloff = 0
|
||||
vore_pounce_maxhealth = 100
|
||||
vore_standing_too = TRUE
|
||||
unacidable = TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/tyr/init_vore()
|
||||
if(!voremob_loaded) //CHOMPAdd
|
||||
return //CHOMPAdd
|
||||
.=..() //CHOMPEdit
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "stomach"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
|
||||
B.digest_brute = 1
|
||||
B.digest_burn = 1
|
||||
B.digestchance = 0
|
||||
B.absorbchance = 0
|
||||
B.escapechance = 25
|
||||
+270
-119
@@ -14,7 +14,7 @@
|
||||
icon_gib = "syndicate_gib"
|
||||
taser_kill = 0
|
||||
|
||||
faction = "eclipse"
|
||||
faction = FACTION_ECLIPSE
|
||||
movement_cooldown = 0
|
||||
|
||||
status_flags = 0
|
||||
@@ -108,8 +108,8 @@
|
||||
name = "Solar Eclipse Initiate"
|
||||
desc = "You shouldn't be seeing this. But don't use lasers or energy weapons"
|
||||
|
||||
armor = list(melee = -50, bullet = -50, laser = 0, energy = 0, bomb = 50, bio = 100, rad = 100) //Solar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 0, bullet = 0, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
armor = list(melee = -100, bullet = -100, laser = 30, energy = 30, bomb = 50, bio = 100, rad = 100) //Solar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 0, bullet = 0, laser = 18, energy = 18, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/bullet_act(obj/item/projectile/P)
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
@@ -231,7 +231,7 @@
|
||||
try_reload()
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'><b>\The [src]</b> fires at \the [orig_targ]!</span>")
|
||||
visible_message(span_danger("<b>\The [src]</b> fires at \the [orig_targ]!"))
|
||||
shoot(A)
|
||||
if(casingtype)
|
||||
new casingtype(loc)
|
||||
@@ -279,8 +279,8 @@
|
||||
name = "Lunar Eclipse Initiate"
|
||||
desc = "You shouldn't be seeing this, but don't use melee weapons or bullets."
|
||||
|
||||
armor = list(melee = 0, bullet = 0, laser = -50, energy = -50, bomb = 50, bio = 100, rad = 100) //Lunar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 10, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //15 because every melee weapon has dumb amount of AP
|
||||
armor = list(melee = 30, bullet = 30, laser = -100, energy = -100, bomb = 50, bio = 100, rad = 100) //Lunar members are nigh immune to burns.
|
||||
armor_soak = list(melee = 18, bullet = 18, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //15 because every melee weapon has dumb amount of AP
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/bullet_act(obj/item/projectile/P)
|
||||
if(istype(P, /obj/item/projectile/bullet))
|
||||
@@ -290,58 +290,14 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
to_chat(user, "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
|
||||
to_chat(user, span_warning("This weapon is ineffective, it does no damage."))
|
||||
.=..()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle //Bouncing bullet extreme
|
||||
name = "Lunar Eclipse Silver Serpent"
|
||||
desc = "A hungry looking naga, their strange armor protecting them from ballistics and physical weaponry."
|
||||
health = 100 //Old 40
|
||||
maxHealth = 100
|
||||
reload_max = 6
|
||||
movement_cooldown = 1
|
||||
|
||||
icon_state = "eclipse_silver"
|
||||
icon_living = "eclipse_silver"
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/eclipse
|
||||
|
||||
var/grenade_type = /obj/item/grenade/chem_grenade/teargas
|
||||
var/grenade_timer = 20
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle/should_special_attack(atom/A)
|
||||
var/mob_count = 0 // Are there enough mobs to consider grenading?
|
||||
var/turf/T = get_turf(A)
|
||||
for(var/mob/M in range(T, 2))
|
||||
if(M.faction == faction) // Don't grenade our friends
|
||||
return FALSE
|
||||
if(M in oview(src, special_attack_max_range)) // And lets check if we can actually see at least two people before we throw a grenade
|
||||
if(!M.stat) // Dead things don't warrant a grenade
|
||||
mob_count ++
|
||||
if(mob_count < 2)
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
// Yes? Throw the grenade
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle/do_special_attack(atom/A)
|
||||
set waitfor = FALSE
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
var/obj/item/grenade/G = new grenade_type(get_turf(src))
|
||||
if(istype(G))
|
||||
G.throw_at(A, G.throw_range, G.throw_speed, src)
|
||||
G.det_time = grenade_timer //CHOMPEdit
|
||||
G.activate(src) //CHOMPEdit
|
||||
special_attack_charges = max(special_attack_charges-1, 0)
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/shotgunner //wuff with shotgun
|
||||
name = "Lunar Eclipse Shotgunner"
|
||||
desc = "A Vulpkanin or the like in a red-purple flashing rigsuit, it defending them from physical damage of close and long ranges."
|
||||
health = 75 //old 40
|
||||
maxHealth = 75
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
reload_max = 1
|
||||
|
||||
icon_state = "eclipse_shotwuff"
|
||||
@@ -377,7 +333,7 @@
|
||||
try_reload()
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'><b>\The [src]</b> fires at \the [orig_targ]!</span>")
|
||||
visible_message(span_danger("<b>\The [src]</b> fires at \the [orig_targ]!"))
|
||||
shoot(A)
|
||||
if(casingtype)
|
||||
new casingtype(loc)
|
||||
@@ -533,7 +489,7 @@
|
||||
// Does actual poison injection, after all checks passed.
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/hellhound/proc/inject_poison(mob/living/L, target_zone)
|
||||
if(prob(poison_chance))
|
||||
to_chat(L, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
to_chat(L, span_warning("You feel a tiny prick."))
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/ravanger/apply_melee_effects(var/atom/A)
|
||||
@@ -547,7 +503,7 @@
|
||||
// Does actual poison injection, after all checks passed.
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/ravanger/proc/inject_poison(mob/living/L, target_zone)
|
||||
if(prob(poison_chance))
|
||||
to_chat(L, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
to_chat(L, span_warning("You feel a tiny prick."))
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
|
||||
@@ -606,7 +562,7 @@
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, L)
|
||||
s.start()
|
||||
visible_message("<span class='danger'>The pummler releases a powerful shock!</span>")
|
||||
visible_message(span_danger("The pummler releases a powerful shock!"))
|
||||
else
|
||||
return
|
||||
|
||||
@@ -690,7 +646,7 @@
|
||||
try_reload()
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='danger'><b>\The [src]</b> fires at \the [orig_targ]!</span>")
|
||||
visible_message(span_danger("<b>\The [src]</b> fires at \the [orig_targ]!"))
|
||||
shoot(A)
|
||||
if(casingtype)
|
||||
new casingtype(loc)
|
||||
@@ -726,67 +682,6 @@
|
||||
maxHealth = 1
|
||||
faction = "eclipse"
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker //teleporting stalker
|
||||
name = "Solar Eclipse Froststalker"
|
||||
health = 30
|
||||
maxHealth = 30
|
||||
desc = "A somewhat see through being wearing a burn resistaint coat."
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
attack_armor_pen = 30
|
||||
special_attack_cooldown = 25 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
projectiletype = null
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
icon_state = "froststalker"
|
||||
icon_living = "froststalker"
|
||||
cold_resist = 1.0
|
||||
melee_attack_delay = 2.5
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker/do_special_attack(atom/A)
|
||||
// Teleport attack.
|
||||
if(!A)
|
||||
to_chat(src, span_warning("There's nothing to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/list/nearby_things = range(1, A)
|
||||
var/list/valid_turfs = list()
|
||||
|
||||
// All this work to just go to a non-dense tile.
|
||||
for(var/turf/potential_turf in nearby_things)
|
||||
var/valid_turf = TRUE
|
||||
if(potential_turf.density)
|
||||
continue
|
||||
for(var/atom/movable/AM in potential_turf)
|
||||
if(AM.density)
|
||||
valid_turf = FALSE
|
||||
if(valid_turf)
|
||||
valid_turfs.Add(potential_turf)
|
||||
|
||||
if(!(valid_turfs.len))
|
||||
to_chat(src, span_warning("There wasn't an unoccupied spot to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/turf/target_turf = pick(valid_turfs)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/smoke_spread/frost
|
||||
s1.set_up(5, 1, T)
|
||||
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_spread
|
||||
s2.set_up(5, 1, target_turf)
|
||||
|
||||
|
||||
T.visible_message(span_notice("\The [src] vanishes!"))
|
||||
s1.start()
|
||||
|
||||
forceMove(target_turf)
|
||||
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
|
||||
to_chat(src, span_notice("You teleport to \the [target_turf]."))
|
||||
|
||||
target_turf.visible_message(span_warning("\The [src] appears!"))
|
||||
s2.start()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/cryomancer //Freezing slowdown unit
|
||||
name = "Solar Eclipse Cryomancer"
|
||||
desc = "A being wearing ice and burn resistaint armor."
|
||||
@@ -889,3 +784,259 @@
|
||||
dying_threshold = 0.3 // How low on health the holder needs to be before fleeing. Defaults to 30% or lower health.
|
||||
flee_when_outmatched = TRUE // If they should flee upon reaching a specific tension threshold.
|
||||
outmatched_threshold = 300
|
||||
|
||||
//Some new eclipse folks for tyr, although one is a rework of the exsisting naga
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/disablernoodle //If you have a Nif, or are a borg you get hit with confusion and adds Edit, can't currently figure out NIF targeting
|
||||
name = "Solar Eclipse Disabler Serpent"
|
||||
desc = "A naga cladded in strange orange armor, seemingly guarded from lasers and energy based weaponry."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
icon_state = "eclipse_disabler"
|
||||
icon_living = "eclipse_disabler"
|
||||
reload_max = 5
|
||||
movement_cooldown = 1
|
||||
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
projectiletype = /obj/item/projectile/energy/electrode
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/disablernoodle/do_special_attack(atom/A)
|
||||
visible_message(span_critical("\The [src] pulls out a flash!"))
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(C.stat != DEAD)
|
||||
var/safety = C.eyecheck()
|
||||
if(safety <= 0)
|
||||
var/flash_strength = 8
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
flash_strength *= H.species.flash_mod
|
||||
if(flash_strength > 0)
|
||||
to_chat(H, span_critical("You are disoriented by \the [src]!"))
|
||||
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
||||
H.flash_eyes()
|
||||
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0, "Photon burns")
|
||||
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
var/flashfail = FALSE
|
||||
var/mob/living/silicon/robot/R = L
|
||||
if(!flashfail)
|
||||
to_chat(R, span_critical("Your optics are scrambled by \the [src]!"))
|
||||
R.Confuse(10)
|
||||
R.flash_eyes()
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/silvernoodle //Bouncing bullet extreme
|
||||
name = "Lunar Eclipse Silver Serpent"
|
||||
desc = "A hungry looking naga, their strange armor protecting them from ballistics and physical weaponry."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
reload_max = 6
|
||||
movement_cooldown = 1
|
||||
|
||||
icon_state = "eclipse_silver"
|
||||
icon_living = "eclipse_silver"
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/disablernoodle/do_special_attack(atom/A) //I am bringing back the netgun attack. 4 seconds
|
||||
visible_message(span_warning("\The [src] begins to create an energy net!"))
|
||||
Beam(A, icon_state = "sat_beam", time = 3 SECONDS, maxdistance = INFINITY)
|
||||
sleep(40)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/energy_net(get_turf(src))
|
||||
P.launch_projectile(A, BP_TORSO, src)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/plant
|
||||
name = "Solar Eclipse Bioexpirment"
|
||||
desc = "A strange armored looking plant."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
reload_max = 6
|
||||
movement_cooldown = 1
|
||||
|
||||
icon_state = "eclipse_plant"
|
||||
icon_living = "eclipse_plant"
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/thorn
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/plant/do_special_attack(atom/A)
|
||||
var/mob/living/carbon/human/H = A
|
||||
var/obj/item/I = H.get_active_hand()
|
||||
H.drop_item()
|
||||
if(I)
|
||||
I.throw_at(src, 2, 4) // Just yoinked.
|
||||
src.visible_message(span_danger("The [name] heaves, pulling \the [A]'s weapon from their hands!"))
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/experimenter
|
||||
name = "Lunar Eclipse Experimenter"
|
||||
desc = "A lizard cladded in strange red-purple armor, seemingly guarded from lasers and energy based weaponry."
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
icon_state = "eclipse_gravliz"
|
||||
icon_living = "eclipse_gravliz"
|
||||
reload_max = 1
|
||||
movement_cooldown = 1
|
||||
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
|
||||
projectiletype = /obj/item/projectile/energy/spikeenergy_ball //using the weapon found upon tyr
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/experimenter/do_special_attack(atom/A)
|
||||
var/D = src
|
||||
var/mob/living/carbon/human/H = A
|
||||
H.throw_at(D, 2, 4) // Just yoinked.
|
||||
visible_message(span_danger("The [src]'s armor glows silver, pulling [A] closer!"))
|
||||
|
||||
//The Precursor intative big folks
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/titanhunter //lunar melee unit
|
||||
name = "Lunar Eclipse Titan Hunter"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A strange being with resistance to brunt force trauma."
|
||||
icon_state = "eclipse_titan"
|
||||
icon_living = "eclipse_titan"
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
attack_armor_pen = 20
|
||||
projectiletype = null
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/titanhunter/apply_melee_effects(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/deep_wounds, 10 SECONDS)
|
||||
if(L.mob_size <= MOB_MEDIUM)
|
||||
visible_message(span_danger("\The [src] sends \the [L] flying with the impact!"))
|
||||
playsound(src, "punch", 50, 1)
|
||||
L.Weaken(1)
|
||||
var/throwdir = get_dir(src, L)
|
||||
L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
|
||||
else
|
||||
to_chat(L, span_warning("\The [src] hits you with incredible force, but you remain in place."))
|
||||
visible_message(span_danger("\The [src] hits \the [L] with incredible force, to no visible effect!"))
|
||||
playsound(src, "punch", 50, 1)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/nuclear
|
||||
name = "Solar Eclipse Nuclear Technician"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A strange being wearing a burn resistaint coat."
|
||||
icon_state = "eclipse_nuke"
|
||||
projectiletype = /obj/item/projectile/energy/declone
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
|
||||
|
||||
/obj/item/projectile/arc/radioactive/weak
|
||||
rad_power = 25
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/nuclear/do_special_attack(atom/A)
|
||||
visible_message(span_warning("\The [src] begins to glow green!"))
|
||||
Beam(A, icon_state = "sat_beam", time = 3 SECONDS, maxdistance = INFINITY)
|
||||
sleep(30)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/energy_net(get_turf(src))
|
||||
P.launch_projectile(A, BP_TORSO, src)
|
||||
|
||||
//Vistors of the other
|
||||
//One is a familiar shape from Sif, the other is new and anomalous based.
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker //teleporting stalker
|
||||
name = "Solar Eclipse Froststalker"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A somewhat see through being wearing a burn resistaint coat."
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
attack_armor_pen = 40
|
||||
special_attack_cooldown = 25 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
projectiletype = null
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
icon_state = "froststalker"
|
||||
icon_living = "froststalker"
|
||||
cold_resist = 1.0
|
||||
melee_attack_delay = 1.5
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/solar/froststalker/do_special_attack(atom/A)
|
||||
// Teleport attack.
|
||||
if(!A)
|
||||
to_chat(src, span_warning("There's nothing to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/list/nearby_things = range(4, A)
|
||||
var/list/valid_turfs = list()
|
||||
|
||||
// All this work to just go to a non-dense tile.
|
||||
for(var/turf/potential_turf in nearby_things)
|
||||
var/valid_turf = TRUE
|
||||
if(potential_turf.density)
|
||||
continue
|
||||
for(var/atom/movable/AM in potential_turf)
|
||||
if(AM.density)
|
||||
valid_turf = FALSE
|
||||
if(valid_turf)
|
||||
valid_turfs.Add(potential_turf)
|
||||
|
||||
if(!(valid_turfs.len))
|
||||
to_chat(src, span_warning("There wasn't an unoccupied spot to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/turf/target_turf = pick(valid_turfs)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/smoke_spread/frost
|
||||
s1.set_up(5, 1, T)
|
||||
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/smoke_spread
|
||||
s2.set_up(5, 1, target_turf)
|
||||
|
||||
|
||||
T.visible_message(span_warning("\The [src] vanishes!"))
|
||||
s1.start()
|
||||
|
||||
forceMove(target_turf)
|
||||
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
|
||||
to_chat(src, span_notice("You teleport to \the [target_turf]."))
|
||||
|
||||
target_turf.visible_message(span_warning("\The [src] appears!"))
|
||||
s2.start()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/abyssdiver
|
||||
name = "Lunar Eclipse Abyss Diver"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
desc = "A strange being wearing a blunt resistaint coat."
|
||||
projectiletype = /obj/item/projectile/scatter/shotgun
|
||||
icon_state = "eclipse_diver" //note to self try to redo this sprite sometime
|
||||
reload_count = 1
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/lunar/abyssdiver/do_special_attack(atom/A)
|
||||
var/mob/living/L = A
|
||||
visible_message(span_danger("\The [src] begins to mess with a wrist mounted device."))
|
||||
sleep(30)
|
||||
if(isliving(A))
|
||||
if(iscarbon(L))
|
||||
return
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
L.Weaken(10)
|
||||
else if(istype(A, /obj/mecha))
|
||||
var/obj/mecha/M = A
|
||||
visible_message(span_critical("\The [M] is remotly hacked and ejects [M.occupant]!"))
|
||||
M.go_out()
|
||||
|
||||
+192
-1
@@ -194,7 +194,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/swarm/eclipse
|
||||
faction = "eclipse"
|
||||
faction = FACTION_ECLIPSE
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/captain
|
||||
@@ -366,3 +366,194 @@
|
||||
var/turf/T = pick(bomb_range)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
bomb_range -= T
|
||||
|
||||
/mob/living/simple_mob/mechanical/combat_drone/artillery
|
||||
faction = FACTION_ECLIPSE
|
||||
projectiletype = /obj/item/projectile/arc/blue_energy
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead
|
||||
name = "Eclipse Precursor Overseer"
|
||||
icon_state = "overseer"
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
grab_resist = 100
|
||||
var/fullshield = 6
|
||||
var/shieldrage = 6
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/bullet_act(obj/item/projectile/P) //Projectiles will be absorbed by the shield. Note to self do funky sprite. 10 hits to remove
|
||||
if(fullshield > 0)
|
||||
fullshield--
|
||||
if(fullshield > 0)
|
||||
visible_message(span_warning(span_orange("<B>[P] is absorbed by the shield!.</B>")))
|
||||
else
|
||||
visible_message(span_warning(span_orange("<B>[P] breaks the shield!!.</B>")))
|
||||
else
|
||||
..()
|
||||
shieldrage--
|
||||
if(shieldrage == 0)
|
||||
shieldrage = 6
|
||||
fullshield = 6
|
||||
visible_message(span_warning(span_orange("<B>The shield reactivates!!.</B>")))
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/do_special_attack(atom/A)
|
||||
if(vore_fullness > 2) //If they nompf someone already
|
||||
fullsummon(A)
|
||||
var/mob/living/L = A
|
||||
|
||||
if(istype(A, /obj/mecha))//if target is a mecha
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Phase 3
|
||||
mech_three(A)
|
||||
if(I_HURT) // Phase 1
|
||||
mech_one(A)
|
||||
if(I_GRAB) // Phase 2
|
||||
mech_two(A)
|
||||
|
||||
if(!L.devourable || !L.allowmobvore || !L.can_be_drop_prey || !L.throw_vore) //if they aren't edible
|
||||
if(fullshield > 0)
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Phase 3
|
||||
shield_three(A)
|
||||
if(I_HURT) // Phase 1
|
||||
shield_one(A)
|
||||
if(I_GRAB) // Phase 2
|
||||
shield_two(A)
|
||||
else
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Phase 3
|
||||
phase_three(A)
|
||||
if(I_HURT) // Phase 1
|
||||
phase_one(A)
|
||||
if(I_GRAB) // Phase 2
|
||||
phase_two(A)
|
||||
else
|
||||
var/obj/belly/belly_dest
|
||||
L.forceMove(belly_dest)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/fullsummon(atom/target) //Summons a wall whilst the boss tries to enjoy their meal
|
||||
visible_message(span_warning("\The [src] calls in drone support!"))
|
||||
new /mob/living/simple_mob/mechanical/combat_drone/artillery (src.loc)
|
||||
sleep(30)
|
||||
new /mob/living/simple_mob/mechanical/combat_drone/artillery (src.loc)
|
||||
sleep(30)
|
||||
new /mob/living/simple_mob/mechanical/combat_drone/artillery (src.loc)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/mech_two(atom/target) //Forces the mecha user in a strange dance, being forced out, likly dodging one projectile and getting back in
|
||||
var/obj/mecha/M = target
|
||||
visible_message(span_critical("\The [M] is remotly hacked and ejects [M.occupant]!"))
|
||||
M.go_out()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/mech_one(atom/target) //might alter this one to a machine gun esque ion fire
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/ion(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
sleep(5)
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/mech_three(atom/target) //did we ever fix fire bypassing mechas?
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/scatter/flamethrower(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/phase_one(atom/target) //Simply tries to disable you
|
||||
visible_message(span_alien("\The [src] pulls out a flash!"))
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(C.stat != DEAD)
|
||||
var/safety = C.eyecheck()
|
||||
if(safety <= 0)
|
||||
var/flash_strength = 8
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
flash_strength *= H.species.flash_mod
|
||||
if(flash_strength > 0)
|
||||
to_chat(H, span_alien("You are disoriented by \the [src]!"))
|
||||
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
|
||||
H.flash_eyes()
|
||||
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0, "Photon burns")
|
||||
|
||||
else if(issilicon(L))
|
||||
if(isrobot(L))
|
||||
var/flashfail = FALSE
|
||||
var/mob/living/silicon/robot/R = L
|
||||
if(!flashfail)
|
||||
to_chat(R, span_alien("Your optics are scrambled by \the [src]!"))
|
||||
R.Confuse(10)
|
||||
R.flash_eyes()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/phase_two(atom/target)
|
||||
if(!target)
|
||||
to_chat(src, span_warning("There's nothing to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/list/nearby_things = range(1, target)
|
||||
var/list/valid_turfs = list()
|
||||
|
||||
// All this work to just go to a non-dense tile.
|
||||
for(var/turf/potential_turf in nearby_things)
|
||||
var/valid_turf = TRUE
|
||||
if(potential_turf.density)
|
||||
continue
|
||||
for(var/atom/movable/AM in potential_turf)
|
||||
if(AM.density)
|
||||
valid_turf = FALSE
|
||||
if(valid_turf)
|
||||
valid_turfs.Add(potential_turf)
|
||||
|
||||
if(!(valid_turfs.len))
|
||||
to_chat(src, span_warning("There wasn't an unoccupied spot to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/turf/target_turf = pick(valid_turfs)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
|
||||
s1.set_up(5, 1, T)
|
||||
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
|
||||
s2.set_up(5, 1, target_turf)
|
||||
|
||||
|
||||
T.visible_message(span_notice("\The [src] vanishes!"))
|
||||
s1.start()
|
||||
|
||||
forceMove(target_turf)
|
||||
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
|
||||
to_chat(src, span_notice("You teleport to \the [target_turf]."))
|
||||
|
||||
target_turf.visible_message(span_warning("\The [src] appears!"))
|
||||
s2.start()
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/phase_three(atom/target) //This might friendly fire itself, but funny and final phase
|
||||
Beam(target, icon_state = "sat_beam", time = 2.5 SECONDS, maxdistance = INFINITY)
|
||||
sleep(30)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/chain_lightning(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/shield_one(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/temp/hot(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/shield_two(atom/target)
|
||||
if(prob(50))
|
||||
visible_message(span_alien("\The [src] begins to bandage their wounds."))
|
||||
sleep(30)
|
||||
adjustBruteLoss(-25.0)
|
||||
visible_message(span_alien("\The [src] begins to salve their burns."))
|
||||
sleep(30)
|
||||
adjustFireLoss(-25.0)
|
||||
else
|
||||
visible_message(span_alien("\The [src] consumes an odd pill."))
|
||||
add_modifier(/datum/modifier/aura/slime_heal, 15, src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/eclipse/head/tyrlead/proc/shield_three(atom/target)
|
||||
Beam(target, icon_state = "sat_beam", time = 2.5 SECONDS, maxdistance = INFINITY)
|
||||
sleep(30)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/beam/lightning(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
+1489
File diff suppressed because it is too large
Load Diff
@@ -289,7 +289,7 @@
|
||||
movement_cooldown = -1
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 7
|
||||
special_attack_cooldown = 0.5 SECONDS
|
||||
special_attack_cooldown = 3.5 SECONDS
|
||||
projectiletype = /obj/item/projectile/energy/mob/precursor
|
||||
weatherprojectile = /obj/item/projectile/energy/mob/precursor
|
||||
var/attack_cycle = 1
|
||||
|
||||
Reference in New Issue
Block a user