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:
FluffMedic
2024-10-06 22:01:45 +02:00
committed by GitHub
co-authored by Kashargul Kashargul
parent ee20b5cb1b
commit 9200a2ee9b
40 changed files with 5763 additions and 240 deletions
@@ -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
@@ -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()
@@ -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)
@@ -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