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