From e2e77aa5bd366b441f2475007cc9933ea7a3376b Mon Sep 17 00:00:00 2001 From: FluffMedic <109300046+FluffMedic@users.noreply.github.com> Date: Sat, 26 Jul 2025 06:48:20 -0400 Subject: [PATCH] Tyr Misc Changes (#11245) --- .../objects/structures/tyr_project_props.dm | 16 +++ .../code/modules/food/food/snacks/meat.dm | 21 +++- .../simple_mob/subtypes/animal/tyr/ants.dm | 54 +++++++-- .../subtypes/humanoid/eclipse/bhattacks.dm | 103 ++++++++++++++++++ .../subtypes/humanoid/eclipse/heads.dm | 10 +- .../subtypes/humanoid/eclipse/mechas.dm | 63 ++++++++--- .../mechanical/hivebot/orginalAlts.dm | 2 +- 7 files changed, 240 insertions(+), 29 deletions(-) diff --git a/modular_chomp/code/game/objects/structures/tyr_project_props.dm b/modular_chomp/code/game/objects/structures/tyr_project_props.dm index e3d95101bc..adc8e5ff0d 100644 --- a/modular_chomp/code/game/objects/structures/tyr_project_props.dm +++ b/modular_chomp/code/game/objects/structures/tyr_project_props.dm @@ -507,3 +507,19 @@ scavanging is to be done at that site." value = CATALOGUER_REWARD_HARD + +/obj/item/material/barbedwire/plastic/active + anchored = 1 + icon_state = "barbedwire-out" + + +/obj/item/material/barbedwire/vopal + name = "crystal shards" + default_material = MAT_VOPAL + +/obj/item/material/barbedwire/vopal/active + anchored = 1 + icon_state = "barbedwire-out" + + + diff --git a/modular_chomp/code/modules/food/food/snacks/meat.dm b/modular_chomp/code/modules/food/food/snacks/meat.dm index 1900ebd121..e05d319794 100644 --- a/modular_chomp/code/modules/food/food/snacks/meat.dm +++ b/modular_chomp/code/modules/food/food/snacks/meat.dm @@ -90,7 +90,7 @@ //ant meats -/obj/item/reagent_containers/food/snacks/copperant +/obj/item/reagent_containers/food/snacks/tyrant name = "Bronze Ant Slice" desc = "A slice from a ant" icon_state = "meat" @@ -105,6 +105,21 @@ reagents.add_reagent(REAGENT_ID_PROTEIN, 3) reagents.add_reagent(REAGENT_ID_SHOCKCHEM, 3) +/obj/item/reagent_containers/food/snacks/copperant + name = "Copper Ant Slice" + desc = "A slice from a ant" + icon_state = "meat" + center_of_mass_x = 17 //CHOMPEdit + center_of_mass_y= 16 //CHOMPEdit + nutriment_amt = 3 + nutriment_desc = list(REAGENT_ID_PROTEIN = 3, REAGENT_ID_SHOCKCHEM = 3) + bitesize = 1 + +/obj/item/reagent_containers/food/snacks/copperant/Initialize(mapload) + . = ..() + reagents.add_reagent(REAGENT_ID_PROTEIN, 3) + reagents.add_reagent(REAGENT_ID_SHOCKCHEM, 3) + /obj/item/reagent_containers/food/snacks/painiteant name = "Painite Ant Slice" desc = "A slice from a ant" @@ -137,7 +152,7 @@ reagents.add_reagent(REAGENT_ID_LIQUIDFIRE, 3) /obj/item/reagent_containers/food/snacks/quartzant - name = "Bronze Ant Slice" + name = "Quartz Ant Slice" desc = "A slice from a ant" icon_state = "meat" center_of_mass_x = 17 //CHOMPEdit @@ -152,7 +167,7 @@ reagents.add_reagent(REAGENT_ID_DEATHBLOOD, 3) /obj/item/reagent_containers/food/snacks/agateant - name = "Bronze Ant Slice" + name = "Agate Ant Slice" desc = "A slice from a ant" icon_state = "meat" center_of_mass_x = 17 //CHOMPEdit diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm index 4ba5db17d4..f718a4f7e9 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/animal/tyr/ants.dm @@ -17,7 +17,7 @@ attack_edge = 1 meat_amount = 3 - meat_type = /obj/item/reagent_containers/food/snacks/ant + meat_type = /obj/item/reagent_containers/food/snacks/tyrant tame_items = list(/obj/item/reagent_containers/food/snacks/crabmeat = 20) @@ -53,7 +53,8 @@ B.absorbchance = 0 B.escapechance = 25 -/mob/living/simple_mob/animal/tyr/mineral_ants/bronze //shockers +/mob/living/simple_mob/animal/tyr/mineral_ants/bronze //knock back ant + name = "bronze metal ant" icon_state = "bronze_ant" icon_living = "bronze_ant" butchery_loot = list(\ @@ -62,7 +63,24 @@ meat_amount = 3 meat_type = /obj/item/reagent_containers/food/snacks/bronzeant -/mob/living/simple_mob/animal/tyr/mineral_ants/copper +/mob/living/simple_mob/animal/tyr/mineral_ants/bronze/apply_melee_effects(atom/A) + ..() + + if(isliving(A) && a_intent == I_HURT) + var/mob/living/L = A + 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!")) // CHOMPEdit: Visible/audible feedback for *resisting* the slam. + playsound(src, "punch", 50, 1) // CHOMPEdit: Visible/audible feedback for *resisting* the slam. + +/mob/living/simple_mob/animal/tyr/mineral_ants/copper //emp ants + name = "copper metal ant" icon_state = "copper_ant" icon_living = "copper_ant" butchery_loot = list(\ @@ -71,18 +89,34 @@ meat_amount = 3 meat_type = /obj/item/reagent_containers/food/snacks/copperant -/mob/living/simple_mob/animal/tyr/mineral_ants/agate //shockers +/mob/living/simple_mob/animal/tyr/mineral_ants/copper/apply_melee_effects(var/atom/A) + if(isliving(A)) + A.emp_act(4) //The weakest strength of EMP + playsound(src, 'sound/weapons/Egloves.ogg', 75, 1) + +/mob/living/simple_mob/animal/tyr/mineral_ants/agate //rushes at you and explodes + name = "agate metal ant" icon_state = "agate_ant" icon_living = "agate_ant" + movement_cooldown = -3 butchery_loot = list(\ /obj/item/stack/material/weathered_agate = 18\ ) meat_amount = 3 meat_type = /obj/item/reagent_containers/food/snacks/agateant -/mob/living/simple_mob/animal/tyr/mineral_ants/quartz + special_attack_min_range = 1 + special_attack_max_range = 2 + special_attack_cooldown = 10 SECONDS + +/mob/living/simple_mob/animal/tyr/mineral_ants/agate/do_special_attack(atom/A) + explosion(src.loc, 2, 1, 1, 1) + +/mob/living/simple_mob/animal/tyr/mineral_ants/quartz //irl quartz is apparently tough? + name = "quartz metal ant" icon_state = "quartz_ant" icon_living = "quartz_ant" + armor = list(melee = 60, bullet = 50, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) butchery_loot = list(\ /obj/item/stack/material/quartz = 18\ ) @@ -90,6 +124,8 @@ meat_type = /obj/item/reagent_containers/food/snacks/quartzant /mob/living/simple_mob/animal/tyr/mineral_ants/painite + name = "painite metal ant" + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive icon_state = "painite_ant" icon_living = "painite_ant" butchery_loot = list(\ @@ -99,7 +135,7 @@ meat_type = /obj/item/reagent_containers/food/snacks/painiteant /mob/living/simple_mob/animal/tyr/mineral_ants/diamond - name = " cyan metal ant" + name = "diamond metal ant" icon_state = "diamond_ant" icon_living = "diamond_ant" butchery_loot = list(\ @@ -115,14 +151,17 @@ ) /mob/living/simple_mob/animal/tyr/mineral_ants/uranium - name = "lime metal ant" + name = "glowing metal ant" icon_state = "rad_ant" icon_living = "rad_ant" butchery_loot = list(\ /obj/item/stack/material/uranium = 18\ ) +/mob/living/simple_mob/animal/tyr/mineral_ants/uranium/do_special_attack(atom/A) + SSradiation.radiate(src, 15) /mob/living/simple_mob/animal/tyr/mineral_ants/tritium + name = "ritium ant" icon_state = "tritium_ant" icon_living = "tritium_ant" butchery_loot = list(\ @@ -130,6 +169,7 @@ ) /mob/living/simple_mob/animal/tyr/mineral_ants/builder + name = "concrete ant" icon_state = "builder_ant" icon_living = "builder_ant" butchery_loot = list(\ diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/bhattacks.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/bhattacks.dm index 48974c0282..9550bb21b8 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/bhattacks.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/bhattacks.dm @@ -843,4 +843,107 @@ bullet_heck(target, -4, 7) attackcycle = next_cycle +/mob/living/simple_mob/mechanical/mecha/eclipse/proc/bomb_lines(atom/A, var/next_cycle) + if(!A) + return + var/list/potential_targets = ai_holder.list_targets() + for(var/atom/entry in potential_targets) + if(istype(entry, /mob/living/simple_mob/humanoid/eclipse)) + potential_targets -= entry + if(potential_targets.len) + var/iteration = clamp(potential_targets.len, 1, 3) + for(var/i = 0, i < iteration, i++) + if(!(potential_targets.len)) + break + var/mob/target = pick(potential_targets) + potential_targets -= target + spawn_lines(target, next_cycle) + + +/mob/living/simple_mob/mechanical/mecha/eclipse/proc/spawn_lines(atom/target, var/next_cycle) + var/alignment = rand(1,2) // 1 for vertical, 2 for horizontal + var/list/line_range = list() + var/turf/T = get_turf(target) + line_range += T + for(var/i = 1, i <= 7, i++) + switch(alignment) + if(1) + if(T.x-i > 0) + line_range += locate(T.x-i, T.y-i, T.z) + if(T.x+i <= world.maxx) + line_range += locate(T.x+i, T.y+i, T.z) + if(T.y-i > 0) + line_range += locate(T.x+i, T.y-i, T.z) + if(T.y+i <= world.maxy) + line_range += locate(T.x-i, T.y+i, T.z) + if(2) + if(T.x-i > 0) + line_range += locate(T.x-i, T.y, T.z) + if(T.x+i <= world.maxx) + line_range += locate(T.x+i, T.y, T.z) + if(T.y-i > 0) + line_range += locate(T.x, T.y-i, T.z) + if(T.y+i <= world.maxy) + line_range += locate(T.x, T.y+i, T.z) + for(var/turf/dropspot in line_range) + new artidrop(dropspot) + attackcycle = next_cycle + + + +/mob/living/simple_mob/mechanical/mecha/eclipse/proc/bomb_chaos(atom/A, var/next_cycle) + if(!A) + return + var/list/potential_targets = ai_holder.list_targets() + for(var/atom/entry in potential_targets) + if(istype(entry, /mob/living/simple_mob/humanoid/eclipse)) + potential_targets -= entry + if(potential_targets.len) + var/iteration = clamp(potential_targets.len, 1, 3) + for(var/i = 0, i < iteration, i++) + if(!(potential_targets.len)) + break + var/mob/target = pick(potential_targets) + potential_targets -= target + chaos_lines(target, next_cycle) + + +/mob/living/simple_mob/mechanical/mecha/eclipse/proc/chaos_lines(atom/target, var/next_cycle) + var/alignment = rand(1,2) + var/list/line_range = list() + var/turf/T = get_turf(target) + line_range += T + for(var/i = 1, i <= 7, i++) + switch(alignment) + if(1) + if(T.x-i > 0) + var/zed = rand(1,3) + line_range += locate(T.x+zed, T.y-i, T.z) + if(T.x+i <= world.maxx) + var/zed = rand(1,3) + line_range += locate(T.x+zed, T.y+i, T.z) + if(T.y-i > 0) + var/zed = rand(1,3) + line_range += locate(T.x+i, T.y+zed, T.z) + if(T.y+i <= world.maxy) + var/zed = rand(1,3) + line_range += locate(T.x-i, T.y+zed, T.z) + if(2) + if(T.x-i > 0) + var/zed = rand(1,3) + line_range += locate(T.x-i, T.y-zed, T.z) + if(T.x+i <= world.maxx) + var/zed = rand(1,3) + line_range += locate(T.x+i, T.y-zed, T.z) + if(T.y-i > 0) + var/zed = rand(1,3) + line_range += locate(T.x-zed, T.y-i, T.z) + if(T.y+i <= world.maxy) + var/zed = rand(1,3) + line_range += locate(T.x-zed, T.y+i, T.z) + for(var/turf/dropspot in line_range) + new artidrop(dropspot) + attackcycle = next_cycle + + diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/heads.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/heads.dm index b7bf496076..b29f85e650 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/heads.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/heads.dm @@ -147,12 +147,12 @@ /obj/item/hand_tele = 10, /obj/item/bone/skull = 100 ) - var/fullshield = 4 - var/shieldrage = 4 + var/fullshield = 140 + var/shieldrage = 3 /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. 4 hits to remove if(fullshield > 0) - fullshield-- + fullshield -= P.damage if(P == /obj/item/projectile/ion) fullshield = 0 visible_message(span_boldwarning(span_orange("[P] breaks the shield!!."))) @@ -166,8 +166,8 @@ ..() shieldrage-- if(shieldrage == 0) - shieldrage = 4 - fullshield = 4 + shieldrage = 3 + fullshield = 140 visible_message(span_boldwarning(span_orange("The shield reactivates!!."))) icon_state = "overseer_shield" diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/mechas.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/mechas.dm index e01398de71..72897863eb 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/mechas.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/humanoid/eclipse/mechas.dm @@ -1,6 +1,6 @@ /mob/living/simple_mob/mechanical/mecha/eclipse - health = 875 - maxHealth = 875 + health = 600 + maxHealth = 600 faction = FACTION_ECLIPSE icon = 'modular_chomp/icons/mob/eclipse.dmi' has_repair_droid = TRUE @@ -16,6 +16,7 @@ movement_cooldown = 10 var/specialattackprojectile = /obj/item/projectile/energy/phase/bolt var/attackcycle = 1 + var/artidrop = /obj/effect/artillery_attack /mob/living/simple_mob/mechanical/mecha/eclipse/handle_special() if(stat != DEAD) @@ -370,8 +371,8 @@ /mob/living/simple_mob/mechanical/mecha/eclipse/darkmatter_assualt/phasetwo //we ain't done yet name = "Collapsing Janus" armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 80, bio = 100, rad = 100) //our shielding is gone - health = 425 - maxHealth = 425 + health = 400 + maxHealth = 400 desc = "The mecha is smoking, it's drone and shield is broken, but it's pilot is pushing it further." specialattackprojectile = /obj/item/projectile/energy/eclipse/janusjavelin wreckage = /obj/item/prop/tyrlore/neonjanus @@ -431,21 +432,57 @@ name = "eclipse cryo top" icon_state = "mecha_top" icon_living = "mecha_top" - armor = list(melee = 20, bullet = 20, laser = 20, energy = 20, bomb = 80, bio = 100, rad = 100) //Smol armor to compensate for the gimmick wreckage = /obj/item/melee/energy/sword/top_shield specialattackprojectile = /obj/item/projectile/energy/eclipse/chillingwind desc = "It appears to be spinning at rapid speeds; enough to deflect projectiles. The air around it feels frigid.." + artidrop = /obj/item/material/barbedwire/vopal/active /mob/living/simple_mob/mechanical/mecha/eclipse/battle_top/do_special_attack(atom/A) var/rng_cycle - if(attackcycle == 1) - rng_cycle = rand(1,2) - addtimer(CALLBACK(src, PROC_REF(quad_random_firing), A, 20, rng_cycle, 25), 0.5 SECONDS, TIMER_DELETE_ME) - attackcycle = 0 - else if(attackcycle == 2) - rng_cycle = rand(1,2) - addtimer(CALLBACK(src, PROC_REF(dual_spin), A, rng_cycle, 15), 0.5 SECONDS, TIMER_DELETE_ME) - attackcycle = 0 + switch(a_intent) + if(I_DISARM) //phase3 + if(attackcycle == 1) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(quad_random_firing), A, 20, rng_cycle, 20), 0.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + else if(attackcycle == 2) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(bomb_chaos), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + else if(attackcycle == 3) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(dual_spin), A, rng_cycle, 15), 0.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + + if(I_HURT) //phase1 + if(attackcycle == 1) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(random_firing), A, 20, rng_cycle, 20), 0.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + else if(attackcycle == 2) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(bomb_lines), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + else if(attackcycle == 3) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(cross_spin), A, rng_cycle, 15), 0.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + + if(I_GRAB) // Phase 2 + if(attackcycle == 1) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(quad_random_firing), A, 20, rng_cycle, 25), 0.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + else if(attackcycle == 2) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(bomb_lines), A, rng_cycle), 2.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + else if(attackcycle == 3) + rng_cycle = rand(1,3) + addtimer(CALLBACK(src, PROC_REF(cross_spin), A, rng_cycle, 15), 0.5 SECONDS, TIMER_DELETE_ME) + attackcycle = 0 + + /mob/living/simple_mob/mechanical/mecha/eclipse/battle_top/handle_special() if(stat != DEAD) diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/orginalAlts.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/orginalAlts.dm index d3a88bb670..e04211f26a 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/orginalAlts.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/orginalAlts.dm @@ -59,7 +59,7 @@ attackcycle = 0 else if(attackcycle == 3) specialattackprojectile = /obj/item/projectile/energy/spikeenergy_ball/boss - addtimer(CALLBACK(src, PROC_REF(dual_spin), A, 4, 25), 1 SECOND, TIMER_DELETE_ME) + addtimer(CALLBACK(src, PROC_REF(dual_spin), A, 4, 20), 1 SECOND, TIMER_DELETE_ME) attackcycle = 0 else if(attackcycle == 4) specialattackprojectile = /obj/item/projectile/energy/spikeenergy_ball/boss