/* ⢀⡴⠑⡄⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠸⡇⠀⠿⡀⠀⠀⠀⣀⡴⢿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠑⢄⣠⠾⠁⣀⣄⡈⠙⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⢀⡀⠁⠀⠀⠈⠙⠛⠂⠈⣿⣿⣿⣿⣿⠿⡿⢿⣆⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⢀⡾⣁⣀⠀⠴⠂⠙⣗⡀⠀⢻⣿⣿⠭⢤⣴⣦⣤⣹⠀⠀⠀⢀⢴⣶⣆ ⠀⠀⢀⣾⣿⣿⣿⣷⣮⣽⣾⣿⣥⣴⣿⣿⡿⢂⠔⢚⡿⢿⣿⣦⣴⣾⠁⠸⣼⡿ ⠀⢀⡞⠁⠙⠻⠿⠟⠉⠀⠛⢹⣿⣿⣿⣿⣿⣌⢤⣼⣿⣾⣿⡟⠉⠀⠀⠀⠀⠀ ⠀⣾⣷⣶⠇⠀⠀⣤⣄⣀⡀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ WARNING: THE SHITCODE BELOW HAS BEEN HASTILY ⠀⠉⠈⠉⠀⠀⢦⡈⢻⣿⣿⣿⣶⣶⣶⣶⣤⣽⡹⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ COPY AND PASTED, PORTED FROM AWKWARD PLACES, AND PROBABLY MADE WORSE. ⠀⠀⠀⠀⠀⠀⠀⠉⠲⣽⡻⢿⣿⣿⣿⣿⣿⣿⣷⣜⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣷⣶⣮⣭⣽⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣀⣀⣈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀ WELCOME TO JT's TG-CODE HALLOWEEN BALL CODEFILE. ⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀ ALL OF IT WILL HOPEFULLY BE BELOW. ⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠻⠿⠿⠿⠿⠛⠉ */ //Also Shrek will crash your dmlang server repeatedly if you edit him. //JT is weird, considering my handle is a acronym. //Considering I can't grab defines from everywhere, I hope you enjoy strings and numbers plebs. //Update - Moved to modular citadel so we are after everything has loaded...probably we gucci - jtgsz /* AREAS */ //This is generally how you handle planet areas, gen 1 large outside area is good for outside effects. //PS: Mountain has a soundloop, outside has a soundloop, inside has a soundloop, mountaininside is silent //This is for the rain weather my man. /area/eventmap name = "Dont use this" //Its the parent to any dunces out there. has_gravity = STANDARD_GRAVITY //We have gravity icon = 'modular_citadel/code/modules/eventmaps/Spookystation/areas.dmi' //It unsets the icon. don't make a err icon. requires_power = 0 // We don't need power anywhere. flags_1 = NONE dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/eventmap/outside //We are outside name = "Outside" icon_state = "outside" outdoors = 0 //I set outdoors to false. So areas can be edited. /area/eventmap/inside //We are inside, all things are pretty normal. name = "Inside" icon_state = "inside" /area/eventmap/mountain //Mostly so I can see the area lines of the mountain area in the minimap. name = "Mountain" icon_state = "mountain" var/mountain = 1 /area/eventmap/mountaininside name = "Silent Mountain Inside" icon_state = "mountain_inside" outdoors = 0 /* OUTSIDE WALLS I WANT NOT NEED */ //These exist mostly to limit the amount of space we use organically really. //Decided to just use the denserock within the regular code. /turf/closed/indestructible/spookytime/matrixblocker //Two times the reference power. name = "matrix" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "matrix" desc = "You suddenly realize the truth - there is no spoon.
Digital simulation ends here ONCE AGAIN.
" /* OUTSIDE TURFS WITH NO GEN JUS MIDNIGHT LIGHT BABY */ //In a ideal world, we would have split the turfs onto a single parent. //Then we would tree from INSIDE and OUTSIDE, with outside having the lighting set, for the day/night subsystem to change. //Outside would also have the planetary atmos and config on it. //Inside would be a case to case basis depending on if you want it to scrub or not.. and not have the lighting. //Along with what needs to be constructed on etc. //This is not a ideal world so enjoy the overload. //Parent of all our outside turfs. Both the inside and outside should be on a parent like this. /turf/open/floor/spooktime //But for now, we just handle what is outside, for light control etc. name = "You fucked up pal" desc = "Don't use this turf its a parent and just a holder." planetary_atmos = 1 //REVERT TO INITIAL AIR GASMIX OVER TIME WITH LINDA. AKA SUPERSCRUBBER light_range = 3 //MIDNIGHT BLUE light_power = 0.15 //NOT PITCH BLACK, JUST REALLY DARK light_color = "#00111a" //The light can technically cycle on a timer worldwide, but no daynight cycle. baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint //If we explode or die somehow, we just become grass gender = PLURAL //THE GENDER IS PLURAL tiled_dirt = 0 //NO TILESMOOTHING DIRT/DIRT SPAWNS OR SOME SHIT /turf/open/floor/spooktime/break_tile() return /turf/open/floor/spooktime/burn_tile() return /turf/open/floor/spooktime/pry_tile(obj/item/I, mob/user, silent = FALSE) return //No prying these tiles, you instead shovel it if avail. /* Baseturf, when we call scrapeaway() after a shoveling. So people can attach tiles */ //WARNING VERY IMPORTANT AND HACKJOBBISH - Basically this handles construction on everything. /turf/open/floor/plating/spookbase/dirtattachmentpoint //Lighted variant name = "the ground" desc = "Looks like its been dugged out and prepped for construction" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "dugdirt" footstep = FOOTSTEP_GRASS barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY attachment_holes = TRUE planetary_atmos = 1 light_range = 3 //We reset this light_power = 0.15 //The lighting will unset when people place their tiles/etc on it. light_color = "#00111a" //It should be fine baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint //No going lower than this. /turf/open/floor/plating/spookbase/dirtattachmentpoint/mountain name = "the ground" desc = "It has been dug out and prepared for construction." light_range = 0 light_power = 0 baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint/mountain /turf/open/floor/plating/spookbase/sandattachmentpoint name = "the sand" desc = "Looks like its been dugged out and prepped for construction" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "dugsand" footstep = FOOTSTEP_GRASS barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY attachment_holes = TRUE planetary_atmos = 1 light_range = 3 light_power = 0.15 light_color = "#00111a" baseturfs = /turf/open/floor/plating/spookbase/sandattachmentpoint // The sand version. /* FLOOR TILES */ /obj/item/stack/tile/nonspooktimegrass name = "clumps of grass" singular_name = "clump of grass" desc = "This is a clump of grass." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "grass_clump" turf_type = /turf/open/floor/spooktime/nonspooktimegrass resistance_flags = FLAMMABLE /obj/item/stack/tile/normalasssand name = "piles of sand" singular_name = "pile of sand" desc = "This is a pile of sand" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "sand_clump" turf_type = /turf/open/floor/spooktime/beach /* IMPORTANT TURFS */ //Grass with no flora generation on it. /turf/open/floor/spooktime/nonspooktimegrass name = "grass patch" desc = "You can't tell if this is real grass... Ah, who are you kidding, it totally is real grass." icon_state = "grass_1" //Grass of the varied variety. icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint footstep = FOOTSTEP_GRASS barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY var/turfverb = "dig out" /turf/open/floor/spooktime/nonspooktimegrass/Initialize(mapload) //Init rng icon. . = ..() icon_state = "grass_[rand(1,3)]" /turf/open/floor/spooktime/nonspooktimegrass/attackby(obj/item/C, mob/user, params) //We dig it out with a shovel. if((C.tool_behaviour == TOOL_SHOVEL) && params) //And beneath it we reveal dirt new /obj/item/stack/tile/nonspooktimegrass(src) user.visible_message("[user] digs up [src].", "You [turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) return //Dirt patches with no lighting. /turf/open/floor/spooktime/dirtpatch name = "clearly dirt" desc = "Its dirt alright" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "smoothdarkdirt" light_range = 0 //We set the lights to nothing on the CLEARLY DIRT light_power = 0 //ayep footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint/mountain //no light variant var/turfverb = "dig out" /turf/open/floor/spooktime/dirtpatch/attackby(obj/item/C, mob/user, params) //We dig it out with a shovel. if((C.tool_behaviour == TOOL_SHOVEL) && params) //And beneath it we reveal dirt user.visible_message("[user] digs up [src].", "You [turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) return //Snow with no planetary atmos, so the map doesn't atmos crash. /turf/open/floor/spooktime/snow gender = PLURAL name = "snow" icon = 'icons/turf/snow.dmi' desc = "Looks cold." icon_state = "snow" slowdown = 2 light_range = 0 light_power = 0 bullet_sizzle = 1 footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/spooktime/snow/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return /turf/open/floor/spooktime/snow/crowbar_act(mob/living/user, obj/item/I) return /* Basic Grass turf w Flora gen */ /turf/open/floor/spooktime/spooktimegrass name = "the ground" desc = "It clearly looks like grass and dirt, clearly." icon_state = "grass_1" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' //32x32 iconfile, sry we had different sizes. broken_states = list("sand") footstep = FOOTSTEP_GRASS //Finally I can have my footstep noises barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY var/turfverb = "dig out" baseturfs = /turf/open/floor/plating/spookbase/dirtattachmentpoint //beneath the grass there is dirt. //Holders for what can occur on the turf. var/obj/structure/flora/turfGrass = null var/obj/structure/flora/turfTree = null var/obj/structure/flora/turfAusflora = null var/obj/structure/flora/turfRocks = null var/obj/structure/flora/turfDebris = null /turf/open/floor/spooktime/spooktimegrass/Initialize(mapload) //Considering adding dirtgen here too. . = ..() if(prob(1)) icon_state = "smoothdarkdirt" //Sometimes we can be dirt. else icon_state = "grass_[rand(1,3)]" //Icon state variation for how many states of grass I got... 3 lul //If no fences, machines (soil patches are machines), etc. try to plant grass if(!(\ (locate(/obj/structure) in src) || \ (locate(/obj/machinery) in src) )) floraGen() //And off we go riding into hell. update_icon() /turf/open/floor/spooktime/spooktimegrass/attackby(obj/item/C, mob/user, params) //We dig it out with a shovel. if((C.tool_behaviour == TOOL_SHOVEL) && params) //And beneath it we reveal dirt) new /obj/item/stack/tile/nonspooktimegrass(src) user.visible_message("[user] digs up [src].", "You [turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) return /turf/open/floor/spooktime/spooktimegrass/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return //No replacing it /turf/open/floor/spooktime/spooktimegrass/burn_tile() return //No burning it /turf/open/floor/spooktime/spooktimegrass/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return //No slippery /turf/open/floor/spooktime/spooktimegrass/MakeDry() return //No making it dry. /* FLORA GEN PROCEDURE */ //This is mostly for flora/doodads. I don't feel like there needs to be lake/cave and animals generation.. //For the halloween map at least, so I used the f13 flora gen and appended to it instead of usin cellular automata. //Soooo, its just tied to the turf initialize on init right now. //Right now each segment generates independantly, but it wouldn't be hard to do it in a chain //And check for what else is there before a list of objects has the option to appear. //Or even change weighting based on the weight of other things that the turf has checked in its range. //But at the same time, the stacked flora/rocks etc look pretty okay together honestly. //On the other side of the coin, you could even adjust their pixel x and y for better thickets. //Since after-all things in nature don't just occupy one spot each a lot of the time. //That being said you have somewhere around 50 seconds of init, and 160 seconds of pre-game time. //To finish generation if you need to split it up by chunks and add more checks. //Its more time than you could ever want considering how fast it finishes like this without hiccups really. //Ironically, not very resource intensive or slow to do this much of it. //I have turned what used to be simple into hell. //We can keep appending stuff here as we go, it basically just spawns it all on turf spooktimegrass on init. //============> Current Set value // JTGSZ Tuned Reference Value <============== #define GRASS_SPONTANEOUS 2//2 //chance it appears on the tile on its own #define GRASS_WEIGHT 4//4 //multiplier increase if theres some nearby #define TREE_SPONTANEOUS 4//4 #define TREE_WEIGHT 4//4 #define AUSFLORA_SPONTANEOUS 2//2 #define AUSFLORA_WEIGHT 3//3 #define ROCKS_SPONTANEOUS 2//2 //Technically this can be moved to the desolate spawn list tied to grass. #define ROCKS_WEIGHT 1//1 //Lower weight cause rock clusters were too common...But cool honestly. #define DEBRIS_SPONTANEOUS 2//2 #define DEBRIS_WEIGHT 2//2 //These are basically what can spawn in the lists, the number is the weight. //The weight dictates how likely it is to spawn over other things in the lists. If you were to use pickweight. #define LUSH_GRASS_SPAWN_LIST list(/obj/structure/flora/grass/spookytime = 4,\ /obj/structure/flora/ausbushes/lavendergrass = 3,\ /obj/structure/flora/ausbushes/sparsegrass = 6,\ /obj/structure/flora/ausbushes/fullgrass = 1\ ) #define TREE_SPAWN_LIST list(/obj/structure/flora/tree/spookytime = 9,\ /obj/structure/flora/tree/spookytimexl = 2,\ /obj/structure/flora/tree/jungle = 1,\ /obj/structure/flora/tree/jungle/small = 1\ ) #define AUSFLORA_SPAWN_LIST list(/obj/structure/flora/ausbushes = 3,\ /obj/structure/flora/ausbushes/grassybush = 3,\ /obj/structure/flora/ausbushes/fernybush = 1,\ /obj/structure/flora/ausbushes/sunnybush = 1,\ /obj/structure/flora/ausbushes/reedbush = 1,\ /obj/structure/flora/ausbushes/palebush = 1,\ /obj/structure/flora/ausbushes/stalkybush = 1\ ) #define ROCKS_SPAWN_LIST list(/obj/structure/flora/spookyrock = 1\ ) #define DEBRIS_SPAWN_LIST list(/obj/structure/flora/tree/spookybranch = 5, \ /obj/structure/flora/tree/spookylog = 1\ ) //Lists that occur when the cluster doesn't happen but probability dictates it tries. #define DESOLATE_SPAWN_LIST list(/obj/structure/flora/grass/spookytime = 1,\ /obj/structure/flora/ausbushes/sparsegrass = 1\ ) //I just kinda made it worse... Like a lot worse. Ngl man. /turf/open/floor/spooktime/spooktimegrass/proc/floraGen() var/grassWeight = 0 //grassWeight holders for each individual layer var/treeWeight = 0 var/ausfloraWeight = 0 var/rocksWeight = 0 var/debrisWeight = 0 var/randGrass = null //The random plant picked var/randTree = null //The random deadtree picked var/randAusflora = null //The random Ausflora picked var/randRocks = null //The random rock picked var/randDebris = null //The random wood debris picked //spontaneously spawn the objects based on probability from the define. //Ngl, a lot of this is going to be have to generate in certain orders later in this proc. if(prob(GRASS_SPONTANEOUS)) //If probability THE DEFINE NUMBER randGrass = pickweight(LUSH_GRASS_SPAWN_LIST) //randgrass is assigned a obj from the weighted list turfGrass = new randGrass(src) //The var on the turf now has a new randgrass from the list. if(prob(TREE_SPONTANEOUS)) randTree = pickweight(TREE_SPAWN_LIST) turfTree = new randTree(src) if(prob(AUSFLORA_SPONTANEOUS)) randAusflora = pickweight(AUSFLORA_SPAWN_LIST) turfAusflora = new randAusflora(src) if(prob(ROCKS_SPONTANEOUS)) randRocks = pickweight(ROCKS_SPAWN_LIST) turfRocks = new randRocks(src) if(prob(DEBRIS_SPONTANEOUS)) randDebris = pickweight(DEBRIS_SPAWN_LIST) turfDebris = new randDebris(src) //loop through neighbouring turfs, if they have grass, then increase weight, cluster prep. for(var/turf/open/floor/spooktime/spooktimegrass/T in RANGE_TURFS(3, src)) if(T.turfGrass) //We check what is around our turf grassWeight += GRASS_WEIGHT //The weight is increased by grass weight per every grass we find if(T.turfTree) treeWeight += TREE_WEIGHT if(T.turfAusflora) ausfloraWeight += AUSFLORA_WEIGHT if(T.turfRocks) rocksWeight += ROCKS_WEIGHT if(T.turfDebris) debrisWeight += DEBRIS_WEIGHT //Below is where we handle clusters really. //use weight to try to spawn grass if(prob(grassWeight)) //Basically the probability goes by the DEFINE WEIGHT the more of it is around. //If surrounded on 5+ sides, pick from lush if(grassWeight == (5 * GRASS_WEIGHT)) //If we are five times the define value, aka 5 detected. randGrass = pickweight(LUSH_GRASS_SPAWN_LIST) //We weighted pick from the lush list, aka boys that can be together. else //Else. randGrass = pickweight(DESOLATE_SPAWN_LIST) //We weighted pick from boys that are fine being alone. turfGrass = new randGrass(src) //And at the end we set the turfgrass to this object. if(prob(treeWeight)) //We can technically redirect individuals down here too, but lets just focus on clumps. randTree = pickweight(TREE_SPAWN_LIST) turfTree = new randTree(src) if(prob(ausfloraWeight)) randAusflora = pickweight(AUSFLORA_SPAWN_LIST) turfAusflora = new randAusflora(src) if(prob(rocksWeight)) randRocks = pickweight(ROCKS_SPAWN_LIST) turfRocks = new randRocks(src) if(prob(debrisWeight)) randDebris = pickweight(DEBRIS_SPAWN_LIST) turfDebris = new randDebris(src) //Make sure we delete the objects if we ever change turfs /turf/open/floor/spooktime/spooktimegrass/ChangeTurf(flags = CHANGETURF_INHERIT_AIR) if(turfGrass) qdel(turfGrass) //if(turfTree) // qdel(turfTree) if(turfAusflora) qdel(turfAusflora) if(turfRocks) qdel(turfRocks) if(turfDebris) qdel(turfDebris) . = ..() //Grass baseturf helper, more than likely completely unneeded since its set on the original turf too. /obj/effect/baseturf_helper/spooktimegrass name = "grass baseturf helper" //Basically just changes the baseturf into grass baseturf = /turf/open/floor/spooktime/spooktimegrass //Wherever it is at. //A reference to this list is passed into area sound managers, and it's modified in a manner that preserves that reference in ash_storm.dm GLOBAL_LIST_EMPTY(rain_sounds) // HEY!! IF THIS DOES NOT WORK CHECK LOGIN.DM !!!!! /* HERE COMES THE MOTHERFUCKING RAIN */ /datum/weather/long_rain name = "Long rain at midnight" desc = "The planet sometimes rains, nothing special about it really." telegraph_duration = 130 telegraph_message = "Water droplets begin falling from the sky." telegraph_overlay = "regular_rain" //Ya my apologies for not making a new rain icon weather_message = "The droplets become a downpour, rain now falls all around you from the night sky." weather_overlay = "regular_rain" //But I need to work on my mouse on the day of 10/24/2019, so lets call it here. weather_duration_lower = 12000 //these are deciseconds. weather_duration_upper = 15000 end_duration = 100 end_message = "The downpour gradually slows until it stops." area_type = /area/eventmap/outside target_trait = ZTRAIT_LONGRAIN probability = 90 barometer_predictable = TRUE var/list/outside_longrain = list() var/list/inside_longrain = list() var/list/mountain_longrain = list() // var/datum/looping_sound/active_outside_longrain/sound_ao = new(list(), FALSE, TRUE) //Outside // var/datum/looping_sound/active_inside_longrain/sound_ai = new(list(), FALSE, TRUE) //Inside // var/datum/looping_sound/active_mountain_longrain/sound_am = new(list(), FALSE, TRUE) //Mountain /datum/weather/long_rain/telegraph() //Yeah, I'm sorry but I just stole ash storm sound loops . = ..() var/list/eligible_areas = list() for(var/z in impacted_z_levels) //We check the Z level eligible_areas += SSmapping.areas_in_z["[z]"] //And append them to eligible areas list for(var/i in 1 to eligible_areas.len) var/area/place = eligible_areas[i] if(istype(place, /area/eventmap/outside)) //If the place is this path outside_longrain[place] = /datum/looping_sound/active_outside_longrain //Outside areas is the place if(istype(place, /area/eventmap/inside)) inside_longrain[place] = /datum/looping_sound/active_inside_longrain if(istype(place, /area/eventmap/mountain)) mountain_longrain[place] = /datum/looping_sound/active_mountain_longrain CHECK_TICK //We modify this list instead of setting it to weak/stron sounds in order to preserve things that hold a reference to it //It's essentially a playlist for a bunch of components that chose what sound to loop based on the area a player is in GLOB.rain_sounds += outside_longrain return ..() /datum/weather/long_rain/start() GLOB.ash_storm_sounds += mountain_longrain GLOB.ash_storm_sounds += inside_longrain return ..() /datum/weather/long_rain/end() GLOB.ash_storm_sounds -= outside_longrain GLOB.ash_storm_sounds -= inside_longrain GLOB.ash_storm_sounds -= mountain_longrain return ..() /datum/looping_sound/active_outside_longrain mid_sounds = list('modular_citadel/code/modules/eventmaps/Spookystation/outsideloop1.ogg'=1, 'modular_citadel/code/modules/eventmaps/Spookystation/outsideloop2.ogg'=1) mid_length = 3.8 //ahahaa aaaaaaaaaa fucking shit man, but its what I got. volume = 70 start_sound = 'sound/ambience/acidrain_start.ogg' start_length = 13 end_sound = 'sound/ambience/acidrain_end.ogg' /datum/looping_sound/active_inside_longrain mid_sounds = list('modular_citadel/code/modules/eventmaps/Spookystation/insideloop1.ogg'=1, 'modular_citadel/code/modules/eventmaps/Spookystation/insideloop2.ogg'=1, 'modular_citadel/code/modules/eventmaps/Spookystation/insideloop3.ogg'=1, 'modular_citadel/code/modules/eventmaps/Spookystation/insideloop4.ogg'=1) mid_length = 5.1 //AAAAAAAAAAAAAAAAAAAAAAA volume = 60 /datum/looping_sound/active_mountain_longrain mid_sounds = list('modular_citadel/code/modules/eventmaps/Spookystation/basecaveloop.ogg'=1) mid_length = 12 //Why are we still here? Just to suffer? volume = 60 /* GRANDFATHER CLOCK */ /* 1:00 AM - overlay-2 2:00 AM - overlay-2 3:00 AM - overlay-3 4:00 AM - overlay-4 5:00 AM - overlay-4 6:00 AM - overlay-6 7:00 AM - overlay-7 8:00 AM - overlay-7 9:00 AM - overlay-9 10:00 AM - overlay-10 11:00 AM - overlay-10 12:00 AM - overlay-0 */ /obj/machinery/grandfatherclock name = "Grandfather Clock" desc = "Keeps track of the time with its dials." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/clock32x49.dmi' icon_state = "grandfathermk4right" density = 1 anchored = 1 use_power = 0 max_integrity = 250 var/HRimgstate = "asshouroverlay-0" var/MMimgstate = "assminuteoverlay-0" var/ticktock = 0 // We hold this here var/dyndial_cycle_ticker = 0 //How many var/playchime = 1 //Procs will reset their vars. /obj/machinery/grandfatherclock/Initialize(mapload) . = ..() update_icon() //We get it done /obj/machinery/grandfatherclock/process() doodad_clock_ticker() /obj/machinery/grandfatherclock/proc/doodad_clock_ticker() //We basically throttle the rest of this machine here. dyndial_cycle_ticker++ if(ticktock) //If we are true playsound(src.loc, 'modular_citadel/code/modules/eventmaps/Spookystation/Tock.ogg', 100,0) icon_state = "grandfathermk4right" flick("tick", src) ticktock = 0 //Play this noise set to false else playsound(src.loc, 'modular_citadel/code/modules/eventmaps/Spookystation/Tick.ogg', 100,0) flick("tock", src) icon_state = "grandfathermk4left" ticktock = 1 //If we are not true, play this noise set to true if(dyndial_cycle_ticker >= 20) //Handles the dynamic dial dyndial_cycle() dyndial_cycle_ticker = 0 /obj/machinery/grandfatherclock/proc/dyndial_cycle() var/ass_time = STATION_TIME(TRUE, world.time) //Fun fact, space station time has a timezone offset, If its not on display time. I added world.time to fix the compile error. I dunno if it works as intended still!! var/hour = (text2num(time2text(ass_time, "hh"))%12) var/minute = text2num(time2text(ass_time, "mm")) //to_chat(world, "dyndial cycle current says: [hour]:[minute] - Ass_time currently says [ass_time]") if(playchime && hour == 0) playsound(src.loc, 'modular_citadel/code/modules/eventmaps/Spookystation/midnightchime.ogg', 100, 0) playchime = 0 if(!playchime && hour == 11) playchime = 1 switch(hour) if(1, 2) HRimgstate = "asshouroverlay-2" //Now it is ass, mostly because someones going to kill me for the other names. if(3) HRimgstate = "asshouroverlay-3" if(4, 5) HRimgstate = "asshouroverlay-4" if(6) HRimgstate = "asshouroverlay-6" if(7, 8) HRimgstate = "asshouroverlay-7" if(9) HRimgstate = "asshouroverlay-9" if(10, 11) HRimgstate = "asshouroverlay-10" else HRimgstate = "asshouroverlay-0" //Station time wraps to 0, and so does our hours. switch(minute) if(0 to 3) MMimgstate = "assminuteoverlay-0" if(4 to 15) MMimgstate = "assminuteoverlay-2" if(16 to 22) MMimgstate = "assminuteoverlay-3" if(23 to 28) MMimgstate = "assminuteoverlay-4" if(29 to 33) MMimgstate = "assminuteoverlay-6" if(34 to 41) MMimgstate = "assminuteoverlay-7" if(42 to 49) MMimgstate = "assminuteoverlay-9" if(50 to 57) MMimgstate = "assminuteoverlay-10" else MMimgstate = "assminuteoverlay-0" //This has 58 to 60 and everything else. update_icon() //Everything is set, lets update. /obj/machinery/grandfatherclock/update_icon() cut_overlays() //We cut the overlays. add_overlay(MMimgstate) //And append our new states, Minute add_overlay(HRimgstate) //Hour. /* The Flora that is generated onto the basic grassturf, or can be placed for tone building. */ //For ease of use, I should have appended it all here.. //Stripped the other segments out, people don't need hay and interactions right now you know man? //Technically we could also randomize the pixel_x, pixel_y placement of these guys for more dynamic thickets. /obj/structure/flora/grass/spookytime icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' //32x32 iconfile desc = "Some dry, virtually dead grass, cause its fall and not a wasteland this time." icon_state = "tall_grass_1" /obj/structure/flora/grass/spookytime/New() ..() icon_state = "tall_grass_[rand(1,8)]" //We have 8 states. /obj/structure/flora/grass/spookytime/attackby(obj/item/W, mob/user, params) if(W.sharpness && W.force > 0 && !(NODECONSTRUCT_1 in flags_1)) to_chat(user, "You begin to harvest [src]...") if(do_after(user, 100/W.force, target = user)) to_chat(user, "You've collected [src]") var/obj/item/stack/sheet/hay/H = user.get_inactive_held_item() if(istype(H)) H.add(1) else new /obj/item/stack/sheet/hay/(get_turf(src)) qdel(src) return TRUE else . = ..() /obj/structure/flora/tree/spookytime name = "dead tree" desc = "It's a tree. Useful for combustion and/or construction." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile64.dmi' //64x64 iconfile icon_state = "deadtree_1" log_amount = 3 density = 1 obj_integrity = 100 max_integrity = 100 /obj/structure/flora/tree/spookytime/New() icon_state = "deadtree_[rand(1,6)]" //We have 6 states ..() /obj/structure/flora/tree/spookytimexl name = "tall dead tree" desc = "It's a tree. Useful for combustion and/or construction. This ones quite tall" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/talltree128.dmi' icon_state = "tree_1" log_amount = 12 density = 1 obj_integrity = 200 max_integrity = 200 /obj/structure/flora/tree/spookytimexl/New() icon_state = "tree_[rand(1,3)]" //We have 3 states. ..() /obj/structure/flora/tree/spookybranch name = "fallen branch" desc = "A branch from a tree" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "branch_1" log_amount = 1 density = 0 obj_integrity = 30 max_integrity = 30 /obj/structure/flora/tree/spookybranch/New() icon_state = "branch_[rand(1,4)]" ..() /obj/structure/flora/tree/spookylog name = "fallen tree" desc = "A tree, that turned horizontal after it died" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "timber" log_amount = 5 density = 0 obj_integrity = 100 max_integrity = 100 //only got one state man. /obj/structure/flora/spookyrock name = "rock" desc = "Its a rock man. Hard as shit, and for you quite impassible." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "rock_1" density = 1 /obj/structure/flora/spookyrock/New() icon_state = "rock_[rand(1,3)]" ..() /* WALLS - BECAUSE I HAD TO REPLACE ALL OF THEM ON THE MAP AND DO IT RIGHT THIS TIME */ /turf/closed/wall/mineral/wood /obj/structure/falsewall/wood //Due to the behavior of walls generally, I'm not going to make a microcosm of full flexibility //and functionability for a ball map, but heres everything we are usually using for future reference. /* TURF DIRECTIONALS, OVERALL SPAMMED STUFF ETC */ //Mostly here because I was tired of searching the top stuff. //Damaged plasteel plates, cause fuck varediting all these icons my man. //Just search damturf for the tree /turf/open/floor/plasteel/damturf //ez search plasteel parent /turf/open/floor/plasteel/damturf/damage1 icon_state = "damaged1" /turf/open/floor/plasteel/damturf/damage2 icon_state = "damaged2" /turf/open/floor/plasteel/damturf/ icon_state = "damaged3" /turf/open/floor/plasteel/damturf/damage4 icon_state = "damaged4" /turf/open/floor/plasteel/damturf/damage5 icon_state = "damaged5" /turf/open/floor/plasteel/damturf/scorched icon_state = "panelscorched" /turf/open/floor/plasteel/damturf/scorched1 icon_state = "floorscorched1" /turf/open/floor/plasteel/damturf/scorched2 icon_state = "floorscorched2" /turf/open/floor/plasteel/damturf/platdmg1 icon_state = "platingdmg1" /turf/open/floor/plasteel/damturf/platdmg2 icon_state = "platingdmg2" /turf/open/floor/plasteel/damturf/platdmg3 icon_state = "platingdmg3" /turf/open/floor/wood/damturf //ez search wood parent /turf/open/floor/wood/damturf/broken1 icon_state = "wood-broken" /turf/open/floor/wood/damturf/broken2 icon_state = "wood-broken2" /turf/open/floor/wood/damturf/broken3 icon_state = "wood-broken3" /turf/open/floor/wood/damturf/broken4 icon_state = "wood-broken4" /turf/open/floor/wood/damturf/broken5 icon_state = "wood-broken5" /turf/open/floor/wood/damturf/broken6 icon_state = "wood-broken6" /turf/open/floor/wood/damturf/broken7 icon_state = "wood-broken7" //Parent that goes into coasts too /turf/open/floor/spooktime/beach //laketime gender = PLURAL name = "sand" desc = "ITS SAND!" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "sand" bullet_bounce_sound = null tiled_dirt = 0 var/turfverb = "dig up" baseturfs = /turf/open/floor/plating/spookbase/sandattachmentpoint //Alas, now people can dig out lakes. /turf/open/floor/spooktime/beach/attackby(obj/item/C, mob/user, params) //We dig it out with a shovel. if((C.tool_behaviour == TOOL_SHOVEL) && params) //And beneath it we reveal dirt new /obj/item/stack/tile/normalasssand(src) //EDIT THIS user.visible_message("[user] digs up [src].", "You [turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) return //Beaches and coasts and sand and shit. /turf/open/floor/spooktime/beach/coasts gender = NEUTER name = "coastline" desc = "The coastline of a sandy shore" icon_state = "sandwater_t_S" /turf/open/floor/spooktime/beach/coasts/attackby(obj/item/C, mob/user, params) return //Upon testing, digging out the coasts makes the map look like ass. //The water that follows the coastline also animated. /turf/open/floor/spooktime/beach/coasts/coastS icon_state = "sandwater_t_S" /turf/open/floor/spooktime/beach/coasts/coastN icon_state = "sandwater_t_N" /turf/open/floor/spooktime/beach/coasts/coastE icon_state = "sandwater_t_E" /turf/open/floor/spooktime/beach/coasts/coastW icon_state = "sandwater_t_W" /turf/open/floor/spooktime/beach/coasts/coastSE icon_state = "sandwater_t_SE" /turf/open/floor/spooktime/beach/coasts/coastSW icon_state = "sandwater_t_SW" /turf/open/floor/spooktime/beach/coasts/coastNE icon_state = "sandwater_t_NE" /turf/open/floor/spooktime/beach/coasts/coastNW icon_state = "sandwater_t_NW" //The coastline itself with sand /turf/open/floor/spooktime/beach/coasts/watercoastS icon_state = "sandwater_b_S" /turf/open/floor/spooktime/beach/coasts/watercoastN icon_state = "sandwater_b_N" /turf/open/floor/spooktime/beach/coasts/watercoastW icon_state = "sandwater_b_W" /turf/open/floor/spooktime/beach/coasts/watercoastE icon_state = "sandwater_b_E" /turf/open/floor/spooktime/beach/coasts/watercoastSE icon_state = "sandwater_b_SE" /turf/open/floor/spooktime/beach/coasts/watercoastSW icon_state = "sandwater_b_SW" /turf/open/floor/spooktime/beach/coasts/watercoastNE icon_state = "sandwater_b_NE" /turf/open/floor/spooktime/beach/coasts/watercoastNW icon_state = "sandwater_b_NW" //Beach corners /turf/open/floor/spooktime/beach/coasts/innerN icon_state = "sandwater_inner_N" /turf/open/floor/spooktime/beach/coasts/innerS icon_state = "sandwater_inner_S" /turf/open/floor/spooktime/beach/coasts/innerE icon_state = "sandwater_inner_E" /turf/open/floor/spooktime/beach/coasts/innerW icon_state = "sandwater_inner_W" //Shallow water same color as beach water /turf/open/floor/spooktime/beach/water name = "water" desc = "Its water that seems to be a bit deep, still can wade through though." icon_state = "water" bullet_sizzle = 1 footstep = FOOTSTEP_WATER barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER /turf/open/floor/spooktime/beach/water/attackby(obj/item/C, mob/user, params) return //haha nope //Slightly darker than the beach water color. /turf/open/floor/spooktime/beach/watersolid //Gotta stop you at a certain point man name = "water" desc = "Water thats deep enough to where your spaceman ass cannot swim." icon_state = "water2" //Now its darker lol bullet_sizzle = 1 density = 1 //We are now dense footstep = FOOTSTEP_WATER barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER /turf/open/floor/spooktime/beach/watersolid/attackby(obj/item/C, mob/user, params) return //You aren't digging my lake out unless I want you to fool. //Motion river water with the lighting on it. /turf/open/floor/spooktime/riverwatermotion gender = PLURAL name = "water" desc = "Shallow water." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "riverwater_motion" slowdown = 1 bullet_sizzle = 1 bullet_bounce_sound = null //needs a splashing sound one day. footstep = FOOTSTEP_WATER barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER //No motion river water with the lighting on it. /turf/open/floor/spooktime/riverwatermotion/nomotion icon_state = "riverwater" //Cobblestone and all of its directions tied to the parent. /turf/open/floor/spooktime/cobble //Middle and parent name = "cobblestone path" //We don't use directional varedits otherwise the map can load them incorrect. desc = "A simple but beautiful path made of various sized stones." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "cobble_mid" //as to why? Sometimes it will spawn the turf elsewhere and move it into place. //That means the direction will change because of this movement, usually when theres things ontop of it. footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = 0 /turf/open/floor/spooktime/cobble/cornerNW //First corner icon_state = "cobble_corner_nw" /turf/open/floor/spooktime/cobble/cornerNE //Now that these are hardcoded individuals. icon_state = "cobble_corner_ne" //Movement won't change what they are on mapload. /turf/open/floor/spooktime/cobble/cornerSW icon_state = "cobble_corner_sw" /turf/open/floor/spooktime/cobble/cornerSE //I found i don't need most of these but still lol. icon_state = "cobble_corner_se" /turf/open/floor/spooktime/cobble/sideN //First Side icon_state = "cobble_side_n" /turf/open/floor/spooktime/cobble/sideS icon_state = "cobble_side_s" /turf/open/floor/spooktime/cobble/sideE icon_state = "cobble_side_e" /turf/open/floor/spooktime/cobble/sideW icon_state = "cobble_side_w" //A tiny tiny bit of the total road icon file from f13 edited for grass not desert hastily. //Theres something like 30 pieces including crosswalks, sidewalks, potholes and other shit in it man. /turf/open/floor/spooktime/cobble/roadmid //Center piece name = "road" desc = "Its asphault alright" icon_state = "road" /turf/open/floor/spooktime/cobble/roadsideN //road edges, I have a lot of these icon_state = "road_side_N" /turf/open/floor/spooktime/cobble/roadsideS //But i don't feel like adding them all for a temp map. icon_state = "road_side_S" /turf/open/floor/spooktime/cobble/roadsideE icon_state = "road_side_E" /turf/open/floor/spooktime/cobble/roadsideW icon_state = "road_side_W" /turf/open/floor/spooktime/cobble/roadcornerSW icon_state = "road_corner_sw" /turf/open/indestructible/spooknecropolis name = "necropolis floor" desc = "It's regarding you suspiciously." icon = 'icons/turf/floors.dmi' icon_state = "necro1" baseturfs = /turf/open/indestructible/necropolis footstep = FOOTSTEP_LAVA barefootstep = FOOTSTEP_LAVA clawfootstep = FOOTSTEP_LAVA heavyfootstep = FOOTSTEP_LAVA tiled_dirt = FALSE //Fermis's umbrella /obj/item/umbrella name = "umbrella" desc = "To keep the rain off you. Use with caution on windy days." icon = 'icons/obj/items_and_weapons.dmi' lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' icon_state = "umbrella_closed" slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 5 w_class = WEIGHT_CLASS_SMALL var/open = FALSE /obj/item/umbrella/Initialize(mapload) ..() color = RANDOM_COLOUR update_icon() /obj/item/umbrella/attack_self() toggle_umbrella() /obj/item/umbrella/proc/toggle_umbrella() open = !open icon_state = "umbrella_[open ? "open" : "closed"]" item_state = icon_state update_icon() //Keep the mechs out of the mech arena /obj/structure/trap/ctf/nomech name = "anti-mech barrier" desc = "attempts to bring mechs into the regular ball space may result in spontaneous crabification" /obj/structure/trap/ctf/nomech/Crossed(atom/movable/AM) if(is_type_in_typecache(AM, ignore_typecache)) return flare() if(ismecha(AM) || istype(AM, /obj/item/mecha_parts) || istype(AM, /obj/structure/mecha_wreckage)) qdel(AM) /* Shitty Hay Objects Sprited by me in a rush when I was half-asleep at 9am + The material */ GLOBAL_LIST_INIT(hay_recipes, list ( \ new/datum/stack_recipe("Rice Hat", /obj/item/clothing/head/rice_hat, 4, time = 5, one_per_turf = 0, on_floor = 0), \ new/datum/stack_recipe("Hay Bed", /obj/structure/bed/badhaybed, 4, time = 15, one_per_turf = 1, on_floor = 0), \ new/datum/stack_recipe("Wicker Basket", /obj/structure/closet/crate/awfulwickerbasket, 5, time = 40, one_per_turf = 0, on_floor = 1), \ )) //Thanks Gomble /obj/item/stack/sheet/hay name = "hay" desc = "A bundle of hay. Food for livestock, and useful for weaving. Hail the Wickerman." singular_name = "hay stalk" icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "hay" item_state = "hay" force = 1 throwforce = 1 throw_speed = 1 throw_range = 2 max_amount = 500 attack_verb = list("tickled", "poked", "whipped") hitsound = 'sound/weapons/grenadelaunch.ogg' /obj/item/stack/sheet/hay/get_main_recipes() . = ..() . += GLOB.hay_recipes /obj/item/stack/sheet/hay/fifty amount = 50 /obj/item/stack/sheet/hay/twenty amount = 20 /obj/item/stack/sheet/hay/ten amount = 10 /obj/item/stack/sheet/hay/five amount = 5 /obj/item/stack/sheet/hay/update_icon_state() var/amount = get_amount() if((amount <= 4) && (amount > 0)) icon_state = "hay[amount]" else icon_state = "hay" /* Hay Objects hastily drawn by me at 9am in a rush. */ //Shitty bed /obj/structure/bed/badhaybed name = "Low-quality Hay Bed" desc = "It looks like someone hastily put this together, even if the builder didn't." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "shitty_hay_bed" anchored = 1 can_buckle = 1 buckle_lying = 1 resistance_flags = FLAMMABLE max_integrity = 50 integrity_failure = 30 buildstacktype = /obj/item/stack/sheet/hay buildstackamount = 5 //Awful Wicker Basket /obj/structure/closet/crate/awfulwickerbasket name = "Low-quality Wicker Basket" desc = "A handmade wicker basket, you don't know why it looks like this. But you probably don't like it." icon = 'modular_citadel/code/modules/eventmaps/Spookystation/iconfile32.dmi' icon_state = "shitty_basket" //yes, there is no space on crates so the other state is shitty_basketopen resistance_flags = FLAMMABLE material_drop = /obj/item/stack/sheet/hay material_drop_amount = 5