diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 5baea0ba429..1e66100e551 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -16,6 +16,7 @@
#define ispodperson(A) (is_species(A, /datum/species/podperson))
#define isflyperson(A) (is_species(A, /datum/species/fly))
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
+#define isshadowperson(A) (is_species(A, /datum/species/shadow))
#define iszombie(A) (is_species(A, /datum/species/zombie))
#define ishumanbasic(A) (is_species(A, /datum/species/human))
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 6509d415684..edefd3b9f66 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -28,10 +28,11 @@
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/grass
- name = "Grass patch"
+ name = "grass patch"
icon_state = "grass"
floor_tile = /obj/item/stack/tile/grass
broken_states = list("sand")
+ var/ore_type = /obj/item/weapon/ore/glass
/turf/open/floor/grass/New()
..()
@@ -39,13 +40,47 @@
update_icon()
/turf/open/floor/grass/attackby(obj/item/C, mob/user, params)
+ if(istype(C, /obj/item/weapon/shovel) && params)
+ new ore_type(src)
+ new ore_type(src) //Make some sand if you shovel grass
+ user << "You shovel [src]."
+ make_plating()
if(..())
return
- if(istype(C, /obj/item/weapon/shovel))
- new /obj/item/weapon/ore/glass(src)
- new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass
- user << "You shovel the grass."
- make_plating()
+
+/turf/open/floor/grass/snow
+ name = "snow"
+ icon = 'icons/turf/snow.dmi'
+ desc = "Looks cold."
+ icon_state = "snow"
+ ore_type = /obj/item/stack/sheet/mineral/snow
+ planetary_atmos = TRUE
+ floor_tile = null
+ initial_gas_mix = "o2=22;n2=82;TEMP=180"
+ slowdown = 2
+
+
+/turf/open/floor/grass/snow/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/crowbar))//You need to dig this turf out instead of crowbarring it
+ return
+ ..()
+
+/turf/open/floor/grass/snow/basalt //By your powers combined, I am captain planet
+ name = "volcanic floor"
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "basalt"
+ ore_type = /obj/item/weapon/ore/glass/basalt
+ initial_gas_mix = "o2=14;n2=23;TEMP=300"
+ slowdown = 0
+
+/turf/open/floor/grass/snow/basalt/New()
+ ..()
+ if(prob(15))
+ icon_state = "basalt[rand(0, 12)]"
+ switch(icon_state)
+ if("basalt1", "basalt2", "basalt3")
+ SetLuminosity(1, 1)
+
/turf/open/floor/carpet
name = "Carpet"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 9b02354edf3..367308e0e36 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -507,6 +507,9 @@
/turf/open/floor/plating/asteroid/snow/temperatre
initial_gas_mix = "TEMP=255.37"
+/turf/open/floor/plating/asteroid/snow/atmosphere
+ initial_gas_mix = "o2=22;n2=82;TEMP=180"
+
/turf/open/floor/plating/asteroid/New()
var/proper_name = name
..()
@@ -561,7 +564,6 @@
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 8b0180c99c7..a8f7b491bc9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -46,7 +46,7 @@ Difficulty: Very Hard
del_on_death = 1
medal_type = MEDAL_PREFIX
score_type = COLOSSUS_SCORE
- loot = list(/obj/machinery/smartfridge/black_box)
+ loot = list(/obj/machinery/anomalous_crystal/random)
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 in its wake."
death_sound = 'sound/magic/demon_dies.ogg'
@@ -368,14 +368,11 @@ Difficulty: Very Hard
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
@@ -384,7 +381,7 @@ Difficulty: Very Hard
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")
+ activation_method = pick("touch","laser","bullet","energy","magic","mob_bump","heat","weapon","speech")
..()
/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
@@ -405,18 +402,10 @@ Difficulty: Very Hard
/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
+ ActivationReaction(P.firer, P.flag, P.damage_type)
/obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype)
if(world.time < last_use_timer)
@@ -434,12 +423,17 @@ Difficulty: Very Hard
if(ismob(AM))
ActivationReaction(AM,"mob_bump")
+/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot
+ var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random)
+ new random_crystal(loc)
+ qdel(src)
+
/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))
+ if(..() && ishuman(user) && !(user in affected_targets))
var/mob/living/carbon/human/H = user
for(var/obj/item/W in H)
H.unEquip(W)
@@ -448,6 +442,10 @@ Difficulty: Very Hard
qdel(C)
affected_targets.Add(H)
+/obj/machinery/anomalous_crystal/honk/New()
+ ..()
+ activation_method = pick("mob_bump","speech")
+
/obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one
activation_method = "touch"
cooldown_add = 200
@@ -458,25 +456,22 @@ Difficulty: Very Hard
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
+ NewTerrainFloors = /turf/open/floor/grass/snow/basalt
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
+ if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway.
+ NewTerrainFloors = /turf/open/floor/grass/snow
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
@@ -485,7 +480,6 @@ Difficulty: Very Hard
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
@@ -504,17 +498,9 @@ Difficulty: Very Hard
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)
+ if(prob(florachance) && NewFlora.len && !is_blocked_turf(O))
+ var/atom/Picked = pick(NewFlora)
+ new Picked(O)
continue
if(istype(T, /turf/closed/wall) && NewTerrainWalls)
T.ChangeTurf(NewTerrainWalls)
@@ -522,12 +508,11 @@ Difficulty: Very Hard
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
+ C.setDir(Original.dir)
qdel(Stuff)
continue
if(istype(Stuff, /obj/structure/table) && NewTerrainTables)
new NewTerrainTables(Stuff.loc)
- qdel(Stuff)
continue
affected_targets += A
@@ -544,7 +529,7 @@ Difficulty: Very Hard
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
if(..())
var/obj/item/projectile/P = new generated_projectile(get_turf(src))
- P.dir = dir
+ P.setDir(dir)
switch(dir)
if(NORTH)
P.yo = 20
@@ -568,7 +553,7 @@ Difficulty: Very Hard
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))
+ if(H.stat == DEAD && !isshadowperson(H))
H.set_species(/datum/species/shadow, 1)
H.revive(1,0)
@@ -579,6 +564,7 @@ Difficulty: Very Hard
/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method)
if(..() && !ready_to_deploy)
ready_to_deploy = 1
+ notify_ghosts("An anomalous crystal has been activated in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK)
/obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user)
..()
@@ -615,12 +601,15 @@ Difficulty: Very Hard
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
+ unsuitable_atmos_damage = 0
+ flying = 1
+ minbodytemp = 0
+ maxbodytemp = 1500
var/heal_power = 5
/mob/living/simple_animal/hostile/lightgeist/New()
@@ -667,27 +656,18 @@ Difficulty: Very Hard
/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
+ for(var/mob/living/simple_animal/A in range(1, src))
+ if(A.melee_damage_upper > 5 || A.mob_size >= MOB_SIZE_LARGE || A.ckey || A.stat)
break
+ var/obj/structure/closet/stasis/S = new /obj/structure/closet/stasis(A)
+ user.forceMove(S)
+ 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
+/obj/structure/closet/stasis
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
@@ -695,33 +675,48 @@ Difficulty: Very Hard
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))
+ if(!isanimal(loc))
dump_contents(1)
- holder_animal.gib()
+ return
+ if(holder_animal)
+ if(holder_animal.stat == DEAD)
+ dump_contents(1)
+ holder_animal.gib()
-/obj/structure/closet/stasis/New(mob/user)
+/obj/structure/closet/stasis/New()
..()
- holder_animal = user
+ if(isanimal(loc))
+ holder_animal = loc
START_PROCESSING(SSobj, src)
+/obj/structure/closet/stasis/Entered(atom/A)
+ if(isliving(A) && holder_animal)
+ var/mob/living/L = A
+ L.notransform = 1
+ L.disabilities |= MUTE
+ L.status_flags |= GODMODE
+ L.mind.transfer_to(holder_animal)
+ var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession
+ holder_animal.mind.AddSpell(P)
+ holder_animal.verbs -= /mob/living/verb/pulled
+
/obj/structure/closet/stasis/dump_contents(var/kill = 0)
STOP_PROCESSING(SSobj, src)
for(var/mob/living/L in src)
- L.disabilities -= MUTE
+ L.disabilities &= ~MUTE
L.status_flags &= ~GODMODE
- L.stunned = 0
- L.update_canmove()
+ L.notransform = 0
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))
+ if(kill || !isanimal(loc))
L.death(0)
..()
+/obj/structure/closet/stasis/emp_act()
+ return
+
/obj/effect/proc_holder/spell/targeted/exit_possession
name = "Exit Possession"
desc = "Exits the body you are possessing"
@@ -734,8 +729,6 @@ Difficulty: Very Hard
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))