From 65b53bd128723da8e6eefde5568ceb3fc28c91a4 Mon Sep 17 00:00:00 2001 From: EvilDragonfiend <87972842+EvilDragonfiend@users.noreply.github.com> Date: Sun, 4 Aug 2024 11:05:27 +0900 Subject: [PATCH] New mapping helper: Spaceproof/Group directional windows, new maint room (#10322) * New mapper, new maint room * change name * Update random_rooms.dm * Update mapping_helpers.dm * Removes the wrong comment * things updated * dmi merge * rename * fixes wrong name * plasteel path update --- .../10x10/sk_rdm176_spacewindowroom.dmm | 143 +++++++++++++++ .../objects/effects/spawners/roomspawner.dm | 52 +++++- code/modules/mapping/mapping_helpers.dm | 173 ++++++++++++++++++ code/modules/mapping/random_rooms.dm | 9 + icons/effects/mapping_helpers.dmi | Bin 9543 -> 11119 bytes 5 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 _maps/RandomRooms/10x10/sk_rdm176_spacewindowroom.dmm diff --git a/_maps/RandomRooms/10x10/sk_rdm176_spacewindowroom.dmm b/_maps/RandomRooms/10x10/sk_rdm176_spacewindowroom.dmm new file mode 100644 index 0000000000000..3ab666b30ba50 --- /dev/null +++ b/_maps/RandomRooms/10x10/sk_rdm176_spacewindowroom.dmm @@ -0,0 +1,143 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/effect/mapping_helpers/space_window_placer, +/turf/open/space/basic, +/area/template_noop) +"k" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/template_noop) +"t" = ( +/turf/open/floor/iron, +/area/template_noop) +"G" = ( +/obj/effect/mapping_helpers/space_window_placer, +/obj/effect/spawner/lootdrop/maintenance/four, +/turf/open/space/basic, +/area/template_noop) +"Y" = ( +/obj/effect/mapping_helpers/space_window_placer, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/space/basic, +/area/template_noop) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +k +t +t +t +t +t +t +k +b +"} +(3,1,1) = {" +b +t +G +b +t +t +b +G +t +b +"} +(4,1,1) = {" +b +t +b +k +t +t +k +b +t +b +"} +(5,1,1) = {" +b +t +t +t +Y +Y +t +t +t +b +"} +(6,1,1) = {" +b +t +t +t +b +Y +t +t +t +b +"} +(7,1,1) = {" +b +t +b +k +t +t +k +b +t +b +"} +(8,1,1) = {" +b +t +G +b +t +t +b +G +t +b +"} +(9,1,1) = {" +b +k +t +t +t +t +t +t +k +b +"} +(10,1,1) = {" +b +b +b +b +b +b +b +b +b +b +"} diff --git a/code/game/objects/effects/spawners/roomspawner.dm b/code/game/objects/effects/spawners/roomspawner.dm index 01f3e47265ad3..2444e6cf3aca1 100644 --- a/code/game/objects/effects/spawners/roomspawner.dm +++ b/code/game/objects/effects/spawners/roomspawner.dm @@ -42,13 +42,61 @@ room_width = 10 room_height = 5 icon_state = "random_room_alternative" - rooms = list("sk_rdm011_barbershop","sk_rdm031_deltarobotics","sk_rdm039_deltaclutter1","sk_rdm040_deltabotnis","sk_rdm045_deltacafeteria","sk_rdm046_deltaarcade","sk_rdm082_maintmedical","sk_rdm091_skidrow","sk_rdm100_meetingroom","sk_rdm105_phage","sk_rdm125_courtroom","sk_rdm126_gaschamber","sk_rdm127_oldaichamber","sk_rdm128_radiationtherapy","sk_rdm150_smallmedlobby","sk_rdm151_ratburger","sk_rdm152_geneticsoffice","sk_rdm153_hobowithpeter","sk_rdm154_butchersden","sk_rdm155_punjiconveyor","sk_rdm156_oldairlock_interchange","sk_rdm161_kilovault") + rooms = list( + "sk_rdm011_barbershop", + "sk_rdm031_deltarobotics", + "sk_rdm039_deltaclutter1", + "sk_rdm040_deltabotnis", + "sk_rdm045_deltacafeteria", + "sk_rdm046_deltaarcade", + "sk_rdm082_maintmedical", + "sk_rdm091_skidrow", + "sk_rdm100_meetingroom", + "sk_rdm105_phage", + "sk_rdm125_courtroom", + "sk_rdm126_gaschamber", + "sk_rdm127_oldaichamber", + "sk_rdm128_radiationtherapy", + "sk_rdm150_smallmedlobby", + "sk_rdm151_ratburger", + "sk_rdm152_geneticsoffice", + "sk_rdm153_hobowithpeter", + "sk_rdm154_butchersden", + "sk_rdm155_punjiconveyor", + "sk_rdm156_oldairlock_interchange", + "sk_rdm161_kilovault") /obj/effect/spawner/room/special/tenxten_terrestrial name = "10x10 terrestrial room" room_width = 10 room_height = 10 icon_state = "random_room_alternative" - rooms = list("sk_rdm033_deltalibrary","sk_rdm060_snakefighter","sk_rdm062_roosterdome","sk_rdm070_pubbybar","sk_rdm083_bigtheatre","sk_rdm098_graffitiroom","sk_rdm102_podrepairbay","sk_rdm106_sanitarium","sk_rdm129_beach","sk_rdm130_benoegg","sk_rdm131_confinementroom","sk_rdm132_conveyorroom","sk_rdm133_oldoffice","sk_rdm134_snowforest","sk_rdm141_6sectorsdown","sk_rdm142_olddiner","sk_rdm143_gamercave","sk_rdm144_smallmagician","sk_rdm145_ladytesla_altar","sk_rdm146_blastdoor_interchange","sk_rdm147_advbotany","sk_rdm148_botany_apiary","sk_rdm157_chess","sk_rdm159_kilosnakepit","sk_rdm167_library_ritual") + rooms = list( + "sk_rdm033_deltalibrary", + "sk_rdm060_snakefighter", + "sk_rdm062_roosterdome", + "sk_rdm070_pubbybar", + "sk_rdm083_bigtheatre", + "sk_rdm098_graffitiroom", + "sk_rdm102_podrepairbay", + "sk_rdm106_sanitarium", + "sk_rdm129_beach", + "sk_rdm130_benoegg", + "sk_rdm131_confinementroom", + "sk_rdm132_conveyorroom", + "sk_rdm133_oldoffice", + "sk_rdm134_snowforest", + "sk_rdm141_6sectorsdown", + "sk_rdm142_olddiner", + "sk_rdm143_gamercave", + "sk_rdm144_smallmagician", + "sk_rdm145_ladytesla_altar", + "sk_rdm146_blastdoor_interchange", + "sk_rdm147_advbotany", + "sk_rdm148_botany_apiary", + "sk_rdm157_chess", + "sk_rdm159_kilosnakepit", + "sk_rdm167_library_ritual", + "sk_rdm176_spacewindowroom") /obj/effect/spawner/room/fivexfour name = "5x4 room spawner" room_width = 5 diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index c8b48f2ac056f..bffe486e34f8c 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -394,3 +394,176 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) qdel(src) return CRASH("Failed to find a portable atmospherics or a portables connector at [AREACOORD(src)]") + +// This will put directional windows to adjucant turfs if airs will likely be vaccuumed. +// Putting this on a space turf is recommended. If you put this on an open tile, it will place directional windows anyway. +// If a turf is not valid to put a tile, it will automatically make a turf for failsafe. +// NOTE: This helper is specialised for space-proof, not just for standard mapping. +/obj/effect/mapping_helpers/space_window_placer + name = "Placer: Spaceproof directional windows" + icon_state = "space_directional_window_placer" + late = TRUE + + /** Mapper options **/ + /// Determines which window type it will create + var/window_type = /obj/structure/window/reinforced + + /** internal code variables - not for mappers **/ + /// used to skip a direction on a turf + var/skip_direction + /// there are a few stuff that "CanAtmosPass()" is not reliable + var/static/list/unliable_atmos_blockers + + +/obj/effect/mapping_helpers/space_window_placer/Initialize(mapload) + . = ..() + if(!unliable_atmos_blockers) + unliable_atmos_blockers = typecacheof(list(/obj/machinery/door)) + +/obj/effect/mapping_helpers/space_window_placer/LateInitialize() + . = ..() + if(!z || !x || !y) + CRASH("It's not unable to place Spaceproof directional windoe placer - xyz is null.") + + var/turf/my_turf = get_turf(src) + if(!my_turf) + CRASH("Spaceproof directional windoe placer failed to find a turf.") + + // checks if turfs are fine to place a directional window + var/unliable_atmos_blocking + for(var/turf/each_turf in get_adjacent_open_turfs(my_turf)) + if(isspaceturf(each_turf) || isopenspace(each_turf)) + continue + + if(!each_turf.CanAtmosPass(my_turf)) + for(var/atom/movable/movable_content as anything in each_turf.contents) + if(is_type_in_typecache(movable_content, unliable_atmos_blockers)) + unliable_atmos_blocking = TRUE + break + if(unliable_atmos_blocking) + break + + var/list/nearby_turfs = list() + for(var/turf/each_turf in get_adjacent_open_turfs(my_turf)) + if(unliable_atmos_blocking) + var/obj/effect/mapping_helpers/space_window_placer/nearby_placer = locate() in each_turf + if(nearby_placer) // we don't place windows there + give a value to skip directon + nearby_placer.skip_direction |= get_dir(each_turf, my_turf) + continue + if(skip_direction & get_dir(my_turf, each_turf)) + continue + nearby_turfs += each_turf + + + // well, it's a bad idea to put a directional window here. Mapping failsafe process here. + if(unliable_atmos_blocking && (isspaceturf(my_turf) || isopenspace(my_turf))) + my_turf.PlaceOnTop(list(/turf/open/floor/plating, /turf/open/floor/iron), flags = CHANGETURF_INHERIT_AIR) + for(var/turf/each_turf in nearby_turfs) + if(isspaceturf(each_turf) || isopenspace(each_turf)) + var/obj/d_glass = new window_type(my_turf) + d_glass.dir = get_dir(my_turf, each_turf) + else + var/improper_dir = get_dir(each_turf, my_turf) + for(var/obj/structure/window/d_glass in each_turf.contents) + if(d_glass.dir == improper_dir) + qdel(d_glass) + qdel(src) + return + + // puts a directional window for each direction. + for(var/turf/each_turf in nearby_turfs) + if(!each_turf.CanAtmosPass(my_turf) || isspaceturf(each_turf) || isopenspace(each_turf)) + continue + + var/obj/d_glass = new window_type(each_turf) + d_glass.dir = get_dir(d_glass, my_turf) + + qdel(src) + +/obj/effect/mapping_helpers/group_window_placer + name = "Placer: Grouped directional windows" + icon_state = "group_directional_window_placer" + late = TRUE + + /** Mapper options **/ + /// Determines which window type it will create. + /// Make a subtype of this mapping helper to change this value instead of manual change in DMM. + var/window_type = /obj/structure/window/reinforced + /// Directional window will not be placed to a direction from the adjacent turf where a fulltile glass exists. + /// If you set this TRUE, the windows will be placed. + var/place_onto_fulltile_window + /// Set TRUE to ignore group chain initialization + var/single + + /** internal code variables - not for mappers **/ + /// failsafe var to prevent it to run a code + var/to_be_initialized + /// a list of mappers that will be initialized together. + var/list/init_group + +/obj/effect/mapping_helpers/group_window_placer/LateInitialize() + . = ..() + if(to_be_initialized) + return + + if(!z || !x || !y) + CRASH("It's not unable to use group_window_placer - xyz is null.") + + var/turf/my_turf = get_turf(src) + if(!my_turf) + CRASH("group_window_placer failed to find a turf.") + + if(single) + to_be_initialized = TRUE + finish_late_init(list(WEAKREF(src))) + return + + init_group = list() + build_group(init_group) + finish_late_init() + +/obj/effect/mapping_helpers/group_window_placer/proc/build_group(list/chain_init_group) + if(to_be_initialized) // shouldn't reach here but just in case + return + to_be_initialized = TRUE + chain_init_group[WEAKREF(src)] = TRUE + for(var/turf/each_turf in get_adjacent_open_turfs(get_turf(src))) + var/obj/effect/mapping_helpers/group_window_placer/placer = locate() in each_turf + if(!placer || chain_init_group[WEAKREF(placer)] || placer.to_be_initialized) + continue + placer.build_group(chain_init_group) + +/obj/effect/mapping_helpers/group_window_placer/proc/finish_late_init() + for(var/datum/weakref/each_ref in init_group) + var/obj/effect/mapping_helpers/group_window_placer/each_placer = each_ref.resolve() + var/turf/my_turf = get_turf(each_placer) + var/list/nearby_turfs = list() + for(var/turf/each_turf in get_adjacent_open_turfs(my_turf)) + if(each_turf.density) + continue + if(locate(/obj/effect/mapping_helpers/group_window_placer) in each_turf) + continue + // skip this - that direction should be connected + if(locate(/obj/effect/mapping_helpers/space_window_placer) in each_turf) + continue + // skip this - you won't want to have two directional window in the same directional spot. + // NOTE: this is "SPACE" window placer, not "GROUP" + if(place_onto_fulltile_window) + var/is_fulltile + for(var/obj/structure/window/window_on_turf in my_turf.contents) + if(window_on_turf.fulltile) + is_fulltile = TRUE + break + if(is_fulltile) + continue + nearby_turfs += each_turf + + for(var/turf/each_turf in nearby_turfs) + var/obj/d_glass = new each_placer.window_type(my_turf) + d_glass.dir = get_dir(my_turf, each_turf) + + for(var/datum/weakref/each_ref in init_group) + var/obj/effect/mapping_helpers/group_window_placer/each_placer = each_ref.resolve() + qdel(each_placer) + init_group.Cut() + diff --git a/code/modules/mapping/random_rooms.dm b/code/modules/mapping/random_rooms.dm index 1e884ffbf0f9c..fc0559e960894 100644 --- a/code/modules/mapping/random_rooms.dm +++ b/code/modules/mapping/random_rooms.dm @@ -1509,6 +1509,15 @@ template_width = 5 weight = 2 +/datum/map_template/random_room/sk_rdm176 + name = "Room with spaceproof windows" + room_id = "sk_rdm176_spacewindowroom" + mappath = "_maps/RandomRooms/10x10/sk_rdm176_spacewindowroom.dmm" + centerspawner = FALSE + template_height = 10 + template_width = 10 + weight = 1 + //Flandstation Dedicated Random Room /datum/map_template/random_room/sk_rdm_fln_01 diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 08d666a0a614e34b97563cb112b5117893b58ec4..ddaf12b1677f391b27af9eb5e0dcd71f81fb13f6 100644 GIT binary patch literal 11119 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 vgAr4+mjIhaf~BwfOH#(0003WdQ@0+L}hbh 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