diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index 48a346c8cebf..1c240ca8d3f9 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -480,3 +480,19 @@ base_icon_state = "sepia" desc = "Well, the flow of time is normal on these tiles, weird." floor_tile = /obj/item/stack/tile/iron/sepia + +/turf/open/floor/iron/snowed + icon_state = "snow" + base_icon_state = "snow" + icon = 'icons/turf/snow.dmi' + desc = "The stations floor tiles are covered in heaping of snow." + slowdown = 2 + bullet_sizzle = TRUE + footstep = FOOTSTEP_SAND + barefootstep = FOOTSTEP_SAND + clawfootstep = FOOTSTEP_SAND + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + +/turf/open/floor/iron/snowed/Initialize(mapload) + . = ..() + AddElement(/datum/element/diggable, /obj/item/stack/sheet/mineral/snow, 2) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 6b51db93bdf6..d3b2bb374ff6 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -106,9 +106,9 @@ bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED commissioned = FALSE -/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize(mapload) +/mob/living/simple_animal/bot/secbot/beepsky/big/Initialize(mapload) . = ..() - update_transform(1.2) + update_transform(1.3) //monkestation edit end /mob/living/simple_animal/bot/secbot/beepsky/explode() diff --git a/icons/effects/anomalies.dmi b/icons/effects/anomalies.dmi index d3d0233f28bf..a7f5fc1f08a3 100644 Binary files a/icons/effects/anomalies.dmi and b/icons/effects/anomalies.dmi differ diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_clown.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_clown.dm new file mode 100644 index 000000000000..bbac912ad928 --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_clown.dm @@ -0,0 +1,66 @@ +#define HONK_RANGE 3 +//clwun nomaly honk +/obj/effect/anomaly/clown + name = "Honking Anomaly" + icon_state = "static" + desc = "An anomaly that smells faintly of bananas and lubricant." + color = "#86c4dd" + lifespan = 40 SECONDS //fast and slippery + var/active = TRUE + var/list/comedysounds = list('sound/items/SitcomLaugh1.ogg', 'sound/items/SitcomLaugh2.ogg', 'sound/items/SitcomLaugh3.ogg') + var/static/list/clown_spawns = list( + /mob/living/basic/clown/clownhulk/chlown = 6, + /mob/living/basic/clown = 66, + /obj/item/grown/bananapeel = 33, + /obj/item/stack/ore/bananium = 12, + /obj/item/bikehorn = 15) + +/obj/effect/anomaly/clown/Initialize(mapload, new_lifespan) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/anomaly/clown/Destroy() + . = ..() + RemoveElement(/datum/element/connect_loc) + +/obj/effect/anomaly/clown/proc/on_entered(datum/source, atom/movable/atom_movable) + SIGNAL_HANDLER + + if(active && iscarbon(atom_movable)) + var/mob/living/carbon/target = atom_movable + active = FALSE + target.slip(4 SECONDS, src) + playsound(src, pick(comedysounds), vol = 50, vary = 1) + +/obj/effect/anomaly/clown/anomalyEffect(seconds_per_tick) + ..() + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + var/turf/open/current_location = get_turf(src) + current_location.MakeSlippery(TURF_WET_LUBE, min_wet_time = 20 SECONDS, wet_time_to_add = 5 SECONDS) + if(active) + active = FALSE + playsound(src, 'sound/items/bikehorn.ogg', vol = 50) + var/selected_spawn = pick_weight(clown_spawns) + new selected_spawn(src.loc) + return + active = TRUE + +/obj/effect/anomaly/clown/detonate() + playsound(src, 'sound/items/airhorn.ogg', vol = 100, vary = 1) + + for(var/mob/living/carbon/target in (hearers(HONK_RANGE, src))) + to_chat(target, "HONK") + target.SetSleeping(0) + target.adjust_stutter(10 SECONDS) + var/obj/item/organ/internal/ears/ears = target.get_organ_slot(ORGAN_SLOT_EARS) + ears?.adjustEarDamage(0, 2 SECONDS) + target.Knockdown(2 SECONDS) + target.set_jitter_if_lower(50 SECONDS) + +#undef HONK_RANGE diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_fluid.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_fluid.dm new file mode 100644 index 000000000000..10926ad8a5a7 --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_fluid.dm @@ -0,0 +1,36 @@ +#define NORMAL_FLUID_AMOUNT 25 +#define DANGEROUS_FLUID_AMOUNT 100 + +//fully automated piss floods +/obj/effect/anomaly/fluid + name = "Fluidic Anomaly" + desc = "An anomaly pulling in liquids from places unknown. Better get the mop." + icon_state = "bluestream_fade" + var/dangerous = FALSE + var/list/fluid_choices = list() + +/obj/effect/anomaly/fluid/Initialize(mapload, new_lifespan) + . = ..() + if(prob(10)) + dangerous = TRUE //Unrestricts the reagent choice and increases fluid amounts + + for(var/i = 1, i <= rand(1,5), i++) //Between 1 and 5 random chemicals + fluid_choices += dangerous ? get_random_reagent_id_unrestricted() : get_random_reagent_id() + +/obj/effect/anomaly/fluid/anomalyEffect(seconds_per_tick) + ..() + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + var/turf/spawn_point = get_turf(src) + spawn_point.add_liquid(pick(fluid_choices), dangerous ? DANGEROUS_FLUID_AMOUNT : NORMAL_FLUID_AMOUNT, chem_temp = rand(BODYTEMP_COLD_DAMAGE_LIMIT, BODYTEMP_HEAT_DAMAGE_LIMIT)) + +/obj/effect/anomaly/fluid/detonate() + if(isinspace(src) || !isopenturf(get_turf(src))) + return + var/turf/spawn_point = get_turf(src) + spawn_point.add_liquid(pick(fluid_choices), (dangerous ? DANGEROUS_FLUID_AMOUNT : NORMAL_FLUID_AMOUNT) * 5, chem_temp = rand(BODYTEMP_COLD_DAMAGE_LIMIT, BODYTEMP_HEAT_DAMAGE_LIMIT)) + +#undef NORMAL_FLUID_AMOUNT +#undef DANGEROUS_FLUID_AMOUNT diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_frost.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_frost.dm new file mode 100644 index 000000000000..fe9b0cc207cf --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_frost.dm @@ -0,0 +1,51 @@ +#define MIN_REPLACEMENT 2 +#define MAX_REPLACEMENT 7 +#define MAX_RANGE 7 + +//THE STATION MUST SURVIVE +/obj/effect/anomaly/frost + name = "glacial anomaly" + icon_state = "impact_laser_blue" + /// How many seconds between each gas release + var/releasedelay = 10 + +/obj/effect/anomaly/frost/anomalyEffect(seconds_per_tick) + ..() + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + var/turf/current_location = get_turf(src) + var/list/valid_turfs = list() + var/static/list/blacklisted_turfs = typecacheof(list( + /turf/closed, + /turf/open/space, + /turf/open/lava, + /turf/open/chasm, + /turf/open/floor/iron/snowed)) + + current_location.atmos_spawn_air ("o2=2;freon=1;water_vapor=8;TEMP=180") + + for(var/searched_turfs in circle_view_turfs(src, MAX_RANGE)) + if(is_type_in_typecache(searched_turfs, blacklisted_turfs)) + continue + else + valid_turfs |= searched_turfs + for(var/i = 1 to min(rand(MIN_REPLACEMENT, MAX_REPLACEMENT), length(valid_turfs)))//Replace 2-7 tiles with snow + var/turf/searched_turfs = pick(valid_turfs) + if(searched_turfs) + if(istype(searched_turfs, /turf/open/floor/plating)) + searched_turfs.PlaceOnTop(/turf/open/floor/iron/snowed) + else + searched_turfs.ChangeTurf(/turf/open/floor/iron/snowed) + +/obj/effect/anomaly/frost/detonate() + //The station holds its breath, waiting for whatever the end will bring. + if(isinspace(src) || !isopenturf(get_turf(src))) + return + var/turf/current_location = get_turf(src) + current_location.atmos_spawn_air("water_vapor=200;freon=100;o2=100;TEMP=140") //The cold will be brutal. The water in hydroponics will freeze. We'll have to make do with the food we've stockpiled. + +#undef MIN_REPLACEMENT +#undef MAX_REPLACEMENT +#undef MAX_RANGE diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm new file mode 100644 index 000000000000..35582d25aa6e --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_lifebringer.dm @@ -0,0 +1,54 @@ +/obj/effect/anomaly/lifebringer //2catz lmao (also see thermonuclear catsplosion) + name = "Lifebringer Anomaly" + desc = "An anomalous gateway that seemingly creates new life out of nowhere. Known by Lavaland Dwarves as the \"Petsplosion\"." + icon_state = "bluestream_fade" + lifespan = 30 SECONDS + var/active = TRUE + var/list/pet_type_cache + var/catsplosion = FALSE + +/obj/effect/anomaly/lifebringer/Initialize(mapload, new_lifespan) + . = ..() + if(prob(1)) + catsplosion = TRUE + + pet_type_cache = subtypesof(/mob/living/basic/pet) + pet_type_cache += list( + /mob/living/basic/axolotl, + /mob/living/basic/butterfly, + /mob/living/basic/cockroach, + /mob/living/basic/crab, + /mob/living/basic/frog, + /mob/living/basic/lizard, + /mob/living/basic/mothroach, + /mob/living/basic/bat, + /mob/living/basic/parrot, + /mob/living/basic/chicken, + /mob/living/basic/sloth) + pet_type_cache -= list(/mob/living/basic/pet/penguin, //Removing the risky and broken ones. + /mob/living/basic/pet/dog/corgi/narsie, + /mob/living/basic/pet/dog, + /mob/living/basic/pet/fox + ) + +/obj/effect/anomaly/lifebringer/anomalyEffect(seconds_per_tick) + ..() + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + if(active) + + if(catsplosion) + new /mob/living/simple_animal/pet/cat(src.loc) + active = FALSE + var/turf/open/tile = get_turf(src) + if(istype(tile)) + tile.atmos_spawn_air("o2=10;plasma=1;TEMP=3000") + return + + var/mob/living/basic/pet/chosen_pet = pick(pet_type_cache) + new chosen_pet(src.loc) + active = FALSE + return + + active = TRUE diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_monkey.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_monkey.dm new file mode 100644 index 000000000000..06d21de83adf --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_monkey.dm @@ -0,0 +1,33 @@ +#define MONKEY_SOUNDS list('sound/creatures/monkey/monkey_screech_1.ogg', 'sound/creatures/monkey/monkey_screech_2.ogg', 'sound/creatures/monkey/monkey_screech_3.ogg','sound/creatures/monkey/monkey_screech_4.ogg','sound/creatures/monkey/monkey_screech_5.ogg','sound/creatures/monkey/monkey_screech_6.ogg','sound/creatures/monkey/monkey_screech_7.ogg') + +/obj/effect/anomaly/monkey //Monkey Anomaly (Random Chimp Event) + name = "Screeching Anomaly" + desc = "An anomalous one-way gateway that leads straight to some sort of a ape dimension." + icon_state = "dimensional_overlay" + color = "#a76d17" + lifespan = 35 SECONDS + var/active = TRUE + +/obj/effect/anomaly/monkey/anomalyEffect(seconds_per_tick) + ..() + + playsound(src, pick(MONKEY_SOUNDS), vol = 33, vary = 1, mixer_channel = CHANNEL_MOB_SOUNDS) + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + if(!active) + active = TRUE + return + + if(prob(15)) + new /mob/living/carbon/human/species/monkey/angry(src.loc) + else + new /mob/living/carbon/human/species/monkey(src.loc) + active = FALSE + +/obj/effect/anomaly/monkey/detonate() + if(prob(25)) + new /mob/living/basic/gorilla(src.loc) + +#undef MONKEY_SOUNDS diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_radiation.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_radiation.dm new file mode 100644 index 000000000000..8329d5b44fdb --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_radiation.dm @@ -0,0 +1,47 @@ +//radioactive anomaly, creates radioactive goo +/obj/effect/anomaly/radioactive + name = "Radioactive Anomaly" + icon_state = "shield-grey" + desc = "A highly unstable mass of charged particles leaving waste material in it's wake." + color = "#86c4dd" + var/active = TRUE + +/obj/effect/anomaly/radioactive/Initialize(mapload, new_lifespan) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/anomaly/radioactive/Destroy() + . = ..() + RemoveElement(/datum/element/connect_loc) + +/obj/effect/anomaly/radioactive/proc/on_entered(datum/source, atom/movable/atom_movable) + SIGNAL_HANDLER + if(active && isliving(atom_movable)) + var/mob/living/victim = atom_movable + active = FALSE + victim.Paralyze(1 SECONDS) + var/atom/target = get_edge_target_turf(victim, get_dir(src, get_step_away(victim, src))) + victim.throw_at(target, 3, 1) + radiation_pulse(victim, 100) + to_chat(victim, "You feel a disgusting wave of heat wash over you!!!") + +/obj/effect/anomaly/radioactive/anomalyEffect(seconds_per_tick) + ..() + active = TRUE + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + radiation_pulse(src, 50) + if(!locate(/obj/effect/decal/nuclear_waste) in src.loc) + playsound(src, pick('sound/misc/desecration-01.ogg','sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg'), vol = 50, vary = 1) + new /obj/effect/decal/nuclear_waste(src.loc) + if(prob(15)) + new /obj/effect/decal/nuclear_waste/epicenter(src.loc) + +/obj/effect/anomaly/radioactive/detonate() + playsound(src, 'sound/effects/empulse.ogg', vol = 100, vary = 1) + radiation_pulse(src, 1000) diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_storm.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_storm.dm new file mode 100644 index 000000000000..3834d34d4149 --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_storm.dm @@ -0,0 +1,59 @@ +//Storm Anomaly (Lightning) +//LORD OF LIGHTNING SHIFTS HIS GAZE +#define STORM_MIN_RANGE 2 +#define STORM_MAX_RANGE 5 +#define STORM_POWER_LEVEL 1500 + +/obj/effect/anomaly/storm + name = "Storm Anomaly" + desc = "The lord of lightning peeks through the veil." + icon_state = "flux" + color = "#fbff00" + lifespan = 30 SECONDS //Way too strong to give a full 99 seconds. + var/active = TRUE + +//POINTS HIS STRUM FINGER OUR WAY +/obj/effect/anomaly/storm/Initialize(mapload, new_lifespan) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/anomaly/storm/Destroy() + . = ..() + RemoveElement(/datum/element/connect_loc) + +//ELECTRICITY ESCAPES +/obj/effect/anomaly/storm/proc/on_entered(datum/source, atom/movable/atom_movable) + SIGNAL_HANDLER + + if(active && iscarbon(atom_movable)) + var/mob/living/carbon/target = atom_movable + active = FALSE + target.electrocute_act(23, "[name]", flags = SHOCK_NOGLOVES) + target.adjustFireLoss(10) + +//LEAVES DESTRUCTION IN HIS WAKE +/obj/effect/anomaly/storm/anomalyEffect(seconds_per_tick) + ..() + if(!active) //Only works every other tick + active = TRUE + return + active = FALSE + + tesla_zap(src, rand(STORM_MIN_RANGE, STORM_MAX_RANGE), STORM_POWER_LEVEL) + playsound(src, 'sound/magic/lightningshock.ogg', 100, TRUE) + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + var/turf/location = get_turf(src) + location.atmos_spawn_air("water_vapor=10;TEMP=350") + +//No detonation because it's strong enough as it is + + +#undef STORM_MIN_RANGE +#undef STORM_MAX_RANGE +#undef STORM_POWER_LEVEL diff --git a/monkestation/code/game/objects/effects/anomalies/anomalies_walteverse.dm b/monkestation/code/game/objects/effects/anomalies/anomalies_walteverse.dm new file mode 100644 index 000000000000..70fa8c474a0f --- /dev/null +++ b/monkestation/code/game/objects/effects/anomalies/anomalies_walteverse.dm @@ -0,0 +1,35 @@ +/obj/effect/anomaly/walterverse//Monkey Anomaly (Random Chimp Event) + name = "Walter Anomaly" + desc = "An anomaly that summons Walters from all throughout the walterverse" + icon_state = "dimensional_overlay" + lifespan = 20 SECONDS + var/active = TRUE + var/list/walter_spawns = list( + /mob/living/basic/pet/dog/bullterrier/walter/saulter = 5, + /mob/living/basic/pet/dog/bullterrier/walter/negative = 5, + /mob/living/basic/pet/dog/bullterrier/walter/syndicate = 5, + /mob/living/basic/pet/dog/bullterrier/walter/doom = 5, + /mob/living/basic/pet/dog/bullterrier/walter/space = 5, + /mob/living/basic/pet/dog/bullterrier/walter/clown = 5, + /mob/living/basic/pet/dog/bullterrier/walter/french = 5, + /mob/living/basic/pet/dog/bullterrier/walter/british = 5, + /mob/living/basic/pet/dog/bullterrier/walter/wizard = 5, + /mob/living/basic/pet/dog/bullterrier/walter/smallter = 5, + /mob/living/basic/pet/dog/bullterrier/walter/sus = 1) + +/obj/effect/anomaly/walterverse/anomalyEffect(seconds_per_tick) + ..() + + if(isspaceturf(src) || !isopenturf(get_turf(src))) + return + + if(active) + active = FALSE + var/selected_spawn = pick_weight(walter_spawns) + new selected_spawn(src.loc) + return + active = TRUE + +/obj/effect/anomaly/walterverse/detonate() + if(prob(10)) + new /mob/living/basic/pet/dog/bullterrier/walter(src.loc) diff --git a/monkestation/code/game/objects/effects/decal/nuclear_waste.dm b/monkestation/code/game/objects/effects/decal/nuclear_waste.dm new file mode 100644 index 000000000000..cb5041411c0e --- /dev/null +++ b/monkestation/code/game/objects/effects/decal/nuclear_waste.dm @@ -0,0 +1,132 @@ +/obj/effect/decal/nuclear_waste + name = "Plutonium sludge" + desc = "A writhing pool of heavily irradiated, spent reactor fuel. A shovel should clear it up! Just sprinkle a little graphite on it, it will be fine. though you probably shouldn't step through this..." + icon = 'monkestation/icons/obj/machines/reactor_parts.dmi' + icon_state = "waste1" + alpha = 150 + light_color = LIGHT_COLOR_CYAN + color = "#ff9eff" + var/random_icon_states = list("waste1", "waste2") + +/obj/effect/decal/nuclear_waste/Initialize(mapload) + . = ..() + if(random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0) + icon_state = pick(random_icon_states) + set_light(3) + AddComponent(/datum/component/radioactive_emitter, 60 SECONDS, 3, RAD_LIGHT_INSULATION) + +/// The one that actually does the irradiating. This is to avoid every bit of sludge PROCESSING +/obj/effect/decal/nuclear_waste/epicenter + name = "Dense nuclear sludge" + +/// Clean way of spawning nuclear gunk after a reactor wastecore meltdown. +/obj/effect/landmark/nuclear_waste_spawner + name = "Nuclear Waste Spawner" + var/range = 3 + +/obj/effect/landmark/nuclear_waste_spawner/strong + name = "Nuclear Waste Spawner Strong" + range = 8 + +/** for rbmk +//Spawns nuclear_waste_spawners on map +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/sludge_spawner_preload() + /// Smaller scale spawn for spawning range to power output + var/short_range = CLAMP01(power/10, 5, 25) + for(var/turf/open/floor in orange(short_range, get_turf(src))) + if(prob(1)) //Prob of Spawn for sludge spawner + new /obj/effect/landmark/nuclear_waste_spawner(floor) + continue + + /// Larger scale spawn for spawning range to power output + var/longe_range = CLAMP01(power, 5, 200) + for(var/turf/open/floor in orange(longe_range, get_turf(src))) + if(prob(5)) //Prob of Spawn for sludge spawner + new /obj/effect/landmark/nuclear_waste_spawner(floor) + continue +*/ +/obj/effect/landmark/nuclear_waste_spawner/proc/fire() + playsound(loc, 'sound/effects/footstep/gib_step.ogg', 100) + new /obj/effect/decal/nuclear_waste/epicenter(get_turf(src)) + for(var/turf/open/floor in orange(range, get_turf(src))) + if(prob(20)) //Scatter the sludge, don't smear it everywhere + new /obj/effect/decal/nuclear_waste(floor) + continue + qdel(src) + +/obj/effect/decal/nuclear_waste/epicenter/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/decal/nuclear_waste/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + + if(isliving(AM)) + var/mob/living/L = AM + playsound(loc, 'sound/effects/footstep/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, 1) + radiation_pulse(src, 500, 5) //MORE RADS + +/obj/effect/decal/nuclear_waste/attackby(obj/item/tool, mob/user) + if(tool.tool_behaviour == TOOL_SHOVEL) + radiation_pulse(src, 400, 5) //MORE RADS + to_chat(user, "You start to clear [src]...") + if(tool.use_tool(src, user, 50, volume=100)) + to_chat(user, "You clear [src].") + qdel(src) + return + . = ..() + + +/** +/datum/weather/nuclear_fallout + name = "nuclear fallout" + desc = "Irradiated dust falls down everywhere." + telegraph_duration = 50 + telegraph_message = "The air suddenly becomes dusty.." + weather_message = "You feel a wave of hot ash fall down on you." + weather_overlay = "light_ash" + telegraph_overlay = "light_snow" + weather_duration_lower = 600 + weather_duration_upper = 1500 + weather_color = "green" + telegraph_sound = null + weather_sound = 'monkestation/sound/effects/rbmk/falloutwind.ogg' + end_duration = 100 + area_type = /area + protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, + /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle) + target_trait = ZTRAIT_STATION + end_message = "The ash stops falling." + immunity_type = "rad" + +/datum/weather/nuclear_fallout/weather_act(mob/living/L) + L.rad_act(100) + +/datum/weather/nuclear_fallout/telegraph() + ..() + status_alarm(TRUE) + +/datum/weather/nuclear_fallout/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement. + var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) + if(!frequency) + return + + var/datum/signal/signal = new + if (active) + signal.data["command"] = "alert" + signal.data["picture_state"] = "radiation" + else + signal.data["command"] = "shuttle" + + var/atom/movable/virtualspeaker/virt = new(null) + frequency.post_signal(virt, signal) + +/datum/weather/nuclear_fallout/end() + if(..()) + return + status_alarm(FALSE) ++ +*/ diff --git a/monkestation/code/modules/events/anomaly/anomaly_clown.dm b/monkestation/code/modules/events/anomaly/anomaly_clown.dm new file mode 100644 index 000000000000..5174e1a40230 --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_clown.dm @@ -0,0 +1,20 @@ +/datum/round_event_control/anomaly/anomaly_clown + name = "Anomaly: Clowns" + description = "A distant Honking." + typepath = /datum/round_event/anomaly/anomaly_clown + + max_occurrences = 5 + weight = 9 + min_players = 20 + min_wizard_trigger_potency = 1 + max_wizard_trigger_potency = 4 + track = EVENT_TRACK_MAJOR + tags = list(TAG_SPOOKY, TAG_MAGICAL) + +/datum/round_event/anomaly/anomaly_clown + start_when = ANOMALY_START_HARMFUL_TIME + announce_when = ANOMALY_ANNOUNCE_HARMFUL_TIME + anomaly_path = /obj/effect/anomaly/clown + +/datum/round_event/anomaly/anomaly_clown/announce(fake) + priority_announce("There should be clowns. Where are the clowns? [impact_area.name]. Send in the clowns.", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/events/anomaly/anomaly_fluid.dm b/monkestation/code/modules/events/anomaly/anomaly_fluid.dm new file mode 100644 index 000000000000..fdbdc0090f74 --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_fluid.dm @@ -0,0 +1,18 @@ +/datum/round_event_control/anomaly/anomaly_fluid + name = "Anomaly: Fluidic" + description = "Noah, get the boat." + typepath = /datum/round_event/anomaly/anomaly_fluid + + max_occurrences = 3 + weight = 20 + min_players = 30 + min_wizard_trigger_potency = 1 + max_wizard_trigger_potency = 4 + track = EVENT_TRACK_MUNDANE + +/datum/round_event/anomaly/anomaly_fluid + start_when = 1 + anomaly_path = /obj/effect/anomaly/fluid + +/datum/round_event/anomaly/anomaly_fluid/announce(fake) + priority_announce("Fluidic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/events/anomaly/anomaly_frost.dm b/monkestation/code/modules/events/anomaly/anomaly_frost.dm new file mode 100644 index 000000000000..5887f25c85eb --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_frost.dm @@ -0,0 +1,21 @@ +/datum/round_event_control/anomaly/anomaly_frost + name = "Anomaly: Frost" + description = "The white frost comes." + typepath = /datum/round_event/anomaly/anomaly_frost + + max_occurrences = 5 + weight = 10 + min_players = 20 + + min_wizard_trigger_potency = 1 + max_wizard_trigger_potency = 4 + track = EVENT_TRACK_MODERATE + tags = list(TAG_SPOOKY) + +/datum/round_event/anomaly/anomaly_frost + start_when = ANOMALY_START_HARMFUL_TIME + announce_when = ANOMALY_ANNOUNCE_HARMFUL_TIME + anomaly_path = /obj/effect/anomaly/frost + +/datum/round_event/anomaly/anomaly_frost/announce(fake) + priority_announce("Frost Anomaly detected in: [impact_area.name]. Brace for the cold.", "Anomaly Alert", 'monkestation/sound/misc/frost_horn.ogg') diff --git a/monkestation/code/modules/events/anomaly/anomaly_lifebringer.dm b/monkestation/code/modules/events/anomaly/anomaly_lifebringer.dm new file mode 100644 index 000000000000..7ce4db0c4209 --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_lifebringer.dm @@ -0,0 +1,15 @@ +/datum/round_event_control/anomaly/anomaly_lifebringer + name = "Anomaly: lifebringer" + description = "Meow" + typepath = /datum/round_event/anomaly/anomaly_lifebringer + + max_occurrences = 2 + weight = 15 + track = EVENT_TRACK_MUNDANE + +/datum/round_event/anomaly/anomaly_lifebringer + start_when = 1 + anomaly_path = /obj/effect/anomaly/lifebringer + +/datum/round_event/anomaly/anomaly_lifebringer/announce(fake) + priority_announce("Lifebringer anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/events/anomaly/anomaly_monkey.dm b/monkestation/code/modules/events/anomaly/anomaly_monkey.dm new file mode 100644 index 000000000000..c5ee399f045d --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_monkey.dm @@ -0,0 +1,15 @@ +/datum/round_event_control/anomaly/anomaly_monkey + name = "Anomaly: Monkey" + description = "OOGA" + typepath = /datum/round_event/anomaly/anomaly_monkey + + max_occurrences = 1 + weight = 10 + track = EVENT_TRACK_MAJOR + +/datum/round_event/anomaly/anomaly_monkey + start_when = 1 + anomaly_path = /obj/effect/anomaly/monkey + +/datum/round_event/anomaly/anomaly_monkey/announce(fake) + priority_announce("Random Chimp Event detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/events/anomaly/anomaly_radiation.dm b/monkestation/code/modules/events/anomaly/anomaly_radiation.dm new file mode 100644 index 000000000000..a41a981b36c6 --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_radiation.dm @@ -0,0 +1,20 @@ +/datum/round_event_control/anomaly/anomaly_radiation + name = "Anomaly: Radiation" + description = "A sickly green glow from byond the horizon." + typepath = /datum/round_event/anomaly/anomaly_radiation + + max_occurrences = 1 + weight = 1 + min_players = 20 + min_wizard_trigger_potency = 1 + max_wizard_trigger_potency = 4 + track = EVENT_TRACK_MAJOR + tags = list(TAG_SPOOKY, TAG_DESTRUCTIVE) + +/datum/round_event/anomaly/anomaly_radiation + start_when = ANOMALY_START_HARMFUL_TIME + announce_when = ANOMALY_ANNOUNCE_HARMFUL_TIME + anomaly_path = /obj/effect/anomaly/radioactive + +/datum/round_event/anomaly/anomaly_radiation/announce(fake) + priority_announce("Radioactive anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/events/anomaly/anomaly_storm.dm b/monkestation/code/modules/events/anomaly/anomaly_storm.dm new file mode 100644 index 000000000000..745184dcd517 --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_storm.dm @@ -0,0 +1,20 @@ +/datum/round_event_control/anomaly/anomaly_storm + name = "Anomaly: Storm" + description = "A tesla, condensed." + typepath = /datum/round_event/anomaly/anomaly_storm + + max_occurrences = 3 + weight = 5 + min_players = 40 + + min_wizard_trigger_potency = 1 + max_wizard_trigger_potency = 4 + track = EVENT_TRACK_MAJOR + tags = list(TAG_MAGICAL, TAG_DESTRUCTIVE) + +/datum/round_event/anomaly/anomaly_storm + start_when = 1 + anomaly_path = /obj/effect/anomaly/storm + +/datum/round_event/anomaly/anomaly_storm/announce(fake) + priority_announce("Powerful Storm anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/events/anomaly/anomaly_walterverse.dm b/monkestation/code/modules/events/anomaly/anomaly_walterverse.dm new file mode 100644 index 000000000000..3c9be67a2bc9 --- /dev/null +++ b/monkestation/code/modules/events/anomaly/anomaly_walterverse.dm @@ -0,0 +1,14 @@ +/datum/round_event_control/anomaly/anomaly_walterverse + name = "Anomaly: Walterverse" + typepath = /datum/round_event/anomaly/anomaly_walterverse + + max_occurrences = 1 + weight = 5 + track = EVENT_TRACK_MAJOR + +/datum/round_event/anomaly/anomaly_walterverse + start_when = 1 + anomaly_path = /obj/effect/anomaly/walterverse + +/datum/round_event/anomaly/anomaly_walterverse/announce(fake) + priority_announce("The Walterverse has been opened. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/monkestation/code/modules/mob/living/basic/pets/walterverse.dm b/monkestation/code/modules/mob/living/basic/pets/walterverse.dm new file mode 100644 index 000000000000..2dd06a640936 --- /dev/null +++ b/monkestation/code/modules/mob/living/basic/pets/walterverse.dm @@ -0,0 +1,134 @@ +/mob/living/basic/pet/dog/bullterrier/walter/saulter + name = "Saulter Goodman" + real_name = "Saulter Goodman" + desc = "Seccies and wardens are nothing compared to the might of this consititutional right loving lawyer." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "saulter" + icon_living = "saulter" + icon_dead = "saulter_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks!", "Hi, i'm Saul Goodman.", "Did you know you have rights?", "Based!") + +/mob/living/basic/pet/dog/bullterrier/walter/negative + name = "Negative Walter" + real_name = "Negative Walter" + desc = "Nar'sie and rat'var are a lot compared to the might of this skcurtretsnom despising god." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "negative" + icon_living = "negative" + icon_dead = "negative_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("skrab!", "sfoow!", "retlaW", "skcurterif", "skcurtretsnom") + +/mob/living/basic/pet/dog/bullterrier/walter/syndicate + name = "Syndicate Walter" + real_name = "Syndicate Walter" + desc = "Nanotrasen and Centcom are nothing compared to the might of this nuke loving dog." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "syndie" + icon_living = "syndie" + icon_dead = "syndie_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks!", "woofs!", "Walter", "Down with Nanotrasen!", "For the Syndicate!") + +/mob/living/basic/pet/dog/bullterrier/walter/doom + name = "Doom Walter" + real_name = "Doom Walter" + desc = "Devils and Gods are nothing compared to the might of this gun loving soldier." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "doom" + icon_living = "doom" + icon_dead = "doom_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("...") + +/mob/living/basic/pet/dog/bullterrier/walter/space + name = "Space Walter" + real_name = "Space Walter" + desc = "Exploring the galaxies is nothing for this star loving dog." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "space" + icon_living = "space" + icon_dead = "space_dead" + unsuitable_atmos_damage = 0 + bodytemp_cold_damage_limit = -1 + bodytemp_heat_damage_limit = 1500 + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks!", "woofs!", "spess!", "Walter", "firetrucks", "monstertrucks", "spaceships") + +/mob/living/basic/pet/dog/bullterrier/walter/sus + name = "Suspicious Walter" + real_name = "Suspicious Walter" + desc = "This vent loving dog is a little suspicious..." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "sus" + icon_living = "sus" + icon_dead = "sus_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks!", "woofs!", "sus!", "Walter", "firetrucks", "monstertrucks", "tasks") +/mob/living/basic/pet/dog/bullterrier/walter/sus/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/mob/living/basic/pet/dog/bullterrier/walter/clown + name = "Clown Walter" + real_name = "Clown Walter" + desc = "Seccies and staff members are nothing compared to the might of this banana loving loving dog." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "clown" + icon_living = "clown" + icon_dead = "clown_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks!", "woofs!", "honks!", "Walter", "firetrucks", "monstertrucks") + + +/mob/living/basic/pet/dog/bullterrier/walter/french + name = "French Walter" + real_name = "French Walter" + desc = "Nar'sie et rat'var ne sont rien comparés à la puissance de ce chien qui aime les monstertrucks." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "french" + icon_living = "french" + icon_dead = "french_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("aboiement!", "aboyer!", "Walter", "camions de pompiers", "camions monstres") + +/mob/living/basic/pet/dog/bullterrier/walter/british + name = "Bri'ish Wal'ah" + real_name = "Bri'ish Wal'ah" + desc = "Nar'sie and like ra''var are naw'hin' compared 'o 'he migh' of 'hiz mons'er'ruck lovin' dog." + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks!", "woofs!", "Wal'ah", "fire'rucks", "mons'er'rucks") + +/mob/living/basic/pet/dog/bullterrier/walter/wizard + name = "Magic Walter" + real_name = "Magic Walter" + desc = "Assistants and secoffs are nothing compared to the might of this magic loving dog." + icon = 'monkestation/icons/mob/walterverse.dmi' + icon_state = "wizard" + icon_living = "wizard" + icon_dead = "wizard_dead" + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("ONI SOMA", "CLANG!", "UN'LTD P'WAH", "AULIE OXIN FIERA", "GIN'YU`CAPAN") + +/mob/living/basic/pet/dog/bullterrier/walter/smallter + name = "Smallter" + real_name = "Smallter" + desc = "Nar'sie and rat'var are nothing compared to the might of this tiny dog." + gold_core_spawnable = FRIENDLY_SPAWN + unique_pet = TRUE + //speak = list("barks", "woofs", "walter", "firetrucks", "monstertrucks") + +/mob/living/basic/pet/dog/bullterrier/walter/smallter/Initialize(mapload) + . = ..() + update_transform(0.5) diff --git a/monkestation/icons/mob/walterverse.dmi b/monkestation/icons/mob/walterverse.dmi new file mode 100644 index 000000000000..fe602cea58cb Binary files /dev/null and b/monkestation/icons/mob/walterverse.dmi differ diff --git a/monkestation/icons/obj/machines/rbmk.dmi b/monkestation/icons/obj/machines/rbmk.dmi new file mode 100644 index 000000000000..c4f1ad9f6738 Binary files /dev/null and b/monkestation/icons/obj/machines/rbmk.dmi differ diff --git a/monkestation/icons/obj/machines/reactor_parts.dmi b/monkestation/icons/obj/machines/reactor_parts.dmi new file mode 100644 index 000000000000..885839f222ad Binary files /dev/null and b/monkestation/icons/obj/machines/reactor_parts.dmi differ diff --git a/tgstation.dme b/tgstation.dme index ecb1e4c86e75..76548d2e39f8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6025,8 +6025,17 @@ #include "monkestation\code\game\objects\effects\sprint_dust.dm" #include "monkestation\code\game\objects\effects\anomalies\_anomalies.dm" #include "monkestation\code\game\objects\effects\anomalies\anomalies_bioscrambler.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_clown.dm" #include "monkestation\code\game\objects\effects\anomalies\anomalies_dimensional.dm" #include "monkestation\code\game\objects\effects\anomalies\anomalies_dimensional_themes.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_fluid.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_frost.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_lifebringer.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_monkey.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_radiation.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_storm.dm" +#include "monkestation\code\game\objects\effects\anomalies\anomalies_walteverse.dm" +#include "monkestation\code\game\objects\effects\decal\nuclear_waste.dm" #include "monkestation\code\game\objects\effects\effect_system\fluid_spread\effects_smoke.dm" #include "monkestation\code\game\objects\effects\random\ai_module.dm" #include "monkestation\code\game\objects\effects\spawners\roomspawner.dm" @@ -7186,6 +7195,14 @@ #include "monkestation\code\modules\events\scrubber_clog.dm" #include "monkestation\code\modules\events\scrubber_overflow.dm" #include "monkestation\code\modules\events\summon_wizard_event.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_clown.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_fluid.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_frost.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_lifebringer.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_monkey.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_radiation.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_storm.dm" +#include "monkestation\code\modules\events\anomaly\anomaly_walterverse.dm" #include "monkestation\code\modules\events\ghost_role\drifting_contractor.dm" #include "monkestation\code\modules\events\wizard\summon_gifts.dm" #include "monkestation\code\modules\factory_type_beat\boulder.dm" @@ -7510,6 +7527,7 @@ #include "monkestation\code\modules\mob\living\basic\pets\lizard.dm" #include "monkestation\code\modules\mob\living\basic\pets\mouse.dm" #include "monkestation\code\modules\mob\living\basic\pets\snake.dm" +#include "monkestation\code\modules\mob\living\basic\pets\walterverse.dm" #include "monkestation\code\modules\mob\living\basic\pets\parrot\_parrot.dm" #include "monkestation\code\modules\mob\living\basic\pets\parrot\parrot_ai\parroting_action.dm" #include "monkestation\code\modules\mob\living\basic\space_fauna\carp\carp.dm"