diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index a205133b73b..1e63acb8d7a 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -442,17 +442,33 @@
src.used = TRUE
+
+
+
+
+///Bosses
+
+
+
+
+//Dragon
+
/obj/structure/closet/crate/necropolis/dragon
name = "dragon chest"
/obj/structure/closet/crate/necropolis/dragon/New()
..()
- var/loot = rand(1,2)
+ var/loot = rand(1,4)
switch(loot)
if(1)
new /obj/item/weapon/melee/ghost_sword(src)
if(2)
new /obj/item/weapon/lava_staff(src)
+ if(3)
+ new /obj/item/weapon/spellbook/oneuse/fireball(src)
+ new /obj/item/weapon/gun/magic/wand/fireball(src)
+ if(4)
+ new /obj/item/weapon/dragons_blood(src)
/obj/item/weapon/melee/ghost_sword
name = "spectral blade"
@@ -549,7 +565,7 @@
return
var/mob/living/carbon/human/H = user
- var/random = rand(1,3)
+ var/random = rand(1,4)
switch(random)
if(1)
@@ -561,6 +577,9 @@
user << "You don't feel so good..."
message_admins("[key_name_admin(user)](FLW) has started transforming into a dragon via dragon's blood.")
H.ForceContractDisease(new /datum/disease/transformation/dragon(0))
+ if(4)
+ user << "You feel like you could walk straight through lava now."
+ H.weather_immunities |= "lava"
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
qdel(src)
@@ -578,7 +597,7 @@
stage2 = list("Your skin feels scaley.")
stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.")
stage4 = list("Your blood burns.")
- stage5 = list("You're a fucking dragon.")
+ stage5 = list("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.")
new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
@@ -620,3 +639,74 @@
O.ChangeTurf(turf_type)
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
timer = world.time + cooldown
+
+///Bubblegum
+
+/obj/item/mayhem
+ name = "mayhem in a bottle"
+ desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+/obj/item/mayhem/attack_self(mob/user)
+ for(var/mob/living/carbon/human/H in range(7,user))
+ spawn()
+ var/obj/effect/mine/pickup/bloodbath/B = new(H)
+ B.mineEffect(H)
+ user << "You shatter the bottle!"
+ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
+ qdel(src)
+
+/obj/structure/closet/crate/necropolis/bubblegum
+ name = "bubblegum chest"
+
+/obj/structure/closet/crate/necropolis/bubblegum/New()
+ ..()
+ var/loot = rand(1,3)
+ switch(loot)
+ if(1)
+ new /obj/item/weapon/antag_spawner/slaughter_demon(src)
+ if(2)
+ new /obj/item/mayhem(src)
+ if(3)
+ new /obj/item/blood_contract(src)
+
+/obj/item/blood_contract
+ name = "blood contract"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "scroll2"
+ color = "#FF0000"
+ desc = "Mark your target for death. "
+ var/used = FALSE
+
+/obj/item/blood_contract/attack_self(mob/user)
+ if(used)
+ return
+ used = TRUE
+ var/choice = input(user,"Who do you want dead?","Pick Reinforcement") as null|anything in player_list
+
+ if(!(isliving(choice)))
+ user << "[choice] is already dead!"
+ used = FALSE
+ else
+
+ var/mob/living/L = choice
+
+ message_admins("[L] has been marked for death!")
+
+ var/datum/objective/survive/survive = new
+ survive.owner = L.mind
+ L.mind.objectives += survive
+ L << "You've been marked for death! Don't let the demons get you!"
+ L.color = "#FF0000"
+ spawn()
+ var/obj/effect/mine/pickup/bloodbath/B = new(L)
+ B.mineEffect(L)
+
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H == L)
+ continue
+ H << "You have an overwhelming desire to kill [L]. They have been marked red! Go kill them!"
+ H.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife/butcher(H), slot_l_hand)
+
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 5e8c8e956ef..d09d0d61306 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -263,7 +263,7 @@
/turf/open/floor/plating/asteroid/airless/cave/volcanic
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 10, /mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30,
- /mob/living/simple_animal/hostile/spawner/lavaland = 2, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, /mob/living/simple_animal/hostile/megafauna/dragon = 2)
+ /mob/living/simple_animal/hostile/spawner/lavaland = 2, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, /mob/living/simple_animal/hostile/megafauna/dragon = 1, /mob/living/simple_animal/hostile/megafauna/bubblegum = 0.5, /mob/living/simple_animal/hostile/megafauna/bubblegum = 0.5)
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = "o2=14;n2=23;TEMP=300"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
new file mode 100644
index 00000000000..c54539d599d
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -0,0 +1,167 @@
+/mob/living/simple_animal/hostile/megafauna/bubblegum
+ name = "bubblegum"
+ desc = "In what passes for a heirarchy among slaughter demons, this one is king."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "rends"
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ icon_state = "bubblegum"
+ icon_living = "bubblegum"
+ icon_dead = ""
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/96x96megafauna.dmi'
+ faction = list("mining")
+ weather_immunities = list("lava","ash")
+ speak_emote = list("gurgles")
+ armour_penetration = 40
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ flying = 1
+ mob_size = MOB_SIZE_LARGE
+ pixel_x = -32
+ del_on_death = 1
+ aggro_vision_range = 18
+ idle_vision_range = 5
+ loot = list(/obj/structure/closet/crate/necropolis/dragon)
+ var/charging = 0
+ deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... "
+ death_sound = 'sound/magic/enter_blood.ogg'
+
+/obj/item/device/gps/internal/bubblegum
+ icon_state = null
+ gpstag = "Bloody Signal"
+ desc = "You're not quite sure how a signal can be bloody."
+ invisibility = 100
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Life()
+ ..()
+/* if(!charging)
+ blood_warp()*/
+ move_to_delay = Clamp(round((health/maxHealth) * 10), 5, 10)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
+ var/anger_modifier = Clamp(((maxHealth - health)/50),0,20)
+ ranged_cooldown = world.time + ranged_cooldown_time
+
+ if(!charging)
+ blood_warp()
+
+ if(prob(25))
+ blood_spray()
+
+ else if(prob(5+anger_modifier/2))
+ slaughterlings()
+ else
+ if(health > maxHealth/2 && !client && !charging)
+ charge()
+ else
+ charge()
+ sleep(10)
+ charge()
+ sleep(10)
+ charge()
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/New()
+ ..()
+ for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in mob_list)
+ if(B != src)
+ qdel(src) //There can be only one
+ break
+ var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
+ AddSpell(bloodspell)
+ if(istype(loc, /obj/effect/dummy/slaughter))
+ bloodspell.phased = 1
+ new/obj/item/device/gps/internal/bubblegum(src)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
+ if(charging)
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
+ if(!stat)
+ playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
+ if(charging)
+ PoolOrNew(/obj/effect/overlay/temp/decoy, list(loc,src))
+ for(var/turf/T in range(src, 1))
+ T.singularity_pull(src, 7)
+ . = ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge()
+ var/turf/T = get_step_away(target, src)
+ charging = 1
+ new/obj/effect/overlay/temp/dragon_swoop(T)
+ sleep(5)
+ throw_at(T, 7, 1, src, 0)
+ charging = 0
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Bump(atom/A)
+ if(charging)
+ if(istype(A, /turf) || istype(A, /obj) && A.density)
+ A.ex_act(2)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/A)
+ if(!charging)
+ return ..()
+
+ else if(A)
+ if(isliving(A))
+ var/mob/living/L = A
+ L.visible_message("[src] slams into [L]!", "[src] slams into you!")
+ L.apply_damage(40, BRUTE)
+ playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
+ shake_camera(L, 4, 3)
+ shake_camera(src, 2, 3)
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
+ L.throw_at_fast(throwtarget)
+
+ charging = 0
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
+// if(blood_warp_cooldown > world.time)
+// return
+ var/found_bloodpool = FALSE
+ for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2))
+ found_bloodpool = TRUE
+ if(found_bloodpool)
+ for(var/obj/effect/decal/cleanable/blood/H in view(target,2))
+ visible_message("[src] sinks into the blood...")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ forceMove(get_turf(H))
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ visible_message("And springs back out!")
+ break
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray()
+ visible_message("[src] sprays a stream of gore!")
+ spawn(0)
+ var/turf/E = get_edge_target_turf(src, src.dir)
+ var/range = 10
+ for(var/turf/open/J in getline(src,E))
+ if(!range)
+ break
+ playsound(J,'sound/effects/splat.ogg', 100, 1, -1)
+ new /obj/effect/decal/cleanable/blood(J)
+ range--
+ sleep(1)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings()
+ visible_message("[src] summons a shoal of slaughterlings!")
+ for(var/obj/effect/decal/cleanable/blood/H in range(src, 10))
+ if(prob(25))
+ new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter(H.loc)
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter
+ name = "slaughterling"
+ desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you."
+ faction = list("mining")
+ weather_immunities = list("lava","ash")
+
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
new file mode 100644
index 00000000000..4ee22aa136f
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -0,0 +1,367 @@
+/mob/living/simple_animal/hostile/megafauna/colossus
+ name = "colossus"
+ desc = "A monstrous creature protected by heavy shielding."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "judges"
+ attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg'
+ icon_state = "eva"
+ icon_living = "eva"
+ icon_dead = "dragon_dead"
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/96x96megafauna.dmi'
+ faction = list("mining")
+ weather_immunities = list("lava","ash")
+ speak_emote = list("roars")
+ luminosity = 3
+ armour_penetration = 40
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ flying = 1
+ mob_size = MOB_SIZE_LARGE
+ pixel_x = -32
+ aggro_vision_range = 18
+ idle_vision_range = 5
+ del_on_death = 1
+ loot = list(/obj/machinery/smartfridge/black_box)
+ butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
+
+ deathmessage = "disintegrates, leaving a glowing core."
+ death_sound = 'sound/magic/demon_dies.ogg'
+ damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ var/anger_modifier = 0
+ var/obj/item/device/gps/internal
+
+/mob/living/simple_animal/hostile/megafauna/colossus/OpenFire()
+ anger_modifier = Clamp(((maxHealth - health)/50),0,20)
+ ranged_cooldown = world.time + 120
+
+ if(prob(20+anger_modifier)) //Major attack
+ telegraph()
+
+ if(health < maxHealth/3)
+ double_spiral()
+ else
+ visible_message("\"Judgement.\"")
+ if(prob(50))
+ spiral_shoot()
+ else
+ spiral_shoot(1)
+
+ else if(prob(20))
+ ranged_cooldown = world.time + 30
+ random_shots()
+ else
+ if(prob(70))
+ ranged_cooldown = world.time + 20
+ blast()
+ else
+ ranged_cooldown = world.time + 40
+ diagonals()
+ sleep(10)
+ cardinals()
+ sleep(10)
+ diagonals()
+ sleep(10)
+ cardinals()
+
+
+/mob/living/simple_animal/hostile/megafauna/colossus/New()
+ ..()
+ internal = new/obj/item/device/gps/internal/colossus(src)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/Destroy()
+ qdel(internal)
+ . = ..()
+
+/obj/effect/overlay/temp/at_shield
+ name = "anti-toolbox field"
+ desc = "A shimmering forcefield protecting the colossus."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "at_shield2"
+ layer = FLY_LAYER
+ luminosity = 2
+ duration = 80
+ var/target
+
+/obj/effect/overlay/temp/at_shield/New()
+ ..()
+ spawn()
+ orbit(target, 0, FALSE, 0, 0, FALSE, TRUE)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
+ if(!stat)
+ var/obj/effect/overlay/temp/at_shield/AT = new(src.loc)
+ AT.target = src
+ var/random_x = rand(-32, 32)
+ AT.pixel_x += random_x
+
+ var/random_y = rand(0, 72)
+ AT.pixel_y += random_y
+ ..()
+
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral()
+ visible_message("\"Die\"")
+
+ sleep(10)
+ spawn()
+ spiral_shoot()
+ spawn()
+ spiral_shoot(1)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = 0)
+ spawn()
+ var/counter = 1
+ var/turf/marker
+ for(var/i in 1 to 80)
+ switch(counter)
+ if(1)
+ marker = locate(x,y - 2,z)
+ if(2)
+ marker = locate(x - 1,y - 2,z)
+ if(3)
+ marker = locate(x - 2, y - 2,z)
+ if(4)
+ marker = locate(x - 2,y - 1,z)
+ if(5)
+ marker = locate (x -2 ,y,z)
+ if(6)
+ marker = locate(x - 2, y+1,z)
+ if(7)
+ marker = locate(x - 2, y + 2, z)
+ if(8)
+ marker = locate(x - 1, y + 2,z)
+ if(9)
+ marker = locate(x, y + 2,z)
+ if(10)
+ marker = locate(x + 1, y+2,z)
+ if(11)
+ marker = locate(x+ 2, y + 2,z)
+ if(12)
+ marker = locate(x+2,y+1,z)
+ if(13)
+ marker = locate(x+2,y,z)
+ if(14)
+ marker = locate(x+2, y - 1, z)
+ if(15)
+ marker = locate(x+2, y - 2, z)
+ if(16)
+ marker = locate(x+1, y -2, z)
+
+ if(negative)
+ counter--
+ else
+ counter++
+ if(counter > 16)
+ counter = 0
+ if(counter < 0)
+ counter = 16
+ shoot_projectile(marker)
+ sleep(1)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker)
+ var/turf/startloc = get_turf(src)
+ var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
+ playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 100, 1)
+ P.current = startloc
+ P.starting = startloc
+ P.firer = src
+ P.yo = marker.y - startloc.y
+ P.xo = marker.x - startloc.x
+ P.original = marker
+ P.fire()
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots()
+ for(var/turf/turf in range(12,get_turf(src)))
+ if(prob(5))
+ shoot_projectile(turf)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast()
+ spawn()
+ for(var/turf/turf in range(1, target))
+ shoot_projectile(turf)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/diagonals()
+ var/turf/T = locate(x + 2, y + 2, z)
+ shoot_projectile(T)
+ T = locate(x + 2, y -2, z)
+ shoot_projectile(T)
+ T = locate(x - 2, y + 2, z)
+ shoot_projectile(T)
+ T = locate(x - 2, y - 2, z)
+ shoot_projectile(T)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/cardinals()
+ var/list/attack_dirs = list(NORTH,EAST,SOUTH,WEST)
+ for(var/d in attack_dirs)
+ var/turf/E = get_edge_target_turf(src, d)
+ shoot_projectile(E)
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph()
+ for(var/mob/M in range(10,src))
+ if(M.client)
+ M.client.color = rgb(200, 0, 0)
+ spawn(1)
+ M.client.color = initial(M.client.color)
+ shake_camera(M, 4, 3)
+ playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 200, 1)
+
+
+/mob/living/simple_animal/hostile/megafauna/colossus/proc/seeking_laser()
+ visible_message("\"You can't run.\"")
+ var/obj/effect/overlay/temp/seeking_beam/B = new(get_turf(src))
+ B.target = target
+ B.firer = src
+
+/obj/effect/overlay/temp/seeking_beam
+ name = "disintegration ball"
+ desc = "Get out of the way!"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield-cult"
+ density = 1
+ luminosity = 1
+ var/target
+ var/firer
+ duration = 100
+
+/obj/effect/overlay/temp/seeking_beam/New()
+ ..()
+ spawn()
+ while(loc)
+ step_towards(src, target)
+ sleep(1)
+
+/obj/effect/overlay/temp/seeking_beam/process()
+ step_towards(src, target)
+
+/obj/effect/overlay/temp/seeking_beam/Crossed(AM as mob|obj)
+ ..()
+ collision(AM)
+
+/obj/effect/overlay/temp/seeking_beam/Bumped(AM as mob|obj)
+ ..()
+ collision(AM)
+
+/obj/effect/overlay/temp/seeking_beam/Bump(AM as mob|obj)
+ ..()
+ collision(AM)
+
+/obj/effect/overlay/temp/seeking_beam/proc/collision(AM as mob|obj)
+ if(AM == firer)
+ return
+ if(isliving(AM))
+ var/mob/living/M = AM
+ visible_message("[M] is disintegrated by the disintegration ball!")
+ M.dust()
+ else if(istype(AM, /obj/item))
+ var/obj/item/I = AM
+ I.burn()
+
+/obj/item/projectile/colossus
+ name ="death bolt"
+ icon_state= "chronobolt"
+ damage = 25
+ armour_penetration = 100
+ speed = 2
+ eyeblur = 0
+ damage_type = BRUTE
+ pass_flags = PASSTABLE
+
+/obj/item/projectile/colossus/on_hit(atom/target, blocked = 0)
+ . = ..()
+ if(istype(target,/turf/)||istype(target,/obj/structure/))
+ target.ex_act(2)
+
+
+/obj/item/device/gps/internal/colossus
+ icon_state = null
+ gpstag = "Angelic Signal"
+ desc = "Get in the fucking robot."
+ invisibility = 100
+
+
+
+//Black Box
+
+/obj/machinery/smartfridge/black_box
+ name = "black box"
+ desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_on = "blackbox"
+ icon_off = "blackbox"
+ luminosity = 8
+ max_n_of_items = 10
+ pixel_y = -4
+ use_power = 0
+ var/duplicate = FALSE
+ var/memory_saved = FALSE
+ var/list/stored_items = list()
+
+/obj/machinery/smartfridge/black_box/accept_check(obj/item/O)
+ if(istype(O, /obj/item))
+ return 1
+ return 0
+
+/obj/machinery/smartfridge/black_box/New()
+ ..()
+ for(var/obj/machinery/smartfridge/black_box/B in machines)
+ if(B != src)
+ duplicate = 1
+ qdel(src)
+ ReadMemory()
+
+/obj/machinery/smartfridge/black_box/process()
+ ..()
+ if(ticker.current_state == GAME_STATE_FINISHED && !memory_saved)
+ WriteMemory()
+
+/obj/machinery/smartfridge/black_box/proc/WriteMemory()
+ var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
+ stored_items = list()
+ for(var/obj/I in component_parts)
+ qdel(I)
+ for(var/obj/O in contents)
+ stored_items += O.type
+ S["stored_items"] << stored_items
+ memory_saved = TRUE
+
+/obj/machinery/smartfridge/black_box/proc/ReadMemory()
+ var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
+ S["stored_items"] >> stored_items
+
+ if(isnull(stored_items))
+ stored_items = list()
+
+ for(var/item in stored_items)
+ new item(src)
+
+
+/obj/machinery/smartfridge/black_box/Destroy()
+ if(duplicate)
+ return ..()
+ else
+ return QDEL_HINT_LETMELIVE
+
+
+//No taking it apart
+
+/obj/machinery/smartfridge/black_box/default_deconstruction_screwdriver()
+ return
+
+/obj/machinery/smartfridge/black_box/exchange_parts()
+ return
+
+
+/obj/machinery/smartfridge/black_box/default_pry_open()
+ return
+
+
+/obj/machinery/smartfridge/black_box/default_unfasten_wrench()
+ return
+
+/obj/machinery/smartfridge/black_box/default_deconstruction_crowbar()
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 6033303c1bd..cf826039d38 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -59,7 +59,7 @@
src.visible_message(
"[src] devours [L]!",
"You feast on [L], restoring your health!")
- adjustBruteLoss(-L.maxHealth)
+ adjustBruteLoss(-L.maxHealth/2)
L.gib()
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
@@ -224,8 +224,8 @@
/mob/living/simple_animal/hostile/megafauna/dragon/lesser
name = "lesser ash drake"
- maxHealth = 750
- health = 750
+ maxHealth = 300
+ health = 300
melee_damage_upper = 30
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
diff --git a/icons/mob/lavaland/96x96megafauna.dmi b/icons/mob/lavaland/96x96megafauna.dmi
new file mode 100644
index 00000000000..fab005c7167
Binary files /dev/null and b/icons/mob/lavaland/96x96megafauna.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index ca306698982..93bd2aa1b23 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index a1062f3055f..d1c142e42e7 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1456,6 +1456,8 @@
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"