/obj/machinery/gear_painter name = "\improper Color Mate" desc = "A machine to give your apparel a fresh new color! Recommended to use with white items for best results." icon = 'icons/obj/vending.dmi' icon_state = "colormate" density = TRUE anchored = TRUE circuit = /obj/item/circuitboard/machine/colormate var/atom/movable/inserted var/activecolor = "#FFFFFF" var/list/color_matrix_last var/matrix_mode = FALSE /// Allow holder'd mobs var/allow_mobs = TRUE /// Minimum lightness for normal mode var/minimum_normal_lightness = 50 /// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white. var/minimum_matrix_lightness = 75 /// Minimum matrix tests that must pass for something to be considered a valid color (see above) var/minimum_matrix_tests = 2 var/list/allowed_types = list( /obj/item/clothing, /obj/item/storage/backpack, /obj/item/storage/belt ) /obj/machinery/gear_painter/Initialize(mapload) . = ..() color_matrix_last = list( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) /obj/machinery/gear_painter/update_icon_state() if(panel_open) icon_state = "colormate_open" else if(!is_operational()) icon_state = "colormate_off" else if(inserted) icon_state = "colormate_active" else icon_state = "colormate" /obj/machinery/gear_painter/Destroy() if(inserted) //please i beg you do not drop nulls inserted.forceMove(drop_location()) return ..() /obj/machinery/gear_painter/attackby(obj/item/I, mob/living/user) if(inserted) to_chat(user, "The machine is already loaded.") return if(default_deconstruction_screwdriver(user, "colormate_open", "colormate", I)) return if(default_deconstruction_crowbar(I)) return if(default_unfasten_wrench(user, I, 40)) return if(user.a_intent == INTENT_HARM) return ..() if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder)) var/obj/item/clothing/head/mob_holder/H = I var/mob/victim = H.held_mob if(!user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return if(!QDELETED(H)) H.release() insert_mob(victim, user) if(is_type_in_list(I, allowed_types) && is_operational()) if(!user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return if(QDELETED(I)) return user.visible_message("[user] inserts [I] into [src]'s receptable.") inserted = I update_icon() else return ..() /obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user) if(inserted) return if(user) visible_message("[user] stuffs [victim] into [src]!") inserted = victim inserted.forceMove(src) /obj/machinery/gear_painter/AllowDrop() return FALSE /obj/machinery/gear_painter/handle_atom_del(atom/movable/AM) if(AM == inserted) inserted = null return ..() /obj/machinery/gear_painter/AltClick(mob/user) . = ..() if(!user.CanReach(src)) return if(!inserted) return to_chat(user, "You remove [inserted] from [src]") inserted.forceMove(drop_location()) inserted = null update_icon() updateUsrDialog() /obj/machinery/gear_painter/ui_interact(mob/user) if(!is_operational()) return user.set_machine(src) var/list/dat = list("Color Mate Control Panel
") if(!inserted) dat += "No item inserted." else dat += "Item inserted: [inserted]
" dat += "Matrix mode: [matrix_mode? "On" : "Off"]" if(!matrix_mode) dat += "Select new color.
" dat += "Color: " dat += "Apply new color.

" else // POGGERS #define MATRIX_FIELD(field, default) " " dat += "
" dat += "" dat += "[cm] is far too dark (min lightness [minimum_normal_lightness]!") return FALSE return TRUE else // matrix // We test using full red, green, blue, and white // A predefined number of them must pass to be considered valid var/passed = 0 #define COLORTEST(thestring, thematrix) passed += (ReadHSV(RGBtoHSV(RGBMatrixTransform(thestring, thematrix)))[3] >= minimum_matrix_lightness) COLORTEST("FF0000", cm) COLORTEST("00FF00", cm) COLORTEST("0000FF", cm) COLORTEST("FFFFFF", cm) #undef COLORTEST if(passed < minimum_matrix_tests) to_chat(user, "[english_list(color)] is not allowed (pased [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness]).") return FALSE return TRUE