diff --git a/code/datums/type_cloning.dm b/code/datums/type_cloning.dm index b0aeb132fb2..4ceeea67dfe 100644 --- a/code/datums/type_cloning.dm +++ b/code/datums/type_cloning.dm @@ -6,3 +6,5 @@ /matrix/GetCloneArgs() return list(src) //Matrices handle copies themselves +/image/GetCloneArgs() + return list(src) //Same for images \ No newline at end of file diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index 647afb41853..a37a84867ab 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -106,19 +106,20 @@ else if (istype(A, /turf/simulated/wall)) new_color = pick_color_from_wall(A, user) else if (istype(A, /obj/structure/wall_frame)) - var/obj/structure/wall_frame/WF = A - new_color = pick_color_from_wall_frame(WF, user) + new_color = pick_color_from_wall_frame(A, user) else new_color = A.get_color() - change_color(new_color, user) - - else if (A.atom_flags & ATOM_FLAG_CAN_BE_PAINTED) - A.set_color(paint_color) - . = TRUE + if(!new_color) + to_chat(user, SPAN_NOTICE("You fail to scan a color from \the [A].")) + else + change_color(new_color, user) else if (istype(A, /turf/simulated/wall)) . = paint_wall(A, user) + else if (istype(A, /obj/structure/wall_frame)) + . = paint_wall_frame(A, user) + else if (istype(A, /turf/simulated/floor)) . = paint_floor(A, user, params) @@ -129,8 +130,12 @@ to_chat(user, SPAN_WARNING("You can't paint an active exosuit. Dismantle it first.")) . = FALSE + else if (A.atom_flags & ATOM_FLAG_CAN_BE_PAINTED) + A.set_color(paint_color) + . = TRUE + else - to_chat(user, SPAN_WARNING("\The [src] can only be used on floors, windows, walls, exosuits or certain airlocks.")) + to_chat(user, SPAN_WARNING("\The [src] can only be used on floors, windows, walls, exosuits, airlocks, and certain other objects.")) . = FALSE if (.) diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index e919d9ce5af..700f4f48bed 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -6,7 +6,7 @@ desc = "A low wall section which serves as the base of windows, amongst other things." icon = 'icons/obj/structures/wall_frame.dmi' icon_state = "frame" - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_CAN_BE_PAINTED | ATOM_FLAG_ADJACENT_EXCEPTION + atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE | ATOM_FLAG_ADJACENT_EXCEPTION obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED anchored = TRUE density = TRUE diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index c11abd01cf9..d1be611a9d2 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -27,7 +27,6 @@ var/global/list/wall_fullblend_objects = list( heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall explosion_resistance = 10 color = COLOR_STEEL - atom_flags = ATOM_FLAG_CAN_BE_PAINTED turf_flags = TURF_IS_HOLOMAP_OBSTACLE var/damage = 0 diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index e82d24705fe..2c8f2594f41 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -33,8 +33,6 @@ update_icon() /obj/item/chems/food/grown/initialize_reagents(populate) - if(reagents) - reagents.clear_reagents() if(!seed?.chems) return potency = seed.get_trait(TRAIT_POTENCY) diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm index 5c886e87632..525f363d285 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm @@ -43,6 +43,8 @@ if(!check_file_download(filename)) return 0 var/datum/computer_file/program/PRG = net.find_file_by_name(filename, OS_PROGRAMS_DIR, MF_ROLE_SOFTWARE) + if(!istype(PRG)) + return 0 var/datum/file_storage/disk/destination = computer.mounted_storage["local"] if(!destination) return 0 diff --git a/code/modules/modular_computers/networking/machinery/telecomms.dm b/code/modules/modular_computers/networking/machinery/telecomms.dm index 6d99caa4d0b..f457c21a3bf 100644 --- a/code/modules/modular_computers/networking/machinery/telecomms.dm +++ b/code/modules/modular_computers/networking/machinery/telecomms.dm @@ -161,7 +161,7 @@ var/global/list/telecomms_hubs = list() var/formatted_msg = "\[[channel?.name || format_frequency(frequency)]\] " var/send_name = istype(speaker) ? speaker.real_name : ("[speaker]" || "unknown") - var/overmap_send_name = "[send_name] ([send_overmap_object.name])" + var/overmap_send_name = istype(send_overmap_object) ? "[send_name] ([send_overmap_object.name])" : send_name var/list/listeners = list() // Dictionary of listener -> boolean (include overmap origin) diff --git a/code/modules/modular_computers/networking/network_files.dm b/code/modules/modular_computers/networking/network_files.dm index 66d6e21fc12..34229d711e2 100644 --- a/code/modules/modular_computers/networking/network_files.dm +++ b/code/modules/modular_computers/networking/network_files.dm @@ -1,9 +1,11 @@ /datum/computer_network/proc/find_file_by_name(filename, directory, mainframe_role = MF_ROLE_FILESERVER, list/accesses) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(mainframe_role, accesses)) var/datum/computer_file/F = M.get_file(filename, directory) - if(F) + if(istype(F)) return F + return OS_FILE_NOT_FOUND + /datum/computer_network/proc/get_all_files_of_type(file_type, mainframe_role = MF_ROLE_FILESERVER, uniques_only = FALSE, list/accesses) . = list() var/list/found_filenames = list() diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 5844573df7d..910bb13cf0a 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -301,8 +301,8 @@ var/obj/item/paper/P = pages[1] icon = P.icon icon_state = P.icon_state - copy_overlays(P.overlays) + copy_overlays(P) var/paper_count = 0 var/photo_count = 0 diff --git a/code/modules/paperwork/printer.dm b/code/modules/paperwork/printer.dm index 447d8ee87b7..83c8af53727 100644 --- a/code/modules/paperwork/printer.dm +++ b/code/modules/paperwork/printer.dm @@ -281,7 +281,19 @@ stop_printing_queue() return FALSE print_picture(queued_element) - else + else if(istype(queued_element, /obj/item/paper_bundle)) + var/obj/item/paper_bundle/bundle = queued_element + var/photo_count = 0 + for(var/obj/item/photo/picture in bundle.pages) + photo_count++ + if(!has_enough_to_print((TONER_USAGE_PAPER * (length(bundle.pages) - photo_count)) + (TONER_USAGE_PHOTO * photo_count))) + var/obj/machinery/M = loc + if(istype(M)) + M.state("Warning: Not enough paper or toner!") + stop_printing_queue() + return FALSE + print_paper_bundle(bundle) + else if(istype(queued_element, /obj/item/paper)) if(!has_enough_to_print(TONER_USAGE_PAPER)) var/obj/machinery/M = loc if(istype(M)) @@ -289,6 +301,8 @@ stop_printing_queue() return FALSE print_paper(queued_element) + else + PRINT_STACK_TRACE("A printer printed something that wasn't a paper, paper bundle, or photo: [queued_element] ([queued_element.type])") //#TODO: machinery should allow a component to trigger and wait for an animation sequence. So that we can drop out the paper in sync. queued_element.dropInto(get_turf(loc)) @@ -305,6 +319,14 @@ use_toner(TONER_USAGE_PHOTO, FALSE) //photos use a lot of ink! use_paper(1) + P.update_icon() + +/obj/item/stock_parts/printer/proc/print_paper_bundle(var/obj/item/paper_bundle/bundle) + for(var/obj/item/paper/page in bundle.pages) + print_paper(page) + for(var/obj/item/photo/picture in bundle.pages) + print_picture(picture) + bundle.update_icon() /obj/item/stock_parts/printer/proc/print_paper(var/obj/item/paper/P) //Apply a greyscale filter on all stamps overlays @@ -321,6 +343,7 @@ use_toner(TONER_USAGE_PAPER, FALSE) use_paper(1) + P.update_icon() // reapply stamp overlays /obj/item/stock_parts/printer/proc/use_toner(var/amount, var/update_parent = TRUE) if(!toner?.use_toner(amount)) diff --git a/maps/outreach/outreach_zlevels.dm b/maps/outreach/outreach_zlevels.dm index 2e745c6d8f8..33df90c43eb 100644 --- a/maps/outreach/outreach_zlevels.dm +++ b/maps/outreach/outreach_zlevels.dm @@ -10,6 +10,7 @@ base_turf = OUTREACH_SURFACE_TURF loop_turf_type = /turf/exterior/mimic_edge/transition/loop border_filler = /turf/unsimulated/dark_border + strata = /decl/strata/outreach/mountain ambient_light_level = 0.7 ambient_light_color = COLOR_GREEN_GRAY exterior_atmos_temp = OUTREACH_TEMP @@ -34,6 +35,7 @@ level_id = OUTREACH_LEVEL_ID_UNDERGROUND base_turf = /turf/exterior/barren/subterrane/outreach base_area = /area/exoplanet/outreach/underground/d1 + strata = /decl/strata/outreach/subterrane ambient_light_level = 0.2 ambient_light_color = COLOR_YELLOW_GRAY border_filler = /turf/unsimulated/mineral @@ -48,6 +50,7 @@ level_id = OUTREACH_LEVEL_ID_ABYSS base_turf = /turf/exterior/volcanic/outreach/abyss base_area = /area/exoplanet/outreach/underground/d2 + strata = /decl/strata/outreach/abyssal connected_levels = list( OUTREACH_LEVEL_ID_UNDERGROUND = UP, OUTREACH_LEVEL_ID_SOUTH_ABYSS = SOUTH, diff --git a/mods/persistence/modules/world_save/saved_vars/saved_misc.dm b/mods/persistence/modules/world_save/saved_vars/saved_misc.dm index 4926473fced..01cebd19fa9 100644 --- a/mods/persistence/modules/world_save/saved_vars/saved_misc.dm +++ b/mods/persistence/modules/world_save/saved_vars/saved_misc.dm @@ -657,6 +657,8 @@ SAVED_VAR(/obj/item/clothing/accessory/badge/tags, owner_name) SAVED_VAR(/obj/item/clothing/accessory/badge/tags, owner_branch) SAVED_VAR(/obj/item/clothing/accessory/badge/tags, desc) +SAVED_VAR(/obj/item/flame/lighter, reagents) + /////////////////////////////////////////////////////////////////////////////// // item/clothing ///////////////////////////////////////////////////////////////////////////////