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>
This commit is contained in:
Qwertytoforty
2023-10-30 19:08:49 +00:00
committed by GitHub
co-authored by Contrabang
parent 30c6a59d63
commit 9bb010b9ab
12 changed files with 42 additions and 26 deletions
+1 -1
View File
@@ -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()
+3 -1
View File
@@ -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)
@@ -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()
@@ -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("<span class='danger'>[user]'s hierophant club malfunctions!</span>")
do_sparks(5, FALSE, user)
+1 -1
View File
@@ -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
@@ -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/////////////////////////
@@ -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
@@ -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, "<span class='colossus'><b>YOU FUCK... I... I'll... get you later. Enjoy the last few days of your life...</b></span>")
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, "<span class='colossus'><b>I WILL END YOU HERE AND NOW!</b></span>")
to_chat(H, "<span class='colossus'><b>MY HANDS WILL RELISH ENDING YOU... HERE AND NOW!</b></span>")
FindTarget(list(H), 1)
/mob/living/simple_animal/hostile/megafauna/bubblegum/round_2/Life(seconds, times_fired)
@@ -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))
@@ -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)
@@ -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
+2 -1
View File
@@ -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()