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()