diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index c2c11b371a1..2c12ac11e44 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -82907,14 +82907,14 @@ tag = "" }, /obj/structure/table, -/obj/item/t_scanner, -/obj/item/radio/headset/headset_eng, -/obj/item/multitool{ - pixel_x = 5 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/item/airlock_painter, +/obj/item/airlock_painter{ + pixel_x = -4; + pixel_y = 4 + }, /turf/simulated/floor/plasteel, /area/engine/equipmentstorage) "cTP" = ( diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e97c460de4b..974b1d39c17 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -80,6 +80,7 @@ GLOBAL_LIST_EMPTY(airlock_overlays) var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock var/normal_integrity = AIRLOCK_INTEGRITY_N var/prying_so_hard = FALSE + var/paintable = TRUE // If the airlock type can be painted with an airlock painter var/image/old_frame_overlay //keep those in order to prevent unnecessary updating var/image/old_filling_overlay @@ -502,6 +503,32 @@ About the new airlock wires panel: sleep(6) update_icon(AIRLOCK_CLOSED) + +/// Called when a player uses an airlock painter on this airlock +/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/painter, mob/user) + if((!in_range(src, user) && loc != user)) // user should be adjacent to the airlock. + return + + if(!painter.paint_setting) + to_chat(user, "You need to select a paintjob first.") + return + + var/obj/machinery/door/airlock/airlock = painter.available_paint_jobs["[painter.paint_setting]"] // get the airlock type path associated with the airlock name the user just chose + var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype) + + if(airlock_material == "glass" && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer + to_chat(user, "This paint job can only be applied to non-glass airlocks.") + return + + if(do_after(user, 20, target = src)) + // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock + painter.paint(user) + icon = initial(airlock.icon) + overlays_file = initial(airlock.overlays_file) + assemblytype = initial(airlock.assemblytype) + update_icon() + + /obj/machinery/door/airlock/examine(mob/user) . = ..() if(emagged) @@ -882,6 +909,8 @@ About the new airlock wires panel: user.visible_message("[user] pins [C] to [src].", "You pin [C] to [src].") note = C update_icon() + else if(istype(C, /obj/item/airlock_painter)) + change_paintjob(C, user) else return ..() diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index fccb77c5e2a..2397a5d90c2 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -115,6 +115,7 @@ name = "gold airlock" icon = 'icons/obj/doors/airlocks/station/gold.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_gold + paintable = FALSE /obj/machinery/door/airlock/gold/glass opacity = 0 @@ -124,6 +125,7 @@ name = "silver airlock" icon = 'icons/obj/doors/airlocks/station/silver.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_silver + paintable = FALSE /obj/machinery/door/airlock/silver/glass opacity = 0 @@ -135,6 +137,7 @@ assemblytype = /obj/structure/door_assembly/door_assembly_diamond normal_integrity = 1000 explosion_block = 2 + paintable = FALSE /obj/machinery/door/airlock/diamond/glass normal_integrity = 950 @@ -146,6 +149,7 @@ desc = "And they said I was crazy." icon = 'icons/obj/doors/airlocks/station/uranium.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_uranium + paintable = FALSE var/event_step = 20 /obj/machinery/door/airlock/uranium/New() @@ -169,6 +173,7 @@ desc = "No way this can end badly." icon = 'icons/obj/doors/airlocks/station/plasma.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_plasma + paintable = FALSE /obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() @@ -214,6 +219,7 @@ assemblytype = /obj/structure/door_assembly/door_assembly_bananium doorOpen = 'sound/items/bikehorn.ogg' doorClose = 'sound/items/bikehorn.ogg' + paintable = FALSE /obj/machinery/door/airlock/bananium/glass opacity = 0 @@ -227,11 +233,13 @@ doorDeni = null boltUp = null boltDown = null + paintable = FALSE /obj/machinery/door/airlock/sandstone name = "sandstone airlock" icon = 'icons/obj/doors/airlocks/station/sandstone.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_sandstone + paintable = FALSE /obj/machinery/door/airlock/sandstone/glass opacity = 0 @@ -241,6 +249,7 @@ name = "wooden airlock" icon = 'icons/obj/doors/airlocks/station/wood.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_wood + paintable = FALSE /obj/machinery/door/airlock/wood/glass opacity = 0 @@ -252,6 +261,7 @@ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' normal_integrity = 400 + paintable = FALSE /obj/machinery/door/airlock/titanium/glass normal_integrity = 350 @@ -317,6 +327,7 @@ explosion_block = 2 normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original security_level = 6 + paintable = FALSE ////////////////////////////////// /* @@ -329,6 +340,7 @@ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_hatch + paintable = FALSE /obj/machinery/door/airlock/hatch/syndicate name = "syndicate hatch" @@ -400,6 +412,7 @@ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_mhatch + paintable = FALSE ////////////////////////////////// /* @@ -415,6 +428,7 @@ normal_integrity = 500 security_level = 1 damage_deflection = 30 + paintable = FALSE /obj/machinery/door/airlock/highsecurity/red name = "secure armory airlock" @@ -457,6 +471,7 @@ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_shuttle + paintable = FALSE /obj/machinery/door/airlock/shuttle/glass opacity = 0 @@ -475,6 +490,7 @@ aiControlDisabled = 1 normal_integrity = 700 security_level = 1 + paintable = FALSE ////////////////////////////////// /* @@ -489,6 +505,7 @@ damage_deflection = 10 hackProof = TRUE aiControlDisabled = TRUE + paintable = FALSE var/openingoverlaytype = /obj/effect/temp_visual/cult/door var/friendly = FALSE diff --git a/code/game/objects/items/devices/airlock_painter.dm b/code/game/objects/items/devices/airlock_painter.dm new file mode 100644 index 00000000000..8f845f2bac6 --- /dev/null +++ b/code/game/objects/items/devices/airlock_painter.dm @@ -0,0 +1,81 @@ +// Airlock painter + +/obj/item/airlock_painter + name = "airlock painter" + desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on a completed airlock to change its paintjob." + icon = 'icons/obj/device.dmi' + icon_state = "airlock_painter" + item_state = "airlock_painter" + flags = CONDUCT | NOBLUDGEON + usesound = 'sound/effects/spray2.ogg' + w_class = WEIGHT_CLASS_SMALL + slot_flags = SLOT_BELT + materials = list(MAT_METAL = 3000, MAT_GLASS = 1000) + var/paint_setting + + // All the different paint jobs that an airlock painter can apply. + // If the airlock you're using it on is glass, the new paint job will also be glass + var/list/available_paint_jobs = list( + "Atmospherics" = /obj/machinery/door/airlock/atmos, + "Command" = /obj/machinery/door/airlock/command, + "Engineering" = /obj/machinery/door/airlock/engineering, + "External" = /obj/machinery/door/airlock/external, + "External Maintenance"= /obj/machinery/door/airlock/maintenance/external, + "Freezer" = /obj/machinery/door/airlock/freezer, + "Maintenance" = /obj/machinery/door/airlock/maintenance, + "Medical" = /obj/machinery/door/airlock/medical, + "Mining" = /obj/machinery/door/airlock/mining, + "Public" = /obj/machinery/door/airlock/public, + "Research" = /obj/machinery/door/airlock/research, + "Science" = /obj/machinery/door/airlock/science, + "Security" = /obj/machinery/door/airlock/security, + "Standard" = /obj/machinery/door/airlock, + ) + +//Only call this if you are certain that the painter will be used right after this check! +/obj/item/airlock_painter/proc/paint(mob/user) + playsound(loc, usesound, 30, TRUE) + return TRUE + +/obj/item/airlock_painter/attack_self(mob/user) + paint_setting = input(user, "Please select a paintjob for this airlock.") as null|anything in available_paint_jobs + if(!paint_setting) + return + to_chat(user, "The [paint_setting] paint setting has been selected.") + +/obj/item/airlock_painter/suicide_act(mob/user) + + var/obj/item/organ/internal/lungs/L = user.get_organ_slot("lungs") + var/lungs_name = "\improper[L.name]" + + if(L) + user.visible_message("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!") + // Once you've inhaled the toner, you throw up your lungs + // and then die. + + // they managed to lose their lungs between then and now. Good job. + if(!L) + return FALSE + + L.remove(user) + + // make some colorful reagent, and apply it to the lungs + L.create_reagents(10) + L.reagents.add_reagent("colorful_reagent", 10) + L.reagents.reaction(L, REAGENT_TOUCH, 1) + + user.emote("scream") + user.visible_message("[user] vomits out [user.p_their()] [lungs_name]!") + playsound(user.loc, 'sound/effects/splat.ogg', 50, TRUE) + + // make some vomit under the player, and apply colorful reagent + var/obj/effect/decal/cleanable/vomit/V = new(get_turf(user)) + V.create_reagents(10) + V.reagents.add_reagent("colorful_reagent", 10) + V.reagents.reaction(V, REAGENT_TOUCH, 1) + + L.forceMove(get_turf(user)) + + return OXYLOSS + else + return SHAME diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 1a57f2e2aee..b843b2d17a2 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -195,6 +195,14 @@ build_path = /obj/item/floor_painter category = list("initial", "Miscellaneous") +/datum/design/airlock_painter + name = "Airlock painter" + id = "airlock_painter" + build_type = AUTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 1000) + build_path = /obj/item/airlock_painter + category = list("initial", "Miscellaneous") + /datum/design/metal name = "Metal" id = "metal" diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index fb8efeadfb1..a378d2e5b04 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index e11fd688338..0a8847d7e4a 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index b5c25d474d1..75838e00075 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/paradise.dme b/paradise.dme index 5d4c43ea3de..ca3ce303ce9 100644 --- a/paradise.dme +++ b/paradise.dme @@ -870,6 +870,7 @@ #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\airlock_painter.dm" #include "code\game\objects\items\devices\autopsy.dm" #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm"