All megafauna now drop ore on death (#29169)

* All megafauna drop ore as a reward now

* Fixes vetus

* Apply suggestions from code review

Batching lewc's changes

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com>

---------

Signed-off-by: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
This commit is contained in:
BiancaWilkson
2025-05-13 04:40:57 +00:00
committed by GitHub
co-authored by Luc
parent 252f7e2521
commit 21d8cf2c12
13 changed files with 106 additions and 130 deletions
@@ -70,14 +70,15 @@ Difficulty: Hard
pixel_x = -16
pixel_y = -16
del_on_death = TRUE
loot = list(/obj/structure/closet/crate/necropolis/ancient)
crusher_loot = list(/obj/structure/closet/crate/necropolis/ancient/crusher)
loot = list(/obj/item/pinpointer/tendril)
crusher_loot = list(/obj/item/crusher_trophy/adaptive_intelligence_core)
internal_gps = /obj/item/gps/internal/ancient
medal_type = BOSS_MEDAL_ROBOT
score_type = ROBOT_SCORE
deathmessage = "explodes into a shower of alloys"
footstep_type = FOOTSTEP_MOB_HEAVY //make stomp like bubble
attack_action_types = list()
difficulty_ore_modifier = 4 //Vetus' whole deal was that it dropped ore before all megas did, so it gets a ton
var/charging = FALSE
var/revving_charge = FALSE
@@ -138,6 +139,18 @@ Difficulty: Hard
QDEL_NULL(beam)
return ..()
/mob/living/simple_animal/hostile/megafauna/ancient_robot/spawn_ore_reward(atom/spawn_location)
..()
var/list/exquisite_ore = list(
/obj/item/stack/ore/platinum, // The vetus can have some, as a treat
/obj/item/stack/ore/iridium,
/obj/item/stack/ore/palladium
)
new /obj/item/stack/sheet/mineral/abductor(spawn_location, roll("4d8")) // This is the amount of the other rare ores spawned
for(var/ore in exquisite_ore)
new ore(spawn_location, rand(5, 10)) // Don't want mining to step too much on explorer's toes.
/obj/item/gps/internal/ancient
icon_state = null
gpstag = "Malfunctioning Signal"
@@ -175,15 +188,14 @@ Difficulty: Hard
core_type = /obj/item/assembly/signaler/anomaly/vortex
if(CRYO)
core_type = /obj/item/assembly/signaler/anomaly/cryo
loot += core_type
var/crate_type = pick(loot)
var/obj/structure/closet/crate/C = new crate_type(loc)
new core_type(C)
if(!enraged)
return
for(var/mob/living/M in urange(40, src)) //Bigger range, ran once per shift, as people run away from vetus as it blows up.
if(M.client)
new /obj/item/disk/fauna_research/vetus(C)
if(enraged)
for(var/mob/living/M in urange(40, src)) //Bigger range, ran once per shift, as people run away from vetus as it blows up.
if(!M.client)
return
loot += /obj/item/disk/fauna_research/vetus
..()
/mob/living/simple_animal/hostile/megafauna/ancient_robot/enrage()
. = ..()
@@ -38,7 +38,7 @@ Difficulty: Medium
ranged = TRUE
ranged_cooldown_time = 16
pixel_x = -7
crusher_loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
crusher_loot = list(/obj/item/crusher_trophy/miner_eye)
loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
wander = FALSE
del_on_death = TRUE
@@ -53,8 +53,11 @@ Difficulty: Hard
ranged = TRUE
pixel_x = -32
del_on_death = TRUE
crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
difficulty_ore_modifier = 3
crusher_loot = list(/obj/item/crusher_trophy/demon_claws)
loot = list(/obj/item/clothing/suit/space/hostile_environment,
/obj/item/clothing/head/helmet/space/hostile_environment,
/obj/item/melee/spellblade/random)
blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME
var/charging = FALSE
var/enrage_till = 0
@@ -158,6 +161,10 @@ Difficulty: Hard
new /obj/effect/bubblegum_exit(get_turf(src))
return ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/drop_loot()
if(enraged && !second_life)
return //The jebait chest already drops
return ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire(atom/A)
if(second_life)
Shoot(A)
@@ -50,8 +50,8 @@ Difficulty: Very Hard
internal_gps = /obj/item/gps/internal/colossus
medal_type = BOSS_MEDAL_COLOSSUS
score_type = COLOSSUS_SCORE
crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
loot = list(/obj/structure/closet/crate/necropolis/colossus)
difficulty_ore_modifier = 3
crusher_loot = list(/obj/item/crusher_trophy/blaster_tubes)
deathmessage = "disintegrates, leaving a glowing core in its wake."
death_sound = 'sound/misc/demon_dies.ogg'
enraged_loot = /obj/item/disk/fauna_research/colossus
@@ -343,6 +343,13 @@ Difficulty: Very Hard
return
floating = on
/mob/living/simple_animal/hostile/megafauna/colossus/generate_random_loot()
var/list/crystalchoices = subtypesof(/obj/machinery/anomalous_crystal)
var/random_crystal = pick(crystalchoices)
var/list/choices = list(/obj/item/organ/internal/vocal_cords/colossus, /obj/item/organ/internal/eyes/cybernetic/eyesofgod, random_crystal)
for(var/I in 1 to 2)
loot += pick_n_take(choices)
/obj/item/projectile/colossus
name ="death bolt"
icon_state= "chronobolt"
@@ -50,8 +50,8 @@ Difficulty: Medium
move_to_delay = 5
ranged = TRUE
pixel_x = -32
crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
loot = list(/obj/structure/closet/crate/necropolis/dragon)
difficulty_ore_modifier = 2
crusher_loot = list(/obj/item/crusher_trophy/tail_spike)
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
var/swooping = NONE
var/player_cooldown = 0
@@ -425,6 +425,13 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/mob/living/simple_animal/hostile/megafauna/dragon/generate_random_loot()
var/list/choices = list(/obj/item/melee/ghost_sword,
/obj/item/lava_staff,
/obj/item/dragons_blood,
list(/obj/item/spellbook/oneuse/sacredflame, /obj/item/gun/magic/wand/fireball))
loot += pick(choices)
/obj/effect/temp_visual/lava_warning
icon_state = "lavastaff_warn"
layer = BELOW_MOB_LAYER
@@ -593,11 +600,14 @@ Difficulty: Medium
melee_damage_lower = 30
mouse_opacity = MOUSE_OPACITY_ICON
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
loot = list()
crusher_loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
attack_action_types = list()
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/generate_random_loot()
return
/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon
name = "space dragon"
desc = "A space carp turned dragon by vile magic. Has the same ferocity of a space carp, but also a much more enabling body."
@@ -646,6 +656,10 @@ Difficulty: Medium
ranged_cooldown = world.time + ranged_cooldown_time
fire_stream()
/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/generate_random_loot()
return
/datum/spell/aoe/repulse/spacedragon
name = "Tail Sweep"
desc = "Throw back attackers with a sweep of your tail."
@@ -56,7 +56,8 @@ Difficulty: Hard
ranged_cooldown_time = 40
aggro_vision_range = 21 //so it can see to one side of the arena to the other
loot = list(/obj/item/hierophant_club)
crusher_loot = list(/obj/item/hierophant_club, /obj/item/crusher_trophy/vortex_talisman)
difficulty_ore_modifier = 2
crusher_loot = list(/obj/item/crusher_trophy/vortex_talisman)
wander = FALSE
internal_gps = /obj/item/gps/internal/hierophant
medal_type = BOSS_MEDAL_HIEROPHANT
@@ -44,7 +44,8 @@ Difficulty: Medium
medal_type = BOSS_MEDAL_LEGION
score_type = LEGION_SCORE
loot = list(/obj/item/storm_staff)
crusher_loot = list(/obj/item/storm_staff, /obj/item/crusher_trophy/empowered_legion_skull)
difficulty_ore_modifier = 3
crusher_loot = list(/obj/item/crusher_trophy/empowered_legion_skull)
enraged_loot = /obj/item/disk/fauna_research/legion
vision_range = 13
elimination = TRUE
@@ -72,22 +73,28 @@ Difficulty: Medium
legiontwo.transform /= 1.5
legiontwo.loot = list()
legiontwo.crusher_loot = list()
/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 = 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.crusher_loot = list(/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.
/mob/living/simple_animal/hostile/megafauna/legion/drop_loot()
for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_list)
if(other != src)
return
..()
/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 = 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.crusher_loot = list(/obj/item/crusher_trophy/empowered_legion_skull)
. = ..()
/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget()
@@ -44,6 +44,8 @@
var/enraged = FALSE
/// Path of the hardmode loot disk, if applicable.
var/enraged_loot
/// How much ore should killing this give
var/difficulty_ore_modifier = 1
/mob/living/simple_animal/hostile/megafauna/Initialize(mapload)
. = ..()
@@ -53,6 +55,7 @@
for(var/action_type in attack_action_types)
var/datum/action/innate/megafauna_attack/attack_action = new action_type()
attack_action.Grant(src)
generate_random_loot()
RegisterSignal(src, COMSIG_HOSTILE_FOUND_TARGET, PROC_REF(hoverboard_deactivation))
/mob/living/simple_animal/hostile/megafauna/Destroy()
@@ -91,8 +94,37 @@
SSblackbox.record_feedback("tally", "megafauna_kills", 1, "[initial(name)]")
return ..()
/mob/living/simple_animal/hostile/megafauna/drop_loot()
var/obj/structure/closet/crate/necropolis/loot_drop = new(get_turf(src))
for(var/item in loot)
new item(loot_drop)
spawn_ore_reward(loot_drop)
/// If the megafauna has a pool of random loot items to pick from, override this proc to have it be set on initialization
/mob/living/simple_animal/hostile/megafauna/proc/generate_random_loot()
return
/// Handling the ore part of the mega reward, the higher the difficulty_ore_modifier the more ore will spawn
/mob/living/simple_animal/hostile/megafauna/proc/spawn_ore_reward(atom/spawn_location)
var/list/common_ore = list(
/obj/item/stack/ore/uranium,
/obj/item/stack/ore/silver,
/obj/item/stack/ore/gold,
/obj/item/stack/ore/plasma,
/obj/item/stack/ore/titanium)
var/list/rare_ore = list(
/obj/item/stack/ore/diamond,
/obj/item/stack/ore/bluespace_crystal)
for(var/ore in common_ore)
var/obj/item/stack/O = new ore(spawn_location)
O.amount = roll(difficulty_ore_modifier * 2, 4 + difficulty_ore_modifier)
for(var/ore in rare_ore)
var/obj/item/stack/O = new ore(spawn_location)
O.amount = roll(difficulty_ore_modifier, 4 + difficulty_ore_modifier)
/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
loot = crusher_loot
loot += crusher_loot
/mob/living/simple_animal/hostile/megafauna/AttackingTarget()
if(recovery_time >= world.time)
@@ -152,9 +184,11 @@
/mob/living/simple_animal/hostile/megafauna/proc/enrage()
if(enraged || ((health / maxHealth) * 100 <= 80))
return
difficulty_ore_modifier += 4 // Hardmode only helps the station more and gives you bragging rights, no special items for hardmode
enraged = TRUE
/mob/living/simple_animal/hostile/megafauna/proc/unrage()
difficulty_ore_modifier -= 4
enraged = FALSE
/mob/living/simple_animal/hostile/megafauna/DestroySurroundings()