From 430896b5cf6b786d1e70e7d73c0faccf4f3ca355 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 10 Apr 2024 18:55:29 +0000 Subject: [PATCH] Blueprints tgui (#82565) ## About The Pull Request Blueprints now use a TGUI panel instead of the old HTML one. Also did general code improvement and maintaining to blueprints in general and also destroyed the ``areaeditor`` level, repathing it to just 'blueprints'. Also adds a sound when you look at structural data cause why not Video demonstration: https://github.com/tgstation/tgstation/assets/53777086/861773fd-3d57-472d-bc94-d67b0d4f1dbd The 4 blueprint types: ![image](https://github.com/tgstation/tgstation/assets/53777086/bfd68eb5-c430-4608-a3f7-d6ac86727882) ## Why It's Good For The Game Another HTML menu dead underground. This is more responsive and doesn't require constant updating to see which area you're in, feels less OOC (instead of saying "the blueprints say", just say it, you ARE the blueprints). Like, come on ![image](https://github.com/tgstation/tgstation/assets/53777086/fcf1b8b6-37c3-4c94-969f-3b121c983dc0) Look at all this wasted space ![image](https://github.com/tgstation/tgstation/assets/53777086/1d3e61cd-bc56-4280-a3bb-0c66604e75b3) ## Changelog :cl: refactor: Blueprints now use TGUI. qol: Blueprints can now be used while lying down. /:cl: --- .../RandomRuins/AnywhereRuins/golem_ship.dmm | 2 +- code/__DEFINES/_flags.dm | 2 +- code/__DEFINES/area_editor.dm | 5 - code/__HELPERS/areas.dm | 48 ++ code/__HELPERS/turfs.dm | 17 + code/datums/wires/_wires.dm | 2 +- code/game/gamemodes/objective_items.dm | 8 +- code/game/machinery/barsigns.dm | 5 +- code/game/objects/items/blueprints.dm | 409 +++++++++--------- .../closets/secure/engineering.dm | 2 +- code/modules/clothing/outfits/ert.dm | 2 +- code/modules/hallucination/fake_message.dm | 2 +- code/modules/mining/boulder_processing/brm.dm | 2 +- .../mob/living/silicon/robot/robot_model.dm | 2 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/photography/camera/camera.dm | 2 +- .../chemistry/recipes/slime_extracts.dm | 2 +- code/modules/recycling/conveyor.dm | 4 +- .../research/xenobiology/xenobiology.dm | 14 - sound/attributions.txt | 3 + sound/items/paper_flip.ogg | Bin 0 -> 15804 bytes tgstation.dme | 1 - tgui/packages/tgui/interfaces/Blueprints.tsx | 186 ++++++++ .../Scripts/74147_tech_disk_repath.txt | 2 +- .../Scripts/82565_blueprints_repath.txt | 1 + 25 files changed, 481 insertions(+), 244 deletions(-) delete mode 100644 code/__DEFINES/area_editor.dm create mode 100644 sound/items/paper_flip.ogg create mode 100644 tgui/packages/tgui/interfaces/Blueprints.tsx create mode 100644 tools/UpdatePaths/Scripts/82565_blueprints_repath.txt diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm index 61311b3f036..cddd5a08206 100644 --- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm +++ b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm @@ -337,7 +337,7 @@ /area/ruin/powered/golem_ship) "un" = ( /obj/structure/table/wood, -/obj/item/areaeditor/blueprints/golem{ +/obj/item/blueprints/golem{ pixel_y = 3; pixel_x = -2 }, diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 8597092fbf6..5969f81bccb 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -115,7 +115,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define UNIQUE_AREA (1<<8) /// If people are allowed to suicide in it. Mostly for OOC stuff like minigames #define BLOCK_SUICIDE (1<<9) -/// Can the Xenobio management console transverse this area by default? +/// If set, this area will be innately traversable by Xenobiology camera consoles. #define XENOBIOLOGY_COMPATIBLE (1<<10) /// If Abductors are unable to teleport in with their observation console #define ABDUCTOR_PROOF (1<<11) diff --git a/code/__DEFINES/area_editor.dm b/code/__DEFINES/area_editor.dm deleted file mode 100644 index f0ef57c7e52..00000000000 --- a/code/__DEFINES/area_editor.dm +++ /dev/null @@ -1,5 +0,0 @@ -// Used to edit areas. -#define AREA_ERRNONE 0 -#define AREA_STATION 1 -#define AREA_SPACE 2 -#define AREA_SPECIAL 3 diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 8df182c90d0..dc2f66c2ed0 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -293,3 +293,51 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list( mobs_in_area += mob break return mobs_in_area + +/** + * rename_area + * Renames an area to the given new name, updating all machines' names and firedoors + * to properly ensure alarms and machines are named correctly at all times. + * Args: + * - area_to_rename: The area that's being renamed. + * - new_name: The name we're changing said area to. + */ +/proc/rename_area(area/area_to_rename, new_name) + var/prevname = "[area_to_rename.name]" + set_area_machinery_title(area_to_rename, new_name, prevname) + area_to_rename.name = new_name + require_area_resort() //area renamed so resort the names + + if(LAZYLEN(area_to_rename.firedoors)) + for(var/obj/machinery/door/firedoor/area_firedoors as anything in area_to_rename.firedoors) + area_firedoors.CalculateAffectingAreas() + area_to_rename.update_areasize() + return TRUE + +/** + * Renames all machines in a defined area from the old title to the new title. + * Used when renaming an area to ensure that all machiens are labeled the new area's machine. + * Args: + * - area_renaming: The area being renamed, which we'll check turfs from to rename machines in. + * - title: The new name of the area that we're swapping into. + * - oldtitle: The old name of the area that we're replacing text from. + */ +/proc/set_area_machinery_title(area/area_renaming, title, oldtitle) + if(!oldtitle) // or replacetext goes to infinite loop + return + + //stuff tied to the area to rename + var/static/list/to_rename = typecacheof(list( + /obj/machinery/airalarm, + /obj/machinery/atmospherics/components/unary/vent_scrubber, + /obj/machinery/atmospherics/components/unary/vent_pump, + /obj/machinery/door, + /obj/machinery/firealarm, + /obj/machinery/light_switch, + /obj/machinery/power/apc, + /obj/machinery/camera, + )) + for(var/list/zlevel_turfs as anything in area_renaming.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machine as anything in typecache_filter_list(area_turf.contents, to_rename)) + machine.name = replacetext(machine.name, oldtitle, title) diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 32a570ae8fc..c44845a5854 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -413,3 +413,20 @@ Turf and target are separate in case you want to teleport some distance from a t if(locate(type_to_find) in location) return TRUE return FALSE + +/** + * get_blueprint_data + * Gets a list of turfs around a central turf and gets the blueprint data in a list + * Args: + * - central_turf: The center turf we're getting data from. + * - viewsize: The viewsize we're getting the turfs around central_turf of. + */ +/proc/get_blueprint_data(turf/central_turf, viewsize) + var/list/blueprint_data_returned = list() + var/list/dimensions = getviewsize(viewsize) + var/horizontal_radius = dimensions[1] / 2 + var/vertical_radius = dimensions[2] / 2 + for(var/turf/nearby_turf as anything in RECT_TURFS(horizontal_radius, vertical_radius, central_turf)) + if(nearby_turf.blueprint_data) + blueprint_data_returned += nearby_turf.blueprint_data + return blueprint_data_returned diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 99438be18cc..cb7c3972993 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -258,7 +258,7 @@ return TRUE // Station blueprints do that too, but only if the wires are not randomized. - if(user.is_holding_item_of_type(/obj/item/areaeditor/blueprints) && !randomize) + if(user.is_holding_item_of_type(/obj/item/blueprints) && !randomize) return TRUE return FALSE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 491f0f71fb9..328531d88c6 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -525,7 +525,7 @@ /datum/objective_item/steal/blueprints name = "the station blueprints" - targetitem = /obj/item/areaeditor/blueprints + targetitem = /obj/item/blueprints excludefromjob = list(JOB_CHIEF_ENGINEER) item_owner = list(JOB_CHIEF_ENGINEER) altitems = list(/obj/item/photo) @@ -533,11 +533,11 @@ difficulty = 3 steal_hint = "The blueprints of the station, found in the Chief Engineer's locker, or on their person. A picture may suffice." -/obj/item/areaeditor/blueprints/add_stealing_item_objective() - return add_item_to_steal(src, /obj/item/areaeditor/blueprints) +/obj/item/blueprints/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/blueprints) /datum/objective_item/steal/blueprints/check_special_completion(obj/item/I) - if(istype(I, /obj/item/areaeditor/blueprints)) + if(istype(I, /obj/item/blueprints)) return TRUE if(istype(I, /obj/item/photo)) var/obj/item/photo/P = I diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 006620ec5f4..e59de18ffcb 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -36,8 +36,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) if(!istype(sign)) return + var/area/bar_area = get_area(src) if(change_area_name && sign.rename_area) - rename_area(src, sign.name) + rename_area(bar_area, sign.name) chosen_sign = sign update_appearance() @@ -152,7 +153,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /obj/machinery/barsign/attackby(obj/item/attacking_item, mob/user) - if(istype(attacking_item, /obj/item/areaeditor/blueprints) && !change_area_name) + if(istype(attacking_item, /obj/item/blueprints) && !change_area_name) if(!panel_open) balloon_alert(user, "open the panel first!") return TRUE diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 82fc3437f20..d11c6e21d69 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -1,254 +1,255 @@ -/obj/item/areaeditor - name = "area modification item" +///The area is a "Station" area, showing no special text. +#define AREA_STATION 1 +///The area is in outdoors (lavaland/icemoon/jungle/space), therefore unclaimed territories. +#define AREA_OUTDOORS 2 +///The area is special (shuttles/centcom), therefore can't be claimed. +#define AREA_SPECIAL 3 + +///The blueprints are currently reading the list of all wire datums. +#define LEGEND_VIEWING_LIST "watching_list" +///The blueprints are on the main page. +#define LEGEND_OFF "off" + +/** + * Blueprints + * Used to see the wires of machines on the station, the roundstart layout of pipes/cables/tubes, + * as well as allowing you to rename existing areas and create new ones. + * Used by the station, cyborgs, and golems. + */ +/obj/item/blueprints + name = "station blueprints" + desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." icon = 'icons/obj/scrolls.dmi' icon_state = "blueprints" inhand_icon_state = "blueprints" attack_verb_continuous = list("attacks", "baps", "hits") attack_verb_simple = list("attack", "bap", "hit") - var/fluffnotice = "Nobody's gonna read this stuff!" - var/in_use = FALSE - ///When using it to create a new area, this will be its type. - var/new_area_type = /area - -/obj/item/areaeditor/attack_self(mob/user) - add_fingerprint(user) - . = "[src] \ -

[station_name()] [src.name]

\ - [fluffnotice]
" - switch(get_area_type()) - if(AREA_SPACE) - . += "

According to the [src.name], you are now in an unclaimed territory.

" - if(AREA_SPECIAL) - . += "

This place is not noted on the [src.name].

" - . += "

Create or modify an existing area

" - - -/obj/item/areaeditor/Topic(href, href_list) - if(..()) - return TRUE - if(!usr.can_perform_action(src) || usr != loc) - usr << browse(null, "window=blueprints") - return TRUE - if(href_list["create_area"]) - if(in_use) - return - var/area/A = get_area(usr) - if(A.area_flags & NOTELEPORT) - to_chat(usr, span_warning("You cannot edit restricted areas.")) - return - in_use = TRUE - create_area(usr, new_area_type) - in_use = FALSE - updateUsrDialog() - -//Station blueprints!!! -/obj/item/areaeditor/blueprints - name = "station blueprints" - desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." - icon = 'icons/obj/scrolls.dmi' - icon_state = "blueprints" - fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_ALLOW_USER_LOCATION | INTERACT_ATOM_IGNORE_MOBILITY + + ///A string of flavortext to be displayed at the top of the UI, related to the type of blueprints we are. + var/fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." + ///Boolean on whether the blueprints are currently being used, which prevents double-using them to rename/create areas. + var/in_use = FALSE + ///The type of area we'll create when we make a new area. This is a typepath. + var/area/new_area_type = /area + ///The legend type the blueprints are currently looking at, which is either modularly + ///set by wires datums, the main page, or an overview of them all. + var/legend_viewing = LEGEND_OFF + + ///List of images that we're showing to a client, used for showing blueprint data. var/list/image/showing = list() + ///The client that is being shown the list of 'showing' images of blueprint data. var/client/viewing - var/legend = FALSE //Viewing the wire legend - -/obj/item/areaeditor/blueprints/Destroy() +/obj/item/blueprints/Destroy() clear_viewer() return ..() - -/obj/item/areaeditor/blueprints/attack_self(mob/user) +/obj/item/blueprints/dropped(mob/user) . = ..() - if(!legend) - var/area/A = get_area(user) - if(get_area_type() == AREA_STATION) - . += "

According to \the [src], you are now in \"[html_encode(A.name)]\".

" - . += "

Change area name

" - . += "

View wire colour legend

" - if(!viewing) - . += "

View structural data

" - else - . += "

Refresh structural data

" - . += "

Hide structural data

" - else - if(legend == TRUE) - . += "<< Back" - . += view_wire_devices(user); - else - //legend is a wireset - . += "<< Back" - . += view_wire_set(user, legend) - var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500) - popup.set_content(.) - popup.open() - onclose(user, "blueprints") + clear_viewer() + legend_viewing = LEGEND_OFF +/obj/item/blueprints/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Blueprints", name) + ui.open() -/obj/item/areaeditor/blueprints/Topic(href, href_list) - if(..()) +/obj/item/blueprints/ui_state(mob/user) + return GLOB.inventory_state + +/obj/item/blueprints/ui_data(mob/user) + var/list/data = list() + switch(get_area_type(user)) + if(AREA_OUTDOORS) + data["area_notice"] = "You are in unclaimed territory." + if(AREA_SPECIAL) + data["area_notice"] = "This area has no notes." + else + var/area/current_area = get_area(user) + data["area_notice"] = "You are now in \the [current_area.name]" + var/area/area_inside_of = get_area(user) + data["area_name"] = html_encode(area_inside_of.name) + data["legend"] = legend_viewing + data["viewing"] = !!viewing + data["wire_data"] = list() + if(legend_viewing != LEGEND_VIEWING_LIST && legend_viewing != LEGEND_OFF) + for(var/device in GLOB.wire_color_directory) + if("[device]" != legend_viewing) + continue + data["wires_name"] = GLOB.wire_name_directory[device] + for(var/individual_color in GLOB.wire_color_directory[device]) + var/wire_name = GLOB.wire_color_directory[device][individual_color] + if(findtext(wire_name, WIRE_DUD_PREFIX)) //don't show duds + continue + data["wire_data"] += list(list( + "color" = individual_color, + "message" = wire_name, + )) + return data + +/obj/item/blueprints/ui_static_data(mob/user) + var/list/data = list() + data["legend_viewing_list"] = LEGEND_VIEWING_LIST + data["legend_off"] = LEGEND_OFF + data["fluff_notice"] = fluffnotice + data["station_name"] = station_name() + data["wire_devices"] = list() + for(var/wireset in GLOB.wire_color_directory) + data["wire_devices"] += list(list( + "name" = GLOB.wire_name_directory[wireset], + "ref" = wireset, + )) + return data + +/obj/item/blueprints/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) return - if(href_list["edit_area"]) - if(get_area_type() != AREA_STATION) - return - if(in_use) - return - in_use = TRUE - edit_area() - in_use = FALSE - if(href_list["exit_legend"]) - legend = FALSE; - if(href_list["view_legend"]) - legend = TRUE; - if(href_list["view_wireset"]) - legend = href_list["view_wireset"]; - if(href_list["view_blueprints"]) - set_viewer(usr, span_notice("You flip the blueprints over to view the complex information diagram.")) - if(href_list["hide_blueprints"]) - clear_viewer(usr,span_notice("You flip the blueprints over to view the simple information diagram.")) - if(href_list["refresh"]) - clear_viewer(usr) - set_viewer(usr) - attack_self(usr) //this is not the proper way, but neither of the old update procs work! it's too ancient and I'm tired shush. + var/mob/user = ui.user + if(!user.can_perform_action(src, NEED_LITERACY|NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) + return TRUE -/obj/item/areaeditor/blueprints/proc/get_images(turf/central_turf, viewsize) - . = list() - var/list/dimensions = getviewsize(viewsize) - var/horizontal_radius = dimensions[1] / 2 - var/vertical_radius = dimensions[2] / 2 - for(var/turf/nearby_turf as anything in RECT_TURFS(horizontal_radius, vertical_radius, central_turf)) - if(nearby_turf.blueprint_data) - . += nearby_turf.blueprint_data - -/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "") - if(user?.client) - if(viewing) + switch(action) + if("create_area") + if(in_use) + return + in_use = TRUE + create_area(user, new_area_type) + in_use = FALSE + if("edit_area") + if(get_area_type(user) != AREA_STATION) + return + if(in_use) + return + in_use = TRUE + edit_area(user) + in_use = FALSE + if("exit_legend") + legend_viewing = LEGEND_OFF + if("view_legend") + legend_viewing = LEGEND_VIEWING_LIST + if("view_wireset") + var/setting_wireset = params["view_wireset"] + for(var/device in GLOB.wire_color_directory) + if("[device]" == setting_wireset) //I know... don't change it... + legend_viewing = setting_wireset + return TRUE + if("view_blueprints") + playsound(src, 'sound/items/paper_flip.ogg', 40, TRUE) + user.balloon_alert_to_viewers("flips blueprints over") + set_viewer(user) + if("hide_blueprints") + playsound(src, 'sound/items/paper_flip.ogg', 40, TRUE) + user.balloon_alert_to_viewers("flips blueprints over") clear_viewer() - viewing = user.client - showing = get_images(get_turf(viewing.eye || user), viewing.view) - viewing.images |= showing - if(message) - to_chat(user, message) + if("refresh") + playsound(src, 'sound/items/paper_flip.ogg', 40, TRUE) + clear_viewer() + set_viewer(user) + return TRUE -/obj/item/areaeditor/blueprints/proc/clear_viewer(mob/user, message = "") +/** + * Sets the user's client as the person viewing blueprint data, and builds blueprint data + * around the user. + * Args: + * - user: The person who's client we're giving images to. + */ +/obj/item/blueprints/proc/set_viewer(mob/user) + if(!user || !user.client) + return + if(viewing) + clear_viewer() + viewing = user.client + showing = get_blueprint_data(get_turf(viewing.eye || user), viewing.view) + viewing.images |= showing + +/** + * Clears the client we're showig images to and deletes the images of blueprint data + * we made to show them. + */ +/obj/item/blueprints/proc/clear_viewer() if(viewing) viewing.images -= showing viewing = null showing.Cut() - if(message) - to_chat(user, message) -/obj/item/areaeditor/blueprints/dropped(mob/user) - ..() - clear_viewer() - legend = FALSE - - -/obj/item/areaeditor/proc/get_area_type(area/A) - if (!A) - A = get_area(usr) - if(A.outdoors) - return AREA_SPACE - var/list/SPECIALS = list( +/** + * Gets the area type the user is currently standing in. + * Returns: AREA_STATION, AREA_OUTDOORS, or AREA_SPECIAL + * Args: + * - user: The person we're getting the area of to check if it's a special area. + */ +/obj/item/blueprints/proc/get_area_type(mob/user) + var/area/area_checking = get_area(user) + if(area_checking.outdoors) + return AREA_OUTDOORS + var/static/list/special_areas = typecacheof(list( /area/shuttle, /area/centcom, /area/centcom/asteroid, /area/centcom/tdome, /area/centcom/wizard_station, /area/misc/hilbertshotel, - /area/misc/hilbertshotelstorage - ) - for (var/type in SPECIALS) - if ( istype(A,type) ) - return AREA_SPECIAL + /area/misc/hilbertshotelstorage, + )) + if(area_checking.type in special_areas) + return AREA_SPECIAL return AREA_STATION -/obj/item/areaeditor/blueprints/proc/view_wire_devices(mob/user) - var/message = "
You examine the wire legend.
" - for(var/wireset in GLOB.wire_color_directory) - message += "
[GLOB.wire_name_directory[wireset]]" - message += "

" - return message - -/obj/item/areaeditor/blueprints/proc/view_wire_set(mob/user, wireset) - //for some reason you can't use wireset directly as a derefencer so this is the next best :/ - for(var/device in GLOB.wire_color_directory) - if("[device]" == wireset) //I know... don't change it... - var/message = "

[GLOB.wire_name_directory[device]]:" - for(var/Col in GLOB.wire_color_directory[device]) - var/wire_name = GLOB.wire_color_directory[device][Col] - if(!findtext(wire_name, WIRE_DUD_PREFIX)) //don't show duds - message += "

[Col]: [wire_name]

" - message += "

" - return message - return "" - -/obj/item/areaeditor/proc/edit_area() - var/area/A = get_area(usr) - var/prevname = "[A.name]" - var/str = tgui_input_text(usr, "New area name", "Area Creation", max_length = MAX_NAME_LEN) - if(!str || !length(str) || str == prevname) //cancel - return - if(length(str) > 50) - to_chat(usr, span_warning("The given name is too long. The area's name is unchanged.")) +/** + * edit_area + * Takes input from the player and renames the area the blueprints are currently in. + */ +/obj/item/blueprints/proc/edit_area(mob/user) + var/area/area_editing = get_area(src) + var/prevname = "[area_editing.name]" + var/new_name = tgui_input_text(user, "New area name", "Area Creation", max_length = MAX_NAME_LEN) + if(isnull(new_name) || !length(new_name) || new_name == prevname) return - rename_area(A, str) - - to_chat(usr, span_notice("You rename the '[prevname]' to '[str]'.")) - usr.log_message("has renamed [prevname] to [str]", LOG_GAME) - A.update_areasize() - interact() + rename_area(area_editing, new_name) + user.balloon_alert(user, "area renamed to [new_name]") + user.log_message("has renamed [prevname] to [new_name]", LOG_GAME) return TRUE -//Blueprint Subtypes - -/obj/item/areaeditor/blueprints/cyborg +///Cyborg blueprints - The same as regular but with a different fluff text. +/obj/item/blueprints/cyborg name = "station schematics" desc = "A digital copy of the station blueprints stored in your memory." - icon = 'icons/obj/scrolls.dmi' - icon_state = "blueprints" fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station." -/obj/item/areaeditor/blueprints/golem +///Golem blueprints - Used to make golem areas that won't give the hazardous area debuffs. +/obj/item/blueprints/golem name = "land claim" desc = "Use it to build new structures in the wastes." fluffnotice = "In memory of the Liberator's brother, Delaminator, and his Scarlet Macaw-iathan, from which this artifact was stolen." new_area_type = /area/golem -/proc/rename_area(a, new_name) - var/area/A = get_area(a) - var/prevname = "[A.name]" - set_area_machinery_title(A, new_name, prevname) - A.name = new_name - require_area_resort() //area renamed so resort the names +///Slime blueprints - Makes areas colored and compatible with xenobiology camera consoles, one time use. +/obj/item/blueprints/slime + name = "cerulean prints" + desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console." + fluffnotice = "Copyright by Science Inc. Renaming areas will allow for management consoles to traverse them." + color = "#2956B2" - if(A.firedoors) - for(var/D in A.firedoors) - var/obj/machinery/door/firedoor/FD = D - FD.CalculateAffectingAreas() - A.update_areasize() - return TRUE +/obj/item/blueprints/slime/edit_area(mob/user) + . = ..() + var/area/area = get_area(src) + for(var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + area_turf.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + area_turf.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) + area.area_flags |= XENOBIOLOGY_COMPATIBLE + qdel(src) +#undef LEGEND_VIEWING_LIST +#undef LEGEND_OFF -/proc/set_area_machinery_title(area/area, title, oldtitle) - if(!oldtitle) // or replacetext goes to infinite loop - return +#undef AREA_STATION +#undef AREA_OUTDOORS +#undef AREA_SPECIAL - //stuff tied to the area to rename - var/static/list/to_rename = typecacheof(list( - /obj/machinery/airalarm, - /obj/machinery/atmospherics/components/unary/vent_scrubber, - /obj/machinery/atmospherics/components/unary/vent_pump, - /obj/machinery/door, - /obj/machinery/firealarm, - /obj/machinery/light_switch, - /obj/machinery/power/apc, - )) - for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) - for (var/turf/area_turf as anything in zlevel_turfs) - for(var/obj/machine as anything in typecache_filter_list(area_turf.contents, to_rename)) - machine.name = replacetext(machine.name, oldtitle, title) - //TODO: much much more. Unnamed airlocks, cameras, etc. diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index d90212ca113..3dc59fb9ce2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -23,7 +23,7 @@ . = ..() // Traitor steal objective - new /obj/item/areaeditor/blueprints(src) + new /obj/item/blueprints(src) new /obj/item/pipe_dispenser(src) /obj/structure/closet/secure_closet/engineering_electrical diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 6d9646b49ee..db20562039b 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -388,7 +388,7 @@ ) head = /obj/item/clothing/head/utility/hardhat/welding mask = /obj/item/clothing/mask/gas/atmos - l_hand = /obj/item/areaeditor/blueprints + l_hand = /obj/item/blueprints /datum/outfit/centcom/ert/clown/party name = "ERP Comedian" diff --git a/code/modules/hallucination/fake_message.dm b/code/modules/hallucination/fake_message.dm index a1040496f5e..de5616d83c6 100644 --- a/code/modules/hallucination/fake_message.dm +++ b/code/modules/hallucination/fake_message.dm @@ -25,7 +25,7 @@ // in the future, this could / should be de-harcoded and // just draw from a pool uplink, theft, and antag item typepaths var/static/list/stash_item_paths = list( - /obj/item/areaeditor/blueprints, + /obj/item/blueprints, /obj/item/assembly/flash, /obj/item/card/id/advanced/gold/captains_spare, /obj/item/card/emag, diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm index 259c3eed5f6..61c5469b459 100644 --- a/code/modules/mining/boulder_processing/brm.dm +++ b/code/modules/mining/boulder_processing/brm.dm @@ -101,7 +101,7 @@ if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS -///To allow boulders on a conveyer belt to move unobstructed if multiple machines are made on a single line +///To allow boulders on a conveyor belt to move unobstructed if multiple machines are made on a single line /obj/machinery/brm/CanAllowThrough(atom/movable/mover, border_dir) if(!anchored) return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index fe57733b391..18bb3e51147 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -368,7 +368,7 @@ /obj/item/t_scanner, /obj/item/analyzer, /obj/item/assembly/signaler/cyborg, - /obj/item/areaeditor/blueprints/cyborg, + /obj/item/blueprints/cyborg, /obj/item/electroadaptive_pseudocircuit, /obj/item/stack/sheet/iron, /obj/item/stack/sheet/glass, diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 207b8351a58..0712e516de4 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -547,7 +547,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) toner_cartridge = object balloon_alert(user, "cartridge inserted") - else if(istype(object, /obj/item/areaeditor/blueprints)) + else if(istype(object, /obj/item/blueprints)) to_chat(user, span_warning("\The [object] is too large to put into the copier. You need to find something else to record the document.")) else if(istype(object, /obj/item/paperwork)) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 0d5f37cb867..a0a51da165f 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -206,7 +206,7 @@ turfs += placeholder for(var/mob/M in placeholder) mobs += M - if(locate(/obj/item/areaeditor/blueprints) in placeholder) + if(locate(/obj/item/blueprints) in placeholder) blueprints = TRUE // do this before picture is taken so we can reveal revenants for the photo diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index ce13c9c70de..6407ff0fb8b 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -456,7 +456,7 @@ required_container = /obj/item/slime_extract/cerulean /datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom)) + new /obj/item/blueprints/slime(get_turf(holder.my_atom)) ..() //Sepia diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 44ad6bf6da7..3c04bd924ec 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -615,9 +615,9 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(!attached_switch) return - INVOKE_ASYNC(src, PROC_REF(update_conveyers), port) + INVOKE_ASYNC(src, PROC_REF(update_conveyors), port) -/obj/item/circuit_component/conveyor_switch/proc/update_conveyers(datum/port/input/port) +/obj/item/circuit_component/conveyor_switch/proc/update_conveyors(datum/port/input/port) if(!attached_switch) return diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 1551d6eb952..3d4d9bc4b45 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -1082,17 +1082,3 @@ turf_type = /turf/open/floor/sepia merge_type = /obj/item/stack/tile/sepia -/obj/item/areaeditor/blueprints/slime - name = "cerulean prints" - desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console." - color = "#2956B2" - -/obj/item/areaeditor/blueprints/slime/edit_area() - ..() - var/area/area = get_area(src) - for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) - for(var/turf/area_turf as anything in zlevel_turfs) - area_turf.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - area_turf.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) - area.area_flags |= XENOBIOLOGY_COMPATIBLE - qdel(src) diff --git a/sound/attributions.txt b/sound/attributions.txt index c81aa3e664b..39f206e982a 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -140,3 +140,6 @@ https://freesound.org/people/steaq/sounds/560124/ refinery.ogg, smelter.ogg, and wooping_teleport.ogg are all original works by ArcaneMusic, with smelter.ogg using samples from rock_break alongside original sound effects from a warrior electric drill, where refinery and wooping_teleport are modifications of that same electric drill recording. + +paper_flip.ogg is made by gynation from Freesound.org, CC0 +https://freesound.org/people/gynation/sounds/82378/ diff --git a/sound/items/paper_flip.ogg b/sound/items/paper_flip.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9e6aca596756cef2581a06b46e3bc602a3a4b74e GIT binary patch literal 15804 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 Xss#UDRD;`;(}FpsF~x=cpWOcdr+{9y literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 057a8c53e31..b3b468849a9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -43,7 +43,6 @@ #include "code\__DEFINES\apc_defines.dm" #include "code\__DEFINES\appearance.dm" #include "code\__DEFINES\arcades.dm" -#include "code\__DEFINES\area_editor.dm" #include "code\__DEFINES\art.dm" #include "code\__DEFINES\assemblies.dm" #include "code\__DEFINES\assert.dm" diff --git a/tgui/packages/tgui/interfaces/Blueprints.tsx b/tgui/packages/tgui/interfaces/Blueprints.tsx new file mode 100644 index 00000000000..644412a9a77 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Blueprints.tsx @@ -0,0 +1,186 @@ +import { BooleanLike } from 'common/react'; + +import { useBackend } from '../backend'; +import { Box, Button, Divider, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + area_notice: string; + area_name: string; + wire_data: WireData[]; + legend: string; + legend_viewing_list: string; + legend_off: string; + fluff_notice: string; + station_name: string; + wires_name: string; + wire_devices: WireDevices[]; + viewing: BooleanLike; +}; + +type WireDevices = { + name: string; + ref: string; +}; + +type WireData = { + color: string; + message: string; +}; + +export const Blueprints = () => { + const { act, data } = useBackend(); + const { legend, legend_viewing_list, legend_off } = data; + + return ( + + + {legend === legend_viewing_list ? ( + + ) : legend === legend_off ? ( + + ) : ( + + )} + + + ); +}; + +const WireList = () => { + const { act, data } = useBackend(); + const { wire_devices = [] } = data; + + return ( +
+ + + {wire_devices.map((wire) => ( + + ))} + +
+ ); +}; + +const WireArea = () => { + const { act, data } = useBackend(); + const { wires_name, wire_data = [] } = data; + + return ( +
+ + {wires_name} wires: + {wire_data.map((wire) => ( + + {wire.color}:{' '} + {wire.message} + + ))} +
+ ); +}; + +const MainMenu = () => { + const { act, data } = useBackend(); + const { area_notice, area_name, fluff_notice, station_name, viewing } = data; + + return ( +
+ + {fluff_notice} + + + + {area_notice} + + + + + + + + + + + + {viewing ? ( + <> + + + + + + + + ) : ( + + + + )} + +
+ ); +}; diff --git a/tools/UpdatePaths/Scripts/74147_tech_disk_repath.txt b/tools/UpdatePaths/Scripts/74147_tech_disk_repath.txt index 6b5a0e4c5e6..2111d891fc3 100644 --- a/tools/UpdatePaths/Scripts/74147_tech_disk_repath.txt +++ b/tools/UpdatePaths/Scripts/74147_tech_disk_repath.txt @@ -1,7 +1,7 @@ # removes advanced design, and moves bepis tech disks to its new type /obj/item/disk/design_disk/adv : /obj/item/disk/design_disk{@OLD} -/obj/item/disk/design_disk/adv/@SUBTPYES : /obj/item/disk/design_disk/@SUBTYPES{@OLD} +/obj/item/disk/design_disk/adv/@SUBTYPES : /obj/item/disk/design_disk/@SUBTYPES{@OLD} /obj/item/disk/tech_disk/major : /obj/item/disk/design_disk/bepis/remove_tech /obj/item/disk/tech_disk/spaceloot : /obj/item/disk/design_disk/bepis diff --git a/tools/UpdatePaths/Scripts/82565_blueprints_repath.txt b/tools/UpdatePaths/Scripts/82565_blueprints_repath.txt new file mode 100644 index 00000000000..08ff26217cf --- /dev/null +++ b/tools/UpdatePaths/Scripts/82565_blueprints_repath.txt @@ -0,0 +1 @@ +/obj/item/areaeditor/@SUBTYPES{@OLD} : /obj/item/blueprints/@SUBTYPES{@OLD}