diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 48192946ac6..08a823f44be 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -23,7 +23,9 @@
return
user.visible_message("[user] fells [src] with the [W].","You fell [src] with the [W].", "You hear the sound of a tree falling.")
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0)
+ icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "tree_stump"
+ pixel_x = -16
name += " stump"
cut = TRUE
for(var/i=1 to log_amount)
@@ -56,6 +58,15 @@
icon = 'icons/obj/flora/deadtrees.dmi'
icon_state = "tree_1"
+/obj/structure/flora/tree/palm
+ icon = 'icons/misc/beach2.dmi'
+ icon_state = "palm1"
+
+/obj/structure/flora/tree/palm/New()
+ ..()
+ icon_state = pick("palm1","palm2")
+ pixel_x = 0
+
/obj/structure/festivus
name = "festivus pole"
icon = 'icons/obj/flora/pinetrees.dmi'
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index f18a329581a..1ee1da83742 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -278,7 +278,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/megafauna/bubblegum = 2)
+ /mob/living/simple_animal/hostile/megafauna/dragon = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 2, /mob/living/simple_animal/hostile/megafauna/colossus = 2)
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
@@ -561,6 +561,7 @@
if(istype(src, /turf/open/floor/plating/asteroid))
user << "You dig a hole."
gets_dug()
+ layer = TURF_LAYER //In the event that our layer was increased to hide things under the surface
feedback_add_details("pick_used_mining","[W.type]")
if(istype(W,/obj/item/weapon/storage/bag/ore))
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 9e10ed76efe..8b0180c99c7 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -359,4 +359,396 @@ Difficulty: Very Hard
/obj/machinery/smartfridge/black_box/default_deconstruction_crowbar()
return
+///Anomolous Crystal///
+
+/obj/machinery/anomalous_crystal
+ name = "anomalous crystal"
+ desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "anomaly_crystal"
+ luminosity = 8
+ burn_state = LAVA_PROOF
+ pixel_y = -4
+ use_power = 0
+ density = 1
+ languages_spoken = ALL
+ languages_understood = ALL
+ flags = HEAR
+ var/activation_turf = null
+ var/aim_direction = SOUTH
+ var/activation_method = "touch"
+ var/activation_damage_type = null
+ var/last_use_timer = 0
+ var/cooldown_add = 30
+ var/list/affected_targets = list()
+ var/activation_sound = 'sound/effects/break_stone.ogg'
+
+/obj/machinery/anomalous_crystal/New()
+ activation_method = pick("touch","beam","bullet","energy","magic","mob_bump","heat","weapon","speech")
+ ..()
+
+/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
+ ..()
+ if(isliving(speaker))
+ ActivationReaction(speaker,"speech")
+
+/obj/machinery/anomalous_crystal/attack_hand(mob/user)
+ ..()
+ ActivationReaction(user,"touch")
+
+/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params)
+ if(I.is_hot())
+ ActivationReaction(user,"heat")
+ else
+ ActivationReaction(user,"weapon")
+ ..()
+
+/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
+ ..()
+ if(istype(P, /obj/item/projectile/beam))
+ ActivationReaction(P.firer, "beam", P.damage_type)
+ return
+ if(istype(P, /obj/item/projectile/bullet))
+ ActivationReaction(P.firer, "bullet", P.damage_type)
+ return
+ if(istype(P, /obj/item/projectile/energy))
+ ActivationReaction(P.firer, "energy",P.damage_type)
+ return
+ if(istype(P, /obj/item/projectile/magic))
+ ActivationReaction(P.firer, "magic", P.damage_type)
+ return
+
+/obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype)
+ if(world.time < last_use_timer)
+ return 0
+ if(activation_damage_type && activation_damage_type != damtype)
+ return 0
+ if(method != activation_method)
+ return 0
+ last_use_timer = (world.time + cooldown_add)
+ playsound(user, activation_sound, 100, 1)
+ return 1
+
+/obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj)
+ ..()
+ if(ismob(AM))
+ ActivationReaction(AM,"mob_bump")
+
+/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
+ activation_method = "mob_bump"
+ activation_sound = 'sound/items/bikehorn.ogg'
+
+/obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user)
+ if(ishuman(user) && ..() && !(user in affected_targets))
+ var/mob/living/carbon/human/H = user
+ for(var/obj/item/W in H)
+ H.unEquip(W)
+ var/datum/job/clown/C = new /datum/job/clown()
+ C.equip(H)
+ qdel(C)
+ affected_targets.Add(H)
+
+/obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one
+ activation_method = "touch"
+ cooldown_add = 200
+ var/terrain_theme = "winter"
+ var/NewTerrainFloors
+ var/NewTerrainWalls
+ var/NewTerrainChairs
+ var/NewTerrainTables
+ var/list/NewFlora = list()
+ var/florachance = 8
+ var/FloorLayerChange
+
+/obj/machinery/anomalous_crystal/theme_warp/New()
+ ..()
+ terrain_theme = pick("lavaland","winter","jungle","ayy lmao")
+ switch(terrain_theme)
+ if("lavaland")//Depressurizes the place... and free cult metal, I guess.
+ NewTerrainFloors = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
+ NewTerrainWalls = /turf/closed/wall/mineral/cult
+ NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub)
+ florachance = 1
+ FloorLayerChange = 2.6
+ if("winter") //Depressurizes the place, and snow terrain is slow to move in
+ NewTerrainFloors = /turf/open/floor/plating/asteroid/snow/temperatre
+ NewTerrainWalls = /turf/closed/wall/mineral/wood
+ NewTerrainChairs = /obj/structure/chair/wood/normal
+ NewTerrainTables = /obj/structure/table/glass
+ NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both)
+ FloorLayerChange = 2.6
+ if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys.
+ NewTerrainFloors = /turf/open/floor/grass
+ NewTerrainWalls = /turf/closed/wall/mineral/sandstone
+ NewTerrainChairs = /obj/structure/chair/wood
+ NewTerrainTables = /obj/structure/table/wood
+ NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
+ /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/monkey)
+ florachance = 20
+ FloorLayerChange = 2.6
+ if("ayy lmao") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos.
+ NewTerrainFloors = /turf/open/floor/plating/abductor
+ NewTerrainWalls = /turf/closed/wall/mineral/abductor
+ NewTerrainChairs = /obj/structure/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline.
+ NewTerrainTables = /obj/structure/table/abductor
+
+/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method)
+ if(..())
+ var/area/A = get_area(src)
+ if(!A.outdoors && !(A in affected_targets))
+ for(var/atom/Stuff in A)
+ if(isturf(Stuff))
+ var/turf/T = Stuff
+ if((istype(T, /turf/open/space) || istype(T, /turf/open/floor)) && NewTerrainFloors)
+ var/turf/open/O = T.ChangeTurf(NewTerrainFloors)
+ if(O.air)
+ var/datum/gas_mixture/G = O.air
+ G.copy_from_turf(O)
+ if(FloorLayerChange)
+ O.layer = FloorLayerChange
+ if(prob(florachance) && NewFlora.len)
+ var/density_checks = 1
+ for(var/atom/junk in O)
+ if(junk.density)
+ density_checks = 0
+ break
+ if(density_checks)
+ var/atom/Picked = pick(NewFlora)
+ new Picked(O)
+ continue
+ if(istype(T, /turf/closed/wall) && NewTerrainWalls)
+ T.ChangeTurf(NewTerrainWalls)
+ continue
+ if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs)
+ var/obj/structure/chair/Original = Stuff
+ var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
+ C.dir = Original.dir
+ qdel(Stuff)
+ continue
+ if(istype(Stuff, /obj/structure/table) && NewTerrainTables)
+ new NewTerrainTables(Stuff.loc)
+ qdel(Stuff)
+ continue
+ affected_targets += A
+
+/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
+ activation_method = "touch"
+ cooldown_add = 50
+ var/generated_projectile = /obj/item/projectile/beam/emitter
+
+/obj/machinery/anomalous_crystal/emitter/New()
+ ..()
+ generated_projectile = pick(/obj/item/projectile/beam/emitter,/obj/item/projectile/magic/fireball/infernal,/obj/item/projectile/magic/spellblade,
+ /obj/item/projectile/energy/net, /obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray)
+
+/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
+ if(..())
+ var/obj/item/projectile/P = new generated_projectile(get_turf(src))
+ P.dir = dir
+ switch(dir)
+ if(NORTH)
+ P.yo = 20
+ P.xo = 0
+ if(EAST)
+ P.yo = 0
+ P.xo = 20
+ if(WEST)
+ P.yo = 0
+ P.xo = -20
+ else
+ P.yo = -20
+ P.xo = 0
+ P.fire()
+
+/obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople. Cannot revive shadowpeople, so this is a one time thing.
+ activation_method = "touch"
+
+/obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method)
+ if(..())
+ for(var/i in range(1, src))
+ if(ishuman(i))
+ var/mob/living/carbon/human/H = i
+ if(H.stat == DEAD && !is_species(H, /datum/species/shadow))
+ H.set_species(/datum/species/shadow, 1)
+ H.revive(1,0)
+
+/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans
+ activation_method = "touch"
+ var/ready_to_deploy = 0
+
+/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method)
+ if(..() && !ready_to_deploy)
+ ready_to_deploy = 1
+
+/obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user)
+ ..()
+ if(ready_to_deploy)
+ var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be cloned!)",,"Yes","No")
+ if(!be_helper == "No")
+ return
+ var/mob/living/simple_animal/hostile/lightgeist/W = new /mob/living/simple_animal/hostile/lightgeist(get_turf(loc))
+ W.key = user.key
+
+/mob/living/simple_animal/hostile/lightgeist
+ name = "lightgeist"
+ desc = "This small floating creature is a completely unknown form of life... being near it fills you with a sense of tranquility."
+ icon_state = "lightgeist"
+ icon_living = "lightgeist"
+ icon_dead = "butterfly_dead"
+ turns_per_move = 1
+ response_help = "waves away"
+ response_disarm = "brushes aside"
+ response_harm = "disrupts"
+ speak_emote = list("oscillates")
+ maxHealth = 2
+ health = 2
+ harm_intent_damage = 1
+ friendly = "mends"
+ density = 0
+ flying = 1
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ ventcrawler = 2
+ mob_size = MOB_SIZE_TINY
+ gold_core_spawnable = 0
+ verb_say = "warps"
+ verb_ask = "floats inquisitively"
+ verb_exclaim = "zaps"
+ verb_yell = "bangs"
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ luminosity = 4
+ faction = list("neutral")
+ languages_spoken = 0
+ languages_understood = ALL
+ del_on_death = 1
+ var/heal_power = 5
+
+/mob/living/simple_animal/hostile/lightgeist/New()
+ ..()
+ verbs -= /mob/living/verb/pulled
+ verbs -= /mob/verb/me_verb
+
+/mob/living/simple_animal/hostile/lightgeist/AttackingTarget()
+ ..()
+ if(isliving(target) && target != src)
+ var/mob/living/L = target
+ if(L.stat < DEAD)
+ L.heal_overall_damage(heal_power, heal_power, 1)
+ PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(target), "#80F5FF"))
+
+/mob/living/simple_animal/hostile/lightgeist/Life()
+ if(!ckey)
+ death()
+ ..()
+
+
+/obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it. Only works once per item.
+ activation_method = "touch"
+ cooldown_add = 50
+
+/obj/machinery/anomalous_crystal/refresher/ActivationReaction(mob/user, method)
+ if(..())
+ var/list/L
+ var/turf/T = get_step(src, dir)
+ for(var/i in T)
+ if(istype(i, /obj/item) && !istype(i, /obj/item/weapon/storage) && !(i in affected_targets) && !istype(i, /obj/item/weapon/implant) && !istype(i, /obj/item/weapon/implanter) && !istype(i, /obj/item/weapon/disk/nuclear))
+ var/obj/item/W = i
+ if(!W.admin_spawned)
+ L += W
+ var/obj/item/CHOSEN = pick(L)
+ if(CHOSEN)
+ var/A = new CHOSEN.type(T)
+ affected_targets += A
+ qdel(CHOSEN)
+
+/obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU.
+ activation_method = "touch"
+
+/obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method)
+ if(..())
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/mobcheck = 0
+ for(var/i in range(1, src))
+ if(istype(i, /mob/living/simple_animal))
+ var/mob/living/simple_animal/A = i
+ if(A.melee_damage_upper || A.mob_size >= MOB_SIZE_LARGE || A.ckey || A.stat)
+ break
+ A.verbs -= /mob/living/verb/pulled
+ var/obj/structure/closet/stasis/S = new /obj/structure/closet/stasis(A)
+ H.loc = S
+ H.disabilities += MUTE
+ H.status_flags |= GODMODE
+ H.mind.transfer_to(A)
+ var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession
+ A.mind.AddSpell(P)
+ mobcheck = 1
+ break
+ if(!mobcheck)
+ new /mob/living/simple_animal/cockroach(loc) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it
+
+/obj/structure/closet/stasis //Abstract game mechanic workarounds are the best
+ name = "quantum entanglement stasis warp field"
+ desc = "You can hardly comprehend this thing... which is why you can't see it."
+ icon_state = null //This shouldn't even be visible, so if it DOES show up, at least nobody will notice
+ density = 1
+ anchored = 1
+ health = 0
+ var/mob/living/simple_animal/holder_animal
+ var/turf/last_location
+
+/obj/structure/closet/stasis/process()
+ for(var/mob/living/L in src)
+ L.Stun(1)
+ if(holder_animal.stat == DEAD || !istype(loc, /mob/living/simple_animal))
+ dump_contents(1)
+ holder_animal.gib()
+
+/obj/structure/closet/stasis/New(mob/user)
+ ..()
+ holder_animal = user
+ START_PROCESSING(SSobj, src)
+
+/obj/structure/closet/stasis/dump_contents(var/kill = 0)
+ STOP_PROCESSING(SSobj, src)
+ for(var/mob/living/L in src)
+ L.disabilities -= MUTE
+ L.status_flags &= ~GODMODE
+ L.stunned = 0
+ L.update_canmove()
+ holder_animal.mind.transfer_to(L)
+ L.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
+ if(kill || !istype(loc, /mob/living/simple_animal))
+ L.death(0)
+ ..()
+
+/obj/effect/proc_holder/spell/targeted/exit_possession
+ name = "Exit Possession"
+ desc = "Exits the body you are possessing"
+ charge_max = 60
+ clothes_req = 0
+ invocation_type = "none"
+ max_targets = 1
+ range = -1
+ include_user = 1
+ selection_type = "view"
+ action_icon_state = "exit_possession"
+ sound = null
+ smoke_spread = 1
+ smoke_amt = 1
+
+/obj/effect/proc_holder/spell/targeted/exit_possession/cast(list/targets, mob/user = usr)
+ if(!istype(user.loc, /turf/open/floor))
+ return
+ var/datum/mind/target_mind = user.mind
+ for(var/i in user)
+ if(istype(i, /obj/structure/closet/stasis))
+ var/obj/structure/closet/stasis/S = i
+ S.dump_contents()
+ qdel(S)
+ break
+ user.gib()
+ target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
+
+
#undef MEDAL_PREFIX
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 03e67a1c927..58f922a9430 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 980c95fa776..2c6505b1e82 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index 9123949dc7c..d2dcc4690b6 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ