From 9bb010b9ab1a9d23d71c49ec9a14ae4ed905cca6 Mon Sep 17 00:00:00 2001
From: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>
Date: Mon, 30 Oct 2023 15:08:49 -0400
Subject: [PATCH] some tweaks for hardmode (#22809)
* some tweaks for hardmode
* Update colossus.dm
* fail safes / other fixes
* oops pressed compile but had an active thing open
* bubblegum nerfs
* nerfs the self healing on guidance
* crusher bubble care
* and finally, the portal to the second arena, so a rescue might happen. Maybe.
* oh right the legion core related murders
* lets not make modsuit users suffer
* oops
* whoops
* fixes legion loot
* changes requested
* terminal smooth brain
* Update code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
* comment
---------
Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
---
code/datums/status_effects/buffs.dm | 2 +-
code/datums/status_effects/debuffs.dm | 4 +++-
.../mining/lavaland/loot/bubblegum_loot.dm | 8 +-------
.../mining/lavaland/loot/hierophant_loot.dm | 2 +-
code/modules/mining/machine_vending.dm | 2 +-
.../mob/living/simple_animal/constructs.dm | 3 +++
.../hostile/megafauna/blood_drunk_miner.dm | 2 +-
.../hostile/megafauna/bubblegum.dm | 19 ++++++++++++++-----
.../hostile/megafauna/colossus.dm | 4 ++--
.../simple_animal/hostile/megafauna/drake.dm | 2 +-
.../simple_animal/hostile/megafauna/legion.dm | 17 ++++++++++++-----
code/modules/mod/modules/modules_supply.dm | 3 ++-
12 files changed, 42 insertions(+), 26 deletions(-)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 954e264ee99..2e8e78b100a 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -421,7 +421,7 @@
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.bodytemperature = H.dna.species.body_temperature
- if(is_mining_level(H.z))
+ if(is_mining_level(H.z) || istype(get_area(H), /area/ruin/space/bubblegum_arena))
for(var/obj/item/organ/external/E in H.bodyparts)
E.fix_internal_bleeding()
E.fix_burn_wound()
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 4a56b018a94..e128becc582 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -1004,7 +1004,7 @@
/datum/status_effect/bubblegum_curse/tick()
var/mob/living/simple_animal/hostile/megafauna/bubblegum/attacker = locateUID(source_UID)
- if(!attacker)
+ if(!attacker || attacker.loc == null)
qdel(src)
if(attacker.health <= attacker.maxHealth / 2)
owner.clear_fullscreen("Bubblegum")
@@ -1065,6 +1065,8 @@
var/mob/living/simple_animal/hostile/megafauna/bubblegum/attacker = locateUID(source_UID)
if(!attacker)
return //Let's not nullspace
+ if(attacker.loc == null)
+ return //Extra emergency safety.
var/turf/TA = get_turf(owner)
owner.Immobilize(3 SECONDS)
new /obj/effect/decal/cleanable/blood/bubblegum(TA)
diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm
index b217e2a7d33..5ce83a191e5 100644
--- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm
+++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm
@@ -16,18 +16,12 @@
/obj/structure/closet/crate/necropolis/bubblegum/bait/populate_contents()
return
-/obj/structure/closet/crate/necropolis/bubblegum/bait/open(by_hand)
- . = ..()
- for(var/obj/effect/bubblegum_trigger/B in contents)
- B.targets_to_fuck_up += usr
- B.activate()
-
/obj/effect/bubblegum_trigger
var/list/targets_to_fuck_up = list()
/obj/effect/bubblegum_trigger/Initialize(mapload, target_list)
. = ..()
- addtimer(CALLBACK(src, PROC_REF(activate)), 15 SECONDS) //We try to auto engage the fun 15 seconds after death, or when manually opened, whichever comes first. If for some strange reason the target list is empty, we'll trigger when opened
+ addtimer(CALLBACK(src, PROC_REF(activate)), 15 SECONDS) //We try to auto engage the fun 15 seconds after death.
targets_to_fuck_up = target_list
/obj/effect/bubblegum_trigger/proc/activate()
diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm
index 5fa10329ad2..383896ed99b 100644
--- a/code/modules/mining/lavaland/loot/hierophant_loot.dm
+++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm
@@ -52,7 +52,7 @@
if(world.time < timer)
return
- if(!is_mining_level(user.z) && !iswizard(user)) //Will only spawn a few sparks if not on mining z level, unless a wizard uses it.
+ if((!is_mining_level(user.z) && !iswizard(user)) || istype(get_area(user), /area/ruin/space/bubblegum_arena)) //Will only spawn a few sparks if not on mining z level, unless a wizard uses it.
timer = world.time + cooldown_time
user.visible_message("[user]'s hierophant club malfunctions!")
do_sparks(5, FALSE, user)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 706272a2a16..459ceec08b2 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -91,7 +91,7 @@
EQUIPMENT("Soap", /obj/item/soap/nanotrasen, 200),
EQUIPMENT("Space Cash", /obj/item/stack/spacecash/c200, 2000),
EQUIPMENT("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
- EQUIPMENT("HRD-MDE Project Box", /obj/item/storage/box/hardmode_box, 5000) //I want miners have to pay a lot to get this, but be set once they do.
+ EQUIPMENT("HRD-MDE Project Box", /obj/item/storage/box/hardmode_box, 3500) //I want miners have to pay a lot to get this, but be set once they do.
)
prize_list["Extra"] = list() // Used in child vendors
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 04dba9f6134..2707f7f988f 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -198,6 +198,9 @@
/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
+/mob/living/simple_animal/hostile/construct/wraith/hostile/bubblegum //Used in bubblegum summoning. Needs MOB_SIZE_LARGE so crushers don't suffer
+ mob_size = MOB_SIZE_LARGE
+
/////////////////////////////Artificer/////////////////////////
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index fe55c7f6b1e..903fec945d9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -176,7 +176,7 @@ Difficulty: Medium
changeNext_move(CLICK_CD_MELEE)
miner_saw.melee_attack_chain(src, target)
if(guidance)
- adjustHealth(enraged ? -10 : -2)
+ adjustHealth(enraged ? -6 : -2)
if(prob(50))
transform_weapon() //Still follows the normal rules for cooldown between swaps.
return TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index 91666e29827..bf87953eec0 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -1,6 +1,7 @@
#define BUBBLEGUM_SMASH (health <= maxHealth * 0.5 || second_life) // angery
#define BUBBLEGUM_CAN_ENRAGE (enrage_till + (enrage_time * 2) <= world.time)
#define BUBBLEGUM_IS_ENRAGED (enrage_till > world.time)
+#define MAXIMUM_ENRAGED_HEALING 500
/*
@@ -61,6 +62,10 @@ Difficulty: Hard
var/revving_charge = FALSE
/// Is it on its enraged exclusive second life?
var/second_life = FALSE
+ /// Does it have a portal to the funny second life arena created?
+ var/obj/effect/portal/redspace/second_life_portal
+ /// Enraged healing recived
+ var/enraged_healing = 0
internal_gps = /obj/item/gps/internal/bubblegum
medal_type = BOSS_MEDAL_BUBBLEGUM
score_type = BUBBLEGUM_SCORE
@@ -140,6 +145,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/death(gibbed)
+ qdel(second_life_portal)
if(enraged && !second_life)
var/obj/structure/closet/crate/necropolis/bubblegum/bait/jebait = new /obj/structure/closet/crate/necropolis/bubblegum/bait(get_turf(src))
var/obj/effect/bubblegum_trigger/great_chest_ahead = new /obj/effect/bubblegum_trigger(jebait, ListTargets())
@@ -149,7 +155,7 @@ Difficulty: Hard
var/area/A = get_area(src)
for(var/mob/M in A)
to_chat(M, "YOU FUCK... I... I'll... get you later. Enjoy the last few days of your life...")
- new /obj/effect/bubblegum_exit(get_turf(src))
+ new /obj/effect/bubblegum_exit(get_turf(src))
return ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire(atom/A)
@@ -376,12 +382,12 @@ Difficulty: Hard
if(T in range(2, target))
continue
turfs += T
- var/amount = enraged ? 4 : 3
+ var/amount = second_life ? 4 : 3
while(constructs < amount && length(turfs))
var/turf/spot = pick_n_take(turfs)
if(!spot)
return
- var/mob/living/simple_animal/hostile/construct/wraith/hostile/summon = new /mob/living/simple_animal/hostile/construct/wraith/hostile(spot)
+ var/mob/living/simple_animal/hostile/construct/wraith/hostile/bubblegum/summon = new /mob/living/simple_animal/hostile/construct/wraith/hostile/bubblegum(spot)
summon.faction = faction.Copy()
constructs++
@@ -407,7 +413,7 @@ Difficulty: Hard
if(!BUBBLEGUM_CAN_ENRAGE)
return FALSE
enrage_till = world.time + enrage_time
- if(enraged)
+ if(enraged && (enraged_healing < MAXIMUM_ENRAGED_HEALING) && !second_life)
adjustHealth(-75)
update_approach()
change_move_delay(enraged ? 3 : 4) //3 if enraged, 4 otherwise
@@ -642,9 +648,12 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/round_2/Initialize(mapload)
. = ..()
+ for(var/obj/effect/landmark/spawner/bubblegum_exit/E in GLOB.landmarks_list)
+ second_life_portal = new /obj/effect/portal/redspace(get_turf(E), get_turf(src), null, 2 HOURS, src, FALSE)
+ break
RegisterSignal(src, COMSIG_HOSTILE_FOUND_TARGET, PROC_REF(i_see_you))
for(var/mob/living/carbon/human/H in range(20))
- to_chat(H, "I WILL END YOU HERE AND NOW!")
+ to_chat(H, "MY HANDS WILL RELISH ENDING YOU... HERE AND NOW!")
FindTarget(list(H), 1)
/mob/living/simple_animal/hostile/megafauna/bubblegum/round_2/Life(seconds, times_fired)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index b8be261ed01..dc02055627a 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -172,7 +172,7 @@ Difficulty: Very Hard
dir_shots(GLOB.diagonals)
SLEEP_CHECK_DEATH(rage)
dir_shots(GLOB.cardinal)
- if(telegraphing)
+ if(telegraphing && enraged)
alternating_dir_shots(FALSE)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/select_spiral_attack()
@@ -235,7 +235,7 @@ Difficulty: Very Hard
ranged_cooldown = world.time + 20
if(do_sleep)
telegraph(BLAST)
- SLEEP_CHECK_DEATH(enraged ? 0.1 SECONDS : 1.5 SECONDS)
+ SLEEP_CHECK_DEATH(enraged ? 0.75 SECONDS : 1.5 SECONDS)
var/turf/target_turf = get_turf(target)
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 2)
newtonian_move(get_dir(target_turf, src))
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 68d3e7b8cff..13f26c9e8da 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -238,7 +238,7 @@ Difficulty: Medium
move_to_delay = move_to_delay / 2
light_range = 10
SLEEP_CHECK_DEATH(10) // run.
- mass_fire(20, 15, 3)
+ mass_fire(12, 15, 3)
move_to_delay = initial(move_to_delay)
remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
light_range = initial(light_range)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 9f5e011ec8d..e64b128c812 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -69,13 +69,14 @@ Difficulty: Medium
legiontwo.crusher_loot = list(/datum/nothing)
legiontwo.health = 1250
legiontwo.maxHealth = 1250
+ legiontwo.enraged = TRUE
/mob/living/simple_animal/hostile/megafauna/legion/unrage()
. = ..()
for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_list)
if(other != src)
- other.loot = initial(loot)
- other.crusher_loot = initial(crusher_loot)
+ other.loot = list(/obj/item/storm_staff) //Initial does not work with lists.
+ other.crusher_loot = list(/obj/item/storm_staff, /obj/item/crusher_trophy/empowered_legion_skull)
other.maxHealth = 2500
other.health = 2500
qdel(src) //Suprise, it's the one on lavaland that regrows to full.
@@ -83,8 +84,8 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/legion/death(gibbed)
for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_list)
if(other != src)
- other.loot = initial(loot)
- other.crusher_loot = initial(crusher_loot)
+ other.loot = list(/obj/item/storm_staff) //Initial does not work with lists.
+ other.crusher_loot = list(/obj/item/storm_staff, /obj/item/crusher_trophy/empowered_legion_skull)
. = ..()
/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget()
@@ -206,7 +207,13 @@ Difficulty: Medium
A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced(loc)
else
A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(loc)
- A.GiveTarget(target)
+ if(!enraged || prob(33))
+ A.GiveTarget(target)
+ else
+ for(var/mob/living/carbon/human/H in range(7, src))
+ if(H.stat == DEAD)
+ A.GiveTarget(H)
+ break
A.friends = friends
A.faction = faction
diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm
index e98e4ccdc01..369aa2839e5 100644
--- a/code/modules/mod/modules/modules_supply.dm
+++ b/code/modules/mod/modules/modules_supply.dm
@@ -325,7 +325,8 @@
if(!keep_turfs)
keep_turfs = typecacheof(list(
/turf/simulated/floor/plating/lava,
- /turf/simulated/floor/indestructible/hierophant
+ /turf/simulated/floor/indestructible/hierophant,
+ /turf/simulated/floor/indestructible/necropolis
))
/obj/item/mod/module/ash_accretion/on_suit_activation()